GMT関西闇Ruby会議で発表しました。内容は最近使う機会の増えたruby-ffi(フィッフィ)の紹介。その時のスライドです。nankiちょっとまとめきれなくて最後のほうにごちゃごちゃと書いてしまっていますが、C/Ruby間で独自の型変換を作れるとあったので試しにVALUE型をRubyのオブジェクトに変換するffi-rubyというのを作ってみました。実用的なかおりがするけどあんまり使い途ない。VALUE型の変換これであってるのかなぁ。簡単な恒等性のテストにはパスしてるみたいだけど。GMT@ikegami__さんのFrama-Cを使った実験が面白そうなので試してみた。install使ってみるRubyのソースツリーに移動する。0#endif解析対象ファイルの一覧を作っておく。cont.c一覧は、common.mk中のCOMMONOBJSを参考にしている。検査するときにどうにもならなさそうな事であげられているファイルのいくつかは、直接コンパイルされることを想定して書かれていないので失敗するようだ。-U__BLOCKS__はSnowLeopardから導入されたBlocks(Cの文法を拡張している)を無効にするため。これを無効にしないとparseが失敗する。helpの結果から選ぶ。GMTちょっと興味深いfizzbuzzを発見したので。GMTみなさんはコードジェネレータを使った事があるでしょうか。はてはPHPまで、Rubyでコードジェネレータを使う機会は増すばかりです。Rubyでコードジェネレーションと言えばERbを使うことが多いですが、それで充分なのでしょうか。他の選択肢はどうでしょうか。今日は、wlangというコードジェネレータを紹介します。engine?次のサンプルコードを見てください。シンプルなHTMLテンプレートエンジンのように見えます。</ul></div>EOSこのプログラムの出力結果はこうなります。Giraffe</div>コンテキストに合わせて正しく、'や&がエスケープされているのがわかります。記法にはあまり馴染みがありませんが、配列の展開もうまく動いています。engine次にwlangの仕組みを見ていきます。wlangでは、wlangタグを使って、テンプレートを記述します。wlangタグは次のような形式です。記号{.....}{.....}{.....}後ろの{}はblockと呼ばれ、任意の個数持つ事ができます。全て、wlangタグだったのでした。末尾の”はwlangタグとは関係なく、ただの文字列です。id="{name}'>が文法エラーを出さずに動作する事で確認できます。このセンス嫌いじゃない)なにやらあやしいかおりがしてきました。language?次に、WLang::instantiateの第三引数は”wlang/xhtml”となっていますが、WLangではこれをdialect(方言、なまりの意味)と呼んでおり、当然変えられます。'O''Reilly';このように、dialect毎に'{...}タグの動作が変わるわけです。dialectは複数のRuleSetとEncoderSetで定義されています。RuleSetはタグの機能をオーバライドしたり新たなタグを定義します。^{..encoding..}{...}というタグで呼び出す事ができます。以下は大文字に変換するencodingの例です。定義され、それぞれ違うエスケープがされるようになっています。先のwlang/sqlとwlang/sql/sybaseの結果の違いも、ここで決まっています。double-quotingを呼び出すためのショートカットになっています。エスケープに悩まされることなく気楽にコード生成を行う事ができるwlangかっこいい!でも、encodingの実装にバグがあるっぽくて、まだそれは無理っぽい。bindingを書いていて、やっぱりGC周りではまってしまった。rootからの参照を一度に消されるとどうしようもない。そこで試しに以下のようなコードを書いてみたところうまくいった。obj5]以下軽く解説。OrderedFinalizerに解放順序を指定したいオブジェクトへのリファレンスを保持させる。reference(つまりobject_id)で持つ。referenceなオブジェクトが解放されていたら、次のオブジェクトの参照をweakにする。OrderedFinalizerはat_exitで参照されているので、Ruby界では最後まで生き残る。stepを各GC毎に呼ぶのが理想なのだが、そんなイベントはないよなぁ。今回の用途には足るんだけど、今のままだと、最後までいくらかのオブジェクトを保持してしまう。obj1からobj2へのリファレンスがあったりすると無限ループになるし、[true]とか渡してやるとかも困る。さんらとSDLをWebSocketと組み合わせて...という話をしていておもしろそうだったので実装してみた。WebSDLRuby/SDLの画面描画を全て文字列としてシリアライズし、WebSocketで送信、Canvasに描画する。ブラウザ上で発生したイベントをWebSocketで送信、SDLのイベントモデルの中に還元してやる。いうのが基本的な仕組み。webでWebSDL版が起動するようになっている。Canvasに対応したブラウザで開く。Canvasを使うだけでは芸が無いので、マルチユーザに対応、ユーザ間の情報共有にも対応してみた。0.1秒毎に更新しているのがかっこわるいが、適切なイベントに基づいた処理をすれば、パズルゲームやアドベンチャーゲームなど頻繁に画面更新のないものなら実用的なものができる可能性がある。ウェブへぇボタンとかね。現在の方法では実現が困難である。GMTだいたい以下のような感じになる。password_from_keychainはOSXのkeychainからパスワードを取ってくるだけの関数。GMailのTwitterフォルダ(follow通知メールが溜まる)の中から未読(UNSEEN)のメールを探してきて、ユーザ名とおぼしき部分を抜き出して出力、既読にする。GMT表にまとめてみた。主な違いは、getc/readcharがbyteを返すだけみたいだ。GMT噂のMagLevを試してみた。GMT憧れシリーズ第二弾。Scalaの勉強でもしようかな、と思ってScalaの本を開いたら、Scalaでは無名関数を_(アンダースコア)を使って定義できるらしい。6]とか書きたいよね。定義しておくと、それが呼ばれてよしなにしてくれる。定義されているので、Rails使いにはおなじみだろう。される時に適当なProcを返すような何かを作ればよい。Scalaそうしてできたのがこれ。後に括弧が要ると思っていたがそんなことはなかったぜ。書けないけど、そう書きたい人はブロック使ってください。LazyCallのインスタンスを返し、受け取ったメッセージを引数と共に保存。はじいているのは、引数として渡される時にこの問い合わせが発生するので、それを無視するため。使えなくなると思う)to_proc内で、保存したメッセージを、procの引数に送り直している。その結果と置き換えている。ような表記が可能になる。_0は、_.[0]のエイリアス二夜にわたるProxyObject特集、いかがでしたでしょうか。同じものを意味しないそうです。閉じた本の続きに書いてあった。使うと、20倍くらい遅い。