kaeruspoon

はてブメール、はじめました

 はてブメールというwebサービスをはじめてみました。はてなブックマークの人気エントリーから、新たに追加となったエントリーだけをメールで指定した時間にお届けするという、超シンプルなサービスです。誰の役にたつのかはわかりませんが、ぼくが欲しかったものなので作ってみました。
 ぼくは通勤中の電車の中では、本を読んでないときはだいたい携帯ではてなブックマークの人気エントリーを読んでいます。だけど、人気エントリーのページでは前に読んだエントリーも出てくるし、アクセスする前にワンクッションあってわずらわしいなと思っていたのです。
 本当は、エントリーのページ自体をクロールしてメールで送ろうと考えていたのですが、携帯メールの文字制限+パケット代がかさむ+見たくないエントリーも届いてしまう、という問題からとりやめました。

 ひとつのサーバ上でふたつのRailsアプリが稼働することになりました。lighttpdだととても簡単ですね。これは後日また書きましょう。

ひとつのサーバ上でRailsアプリを複数動かす方法

 はてブメールはこのkaeruspoonと同じサーバ上で動いています。ひとつのサーバ上で複数のRailsアプリを動かす方法はいろいろあると思いますが、ぼくは一番簡単そうなサブドメインでわける方法を選びました。ちなみにwebサーバはLighttpdです。
 lighttpd.confの中で以下のような設定を追加します。

#### fastcgi module
## read fastcgi.txt for more info
fastcgi.server             = ( ".fcgi" =>
                               ( "localhost" =>
                                 (
                                   "min-procs" => 10,
                                   "max-procs" => 10,
                                   "socket" => "/tmp/kaeruspoon.fcgi.socket",
                                   "bin-path" => "/var/www/kaeruspoon/public/dispatch.fcgi",
                                   "bin-environment" => ("RAILS_ENV" => "production")
                                 )
                               )
                            )

$HTTP["host"] == "hatebumail.kaeruspoon.net" {
server.document-root = "/var/www/hatebumail/public"
fastcgi.server = ( ".fcgi" =>
                        ( "localhost" =>
                          (
                             "min-procs" => 10,
                             "max-procs" => 10,
                             "socket" => "/tmp/hatebumail.fcgi.socket",
                             "bin-path" => "/var/www/hatebumail/public/dispatch.fcgi",
                             "bin-environment" => ("RAILS_ENV" => "production")
                          )
                        )
                )
}

これであとはlighttpdを再起動してやるだけです。とても簡単でしょう? これでいくらでも思いつくかぎりのサービスをローンチすることができそうですが、ぼくのサーバのスペックじゃすぐに限界がきそうなのでほどほどにしとかなきゃです。

Pandoraからの残念なお知らせ

 ぼくがプログラミング中によくアクセスしているPandoraから以下のようなメールがきました。

Today we have some extremely disappointing news to share with you. Due to international licensing constraints, we are deeply, deeply sorry to say that we must begin proactively preventing access to Pandora's streaming service for most countries outside of the U.S.

なんてことでしょう。ライセンスの問題から、 アメリカ外からのアクセスを防ぐようになるようです(アメリカ国内ではライセンス認可が降りたらしい)。5月3日からだとメールの続きに書いてある。まだ聴けているのは、アメリカの時間で5月3日からだからなのかな。なにはともあれ、とても残念です。

ぼくはプライベートでなにをしているのか

 先日、ユルさんが「旦那さんは家でなにをしているのか」と問われたらしい。その話をきいてぼくはとっさに「なにもしていないな」と思ってしまった。本当になにもしていないというわけではない。ごはんを食べたりお風呂に入ったりお皿を洗ったりしている。驚くべきことに眠ったり息をしていたりもする。息をしたいと願ったことは一度もないのに、生まれたときから勝手に行っているのだ。不思議な話ではないか。と、いうように、なにかをしている、という意識がないというお話。
 プロフィールのところにも書いているけど、ぼくにはすこしだけ趣味があるが、本当のところそれを趣味だと思ったことはない。趣味というものに実感がない。趣味とはなんなのか、いまだによくわからない。趣味を持てといわれたら、ぼくは途方に暮れてしまうだろう。
 プライベートでなにをしているかというと、一番大きなウエイトを占めているのはプログラミングである。そのための勉強もよくやっている。勉強という認識はないけど。小説も技術書も、買ってきてページをひらく前は等しくわくわくするのだ。ちなみに、仕事にはあまり関係ない。
 ここ数年やっていなかったゲームも最近はけっこうよくやっている。武石さんから借りたバンピートロットというゲームが楽しいのだ。
 読書は最近あまりやっていない。通勤のときにペーパーバックを読んでいるくらいだ。あわせて、ときどき英語の勉強とか翻訳をしてみて遊んだりしている。
 バイクはもう何年か乗っていないが乗りたくて悶え苦しんでいる。ネットでバイクの動画をよく見ている。ドライブはレンタカーを借りてときどきいく。楽しい。
 最近は自転車にもとても興味がある。雑誌もよく読むしネットの巡回先もいろいろある。クロスバイクがすごく欲しい。鎌倉くらいまで自転車で行こうかと考えている。自転車といえばピストが流行っているが、ぼくはあれは別に嫌いじゃない。嫌いなのは、ピストに乗っているやつらだ。
 最近はあまりプラモを作っていない。ラジコンもやっていない。Q-STEERでちょっと遊んだくらいだ。そろそろプラモを作りたい。RCV212VとかDUCATI999Rとか1098とかいいね。
 という、どうでもよいお話の一日。

バイクを見てきた

 バイクといってモーターサイクルではなくてバイシクルのほうです。自転車の専門店に行ったのは初めてだったけど、いろいろな自転車が置いてあって楽しかった。GIANTのFCRも見ました。東急ハンズではtokyobike sportsも。シンプルでいい感じです。どれもカッコいい自転車ばかりですね。モーターサイクル並に自転車にもハマってしまいそうです。

デザインを変えてみた

95
 近所に住んでいるネコの一匹。ぼくはミミゲと呼んでいます。すごく臆病なやつで、撫でられるようになるまでユルさんでも一年近くかかりました。でも今はこのとおりです。

 kaeruspoonのデザインを変えてみました。めちゃくちゃシンプルにしてしまった。それからチャットを廃止しました。あんまり使うこともないし、中途半端の造りだったしね。タグクラウドやamazonのアイテム一覧などは別ページを用意してそちらで表示するようにしてみました。

英語がおもしろい

 どんどん英語がおもしろくなっています。もっといろいろわかるようになりたいな。もっと単語を覚えなきゃだね。これはもう地道にやっていくしかないのかな。相変わらず、助動詞がまだ苦手です。関係代名詞はけっこうわかるのだけど。

I want to sleep right now. I always want to sleep every day. Why? I don't know why. Maybe I should go to bed before midnight. So I would have been to bed before midnight today. But It's too late now. What am I writing? I don't know what mean I wrote it.

フラグメントキャッシュをRailsで使う。

 ようやくといっていいと思うけど、kaeruspoonにキャッシュ機能を追加しました。
 Railsでは三つのキャッシュ機能があります。ページキャッシュにアクションキャッシュ、そしてフラグメントキャッシュです。今回はフラグメントキャッシュを使ってみました。
 使いかたはとても簡単で、キャッシュしたいビューの部分をcacheブロックに入れるだけ。

<% cache(:action => :view_item, :part => :amazon) do -%>
<%= view_amazon_items @amazon_items %>
<% end -%>
<% cache(:action => :view_item, :part => :youtube) do -%>
<%= view_youtube_items @youtube_items %>
<% end -%>
<% cache(:action => :view_item, :part => :tags) do -%>
<%= view_all_tags @all_tags %>
<% end -%>
<% cache(:action => :view_item, :part => :count) do -%>
<%= view_count @count %>
<% end -%>

 ひとつひとつのキャッシュを区別するために、アクションとパートでユニークにします。パートは任意の文字列かシンボルでOK。これだけで、次回からこの部分を表示するときにキャッシュが使用されます。
 このままだとキャッシュ部分の内容が更新されても表示が反映されません。更新時はキャッシュを無効にしてしまいます。

    Diary.find(params[:id]).destroy_with_tag
    expire_fragment(:action => :view_item, :part => :amazon)
    expire_fragment(:action => :view_item, :part => :youtube)
    expire_fragment(:action => :view_item, :part => :tags)

これでOK。さらに、コントローラ内で、キャッシュ済みのデータは取得しないようにもできます。これでさらに高速化が望めます。

    @count = Counter.top_count unless read_fragment(:action => :view_item, :part => :count)
    @all_tags = Tag.get_all_tags unless read_fragment(:action => :view_item, :part => :tags)
    @amazon_items = AmazonList.get_items unless read_fragment(:action => :view_item, :part => :amazon)
    @youtube_items = YoutubeList.get_items unless read_fragment(:action => :view_item, :part => :youtube)

とても簡単ですね。

I read paperbacks when I go to work by train. I often worry that if I'm talked from a foreigner in English, I wouldn't know what I should do. Surely I've been reading books which was written in English. But I couldn't speak English and understand what a foreigner talks.

欲しいものを作ろうとしてもすでに誰かがやっている

 Pandoraにアクセスできなくなったので、ぼくの生活からロックが失われつつあった。飢えに苦しんだので、今日はYoutubeで燃料補給。ああ、やっぱりロックはいいや。So All I Want! でも、Youtubeはひとつの動画が終わるたびに次の動画を指定してやらないといけません。これだと、音楽を流しながらプログラミングするなんてことができません。そのたびに集中力が切れちゃうし。キーワードを指定したら、それに関するすべての動画を連続に再生していってほしいのです。それがあればPandoraの変わりになりそう。よし、作ろう、と思ったところで、ネット上にすでにYoutube Flash Playerというサイトが存在してました。なんだ。じゃあこれでいいや。このようにして、だいたい何か思い付いてもすでに誰かがやっているのが常なのであります。

気づけば遠くへ

 銀河英雄伝説をみていたら、ミッターマイヤーが30歳、ロイエンタールが31歳といっていた。もうぼくのほうが年上なのだ。だからなんだというお話。

 昨日は眼精疲労できつい一日だった。また肩こりがひどくなってきています。

サプライズ・パーティに参加してきました

 昨日は、たけぞうさんと律さんの結婚を祝うためのサプライズ・パーティに参加してきました。ぼくとユルさんがふたりをだまして会場まで連れていく役目です。実際、たけぞうさんは知っていたので、だまされていたのは律さんひとりなのでした。ユルさんが緊張しまくっていて、火サスの犯人みたいにいつもやらないようなことをやって犯行がバレてしまうという事態をまねきかねない状態でした。おもしろい。
 ふたりをうまく会場に案内できたあとは(律さんにもバレることなく)、ぼくの仕事は終わったので飲んでばかりいました。武石さんが飲みたそうでした。最近会うと、武石さんはいつも飲みたそうなのです。今月のおこづかいが出たら品川か五反田ででも飲みましょう。
 なにはともあれ、たけぞうさんや律さんに喜んでもらえてよかったです。ぼくって、けっこういい人生送っているなあと、こういうときにも感じます。結婚して幸せになった友だちにおめでとうと言うことができるぼくたちもおめでとうと言ってもらえるのと同じくらい幸せなことなのだと思うのです。嘘くさくて何を甘っちょろいこと言ってやがるんだこの野郎とか言われそうだけど、本当にそう思えるのだから仕方がない。

C言語だって気持ちいい

 今日はとある文字処理が必要になって、簡単なツールをC言語で作りました。日頃、うんざりして目にするのもイヤなソースコードを相手にしているので、相対的にぼくが作ったこのツールのソースが神がかり的に美しく感じられます。これが人に見てもらえるソースってもんなんだよ、よく見てみやがれ! という思いが半分、最初から自分の好きなようにのびのび作れてめちゃくちゃ楽しかったという思いが半分です。やっぱり、マネージメントなんかじゃなくて、モノを作っていきたいなあ。

ハウルの動く城

Howl's Moving Castle
  • Howl's Moving Castle
  • 作者/アーティスト: Diana Wynne Jones
  • 出版社/メーカー: Greenwillow Books
  • メディア: マスマーケット
  • 発売日: 2001-08-07

 「「Howl's Moving Castle」」を買いました。翻訳ブログのほうでも、ユルさんの希望からハウルから先に翻訳していくことに。実際、「「The Long Good-bye」」はもう(というかようやく)読んでしまったので、すでに翻訳する気が失せているというのも正直なところです。

カレンダーを作りました。

 夏に山梨のほうにでもドライブに行こうかという話が出ていて、みんなでいろいろ予定をたてようとしています。「みんなが使えるカレンダーが欲しいから作って」とユルさんに頼まれたので、作ってみました。
 すぐに使いたいということだったので、BDDはやらずに直接コーディングします。ユーザ管理もやらないし、カレンダー上の掲示板みたいなシンプルな機能しかないので、特に難しいところはなかったです。完成に四時間ほどかかりました。二時間くらいでできるかと思ったのだけど。
 一番時間がかかったのは、calendar_helper.rbのことを調べた時間と、CSSの調整にかかった時間です。このヘルパーのおかげで、カレンダー部分は簡単に作れました。サンデープログラミングにはちょうどいい大きさのアプリです。なかなか楽しかった。

DynamicCalendarHelperを使ってみた

 Railsで簡単にカレンダー機能を実装できる、DynamicCalendarHelperを使ってみました。
 まずはプラグインのインストール。

script/plugin install http://topfunky.net/svn/plugins/calendar_helper/

 続いて、DynamicCalendarHelper用のスタイルシートを取り込みます。

./script/generate calendar_styles

 これで、public/stylesheets/calendarディレクトリの下に、red、blue、grayの三つのディレクトリとその配下にそれぞれstyle.cssファイルが配置されます。実際に、このスタイルシートをデフォルトのまま使うことはないと思うし、スタイルシートが三種類必要になることもあまりない気がします。
 土日はdivのclass属性でweekendが設定されます。休日の色を変えたいときはこれを使って設定すればいいと思うけど、土曜日は水色に、日曜日はピンクにしたいときはちょっと困ります。なので、ぼくはcalendar_helper.rbに以下のメソッドを追加してみました。

  def saturday?(date)
    [6].include?(date.wday)
  end

 これは実際にはprivateであって、calendarメソッドの中で週末判定時に以下の文を追加しておきます。

cal << " saturday" if saturday?(d)
cell_attrs[:class] += " saturday" if saturday?(cur)

 ソースコードを見れば一目瞭然だと思います。
 これに日本の祝日判定の処理を追加して公開すればちょっと便利そうです。ヒマなときにでも作ってみましょうか。