Rails検証報告書: プログラマの思索

Railsで特徴的なのは、CookieでHTTP セッションを管理できることだろう。

ここの仕組みが非常に分かりやすい。

Railsの後から付いた機能で一番素敵だと思うのがこの機能です。

「Cookieなんて仕様上は4KBしか保存出来ないんだから寧ろ弱体化してね?」

とか認識されることが多い気がしてならない。

コレ、導入時にも度肝を抜かれて、以降常に、

「ハンパねー、マジCookieセッションハンパねー!」

と脳内のアフロの人が言ってるんですが、大した利点に感じる人は少ないのか、他の言語やWAFで全面採用している例を見たことが無い。

Cookieセッション

そもそもセッションという言葉自体が複数の処理をまとめた単位という広義の意味とWebアプリケーションで複数リクエストにまたがってサーバー側に保存されるデータという狭義の意味が混在して使われているという事情があってWeb上でのテキストコミュニケーションを阻害している。

RailsのCookieセッションと言った場合は広義のセッションだが、狭義のセッションは存在しないと断言すると分り易い気がする。

RailsはHTTP(RESTアーキテクチャスタイル)の原則に従う形で何も共有しないという設計上のポリシーを持っている。

そもそもCookieと言う仕様はステートレスなHTTPプロトコルに広義のセッションを構築する上でNetscapeが考え出した上手い抜け穴だ。

CookieのデータはHTTPヘッダーに記載されて全データが送受信される訳だからHTTPリクエストの内容だけで全ての情報を表現するという原則からはみ出していない。

狭義のセッションに関しては言語仕様やアプリケーションサーバーの実装に委ねられていて、例えばPHP(言語仕様に狭義のセッションが含まれている)とJavaのTomcatとでは全然違う。

殆の実装でそうなっているんだけど、Cookie内の一意のIDをキーにしてサーバー上に(メモリであれ、ファイルであれ)狭義のセッションデータを持っている。

単体のHTTPリクエストやレスポンスで全ての情報を表現できなくてはHTTPの原則であるステートレスとは言えない。(Cookie内のIDがサーバー上のセッションデータを対応しているとしてもそれは単体のHTTPリクエストやレスポンスだけで判断出来ない、/tmp/sess_IDファイルの中にシリアライズされてるとかいった暗黙のルールが含まれている。)

RailsのCookieセッションは広義のセッションの維持はCookieによってのみ維持され、クライアントPCに保存され、それを元にしてステートレスなHTTPリクエストとして送出される。

認証

Rails2.x以降、Cookieセッションに移行すると同時に、認証は「restful_authenticationプラグインを使ってね!」という風にあっさりと変わった。

これは使う側やユーザーにとっては大した違いに見えないが、内部的には認証方式がBASIC認証に変わっている!

これまたファイルやDBに保存するステートフルな認証からステートレスな認証に思い切り変わっている。こんなもん土台をそっくりすり替えちゃう程の大変更だと思うんだけど、上位レイヤーに住んでる人には殆気付かれずに行った。

AtomPP策定のIETFの話し合い内でもあった、「APIと認証関係ねーだろう。認証はHTTPプロトコルの仕事」という身も蓋もない結論をあっさり採用する。そこに痺れる、あこがれる!

HTTPの原則を守る利点

ここまで過激にHTTPの原則を守る最大の利点は、Railsの設計方針としても上げられている「何も共有しない」からもわかるように非常にスケールアウトし易いところだ。そもそも、HTTP(の元のRESTアーキテクチャースタイル)はWebのような大きな分散環境を想定して作られたものである。

シンプルかつスケーラビリティの高いシステムを作るにはREST原則に従うのは理にかなっている。

何故ドラスティックな変更が可能なのか

Ruby界隈では標準仕様を決めてから実装するのではなく、「勝手に実装して、良いものだったら標準にしようか」というノリというか文化がある用に思う。

言語や周辺ツール・ライブラリの整備によって使い物になる実装が出来るまでの時間が恐ろしく短いため、整った仕様よりも、動くコードや自動テストが重視される傾向があるため、時間のかかる抽象的な議論が少なめになるせいではないだろうか。

例としては、最近各言語でxSGIと呼ばれてる仕様も通常、仕様とリファレンス実装を明確に分けるところをRubyではRackが実装を持って標準仕様を決めてしまった。そして実際にRack::RequestとRack::Responseはデファクトとしてあっという間に広まった。

不満

何が俺にこんな長文を書かせるかというと、

「Cookieセッション、BASIC認証を他の言語・環境でも使いたいんだよ!面倒臭くて仕方がない!」

というストレスが爆発したからである・・・。

最近、フィードリーダーで購読してるブログを全部読めている。

iPhoneのせいかと思ったけど、どうやらTwitterのお陰でいろんな人々のブログポスト数が減ってるからのようです。だからどんどん購読ブログは増やしていってるのに全部読める。そのせいか、フィードリーダーの1エントリーあたりの内容が面白まって来ている気がする。面白い。

Twitterのお陰で技術系じゃない人のブログもいつの間にか購読するようになって読むジャンルが増えたのも面白まってる要因かもしれない。

大山倍達のように(イメージ的に)山篭りしてるかのように外界と断絶した内容を書いてる人。どこから読んでも意味不明なのに精力的にポストを続ける人。無自覚に静かに狂っている人。高度な内容を平易な文章で書いてくれる人。

お宝ブログが多くて嬉しいです。

このブログのCSSを少し弄った。

弄る度にtext/plainに近づいてる気がするが、フォームとかリンクは必要なのでやはりhtmlは便利。

そもそも技術系ブログにはUIとかあんまり関係無いと思う。この文章も殆はフィードリーダーで読まれるだろう。PVやUUも全く当てにならない。Analyticsに分かるのはGoogleからパーマリンクに直接入ってくる人の傾向ぐらい。技術ブログにとって本当に大事なお客様はフィードリーダーで購読してくれる人だ。

実際の感触とAnalyticsが乖離してからかなり経つ。フィードリーダーで読んでくれる人の動向を簡単につかむ方法はないだろうか。

右上の検索をGoogleのサイト内検索に変えてみました。

SEO的にはいろんなパターンがあるハズの検索結果ページをGoogleドメインに持ってかれるのは良くないことだと思うんですが、仕事のサイトではないのでそんなん知らん。

変えた一番の理由は、今はドリホ上のRailsで動かしてるこのブログをapp engineに移行したときに日本語全文検索が面倒臭そうだからです。(今は面倒なのでタイトルと本文をLIKE '%foo%'してる。)

カテゴリとかタグとか構造化しない代わりに全文検索で補うというのがコンセプトなので楽して行きたいです。

持ってるMacBookの型番:MB466J/A

MacBook 2.0GHz Core 2 Duo/13.3"/2G/160G/8xSuperDrive DL/Gigabit/802.11n/BT/Mini DisplayPort

VirtualBoxをいちいち立ち上げるのが面倒なので、windowsのservice + coLinuxみたいに自動起動がしたい。

それには今まで避けてきたlaunchdを使わなくてはいけない。

Mac OS X 10.4(Tiger)から標準になったlaunchdは要はinit + inetd + daemontoolと理解。システム起動時にroot権限で動くLaunchDaemonsとログインしたときにユーザー毎に動くLaunchAgentsがあるそうです。(厳密には少し違うけど)

それぞれ指定のディレクトリにplist(プロパティリスト)というXMLの設定ファイルを作って、launchctlでloadするという流れ。

VirtualBoxはCUIでもVBoxManageコマンドでほとんどの操作が出来るのでLaunchAgentsで、

% VBoxManage startvm "仮想マシン名" --type headless

が動くようにしてやれば良いハズ。

~/Library/LaunchAgents/org.komagata.balloon.virtualbox-debian.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.komagata.balloon.virtualbox-debian</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/VBoxManage</string>
<string>startvm</string>
<string>debian</string>
<string>--type</string>
<string>headless</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

基本、ProgramArgumentsにargvを渡すだけみたいです。

% launchctl load ~/Library/LaunchAgents/org.komagata.balloon.virtualbox-debian.plist

これで設定が読み込まれたので再起動してみる。

Sun VirtualBox

すると立ち上がってはいるけど何故か"中断"の状態。

OnDemandをfalseにすると立ち上がるが、監視して終了しても自動的に起動する状態になるので、固定でメモリを確保するVirtualBoxでは気軽に落としたりしたいのでちょっと面倒。メモリが2Gなので増設すれば256MBぐらい気にならなくなるかな?

参照:Undocumented Mac OS X:第1回 initを置き換えるlaunchd【前編】 (1/3) - ITmedia エンタープライズ

VirtualBox, Debian

$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-cld --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1)

helloworld.s

.code32
.text
.global main

main:
movl $4, %eax
movl $1, %ebx
movl $msg,%ecx
movl $len,%edx
int $0x80

movl $1, %eax
int $0x80

.data
msg: .asciz "Hello, world!\n"
msgend: len = msgend - msg
$ as -o helloworld.o helloworld.s
$ ld -Ttext 0x0 -e main -o helloworld helloworld.o
$ ./helloworld
Hello, world!

Mac OS X(未完了)

% gcc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5646.1~2/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5646) (dot 1)
% as -a=helloworld.lst -o helloworld.o helloworld.s
FATAL:/usr/bin/../libexec/gcc/darwin/x86_64/as: I don't understand 'a' flag!

-aオプションは無い。

% as -o helloworld.o helloworld.s
helloworld.s:3:Unknown pseudo-op: .global
helloworld.s:3:Rest of line ignored. 1st junk character valued 109 (m).

.globalはだめ.globl。

% ld -Ttext 0x0 -e main -o helloworld helloworld.o
ld: unknown option: -Ttext

-Tオプションは無い。

% ld -e main -o helloworld helloworld.o
% ./helloworld
zsh: illegal hardware instruction ./helloworld

そもそもMac OS Xのldはbinutilsのldじゃないそうです。勉強はlinux上で進めていくことにします・・・。

参照

machidaさんがWordPress勉強会に行ってきたそうで、おみやげを貰いました。

酷いMacBook

ウソみたいだろ・・・これで外でも普通に仕事してるんだぜ・・・。

p0t.jpのドメインを失って暫く。

売ってもらったりできるのかなと思って調べてみると、

% whois p0t.jp | nkf -u
[ JPRS database provides information on network administration. Its use is ]
[ restricted to network administration purposes. For further information, ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]

Domain Information: [ドメイン情報]
[Domain Name] P0T.JP

[登録者名] エヌエムケーケー
[Registrant] N.M.K.K

[Name Server] dns1.name-hosting.net
[Name Server] dns2.name-hosting.net

[登録年月日] 2009/07/01
[有効期限] 2010/07/31
[状態] Active
[最終更新] 2009/07/01 01:15:02 (JST)

Contact Information: [公開連絡窓口]
[名前] エヌエムケーケー
[Name] N.M.K.K
[Email] info@namemarket.jp
[Web Page]
[郵便番号] 150-0031
[住所] 東京都渋谷区
桜丘町20-1
[Postal Address] Shibuya-ku
20-1 Sakuragaoka-cho
[電話番号] 03-5456-5167
[FAX番号]

N.M.K.Kでググッたところ取り戻すのは難しそう。YHVHみたいで何か怖いですね。関わらない方がいいのかな・・・。

YHVH
還暦プログラマの挑戦(Haskell に挑む→F#による言語造り)

なにが、私を、そうさせたか。

還暦直前のプログラマです。
(厳密に言いますと、2008年1月1日、戊子(つちのえね)で還暦ということです。
2008年4月某日で60歳になりました)
最近引退したので、元プログラマというべきでしょうか。
還暦をマジかに控え、400時間、500時間労働はこたえました。おかげで、10Kg以上もやせて、メタボリックなんとやらは心配なくなったみたいな。
時間ができたらやりたいと思っていた事が2つありました。

  • 言語を作る。(CMLと名前だけ決まっています)
  • OSを作る。(CMosと、名前だけ決まっています)
こんなおり、どこかで読んだのを、ちょいと思い出してしまったのが、かの「Haskell」です。
なんとかいう天才プログラマが、数ヶ月でHaskellを学び、また数ヶ月でPerlのV6を作っちゃったとか。
刺激的な話題ですよね。
で、めづらしいもの好きのオヤジとしては、つい環境を作っちゃって、お勉強をはじめたわけです。
「還暦の手習い」です。

この方の様な生活にとても憧れます。

とりたてて"天才"でも"スーパーハッカー"でもなくてもプログラムが好きで書き続けていれば還暦を迎えられ、その後に自分の楽しみのプログラムを書いて暮らせる老後生活が送れる。

我々にそういう希望を持たせてくれます。とても素敵なロールモデル。

内容もとても好きです。

地道な勉強やコーディングの合間にある発見や手応え。分からないことにも正面からスーっと入っていく自然体が素敵です。

常日頃、3億円あったらディアスポラのヤチマのように真理鉱山に引き篭って死ぬまで暮らしたいと思っていますが、既に体現されている方がいるとは羨ましい限りです。

ディアスポラ (ハヤカワ文庫 SF)