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

便利

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

Toolあたりから
f:id:yamkazu:20120516221135p:image

こんな感じ
f:id:yamkazu:20120516221136p:image

べつにGroovyのプロジェクトでなくても使えるようなので、JavaのREPLとしても便利に使えるかもです。

Groovyで合成関数

http://d.hatena.ne.jp/Kazuhira/20120415/1334486571 によるとgroovyで合成関数ができるらしい。って思ったら青い本にちゃんと書いてあった。

プログラミングGROOVY

プログラミングGROOVY

7.1. クロージャ関連の新機能のとこ。1.8からの新機能らしい。

http://docs.codehaus.org/display/GROOVY/Groovy+1.8+release+notes#Groovy18releasenotes-Closurecomposition

そもそも理系でありながら合成関数とか覚えていないが、とある関数の結果を、とある関数に渡す関数を定義できるってことで良いのだろうか?

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の実行を繰り返すので最初は一回手で実行しないと駄目かも。
f:id:yamkazu:20100901130605p:image

実行はcommand+alt+x Lとかにしてみた。

あとWorking Directoryを設定しないとファイル参照するときとかうまく動かなかったので${project_loc}を設定しました。
f:id:yamkazu:20100901130606p:image

爆速であります!

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