Posted filed under Hatana bookmark anywhere.

Photo by puddles for snails

 ブログを書いていると、はてなブックマークにいいコメントが付くことがあって、これが多くの人に見てもらえないのは、勿体ないなぁーと思うことがたまにあります。
本当はブログのコメント欄に残してもらえるとうれしいのですが、敷居が高いのかなかなか書いてもらえません。

 それなら、ブログにはてなブックマークのコメントを表示すればいい!と思って作ってみました。
どこでもはてなブックマークのコメントを表示するスクリプト、「hatana_bookmark_anywhere.js ver 0.1」をリリースします。

 実際の設置例はこのページの下の方を見てください。
Read more »

Posted filed under Ruby on Rails.

Photo by Pulpolux !!!

 bobchinさんの日記から「やっぱRESTは厳しいのかな?」。

 RESTでは、リソースに対して一意のURLに、これって結局データストレージとして使えるっていうだけなんだと思います。MVCでいうmodelの部分。
 これは、これでとても大切な部分なのですが、モデルを検索したり、いろいろ機能をRESTで提供するのは、うまくいかないと思います。

 Railsだと、create, show, update, destroyメソッドはいいのですが、index(list)メソッドをXMLで返すようにしても、あまりうまくいかないケースが多いと思います。1画面に出る情報が多岐にわたるので、きれいに表現できないんですよね。
Read more »

Posted filed under Ruby on Rails.

Photo by JosephH

 先日の「レスポンスコードでステータスを判断するとFreeSpotとかで問題にならない?」で、たけまるさんから、詳しいお返事をいただきました。

 AtomPPは全然わからないので、詳しい方に返事をいただけて光栄です。
たけまるさんのhikiは、GDataを調べてる時に、Google経由で何度も参考にさせていただいてます。
 残念ながらWebDB+Pressは日本を離れるときに全部処分してきてしまいました。

 やはりAtomPPでは、エラーの規定はないのですね。ほかのRFCで拡張されているのかなと思ったのですが、それもないのですね。
 エラーの内容を返すときに、Atom Entry形式を使うか、errorタグで返すかが迷うところです。ブログのAPIを見ているとerrorタグで返しているケースが多いように感じます。

Read more »

Posted filed under Ruby on Rails.

Photo by icanteachyouhowtodoit

レスポンスコードでステータスを判断するとFreeSpotとかで問題にならない?からの続き。

 ステータスコードで200が帰ってきたときに、ほんとに自分が通信したいサーバから帰ってきたかを検証する方法を考えてみました。

 ほんとに相手のサーバを認証したい場合はSSLを使うべきですが、そんなに大事にしたくない場合は、HTTPレスポンスヘッダに特定の値をセットすることで、相手を特定できるのではないかと思います。

 Railsのbefore_filterなどでresponse.headersをセットしてもいいのですが、これだとcacheに入った場合など、Railsを通らないときには、ヘッダが追加されません。
そのため、mod_railsの場合はApacheで、mongrelの場合はmogrel内でヘッダにセットする必要があります。

 Apacheでは、Headerディレクティブでヘッダを書き換える事ができます。これを使う場合にはmod_headersを有効にしてください。

<VirtualHost *>
....
  Header set X-AppName sticka
</VirtualHost>

 mongrelの場合には、config/environment.rbに下記のコードを追加します。

if defined?(Mongrel) && defined?(Mongrel::Rails)
  class Mongrel::Rails::RailsHandler
    alias process_without_appname process
    def process(request, response)
      response.header['X-AppName'] = 'sticka'
      process_without_appname(request, response)
    end
  end
end

 これで、開発で使っているmongrelでも、実環境のApacheでもHTTPレスポンスヘッダのX-AppNameにはstickaが設定されます。

 外部からAPIをアクセスする際には、X-AppNameを検証することで、プロキシなどによって勝手にリダイレクトなどをされても、それを検出することができます。

Posted filed under Ruby on Rails.

Photo by Paco CT

いま、Sticka用などに外部からデータの更新と参照をするためにWebAPIを計画しているんだけど、WebAPIと一口に言っても、いろいろなプロトコルがあって、どれを採用するかでとても悩み中。

候補になっているのは下記の4つ。

  1. RESTful (Rails)
  2. XML-RPC
  3. AtomPP
  4. GData

 Railsだけを考えるなら、サービス全体をRESTfulにして、HTML以外にXMLも返す様にしておけば、外部から使うのも比較的容易。Rails同士ならActiveResourceも一応使えるし。ただ、Rails以外でクライアントを作るのがメンドクサイ。また、実際問題、HTMLのコントローラとAPI用のコントローラを一緒にするのは難しいケースもあるので、一つのクラスでHTMLもAPIもとはなかなか行かない。
 サービスをRESTfulにしてXMLを返すのはいいけど、結局APIは別に用意しなきゃ行けない予感。

 2つ目はBlogの編集などで採用されているXML-RPC。ほとんどのBlog engineが採用しているので、APIでの採用率はとても多い。でも、XML-RPCは通信方法の規定だけなので、APIのメソッドについては自分で規定するする必要あり。メソッド名のスタンダードはきちんとしていないため、XML-RPCでAPIを作ってもクライアント側も独自に実装する必要あり。MT互換のAPIとかもできるけど、ダサイ。

 本命は3番のAtomPP。MT, WordPressなど、最近のBlog engineでもサポートされている、プロトコル。リソースへのCRUDをAPIとして実装するならかなりいい。ただ検索などのAPIは規定されていないので、この辺については独自で拡張する必要あり。
 一番の問題はエラー詳細を返すフォーマットについて規定がないこと。HTTPのレスポンスコードだけで返すと、エラー詳細が分からないんだけど、それを渡す規定がない。あと、FreeSpotなんかで、アクセスすると初回アクセス時にどのページにアクセスしてもログインページなどに飛ばされるようにってるけど、そういう環境では、APIにPOSTして200が帰ってきても、実は届いてなかったという事が考えられる。

 そもそも、そういう時には「407 Proxy Authentication Required」とか、別のレスポンスコードを返して欲しいのだけど、実際そうなってないので、なんらかの対策を考える必要がある。XMLのタグかHTTPヘッダで必ずシグニチャーみたいのを入れるとか。

 AtomPPのエラー詳細と、ステータスコード、みんなどうしてるのかなぁ。知っている人、情報お願いします。

 AtomPPとRSS2.0をベースに拡張したGoogleのAPIフォーマットが4番目のGData。
Googleで使われているAPIなので、現実的なメソッドが用意されている。検索とかエラーとか。ただ、認証方法はGlientLoginかAuthSub。WSSEじゃない。

 GDataがいいかなぁ。AtomPPに独自タグを入れるか。まようなぁ。

Posted filed under Ruby on Rails.

Photo by callumalden

 Amazon EC2を人に勧めると必ず言われるのが、「インスタンスを再起動したらディスクが消えるのが怖い」。

 これは「インスタンス」を再起動であって、OSを再起動してもディスクは消えないのだが、確かに起動に必要なファイルを消してしまって、OSが起動できなくなってしまうと、確かに取り出せなくなってしまいます。

 ただ、このようなケースは相当少ない上に、S3という巨大なストレージがあるので、再起動まえなどバックアップをマメに行なう事で、ほぼ解消できる。事実、Stickaでは1時間おきにdumpを取って、1週間分をS3に保持するようにしています。
 それでも、やはり容量が大きなデータベースを構築する場合などは、dumpを取るのが難しいなどの問題は出てきます。

 これに対する回答として、Amazonがやっと、EC2でも使えるインスタンスを終了しても消えないディスク領域、「EC2 Persistent Storage」を発表しました。

 これは容量は1G〜1Tまで選択でき、容量単位での課金になる模様。データベースにも使えるぐらいの速度が出て、さらにS3への動的なスナップショットも取れるという、かなり高機能ぶり。
 NFSなどではなく、ディスクデバイスとして/dev/sd?として認識され、ファイルシステムなども自分で好きな物を使う事ができるようになっています。

 これで、EC2でサーバを立てない理由は、回線速度ぐらいだな。特に日本からは。

 EC2 Persistent Storageはまだテスト中で、一部のユーザにのみ、使えるようになっている。もし使いたければ、waitlistに並ぶ必要がある。私も早速登録してみました。

Posted filed under Ruby on Rails.

mod_railsでは、Gemsで新しいパッケージを導入した場合、Apache自体を再起動しないと、アプリからそのパッケージを読み込めない模様。

p.s
 Passenger architectural overviewを見ると大体の構造が分かるみたい。ちゃんと読んでみよう。

 Ruby Enterprise Editionなんかも出る予定なのか。matzの日記で言及されているパッチとかが取り込まれたRubyなのかな?CoWが効くなら、Railsの様なサーバプロセスのメモリ削減には効果的だろうな。

Posted filed under Ruby on Rails.

 Rails運用時で気になるのは、安定性とパフォーマンス。安定性はいろいろ負荷テストをして時間が経たないと分からないので、まずはメモリのパフォーマンスから調べてみます。

 とりあえず、ちょっとしたサンプルをmongrelで動かしてみると、44Mほどメモリを確保しています。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1003     14412  0.0  2.2  44316 23556 ?        Sl   Apr10   0:01 /usr/bin/ruby1.8 /var/lib/gems/1.8/bin/mongrel_rails start

 んで、同じプロセスをmod_rails(passenger)で起動すると、143Mほど確保されます。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     23423  0.0  0.5  21720  9172 ?        Sl   06:24   0:00 Passenger spawn server                                                                                                                          
root     25426  9.0  1.2  34796 20944 ?        S    17:01   0:00 Passenger FrameworkSpawner: 2.0.2                                                                                                               
1000     25427  4.1  1.2  43204 22560 ?        S    17:01   0:00 Passenger ApplicationSpawner: /u/app/test/releases/20080413134312                                                   
1000     25429  0.3  1.2  43288 22316 ?        S    17:01   0:00 Rails: /u/app/test/releases/20080413134312      

 まだ詳しく追ってないんですが、”Passenger spawn server”は、Apache起動時に同時に起動されるプロセスで、Apache稼働中は常駐しています。これは稼働しているアプリの数に関わらず1個です。

 Railsアプリがインストールされているアドレスにアクセスすると、Railsアプリのプロセスが起動されます。
“FrameworkSpawner”がgemにインストールされたRails本体です。これは同じバージョンのRailsを使っていれば、複数プロセスで共有されます。
 ”ApplicationSpawner”と”Rails”が、プログラム本体です。想像ですが、”ApplicationSpawner”は待機中のプロセスで、”Rails”が稼働中のプロセスの様です。負荷が増えた場合は、”ApplicationSpawner”をcloneして起動するんじゃないかと思います。

 そして、一定時間(RailsPoolIdleTimeで指定した値、デフォルトで120秒)、アプリへのアクセスがないと、”ApplicationSpawner”と”Rails”は終了させられます。少し遅れて”FrameworkSpawner”も終了される様です。終了しないかも。

 なので、一つのサーバでさほどアクセスのないアプリを多数上げる場合には、mod_railsが向いているようです。1つのサーバで複数のアプリは上げない、メモリを余計に食いたくないというときは、mongrelの方が良いかもしれません。

 ただ今のマシンはメモリが多いので、この程度は気にしなくても良いかもしれませんが。

Posted filed under Ruby on Rails.

 masahikoさんにFriendFeedのアカウントなに?って聞かれたので、作ってみました。

 私のアカウントはいつもの通りmasuidriveです。もし良かったら追加してください。

 クライアントは、私もALERT THINGYをインストール。サブディスプレイでの表示にはちょうどいい。

Posted filed under Ruby on Rails.

Railsで一番めんどくさかったアプリの公開を、Apache httpdが動いているサーバに、普通にアップロードするだけで行える様にするモジュール、mod_railsがリリースされました。

いままで似たようなものにmod_rubyがあったのですが、ずっとメンテナンスされていない上に、構造的にRailsには向かないようになっていたので、Phusion社が新しく作ったものです。

日本語での紹介はmoongiftさんの記事をご覧ください。インストール方法や使い方は、こちらの記事を参考にしてください。

このモジュールの評価が高まれば、レンタルサーバでもRailsサポートをしてくれる所が増えるんじゃないかと期待してます。

早速、自分のサーバ(EC2)に入れてみた所、特に問題もなくあっさり動きました。

ただ、Capistranoを使っている場合、mongrelの時のままだと、サーバの起動などで失敗するので、config/deloy.rbをこのようにしました。

同時に、「設定より規約」でWebサーバ設定の自動化をするために、apache2-conf.rbも更新しました
私は、/etc/init.d/apacheの頭の方で、/mnt/www/bin/apache2-conf.rb > /etc/apache2/conf.d/vhosts.conf
を実行させて、apacheのプロセスを操作するたびに、自動生成される様にしています。

これで、ディレクトリ掘って、DB作って、cap deploy:setup; cap deploy:coldするだけで、新しいサーバでRailsのアプリを動かす事ができます。

ずっと作り続けている、Railsサーバの分散環境 on EC2も、これを使おうかと思っているので、ちょっとソースも読んでみます。

p.s
記事内で使っているderivativable.comは、いま作っている途中のcode snippetsサイトです。
投稿されたコードにたいてい、派生物を簡単に作れる様にするのが目標です。
Wikiでも、投稿されたコードを変更できますが、元のコードが消えてしまうので、心理的敷居が非常に高いと思っています。
それに対して、derivativable.comでは、元のコードは消える事なく、その派生物として管理される様になっています。元のコードは、そのまま保存されますので、自分用の変更などを気軽に投稿する事ができます。

まだベータ版にも満たないサービスですが、このコードに自分で機能を加えたときなどは、ぜひ投稿してもらえるとうれしいです。

あと私はデザインができないので、その辺で手伝ってくれる方も大募集。