Yokohama.groovy #6 に参加しました

2012/10/16 Yokohama.groovy #6 #yokohamagroovy - Togetterまとめ

今回は 3 名と少し寂しい集まりでしたが楽しく開催してきました。
最近よく飲んでるレーベンブロイ片手に開始です。

やったこと

プログラミングGROOVY

プログラミングGROOVY

今回の範囲は "4.1. Groovy API" でした。
紹介されている 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) とか指定できないものなのかな?

何か使い方間違ってるよ!とかあったら教えてください。

その他

年内いっぱいくらいでこの本を 1 周できそうな見込みです。
年明け以降は何しようかというのも考えていかないといけません。
Groovy 本体をもう少し深く理解する方向なのか、エコシステム関連に手を広げるのか、スペシャルゲスト呼んで特別編やるとか、夢が広がりますね。
個人的には、Groovy のもう少し踏み込んだ内容やりたいです。

あとは Ruby とかと比べると地域コミュニティが少ないよねとか、Osaka.groovy や Shizuokagroovy とかできたら面白いねというような話をしながら解散でした。

今回もとてもたのしかったです。ありがとうございました!