kaeruspoon

Railsでスイーパーを使ってみる

 kaeruspoonにスイーパーを導入してみました。実はずいぶん昔に使っていたことがあったのだけど、この新しいkaeruspoonになってからはまだ導入してなかったのです。
 スイーパーというのは、主にキャッシュと併用して使うものです。オブサーバとDBのフックメソッドを使って実現されていて、フックメソッドにとらえられるようなイベント(DBへのCRUD)のときにやりたい処理(expireを使ったキャッシュの失効しかないと思うけど)を一箇所にまとめることができます。
 「2007年05月10日」の日記の日記にフラグメントキャッシュのことを書いているけど、スイーパーを使うともっとシンプルにできます。スイーパーはDBを監視するやつなので、普通はRAILSROOT/app/modelsの下に置きます。

class SidebarSweeper < ActionController::Caching::Sweeper
  observe AmazonList, YoutubeList, Tag

  def after_save(dumy)
    free_fragment
  end

  def after_destroy(dumy)
    free_fragment
  end

  private

  def free_fragment
    expire_fragment 'sidebar_contents'
  end
end

スイーパーはActionController::Caching::Sweeperのサブクラスとして定義します。監視したいテーブルをobserveを使って指定します。これはオブサーバと一緒ですね。フックメソッドを定義するところも同じです。
 キャッシュする箇所は、ビューで指定します。

<% cache 'sidebar_contents' do -%>
  <%= view_amazon_items @amazon_items %>
  <%= view_youtube_items @youtube_items %>
  <%= view_all_tags @all_tags %>
<% end %>

 フラグメントキャッシュはそれを識別するためにコントローラとアクションを指定することが多いと思いますが、ここでキャッシュしたいものは複数のアクションから呼ばれるので、単に名前をつけるだけにしています。こっちのほうが結局シンプルでいいかも。
 このままではスイーパーは働いてくれません。四六時中監視するわけじゃなくて、こちらが指定したときにしか監視してくれないのです。それはコントローラで指定してあげます。

require 'sidebar'

class AdminDiariesController < ApplicationController
  cache_sweeper :sidebar_sweeper, :only =>[:update, :destroy]
....(省略)....

 cache_sweeperを使って、働かせたいスイーパーと、どのアクションのときに働かせるかを指定します。これですべてOK。requireしているのは、Railsがsidebar_sweeperを見つけられないときがあるためです。

perlをはじめて使う

 仕事で初めてperlを使いました。思っていたほど複雑ではないという印象。OOを使ったからかもしれません。呼び出される側のソースコードで、最後に

    1;

をつけなければならないところとか、仕様的にちょっと納得いかないところはありますが……。
 クラスはpackageを使って定義してあげます。

package ClassSuper;

sub new {
    my $class = shift;
    my ($arg1, $arg2) = @_;
    my $self = {
        'arg1' => $arg1,
        'arg2' => $arg2
    };

    bless $self,$class;
}

sub put {
    my $self = shift;

    print $self->{arg1}, "\n";
}

のような感じ。インスタンス変数はハッシュで表現するようです。Rubyになれているから、行の最後のセミコロンをついつい忘れてしまいます。
 サブクラスはこんな感じで定義します。

package ClassSub;

use ClassSuper;
use base qw( ClassSuper );

sub new {
    my $class = shift;

    my $self = new ClassSuper;
    bless $self, $class;
}

sub put2 {
    my $self = shift;

    print 'arg2: ', $self->{arg2}, "\n";
}

sub put {
    my $self = shift;

    print 'arg1: ', $self->{arg1}, "\n";
    $self->put2();
}

という感じでオーバーライドもできます。親クラスのメソッドを使いたいときは SUPER::method() みたいにSUPERで指定してやります。
 はじめてまともにperlに触れてみたけど、なかなかこれもおもしろいですね。

宮ヶ瀬ダムにドライブに行きました

107
 今日はユルさんと宮ヶ瀬ダムまでドライブに行きました。いつもは結構遠出するのですが、今回は比較的近場だし、出発もお昼ころというのんびりしたものでした。ちょっと曇っていたけど、ときどきお陽さまも顔を出します。土曜日だというのに閑散としていました。10年前はもっと観光客がいたと思うのだけど。

108
 何が10年前なのかというと、ぼくは10年前まで、毎週土日はこの宮ヶ瀬ダムにバイクで来ていたからです。この写真のお店は当時よくいっていて、すべての席がバイク乗りに占められていたりしていましたが、今となっては夢の跡であります。

 というわけで、ちょっとだけなつかしいところを車で走ってきたりしました。ユルさんに運転してもらって撮影してみます。

 なつかしい人にはなつかしい、そうでない人にとってはどうでもよい動画ですね。
 どうでもいい人用に、鳥の鳴き声がすごくて自然いっぱいなのだよ、ということをお伝えする動画を載せておきます。

 帰りに南町田のグランベリーモールに寄りました。アウトドアショップで自転車やそのパーツ、そしてウェアやヘルメットなどを見てきました。とても楽しいですね。

偽装コロッケと求人サイトのお話

 今さらだけど偽装コロッケのお話。牛肉コロッケなのに豚肉が混ざっていたらしい。合挽き肉だ。よくわかんないんだけど、それって牛100%よりもおいしいんじゃないの?

 ひまつぶしに転職サイトなんかを眺めていたりするけど、明らかにアヤしい会社というのが存在する。あれって、本当のところはアヤしくない会社だとしたら、アヤしく見えるような求人ページを作ってしまっていることに気づかない、能力のない会社だということの証左であるので、どちらにしろ避けたほうが無難そうである。

はてなスター大人気

 はてなの新サービス、はてなスターの話題でブログやはてブが独占されちゃっています。半数以上が否定的な意見ばかりだし、そのほとんどはまわりの熱気にあてられて感情的に言葉を吐いているだけのようにも思えたりします。
 サービスって、ろくに使いもせずに印象だけで善し悪しを判断できるものなのかな。そうだとしたら、サービスを作るなんて楽なことですよね。やる前にすべてがわかるなら。それができないから、どこのサービスも公開して様子を見るようなやり方をしてるんじゃないのかなあ。みんな、ちょっと落ち着いてみたら、なんて思ったりします。
 ぼくの今の考えとしては、はてなスターはなかなかおもしろいと思う。だけど成功するか否かはまだわからない。だから、もうちょっと様子を見ようかと思います。明日にでも、とりあえずkaeruspoonに取り入れておこうっと。

はてなスターを導入してみました

 さっそくはてなスターをkaeruspoonに導入してみました。やり方は簡単で、まずはてなスターのページで自分のブログを登録します。そうすると、以下のようなコードを<head>タグ内に埋め込めと言われるのでそのとおりにします。

<script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js"></script>
<script type="text/javascript">
  Hatena.Star.Token = 'トークンID';
</script>

 ここで最後の行に以下のコードを追加します。

  Hatena.Star.EntryLoader.headerTagAndClassName = ['h1','hatesta'];

 もうメソッド名で何かわかると思うけど、はてなスターを表示する場所を指定してあげてます。ここでは<h1>タグ(class名が'hatesta')の内部で<a>タグに挟まれたものに対してはてなスターを表示するようになります(kaeruspoonでは日記のタイトルがそれだから)。デフォルトでは、<h3>タグの内部で<a>タグに挟まれたものがそれにあたるので、最初からブログのタイトルがそうなっている場合は、この最後の行は不要です。
 それから、以下のようなコードを追加するとスターのイメージを変更することもできます。

Hatena.Star.Star.ImgSrc = 'イメージのファイル名';


 藤堂さんからお中元が届いた。お中元なんてもらったの初めてだ。ありがとうございます。いったいどういうネタなんだろうかと一瞬思ってしまった。何かお返しをしなくては。

イラストとかモレスキンとか

109
 藤堂さんにいただいたお中元と、昨日ユルさんに日本橋で買ってもらったモレスキンの手帳です。モレスキンはずっと使ってみたかったんだよね。なかなかよさそうな感じです。

 昨日はユルさんが参加しているイラストグループ展を観に行きました。探偵事務所でも入っていそうな建物で開催されていました。こういうところにオフィスがあるのもいいなあ。
 近かったのでコレド日本橋にも行きました。モレスキンはそこで買ったのでした。

 メガテリヤキを食べました。半分を越えると飽きてきてつらくなってきます。味なんかどうでもいいからとにかくエネルギーを詰め込んで、これから戦場へ向かわなければならないアメリカ兵の気分になってしまう不思議な食べ物でした。

RSpecで新サービスの開発開始

 はてブメール、Asobozeに続く新サービス、milook の開発を始めました。画面のデザインとインターフェースをおおまかに考えて、DBの設計をやって、RSpecを使いながら進めていきます。Rspecはバージョン1.05になっていて、ちょっと仕様が変わっていました。勉強しながら進めます。それから今回はデザインもちょっとちゃんとやろうと思っていて、ロゴや背景画像なんかはユルさんに作ってもらったりしていました。楽しいですね。

DellのRubyPCがいい感じです

 今、ぼくはVAIOのノートPCを使っています。15.4インチのディスプレイですが、ちょっと大きいかな、と常々感じているので次に買うとしたら13.3インチにすると思います。13.3インチといえば MacBook ですが、本当のところぼくが Mac を買うことはまずなさそうです。ubuntu に会わなければ、いつかは Mac にしていたと思いますが。
 そんな13.3インチノートPCに興味津々のぼくが今惹かれているのが、Dell のXPS M1330。スペックのわりに安いし、なによりデザインがいいですね(Dellのマークがなければもっといい)。そしてなんと、ルビー・レッドという深めの赤という色がラインナップされています。ルビー・レッド! Ruby使いにぴったりじゃないか。
 という、どうでもよいお話。

 家に帰ってくるのが遅かったので、milookには特に手を付けていません。

相変わらずの書類作り、一時Perl、のちに髪を切ってもらう

 仕事は相変わらず書類作りばかりです。どうしてこんなに書類ばかり溢れているのか不思議でなりません。午後はPerlでツールを組みます。ひさしぶりにビット演算なんか使ってます。こんなのでも楽しいですね。ああ、そうだった。ぼくはプログラマだったのだ。
 埼京線の新宿駅のモラルの低さには辟易。どうしてそんなにみんな慌ててるのか。駆け込み乗車をする人とか、人が降りきってないのに乗り込んでくる人とか、前がつまっているのに後ろから押す人とか見てると、もううんざりしてきます。全国の少年少女諸君、大人なんてカッコつけててもこんなもんなんだぜ。そんなに急いでるのなら、10分早く出てくればいいのに。といつも思うぼくだったりします。
 それからユルさんに髪を切ってもらいました。さっぱりしてすっきり。おいしいご飯も食べてのんびり過ごします。

宇宙研の一般公開にいってきました。

 昨日は飲み会で、しかも帰りの電車で寝過ごして、町田の漫画喫茶で朝まで過ごしました。またやってしまった。ちなみに漫画喫茶では寝ずにジョジョを読んでました。
 朝、家に帰ってきてから、お風呂に入ってご飯を食べてそのまま相模原へ向かいます。今日は年に一度の宇宙研一般公開の日なのでした。ユルさんと一緒です。
110
 宇宙研に向かう道で、「No Ruby, No Life」のトートバックを持った人にユルさんが気づきました。「仲間がいるよ!」なんて彼女は喜んでいます。Ruby界隈で宇宙研にも来そうな人というと、ただただしさんしか思い浮かばなかったのですが、家に帰ってからブログを見てみたら、確かにただただしさんでした。すごく有名な方で、「仲間」だなんてぼくがいったら失礼にあたるくらいだよ、とユルさんに教えてあげます。
111
 とりあえずお腹がすいていたので、まずは生協でカツカレーを食べます。毎年必ずカレーを食べるのです。普通においしい。少なくとも某チェーン店よりは全然おいしいです。
 いろいろと見て回ったのですが、最近の宇宙研一般公開で気に入っているのが小学生向けの様々な実験です。どれも知識としては知っていることばかりだけど、実際に実験という形で目にすることってあまりないので結構新鮮でおもしろいのです。
 それから宇宙研の一般公開といえば忘れてならないのが、レールガン。今年も動画を撮ってきました。

お寿司を食べました

 前の職場の仕事仲間に呼ばれてお寿司を食べに新宿に行ってきました。ちょっと早めに着いたので、ジュンク堂で立ち読み。Perlの入門書を買おうと思っていたのですが、入門書に書かれているような内容はすでに理解しています。代わりにJavascriptの本を買いました。

初めてのJavaScript
  • 初めてのJavaScript
  • 作者/アーティスト: シェリー パワーズ
  • 出版社/メーカー: オライリージャパン
  • メディア: 単行本
  • 発売日: 2007-05

 Javascriptは使いたい機能だけをネットで調べて使っている程度のレベルなので、きちんと基本から勉強したかったのでした。

Perlでevalを使ってみる

続・初めてのPerl 改訂版
  • 続・初めてのPerl 改訂版
  • 作者/アーティスト: Randal L. Schwartz,brian d foy,Tom Phoenix,吉川 英興,伊藤 直也,田中 慎司,株式会社ロングテール/長尾 高弘
  • 出版社/メーカー: オライリー・ジャパン
  • メディア: 大型本
  • 発売日: 2006-10-21

 「「続・初めてのPerl 改訂版」」を使ってPerlの勉強をしています。今日はevalについて。evalは関数で、ブロック内や文字列内をPerl構文として評価するのだけど、このあたりはRubyと一緒。でもRubyでは全然evalを使ったことがないので、初めてみたいなものです。おもしろいのが、eval中のエラーはプログラムが終了せずに、変数$@にエラーメッセージが格納されるところ。例外処理みたいに使えるようです。

#!/usr/bin/perl

my ($a, $b) = @ARGV;
my $c = eval{$a / $b};
if ($@) {
        print "err:$@";
} else {
        print "$c\n";
}

print "here is end of program!\n";

 普通は0で除算する時点でエラーが発生してプログラムが終了しますが、evalを使うとエラーメッセージを表示して、さらに処理を続行することができます。ただし、Perl自身が停止するような致命的なエラーはキャッチできないとのこと。

[tsukasa@] $ ./test.pl 10 2
5
here is end of program!
[tsukasa@] $ ./test.pl 10 0
err:Illegal division by zero at ./test.pl line 4.
here is end of program!


 土日は旅行に出かけるので、今日、不在者投票をしてきました。

 ボクシングの亀田兄弟がテレビに出ています。彼らを見るたびに、ぼくは弟たちを思い出す。ぼくの弟たちは、あの亀田兄弟に顔も喋り方も言うこともよく似ているのです。他人とは思えん。

山梨へ旅行に行ってきました

112
 夏休み最後の土日は、丸岡さん、さぽさん、それにぼくとユルさんとで山梨へ旅行に行きました。特に目的地は決めずに、ドライブを楽しみながら向かいます。
113
 白糸の滝に行きました。最初の目的地。とても美しい滝です。ずっと座って見ていたかったくらい。あとは鳴沢氷穴にも行きました。内部は摂氏0度でしたが、外に出ると暑さが倍増するので夏にはおすすめしません。

 宿はペンションのコテージです。ウッドデッキで飲むコーヒーが最高。こんなところでプログラミングをしたいなあ。お風呂も広くて素晴らしい。創作合宿にはうってつけ。ネットにはつながらないけど、開発合宿だってよさそうです。

 夜はみんなでお酒を飲んでいろいろと語りました。とても楽しい。

114
 二日めは忍野八海へ行きました。水の透明度がすごいですね。

眠いです

 夏休み明けだったので仕事がたまっていて、いきなり盛りだくさんな一日でした。眠いです。

Perl逆引きクイックリファレンス―Perl5.8対応

Railsレシピ
  • Railsレシピ
  • 作者/アーティスト: Chad Fowler
  • 出版社/メーカー: オライリー・ジャパン
  • メディア: 大型本
  • 発売日: 2006-12-19

この2冊の本を図書館で借りてきた。