どう書く?にうるう年か調べるやつを投稿してみた。理屈の部分は、C#の投稿から借りてきて、groovyに置き換えて投稿してみたけど、groovyなら、Dateクラスに拡張してしまうほうが、すっきりするような気がする。

Date.metaClass.define{
    isLeapYear{
        y = year+1900
         ((y & 3) == 0) && (!("$y" ==~ /.*00$/) || ((y & 15) == 0))
    }
}

println new Date("1900/1/1").isLeapYear()
println new Date("2000/1/1").isLeapYear()
println new Date("2008/1/1").isLeapYear()
println new Date("2009/1/1").isLeapYear()
println new Date("2100/1/1").isLeapYear()

Snow Leopardをいれてみた

子供を寝かしつけつつ、Snow Leopardをいれてみた。
入れる前にディスク容量を調べるのを忘れてたので、ほんとに7GBも減ったのか分からなくて残念。

全体に動作が速くなった気がするのは、欲目でしょうか。
javaのバージョンが、ついに1.6になっててうれしい。
いろいろ試してみよう。

複雑な条件でもOK

複雑な条件の組み合わせもgroovyなら簡単。
クロージャってすばらしい。

class P{
    def v1
    def v2
    
    def check(cond){
        if (cond.c1.call(v1) && cond.c2.call(v2)){
            cond.func.call()
        }
    }
}


class C{
    Closure  c1
    Closure  c2
    Closure  func
}

def conds = [
    new C(
                c1:{it == 1},
                c2:{(0..3).contains(it)},
                func:{println "con1"}),

    new C(
                c1:{it == 1},
                c2:{(4..10).contains(it)},
                func:{println "con2"})
]
            
def p1 = new P(v1:1, v2:5)

conds.each{ p1.check(it) }

なんで、こんなのを試したかというと、お仕事で4つのenum値の組み合わせで処理を分岐させるケースがあって、シコシコとロジック書くのがばからしくなったから。
でもC++でやろうとすると、いっぱいクラスや関数をつくんないといけなくて、うまくいかなかった。

groovyなら、さくっとできるのに。
もう、頭がgroovy脳になりかかっているのかも。

grails+GAE

GAE pluginをいれたgrailsAppで、今度はパッケージ名を入れてドメインクラスを作ってみた。
generate-allでコントローラとビュー一式を作ってうごかしてみると、うまく表示も更新もできた。

でも、controllerのコードに、
def jpaTemplate
def transactionTemplate
なんてのが入ってて、なんだか、聞いてたのとDBアクセスの方法が違う。
これがGORMじゃなくて、JPAを使ってるってこと?

まぁ、自動生成されるから別にいいんだけど、面倒くさい感じ。

今日は、空っぽのクラスだけだから〜明日は、項目を増やしてみよう。

grailsとcomet

Googleしてみたら、あっさりとプラグインが見つかった。
installして、run-appしてみると、ファイル数が1000を超えていた。これって、GAEにのらないよなぁ。

サンプルもついていたので、2、3ファイルのぞいていたら、dojoを使ったJavaScriptのばかりで、まったく理解できなかった。
UI側を作るなら、JavaScriptの勉強も不可欠か。

早速ためしてみたgrails+GAE

今日の読書会で、紹介があった、grails+GAEをさっそく試してみた。

http://docs.google.com/Presentation?id=dgkcctp6_2123s6h5tc7

確かに、空っぽのgrails appをGAEにdeployすることには成功した。
けど、ドメインクラスを作って、ローカルでscaffoldしてもうまくいかないし、generate-allしても、persistの例外みたいになってうまく表示できない。
何がどうなっているのやら。

例外はこんな感じ
Exception Message: Identifier expected at character 1 in ".Book"
Caused by: javax.persistence.PersistenceException: Identifier expected at character 1 in ".Book"

generateしたcontrollerを見てみると、

def query = entityManager.createQuery("select from .Book")
query.maxResults = params.max
query.firstResult = params?.offset?.toInteger() ?: 0
bookInstanceList = query.resultList

デフォルトパッケージなのが悪い?
grails でパッケージを追加するのってどうやるの?

で、適当にパッケージ名をいれて、JPAクエリにも"select from .Book"みたいに、いれてみると、list表示された。

しかし、こんどはcreateが・・・うごかない。
create.gspをみると中身は空っぽなので〜書くしかないみたい。

でも、例外はなんかちがうみたいだし。
今日はここまで