Yokohama.groovy #6 に参加しました
2012/10/16 Yokohama.groovy #6 #yokohamagroovy - Togetterまとめ
今回は 3 名と少し寂しい集まりでしたが楽しく開催してきました。
最近よく飲んでるレーベンブロイ片手に開始です。
やったこと
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (155件) を見る
紹介されている Groovy API についてコード書いてみたり、使いどころについて議論してみたり。
個人的に気になったことをメモとして残します。
groovy.text パッケージ
サンプルコード
SimpleTemplateEngine (Groovy 2.4.5)
def binding = [ firstname : "Grace", lastname : "Hopper", accepted : true, title : 'Groovy for COBOL programmers' ] def engine = new groovy.text.SimpleTemplateEngine() def text = '''\ Dear <%= firstname %> $lastname, We <% if (accepted) print 'are pleased' else print 'regret' %> \ to inform you that your paper entitled '$title' was ${ accepted ? 'accepted' : 'rejected' }. The conference committee. ''' def template = engine.createTemplate(text).make(binding) println template.toString()
恥ずかしながら、テンプレートエンジンというものを使ったことなかったのですが、定型的なテキストを編集したい場合とかに有効なんですかね。
reSt とかと組み合わせたりしたら便利なのかなあと思いました。
あと、最初はさらっと見逃してましたが、title の項目が 'Groovy for COBOL programmers' でちょっと笑ってしまいました。
groovy.time パッケージ
サンプルコード
Groovy Goodness: Date and Time Durations and the TimeCategory - Messages from mrhaki
import groovy.time.* import org.codehaus.groovy.runtime.TimeCategory // Define period of 2 years, 3 months, 15 days, 0 hours, 23 minutes, 2 seconds and 0 milliseconds. def period = new DatumDependentDuration(2, 3, 15, 0, 23, 2, 0) assert '2 years, 3 months, 15 days, 23 minutes, 2.000 seconds' == period.toString() def year2000 = new Date(100, 0, 0) // Jan 1, 2000 assert 'Mon Apr 15 00:23:02 UTC 2002' == (period + year2000).toString() // Define time period of 5 hours, 54 minutes and 30 milliseconds. def time = new TimeDuration(5, 54, 0, 30) assert '5 hours, 54 minutes, 0.030 seconds' == time.toString() use (TimeCategory) { assert period.toString() == (2.years + 3.months + 15.days + 0.hour + 23.minutes + 2.seconds).toString() assert time.toString() == (5.hours + 54.minutes + 30.milliseconds).toString() // We can use period.from.now syntax. def d1 = 1.week - 1.day def d2 = new Date() + 6.days assert d2.format('yyyy-MM-dd') == d1.from.now.toString() // We can use period.ago syntax. def d3 = 3.days.ago def d4 = new Date() - 3 assert d4.format('yyyy-MM-dd') == d3.toString() }
とりあえず、3 人とも第一声は「なんか気持ち悪い」でした。
慣れの問題かもしれませんが、DatumDependentDuration の引数とか、toString がとても整形されていたりとか。
あと、Date(100, 0, 0) の記述で数秒悩みました。
コメントの " Jan 1, 2000" 見て、C の tm 構造体のメンバ tm_year と同じく 1900 年からの経過年数を指定しているということを理解しました。
が、以下のコードを試してさらに混乱。
import groovy.time.* def year2000 = new Date(100, 0, 0) println year2000
Fri Dec 31 00:00:00 JST 1999
コメントと違うじゃん!
もしかしてと思って、以下を試してみると…
import groovy.time.* def origin = new Date(0, 0, 0) println origin
Sun Dec 31 00:00:00 JST 1899
一日ずれてる!
まあ、サンプルコード実行した際に、period と year2000 の連結結果で例外出てないので、コメントが間違ってるだけだとは思いますが、起点が1900 年 1 月 1日の前日なんですねー。
groovy これだけ便利なのに、Date の引数で 1900 年意識する必要があるって、ちょっとイケてないんじゃないかなー。
これじゃ C と変わらないじゃん。 Date(2012, 10, 16) とか指定できないものなのかな?
何か使い方間違ってるよ!とかあったら教えてください。