コンソールアプリケーションあれこれ
G*ワークショップ in 仙台でちょいと再燃したので調べ直してみたら,こんなん見つかった。
→ http://old.nabble.com/Console-Application-in-Groovy-query-td27062534.html
要するにだ。CUIの対話型アプリもGroovyでちょろりと作れたらステキだなって事を,その昔考えててそのまま忘れていたのだ。GUIじゃなくてCUIってのがポイントね。GUIが使えない環境で,かつGantやCLIなどでコマンド一発よか対話性のあるUIを備えた方が得なシチュエーションって結構ある。
#どんな時かは皆の想像に任す。:-P
結論から言えば,JCursesとCHARVAはOSXで動かなかったので試せなかった。orz
正確にはOSX未対応なのはJCursesだけで,CHARVAはlibTerminal.soのSnow Leopard版が無くて挫折したという顛末。なんでま,GW明けにでもヒマ見て会社で試してみるわ。
ちなみに,JCursesはibiblioに登録されているようなのでgrapeで取得できるよ。
#でも,Nativeライブラリ要るから意味無いかもね。:-)
ついで言うと,jansiとjlineはGroovy本体にすでに入っているので,すぐ使える。どっちもあんまりGroovyっぽく無いけど,そんなの気にしない。
よくワカンナイなりに試してみたjansiの例:
import static org.fusesource.jansi.AnsiConsole.* import static org.fusesource.jansi.AnsiRenderer.* systemInstall() out.println(render("@|red Hello.|@")) out.println(render("@|red こんちわ.|@"))
無理だと思ってたけど,中途半端ながら日本語も通った(文末に半角文字を紛れ込ますと,加工できるっぽい)。
jlineの例というより,先のMLに載ってたおもしろスクリプトの例と言った方が適切かも。
まずは,ダブルリターンが入力されるまで,ひたすら標準入力を取り込むサンプル。
def names = [] println "Enter names or a blank line to finish" System.in.withReader { inr -> while( ( line = inr.readLine() ) && ( line = line.trim() ) ) { names << line } } println names
その応用で,ダブルリターンが入力されるまで,ユーザ名とパスワードを入力しつづけるサンプル(パスワードはjline使ってマスクしてる)。
import jline.* def cons = new ConsoleReader() def getUsername = { cons.readLine('Enter a username: ').trim() } def line = getUsername() def res = [:] while( line ) { res[ line ] = cons.readLine("Enter a password for $line: ", new Character((char)'*')) line = getUsername() } println res
あと,PLEAC-Groovy - User Interfacesで見つけたExpectJも気になるところ。ホント,Javaって何でもライブラリ揃ってんだな,としみじみ思う。