2009-01-01
■ [ruby] RubyのWebフレームワークについて最近調べたこと (その2)
その1が好評だったので続き。
- Mack Framework
- スピード指向らしい(実行速度のほうね)。
- ドキュメンテーションが微妙
- Ruby waves
- 乗るしかない、このビッグウェーブに (←言いたかっただけ)
- REST指向。
- とりあえずチュートリアルを順にやればだいだい分かると思う。
- Railsのように自動生成から始めるのではなく、1ファイルから少しずつ作っていくこともできる。
- 全てのコードは1つのモジュール内に定義する。例えば、ブログアプリならBlog::Resource::Entryとか、Blog::Model::Commentとか、アプリ名のモジュール以下に定義する。
- on :post, ["entry", :entry_id] みたいな感じで、HTTPメソッドとURLの組み合わせでルーティングを定義する。「true」がワイルドカード。
- (追記) テストのやり方が分からない。
- (追記) バリデーションとかは用意されてない?
- (追記) それ以外はわりといい。気に入った。REST好きな人におすすめ。
- Sequel
- ORMライブラリ。(ActiveRecord相当)
- DB[:managers].where(:salary => 5000..10000).order(:name, :department) みたいに、Rubyのコードを利用してSQLを書く感じ。
- といってもそれだけじゃなく、例えばhas_many, belongs_toみたいなアソシエーションもサポートしている。(many_to_oneとone_to_manyという名前だけど)
- (追記) マイグレーションもある(Rails風)。
- Markaby
- HTMLテンプレートエンジン。
- Rubyのコードを利用してHTMLを書く。
- 使ってみると意外と悪くない。
- 自動でHTMLエスケープされるし。
- ルールが単純なので、リファレンスを見る必要がない。
- (追記) ほとんどHTMLと変わらんのじゃない?と思うけど、閉じタグ書かなくていいのがこんなに快適だったか。
- (追記) <a class="foobar">... が a.foobar "..." と書けるので、実はjQueryとの相性がいい($('a.foobar'))。
2009-01-06
■ [misc] 年賀状コンシェルジュ・年賀状デザインキット
今ごろ紹介するのもどうかと思うけど…。日本郵便オフィシャルの年賀状ツールがよくできてる。
コンシェルジュの方はあらかじめ用意されたデザインの中から、自分の好みに合うものを提案してくれる。 デザインキットはAdobe AIRで作られている、簡易グラフィックツール。テンプレートの人気ランキングがあったり、 なにげにソーシャルな要素が含まれてるところがにくい。
いい仕事してるなー。
0歳から100歳まで1人ずつの年賀状を集めた101人の年賀状も面白い。
(追記:デザインキットで作ってみた年賀状。本年も宜しくお願いいたします。)
「本年も[TAB]」で適切な挨拶をサジェストしてくれるATOKは便利。
(追記2: 引っ越し時に、実家に届いた葉書を下宿に転送するようにしておくと、年始に実家に帰省したのにも関わらず下宿に年賀状が届くよ!みんなは気をつけよう!(どうせ転送したところでDMしか来ないよ!))
2009-01-07
■ [misc] プログラマの仕事場
耳鼻科で思いついたネタ。
「病院の診察室できょろきょろしてはいけないよ」 「どうして?」 「尖った道具を見つけたら、何をされるのだろうと無駄に不安になるからさ。」 「レストランで厨房を覗き込んではいけないよ」 「どうして?」 「手の洗い方が雑なのを見つけたら、それで大丈夫なのかと不安になるからさ。」 「ねえパパ、パパはプログラマだよね」 「そうだよ」 「パパの職場も見てはいけないの?」
■ [ruby] Webアプリのテストに役立つらしい「Webrat」って何だ?
WebratはRubyのライブラリで、
def test_sign_up visit "/" click_link "Sign up" fill_in "Email", :with => "good@example.com" select "Free account" click_button "Register" ... end
みたいに、Webアプリのテストに役立つメソッド群を提供してくれるらしい。
Webratは内部でHTMLパーザのNokogiriを呼んでいて、
click_link "Sign up"
とするとHTML内の「<a href="...">Sign up</a>」みたいなタグを探してリンク先のURLにアクセスしてくれる。
URLにアクセスする部分は、Railsとか、Merbとか、Sinatraとか、テストするWebアプリのフレームワークによって異なる (それぞれWebrat::RailsSessionとか、Webrat::MerbSessionみたいなクラスが用意されている)。
WebアプリがWebratをサポートしていない場合でも、MechanizeSessionを使えばWWW::Mechanizeを利用して、Webサーバ経由で 外側からテストすることが可能。*1
んで、テストのためのライブラリと言いつつ、結果を検証したりする部分はRSpecのような外部のテストツールに任されている。 だからRSpec + Webratとか、Cucumber + Webratとか、Test::Unit + Webratとかいろんな使い方ができる。
Webアプリの受け入れテストのためのツールといえばSeleniumとかWatirが有名だけど、 Webratはこれらと違って実際にブラウザを動かすわけではないので、より高速にテストを済ませることができるとのこと。
逆に、JavaScriptを使ったページのテストはWebrat単体ではできない。 でも、Webアプリの機能追加で途中からAjax使うことになりましたとか、よくあるよね!*2 そんな時のために、Webrat経由でSeleniumを操作するSeleniumSessionが用意されている。だから、それまでに書いたテストは変更せずに、 Ajaxのテストを追加することができる。
とりあえずは、cucumberと組み合わせて使う使い方から徐々に普及していくんじゃないかなぁ。
2009-01-08
■ [prog] 三項演算s…もとい、条件演算子の右辺に代入が書けるかどうか
単に「三項演算子」と言ってしまうと項を3つとる演算子が全て含まれてしまいますから、 「x ? y : z」のアレのことを指すのは「条件演算子」が正しいです。「Conditional Operator」ですね。
さてそんな条件演算子ですが、「:」の右辺に代入が書けるかどうかご存じでしょうか。つまり
true ? 1 : x = 2
のようなソースがパースエラーにならないかどうか。
ちょっと調べた限りでは、
- 書ける:
- Ruby
- C#
- 書けない:
- C
- Java
のように分かれております。
Javaと文法が似てると思ってたC#ですが、こんなところに違いがあったんですねぇ。
2009-01-16
■ [ruby] 「expr」は本当にexpressionなのか? - Rubyの式と文について考える
Rubyのparse.yを読むと、「stmt (statement)」と「expr (expression)」という非終端記号があることがわかる。
stmtに入るのは、例えばif修飾子(print "hello" if x)とか。exprに入るのは、1 + 2など、値を持つものすべてだ。
exprはstmtの一種である。つまり、stmtが書けるところならどこでもexprが書けるということ。
stmt = ... | expr;
ではexprとstmtはどう違うのだろう?parse.yを見ると、ifの条件部分など、「exprは書けるがstmtが書けないところ」があることが分かる。
| kIF expr_value then compstmt if_tail kEND
ifの条件部分は当然、値をもつものでなければならないので、ここにexprしか書けないのは妥当に思える。 だが、実は先ほどの説明には嘘があって、実際にはstmtもすべて値を持つのだ。
stmtの値を取り出すには、グルーピングの括弧を使えばいい。例えば 「1 if true」はstmtだから、
p( 1 if true )
はパースエラーだ。一方、括弧を付けた「(1 if true)」はexprになるので、
p( (1 if true) )
は正しく実行でき「1」が出力される。
stmtとexprという名前
C言語などではstatement(文)とexpression(式)は明確に区別され、式は値を持つが文は値を持たない。 けれど、Rubyではstmtもexprもすべて値を持つ。
とすれば、Rubyのstmtとexprには、もっと「よりふさわしい名前」があるのではないだろうか?
例えば、
- stmt = Expression, expr = Value expression
とか。
もちろん、非終端記号の名前なんてRubyユーザには関係ないし、Rubyを開発しているコミッタにとってさえ、それほど重要ではない。 けれど、規格書を書く側としては何にどういう名前を付けるかが重要ででですね…、 悩み多き日々です。良い名前を思いついた方は教えてください。
■ [link] memo: Cyanを設計した高校生、5カ月で5つの言語を習得 − @IT自分戦略研究所
Javaは遊び心がないかなと思って。その点C#はちょっとユーモアがあるので。
「遊び心」という視点はなかったなぁ。
HSPからCに入ったときに、Cが構造化されていることに感動を覚えた
僕はこの順序と逆なんだよな。
これは後付けですが、Cyanをローマ字読みするとシアン。Cyanには「思案」「試案」「私案」という意味があります。
なるほどw
■ [ruby][waves] Ruby Wavesでジャグリングの記録簿アプリを作ってみた
こんなんです。→Jugti
「Jugti」は「蛇口」と読みます。「じゃぐ」なら何でも良かった。反省はしていない。
ソースはgithubにあるんで、resources/trick.rbあたりを眺めてみると Ruby Wavesの雰囲気がなんとなく分かるかも知れません。 今回はWaves + Sequel + Markabyという構成で作ったけど、楽しかったよ。
Ruby Waves は、ポストRails世代のRuby用Webアプリケーションフレームワークです。 RESTfulだとか、サイズが比較的小さいとかいろいろ特徴はあるけど、詳しい紹介はgihyo.jpの記事を。(せっかく日本語でまとまった記事なのに、 ぜんぜん検索で上に来てないので…。)
2009-01-17
■ [biwascheme] mohekekeさんのパッチを取り込みました
githubのpull requestを頂きました。
gitに慣れてなくてよく分かんなかったんだけど、ガイドの手順をそのままやったら 取り込めたみたい。
自分のプロジェクトにパッチを頂いたのは初めてだと思うので*1、嬉しかったです :-)
*1 違ったらごめんなさい^^;;
■ [esobook] ReVIEWのこと
ときに本書はReVIEW+InDesignによる編集組版の第三弾。
[KeN's GNU/Linux Diary | 『zsh最強シェル入門』より引用]
そういえば、esolang本も青木さんのReVIEWというツールで書いた。非常に検索しづらいのだが、「青木日記 ReVIEW」とかで出てくるはず。
(SEOしてみた。)
ReVIEWはRubyで書かれた書籍執筆システムで、*.reという独自フォーマットのテキストからHTMLとか、TeXとかを生成することができる。 あとソースコードの自動引用も可能なんだけど、その機能は結局あんまり使わなかった。どの章も、先にソースを全部書いてから解説を書いたからだが。 ある章の節のリストを一覧できる機能には少しお世話になった。バイト数が出るので、ある節だけ妙に長いとかが分かるんだよね。
しかし何と言っても、章ごとと合計のバイト数を表示してくれる機能が最強。執筆中はファイルを保存するたびにコンパイルとこれが走るように していて、サイズを見ながら一喜一憂するなどしていた。*1
/Users/yhara/proj/esol/text % review-vol 2KB 1603C 31L preface ........ はじめに 1. 9KB 8370C 171L install ........ 準備 2. 18KB 18003C 365L exercise ....... Ruby練習問題 3. 23KB 22836C 593L hq9+ ........... サンプルプログラムに特化した言語、HQ9+ 4. 51KB 51644C 1006L brainf_ck ...... 8つの命令で全てを記述する言語、Brainf*ck 5. 73KB 74444C 1639L whitespace ..... 決して印刷できない言語、Whitespace 6. 27KB 26862C 745L starry ......... きらめく星空のような言語、Starry 7. 54KB 55132C 1616L bolic .......... Unicodeを悪ノリした言語、Bolic 8. 46KB 46983C 639L best ........... 付録:Esoteric Language傑作選 ======================== 299KB 305877C 6805L
あとどれくらいという目標が簡単に分かったのはReVIEWのおかげだし、ReVIEWがなければきっと自作のシステムを作るほうに熱が入って 執筆が全然進まなかっただろうと思うw。青木さんに深く感謝したい。
4839927847
479811815X
あー、そういえばUTF-8に対応させるために手元でアドホックな修正をいくつか加えてるんだけど、需要あるかなぁ。 要望があればgithubにでも載せるかも(ライセンスどうだっけ)。
*1 ちなみにyharaが一日頑張って書ける最大量は20KBだよ(UTF-8)!。豆知識。
2009-01-23
■ [softs] Operaで一番気に入っているところ
MacBookを買って数ヶ月は、いろんなブラウザを取っ替え引っ替えしてたんですが、最近はずっとOperaに落ち着いています。
Operaの良いところはいろいろありますが、間違って閉じてしまったタブを、タブバー右端のゴミ箱ボタンからすぐに復元できること。 って、それだけなら他のブラウザでも実装されてたりしますが、復元したあと「戻る」ボタンを押したときに、ちゃんと前のページに 戻れるんです。つまり最後に見たURLだけでなく、そのタブで見たURLの一覧ごと保存されてるんですね。 *1
Firefoxでも拡張入れればできそうですが、こういった気配りが「デフォルトで」いろいろと入ってるところがOperaの良いところかな、と。 *2
追記:
2009-01-27
■ [ruby] Array#product
[1,2,3] * [1,2,3]
が
[1,2,3].product([1,2,3]) #=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
と同じ意味になるといいなぁ。
最近Project Euler (問題和訳) に手を出してみたのだけど、1.9はこういう用途だと本当に速いね。
□ shugo [もっと早くおしえてくれれば…]
□ yhara [ごめんなさい、僕も昨日年賀状作ったもので…(^^;;]