requestが来た!一人以上ユーザが居ることがわかってよかった。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の実装にバグがあるっぽくて、まだそれは無理っぽい。1500というプリンタで名刺を刷ろうと思ったのだが、ミシン目のできないシール台紙のやつは厚みがありすぎて紙が滑り紙送りが正常にできない。そんな時は、定規などで3mmくらい残して、両端のシールを剥がすとよい。忘れずに、プリンタに最初に突っ込む方のシールも剥がしておく。GMT初めて人の死に接したのは、ひいおばあちゃんのお葬式で、4〜5歳くらいだった。今でも覚えているが、別に悲しいことではなかった。誰だかわかっていなかったし、親戚の家で行われた式だったが、その家にはお気に入りのおもちゃ群があって、僕が騒がないように親戚のお兄さんが遊んでくれた。棺に花を詰め、霊柩車に載せて、火葬場まで行って、遺体が焼かれるのを見守った。死んだ、というのはわかっていたが、生きている姿を見たことがなかったからか、眠っているような遺体をみんなで囲む会が催された、というだけだった。それからしばらくして、バイオリンの練習をサボったかどで母親に怒られ、ふてくされて、布団にくるまりながら泣いている時に、初めて死を意識した。母親の言い放った、空からひいおばあちゃんが見てるぞ、というような意味の言葉について考えていた。くだらない脅しを言ったものだと思うけど、カーテンの隙間から曇った夜空を覗いてみて、今日は曇ってるから大丈夫だな、と思ったのを覚えている。その言葉から、死んだ後も意識が存続し続けるのだ、という概念を感じ取ったに違いない。埋められるというものだった。泣き止まなくて、この時ばかりは厳しくしすぎたと思ったのか、その晩だけは母親は優しかった、と思うのは美化された記憶かもしれない。今では、死はそういうものではない、とわかってはいるものの、あの時見た死のイメージは今でも残っていて、死に対しては悲しさよりも恐怖、時には憤りすら覚える。arg3...という処理を、次のように自動化してくれる。便利なxargsではあるが、オプショナルな引数をとるような処理を自動化しようとしたら、なかなか思う通りにいかなかった。...上のような入力をxargsに渡し、単純にコマンドライン引数をpするRubyプログラムを使って行う。opt"]["arg2"]["arg3"]惜しい。"arg3"]それは困ります...。"arg3"]ですよね〜。GMT憧れシリーズ第二弾。Scalaの勉強でもしようかな、と思ってScalaの本を開いたら、Scalaでは無名関数を_(アンダースコア)を使って定義できるらしい。6]とか書きたいよね。定義しておくと、それが呼ばれてよしなにしてくれる。定義されているので、Rails使いにはおなじみだろう。される時に適当なProcを返すような何かを作ればよい。Scalaそうしてできたのがこれ。後に括弧が要ると思っていたがそんなことはなかったぜ。書けないけど、そう書きたい人はブロック使ってください。LazyCallのインスタンスを返し、受け取ったメッセージを引数と共に保存。はじいているのは、引数として渡される時にこの問い合わせが発生するので、それを無視するため。使えなくなると思う)to_proc内で、保存したメッセージを、procの引数に送り直している。その結果と置き換えている。ような表記が可能になる。_0は、_.[0]のエイリアス二夜にわたるProxyObject特集、いかがでしたでしょうか。同じものを意味しないそうです。閉じた本の続きに書いてあった。使うと、20倍くらい遅い。いうか、人がやっているのを目にすると、手を出したくなってくる。子供がプラモデル組み立てているのを見て「ちょっとお父さんにかしてみなさい」というタイプ。結局、前回の最短は23Bだったらしい。:)文字数を削るという共通の目的が、変数名から意味すら奪うのだろうか。20Bという噂はなんだったんだろう...反省を生かして、今回は、27Bまで縮んだところで寝かせておく。続きにあるのはお気に入りの答えだが、パー。いくつかの方針で使っている方法を組み合わせたら23Bになった。GMT久々にgolf。数字を出力するコード。25Bここからは手強いので寝かせて。20B文字列のRangeを使う方法もやってみたけど、挙動に問題があるのでやめ。風の噂では、20Bまでいける、と聞いたんだけど...がんばります。圧縮に対応することによって無事50MBにまでスリム化することに成功する。使うリファレンス群はそもそもサイズが5MB程度なので、たいして役に立たないことに気がつき衝撃を受ける。化するが、今度はインデックスが大きすぎるためか検索がもたつくことに気付く。改造を施し、高速化することを決意したのだった。一回のインクリメンタル検索処理あたり、0.3~1秒程度かかっていたのが100倍くらい速くなった。体感では100倍とはわからないが、もたつきが感じられないレベルになった。インデックスの最初の二文字を抜き出してHashで持ち、検索文字列の最初の二文字でO(1)でしぼりこむ仕組み。高速化の恩恵は最初の数文字の偏りに大きく依存すると思うけど、そもそもそんな状況では、インクリメンタル検索が快適ではないので気にしないこと。宣言があると外部CSSが効かない(詳細不明)問題とか、ruby-cocoaでsize/countが無限再帰になる問題とか、Chmerとtypoする問題などにも嵌って大変だった。その後、バージョン違いがたくさん(railsだけで5個くらい)あったgemを削除しまくったので、普通に速くなってあんまり意味がない。300種類くらい入れて複数のバージョンを保持しているような人しか恩恵が得られないかも。ちなみに、もたつきが気になるというのは、僕のタイプ速度より速く、キーリピートより遅いくらい。GMT三つの点はドラッグ可能。