Tuesday, May 29, 2012

DropQuest2012

謎解きしてDropboxの容量1GBアップさせようぜってことでやっておきました。
ただし私はズルをして純粋に楽しんでなかったり(おい)

攻略を載せてらっしゃるサイト:
http://samulife.com/iPhone/2012-dropbox-quest

英語だしナーと思いつつも、時々内容をがんばって読もうとして、
あ〜、ちゃんと遊んだら楽しそうですネ!
と雰囲気だけ楽しみました。

いやしかしながらDropboxのWebインターフェース中にも
謎解きのための仕掛けが組み込まれていて、
作成者サイドも結構楽しみながら作ったんじゃないかなぁと想像していました。
だったらちゃんと遊びなさいよって話ですけど、
まぁ、それはまた、時間があったら、ですね

Thursday, May 24, 2012

PHPとJavaScriptのソース間でのロジックの共有

PHPがサーバサイドでJavaScriptがクライアントサイドだから、
まぁするとしたらJavaScriptからAjaxでパラメータを投げてPHPで処理して結果を返す、
みたいな流れがいいんだと思います。

でも短時間で何十回もそのロジックを使いたいときはどうするのか、
HTTPリクエスト出しすぎて超重いんですけどみたいな状態になるようであれば、
上記の方法はあまりとりたくありません。
(というかだいたい上記の方法で事足りて、ここであげてるようなケースは
極々稀じゃないのかとは思いますが)

PHPのコードをなんとかJavaScriptのコードまで変換できたらなぁとか思って、
Hiphop-phpでC++へ変換して、llvm-gccを使ってコンパイルして
llvm-disで逆アセしてemscriptenでJavaScriptに変換とか考えましたけど、
llvm-gccのバージョンが4.2、Hiphop-phpが要求するGCCのバージョンは4.3以上
ということで、試す間もなく挫折しました。
というかHiphop-phpで実行モジュール作る時に、色々なライブラリをリンクしてる時点で
JavaScriptのコードにまで変換させるのは無理じゃねっていう。

あれこれ考えてみたところ、Luaでコードを書いて、
PHP側ではPECLのLuaモジュールを使ってLuaのコードを呼び出す、
JavaScript用にはlua2js(https://github.com/mherkender/lua.js)を使って
LuaのコードをJavaScriptに変換して使う、
っていうやり方でいいかなという結論にしました。

ただPHP側にしろJavaScript側にしろ、Luaの関数等を呼び出すときの記述が
若干長ったらしいで、記述するめんどくささを緩和できるラッパークラスのような何かを
作る事が出来たらいいなと思っています。

Sunday, May 20, 2012

カリー化と部分適用

カリー化と部分適用の違いのメモ。
三つの変数を取って値を返す関数fを

f: X,Y,Z → V

として、カリー化や部分適用した後の関数をgとしたときに、
それぞれgは下記のようになる、と。

  • カリー化
    • g: X → (Y → (Z → V))
  • 部分適用(Yを固定する場合)
    • g: X, Z → V

fをカリー化したgだったら、Vを得るまでに、引数Xを一つ与えて返り値として関数を得て、その関数に次の引数Yを与えて…と、一つの引数をとる関数をチェーンした形で呼び出すようになる。部分適用みたいに引数が固定された状態にはならない。gを呼び出してVを得るまでに、X、Y、Zの三つの値を決めなければならない。

fに部分適用を施したgだったら、fのいくつかの引数の値が固定されて、fに比べてgは引数の数が減る。カリー化したgみたいに関数をチェーンして呼びだすなんて出来ない。gを呼び出してVを得るまでにはXとZの二つの値を決めなければならない。


部分適用は日頃ばんばん使いまくってるけど、カリー化はどういうケースで使うんだろう。
カリー化すると部分適用しやすくなるとか、"複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる"とのこと(参考: http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)なので、カリー化は理論寄りのツールであって、単にコードを書く場合は「ここでこの関数をカリー化して」なんていう場面はあまりないのかも。
(カリー化するとこんな風にすっきり書ける、っていうテクニックがもしかしたらあるのかもしれないけど。)

だもんで、prototype.jsのFunction#curryはあまり適当ではないと感じる(部分適用のメソッド名はpartiallyApplyとかになるのかな)。
けどまぁcurryって書く方に慣れちゃってるし、タイプ数も少ないし、curryでいいnうわなにをするやめくぁwせdrftgyふじこlp;「’」