| @WWW

IMG_0109

先々週になるけど、福岡に新しくできた アラタナ研究所 のレセプションに行った。研究所の所長であらせられる @rytich さんに招待してもらった。

なんと同研究所には熊本にいた頃からお会いしてみたいと思っていた @shunsuk さんもお勤めであり、お目にかかってご挨拶することができた。

@shunsuk さんのブログ「 で写真が見られるけど、パーティションが全面ホワイトボードのオフィスはとてもかっちょよい。ホワイトボードに↑の落書きを施した後、他の人が書いたのを見てたらウェブアプリケーションのスキーマを書いたとおぼしき走り書きが目にとまった。前の職場で一人でプログラム書いてた頃が無性に懐かしくなった。ああでもない、こうでもないと考えながら、作っては壊し、作っては壊しを繰り返してプログラムを書いていくのがとても楽しかったことを思い出した。

レセプションの最後に若くてイケメンな株式会社アラタナの濱渦社長が「九州から面白いサービスを作っていきましょう」とスピーチしていたけど、すごく楽しそうで羨ましかったし、自分もなんかしなきゃと焦ってしまった。

何はともあれアラタナ研究所オープンおめでとうございます。

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

ポータルシットを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 の値もリセットされる。人畜無害なテストコード万歳。

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

NECの安サーバーを買ってサーバーを作ってるんですけど、SSHでエラーが出て困ってます。OSはUbuntu Server 10.04.1 LTS。

まずSSHのおさらいを。クライアント側で

$ mkdir -p .ssh
$ ssh-keygen -t rsa (以下略)

したのち、サーバー側の /etc/ssh/sshd_configPasswordAuthenticationon にし、パスワードでSSH接続できるようにして

$ scp id_rsa.pub username@hoge.com:.ssh/authorized_keys

するか、あるいはUSBフラッシュメモリで鍵をサーバーに移す。その後サーバー側で .ssh/.ssh/authorized_keys のパーミッションをそれぞれ700と600に変えてあげるわけですよね。

いっぺんクライアント側で id_rsa.pub を作ってたらそれ以降は単純にこれを接続先のサーバーにコピーしてあげればおk。ここまで合ってますかね?

前から使ってる職場内だけで使うサーバーにも同じUbuntu Serverを入れてるんですけど、こっちでは全くトラブルがない。それなのに新しいサーバーでは

Permission denied (publickey).

というエラーが頻繁にお出になるのですよ。

しかしこのエラー、常に出る訳じゃないんですね。サーバーを直接操作して

$ sudo /etc/init.d/ssh restart

してあげると消える訳ですね。そんでしばらくクライアントからSSHで接続したり切断したりを繰り返していると、あるとき突然、

Permission denied (publickey).

となるわけです。まじでストレスフル。つか、このサーバーは公開用に使うものなので、こんな感じでSSHが不安定だとかまじで困るんですけど。

前述の PasswordAuthenticationon にしとけば、公開鍵認証に失敗した後もパスワードで認証することができるんですが、パスワード認証はなんだか怖いので使いたくないのですよね。どいうしたものか。

ググったらSSHのプロトコルを1と2併用にしたら解決するという情報が出てきたのですけど、これやったら "Disabling protocol version 1. Could not load host key" というエラー?が出てしまったので多分僕の環境では意味なし。「RSAキーやめてDSAにしたらエラーでなくなった」(ぷらぷらブログ | OpenSSH を導入。接続に四苦八苦!)という情報もあるけど面倒くさいのでまだ試していません。

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

昨日と一昨日の二日間、TDD Boot Camp 福岡に参加した。

参加しようと思ったわけ

勤めている会社にはテストがない。いや、テストはある。エクセルにテスト項目をたくさん書き出していって手動テストだ。テストコードがない。人力で三人くらいが夜なべしてテストする(だいたいスケジュールには遅延が発生する)。これはどうしたっておかしい。開発前に要件定義書、設計書を書いて開発して、開発が終わったらエクセルで長大なテストシートを作成し、手動テストを行う。そしてバグや思わぬ不具合が発見されるとプログラムに改修を加える。欠陥や不都合が発見される度に連動して設計書にも修正・変更が加えられ、Do Repeat Yourselfな感じになってる。毎日毎日ドキュメント作成などの開発以外のタスクに時間を割かれるので新しい技術に触れる機会がないし、遅くまで残って仕事してから帰宅するので趣味プログラミングで知見を広めることもできない(福岡に来てからのこのブログの更新状況を見ればおわかりいただけるかと)。この状況をなんとかしたいと思っていて、藁をもすがる思いでTDD Boot Campに参加した。

感想

一日目は『プログラマが知るべき97のこと』の監修やTDDで有名な @t_wada さんのレクチャーで、TDDとは何かが説明された。以下印象に残った点。

  • 良いテスト
    • 自動化されている
    • 徹底している
    • 何度でも実行可能
    • 独立している
    • プロのコード
    • テストコードもプロダクトコードと同じ品質であることが求められる(リファクタリング、DRY原則の貫徹など)
  • TDD三原則
    • 単体テストコードを書く前に製品コードを書いてはいけない
    • 適切に失敗する単体テストコードができるまで、次の単体テストコードを書いてはならない
    • 単体テストコードに対応する以上に製品コードを書かない
  • なぜTDDするのか
    • 自分が完璧ではないことがわかっているから
    • 最初から思い通りにコードを書けるほどに私たちは賢くない
    • 最初から思い通りに動作するほど対象は単純ではない
    • 素早く対象に近づき、フィードバックを得て方向修正をしながら開発を行う必要がある
  • テストの目的は健康
    • 変化に対応できるのは健康体のコードだけ
    • 変化に対応できるのは健康体のチームだけ
    • 毎日残業する、毎日レッドブル飲んだりしていてはダメ
  • TDDの導入効果
    • MSやIBMでTDD導入後、欠陥の割合が4割から9割削減された。
    • コード実装時間は15%から35%増加した。
    • しかし結果的にはバグが激減するので開発工数自体は減る。
  • TDDは才能ではなくスキル
    • 練習すれば習得可能
    • 量は質に転化する
    • 写経しましょう!
    • PCにGitをインストールし、ページをキープできるブックスタンドを買って、ケント・ベック本をひたすら写経。ビルドを実行する度にコミットする。

テストのみならず、自動化やバージョンコントロールの重要性が説かれた。

二日目には @bleis さんによるGitの効果的な利用方法やJenkinsを利用した継続的インテグレーションの実践例、 @akineko さんによるOMakeを利用した自動ビルド、自動テスト、自動コミットの話など。

ペアプログラミングを体験した

ペアプログラミングを生まれて体験した。 @mallowlabs さんとRubyでペアプログラミングをさせてもらった。講師陣が出題する課題を解いていくというもの。当然テスト駆動。テスティングフレームワークにはRSpecを利用した。

WEB + DB PressなどのRSpec特集を写経したことはあったけど、時間制限がある中で、他の人とペアを組んでプログラムを書いていく作業はかなりエキサイティングだった。

ただ自分のRubyスキルおよびVimのスキルが著しく劣っていたため、@mallowlabs さんの足を引っ張っていた感は否めない。正直申し訳なかったです。

全般的に、自分の知識のなさ、スキルのなさが実感できた

以下、初日に行ったFizzBuzz問題と主に二日目に取り組んだTwitterのタイムラインをカテゴリ分けするという課題の成果物。

TDD Boot Camp 福岡 — Gist TDDBC でペアプロした結果です — Gist

TDDをいかにして根付かせるか

勉強会に参加していきなりコードが書けるようになるわけでは当然ないので、継続的な勉強が必要だと感じた。いっぱい本を紹介してもらったので積ん読本を何冊か片付けたら『レガシー・コード改善ガイド』と『テスト駆動開発入門』を買おうと思った。

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

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

ブログをリニューアルするにあたり、自分で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で置き換えようと思います。納期は未定。