Groovy2.0でinject
元ネタ
http://blog.bloidonia.com/post/26065857945/whats-new-in-groovy-2-0-inject-with-default
groovy2.0からinjectの初期値の指定を省略するとCollectionの先頭要素を初期値として処理してくれるようです。
def items = [1, 2, 3, 4, 5] // 1.8.6まで assert items.inject(0) { sum, item -> sum + item } == 15 assert items.drop(1).inject(items.head()) { sum, item -> sum + item } == 15 // 2.0から assert items.inject() { sum, item -> sum + item } == 15
便利
Collateでサブリストを作る
1.8.6からListにcollateのメソッドが4つ追加されています。
http://groovy.codehaus.org/groovy-jdk/java/util/List.html#collate(int)
これを使うと簡単にサブリストが作れる。
Intellij IDEA の GroovyShell が便利
ちょっと今更感がありますが11.1からGroovyShellがIntellij上で使えます。
http://blogs.jetbrains.com/idea/2012/04/groovy-support-improvements-in-intellij-idea-111/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+jetbrains_intellijidea+%28JetBrains+IntelliJ+IDEA+Blog%29
べつにGroovyのプロジェクトでなくても使えるようなので、JavaのREPLとしても便利に使えるかもです。
Groovyで合成関数
http://d.hatena.ne.jp/Kazuhira/20120415/1334486571 によるとgroovyで合成関数ができるらしい。って思ったら青い本にちゃんと書いてあった。
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 336回
- この商品を含むブログ (121件) を見る
7.1. クロージャ関連の新機能のとこ。1.8からの新機能らしい。
そもそも理系でありながら合成関数とか覚えていないが、とある関数の結果を、とある関数に渡す関数を定義できるってことで良いのだろうか?
def twice = { a -> a * 2 } def inc = { b -> b + 1 } assert inc(twice(3)) == 7
を
def twice = { a -> a * 2 } def inc = { b -> b + 1 } def h = inc << twice assert h(3) == 7
と出来る。<<が味噌でtwiceの結果をincに渡すという定義。逆の>>も使える。
assert (inc << twice)(3) == 7
こんな感じで変数に一度うけないでも大丈夫。流れるような関数的な何か的なインタフェースに使えたりするだろうか?
EclipseでGroovyServを使えるようにした。
http://www.infoq.com/jp/articles/groovyserv
ここに書いてある通りなんですが、ちょっとだけ補足。
ショートカットを設定するときはGeneral>KeysからRun the last launched external Toolを使うみたいです。文字通り最後のExternal Toolの実行を繰り返すので最初は一回手で実行しないと駄目かも。
実行はcommand+alt+x Lとかにしてみた。
あとWorking Directoryを設定しないとファイル参照するときとかうまく動かなかったので${project_loc}を設定しました。
爆速であります!
Groovyでbit.lyのショートURLを取得
groovy勉強中です。
要groovy1.7。
#!/usr/bin/env groovy LOGIN='yamkazu' APIKEY='R_xxxxxxxxxxxxxxxxxxxxxx' VERSION='2.0.1' FORMAT='json' if (args.size() != 1) { println 'usage: ./bitly.groovy http://example.com/' System.exit(1) } GET = "http://api.bit.ly/shorten?version=${VERSION}&login=${LOGIN}&apiKey=${APIKEY}&format=${FORMAT}&longUrl=${args[0]}" @Grab('net.sf.json-lib:json-lib:2.3:jdk15') result = new net.sf.json.groovy.JsonSlurper().parse(new URL(GET)).results."${args[0]}".shortUrl println result
そういえばgroovyをシェルスクリプトとして実行する場合
#!/usr/bin/env groovy
と書けば実行可能なるようです。id:uehajに教えてもらいました。ありがとうございます!
http://d.hatena.ne.jp/uehaj/20090430
ValueDomainのダイナミックDNSを更新するGroovyスクリプト
参考: http://blog.iwa-ya.net/2009/10/13/114906
groovyを勉強中なのでgroovyで書いてみた。
def domain = 'example.com' def password = 'xxxxxxx' def hosts = ['*','@'] newIpAddress = new URL('http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip').getText() curIpAddress = InetAddress.getByName(domain).hostAddress if (newIpAddress != curIpAddress) { date = new Date() println "$date newIpAddress:$newIpAddress curIpAddress:$curIpAddress" hosts.each { host -> response = new URL("http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$domain&p=$password&h=$host&i=$newIpAddress").getText(); println response } }
cronに適当に登録
* * * * * /usr/local/groovy/bin/groovy /mnt/drbd/ddns/ddns_updater.groovy >> /var/log/ddns.log 2>&1