« 復活した月刊アスキーが面白すぎる | トップページ | まずいぜ、こっちのほうが予想外だった!(Mac) »

2006年10月25日 (水)

秋の夜長にRubyを学ぶ

トシをとると新しいものをみてもあんまり感動しなくなったりします。
どうしても「あーそれって昔のあれの焼き直しね」とか、「あーそれって昔似たようなこと誰か言ってたね」などというように、斜に構えてしまうのです。

下手すると人生へのモチベーションまで下がってきます。

  「現状維持でもまあいいか。どうせ死ぬことはないだろう」

なんていって、ボーッと過ごすようになりがちです。実際にはそんなことないのですが。
時折そんな気分にならないと言ったらウソになりますが、社長とかをやっていると現状維持でいいか、なんていうことは夢にも思いません。会社というのは拡大しなければ消滅すると思っているからです。とはいえ、あまり急激に拡大してしまうと、市況の変化に耐えられず自滅してしまう可能性もあります。ゆっくり、着実に少しずつ大きくなっていくのが良いと思うのです。

そのためには適切なスピードで拡大していく必要があり、目の前に仕事が沢山あるからといってホイホイ飛びついてはいけないのです(あれ?)。拡大基調にあるときはいいですが、なにかの間違いで市況が変化して売り上げが前年より下がってしまうと、経営者としての資質を問われることもあります。下手をすると、利益は出しているのに銀行から不利な条件でお金を借りることになったりする可能性もあります。

資金調達とは結局のところ、拡大への説得力なわけですから、下がり調子のときに「来年は儲かります」と言って信じてもらうのは非常に難しいことなのです。

閑話休題。

とはいえ、ある程度ものごとが順調に推移すると、変化すること自体が日常になってきてしまうことがあります。
人間というのは、微分の生き物ですから、昨日と今日の差分をとって、何が違うのかを常に考える傾向にあります。

そうすると、仕事としては順調に成長していても、本人としてはルーチンワークをこなしているだけ。言うなれば、ピラミッド建設です。

ピラミッドを建設するために石材を運ぶ仕事は、やればやるほどお金になりますし、お金は使わなければ使わないで居るほど貯まっていきますが、そのやり方でお金持ちになれる人は、ごく一般的な欲の持ち主で、根本的にはお金自体を生活に必要としていないことが多いのです。

ピラミッドを建設している最中に、「昨日よりもっと楽にできないか」、楽になったら、「昨日よりもっと速くできないか」、速くできるようになったら「そのプロセスを自動的に繰り返せないか」、それが自動的に繰り返せるようになったら「やーめた」という考えをする人が、ベンチャー企業的なのではないかと思います。要するに飽くなき変化への欲求です。まあこれだけ飽きっぽいと困りますが。

もの凄く長い前フリでしたが、そんな僕もやっぱり仕事以外の新しい刺激が欲しくて、ついついいろいろなものに手を出してしまいました。そのうちのひとつが、最近ハマっている、「知らない言語を学ぼう」という衝動です。Perl6をわずか1週間で実装したといわれる関数言語Haskellや、その祖先にあたるSchema(Lisp)あたりの文化にふれてみて、「これは面白いわ」とハマったのがつい先月。

ところが関数型言語で実用的なプログラムというのをイマイチ思いつかないんですよね。
パズルみたいで面白いんですけど。Haskellの素晴らしいところはパーサーみたいなややこしいコードがかなり簡単に書けるところなんですけど、それ以外に「うわー!スゴイ便利」という感じの気分になるような応用はまだ見たことがありません。

道理で、世の自称ハッカーのひとたちが入門書みたいな記事ばかり書いてるわけです。
結局、「これを使って面白いことをするネタがないかなー」と常々探しているわけですよね。
mtascがObjectCAMLで書かれているのを知ったときには心底衝撃を受けましたが

ところで先日、サイトスニーカーのシンプリファイフィルターという、我ながら凄くデキの悪いPHPコードをkzk君が修正したという世にも哀しい話を聞いて、心の底から申し訳なく思ったりしたことを思い出しました。

なにしろ自分でもなぜ動いているのかさっぱりわからないような混乱コードで、布留川君と水野君が負荷分散で慌てふためいているときに暇つぶしに1時間くらいででっちあげたコードだからです。あれでも「なんとなくそれっぽく見える」のが我ながら不思議ですが、自分でも不思議コードだと思っているくらいなので僕以外の人が見たらそりゃもう泣きが入るだろうなと思いました。

シンプリファイフィルターなんていっても、やっていることは以下のふたつだけです

 1. テーブルタグやスクリプトタグ、スタイルタグを消す
 2. リンクを相対リンクや絶対リンクか判定し、飛び先を適切なフィルターをかましたアドレスに張り替える

もっとスマートなライブラリを使って書けばもっとスマートに行くはずですが、あいにくそんなにスマートではなかった感じでした。

もうコピペしすぎてわけわかんなくなってるし、書いてる途中で絶対パスと相対パスのほかに、サーバーローカルな絶対パスというわけのわかんないものがあることが解って混乱しきっています。全体で200行以上はあります。やることのセコさのわりに行数が多すぎて混乱がこちらにまで伝わってくるようです。

この混乱しきった可愛そうなコードをあの素晴らしい言語Rubyで再現できないだろうか。
と、Rubyに関しては「たのしいRuby」を演習問題もやらずに「読んだだけ」の僕が思い立ち、とりあえずえいやで書いてみたのがこのコードです

require 'rubygems'

require 'hpricot'

require 'open-uri'

$page = "http://www.zakzak.co.jp/"
$base = $page
$page.scan(/http:¥/¥/[^¥/]*¥//) do | match |
$base = match.chop()
end
doc = Hpricot(open($page))

def urlconv(url)
if url != nil then
return url if url.index("http://")==0 #グローバル絶対アドレス指定
return $base+url if url.index("/")==0 #サーバーローカルアドレス指定
return $page+url #相対アドレス指定
end
end

result = doc.to_html.gsub(/<¥/*(td|tr|table|style|blockquate)+/i," result = result.gsub(//,"")

doc.search("a") do | html |
url= html.attributes["href"]
result = result.gsub(html.to_html," < a href='"+urlconv(url)+"' > "+html.inner_html+"")
end
doc.search("img") do |html |
url= html.attributes["src"]
result = result.gsub(html.to_html," < img src="+urlconv(url)+" > ")
end

puts result


とりあえずCGIっぽいところはいらないのでコア部分だけ書いてみました。CGIっぽい処理なんか飾りです。えらい人にはそれがわからんのです。

我ながら比較的無惨で無軌道なコードですが、これがまた哀しいことに本家シンプリファイフィルターよりよっぽどきちんと動くわけです。動作も明確だし、これをデバッグするならkzk君も余裕のヨッちゃんだったでしょう。彼がCPUの設計に専念するためにも、シンプリファイフィルターはRubyで書いておくべきだったかも知れません。


今となってはあとの祭りですが、そのうちRubyのサーバを立てようと思います。ただ地獄のように遅いっていうのがRubyの唯一の泣き所でしょうかねえ。


いやあでもやっぱり、言語の良さっていうのは使ってみて初めてわかるものですね。

Haskellでもなにか有意義なコードを書いてみたいです

|

« 復活した月刊アスキーが面白すぎる | トップページ | まずいぜ、こっちのほうが予想外だった!(Mac) »

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/32098/3946191

この記事へのトラックバック一覧です: 秋の夜長にRubyを学ぶ:

» 勢いというか若さというか [のぶろぐ]
アキバ系!文京区本郷四畳半社長: 秋の夜長にRubyを学ぶ ピラミッドを建設して... [続きを読む]

受信: 2006年11月 5日 (日) 00時07分

« 復活した月刊アスキーが面白すぎる | トップページ | まずいぜ、こっちのほうが予想外だった!(Mac) »