際際滷

際際滷Share a Scribd company logo
晦温霞看顎岳粥稼温鉛霞噛艶姻での赫姻看看厩霞の
       旋喘について



         2011/04/09
        @kimukou_26
徭失B初
?Kimukou_26 といいます
? v|でフリ`のSEしています
? 麼に歌紗している茶氏
 ?JGGUG ??   Grails/Groovy
   ?#jggug

 ?ATEC ??Android テスト何
   ?#android_tec
   ?あまり廚任てません。すみません升


? 書指は #yapf には茶しにきたつもりが。。
 ? 採絞かk燕する並にw
書指三す並になったきっかけ
Layout analyzerでのgroovyの旋喘について
Layout analyzerでのgroovyの旋喘について
では盾裂してみましょう
?聞っているツ`ルは?
 ?Layoutopt
   ?晩云Z盾hサイト http://goo.gl/QCMij
   ?云社盾hサイト http://goo.gl/7cdt7
?どんなツ`ル?
 ? レイアウト.xmlの恷m業チェックツ`ル
 ? あくまでナビゲ`ションだけで筝はしないよ
? どこでGroovyを聞っているの?                    useスコ`プ坪だと
                                        クラスでCategoryAの
 ? XMLの盾裂RuleGroovyRule                 ル`ルI尖が
 ? Use Category┘ラスにC嬬を瘁原けするC嬬           聞えるイメ`ジ

       useCategoryA{
           鵐ラス、             CategoryA
            Clousre            A() / B()
       }
GroovyでgH聞うとこんなイメ`ジ
class ExcelCategory {
    /** ファイルをiみzむ */
   static void readXls(File self, Closure yield){    Fileクラスに
                                                      readXls()
       //izI尖
                                                    v方が弖紗された
                                                      イメ`ジ
   /** ファイルをシする */
   static void editXls(File self, Closure yield){
       //シI尖
   

                                                    File self
use (ExcelCategory) {                               の歌孚
   new File('hogehoge.xls').readXls{ excelApp ->
       // hogehoge.xlsにする採かしらのI尖 }
どんな撹になっているの?
? ANDROID_HOME/tools/
   ? layoutopt.bat
       ?lib/layoutpot.jar
           ?lib/uix.jarLayoutAnalyzer , LayoutAnalysis 
               ?lib/groovy-all-1.7.0.jar


       gHの夛はどんな湖じ
 com.android.layoutopt.cli.Main
 ?LayoutAnalyzer analyzer = new LayoutAnalyzer()
    ?LayoutAnalyzer
       ?loadRules
          ? Rule(Interface)
              ?GroovyRule(implements Rule)
I尖の送れのi                                               Layoutopt.jar


com.android.layoutopt.cli.Main
void main(String[] args)
   static void analyzeFiles(File[] files)
      LayoutAnalyzer analyzer = new LayoutAnalyzer();
         static void analyze(LayoutAnalyzer analyzer, File file)
             LayoutAnalysis analysis = analyzer.analyze(file);
                                            uix.jar

com.android.layoutopt.uix.LayoutAnalyzer

  LayoutAnalyzer()
   loadRules()
     loadRule
赫姻看看厩霞皆鞄艶鉛鉛を
                                                        兜豚晒
void loadRules()
  ClassLoader parent = getClass().getClassLoader();
  GroovyClassLoader loader = new GroovyClassLoader(parent);
  GroovyShell shell = new GroovyShell(loader);

  void loadRule(GroovyShell shell, String name, InputStream stream) {
         Script script = shell.parse(stream);
         this.mRules.add(new GroovyRule(name, script));
  }
                                                    public void addRule(Rule rule) が
                                                    あるので翌からRule弖紗は辛嬬
                                                                   かと

com.android.layoutopt.uix.rules.GroovyRule
import   com.android.layoutopt.uix.LayoutAnalysis;
import   com.android.layoutopt.uix.groovy.LayoutAnalysisCategory;
import   groovy.lang.*;
import   groovy.xml.dom.DOMCategory;
import   java.util.*;
import   org.codehaus.groovy.runtime.GroovyCategorySupport;
import   org.w3c.dom.Node;
?
    public class GroovyRule implements Rule {
            private final String mName;
            private final Script mScript;
            private final Binding mBinding;
            private final Closure mClosure;
            private final List<Class> mCategories;

           public GroovyRule(String name, Script script) {   gHのI尖を佩う
             this.mName = name;                                Closure
             this.mScript = script;
             this.mBinding = new Binding();
             this.mScript.setBinding(this.mBinding);
                                                                     Uix.jar
            this.mClosure = new Closure(this) {                   Rules/XX.rule
              public Object call() {                           をiみzんだスクリプトファ
                 return GroovyRule.this.mScript.run();             イルデ`タ
               }
             };

          this.mCategories = new ArrayList();
                                                               m鬉垢
              Collections.addAll(this.mCategories,           Categoryクラス
                       new Class[]{                           を塘双協x
                       DOMCategory.class,
                        LayoutAnalysisCategory.class });
                     }
Closure、Scriptのクラスのソ`スi鴫凌
package groovy.lang;

public abstract class Closure extends GroovyObjectSupport implements Cloneable,
    Runnable, Serializable {

    public Closure(Object owner, Object thisObject) {
       this.owner = owner;
       this.delegate = owner;
       this.thisObject = thisObject;

         CachedClosureClass cachedClass =
          CachedClosureClass)ReflectionCache.getCachedClass(getClass());
         this.parameterTypes = cachedClass.getParameterTypes();
         this.maximumNumberOfParameters =
          cachedClass.getMaximumNumberOfParameters();
     }

package groovy.lang;
public abstract class Script extends GroovyObjectSupport{
  private Binding binding;
  public abstract Object run();
}
com.android.layoutopt.uix.rules.GroovyRule┥A
  public class GroovyRule implements Rule {
                  ゛待゛
     public void run(LayoutAnalysis analysis, Node node) {
            this.mBinding.setVariable("analysis", analysis);
            this.mBinding.setVariable("node", node);
            GroovyCategorySupport.use(
                   this.mCategories, this.mClosure);
       }
   }


?GroovyCategorySupport.use ってなに
    ?g佩I尖クラスをeのクラスに瘁原けする(use)圭隈です
    ?http://d.hatena.ne.jp/fumokmm/20090117/1232209001
    ?和のv方を瘁原けします

佩桑催を燕幣しているのは
 com.android.layoutopt.uix.xml.XmlDocumentBuilder
で佩っています
uix.jar坪のruleファイルにusem
  しているJRが屎のようです


            rules/XX.rule
               <= gは
           groovyファイル
uix.jarの Rules/ UselessLayout.rule ファイル

// Rule: UselessLayout
//
// Description: Checks whether current node can be removed.
//
// Conditions:                               com.android.layoutopt.uix.groovy.LayoutA
// - The node has children                                    nalysisCategory
// - The node does not have siblings              public static LayoutAnalysis leftShift(
// - The node's parent is not a scroll view (horizontal or vertical)
// - The node does not have a background or its parent does not have a
// background or neither the node and its parent have a background
// - The parent is not a <merge/>

if (!node.isRoot() && !(node['..'].name() in ["ScrollView", "HorizontalScrollView"])
     &&
      node['..']['*'].size() == 1 && node['*'].size() > 0 &&
     ((node.'@android:background' ||
      node['..'].'@android:background') || (!node.'@android:background' &&
      !node['..'].'@android:background'))) {
   analysis << "This ${node.name()} layout or its ${node['..'].name()} parent is " +
        "${node['..'].'@android:id' ? "possibly useless" : "useless"}"
}
com.android.layoutopt.uix.groovy.LayoutAnalysisCategory

        public static int getStartLine(Node node)
        public static int getEndLine(Node node)


com.android.layoutopt.uix.groovy.LayoutAnalysisCategory
                public static class Issue

                                                   坪何Innerクラスで聞っている
                                                 からあえて傚冱いていると房われ


?   com.android.layoutopt.uix.LayoutAnalysis
       public int getStartLine() {
         return LayoutAnalysisCategory.getStartLine(this.mNode);
       }
?      public int getEndLine() {
         return LayoutAnalysisCategory.getEndLine(this.mNode);
      }
麿のG狼の室gを聞ったコ`ド
?GString ??String侏のGroovyクラスです
    ?@fumokmm さん盾hサイト
    http://d.hatena.ne.jp/fumokmm/20110323/
                                                  麻塀OK
    ?Groovyコ`ド貧だと
        ? int num=2
        ? String aaa=^ほげほげ$num ${num/20} ̄ とけます
        ? String bbb=`まいう¨
              ? シングルで譴爐汎嬪┐String侏

 com.android.layoutopt.uix.groovy.LayoutAnalysisCategory

import groovy.lang.GString;
   public static LayoutAnalysis leftShift(
        LayoutAnalysis analysis, GString description){
      analysis.addIssue(description.toString());
      return analysis;
   }
?DOMCategory ?? DOM荷恬をgにするCategory協xクラス
    ? XMLiみ哂Z http://goo.gl/SPG93
    ? XMLき哂Z http://goo.gl/nPxqO
    ?@nobusue さんサンプル
       ?https://gist.github.com/619066


  com.android.layoutopt.uix.groovy.LayoutAnalysisCategory

import groovy.xml.dom.DOMCategory;

  public static List<Node> all(Element element) {
           NodeList list = DOMCategory.depthFirst(element);
           int count = list.getLength();
           List nodes = new ArrayList(count - 1);
           for (int i = 1; i < count; i++) {
              nodes.add(list.item(i));
           }
           return nodes;
    }
Groovyは採が胆龍しいの?
?Javaはg佩コンパイル中宜
?スクリプトでg佩したい
?Javag佩スクリプトJRubyでけるけど、Ruby猟
 隈でき岷すの腕だよね
?XXX.java州XXX.groovyと徨筝だけで
 g佩できるとSだよね
 ? GroovyConsoleだと徨Javaでもg佩辛嬬
 ? groovyConsoleで謹富の俐屎で嘛辛嬬
   ? 塘双峰 仝}々 州勝]々 に俐屎
?もっとシンプルにこうよ`JSみたい
 ?クロ`ジャ吉聞って
Groovyを僥するには
? @fumokmm さん
  ? Groovy児A猟隈恷堀マスタ`
    ? http://d.hatena.ne.jp/fumokmm/20100605/1275736594
  ? Java聞いをGroovyに哈きzむサンプル鹿
    ? http://d.hatena.ne.jp/fumokmm/20110213/1297616436



? @uehaj さん
  ? DevLOVEぐるぐるGroovyで仝Sに聞おう
    Groovy々
    ?http://d.hatena.ne.jp/uehaj/20110126/1296003293


とここらxの秤鵑鰔てください
赫姻看看厩霞ってちょっと編してみたいけど、
      インスト`ル中宜くさそうだよね゛

? 徭蛍はGroovyConsoleのWebStart井聞ってます
  http://d.hatena.ne.jp/bluepapa32/20101006/1286337869




                      ここをクリック
インスト`ルは返X゛




1. ウインドウ]じたrに
   峰隠隔C嬬あるよ
2. Grape やAntBuilder(Ant
   のDSL)も}なしに聞え
   ます
GrapeC嬬を聞うには、
   groovy-allの麿にivy.jar
   が駅勣ですが、これには
   覆波襪辰討い泙坑
え`っ。でも噸宥、
   麿ライブラリ聞ってるんだけど
? mavenにアクセス
   ?@GrabResolver でmavenURL峺協
     ?覆MavenCentralならいらない
   ?@Grabで鯛としてくるライブラリ、バ`ジョンを峺協
? Mavenにないライブラリは?
   ?%USERPROFILE%/.groovy/lib にライブラリ
    を秘れれば徭啜弔僕┐擦泙
   ?GroovyConsoleのメニュ`から宥す並も辛嬬
? java Ccp ^./;lib/* ̄ groovy.ui.GroovyMain
  XXX.groovy
   の侘でBAT軟
BATイメ`ジ <デモ嗤

set JAVA_HOME=C:/opt/jdk
::set JAVA_OPTS=-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8

%JAVA_HOME%/bin/java %JAVA_OPTS% -cp ".;./lib/*;./libprocess/*"
groovy.ui.GroovyMain processing_test.groovy

::use groovyConsole
::%JAVA_HOME%/bin/java %JAVA_OPTS% -cp ".;./lib/*;./libprocess/*"
groovy.ui.Console processing_test.groovy

pause
醤悶箭(https://gist.github.com/896140 
                  璽妊發rgがあれば
                 (name= gridgainsystems ,
root=
        (group = net. .      , module= cron4j , version= )



   pattern=
   Scheduler s =          Scheduler()
   s.           (pattern,      Runnable() {
                     () {
          println
    }})
    s.     ()
        {
        Thread.        (        *     * ) //60昼2指棋ち
    }         (InterruptedException e) {}
    s.     ()
そんなに宴旋なら採で
   Androidに聞われてないのw
? 匯鬉海鵑覆里△蠅泙坑社Linuxh廠
? @uehaj さん盾h Groovy on android by discobot
  ? http://d.hatena.ne.jp/uehaj/20100515/1273934021
? CentOS5.5でして咾なかったのでパッチココに崔きました
  ? https://github.com/kimukou/gradlestudy/tree/master/discobot
聞喘コ`ドイメ`ジUTF8隠贋
package org.jggug.sample
import android.app.Activity;
import android.os.Bundle
import android.widget.TextView

public class Main extends Activity{
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState)
      TextView tv = new TextView(this)
      def list = ["Welcome","to", "discobot." , "?nAnd", "good",
    "luck", "with", "Main!",晩云ZもOK"]
     def str = ""
      list.each {
          str += it + " "
      }
      tv.setText(str)
      this.setContentView(tv)
  }
}
でもWinで干温厩温だけで
       きたい繁にはしいw
? Discoboth廠cygwinなら咾のかな?Win
   ? GroovyをシェルQいに竃栖ないからmkProject.sh
     咾ない
   ? dx.batのdexQI尖でgroovy-all.jarのクロ`ジャクラ
     スQがStackOverFlowがk伏してOutOfMemory竃るみた
     い

? でもWinでJavaだけできたい繁は圸功互いよね
  ? ASEに豚棋したいよw━F壓隆サポ`ト
だから赫姻温糸鉛艶吉で温廁(コンパイルツ`
    ルとして聞うのが耳?
?Gradleってなに
 ? Groovyでかれたビルドツ`ルです
 ? XMLでごちゃごちゃいていた峰をDSL峰で
    ?治pom.xml や build.xml のXML仇zからの用竃
 ? Maven、AntBuilderAntのDSLが聞えます

?rgがあれば
 ? ATECのTestterを聞ったデモ
?聞ったO協はここにあります
 ? Testter
    ?https://sites.google.com/site/androidtestclub/testter
 ? GradleO協ファイルuse Android Gradle Plugin
    ?https://github.com/kimukou/gradlestudy/tree/master/testter
Gradleファイル峰箭
buildscript {
  repositories {
     mavenRepo(urls: 'http://jvoegele.com/maven2/')
  }
  dependencies {
     classpath 'com.jvoegele.gradle.plugins:android-plugin:0.9.9'
  }
}
apply plugin: 'android'                               聞うpluginをmaven
repositories {                                        から函誼するO協
  flatDir(dirs: file("$rootDir/libs"))
  //mavenCentral()                                         聞うjarと
}                                                     バ`ジョンをd
dependencies {
  compile group: 'org.twitter4j', name: 'twitter4j-core', version: '2.1.8-
   SNAPSHOT'
}
Gradleファイル峰箭┥Aき1
// プロジェクトのバ`ジョンをO協
version = "x.y.z"
//ソ`ス了崔
[compileJava, compileTestJava]*.options.collect {options -> options.encoding
    = 'UTF-8'}
sourceSets.main.java.srcDirs += ['src']
ant.echo sourceSets.main.java.srcDirs

// 俸兆O協
androidPackage {
   //keyStore = System.getProperty('user.home')+"/.android/debug.keystore"
   keyStore = "${projectDir}/debug.keystore"
   keyAlias = 'androiddebugkey'
   // パスワ`ドがO協されてなければ、コマンド?プロンプトで秘薦
     を箔められる
   keyStorePassword = "android"
   keyAliasPassword = "android"
}
Gradleファイル峰箭┥Aき2
// プロジェクトのプロパティをリソ`スのフィルタリング┘廛蹈僖謄
    の盾Qに聞うヨ
processResources {
   expand (project.properties)
}
jar {
   from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
// デバッグ?ビルドO協
task configureDebug << {
   jar.classifier = "debug"
                                                   Apkに揖yする
}                                                  jarを峺協します
// リリ`ス?ビルドO協                                   ┐海林峰の栽は
task configureRelease << {                            vB畠何
   proguard.enabled = true
}
囮床ありがとうございました
? 盾裂に聞ったソフト                     ANDROID_HOME/
  ? ソ`ス了崔が盾りませんでした升次        Tools/libディレクトリ貧で
     ?惄辰jarを岷歌孚             沫するとvBjarがれます
  ?JD
    ?紅云さん盾hペ`ジ http://goo.gl/DRWiR
    ?云社サイト http://goo.gl/ux1I

More Related Content

Layout analyzerでのgroovyの旋喘について

  • 2. 徭失B初 ?Kimukou_26 といいます ? v|でフリ`のSEしています ? 麼に歌紗している茶氏 ?JGGUG ?? Grails/Groovy ?#jggug ?ATEC ??Android テスト何 ?#android_tec ?あまり廚任てません。すみません升 ? 書指は #yapf には茶しにきたつもりが。。 ? 採絞かk燕する並にw
  • 6. では盾裂してみましょう ?聞っているツ`ルは? ?Layoutopt ?晩云Z盾hサイト http://goo.gl/QCMij ?云社盾hサイト http://goo.gl/7cdt7 ?どんなツ`ル? ? レイアウト.xmlの恷m業チェックツ`ル ? あくまでナビゲ`ションだけで筝はしないよ ? どこでGroovyを聞っているの? useスコ`プ坪だと クラスでCategoryAの ? XMLの盾裂RuleGroovyRule ル`ルI尖が ? Use Category┘ラスにC嬬を瘁原けするC嬬 聞えるイメ`ジ useCategoryA{ 鵐ラス、 CategoryA Clousre A() / B() }
  • 7. GroovyでgH聞うとこんなイメ`ジ class ExcelCategory { /** ファイルをiみzむ */ static void readXls(File self, Closure yield){ Fileクラスに readXls() //izI尖 v方が弖紗された イメ`ジ /** ファイルをシする */ static void editXls(File self, Closure yield){ //シI尖 File self use (ExcelCategory) { の歌孚 new File('hogehoge.xls').readXls{ excelApp -> // hogehoge.xlsにする採かしらのI尖 }
  • 8. どんな撹になっているの? ? ANDROID_HOME/tools/ ? layoutopt.bat ?lib/layoutpot.jar ?lib/uix.jarLayoutAnalyzer , LayoutAnalysis ?lib/groovy-all-1.7.0.jar gHの夛はどんな湖じ com.android.layoutopt.cli.Main ?LayoutAnalyzer analyzer = new LayoutAnalyzer() ?LayoutAnalyzer ?loadRules ? Rule(Interface) ?GroovyRule(implements Rule)
  • 9. I尖の送れのi Layoutopt.jar com.android.layoutopt.cli.Main void main(String[] args) static void analyzeFiles(File[] files) LayoutAnalyzer analyzer = new LayoutAnalyzer(); static void analyze(LayoutAnalyzer analyzer, File file) LayoutAnalysis analysis = analyzer.analyze(file); uix.jar com.android.layoutopt.uix.LayoutAnalyzer LayoutAnalyzer() loadRules() loadRule
  • 10. 赫姻看看厩霞皆鞄艶鉛鉛を 兜豚晒 void loadRules() ClassLoader parent = getClass().getClassLoader(); GroovyClassLoader loader = new GroovyClassLoader(parent); GroovyShell shell = new GroovyShell(loader); void loadRule(GroovyShell shell, String name, InputStream stream) { Script script = shell.parse(stream); this.mRules.add(new GroovyRule(name, script)); } public void addRule(Rule rule) が あるので翌からRule弖紗は辛嬬 かと com.android.layoutopt.uix.rules.GroovyRule import com.android.layoutopt.uix.LayoutAnalysis; import com.android.layoutopt.uix.groovy.LayoutAnalysisCategory; import groovy.lang.*; import groovy.xml.dom.DOMCategory; import java.util.*; import org.codehaus.groovy.runtime.GroovyCategorySupport; import org.w3c.dom.Node;
  • 11. ? public class GroovyRule implements Rule { private final String mName; private final Script mScript; private final Binding mBinding; private final Closure mClosure; private final List<Class> mCategories; public GroovyRule(String name, Script script) { gHのI尖を佩う this.mName = name; Closure this.mScript = script; this.mBinding = new Binding(); this.mScript.setBinding(this.mBinding); Uix.jar this.mClosure = new Closure(this) { Rules/XX.rule public Object call() { をiみzんだスクリプトファ return GroovyRule.this.mScript.run(); イルデ`タ } }; this.mCategories = new ArrayList(); m鬉垢 Collections.addAll(this.mCategories, Categoryクラス new Class[]{ を塘双協x DOMCategory.class, LayoutAnalysisCategory.class }); }
  • 12. Closure、Scriptのクラスのソ`スi鴫凌 package groovy.lang; public abstract class Closure extends GroovyObjectSupport implements Cloneable, Runnable, Serializable { public Closure(Object owner, Object thisObject) { this.owner = owner; this.delegate = owner; this.thisObject = thisObject; CachedClosureClass cachedClass = CachedClosureClass)ReflectionCache.getCachedClass(getClass()); this.parameterTypes = cachedClass.getParameterTypes(); this.maximumNumberOfParameters = cachedClass.getMaximumNumberOfParameters(); } package groovy.lang; public abstract class Script extends GroovyObjectSupport{ private Binding binding; public abstract Object run(); }
  • 13. com.android.layoutopt.uix.rules.GroovyRule┥A public class GroovyRule implements Rule { ゛待゛ public void run(LayoutAnalysis analysis, Node node) { this.mBinding.setVariable("analysis", analysis); this.mBinding.setVariable("node", node); GroovyCategorySupport.use( this.mCategories, this.mClosure); } } ?GroovyCategorySupport.use ってなに ?g佩I尖クラスをeのクラスに瘁原けする(use)圭隈です ?http://d.hatena.ne.jp/fumokmm/20090117/1232209001 ?和のv方を瘁原けします 佩桑催を燕幣しているのは com.android.layoutopt.uix.xml.XmlDocumentBuilder で佩っています
  • 15. uix.jarの Rules/ UselessLayout.rule ファイル // Rule: UselessLayout // // Description: Checks whether current node can be removed. // // Conditions: com.android.layoutopt.uix.groovy.LayoutA // - The node has children nalysisCategory // - The node does not have siblings public static LayoutAnalysis leftShift( // - The node's parent is not a scroll view (horizontal or vertical) // - The node does not have a background or its parent does not have a // background or neither the node and its parent have a background // - The parent is not a <merge/> if (!node.isRoot() && !(node['..'].name() in ["ScrollView", "HorizontalScrollView"]) && node['..']['*'].size() == 1 && node['*'].size() > 0 && ((node.'@android:background' || node['..'].'@android:background') || (!node.'@android:background' && !node['..'].'@android:background'))) { analysis << "This ${node.name()} layout or its ${node['..'].name()} parent is " + "${node['..'].'@android:id' ? "possibly useless" : "useless"}" }
  • 16. com.android.layoutopt.uix.groovy.LayoutAnalysisCategory public static int getStartLine(Node node) public static int getEndLine(Node node) com.android.layoutopt.uix.groovy.LayoutAnalysisCategory public static class Issue 坪何Innerクラスで聞っている からあえて傚冱いていると房われ ? com.android.layoutopt.uix.LayoutAnalysis public int getStartLine() { return LayoutAnalysisCategory.getStartLine(this.mNode); } ? public int getEndLine() { return LayoutAnalysisCategory.getEndLine(this.mNode); }
  • 17. 麿のG狼の室gを聞ったコ`ド ?GString ??String侏のGroovyクラスです ?@fumokmm さん盾hサイト http://d.hatena.ne.jp/fumokmm/20110323/ 麻塀OK ?Groovyコ`ド貧だと ? int num=2 ? String aaa=^ほげほげ$num ${num/20} ̄ とけます ? String bbb=`まいう¨ ? シングルで譴爐汎嬪┐String侏 com.android.layoutopt.uix.groovy.LayoutAnalysisCategory import groovy.lang.GString; public static LayoutAnalysis leftShift( LayoutAnalysis analysis, GString description){ analysis.addIssue(description.toString()); return analysis; }
  • 18. ?DOMCategory ?? DOM荷恬をgにするCategory協xクラス ? XMLiみ哂Z http://goo.gl/SPG93 ? XMLき哂Z http://goo.gl/nPxqO ?@nobusue さんサンプル ?https://gist.github.com/619066 com.android.layoutopt.uix.groovy.LayoutAnalysisCategory import groovy.xml.dom.DOMCategory; public static List<Node> all(Element element) { NodeList list = DOMCategory.depthFirst(element); int count = list.getLength(); List nodes = new ArrayList(count - 1); for (int i = 1; i < count; i++) { nodes.add(list.item(i)); } return nodes; }
  • 19. Groovyは採が胆龍しいの? ?Javaはg佩コンパイル中宜 ?スクリプトでg佩したい ?Javag佩スクリプトJRubyでけるけど、Ruby猟 隈でき岷すの腕だよね ?XXX.java州XXX.groovyと徨筝だけで g佩できるとSだよね ? GroovyConsoleだと徨Javaでもg佩辛嬬 ? groovyConsoleで謹富の俐屎で嘛辛嬬 ? 塘双峰 仝}々 州勝]々 に俐屎 ?もっとシンプルにこうよ`JSみたい ?クロ`ジャ吉聞って
  • 20. Groovyを僥するには ? @fumokmm さん ? Groovy児A猟隈恷堀マスタ` ? http://d.hatena.ne.jp/fumokmm/20100605/1275736594 ? Java聞いをGroovyに哈きzむサンプル鹿 ? http://d.hatena.ne.jp/fumokmm/20110213/1297616436 ? @uehaj さん ? DevLOVEぐるぐるGroovyで仝Sに聞おう Groovy々 ?http://d.hatena.ne.jp/uehaj/20110126/1296003293 とここらxの秤鵑鰔てください
  • 21. 赫姻看看厩霞ってちょっと編してみたいけど、 インスト`ル中宜くさそうだよね゛ ? 徭蛍はGroovyConsoleのWebStart井聞ってます http://d.hatena.ne.jp/bluepapa32/20101006/1286337869 ここをクリック
  • 22. インスト`ルは返X゛ 1. ウインドウ]じたrに 峰隠隔C嬬あるよ 2. Grape やAntBuilder(Ant のDSL)も}なしに聞え ます GrapeC嬬を聞うには、 groovy-allの麿にivy.jar が駅勣ですが、これには 覆波襪辰討い泙坑
  • 23. え`っ。でも噸宥、 麿ライブラリ聞ってるんだけど ? mavenにアクセス ?@GrabResolver でmavenURL峺協 ?覆MavenCentralならいらない ?@Grabで鯛としてくるライブラリ、バ`ジョンを峺協 ? Mavenにないライブラリは? ?%USERPROFILE%/.groovy/lib にライブラリ を秘れれば徭啜弔僕┐擦泙 ?GroovyConsoleのメニュ`から宥す並も辛嬬 ? java Ccp ^./;lib/* ̄ groovy.ui.GroovyMain XXX.groovy の侘でBAT軟
  • 24. BATイメ`ジ <デモ嗤 set JAVA_HOME=C:/opt/jdk ::set JAVA_OPTS=-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8 %JAVA_HOME%/bin/java %JAVA_OPTS% -cp ".;./lib/*;./libprocess/*" groovy.ui.GroovyMain processing_test.groovy ::use groovyConsole ::%JAVA_HOME%/bin/java %JAVA_OPTS% -cp ".;./lib/*;./libprocess/*" groovy.ui.Console processing_test.groovy pause
  • 25. 醤悶箭(https://gist.github.com/896140 璽妊發rgがあれば (name= gridgainsystems , root= (group = net. . , module= cron4j , version= ) pattern= Scheduler s = Scheduler() s. (pattern, Runnable() { () { println }}) s. () { Thread. ( * * ) //60昼2指棋ち } (InterruptedException e) {} s. ()
  • 26. そんなに宴旋なら採で Androidに聞われてないのw ? 匯鬉海鵑覆里△蠅泙坑社Linuxh廠 ? @uehaj さん盾h Groovy on android by discobot ? http://d.hatena.ne.jp/uehaj/20100515/1273934021 ? CentOS5.5でして咾なかったのでパッチココに崔きました ? https://github.com/kimukou/gradlestudy/tree/master/discobot
  • 27. 聞喘コ`ドイメ`ジUTF8隠贋 package org.jggug.sample import android.app.Activity; import android.os.Bundle import android.widget.TextView public class Main extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) TextView tv = new TextView(this) def list = ["Welcome","to", "discobot." , "?nAnd", "good", "luck", "with", "Main!",晩云ZもOK"] def str = "" list.each { str += it + " " } tv.setText(str) this.setContentView(tv) } }
  • 28. でもWinで干温厩温だけで きたい繁にはしいw ? Discoboth廠cygwinなら咾のかな?Win ? GroovyをシェルQいに竃栖ないからmkProject.sh 咾ない ? dx.batのdexQI尖でgroovy-all.jarのクロ`ジャクラ スQがStackOverFlowがk伏してOutOfMemory竃るみた い ? でもWinでJavaだけできたい繁は圸功互いよね ? ASEに豚棋したいよw━F壓隆サポ`ト
  • 29. だから赫姻温糸鉛艶吉で温廁(コンパイルツ` ルとして聞うのが耳? ?Gradleってなに ? Groovyでかれたビルドツ`ルです ? XMLでごちゃごちゃいていた峰をDSL峰で ?治pom.xml や build.xml のXML仇zからの用竃 ? Maven、AntBuilderAntのDSLが聞えます ?rgがあれば ? ATECのTestterを聞ったデモ ?聞ったO協はここにあります ? Testter ?https://sites.google.com/site/androidtestclub/testter ? GradleO協ファイルuse Android Gradle Plugin ?https://github.com/kimukou/gradlestudy/tree/master/testter
  • 30. Gradleファイル峰箭 buildscript { repositories { mavenRepo(urls: 'http://jvoegele.com/maven2/') } dependencies { classpath 'com.jvoegele.gradle.plugins:android-plugin:0.9.9' } } apply plugin: 'android' 聞うpluginをmaven repositories { から函誼するO協 flatDir(dirs: file("$rootDir/libs")) //mavenCentral() 聞うjarと } バ`ジョンをd dependencies { compile group: 'org.twitter4j', name: 'twitter4j-core', version: '2.1.8- SNAPSHOT' }
  • 31. Gradleファイル峰箭┥Aき1 // プロジェクトのバ`ジョンをO協 version = "x.y.z" //ソ`ス了崔 [compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'} sourceSets.main.java.srcDirs += ['src'] ant.echo sourceSets.main.java.srcDirs // 俸兆O協 androidPackage { //keyStore = System.getProperty('user.home')+"/.android/debug.keystore" keyStore = "${projectDir}/debug.keystore" keyAlias = 'androiddebugkey' // パスワ`ドがO協されてなければ、コマンド?プロンプトで秘薦 を箔められる keyStorePassword = "android" keyAliasPassword = "android" }
  • 32. Gradleファイル峰箭┥Aき2 // プロジェクトのプロパティをリソ`スのフィルタリング┘廛蹈僖謄 の盾Qに聞うヨ processResources { expand (project.properties) } jar { from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } // デバッグ?ビルドO協 task configureDebug << { jar.classifier = "debug" Apkに揖yする } jarを峺協します // リリ`ス?ビルドO協 ┐海林峰の栽は task configureRelease << { vB畠何 proguard.enabled = true }
  • 33. 囮床ありがとうございました ? 盾裂に聞ったソフト ANDROID_HOME/ ? ソ`ス了崔が盾りませんでした升次 Tools/libディレクトリ貧で ?惄辰jarを岷歌孚 沫するとvBjarがれます ?JD ?紅云さん盾hペ`ジ http://goo.gl/DRWiR ?云社サイト http://goo.gl/ux1I