May 15, 2008

YAPC2008

明日は社長とかとYAPCに行く予定だったんだけど、数年に一度くらいしか会えない友人に会う予定ができてしまったので中止。
あさっては行きます。

それと、RubyKaigi2008 なんだけど、チケットを予約したはいいけどいろいろ立て込んでて結局取れなかった。
懇親会のチケットはとれたけどね。
懇親会だけ参加ってなんだよそれって感じだよね。
ていうか何あのローソンチケットのシステム。
ほんと使えねー。
ネットで予約してから三日以内にローソンにチケット取りに行かないといけないって何それ。
あと、ロッピー使いにくい。
ダメあんなの。
まあ僕の考えが甘かったのがいけないんだよなあ。
あー、もう、自分にがっかり。

May 11, 2008

RubyKaigi2008

RubyKaigi2008 のチケット予約した。
懇親会のほうも一応とったけど、知人とかいなそうだからなんか不安。

ちなみに、チケットの予約は以下から。

http://l-tike.com/

Lコードっていうので検索する。
Lコードは以下。

RubyKaigi2008 35770
RubyKaigi2008 懇親会 35610

追記
やばい。
ローソンにチケット取りに行けなかった。

May 3, 2008

TechCrunch Japanese » Twitter、Ruby on Railsを放棄か

複数の情報筋からの情報:2年近くの間、高い頻度で発生していたスケーリング関連のトラブルで、TwitterはRuby on Railsのフレームワークを捨て、PHPないしJava(Rubyは使い続け、Railsのフレームワークのみを放棄する案もあるようだ)を使ってゼロから作り直すことにしたようだ。

TechCrunch Japanese アーカイブ » Twitter、Ruby on Railsを放棄か

実際のところどういう問題があったのか知りたいな。
おそらく、Twitter のような膨大なトラフィックを集めるサイト特有の問題だと思われる。
以下のような話も関連してるんだろうな。

TwitterのスケーリングについてはCookがその任に当たっていたが、彼はこの作業をうまくこなすことに失敗した。
[略]
Twitterは今年になって、少なくとも3つ、キーとなる技術面での雇用を行っている。Lee MighdollはVPエンジニアおよび運用担当として1月から参加している。そして今週になってJohn Kaluckiと(「BloggerおよびBlogspotのスケーリング分野での働きでその名を知られる」)Steve Jensenという、2名のスケーリング分野のエキスパートを採用した。

TechCrunch Japanese アーカイブ » Twitterにおける素人の前座は終わり?

というか、アレですよ。
Web アプリケーションをいかにスケールさせるか、という話になってくると、どのフレームワークが良いとかそういう話の重要度はきわめて低くなってくるんだろうな。
例えば、Java もしくは PHP に置き換えることによってシステムの負荷がほんのちょっと下がるだけでハードウェアにかかるコストがものすごく減る、なんてこともあるだろうし。
ごくごく一般の Web アプリケーションにおいてはこういう問題はそうそう起こらないと思う。

つまりは、「開発コスト」と「運用コスト」の二種類のコストがあって、サイトの規模や種類によってどちらの負担が大きくなるかが変わってくる、ということですね。
そういったことを考慮した上でシステムに採用する技術(言語やフレームワーク等)を決める必要があると。
なので、 Rails がダメだったから、とか早急に結論づけるのは問題の本質をとらえ損ねてるわけですよ。

いや、でも、Rails もしくは Ruby に致命的な問題があったとかだったらまた話は変わってくるけど。

April 10, 2008

twitter っぽいのを Rails で作りました

twitter っぽいのを Rails で作りました。
名前考えるの面倒くさかったので twitter です。

ソース

twitter.zip

デモ

http://test.oyguj.org/twitter/

スクリーンショット

twitter.png

もうちょっと改良して、もっと面白いものにしていこうという気持ちはあります。

そういえば IE で動作確認してない。

追記:
ちなみに、follow とか reply とかいった機能は全く実装されておりません。

January 22, 2008

中間ディレクトリも作ってくれる Dir.mkdir_p(ruby)

ruby スクリプトでディレクトリを作る場合は Dir.mkdir メソッドを使いますが、これって例えば「./hoge/hage/huge」という階層構造のディレクトリを一気に作成するといったようなことはできませんよね。
Unix の mkdir コマンドの -p オプション的な。

そういうことができるメソッドがあれば便利かもなー、と思って作ってみました。

追記:
以下の記事によると、上記のような処理を行うための FileUtils.mkdir_p というメソッドがすでにあるみたいです。。。すみません、勉強不足でした。
ディレクトリ深堀り - 二枚日記
ご指摘ありがとうございます。

ソース

def Dir.mkdir_p(dirname)
  dirs = dirname.split(/\/|\\/)
  dir_path = '.'
  dirs.each do |dirname|
    next if dirname == '.'
    dir_path += '/' + dirname
    unless File.exists?(dir_path)
      puts 'mkdir ' + dir_path
      Dir.mkdir(dir_path)
    end
  end
  0
end

ディレクトリの作成に成功すると 0(ゼロ)を返します。

使い方

Dir.mkdir_p('./hoge/hoge/hoge')
January 20, 2008

Ruby で深さ優先探索型のクローラを作ってみました

Ruby で深さ優先探索型のクローラを作ってみました。

更新履歴

  • 20080121_2 - ログ出力に logger を使うように修正。
    リンク URL を抽出する部分の不具合を修正(href=”/hoge/***.html” という形式を想定してなかった)。
  • 20080121_1 - robots.txt と meta タグに関する処理を実装しました。
    robots_txt.rb というファイルがそれに関連するモジュールです。

ソース

depth_first_crawler.rb
robots_txt.rb

必要なライブラリ

使い方

使い方は以下のような感じ。

require 'depth_first_crawler'

crawler = DepthFirstCrawler.new('http://example.com/', 4)
crawler.listeners << lambda{|content|
  # ここで取得したコンテンツに対する処理を行う
}
crawler.run

コンストラクタの第一引数がクローリングの起点となる URL で、第二引数がクローラの潜る「深さ」です。

crawler.listeners に、コンテンツを取得した時に行う処理をあらかじめ登録しておきます。例えば、全文検索用のインデックスを作りたい場合はここでその処理を行えばいいと思います。

lambda の引数に渡される content は構造体で、以下のような定義になっています。

content.uri #=> コンテンツのURI
content.date #=> コンテンツのデータ

フィルタ機能

対象とするコンテンツを絞り込んだりするためのフィルタを定義することができます。
以下のようにして、crawler にフィルタをセットします。

# path に index という文字列を含むものだけを対象とするフィルタをセット
crawler.filters << lambda{|uri| uri.path =~ /index/}

デフォルトで、同一ホストのコンテンツしかクロール対象としないようにするためのフィルタがセットされています。
追記: 20080121_1 の変更により robots.txt を元に生成したフィルターもデフォルトでセットされるようになりました。

注意事項

robots.txt 等に関する処理は実装されていません。
追記: ↑実装しました。

参考:
深さ優先探索 - Wikipedia

November 9, 2007

Rails を使うと Ajax がとっても簡単ですよ、というお話

Rails を使うと Ajax がとっても簡単ですよ、というお話。

普通のリンク

例えば、以下のコードを Rails の MVC パターンにおける View の部分に相当する *.rhtml ファイルに書きます。

<%= link_to "link to hoge", :action => 'hoge' %>

すると以下の HTML が出力されます。

<a href="/chapter3/hoge">link to hoge</a>

これだけでもまあ便利です。

Ajax 版のリンク - 1

Ajax 版のリンクを作ってみましょう。
そのためには上のコードを少し変えるだけです。
以下のように link_to のところを link_to_remote に変えて、後ろの :action のところも少し変えます。

<%= link_to_remote 'link to hoge', :url => { :action => 'hoge' } %>

出力される HTML(と JavaScript)は以下のようになります。

<a href="#" onclick="new Ajax.Request('/chapter3/hoge', {asynchronous:true, evalScripts:true}); return false;">link to hoge</a>

「Ajax.Request…」とかそれっぽいコードが生成されているのがわかりますね。

Ajax 版のリンク - 2

上の例だとリンクをクリックしても(リクエストは送信されるけど画面上は)何も変化がないのでちょっとさみしいですよね。
例えば以下のようにすれば、レスポンスの内容を画面に挿入することができます。

<%= link_to_remote 'link to hoge',
  :update => 'content',
  :url => { :action => 'hoge' } %>
<div id="content"><div>

出力される HTML(と JavaScript)は以下ようになります。

<a href="#" onclick="new Ajax.Updater('content', '/chapter3/hoge', {asynchronous:true, evalScripts:true}); return false;">link to hoge</a>

これで胸を張って Ajax と言えますね。
めでたしめでたし。

参考:

Ajax on Rails Ajax on Rails
Scott Raymond 牧野 聡

オライリー・ジャパン 2007-07-24
売り上げランキング : 17962

Amazonで詳しく見る by G-Tools