<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-806103305682092803</id><updated>2012-01-13T00:27:21.164+09:00</updated><category term='xml'/><category term='grails'/><category term='griffon'/><category term='javascript'/><category term='java'/><category term='groovy'/><category term='twitter'/><category term='html'/><category term='hosting'/><category term='eclipse'/><category term='ubuntu'/><category term='jedit'/><category term='gae'/><category term='diary'/><title type='text'>ゲンゾウ用ポストイット</title><subtitle type='html'>Java、Groovy、HTML、CSSで
身の回りのちょっとした雑務を楽にするものをいろいろ作ってみます。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default?start-index=101&amp;max-results=100'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>200</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6695892640082164919</id><published>2009-08-21T00:49:00.000+09:00</published><updated>2009-08-21T00:49:33.832+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>ブログ移行のお知らせ</title><content type='html'>&lt;p&gt;ブログ移行のお知らせです。&lt;/p&gt;
&lt;p&gt;多くの人がはてなダイアリーを利用されているようなので少し使ってみました。&lt;/p&gt;
&lt;p&gt;使い勝手は非常によく、ブログを書くための時間も半分ぐらいに短縮されました。（コードハイライト機能やh1〜h3の出力のしやすさなどが非常によい）&lt;/p&gt;
&lt;p&gt;移行先は&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/genzouw/"&gt;ゲンゾウ用ポストイット-new&lt;/a&gt;&amp;lt;http://d.hatena.ne.jp/genzouw/&amp;gt;&lt;/p&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;よろしくお願いします。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6695892640082164919?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6695892640082164919/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6695892640082164919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6695892640082164919'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/08/blog-post.html' title='ブログ移行のお知らせ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6853303676903040512</id><published>2009-07-23T23:06:00.002+09:00</published><updated>2009-07-23T23:07:37.557+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Grails App Engine Plugin + Gorm JPA Pluginでリレーションを定義してみる</title><content type='html'>&lt;p&gt;&lt;b&gt;Grails App Engine Plugin + Gorm JPA Plugin&lt;/b&gt;で、ひとまずリレーションのないドメインクラスを用意した場合の動作は確認できました。&lt;br&gt;
&amp;nbsp;次はリレーションを追加してみることにしました。が、うまくいかない。&lt;br&gt;
とりあえず試してみたことを列挙してみる。&lt;/p&gt;
&lt;h4&gt;環境&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;grails-1.1.1&lt;/li&gt;
 &lt;li&gt;groovy-1.6.3&lt;/li&gt;
 &lt;li&gt;java-1.6.0.14&lt;/li&gt;
 &lt;li&gt;app-engine-plugin-0.8.3&lt;/li&gt;
 &lt;li&gt;gorm-jpa-0.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;まずは単純に動くところまで&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/07/grails-appengine-pluginjpa_15.html"&gt;ゲンゾウ用ポストイット: Grails AppEngine PluginでJPAを使用する（成功）&lt;/a&gt;&lt;br&gt;
にて、リレーションのないドメインが動くところまで。&lt;/p&gt;
&lt;h4&gt;リレーションを追加&lt;/h4&gt;
&lt;p&gt;ここからがおかしいのだろうと思う。まずは以下の２つのドメインを作成した。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;com.sample.Book&lt;/li&gt;
 &lt;li&gt;com.sample.Category&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コードは以下のとおり。&lt;/p&gt;
&lt;h5&gt;Book.groovy&lt;/h5&gt;
&lt;pre name="code" language="java"&gt;
package com.sample

import javax.persistence.*;

@Entity
class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id
    
    String name
    
    String isbn

    @ManyToOne
    Category category

    
    static constraints = {
     id visible:false
 }
}
&lt;/pre&gt;
&lt;h5&gt;Category.groovy&lt;/h5&gt;
&lt;pre name="code" language="java"&gt;
package com.sample


import javax.persistence.*;

@Entity
class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id

    String name 
    
    @OneToMany
    List&amp;lt;book&amp;gt; books;
    static constraints = {
    id visible:false
    }
}
&lt;/pre&gt;
&lt;p&gt;あとはcontroller、viewを作成して実行。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails generate-all com.sample.Book&lt;br&gt;
 &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
 &lt;li&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails generate-all com.sample.Book&lt;br&gt;
 &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
 &lt;li&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails clean;grails app-engine&lt;br&gt;
 &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一応画面は起動してくる。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://4.bp.blogspot.com/_c1sAJym_hc4/Smhn5aF0SwI/AAAAAAAAAWI/aCd9odKXNik/s1600-h/Screenshot.png"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_c1sAJym_hc4/Smhn5aF0SwI/AAAAAAAAAWI/aCd9odKXNik/s320/Screenshot.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;まずはCategoryControllerを起動してみる。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://3.bp.blogspot.com/_c1sAJym_hc4/Smhp5k2CtyI/AAAAAAAAAWY/DGj7s21F4Ss/s1600-h/Screenshot.png"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_c1sAJym_hc4/Smhp5k2CtyI/AAAAAAAAAWY/DGj7s21F4Ss/s320/Screenshot.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;ありゃりゃ。なんだかわからないが、一度戻って再度起動してみる。すると。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://1.bp.blogspot.com/_c1sAJym_hc4/SmhqAQABL7I/AAAAAAAAAWg/mXD2bL9CttI/s1600-h/Screenshot-1.png"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_c1sAJym_hc4/SmhqAQABL7I/AAAAAAAAAWg/mXD2bL9CttI/s320/Screenshot-1.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
よく分からないが起動できるようになった。新規登録してみる。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://1.bp.blogspot.com/_c1sAJym_hc4/SmhqcKVKbMI/AAAAAAAAAWo/luoAqAwIxUM/s1600-h/Screenshot-2.png"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_c1sAJym_hc4/SmhqcKVKbMI/AAAAAAAAAWo/luoAqAwIxUM/s320/Screenshot-2.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://2.bp.blogspot.com/_c1sAJym_hc4/SmhqgLlvIYI/AAAAAAAAAWw/dgFTPO8ln6Y/s1600-h/Screenshot-3.png"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_c1sAJym_hc4/SmhqgLlvIYI/AAAAAAAAAWw/dgFTPO8ln6Y/s320/Screenshot-3.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;登録はできるのだが、肝心のBook情報がひもづけられない。&lt;br&gt;
こちらは諦めてトップ画面からBookControllerを呼び出してみる。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://2.bp.blogspot.com/_c1sAJym_hc4/Smhs8w3Y3ZI/AAAAAAAAAW4/jBWDp7yOWyg/s1600-h/Screenshot.png"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_c1sAJym_hc4/Smhs8w3Y3ZI/AAAAAAAAAW4/jBWDp7yOWyg/s320/Screenshot.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
すでに一度グライのエラーじゃ動じない。一度戻って再実行する。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://4.bp.blogspot.com/_c1sAJym_hc4/SmhtKjbfmKI/AAAAAAAAAXA/ALgyl7ypGWQ/s1600-h/Screenshot-1.png"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_c1sAJym_hc4/SmhtKjbfmKI/AAAAAAAAAXA/ALgyl7ypGWQ/s320/Screenshot-1.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;新規登録してみる&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://2.bp.blogspot.com/_c1sAJym_hc4/SmhtPMrDw9I/AAAAAAAAAXI/vB9QdtrZBPA/s1600-h/Screenshot-2.png"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_c1sAJym_hc4/SmhtPMrDw9I/AAAAAAAAAXI/vB9QdtrZBPA/s320/Screenshot-2.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://3.bp.blogspot.com/_c1sAJym_hc4/SmhtY-5tyDI/AAAAAAAAAXQ/6KDZK8jC-Dk/s1600-h/Screenshot-3.png"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_c1sAJym_hc4/SmhtY-5tyDI/AAAAAAAAAXQ/6KDZK8jC-Dk/s320/Screenshot-3.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;画面からは先ほど登録したcategoryが選択可能になっている。これはいけるのでは？と思いつつ登録実行するとシステムエラー。でも一覧画面に戻ってみると&amp;hellip;&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://4.bp.blogspot.com/_c1sAJym_hc4/SmhtuPEl9HI/AAAAAAAAAXY/d8vXqRfkCXA/s1600-h/Screenshot-5.png"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_c1sAJym_hc4/SmhtuPEl9HI/AAAAAAAAAXY/d8vXqRfkCXA/s320/Screenshot-5.png" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;うーん。もう何だか分からん。&lt;/p&gt;
&lt;p&gt;もうちょっと&lt;strong&gt;app engine plugin + gorm-jpa&lt;/strong&gt;のドキュメントが増えてくれれば何とかなるかもだけど。もう少しJPAをじっくり勉強するべきか。&lt;strong&gt;GORM&lt;/strong&gt;使えないと&lt;strong&gt;grails&lt;/strong&gt;の魅力が半減している気がしてしょうがない。&lt;/p&gt;
&lt;p&gt;GORMを捨てて奥さんが関西Groovy勉強会で説明してくれた&lt;strong&gt;JDO&lt;/strong&gt;の方を選択しようかな。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6853303676903040512?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6853303676903040512/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-app-engine-plugin-gorm-jpa.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6853303676903040512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6853303676903040512'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-app-engine-plugin-gorm-jpa.html' title='Grails App Engine Plugin + Gorm JPA Pluginでリレーションを定義してみる'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c1sAJym_hc4/Smhn5aF0SwI/AAAAAAAAAWI/aCd9odKXNik/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2721094626080117012</id><published>2009-07-22T07:50:00.001+09:00</published><updated>2009-07-22T09:03:26.073+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Grails In GAEのローカル動作がおかしくなったら</title><content type='html'>&lt;p&gt;&lt;strong&gt;grails&lt;/strong&gt;に&lt;strong&gt;grails app engine plugin&lt;/strong&gt;を入れていろいろ試しているのだが、前日に動作していたアプリをドメインクラス１つ追加したぐらいの変更で動作しなくなってしまった。&lt;/p&gt;
&lt;p&gt;一度プロジェクトを削除して、再度&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails create-app&lt;/strong&gt;&lt;/span&gt;を実行するも、事態は改善に向かわず。&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails app-engine&lt;/strong&gt;&lt;/span&gt;コマンド実行時に以下のようなエラーが出ていた。&lt;/p&gt;
&lt;pre&gt;
Caused by: : The following error occurred while executing this line:
/usr/share/appengine-java-sdk-1.2.2/config/user/ant-macros.xml:94: Java returned: 1
 at org.apache.tools.ant.ProjectHelper.addLocationToBuildException(ProjectHelper.java:541)
 at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:394)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at _Events$_run_closure1.doCall(_Events.groovy:54)
 at _GrailsEvents_groovy$_run_closure5.doCall(_GrailsEvents_groovy:59)
 at _GrailsEvents_groovy$_run_closure5.call(_GrailsEvents_groovy)
 at _GrailsWar_groovy$_run_closure4.doCall(_GrailsWar_groovy:240)
 at AppEngine$_run_closure2.doCall(AppEngine:26)
 at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)
 ... 10 more
Caused by: /usr/share/appengine-java-sdk-1.2.2/config/user/ant-macros.xml:94: Java returned: 1
 at org.apache.tools.ant.taskdefs.Java.execute(Java.java:107)
 at com.google.appengine.tools.enhancer.EnhancerTask.execute(EnhancerTask.java:99)
 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:62)
 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:391)
 ... 18 more
&lt;/pre&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails clean;grails app-engine&lt;/strong&gt;&lt;/span&gt;とコマンド実行して、一度クリーンしてもダメ。&lt;/p&gt;
&lt;p&gt;結局以下の方法で動作するように解決できた。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;strong&gt;$HOME/.grails/1.1.1/project/&amp;lt;PROJECT_NAME&amp;gt;&lt;/strong&gt;フォルダを削除&lt;/li&gt;
 &lt;li&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails create-app&lt;/strong&gt;&lt;/span&gt;で作成したプロジェクトを削除&lt;/li&gt;
 &lt;li&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails create-app&lt;/strong&gt;&lt;/span&gt;でプロジェクトを再作成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;なんかおかしな情報が残ってしまっていたみたいです。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2721094626080117012?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2721094626080117012/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-in-gae_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2721094626080117012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2721094626080117012'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-in-gae_22.html' title='Grails In GAEのローカル動作がおかしくなったら'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8557122053272767464</id><published>2009-07-16T22:53:00.003+09:00</published><updated>2009-07-16T23:19:15.291+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Grails in GAEの課題</title><content type='html'>&lt;p&gt;ようやく&lt;strong&gt;Google App Engine&lt;/strong&gt;で&lt;strong&gt;Grails + GORM&lt;/strong&gt;が動いた。&lt;/p&gt;
&lt;p&gt;けれどもいくつか気になる点が。&lt;/p&gt;
&lt;h4&gt;前提&lt;/h4&gt;
&lt;p&gt;あくまで以下のプラグインを使った僕の環境での課題です。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;grails appengine plugin&lt;/li&gt;
 &lt;li&gt;grails gorm-jpa plugi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アプリのURLはこちら。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://genzouw.appspot.com/book/list"&gt;Book List&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Grailsでのメッセージ表示&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt;で生成される&lt;strong&gt;Controller&lt;/strong&gt;クラスを見てみると、以下の処理終了後にメッセージを出力するようになっている。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;登録（save）&lt;/li&gt;
 &lt;li&gt;更新(update）&lt;/li&gt;
 &lt;li&gt;削除（delete）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grailsにはいくつかのスコープが存在していて一般的なリクエスト、セッションの他に&lt;strong&gt;フラッシュ&lt;/strong&gt;なんてのもある。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://74.125.153.132/search?q=cache:qX0BvWh3PJgJ:docs.codehaus.org/display/GRAILS/Japanese%2BControllers+grails+%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97+flash&amp;amp;cd=1&amp;amp;hl=ja&amp;amp;ct=clnk&amp;amp;gl=jp"&gt;Japanese Controllers - Grails - Codehaus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記の更新処理実行後は、&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;flash.message = &amp;quot;~なんかメッセージ~&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;と言う風に表示したいメッセージをセットしている。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt;ではこの&lt;strong&gt;flash.message&lt;/strong&gt;が空でない場合のみ表示するようになっている。&lt;/p&gt;
&lt;h4&gt;GAE上だとメッセージがずっと残ってしまう（Grails AppEngine Pluginの問題？）&lt;/h4&gt;
&lt;p&gt;通常は画面表示後に&lt;strong&gt;flash&lt;/strong&gt;スコープの内容がクリアされる。&lt;/p&gt;
&lt;p&gt;GrailsプロジェクトにGrails AppEngine Plugin、Gorm-JPA Pluginを入れてもこれは同様。&lt;/p&gt;
&lt;p&gt;ただし、&lt;strong&gt;GAE上にアップするとなぜかflashスコープの値がクリアされなくなってしまう。&lt;/strong&gt;更新後に表示されたメッセージが、たとえば一覧画面を飛び回っている間も表示され続けたりする。挙句の果て、次の更新、削除を行ってもメッセージが切り替わらない。&lt;/p&gt;
&lt;h4&gt;[HOME]のリンクおかしい&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;こちらはローカルでも出るので、&lt;strong&gt;Grails AppEngine Plugin&lt;/strong&gt;が原因の可能性が大きい。&lt;/p&gt;
&lt;p&gt;画面の左上の[HOME]のリンクを押しても、現在表示中のページがリロードされるだけ。サイトのトップへ移動してくれなくなってしまった。&lt;/p&gt;
&lt;p&gt;暇があったら原因を調べてみたい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8557122053272767464?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8557122053272767464/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-in-gae.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8557122053272767464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8557122053272767464'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-in-gae.html' title='Grails in GAEの課題'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5842064071746579029</id><published>2009-07-15T23:17:00.003+09:00</published><updated>2009-07-16T00:24:33.040+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Grails AppEngine PluginでJPAを使用する（成功）</title><content type='html'>&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt; + &lt;span style="font-weight: bold;"&gt;Grails AppEngine Plugin + JPA&lt;/span&gt;でようやく簡単なアプリが動作確認できたので整理。&lt;/p&gt;
&lt;h4&gt;動作確認時の環境&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;groovy 1.6.3&lt;/li&gt;
 &lt;li&gt;grails 1.1.1&lt;/li&gt;
 &lt;li&gt;google app engine sdk for java 1.2.1&lt;/li&gt;
 &lt;li&gt;grails appengine plugin 0.8.3&lt;/li&gt;
 &lt;li&gt;grails gorm-jpa plugin 0.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;資料&lt;/h4&gt;
&lt;p&gt;何度もブログで掲載している以下の資料を再度整理しました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.google.com/present/edit?hl=ja&amp;amp;id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;quot;Google Docs&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;お願い&lt;/h4&gt;
&lt;p&gt;誤りなどありましたらお知らせください。できるだけ早く直します。&lt;/p&gt;
&lt;p&gt;資料みれないんじゃーとかも教えてください。&lt;/p&gt;
&lt;p&gt;ちなみに動いたやつはこれ。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://genzouw.appspot.com/book/list"&gt;Book List&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;非常にシンプル。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5842064071746579029?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5842064071746579029/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-appengine-pluginjpa_15.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5842064071746579029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5842064071746579029'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-appengine-pluginjpa_15.html' title='Grails AppEngine PluginでJPAを使用する（成功）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1809126103848439611</id><published>2009-07-15T22:03:00.001+09:00</published><updated>2009-07-15T22:06:01.960+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>google app engine sdk 1.2.2リリース</title><content type='html'>&lt;p&gt;今日、何気なく&lt;strong&gt;Google App Engine&lt;/strong&gt;&lt;strong&gt; SDK&lt;/strong&gt;のサイトを除いたら、バージョンが1.2.1から1.2.2になっていた。&lt;/p&gt;
&lt;p&gt;リリースは&lt;strong&gt;2009/07/13&lt;/strong&gt;となっていたので、二日前にリリースされたんですね。&lt;/p&gt;
&lt;p&gt;最近Google App Engineにリトライ中なのであまりバージョンの異なるものに入れ替えはよくないかなーと思いつつ、やはり使うなら最新版だろ！ということで早速入れ替え。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1809126103848439611?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1809126103848439611/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/google-app-engine-sdk-122.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1809126103848439611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1809126103848439611'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/google-app-engine-sdk-122.html' title='google app engine sdk 1.2.2リリース'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8512258561528185393</id><published>2009-07-14T07:04:00.004+09:00</published><updated>2009-07-15T23:17:14.151+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails AppEngine PluginでJPAを使用する（失敗）</title><content type='html'>&lt;h4&gt;Grails AppEngine pluginでJPAを使用するには&lt;/h4&gt;
&lt;p&gt;前日、以下のページにてjpaを使用する場合には追加でプラグイン入れないといけないという記述を見つけたので、再度&lt;strong&gt;google app engine&lt;/strong&gt;開発の手順を整理してみる。 &lt;a href="http://www.grails.org/plugin/app-engine"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;開発環境構築から、Grails App Engine Pluginインストールまでの流れ&lt;/h4&gt;
&lt;p&gt;以前投稿したとおり。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/07/grails-appengine-plugin.html"&gt;ゲンゾウ用ポストイット: 勉強会に向けてGrails AppEngine Pluginについて調査&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails install-plugin app-engine&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;コマンドを実行した後は、&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails install-plugin gorm-jpa&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;コマンドを実行。&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails create-domain-class com.Book&lt;br&gt;
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;で適当なドメインクラス作成後、&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails generate-all com.Book&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;でview、controller作成。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails app-engine run&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;コマンドで動作確認。&lt;/p&gt;
&lt;h4&gt;book/list にアクセス&lt;/h4&gt;
&lt;p&gt;&lt;u&gt;http://localhost:8080/&lt;/u&gt;にアクセス。ちゃんと動作するようになった。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;http://localhost:8080/book/list&lt;/u&gt;にアクセスすれば、ちゃんと本の一覧画面が表示される。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;http://localhost:8080/book/create&lt;/u&gt;で新規登録画面へ。ただここで登録しようとするとエラーとなってしまう。&lt;/p&gt;
&lt;pre&gt;
org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.NullPointerException
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
Caused by: java.lang.NullPointerException
 at org.datanucleus.jpa.EntityManagerImpl.find(EntityManagerImpl.java:204)
 at org.datanucleus.store.appengine.jpa.DatastoreEntityManager.find(DatastoreEntityManager.java:48)
 at org.grails.jpa.JpaPluginSupport$__clinit__closure3_closure6_closure11_closure19.doCall(JpaPluginSupport.groovy:253)
 at com.BookController$_closure3.doCall(BookController.groovy:18)
 at com.BookController$_closure3.doCall(BookController.groovy)
 ... 4 more

&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;&lt;br&gt;&lt;/strong&gt;&lt;/span&gt;プラグインの説明サイトを見ていると

&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails generate-all com.Book&lt;/strong&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
にて作成したcontrollerでは正常に動作せず、手を加える必要があるようだ。
&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p class="paragraph"&gt;For example:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="code"&gt;&lt;blockquote&gt;
&lt;pre&gt;
def jpaTemplate
def transactionTemplate
def save = {
   transactionTemplate.execute( { status -&amp;gt; 
        def album = &lt;span class="java-keyword"&gt;new&lt;/span&gt; Album(params)
 &lt;span class="java-keyword"&gt;if&lt;/span&gt;(!album.hasErrors() &amp;amp;&amp;amp; album.validate() ) {
  jpaTemplate.persist(album)
  jpaTemplate.flush()
  flash.message = &lt;span class="java-quote"&gt;&amp;quot;Album ${albumInstance.id} created&amp;quot;&lt;/span&gt;
  redirect(action:show,id:album.id) 
 }
 &lt;span class="java-keyword"&gt;else&lt;/span&gt; {
  status.setRollbackOnly()    
  render(view:'create',model:[album:album])    
 }&lt;/pre&gt;
&lt;pre&gt;&lt;p class="paragraph"&gt;} as TransactionCallback )         &lt;br&gt;}&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;面倒くさい&lt;/strong&gt;&lt;strong&gt;！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ということで、夜にでも&lt;strong&gt;jdo&lt;/strong&gt;で試してみたい。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;jdo&lt;/strong&gt;だと&lt;strong&gt;GORM&lt;/strong&gt;は使えないんだよね。でも&lt;strong&gt;generate-all&lt;/strong&gt;コマンドで&lt;strong&gt;view&lt;/strong&gt;や&lt;strong&gt;controller&lt;/strong&gt;を自動生成してくれるから一長一短か。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8512258561528185393?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8512258561528185393/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-appengine-pluginjpa.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8512258561528185393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8512258561528185393'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-appengine-pluginjpa.html' title='Grails AppEngine PluginでJPAを使用する（失敗）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6110207667810135589</id><published>2009-07-13T23:30:00.000+09:00</published><updated>2009-07-14T07:00:59.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>勉強会に向けてGrails AppEngine Pluginについて調査</title><content type='html'>&lt;h4&gt;環境設定(プラグインインストールまでの流れ）&lt;/h4&gt;
&lt;p&gt;以前紹介した資料どおり。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.google.com/present/edit?id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;quot;Google Docs&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;grails appengine plugin&lt;/strong&gt;インストール後に、jpaかjdoかどちらを使用するか聞かれるが、&lt;strong&gt;jpaを選んだ。理由は特にない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ちなみに、&lt;strong&gt;grails appengine plugin&lt;/strong&gt;のversionは0.8.3になっていた。着実にバージョンアップしている。&lt;/p&gt;
&lt;h4&gt;ドメインクラスの作成&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://docs.google.com/present/edit?id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;quot;Google Docs&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記の資料ではドメインクラスを使用しない例しか記載していないかったので、ここでドメインクラスを作成。grails-app/domain直下にクラスを配置すると動かないということなので、適当にパッケージを作成する。ありきたりだが本の情報を管理するBookクラスを作成。&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails create-domain-class com.Book&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Bookドメイン作成&lt;/p&gt;
&lt;p&gt;作成後、カラムを追加。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;String name&lt;/li&gt;
 &lt;li&gt;String isbn&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ビュー、コントローラーも作成&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;grails generate-all com.Book&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;viewとcontrollerも作成。&lt;/p&gt;
&lt;h4&gt;アプリケーション起動&lt;/h4&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails app-engine run&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;実行してからなかなか起動しない。かなりあせる。問題があるのか&amp;hellip;と思ったらlocalhoatになってた。そりゃ起動しない。&lt;/p&gt;
&lt;p&gt;起動はするようになったけれども、com.BookControllerへアクセスでエラー発生。以下のとおり。&lt;/p&gt;
&lt;pre&gt;
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: static com.Book.list() is applicable for argument types: (org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap) values: [[max:10, action:list, controller:book]]
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
Caused by: groovy.lang.MissingMethodException: No signature of method: static com.Book.list() is applicable for argument types: (org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap) values: [[max:10, action:list, controller:book]]
 at com.BookController$_closure2.doCall(BookController.groovy:14)
 at com.BookController$_closure2.doCall(BookController.groovy)
 ... 4 more
&lt;/pre&gt;
&lt;p&gt;com.Bookにlistメソッドがないと言われる。ローカルで動作させるのは無理か？？&lt;/p&gt;
&lt;p&gt;以下のサイトの記述がヒントになりそうなので、明日試してみる。 &lt;a href="http://www.grails.org/plugin/app-engine"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt; To get GORM-like behavior with dynamic finders and so on you need to install the GORM-JPA plugin (there currently isn't a GORM API for JDO, sorry!):  grails install-plugin gorm-jpa  Once this is installed you can using of the regular methods provided by the GORM API like save(), delete() and so on as well as dynamic finders. &lt;/blockquote&gt;
&lt;p&gt;分からないので明日の朝試してみる。 &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6110207667810135589?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6110207667810135589/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-appengine-plugin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6110207667810135589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6110207667810135589'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/grails-appengine-plugin.html' title='勉強会に向けてGrails AppEngine Pluginについて調査'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3291778367319821806</id><published>2009-07-13T22:10:00.001+09:00</published><updated>2009-07-14T06:25:03.611+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovyユーザーグループ・第三回関西支部のアナウンスが</title><content type='html'>&lt;p&gt;Groovyユーザーグループ・第三回関西支部のアナウンスが、こんなところにも掲載されていた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.atmarkit.co.jp/event/calendar/detail.php?event_id=21124"&gt;＠ITイベントカレンダー：日本Grails/Groovyユーザーグループ 第3回関西支部「Grails on GAE/J 勉強会」 &amp;minus; ＠IT&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;kiyOtakaさんは企画まで奮闘してくれて感謝しています。&lt;/p&gt;
&lt;p&gt;会場にはおかしやドリンクまで用意してくれていますし。（無線も使えて非常に快適）&lt;/p&gt;
&lt;p&gt;自分なりのGroovy、関西支部長への恩返しとしてGroovyのブログ続けよう。&lt;/p&gt;
&lt;p&gt;（放置ぎみだった・・・、いや、仕事が忙しかったんだよ、いいわけじゃないよ・・・）&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3291778367319821806?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3291778367319821806/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/groovy.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3291778367319821806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3291778367319821806'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/groovy.html' title='Groovyユーザーグループ・第三回関西支部のアナウンスが'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-357937342550228097</id><published>2009-07-13T22:06:00.001+09:00</published><updated>2009-07-13T22:06:35.187+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Google App EngineでGrailsの資料（第2回 「Groovyイン・アクション」読書会IN関西で使用）</title><content type='html'>&lt;p&gt;&lt;a href="http://www.jggug.org/news/dai2kai%E3%80%8Cgroovyin%E3%83%BBakushon%E3%80%8Ddokushokaiinkansaikaisai"&gt;第2回 「Groovyイン・アクション」読書会IN関西 開催 &amp;lrm;(main)&amp;lrm;&lt;/a&gt;での資料、全然アップできていなかった・・・&lt;/p&gt;
&lt;p&gt;5/30(土)に使った資料であり、かつメンテナンスできていないけれども。&lt;/p&gt;
&lt;p&gt;加えて同じような、しかももっとわかりやすい資料がアップされているけれども、自分が作成した資料もアップしておく。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.google.com/present/edit?hl=ja&amp;amp;id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;quot;Google Docs&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;他の方も見れるのかな？公開しているはずなんだけど。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-357937342550228097?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/357937342550228097/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/google-app-enginegrails2-groovyin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/357937342550228097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/357937342550228097'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/google-app-enginegrails2-groovyin.html' title='Google App EngineでGrailsの資料（第2回 「Groovyイン・アクション」読書会IN関西で使用）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2260798810733090177</id><published>2009-07-06T07:00:00.000+09:00</published><updated>2009-07-06T07:00:23.053+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>twitter api の使用制限について</title><content type='html'>&lt;p&gt;最近、groovyを使ってtwitter apiを操作しようとしています。&lt;/p&gt;
&lt;p&gt;ただ、色々作ってみているのですが時々プログラムがうまく動かなくなることがありました。&lt;/p&gt;
&lt;p&gt;勉強不足だったのですが、以下のページを見るとどうやら&lt;strong&gt;apiに対して一時間に150アクセス以上するな&lt;/strong&gt;とかかれていました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://twitterapi.pbworks.com/Rate-limiting"&gt;Twitter API Wiki / Rate limiting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;アクセスに限界があるんですね。&lt;/p&gt;
&lt;p&gt;以下のURLにアクセスすることで残りの&lt;strong&gt;api呼出可能&lt;/strong&gt;&lt;strong&gt;回数&lt;/strong&gt;と&lt;strong&gt;リセットされる時間&lt;/strong&gt;が分かります。&lt;/p&gt;
&lt;p&gt;http://twitter.com/account/rate_limit_status.xml&lt;/p&gt;
&lt;p&gt;ただ、これだと不便もあるので特別措置も用意しているみたい。それがホワイトリスト。&lt;/p&gt;
&lt;p&gt;以下の入力フォームにipアドレス（アカウントも？）と利用目的を入力すると後日返答があるみたい。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://twitter.com/help/request_whitelisting"&gt;request whitelisting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;もっともまだ何を作ろうか決まってないけど。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2260798810733090177?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2260798810733090177/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/twitter-api.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2260798810733090177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2260798810733090177'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/twitter-api.html' title='twitter api の使用制限について'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8622926942550998490</id><published>2009-07-01T21:28:00.002+09:00</published><updated>2009-07-01T21:28:24.490+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>ブログ、コーディング頻度落ちまくり</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090630/1246378061"&gt;何かしらでも、書いていこう - No Programming, No Life&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;心当たりありまくりです。&lt;/p&gt;
&lt;p&gt;最近twitterとか除いてて結構時間がたっていたりしている。twitter、評判はいいけどテレビと同じように気づくと時間が過ぎている。&lt;/p&gt;
&lt;p&gt;もっとガリガリコード書いていきたい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8622926942550998490?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8622926942550998490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8622926942550998490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8622926942550998490'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/07/blog-post.html' title='ブログ、コーディング頻度落ちまくり'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1692939682635584320</id><published>2009-06-20T09:40:00.000+09:00</published><updated>2009-06-20T09:40:47.818+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>まだ会いたいって思っている人いるんだなぁ</title><content type='html'>&lt;p&gt;子供が生まれてから、知人と会うことがめっきり減りました。土日は毎週のようにみんなでバドミントンをしていたのですが、結婚し、嫁が妊娠し、子供が生まれてからはまったく参加できず。飲みに誘われることもなくなり（気を遣ってくれてるんだろうなぁ）、みんな僕のことをわすれてしまったかな、と思ってた。&lt;/p&gt;
&lt;p&gt;今日知人の誕生日会に誘われ、ひさびさにみんなに会えると思っていたのだが今週仕事が忙しかったので嫁に子供を預けきり。僕一人で誕生日会に参加で嫁だけ家で子供の面倒というわけにもいかないのでキャンセルした。&lt;/p&gt;
&lt;p&gt;監事のやつが「しょうがないね、でもみんなゲンゾウ君に会いたがってたのだけは知っておいて」って。&lt;/p&gt;
&lt;p&gt;なんだかうるっと来たし、申し訳なくなった。俺だけじゃなかったんだなぁ。&lt;/p&gt;
&lt;p&gt;ちょっと独り言。&lt;em&gt;&lt;strong&gt;技術ネタ調べてないのでなんかエントリ書こうと思って&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1692939682635584320?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1692939682635584320/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/blog-post_20.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1692939682635584320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1692939682635584320'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/blog-post_20.html' title='まだ会いたいって思っている人いるんだなぁ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7349939602433227119</id><published>2009-06-09T21:43:00.004+09:00</published><updated>2009-06-09T22:01:30.410+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyでsvn操作ツール作ったよ</title><content type='html'>&lt;p&gt;なんどかエントリに投稿しているけれども僕の家のマシンはubuntuです。&lt;/p&gt;
&lt;p&gt;windows系だと&lt;strong&gt;TortoiseSVN&lt;/strong&gt;なんかがあるんだろうけど、基本的に&lt;strong&gt;terminal&lt;/strong&gt;で充分なのでなくてもあまり気にしない。&lt;/p&gt;
&lt;p&gt;ただし、&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;svn add&lt;/li&gt;
 &lt;li&gt;svn remove&lt;/li&gt;
 &lt;li&gt;svn commit -m 〜&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の操作についてはコミット前に何度か叩かないといけないので面倒くさい。&lt;/p&gt;
&lt;p&gt;そこで簡単なsvn操作ツール作ってみた。&lt;/p&gt;
&lt;p&gt;SwingBuilderそのまま使っていて、Event Dispatch Threadとか考慮できていないのでそこは許してください。&lt;/p&gt;
&lt;h4&gt;スクリーンショット&lt;/h4&gt;
&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c1sAJym_hc4/Si5c9RI8VCI/AAAAAAAAAVo/6mAhTmSMFls/s1600-h/Screenshot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 222px; height: 320px;" src="http://2.bp.blogspot.com/_c1sAJym_hc4/Si5c9RI8VCI/AAAAAAAAAVo/6mAhTmSMFls/s320/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5345312015378043938" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;使い方&lt;/h4&gt;
&lt;p&gt;svn管理フォルダに移動して、&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;svntool.groovy&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;と叩けばOK。&lt;/p&gt;
&lt;h4&gt;セットアップ&lt;/h4&gt;
&lt;ol&gt;
 &lt;li&gt;どこかに以下のコードを&lt;strong&gt;svn&lt;/strong&gt;&lt;strong&gt;tool.groovy&lt;/strong&gt;という名前で保存。&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;svn&lt;/strong&gt;コマンドにパスは通しておこう。&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;tkdiff&lt;/strong&gt;コマンドが使えると多少幸せになれる（これは、linux限定です）&lt;/li&gt;
 &lt;li&gt;&lt;em&gt;&lt;strong&gt;windows&lt;/strong&gt;の場合には、すべての&lt;strong&gt;&amp;quot;svn 〜&amp;quot;&lt;/strong&gt;の部分を&lt;strong&gt;&amp;quot;cmd.exe /c svn 〜&amp;quot;&lt;/strong&gt;に書き直してね。（windowsにはTortoiseSVNあるかw）&lt;br&gt;
 &lt;/em&gt;&lt;/li&gt;
 &lt;li&gt;&lt;em&gt;&lt;strong&gt;windows&lt;/strong&gt;でも、cygwin上ならそのまま使える（windowsで試してみた）&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;コード&lt;/h4&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import static javax.swing.JOptionPane.*
import groovy.swing.*
import javax.swing.*

def getDiffList = {
    &amp;quot;svn status&amp;quot;.execute().text.readLines().collect{
        def columns = it.split(/\s+/)
        [status:columns[0], path:columns[1]]
    }
}
def getSelectedDiffList = { builder -&amp;gt;
    builder.table.selectedRows.collect{ builder.table.model.rowsModel.value[it] }
}
def refreshScreen = { builder -&amp;gt;
    builder.info.text = &amp;quot;svn info&amp;quot;.execute().text
    builder.table.model.rowsModel.value = getDiffList()
    builder.table.resizeAndRepaint()
}

def swing = new SwingBuilder()
def frame = swing.frame(title:'svn操作ツール', defaultCloseOperation:JFrame.EXIT_ON_CLOSE, show:true, pack:true, id:&amp;quot;frame&amp;quot;){
    panel{
        vbox{
            textArea(&amp;quot;svn info&amp;quot;.execute().text, size:[200, 200], id:&amp;quot;info&amp;quot;)
            scrollPane{
                table(
                    id:&amp;quot;table&amp;quot;, selectionMode:ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
                ){
                    tableModel(list:getDiffList()) {
                        propertyColumn(header:'状態', propertyName:'status')
                        propertyColumn(header:'ファイル名', propertyName:'path')
                    }
                }
            }
            hbox{
                button(&amp;quot;? &amp;gt; add&amp;quot;, actionPerformed:{ evt -&amp;gt;
                    def selectedPaths = getSelectedDiffList(swing).findAll{
                        it.status == &amp;quot;?&amp;quot;
                    }*.path
                    selectedPaths.each{
                        &amp;quot;svn add ${it}&amp;quot;.execute().text
                    }
                    refreshScreen(swing)
                })
                button(&amp;quot;! &amp;gt; del&amp;quot;, actionPerformed:{ evt -&amp;gt;
                    def selectedPaths = getSelectedDiffList(swing).findAll{
                        it.status == &amp;quot;!&amp;quot;
                    }*.path
                    selectedPaths.each{
                        &amp;quot;svn remove ${it}&amp;quot;.execute().text
                    }
                    refreshScreen(swing)
                })
                button(&amp;quot;diff&amp;quot;, actionPerformed:{ evt -&amp;gt;
                    def selectedPath = getSelectedDiffList(swing).findAll{
                        it.status == &amp;quot;M&amp;quot;
                    }*.path[0]
                    &amp;quot;svn diff --diff-cmd tkdiff ${selectedPath}&amp;quot;.execute().text
                })
            }
            hbox{
                button(&amp;quot;commit&amp;quot;, actionPerformed:{ evt -&amp;gt;
                    def comment = showInputDialog( swing.frame, &amp;quot;コメントを入力&amp;quot;, &amp;quot;&amp;quot; )
                    if( comment ){
                        def result = &amp;quot;svn commit -m \&amp;quot;${comment}\&amp;quot;&amp;quot;.execute().text
                        showMessageDialog( swing.frame, result )
                        refreshScreen(swing)
                    }
                })
                button(&amp;quot;update&amp;quot;, actionPerformed:{ evt -&amp;gt;
                    def result = &amp;quot;svn update&amp;quot;.execute().text
                    showMessageDialog( swing.frame, result )
                    refreshScreen(swing)
                })
            }
        }
    }
}
&lt;/pre&gt;
&lt;h4&gt;最後に&lt;/h4&gt;
&lt;p&gt;groovyよ・・・最高だ。&lt;/p&gt;
&lt;p&gt;30分程度で作れた。ちょっとしたツール作るにはgroovyは最高。&lt;/p&gt;
&lt;p&gt;不具合がありましたらご連絡ください。(いちおう使用は自己責任で）&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7349939602433227119?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7349939602433227119/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/groovysvn.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7349939602433227119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7349939602433227119'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/groovysvn.html' title='groovyでsvn操作ツール作ったよ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_c1sAJym_hc4/Si5c9RI8VCI/AAAAAAAAAVo/6mAhTmSMFls/s72-c/Screenshot.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2847391075751617422</id><published>2009-06-09T00:00:00.003+09:00</published><updated>2009-06-10T05:09:00.111+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>GStringは場合により遅延評価される</title><content type='html'>&lt;p&gt;&lt;strong&gt;Groovyインアクション読書会 IN 関西&lt;/strong&gt;でちょっとだけ話に上がったこと。&lt;/p&gt;
&lt;p&gt;僕が「GroovyのGStringは遅延評価されるよ」という発言に皆さんが「遅延評価ではないよ」といっていた。&lt;/p&gt;
&lt;p&gt;確かに&lt;strong&gt;Groovyインアクション&lt;/strong&gt;にも遅延評価ではないととれるような記述があった。&lt;/p&gt;
&lt;p&gt;僕はううーーん、と思ってしまったのだが、それを証明してくれるエントリが。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/r_ikeda/20090523/gstring"&gt;Groovy の文字列リテラル GString は遅延評価される - 集中力なら売り切れたよ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そうそう、こういうこと。&lt;/p&gt;
&lt;p&gt;&lt;strike&gt;まぁ、&lt;strong&gt;GString&lt;/strong&gt;の変数を使うかといわれると使うことはないのでこういうことは滅多にないのかもしれないけど。&lt;/strike&gt;&lt;/p&gt;
&lt;h4&gt;2009/06/10追記&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;自分で書いていて勘違い。&lt;/strong&gt;&lt;strong&gt;場合によりではなく、常に遅延評価ですねw&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;綺麗にまとめてくれいるので、こちらを未他方がいいかな&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/odashinsuke/20090609/1244546891"&gt;GString の評価について誤解してた&amp;hellip; - お だ のスペース&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/ksky/20090609"&gt;2009-06-09 - Groovyラボ @Reloaded&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2847391075751617422?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2847391075751617422/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/gstring.html#comment-form' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2847391075751617422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2847391075751617422'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/gstring.html' title='GStringは場合により遅延評価される'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-450852415720158699</id><published>2009-06-06T14:44:00.000+09:00</published><updated>2009-06-06T14:44:19.945+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>続・topcoderの道１をといてみる</title><content type='html'>&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/06/topcoder.html"&gt;ゲンゾウ用ポストイット: topcoderの道１をといてみる&lt;/a&gt;の続き。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090605/1244216656"&gt;Groovyで文字処理を書くときの心得 - Grな日々(uehajの日記)&lt;/a&gt;で以下のようなエントリが。&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;先のエントリと、ほかにいくつかGroovyでパズルっぽいコードを書いてみたんだけど、あれだね。Groovyで文字の絡む処理はC言語的にやったら負けだね。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;たしかに。効率もだけど、それ以上により簡潔に書きたい。&lt;/p&gt;
&lt;p&gt;ちょっと直してみる。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
class CCipher{
    final def ALPHA_LIST = 'A'..'Z'
    String decode(String ciphertest, int shift){
        ciphertest.collect{
            ALPHA_LIST[ALPHA_LIST.indexOf(it) - shift]
        }.join()
    }
}

new CCipher().with{
    assert decode(&amp;quot;VQREQFGT&amp;quot;, 2) == &amp;quot;TOPCODER&amp;quot;
    assert decode(&amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;, 10) == &amp;quot;QRSTUVWXYZABCDEFGHIJKLMNOP&amp;quot;
    assert decode(&amp;quot;TOPCODER&amp;quot;, 0) == &amp;quot;TOPCODER&amp;quot;
}
&lt;/pre&gt;
&lt;p&gt;一行しか変わってないけどwもっとうまい書き方ないかな。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-450852415720158699?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/450852415720158699/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/topcoder_06.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/450852415720158699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/450852415720158699'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/topcoder_06.html' title='続・topcoderの道１をといてみる'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6665129131325708365</id><published>2009-06-05T15:20:00.001+09:00</published><updated>2009-06-05T15:20:40.931+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>topcoderの道１をといてみる</title><content type='html'>&lt;p&gt;&lt;a href="http://ameblo.jp/programming/entry-10001699519.html"&gt;topcoderの道１&lt;/a&gt;をといてみる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;groovy&lt;/strong&gt;は本当にプログラム組むのも実行するのも楽。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
class CCipher{
    final def ALPHA_LIST = 'A'..'Z'
    String decode(String ciphertest, int shift){
        ciphertest.collect{
            ALPHA_LIST[(char)it - (char)'A' - shift]
        }.join()
    }
}

new CCipher().with{
    assert decode("VQREQFGT", 2) == "TOPCODER"
    assert decode("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10) == "QRSTUVWXYZABCDEFGHIJKLMNOP"
    assert decode("TOPCODER", 0) == "TOPCODER"
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6665129131325708365?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6665129131325708365/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/topcoder.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6665129131325708365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6665129131325708365'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/topcoder.html' title='topcoderの道１をといてみる'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2025127089307140984</id><published>2009-06-05T05:47:00.001+09:00</published><updated>2009-06-05T20:26:11.931+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>１０分でコーディング｜プログラミングに自信があるやつこい！！ だって。</title><content type='html'>&lt;p&gt;&lt;a href="http://ameblo.jp/programming/entry-10001721422.html"&gt;１０分でコーディング｜プログラミングに自信があるやつこい！！&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;をやってみた。&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;
あまりに簡単なので制限時間を１０分としてやってみてください。
これ以上かかった人は
&lt;font color="#ff0000"&gt;&lt;strong&gt;自分はかなりプログラミングができない。&lt;/strong&gt;&lt;/font&gt;
とつらい事実を認識しましょう。
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;はい、がんばります&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
class Cards{
    String[] deal(int numPlayers, String deck){
        def cardCount = (int)(deck.size() / numPlayers)
        
        def i = 0
        deck.toList().groupBy{
            i++%numPlayers
        }*.value*.join()
    }
}

def c = new Cards()
assert c.deal(6, "012345012345012345") == ["000", "111", "222", "333", "444", "555" ]
assert c.deal(4, "111122223333") == ["123", "123", "123", "123" ]
assert c.deal(1, "012345012345012345") == ["012345012345012345" ]
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2025127089307140984?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2025127089307140984/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/blog-post.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2025127089307140984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2025127089307140984'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/blog-post.html' title='１０分でコーディング｜プログラミングに自信があるやつこい！！ だって。'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-545943773000376944</id><published>2009-06-04T08:10:00.000+09:00</published><updated>2009-06-04T08:10:35.291+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>手作業Grep どう書く？org</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/252/"&gt;手作業Grep どう書く？org&lt;/a&gt;をといてみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.doukaku.org/comment/9043/"&gt;どう書く？org 9043 genzou: swingで。(手作業Grep) - 投稿の詳細&lt;/a&gt;&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
#!/usr/bin/env groovy
import groovy.swing.*
import javax.swing.*

def swing = new SwingBuilder()
def frame = swing.frame(title:'Frame', defaultCloseOperation:JFrame.EXIT_ON_CLOSE, show:true, pack:true, id:&amp;quot;frame&amp;quot;){
    panel{
        vbox{
            list(listData:System.in.readLines() as Vector, id:&amp;quot;list&amp;quot;, selectionMode:ListSelectionModel.MULTIPLE_INTERVAL_SELECTION){
            }
            button(&amp;quot;出力！&amp;quot;, actionPerformed:{ evt -&amp;gt;
                println swing.list.selectedValues.join(&amp;quot;\n&amp;quot;)
                System.exit(0)
            })
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;標準出力の内容によってサイズが変わるので出力内容が多いと高さが&amp;hellip;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-545943773000376944?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/545943773000376944/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/grep-org.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/545943773000376944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/545943773000376944'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/grep-org.html' title='手作業Grep どう書く？org'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6587136207834394030</id><published>2009-06-01T06:41:00.004+09:00</published><updated>2009-06-01T06:57:07.103+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovyイン・アクション読書会IN関西 第２回</title><content type='html'>&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/04/groovyin.html"&gt;Groovyイン・アクション読書会IN関西 いってきたよ&lt;/a&gt;に引き続き、第２回に参加してきた。&lt;/p&gt;
&lt;p&gt;利用できる人はskypeのオープンチャットを利用したのだけれども、僕のubuntuでのskypeはオープンチャットできなかった。linuxのskypeはv2.0で止まっているみたい。v2.6ぐらいからオープンチャット可能ということなので。残念。気づいたことをアップしてきたかった。&lt;/p&gt;
&lt;p&gt;読書会で一番しれてよかったのはクロージャの再帰呼び出しの方法かな。&lt;/p&gt;
&lt;p&gt;今まで再帰呼び出ししたいと思った場合には、&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;メソッドを定義して再帰&lt;/li&gt;
 &lt;li&gt;一度空の変数を作成してから、再帰呼び出しクロージャの定義&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;といずれかを行っていた。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;１の例&lt;/u&gt;&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def x(n){
    if( n &amp;gt; 0 ){
        print n
        x(n-1)
    }
}
x(5)
&lt;/pre&gt;
&lt;p&gt;&lt;u&gt;２の例&lt;/u&gt;&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def x
x = { n -&amp;gt;
    if( n &amp;gt; 0 ){
        print n
        x(n-1)
    }
}
x(5)
&lt;/pre&gt;
&lt;p&gt;クロージャで再帰呼び出しすることはできないと思ってたのデスが、以下のようにcallメソッドを使えば可能。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def x = { n -&amp;gt;
    if( n &amp;gt; 0 ){
        print n
        call(n-1)
    }
}
x(5)
&lt;/pre&gt;
&lt;p&gt;それから、クロージャのasWritableメソッドが正常に動かない。&lt;/p&gt;
&lt;p&gt;asWritableメソッドを使用して作成したクロージャのクローンは、実行後に結果を出力する設定が可能な&lt;strong&gt;writeTo&lt;/strong&gt;メソッドがつかされるということなので試してみた。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def x = { &amp;quot;3&amp;quot; }.asWritable()
System.out.withWriter{ w -&amp;gt;
    x.writeTo(w)
    x()
    w &amp;lt;&amp;lt; &amp;quot;a&amp;quot;
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;結果では&amp;quot;&lt;strong&gt;3a&lt;/strong&gt;&amp;quot;と出力されると思ったけど&amp;quot;&lt;strong&gt;a&lt;/strong&gt;&amp;quot;しか出力されない。しかもコード実行後には&lt;strong&gt;println&lt;/strong&gt;メソッド使用できなくなるし。使い方が間違っているのだろうか。うーん。&lt;/p&gt;
&lt;p&gt;なんにせよ今回も楽しかった。読書会終了後の懇談会が飲みながらコーディングでなんだかわけがわからないコード書いていた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6587136207834394030?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6587136207834394030/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/groovyin.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6587136207834394030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6587136207834394030'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/groovyin.html' title='Groovyイン・アクション読書会IN関西 第２回'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5412191004924897292</id><published>2009-06-01T06:40:00.003+09:00</published><updated>2009-06-01T13:21:29.894+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>SwingPadを改良</title><content type='html'>&lt;p&gt;&lt;strong&gt;griffon&lt;/strong&gt;でアプリを作成する際に、簡単に画面周りの&lt;strong&gt;変更&amp;rarr;確認&lt;/strong&gt;をしたければ、インストールフォルダの&lt;strong&gt;examples/SwingPad&lt;/strong&gt;を利用するのがよい。&lt;/p&gt;
&lt;p&gt;でも、このアプリも若干気になる所があって、&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;viewからmodelへの入力値反映のためにbindメソッドを使用しているコードを実行するとエラー&lt;/li&gt;
 &lt;li&gt;viewのgroovyコードをそのまま張り付けてもだめで、application(){ ... } の内側とimport文のみのこして後はコメントアウトさせて実行しないとだめ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解決できるように、SwingPadのコードをほんの少し修正してみた。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
/*
 * Copyright 2007-2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 */

import java.awt.Color
import java.awt.Font
import java.awt.Robot
import java.awt.FlowLayout
import java.awt.event.ActionEvent
import javax.swing.JComponent
import javax.swing.JFileChooser
import javax.swing.JOptionPane
import javax.swing.SwingConstants
import static javax.swing.JSplitPane.*
import javax.imageio.ImageIO
import java.util.prefs.Preferences
import groovy.ui.text.FindReplaceUtility
import org.codehaus.groovy.runtime.StackTraceUtils

class SwingPadController {
   def model
   def view
   def builder

   private prefs = Preferences.userNodeForPackage(SwingPadController)
   private File currentFileChooserDir = new File(prefs.get('currentFileChooserDir', '.'))
   private File currentClasspathJarDir = new File(prefs.get('currentClasspathJarDir', '.'))
   private File currentClasspathDir = new File(prefs.get('currentClasspathDir', '.'))
   private File currentSnapshotDir = new File(prefs.get('currentSnapshotDir', '.'))
   private runThread = null
   private GroovyClassLoader groovyClassLoader
   private static int scriptCounter = 0
   private Set factorySet = new TreeSet()

   void mvcGroupInit( Map args ) {
      groovyClassLoader = new GroovyClassLoader(this.class.classLoader)
   }

   def updateTitle = { -&amp;gt;
      // TODO handle undo!
      if( model.scriptFile ) {
         return model.scriptFile.name + (model.dirty ? &amp;quot; *&amp;quot; : &amp;quot;&amp;quot;) + &amp;quot; - SwingPad&amp;quot;
      }
      return &amp;quot;SwingPad&amp;quot;
   }

   def newScript = { evt = null -&amp;gt;
      if( askToSaveFile(evt) ) {
         model.scriptFile = null
         model.dirty = false
         view.editor.textEditor.text = ''
         view.editor.textEditor.requestFocus()
      }
   }

   def open = { evt = null -&amp;gt;
      model.scriptFile = selectFilename()
      if( !model.scriptFile ) return
      doOutside {
         def scriptText = model.scriptFile.readLines().join('\n')
         doLater {
            if( !scriptText ) return
            // need 2-way binding!
            view.editor.textEditor.text = scriptText
            model.dirty = false
            view.editor.textEditor.caretPosition = 0
            view.editor.textEditor.requestFocus()
         }
      }
   }

   def save = { evt = null -&amp;gt;
      if( !model.scriptFile ) return saveAs(evt)
      model.scriptFile.write(model.content)
      model.dirty = false
      return true
   }

   def saveAs = { evt = null -&amp;gt;
      model.scriptFile = selectFilename(&amp;quot;Save&amp;quot;)
      if( model.scriptFile ) {
         model.scriptFile.write(model.content)
         model.dirty = false
         return true
      }
      return false
   }

   def exit = { evt = null -&amp;gt;
      if( askToSaveFile() ) {
         FindReplaceUtility.dispose()
         app.shutdown()
      }
   }

   def snapshot = { evt -&amp;gt;
      def fc = new JFileChooser(currentSnapshotDir)
      fc.fileSelectionMode = JFileChooser.FILES_ONLY
      fc.acceptAllFileFilterUsed = true
      if (fc.showDialog(app.appFrames[0], &amp;quot;Snapshot&amp;quot;) == JFileChooser.APPROVE_OPTION) {
         currentSnapshotDir = fc.currentDirectory
         prefs.put('currentSnapshotDir', currentSnapshotDir.path)
         def frameBounds = app.appFrames[0].bounds
         def capture = new Robot().createScreenCapture(frameBounds)
         def filename = fc.selectedFile.name
         def dot = filename.lastIndexOf(&amp;quot;.&amp;quot;)
         def ext = &amp;quot;png&amp;quot;
         if( dot &amp;gt; 0 )  {
            ext = filename[dot+1..-1] 
         } else {
            filename += &amp;quot;.$ext&amp;quot;
         }
         def target = new File(currentSnapshotDir,filename)
         ImageIO.write( capture, ext, target )
         def pane = builder.optionPane()
         pane.setMessage(&amp;quot;Successfully saved snapshot to\n\n${target.absolutePath}&amp;quot;)
         def dialog = pane.createDialog(app.appFrames[0], 'Snapshot')
         dialog.show()
      }
   }

   private void invokeTextAction( evt, closure ) {
      if( evt.source ) closure(view.editor.textEditor)
   }

   def cut = { evt = null -&amp;gt; invokeTextAction(evt, { source -&amp;gt; source.cut() }) }
   def copy = { evt = null -&amp;gt; invokeTextAction(evt, { source -&amp;gt; source.copy() }) }
   def paste = { evt = null -&amp;gt; invokeTextAction(evt, { source -&amp;gt; source.paste() }) }
   def selectAll = { evt = null -&amp;gt; invokeTextAction(evt, { source -&amp;gt; source.selectAll() }) }

   // TODO yet unconnected!!
   def find = { evt = null -&amp;gt; FindReplaceUtility.showDialog() }
   def findNext = { evt = null -&amp;gt; FindReplaceUtility.FIND_ACTION.actionPerformed(evt) }
   def findPrevious = { evt = null -&amp;gt; 
      def reverseEvt = new ActionEvent( evt.source, evt.iD, 
         evt.actionCommand, evt.when,
         ActionEvent.SHIFT_MASK) //reverse
      FindReplaceUtility.FIND_ACTION.actionPerformed(reverseEvt)
   }
   def replace = { evt = null -&amp;gt; FindReplaceUtility.showDialog(true) }

   def largerFont = { evt = null -&amp;gt;
      modifyFont(view.editor.textEditor, {it &amp;gt; 40}, +2)
      modifyFont(view.errors, {it &amp;gt; 40}, +2)
   }

   def smallerFont = { evt = null -&amp;gt;
      modifyFont(view.editor.textEditor, {it &amp;lt; 5}, -2)
      modifyFont(view.errors, {it &amp;lt; 5}, -2)
   }

   def packComponents = { evt = null -&amp;gt;
      def newLayout = evt?.source?.state ? builder.flowLayout(alignment:FlowLayout.LEFT, hgap: 0, vgap: 0) : builder.borderLayout()
      if( !newLayout.class.isAssignableFrom(view.canvas.layout.class) ) {
         view.canvas.layout = newLayout
         if( model.successfulScript ) runScript(evt)
      }
   }

   def showRulers = { evt = null -&amp;gt;
      def rh = evt?.source?.state ? view.rowHeader : view.emptyRowHeader
      def ch = evt?.source?.state ? view.columnHeader : view.emptyColumnHeader
      if( view.scroller.rowHeader.view != rh ) {
         view.scroller.rowHeaderView = rh
         view.scroller.columnHeaderView = ch
         view.scroller.repaint()
      }
   }

   def runScript = { evt = null -&amp;gt;
      if( !model.content ) return
      view.tabs.selectedIndex = 0 // sourceTab
      runThread = Thread.start {
         try {
            doLater {
               model.status = &amp;quot;Running Script ...&amp;quot;
               if( model.errors != &amp;quot;&amp;quot; ) {
                  model.errors = &amp;quot;&amp;quot;
                  model.caretPosition = 0
               }
               showDialog( &amp;quot;runWaitDialog&amp;quot; )
            }
            model.content = model.content.replaceAll(/(?ms)(^\s+application\s*\(.+?\)\s*\{)(.+)(\}\s*)/){ all, p1, p2, p3 -&amp;gt;
                p1.readLines().collect{ &amp;quot;// &amp;quot; + it }.join(&amp;quot;\n&amp;quot;) + p2 + p3.readLines().collect{ &amp;quot;// &amp;quot; + it }.join(&amp;quot;\n&amp;quot;)
            }
            edt{
                view.inputArea.text = model.content
            }
            executeScript( model.content )
         } catch( Throwable t ) {
            doLater { finishWithException(t) }
         } finally {
            doLater {
               hideDialog( &amp;quot;runWaitDialog&amp;quot; )
               runThread = null
            }
         }
      }
   }

   def runSampleScript = { evt = null -&amp;gt;
      if( model.currentSample ) {
         def builder = model.currentSample[0..-2].toLowerCase()
         if( !model.builders[builder].enabled ) {
            model.status = &amp;quot;Enabling ${model.builders[builder].type} ...&amp;quot;
            view.&amp;quot;${builder}Menu&amp;quot;.selected = true
            doOutside {
               if(toggleBuilder([source:view.&amp;quot;${builder}Menu&amp;quot;], builder, model.builders[builder].type)) {
                  doLater {
                     model.status = &amp;quot;Loading Script ...&amp;quot;
                     view.editor.textEditor.text = model.samples[model.currentSample]
                     view.editor.textEditor.caretPosition = 0
                     view.runAction.enabled = true
                     runScript(evt)
                  }
               }
            }
         } else {
            model.status = &amp;quot;Loading Script ...&amp;quot;
            view.editor.textEditor.text = model.samples[model.currentSample]
            view.editor.textEditor.caretPosition = 0
            view.runAction.enabled = true
            runScript(evt)
         }
      }
   }

   def about = { evt = null -&amp;gt;
      def pane = builder.optionPane()
       // work around GROOVY-1048
      pane.setMessage('Welcome to SwingPad')
      def dialog = pane.createDialog(app.appFrames[0], 'About SwingPad')
      dialog.show()
   }

   def confirmRunInterrupt = { evt = null -&amp;gt;
      def rc = JOptionPane.showConfirmDialog( app.appFrames[0], &amp;quot;Attempt to interrupt script?&amp;quot;,
            &amp;quot;SwingPad&amp;quot;, JOptionPane.YES_NO_OPTION)
      if( rc == JOptionPane.YES_OPTION &amp;amp;&amp;amp; runThread ) {
          runThread.interrupt()
      }
   }

   // the folowing 4 actions taken from groovy.ui.Console
    def addClasspathJar = { evt = null -&amp;gt;
        def fc = new JFileChooser(currentClasspathJarDir)
        fc.fileSelectionMode = JFileChooser.FILES_ONLY
        fc.acceptAllFileFilterUsed = true
        if (fc.showDialog(app.appFrames[0], &amp;quot;Add&amp;quot;) == JFileChooser.APPROVE_OPTION) {
            currentClasspathJarDir = fc.currentDirectory
            prefs.put('currentClasspathJarDir', currentClasspathJarDir.path)
            groovyClassLoader.addURL(fc.selectedFile.toURL())
        }
    }

    def addClasspathDir = { evt = null -&amp;gt;
        def fc = new JFileChooser(currentClasspathDir)
        fc.fileSelectionMode = JFileChooser.DIRECTORIES_ONLY
        fc.acceptAllFileFilterUsed = true
        if (fc.showDialog(app.appFrames[0], &amp;quot;Add&amp;quot;) == JFileChooser.APPROVE_OPTION) {
            currentClasspathDir = fc.currentDirectory
            prefs.put('currentClasspathDir', currentClasspathDir.path)
            groovyClassLoader.addURL(fc.selectedFile.toURL())
        }
    }

    def showToolbar = { evt = null -&amp;gt;
        def showToolbar = evt.source.selected
        prefs.putBoolean('showToolbar', showToolbar)
        view.toolbar.visible = showToolbar
    }

   def suggestNodeName = { evt = null -&amp;gt;
      if( !model.content ) return 

      def editor = view.editor.textEditor
      def caret = editor.caretPosition
      if( !caret ) return

      def document = editor.document
      def target = &amp;quot;&amp;quot;
      def ch = document.getText(--caret,1)
      while( ch =~ /[a-zA-Z]/ ) {
         target = ch + target
         if( caret ) ch = document.getText(--caret,1)
         else break
      }
      if( target.size() != document.length ) caret++

      if( !factorySet ) populateFactorySet()
      def suggestions = factorySet.findAll{ it.startsWith(target) }
      if( !suggestions ) return
      if( suggestions.size() == 1 ) {
         model.suggestion = [
            start: caret,
            end: caret + target.size(),
            offset: target.size(),
            text: suggestions.iterator().next()
         ]
         writeSuggestion()
      } else {
         model.suggestion = [ 
            start: caret,
            end: caret + target.size(),
            offset: target.size()
         ]
         model.suggestions.clear()
         model.suggestions.addAll(suggestions)
         view.popup.showPopup(SwingConstants.CENTER, app.appFrames[0])
         view.suggestionList.selectedIndex = 0
      }
   }

   def codeComplete = { evt -&amp;gt;
      model.suggestion.text = model.suggestions[view.suggestionList.selectedIndex]
      view.popup.hidePopup(true)
      writeSuggestion()
   }

   def toggleFlamingoBuilder = { evt = null -&amp;gt;
      doOutside {
         toggleBuilder(evt, &amp;quot;flamingo&amp;quot;, model.builders.flamingo.type)
      }
   }

   def toggleTrayBuilder = { evt = null -&amp;gt;
      doOutside {
         toggleBuilder(evt, &amp;quot;tray&amp;quot;, model.builders.tray.type)
      }
   }

   def toggleMacwidgetsBuilder = { evt = null -&amp;gt;
      doOutside {
         toggleBuilder(evt, &amp;quot;macwidgets&amp;quot;, model.builders.macwidgets.type)
      }
   }

   def toggleLayout = { evt = null -&amp;gt;
      model.horizontalLayout = !model.horizontalLayout
      view.splitPane.orientation = model.horizontalLayout ? HORIZONTAL_SPLIT : VERTICAL_SPLIT
      view.toggleLayoutAction.putValue(&amp;quot;SmallIcon&amp;quot;, model.horizontalLayout ? view.verticalLayoutIcon : view.horizontalLayoutIcon )
   }

   private writeSuggestion() {
      if( !model.suggestion ) return

      def editor = view.editor.textEditor
      def document = editor.document
      def s = model.suggestion
      def text = s.text.substring(s.offset)
      document.insertString(s.start+s.offset, text, null)
      editor.requestFocus()

      // clear it!
      model.suggestion = [:]
   }

   private void finishNormal( component ) {
      model.successfulScript = true
      doLater {
         model.status = 'Execution complete.'
         view.canvas.removeAll()
         view.canvas.repaint()
         if( component instanceof JComponent ) {
            view.canvas.add(component)
         } else {
            model.status = &amp;quot;The script did not return a JComponent!&amp;quot;
         }
      }
   }

   private void finishWithException( Throwable t ) {
      model.successfulScript = false
      model.status = 'Execution terminated with exception.'
      StackTraceUtils.deepSanitize(t)
      t.printStackTrace()
      def baos = new ByteArrayOutputStream()
      t.printStackTrace(new PrintStream(baos))
      doLater {
         view.canvas.removeAll()
         view.canvas.repaint()
         view.tabs.selectedIndex = 1 // errorsTab
         model.errors = baos.toString()
         model.caretPosition = 0
      }
   }

   private void showAlert(title, message) {
      doLater {
         JOptionPane.showMessageDialog(app.appFrames[0], message,
               title, JOptionPane.WARNING_MESSAGE)
      }
   }

   private void showMessage(title, message) {
      doLater {
         JOptionPane.showMessageDialog(app.appFrames[0], message,
               title, JOptionPane.INFORMATION_MESSAGE)
      }
   }

   private void showDialog( dialogName, pack = true ) {
      def dialog = view.&amp;quot;$dialogName&amp;quot;
      if( pack ) dialog.pack()
      int x = app.appFrames[0].x + (app.appFrames[0].width - dialog.width) / 2
      int y = app.appFrames[0].y + (app.appFrames[0].height - dialog.height) / 2
      dialog.setLocation(x, y)
      dialog.show()
   }

   private void hideDialog( dialogName ) {
      def dialog = view.&amp;quot;$dialogName&amp;quot;
      dialog.hide()
   }

   private selectFilename( name = &amp;quot;Open&amp;quot; ) {
      // should use builder.fileChooser() ?
      def fc = new JFileChooser(currentFileChooserDir)
      fc.fileSelectionMode = JFileChooser.FILES_ONLY
      fc.acceptAllFileFilterUsed = true
      if( fc.showDialog(app.appFrames[0], name ) == JFileChooser.APPROVE_OPTION ) {
         currentFileChooserDir = fc.currentDirectory
         prefs.put('currentFileChooserDir', currentFileChooserDir.path)
         return fc.selectedFile
      }
      return null
   }

   private boolean askToSaveFile(evt) {
      if( !model.scriptFile || !model.dirty ) return true
      switch( JOptionPane.showConfirmDialog( app.appFrames[0],
                 &amp;quot;Save changes to &amp;quot; + model.scriptFile.name + &amp;quot;?&amp;quot;,
                 &amp;quot;SwingPad&amp;quot;, JOptionPane.YES_NO_CANCEL_OPTION)){
         case JOptionPane.YES_OPTION: return save(evt)
         case JOptionPane.NO_OPTION: return true
      }
      return false
   }

   private void executeScript( codeSource ) {
      try {
         codeSource = codeSource.replaceAll(
             /(?ms)bind\s*\([^)]+?\)/, &amp;quot;\&amp;quot;\&amp;quot;&amp;quot;
         )
         def script = groovyClassLoader.parseClass(codeSource,getScriptName()).newInstance()
         def b = app.builders.Script
         def component = null
         b.edt{ component = b.build(script)}
//          if( !(component instanceof JComponent) ) {
//             throw new IllegalArgumentException(&amp;quot;The script did not return a JComponent!&amp;quot;)
//          }
         doLater { finishNormal(component) }
      } catch( Throwable t ) {
         doLater { finishWithException(t) }
      }
   }

   private getScriptName() {
      &amp;quot;SwingPad_script&amp;quot; + (scriptCounter++)
   }

   private modifyFont( target, sizeFilter, sizeMod ) {
      def currentFont = target.font
      if( sizeFilter(currentFont.size) ) return
      target.font = new Font( 'Monospaced', currentFont.style, currentFont.size + sizeMod )
   }

   private populateFactorySet() {
      // TODO filter factories coming from SwingXBuilder that have jxclassicSwing: on their name
      def ub = app.builders.Script
      factorySet.clear()
      ub.builderRegistration.each { ubr -&amp;gt;
         def builder = ubr.builder
         def oldProxy = builder.proxyBuilder
         try {
            builder.proxyBuilder = builder
            factorySet.addAll(ubr.builder.factories.keySet().sort().collect(){ (ubr.prefixString?:&amp;quot;&amp;quot;)+it })
         } finally {
            builder.proxyBuilder = oldProxy
         }
      }
      factorySet -= factorySet.grep{ it.startsWith(&amp;quot;jxclassicSwing:&amp;quot;) }
   }

   private toggleBuilder( evt, name, builder ) {
      def cname = name[0].toUpperCase() + name[1..-1]
      model.builders[name].enabled = evt.source.selected
      if( model.builders[name].enabled ) {
         app.builderConfig.root.&amp;quot;$builder&amp;quot;.view = &amp;quot;*&amp;quot;
      } else {
         app.builderConfig.root.remove(builder)
      }

      try {
         // With no current way to unload an URL from the rootLoader
         // we have to keep track if an URL has already been added to it
         if( !model.builders[name].loaded ) {
            def startDir = System.getProperty(&amp;quot;griffon.start.dir&amp;quot;)
            if( startDir.startsWith('&amp;quot;') &amp;amp;&amp;amp; startDir.endsWith('&amp;quot;') ) {
               startDir = startDir[1..-2]
            }
            def jarDir = new File(startDir,&amp;quot;lib/$name&amp;quot;)
            jarDir.eachFileMatch({it.endsWith(&amp;quot;.jar&amp;quot;)}) { jar -&amp;gt;
//                groovyClassLoader.addURL(jar.toURI().toURL())
               this.class.classLoader.addURL(jar.toURI().toURL())
            }
            model.builders[name].loaded = true
         }
         def binding = new Binding()
         binding.setVariable(&amp;quot;controller&amp;quot;, this)
         def script = &amp;quot;&amp;quot;&amp;quot;def (m, v, c) = controller.createMVCGroup(&amp;quot;Script&amp;quot;,&amp;quot;Script&amp;quot;,[:])
         return v
         &amp;quot;&amp;quot;&amp;quot;
         app.builders.Script = new GroovyShell(groovyClassLoader,binding).evaluate(script)
      } catch( ex ) {
         StackTraceUtils.deepSanitize(ex)
         ex.printStackTrace()
         model.builders[name].enabled != model.builders[name].enabled
         evt.source.selected = !evt.source.selected
         showAlert( &amp;quot;Enable $cname&amp;quot;.toString(),
          &amp;quot;Couldn't enable $cname:\n\n$ex&amp;quot;.toString())
      } finally {
         populateFactorySet()
      }
      return model.builders[name].enabled
   }
}
&lt;/pre&gt;
&lt;p&gt;長々とコード載せたが、元ソースからl194〜199、l453〜455を変えただけ。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5412191004924897292?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5412191004924897292/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/swingpad.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5412191004924897292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5412191004924897292'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/06/swingpad.html' title='SwingPadを改良'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-199996675503451751</id><published>2009-05-29T23:14:00.002+09:00</published><updated>2009-05-30T00:16:13.003+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>SwingのEvent Dispatch ThreadとGriffonのedt</title><content type='html'>&lt;p&gt;今更ながら、griffon登場後にswingの本やサイトを見ては勉強しています。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groovetube.org/rsd.php?itemid=517"&gt;Swing EDT(Event Dispatch Thread)関係おさらい - Groove Tube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groovetube.org/index.php?itemid=502&amp;amp;catid=7"&gt;またEDTにやられる&amp;hellip; - Groove Tube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/Kazzz/20080104/p1"&gt;Swingとスレッドと再描画 - Kazzzの日記&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Event Dispatch Thread?&lt;/h4&gt;
&lt;p&gt;swingでボタン押下後の処理などを書きたい場合には、swing guiを管理しているスレッドとは別のスレッドを起動して実行する必要がある。&lt;/p&gt;
&lt;p&gt;このguiを管理しているスレッドを&lt;strong&gt;Event Dispatch Thread&lt;/strong&gt;って呼ぶらしい。&lt;/p&gt;
&lt;p&gt;このスレッド内で重たい処理を実行させると、処理完了までに&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;GUIのリサイズできない&lt;/li&gt;
 &lt;li&gt;GUIの移動できない&lt;/li&gt;
 &lt;li&gt;コントロールに入力したりフォーカス合わせたりできない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といったことになり、「Swingっていけてないじゃん、重たいじゃん」と勘違いしてしまう。つい最近そんなことをしてしまっていた。&lt;/p&gt;
&lt;p&gt;別スレッドを生成して実行させても、その処理を実行後にまた&lt;strong&gt;EDT&lt;/strong&gt;に成魚を戻して描画を行ったり・・・めんどいきがする。&lt;/p&gt;
&lt;h4&gt;griffonのedtメソッド、doOutsideメソッド&lt;/h4&gt;
&lt;p&gt;そこで&lt;strong&gt;groovy&lt;/strong&gt;の&lt;strong&gt;griffon&lt;/strong&gt;フレームワークが生きてくる。&lt;/p&gt;
&lt;p&gt;コントローラクラス内では&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;edt&lt;/li&gt;
 &lt;li&gt;doOutsite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の二つのメソッドが使用できる。こいつらにクロージャーを渡すことで、edt、doOutsideブロック内に記述した処理はそれぞれ&lt;strong&gt;Event Dispatch Thread&lt;/strong&gt;の処理、あるいは別スレッドの処理として実行させることができる。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def search = { event -&amp;gt;
    // ボタンを使用不可に
    model.searchEnbled = false
    
    // 別スレッド処理
    doOutside{
        // 検索処理
        // ...
    
        // ボタンを使用可能に
        edt{
            model.searchEnabled = true
        }
    }
}

&lt;/pre&gt;
&lt;p&gt;最初&lt;strong&gt;griffon&lt;/strong&gt;のサイトの説明読んだときにはさっぱりだったけど、&lt;strong&gt;swing&lt;/strong&gt;について勉強していってようやくわかってきた。&lt;/p&gt;
&lt;p&gt;今更だけど少しずつ&lt;strong&gt;swing&lt;/strong&gt;の仕組みがわかってきた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-199996675503451751?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/199996675503451751/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/swingevent-dispatch-threadgriffonedt.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/199996675503451751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/199996675503451751'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/swingevent-dispatch-threadgriffonedt.html' title='SwingのEvent Dispatch ThreadとGriffonのedt'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1434699399674628074</id><published>2009-05-29T07:53:00.000+09:00</published><updated>2009-05-29T07:53:14.365+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy 1.6のBindable</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fujwara/20090527#c"&gt;groovy1.6の紹介記事 - おっさんの手習い&lt;/a&gt;にgroovy1.6の新機能についての説明が日本語で出ているよとかかれていたので読んでみた。&lt;/p&gt;
&lt;p&gt;1.6の新機能がよく分かっていなかったけど、分かってきた。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;groovyConsole&lt;/strong&gt;の実行結果がJTableで表示可能とか、おもしろい。&lt;/p&gt;
&lt;p&gt;特におもしろいと思ったのは&lt;strong&gt;Bindable&lt;/strong&gt;&lt;strong&gt;アノテーション&lt;/strong&gt;の機能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PropertyCangeSupport&lt;/strong&gt;の機能自体しらなかったからこそですが。&lt;/p&gt;
&lt;p&gt;以下のコードにて。&lt;/p&gt;
&lt;p&gt;MyBeanオブジェクトに&lt;strong&gt;PropertyChangeListener&lt;/strong&gt;を追加することで、プロパティ変更時に処理を行うことが可能。&lt;/p&gt;
&lt;p&gt;複数渡せば複数の処理が可能。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
#!/usr/bin/env groovy
import java.beans.PropertyChangeSupport
import java.beans.PropertyChangeListener
import java.beans. PropertyChangeEvent

class MyBean {
    private String name = &amp;quot;たろう&amp;quot;
    PropertyChangeSupport pcs = new PropertyChangeSupport(this)
    void addPropertyChangeListener(PropertyChangeListener l) {
        pcs.addPropertyChangeListener(l)
    }
    void removePropertyChangeListener(PropertyChangeListener l) {
        pcs.removePropertyChangeListener(l)
    }
    String getName() {
        return name
    }
    void setName(String name) {
        pcs.firePropertyChange(&amp;quot;name&amp;quot;, this.name, this.name = name)
    }
    
}

def bean1 = new MyBean()
bean1.addPropertyChangeListener({ evt -&amp;gt;
    println &amp;quot;old:${evt.oldValue}, new:${evt.newValue}&amp;quot;
} as PropertyChangeListener)
bean1.addPropertyChangeListener({ evt -&amp;gt;
    println &amp;quot;別途追加したListner&amp;quot;
} as PropertyChangeListener)

def bean2 = new MyBean()

bean1.name = &amp;quot;はなこー&amp;quot;
bean2.name = &amp;quot;さぶろー&amp;quot;
&lt;/pre&gt;
&lt;p&gt;同様の処理を&lt;strong&gt;@Bindableアノテーション&lt;/strong&gt;を利用すると非常に簡単になる。&lt;strong&gt;addPropertyCangeListener&lt;/strong&gt;メソッドは勝手に追加されてる。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
#!/usr/bin/env groovy
import java.beans.PropertyChangeListener
import groovy.beans.Bindable

class MyBean {
    @Bindable
    String name = &amp;quot;たろう&amp;quot;
}

def bean1 = new MyBean()
bean1.addPropertyChangeListener({ evt -&amp;gt;
    println &amp;quot;old:${evt.oldValue}, new:${evt.newValue}&amp;quot;
} as PropertyChangeListener)
bean1.addPropertyChangeListener({ evt -&amp;gt;
    println &amp;quot;別途追加したListner&amp;quot;
} as PropertyChangeListener)

def bean2 = new MyBean()

bean1.name = &amp;quot;はなこー&amp;quot;
bean2.name = &amp;quot;さぶろー&amp;quot;
&lt;/pre&gt;
&lt;p&gt;これはおもしろい。&lt;strong&gt;setter&lt;/strong&gt;メソッドにフィルタはさんでもいけるんだろうけど、こっちを使った方がプロパティ変更時にやりたいんだよ！！っていう設計上の用途が伝わりやすいのかな。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;griffon&lt;/strong&gt;の仕組みがようやく少しずつ分かってきた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1434699399674628074?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1434699399674628074/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/groovy-16bindable.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1434699399674628074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1434699399674628074'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/groovy-16bindable.html' title='Groovy 1.6のBindable'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-802083012006295893</id><published>2009-05-28T08:07:00.001+09:00</published><updated>2009-05-28T08:07:52.653+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>クリップボード操作コマンドxsel、putclip</title><content type='html'>&lt;p&gt;最近ちゃんと投稿できていなかったので反省。&lt;/p&gt;
&lt;p&gt;linux上でクリップボードを定期的にチェックしたかったので、groovyで。&lt;/p&gt;
&lt;p&gt;動作確認はしてないけど、windowsにcygwinはいっていたら動くかも。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import static javax.swing.JOptionPane.*

def oldclip = ""
new Thread({
    final def COMMAND=(System.properties."os.name" ==~ /.*(?i)linux.*/)?"xsel -b -o":"cmd.exe /c getclip"
    oldclip = COMMAND.execute().text
    while(true){
        def clip = COMMAND.execute().text
        if( clip != oldclip &amp;&amp; clip ==~ /.*(?i)groovy.*/ ){
            showMessageDialog( null, "groovy関連の情報をコピペした？" )
            oldclip = clip
        }
        Thread.sleep(500)
    }
} as Runnable).start()
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-802083012006295893?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/802083012006295893/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/xselputclip.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/802083012006295893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/802083012006295893'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/xselputclip.html' title='クリップボード操作コマンドxsel、putclip'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4727843064990837312</id><published>2009-05-19T21:17:00.002+09:00</published><updated>2009-05-20T05:06:39.533+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>ついにgoogle app engineでGrails動いた！！</title><content type='html'>&lt;p&gt;大興奮です！！&lt;/p&gt;
&lt;p&gt;たった今、&lt;strong&gt;google app engine&lt;/strong&gt;上で&lt;strong&gt;Grails&lt;/strong&gt;が動きました！昨日設定した内容で問題なかったようです。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/05/grails-111google-app-engine.html"&gt;ゲンゾウ用ポストイット: grails 1.1.1で、google app engineに再チャレンジ！&lt;/a&gt;から以降のいきさつは以下のとおり。&lt;/p&gt;
&lt;h4&gt;気持ちを切り替えてGoogle先生に尋ねる&lt;/h4&gt;
&lt;p&gt;昨日はすべて止めてしまったけど、娘が寝てから再度チャレンジしてみた。&lt;/p&gt;
&lt;p&gt;google先生に&lt;strong&gt;datastore-indexes.xml&lt;/strong&gt;について質問してみると、関係がありそうなエントリが。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.livedoor.jp/cbnanashi/archives/818468.html"&gt;CB NANASHI管理人ブログ : GAE/J、SDK 1.2.1が公開、バージョンアップ時の注意&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;また修正されたログ取得を試すためにappcfg.cmdを実行するとdatastore-indexes.xml がスキーマに合致しない旨の出ました。xmlの「xmlns=&amp;quot;http://appengine.google.com/ns/datastore-indexes/1.0&amp;quot;」を削除したところ動作しました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;正しくこれです。&lt;/p&gt;
&lt;h4&gt;そしてデプロイ再実行&lt;/h4&gt;
&lt;p&gt;ということで、以下のファイルから上記に該当する箇所を削除して再度実行。&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;em&gt;emacs target/war/WEB-INF/datastore-indexes.xml&lt;br&gt;
&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;em&gt;$APPENGINE_HOME/bin/appcfg.sh update ./target/war&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;おおお！！！いけた！！いけたよ！！！&lt;/p&gt;
&lt;p&gt;念願のGrailsがフリー環境のサーバーで動くよ！！！！！&lt;/p&gt;
&lt;p&gt;Google様、一生ついていきます！&lt;/p&gt;
&lt;h4&gt;そして&lt;/h4&gt;
&lt;p&gt;これを整理して、今月末の&lt;a href="http://www.jggug.org/news/dai2kai%E3%80%8Cgroovyin%E3%83%BBakushon%E3%80%8Ddokushokaiinkansaikaisai"&gt;第2回 「Groovyイン・アクション」読書会IN関西&lt;/a&gt;での&lt;strong&gt;LTネタ&lt;/strong&gt;としよう。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4727843064990837312?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4727843064990837312/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/google-app-enginegrails.html#comment-form' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4727843064990837312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4727843064990837312'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/google-app-enginegrails.html' title='ついにgoogle app engineでGrails動いた！！'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-871318970267965249</id><published>2009-05-18T22:19:00.000+09:00</published><updated>2009-05-18T22:19:20.813+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>ケブンッリジ関数 どう書く？org</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/249/"&gt;ケブンッリジ関数 どう書く？org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;をといてみた。&lt;/p&gt;
&lt;p&gt;ちょっと話題になってたみたいだけど、乗り遅れてしまった。(&lt;em&gt;一回コピペミスして誤ったコードアップしてしまった！！！くぅぅ恥ずかしい）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.doukaku.org/comment/8943/"&gt;どう書く？org 8942 genzou:(ケブンッリジ関数) - 投稿の詳細&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;どすうで？ いいがと うまくかけょてるしで？&lt;/p&gt;
&lt;p&gt;ちゃんと よめたら コンメト よくろし！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-871318970267965249?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/871318970267965249/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/org.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/871318970267965249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/871318970267965249'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/org.html' title='ケブンッリジ関数 どう書く？org'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3775163264278920931</id><published>2009-05-18T21:30:00.000+09:00</published><updated>2009-05-18T21:30:28.933+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>今更だけどGrailsの意味</title><content type='html'>&lt;p&gt;今更だけどGrailsの名前の由来が分かった。&lt;/p&gt;
&lt;p&gt;railsとかけているというのは分かっていたけどそれ以外にも意味があったんだね。&lt;/p&gt;
&lt;p&gt;というか後付けなのかもしれないけど、ずっとGrailsのサイトのトップページに杯の絵がかかれているのがなんでだろう？？と思ってた。&lt;/p&gt;
&lt;p&gt;土曜日にテレビのロードショーで「ダヴィンチコード」をやっていたのだけど、そこで&lt;strong&gt;イエスキリストの聖杯&lt;/strong&gt;について語るシーンが登場。それでその時の英語アップのシーンで「grail」の文字が。&lt;/p&gt;
&lt;p&gt;知らなかった。grailって&lt;strong&gt;聖杯&lt;/strong&gt;って意味なんだね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3775163264278920931?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3775163264278920931/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/grails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3775163264278920931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3775163264278920931'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/grails.html' title='今更だけどGrailsの意味'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-681427813536286568</id><published>2009-05-18T21:26:00.001+09:00</published><updated>2009-05-18T21:37:19.236+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails 1.1.1で、google app engineに再チャレンジ！</title><content type='html'>&lt;p&gt;grails 1.1.1がリリースされました。&lt;br&gt;
今回の目玉は&lt;b&gt;google app engine&lt;/b&gt;に対応したプラグインが使えること。以前試して挫折したので再度チャレンジしてみた。&lt;br&gt;
ちなみにほとんど以下のサイトを参考にセットアップすればよい。&lt;br&gt;
&lt;a href="http://www.grails.org/plugin/app-engine#comment_357"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt; &lt;br&gt;
注意点だけメモしておく。&lt;/p&gt;
&lt;h4&gt;実行環境&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;■java&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;java.version: 1.6.0_13&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;■groovy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Groovy Version: 1.6.3&lt;/p&gt;
&lt;p&gt;■grails&lt;/p&gt;
&lt;p&gt;Grails 1.1.1&lt;/p&gt;
&lt;h4&gt;環境変数の設定&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;google app engine sdk&lt;/b&gt;のセットアップフォルダパスを環境変数に設定する必要がある。&lt;br&gt;
linuxの場合、&lt;br&gt;
&lt;code&gt;export APPENGINE_HOME=〜〜〜&lt;/code&gt;&lt;br&gt;
としておく。&lt;/p&gt;
&lt;h4&gt;Config.groovyの設定&lt;/h4&gt;
&lt;p&gt;以下のアプリ名はすべて揃える。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;grails create-app&lt;/li&gt;
 &lt;li&gt;Config.groovyのgoogle.appengine.applicationの値&lt;/li&gt;
 &lt;li&gt;google app engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;アプリは動いたのか？&lt;/h4&gt;
&lt;p&gt;で、結局動いたのかというと・・・動きませんでした。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;grails app-engine run&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;を実行すると&lt;strong&gt;http://localhost:8080/&lt;/strong&gt;でアプリが起動するところまでは確認できました。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;em&gt;grails set-version 1&lt;/em&gt;&lt;/li&gt;
 &lt;li&gt;&lt;em&gt;grails app-engine package&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;も正常に動作したので、後は配置するだけ、というところまでいけたのですが、&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;em&gt;$APPENGINE_HOME/bin/appcfg.sh update ./target/war&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を実行すると&lt;a href="http://www.grails.org/plugin/app-engine#comment_357"&gt;ここにかかれている内容&lt;/a&gt;とまったく同じエラーとなります。&lt;/p&gt;
&lt;p&gt;しばらくはこちらの回答を定期的にチェックしてみます。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-681427813536286568?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/681427813536286568/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/grails-111google-app-engine.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/681427813536286568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/681427813536286568'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/grails-111google-app-engine.html' title='grails 1.1.1で、google app engineに再チャレンジ！'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8513168903021593169</id><published>2009-05-10T21:28:00.000+09:00</published><updated>2009-05-10T21:28:25.495+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ubuntu9.0.4で、HP PSC2550プリンタを使用する</title><content type='html'>&lt;p&gt;ubuntuでプリンタを使えず（というか、多分ダメだろうなーと諦めていただけ）困っていたのですがさっき必要に迫られて調べてみた。&lt;/p&gt;
&lt;p&gt;するとずばりで情報発見。以下のページでPSC2550が使えたよという書き込みが。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://72.14.235.132/search?q=cache:bh05OJ5RBT4J:pc11.2ch.net/test/read.cgi/printer/1133548494/l50+ubuntu+%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF+psc+2550&amp;amp;cd=4&amp;amp;hl=ja&amp;amp;ct=clnk&amp;amp;gl=jp"&gt;Linuxで使えるプリンタ／スキャナ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ページにはfedora6での設定例がかかれていました。僕のマシンはubuntu9.0.4ですがほとんど同じ。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;synapticsを起動する。&lt;/li&gt;
 &lt;li&gt;hplipをインストール&lt;/li&gt;
 &lt;li&gt;hplip-guiをインストール&lt;/li&gt;
 &lt;li&gt;コマンドラインから&amp;quot;sudo hp-setup&amp;quot;を実行する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;あとはGUIのウィザードが表示されるので、そのとおりに。僕の家の環境ではネットワークプリンタを自動検出までして、テストページが無事に印刷完了。&lt;/p&gt;
&lt;p&gt;プリンタまで簡単に設定できるようになった。さらにWindowsが必要なくなってきたぞ！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8513168903021593169?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8513168903021593169/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/ubuntu904hp-psc2550.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8513168903021593169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8513168903021593169'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/ubuntu904hp-psc2550.html' title='ubuntu9.0.4で、HP PSC2550プリンタを使用する'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-9220877077851627150</id><published>2009-05-08T21:06:00.000+09:00</published><updated>2009-05-08T21:06:33.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ubuntu環境でswingアプリケーションのキー入力ができなくなることがある</title><content type='html'>&lt;p&gt;ubuntu &amp;amp; jEditで開発中、たまにキーボード入力を受け付けなくなることがありました。jEditだけが受け付けなくなり、他のアプリケーションは大丈夫のようで、そうなってしまったらしょうがないのでjEditを再起動していました。&lt;/p&gt;
&lt;p&gt;そんなおり、たまたまubuntuフォーラムで以下の書き込みを見つけた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://forums.ubuntulinux.jp/viewtopic.php?pid=30684#p30684"&gt;Ubuntu日本語フォーラム / JAVAアプリのキーボードが効かなくなる件&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『英語以外の環境で起こっているJAVAのバグだそうで、2年以上FIXされていず、かなり怒っているユーザさんも&lt;br&gt;
いるようです』&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;だそうです。そういえばgriffonで作ったアプリでも同じようにキーボード入力を受け付けなくなったことがあったなぁ。&lt;/p&gt;
&lt;p&gt;早く直してほしい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;『賛否両論ですが、export AWT_TOOLKIT=XToolkitを用いた解決法が載っているので試してみます』&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;なるほど！・・・ていうか、この解決方法ってどうやるんだろ？？いろいろためしてみるしかないか。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-9220877077851627150?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/9220877077851627150/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/ubuntuswing.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/9220877077851627150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/9220877077851627150'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/ubuntuswing.html' title='ubuntu環境でswingアプリケーションのキー入力ができなくなることがある'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1739673973051762289</id><published>2009-05-07T09:34:00.001+09:00</published><updated>2010-07-05T09:24:26.360+09:00</updated><title type='text'>groovyスクレイピング &amp; grape</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090428/1240929966"&gt;Groovyでスクレイピングしてみる(NekoHTML編) - No Programming, No Life&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/kslash/20090502/1241263751"&gt;理系のための恋愛論をGroovyでスクレイピングする！ - すらすら はてな&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;の記事が面白かった。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;XmlSlurper&lt;/li&gt;
 &lt;li&gt;XmlParser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を使用するとxmlを厳密にチェックするため、htmlの解析ができなかったけれども、&lt;strong&gt;nekohtml&lt;/strong&gt;っていうライブラリを利用するとあいまいなhtmlを解釈してパースしてくれるのでいろいろできるよ、っていうエントリ。&lt;/p&gt;
&lt;p&gt;最近、いまさらながら&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090118/1232288458"&gt;GCR #16 「Groovy　なう＆ふゅーちゃー、それからのGroovy」 - Grな日々(uehajの日記)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;を見て、&lt;strong&gt;grape&lt;/strong&gt;の機能が便利だな、と思ったのと&lt;a href="http://d.hatena.ne.jp/kiy0taka/"&gt;oku&lt;/a&gt;さんが&lt;strong&gt;grape&lt;/strong&gt;ライブラリ探すには&lt;a href="http://www.mvnrepository.com/"&gt;Maven Repository: Search/Browse/Explore&lt;/a&gt;を利用するといいよと教えてくれたので（いずれもいまさらですが･･･）ちょっとスクレイピングのエントリに書き加えてみた。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
#!/usr/bin/env groovy
import static java.lang.System.*
import org.cyberneko.html.parsers.SAXParser

// over proxy ..
if( getProperty(&amp;quot;http.proxyUser&amp;quot;) &amp;amp;&amp;amp; getProperty(&amp;quot;http.proxyPassword&amp;quot;) ){
    def pw = new PasswordAuthentication(
        getProperty(&amp;quot;http.proxyUser&amp;quot;),
        getProperty(&amp;quot;http.proxyPassword&amp;quot;).toCharArray()
    )
    Authenticator.default = { getPasswordAuthentication:{ pw } } as Authenticator
}

// grape
@Grab(group = 'nekohtml', module='nekohtml', version='latest.integration')
class Dummy{}

//--------------------MAIN LOGIC--------------------
def MYCOM = &amp;quot;http://journal.mycom.co.jp/&amp;quot;;
def allPage = [];
def parser = new XmlSlurper(new SAXParser()) 

def indexPage = parser.parse(&amp;quot;${MYCOM}column/rikei/index.html&amp;quot;)
def td= indexPage.'**'.findAll{
    it.name() == 'TD'
}

td.eachWithIndex{ it, index -&amp;gt;
    def number = &amp;quot;${td.size() - index}&amp;quot;.padLeft(3,'0');
    allPage &amp;lt;&amp;lt; [
        title:&amp;quot;第${number}回_&amp;quot; 
                + it.A.text().replace('?','？') .replace('\&amp;quot;','&amp;rdquo;').replace('/',&amp;quot;／&amp;quot;)
        ,url: &amp;quot;${MYCOM}${it.A.@href}&amp;quot;
    ]
}

new File(&amp;quot;rikei&amp;quot;).mkdir();

allPage.each{ page -&amp;gt;
    println &amp;quot;downlaoding... ${page.title} ${page.url}&amp;quot;
    def contentPage = parser.parse(page.url)
    def content = contentPage.'**'.find{
        it.name()=='DIV' &amp;amp;&amp;amp; it.@class=='articleContent'
    }.P.collect{
        it.text() + '\n'
    }.join('\n')
    new File(&amp;quot;rikei/${page.title}.txt&amp;quot;).newOutputStream() &amp;lt;&amp;lt; content
}
//--------------------MAIN LOGIC--------------------
&lt;/pre&gt;
&lt;p&gt;6行目から12行目はただ単に社内のfirewallを超えたいがための設定。（&lt;em&gt;家でやれよ、という突っ込みはなしで&lt;/em&gt;）&lt;/p&gt;
&lt;p&gt;16行目のクラス定義はアノテーションのために必要なのでとりあえず追記。かっこ悪いけど。&lt;/p&gt;
&lt;p&gt;これでjarファイルは自動的にダウンロードされた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1739673973051762289?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1739673973051762289/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/groovy-grape.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1739673973051762289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1739673973051762289'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/groovy-grape.html' title='groovyスクレイピング &amp; grape'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-140084275902094787</id><published>2009-05-02T06:38:00.010+09:00</published><updated>2009-05-02T20:15:28.914+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy＋Xml（その４：XmlParserのサンプルの謎）</title><content type='html'>&lt;p&gt;XmlParserのサンプルコードとして以下のページが参考になる。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Updating+XML+with+XmlParser"&gt;Updating XML with XmlParser - Groovy - Codehaus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;さて、このコードの中でずっと疑問だった箇所がある。コードの41行めからを取り上げて話をしたい。&lt;/p&gt;
&lt;p&gt;以下のコードを実行すると&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def groceries = root.category.findAll{ it.@type == 'groceries' }.item[0]
groceries.each { g -&amp;gt;
    g.value = 'Luxury ' + g.text()
}
&lt;/pre&gt;
&lt;p&gt;なぜか&lt;strong&gt;groceries.each()の処理が２回実行される。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;すぐ上の処理で&lt;strong&gt;...item[0]&lt;/strong&gt;としているので、item要素の１つ目が取得されるので&lt;strong&gt;each&lt;/strong&gt;は１回しか実行されないはずなのに。なんど読んでもこのコードがわからなかった。&lt;/p&gt;
&lt;p&gt;さっき散歩している間にふっと気づいた。先のコードは以下のように書き換えられる。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def groceries = root.category.find{ it.@type == 'groceries' }.item
groceries.each { g -&amp;gt;
    g.value = 'Luxury ' + g.text()
}
&lt;/pre&gt;
&lt;pre name="code" language="java"&gt;
def groceries = root.category.findAll{ it.@type == 'groceries' }[0].item
groceries.each { g -&amp;gt;
    g.value = 'Luxury ' + g.text()
}
&lt;/pre&gt;
&lt;pre name="code" language="java"&gt;
// これはかなり苦し紛れ
def groceries = (root.category.findAll{ it.@type == 'groceries' }*.item)[0]
groceries.each { g -&amp;gt;
    g.value = 'Luxury ' + g.text()
}
&lt;/pre&gt;
&lt;p&gt;
最後に添字指定するのは誤解を生む表現で、サンプルとして適切じゃないんじゃないかなと思ったよ。&lt;strong&gt;配列に対して配列自身のメソッド以外を実行しようと場合には、配列内の全要素に対して実行された結果が返ってくることに注意。&lt;/strong&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-140084275902094787?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/140084275902094787/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/groovyxml4xmlslurperxmlparser.html#comment-form' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/140084275902094787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/140084275902094787'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/05/groovyxml4xmlslurperxmlparser.html' title='Groovy＋Xml（その４：XmlParserのサンプルの謎）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-119928424418180772</id><published>2009-04-30T12:55:00.003+09:00</published><updated>2009-05-02T06:38:35.078+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy＋Xml（その３：XmlSlurperとXmlParserの大きな違い）</title><content type='html'>&lt;p&gt;
&lt;a href="http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurper.html"&gt;Groovy＋Xml（その２：XmlSlurperで検索）&lt;/a&gt;で書いたのですが、&lt;strong&gt;XmlSlurper&lt;/strong&gt;を使用してXMLを操作すると、親ノードの指定に注意が必要でした。
&lt;/p&gt;

&lt;pre name="code" language="xml"&gt;
■デスクトップ上のjp_zipcode.xml■
&amp;lt;Prefecture&amp;gt;
    &amp;lt;PrefectureName&amp;gt;XXX&amp;lt;/PrefectureName&amp;gt;
    &amp;lt;City&amp;gt;
        &amp;lt;CityName&amp;gt;XXX&amp;lt;/CityName&amp;gt;
        &amp;lt;Area&amp;gt;
            &amp;lt;AreaName&amp;gt;XXX&amp;lt;/AreaName&amp;gt;
            ･･･
        &amp;lt;/Area&amp;gt;
        &amp;lt;Area&amp;gt;
            &amp;lt;AreaName&amp;gt;XXX&amp;lt;/AreaName&amp;gt;
            ･･･
        &amp;lt;/Area&amp;gt;
    &amp;lt;/City&amp;gt;
    &amp;lt;City&amp;gt;
        &amp;lt;CityName&amp;gt;XXX&amp;lt;/CityName&amp;gt;
        &amp;lt;Area&amp;gt;
            &amp;lt;AreaName&amp;gt;XXX&amp;lt;/AreaName&amp;gt;
            ･･･
        &amp;lt;/Area&amp;gt;
    &amp;lt;/City&amp;gt;
&amp;lt;/Prefecture&amp;gt;

&lt;/pre&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import static java.lang.System.*

final USER_HOME = new File(getProperty("user.home"))
final DESKTOP = new File("${USER_HOME}/デスクトップ")
def data = new XmlSlurper().parse(new File("${DESKTOP}/jp_zipcode.xml"))

def area = data.Prefecture.City.Area[0]

println area.AreaName
// City要素が全て取得されてしまう
println area."..".CityName
&lt;/pre&gt;

&lt;p&gt;これがXPathの仕様なのかわからないですが、&lt;strong&gt;親ノードを".."で指定した場合&lt;/strong&gt;、City要素が全て返却されてしまいます。&lt;/p&gt;

&lt;p&gt;これを&lt;strong&gt;XmlParser&lt;/strong&gt;を使用したコードに書き直してみました。&lt;/p&gt;

&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import static java.lang.System.*

final USER_HOME = new File(getProperty("user.home"))
final DESKTOP = new File("${USER_HOME}/デスクトップ")
def data = new XmlParser().parse(new File("${DESKTOP}/jp_zipcode.xml"))

def area = data.Prefecture.City.Area[0]

println area.AreaName.text()
// City要素はarea変数を内包している１ノードのみ取得できる
println area."..".CityName.text()
&lt;/pre&gt;

&lt;p&gt;今度は".."で親ノードを指定した場合には１ノードのみ返却されました。&lt;/p&gt;

&lt;p&gt;そのほかの部分にも注意が必要です。XmlSlurperでは&lt;strong&gt;ある要素ノード内のテキストノード&lt;/strong&gt;は要素ノードのtoString()で出力可能のようです。
XmlParserでは&lt;strong&gt;ある要素ノード内のテキストノード&lt;/strong&gt;はtext()メソッドを指定しないと正しく出力されません。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-119928424418180772?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/119928424418180772/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurperxmlparser_2431.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/119928424418180772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/119928424418180772'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurperxmlparser_2431.html' title='Groovy＋Xml（その３：XmlSlurperとXmlParserの大きな違い）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2797406796909397523</id><published>2009-04-30T07:30:00.002+09:00</published><updated>2009-04-30T07:58:48.246+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy＋Xml（その２：XmlSlurperで検索）</title><content type='html'>&lt;p&gt;XmlSlurperの勉強がてら、なにかつくってみる。&lt;/p&gt;
&lt;p&gt;以下のサイトに郵便番号データをxmlで公開されていたので利用させていただいた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.majide.com/2009/03/jp-post-zipcode-xml/"&gt;全国郵便番号XMLデータ | イイ!! プログラミング Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ダウンロードしたファイルを展開し、デスクトップに置き、以下のプログラムを実行。コマンドラインから第一引数に郵便番号７桁を入力すると住所が表示される。（入力値のチェックをはしょってますごめんなさい）&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
#!/usr/bin/env groovy
import static java.lang.System.*

assert args[0] &amp;amp;&amp;amp; args[0] ==~ /\d+/

final USER_HOME = new File(getProperty(&amp;quot;user.home&amp;quot;))
final DESKTOP = new File(&amp;quot;${USER_HOME}/デスクトップ&amp;quot;)
def data = new XmlSlurper().parse(new File(&amp;quot;${DESKTOP}/jp_zipcode.xml&amp;quot;))

def prefecture = data.Prefecture.find{ it.City.Area.ZipCode.text().contains(args[0]) }
def city = prefecture.City.find{ it.Area.ZipCode.text().contains(args[0]) }
def area = city.Area.find{ it.ZipCode.text() == args[0] }

println area.ZipCode
println prefecture.PrefectureName
println city.CityName
println &amp;quot;${area.AreaName}(${area.AreaKana})&amp;quot;
&lt;/pre&gt;
&lt;p&gt;同じような記述が複数あるのがちょっと嫌。&lt;/p&gt;
&lt;p&gt;本当は&lt;strong&gt;area&lt;/strong&gt;を最初に検索して、残りの&lt;strong&gt;city&lt;/strong&gt;、&lt;strong&gt;prefecture&lt;/strong&gt;は&lt;strong&gt;parent()&lt;/strong&gt;または&lt;strong&gt;.&amp;quot;..&amp;quot;&lt;/strong&gt;を使用して参照したかったのだが、&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;これを利用すると同一の親要素がすべて取得されてしまう&lt;/strong&gt;&lt;/span&gt;のでやむなく同じような記述を。&lt;/p&gt;
&lt;p&gt;もうちょっとスマートにかければいいんだけど。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2797406796909397523?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2797406796909397523/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurper.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2797406796909397523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2797406796909397523'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurper.html' title='Groovy＋Xml（その２：XmlSlurperで検索）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8049579884995531386</id><published>2009-04-30T07:11:00.000+09:00</published><updated>2009-04-30T07:11:17.928+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy＋Xml（その１：XmlSlurperとXmlParserの違い：追記）</title><content type='html'>&lt;p&gt;せっかく&lt;strong&gt;XmlParser&lt;/strong&gt;と&lt;strong&gt;XmlSlurper&lt;/strong&gt;の違いを調べたが、「&lt;strong&gt;Groovy イン・アクション&lt;/strong&gt;」のP.357にちゃんとかかれていた。&lt;/p&gt;
&lt;p&gt;なるほど。やっぱり読み取り操作ならXmlSlurperの方が負荷が少ないみたいだ。&lt;/p&gt;
&lt;p&gt;「&lt;strong&gt;Groovy イン・アクション&lt;/strong&gt;」もしっかり全部よまないとね。といいつつ昨日図書館から&lt;strong&gt;Restful&lt;/strong&gt;の本借りてきてたりw。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8049579884995531386?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8049579884995531386/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurperxmlparser_30.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8049579884995531386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8049579884995531386'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurperxmlparser_30.html' title='Groovy＋Xml（その１：XmlSlurperとXmlParserの違い：追記）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8659089796106611522</id><published>2009-04-27T21:54:00.002+09:00</published><updated>2009-04-27T22:00:40.849+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy＋Xml（その１：XmlSlurperとXmlParserの違い）</title><content type='html'>&lt;p&gt;XmlSlurperとXmlParser、両者はいずれもxmlをパースするクラスですがなにが違うのかなとおもい調べてみた。&lt;/p&gt;
&lt;p&gt;大きな違いは以下のようになっている（参考：&lt;a href="http://docs.codehaus.org/display/GROOVY/Processing+XML"&gt;Processing XML - Groovy - Codehaus&lt;/a&gt;）&lt;/p&gt;
&lt;table border="1" class="confluenceTable" style="width: 574px; height: 127px;"&gt;
 &lt;tbody&gt;
  &lt;tr&gt;
   &lt;th bgcolor="#ffffcc" scope="row" class="confluenceTd"&gt;&lt;a title="Reading XML using Groovy's XmlParser" href="http://docs.codehaus.org/display/GROOVY/Reading+XML+using+Groovy%27s+XmlParser"&gt;XmlParser&lt;/a&gt;&lt;/th&gt;
   &lt;td class="confluenceTd"&gt;
   &lt;p&gt;supports GPath expressions for XML documents and allows updating&lt;/p&gt;
   &lt;p&gt;&lt;em&gt;xml文書のGPath表現をサポートしているし、文書の更新も可能だよ&lt;/em&gt;&lt;/p&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;th bgcolor="#ffffcc" scope="row" class="confluenceTd"&gt;&lt;a title="Reading XML using Groovy's XmlSlurper" href="http://docs.codehaus.org/display/GROOVY/Reading+XML+using+Groovy%27s+XmlSlurper"&gt;XmlSlurper&lt;/a&gt;&lt;/th&gt;
   &lt;td class="confluenceTd"&gt;
   &lt;p&gt;lower overheads than XmlParser due to lazy evaluation but only supports read operations&lt;/p&gt;
   &lt;p&gt;&lt;em&gt;遅延処理を利用してXmlParserよりもオーバーヘッドが少ないが、読み込み処理しかサポートしてないよ&lt;/em&gt;&lt;/p&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;xmlで記述した初期設定を読み込むような書き込みのない処理には&lt;strong&gt;XmlSlurper&lt;/strong&gt;が向いているようです。&lt;/p&gt;
&lt;p&gt;逆にxmlをよみこんで要素を修正し、出力する、といった場合には&lt;strong&gt;XmlParser&lt;/strong&gt;の方がよいみたい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8659089796106611522?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8659089796106611522/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurperxmlparser.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8659089796106611522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8659089796106611522'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyxmlxmlslurperxmlparser.html' title='Groovy＋Xml（その１：XmlSlurperとXmlParserの違い）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2261921327852725527</id><published>2009-04-27T13:25:00.002+09:00</published><updated>2009-04-27T13:37:02.568+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>社会人の麻雀って、そういうもんなの？</title><content type='html'>&lt;p&gt;金曜日に会社の年度始まりのキックオフ会があり、飲んできた。&lt;/p&gt;
&lt;p&gt;二次会と称して近くの雀荘で麻雀を。学生以来だなぁ。と楽しく打っていたのだが、余りに遅くなったので途中で帰らせてもらった。&lt;/p&gt;
&lt;p&gt;さて、問題は今日会社に来てから。「7000円ですよ。」と。&lt;/p&gt;
&lt;p&gt;あ、そういう麻雀なの？？知らなかったよ。てか一ヶ月一万円のこずかいからひかれたら･･･負けた自分が悪いのか。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2261921327852725527?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2261921327852725527/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/blog-post_27.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2261921327852725527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2261921327852725527'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/blog-post_27.html' title='社会人の麻雀って、そういうもんなの？'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2105975408213160672</id><published>2009-04-26T20:22:00.000+09:00</published><updated>2009-04-26T20:22:58.014+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Map使用の際にはgetterメソッドの動きに注意</title><content type='html'>&lt;p&gt;GIA読書会in関西で知った事その二。&lt;/p&gt;
&lt;p&gt;Mapを使用する際には、getterメソッドの動作に注意。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;groovy&lt;/strong&gt;では、オブジェクトaのgetXxx()メソッドを呼び出す際に&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;a.getXxx()&lt;/li&gt;
 &lt;li&gt;a.xxx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のいずれの方法でも値を取得できます。&lt;/p&gt;
&lt;p&gt;が、オブジェクトaがMapの際には注意が必要。&lt;strong&gt;a.xxx&lt;/strong&gt;の方法では&lt;strong&gt;常にnull&lt;/strong&gt;がかえってくるんだって。しらなかった。&lt;/p&gt;
&lt;p&gt;具体的には以下のソースを参考に。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def x = "abc"
assert x.class == String
assert x.getClass() == String

def y =  [a:100, b:200]
assert y.class == null
assert y.getClass() == java.util.LinkedHashMap

x.getMetaClass().getA = { 400 }
assert x.a == 400

y.getMetaClass().define{
    getA{ 200 }
}
assert y.a == 100

y.getMetaClass().define{
    getC{ 400 }
}
assert y.c == null
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2105975408213160672?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2105975408213160672/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/mapgetter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2105975408213160672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2105975408213160672'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/mapgetter.html' title='Map使用の際にはgetterメソッドの動きに注意'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3486968711377622048</id><published>2009-04-26T17:32:00.001+09:00</published><updated>2009-04-26T20:00:38.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>文字列に正規表現パターンを減算する</title><content type='html'>&lt;p&gt;GIA読書会in関西で勉強になったことの一つ。&lt;/p&gt;
&lt;p&gt;文字列から正規表現パターンを減算したらどうなるかという話になった。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def text = &amp;quot;hellohello&amp;quot; - (~/[lo]+/)
println text&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;結果：hehello&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正規表現を加算したら、文字列から最初にマッチした箇所が除外される。これは知らなかった。もちろん&lt;strong&gt;replaceFirst&lt;/strong&gt;使ったらいいんだけど、&lt;/p&gt;
&lt;p&gt;def text = &amp;quot;hellohello&amp;quot;.replaceFirst(/[lo]+/, &amp;quot;&amp;quot;)&lt;/p&gt;
&lt;p&gt;っていうのよりもコード量少ないし、見通しがよくなるかも。記述方法の一つとしてメモ。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3486968711377622048?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3486968711377622048/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3486968711377622048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3486968711377622048'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/blog-post.html' title='文字列に正規表現パターンを減算する'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-995821237310897615</id><published>2009-04-26T09:37:00.000+09:00</published><updated>2009-04-26T09:37:36.621+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovyイン・アクション読書会IN関西 いってきたよ</title><content type='html'>&lt;p&gt;&lt;strong&gt;Groovyイン・アクション読書会IN関西&lt;/strong&gt;に参加してきました。&lt;/p&gt;
&lt;p&gt;一度いってみたかった&lt;a href="http://www.kronos-jp.net/"&gt;株式会社クロノス&lt;/a&gt;さんのところでの読書会ということもあり、また大好きな&lt;strong&gt;groovy&lt;/strong&gt;の勉強会ということもあり、ドキドキしながら会場へ。地図をもつ手もふるえました（笑）&lt;/p&gt;
&lt;p&gt;東京、名古屋の勉強会に参加してはどうかというお誘いも名んどかしていただいたのですが、お小遣い一万円ではちょっと難しかったので大阪開催は助かります。&lt;/p&gt;
&lt;p&gt;進め方は時間を細かく区切り、&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;セクションを読む&lt;/li&gt;
 &lt;li&gt;読んだ部分で分からないこと、注意しておくこと、その他気づいたことなどを発言&lt;/li&gt;
 &lt;li&gt;コードを買いて検証&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という感じの流れで。&lt;/p&gt;
&lt;p&gt;第三章まで何とか終わりました。いくつか発見があったので次回掲載したい。&lt;/p&gt;
&lt;p&gt;夜はオフ会。お店の手羽先がうまかったー一人でかなり食べてしまった。&lt;/p&gt;
&lt;p&gt;今回はみなさん緊張していた感があるので、次回はもっと打ち解けてるんだろうなぁ。一緒に勉強するかたが近くにいるのがうれしいですね。やる気が出てきた！&lt;/p&gt;
&lt;p&gt;興味のある関西の方、次回はぜひきてくださいね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-995821237310897615?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/995821237310897615/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/995821237310897615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/995821237310897615'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/groovyin.html' title='Groovyイン・アクション読書会IN関西 いってきたよ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1859855349147861737</id><published>2009-04-20T09:19:00.002+09:00</published><updated>2009-04-20T09:19:35.917+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Google App Engineでgrails（成功事例が！！）</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/mottsnite/20090418/1240039964"&gt;Google App EngineでGrails - leftovers...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090419/1240150227"&gt;Grails on GAE/Jを試してみた - Grな日々(uehajの日記)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;にて、すでに&lt;strong&gt;Goole App Engine&lt;/strong&gt;にてGrailsを動作させた事例が挙がっています。&lt;/p&gt;
&lt;p&gt;すごい！おめでとう！！&lt;/p&gt;
&lt;p&gt;どうやら&lt;strong&gt;Grails-1.1.1&lt;/strong&gt;を取得して実行させないといけないみたい。まずは&lt;strong&gt;git&lt;/strong&gt;の勉強からか・・・&lt;/p&gt;
&lt;p&gt;（一応&lt;a href="http://d.hatena.ne.jp/uehaj/20090419/1240150227"&gt;Grな日々(uehajの日記)&lt;/a&gt;にgitコマンドの例まであげてくれているのですが、今晩試してだめそうなら正式版まで待つ方向で。）&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1859855349147861737?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1859855349147861737/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegrails-leftovers.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1859855349147861737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1859855349147861737'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegrails-leftovers.html' title='Google App Engineでgrails（成功事例が！！）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7271207088674417445</id><published>2009-04-17T21:56:00.003+09:00</published><updated>2009-04-17T22:10:40.451+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Google App Engineでgrails（その２）</title><content type='html'>&lt;h4&gt;ドメインを作ってアップロード&lt;/h4&gt;
&lt;p&gt;前回の続き。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails create-domain-class book&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以下のようなドメインを作成。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
class Book {

    static constraints = {
    }
   
    String name
    Integer price
}
&lt;/pre&gt;
&lt;p&gt;関連物を一括生成&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails generate-all book&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ほんで&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails war&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当然これでは&lt;strong&gt;app engine&lt;/strong&gt;で動作しない。&lt;/p&gt;
&lt;p&gt;ドメインはアノテーションを追記することで、&lt;strong&gt;app engine&lt;/strong&gt;の両方で動作可能みたい。なのでアノテーションを追加。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
import javax.jdo.annotations.*
import com.google.appengine.api.datastore.Key

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable=&amp;quot;true&amp;quot;)
class Book {
  
    static constraints = {
        key nullable:true
    }
  
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Key key

    @Persistent
    String name
  
    @Persistent
    Integer price
}
&lt;/pre&gt;
&lt;p&gt;試しにこの状態でwarファイル作成してみる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails war&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;今度は&amp;quot;&lt;strong&gt;@Persistent&lt;/strong&gt;&amp;quot;なんてアノテーションないっていわれるので、libフォルダに&lt;strong&gt;$APPENGINE_HOME&lt;/strong&gt;&lt;strong&gt;/lib/impl&lt;/strong&gt;以下のjarファイルを全てコピーして再実行。&lt;/p&gt;
&lt;p&gt;今度は正常にwarファイルが作成できた。controller、viewも作成しておく。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails generate-all&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;いよいよgoogle app engineにアップ&lt;/h4&gt;
&lt;p&gt;なんだか動くような気がしてきた！俄然はりきる。&lt;/p&gt;
&lt;p&gt;プラグインからインストールされたコマンドでアップロードしてみる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails app-engine deploy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;はい、エラー発生。&lt;strong&gt;appengine-web.xml&lt;/strong&gt;がどうのこうのいわれるので見てみると、そもそも&lt;strong&gt;grails create-app&lt;/strong&gt;で指定したアプリ名が&lt;strong&gt;appengine&lt;/strong&gt;アップロード先と一致していなければならないみたい。そこでもう一度アプリ作成から実行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails create-app &amp;lt;APPENGINE_APP_NAME&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;・・・domain、controller、viewも作成してから、もう一度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails app-engine deploy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;やっぱりだめ。appEngineSDKっていうプロパティが迫っていされてないとかいわれる。環境変数&lt;strong&gt;APPENGINE_HOME&lt;/strong&gt;を設定し、-Dオプションで&lt;strong&gt;appEngineSDK&lt;/strong&gt;を追加。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails -DappEngineSDK=$APPENGINE_HOME app-engine deploy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;・・・だめ。バージョンがおかしいとかなんとかいわれる（0.1となってちゃだめ、１〜100にしろって）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails set-version 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ grails -DappEngineSDK=$APPENGINE_HOME app-engine deploy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;・・・&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [java] 98% Will check again in 2 seconds&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [java] 99% Closing update: new version is ready to start serving.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [java] 99% Uploading index definitions.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [java] Update complete.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [java] Success.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [java] Cleaning up temporary files...&lt;br&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;・・・おお！！なんかいけたぽい！！！もしかしてもう動くんじゃね？？&lt;/p&gt;
&lt;h4&gt;アプリ実行&lt;/h4&gt;
&lt;p&gt;ほんでアプリ実行！！&lt;/p&gt;
&lt;p&gt;・・・動かない・・・やっぱり無理なのかな？&lt;/p&gt;
&lt;p&gt;こんなの出てるけど、さっぱり。&lt;/p&gt;
&lt;pre class="ae-logs-expanded ae-pre-wrap"&gt;
java.lang.NoClassDefFoundError: Could not initialize class groovy.lang.GroovySystem
 at groovy.lang.ExpandoMetaClassCreationHandle.enable(ExpandoMetaClassCreationHandle.java:74)
 at groovy.lang.ExpandoMetaClass.enableGlobally(ExpandoMetaClass.java:293)
 at org.codehaus.groovy.grails.web.context.GrailsContextLoader.createWebApplicationContext(GrailsContextLoader.java:52)
 at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
 at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
 at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:530)
 at org.mortbay.jetty.servlet.Context.startContext(Context.java:135)
 at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
 at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
 at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
 at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
 at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:190)
 at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:167)
 at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:113)
 at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
 at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4547)
 at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4545)
 at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
 at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359)
 at com.google.net.rpc.impl.Server$2.run(Server.java:792)
 at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
 at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:489)
 at com.google.net.rpc.impl.Server.startRpc(Server.java:748)
 at com.google.net.rpc.impl.Server.processRequest(Server.java:340)
 at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:422)
 at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
 at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
 at com.google.net.async.Connection.handleReadEvent(Connection.java:419)
 at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:733)
 at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207)
 at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
 at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:249)
 at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:373)
 at java.lang.Thread.run(Unknown Source)
&lt;/pre&gt;
&lt;pre class="ae-logs-expanded ae-pre-wrap"&gt;
今日はここまで。
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7271207088674417445?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7271207088674417445/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegrails_17.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7271207088674417445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7271207088674417445'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegrails_17.html' title='Google App Engineでgrails（その２）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5914313677545897820</id><published>2009-04-17T11:12:00.001+09:00</published><updated>2009-04-17T11:12:20.184+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Google App EngineでGroovletをクライアント実行するとエラー出るよね？</title><content type='html'>&lt;p&gt;&lt;a href="http://grails.jp/wiki/display/Groovy%E3%81%A7Google+App+Engine%E7%94%A8%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86"&gt;Grails.jp - GroovyでGoogle App Engine用のアプリを書こう&lt;/a&gt;を元に&lt;a href="http://www.google.co.jp/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fgroovy.codehaus.org%2FGroovlets&amp;amp;ei=4uPnSd6mMoWVkAWbnbmFBw&amp;amp;usg=AFQjCNGCXKewQe1_EdXwX9l_BaY6S3D80g&amp;amp;sig2=sJDjSTlqYK9e8XFJcjCRig"&gt;Groovy&lt;/a&gt;をAPP ENGINEにアップすると動作する。&lt;/p&gt;
&lt;p&gt;けれども、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ APPENGINE_HOME/bin/dev_appserver.sh deploy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;のようにローカル実行すると、&lt;strong&gt;Permission&lt;/strong&gt;エラーが発生する。&lt;/p&gt;
&lt;p&gt;groovy.util.ScriptException: Could not parse scriptName: /executor.groovy&lt;br&gt;
java.lang.RuntimeException: groovy.util.ScriptException: Could not parse scriptName: /executor.groovy&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.servlet.GroovyServlet$1.call(GroovyServlet.java:123)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:92)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.access$200(GroovyCategorySupport.java:60)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:202)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.servlet.GroovyServlet.service(GroovyServlet.java:128)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.jav&lt;br&gt;
a:306)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.Server.handle(Server.java:313)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)&lt;br&gt;
Caused by: groovy.util.ScriptException: Could not parse scriptName: /executor.groovy&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.util.GroovyScriptEngine.updateCacheEntry(GroovyScriptEngine.java:335)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.util.GroovyScriptEngine.createScript(GroovyScriptEngine.java:415)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:402)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.servlet.GroovyServlet$1.call(GroovyServlet.java:119)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... 26 more&lt;br&gt;
Caused by: java.security.AccessControlException: access denied (groovy.security.GroovyCodeSourcePermission /groovy/script)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at java.security.AccessController.checkPermission(AccessController.java:546)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:76)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.lang.GroovyCodeSource.&amp;lt;init&amp;gt;(GroovyCodeSource.java:79)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.lang.GroovyClassLoader$2.run(GroovyClassLoader.java:241)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at java.security.AccessController.doPrivileged(Native Method)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:239)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at groovy.util.GroovyScriptEngine.updateCacheEntry(GroovyScriptEngine.java:333)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ... 29 more&lt;/p&gt;
&lt;p&gt;原因わからず。&lt;/p&gt;
&lt;p&gt;policyファイル触ったりしないといけないのかな？他の方の環境では問題が起きていないのだろうか？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5914313677545897820?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5914313677545897820/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegroovlet.html#comment-form' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5914313677545897820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5914313677545897820'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegroovlet.html' title='Google App EngineでGroovletをクライアント実行するとエラー出るよね？'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3804022376899737452</id><published>2009-04-17T10:17:00.001+09:00</published><updated>2009-04-17T11:02:31.383+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Google App Engineでgrails（その１）</title><content type='html'>&lt;p&gt;&lt;strong&gt;Google App Engine&lt;/strong&gt;でgrailsが使えるようになったらしいので、早速試してみる。&lt;/p&gt;
&lt;p&gt;（といっても、&lt;a href="http://www.grails.org/plugin/app-engine#comment_158"&gt;grails1.1.1から保障っぽいことが書かれている&lt;/a&gt;ので、なんとなく触って手触りを。&lt;/p&gt;
&lt;h4&gt;入手方法&lt;/h4&gt;
&lt;p&gt;以下のサイトに&lt;strong&gt;Download&lt;/strong&gt;のリンクがあるのでそこから&lt;strong&gt;grails-app-engine-0.4.zip&lt;/strong&gt;をダウンロードする。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.grails.org/plugin/app-engine"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;サンプルアプリ作成&lt;/h4&gt;
&lt;p&gt;適当なフォルダで&lt;/p&gt;
&lt;p&gt;$ grails create-app test-app&lt;/p&gt;
&lt;p&gt;$ cd test-app&lt;/p&gt;
&lt;p&gt;$ grails install-plugin &amp;lt;DOWNLOAD_DIR&amp;gt;/grails-app-engine-0.4.zip&lt;/p&gt;
&lt;p&gt;・・・なんだかエラーが発生した。&lt;/p&gt;
&lt;p&gt;どうやら&lt;strong&gt;grails&lt;/strong&gt;のバージョンが1.0.3なのが原因みたい。&lt;/p&gt;
&lt;p&gt;grails1.1以上で動かさないといけないらしいので、最新grailsをダウンロードしてインストール。&lt;/p&gt;
&lt;p&gt;今度はうまくいったぽい。&lt;/p&gt;
&lt;p&gt;Installed JDO config to est-app/grails-app/conf&lt;br&gt;
Plugin app-engine-0.4 installed&lt;br&gt;
Plug-in provides the following new scripts:&lt;br&gt;
------------------------------------------&lt;br&gt;
grails app-engine&lt;br&gt;
Found events script in plugin app-engine&lt;br&gt;
No Google AppEngine SDK specified. Either set APPENGINE_HOME in your environment or specify google.appengine.sdk in your&lt;br&gt;
&amp;nbsp;grails-app/conf/BuildConfig.groovy file&lt;/p&gt;
&lt;h4&gt;設定&lt;/h4&gt;
&lt;p&gt;いわれたとおり、&lt;strong&gt;grails-app/conf/BuildConfig.groovy file&lt;/strong&gt;にapp-engine-sdkのﾊﾟｽを設定。&lt;/p&gt;
&lt;p&gt;てか、そんなファイルはできていなかったのでファイル作成してから。&lt;/p&gt;
&lt;p&gt;$ touch grails-app/conf/BuildConfig.groovy file&lt;/p&gt;
&lt;p&gt;以下の記述を追記。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;google.appengine.sdk=&amp;quot;C:/appengine-java-sdk&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;実行&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;grails war&lt;/strong&gt;を実行すると適当な&lt;strong&gt;appengine-web.xml&lt;/strong&gt;作られるよ、と書いているので実行してみる。&lt;/p&gt;
&lt;p&gt;※当然この時点では&lt;strong&gt;*.war&lt;/strong&gt;は存在しない。&lt;/p&gt;
&lt;p&gt;実行後、&lt;strong&gt;test-app-0.1.war&lt;/strong&gt;ができたので、こいつをunzipしてみる。&lt;/p&gt;
&lt;p&gt;$ unzip test-app-0.1.war&lt;/p&gt;
&lt;p&gt;展開されたフォルダのWEB-INFを除いてみると・・・お！！！&lt;strong&gt;appengine-web.xml&lt;/strong&gt;できてる！！&lt;/p&gt;
&lt;p&gt;えらいかわいらしい内容だけど。&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br&gt;
&amp;lt;appengine-web-app xmlns=&amp;quot;http://appengine.google.com/ns/1.0&amp;quot;&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;application&amp;gt;test-app&amp;lt;/application&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;0.1&amp;lt;/version&amp;gt;&lt;br&gt;
&amp;lt;/appengine-web-app&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;classes&lt;/strong&gt;フォルダの下に&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;datastore-indexes.xml&lt;/li&gt;
 &lt;li&gt;jdoconfig.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;も作ってくれていて、結構いい感じ。&lt;/p&gt;
&lt;p&gt;ほんとにapp engineで動作しないのか試してみたいけど、それは週末ゆっくりやる。&lt;/p&gt;
&lt;p&gt;domainクラス作ってみるのはまた後で。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3804022376899737452?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3804022376899737452/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegrails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3804022376899737452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3804022376899737452'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/google-app-enginegrails.html' title='Google App Engineでgrails（その１）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5948769685417658873</id><published>2009-04-15T23:07:00.004+09:00</published><updated>2009-04-15T23:11:46.694+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grailsのプロジェクト、かなり増えたなぁ</title><content type='html'>&lt;p&gt;grailsの勉強にと&lt;strong&gt;google code&lt;/strong&gt;でプロジェクト探していたときのこと。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/hosting/search?q=grails&amp;amp;projectsearch=Search+projects"&gt;検索結果&lt;/a&gt;が173件になっていた。&lt;/p&gt;
&lt;p&gt;数ヶ月前まで数十件ぐらいだったような気がします。&lt;/p&gt;
&lt;p&gt;なんだか一気に増えた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5948769685417658873?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5948769685417658873/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/grails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5948769685417658873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5948769685417658873'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/grails.html' title='Grailsのプロジェクト、かなり増えたなぁ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1019978427491287664</id><published>2009-04-06T06:09:00.003+09:00</published><updated>2009-04-06T06:21:35.541+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Blogger Syntax Highliterがgroovyに対応してるらしい</title><content type='html'>&lt;p&gt;hatenaを利用してブログをかかれている人が多いですが、僕のブログではbloggerを利用しています。&lt;/p&gt;
&lt;p&gt;理由は得にないのですが。gmail、google readerを使っているので、そのあたりの連動に期待して使い始めたといったところでしょうか。&lt;/p&gt;
&lt;p&gt;コードを掲載するのに、bloggerの&lt;strong&gt;syntax highlighte&lt;/strong&gt;というプラグインを利用しています。（grailsのプラグインにもありますね）今までこれをjavaのコードとして掲載していましたが、groovyに対応したということで試してみました。といってもjavaとgroovyでそれほどコードに違いがないため、どこがかわったのかわかりませんが。&lt;/p&gt;
&lt;h4&gt;java版&lt;/h4&gt;
&lt;pre language="java" name="code"&gt;
class Greet {
  def name
  Greet(who) { name = who[0].toUpperCase() + who[1..-1] }
  def salute() { println &amp;quot;Hello $name!&amp;quot; }
}

g = new Greet('world') // オブジェクトを作成
g.salute() // &amp;quot;Hello World!&amp;quot; をアウトプット
&lt;/pre&gt;
&lt;h4&gt;groovy版&lt;/h4&gt;
&lt;pre language="groovy" name="code"&gt;
class Greet {
  def name
  Greet(who) { name = who[0].toUpperCase() + who[1..-1] }
  def salute() { println &amp;quot;Hello $name!&amp;quot; }
}

g = new Greet('world') // オブジェクトを作成
g.salute() // &amp;quot;Hello World!&amp;quot; をアウトプット
&lt;/pre&gt;
&lt;p&gt;・・・対応してないし・・・&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1019978427491287664?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1019978427491287664/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/hatenablogger-gmailgoogle-reader.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1019978427491287664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1019978427491287664'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/hatenablogger-gmailgoogle-reader.html' title='Blogger Syntax Highliterがgroovyに対応してるらしい'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1166992575526944533</id><published>2009-04-03T07:10:00.001+09:00</published><updated>2009-04-03T07:10:35.371+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>grails-morph-plugin久々に修正</title><content type='html'>&lt;p&gt;grails-morph-plugin久々に修正。&lt;/p&gt;
&lt;p&gt;morphにwarファイルアップするときには、もうパスワードは不要になってるんですね。サイトから&lt;strong&gt;morph_deploy.properties&lt;/strong&gt;をダウンロードすると、そこにキー情報がかかれているのでパスワード不要になっているみたい。&lt;/p&gt;
&lt;p&gt;以前はアップロードの際にユーザーID、パスワードを入力しなければならなかったと思ったけれど。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;grails-morph-plugin入れる&lt;/li&gt;
 &lt;li&gt;grails war-and-deploy-morph実行&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;だけでアップロードできた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1166992575526944533?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1166992575526944533/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/grails-morph-plugin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1166992575526944533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1166992575526944533'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/04/grails-morph-plugin.html' title='grails-morph-plugin久々に修正'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6912545207396214295</id><published>2009-03-30T22:20:00.001+09:00</published><updated>2009-03-30T22:20:46.426+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>緩くてすみません</title><content type='html'>&lt;p&gt;今日のエントリは緩くてすみません。&lt;/p&gt;
&lt;p&gt;3月いっぱいで堂島での作業が終了、チームメンバーで飲んできました。&lt;/p&gt;
&lt;p&gt;口下手な自分ですが飲むとそこそこ話できます。お酒は好きだし強いので。楽しかったー。&lt;/p&gt;
&lt;p&gt;今日は調べ物＋エントリはまともにできなさそうなので寝ます。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6912545207396214295?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6912545207396214295/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_3820.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6912545207396214295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6912545207396214295'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_3820.html' title='緩くてすみません'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1769253784273360295</id><published>2009-03-30T13:32:00.000+09:00</published><updated>2009-03-30T13:32:57.273+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>頼む！ブランチを分けて開発して</title><content type='html'>&lt;p&gt;2月に対応した内容を4月にリリースすることになったのだが、どうやら同じシステムの5月リリース機能、6月リリース機能を&lt;strong&gt;trunk&lt;/strong&gt;に対してコミットしながらプロジェクトが進行しているらしい。&lt;/p&gt;
&lt;p&gt;僕に「5月、6月リリース分は除外したリソースでjarパッケージつくってね♪」と指示が来たので、「ブランチ分かれていますよね？」と聞くと、「今回は（今回だけじゃないんじゃね？？）一緒だよ♪」&lt;/p&gt;
&lt;p&gt;これは・・・予想外に面倒だ。&lt;/p&gt;
&lt;p&gt;subversionもっと勉強しておくんだった・・・地道にいちリビジョンごと見ていくしかないのか。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1769253784273360295?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1769253784273360295/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_30.html#comment-form' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1769253784273360295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1769253784273360295'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_30.html' title='頼む！ブランチを分けて開発して'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4373452552935816753</id><published>2009-03-29T21:27:00.000+09:00</published><updated>2009-03-29T21:27:09.416+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovy-twitter使ってみる</title><content type='html'>&lt;p&gt;遅ればせながらtwitter始めたので、twitterをgroovyで使うためのライブラリを探してみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/groovy-twitter/"&gt;groovy-twitter - Google Code&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;svnからチェックアウト&lt;/li&gt;
 &lt;li&gt;コンソールからプロジェクトルートで&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;gant package&lt;/strong&gt;&lt;/span&gt;と打ち込む&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;でjarファイル完成、のはずがどうもうまくいかず、ちょっとだけソース直した。以下&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;svn diff&lt;/strong&gt;&lt;/span&gt;コマンドで出力したかんたんなパッチ。&lt;/p&gt;
&lt;pre style="font-style: italic;"&gt;

属性に変更があったパス: .
___________________________________________________________________
追加: svn:ignore
   + build


Index: src/main/groovy/groovyx/twitter/TwitterException.groovy
===================================================================
--- src/main/groovy/groovyx/twitter/TwitterException.groovy (リビジョン 0)
+++ src/main/groovy/groovyx/twitter/TwitterException.groovy (リビジョン 0)
@@ -0,0 +1,7 @@
+package groovyx.twitter
+
+class TwitterException extends Exception {
+    TwitterException( params ){
+        super(params)
+    }
+}
Index: build.gant
===================================================================
--- build.gant (リビジョン 32)
+++ build.gant (作業コピー)
@@ -2,6 +2,7 @@
 buildDirectory = 'build'
 distDirectory = 'dist'
 groovyTwitterVersion = '0.1'
+jarfile = distDirectory + &amp;quot;/groovy-twitter-${groovyTwitterVersion}.jar&amp;quot;
 
 includeTargets &amp;lt;&amp;lt; gant.targets.Clean
 cleanPattern &amp;lt;&amp;lt; '**/*~'
@@ -28,7 +29,16 @@
   ant.mkdir(dir:distDirectory)
   depends(compile)
   makeManifest()
-  jar(destfile:distDirectory + &amp;quot;/groovy-twitter-${groovyTwitterVersion}.jar&amp;quot;, basedir:buildDirectory, manifest:buildDirectory+'/MANIFEST.MF')
+  jar(destfile:jarfile, basedir:buildDirectory, manifest:buildDirectory+'/MANIFEST.MF')
 }
 
+target('update':'update to $USER_HOME/.goory/lib') {
+  ant.delete(dir:buildDirectory)
+  depends(&amp;quot;package&amp;quot;)
+  ant.copy(
+    todir:System.properties[&amp;quot;user.home&amp;quot;] + &amp;quot;/.groovy/lib&amp;quot;,
+    file:jarfile,
+  )
+}
+
 setDefaultTarget (compile)
&lt;/pre&gt;
&lt;p&gt;クラスファイルの不足以外にも&lt;strong&gt;build.gant&lt;/strong&gt;に少し手を加えた。&lt;strong&gt;gant update&lt;/strong&gt;って打ち込んだら、クラスパス通さなくてもgroovyで使えるようになる。&lt;/p&gt;
&lt;p&gt;しばらくこれで遊んでみたい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4373452552935816753?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4373452552935816753/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy-twitter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4373452552935816753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4373452552935816753'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy-twitter.html' title='groovy-twitter使ってみる'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7318928264317194409</id><published>2009-03-29T14:20:00.000+09:00</published><updated>2009-03-29T14:20:36.241+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>ライブラリ化したクラス拡張コードを呼び出すスマートな方法は？</title><content type='html'>&lt;p&gt;metaClassを使用してクラスを拡張する場合、拡張処理をどんな風に一元管理しようかいつも迷う。&lt;/p&gt;
&lt;p&gt;いつもやっている方法は以下のとおり。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;Extention.classというクラスを作成&lt;/li&gt;
 &lt;li&gt;拡張処理を記述&lt;/li&gt;
 &lt;li&gt;利用したいコードの先頭で拡張処理の呼び出し。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体的に例を。&lt;/p&gt;
&lt;h4&gt;Extention.groovy&lt;/h4&gt;
&lt;pre name="code" language="java"&gt;
String.metaClass.define{
    toFile{
        def file = new File(delegate)
        file?.exists()?file:null
    }
}
&lt;/pre&gt;
&lt;h4&gt;Test.groovy&lt;/h4&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import Extention

Extention.main()

println "/home/genzou".toFile().parent
println "/home/dummy".toFile()
&lt;/pre&gt;
&lt;p&gt;呼び出したい拡張処理を記述したクラスのmainメソッドを呼び出す。&lt;/p&gt;
&lt;p&gt;使用する側のコードをもうちょっと短くするなら、以下のとおり。&lt;/p&gt;
&lt;h4&gt;Extention.groovy&lt;/h4&gt;
&lt;pre name="code" language="java"&gt;
class Extention{
    static{
        String.metaClass.define{
            toFile{
                def file = new File(delegate)
                file?.exists()?file:null
            }
        }
    }
}
&lt;/pre&gt;
&lt;h4&gt;Test.groovy&lt;/h4&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import Extention

Extention
// Class.forName("Extention") でも同じ

println "/home/genzou".toFile().parent
println "/home/dummy".toFile()
&lt;/pre&gt;
&lt;p&gt;ほんのちょっとしか変わらないけど。いきなりクラス名を記述されてもなにがなんだかっていうのもある。&lt;/p&gt;
&lt;p&gt;ライブラリ化した拡張を使用する場合にはどんなやり方がスマートなんだろう？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7318928264317194409?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7318928264317194409/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_29.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7318928264317194409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7318928264317194409'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_29.html' title='ライブラリ化したクラス拡張コードを呼び出すスマートな方法は？'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3767595832414364788</id><published>2009-03-27T23:20:00.002+09:00</published><updated>2009-03-28T00:13:33.962+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovy1.6のdefineメソッドについて</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uokumura/mobile?date=20090115"&gt;metaClass.defineが凄い！&lt;/a&gt;より。&lt;/p&gt;
&lt;p&gt;Groovy1.6から、&lt;strong&gt;metaClass.define&lt;/strong&gt;という記述で、既存クラスにメソッドを追加出きるそうです。試しにjavaでは継承不可能なStringクラスにメソッドを追加してみる。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
String.metaClass.define{
    toFile{
        new File(delegate)
    }
    
    half{
        def end = Math.round(delegate.size()/ 2) - 1
        delegate[0..end]
    }
}

def path = &amp;quot;/home/genzou&amp;quot;
println path.toFile()
println path.half()

def path2 = &amp;quot;home_genzou_bin&amp;quot;
path2.metaClass.define{
    camelize{
        delegate.toLowerCase().replaceAll(&amp;quot;_[^_]&amp;quot;){ it[1].toUpperCase() }
    }
}
println path2.half()
println path2.camelize()
// これはエラー
// println path.camelize()
&lt;/pre&gt;
&lt;ul&gt;
 &lt;li&gt;クラス.metaClassに対して指定したメソッド（クロージャ？）は当然すべてのインスタンスに適用された。&lt;/li&gt;
 &lt;li&gt;インスタンス.metaClassに対して指定したメソッド（クロージャ？）は、そのインスタンスにしか適用されない。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;確かにこれは定義がしやすい。通常のclass定義の構造によく似ている。&lt;/p&gt;
&lt;p&gt;define内で定義するメソッドに引数が必要な場合には、以下のように定義する。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
File.metaClass.define{
    // メソッドのように定義
    searchExt( ext ){
        delegate.listFiles().findAll{
            it.name =~ /^.+\.${ext}$/
        }    
    }
    // クロージャのように定義
    searchName{ name -&amp;gt;
        delegate.listFiles().findAll{
            it.name == name
        }    
    }
}

new File(&amp;quot;/home/genzou&amp;quot;).searchExt(&amp;quot;groovy&amp;quot;).each{
    println it
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3767595832414364788?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3767595832414364788/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy16define.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3767595832414364788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3767595832414364788'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy16define.html' title='groovy1.6のdefineメソッドについて'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5675482988563999306</id><published>2009-03-27T23:17:00.000+09:00</published><updated>2009-03-27T23:17:31.141+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>正の整数mの4乗を5倍したものの下2桁として現れる数をすべて求めよ</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uokumura/mobile?date=20090211&amp;amp;section=1234368887"&gt;正の整数mの4乗を5倍したものの下2桁として現れる数をすべて求めよ&lt;/a&gt;というエントリがあったので、といてみた。&lt;/p&gt;
&lt;p&gt;と言っても掲載されている内容とほとんど同じだけど。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
(0..10).collect{ it**4*5%100 }.unique()
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5675482988563999306?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5675482988563999306/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/m452.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5675482988563999306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5675482988563999306'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/m452.html' title='正の整数mの4乗を5倍したものの下2桁として現れる数をすべて求めよ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1275865260849196017</id><published>2009-03-27T07:38:00.000+09:00</published><updated>2009-03-27T07:38:07.233+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>今更ながらtwitter</title><content type='html'>&lt;p&gt;今更ながらtwitter始めました。&lt;/p&gt;
&lt;p&gt;どんな風に活用したらいいのかさっぱりですが、食わず嫌いしていたので・・・。&lt;/p&gt;
&lt;p&gt;ついでに&lt;a href="http://yusuke.homeip.net/twitter4j/ja/index.html"&gt;Twitter4J&lt;/a&gt;というライブラリを使用してjavaからtwitterにアクセス可能ということで試してみた。&lt;/p&gt;
&lt;p&gt;多少変えたら動くけどまたjEditマクロにしちゃった。開いているテキスト（選択されていれば選択されている部分）の内容をまるごと送信します。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import static javax.swing.JOptionPane.*
import twitter4j.*         

def username = "てきとうに"
def password = "へんこうしてね"

def text = textArea.selectedText?:textArea.text
def message = """\
以下の文言で状態を更新します。
よろしいですか？
-----------------------------------------
${text}
"""

if( showConfirmDialog( view, message) != YES_OPTION )
    return

def twitter = new Twitter(username, password)
def status = twitter.update(textArea.text)
showMessageDialog( view, "登録が完了しました。" )
&lt;/pre&gt;
&lt;p&gt;さっき間違えてパスワード送信してしまった・・・&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1275865260849196017?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1275865260849196017/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/twitter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1275865260849196017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1275865260849196017'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/twitter.html' title='今更ながらtwitter'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6475707904120107625</id><published>2009-03-26T13:07:00.000+09:00</published><updated>2009-03-26T13:07:40.359+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovyで文字列をCamel形式、Pascal形式に変換（二番煎じ）</title><content type='html'>&lt;p&gt;以下のエントリを見つけて、自分でも書いてみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/r_ikeda/20090319/camelize"&gt;Groovy で文字列を Camel 形式、Pascal 形式に変換する - 集中力なら売り切れたよ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/r_ikeda/20090325/java"&gt;Java で書いても大して行数変わらなかった - 集中力なら売り切れたよ&lt;/a&gt;&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def camelize(text){
    text.toLowerCase().replaceAll(&amp;quot;_[^_]&amp;quot;){ it[1].toUpperCase() }
}
def pascalize(text){
    camelize(text).replaceAll(/^./){ it.toUpperCase() }
}

println camelize(&amp;quot;RESIDENT_EVIL_5&amp;quot;)
println pascalize(&amp;quot;RESIDENT_EVIL_5&amp;quot;)
&lt;/pre&gt;
&lt;p&gt;正規表現使いすぎかな？結構シンプルになった気がする。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6475707904120107625?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6475707904120107625/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovycamelpascal.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6475707904120107625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6475707904120107625'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovycamelpascal.html' title='Groovyで文字列をCamel形式、Pascal形式に変換（二番煎じ）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7285620386508715604</id><published>2009-03-23T17:25:00.000+09:00</published><updated>2009-03-23T17:25:23.455+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyで、ソースを整形してみる。</title><content type='html'>&lt;p&gt;またまた&lt;a href="http://www.google.co.jp/search?q=jedit"&gt;jEdit&lt;/a&gt;ネタで。結構便利なのではないかと思ったので。&lt;/p&gt;
&lt;p&gt;groovyのソースコードフォーマットマクロを作ってみた。といってもエディタの先頭行から末尾行まで以下の処理を繰り返すだけ。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;行の末尾に移動&lt;/li&gt;
 &lt;li&gt;改行を削除&lt;/li&gt;
 &lt;li&gt;改行をはさむ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;改行するとエディタが自動インデントしてくれるので、結果整形されます。&lt;/p&gt;
&lt;p&gt;もちろん&lt;a href="http://www.google.co.jp/search?q=jedit"&gt;jEdit&lt;/a&gt;のインデント機能が完全であるわけではないので制限はあるのですが、かなりきれいになります。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
textArea.with{
    goToBufferStart(false)
    (getText().readLines().size() - 1).times{
        goToEndOfWhiteSpace(false)
        delete()
        insertEnterAndIndent()
    }
}
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;もちろん、事前に&lt;/em&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/03/jeditgroovy_04.html"&gt;&lt;em&gt;ゲンゾウ用ポストイット: jEditエディタマクロをgroovyで組むための設定&lt;/em&gt;&lt;/a&gt;&lt;em&gt;の設定が必要です。&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7285620386508715604?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7285620386508715604/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy_23.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7285620386508715604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7285620386508715604'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy_23.html' title='groovyで、ソースを整形してみる。'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3774878588715096738</id><published>2009-03-23T10:45:00.001+09:00</published><updated>2009-03-23T11:08:23.307+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyでjEditマクロを組む際のjEditクラス取得方法</title><content type='html'>&lt;p&gt;groovyを使用してjEditマクロを組む際に悩んでしまった箇所があったのでメモ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;組み込み型のクラス&lt;/strong&gt;（java.lang.Dateなど）は&lt;/p&gt;
&lt;p&gt;java.lang.Date.parse(...)&lt;/p&gt;
&lt;p&gt;のようにstaticメソッドを呼び出し可能だが、&lt;/p&gt;
&lt;p&gt;外部ライブラリのクラス（org.gjt.sp.jedit.jEditなど）は&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
org.gjt.sp.jedit.jEdit.newFile(...)
&lt;/pre&gt;
&lt;p&gt;のようにstaticメソッドを呼び出そうとしてエラーとなってしまう。ただし、jEditのマクロとして呼び出さず、コマンドラインから通常通り呼び出す場合にはエラーとならない。&lt;/p&gt;
&lt;p&gt;jEditマクロをgroovyで記述する際には、以下のように指定してstaticメソッドを呼び出さなければいけないみたい。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
Class.forName(&amp;quot;org.gjt.sp.jedit.jEdit&amp;quot;).newFile(...)
&lt;/pre&gt;
&lt;p&gt;jEditのbshマクロで、新しいバッファを作成する処理として&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
jEdit.newFile(view)
&lt;/pre&gt;
&lt;p&gt;という記述がされていたが、groovyではこの命令は以下のようになる。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
Class.forName(&amp;quot;org.gjt.sp.jedit.jEdit&amp;quot;).newFile(view)
&lt;/pre&gt;
&lt;p&gt;
説明がわかりにくいかも。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3774878588715096738?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3774878588715096738/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovyjeditjedit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3774878588715096738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3774878588715096738'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovyjeditjedit.html' title='groovyでjEditマクロを組む際のjEditクラス取得方法'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7963221256637426163</id><published>2009-03-19T23:47:00.000+09:00</published><updated>2009-03-19T23:47:11.752+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>griffonにはテンプレートのviewを作る機能はないのね</title><content type='html'>&lt;p&gt;&lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;と&lt;a href="http://groovy.codehaus.org/Griffon"&gt;Griffon&lt;/a&gt;はよくにた作りになっているけれども、やっぱり違う。&lt;/p&gt;
&lt;p&gt;一番違いを感じるのが&lt;strong&gt;MVC&lt;/strong&gt;のセットを作成したとき。&lt;/p&gt;
&lt;p&gt;Grailsは&lt;strong&gt;Model&lt;/strong&gt;（Domainクラス）作成後に雛形としての&lt;strong&gt;View&lt;/strong&gt;、&lt;strong&gt;Controller&lt;/strong&gt;を作成してくれる。&lt;/p&gt;
&lt;p&gt;Griffonは&lt;strong&gt;Model&lt;/strong&gt;、&lt;strong&gt;View&lt;/strong&gt;、&lt;strong&gt;Controller&lt;/strong&gt;いずれも空っぽのソースのみが作られ、後はどうぞっていうスタンス。&lt;/p&gt;
&lt;p&gt;もっとも、「Griffon 0.1.0」でプロジェクト作成すればControllerには&lt;strong&gt;mvcGroupInit&lt;/strong&gt;っていうクロージャのみが作成されているけど。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt;がとっつきやすかった点の一つにこの雛形の作成があって、雛形を眺めているだけでGrailsでアプリを作る際にどんな風に作ったらいいかが見えてきていた。&lt;strong&gt;Griffon&lt;/strong&gt;にもこの点があったらいいのに。まだ&lt;strong&gt;Griffon&lt;/strong&gt;は雛形を作れるほどの標準的な作成方法が確立されていない？それともクライアントアプリは千差万別だからかな？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7963221256637426163?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7963221256637426163/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/griffonview.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7963221256637426163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7963221256637426163'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/griffonview.html' title='griffonにはテンプレートのviewを作る機能はないのね'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2289228036877931366</id><published>2009-03-19T23:35:00.001+09:00</published><updated>2009-03-19T23:35:57.944+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyで画像処理</title><content type='html'>&lt;p&gt;うちの嫁が&lt;strong&gt;料理＋懸賞ブログ&lt;/strong&gt;を書いている。&lt;/p&gt;
&lt;p&gt;いずれも携帯カメラで撮影した画像をアップしているのだが、&lt;span style="color: rgb(255, 153, 0);"&gt;&lt;strong&gt;毎回編集ソフトを起動し、その画像に書名（ニックネーム）を入力&lt;/strong&gt;&lt;/span&gt;している。&lt;/p&gt;
&lt;p&gt;意外と手間そうなので、groovyでスクリプト化しようとおもってGoogle先生に尋ねるとぴったりのサイトが。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kyle-in-jp.blogspot.com/"&gt;画像処理についてあれこれ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;このサイトすごい。groovyでいろんな画像処理を行ってみています。サンプルソースも短くて見やすい。&lt;/p&gt;
&lt;p&gt;早速これを利用してスクリプト組んであげよう♪&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2289228036877931366?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kyle-in-jp.blogspot.com/' title='groovyで画像処理'/><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2289228036877931366/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy_19.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2289228036877931366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2289228036877931366'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy_19.html' title='groovyで画像処理'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7409590446860824684</id><published>2009-03-19T09:50:00.000+09:00</published><updated>2009-03-19T09:51:26.682+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>花粉症に効く（んだとおもう）飲み物</title><content type='html'>&lt;p style="margin-top: 0"&gt;
      &amp;#20693;&amp;#12399;&amp;#33457;&amp;#31881;&amp;#30151;&amp;#12384;&amp;#12364;&amp;#12289;&amp;#20170;&amp;#24180;&amp;#12399;&amp;#27604;&amp;#36611;&amp;#30340;&amp;#12414;&amp;#12375;&amp;#12290;&amp;#29702;&amp;#30001;&amp;#12395;&amp;#24515;&amp;#24403;&amp;#12383;&amp;#12426;&amp;#12399;&amp;#12354;&amp;#12427;&amp;#12290;
    &lt;/p&gt;
    &lt;p style="margin-top: 0"&gt;
      &amp;#12354;&amp;#12427;&amp;#26085;&amp;#20181;&amp;#20107;&amp;#12363;&amp;#12425;&amp;#24112;&amp;#12427;&amp;#12392;&amp;#12289;&amp;#23233;&amp;#12364;&amp;#12358;&amp;#12428;&amp;#12375;&amp;#12381;&amp;#12358;&amp;#12395;&amp;#35441;&amp;#12375;&amp;#12390;&amp;#12367;&amp;#12428;&amp;#12383;&amp;#12290;&amp;#25080;&amp;#36062;&amp;#12469;&amp;#12452;&amp;#12488;&amp;#12395;&amp;#24540;&amp;#21215;&amp;#12375;&amp;#12383;&amp;#12392;&amp;#12371;&amp;#12429;&amp;#12289;&amp;#12354;&amp;#12387;&amp;#12383;&amp;#12392;&amp;#12398;&amp;#12371;&amp;#12392;&amp;#12391;&amp;#12509;&amp;#12531;&amp;#37218;&amp;#12398;&amp;#29942;&amp;#12398;&amp;#12424;&amp;#12358;&amp;#12394;&amp;#12418;&amp;#12398;&amp;#12434;&amp;#35211;&amp;#12379;&amp;#12390;&amp;#12367;&amp;#12428;&amp;#12383;&amp;#12290;
    &lt;/p&gt;
    &lt;p style="margin-top: 0"&gt;
      &amp;#12381;&amp;#12428;&amp;#12399;&amp;#12300;&lt;b&gt;&amp;#12376;&amp;#12419;&amp;#12400;&amp;#12425;&lt;/b&gt;&amp;#12301;&amp;#12392;&amp;#12356;&amp;#12358;&amp;#12418;&amp;#12398;&amp;#12391;&amp;#12289;&amp;#20309;&amp;#12391;&amp;#12418;&amp;#33457;&amp;#31881;&amp;#30151;&amp;#12395;&amp;#21177;&amp;#12367;&amp;#12425;&amp;#12375;&amp;#12356;&amp;#12398;&amp;#12391;&amp;#20474;&amp;#12398;&amp;#12383;&amp;#12417;&amp;#12395;&amp;#24540;&amp;#21215;&amp;#12375;&amp;#12390;&amp;#12367;&amp;#12428;&amp;#12383;&amp;#12381;&amp;#12358;&amp;#12384;&amp;#12290;&amp;#20693;&amp;#12399;&amp;#33457;&amp;#31881;&amp;#30151;&amp;#12395;&amp;#12365;&amp;#12367;&amp;#12289;&amp;#12394;&amp;#12435;&amp;#12390;&amp;#12418;&amp;#12398;&amp;#12399;&amp;#20449;&amp;#12376;&amp;#12390;&amp;#12356;&amp;#12394;&amp;#12356;&amp;#12364;&amp;#12379;&amp;#12387;&amp;#12363;&amp;#12367;&amp;#23233;&amp;#12364;&amp;#25163;&amp;#12395;&amp;#20837;&amp;#12428;&amp;#12390;&amp;#12367;&amp;#12428;&amp;#12383;&amp;#12418;&amp;#12398;&amp;#12394;&amp;#12398;&amp;#12391;&amp;#12381;&amp;#12428;&amp;#12434;&amp;#39154;&amp;#12415;&amp;#32154;&amp;#12369;&amp;#12383;&amp;#12290;
    &lt;/p&gt;
    &lt;p style="margin-top: 0"&gt;
      &amp;#20170;&amp;#26085;&amp;#12391;&amp;#12385;&amp;#12423;&amp;#12358;&amp;#12393;&amp;#19968;&amp;#12534;&amp;#26376;&amp;#12368;&amp;#12425;&amp;#12356;&amp;#12363;&amp;#12394;&amp;#65311;&amp;#27671;&amp;#12364;&amp;#12388;&amp;#12367;&amp;#12392;&amp;#32887;&amp;#22580;&amp;#12398;&amp;#33457;&amp;#31881;&amp;#30151;&amp;#12398;&amp;#12363;&amp;#12383;&amp;#12364;&amp;#12383;&amp;#12364;&amp;#33510;&amp;#12375;&amp;#12381;&amp;#12358;&amp;#12395;&amp;#12375;&amp;#12390;&amp;#12356;&amp;#12427;&amp;#12395;&amp;#12418;&amp;#12363;&amp;#12363;&amp;#12431;&amp;#12425;&amp;#12378;&amp;#12289;&amp;#20693;&amp;#12399;&amp;#12408;&amp;#12356;&amp;#12365;&amp;#12290;&amp;#27491;&amp;#30452;&amp;#33457;&amp;#31881;&amp;#30151;&amp;#12398;&amp;#23395;&amp;#31680;&amp;#32066;&amp;#12431;&amp;#12387;&amp;#12383;&amp;#12435;&amp;#12376;&amp;#12419;&amp;#12394;&amp;#12356;&amp;#12363;&amp;#12368;&amp;#12425;&amp;#12356;&amp;#12395;&amp;#29983;&amp;#27963;&amp;#12375;&amp;#12390;&amp;#12356;&amp;#12383;&amp;#12398;&amp;#12391;&amp;#12289;&amp;#27671;&amp;#12364;&amp;#12388;&amp;#12363;&amp;#12394;&amp;#12363;&amp;#12387;&amp;#12383;&amp;#12290;
    &lt;/p&gt;
    &lt;p style="margin-top: 0"&gt;
      &amp;#12358;&amp;#12381;&amp;#12398;&amp;#12424;&amp;#12358;&amp;#12384;&amp;#12364;&amp;#26412;&amp;#24403;&amp;#12398;&amp;#35441;&amp;#12290;&amp;#12411;&amp;#12435;&amp;#12392;&amp;#12358;&amp;#12395;&amp;#12300;&lt;b&gt;&amp;#12376;&amp;#12419;&amp;#12400;&amp;#12425;&lt;/b&gt;&amp;#12301;&amp;#12364;&amp;#21177;&amp;#12356;&amp;#12383;&amp;#12398;&amp;#12363;&amp;#12399;&amp;#12431;&amp;#12363;&amp;#12425;&amp;#12394;&amp;#12356;&amp;#12369;&amp;#12393;&amp;#12397;&amp;#12290;
    &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7409590446860824684?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7409590446860824684/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_19.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7409590446860824684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7409590446860824684'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_19.html' title='花粉症に効く（んだとおもう）飲み物'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8342896385161986170</id><published>2009-03-17T06:48:00.000+09:00</published><updated>2009-03-17T06:55:22.903+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>ファイル一括置換アプリ改訂２</title><content type='html'>&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/03/miglayout.html"&gt;ゲンゾウ用ポストイット: ファイル一括置換アプリ改訂　＋　MigLayoutライブラリ使ってみた&lt;/a&gt;からもう少し修正。&lt;/p&gt;
&lt;div style="padding-left: 30px;"&gt;&lt;em&gt;プログラムは&lt;/em&gt;&lt;a href="http://griffon-replacer.googlecode.com/files/application.jnlp" mce_href="http://griffon-replacer.googlecode.com/files/application.jnlp"&gt;&lt;em&gt;こちら&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="padding-left: 30px;"&gt;&lt;em&gt; ソースは&lt;/em&gt;&lt;a href="http://code.google.com/p/griffon-replacer/" mce_href="http://code.google.com/p/griffon-replacer/"&gt;&lt;em&gt;こちら&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;追加機能は以下のとおり。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;正規表現による置換文字列の指定が可能&lt;/li&gt;
 &lt;li&gt;置換条件を保存しておくことが可能（次回起動時に保存された状態で起動）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;入社してからもっぱらServletばかりだったので、&lt;strong&gt;Swing&lt;/strong&gt;の知識がかなり不足。&lt;/p&gt;
&lt;p&gt;仕事で使うことはすくないけど、本腰入れて勉強してみようかな。jEditやGriffonのアプリ使ってても、Swingアプリにそれほど動作の遅さを感じないし。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8342896385161986170?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8342896385161986170/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_17.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8342896385161986170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8342896385161986170'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_17.html' title='ファイル一括置換アプリ改訂２'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6408460405252701006</id><published>2009-03-16T13:24:00.000+09:00</published><updated>2009-03-16T13:24:54.274+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>ダブルクリックの取得 どう書く？orgをgroovyでといてみた</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/241/"&gt;ダブルクリックの取得 どう書く？org&lt;/a&gt;を&lt;span style="font-weight: bold;"&gt;g&lt;/span&gt;&lt;strong&gt;roovy&lt;/strong&gt;でといてみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.doukaku.org/comment/8663/"&gt;どう書く？org 8663 genzou&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groovy.codehaus.org/Swing+Builder"&gt;Swing Builder&lt;/a&gt;を使用しただけの非常に簡単なコードです。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6408460405252701006?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6408460405252701006/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/orggroovy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6408460405252701006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6408460405252701006'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/orggroovy.html' title='ダブルクリックの取得 どう書く？orgをgroovyでといてみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3985812952078557892</id><published>2009-03-13T23:21:00.002+09:00</published><updated>2009-03-13T23:21:56.822+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>ファイル一括置換アプリ改訂　＋　MigLayoutライブラリ使ってみた</title><content type='html'>&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2008/10/griffon.html"&gt;ゲンゾウ用ポストイット: griffonで作ったファイル一括置換プログラム公開&lt;/a&gt;からほっておきっぱなしでしたが、メンテナンスしました。&lt;/p&gt;
&lt;div style="padding-left: 30px;"&gt;&lt;em&gt;プログラムは&lt;/em&gt;&lt;a mce_href="http://griffon-replacer.googlecode.com/files/application.jnlp" href="http://griffon-replacer.googlecode.com/files/application.jnlp"&gt;&lt;em&gt;こちら&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="padding-left: 30px;"&gt;&lt;em&gt; ソースは&lt;/em&gt;&lt;a mce_href="http://code.google.com/p/griffon-replacer/" href="http://code.google.com/p/griffon-replacer/"&gt;&lt;em&gt;こちら&lt;/em&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;機能を欲張り過ぎていたので、基本機能へ縮小。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;GUIを整理&lt;/li&gt;
 &lt;li&gt;基本機能へ縮小&lt;br /&gt;
 &lt;ul&gt;
  &lt;li&gt;ディレクトリ指定&lt;/li&gt;
  &lt;li&gt;対象ファイル名パターン指定可能&lt;/li&gt;
  &lt;li&gt;除外ファイル名パターン指定可能&lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正規表現を使用しての置換はできません。（チェックボックスはつけてしまったけど、動きません。）&lt;/p&gt;
&lt;h4&gt;始めてMigLayout使った&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/masanobuimai/20081225/1230217062"&gt;MigLayout: Inevitable Choice for Griffon Users? | Javalobby - marsのメモ&lt;/a&gt;にて紹介されていた&lt;a href="http://www.miglayout.com/"&gt;MiG Layout&lt;/a&gt;ってやつを始めて使った。&lt;/p&gt;
&lt;p&gt;これはめちゃくちゃいい！SwingのGUIがとても作りやすい。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SwingBuilder&lt;/strong&gt;と&lt;strong&gt;Mig Layout&lt;/strong&gt;の組み合わせで、Viewのソースが非常にシンプルになりました。&lt;/p&gt;
&lt;p&gt;置換処理は自分で処理をほとんど記述していません。&lt;strong&gt;ant&lt;/strong&gt;.&lt;strong&gt;replace&lt;/strong&gt;タスクに委譲してるだけだったりw&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3985812952078557892?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3985812952078557892/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/miglayout.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3985812952078557892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3985812952078557892'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/miglayout.html' title='ファイル一括置換アプリ改訂　＋　MigLayoutライブラリ使ってみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7966449480350674363</id><published>2009-03-11T15:56:00.001+09:00</published><updated>2009-03-11T15:57:18.296+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>SwingPadに再挑戦してみた</title><content type='html'>&lt;p&gt;今日、最新版の&lt;a href="http://docs.codehaus.org/display/GROOVY/Griffon"&gt;Griffon&lt;/a&gt;を自分のマシンにインストールした。versionは&lt;strong&gt;griffon-0.1.0&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;そしたら、$GRIFFON_HOME/samplesフォルダに&lt;strong&gt;SwingPad&lt;/strong&gt;がすでに用意されていた。以前ubuntuで動かしたときには正常に動かなかったけど、会社のマシンはWindowsマシンなので試してみる。&lt;/p&gt;
&lt;p&gt;これは確かにイイ！&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/masanobuimai/20081226#1230295348"&gt;[&lt;layer style="background-color: Cyan; color: black;" id="google-toolbar-hilite-3"&gt;groovy&lt;/layer&gt;] SwingPadで遊ぶ-2008-12-26 - marsのメモ&lt;/a&gt;に書かれているとおりだ。&lt;strong&gt;griffon&lt;/strong&gt;版の&lt;strong&gt;GroovyConsole&lt;/strong&gt;って感じ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GUI&lt;/strong&gt;アプリ作るが楽しくなりそう。&lt;/p&gt;
&lt;h4&gt;詰まったところ&lt;/h4&gt;
&lt;p&gt;griffonのviewコードって、&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
import java.awt.*
import javax.swing.*
&amp;nbsp;
application( title: &amp;quot;hoge&amp;quot;, size:huge){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; panel {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;p&gt;みたいな感じなんだが、これをそのまま&lt;strong&gt;SwingPad&lt;/strong&gt;に貼り付けてもうまく動かない。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;span style="color: rgb(0, 0, 255);"&gt;application{&lt;/span&gt;&amp;quot; , &amp;quot;&lt;span style="color: rgb(0, 0, 255);"&gt;}&lt;/span&gt;&amp;quot;の部分をコメントアウトして、panel要素のみで実行させないとエラーになる。また、modelからのbindの記述なんかが残ってても動かないみたい。&lt;/p&gt;
&lt;p&gt;結構詰まった。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7966449480350674363?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7966449480350674363/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/swingpad.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7966449480350674363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7966449480350674363'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/swingpad.html' title='SwingPadに再挑戦してみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4138908769610170868</id><published>2009-03-10T12:57:00.000+09:00</published><updated>2009-03-10T12:57:23.842+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>日本 Grails/Groovy ユーザーグループ ‎に参加してみた</title><content type='html'>&lt;p&gt;&lt;a href="http://www.jggug.org/"&gt;日本 Grails/Groovy ユーザーグループ &amp;lrm;(main)&amp;lrm;&lt;/a&gt;に参加してたつもりが参加できていなかったみたいなので、参加登録してみる。&lt;/p&gt;
&lt;p&gt;限りなくヒッキーな自分にとって、こういうのの登録とかかなり手が震える。でも関西での勉強会、とても楽しみなので勇気をだして登録ボタンクリックしてみた。&lt;/p&gt;
&lt;p&gt;家帰ったらメール届いてるかな。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4138908769610170868?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4138908769610170868/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/grailsgroovy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4138908769610170868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4138908769610170868'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/grailsgroovy.html' title='日本 Grails/Groovy ユーザーグループ ‎に参加してみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2889517063876256450</id><published>2009-03-09T12:20:00.002+09:00</published><updated>2009-03-09T12:20:38.105+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>関西でもgroovyの読書会が開催されるらしい！</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/kiy0taka/20090306/1236336908"&gt;Groovyイン・アクション読書会IN関西!!! - blog4j 2.0&lt;/a&gt;より。&lt;/p&gt;
&lt;p&gt;ついに関西でもgroovyの読書会が！！！&lt;/p&gt;
&lt;p&gt;これはぜひ参加せねば！！！！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2889517063876256450?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2889517063876256450/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2889517063876256450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2889517063876256450'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovy.html' title='関西でもgroovyの読書会が開催されるらしい！'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5723043722586378136</id><published>2009-03-09T09:59:00.002+09:00</published><updated>2009-03-09T09:59:43.524+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>jEditマクロでSwing Guiを呼び出し</title><content type='html'>&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/03/blog-post_05.html"&gt;ゲンゾウ用ポストイット: 選択中の文字列中の全角文字をすべて半角に変換するマクロ&lt;/a&gt;に引き続き、またまた&lt;strong&gt;jEdit&lt;/strong&gt;のマクロで遊んでみた。&lt;/p&gt;
&lt;p&gt;Swingのダイアログ表示を起動してみる。とっても短いコード。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
import javax.swing.*
JOptionPane.showMessageDialog(view, JOptionPane.showConfirmDialog(view, "test"))
&lt;/pre&gt;
&lt;p&gt;当然、&lt;strong&gt;はい&lt;/strong&gt;と&lt;strong&gt;いいえ&lt;/strong&gt;、&lt;strong&gt;取り消し&lt;/strong&gt;の３つのボタンを持つダイアログがちゃんと表示される。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;jEdit&lt;/strong&gt;と&lt;strong&gt;Groovy&lt;/strong&gt;の組み合わせ、かなり気に入ってきた。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5723043722586378136?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5723043722586378136/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditswing-gui.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5723043722586378136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5723043722586378136'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditswing-gui.html' title='jEditマクロでSwing Guiを呼び出し'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2354589047813057728</id><published>2009-03-05T13:44:00.002+09:00</published><updated>2009-03-05T13:50:48.719+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>選択中の文字列中の全角文字をすべて半角に変換するマクロ</title><content type='html'>&lt;p&gt;またしても&lt;strong&gt;jEdit &amp;amp; groovy ネタ&lt;/strong&gt;で。&lt;/p&gt;
&lt;p&gt;エディタで選択中の文字列中の全角文字をすべて半角に変換するマクロです。対応表は&lt;a href="http://www.dennou-sedai.jp/index.html"&gt;電脳世代.jp&lt;/a&gt;のサイトを参考にしました。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def text = textArea.selectedText
[
    [n:&amp;quot;0&amp;quot;,w:&amp;quot;０&amp;quot;], [n:&amp;quot;1&amp;quot;,w:&amp;quot;１&amp;quot;], [n:&amp;quot;2&amp;quot;,w:&amp;quot;２&amp;quot;], [n:&amp;quot;3&amp;quot;,w:&amp;quot;３&amp;quot;], [n:&amp;quot;4&amp;quot;,w:&amp;quot;４&amp;quot;], [n:&amp;quot;5&amp;quot;,w:&amp;quot;５&amp;quot;], [n:&amp;quot;6&amp;quot;,w:&amp;quot;６&amp;quot;], [n:&amp;quot;7&amp;quot;,w:&amp;quot;７&amp;quot;], [n:&amp;quot;8&amp;quot;,w:&amp;quot;８&amp;quot;], [n:&amp;quot;9&amp;quot;,w:&amp;quot;９&amp;quot;], [n:&amp;quot;a&amp;quot;,w:&amp;quot;ａ&amp;quot;], [n:&amp;quot;b&amp;quot;,w:&amp;quot;ｂ&amp;quot;], [n:&amp;quot;c&amp;quot;,w:&amp;quot;ｃ&amp;quot;], [n:&amp;quot;d&amp;quot;,w:&amp;quot;ｄ&amp;quot;], [n:&amp;quot;e&amp;quot;,w:&amp;quot;ｅ&amp;quot;], [n:&amp;quot;f&amp;quot;,w:&amp;quot;ｆ&amp;quot;], [n:&amp;quot;g&amp;quot;,w:&amp;quot;ｇ&amp;quot;], [n:&amp;quot;h&amp;quot;,w:&amp;quot;ｈ&amp;quot;], [n:&amp;quot;i&amp;quot;,w:&amp;quot;ｉ&amp;quot;], [n:&amp;quot;j&amp;quot;,w:&amp;quot;ｊ&amp;quot;], [n:&amp;quot;k&amp;quot;,w:&amp;quot;ｋ&amp;quot;], [n:&amp;quot;l&amp;quot;,w:&amp;quot;ｌ&amp;quot;], [n:&amp;quot;m&amp;quot;,w:&amp;quot;ｍ&amp;quot;], [n:&amp;quot;n&amp;quot;,w:&amp;quot;ｎ&amp;quot;], [n:&amp;quot;o&amp;quot;,w:&amp;quot;ｏ&amp;quot;], [n:&amp;quot;p&amp;quot;,w:&amp;quot;ｐ&amp;quot;], [n:&amp;quot;q&amp;quot;,w:&amp;quot;ｑ&amp;quot;], [n:&amp;quot;r&amp;quot;,w:&amp;quot;ｒ&amp;quot;], [n:&amp;quot;s&amp;quot;,w:&amp;quot;ｓ&amp;quot;], [n:&amp;quot;t&amp;quot;,w:&amp;quot;ｔ&amp;quot;], [n:&amp;quot;u&amp;quot;,w:&amp;quot;ｕ&amp;quot;], [n:&amp;quot;v&amp;quot;,w:&amp;quot;ｖ&amp;quot;], [n:&amp;quot;w&amp;quot;,w:&amp;quot;ｗ&amp;quot;], [n:&amp;quot;x&amp;quot;,w:&amp;quot;ｘ&amp;quot;], [n:&amp;quot;y&amp;quot;,w:&amp;quot;ｙ&amp;quot;], [n:&amp;quot;z&amp;quot;,w:&amp;quot;ｚ&amp;quot;], [n:&amp;quot;A&amp;quot;,w:&amp;quot;Ａ&amp;quot;], [n:&amp;quot;B&amp;quot;,w:&amp;quot;Ｂ&amp;quot;], [n:&amp;quot;C&amp;quot;,w:&amp;quot;Ｃ&amp;quot;], [n:&amp;quot;D&amp;quot;,w:&amp;quot;Ｄ&amp;quot;], [n:&amp;quot;E&amp;quot;,w:&amp;quot;Ｅ&amp;quot;], [n:&amp;quot;F&amp;quot;,w:&amp;quot;Ｆ&amp;quot;], [n:&amp;quot;G&amp;quot;,w:&amp;quot;Ｇ&amp;quot;], [n:&amp;quot;H&amp;quot;,w:&amp;quot;Ｈ&amp;quot;], [n:&amp;quot;I&amp;quot;,w:&amp;quot;Ｉ&amp;quot;], [n:&amp;quot;J&amp;quot;,w:&amp;quot;Ｊ&amp;quot;], [n:&amp;quot;K&amp;quot;,w:&amp;quot;Ｋ&amp;quot;], [n:&amp;quot;L&amp;quot;,w:&amp;quot;Ｌ&amp;quot;], [n:&amp;quot;M&amp;quot;,w:&amp;quot;Ｍ&amp;quot;], [n:&amp;quot;N&amp;quot;,w:&amp;quot;Ｎ&amp;quot;], [n:&amp;quot;O&amp;quot;,w:&amp;quot;Ｏ&amp;quot;], [n:&amp;quot;P&amp;quot;,w:&amp;quot;Ｐ&amp;quot;], [n:&amp;quot;Q&amp;quot;,w:&amp;quot;Ｑ&amp;quot;], [n:&amp;quot;R&amp;quot;,w:&amp;quot;Ｒ&amp;quot;], [n:&amp;quot;S&amp;quot;,w:&amp;quot;Ｓ&amp;quot;], [n:&amp;quot;T&amp;quot;,w:&amp;quot;Ｔ&amp;quot;], [n:&amp;quot;U&amp;quot;,w:&amp;quot;Ｕ&amp;quot;], [n:&amp;quot;V&amp;quot;,w:&amp;quot;Ｖ&amp;quot;], [n:&amp;quot;W&amp;quot;,w:&amp;quot;Ｗ&amp;quot;], [n:&amp;quot;X&amp;quot;,w:&amp;quot;Ｘ&amp;quot;], [n:&amp;quot;Y&amp;quot;,w:&amp;quot;Ｙ&amp;quot;], [n:&amp;quot;Z&amp;quot;,w:&amp;quot;Ｚ&amp;quot;], [n:&amp;quot;ｱ&amp;quot;,w:&amp;quot;ア&amp;quot;], [n:&amp;quot;ｲ&amp;quot;,w:&amp;quot;イ&amp;quot;], [n:&amp;quot;ｳ&amp;quot;,w:&amp;quot;ウ&amp;quot;], [n:&amp;quot;ｴ&amp;quot;,w:&amp;quot;エ&amp;quot;], [n:&amp;quot;ｵ&amp;quot;,w:&amp;quot;オ&amp;quot;], [n:&amp;quot;ｶ&amp;quot;,w:&amp;quot;カ&amp;quot;], [n:&amp;quot;ｷ&amp;quot;,w:&amp;quot;キ&amp;quot;], [n:&amp;quot;ｸ&amp;quot;,w:&amp;quot;ク&amp;quot;], [n:&amp;quot;ｹ&amp;quot;,w:&amp;quot;ケ&amp;quot;], [n:&amp;quot;ｺ&amp;quot;,w:&amp;quot;コ&amp;quot;], [n:&amp;quot;ｻ&amp;quot;,w:&amp;quot;サ&amp;quot;], [n:&amp;quot;ｼ&amp;quot;,w:&amp;quot;シ&amp;quot;], [n:&amp;quot;ｽ&amp;quot;,w:&amp;quot;ス&amp;quot;], [n:&amp;quot;ｾ&amp;quot;,w:&amp;quot;セ&amp;quot;], [n:&amp;quot;ｿ&amp;quot;,w:&amp;quot;ソ&amp;quot;], [n:&amp;quot;ﾀ&amp;quot;,w:&amp;quot;タ&amp;quot;], [n:&amp;quot;ﾁ&amp;quot;,w:&amp;quot;チ&amp;quot;], [n:&amp;quot;ﾂ&amp;quot;,w:&amp;quot;ツ&amp;quot;], [n:&amp;quot;ﾃ&amp;quot;,w:&amp;quot;テ&amp;quot;], [n:&amp;quot;ﾄ&amp;quot;,w:&amp;quot;ト&amp;quot;], [n:&amp;quot;ﾅ&amp;quot;,w:&amp;quot;ナ&amp;quot;], [n:&amp;quot;ﾆ&amp;quot;,w:&amp;quot;ニ&amp;quot;], [n:&amp;quot;ﾇ&amp;quot;,w:&amp;quot;ヌ&amp;quot;], [n:&amp;quot;ﾈ&amp;quot;,w:&amp;quot;ネ&amp;quot;], [n:&amp;quot;ﾉ&amp;quot;,w:&amp;quot;ノ&amp;quot;], [n:&amp;quot;ﾊ&amp;quot;,w:&amp;quot;ハ&amp;quot;], [n:&amp;quot;ﾋ&amp;quot;,w:&amp;quot;ヒ&amp;quot;], [n:&amp;quot;ﾌ&amp;quot;,w:&amp;quot;フ&amp;quot;], [n:&amp;quot;ﾍ&amp;quot;,w:&amp;quot;ヘ&amp;quot;], [n:&amp;quot;ﾎ&amp;quot;,w:&amp;quot;ホ&amp;quot;], [n:&amp;quot;ﾏ&amp;quot;,w:&amp;quot;マ&amp;quot;], [n:&amp;quot;ﾐ&amp;quot;,w:&amp;quot;ミ&amp;quot;], [n:&amp;quot;ﾑ&amp;quot;,w:&amp;quot;ム&amp;quot;], [n:&amp;quot;ﾒ&amp;quot;,w:&amp;quot;メ&amp;quot;], [n:&amp;quot;ﾓ&amp;quot;,w:&amp;quot;モ&amp;quot;], [n:&amp;quot;ﾔ&amp;quot;,w:&amp;quot;ヤ&amp;quot;], [n:&amp;quot;ﾕ&amp;quot;,w:&amp;quot;ユ&amp;quot;], [n:&amp;quot;ﾖ&amp;quot;,w:&amp;quot;ヨ&amp;quot;], [n:&amp;quot;ﾗ&amp;quot;,w:&amp;quot;ラ&amp;quot;], [n:&amp;quot;ﾘ&amp;quot;,w:&amp;quot;リ&amp;quot;], [n:&amp;quot;ﾙ&amp;quot;,w:&amp;quot;ル&amp;quot;], [n:&amp;quot;ﾚ&amp;quot;,w:&amp;quot;レ&amp;quot;], [n:&amp;quot;ﾛ&amp;quot;,w:&amp;quot;ロ&amp;quot;], [n:&amp;quot;ﾜ&amp;quot;,w:&amp;quot;ワ&amp;quot;], [n:&amp;quot;ｦ&amp;quot;,w:&amp;quot;ヲ&amp;quot;], [n:&amp;quot;ﾝ&amp;quot;,w:&amp;quot;ン&amp;quot;], [n:&amp;quot;ｧ&amp;quot;,w:&amp;quot;ァ&amp;quot;], [n:&amp;quot;ｨ&amp;quot;,w:&amp;quot;ィ&amp;quot;], [n:&amp;quot;ｩ&amp;quot;,w:&amp;quot;ゥ&amp;quot;], [n:&amp;quot;ｪ&amp;quot;,w:&amp;quot;ェ&amp;quot;], [n:&amp;quot;ｫ&amp;quot;,w:&amp;quot;ォ&amp;quot;], [n:&amp;quot;ｯ&amp;quot;,w:&amp;quot;ッ&amp;quot;], [n:&amp;quot;ｬ&amp;quot;,w:&amp;quot;ャ&amp;quot;], [n:&amp;quot;ｭ&amp;quot;,w:&amp;quot;ュ&amp;quot;], [n:&amp;quot;ｮ&amp;quot;,w:&amp;quot;ョ&amp;quot;], [n:&amp;quot;ｰ&amp;quot;,w:&amp;quot;ー&amp;quot;], [n:&amp;quot;｡&amp;quot;,w:&amp;quot;。&amp;quot;], [n:&amp;quot;､&amp;quot;,w:&amp;quot;、&amp;quot;], [n:&amp;quot;･&amp;quot;,w:&amp;quot;・&amp;quot;], [n:&amp;quot;｢&amp;quot;,w:&amp;quot;「&amp;quot;], [n:&amp;quot;｣&amp;quot;,w:&amp;quot;」&amp;quot;], [n:&amp;quot;ﾞ&amp;quot;,w:&amp;quot;゛&amp;quot;], [n:&amp;quot;ﾟ&amp;quot;,w:&amp;quot;゜&amp;quot;], [n:&amp;quot;ｳﾞ&amp;quot;,w:&amp;quot;ヴ&amp;quot;], [n:&amp;quot;ｶﾞ&amp;quot;,w:&amp;quot;ガ&amp;quot;], [n:&amp;quot;ｷﾞ&amp;quot;,w:&amp;quot;ギ&amp;quot;], [n:&amp;quot;ｸﾞ&amp;quot;,w:&amp;quot;グ&amp;quot;], [n:&amp;quot;ｹﾞ&amp;quot;,w:&amp;quot;ゲ&amp;quot;], [n:&amp;quot;ｺﾞ&amp;quot;,w:&amp;quot;ゴ&amp;quot;], [n:&amp;quot;ｻﾞ&amp;quot;,w:&amp;quot;ザ&amp;quot;], [n:&amp;quot;ｼﾞ&amp;quot;,w:&amp;quot;ジ&amp;quot;], [n:&amp;quot;ｽﾞ&amp;quot;,w:&amp;quot;ズ&amp;quot;], [n:&amp;quot;ｾﾞ&amp;quot;,w:&amp;quot;ゼ&amp;quot;], [n:&amp;quot;ｿﾞ&amp;quot;,w:&amp;quot;ゾ&amp;quot;], [n:&amp;quot;ﾀﾞ&amp;quot;,w:&amp;quot;ダ&amp;quot;], [n:&amp;quot;ﾁﾞ&amp;quot;,w:&amp;quot;ヂ&amp;quot;], [n:&amp;quot;ﾂﾞ&amp;quot;,w:&amp;quot;ヅ&amp;quot;], [n:&amp;quot;ﾃﾞ&amp;quot;,w:&amp;quot;デ&amp;quot;], [n:&amp;quot;ﾄﾞ&amp;quot;,w:&amp;quot;ド&amp;quot;], [n:&amp;quot;ﾊﾞ&amp;quot;,w:&amp;quot;バ&amp;quot;], [n:&amp;quot;ﾋﾞ&amp;quot;,w:&amp;quot;ビ&amp;quot;], [n:&amp;quot;ﾌﾞ&amp;quot;,w:&amp;quot;ブ&amp;quot;], [n:&amp;quot;ﾍﾞ&amp;quot;,w:&amp;quot;ベ&amp;quot;], [n:&amp;quot;ﾎﾞ&amp;quot;,w:&amp;quot;ボ&amp;quot;], [n:&amp;quot;ﾊﾟ&amp;quot;,w:&amp;quot;パ&amp;quot;], [n:&amp;quot;ﾋﾟ&amp;quot;,w:&amp;quot;ピ&amp;quot;], [n:&amp;quot;ﾌﾟ&amp;quot;,w:&amp;quot;プ&amp;quot;], [n:&amp;quot;ﾍﾟ&amp;quot;,w:&amp;quot;ペ&amp;quot;], [n:&amp;quot;ﾎﾟ&amp;quot;,w:&amp;quot;ポ&amp;quot;],
].each{
    text = text.replace(it.w, it.n)
}
textArea.selectedText = text
&lt;/pre&gt;
&lt;p&gt;いつものようにこれを &lt;span style="color: rgb(153, 51, 0);"&gt;&lt;strong&gt;$HOME/.jedit/macros&lt;/strong&gt;&lt;/span&gt; に配置してメニューからマクロを実行します。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;text.replace(&lt;strong&gt;it.w, it.n&lt;/strong&gt;) -&amp;gt; text.replace(&lt;strong&gt;it.n, it.w&lt;/strong&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;とすれば、半角から全角への変換もできます。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2354589047813057728?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2354589047813057728/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_05.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2354589047813057728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2354589047813057728'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post_05.html' title='選択中の文字列中の全角文字をすべて半角に変換するマクロ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7715120862089136148</id><published>2009-03-05T09:32:00.000+09:00</published><updated>2009-03-05T09:32:31.506+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>syntax-highlighter pluginのインストール時のバグが修正されたみたい</title><content type='html'>&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/01/syntax-highlighter.html"&gt;ゲンゾウ用ポストイット: ブログアプリをつくろう（しかしsyntax-highlighterがインストールできず）&lt;/a&gt;で、&lt;a href="http://www.grails.org/SyntaxHighlighter+Plugin"&gt;SyntaxHighlighter Plugin&lt;/a&gt;がインストールに失敗するという投稿をしました。修正方法なども一緒に連絡しておいたのですぐ直るかなーと思ってたのですが返事がないまま・・・&lt;/p&gt;
&lt;p&gt;1/15に作成者にメールで連絡したのですが、昨日返事がありました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「もう直ったので、またつかったね♪」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;できるプログラマだろうし、忙しいんだね。修正ありがとう！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7715120862089136148?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7715120862089136148/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/syntax-highlighter-plugin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7715120862089136148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7715120862089136148'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/syntax-highlighter-plugin.html' title='syntax-highlighter pluginのインストール時のバグが修正されたみたい'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-8796342909516218464</id><published>2009-03-04T09:57:00.000+09:00</published><updated>2009-03-04T09:57:26.574+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyでsql整形jEditマクロを作ってみた</title><content type='html'>&lt;p&gt;groovyで、sql整形用の&lt;strong&gt;jEdit&lt;/strong&gt;マクロを作ってみた。&lt;/p&gt;
&lt;p&gt;設定方法は以下のとおり。（事前に、&lt;a href="http://genzou-postit.blogspot.com/2009/03/jeditgroovy_04.html"&gt;ゲンゾウ用ポストイット: jEditエディタマクロをgroovyで組むための設定&lt;/a&gt;にて紹介した設定が必要です）&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;a href="http://homepage2.nifty.com/igat/igapyon/diary/2005/ig050704.html"&gt;blancoSqlFormatte&lt;/a&gt;（sql整形用ライブラリ）をダウンロードし、&lt;strong&gt;$USER_HOME/.jedit/jars&lt;/strong&gt;に配置&lt;/li&gt;
 &lt;li&gt;jEditを起動し、メニューから &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;plugins -&amp;gt; plugins manager&lt;/strong&gt;&lt;/span&gt; を選ぶ。&lt;/li&gt;
 &lt;li&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;managerタブ&lt;/strong&gt;&lt;/span&gt;から&lt;strong&gt;blancoSqlfomatter*.jar&lt;/strong&gt;をチェックし、&lt;strong&gt;jEdit&lt;/strong&gt;にjarファイルを認識させる。&lt;/li&gt;
 &lt;li&gt;以下のようなスクリプトを&lt;strong&gt;$USER_HOME/.jedit/macros&lt;/strong&gt;に配置する（拡張子は.groovy）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name="code" language="java"&gt;
import blanco.commons.sql.format.*

try{
    textArea.text = new BlancoSqlFormatter(new BlancoSqlRule()).format(textArea.text)
} catch(e){
    textArea.text += e.toString()
}
&lt;/pre&gt;
&lt;p&gt;SQL文を編集中にマクロを実行すると、SQLが整形されます。便利！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-8796342909516218464?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/8796342909516218464/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovysqljedit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8796342909516218464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/8796342909516218464'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/groovysqljedit.html' title='groovyでsql整形jEditマクロを作ってみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-418656844858945300</id><published>2009-03-04T07:00:00.001+09:00</published><updated>2009-03-04T07:09:24.684+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>jEditエディタマクロをgroovyで組むための設定</title><content type='html'>&lt;p&gt;ようやく見つけました。jEditマクロを&lt;strong&gt;groovy&lt;/strong&gt;で組むための設定を。以下のサイトを参考にしました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://markmail.org/message/lz4zyeqdgovk6cds"&gt;RE: [groovy-user] Groovy and Jedit plugin - Steven Buroff - org.codehaus.groovy.user - MarkMail&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;かかれている内容にそってやってみた。&lt;/p&gt;
&lt;p&gt;前提条件としては以下の過去エントリの設定を事前に行っておく必要がある。（多分）&lt;/p&gt;
&lt;p&gt;&lt;a href="http://genzou-postit.blogspot.com/2009/03/jeditgroovy.html"&gt;ゲンゾウ用ポストイット: jEditでgroovyコーディングするための各種設定&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;設定開始！&lt;/h4&gt;
&lt;ol&gt;
 &lt;li&gt;jEditを起動&lt;/li&gt;
 &lt;li&gt;メニューから &lt;strong&gt;plugins -&amp;gt; plugin manager &lt;/strong&gt;を選択&lt;/li&gt;
 &lt;li&gt;installタブから &lt;strong&gt;SuperScript&lt;/strong&gt; というプラグインを探しインストール&lt;/li&gt;
 &lt;li&gt;jEditを一度終了する。&lt;/li&gt;
 &lt;li&gt;メニューから &lt;strong&gt;plugins -&amp;gt; plugin options&lt;/strong&gt; を選択&lt;/li&gt;
 &lt;li&gt;左のツリーから&lt;strong&gt;SuperScript&lt;/strong&gt;を選択して、groovyをマクロ対象言語とする。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これでOK。&lt;/p&gt;
&lt;h4&gt;実行してみる&lt;/h4&gt;
&lt;p&gt;適当なスクリプトを組んでみる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;jEdit&lt;/strong&gt;マクロではいくつかの組み込み変数が定義されているようで、その一つが&lt;span style="color: rgb(128, 0, 128);"&gt;textArea&lt;/span&gt;という変数みたい。これは現在開いているエディタのコード表示部分のようだ。&lt;/p&gt;
&lt;p&gt;以下のようなコードを&lt;strong&gt;testx.groovy&lt;/strong&gt;というファイル名で &lt;strong&gt;&amp;lt;USER_HOME&amp;gt;/.jedit/macros&lt;/strong&gt; に配置する。（windows、linuxいずれも同じ。macは分かりません。）&lt;/p&gt;
&lt;pre name="code" language="java"&gt;textArea.text += "\n最後尾に追加されます。"&lt;/pre&gt;
&lt;p&gt;メニューから &lt;span style="font-weight: bold;"&gt;macros&lt;/span&gt;&lt;strong&gt; -&amp;gt; rescan macros&lt;/strong&gt; を選択すると、&lt;strong&gt;&amp;lt;USER_HOME&amp;gt;/.jedit/macros&lt;/strong&gt; のソースをチェックしてくれる。 &lt;span style="font-weight: bold;"&gt;macros&lt;/span&gt;&lt;strong&gt; -&amp;gt; testx.gro&lt;/strong&gt; （なぜか途中で切れてるw）が追加されているので実行すると、マクロが動作するはず。&lt;/p&gt;
&lt;h4&gt;感想&lt;/h4&gt;
&lt;p&gt;こういうのが欲しかった！マクロ実行までに一秒ぐらいまたないといけないけど、十分。&lt;/p&gt;
&lt;p&gt;もちろん&lt;strong&gt;jEdit&lt;/strong&gt;内の操作に限らず、ファイルを作成したりディレクトリを操作したりが可能です。&lt;/p&gt;
&lt;p&gt;サクラエディタから乗り換えてよかったかも。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-418656844858945300?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/418656844858945300/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy_04.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/418656844858945300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/418656844858945300'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy_04.html' title='jEditエディタマクロをgroovyで組むための設定'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1988129490026493598</id><published>2009-03-03T09:25:00.001+09:00</published><updated>2009-03-04T07:09:55.765+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><title type='text'>jEditエディタマクロをGroovyで組めるとか組めないとか</title><content type='html'>&lt;p&gt;またまたjEditネタで。&lt;/p&gt;
&lt;p&gt;jEditには強力なエディタマクロ機能が用意されています。マクロは&lt;a href="http://www.beanshell.org/"&gt;BeanShell&lt;/a&gt;で命令を記述する仕組みとなっているのですが、ネット上の某掲示板の書き込みでは&lt;strong&gt;groovy&lt;/strong&gt;を使用した命令の記述も可能ということ。&lt;/p&gt;
&lt;p&gt;いろいろ試してみてもできないのですが、今度じっくり探してみたい。&lt;strong&gt;groovy&lt;/strong&gt;でマクロ書けたらかなりうれしい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1988129490026493598?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1988129490026493598/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy_03.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1988129490026493598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1988129490026493598'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy_03.html' title='jEditエディタマクロをGroovyで組めるとか組めないとか'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4883182823874046146</id><published>2009-03-03T09:21:00.001+09:00</published><updated>2009-03-03T09:26:37.183+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><title type='text'>jEditで開いているGroovyソースをショートカットで実行する</title><content type='html'>&lt;p&gt;jEditネタ。開いているGroovyソースをショートカットで実行する方法について。&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;メニューから &lt;strong&gt;Utilities &amp;gt; Global Options&lt;/strong&gt; を実行。&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;jEdit -&amp;gt; Shortcuts&lt;/strong&gt; を選択。&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Command&lt;/strong&gt;から &lt;strong&gt;Run Current Buffer&lt;/strong&gt; を探し、クリック。&lt;/li&gt;
 &lt;li&gt;ショートカット設定画面が表示されるので、&lt;strong&gt;F5&lt;/strong&gt;を押してＯＫ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;これだけ。&lt;/p&gt;
&lt;p&gt;あとは適当な&lt;strong&gt;Groovyスクリプト&lt;/strong&gt;を編集中に&lt;strong&gt;F5&lt;/strong&gt;ボタンを押せばＯＫ。&lt;strong&gt;Groovy&lt;/strong&gt;&lt;strong&gt;Console&lt;/strong&gt;なイメージで使用できる。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4883182823874046146?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4883182823874046146/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy-utilities-global-options.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4883182823874046146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4883182823874046146'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy-utilities-global-options.html' title='jEditで開いているGroovyソースをショートカットで実行する'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3010227999507336119</id><published>2009-03-02T16:15:00.001+09:00</published><updated>2009-03-02T16:15:16.391+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>杉花粉のばかやろぉー</title><content type='html'>&lt;p&gt;もはや地獄・・・２月の中旬を過ぎたあたりから&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;目が異常にかゆい&lt;/li&gt;
 &lt;li&gt;鼻水が大量にでて、呼吸困難&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;に陥っている。花粉症だ。&lt;/p&gt;
&lt;p&gt;昼間よりも夜がしんどい。布団が花粉に汚染されているようで、布団に入るととたんに呼吸が苦しくなる。鼻先にこんにちわしていた鼻水さんたちも、僕がお休みすると同時におくに引っ込むので必然的に口呼吸となる。&lt;/p&gt;
&lt;p&gt;嫁いわく&lt;strong&gt;ベイダー&lt;/strong&gt;&lt;strong&gt;卿&lt;/strong&gt;のように一晩中「&lt;strong&gt;コー、コー&lt;/strong&gt;」といっているらしい。&lt;/p&gt;
&lt;p&gt;二ヶ月近く慢性寝不足状態を耐えなければ・・・&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3010227999507336119?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3010227999507336119/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3010227999507336119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3010227999507336119'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/blog-post.html' title='杉花粉のばかやろぉー'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7597095843843046578</id><published>2009-03-02T15:05:00.002+09:00</published><updated>2009-03-02T15:12:42.712+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jedit'/><title type='text'>jEditでgroovyコーディングするための各種設定</title><content type='html'>&lt;p&gt;&lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt;で&lt;strong&gt;groovy&lt;/strong&gt;のソースをコーディングするための各種設定について、&lt;a href="http://groovy.codehaus.org/JEdit+Plugin"&gt;Groovy - JEdit Plugin&lt;/a&gt;に書かれていたので設定してみた。&lt;/p&gt;
&lt;p&gt;基本的にはこの英文を解釈して進めていけばいいのだが、&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;Console Commando Plugin&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;の設定内容について、一点詰まってしまったのでメモしておく。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instructions:&lt;br /&gt;
1. Install Console plugin in jEdit.&lt;br /&gt;
2. Copy the attachment on this wiki: groovy.xml into your $HOME/.jedit/console/commando/groovy.xml&lt;br /&gt;
&amp;nbsp; &amp;nbsp;(NOTE: I hardcoded my groovy path. Change it if it doesn't match yours.)&lt;br /&gt;
3. jEdit Menu: Plugins&amp;gt;Console&amp;gt;Regen menu.&lt;br /&gt;
4. jEdit Menu: Plugins&amp;gt;Plugin Options..., On left pick&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;とある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;の「&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;このwikiのgroovy.xml&lt;/strong&gt;&lt;/span&gt;を、 &lt;strong&gt;$HOME/.jedit/console/commando/groovy.xml&lt;/strong&gt;にコピーしてね」が曲者で、&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;このwikiのgroovy.xml&lt;/strong&gt;&lt;/span&gt;ていうのがどこにもない。&lt;/p&gt;
&lt;p&gt;いろいろ探し回って、以下のサイトのxmlの内容を元に&lt;strong&gt;groovy.xml&lt;/strong&gt;を作成すればＯＫ。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://snipplr.com/view/2788/jedits-plugin-commamdo-config-for-groovy/"&gt;jEdit's Plugin: Commamdo config for groovy - XML - Snipplr&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;思ったこと&lt;/h4&gt;
&lt;p&gt;groovyのサイトの内容って、本当はどこか別のサイトの内容を引用しているのかな？？？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7597095843843046578?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7597095843843046578/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7597095843843046578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7597095843843046578'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jeditgroovy.html' title='jEditでgroovyコーディングするための各種設定'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3535675924183178407</id><published>2009-03-02T14:13:00.001+09:00</published><updated>2009-03-02T14:13:29.125+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>メインエディタをjEditに切り替える</title><content type='html'>&lt;p&gt;職場は&lt;strong&gt;windows&lt;/strong&gt;だが家は&lt;strong&gt;ubuntu&lt;/strong&gt;を使用している。&lt;/p&gt;
&lt;p&gt;職場のwindowsマシンではメインのエディタとしてサクラエディタを使用しているが、家のubuntuマシンではwindowsのエディタは動かない。がんばってemacsやmousepad、geditを使用していたのだが、どうもしっくりこない。わざわざ&lt;strong&gt;eclipse&lt;/strong&gt;、&lt;strong&gt;netbean&lt;/strong&gt;を立ち上げるのも馬鹿らしい。&lt;/p&gt;
&lt;p&gt;そこで&lt;strong&gt;Java&lt;/strong&gt;で作られたどこでも動くエディタを調べてみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.jedit.org/"&gt;jEdit - Programmer's Text Editor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一度触ったことがあったのだが、ちょっと触ってやめてしまった。いい機会なので、使い込んでみる。当然windows環境のサクラエディタは削除し、自分を追い込む。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3535675924183178407?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3535675924183178407/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jedit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3535675924183178407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3535675924183178407'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/03/jedit.html' title='メインエディタをjEditに切り替える'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6763568792407974057</id><published>2009-02-25T17:01:00.000+09:00</published><updated>2009-02-25T17:01:58.773+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>文字列を指定されたバイト数で分割 どう書く？orgをといてみた</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/234/"&gt;文字列を指定されたバイト数で分割 どう書く？org&lt;/a&gt;を&lt;a href="http://ja.doukaku.org/comment/8546/"&gt;といてみた&lt;/a&gt;。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def splitBytes( text, size, charset ){
    def list = []
    text.each{
        if( list.empty || (list[-1] + it).getBytes(charset).size() &amp;gt; size )
            list &amp;lt;&amp;lt; &amp;quot;&amp;quot;
        list[-1] += it
    }
    list
}

// テスト
assert splitBytes(&amp;quot;あいうえおabcdeかきくけこfghij&amp;quot;, 10, &amp;quot;SJIS&amp;quot;) == [&amp;quot;あいうえお&amp;quot;, &amp;quot;abcdeかき&amp;quot;, &amp;quot;くけこfghi&amp;quot;, &amp;quot;j&amp;quot;]
assert splitBytes(&amp;quot;あいうえおabcdeかきくけこfghij&amp;quot;, 10, &amp;quot;UTF-8&amp;quot;) == [&amp;quot;あいう&amp;quot;, &amp;quot;えおabcd&amp;quot;, &amp;quot;eかきく&amp;quot;, &amp;quot;けこfghi&amp;quot;, &amp;quot;j&amp;quot;]
&lt;/pre&gt;
&lt;p&gt;ちょっとロジックが強引な気もする。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6763568792407974057?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6763568792407974057/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/org.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6763568792407974057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6763568792407974057'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/org.html' title='文字列を指定されたバイト数で分割 どう書く？orgをといてみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3620564967938463685</id><published>2009-02-25T16:51:00.000+09:00</published><updated>2009-02-25T16:51:45.095+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>17歳教 どう書く？orgをといてみた</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/236/"&gt;17歳教 どう書く？org&lt;/a&gt;を&lt;a href="http://ja.doukaku.org/comment/8547/"&gt;といてみた&lt;/a&gt;。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def birth = new Date(args[0])
def seventeen = new Date(&amp;quot;${birth.year+17}/${birth.format('MM/dd')}&amp;quot;)
def today = new Date()

println &amp;quot;17歳と${today - seventeen}日&amp;quot;

def diff = { prop -&amp;gt;
    today[prop] - seventeen[prop]
}
def months = diff('year')*12 + diff('month')
def dates = diff('date')
if( dates &amp;lt; 0 ){
    months--
    dates += (new Date(today.year, today.month, 1) - 1).date
}
println &amp;quot;17歳と${months}月と${dates}日&amp;quot;


&lt;/pre&gt;
&lt;h4&gt;チョイメモ &lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;java.util.DateX - java.util.DateY&lt;/strong&gt;　にて日付の差分が取れるのはさすが&lt;strong&gt;groovy&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;groovyでは基本的には&lt;strong&gt;SimpleDateFormat&lt;/strong&gt;を使用せずとも日付の各種操作が可能になっている。（文字列を日付へ変換するときには&lt;strong&gt;Date.parse&lt;/strong&gt;、日付を文字列へ変換するときには&lt;strong&gt;Date.format&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3620564967938463685?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3620564967938463685/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/17-org.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3620564967938463685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3620564967938463685'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/17-org.html' title='17歳教 どう書く？orgをといてみた'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2662080506847050661</id><published>2009-02-24T13:08:00.002+09:00</published><updated>2009-02-24T13:11:09.676+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyでstruts-config.xmlをhtml変換</title><content type='html'>&lt;p&gt;struts-config.xmlの内容のうち、特に&lt;strong&gt;action-mappings&lt;/strong&gt;についてはチェックする機会が多い。もうちょっと見やすくならないかな、ということで、htmlに変換してみた。（xslt使うのが本来のやり方なのかもしれないけれども、そこはGroovy中毒患者。）&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
import groovy.xml.MarkupBuilder
import org.custommonkey.xmlunit.*


final xmlSlurper = new XmlSlurper()
def config = xmlSlurper.parseText(new File(args[0]).text.replaceFirst(/&amp;lt;!DOCTYPE(?ms)[^&amp;gt;]+&amp;gt;/, &amp;quot;&amp;quot;))
def actions = config.&amp;quot;action-mappings&amp;quot;.action

def html = new MarkupBuilder()
html.html() {
    head{
        link(
            rel:&amp;quot;stylesheet&amp;quot;,
            type:&amp;quot;text/css&amp;quot;,
            href:&amp;quot;style.css&amp;quot;,
            )
        style{
            def i = 0
            actions.@path*.toString().collect{ it.split(&amp;quot;/&amp;quot;)[1] }.unique().each{
                yieldUnescaped &amp;quot;&amp;quot;&amp;quot;
.${it}{
    background-color: #${(1..6).collect{(&amp;quot;A&amp;quot;..&amp;quot;F&amp;quot;)[(int)(Math.random()*6)]}.join(&amp;quot;&amp;quot;)};
}
&amp;quot;&amp;quot;&amp;quot;
            }
        }
    }
    body{
        table{
            caption(&amp;quot;action-mappings&amp;quot;)
            thead{
                tr{
                    th(&amp;quot;path&amp;quot;)
                    th(&amp;quot;type&amp;quot;)
                    th(&amp;quot;forward&amp;quot;)
                    th(&amp;quot;scope&amp;quot;)
                }
            }
            tbody{
                actions.each{ action -&amp;gt;
                    tr(class:&amp;quot;${action.@path.toString().split(&amp;quot;/&amp;quot;)[1]}&amp;quot;){
                        td(action.@path)
                        td(action.@type)
                        td(style:&amp;quot;text-align:left;&amp;quot;){
                            ul{
                                action.forward.each{
                                    li(it.@name)
                                }
                            }
                        }
                        td(action.@scope)
                    }
                }
            }
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;これに、適当なcssファイルを付け加えてみる。&lt;/p&gt;
&lt;pre name="code" language="css"&gt;
table {
    width:90%;
    border-top:3px solid #e5eff8;
    border-right:1px solid #e5eff8;
    margin:1em auto;
    border-collapse:collapse;
}
table caption{
    font-size: 150%;
    font-weight: bold;
    border :2px solid gray;
    text-valign: middle;
}
td {
    color:#5B4167;
    border-bottom:1px solid #e5eff8;
    border-left:1px solid #e5eff8;
    padding:.3em 1em;
    text-align:center;
}


thead th {
    background:#f4f9fe;
    text-align:center;
    font:bold 1.2em/2em &amp;quot;Century Gothic&amp;quot;,&amp;quot;Trebuchet MS&amp;quot;,Arial,Helvetica,sans-serif;
    color:#66a3d3;
}
&lt;/pre&gt;
&lt;p&gt;いい加減、&lt;strong&gt;struts 1.X&lt;/strong&gt;なプロジェクト、抜けたい。でも現在保守作業中なので当分抜けられないんだろうな。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2662080506847050661?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2662080506847050661/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovystruts-configxmlhtml.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2662080506847050661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2662080506847050661'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovystruts-configxmlhtml.html' title='groovyでstruts-config.xmlをhtml変換'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4494368208743347724</id><published>2009-02-19T09:45:00.004+09:00</published><updated>2009-02-19T09:47:27.178+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>クリップボードのパイプ操作スクリプトを作成してみる</title><content type='html'>&lt;p&gt;クリップボードのパイプ操作スクリプトを作成してみる。（もちろんwindowsでも動作するが、僕の家のubuntu用に作ってみた）&lt;/p&gt;
&lt;h4&gt;クリップボード操作クラス作成&lt;/h4&gt;
&lt;p&gt;まずはクリップボードの情報を操作するクラスを作成し、クラスパスの通る場所に配置する。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import java.awt.datatransfer.DataFlavor
import java.awt.datatransfer.StringSelection

public class GClipBoard {
&amp;nbsp;&amp;nbsp;&amp;nbsp; def clipboard = java.awt.Toolkit.defaultToolkit.systemClipboard

&amp;nbsp;&amp;nbsp;&amp;nbsp; def setText(text) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def ss = new StringSelection(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clipboard.setContents(ss, ss)
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; def getText() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def text = &amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text = clipboard.getContents(null).getTransferData(DataFlavor.stringFlavor)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text = &amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/pre&gt;
&lt;h4&gt;コマンドラインスクリプト作成&lt;/h4&gt;
&lt;p&gt;次に、~/binに以下の２つのファイルを配置（&lt;strong&gt;パスの通る場所と言う意味&lt;/strong&gt;）&lt;/p&gt;
&lt;h5&gt;getclip.groovy&lt;/h5&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import GClipBoard
println new GClipBoard().text&lt;/pre&gt;
&lt;h5&gt;putclip.groovy&lt;/h5&gt;
&lt;pre name="code" language="java"&gt;
#!/usr/bin/env groovy
import GClipBoard
new GClipBoard().text = System.in.text&lt;/pre&gt;
&lt;h4&gt;試行&lt;/h4&gt;
&lt;p&gt;以下のコマンド実行。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;getclip.groovy&lt;/span&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;クリップボードの情報が表示されるはず。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ls | putclip.groovy&lt;/span&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;こちらは、出力内容を受け取りクリップボードにセットしてくれる。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4494368208743347724?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4494368208743347724/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/blog-post_19.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4494368208743347724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4494368208743347724'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/blog-post_19.html' title='クリップボードのパイプ操作スクリプトを作成してみる'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4652488115745796327</id><published>2009-02-17T15:25:00.000+09:00</published><updated>2009-02-17T15:25:18.328+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy(Java)でCSVレコードの分解 - opencsvライブラリを使用</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/33/"&gt;RFC 4180対応版 CSVレコードの分解 どう書く？org&lt;/a&gt;をといてみた。 &lt;strong&gt;=&amp;gt;&lt;/strong&gt; &lt;a href="http://ja.doukaku.org/comment/8517/"&gt;&lt;em&gt;どう書く？org 8517 genzou: (RFC 4180対応版 CSVレコードの分解) - 投稿の詳細&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;fumokmmさんがすでに回答済みでしたので、別解で。というか、ただライブラリを使用しただけです。&lt;/p&gt;
&lt;p&gt;ご存知の方も多いと思いますが、javaには&lt;a href="http://opencsv.sourceforge.net/"&gt;opencsv&lt;/a&gt;というcsvファイルの読み書き用ライブラリが存在します。そちらを利用しました。&lt;/p&gt;
&lt;p&gt;お題にもあるように、&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;カンマ(,)区切りに対応&lt;/li&gt;
 &lt;li&gt;設定によりtab区切りにも対応&lt;/li&gt;
 &lt;li&gt;ダブルクォート(&amp;quot;)による要素の囲みに対応&lt;/li&gt;
 &lt;li&gt;ダブルクォート内のダブルクォートの入れ子に対応（&amp;quot;&amp;quot;で表現)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;をすべて満たしており、大変使いやすいです。&lt;/p&gt;
&lt;h4&gt;追記&lt;/h4&gt;
&lt;p&gt;いよいよ花粉症の季節到来です。&lt;/p&gt;
&lt;p&gt;この時期は慢性的に睡眠不足になってしまいます。昨日も今日も睡眠不足。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4652488115745796327?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4652488115745796327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovyjavacsv-opencsv.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4652488115745796327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4652488115745796327'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovyjavacsv-opencsv.html' title='Groovy(Java)でCSVレコードの分解 - opencsvライブラリを使用'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3855317937946506437</id><published>2009-02-10T14:03:00.005+09:00</published><updated>2009-02-10T14:10:55.814+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>GroovyでOS独自のコマンドをパイプしてみる。</title><content type='html'>&lt;p&gt;javaのポリシーからは脱線してしまうが、OSのコマンドを&lt;strong&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;パイプ&lt;/span&gt;&lt;/strong&gt;してみる。&lt;/p&gt;
&lt;p&gt;ホームディレクトリの中のテキストファイルをピックアップしてみる。僕のWindowsＰＣにはcygwinがインストールされているので、cygwinのコマンドを実行してみる。&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
def bin = &amp;quot;C:/cygwin/bin&amp;quot;
def p1 = &amp;quot;${bin}/ls.exe -lta ~/&amp;quot;.execute()
def p2 = &amp;quot;${bin}/grep.exe txt&amp;quot;.execute()
println((p1 | p2).text)
&lt;/pre&gt;
&lt;p&gt;このぐらいであれば&lt;/p&gt;
&lt;pre name="code" language="java"&gt;
new File(path).listFiles().findAll{ it.name =~ /.+\.txt/ }.each{
    println it.name
}
&lt;/pre&gt;
&lt;p&gt;と記述したほうがはるかにいいと思うがそこはおいておいて。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;diff実行&amp;rarr;差分を整形してレポートへ&lt;/strong&gt;、とかできるのは魅力的。&lt;/p&gt;
&lt;p&gt;面白いのは、 &lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(51, 153, 102);"&gt;&lt;strong&gt;Processクラスインスタンス |&amp;nbsp; Processクラスインスタンス&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;にて、新しいプロセスが取得されること。これは面白い。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3855317937946506437?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3855317937946506437/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovyos.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3855317937946506437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3855317937946506437'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovyos.html' title='GroovyでOS独自のコマンドをパイプしてみる。'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4443423607303283300</id><published>2009-02-09T23:22:00.003+09:00</published><updated>2009-02-10T07:53:42.084+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>GroovyConsoleにて、staticな変数が生き残る</title><content type='html'>&lt;p&gt;ちょっとだけ引っかかってしまったのでメモ。&lt;/p&gt;
&lt;p&gt;仕事などでも、WEBに掲載されているJavaサンプルコードは&lt;strong&gt;GroovyConsole&lt;/strong&gt;で実行することが多い。Javaのソースコードでも修正せずにある程度動くため、Groovy以外でもかなり重宝している。&lt;/p&gt;
&lt;p&gt;ただし、staticな変数の使用には注意が必要。たとえば以下のようなコードをGroovyConsoleで順番に実行してみる。&lt;/p&gt;
&lt;h5&gt;コード１を実行&lt;/h5&gt;
&lt;pre name="code" language="java"&gt;
x = 300
println x
&lt;/pre&gt;
&lt;h5&gt;コード２を実行&lt;/h5&gt;
&lt;pre name="code" language="java"&gt;
println x
&lt;/pre&gt;
&lt;p&gt;あら不思議。xの値が表示できてしまう。GroovyConsoleを朝から晩まで落とさずに使用していると、以前実行したstatic変数値が残り続ける。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4443423607303283300?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4443423607303283300/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovyconsolestatic.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4443423607303283300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4443423607303283300'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovyconsolestatic.html' title='GroovyConsoleにて、staticな変数が生き残る'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-3096588052666057826</id><published>2009-02-05T13:03:00.001+09:00</published><updated>2009-02-05T13:07:20.007+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>確かに、日本語だと違いを聞き取れないけど</title><content type='html'>&lt;p&gt;既存コードの解析をしていたところ、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;obj2str()&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;というメソッドがあった。&lt;/p&gt;

&lt;p&gt;「NullPointerException回避処理を追加したtoString()実行メソッドなんだろなー」とコードを見ていた。&lt;/p&gt;

&lt;p&gt;そのすぐ直下に&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;obj1str()&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;というメソッドがあった。&lt;/p&gt;

&lt;p&gt;・・・・・はぁ？？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-3096588052666057826?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/3096588052666057826/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/blog-post_05.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3096588052666057826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/3096588052666057826'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/blog-post_05.html' title='確かに、日本語だと違いを聞き取れないけど'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7740721368072286029</id><published>2009-02-04T13:35:00.005+09:00</published><updated>2009-02-04T14:14:16.385+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>groovyでの簡単なファイルコピー処理</title><content type='html'>&lt;p&gt;ファイルコピー非常に簡単な方法がわかったのでメモ。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
hoge = new File(&amp;quot;hoge&amp;quot;)
fuge = new File(&amp;quot;fuge&amp;quot;)
hoge &amp;lt;&amp;lt; fuge.readBytes()
&lt;/pre&gt;
&lt;p&gt;簡潔だと思う。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7740721368072286029?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7740721368072286029/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovy.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7740721368072286029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7740721368072286029'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/groovy.html' title='groovyでの簡単なファイルコピー処理'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6756555758740742116</id><published>2009-02-04T07:52:00.006+09:00</published><updated>2009-02-04T08:06:58.175+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>自作java2groovy</title><content type='html'>&lt;p&gt;groovyインストール後は&lt;strong&gt;java2groovy&lt;/strong&gt;というjavaのコードをgroovyのコードに変換してくれるコマンドが用意されている。けれども結構気にくわない点が多い（不要な改行が追加される、setter、getterへの参照をプロパティ参照形式にしてほしいがしてくれない、など）&lt;/p&gt;
&lt;p&gt;再発明になるかもしれないが、自作してみる。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
#!/usr/bin/env groovy
def text = new File(args[0]).text
[
    /\t/ : &amp;quot; &amp;quot;*4,
    /\.get([a-zA-Z0-9_]+)\s*\(\s*\)/ : { all, part -&amp;gt; &amp;quot;.&amp;quot; + part[0].toLowerCase() + part[1..-1] },
    /System\.out\./ : &amp;quot;&amp;quot;,
    /\.set(\w+)\s*\(([ja-zA-Z0-9_ &amp;quot;']+)\)/ : { all, property, obj -&amp;gt; &amp;quot;.&amp;quot; + property[0].toLowerCase() + property[1..-1] + &amp;quot; = &amp;quot; + obj },
    /\/\*\*(?ms).+?\*\// : &amp;quot;&amp;quot;,
].each{
    text = text.replaceAll(it.key, it.value)
}

[
    / +$/ : &amp;quot;&amp;quot;,
    /;$/ : &amp;quot;&amp;quot;,
    /(?&amp;lt;=^\s*)(public\s+)?(String|int|float|double|byte|boolean)\s+/ : &amp;quot;def &amp;quot;,
].each{ key, value -&amp;gt;
    text = text.split(&amp;quot;\n&amp;quot;).collect{ it.replaceAll(key, value) }.join(&amp;quot;\n&amp;quot;)
}
println text
&lt;/pre&gt;
&lt;h4&gt;機能&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;各行の末尾の&amp;quot;;&amp;quot;を除去&lt;/li&gt;
 &lt;li&gt;&amp;quot;System.out.〜&amp;quot;の記述から、&amp;quot;System.out.&amp;quot;を除去&lt;/li&gt;
 &lt;li&gt;o.getXxx()、o.setYyy(b)の記述は、o.xxx、o.yyy = bに&lt;/li&gt;
 &lt;li&gt;基本データ型の宣言部分は、groovyっぽく&lt;strong&gt;def&lt;/strong&gt;を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;その他のマイアレンジ&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;仕事で他の人の長いソース見るときに使うが、コメント見て何かいているかよく分からないソースが多いため（笑）、コメント除去&lt;/li&gt;
 &lt;li&gt;タブ文字を半角文字に&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ノイズが少ないので、ソース解析によい&lt;/h4&gt;
&lt;p&gt;javaのコードとgroovyのコードの違いの一つとして、&lt;strong&gt;ノイズ量&lt;/strong&gt;がある。&lt;/p&gt;
&lt;p&gt;コードの読みやすさって、どれだけそのコードが無駄な処理をしていないかというのがものすごく大きい。groovyコードに変換すると、わずかながらソースの文字数がへるので解析しやすくなる。&lt;/p&gt;
&lt;p&gt;でも、他のソースへ飛んだりは&lt;strong&gt;eclipse&lt;/strong&gt;や&lt;strong&gt;Netbeans&lt;/strong&gt;つかった方が見やすいんだよなぁ。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6756555758740742116?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6756555758740742116/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/java2groovy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6756555758740742116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6756555758740742116'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/java2groovy.html' title='自作java2groovy'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2291092035703246261</id><published>2009-02-03T11:14:00.003+09:00</published><updated>2009-02-03T11:16:49.932+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>今年もやっぱり風邪ひいた。風邪ひき続け記録更新中。</title><content type='html'>&lt;p&gt;先週金曜日、定時直後から体の調子が悪かった。どうやら風邪を引いたらしい。堂島ビルで作業しているが、ビル内でもみな咳き込んでいる状態。ビルの中は密閉空間なので風邪も広がるだろうなぁ。&lt;/p&gt;
&lt;p&gt;土日はゆっくり休養し、月曜日は仕事へ向かったのだが午前中でリタイヤ。&lt;/p&gt;
&lt;p&gt;今回の風邪はせきがほとんど出ず、土日は痰が、月曜日は割れそうなほどのすさまじい頭痛という症状だった。昨晩はプールにつかったんじゃないかというほどの大量の汗をかき、今はまずまずの体調。&lt;/p&gt;
&lt;p&gt;僕は比較的からだがよわい。しかし嫁は何年も風邪をひいたことがなく、風邪をひいたことを覚えていないぐらい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2291092035703246261?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2291092035703246261/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2291092035703246261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2291092035703246261'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/02/blog-post.html' title='今年もやっぱり風邪ひいた。風邪ひき続け記録更新中。'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5654748466748439919</id><published>2009-01-30T16:09:00.005+09:00</published><updated>2009-01-30T16:20:01.345+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>作業予定表から週単位で作業量を積み上げる どう書く？orgをといてみた。</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/227/"&gt;作業予定表から週単位で作業量を積み上げる どう書く？org&lt;/a&gt;をといてみた。&lt;/p&gt;
&lt;p&gt;かなりスパゲッティになってしまっている。&lt;/p&gt;
&lt;p&gt;独力で解こうとしたが弱いおつむがヒートしそうなので、&lt;a href="http://ja.doukaku.org/comment/8378/"&gt;fumokmm&lt;/a&gt;さんの解答を参考に。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
import static java.util.Calendar.*

def initTasks = [
    [start:&amp;quot;2009/1/10&amp;quot;, days:21, mark:&amp;quot;＃&amp;quot;],
    [start:&amp;quot;2009/1/15&amp;quot;, days: 6, mark:&amp;quot;＠&amp;quot;],
    [start:&amp;quot;2009/1/10&amp;quot;, days: 8, mark:&amp;quot;＊&amp;quot;],
    [start:&amp;quot;2009/1/16&amp;quot;, days: 1, mark:&amp;quot;＝&amp;quot;],
    [start:&amp;quot;2009/1/16&amp;quot;, days: 3, mark:&amp;quot;％&amp;quot;],
    [start:&amp;quot;2009/1/30&amp;quot;, days: 4, mark:&amp;quot;＝&amp;quot;],
]


// 日別のタスクテーブル作成
def eachDayTasks = [:]
(new Date(&amp;quot;2009/1/1&amp;quot;)..new Date(&amp;quot;2009/1/31&amp;quot;)).each{ date -&amp;gt;
    eachDayTasks[date] = initTasks.collect{
        def start = new Date(it.start)
        (date in start..&amp;lt;(start+it.days))?it.mark:[]
    }.flatten()
}

// 週別のタスクテーブル
def eachWeekTasks = [:]
eachDayTasks.groupBy{ key, value -&amp;gt;
    key[WEEK_OF_YEAR] - (key[DAY_OF_WEEK]==SUNDAY?1:0)
}.each{ groupKey, task -&amp;gt;
    eachWeekTasks[task*.key.min().format('MM/dd')] = task*.value.flatten().sort()
}

// 出力
def createLine = { list, num -&amp;gt; list*.center(num).join() }
def line = []
line &amp;lt;&amp;lt; createLine(eachWeekTasks.keySet(), 6)
(0..&lt;/pre&gt;
&lt;p&gt;結構汚いｗ&lt;/p&gt;
&lt;h4&gt;初めて知ったこと&lt;/h4&gt;
&lt;p&gt;いつもSimpleDateFormatを利用してフォーマット処理を記述していた。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;new SimpleDateFormat(&amp;quot;yyyy/MM/dd&amp;quot;).format(new Date())&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;みたいに。&lt;/p&gt;
&lt;p&gt;groovy1.5.7（から？）では&lt;strong&gt;Date.format&lt;/strong&gt;メソッドが使える。&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;new Date().format(&amp;quot;yyyy/MM/dd&amp;quot;)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;結構便利。&lt;/p&gt;
&lt;h4&gt;ちょっとしたTips&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Calendar.SUNDAY&lt;/strong&gt;、&lt;strong&gt;Calendar.WEEK_OF_YEAR&lt;/strong&gt;などの定数は、ソースの先頭で以下の分を記述することでクラスの指定を省略できて、ちょっと見やすくなる。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
import static java.util.Calendar.*
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5654748466748439919?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5654748466748439919/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/org_30.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5654748466748439919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5654748466748439919'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/org_30.html' title='作業予定表から週単位で作業量を積み上げる どう書く？orgをといてみた。'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4187534082359355545</id><published>2009-01-28T18:56:00.008+09:00</published><updated>2009-01-28T21:09:03.987+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>配列リテラルの記述が、カンマが一個多くても正常に動作するよ</title><content type='html'>&lt;p&gt;いつものことですが、人のソースを見ているととても勉強になる。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.doukaku.org/227/lang/groovy/"&gt;作業予定表から週単位で作業量を積み上げる Groovyで どう書く？org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;をのんびり見ているときのこと。&lt;/p&gt;
&lt;p&gt;以下のようなソースの記述を見つけ、「&lt;strong&gt;あれ？カンマ一個多いな。&lt;/strong&gt;」と思った。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
// ワークプランリスト
def workPlanList = [
&amp;nbsp;&amp;nbsp; new Plan(date:'2009/1/10', days: 21, mark:'＃'),
&amp;nbsp;&amp;nbsp; new Plan(date:'2009/1/15', days:&amp;nbsp; 6, mark:'＠'),
&amp;nbsp;&amp;nbsp; new Plan(date:'2009/1/10', days:&amp;nbsp; 8, mark:'＊'),
&amp;nbsp;&amp;nbsp; new Plan(date:'2009/1/16', days:&amp;nbsp; 1, mark:'＝'),
&amp;nbsp;&amp;nbsp; new Plan(date:'2009/1/16', days:&amp;nbsp; 3, mark:'％'),
&amp;nbsp;&amp;nbsp; new Plan(date:'2009/1/30', days:&amp;nbsp; 4, mark:'＝'),
]&lt;/pre&gt;
&lt;p&gt;しかし、不思議なことに、これは正常に動作する。&lt;/p&gt;
&lt;p&gt;もしやと思って以下のコードを実行してみると・・・&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
println([1, 2, 3, 4, 5, ])
println([1, 2, 3, 4, 5, ].size())&lt;/pre&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;&amp;gt;&amp;gt; [1, 2, 3, 4, 5, ]&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;&amp;gt;&amp;gt; 5&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;あら、正常に動作した。&lt;strong&gt;最後のカンマは無視されるのかな？&lt;/strong&gt;でも以下のようなコードはカンマが全行にあったほうがコーディングしやすい（マクロとか使うとき楽だし、こぴぺもしやすい）&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def list = [
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;たろう&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;はなこ&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;さぶろう&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;しろう&amp;quot;,
]&lt;/pre&gt;
&lt;p&gt;面白い。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4187534082359355545?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4187534082359355545/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post_28.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4187534082359355545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4187534082359355545'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post_28.html' title='配列リテラルの記述が、カンマが一個多くても正常に動作するよ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6506584802584217218</id><published>2009-01-28T13:19:00.007+09:00</published><updated>2009-01-28T13:21:23.888+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>IPv6アドレスの短縮 どう書く？org</title><content type='html'>&lt;p&gt;&lt;a href="http://ja.doukaku.org/226/"&gt;IPv6アドレスの短縮 どう書く？org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;の問題をといてみたが難しいので他の方の解答を見てみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.doukaku.org/comment/8349/"&gt;どう書く？org 8349 horiuchi: Javaには、IPv6のアドレスも標準で...(IPv6アドレスの短縮) - 投稿の詳細&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;を見ると・・・あらら、こんなに簡単にかけるんだね。&lt;/p&gt;
&lt;p&gt;ほんとJavaの標準ライブラリ知っているのと知らないのでは生産性ぜんぜん違うね。職場でも必死に半角英数字ふくむ、ふくまないをループで一文字ずつ処理している後輩を見ると悲しくなる。&lt;/p&gt;
&lt;p&gt;Groovyで実装した解答を載せます。&lt;em&gt;ああ、実質３行だｗ&lt;/em&gt;&lt;/p&gt;
&lt;pre name="code" language="java"&gt;def compressIpv6(address){
&amp;nbsp;&amp;nbsp;&amp;nbsp; return java.net.InetAddress.getByName(address).hostAddress.replaceFirst(&amp;quot;(^|:)(0:){2,}&amp;quot;, &amp;quot;::&amp;quot;)
}
println compressIpv6(&amp;quot;1230:5670:0000:0000:0123:0000:0000:00ab&amp;quot;)
println compressIpv6(&amp;quot;0000:0000:0000:0000:0000:0000:0000:0001&amp;quot;)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6506584802584217218?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://ja.doukaku.org/226/' title='IPv6アドレスの短縮 どう書く？org'/><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6506584802584217218/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/ipv6-org.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6506584802584217218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6506584802584217218'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/ipv6-org.html' title='IPv6アドレスの短縮 どう書く？org'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2352848358960678257</id><published>2009-01-26T13:05:00.001+09:00</published><updated>2009-01-27T06:33:59.717+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Re：Re:ファイルの添え番号の桁を3桁に揃えるGroovyスクリプト</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090120/1232465055"&gt;Re:ファイルの添え番号の桁を3桁に揃えるGroovyスクリプト - No Programming, No Life&lt;/a&gt;というGroovyを利用してファイル名のリネームを行うコードがあったので、記載されていたものを拝借して僕なりにコーディングしてみた。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def list = [
   'hoge[1].jpg',
   'hoge[11].jpg',
   'hoge[2].jpg',
   'hoge[10111].jpg',
   'hoge[10].jpg',
   'hoge[100].jpg'
]

// 最大桁数を求めて
def maxDigit = list*.replaceAll(/^[^\d]*|[^\d]*$/, &amp;quot;&amp;quot;)*.size().max()
// 変換して
def repList = list.collect{ padNumber(it, maxDigit) }
// ソートして出力する
repList.sort().each{ println it }

def padNumber(text, digit) {
&amp;nbsp;&amp;nbsp; text.replaceAll(/\d+/){ it.padLeft(digit, '0') }
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;最大桁数を求める部分&lt;/strong&gt;を記述して気づいたけど、こういうコード記述する機会は決して少なくはないと思う。&lt;/p&gt;
&lt;p&gt;文字列の配列から特定のパターンの文字列のみを取り出したい場合は、こんな記述もできるということを始めて知った未熟者。&lt;/p&gt;
&lt;p&gt;javascriptなら、&lt;strong&gt;&amp;quot;&lt;/strong&gt;&lt;strong&gt;&amp;nbsp; 文字列 &amp;quot;.replace(/^ *| *$/g, &amp;quot;&amp;quot;)&lt;/strong&gt;みたいにしてtrimするコード書くことよくありますね。&lt;/p&gt;
&lt;h4&gt;追記：2009/01/27&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090120/1232465055"&gt;fumokmm&lt;/a&gt;さんが、以下のような方法も教えてくれました。(MessageFormatを利用する例)&lt;/p&gt;
&lt;pre name="code" language="java"&gt;format = new java.text.MessageFormat('{0}[{1}]{2}')
def maxDigit = list.collect{ format.parse(it)[1] }*.size().max()&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;MessageFormatっていうクラスあるんですね（恥&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2352848358960678257?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2352848358960678257/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/rere3groovy.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2352848358960678257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2352848358960678257'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/rere3groovy.html' title='Re：Re:ファイルの添え番号の桁を3桁に揃えるGroovyスクリプト'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2295925208269930345</id><published>2009-01-26T09:47:00.002+09:00</published><updated>2009-01-26T09:49:58.996+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>社会人バドミントン大会で初めて３位</title><content type='html'>&lt;p&gt;日曜日、&lt;strong&gt;バドミントン&lt;/strong&gt;の試合に出場してきた。&lt;/p&gt;
&lt;p&gt;金曜、土曜と試合前の調整をしたがあまり調子がよくなく、不安があった。日曜日はまずまずの調子で、社会人の大会で初めて予選を通ることができ、準決勝へ。けれども&lt;strong&gt;東南アジア系のダブルスペア&lt;/strong&gt;に負けてしまった。勝てなくもない試合だったのになぁ。&lt;/p&gt;
&lt;p&gt;結局そこのベアが優勝し、僕らは&lt;strong&gt;３位&lt;/strong&gt;という結果に終わった。でも社会人の大会で初めて３位をとり、賞状までいただいたのでうれしかった。&lt;/p&gt;
&lt;p&gt;嫁も喜んでくれたし。&lt;em&gt;&lt;span style="font-size: larger;"&gt;丸一日外で遊んできててごめんね&lt;/span&gt;&lt;/em&gt;。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2295925208269930345?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2295925208269930345/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post_26.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2295925208269930345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2295925208269930345'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post_26.html' title='社会人バドミントン大会で初めて３位'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4079700529590256377</id><published>2009-01-21T11:37:00.001+09:00</published><updated>2009-01-21T13:03:19.351+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>なくした財布が・・・</title><content type='html'>&lt;p&gt;先週末に財布をなくした件の続き。&lt;/p&gt;
&lt;p&gt;昨日仕事中に、突然覚えのない電話番号から電話。&lt;/p&gt;
&lt;p&gt;電話に出てみると、天王寺警察署からだった。まさかと思ったが、どうやら財布が見つかったとのこと。&lt;/p&gt;
&lt;p&gt;「よかったー、免許証や保険証の再発行だけでも5000円近く費用が浮くからなーお金なくてもよかった」と思っていたのですが、&lt;strong&gt;金品は一切盗まれていないということだった。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;どうしても届けてくれた方にお礼をしたいと告げたのですが、&lt;strong&gt;拾ってくださった方が匿名でお願いしたい&lt;/strong&gt;ということのよう。&lt;/p&gt;
&lt;p&gt;嫁にとりにいってきてもらい、中身を見たのですが本当になにも盗られていない。なんか歳をとるにしたがって考え方が汚くなってきたのかなと思った。自分、当たり前のことができなくなっているんじゃないのかな。&lt;/p&gt;
&lt;p&gt;いただいた恩を自分も同じように返したいと思った。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4079700529590256377?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4079700529590256377/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post_21.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4079700529590256377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4079700529590256377'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post_21.html' title='なくした財布が・・・'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7179797470910367935</id><published>2009-01-20T13:00:00.000+09:00</published><updated>2009-01-20T13:19:51.449+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Help Balloons PluginでGUIにヘルプ機能を追加</title><content type='html'>&lt;p&gt;&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt;HelpBalloons Plugin&lt;/a&gt;というプラグインを使用して、画面の操作に関するヘルプ機能を追加できるようです。いつものように早速試してみる。&lt;/p&gt;
&lt;h4&gt;料理名&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt;HelpBalloons Plugin&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;材料&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;grails&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;作り方&lt;/h4&gt;
&lt;ol&gt;
 &lt;li&gt;プロジェクトを作成する&lt;b&gt;（省略！）&lt;/b&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt; HelpBalloons Plugin&lt;/a&gt;をインストールする&lt;/li&gt;
 &lt;li&gt;適当な画面を作成&lt;b&gt;（省略！）&lt;/b&gt;&lt;/li&gt;
 &lt;li&gt;gspに、&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt; HelpBalloons Plugin&lt;/a&gt;を組み込む&lt;/li&gt;
 &lt;li&gt;起動！&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;手順２&lt;/h4&gt;
&lt;p&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails install-plugin help-balloons&lt;/b&gt;&lt;/span&gt;を実行する。&lt;/p&gt;
&lt;h4&gt;手順４&lt;/h4&gt;
&lt;p&gt;gspの&lt;b&gt;ヘッダータグ&lt;/b&gt;内に、以下の内容を追記する。（help ballooonsを使用する際のおまじない）&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;lt;g:helpBalloons/&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;バルーンを表示したい箇所に、以下のようにタグを記述する。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;lt;g:helpBalloon title=&amp;quot;こんにちわ&amp;quot; content=&amp;quot;てすとですよ&amp;quot;/&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: teal;"&gt;  &lt;/span&gt;  文字通り、title属性はバルーンのタイトル（ウィンドウタイトルみたいなもの）、content属性は本文部分の内容をそれぞれ記述する。&lt;/p&gt;
&lt;h4&gt;手順５&lt;/h4&gt;
&lt;p&gt;表示。  ここではタイトル部分（&lt;b&gt;todo&lt;/b&gt;）の右側に&lt;span style="color: rgb(153, 51, 0);"&gt;&lt;b&gt;&amp;lt;g:helpBalloon title=&amp;quot;こんにちわ&amp;quot; content=&amp;quot;てすとですよ&amp;quot;/&amp;gt;&lt;/b&gt;&lt;/span&gt;を記述してみた例。&lt;/p&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQT9p5SwI/AAAAAAAAAUw/SGVKBxW7Hek/s1600-h/00000.png"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQT9p5SwI/AAAAAAAAAUw/SGVKBxW7Hek/s320/00000.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://3.bp.blogspot.com/_c1sAJym_hc4/SXVQZJMbIxI/AAAAAAAAAU4/CLe4GJjRBgA/s1600-h/00001.png"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_c1sAJym_hc4/SXVQZJMbIxI/AAAAAAAAAU4/CLe4GJjRBgA/s320/00001.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both; text-align: center;" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em;" imageanchor="1" href="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQdURX6fI/AAAAAAAAAVA/DYQTTYAKUs8/s1600-h/00002.png"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQdURX6fI/AAAAAAAAAVA/DYQTTYAKUs8/s320/00002.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;なんだかかっこいい！！ちょっとかっこいいサイトっぽくみえる！よりわかりやすいGUIとしていいかもしれません。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7179797470910367935?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7179797470910367935/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/help-balloons-plugingui.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7179797470910367935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7179797470910367935'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/help-balloons-plugingui.html' title='Help Balloons PluginでGUIにヘルプ機能を追加'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQT9p5SwI/AAAAAAAAAUw/SGVKBxW7Hek/s72-c/00000.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-2896852461703581322</id><published>2009-01-20T10:04:00.000+09:00</published><updated>2009-01-20T12:46:28.214+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diary'/><title type='text'>財布をなくしてゆかいなゲンゾウさん</title><content type='html'>&lt;p&gt;先週金曜日に財布をなくしてしまった。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;結婚前&lt;/li&gt;
 &lt;li&gt;長女誕生前&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;は毎週２回はバドミントンをしていたのですが、家事・子育てをする必要があり&lt;em&gt;（もっともどちらも嫁にまかせきりですがｗ）&lt;/em&gt;あまり参加できずにいた。&lt;/p&gt;
&lt;p&gt;それでも嫁にわがままをいい、週一回程度は参加するようにしていました。&lt;/p&gt;
&lt;p&gt;球技は視力低下にとてもいいうえに、運動するとその週の仕事が不思議とはかどります（血流よくなるからかな）。&lt;/p&gt;
&lt;p&gt;先週土曜日もバドミントンをしに行ってきたのですが、あまりに楽しみで心が浮ついていたのだろう。自転車をこいでいる間に財布をおとしてしまった。&lt;/p&gt;
&lt;p&gt;気づいたのは次の日の夜20:00ぐらい。「あれ？いつもの場所に財布がない？？」&lt;/p&gt;
&lt;h4&gt;意外と面倒なクレジットカード停止手続き&lt;/h4&gt;
&lt;p&gt;今回財布をなくして初めて知ったが、クレジットカード停止手続きは非常にめんどくさい。&lt;/p&gt;
&lt;p&gt;自分が持っているクレジットカードの会社がわからなかったため、手当たり次第にクレジットカード会社に電話して、登録がないかを確認し、停止した。&lt;/p&gt;
&lt;p&gt;８会社ぐらい電話したと思う。自分の持っているクレジットカードの会社ぐらい把握しておかなければならないと思った。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-2896852461703581322?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/2896852461703581322/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2896852461703581322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/2896852461703581322'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/blog-post.html' title='財布をなくしてゆかいなゲンゾウさん'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-7674495365436933302</id><published>2009-01-16T07:05:00.006+09:00</published><updated>2009-01-17T22:54:55.058+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails ModalBox Pluginでモーダルなウィンドウを表示</title><content type='html'>&lt;h4&gt;今回の料理名&lt;/h4&gt;
&lt;p&gt;モーダルなウィンドウ&lt;/p&gt;
&lt;h4&gt;材料&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;grails&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;作り方&lt;/h4&gt;
&lt;ol&gt;
 &lt;li&gt;プロジェクトを作成する&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://www.grails.org/ModalBox+Plugin"&gt;ModalBox Plugin&lt;/a&gt;をインストールする&lt;/li&gt;
 &lt;li&gt;Domainクラス作成&lt;/li&gt;
 &lt;li&gt;適当な画面を作成&lt;/li&gt;
 &lt;li&gt;gspに、&lt;a href="http://www.grails.org/ModalBox+Plugin"&gt;ModalBox Plugin&lt;/a&gt;を組み込む&lt;/li&gt;
 &lt;li&gt;起動！&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;手順１&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="color: teal;"&gt;grails create-app gstudy&lt;/span&gt;&lt;/b&gt;を作成してみました。&lt;/p&gt;
&lt;h4&gt;手順２&lt;/h4&gt;
&lt;p&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails install-plugin modalbox&lt;/b&gt;&lt;/span&gt;を実行する。&lt;/p&gt;
&lt;h4&gt;手順３&lt;/h4&gt;
&lt;p&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails create-domain-class entry&lt;/b&gt;&lt;/span&gt;でドメイン作成。&lt;br /&gt;
以下のようなソースを記述&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
class Entry {
    /*
    static hasMany = [
    ]
    */
    
    /*
 static belongsTo = [
    ]
    */

    String title
    String body
    Date dateCreated
    Date lastUpdated

    static constraints = {
     title()
     body(size:0..5000)
        dateCreated(editable:false)
        lastUpdated(editable:false)
    }
    
    // for select-box, link etc..
    /*
    String toString(){
    }
    */
}
&lt;/pre&gt;
&lt;h4&gt;手順４&lt;/h4&gt;
&lt;p&gt;&lt;span style="color: teal;"&gt;&lt;b&gt;grails generate-all entry&lt;/b&gt;&lt;/span&gt;を実行する。&lt;/p&gt;
&lt;h4&gt;手順５&lt;/h4&gt;
&lt;p&gt;一覧でレコードを選択したときに、詳細情報をModal Boxで表示するようにしてみる。&lt;br /&gt;
views/entry/list.gspを修正する。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;headタグ内に、&lt;b&gt;&amp;lt;modalbox:modalIncludes /&amp;gt;&lt;/b&gt;を記述&lt;/li&gt;
 &lt;li&gt;id選択時のリンク表示部分を&lt;b&gt;&amp;lt;modalbox:createLink controller=&amp;quot;entry&amp;quot; action=&amp;quot;show&amp;quot; id=&amp;quot;${entryInstance.id}&amp;quot; title=&amp;quot;Show DATA!&amp;quot; width=&amp;quot;500&amp;quot;&amp;gt;${fieldValue(bean:entryInstance, field:'id')}&amp;lt;/modalbox:createLink&amp;gt;&lt;/b&gt;と書き換え&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;手順６&lt;/h4&gt;
&lt;p&gt;起動！&lt;br /&gt;
おお！できた！！めっちゃかっこいい！！&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_c1sAJym_hc4/SW-_FZlYuXI/AAAAAAAAAUI/Xq3sNBEAFpw/s1600-h/001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" alt="" src="http://3.bp.blogspot.com/_c1sAJym_hc4/SW-_FZlYuXI/AAAAAAAAAUI/Xq3sNBEAFpw/s320/001.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;一覧を表示し、データ選択&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_c1sAJym_hc4/SW-_KaikMTI/AAAAAAAAAUQ/oFRxphMhgB4/s1600-h/002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" alt="" src="http://3.bp.blogspot.com/_c1sAJym_hc4/SW-_KaikMTI/AAAAAAAAAUQ/oFRxphMhgB4/s320/002.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;モーダルなボックスで表示される。&lt;/div&gt;
&lt;p&gt;ボックスは右上の&amp;times;ボタンで閉じることもできます。ボックス内のリンクをクリックすれば、ウィンドウ全体が遷移されます。&lt;/p&gt;
&lt;p&gt;情報入力後の更新内容確認表示なんかにいいのではないでしょうか。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-7674495365436933302?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/7674495365436933302/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/grails-modalbox-plugin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7674495365436933302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/7674495365436933302'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/grails-modalbox-plugin.html' title='Grails ModalBox Pluginでモーダルなウィンドウを表示'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_c1sAJym_hc4/SW-_FZlYuXI/AAAAAAAAAUI/Xq3sNBEAFpw/s72-c/001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-4020182735869918132</id><published>2009-01-15T07:56:00.002+09:00</published><updated>2009-01-15T09:20:03.669+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>ブログアプリをつくろう（しかしsyntax-highlighterがインストールできず）</title><content type='html'>&lt;p&gt;ということで、久しぶりにgrailsを使って何かを作ってみる。&lt;/p&gt;
&lt;p&gt;ブログアプリを作ってみることにする。&lt;/p&gt;
&lt;h4&gt;まずはプラグインインストールだが&lt;/h4&gt;
&lt;p&gt;今までエントリにも書いた&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;richui&lt;/li&gt;
 &lt;li&gt;syntax-highlighter&lt;/li&gt;
 &lt;li&gt;i18n-template&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を&lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails install-plugin　〜&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;でインストール、で問題ないはずが、syntax-highlighterだけインストールが失敗。&lt;/p&gt;
&lt;p&gt;最新版が&lt;strong&gt;0.1.2&lt;/strong&gt;だが、&lt;strong&gt;0.1.1&lt;/strong&gt;のフォルダがないと起こられてしまう。&lt;/p&gt;
&lt;p&gt;------------------------------&lt;/p&gt;
&lt;div class="ArwC7c ckChnd" id=":14c"&gt;&lt;wbr&gt;&lt;/wbr&gt;------------------------------&lt;wbr&gt;&lt;/wbr&gt;------&lt;br /&gt;
Reading [triggers] plug-in info ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp;[mkdir] Created dir: /home/genzou/.grails/1.0.4/&lt;wbr&gt;&lt;/wbr&gt;plugins/syntax-highlighter&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;[get] Getting:&lt;br /&gt;
&lt;a target="_blank" href="http://plugins.grails.org/grails-syntax-highlighter/tags/RELEASE_0_1_2/grails-syntax-highlighter-0.1.2.zip"&gt;http://plugins.grails.org/&lt;wbr&gt;&lt;/wbr&gt;grails-syntax-highlighter/&lt;wbr&gt;&lt;/wbr&gt;tags/RELEASE_0_1_2/grails-&lt;wbr&gt;&lt;/wbr&gt;syntax-highlighter-0.1.2.zip&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;[get] To:&lt;br /&gt;
/home/genzou/.grails/1.0.4/&lt;wbr&gt;&lt;/wbr&gt;plugins/syntax-highlighter/&lt;wbr&gt;&lt;/wbr&gt;grails-syntax-highlighter-0.1.&lt;wbr&gt;&lt;/wbr&gt;2.zip&lt;br /&gt;
...............&lt;br /&gt;
&amp;nbsp; &amp;nbsp; [copy] Copying 1 file to&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/plugins&lt;br /&gt;
&amp;nbsp; &amp;nbsp;[mkdir] Created dir:&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/plugins/&lt;wbr&gt;&lt;/wbr&gt;syntax-highlighter-0.1.2&lt;br /&gt;
&amp;nbsp; &amp;nbsp;[unzip] Expanding:&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/plugins/&lt;wbr&gt;&lt;/wbr&gt;grails-syntax-highlighter-0.1.&lt;wbr&gt;&lt;/wbr&gt;2.zip&lt;br /&gt;
into /home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/plugins/&lt;wbr&gt;&lt;/wbr&gt;syntax-highlighter-0.1.2&lt;br /&gt;
Compiling plugin syntax-highlighter-0.1.2 ... ...&lt;br /&gt;
&amp;nbsp;[groovyc] Compiling 1 source file to&lt;br /&gt;
/home/genzou/.grails/1.0.4/&lt;wbr&gt;&lt;/wbr&gt;projects/giki/classes&lt;br /&gt;
&amp;nbsp; &amp;nbsp;[mkdir] Created dir:&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/web-app/&lt;wbr&gt;&lt;/wbr&gt;plugins/syntax-highlighter-0.&lt;wbr&gt;&lt;/wbr&gt;1.2&lt;br /&gt;
&amp;nbsp; &amp;nbsp; [copy] Copying 16 files to&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/web-app/&lt;wbr&gt;&lt;/wbr&gt;plugins/syntax-highlighter-0.&lt;wbr&gt;&lt;/wbr&gt;1.2&lt;br /&gt;
Loading with installed plug-ins: [&amp;quot;syntaxHighlighter&amp;quot;,&lt;br /&gt;
&amp;quot;developmentUtilities&amp;quot;, &amp;quot;richui&amp;quot;, &amp;quot;i18nTemplates&amp;quot;] ...&lt;br /&gt;
Executing syntax-highlighter-0.1.2 plugin post-install script ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp;[mkdir] Created dir:&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/web-app/&lt;wbr&gt;&lt;/wbr&gt;js/syntaxhighlighter&lt;br /&gt;
/home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/web-app/&lt;wbr&gt;&lt;/wbr&gt;plugins/syntax-highlighter-0.&lt;wbr&gt;&lt;/wbr&gt;1.1/js/syntaxhighlighter&lt;br /&gt;
not found.&lt;br /&gt;
: /home/genzou/20_developments/&lt;wbr&gt;&lt;/wbr&gt;scripts/grails/giki/web-app/&lt;wbr&gt;&lt;/wbr&gt;plugins/syntax-highlighter-0.&lt;wbr&gt;&lt;/wbr&gt;1.1/js/syntaxhighlighter&lt;br /&gt;
not found.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.types.&lt;wbr&gt;&lt;/wbr&gt;AbstractFileSet.&lt;wbr&gt;&lt;/wbr&gt;getDirectoryScanner(&lt;wbr&gt;&lt;/wbr&gt;AbstractFileSet.java:422)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.taskdefs.&lt;wbr&gt;&lt;/wbr&gt;Copy.execute(Copy.java:453)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.&lt;wbr&gt;&lt;/wbr&gt;UnknownElement.execute(&lt;wbr&gt;&lt;/wbr&gt;UnknownElement.java:288)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.dispatch.&lt;wbr&gt;&lt;/wbr&gt;DispatchUtils.execute(&lt;wbr&gt;&lt;/wbr&gt;DispatchUtils.java:105)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.Task.&lt;wbr&gt;&lt;/wbr&gt;perform(Task.java:348)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.taskdefs.&lt;wbr&gt;&lt;/wbr&gt;Sequential.execute(Sequential.&lt;wbr&gt;&lt;/wbr&gt;java:62)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.dispatch.&lt;wbr&gt;&lt;/wbr&gt;DispatchUtils.execute(&lt;wbr&gt;&lt;/wbr&gt;DispatchUtils.java:105)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.apache.tools.ant.Task.&lt;wbr&gt;&lt;/wbr&gt;perform(Task.java:348)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.util.AntBuilder.&lt;wbr&gt;&lt;/wbr&gt;nodeCompleted(AntBuilder.java:&lt;wbr&gt;&lt;/wbr&gt;199)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.util.BuilderSupport.&lt;wbr&gt;&lt;/wbr&gt;doInvokeMethod(BuilderSupport.&lt;wbr&gt;&lt;/wbr&gt;java:153)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.util.AntBuilder.&lt;wbr&gt;&lt;/wbr&gt;doInvokeMethod(AntBuilder.&lt;wbr&gt;&lt;/wbr&gt;java:149)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.util.BuilderSupport.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(BuilderSupport.&lt;wbr&gt;&lt;/wbr&gt;java:64)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.GantBuilder.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(GantBuilder.java:&lt;wbr&gt;&lt;/wbr&gt;52)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokePogoMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:784)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:758)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;170)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at Script1.run(Script1.groovy:18)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.GroovyShell.&lt;wbr&gt;&lt;/wbr&gt;evaluate(GroovyShell.java:543)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.GroovyShell.&lt;wbr&gt;&lt;/wbr&gt;evaluate(GroovyShell.java:518)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokePogoMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:778)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:758)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;170)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;IncludeTargets.leftShift(&lt;wbr&gt;&lt;/wbr&gt;IncludeTargets.groovy:49)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokePogoMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:778)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:758)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;170)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at InstallPlugin_groovy$_run_&lt;wbr&gt;&lt;/wbr&gt;closure3.doCall(InstallPlugin_&lt;wbr&gt;&lt;/wbr&gt;groovy:189)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.java:142)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:79)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:94)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnCurrentN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:78)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at InstallPlugin_groovy$_run_&lt;wbr&gt;&lt;/wbr&gt;closure3.doCall(InstallPlugin_&lt;wbr&gt;&lt;/wbr&gt;groovy)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.java:142)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:79)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.Closure.call(&lt;wbr&gt;&lt;/wbr&gt;Closure.java:292)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.Script.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(Script.java:87)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnGroovyObject(&lt;wbr&gt;&lt;/wbr&gt;MetaClassImpl.java:947)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:894)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.java:142)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:79)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:94)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnCurrentN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:78)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnCurrent0(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;112)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at InstallPlugin_groovy$_run_&lt;wbr&gt;&lt;/wbr&gt;closure1.doCall(InstallPlugin_&lt;wbr&gt;&lt;/wbr&gt;groovy:50)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.java:142)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:79)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:94)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnCurrentN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:78)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at InstallPlugin_groovy$_run_&lt;wbr&gt;&lt;/wbr&gt;closure1.doCall(InstallPlugin_&lt;wbr&gt;&lt;/wbr&gt;groovy)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.java:142)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:79)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.Closure.call(&lt;wbr&gt;&lt;/wbr&gt;Closure.java:292)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.Closure.call(&lt;wbr&gt;&lt;/wbr&gt;Closure.java:287)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.Closure.run(&lt;wbr&gt;&lt;/wbr&gt;Closure.java:368)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMetaClass.java:142)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.gant.&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;GantMetaClass.java:79)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokePogoMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:778)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:758)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;170)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod0(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;198)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at gant.Gant.dispatch(Gant.&lt;wbr&gt;&lt;/wbr&gt;groovy:271)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at gant.Gant.this$2$dispatch(&lt;wbr&gt;&lt;/wbr&gt;Gant.groovy)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:674)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;GeneratedMethodAccessor7.&lt;wbr&gt;&lt;/wbr&gt;invoke(Unknown Source)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokePogoMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:778)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:758)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;170)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at gant.Gant.invokeMethod(Gant.&lt;wbr&gt;&lt;/wbr&gt;groovy)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnCurrentN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:78)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at gant.Gant.processTargets(Gant.&lt;wbr&gt;&lt;/wbr&gt;groovy:436)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodOnCurrentN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:78)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at gant.Gant.processArgs(Gant.&lt;wbr&gt;&lt;/wbr&gt;groovy:372)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:912)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;java:946)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeMethod(MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;java:756)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokePogoMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:778)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.invokeMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:758)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;170)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.grails.&lt;wbr&gt;&lt;/wbr&gt;cli.GrailsScriptRunner.&lt;wbr&gt;&lt;/wbr&gt;callPluginOrGrailsScript(&lt;wbr&gt;&lt;/wbr&gt;GrailsScriptRunner.groovy:261)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.&lt;wbr&gt;&lt;/wbr&gt;reflection.CachedMethod.&lt;wbr&gt;&lt;/wbr&gt;invoke(CachedMethod.java:86)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;doMethodInvoke(MetaMethod.&lt;wbr&gt;&lt;/wbr&gt;java:230)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.MetaClassImpl.&lt;wbr&gt;&lt;/wbr&gt;invokeStaticMethod(&lt;wbr&gt;&lt;/wbr&gt;MetaClassImpl.java:1105)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at groovy.lang.ExpandoMetaClass.&lt;wbr&gt;&lt;/wbr&gt;invokeStaticMethod(&lt;wbr&gt;&lt;/wbr&gt;ExpandoMetaClass.java:957)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.&lt;wbr&gt;&lt;/wbr&gt;invokeStaticMethod(&lt;wbr&gt;&lt;/wbr&gt;InvokerHelper.java:804)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.runtime.&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.&lt;wbr&gt;&lt;/wbr&gt;invokeStaticMethodN(&lt;wbr&gt;&lt;/wbr&gt;ScriptBytecodeAdapter.java:&lt;wbr&gt;&lt;/wbr&gt;215)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.grails.&lt;wbr&gt;&lt;/wbr&gt;cli.GrailsScriptRunner.main(&lt;wbr&gt;&lt;/wbr&gt;GrailsScriptRunner.groovy:121)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke0(Native Method)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;NativeMethodAccessorImpl.java:&lt;wbr&gt;&lt;/wbr&gt;39)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at sun.reflect.&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;invoke(&lt;wbr&gt;&lt;/wbr&gt;DelegatingMethodAccessorImpl.&lt;wbr&gt;&lt;/wbr&gt;java:25)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at java.lang.reflect.Method.&lt;wbr&gt;&lt;/wbr&gt;invoke(Method.java:597)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.grails.&lt;wbr&gt;&lt;/wbr&gt;cli.support.GrailsStarter.&lt;wbr&gt;&lt;/wbr&gt;rootLoader(GrailsStarter.java:&lt;wbr&gt;&lt;/wbr&gt;193)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;at org.codehaus.groovy.grails.&lt;wbr&gt;&lt;/wbr&gt;cli.support.GrailsStarter.&lt;wbr&gt;&lt;/wbr&gt;main(GrailsStarter.java:218)&lt;br /&gt;
------------------------------&lt;wbr&gt;&lt;/wbr&gt;------------------------------&lt;wbr&gt;&lt;/wbr&gt;------&lt;/div&gt;
&lt;div class="ArwC7c ckChnd"&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;web-app/plugins/syntax-hihlighter-0.1.1以下にcss/syntaxhighlighter、js/syntaxhighlighterというフォルダを作成したらインストールは成功した。&lt;/p&gt;
&lt;p&gt;これで動くかどうかは未検証。使うときに試してみよう。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-4020182735869918132?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/4020182735869918132/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/syntax-highlighter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4020182735869918132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/4020182735869918132'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/syntax-highlighter.html' title='ブログアプリをつくろう（しかしsyntax-highlighterがインストールできず）'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-1130453308621130745</id><published>2009-01-10T12:14:00.007+09:00</published><updated>2009-01-10T20:40:23.131+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>HTTPBuilderを使ってみる</title><content type='html'>&lt;p&gt;uehajさんのところでHTTPBuilderのエントリを見てから、ずっとHTTPBuilder使ってみたいと思っていたのですが、ようやく試すことができました。&lt;/p&gt;
&lt;p&gt;同じGroovyであるGrails＋Acegiプラグインで作成したサイトにログインできるかどうか試してみることにします。&lt;/p&gt;
&lt;p&gt;早速環境構築。&lt;/p&gt;
&lt;h4&gt;入手&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://groovy.codehaus.org/modules/http-builder/download.html"&gt;HTTP Builder - Download&lt;/a&gt;より、以下のファイルをダウンロード。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;http-builder-0.3.0-all.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;環境構築&lt;/h4&gt;
&lt;p&gt;ダウンロード後、上記ファイルを解凍する。&lt;/p&gt;
&lt;p&gt;targetフォルダに含まれている以下のファイルを、$USER_HOME/.groovy/libフォルダに配置する。&lt;/p&gt;
&lt;p&gt;（USER_HOMEは、Windowsの場合にはc:\Documents And Settings\{ユーザー名}、Linuxの場合には/home/{ユーザー名}）&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;http-builder-0.3.0.jar&lt;/li&gt;
 &lt;li&gt;dependenciesフォルダ内のすべてのjarファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;実行&lt;/h4&gt;
&lt;pre name="code" language="java"&gt;
import groovyx.net.http.*
import static groovyx.net.http.Method.GET
import static groovyx.net.http.ContentType.TEXT

def host = &amp;quot;test-server.com&amp;quot;
def appName = &amp;quot;grails-test&amp;quot;
def username = &amp;quot;test-user&amp;quot;
def password = &amp;quot;test-password&amp;quot;
def http = new HTTPBuilder(&amp;quot;http://${host}&amp;quot;)

http.post( path : &amp;quot;/${appName}/j_spring_security_check&amp;quot;, 
          contentType : TEXT,
          params : [j_username:username, j_password:password] ) { resp, reader -&amp;gt;
          
  println &amp;quot;response status: ${resp.statusLine}&amp;quot;
  println &amp;quot;Response data: -----&amp;quot;
  System.out &amp;lt;&amp;lt; reader
  println &amp;quot;\n--------------------&amp;quot;
}

http.get( path : &amp;quot;/${appName}/item/index&amp;quot;, 
          contentType : TEXT) { resp, reader -&amp;gt;
  println &amp;quot;response status: ${resp.statusLine}&amp;quot;
  println &amp;quot;Response data: -----&amp;quot;
  System.out &amp;lt;&amp;lt; reader
  println &amp;quot;\n--------------------&amp;quot;
}
&lt;/pre&gt;
&lt;p&gt;ここでは、&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;サーバー名：test-server.com&lt;/li&gt;
 &lt;li&gt;grailsアプリ名：grails-test&lt;/li&gt;
 &lt;li&gt;ユーザー名：test-user&lt;/li&gt;
 &lt;li&gt;パスワード：test-password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;として、環境を作成したWEBアプリにログインしてみた。&lt;/p&gt;
&lt;p&gt;grailsにAcegiプラグインを入れた場合、ユーザー名(j_username)、パスワード(j_password)を入力しhttp://test-server.com/grails-test/j_spring_security_checkにPOSTするとログインできます。&lt;/p&gt;
&lt;p&gt;ログインして、その後にアプリの別ページの情報が表示できるか試してみたところ、ちゃんと表示できました。&lt;/p&gt;
&lt;p&gt;スクリプトの処理中は、ログイン後のセッション情報がちゃんと残るみたいですね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-1130453308621130745?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/1130453308621130745/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/httpbuilder.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1130453308621130745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/1130453308621130745'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/httpbuilder.html' title='HTTPBuilderを使ってみる'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-5073754484403885076</id><published>2009-01-08T23:59:00.000+09:00</published><updated>2009-01-09T00:02:25.643+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>セットアップしなくてもちょちょいとGroovy動かしたい方は</title><content type='html'>&lt;p&gt;&lt;a href="http://programamemo2.blogspot.com/"&gt;プログラマメモ2&lt;/a&gt;こちらのブログのサイト右上にある機能が素敵。&lt;/p&gt;
&lt;p&gt;始めて見たときに「この手があった」と思いました。やろうと思ってたら、すでにやっている方いました。&lt;/p&gt;
&lt;p&gt;Java Web Startが実行可能ならどのマシンでも動くはず。&lt;/p&gt;
&lt;p&gt;ちょっとGroovy試してみたい人によいですね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-5073754484403885076?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/5073754484403885076/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/groovy_08.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5073754484403885076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/5073754484403885076'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/groovy_08.html' title='セットアップしなくてもちょちょいとGroovy動かしたい方は'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-806103305682092803.post-6825478605863543830</id><published>2009-01-08T12:58:00.000+09:00</published><updated>2009-01-08T13:02:18.591+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>道順を数えるどう書く？org ２番煎じ</title><content type='html'>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090104/1231049099"&gt;Re:道順を数える - No Programming, No Life&lt;/a&gt;を見て、僕もこの問題を解いてみた。&lt;/p&gt;
&lt;p&gt;・・・で、早速挫折。文字列ではあるけれど、図形の解析、難しいですね。&lt;/p&gt;
&lt;p&gt;問題文に「パターン数が分かれば、データ構造は何でもいいよ」とあるので木構造でといてみました。&lt;/p&gt;
&lt;pre language="java" name="code"&gt;
def x = 3
def y = 4
def LEFT = 0
def DOWN = 1

def list = []
(x+y).times{
    list &amp;lt;&amp;lt; [LEFT, DOWN]
}
def all = list.combinations().unique().findAll{ it.count(LEFT) == x }
def part = all.findAll{
    !(it[0..1].count(LEFT) == 1 &amp;amp;&amp;amp; it[2] == DOWN)
}.findAll{
    !(it[0..3].count(LEFT) == 1 &amp;amp;&amp;amp; it[4] == LEFT)
}.findAll{
    !(it[0..3].count(LEFT) == 2 &amp;amp;&amp;amp; it[4] == LEFT)
}
println all.size()
println part.size()
&lt;/pre&gt;
&lt;p&gt;これでいいのだ。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/806103305682092803-6825478605863543830?l=genzou-postit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://d.hatena.ne.jp/fumokmm/20090104/1231049099' title='道順を数えるどう書く？org ２番煎じ'/><link rel='replies' type='application/atom+xml' href='http://genzou-postit.blogspot.com/feeds/6825478605863543830/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/org.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6825478605863543830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/806103305682092803/posts/default/6825478605863543830'/><link rel='alternate' type='text/html' href='http://genzou-postit.blogspot.com/2009/01/org.html' title='道順を数えるどう書く？org ２番煎じ'/><author><name>ゲンゾウ</name><uri>http://www.blogger.com/profile/02501288368372489100</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_c1sAJym_hc4/SNEPDaeWpII/AAAAAAAAAD0/AlOc56eAiMc/S220/img.jpg'/></author><thr:total>0</thr:total></entry></feed>
