トップ 最新 追記

Route 477



2009-06-02

[misc] サーバが不安定です

しばらく、mono.kmc.gr.jp以下が見えたり見えなかったりするかも知れません。route477.netもです。

[arc] Arcの最新版が出たらしいが

http://arclanguage.org/item?id=9383

  • (thaddeus) Ken Shiriffがarc2のリリース時に書いてたみたいな変更点まとめはないですか?
  • (pg) ないよ。diff取るといいよ。

pgぱねぇwww

ダウンロードは:http://www.ycombinator.com/arc/arc3.tar

[ruby] Ruby1.8/1.9同時にgemをインストールするシェルスクリプトを書いた

いちいち「sudo gem install hoge」して「gem-1.9 install hoge」するのはめんどいなーと思い始めたので、 両方に一気にgemをインストールするコマンドを書いた。 「gem-1.9」というコマンド名は適当に変えてね。

--format-executableは、gemに実行ファイルが含まれていたときに、そのファイル名をリネームするための指定。 上の設定だと、例えばramazeをインストールしたときに、1.8のは「ramaze」で、1.9のは「ramaze-1.9」で起動できるようになる。

[ruby] そろそろrequire 'rubygems'は止めようと思った

Rubyスクリプトを書くときはたいてい「require 'rubygems'」から始めるわけですが、 RubyGemsが標準添付になった1.9系ではもうこれ不要なんですよね。

なので、未来を見越して、今日から「require 'rubygems'」を手書きするのは止めることにしました。

シェルの設定で

 export RUBYOPT="rubygems"

と書いておけば、rubyの起動時にRubyGemsを読み込むオプションが指定されたと見なされるので、 1.8系でもいちいち「require 'rubygems'」と書かなくて良くなります。楽ちんですね!


ちなみに上の設定は、rubyの起動時に「-rubygems」というオプションを指定するのと同じことになります。 え、そんなオプションあったっけって?ruby -hを読むと、「-r<ライブラリ名>」は「require '<ライブラリ名>'」 と同じことが分かります。ということは「-rubygems」は「require 'ubygems'」と同じはず…。 そこで /usr/lib/ruby/site_ruby/1.8/ を見ると、なんと「ubygems.rb」が。中身は、単に require 'rubygems'しているだけです。

[git] イントラネット用githubとな!?

その名もGithub:FI (Firewall Installの略らしい)。

スクリーンキャスト見たけど、 「ローカルで動くgithub」そのものだった。クール

なにこれ?
イントラネット用のgithubだよ。会社の都合でgithubに(privateでも)アップロードできない場合にどうぞ!
どうやって動かすの?
ダウンロード→インストール(質問いくつか)→うごくよ!(10分くらい) いまのところLinux専用だよ。
システム構成は?
githubとほとんど一緒だよ。JRubyで動かすところが違うくらいかな。見た目も同じだし、少なくとも10万ユーザは大丈夫だよ!
でも、お高いんでしょ?
料金はインストール単位だよ。他のソース管理システムと競える値段だよ。
サポートは?
ヘルプデスク・メールサポート・ナレッジベースが使えるStandardと、技術スタッフが電話対応するPremiumを提供するよ。(※なんかhttp://support.github.com/ とかできてる!)
ちょっと見積もりしてほしいんだけど
今すぐ http://fi.github.com/ へGo!

2009-06-04

[ruby] RDoc書いただけで「リファレンスは完璧だお!」とか言ってるやつなんなの

タイトルは釣りですw。自分が実践でき(て)ないのであんまり強くはいえない。

以下、メモ書き程度だけど、個人的に、現状のRDocはユーザリファレンスに向いてないと思ってる。

問題は、

  • 内部用のクラス・メソッドまで全部リストアップされてしまうこと
  • どこから読めばいいか分からないこと
  • クラス構成に1対1対応したリファレンスしか作れないこと

の3点。

1点目は:nodoc:付ければ解決するけど、内部用のメソッドもライブラリのメンテナ候補生にとっては有り難いものだから、 無くしてしまうのはまずい。ので、「内部用のみ」と「内部用+外部用」の2つに分けてリファレンス作れるといいと思う。

2点目は、README(というかrdocのトップ)に、クラス構成の概要とかexampleとかをしっかり書いておけば解決できる。 「rdoc書くときは概要も書きましょう」というのを広めたい。

3点目は少し解説が必要だろう。RDocは1クラス1ページが基本だけど、ユーザ視点から見た場合、複数のクラスのメソッドを 同時に表示してほしいことがままある。例えば最近経験した例だと、Ramaze::Controller のメソッドはRamaze::ControllerとInnate::NodeとRamaze::*HelperとInnate::*Helperに分けて定義されていて、 だけどユーザからしたらそんなのはどうでもいいことで、「コントローラ内で使えるメソッド」としては これらの全部がまとめて見えてほしい。そういう柔軟な構成がRDocではできない。

まとめると、RDocはライブラリ開発者のための包括的なドキュメントを作るには向いてるけど、 ユーザ向けの親切な「リファレンスマニュアル」を作るにはあんまり向いてないと思う。 至高のユーザリファレンスのためにはクラス構造を潰せるような機能が必要で、 そのためには一から設計した新しい何かが必要。

[book][rails] 「600万人の女性に支持されるクックパッドというビジネス」

「Railsだってちゃんとスケールするんです!」という本でした(違う?)。 Ruby/Railsの話は少し出てくるだけですが、相当の負荷を捌いているようです。

4827550719

最近、技術系以外の話を書くサブブログを立ち上げたので(というほどまだ何も書いてないですが)、内容のことはそちらで。

「実装は?」と聞かれそうなブログ名だけど、実装の話はここに書くので(笑)。

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

okkez [継承関係か include されてれば bitclust でできると思う。]

yhara [bitclustはけっこう(Rubyコア以外にも)使えそうですよね。]

Yugui [柔軟な構成を人間が頑張る形ならRDで既にできたんですけど、RDocに退化しましたね。今からならbitclustなんで..]


2009-06-05

[ruby][rails] RubyKaigiに備えてRails Envy Podcastを聞こう

Rails Envy Podcastは、Jason SeiferとGregg Pollackが RubyやRailsの話題について喋るポッドキャストだ。毎週水曜に公開され、長さは20分くらい。 僕は皿洗いしながら聞くことが多い。

よくリスニング練習用に挙げられるESL Podcastなどと違って、 ネイティブ向けの容赦ない速度だけど、 話題がRuby/Rails関係だから、「server」とか「unittest」とか「can't scale」とか、断片的にいろいろ聞き取れると思う。

RubyKaigi2009は海外からのゲストも多いみたいだから、今のうちにリスニングの練習をしておくといいかもね。

喜びの声

  • 半年くらい前かな、最初のうちは全然聞き取れなかったんだけど、聞き続けているうちに「単語は聞き取れないけど、何を言ってるか意味はわかる」ようになってきたよ。初めてジョークを理解できたときは嬉しかったなあ。
  • ruby-talkを始め、いろんなところからニュースを拾ってるから、かなりのRubyマニアでも毎週ひとつは知らない情報があるはずだよ。最近だと、OcraBlue Ridgeはここで知った。Show Noteに参考リンクが載ってるのが嬉しいね。
  • 「ジャイアントロバーツ・スマッシング・アザー・ジャイアントロバーツ」って漫画か何かかと思ってたけど、GIANT ROBOTSだったんだね…。他にも、「sqlite」を「すぃーこぅらい」って発音するとか、技術者のリアルな英語に触れられるのが魅力さ。

2009-06-06

[ruby][memo] DXRubyスターターキットとか作れんじゃねーの

DXRuby使ったRubyスクリプトをOcraで普通に固められたので、 これはDXRubyスターターキット作るしかない。

と思ったけどexeのパスがスクリプトから取れなくて困った。リクエスト は上がってるみたいなんでそのうちできるようになるかなぁ。

まあとりあえずは、カレントディレクトリとexeのパスが一致すると仮定して問題ないんかな。


以下は製作過程のメモです。

構造

exeに含めるのは、ruby本体といくつかのファイルだけ。

D:\proj2\rskit2>ocra.rb.bat --no-autodll dxtest.rb
=== Loading script to check dependencies
=== Building dxtest.exe
m src
a src\dxtest.rb
m bin
a bin\ruby.exe
a bin\msvcrt-ruby191.dll
m lib
m lib\ruby
m lib\ruby\1.9.1
m lib\ruby\1.9.1\i386-mswin32
m lib\ruby\1.9.1\i386-mswin32\enc
a lib\ruby\1.9.1\i386-mswin32\enc\encdb.so
a lib\ruby\1.9.1\i386-mswin32\enc\shift_jis.so
m lib\ruby\1.9.1\i386-mswin32\enc\trans
a lib\ruby\1.9.1\i386-mswin32\enc\trans\transdb.so
a lib\ruby\1.9.1\rubygems.rb
m lib\ruby\site_ruby
m lib\ruby\site_ruby\1.9.1
m lib\ruby\site_ruby\1.9.1\i386-msvcrt
a lib\ruby\site_ruby\1.9.1\i386-msvcrt\dxruby.so
e RUBYOPT
e RUBYLIB
l bin\ruby.exe ruby.exe &#63731;\src\dxtest.rb
=== Compressing
=== Finished (Final size was 804769)

Rubyスクリプトは、起動用のファイルのみを含める。そこから、main.rbを動的にrequireする。

ただしmain.rbはexeファイルと同じディレクトリ(←これはカレントディレクトリとは限らない)から探さなくてはならない。 なので、まずexeファイルのパスを取得する必要がある。

が、

 kicker.exe
 -> ファイル展開
 -> bin/ruby src/kicker.rb

となるので、kicker.rbからはkicker.exeの情報を知るすべがない。これは困った。

[web] いまひどいCAPTCHAを見た

http://narabete.com/ にユーザ登録しようとしたんだが

画像の説明

真ん中の数字が読めねえwww 1か3か5か6か7か0のどれかだと思う。

まあ何回かリロードしたら普通に読めるようなの( 画像の説明 )が出てきたのでなんとかなった。

…って、これじゃ強度が足らなくないか?ロボットが防げる程度なら良いってことかな。

[ruby] Rubyスクリプトをexe化するためのソフト、Ocra

Rubyスクリプトのexe化というとRubyScript2ExeExerbが有名ですが、 最近Ocraというソフトウェアがリリースされたので紹介してみる。

まずはインストール。

 c:\> gem install ocra
 c:\> gem install win32-api   # Ruby 1.8系のみ(今のところ)

あとは適当なスクリプトを用意して、

 c:\> ocra.rb.bat hello.rb

すれば*1、hello.exeの出来上がり。ね、簡単でしょ?

仕組みはわりと簡単で、hello.rbを実行して必要なファイルを収集し、Ruby本体とそれらをexe内に格納する。 exeが実行されたら、テンポラリディレクトリに一式を解凍して、Ruby本体にスクリプトを実行させる。という感じ。

おまけ

比較してみた。

  • Ocra
    • 必要なものだけを圧縮・展開するので、速度・サイズともに悪くない。
    • 試験実行を行うため、クロスコンパイルはできない(今のところ)。
    • 1.9も対応済み。
  • Exerb
    • 必要なものだけを圧縮する。
    • さらに、requireをハックしてexe内部からスクリプトを読み込むので、テンポラリディレクトリを使わない。かっこいい。
    • コアファイル(ruby本体)を外だしできるので、アプリケーション(exe)がたくさんある場合もファイルサイズを抑えられる。
    • しかしRubyGemsと相性が悪いという弱点が。
    • ファイルサイズと(展開不要による)実行速度がメリットだが、どちらも昨今は余剰気味である。
    • そういえばクロスコンパイルができた。
  • RubyScript2Exe
    • 使ってるRuby環境をまるごとexeにして、実行時にはテンポラリディレクトリに展開する。
    • lib以下をぜんぶ圧縮・展開するので遅い。おすすめできない。
    • ただし作戦がシンプルなのでLinux/Macも対応しているようだ(未確認)。
    • 2007年以来更新されてない。
  • Crate
    • まだWindowsに対応してない。
    • バイナリを作るのにCコンパイラが必要。
    • スクリプトはsqliteのDBに圧縮して格納する。実行時は(requireをハックして)DBからRubyスクリプトを読み込む。
    • (作者の根気が続けば)テンポラリディレクトリなし・クロスコンパイル可能と、Exerbの上位互換になり得る。

*1 Ruby 1.9系の人は --no-autodllを付けてください

[ruby] DXRubyスターターキットできたよー

Ocra見てからスターターキット余裕でした。

game.exeをダブルクリックするとmain.rbが実行されます。

development.exeはgame.exeと同じですが、DOS窓が出るのでデバッグしたり例外を確認したりできます。

解説

単にカレントディレクトリのmain.rbをloadするようなファイルをOcraで固めただけです。

  1. お使いのRubyにDXRubyを入れる
  2. gem install ocra
  3. rake[Enter]
  4. game.exeとdevlopment.exeができる

ドキュメント書いたりとかはid:mirichiさんに任せました(ひどい!)

[Ruby/SDL] Ruby/SDLスターターキット2

上のやつのRuby/SDL + MyGame版

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

Before...

k-zakko [rskit2を使わせていただきました。ありがとうございました。もし配布方法に問題がありましたらコメント下さい。 ht..]

yhara [問題ありません。使っていただけて嬉しいです。]

k-zakko [了解しました。感謝します。]


2009-06-08

[misc] 今週末は東京です

(6/12), 6/13, 6/14。


2009-06-09

[ruby] Rubyのテスト環境大戦争

おまいらは本当にテストが好きだな!というわけで、Rubyのテスト関係のライブラリを並べてみた。

テストフレームワーク

Test::Unit
Ruby標準添付のユニットテスト用フレームワーク。
RSpec
DSLを使う、「BDD」という概念を流行らしたユニットテスト用フレームワーク。
Cucumber
自然言語を使って、ブラックボックステストを記述する。RSpecの「Stories」と呼ばれていた機能が独立した。

あとはShouldaとかbaconとかいろいろありますけども。

モック・スタブライブラリ

モック=あるオブジェクトに期待したメッセージが飛ぶかどうかテストするためのオブジェクト、 スタブ=ネットワークが絡むとか、実際のオブジェクトが使えない場合に使う偽オブジェクト。 と思ってるんですけどどうなんですかね(more: モックとスタブの違い)

FlexMock
モック・スタブライブラリ。
Mocha
モック・スタブライブラリ。
RR(double ruby)
簡潔な記述を目指したモック・スタブライブラリ。

あとRSpecにもモック・スタブ機能が標準で付いてきます。

テストデータライブラリ

Railsのfixturesみたいに、テスト用のデータを用意するためのライブラリ。

詳しいことは神まとめ http://wota.jp/ac/?date=20090608#p01 を読んでもらうとして:

fixture
RailsにはYAMLからテスト用データを作る仕組み(fixture)がありますね。
Factory Girl
YAMLを捨てて、Rubyで全部書く。
Machinist
Factory Girlのリライト。Fakerもサポートしてます。
Faker
なんちゃって個人情報」的なライブラリ。適当な名前とか電話番号とかを生成してくれる。PerlのData::Fakerの移植らしい。

まとめ

正直なところ、アツすぎてどれがどれやら分かんないですね(笑)。 好きなのを探して応援するもよし、追いかけるのなんてめんどいぜーという人はTest::UnitとかRSpecとか情報の多いやつを使っておくもよし。 ものによっては、書き直しの理由が「構文が気に入らない」だったりしますし、そのうち一番多くの人の支持を得られるやつが生き残るんじゃないすかね。


2009-06-10

[ruby][memo] Ruby 1.9のM17Nについての3つの記事

これで来たるべき1.9時代もばっちり!(かな?)

あとは実装寄りなら Ruby 1.9 m17n リファレンス (不完全版) ですね。


DXRubyの「Windowsで日本語ユーザ名だとtmpdirのパスに日本語が入ってrequireできない問題」ですが、 IRCの%rubyで聞いてみたところ、

  • Dir.tmpdirの返り値がASCII-8BIT固定なのが問題
    • が、どう直すかは悩ましい部分がある(ENVとか)
  • $LOAD_PATHにファイルシステムエンコーディングな文字列を追加することでとりあえず対応できる

という感じでした。

1.9.2になったら自然に直ってるかも知れませんね。でも一体なんでフルパスでrequireするんだろう…?もうちょっと調べてみたいところ。


2009-06-17

[ruby] Rubyの新世代パッケージングシステム、Ripの目指すところ

GitHub Rebaseで「Rip」というプロジェクトが開始した、というニュースを見たので調べてみた。

特徴は

  • ディレクトリ・ファイル・github・gemなどいろんなソースからインストール可能。
  • 必ずしもパッケージを「ビルド」する必要はなく、リポジトリから特定のバージョンを直接インストール可能
  • "ripenv"という、仮想環境機能がある。ライブラリの新バージョンが出たときは、まず新しい環境を作って試してみるとか
  • 依存関係はdeps.ripというテキストファイルに、一行一ライブラリで指定する。バージョンも込みなので、RubyGemsよりきっちり管理できる(?)

ということらしい。

状況は

  • まだ始まったばかり
  • RubyGemsを置き換える気はなく、共存すればいいと思っている
  • けど、便利さゆえにシェアが逆転する可能性はいずれあるかも?

というところのようだ。


まとめると「今後に注目」ということで。

以下は調査ログ。

InfoQ: Rip: A New Package Management System for Ruby

  • Githubチームの新作
  • ディレクトリ・ファイル・github・gemなどいろんなソースからインストール可能
  • "ripenv"という、仮想環境機能がある。ライブラリの新バージョンが出たときは、まず新しい環境を作って試してみるとか
  • 別にRubyGemsが嫌いなわけじゃない、むしろ大好き
  • Ripはライブラリの配布より使用側に重点を置いている
  • どのバージョンが使われるのかちゃんと分かるようにしたい

RipとRubyGemsの違い

  • RubyGemsはrequireをハックするが、Ripは$LOAD_PATHをハックする
  • RubyGemsのような「require 'rubygems'」が不要
  • RubyGemsは1つの環境に複数バージョンのライブラリをインストールするが、Ripは複数の環境を持ち、それぞれは1つのバージョンのライブラリしか持たない(?)
  • RubyGemsは*.gemしかインストールできないが、Ripはもっといろいろなソースに対応する(予定)
  • 要するにゴールが違うんだ。RubyGemsと共存できればいいと思っているよ。
  • Ripだと、処理系(1.8, 1.9, JRuby,..)ごとに別の環境を作ることができる。簡単でしょ。

あと今後の予定についていろいろ。svnとかhgとかもサポートするつもりだそう。

JamesWilding.net - Rip: a RubyGems Replacement?

  • RipはRubyの次世代パッケージングシステムを作るプロジェクトで、まだ荒削りだけどいい感じだよ。
  • 「パッケージングシステム」っていうか、gitリポジトリからインストールとかできるから、そもそもパッケージ作る必要もないんだけど。
  • なんならgistからだってインストールできる。もう*.gemspecは書かなくていいってわけだ。

Rip: A Next Generation Ruby Packaging System - Watch Out RubyGems!

  • RipはRubyGemsのいくつかの欠点を解決すると共に、全く新しいアイデアも提供する。
  • まだ"development alpha"バージョン
  • 「パッケージ」というものを、別のレイヤで抽象化する
  • いくつかの仮想環境を作り、それぞれ別のライブラリ群をインストールできる
  • Gitと同様、分散指向。「中央のRipパッケージサーバ」みたいなものは存在せず、各人が好きなところから好きなものを入れる。
  • だから、「gem install ライブラリ名」の代わりに、「rip install URI」のような感じになる。
  • Ripはいろんな長所があるし、Gitがこんなに速く普及したのを考えると、すぐに人気になってもおかしくないと思うね。

GitHub Rebase #23

  • RipはRubyのための新しいパッケージングシステムで、パない
  • いろんなソースからインストールできる
  • 仮想環境
  • 実行時じゃなく、インストール時に依存が満たされてるかチェック

About Rip

 $ rip install git://github.com/defunkt/grit.git v1.1.1b

Pythonのvirtualenvpipにインスパイアされた

特徴

  • いろんなパッケージ形式のサポート
  • 仮想環境(ripenv)。あるripenvを作るためのレシピも簡単に作成・公開できる
  • インストール時に、依存関係をチェック。(※実装はどうなってるんだろう?)
  • 親切なエラーメッセージ
  • Rip自身はRubyだけあれば動く

RubyGemsとの違い

  • パッケージを「ビルド」しなくていい。Gitリポジトリにタグを打って「これが最新版だよ」とか。
  • 依存関係はテキストファイルで、一行一ライブラリで指定する。
  • 仮想環境。ライブラリのバージョンを上げるときは、既存の環境をコピーし、インストールして試してみる。うまく行ったら、古いほうの環境を消す。
  • Ripではあるライブラリの「どのバージョン」が必要なのか指定するので、実行してみてからバージョン違いで動かない…みたいなことはない(?)
  • 既存のライブラリをRipに対応させるには、ただdeps.ripというテキストファイルを書くだけ。
  • 中央集権的な「Ripサーバ」は存在しない(良くも悪くも…)

あるプロジェクト(ambition)のdeps.rip

git://github.com/drnic/rubigen.git REL-1.3.0
git://github.com/seattlerb/ruby2ruby.git e3cf57559 # 1.1.8
git://github.com/seattlerb/parsetree.git 480ede9d9 # 2.1.1

ambitionをインストールすると、これら(とその依存ライブラリ)も同時にインストールされる。rip install deps.ripとかもできる。

  • アンインストールは、単にripenvを削除すればいい。rip uninstall <package>もできるけど。-dで依存関係ごとアンインストール。
  • 拡張ライブラリのコンパイルは、rip buildで行う。これはプロジェクトのRakefileを使ってrake rip:install を行う。
  • Windowsには未対応 (※インタビューに1.0までには、って書いてあったね)

2009-06-18

[event] 来週末はICFP Programming Contestです

関数型言語の学会、ICFPの主催するプログラミングコンテストが今年もやってきます。

開催日程は「CDTの6/26(金) 13:00:16 から72時間、6/29(月)まで」とのことなので、 日本時間では「金曜深夜、6/27(土) 3:00 から 月曜深夜、6/29(火) 3:00まで」ということですかね(合ってます?)。 今年も最初の24時間で区切る「lightning round」があるようです。

昨年はロボットの自動操縦AI対決だったわけですが、今年はどんなのが来るのだろうか。

[biwascheme] 例外とCPS

お役に立てて良かったです。

というのはさておき、BiwaSchemeも関数の評価中にJavaScriptスレッドを乗り越えることがあるので(sleepとかhttp-requestとか)、 ちゃんとした例外処理を実装しようと思うと関係ない話ではない気がしてきた。リンクされてたid:sumii先生の論文、読んでみるかなぁ。

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

nari [今年は休みを貰ってわりと本気でやりたいですね>icfp]


2009-06-23

[javascript] JavaScript用のパーサジェネレータ一覧

汎用

JS専用

小さいもの

他にもあったら教えてください。

BiwaSchemeで使いたいので、「主要な各ブラウザで動く」「生成されるコードの実行速度が速い」が満たされてると良いです。

[scheme] R6RSのライブラリが無駄に凝ってる件

例:

  • 継承ができるレコード型
  • 処理を続行できたりする例外
  • テーブルサイズを指定できるハッシュテーブル

APIが多少不便になっても、プログラマの自由を制限することだけはしたくないぜ、という意志が見られる。

詳細はWikiの方に。


2009-06-24

[vim] VimでESCを押すたびにファイルを保存する

.vimrcに

 inoremap <ESC>  <ESC>:<C-u>w<Return>

と書いておくと、ESCでインサートモードから抜けるたびに「:w」でファイルを保存するようになる。

やりすぎだ、と言われるかも知れないが、svnやgit等のバージョン管理システムを使っていれば特に 問題になることはない。むしろ、いちいち「:w<Return>」などと3つもキーを叩いてファイルを保存するのが無駄に思えるくらいだ。

(6/26追記:一方Vimハッカーはこうした:)

[ruby] オブジェクト?それクロージャでできるよ

という話はLisp系の人ならご存じかもしれないが、最近Schemeでやってみたらなかなか心地よかったので Rubyでも書いてみる。

まず

class Fruits
  def initialize(name)
    @name = name
  end
  attr_accessor :name

  def squeeze
    "#{@name} juice"
  end

  def squeeze_with(other)
    "Mixed juice (#{@name} and #{other.name})"
  end
end

というクラスを考える。使い方は、

orange = Fruits.new("Orange")
orange.name  #=> "Orange"
orange.name = "Tangerine"
orange.squeeze  #=> "Tangerine juice"

mango = Fruits.new("Mango")
orange.squeeze_with(mango)  #=> "Mixed juice (Orange and Mango)"

という具合だ。

これをクロージャで表現するとこうなる。

Fruits = lambda{|name|
  lambda{|method|
    case method
    when :name
      name
    when :name=
      name = args[0]
    when :squeeze
      lambda{ "#{name} juice" }
    when :squeeze_with
      lambda{|other| "Mixed juice (#{name} and #{other.name})"}
    else
      raise ArgumentError("unknown method: #{method}")
    end
  }
}
# オブジェクト生成
orange = Fruits["Orange"]
# プロパティの操作
orange[:name]  #=> "Orange"
orange[:name=, "Tangerine"]
# メソッド呼び出し(引数なし)
orange[:squeeze][]  #=> "Tangerine juice"
# メソッド呼び出し(引数あり)
mango = Fruits["Mango"]
orange[:squeeze_with][mango]  #=> "Mixed juice (Orange and Mango)"

見たまえ、関数がオブジェクトのようだ!*1

ここではコンストラクタもオブジェクト自身も関数で表される。Rubyのオブジェクト指向と違い、ここではプロパティとメソッドを分けてみた。 オブジェクト関数にメソッド名を与えて呼び出すと、メソッド関数が返ってくる。だからメソッド呼び出しはいつも関数を2回呼ぶことになる。 なんで処理を直接書かずに関数呼び出しを経由するかっつーと、引数の扱いを簡単にするためだな。というのが書いてみて分かった。

*1 いやRubyだと実際Procオブジェクトなんだけどw

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

ささだ [SICPの最初の方にそんな話が.]


2009-06-25

[ruby] RubiniusをUbuntuでビルドしてみた

最近はtarの配布がなくて,githubだけなんだな。

普通にgit cloneすると80MBくらいダウンロードする羽目になる。 --depth 1 オプションを付けて,最新版だけを取ってくると20MB程度。

コンパイルしてみると,vm/instruments/profiler.hppで止まる。 エラーメッセージで検索するとGCCのバージョンが関係あるとかなんとか。

とりあえずifdefで囲ってある部分を全部コメントアウトしたら動いた。

あとlibssl-devが必要だった。

コンパイルが終わると240MBになるので中間ファイルを消そうと思ったが,rake cleanすると実行バイナリまで消えてしまった。まあそうか。

% ./bin/rbx -v
rubinius 0.11.0-dev (ruby 1.8.6) (9865fe393 12/31/2009) [i686-pc-linux-gnu]

2009-06-26

[ruby][prog] リファレンスとドキュメントの話

反応をいただいた。

僕は説明書はとりあえず一通り目を通してみる方です(笑)。

が、メソッド単位の解説しかないという状態は、ケータイでいう「ぶ厚い方のマニュアル」しか入ってないようなものであり、 そんなもんをいきなりユーザに読ませるのは間違っていて、つまり我々が必要としているのは「ケータイ買ったときに入ってくるペラペラな方のマニュアル」 なのだな。

最近見た例だとerectorの公式サイトが、

  • SYNOPSYS SYNOPSIS
  • 「User Guide」
  • RDoc

と3段階揃ってて良かったです。

[haskell] Haskellってこんなにライブラリあったのか

SPONもこうなると良いですね。しかしR6RSの範囲を越えそうなものが結構多いな…

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

ku-ma-me [ケータイは電話とメール読み書きしかできない情報弱者です>< erector 見てみましたが、なんかもう誰から見ても文..]


2009-06-30

[event] ICFP09

問題文を読み違えていて半日無駄にするなどした。複数人で分担して読むと並列性は上がるのだけど、

  • 最初の方を読まずに途中だけ読むことになる
  • すると、わからないところはとりあえず想像することになる
  • その想像が見当違いであるとき、なかなか気づけない(想像と食い違ってても、「なんかこの文意味わからんなー」ということになってしまう)

という罠。

それはともかく、VMとビジュアライザを書いた。

両方Ruby(/SDL)だけど、4面以外はそこそこ楽しめる速度が出たので高速化とかは特にしなかった (コード生成は(やるかはともかく)思いつくべきだったなぁと思うけど)。 あとRuby1.9に上げたら、Ruby1.8の5倍程度速くなった。YARV++

ビジュアライザ担当としては、カーソルキーでズーム変更とか無駄な便利機能を実装できたのが良かったことで、 バグを一つ仕込んでしまったのが反省点。噴射した位置と方向を表示する機能があったんだけど、 手抜きでそこだけズームに対応しないことにしたら、Y軸の表示方向を途中で上下反転させた(=コンピュータ的座標系から数学的座標にした) ときに噴射方向が間違って表示されるようになってしまっていた。vx=vy=100な方向に噴射させ続けたとき、表示と直角な向きに進むので 気づいたんだけど。もし表示と並行だったらもっと悪いことになってたかも知れない。 間違っているビジュアライザは役に立たない。来年は気をつけよう(って、来年もビジュアライザ班やるつもりか)。

はまった人が多い(らしい)偶奇で入れ替わる話は特読にみ間違えなかった。 バイナリ系は比較的疎いので勘が働かなかったのが逆に良かったんだろう。 しかし今回は問題文に(意図的か不明だが)罠が多すぎたので、来年はぜひ日本人IRCを!

fe2c3b25ff1b71b4d1bafb20a7055c5b.png

f6331de5fcf1ecbebe61ce53e3186a3d.png