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

Jekyllを使いだしてから気がつくと一年経ってました。いろいろ便利に使えており気に入っております。

PygmentでコードをシンタックスハイライトしたりLSIで関連記事表示したりと結構手を入れてはいたんだけど、いわゆる世間の一般のブログにあるようなカテゴリ一覧表示機能と、カテゴリごとの記事アーカイブ機能がなくて、それを若干不便に思っておりました。

ググってみたところ、プログラマー向けなブログツールなだけあっていろんな方法が出てきました。以下そのまとめ。

カテゴリ一覧

JekyllのLiquid (テンプレート言語) には {{ "{{ sites.categories " }}}} みたいタグがあるんだけど、こいつが意図したとおりに動かない。普通のRuby使いの感覚からすると site.categories ってカテゴリを沢山持った配列になってそうな気がするんだけどこれが違う。

<ul>
{{ "{{ for category in sites.categories " }}}}
  <li>{{ "{{ category.name " }}}}</li>
{{ "{{ endfor " }}}}
</ul>

↑みたいな感じのコード書くと何も表示されない。 site.categoires はHashで、{ "カテゴリ名" => カテゴリ内の記事一覧 } みたいな構造になってる。LiquidでHashのキーを取りだす方法が分からず、どうにもこうにもいかなかったので他の人が作っているプラグインを利用することにした。

↑のファイルを JEKYLL_ROOT/_plugins にコピーする。(_plugins というディレクトリがなければ作る)。そんでテンプレートを変更する。↑のやつを↓みたいにする。

<ul>
{{ "{{ for category in sites.iterable.categories " }}}}
  <li>{{ "{{ category.name " }}}}</li>
{{ "{{ endfor " }}}}
</ul>

2行目のところが変更点です。これでカテゴリ一覧表示ができるようになる。

カテゴリごとの記事一覧

カテゴリごとの記事一覧を表示する方法だけど、こういうのを発見した。

ここの generate_categories.rb を使えばカテゴリ内の記事一覧を作成できる。こんな感じ。

これもさっきのと同じように、JEKYLL_ROOT/_plugins にファイルをコピーする。そんでLiquidテンプレートを書き換えるんだけど詳細はプラグイン内の記事をご確認くだしあ。

| @雑談

2011年7月の阿蘇

IT企業は都会に多いけど、田舎にもあればいいのに、と思う。というのは帰省していて阿蘇が大変過ごしやすかったから。福岡では僕のようなおっさんが夜寝て朝起きただけで顔や頭がアブラべっちょりになるけど、阿蘇ではそのような悲劇は起こらない。涼しいから。日中も過ごしやすく、エアコンなしで快適に積ん読や2chまとめサイト巡回がはかどる。節電とかバカみたいだった。

| @雑談

E-19PL was mine

6年前に買ったゴルフ2を手放した。

所有していたゴルフ2はE-19PLという型番で、GTIというラインだった。時の流れと重力と金のなさには抗えず、福岡に引っ越したことや経済面で維持が難しくなって、四度目の車検を前に手放した。査定はゼロ円だったので無料で買い取り業者に引き取ってもらった。

大学を出て実家に帰り、病気が治って一度目の退院をした後にばあちゃんに買ってもらったのがこのゴルフ2だった。その後病気が再発したため、G-CSF注射による骨痛や倦怠感に耐えながらゴルフを運転して通院したり、病気が治ってからは天気が良いとばあちゃんを連れて久住をドライブしたり、就職してからは毎日の通勤のほか九州各地の映画館に映画を見に行ったりと、20代の大半の時間はゴルフと一緒だった。

希少な3ドアのゴルフ2 GTIをあっけなく手放したことは後ろめたくもある。買い取り業者はスクラップにはしないと言っていたけど、こんな感じで手放すくらいなら誰か欲しい人を探して直接譲れば良かったと思う。

最後一年は洗車すら満足にしてあげられなかったが、本当に楽しかった。ありがとう。

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

ポータルシットをLokkaで置き換えました。

Lokkaでリプレースしようと決めたのが2月8日なので(たぶんLokka - portal shit!)、5ヶ月弱要したことになります。

今回こだわったのが、

  1. P_BLOGから記事本文はもちろん、コメントも移行する
  2. 移行スクリプトはテスト駆動で開発する
  3. Markdownで本文を書けるようにする
  4. 旧記事へのアクセスをリダイレクトする (未実装)

の4点。

TDDデビュー

移行スクリプトについては初めてテストファーストで開発してみましたが、なかなか勉強になりました。やたら長いメソッドを書かないように気を付けたり。長いメソッドはテストしにくいですね。あと途中でLokkaの仕様不足が露呈してコードを書き直したりしたんですが、そういうときもきちんとテストを書いているおかげで、一ヶ所変更したらプログラム全体がぶっ壊れるというような事態を避けることができ、大変良かったです。

herokuデビュー

最初はさくらVPSで運用しようかと思っていましたが、herokuで簡単に使えるのがLokkaの売りなわけですし、heroku使ったことがないのは若干まずいだろと思っていたのでとりあえずherokuで運用することにしました。楽でいいです。失業者が出るレベル。

ただ旧記事(/article.php?id=***)へのアクセスをリダイレクトするつもりで移行スクリプト書いたりしてたんですが、herokuで運用する限りにおいては nginx.conf を編集したりできないのでリダイレクトは実現できなそう。Sinatraで拡張子phpへのアクセスをリダイレクトするという変態的な処理はできないのでしょうか。クエリストリングの扱いがネックになりそう。場合によっちゃ結局さくらVPSで運用するかもです。

加えてherokuは画像のアップロードができないので、画像のアップロード先は別に用意する必要があります。プラグイン使ってAWSをストレージとして利用するとか。JAWS九州の勉強会に二回ほど参加して、Amazonのエバンジェリスト玉川さんの話とか聞いてAWS使わないと来年の今頃は失業してそうな空気を感じ取ったのでそのAWSにも手を出してみたいですね。

まとめ

Lokka、プラグインが簡単に作れるので本体のロジックにほとんど変更を加えることなくいろいろできて楽しいです。Sinatraベースなので困ったことがあったらSinatraのドキュメントを見ると大体なんとかなりそうな感じがします。リストカット感覚でブログ作ったり消してる人におすすめです。

| @WWW

Backlogユーザーのミートアップに行ってみた。Cacooなどで注目されているヌーラボのイベントなので何か面白い話が聞けるのではと期待して行った。

Backlogのそもそもの開発経緯は、自分たちが受託開発のプロジェクト管理のために作ったものを公開したのだそう。37signalsのBasecampと一緒だなと思った。『小さなチーム、大きな仕事』に書いてある。「自分たちが必要なものを作れ」、「最初の顧客になれ」ってやつ。自分たちすら必要としないものは誰からも欲しがられないのだろう。

ユーザーの活用事例で面白かったのがドメインの失効管理にBacklogを使うという使い方。前勤めてたとこでドメイン切れ事故が起きてしまったんだけど、ああいうのはExcelで管理してるだけじゃ確かに忘れやすい。Backlogに課題として登録してリマインダーの設定しとくと安全だなと思った。

意外に知らなかったのが開発者向けAPIの存在。シャノンの堀さんはAPIにアクセスするプログラムを書いて月初にBacklogにタスクを登録してしまうそう。これをアジャイル開発の手法であるスクラムと組み合わせて運用しているとのこと。生産性が3倍以上になったそうです。

人生初体験だったワールドカフェもなかなか興味深かった。テーブル上の紙にどんどん各人がアイディアを書いていき、時間を区切って席を替わりながら討論していく。紙の上にアイディアを書くので、声が小さい人の話も紙の上に残るし、話し好きの人が延々話し続けるタイプのディスカッションより話題に広がりが生まれるなと感じた。

ワールドカフェの議題は「あなたなら今後のBacklogをどうしますか」というもの。自分はGit対応や、37signalsのBasecampが幅を利かせている海外で勝負するには、オープンソースコミュニティには無償で使わせてあげるとPRになっていいのじゃないだろうか、といった意見を出した。

SkypeやGoogle Appsとの連携を希望しているユーザーが多くいる一方で、非ウェブ系企業ではファイル共有はおろかSVNさえ外部のリポジトリを利用することが禁じられ、Backlogの機能を十分に生かし切れていないとのことだった。

Backlogという製品に関してよりも、いろんな業種の人が異なる様々な条件でウェブサービスを使ってるんだなーということを知ることができて楽しかった。

また懇親会ではアラタナ研究所の @shunsuk さんとVimやRubyトークに花が咲いて非常に楽しかった。阿蘇にいた頃は技術の話ができる人が身近にいなくて悶々としてたもんだから、田舎から出てきて良かったなーとしみじみと感じた。天神で Kumamoto.rb やりたいです。

ヌーラボさんにはこのような場を提供していただき感謝しております。楽しかったです。ありがとうございました。

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

二月末に行ったスマートフォン開発環境セミナー(仮)でmasuidriveさんのTitanium Mobileについての発表を見てすっかり感化された。これからはJavaScriptで空を飛べる時代が来ると思った。

ドイツの会社がやってるToDo管理のサービスにWunderlistってのがあって、これは結構かっちょいUIのiPhone/Mac/PC/Webアプリを出してたりする。なんでそんなにマルチプラットフォーム対応できんの? と思ってたらどうもTitanium MobileとTitanium Desktopを使ってるみたい。だから簡単にマルチプラットフォーム対応できてるわけ。他にもThe Hit Listが一向にiPhoneアプリを出さないのでそれに業を煮やしたSenchaの社員が作ったHub ListっていうアプリもJavaScriptでデスクトップアプリを書いててマルチプラットフォーム対応してる。

しかし、なんかTitanium Desktop使って僕みたいなスキルしょぼい人がアプリ作るときじゃくせい(なぜか変換できない)を突かれて困ったことになる懸念もあるみたい。

とはいえ、最近プログラム書き始めたばっかでObjective-CとかJavaとか分かんない自分には、JavaScriptでiPhone/Androidはもちろんのこと、MacやWindows、はてはLinux向けのデスクトップアプリケーションが作れてしまうのTitanium MobileとTitanium Desktopにはとてつもない魅力を感じる。

連休期間中にしょぼいのでいいからなんか一個作りたい。

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

ポータルシットをLokkaに置き換えたくていろいろやってる。ポータルシットの過去記事をYAMLでエクスポートし、それをLokkaのDBに取り込む作業をやってる。TDD BootCampに参加したので、テストファーストしながらの作業。RSpecでテストコードを書き、ログが正しくインポートできることを確認する。テスト終了時 after(:all) フックで、取り込んだログを削除してる。コードはこんな感じ。ちなみにLokkaはDataMapperをORMに採用してるので以下はDataMapperでの話。

after(:all) do
  Category.all.destroy
  Entry.all.destroy
end

しかしこれでは AUTO INCREMENT の値がリセットされず、テストを繰り返す度に AUTO INCREMENT の値が増えていってうざかった。

DataMapperの機能で AUTO INCREMENT 値をリセットするのってないのかなと5秒くらい探してみたけど見つからなかったので、SQLを直接実行する方法を採用した。

ちなみにRDBMSに採用してるのはSQLite3。SQLiteでは UPDTE sqlite_sequence SET seq=0 WHERE name='テーブル名'; みたいなコードで AUTO INCREMENT 値を任意の値に設定できるみたい。

最終的な after(:all) フックはこんな感じ。

  after(:all) do
    Category.all.destroy
    Entry.all.destroy
    Entry.repository.adapter.execute('update sqlite_sequence set seq=0 where name="entries";')
  end

テスト実行後にはすべてのデータがデータベースから削除されて、AUTO INCREMENT の値もリセットされる。人畜無害なテストコード万歳。