macports の hs-cabal

macports で入れた cabal がアップグレードできなかった。

$ sudo port upgrade hs-cabal
      • > Configuring hs-cabal
Error: Target org.macports.configure returned: shell command "cd /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_hs-cabal/work/cabal-install-0.6.2 && runhaskell Setup configure --ghc --prefix=/opt/local" returned error 1 Command output: Configuring cabal-install-0.6.2... Setup: At least the following dependencies are missing: HTTP >=4000.0.2 && <4001, zlib >=0.4 && <0.6 Error: Unable to upgrade port: 1 $ ghc-pkg list /opt/local/lib/ghc-6.10.3/./package.conf: Cabal-1.6.0.3, HUnit-1.2.0.3, QuickCheck-1.2.0.0, WebServer-1.2, array-0.2.0.0, base-3.0.3.1, base-4.1.0.0, bytestring-0.9.1.4, containers-0.2.0.1, directory-1.0.0.3, (dph-base-0.3), (dph-par-0.3), (dph-prim-interface-0.3), (dph-prim-par-0.3), (dph-prim-seq-0.3), (dph-seq-0.3), extensible-exceptions-0.1.1.0, filepath-1.1.0.2, (ghc-6.10.3), ghc-prim-0.1.0.0, haddock-2.4.2, haskell-src-1.0.1.3, haskell98-1.0.1.0, hpc-0.5.0.3, html-1.0.1.2, integer-0.1.0.1, mtl-1.1.0.2, network-2.2.1, old-locale-1.0.0.1, old-time-1.0.0.2, packedstring-0.1.0.1, parallel-1.1.0.1, parsec-2.1.0.1, pretty-1.0.1.0, process-1.0.1.1, random-1.0.0.1, regex-base-0.72.0.2, regex-compat-0.71.0.1, regex-posix-0.72.0.3, rts-1.0, stm-2.1.1.2, syb-0.1.0.1, template-haskell-2.3.0.1, time-1.1.3, unix-2.3.2.0, xhtml-3000.2.0.1 /Users/sho/.ghc/i386-darwin-6.10.3/package.conf: JsContracts-0.4, WebBits-0.15, network-2.2.1.2, network-2.2.1.3, regex-base-0.93.1, regex-compat-0.92, regex-posix-0.94.1, time-1.1.4, zlib-0.5.0.0, zlib-0.5.2.0 $

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 のインストールには WebServer というライブラリが必要だが、実は haskell-web という名前で公開されている。他の依存パッケージは cabal で大丈夫。

コンパイル

それぞれのディレクトリに入って make するだけで問題なくコンパイルできた。コンパイラmacports で入れた GHC 6.10.3。

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 である。

マウスが動いたというイベントが発生したら特定のタグ内の値を書き換える、というイベントハンドラを書くよりも宣言的でわかりやすい。

git clone --shared と git init --shared

"git init --shared" は、そのリポジトリのアクセス権限を指定するオプション。例えば group とか。デフォルトではリポジトリは共有されないので、複数人で作業しようとするとはまる。
"git clone --shared" は、リポジトリを clone する際にハードリンクを使う。意味がわからない。
bare なリポジトリをどっかに置いてみんなで作業したい場合には、普通に git clone してできたリポジトリに対して git-config を使い、権限を変更する必要がある。詳しくは 2009-02-18 を参照。

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
$ 

簡単だね。

Pure で CCS みたいなやつ

Pure で書いてみよう第二弾。new と replication のない(!) CCS 式を実行できます。型なし Haskell みたいな書き方をしたのでとても簡単だった。やっぱり Pure を使う利点が見つからない…。

続きを読む