コンソールアプリケーションあれこれ

G*ワークショップ in 仙台でちょいと再燃したので調べ直してみたら,こんなん見つかった。
http://old.nabble.com/Console-Application-in-Groovy-query-td27062534.html


要するにだ。CUIの対話型アプリもGroovyでちょろりと作れたらステキだなって事を,その昔考えててそのまま忘れていたのだ。GUIじゃなくてCUIってのがポイントね。GUIが使えない環境で,かつGantCLIなどでコマンド一発よか対話性のあるUIを備えた方が得なシチュエーションって結構ある。
#どんな時かは皆の想像に任す。:-P


結論から言えば,JCursesCHARVAOSXで動かなかったので試せなかった。orz
正確にはOSX未対応なのはJCursesだけで,CHARVAはlibTerminal.soのSnow Leopard版が無くて挫折したという顛末。なんでま,GW明けにでもヒマ見て会社で試してみるわ。
ちなみに,JCursesはibiblioに登録されているようなのでgrapeで取得できるよ。
#でも,Nativeライブラリ要るから意味無いかもね。:-)


ついで言うと,jansijlineは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って何でもライブラリ揃ってんだな,としみじみ思う。