SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
LayoutAnalyzerでのGroovyの
       利用について



         2011/04/09
        @kimukou_26
自己紹介
Kimukou_26 といいます
 関東でフリーのSEしています
 主に参加している勉強会
 JGGUG ・・   Grails/Groovy
   #jggug

 ATEC ・・Android テスト部
   #android_tec
   あまり貢献できてません。すみません><


 今回は #yapf には勉強しにきたつもりが。。
  何故か発表する事にw
今回話す事になったきっかけ
Layout analyzerでのgroovyの利用について
Layout analyzerでのgroovyの利用について
では解析してみましょう
使っているツールは?
 Layoutopt
   日本語解説サイト http://goo.gl/QCMij
   本家解説サイト http://goo.gl/7cdt7
どんなツール?
  レイアウト.xmlの最適度チェックツール
  あくまでナビゲーションだけで変更はしないよ
 どこでGroovyを使っているの?                    useスコープ内だと対象
                                        クラスでCategoryAの
  XMLの解析Rule(GroovyRule)                 ルール(処理)が
  Use Category(クラスに機能を後付けする機能)           使えるイメージ

       use(CategoryA){
           対象クラス、             CategoryA
            Clousre            A() / B()
       }
Groovyで実際使うとこんなイメージ
class ExcelCategory {
    /** ファイルを読み込む */
   static void readXls(File self, Closure yield){    Fileクラスに
                                                      readXls()
       //読込処理
                                                    関数が追加された
   }                                                   イメージ
   /** ファイルを編集する */
   static void editXls(File self, Closure yield){
       //編集処理
   }
}
                                                    File self
use (ExcelCategory) {                               の参照
   new File('hogehoge.xls').readXls{ excelApp ->
       // hogehoge.xlsに対する何かしらの処理 }
   }
}
どんな構成になっているの?
 ANDROID_HOME/tools/
    layoutopt.bat
       lib/layoutpot.jar
           lib/uix.jar(LayoutAnalyzer , LayoutAnalysis )
               lib/groovy-all-1.7.0.jar


       実際の構造はどんな感じ?
 com.android.layoutopt.cli.Main
 LayoutAnalyzer analyzer = new LayoutAnalyzer()
    LayoutAnalyzer
       loadRules
           Rule(Interface)
              GroovyRule(implements Rule)
処理の流れの抜粋                                               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
GroovyShellを
                                                        初期化
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) {   実際の処理を行う
             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() {                           を読み込んだスクリプトファ
                 return GroovyRule.this.mScript.run();             イルデータ
               }
             };

          this.mCategories = new ArrayList();
                                                               適応する
              Collections.addAll(this.mCategories,           Categoryクラス
                       new Class[]{                           を配列定義
                       DOMCategory.class,
                        LayoutAnalysisCategory.class });
                     }
Closure、Scriptのクラスのソース抜粋<参考
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(続)
  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 ってなに?
    •実行処理クラスを別のクラスに後付けする(use)方法です
    •http://d.hatena.ne.jp/fumokmm/20090117/1232209001
    •下記の関数を後付けします

行番号を表示しているのは
 com.android.layoutopt.uix.xml.XmlDocumentBuilder
で行っています
uix.jar内のruleファイルにuse適応
  している認識が正のようです


            rules/XX.rule
               <= 実は
           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系の技術を使ったコード
•GString ・・String型のGroovy拡張クラスです
    •@fumokmm さん解説サイト
    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操作を簡単にするCategory定義クラス
    • XML読み(英語) http://goo.gl/SPG93
    • XML書き(英語) 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は実行コンパイル面倒
スクリプトで実行したい!
Java実行スクリプトJRubyで書けるけど、Ruby文
 法で書き直すの嫌だよね
XXX.java=>XXX.groovyと拡張子変更だけで
 実行できると楽だよね
  GroovyConsoleだと拡張子Javaでも実行可能
  groovyConsoleで多少の修正で動作可能
    配列記述 「}」 =>「]」 に修正
もっとシンプルに書こうよーJSみたい
 クロージャ等使って
Groovyを学習するには
 @fumokmm さん
   Groovy基礎文法最速マスター
     http://d.hatena.ne.jp/fumokmm/20100605/1275736594
   Java使いをGroovyに引き込むサンプル集
     http://d.hatena.ne.jp/fumokmm/20110213/1297616436



 @uehaj さん
   DevLOVEぐるぐるGroovyで「気楽に使おう
    Groovy」
    http://d.hatena.ne.jp/uehaj/20110126/1296003293


とここら辺の情報を見てください
Groovyってちょっと試してみたいけど、
      インストール面倒くさそうだよね~

 自分はGroovyConsoleのWebStart版使ってます
  >http://d.hatena.ne.jp/bluepapa32/20101006/1286337869




                      ここをクリック
インストールは手軽~




1. ウインドウ閉じた時に記
   述保持機能あるよ
2. Grape やAntBuilder(Ant
   のDSL)も問題なしに使え
   ます
(Grape機能を使うには、
   groovy-allの他にivy.jar
   が必要ですが、これには
   標準で入っています)
えーっ。でも普通、
   他ライブラリ使ってるんだけど?
 mavenにアクセス
   @GrabResolver でmavenURL指定
     標準のMavenCentralならいらない
   @Grabで落としてくるライブラリ、バージョンを指定
 Mavenにないライブラリは?
   %USERPROFILE%/.groovy/lib にライブラリ
    を入れれば自動的に通せます
   GroovyConsoleのメニューから通す事も可能
 java –cp “./;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 )
                  <デモは時間があれば
                 (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
 一応こんなのあります<要Linux環境
 @uehaj さん解説 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!",日本語もOK!"]
     def str = ""
      list.each {
          str += it + " "
      }
      tv.setText(str)
      this.setContentView(tv)
  }
}
でもWinでJavaだけで
       書きたい人には厳しいw
 Discobot環境cygwinなら動くのかな?<Win
    Groovyをシェル扱いに出来ないからmkProject.sh
     動かない
    dx.batのdex変換処理でgroovy-all.jarのクロージャクラ
     ス変換がStackOverFlowが発生してOutOfMemory出るみた
     い

 でもWinでJavaだけで書きたい人は垣根高いよね
   ASEに期待したいよw(現在未サポート
だからGradle等で補助(コンパイル)ツー
    ルとして使うのが吉?
Gradleってなに?
  Groovyで書かれたビルドツールです
  XMLでごちゃごちゃ書いていた記述をDSL記述で
    <=pom.xml や build.xml のXML地獄からの脱出
  Maven、AntBuilder(AntのDSL)が使えます

時間があれば
  ATECのTestterを使ったデモ
使った設定はここにあります
  Testter
    https://sites.google.com/site/androidtestclub/testter
  Gradle設定ファイル(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 {                                        から取得する設定
  flatDir(dirs: file("$rootDir/libs"))
  //mavenCentral()                                         使うjarと
}                                                     バージョンを記載
dependencies {
  compile group: 'org.twitter4j', name: 'twitter4j-core', version: '2.1.8-
   SNAPSHOT'
}
Gradleファイル記述例(続き1)
// プロジェクトのバージョンを設定
version = "x.y.z"
//ソース位置
[compileJava, compileTestJava]*.options.collect {options -> options.encoding
    = 'UTF-8'}
sourceSets.main.java.srcDirs += ['src']
ant.echo sourceSets.main.java.srcDirs

// 署名設定
androidPackage {
   //keyStore = System.getProperty('user.home')+"/.android/debug.keystore"
   keyStore = "${projectDir}/debug.keystore"
   keyAlias = 'androiddebugkey'
   // パスワードが設定されてなければ、コマンド・プロンプトで入力
     を求められる
   keyStorePassword = "android"
   keyAliasPassword = "android"
}
Gradleファイル記述例(続き2)
// プロジェクトのプロパティをリソースのフィルタリング(プロパティ
    の解決)に使うヨ
processResources {
   expand (project.properties)
}
jar {
   from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
// デバッグ・ビルド設定
task configureDebug << {
   jar.classifier = "debug"
                                                   Apkに同梱する
}                                                  jarを指定します
// リリース・ビルド設定                                   (この記述の場合は
task configureRelease << {                            関連全部)
   proguard.enabled = true
}
御静聴ありがとうございました
 解析に使ったソフト                     ANDROID_HOME/
   ソース位置が解りませんでした><。        Tools/libディレクトリ上で検
     従ってjarを直参照             索すると関連jarが見れます
  JD
    谷本さん解説ページ http://goo.gl/DRWiR
    本家サイト http://goo.gl/ux1I

Mais conteúdo relacionado

Mais procurados

AsyncTask アンチパターン
AsyncTask アンチパターンAsyncTask アンチパターン
AsyncTask アンチパターンHiroshi Kurokawa
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんYukari Sakurai
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)Takashi Yoshinaga
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaYuta Kawadai
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)Koji Nakamura
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionTakuto Wada
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまでMugen Fujii
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかYoshitaka Kawashima
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Takashi EGAWA
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUehara Junji
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXShinya Mochida
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法Yoshifumi Kawai
 

Mais procurados (20)

AsyncTask アンチパターン
AsyncTask アンチパターンAsyncTask アンチパターン
AsyncTask アンチパターン
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
 
ゲンバのSwift
ゲンバのSwiftゲンバのSwift
ゲンバのSwift
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Deep Dive C# 6.0
Deep Dive C# 6.0Deep Dive C# 6.0
Deep Dive C# 6.0
 
Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)Qunit再入門 (Version 1.10.0 編)
Qunit再入門 (Version 1.10.0 編)
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
 
第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで第4回勉強会 Groovyの文法からSpockまで
第4回勉強会 Groovyの文法からSpockまで
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
 
Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
 

Destaque

Building scalablewebapps
Building scalablewebappsBuilding scalablewebapps
Building scalablewebappsAyumu Aizawa
 
ngServer and-collaboratived-development-between-san-francisco-and-tokyo
ngServer and-collaboratived-development-between-san-francisco-and-tokyongServer and-collaboratived-development-between-san-francisco-and-tokyo
ngServer and-collaboratived-development-between-san-francisco-and-tokyoSatoshi Tanaka
 
ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」
ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」
ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」nisobe58
 
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲームhideyuki ikeda
 
17 E-5 震災とHackとクラウドと 亀渕分
17 E-5 震災とHackとクラウドと 亀渕分17 E-5 震災とHackとクラウドと 亀渕分
17 E-5 震災とHackとクラウドと 亀渕分Keiji Kamebuchi
 
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-nishio
 
Japan Developer Summit (jp) - Cloud Foundry, the Open Platform As A Service
Japan Developer Summit (jp) - Cloud Foundry, the Open Platform As A ServiceJapan Developer Summit (jp) - Cloud Foundry, the Open Platform As A Service
Japan Developer Summit (jp) - Cloud Foundry, the Open Platform As A ServicePatrick Chanezon
 
ngGoBuilder and collaborative development between San Francisco and Tokyo
ngGoBuilder and collaborative development between San Francisco and TokyongGoBuilder and collaborative development between San Francisco and Tokyo
ngGoBuilder and collaborative development between San Francisco and Tokyonotolab
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)Yuuki Namikawa
 
【17-E-3】 オンライン機械学習で実現する大規模データ処理
【17-E-3】 オンライン機械学習で実現する大規模データ処理【17-E-3】 オンライン機械学習で実現する大規模データ処理
【17-E-3】 オンライン機械学習で実現する大規模データ処理Developers Summit
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engineDuoyi Wu
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)Akihiro Kuwano
 
削除フラグのはなし
削除フラグのはなし削除フラグのはなし
削除フラグのはなしShigetaka Yachi
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLBYuki KAN
 
主婦でもできる Android Layout
主婦でもできる Android Layout主婦でもできる Android Layout
主婦でもできる Android LayoutHiromi Tsuzuki
 
Ruby使いのためのScalaのススメ
Ruby使いのためのScalaのススメRuby使いのためのScalaのススメ
Ruby使いのためのScalaのススメOuka Yuka
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 

Destaque (19)

Building scalablewebapps
Building scalablewebappsBuilding scalablewebapps
Building scalablewebapps
 
ngServer and-collaboratived-development-between-san-francisco-and-tokyo
ngServer and-collaboratived-development-between-san-francisco-and-tokyongServer and-collaboratived-development-between-san-francisco-and-tokyo
ngServer and-collaboratived-development-between-san-francisco-and-tokyo
 
ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」
ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」
ソフトウェアパッケージベンダーのためのクラウドソリューション「SQL Anywhere OnDemand Edition」
 
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
20120407 ASP.NET+C#で開発する大規模ソーシャルゲーム
 
17 E-5 震災とHackとクラウドと 亀渕分
17 E-5 震災とHackとクラウドと 亀渕分17 E-5 震災とHackとクラウドと 亀渕分
17 E-5 震災とHackとクラウドと 亀渕分
 
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
アイデアを塩漬けにしない-世界中の人に手伝ってもらう方法-
 
Japan Developer Summit (jp) - Cloud Foundry, the Open Platform As A Service
Japan Developer Summit (jp) - Cloud Foundry, the Open Platform As A ServiceJapan Developer Summit (jp) - Cloud Foundry, the Open Platform As A Service
Japan Developer Summit (jp) - Cloud Foundry, the Open Platform As A Service
 
ngGoBuilder and collaborative development between San Francisco and Tokyo
ngGoBuilder and collaborative development between San Francisco and TokyongGoBuilder and collaborative development between San Francisco and Tokyo
ngGoBuilder and collaborative development between San Francisco and Tokyo
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
 
【17-E-3】 オンライン機械学習で実現する大規模データ処理
【17-E-3】 オンライン機械学習で実現する大規模データ処理【17-E-3】 オンライン機械学習で実現する大規模データ処理
【17-E-3】 オンライン機械学習で実現する大規模データ処理
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engine
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
 
削除フラグのはなし
削除フラグのはなし削除フラグのはなし
削除フラグのはなし
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
 
主婦でもできる Android Layout
主婦でもできる Android Layout主婦でもできる Android Layout
主婦でもできる Android Layout
 
Wckansai 2014
Wckansai 2014Wckansai 2014
Wckansai 2014
 
Ruby使いのためのScalaのススメ
Ruby使いのためのScalaのススメRuby使いのためのScalaのススメ
Ruby使いのためのScalaのススメ
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
AWSからのメール送信
AWSからのメール送信AWSからのメール送信
AWSからのメール送信
 

Semelhante a Layout analyzerでのgroovyの利用について

Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handsonNobuhiro Sue
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)Nobuhiro Sue
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料gaaupp
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_GebNobuhiro Sue
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFメディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFAtsushi Tadokoro
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
JSがちょい好きになるプレゼン
JSがちょい好きになるプレゼンJSがちょい好きになるプレゼン
JSがちょい好きになるプレゼンJames Kirk
 

Semelhante a Layout analyzerでのgroovyの利用について (20)

Gws 20130315 gradle_handson
Gws 20130315 gradle_handsonGws 20130315 gradle_handson
Gws 20130315 gradle_handson
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
TDC20111031_Groovy_Geb
TDC20111031_Groovy_GebTDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFメディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
 
G * magazine 1
G * magazine 1G * magazine 1
G * magazine 1
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
Groovyの紹介20130323
Groovyの紹介20130323Groovyの紹介20130323
Groovyの紹介20130323
 
Hudson using Groovy #jggug
Hudson using Groovy  #jggugHudson using Groovy  #jggug
Hudson using Groovy #jggug
 
Junit4
Junit4Junit4
Junit4
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
JSがちょい好きになるプレゼン
JSがちょい好きになるプレゼンJSがちょい好きになるプレゼン
JSがちょい好きになるプレゼン
 

Mais de kimukou_26 Kimukou

JRebel for Android 1.2.14 update
JRebel for Android 1.2.14 updateJRebel for Android 1.2.14 update
JRebel for Android 1.2.14 updatekimukou_26 Kimukou
 
JRebel for Android 1.0 を試食してみた
JRebel for Android 1.0 を試食してみたJRebel for Android 1.0 を試食してみた
JRebel for Android 1.0 を試食してみたkimukou_26 Kimukou
 
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用kimukou_26 Kimukou
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggugkimukou_26 Kimukou
 

Mais de kimukou_26 Kimukou (6)

JRebel for Android 1.2.14 update
JRebel for Android 1.2.14 updateJRebel for Android 1.2.14 update
JRebel for Android 1.2.14 update
 
JRebel for Android 1.0 を試食してみた
JRebel for Android 1.0 を試食してみたJRebel for Android 1.0 を試食してみた
JRebel for Android 1.0 を試食してみた
 
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
 
Griffon10 in groovy_fx
Griffon10 in groovy_fxGriffon10 in groovy_fx
Griffon10 in groovy_fx
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 

Último

Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...yoshidakids7
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也harmonylab
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 

Último (13)

Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
Summary of "ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language M...
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
【修士論文】代替出勤者の選定業務における依頼順決定方法に関する研究   千坂知也
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 

Layout analyzerでのgroovyの利用について

  • 1. LayoutAnalyzerでのGroovyの 利用について 2011/04/09 @kimukou_26
  • 2. 自己紹介 Kimukou_26 といいます  関東でフリーのSEしています  主に参加している勉強会 JGGUG ・・ Grails/Groovy #jggug ATEC ・・Android テスト部 #android_tec あまり貢献できてません。すみません><  今回は #yapf には勉強しにきたつもりが。。  何故か発表する事にw
  • 6. では解析してみましょう 使っているツールは? Layoutopt 日本語解説サイト http://goo.gl/QCMij 本家解説サイト http://goo.gl/7cdt7 どんなツール?  レイアウト.xmlの最適度チェックツール  あくまでナビゲーションだけで変更はしないよ  どこでGroovyを使っているの? useスコープ内だと対象 クラスでCategoryAの  XMLの解析Rule(GroovyRule) ルール(処理)が  Use Category(クラスに機能を後付けする機能) 使えるイメージ use(CategoryA){ 対象クラス、 CategoryA Clousre A() / B() }
  • 7. Groovyで実際使うとこんなイメージ class ExcelCategory { /** ファイルを読み込む */ static void readXls(File self, Closure yield){ Fileクラスに readXls() //読込処理 関数が追加された } イメージ /** ファイルを編集する */ static void editXls(File self, Closure yield){ //編集処理 } } File self use (ExcelCategory) { の参照 new File('hogehoge.xls').readXls{ excelApp -> // hogehoge.xlsに対する何かしらの処理 } } }
  • 8. どんな構成になっているの?  ANDROID_HOME/tools/  layoutopt.bat lib/layoutpot.jar lib/uix.jar(LayoutAnalyzer , LayoutAnalysis ) lib/groovy-all-1.7.0.jar 実際の構造はどんな感じ? com.android.layoutopt.cli.Main LayoutAnalyzer analyzer = new LayoutAnalyzer() LayoutAnalyzer loadRules  Rule(Interface) GroovyRule(implements Rule)
  • 9. 処理の流れの抜粋 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. GroovyShellを 初期化 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) { 実際の処理を行う 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() { を読み込んだスクリプトファ return GroovyRule.this.mScript.run(); イルデータ } }; this.mCategories = new ArrayList(); 適応する Collections.addAll(this.mCategories, Categoryクラス new Class[]{ を配列定義 DOMCategory.class, LayoutAnalysisCategory.class }); }
  • 12. Closure、Scriptのクラスのソース抜粋<参考 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(続) 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 ってなに? •実行処理クラスを別のクラスに後付けする(use)方法です •http://d.hatena.ne.jp/fumokmm/20090117/1232209001 •下記の関数を後付けします 行番号を表示しているのは 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系の技術を使ったコード •GString ・・String型のGroovy拡張クラスです •@fumokmm さん解説サイト 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操作を簡単にするCategory定義クラス • XML読み(英語) http://goo.gl/SPG93 • XML書き(英語) 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は実行コンパイル面倒 スクリプトで実行したい! Java実行スクリプトJRubyで書けるけど、Ruby文 法で書き直すの嫌だよね XXX.java=>XXX.groovyと拡張子変更だけで 実行できると楽だよね  GroovyConsoleだと拡張子Javaでも実行可能  groovyConsoleで多少の修正で動作可能  配列記述 「}」 =>「]」 に修正 もっとシンプルに書こうよーJSみたい クロージャ等使って
  • 20. Groovyを学習するには  @fumokmm さん  Groovy基礎文法最速マスター  http://d.hatena.ne.jp/fumokmm/20100605/1275736594  Java使いをGroovyに引き込むサンプル集  http://d.hatena.ne.jp/fumokmm/20110213/1297616436  @uehaj さん  DevLOVEぐるぐるGroovyで「気楽に使おう Groovy」 http://d.hatena.ne.jp/uehaj/20110126/1296003293 とここら辺の情報を見てください
  • 21. Groovyってちょっと試してみたいけど、 インストール面倒くさそうだよね~  自分はGroovyConsoleのWebStart版使ってます >http://d.hatena.ne.jp/bluepapa32/20101006/1286337869 ここをクリック
  • 22. インストールは手軽~ 1. ウインドウ閉じた時に記 述保持機能あるよ 2. Grape やAntBuilder(Ant のDSL)も問題なしに使え ます (Grape機能を使うには、 groovy-allの他にivy.jar が必要ですが、これには 標準で入っています)
  • 23. えーっ。でも普通、 他ライブラリ使ってるんだけど?  mavenにアクセス @GrabResolver でmavenURL指定 標準のMavenCentralならいらない @Grabで落としてくるライブラリ、バージョンを指定  Mavenにないライブラリは? %USERPROFILE%/.groovy/lib にライブラリ を入れれば自動的に通せます GroovyConsoleのメニューから通す事も可能  java –cp “./;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 ) <デモは時間があれば (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  一応こんなのあります<要Linux環境  @uehaj さん解説 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!",日本語もOK!"] def str = "" list.each { str += it + " " } tv.setText(str) this.setContentView(tv) } }
  • 28. でもWinでJavaだけで 書きたい人には厳しいw  Discobot環境cygwinなら動くのかな?<Win  Groovyをシェル扱いに出来ないからmkProject.sh 動かない  dx.batのdex変換処理でgroovy-all.jarのクロージャクラ ス変換がStackOverFlowが発生してOutOfMemory出るみた い  でもWinでJavaだけで書きたい人は垣根高いよね  ASEに期待したいよw(現在未サポート
  • 29. だからGradle等で補助(コンパイル)ツー ルとして使うのが吉? Gradleってなに?  Groovyで書かれたビルドツールです  XMLでごちゃごちゃ書いていた記述をDSL記述で <=pom.xml や build.xml のXML地獄からの脱出  Maven、AntBuilder(AntのDSL)が使えます 時間があれば  ATECのTestterを使ったデモ 使った設定はここにあります  Testter https://sites.google.com/site/androidtestclub/testter  Gradle設定ファイル(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 { から取得する設定 flatDir(dirs: file("$rootDir/libs")) //mavenCentral() 使うjarと } バージョンを記載 dependencies { compile group: 'org.twitter4j', name: 'twitter4j-core', version: '2.1.8- SNAPSHOT' }
  • 31. Gradleファイル記述例(続き1) // プロジェクトのバージョンを設定 version = "x.y.z" //ソース位置 [compileJava, compileTestJava]*.options.collect {options -> options.encoding = 'UTF-8'} sourceSets.main.java.srcDirs += ['src'] ant.echo sourceSets.main.java.srcDirs // 署名設定 androidPackage { //keyStore = System.getProperty('user.home')+"/.android/debug.keystore" keyStore = "${projectDir}/debug.keystore" keyAlias = 'androiddebugkey' // パスワードが設定されてなければ、コマンド・プロンプトで入力 を求められる keyStorePassword = "android" keyAliasPassword = "android" }
  • 32. Gradleファイル記述例(続き2) // プロジェクトのプロパティをリソースのフィルタリング(プロパティ の解決)に使うヨ processResources { expand (project.properties) } jar { from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } // デバッグ・ビルド設定 task configureDebug << { jar.classifier = "debug" Apkに同梱する } jarを指定します // リリース・ビルド設定 (この記述の場合は task configureRelease << { 関連全部) proguard.enabled = true }
  • 33. 御静聴ありがとうございました  解析に使ったソフト ANDROID_HOME/  ソース位置が解りませんでした><。 Tools/libディレクトリ上で検 従ってjarを直参照 索すると関連jarが見れます JD 谷本さん解説ページ http://goo.gl/DRWiR 本家サイト http://goo.gl/ux1I