トップ 最新 追記

Route 477



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-05

[idea] 早起きしたときだけしかLDR見れないようにしたらどうか

最近明らかにLDR見すぎなので、朝の6:00から8:00までしかreader.livedoor.comにアクセスできないようなプロキシサーバを作ったら良いんじゃないかと思った。

cronで6時と8時に/etc/hostsを切り替えればいけるかと思ったけど、それだと7:00に起きたときに困るな。


2009-01-06

[misc] 年賀状コンシェルジュ・年賀状デザインキット

今ごろ紹介するのもどうかと思うけど…。日本郵便オフィシャルの年賀状ツールがよくできてる。

コンシェルジュの方はあらかじめ用意されたデザインの中から、自分の好みに合うものを提案してくれる。 デザインキットはAdobe AIRで作られている、簡易グラフィックツール。テンプレートの人気ランキングがあったり、 なにげにソーシャルな要素が含まれてるところがにくい。

いい仕事してるなー。

0歳から100歳まで1人ずつの年賀状を集めた101人の年賀状も面白い。

(追記:デザインキットで作ってみた年賀状。本年も宜しくお願いいたします。)

画像の説明

「本年も[TAB]」で適切な挨拶をサジェストしてくれるATOKは便利。

(追記2: 引っ越し時に、実家に届いた葉書を下宿に転送するようにしておくと、年始に実家に帰省したのにも関わらず下宿に年賀状が届くよ!みんなは気をつけよう!(どうせ転送したところでDMしか来ないよ!))

本日のツッコミ(全2件) [ツッコミを入れる]

shugo [もっと早くおしえてくれれば…]

yhara [ごめんなさい、僕も昨日年賀状作ったもので…(^^;;]


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と組み合わせて使う使い方から徐々に普及していくんじゃないかなぁ。

*1 WWW::Mechanizeもpage.links.first.clickみたいに書けたりするんで、機能的には若干カブる。目的はWebrat→テスト、Mechanize→自動化と異なるけれど。

*2 あるのか?


2009-01-08

[prog] 三項演算s…もとい、条件演算子の右辺に代入が書けるかどうか

単に「三項演算子」と言ってしまうと項を3つとる演算子が全て含まれてしまいますから、 「x ? y : z」のアレのことを指すのは「条件演算子」が正しいです。「Conditional Operator」ですね。

さてそんな条件演算子ですが、「:」の右辺に代入が書けるかどうかご存じでしょうか。つまり

true ? 1 : x = 2

のようなソースがパースエラーにならないかどうか。

ちょっと調べた限りでは、

  • 書ける:
    • Ruby
    • C#
  • 書けない:
    • C
    • Java

のように分かれております。

Javaと文法が似てると思ってたC#ですが、こんなところに違いがあったんですねぇ。

本日のツッコミ(全2件) [ツッコミを入れる]

kankichi [CとJavaは三項演算子の方が代入演算子より優先順位が高いので 「:の右辺に代入が書けるか」という命題の立て方からし..]

yhara [おお、なるほど…。]


2009-01-11

[misc] 詰め将棋のルールの不備

詰め将棋にはルールに未定義な部分があって、さらにそこを突いた問題が作れるらしい。

面白い。

[prog] a ? b : c=1 の反響

関連情報。

なんでも書いてみるもんですね。


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の記事を。(せっかく日本語でまとまった記事なのに、 ぜんぜん検索で上に来てないので…。)

本日のツッコミ(全2件) [ツッコミを入れる]

shugo [exprってけっこう中途半端だよね。andとか、そのまま引数に渡せないし。やっぱりsecondary express..]

ujihisa [> secondary expression 略してS式ですね。]


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-22

[esobook] ソースコードがダウンロードできるようになりました

サポートサイトの方から、本書のソースコードをzip圧縮したものがダウンロードできるようになりました。

どうぞご利用ください。(そして、遅くなって申し訳ありません)

4839927847

本日のツッコミ(全2件) [ツッコミを入れる]

名無しさん [サポートサイト、しばらく前から落ちてるみたいです。]

yhara [報告ありがとうございます。ドメイン更新のいろいろで落ちていたみたいです。]


2009-01-23

[softs] Operaで一番気に入っているところ

MacBookを買って数ヶ月は、いろんなブラウザを取っ替え引っ替えしてたんですが、最近はずっとOperaに落ち着いています。

Operaの良いところはいろいろありますが、間違って閉じてしまったタブを、タブバー右端のゴミ箱ボタンからすぐに復元できること。 って、それだけなら他のブラウザでも実装されてたりしますが、復元したあと「戻る」ボタンを押したときに、ちゃんと前のページに 戻れるんです。つまり最後に見たURLだけでなく、そのタブで見たURLの一覧ごと保存されてるんですね。 *1

Firefoxでも拡張入れればできそうですが、こういった気配りが「デフォルトで」いろいろと入ってるところがOperaの良いところかな、と。 *2

追記:

  • 追記A: 余剰気味なマシンリソースの有効な利用法ですよねこれ。
  • 追記B: Macには、Windowsにおけるfubとかsyleraみたいに「細部までカスタマイズしまくれるブラウザ」が存在しないのは何故なんだぜ?

*1 あと、「そのページをどこまでスクロールしてたか」という位置情報も保存される。縦に長いページだと非常に便利。

*2 ちなみにMacを使い始めた当初にOperaが選択外だったのは、MacUIMでの漢字入力がおかしかったから。ATOKを買ったことで、副作用としてこの問題が解決しました。^^;

本日のツッコミ(全2件) [ツッコミを入れる]

niha [Fx でも当然保存されますよ ただメモリもぐもぐおいしいなあという感じなので最近無効化しました… 追記BはMac的に..]

yhara [「あれこれカスタマイズするのは面倒だから、ベスト(と思われる)選択肢が提供されてるほうがいいよ」という文化ということ..]


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はこういう用途だと本当に速いね。