2014/06/25

Gtk2hsを使ったHaskellのGUIプログラミング(Linux Mint)

Gtk2hsを使って, HaskellでGUIプログラミングした時のメモ.
Linux Mint上でのインストールから, WindowとDialogの表示と
イベントドリブンでの状態の持たせ方, 参考リンク等.

apt-getでのインストールは,


sudo apt-get install libghc-gtk-dev


で, Graphics.UI.Gtkが使えるようになります.

最初のシンプルなWindow表示は, Gtk2hs Tutorialにあるので, ボタンを押してダイアログボックスを表示させる例を書きます.


以下のように実行します.

ghc showWindow.hs
./showWindow


dialogは, インスタンスを作成して(messageDialogNew), 実行して(dialogRun), インスタンス(widgetDestroy)を消去するという流れです. windowのインスタンスの参照は, Maybeモナドで包む必要があります.
 MessageInfoのところには, MessageType型の情報を指定します. MessageWarning, MessageQuestion, MessageError, MessageOtherなどが指定でき, ダイアログの右側に表示されるアイコンを変更可能.
  ButtonsOkのところは, ButtonsType型の情報を表し, ButtonsNone, ButtonsOk, ButtonsClose, ButtonsCancel, ButtonsYesNo, ButtonsOkCancelなどが指定できます.

イベントドリブンでの状態
 Gtk2Hsでは, イベントドリブンによるプログラミングを行うようなので, Haskellとは相性が悪そうな, いわゆる状態をもたせる必要があります. ググってみると, 次のような記事が出てきました.

How to pass state between event handlers in gtk2hs (Stack Over Flow)

 Haskellにおいて, 状態を持たせそうな仕組みは, 並列プログラミングにおけるMVar, Reader/Writerモナド, Stateモナド等, いろいろありますし, 上記の記事ではMVarを薦めていますが,  一番口当たりがいいのは, IORefオブジェクトだと思われます.
 IORefは, 参照によるオブジェクトの共有を行う仕組みで, Clojureのref, OCamlの破壊的代入と基本的に使い方は同じです. IOモナド中に普通に記述できます.



readIORef, writeIORef, newIORefでイベントハンドラ上で状態を共有することができます.

参考文献

Gtkに関しては, C言語の記事が多いので, C言語関係のコードを読みながら, Haskellへ読み替えられる場合があります.こことか.

Gtk2hs関連のページは,
Gtk2hs Tutorial
HackageのGtk2hsのソース
が参考になりました.

2014/06/23

(最小?), Javaでテキストファイルをまとめて読み込む1行

Javaもバージョンアップと共に昔よりだんだん書きやすくなっているようです.

「作者の気持ち」以前に、揚げ足とる相手の最新状況くらい調べろ

という記事に, Java7のnioを使ったファイル出力の例があったので,
テキストファイル読み込みについて調べた時のメモ.

Reading, Writing, and Creating Files(Oracle, Java Tutorial)

を見ながら, 書いたJavaのファイル読み込みが以下のプログラム.

で, 例外とimport文を除けば, 1行で書けるようになったんですね.
Java7から導入されたFilesクラスで一気にフィアルを読み込めます.
"src/short.txt"の部分は任意のファイル名(パス)で,
"UTF-8"のところは,読み込むテキストファイルのエンコーディングです.
若干関数型言語っぽくなっているようにも見えます.
まあ, Clojureならslurp/spitでもっと簡単に書けるのですが......