アジャイル,Trac,オープンソースなどの話。認定スクラムマスター。Twitterは@ryuzee
僕がやっている案件(PHP)はもともとテストコードのないレガシーなプロジェクトで、それを改善するためにずっと動作を確認するための結合レベルの自動テストを増やしてきた。
そんな中で僕のところではどうやってテスト用のfixtureを管理しているか事例として紹介したいと思う。
みんなが沢山テストを作る前にコアとなるテスト用のfixtureは用意しておく。
さもないと、みんなが好き勝手にfixtureを作ってしまい、あっという間に混乱に陥る。
プログラム本体と同様に、DRYの原則で、同じようなテストデータを繰り返し作ってしまうようなことは避けるべきだ。
最悪なパターンは開発機や本番機のデータを引っこ抜いてきて、それをそのままテストデータとしてごっそり使う方法。流石に居ないと思いたいが、こういうことをやってしまうとテストデータの見通しが悪すぎて、テストが失敗した場合の検証が非効率だし、そもそもデータのロードに時間がかかりすぎる。
マスター系のテーブルとか、ユーザー情報のテーブルのためのfixtureはテストケースごとにバラバラに用意してはいけない。似たようなfixtureがあちこちに造られると、テストの数が増えてからの仕様変更の際にテストデータのメンテナンスだけでえらく時間が取られてしまう。
僕の場合は、共通fixture置き場に基本的なfixtureをテーブルごとに配置した上で、テストケースごとのfixtureを上書きでロードしている。
以下はPHPの場合だけど、基底クラスで、以下のようにCSVの取り込みロジックを作っておいて
if(is_array($this->fixture_path)) {
foreach($this->fixture_path as $path) {
echo "----" . $path . "\n";
if ($dir = opendir($path)) {
while (($file = readdir($dir)) !== false) {
if ($file != "." && $file != ".." && substr($file, -4) == ".csv") {
$table_name = str_replace(".csv", "", basename($file));
echo "===loading $file...";
@$dataSet->addTable($table_name, $path . "/" . $file);
echo " done!\n";
}
}
closedir($dir);
}
}
}
return $dataSet;
}
テストケースのコンストラクタあたりで
なんてやって、fixtureを複数階層に分けてロードしている。
fixtureをYAMLやXMLで持ってても同じことができるんじゃないかな。
僕はPHPUnit+Seleniumで結合試験を自動化していて、fixtureはテーブルごとにCSVファイルを用意している。これらのCSVをsetUp()で読み込むようにしているんだが、fixtureのカラム数があっていないと、すぐテストが落ちてしまう。(XMLでfixtureを保持していると楽かもしれないんだけど)
開発中は、当然カラムの追加や削除はあるが、その度にどのfixtureを修正しなければならないかを考えるのは面倒で仕方ない。
なので僕は、全fixtureをDBのスキーマと照合するツールを作っている。これがあればスキーマの変更の怖さはちょっと軽減される。
手で整合性の取れたfixtureを作るのはなかなか大変なので、Excelでfixtureをつくるようにしている。
予め用意しておいたシートに値を入れてマクロを動作させると、fixtureが自動で生成されるかんじ。
こういうツールもプロジェクトの早い段階で用意できていると効率的だろう。
例えば最終ログインから60日たっていたらAをして、120日たっていたらBをする、というテストケースの場合、fixtureに最終ログイン日時をハードコーディングできない。ハードコーディングしてしまうと、そのテストは実行日によってテスト結果が変わってしまうテストであり、自動テストの条件を満たさない。
このような場合は、fixtureにて識別可能な適当な値を設定しておいて、別途テストの初期化メソッドで値を書き換えるような対応をする。
まぁまだまだ改善の余地はあるなぁと思うけど、大分楽になってきたのは確か。
とはいえあくまで外側の挙動が担保できるようになっただけなので、内部的なリファクタリングと、メソッドレベルのテストはこれから増やしていかないといけない。
自動テスト環境をWindowsからLinux環境にしたとたんに、テストが通らないものが頻発して、初めて開発者がhtmlの中に機種依存文字である波ダッシュを埋め込んでくれていたのに気づいた。。orz
以下Wikipediaから引用。
Unicodeの仕様書では、U+301C WAVE DASH(波ダッシュ)に、「JIS punctuation」(The Unicode Standard、Version 2.0より引用、「JIS約物」の意)という注釈を施しておきながら、JIS X 0208の波ダッシュの例示字形(“上がって下がる” 形「」)とは異なる形(“下がって上がる”形「」)を印刷してしまった。
このような間違いが発生した理由は、Unicodeの例示字形を検討するグループにいたメンバーの日本語に対する知識が不十分だったために、縦書きの例示字形「」を90度回転すればいいと誤って判断してしまったためである[4]。
この影響を受けて、Microsoft Windows(XP以前)ではUnicodeの波ダッシュ (U+301C, WAVE DASH) は“下がって上がる”形「」で表示される(MS 明朝、MS ゴシック、MS UI Gothicにおけるもの)。それに対し、Unicodeの全角チルダ (U+FF5E, FULLWIDTH TILDE) は“上がって下がる” 形「」で表示されるようになっており、Shift_JISの波ダッシュ (0x8160、WAVE DASH)「」と同一の文字として扱われる。
このようにWindowsは、Shift_JISの波ダッシュ (0x8160、WAVE DASH)「」を、本来割り当てるべきUnicodeの波ダッシュ (U+301C, WAVE DASH) ではなく、Unicodeの全角チルダ (U+FF5E, FULLWIDTH TILDE)「」に割り当てている。一方、Mac OSやMac OS XではShift_JISの波ダッシュ (0x8160、WAVE DASH)「」を本来のUnicodeの波ダッシュ (U+301C, WAVE DASH) に割り当てており、その字形も一般的な波ダッシュの形である“上がって下がる”形「」で表示される(Osakaフォントやヒラギノフォントにおけるもの)。このWindows独自のUnicode割り当てが産んだ非互換性により、波ダッシュ (U+301C, WAVE DASH) が環境によっては文字化けを起こす機種依存文字となってしまっている。
JAVAだけの話かと思ってたが、そうじゃなかったんだな〜。
http://www.kaltura.org/

日本語の機能説明は http://www.kaltura.jp/technology/technology.html
kalturaは、PHPで作成された動画配信プラットフオームで、有償版のバージョンと、CEと呼ばれるオープンソースバージョンが存在する。
動作にはApache, PHP, MySQL が必要だが、要求されるバージョンが比較的細かいのでサーバ構築は少々手間である。最新のバージョンはKalturaCE 2.0.2
kalturaの特徴は、あくまで、「動画配信のためのシステム」である、ということが挙げられる。
Youtubeやニコニコ動画のようなユーザーインターフェイスの部分ではなく、配信基盤に重きをおいており、kalturaに保管した動画のプレイヤーを他のサイトに埋め込むという使い方が前提になっている(ように思える)
例えば、kalturaでは、オープンソースのブログエンジンであるwordpressからkalturaの存在を意識せず動画をアップロードできるようなプラグインや、教育用CMSであるmoodleに講義の動画等をシームレスに登録できるプラグイン等、多くの外部連携モジュールが用意されている。
最初にSnow Leopardにインストールしようとしたが、PHPやMySQLのバージョン要求が細かくて挫折したので、CentOS5.5をVirtualBoxにクリーンインストールした。
なお、以下のモジュールとバージョンが要求されるので、rpmだけで何とかしようというのは若干厳しい。
Apache >= 2.2
モジュールとしては
mod_rewrite
mod_headers
mod_expires
mod_filter
mod_deflate
mod_file_cache
mod_env,
mod_proxy
PHP = 5.2.x
MySQL >= 5.1.37
CentOS5.5系のPHPは標準では5.1系なのだが、kalturaはPHP5.2系を要求する(PHP5.3も標準では動作しない)ので、デフォルトでインストールされることが多いapacheとPHPとMySQLは利用せず、XAMPP for Linuxを利用した。
詳細については http://www.kaltura.org/kaltura-ce-setting-prerequisites-centos-55-wxampp に記載があるので、その通りやれば良い。
/opt/lampp/etc/my.confに以下を追記
既にapacheやPHPが導入済みの場合は、一旦apacheを停止した上で
としてリネームした上で、以下のようにシンボリックリンクを作成する
起動スクリプトは、/opt/lampp/lamppにあるので
以上ができたら、XAMPPのインストール結果をブラウザで確認する
アプリケーション内で外部コンテンツを取得するのにcurlを利用しているので、curlをインストールする
キャッシュのために、memcachedを利用している。無くても動作するが以下の手順でインストールする
kalturaはアカウント登録時にパスワードをメールで送信するので、メールサーバは必須。
CentOS5.5であれば標準のpostfixをそのまま利用すれば良い。
※評価の際にどうしてもメールの送信ができない場合は、何も設定せず、リターンメールを頑張って読めばOK
リコメンデーションあたりで、JAVAのBIライブラリを利用しているのでjdkのインストールが必要だ。
Oracleが提供するもので問題ないが、openjdkでも動く。バージョンはいずれの場合も1.6以上。
BIツールらしい。初めてしった。
/etc/sysconfig/selinux を開き、
とする
/opt/lampp/etc/httpd.confを開き、以下の1行を追加
lamppを再起動
/etc/sysconfig/xymon-client1を開き、
としてサーバ名を設定
自動起動の設定を行い、xymonを起動する
kalturaは標準のインストーラーによるインストールでは、バーチャルホストでの動作を想定している。
そのため、ローカル端末での評価の場合は、hostsに適当なホスト名を設定するか、またはDNSの設定を行うことが望ましい。※一応設定せずに、インストーラで動作URLに127.0.0.1を設定しても動作はした。
kalturaのサイトにアクセスしてユーザー登録を行って最新のインストーラーをダウンロードする( http://www.kaltura.org/project/community_edition_video_platform )か、またはsubversionで取得する。
今回はSubversionで以下のように取得した。
上記で入手が終わったら
としてインストーラーを実行すれば良い。あとは指示に従えばインストールは完了する。
インストール完了後はhttp://(host名)にアクセスすると、以下のようなスタート画面が表示される。

標準では動画投稿権限をもつユーザーはいないので、スタート画面に表示されている「Add New Publisher」をクリックしてログインし、投稿者を作成する。
なお、作成した段階でKMCにログインするためのパスワードが登録したメールアドレス宛に通知される。

startページからKaltura Management Console(KMC)にログインする。
動画の掲載や、プレイリストの作成、埋め込み用のタグの取得はすべて、このKMCの中で行うことになる。(API連携しない場合)

コンテンツをクリックすると、プレビューと埋め込み用のタグが表示される。

あとは試しに、適当なhtmlページを作ってタグを埋め込んでみればよい。


Wordpressからkalturaをシームレスに扱うことができるプラグインが提供されている。
All in one Video pack プラグイン をWordpressにインストールしてあげれば良い。
※Wordpressとの連携の設定をする際に、特にkaltura側の認証がなく自動でkaltura側に新たなユーザーが作成されるように見えるが、だとすると誰でも公開されているkalturaを利用できることになってしまい問題がある。kaltura側で外部連携に関する何らかの制限がかけられると思うのだが、現在のところやり方がわからない。
まだまだ色々触ってみないと分からないんだけど、動画配信用のプラットフォームをさくっと作りたい、という場合には良いのではないだろうか。
引き続き、携帯対応のあたりと、アクセスコントロール、APIの仕様について調べていこうかと思う。
なんでこんなことをやっているかというと、1年2か月の現役生活を引退したLenvo S10eというネットブックをサーバ転用するため。自宅にUSBのCDROMドライブなんてものは無いし、そもそもネットブック本体にはCDROMドライブもついていないので、USBメモリからブートするか、ネットワークからブートするしかないんだよね。
で、USBブートイメージの作りかたは2つ試してみたが、どちらでもいけるのでそれぞれ紹介。
これを使うとインストール用のCDROMイメージをUSBメモリに変換して、Bootableにしてくれる。ddって何?みたいな場合にはわかりやすい。

ネットブックは音もそこそこ静かだし、ディスクは160Gくらい積んでいるし、CPUは省電力のAtomで、普段閉じておけて場所をとらない、という意味で、実はサーバ用途として十分使えるのではないかと思う。
普段仕事で使っているネットブック(Lenovo S10e)のあまりのしょぼさにしびれを切らして、MacBookProを買いました。
購入したのは、MacBook Pro 2400/13.3 MC374J/A
APPLE MacBook Pro 2.4GHz 13.3インチ MC374J/A
定価:¥ 114,800
Amazon価格:¥ 109,000
カテゴリ:エレクトロニクス
発売日:2010-04-15
kakaku.comだと今日時点での最安値は100,000円丁度だけど、僕はヤマダ電機で109,800円にポイント18%(クレジットカードで買うと2%低くなるらしいが、交渉したらサービスしてくれた!)で購入。ポイントが約20,000円ついたので、併せてディスプレイも購入(19,800円)。良い買い物だった(と思う)
とりあえず早速仕事で使うためにセットアップしたので、インストールしたものをメモ。
gccとか使う必要があるし、iPhoneアプリ開発に必要とのことで、Snow LeopardのインストールDVDから追加インストール
いわずと知れたオンラインストレージツール。これがあるからWindowsからのデータ移行はかなり楽だった。
これもWindowsで使っていたのでそのまま移行した。
WindowsだとVMware Playerが無償で用意されているんだけど、Macにはなくて、VMware fusionを購入するしかない、ということだったので、とりあえずこれで代用。仮想OSは元々使ってたUbuntuはそのままWindowsからコピーしたら動作したけど、Windows7Ultimate(X64)はコピーして起動したところブルースクリーンが毎回出るような状況だったので、再度インストール。Windows7にはOffice2010を突っ込んでおいた。
Mac標準のメールがあるみたいだけど使い慣れているので。ネットで調べるとProfileのフォルダごとコピーしてprofile.iniを書き換えれば動くようなことが書いてあったけど、何度やっても起動時にアカウント作成するように言われてしまったので、これを期にIMAPに移行した。iPhoneからもネットからも読むのでまぁこれで良いか。
とりあえず開発に使うので入れておいた。古いWindowsマシンから保存しておいたパスワードだけは移行したかったので、パスワードエクスポート用のプラグインを突っ込んでデータを同期。ブックマークは全部はてなで管理しているから特に問題なし。
最近メインなので入れた。extensionいっぱい入れても軽いのはWindows版と変わりない。
Windowsの時はTweenを使っていてこれがなかなか使い心地が良かったのでにたようなのを探していたんだけど、@kurikazuさんからこれを教えてもらったので使ってみたら良かった。
マインドマップ書くために使う。なんかMacのアプリケーションのインストールはパッケージファイルをダウンロードして、ダブルクリックして指示に従えば終わりみたいなんだけど、こいつだけは、アーカイブを解凍してできたフォルダごとアプリケーションの中に入れなければ動作しなかった。
アプリケーションの削除に使う定番ソフトということで入れてみた。まぁ便利そう。
夜フクロウの前に入れてみた。iPhoneではこれを使っているが、仕事しながらみるには画面領域が広すぎて邪魔なんだよね。
家にあるWindowsサーバ系の開発環境に接続するために導入。普通にWindowsにつながるが、キーボードの操作はMacにあわせないといけないのでこれは違和感はあるなぁ。キーバインド変更できるのかな?あと、Windows版だとスマートサイジング機能で画面を縮小表示できるんだけど、Mac版はできないのかな?ちょっと調べてみたけど分からなかった。
家のサーバ群はVPN経由でないと接続できないようにしてあるので入れた。Windowsで使っていた設定ファイルはすべてそのまま使える。
Technetのサブスクリプションに加入しているんだけど、Mac版のOfficeは提供されていないので、とりあえずOpenOfficeで代用。KeyNote使いたいからiWorks買うかどうか悩む。
利用しているイーモバイルのカードがExpress Cardなんだけど、Macはスロットが無い、ということで、仕方ないのでExpress CardをUSBに変換するアダプタを買った。
PLANEX Mini Displayport ->DVI端子変換アダプタ (MacBook MacBook Pro MacBook Air) PL-MDPDV01
定価:¥ 2,520
Amazon価格:¥ 2,100
カテゴリ:エレクトロニクス
発売日:2010-02-19
もともと持ち運びで使っていたネットブックの代替だから、性能面では文句のつけようが無い。その分重量は2kgくらいあるらしいので、ネットブックの倍になった。毎日持ち運ぶので肩こりが悪化しそうな気はする。家で使っているDellのStudio17(Core2Duo P8600 メモリ4G)と比べても動作は快適に感じる。ただディスプレイが13.3インチで解像度が1280x800なので、ちょっと狭さは気になる。大きさはこのままで、解像度が1920あたりまで行けると相当良いんだけどなぁ。
とはいえ当分楽しくいじり倒せることは間違いない!
僕は普段RSSを読むのにGoogle Readerを以下のように使っている。(書いてみるとイマイチだな)
で今の使い方には問題がある。
もう当たり前だけど、まとめ読みできる準備して、空いた時間に場所を限定せず一気に処理できるようにすれば良い。
まとめ読みするには、Instapaperというサービスを使うのが良い。(日本だと「あとで読む」が同じようなサービス)

Google Readerでスターを付けた奴をInstapaperに自動で追加するスクリプトを作りました。
仕様は
という感じ。
これをcronに仕込んでおくと、自動でInstapaper側に、余計なデザインとかが削除された本文のみの状態で蓄積される。
朝会社行く前あたりと、帰宅する前あたりにcronが動作するようにしておくとよいかも。
iPhoneで見るとこんな感じ。

ソースはこちらからダウンロードできます。
ライセンスはMITライセンス。
好きにいじくってください。
ソフトウェア開発には12の原則があるということにたどり着いたらしい。
書いておかないと忘れるので。
コマンドプロンプトで、
とやると文字列が置換できる。
たとえば
のような感じでパスは\表示されるが、これを/に置換するのは、
のようになる。
いや、まぁCygwin使えばよいんだけど。
忘れそうなのでメモ。
TracでExcel出力したレポートをそのままお客さんに提出したりするんだけど、wiki記法の[[BR]]なんかはやっぱり改行に変換したいよね。
Linuxになれていると、置換のときに\nを入力すると置換してくれそうに思うんだが、ExcelではNG。
Excelの場合は、変換文字列に、「CTRLキー+J」を入力する。見た目は空白だけど、これで改行コードが入っているので一括置換できる。
Excel2007限定の話だけど、やり方は簡単。
まずファイル名の拡張子を、xlsxからzipに変える。その上で、そのzipファイルを普通に解凍してしまう。
解凍すると、xl/mediaディレクトリの中にファイルが連番で保存されている。
Mike Cohn氏のポスト「Managing Risk on Agile Projects with the Risk Burndown Chart」より適当要約。
短いイテレーション、1つのことへの集中、自動テストの助け、頻繁な顧客へのデリバリが、多くのプロジェクトが直面するような大きなリスクを避けてくれる。
従って、アジャイルな開発を行っている場合は、微細に渡るようなリスクマネジメントは不要である。
以下では簡単にリスクを計測する方法(これはJohn Brothersが2004年のAgile Timesで言及した)である「リスクバーンダウンチャート」を紹介する。

上の図のように、考えられるリスク、そのリスクが実現してしまった場合に失う時間、そしてリスク発生可能性について記述しておく。
この資料は第1スプリントのスプリント計画ミーティングの際に作成しておくことが望ましい。また新たなリスクが発覚したときや、リスクのサイズが変更になった場合は速やかに更新する。
あとは、バーンダウンチャートにプロットしていけばよいのだが、お勧めとしては、トップ10リスクの合計の数値をプロットすればよいだろう。
サンプルのバーンダウンチャートは以下の通りだ。

普通のリリースバーンダウンチャートと同じくスプリントが進めば、バーンダウンはリニアに下がっていくだろう。このリニアの線を赤で引いている。

リスクバーンダウンが右肩に下がっていかない場合は、チームは次のスプリントでリスクに対応する時間を確保することになる。
このようにリスクバーンダウンチャートはリスクを可視化する分かりやすい方法である。
日記 PHP オープンソース インストールマニアックス IIS Trac MySQL Perl Linux Agile・生産性向上 wordpress フリーソフト 自宅サーバ 書評 ブックマーク phpMyFaq TraM Plugin 早起き Delphi apache CakePHP Firefox Ruby eclipse セキュリティ プラグイン アジャイル mojavi Subversion Ajax/Web2.0 SQLServer Zope サーバ フレームワーク phpBB 仮想化 PostgreSQL OpenVZ scuttle CMS 文字化け 自宅 翻訳・日本語化 ApacheDS LDAP Excel 生産性向上 CodeIgniter XAMPP hacks taskfreak 修正 言語ファイル Ajax SBM ダウンロード HTML::FillInForm mod_security 情報共有