kaeruspoon

twitter4rを使ってみた

 kaeruspoonに、twitterにも書き込める機能をtwitter4rを使って追加しました。これ、めちゃくちゃ簡単ですね。
 本文なしのタイトルだけの記事をkaeruspoonに書くと、その内容がtwitterにも書き込まれます。また、普通の記事はブログ更新通知をtwitterに書き込みます。こっちはウザかったら機能からはずすかもです。

VAIO typeZを買いました。

VAIO typeZを買いました。
オーナーメイドモデルで注文したので、届くのは今月下旬になるそうな。待ち遠しいです。
最初はすぐにでもOSをUbuntuに入れ替えようと思っていたけど、ちょっとVistaで開発環境を整えてみようかと思います。困難な道ほど通ってみたくなるのです。まあ、coLinuxが使えればほぼ問題はないのだけど。
オーナーメイドの内容はCPUがCore2Duoの2.53GHz。2次キャッシュ6Mで消費電力が少ないし、これを選ぶ人が一番多いと思います。メモリは4Gにしました。Vistaは3Gまでしか使わないみたい(なんで?)だけど、やっぱりUbuntuに切り替えるかもしれないし無駄にはならないだろうし。液晶ディスプレイは13.1インチのワイドなのに1600x900の表示領域(ここが一番気に入っているところ)。
けっこうな性能なのに重さは1.4kgくらいでバッテリの持ちが11時間あるし、もう言うこと何もないよね。Vistaだから一太郎とAtokが使えるのも地味にうれしい。また小説でも書き始めようかな。
届くのが待ち遠しい今日この頃であります。

Macを買わなかったわけ

最近、PCを買い換える決意をしたわけだけど、このブログで以前からずっと欲しいと口にしていたMacは買わなかった。食指が動きすらしなかった。
なぜか? あれほど大好きだったMacをなぜ買わなかったのだろう。値段だってMacBookの倍以上はするVAIO typeZを選んだのはなぜだろう。
それは、2週間じっくりとMacを使っていたからである。

ここ2週間、ぼくはiPhoneアプリをobjective-Cで開発していた。そしていろいろなことが要因となってAppleに幻滅し、Macに対しても幻滅することになる。大好きだっただけに期待が大きすぎたのかもしれないが、この2週間でMacの使いづらさばかりが強調されてぼくの印象として残る結果となった。

そもそもぼくは期待しすぎてがっかりする経験をよくするのだ。パン屋さんのパンには未だに期待しすぎてがっかりしている。あの素晴らしくおいしそうな匂いに対して、味に対する期待度が否が応にも高まることを抑えられないのだが、食べてみると期待したほどはおいしくなくてがっかりするのだ。難儀な男である。

Macに対してもパン屋さんのパン以上の期待を持って接してしまったのがいけなかった。もう二度とMacが欲しいなんて思わなくなりそうなくらいのがっかり具合なのだ。実のところ、言っているほどめちゃくちゃ使いにくかったわけではない。ただ、いちいちおしゃれ風な挙動とかがぼくのイライラ心をちょっとずつくすぐっていったのだ。

kaeruspoonサーバ再構築するよ

VAIO typeZを買ったので、今使っているVAIO typeFをサーバに使おうかと考えています。今のサーバはDBサーバにして、typeFをAPサーバにしようかな。はっきりいってkaeruspoon程度の規模ならサーバなんて一台で十分おつりがくるのですが、いろいろやってみたいじゃないですか。Xenとか導入してみようかな。

クエリの重さを考えない

 開発しているとき、ぼくはあまりクエリの重さを意識していない。ということを最近痛感している。今まではそれでも影響がない規模のサービスしか手がけてこなかったのだけど、大規模開発になるとみんなが一番気にしているところがそこなのだ。意識を変えないと。どんなクエリが重いのかも、なんとなくわかった気になっているだけで確かな知識の裏付けがない。ちゃんと基礎から勉強しなくちゃだよ。

Xenをはじめて使ってみた

Xenをはじめて使ってみました。構築しているあいだ、ずっと「セン」と読んでいたのだけど「ゼン」と読むらしい。
Xenを使って、一台のサーバ上にふたつのOSを立ててそれぞれmaster、slaveのDBサーバにしてみました。ちなみにDomain0、DomainUともにOSはcentOS5.2を使います。

1.Xenのインストール

yum -y install kernel-xen xen


2./etc/grub.confのdefaultでXenカーネルを指定する。この例では2番目がXenなので、「1」を指定(最初なら0)。ついでに、ここでDomain0に割り当てるメモリ容量も指定します。kernelのところで最後にdom0_memで指定しているところがそうです。今回は128Mにしました。

default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.1.10.el5)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.18-92.1.10.el5 ro root=/dev/md0
        initrd /boot/initrd-2.6.18-92.1.10.el5.img
title CentOS (2.6.18-92.1.10.el5xen)
        root (hd0,0)
        kernel /boot/xen.gz-2.6.18-92.1.10.el5 dom0_mem=128000
        module /boot/vmlinuz-2.6.18-92.1.10.el5xen ro root=/dev/md0
        module /boot/initrd-2.6.18-92.1.10.el5xen.img


3.再起動してunameなどでXenで機動していることを確認したら「xm list」で状態確認。

[root@silver ~]# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0      125     1 r-----   2052.2


4.DomainUの作成

virt-install

ここでDomainUの識別名や割り当てるリソース、インストール先となるイメージファイル、インストールパッケージの取得先などを指定します。都度、表示される質問に答えれば設定できるので簡単です。

5.DomainUのOSのインストール
あとは通常のインストーラが機動します。

6.自動起動の設定
DomainUへのインストール後は、「xm create -c 識別名」でそれぞれのOSを起動できます。サーバの起動時に各DomainUも起動したいときは、/etc/xen/autoディレクトリの下に/etc/xenディレクトリ下にある各DomainUの設定ファイルのリンクを置きます。

ln -s /etc/xen/db1 /etc/xen/auto/db1

これで再起動すればauto下にリンクを置いたDomainUも自動で起動するようになります。起動しないときは、設定ファイルの中に以下の行を追加してみます。

vnc = 1
sdl = 0


これだけです。けっこう簡単でした。各DomainUはcoLinuxみたいにイメージファイルなので、他のハードウェアに移すことも簡単ですね。
というわけで、kaeruspoonのDBサーバはXenで構築しました。DBの振り分けはacts_as_readonlyableで対応。簡単すぎる。

飽きてきた

なんだかこのデザインも飽きてきました。そろそろ変えようかな。ついでにブログという仕組みも飽きてきた。こっちも何か変えようかな。インターネット自体もなんだかちょっとマンネリだ。昔のいわゆる「ホームページ」の時代の頃のほうがおもしろかったよね。

環境構築完了

ようやくVAIO typeZで開発環境を構築することができた。
Vistaなのでちょっと不安があったけど、coLinuxが使えたので特に苦労することもなかったです。Vistaはクソだという話をよく耳にするけど、今のところ特に不満はありません。さくさく動くし。
管理者権限で実行するときに一回一回ダイアログが出るのがイヤだけど、まあsudoを使っていると思えば我慢できないこともないです。

今日はこれからユルさんとお出かけ。帰ってきたら、来週の社内勉強会のスライドでも作ろう。ちなみに先月の勉強会で使ったやっつけ仕事のスライドはslideshareにあげておきました。






最近、文章を書いていない

 日記も含めて最近文章を書かなくなったなあというお話。また一太郎とATOKが使える環境に戻ってきたので、何か書いてみようかしらと思ったりしていたりしていなかったりする33歳のおおいしつかさです。こんばんは。33歳といえばもうおっさんもおっさん、休日に妻のかってきた1980円のトレーナーとジーンズ姿で車に家族を乗せて買い物にきてベンチに座ってつまらなそうにタバコを吸うくらいのおっさん度ですが、あいにくとぼくはそのどれにも当てはまっていません。当てはまっていないので、なんとかそういうおっさんになろうと精進する日々であります(嘘です)。

 金曜日はTRPGをしました。メンバーが全員そろわなかったので別エピソードです。ぼくも仕事で帰りが遅くなって途中参加でした。残業をするということはぼくの仕事が遅いということなので恥ずかしい限りですが、世の中には残業が多いことをまるで自慢でもするかのように得意げに語る方々もいらっしゃるので首を地軸の傾きくらい傾けたくなる今日この頃であります。みんな早く帰ってTRPGをしよう。ちなみにぼくは20歳の魔法使いルルーシュです。中の人は33歳です。こんにちは。つかさは俺の嫁、なんていう言葉を耳にしたりしますがぼくは嫁ではありませんので注意が必要です。

VAIO typeZを使ってみて

 VAIO typeZを使い始めて数日が経ちましたけど、予想以上に気に入ってしまって自分でも驚いています。手頃な大きさと軽さ、質感の高さとデザインの秀逸さ、最初は唯一ちょっとだけ不満に思っていたキーボードさえも、今はこれ以外のキーボードを使いたくないというくらいに気に入っていたりします。プログラマの開発環境としてVistaはありえないと思っていたのですが、coLinuxのおかげで不満はないですし、Vistaのさわり心地のよさがけっこう気に入っていて楽しいです。これはさくさく動いてくれるおかげかも。1600x900という広いディスプレイもすばらしい。ディスプレイが鬼のようにきれいなので、プログラムのコードがとても見やすいです。プログラマにきれいなディスプレイなんていらない、映りさえすればいいと思っていたけど、ディスプレイのきれいさ重要です。これだけきれいだと、本当に楽しくなってくる。
 できるだけ悪いところもあれば書きたかったのだけど、今のところ全然ない感じ。Zはすごいやつです。

実践ハイパフォーマンスMySQL: ジェレミ・D. ザウドニ, デレク・J. ベリング, Jeremy D. Zawodny, Derek J. Balling, 林 秀幸: 本

実践ハイパフォーマンスMySQL
  • 実践ハイパフォーマンスMySQL
  • 作者/アーティスト: ジェレミ・D. ザウドニ,デレク・J. ベリング
  • 出版社/メーカー: オライリージャパン
  • メディア: 単行本
  • 発売日: 2004-10

「実践ハイパフォーマンスMySQL」を買いました。いまさら?

ハイパフォーマンスWebサイト —高速サイトを実現する14のルール: Steve Souders, スティーブ サウダーズ, 武舎 広幸, 福地 太郎, 武舎 るみ: 本

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール

「ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール」を読みました。いまさらシリーズ第二弾。

さっそくkaeruspoonに試してみた。実施したのはcssの一本化と、Javascriptのコードをページの最後に持ってきたこと。あとは、mod_expiresとmod_deflateの適用(まだしてなかったのかよ)。これで確かにちょっと速くなった。1秒を切るときもある。AmazonとかYoutubeとかニコニコの画像読み込みのせいでちょっと遅くなるときもあるけど。

キーワード検索機能をRubyで簡単に使える、KaeruKeywordを公開しました

 このブログ、kaeruspoonには、はてなダイアリーキーワードと同じような機能(かえるキーワード)があります。昨日、その内容を社内勉強会(スライドはslideshareに)で発表したのですが、そのコアとなるクラスKaeruKeywordをRubyForgeで公開しました。クラス自体の大きさ40行くらいの小さなものです。
 これを使うと、ある文章の中にどんなキーワードが含まれているかを検出することができるようになります。6000字程度の文章の中から登録しておいた20万のキーワードを探し出すのにかかる時間はだいたい0.01秒くらいです。個人で使うには十分な性能だと思います。

1. KaeruKeywordのインストール

sudo gem install kaerukeyword


2. require
日本語を使うときは$KCODE等で環境を整えておいてください。

$KCODE="u"
require 'rubygems'
require 'kaerukeyword'


3. キーワードの登録
キーワードはインスタンス作成時に配列で渡してあげます。

keywords = KaeruKeyword.new(["Ruby", "Rails"])

あとからキーワードを追加することもできます。

keywords << "おおいし"


4.キーワードの検出
文章を渡してあげると、文章に存在していたキーワードを配列として返します。同じキーワードが2回登場したときは、返る配列にもそのキーワードが2つ含まれます。出現頻度もこれで計算できると思います。

keywords.search("ぼくはRubyがすき。I Love Ruby and  Rails!")
  #=> ["Ruby", "Ruby", "Rails"]


どうでもいいことだけど、RugyForgeを使ったのは初めてでした。gemが使えるようになるので便利ですね。登録はsecondlifeさんの記事を参考にしました。

RailsのETag

 kaeruspoonのフロントエンドのパフォーマンスチューニングの続き。
 AmazonやYoutubeやニコニコ動画などの画像をキャッシュするようにしてDNSlookupを減らしたのと、Expiresも付与してあげたらYSlowの測定結果がB(80)になりました。最初はFランクだったのに。
 そういえばRailsがなにやら勝手にETagをつけてたみたいなので探ってみたら、actionpack-2.1.0/lib/action_controller/response.rbで以下のような処理をしていた。

    private
      def handle_conditional_get!
        if body.is_a?(String) && (headers['Status'] ? headers['Status'][0..2] == '200' : true)  && !body.empty?
          self.headers['ETag'] ||= %("#{Digest::MD5.hexdigest(body)}")
          self.headers['Cache-Control'] = 'private, max-age=0, must-revalidate' if headers['Cache-Control'] == DEFAULT_HEADERS['Cache-Control']

          if request.headers['HTTP_IF_NONE_MATCH'] == headers['ETag']
            self.headers['Status'] = '304 Not Modified'
            self.body = ''
          end
        end
      end

どうもレスポンスのbodyの内容のMD5値をETagにしているみたい。kaeruspoonでは独自のAmazon広告が毎回違う内容で入るので、あまり意味がないです。ETagは全然使わない方針なので、config/initializers/response.rbを作ってオーバライドしておきました。

module ActionController
  class AbstractResponse #:nodoc:
    private

    def handle_conditional_get!
      if body.is_a?(String) && (headers['Status'] ? headers['Status'][0..2] == '200' : true)  && !body.empty?
        self.headers['Cache-Control'] = 'private, max-age=0, must-revalidate' if headers['Cache-Control'] == DEFAULT_HEADERS['Cache-Control']
      end
    end
  end
end

日本酒と魚があれば何もいらない

 昨日はユルさんと居酒屋にいって、のんびりと日本酒を飲んできました。最近、日本酒がすごく好きになってきたのです。焼き魚を突きつつちびちびと日本酒を飲むのが至極幸せなひとときでした。おっさんになってきたなあ。ぼくはずっとおっさんに憧れてきたのでうれしい限りです。武石さんや丸岡さんたちとのんびりお酒を楽しみたい今日この頃。日本酒と魚がうまい店を知りたいです。

 kaeruspoonのデザインをちょっと変えました。飽きてきたから。もうちょっと変えてみようかな。