| @WWW

先週、九州産業大学で行われたWordCamp Fukuoka 2011に行った。仕事でWordPress使う機会はないけど、福岡のWeb業界がどんな感じなのか知りたくて行ってみた。

WordPressは ゴンゴンの見た映画 で使ってて、前職場でもウェブサイトにブログを付けるときによく使った。また友達のホームページにも導入したことがある。以下そのときに書いた過去記事から引用だけど、

WordPress 2.7やMovable Type 4とかもそうですけど、ブログのなかで読者が触れる部分っていうのはここ数年のアップデートの中でもそうそう変化なくて、書き手が触れる部分、書き手にしか見えない部分がえらく進化してます。サーバーにインストールして使うタイプのブログツールでも、外部のフィードを取ってきて管理画面に他サイトの更新状況や人気のプラグインが表示されたりしますし、まるでレンタルブログサービスを利用しているかのようです。いかに書き手を書く気にさせるか、ってのが今日のブログツールの潮流なのかなーって感じました。これ大事なことですよね。

portal shit! : Twitterのフィードを加工して自サイト内にマイクロブログを作る

このように、WordPressは管理系の機能が非常に進化しているように思う。バージョン2.7から、自動アップグレード機能がついて、何も知らん人でもWordPress本体をサーバーにアップロードして、MySQLにデータベース一個つくればそれで使えるようになる。面倒くさいアップグレードとかもボタン一つで完了、さらに世界中のデザイナーがデザインしたWPテンプレートが使える。

WordCamp Fukuoka 2011は “Publish” がテーマだったけど、本当に誰もが簡単に “Publish” できるようになりつつあると思う。開発者とデザイナーとユーザーがそれぞれたくさんいて、非常に活気があると感じた。それゆえにユーザーの声が反映されて、使いやすい管理画面(ダッシュボード)になってきてるんじゃないだろうか。一人でブログを書いてるのに、一人じゃないのがWordPressの良いところだと思う。後ろにオープンソースコミュニティが付いている感じ。

一方、かつてはブログツールの代名詞的存在だったMovable Typeは、Six Apartの買収などのいざこざがあり、アメリカの親会社から日本法人に権利が売却されてしまっていた。

なんでMovable Typeがダメになったのか。WordPressと異なり、元々オープンソースじゃなかったのが原因だろう。2007年にオープンソース化されたけど、そのときにはWordPressとの勝負には決着がついていたように思う。そもそもMovable Typeは、個人がPublishするためのツールというより、企業のホームページを管理するためのツールを指向していた。公式サイト(ウェブサイト管理の新標準。Movable Type 5 - Six Apart)を見れば、右上の目立つ位置に「ご購入はこちら」のボタンが配置してあり、基本的に有償のソフトウェアであることが分かる。

WordCampの活況とMovableTypeの身売りがあまりにも対照的で、コミュニティのあるなしで、ブログプラットフォームの盛衰が左右されることを実感した。一人で黙々とブログやプログラムを書いていてはダメで、何かしらで外とつながってなきゃいけないのだと思う。

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

昨日の続きのようなもの。LokkaをUbuntu上で動かそうといろいろやってます。passenger入れて、 passenger-install-nginx-module を実行しようとしたらエラーが出た。お前はrootじゃないからnginxインストールできひんわ、みたいなメッセージが出る。sudoったりrootになってインストールしようとすると今度はpassengerなんていうgemはないわ、って怒られる。sudoしたときには.rvm内のgemパッケージではなくシステムのgemパッケージを見ようとするっぽい。またrootになるとRVMではなくシステムのRubyが実行されるので同じくpassengerなんてgemないわ、って怒られる。システムのRubyは1.8.7だし、なるべくなら使いたくない。RVMのRubyを使ってpassenger + nginxな環境作れないのかよ、とググってたら以下のような記事を発見した。

なんと、RVMには rvmsudo というコマンドがあるらしい! 試しに

$ rvmsudo passenger-install-nginx-module

を実行してみたところ、お前はroot権限がないんじゃ〜とエラーが出ていたところも無事通過してnginxをインストールできてしまった。以前、sudoで無理矢理nginxをインストールしたときは、 nginx.conf 内で、

passenger_root /home/morygonzalez/.rvm/gems/ruby-1.9.2-p136/gems/passenger-3.0.2;
passenger_ruby /usr/bin/ruby1.8;

となっていて大変気持ち悪かったし、Passengerも「PassengerとRubyの本体でバージョンの不整合があるだろヴォケ」みたいな警告出してた。それが rvmsudo のおかげで nginx.conf に書き込まれる値も以下の通りとなるので、とりあえずPassenger(RubyGems)とRubyのバージョンが異なるというような問題は回避できる。

passenger_root /home/morygonzalez/.rvm/gems/ruby-1.9.2-p136/gems/passenger-3.0.2;
passenger_ruby /home/morygonzalez/.rvm/wrappers/ruby-1.9.2-p136/ruby;

ただ、なんでか分からないのだけどnginxがうまく動いてくれなくて、無事Webサーバーを起動できてない感じです。

それにしてもRVMは、本当にきもいと思う。readlineとかまで.rvm内にインストールできるできるし、いったい何考えてるんでしょうかね。きもすぎて便利です。

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

ブログをリニューアルするにあたり、自分でRailsで簡単なブログを作ろうかとも思ったけど、いろいろ面倒くさいので今のところLokkaを使うつもりでいます。デフォルトデザインがお洒落だし、さくっとデプロイできそうなのもいい。LokkaはSinatraベースなので、気にはなっていたものの何も触れなかったSinatraの勉強にもなるでしょう。開発者の komagata さんのこのブログ記事が印象に残ってる。

Railsを追いきれる自信が無かったから。Rails文化に引っ張られてアプリが一生完成しない気がしたから。あとアプリとしては問題無いのにベースのRailsのバージョンが低いだけで残念っぽくなってるアプリ(Redmineとか)を見たから。

半年やってみてSinatra面倒クセー!っていっぱいあったけど、(Sinatra本体の)ソースが短いので完全把握できる掌握感は独自のOSS作る上で心強かった。

そう、Railsはバージョンアップが頻繁なため、仕事でRailsを使えないサンデー開発者にはバージョンアップを追いかけるのが大変すぎる。Railsのマイナーアップデートでアプリケーションが依存するgemが動作しなくなりアプリケーション崩壊みたいのを何度か経験した。それが毎週末続くと、「Railsめんどくせぇ」ってなる。 ~/Sites に作りかけのRailsアプリケーションがいくつもあります。

Lokkaを利用して、途中で挫折しないようにブログ移行をしてみようと思います。

| @ブログ

ポータルシットをリニューアルしようかと思ってます。ブログプラットフォームは2003年の時点で完成されてて、P_BLOGの提供する機能に不満なところはないんだけど、コメント欄を含むP_BLOGのMySQLのデータをうまい具合に移行して作り直したらいろいろ勉強になるだろうなと思って。目指してるのはRESTfulであることと、シンプルであること、Ruby製であること。RubyベースのCMSかRailsで置き換えようと思います。納期は未定。

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

ポータルシットのコメント一覧ページで、マウスオーバーして全文を取得するやつをかっこよくした。

これまでは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に行った。

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

| @雑談

福岡に引っ越したので、熊本では参加することが難しい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みたいに何もかもがうまく行くとは思えない。でも夢や理念を実現しようとしない人生はつまらない。酒を飲みながら、自分たちが作ったものに対して誇らしげにプレゼンしてた人たちがとてもうらやましかったし、その熱にほだされた。

勉強しよう。