ポータルシットをリニューアルしようかと思ってます。ブログプラットフォームは2003年の時点で完成されてて、P_BLOGの提供する機能に不満なところはないんだけど、コメント欄を含むP_BLOGのMySQLのデータをうまい具合に移行して作り直したらいろいろ勉強になるだろうなと思って。目指してるのはRESTfulであることと、シンプルであること、Ruby製であること。RubyベースのCMSかRailsで置き換えようと思います。納期は未定。
P_BLOGのコメントを取得するAPIのようなもの
ポータルシットのコメント一覧ページで、マウスオーバーして全文を取得するやつをかっこよくした。
これまではjQueryでスクレイピングして、記事のパーマリンクからコメントを取得していた。しかしこれは無駄なクエリが発生する。記事本文を取得するクエリとコメントを取得するクエリだ。
これはださいと思っていたので、Rubyでコメントを取得してJSONで返すCGIを書いた。
#! /usr/bin/env ruby
#-*- coding: utf-8 -*-
start_time = Time.now
require "rubygems"
require "active_record"
require "mysql"
require "kconv"
require "cgi"
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:database => "database_name",
:host => "mysql.host.name",
:username => "mysql_username",
:password => "mysql_password",
:socket => "/path/to/mysqld.sock",
:encoding => "utf8"
)
class Comment < ActiveRecord::Base
set_table_name 'p_forum'
def self.some_comment(n)
find(n)
rescue ActiveRecord::RecordNotFound
return false
end
end
cgi = CGI.new
comment_id = cgi.params['id'][0]
@comment = Comment.some_comment(comment_id)
redirect_url = '/var/index.php?id=error404'
print cgi.header({ 'status' => 'REDIRECT', 'Location' => redirect_url }) unless @comment
cgi.out("application/json") {
{:title => @comment.title, :user_name => @comment.user_name, :user_uri => @comment.user_uri, :date => @comment.date, :mod => @comment.mod, :comment => @comment.comment, :generation => Time.now - start_time}.to_json
}
ActiveRecordのおかげでさくっとできる。このCGIにjQueryで $.getJSON()
してJSONをページ内に読み込む。各コメントはMarkdownに似た形式で記述されているので、Showdown.js を使って Markdown->
HTML して表示している。参考までにコードはこんな感じ。
// load entire comment by JSON
$(document).ready(function() {
$("#recent-comment-list a.taggedlink").one("mouseover", function() {
var targetUrl = $(this).attr("href");
targetUrl.match(/#c(d+)$/);
var commentId = RegExp.$1;
var commentLoadDiv = 'div#c' + commentId;
var commentAuthorParagraph = 'div#c' + commentId + ' + p.auth';
$.getJSON(
'comments.cgi',
{ "id": commentId },
function(data) {
var converter = new Showdown.converter();
var comment = converter.makeHtml(data.comment);
$(commentAuthorParagraph).css("clear", "both");
$(commentLoadDiv).html(comment).slideDown("slow");
$(commentLoadDiv).wrap('<div class="comment-content"></div>');
}
);
});
});
問い合わせのクエリはコメントを持ってる p_forum
というテーブルへの一回だけになったが、RubyをCGIとして動かすと遅い。パフォーマンスは逆に落ちてるかも知れないけど、所詮自己満足なので問題なし。
追記: なんか脆弱性ありそうな気がしてきた…
オープンソースカンファレンス福岡2010
福岡工業大学で行われた、オープンソースカンファレンス福岡2010に行った。
usp labのシェルスクリプトで業務用基幹システムを開発する話が面白かった。一般的なプログラミング言語は使わずに、シェルで生のLinuxを使って作業を行わせる。DBは使わずデータはTextで持つ。HTTP関連のあれこれもシェルスクリプトで行う。このためセキュリティのことは考えないといけないらしいんだけど(フロントエンドとバックエンドがシェルスクリプトでつながってるため)、大手のシステム会社が100人月とかみたいな見積を出す案件を10人月程度でやったそう。具体的には無印良品のシステムとか。遅めに会場に入ったので資料は売り切れで貰えず、細かい数字は自信がないんだけど、無印のやつは一年間に10億円かかってたシステム関連の費用が2億円程度に抑えられるようになったそう。mknodとかsedコマンドを駆使した並列処理のデモは本当に面白かった。へー、シェルスクリプトだけでこんなにできるんだー、っていう感じ。1億行のテキストデータ処理を53秒で終わらせたりとか。「Linuxはなるべく生で使いましょう」という言葉がとても深く印象に残っている。Railsみたいな便利なフレームワークを使った開発とはまったく異なるけど、UNIXの「小さいものは美しい」という理念のもと、とんでもなく効率的に開発を行っている様がとてつもなくクールだった。
ANTENNAというイベントに行った
福岡に引っ越したので、熊本では参加することが難しいIT系のイベントに行ってみた。ANTENNAというイベントで、公式サイトには「Tech系サービスの発信とネットワーキングイベントです」とある。そのイベントのVol. 1に行ってみた。
Abbyのwagaco、もぐらのmaysee、FusicのZENPREのプレゼンが行われた後は名刺交換会が行われた。社交性皆無だし名刺も持ってないので同行者と駄弁ってひたすら飲み食いしてるだけだったけど(BacklogやCacooのヌーラボの社長さんとはちょっと喋った)、みんな自社のサービスについて楽しそうにプレゼンしててすごくうらやましかった。参加者からマネタイズどうすんのみたいな鋭い質問に対して、ZENPREをやってるFusicの中の人はマネタイズより福岡から面白いツールを作って世界に発信していきたい、ということを言っていた。
『情熱プログラマー』の中にGitHubの共同創設者のTom Preston-Wernerの書いたエッセーが載ってる。GitHubが始まったときのエピソードで、マイクロソフトからの30万ドルのオファーを蹴ってGitHubを始めたときの話だ。また37Signalsのブログ内のBootstrapped, Profitable, & Proudという企画で、GitHubのもう一人の創設者、Chris Wanstrathへのインタビューが掲載されている。
そこでもGitHubを始めたときのきっかけとか、理念が述べられている。ZENPREについて言ってたFusicの人と同じで、お金のことより、Git自体が素晴らしくて、それを広めるためのハブを作ろうとした、マネタイズは後から考えた、と語っている。確かにGitHubはGitのチュートリアルが充実してて、自分も何度もGitHubのチュートリアルを読んでGitの使い方はもちろん、SSH接続のやり方も学んだ。こういうのとてもかっこいい。
GitHubは成功した会社だからそんなきれい事が言えるんだよ、と言われたらそれまで。そんなことは分かっている。でも自分がやってる仕事を楽しんで、誇りを持って取り組めなければちっとも楽しくない。金を稼ぐために夢や達成感や誇りを捨てるのか。世の中の役に立ちながら金も稼げて達成感を得るのが一番かっこいいじゃないか。
37SignalsのJason Friedはことあるごとにベンチャーキャピタルの出資を受け入れるな(Bootstrapped)、利益を出せるようになれ(Profitable)、と言う。ここはアメリカじゃないし、37SignalsやGitHubみたいに何もかもがうまく行くとは思えない。でも夢や理念を実現しようとしない人生はつまらない。酒を飲みながら、自分たちが作ったものに対して誇らしげにプレゼンしてた人たちがとてもうらやましかったし、その熱にほだされた。
勉強しよう。
最近買ったMacのシェアウェア — AlfredとDivvy
Alfred
Quicksilverのかわりに入れた。インターフェイスはお洒落。
PowerPack(£12)を購入すればディレクトリの閲覧やアクションの選択など、Quicksilver的な機能が使えるようにはなるけど、やはりQuicksilverに比べたら機能は少ない。特にQuicksilverのTriggersに相当する機能(ホットキー)がないのが移行してすぐは不便だった(iTunesの操作はすべてQuicksilverのTriggers経由で行っていたので)。
Alfredは日本語が通る
日本語が通るのは便利だ。例えばAddress Bookの人名検索をするとき。いちいちAddress Bookを開かず、Alfredの入力画面を呼び出して人名を入れるだけで検索できる。こんな感じ。
ただ、日本語が通るためTerminal.appなど、日本語環境で起動したときアプリケーション名がカタカナになってるソフトの起動時に日本語で呼び出さなきゃいけないのが地味に面倒くさい。Quicksilverでは「terminal」と入れれば良いものを、Alfredでは「ta-minaru」と入力した後、スペースキーでカタカナに変換し、さらにリターンキーで確定しないといけない。Terminal一つ起動するのになんでここまで苦労しなければならないのかと泣けてくる。
なんかネガティブな感想が多くなってしまったけど、事実上Quicksilverは開発止まってるし、Mac OS Xのアップデートである日いきなり使えなくなることも考えられるので、Quicksilverに依存しきりの人はランチャーの「次の選択肢」を考えておいた方がいいかも。
Divvy
最初はBreezeというソフトの方をmacZOTで知ってこういうウィンドウサイズ管理ソフトの導入を検討してた。Breeze買おうかなと思ってたんだけど、たまたまDivvyの存在を知ってこっちを使ってみたら、HUDっぽいUIで画面サイズを簡単に変更できるところが素晴らしくて、BreezeやめてDivvyを買った。
RubyKaigiで近くに座ってる人のMacBookの使い方を見てたらやたらSpacesでたくさん画面を作って切り替えながら作業してる人が多かった。
Spacesはメモリの量が少ないMacでやると重いので自分は使ってない。そもそもSpacesで複数の画面を切り替えて使っても、例えばブラウザーを見ながらテキストエディターに何かを入力するみたいな作業が必要なときには頻繁にスペースを切り替えなければならず、大変うざい。
一発でアプリケーションウィンドウサイズを変更して左にブラウザー、右にエディターみたいな使い方が出来たら便利だ。DivvyやBreezeならこういうことが出来る。Breezeの場合はウィンドウサイズと位置をあらかじめ登録しておかなければいけないけど、DivvyはHUDポップアップウィンドウを呼び出して、ドラッグで好きなようにウィンドウサイズ・位置を変更できる。こんな感じ。
13インチのMacBook Proは1280×800という解像度のため、データを参照しながらのテキスト入力などでは生産性がいまいちだけど、Divvyなどを使うことでセカンドディスプレイがなくてもデータを参照しながら効率的に入力作業を行うことが出来る。大変素晴らしい。
職場が変わって仕事ではWindows漬けだけど、Windowsにはこの辺の作業を快適にしてくれるソフトが少なくて、改めてMac良いと思う。Terminal内での操作感は基本的にUNIXやLinuxと同じだし。Macで仕事できてる人たちが本当にうらやましい。
退職しました
1年2ヶ月お世話になった職場を10月いっぱいで退職しました。
僕は2009年の9月から、阿蘇テレワークセンターというところで働いていました。ここはISP業務やホームページ制作をやってる会社で、1年4ヶ月前、東京で就職したのにたった3日で辞めて帰ってきてしまった僕は、ここに拾ってもらってHTMLコーディングの傍らCakePHPによるシステム開発やWordPressのカスタマイズ、JavaScript開発などを担当していました。
前職場ではかなり自由にやりたいことをやらせてもらい、家で一人でインターネットで遊んであるだけでは身につかないようなことを経験できました。CMSを作るのはCakePHPやRailsを使ってもやはりそんなに簡単ではないですし、Linuxサーバーの構築などもやらせてもらって大変勉強になりました。1年2ヶ月前はTerminalなんてなるべくなら触りたくないと思っていたのに、いまはTerminalでVimやzsh使うのが大好きになりました。
しかし阿蘇テレワークセンターは自由すぎた。僕はRailsによるアジャイルWebアプリケーション開発なんかを読みながら、ウォーターフォール開発も経験したことないのに自己流で勝手にアジャイルやってました。いや、アジャイルじゃなくてただの行き当たりばったり開発ですね。これではいかんなーと思い、一旦阿蘇を離れてみることにしました。
11月からは福岡で働いてます。福岡、食べ物が安くておいしくてびっくりですね。出張などで福岡にいらっしゃる機会のある方はご一報の上、もつ鍋おごってください。
Ruby 1.9とRails 3とRSpec 2と
Ruby 1.9、Rails 3、RSpec 2で開発してる。いままでRubyとRailsになれるのに一杯一杯でテスト駆動開発できてなかったので、きちんとテストファーストでやることにした。
そんで環境を整えてたんだけど、RSpecはRails 3に合わせてVersion 2が出てるみたい。しかも結構変わってる。
$ spec -c spec/*
とかやってもエラーが出る。 which spec
すると /usr/bin/spec
と出ちゃう。どうやら spec
で発動されるのはRSpec 1.3のものみたい。
RSpec 2からはコマンド名が変更されており、テストコードを実行したいときは以下のように書くみたい。
$ rspec -c spec/*
これできちんとテストコードが実行された。かと思いきやFailureが。
Ruby 1.9で動かしてるから、コードの中に日本語を書くときは一行目に
# -*- coding: utf-8 -*-
と書いてテキストエンコーディングを明示してあげないといけない。