| @技術/プログラミング

福岡工業大学で行われた、オープンソースカンファレンス福岡2010に行った。

usp labのシェルスクリプトで業務用基幹システムを開発する話が面白かった。一般的なプログラミング言語は使わずに、シェルで生のLinuxを使って作業を行わせる。DBは使わずデータはTextで持つ。HTTP関連のあれこれもシェルスクリプトで行う。このためセキュリティのことは考えないといけないらしいんだけど(フロントエンドとバックエンドがシェルスクリプトでつながってるため)、大手のシステム会社が100人月とかみたいな見積を出す案件を10人月程度でやったそう。具体的には無印良品のシステムとか。遅めに会場に入ったので資料は売り切れで貰えず、細かい数字は自信がないんだけど、無印のやつは一年間に10億円かかってたシステム関連の費用が2億円程度に抑えられるようになったそう。mknodとかsedコマンドを駆使した並列処理のデモは本当に面白かった。へー、シェルスクリプトだけでこんなにできるんだー、っていう感じ。1億行のテキストデータ処理を53秒で終わらせたりとか。「Linuxはなるべく生で使いましょう」という言葉がとても深く印象に残っている。Railsみたいな便利なフレームワークを使った開発とはまったく異なるけど、UNIXの「小さいものは美しい」という理念のもと、とんでもなく効率的に開発を行っている様がとてつもなくクールだった。

| @労働

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と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 -*-

と書いてテキストエンコーディングを明示してあげないといけない。

| @ブログ

昨年末から今年の正月にかけてXREAで借りてたサーバーが障害に見舞われてデータがぶっ飛んだけど、なんと今週、DreamHostでも障害が発生してサーバー(budapest)が落ち、データがぶっ飛んだ。

Jekyllでやってるパソコンブログの方はGitとJekyllの組み合わせのデプロイ環境が最強すぎて一瞬で再開できたんだけど、 www.portalshit.net は正直結構大変だろうなぁと思ってた。ところがサーバーが復旧した翌日くらいにはちゃんとDreamHost側でとってたバックアップがコピーされ、自分では何もすることなくサイトが復旧してた。しかも、サーバー復旧後、一旦ユーザーディレクトリは空になってたので自分でドットファイルと tech.portalshit.net だけ再アップロードしといたんだけど、そちらはこちらでアップロードしたものが残され、 www.portalshit.net と cinema.portalshit.net の内容だけがバックアップからコピーされてた。DreamHost、やるやないけ。障害報告ページでいきなり「こちらにデータの復旧義務はない」とか高らかに宣言してるXREAとは大違い。

まじでDreamHostはSSHできるしPassenger使えるし、今回みたいな障害のときも頑張って復旧してくれるし、Railsっ子にも安心してご利用いただけます。商売には向かないと思うけどね。オヌヌメ。

| @技術/プログラミング

いやまぁテキストエディターにはいろいろあるわけでして、皆さんEmacsとかVimで日夜しこしこコードを書いておられると思うんですけど、僕はGUIしか使えない情報弱者なので主にTextMateを使ってます。

TextMateで便利なのが "Run" っていう機能です。Rubyのコードを書いていて、 + R でさくっと実行結果を確認できます。いちいちTerminal開いて

$ ruby hogehoge.rb

とか面倒くさいことをやらずにすみます。

で、これからが本題なんですけど、先月Ruby 1.9.2がリリースされて、さらに gem update でRails 3が入るようになってしまったので、お試しでRuby 1.9.2とRails 3を使ってみることにしました。しかし1.8系を完全に捨てることは恐ろしいので、RVMを使って複数のバージョンのRubyを切り替えながらしばらく過ごしてみることにしたわけです。

上に書いたとおり僕ちゃんは情報弱者なのでTextMateに依存したコーディングライフを送っており、 + R で動くRubyもRVMのRubyにしたいと思ったのですが、これが分からなかった。RVMのサイトを見たらいろいろごちゃごちゃやり方が書いてあるんだけど(RVM: Ruby Version Manager - Textmate Integration with RVM)、結局この通りにやってもうまくいかず。

しかし先ほどなにげなく

$ rvm 1.9.2 --default

としてあげたところ、TextMateでもRVMのRubyが走るようになりました。

| @WWW

ちょっと前の本だけど、『Webを支える技術』をいま読んでます。

HTTPの話とか、毎日使ってる技術のことを知らなくて、いちいち感動しながら読んでるんですけど、中でも興味深かったのがURIの話。56ページの、「URIはリソースの名前だから名詞であるべき」というくだり。バージョン 2.0以前のRailsでは、

http://example.jp/sample/people/show/123

みたいなURIがデフォだったそう。しかしRails 2.0以降は

http://example.jp/sample/people/123

となって、動詞 show が省かれるようになった。HTTP通信で動詞を表すのはHTTPメソッドだから、URI自体が動詞を含むのはおかしいということらしい。ちなみにこのとき、名詞であるURIにアクセスするためのHTTPメソッドは GET ですね。

確かに自分が作っているサイトでもRailsで動かしてるものは、動詞を含まない名詞だけで表現されたURIを表示する。しかしながらCakePHPは

http://example.jp/sample/people/view/123

みたいなのがデフォだ。クールじゃない。というわけでURIから view を省くようにルーティングの処理を書き換え、各クラスのコントローラーも書き換えといた。

この『Webを支える技術』、プログラミングの話とかは載ってないから読んでいきなり何かの役に立つというタイプの本ではないけど、Web制作者なら職種にかかわらず読んどいた方が良さそうな本だなーと思いました。

| @技術/プログラミング

80個近くある静的HTMLファイルをシステム化する必要が生じたので、HTMLをHpricotでスクレイピングしたあと、抽出したデータをSQLiteにぶっ込んだ。しかしSQLiteにぶっ込んだあとでデータの一部をいじりたくなった。そこでRailsのActiveRecordを単体で使ってみた。

なんでわざわざActiveRecordを使うのか

いやそりゃもちろんSQL書くのが怖いからですよ。というのは半分冗談なんですけど、CakePHPはSQLite 2にしか対応しておらず、SQLite 2は何かと制限が多い。replace関数が使えんとか。temp tableとか作るのかったるいし、フレームワークばっかり使っててSQLはあんまりよく分からないのでActiveRecordを使った次第です。

作業詳細

このシステム化するプロジェクト自体はCakePHPで動いており、DBはSQLite2。デフォの状態だとRailsは sqlite3-ruby しかインストールしないので、ActiveRecordからSQLite2なDBを操作することができず若干まいっちんぐだったんだけどなんとかでけた。ちなみにやったのはCRUDのReadとUpdateね。

やったこと

とりあえず以下のようなファイルを用意。各レコードの name フィールドの "hogehoge" という部分なのが邪魔なので削りたかった。

#!/usr/bin/env ruby

require "rubygems"
require "sqlite"
require "active_record"

ActiveRecord::Base.establish_connection(
  :adapter => "sqlite",
  :database => "path/to/db"
)

class Hoge < ActiveRecord::Base
end

hoges = Hoge.find(:all)
hoges.each do |hog|
  hog.name.gsub!(/hogehoge/, "")
  hoge.save
end

まず最初に、 no such file to load -- sqlite みたいなエラーが出た。要するに「お前SQLite 2のアダプター入れてねえだろ」というエラー。とりあえず sudo gem install sqlite-ruby したんだけど、それでも no such file to load — sqlite が出るのでMacを再起動したら「Rails 3ではSQLite 2はdeprecatedだからさっさとSQLite 3に移行しろや」みたいなメッセージは出るもののちゃんとDBの内容を読み込めた。CRUDのReadはでけた。

しかしUpdateの部分で失敗。Railsの感覚で hoge.save とかやったんだけどこれは意図したとおりに機能しなかった。しょうがないのでRailsのAPIリファレンスを見ながら、 update_attribute() というメソッドをぶちかましてやった。こんな感じ。

hoges.each do |hog|
  if hog.name =~ /hogehoge(.*)/
    hog.update_attribute("name", $1)
  end
end

これで狙ったことができました。

Rubyいいわー。ほんといいわー。