Threepenny-gui とは
Haskell で Rover Mini の ECU データを拾うプロジェクト,ぼちぼち進めています。
開発は MacBook Air 11'' でやっていますが,実際の稼働ではラズパイなどワンボードの小型PCでやろうかと。Haskell はあちこちのプラットフォームで動くのでいいのですが,問題はGUI。
Real World Haskell などは汎用GUIライブラリの呼び出し例なども掲載されていますが,macOS で他のプラットフォームと共通のデザインだとものすごい違和感を感じます。また,GUI の世界では最近,Functional Reactive Programming という新しい考え方に基づく実装例も増えてきています。そのものずばりの名前の本(Functional Reactive Programming , Manning Publications )も2016年に出版されたので,計算機科学分野の英語の復習の意味も含めて電子ブックを買い求めて読み進めています(ちなみに最近,書店店頭で翻訳本を見かけましたが,意味が読み取りにくい翻訳となっている箇所が多数あったため,購入は見送りました)。
そこで今回のブログ記事では,Haskell の GUI 環境の中でも FRP が使え,ラズパイ でも macOS でも使えそうな Threepenny-gui ライブラリについて調べてみることにしました。
以下はHaskell wiki Threepenny-gui より。2018年1月17日15:00 (JST) 閲覧した際の記述内容に基づいたもの。
1. Threepenny-gui とは
Threepenny-gui とはウェブブラウザーをディスプレイとして見立てた GUI (Graphic Interface Library; グラフィックユーザーインターフェース) のフレームワークである。
以下の機能を持つ:
- 容易な設置 いまどきは誰でもブラウザをインストールしている。従い、threepenny-gui ライブラリを hackage からインストールするだけでよい。このライブラリは多数のプラットフォームで動作する。
- HTML + JavaScript ユーザインタフェースを作成する際、HTMLの機能をすべて使用することができる。これは素晴らしいことではあるが、うっかりするとはまり込んでしまうことにもなりかねない。それゆえ、このライブラリには、CSSを使用しなくてもユーザインタフェースを素早く構築できるよう、レイアウトコンビネータが含まれている。またFFI(Foregin function interface; 他言語接続機能)を利用してブラウザの中でJavaScriptを走らせることも可能である。
- FRR ( Functional Reactive Programming ) により、ユーザーとのやりとりのプログラミングでイベント駆動式のスタイルを伝統的な手続き型言語で構築するときに陥りがちなスパゲッティコードを避けることができる。Threepenny は FRP ライブラリを持っているが、それを使うか否かは自由である。便利と思えばFRPを利用してもよいし、袋小路にはまり込んだと思ったら FRP を使わなくてもよい。
- Threepenny-gui ができないこと
- ウェブのフロントエンドではない。サーバはローカルホストで稼働することを想定している。(ネットを経由する)ウェブアプリとして使用するには遅延が問題となるだろう。つまり、ローカルネットワークの多数のユーザーを想定した場面には向いているということ。サンプルコードの Chat.hs example を参照。
- JavaScript や HTML のライブラリではない。Threepenny-gui は Haskell の API を備える GUI フレームワークであり、ドキュメント・オブジェクトモデルについて様々なことを抽象化している。Threepenny-gui を使うにあたっては、 HTML については多少の知識が必要だが、JavaScript の知識は必要ではない。もっとも、外部クライアントライブラリを活用とする場合はその限りではないが。
ウェブアプリを作ろうとしているなら、他のプロジェクト(たとえばFay, GHCJS, Haste など)を参照のこと。Threepenny の API はこれらのプロジェクトにいくらか影響を与えている、もしくは将来与えることになるかもしれないが、現時点ではそこ(ウェブアプリ開発向きの機能)に焦点はあたっていない。
3.開発経緯
現在、活発に開発が行われいる状況であり、主要なAPIについても将来の版では改訂されているかもしれない。このプロジェクトの目標はGUI プログラミングをできるだけ簡素にすることにある。そのためにやや実験的に様々な挑戦を行っている。
- 2017.04.29 threepenny-gui-0.8.0.0 公開
- 2016.09.16 threepenny-gui-0.7.0.0 公開
- 2015.05.15 threepenny-gui-0.6.0.2 公開
- 2015.05.13 threepenny-gui 0.6.0.1 公開
- 2014.10.04 threepenny-gui 0.5.0.0 公開
- 2013.11.21 threepenny-gui 0.4.0.0 公開
- 2013.09.07 threepenny-gui 0.3.0.0 公開
4. 応用例
Threepenny を使って書かれたアプリケーションの例
- Daniel Austion が Tochlight 2 の開発のために書いたエディタ FNIStash
- Daniel Mlot が レーシングゲーム Stunts のために書いた Stunts Cartographt Track Viewer
- Tim Schroder が Phillips Hue のスマートライトの制御のために書いた Hue Dashboard
- Haskell のための軽量トレーサおよびアルゴリズムデバッガ Maarten Faddegon's Hoed
- マンデルブロー集合のビューア Carsten König's holiday project
- 数学教師のための曲線描画 Chaddai's CurveProject
5. 現況と参考資料
Hackage からのダウンロード threepenny-gui
参考資料
- API リファレンス
- 使用例
- HaL 2017 で公表されたチュートリアルスライド
- 作りかけのチュートリアル Yuval Langer による - 支援募集中とのこと
- Developer Blog (魚野注:このライブラリのメンテナンス担当 Heinrich Apfelmus 氏によるブログ)
フィードバック先および連絡先
- メンテナンス担当者: Heinrich Apfelmus
- バグ報告・機能要望 Issue Tracker!
- 質問 Ask on StackOverflow!
- それでも解決しないとき Email or live help!
github 上のソースコード
- threepenny-gui マスターブランチ