Hatena::ブログ(Diary)

MOVE-i このページをアンテナに追加 RSSフィード

2010-08-10

[]groovyもいつのまにか、1.7.4

いつのまにか、バージョン1.7.4になってた。

ってことで、気になる記事。

http://mrhaki.blogspot.com/2010/08/groovy-goodness-groovy-truth-for-simple.html

真偽値の挙動が変わったのですね。

今まで、気にしたこともなかったけど、空リストでもtrueだったのが、1.7.4以降は空の場合は、falseになりますよ、ってことかな。

値がない=false、値がある=trueっていうのは、分かりやすいかも。

まあ、全然groovyの勉強とか、やってないわけですが。。

2010-07-20

[]mapをパラメータで渡す時

GROOVYMAG4月号を、英語がわからないながらも読んでます。

で、少し面白かったところを。。

def funcl(a){
    println "a=${a}"
}
def funcl(a,b,c){
    println "a=${a}, b=${b}, c=${c}"
}
funcl(*['x', 'y', 'z'])
funcl([a:1, *:[b:2, c:3], d:4])

↓実行結果

a=x, b=y, c=z

a=[a:1, b:2, c:3, d:4]

listのときは、展開するとパラメータ3個で認識されるけど、mapは展開されてもパラメータ1個になっている。

funcl([a:1, *:[b:2, c:4], d:4])の外側の[]をとっても結果は同じ。

def funcl(a){
    println "a=${a}"
}
def funcl(a,b,c){
    println "a=${a}, b=${b}, c=${c}"
}
funcl(a:1, *:[b:2, c:3], d:4)

↓実行結果

a=[a:1, b:2, c:3, d:4]

ちなみに、funcl(['x', 'y', 'z'])で実行すると、結果は、↓

a=[x, y, z]

パラメータ1個で認識ちゃんとされてます。

2010-07-19

[][]Gaelyk template projectバージョンアップ!

http://gaelyk.appspot.com/download

Gaelykが、0.4.2にバージョンアップしていたようで、ぼくの使ってるのは、0.3.2。groovyのバージョンも1.7.3にアップしたかったので、テンプレートをダウンロードして、全体的にローカルのGaelykアプリをバージョンアップさせようと思った。

基本的には0.4.2テンプレート、WEB-INF/lib配下のファイルの"appengine-api-1.0-sdk-1.3.5.jar" "appengine-api-labs-1.3.5.jar" "gaelyk-0.4.2.jar" "groovy-all-1.7.3.jar"、4つのJARを古いのと置き換えれば良いだけかなと思って、置き換え後動かしてみたら。。

2010/07/19 10:53:49 com.google.apphosting.utils.jetty.JettyLogger warn
?x??: Error for /crud.groovy
java.lang.NoSuchMethodError: com.google.apphosting.api.ApiProxy.makeSyncCall(Ljava/lang/String;
Ljava/lang/String;[BLcom/google/apphosting/api/ApiProxy$ApiConfig;)[B
	at com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall(DatastoreApiHelper.java:58)
	at com.google.appengine.api.datastore.DatastoreServiceImpl$2.run(DatastoreServiceImpl.java:188)
	at com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:30)
	at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:176)
	at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:156)
	at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:148)
(省略)

クエリを実行しているところでエラーが出ているようで。。googleで検索しても、解決方法見つからず、あとで、crudアプリの作り方を勉強しなおそう。

2010-06-28

[]HTTP POSTのときのエンコード

URLEncoder.encode("xml文字列", "UTF-8")を使って、はてなダイアリーにポストしても、日本語部分が文字化けしていたので、どうやって日本語の文字化けを防ごうかなと思っていたら、OutputStreamWriterのコンストラクタを呼び出すとき、文字エンコードを指定できるようだった。気づきませんでしたよ!

//はてなダイアリー投稿
def postHatenaDiary(uri,wsseHeader,xml){
        URL url = new URL(uri)
        HttpURLConnection connection = (HttpURLConnection) url.openConnection()
        connection.setRequestProperty("X-WSSE", wsseHeader)
        connection.setDoOutput(true)
        connection.setRequestMethod("POST")
        OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(),"UTF-8")
        writer.write(xml)
        writer.close()
        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            // OK
        } else {
            // Server returned HTTP error code.
        }
}

これで、日本語も文字化けせずに、はてなダイアリーに投稿できるようになりました。

2010-06-23

[]groovy的StringBuffer

StringBufferは、javaのような書き方、appendを使ってたけど、groovyは、↓こんな書き方ができるようだ。

groovy> def sb1= new StringBuffer()

groovy> sb1 << 'abc'

groovy> sb1 << 'def' << 'ghi'

Result: abcdefghi

↓さらには、こんなのも。

groovy> def s= 'foo'

groovy> s= s << 'bar'

Result: foobar

↓さらには、こんな書き方も。

groovy> def s= 'foo'

groovy> s= s << 'bar'

groovy> s << 'aaa'

groovy> s << 'bbb'

Result: foobaraaabbb

↓s=sというのが、ポイントのようで、もし外したりすると。。

groovy> def s= 'foo'

groovy> s << 'bar'

groovy> s << 'aaa'

groovy> s << 'bbb'

Result: foobbb

途中の'bar''aaa'が抜け落ちちゃいますね。

でも、↓こういうのは、OKらしい。

groovy> def s= 'foo'

groovy> s << 'bar' << 'aaa' << 'bbb'

Result: foobaraaabbb

参考サイト:
http://groovy.codehaus.org/JN1525-Strings



追記(2010.07.05)

groovy> def s= 'foo'

groovy> s << 'bar'

groovy> s << 'aaa'

groovy> s << 'bbb'

Result: foo

↑というのが、正しいようでした。

id:genzouwさん、ありがとうございます。

なので、こちらも。。

groovy> def s= 'foo'

groovy> s << 'bar' << 'aaa' << 'bbb'

Result: foo

↑これが正しい。

結果出力に、なにか問題あるのかな。ぼくのローカル環境。。