カスタム検索
ラベル groovy の投稿を表示しています。 すべての投稿を表示
ラベル groovy の投稿を表示しています。 すべての投稿を表示

2009年11月17日火曜日

Groovyで時間計算とか

すぐ忘れる・・・のでメモ

JavaだとCalendarとか使わないといけなくて何かと面倒
Groovyなら便利なのがあるよ!

TimeCategory

使い方はこんな感じ

use(org.codehaus.groovy.runtime.TimeCategory) {
def tm = new Date() + 1.days + 25.minute - 2.years
println tm.format("yyyy/MM/dd HH:mm")
}


簡単かつ、わかりやすいよね!

2009年4月14日火曜日

GroovyのURL Classが素敵すぎる件について

以前、別のURLのデータを取得するのにhttpBuilderを使ったり、httpClientを使ったりしてごにょごにょ書いてたんですが、
mottsniteさんがボソっとURLのgetTextでとれるよ。と言っていたので試してみた。


def url=new URL("http://www.yahoo.co.jp")
println url.getText()


( ゚д゚)

(つд⊂)ゴシゴシ

(;゚д゚)

(つд⊂)ゴシゴシ
  _, ._
(;゚ Д゚)ぁぁぁああぁぁ!?

なにこれ、素敵すぎます。
まだあんまり試してないけど、日本語もすんなり通るし、すげぇ。

ストリームしてファイルダウンロードもいけるみたい。
RESTしたいとかには答えられないのかもしれないですが通常使用ならこれで十分っぽいですね。

FileのgetTextもそうですが、こういうのを見るとまさにGroovy!って感じしますね :)

2009年1月23日金曜日

httpBuilderで文字化けする件について

httpBuilderでgoogleのサイトを取得している時はうまくいってたのですがShift_JISのサイトを取り込もうとしたらUTF-8になってしまいました。
まぁよくある事だと思ってソースをさぐっていったのですが、思ったよりも深い所で大変でした、、、

結論からいくとContentTypeが text/html,text/plain,text/xml などの場合は、 ParserRegistry というクラスの parseText という所で、 HttpResponse から charset をあてて InputStream にして返しています。
この charset をあてる所がくせもので、 HttpResponse に含まれるパラメーターの charset を使い、なければ OSデフォ(Charset.defaultCharset().name())をあてるという処理になっています。
おそらくテストしたサイトの response に charset のパラメーターがついていなくて、UTF-8があたったっぽいです。

とりあえず parseText に無理矢理 charset をのせてやったらうまくいきました :)
でもちゃんと作るなら ParserRegistry に charset をあてれるように拡張しないといかんとですね。

2009年1月19日月曜日

httpBuilderが俺にもっと輝けと囁いている

httpBuilderという素敵なものがあったので試してみた

allをダウンロードして、target/dependenciesのjarとhttp-builder自体のjarをlibへコピっと。

Basic認証して、htmlを取得するサンプル。
取得したhtmlはxmlSlurperへ変換し操作しやすいように。


import groovyx.net.http.*
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*

// basic認証用にbase64したID/Passを作成
def testBytes = "user:pass".getBytes("ISO-8859-1")
def encoded=testBytes.encodeBase64()

def http = new HTTPBuilder("http://hogehoge.jp/requiredBasicAuth")
http.headers=["Authorization":"Basic ${encoded}"]

try {
http.get(contentType:TEXT) { resp, reader ->
def page = new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(reader.text)
def data = page.depthFirst()
data.each { println it }
}
} catch(Exception e) {
println "auth failure"
}


headerの調整とかpost指定とかなしで、簡単にとりたいだけだったら、上のCyberNekoのSlurperを使っている所を使うと簡単

def page = new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parse("http://www.google.co.jp")
def data = page.depthFirst()
data.each { println it }

こんだけでオッケー!

getのオプションで使う query がうまく動かなかったのが気になる所・・・

2008年10月20日月曜日

どう書く?

どう書くネタで盛り上がったので、更にのってみました。

ものすごいハイウエスト日記

短くするのは得意じゃないんで、Groovyっぽい感じで


// 各行を処理するクロージャー
def changeLine1={ line,val ->
return line[2]
}
def changeLine2={ line,val ->
return line[1]
}
def add={line,val ->
return val.isNumber() ? val.toInteger()+1 : val
}

// CSV読み込み&変換
def convClo=["",changeLine1,changeLine2,add]
def ret=[]
def headers
new File("test.csv").splitEachLine("\t"){ line ->
if(!headers) headers = line
def lineData=[]
line.eachWithIndex { val,idx ->
lineData << (convClo[idx] ? convClo[idx].call(line,val) : val)
}
ret << lineData
}

// ソート関係
def sort="ID" // SortField
def order="ASC" // ASC | DESC
def headerIdx=0
headers.eachWithIndex{ val,idx ->
if(val==sort) headerIdx=idx
}

// 出力
println ret.remove(0).join("\t")
ret=ret.sort{it[headerIdx].isNumber() ? it[headerIdx].toInteger() : it[headerIdx]}
if(order.equalsIgnoreCase("DESC")) ret=ret.reverse()
ret.each{ println it.join("\t") }


後で増やしたり差し替えたり出来るように、クロージャーでデータの処理をわけてます。
(でもchangeLine1とchangeLine2は統合されるべきだよなぁ・・・)
ソートもフィールド名と ASC | DESC 与えて結果が変えられるようになってます。

と、思ったらもう答えが出ているわけで。

2008年2月22日金曜日

groovyでPDF! PDFBuilder!

groovy-pdfというおもしろそうなものを見つけたのでgrailsで使ってみました。
一言で言うと、iTextをgroovyのBuilderで実装しましたよってものです。

まずはインストール。
ソースをgoogle codeから落としてきましょう。

svn checkout http://groovy-pdf.googlecode.com/svn/trunk/ groovy-pdf

ソースしか上がってないので自分でコンパイルしてやる必要があります。
groovyをインストールし、gantをダウンロードしインストール。
(解凍したフォルダに移動して、 groovy bin/install.groovy)
コンソールからgantで実行し、Cannot open file build.gant とメッセーじが出たらインストールされています。

先程チェックアウトしたプロジェクトのフォルダへ移動し、gant compile と実行すれば dist/pdfbuilder.jar というファイルが出来るので、それを grailsプロジェクトのlibフォルダへコピー
あとはサンプルの内容をアクション内にコピペしてやればとりあえずテキストが出てきます。

まだ対応していない処理などもありますが、Builder形式でかけるのでBuilderの書式を覚えてしまえば誰でも簡単P・D・F!P・D・F!

デフォでは日本語がでませんので、この辺はiTextの設定をまた後日 :)