macports の hs-cabal
macports で入れた cabal がアップグレードできなかった。
$ sudo port upgrade hs-cabal
-
-
- > Configuring hs-cabal
-
zlib は自分のホームディレクトリにインストールされているが、cabal からこのライブラリが見えていない。
hs-cabal の Portfile(/opt/local/var/macports/sources/rsync.macports.org/release/ports/devel/hs-cabal/Portfile) を変更する。
以下の行を
configure { system "cd ${worksrcpath} && runhaskell Setup configure --ghc --prefix=${prefix}" }
configure { system "cd ${worksrcpath} && runhaskell Setup configure --ghc --prefix=${prefix} --user" }
にする。(--user を付け足す)
その後
sudo port upgrade hs-cabal
でばっちり。
Flapjax を試す
今更ながら Flapjax を試す。というかほんとに試しただけ。
Flapjax は FRP(Functional Reactive Programming) というものを JavaScript で実現したもの。FRP は、時間に応じて変化していくような値を Behavior という特別な値で表す。Behavior の値が変更されると、その値を使っている部分が自動で再計算される。これにより、イベントハンドラを記述する必要がなくなり、より宣言的にプログラムを記述することができるのだー。
まずはインストール
- Flapjax (http://github.com/arjunguha/flapjax/tree/master)
- haskell-web (http://github.com/arjunguha/haskell-web/tree/master)
Flapjax のインストールには WebServer というライブラリが必要だが、実は haskell-web という名前で公開されている。他の依存パッケージは cabal で大丈夫。
HelloWorld 的なもの
公式のチュートリアル(http://www.flapjax-lang.org/tutorial/)がわかりやすくておもしろい。
以下蛇足。
<html> <head> <title>TEST</title> <script type="text/flapjax"> var mousex = mouseLeftB(document); var mousey = mouseTopB(document); </script> </head> <body> <h1>{! timerB(10) !}</h1> <p>({! ((mousex > 1000) ? constantB("over 1000") : mousex) !} ,{! ((mousey > 500) ? constantB("over 500") : mousey) !})</p> </body> </html>
このような内容を持った test.fx というファイルを Flapjax のコンパイラ fxc でコンパイルすると、JavaScript のコードが出力される。
Flapjax では "B" で終わるメソッドが Behavior である。timerB は現在の時刻を、mouseLeftB と mouseTopB はそれぞれマウスのx,y座標を値として持っている。constantB は常に引数で与えられた値を持つ Behavior である。
マウスが動いたというイベントが発生したら特定のタグ内の値を書き換える、というイベントハンドラを書くよりも宣言的でわかりやすい。
ActionScript の XML のアクセス
XML データは URLLoader を使って適当に読み込もう。
<member> <person> <name>Alice</name> <age>20</age> </person> <person> <name>Bob</name> <age>22</age> </person> </member>
使いかたはこう。
var member : XML = new XML(loader.data); // member.member.person.name じゃないよ! trace(member.person.name.toString());
Python で UTC2JST
Python で、 UTC で表された時間から JST に変換する方法。twitter から取ってきたデータを扱うために調べた。
datetime モジュールを使う。timedelta で時間の差分を表す。ちなみに twitter の時間の表示は "Sun Jan 18 09:00:48 +0000 2009" みたいな感じ。
import datetime def utc2jst(utc_in_twitter_format): utc = (datetime.datetime. strptime(utc_in_twitter_format, '%a %b %d %H:%M:%S +0000 %Y')) td = datetime.timedelta(hours=9) # JST は UTC に比べて9時間進んでいる return utc+td
Pure から C のライブラリを使ってみる
裏で LLVM を使ってるんだぜすごいだろ的なサンプル。Pure で副作用を使う方法がよくわからないので(できないような気もする)カウンター関数を C で作って使ってみよう。
まずは counterlib.c と counter.pure を用意します。
/* counterlib.c */ int counter(){ static int counter = 0; return counter++; }
/* counter.pure */ using system; using "lib:counterlib"; extern int counter(); printf "%d\n" counter; printf "%d\n" counter; printf "%d\n" counter;
次に counterlib.c をコンパイルします。
$ gcc -dynamiclib counterlib.c -o counterlib.dylib $
実行してみよう。
$ pure counter.pure 0 1 2 $
簡単だね。