2010-04-01 [長年日記]
_ 測る - PHP編
必要に迫られて『ソフトウェア見積り―人月の暗黙知を解き明かす(スティーブ マコネル/久手堅 憲之)』を読み始めている。チケットの時間なんかもそういうネタなんだけど、この本を読んで、数えられるものをとにかく数えるということから始めている。
で、手元の PHP のコードをどうにか数えないとなと思ってハタと困った。
- PHP にはコメントを取り除いたプレーンな PHP コードだけを取り出す簡単な方法がない
- もともとが HTML への埋め込み言語であり、混在しているコードがそこかしこにある。これはどう数えるのが妥当なのか?
php -w はホワイトスペースがなくなって行数が分かんない
上の 1 については
php -w script
によってコメントを取り除いたコードが取り出せるんだけど、こいつは
ホワイトスペースも取り除いてしまうので wc に掛けても行数はカウントできない
という致命的な問題を抱えている。仕方ないので
Twitter / wtnabe: ざっくりPHPの行数を数える。; までを1行として。 ...
こんなことをしてみた。
; までを1行として。
for i in PHPファイルのリスト;
do
php -w $i | perl -p -e "s/;/;\n/g" | wc -l
done | awk '
{
sum += $1
}
END {
print sum
}'
sed が分かんなくて Perl で ; の後ろになくなった改行コードを加えている。本当は自分の書き方だと { の後ろにも改行があった方がいいような気がするんだけどとりあえずざっくりでいいので。
自分の書いたコードに限ると
ちなみに自分のコメントの書き方は phpdoc 用のコメントがほとんどで、書き方としては
/**
*
*/
class Klass {
...
/**
*
*/
function funktion {
...
}
}
みたいな感じ。基本的にRubyコーディング規約をベースにしている。また以前ざっと数えたときに
コード : コメント = 1 : 1
の比率になっていたので、そのまま wc -l して 2 で割るとだいたい正確な数字が出る。これは狙って 1 : 1 にしているわけじゃないんだけど、クラスの説明やらやりとりされるデータ構造なんかを書いていると自然とそれくらいに落ち着くことが多い。ただし時間に余裕がないとこの部分のコメントが真っ先に削られてしまう。*1
混在スクリプトはそのまま wc -l でもいいかも?
数え始めて
HTML と PHP の混在スクリプトはどうするのがよいか?
という疑問が出てきた。こうした混在スクリプトには
- HTML の比重の大きいタイプ
- PHP の比重の大きいタイプ
に大別できるが、いずれも多くのケースで Controller, View 相当のコードは
一直線に上から下へ書くシーケンシャルなコード
となりやすい。?>HTML<?php による HTML 出力はそのコードが実行されたタイミングで問答無用で行われるので、V, C 相当の部分で凝ったテクニックは使えない。従って HTML, PHP 混在スクリプトは
メンテナンス性? なにそれおいしいの?
な状態であることが多い。つまり
とにかく大変な状態
なので、
丸ごと行数を規模としてカウントしちゃうことにした。
ほんとに大変なんだよ、こういうコードのメンテは。恐ろしく生産性低いんだ。やったら長くなるしものすごく繊細なんだ。
*1 基本的にTDDなのでテストはなくならない。ただし乱暴な確認だけでどんどん進んでしまっている場合もある。
2010-04-02 [長年日記]
_ Twitterfeed試してみた
twitterfeed.com : feed your blog to twitter

実際には feed 流してないけど。
- 登録は独自 sign up か OpenID
- 日本の OpenID Provider は直接認証に飛べない
- 任意の OpenID Provider を選ぶ方法がちょっと分かりにくい
- 基本的には、「feed を対応しているサービスに紐づけて流す」サービス
- オプションが色々あって、取得タイミングや流すときの prefix, 並べ替えの基準や短縮 URL サービスなんかが選べる
すごい今さらだけどこれはなかなか面白い。
個人的には生成される feed は全部 friendfeed の方に集約してるので、twitter は手で書くようにしてるけど、twitter 始めようかと思ってるけどとりあえず何したらいいか分からない人(会社)なんかはこういうのも一つの手なんだろうな。あんまり一方通行だと twitter っぽくないけど。
あと、Twitter が OpenID を提供したらこういうサイトは便利なんじゃないかと思った。OAuth もいいんだけど、Twitter しか使う気がない場合はわざわざ別アカウントを作るのがなんかちょっとイヤじゃないかな。
2010-04-04 [長年日記]
_ CIツールを飛ばし読み
CI は Corporate Identity じゃなくて Continuous Integration*1の略ね。
- Hudson
- Javaなので思考停止
- CruiseControl
- Javaなので思考停止。ただし Rake とかに対応してるよってはっきり書いてあるし、その辺はいいかも
- CruiseControl.rb
- CruiseControl の Ruby port. ちょっと Ruby のバージョンに対して繊細すぎる。本番投入は難しい気がする。
- DamageControl
- もう active じゃないよって書いてある
- Buildbot
- 要 Python + Twisted
以下ちょっと個別に。
Hudson
個人的には日本語の情報はこれがいちばん目につくんだけど、Java なので LL 文化圏と合わないんじゃないかとか、FreeBSD 使いのサガとして Java はちょっと面倒くさい*2という思い込みがあって尻込みしている。
Hudson の方で各種パッケージシステム用に respository を用意しているので Java さえ動いていればたぶんインストールは簡単。plugin システムで、plugin がやたら豊富。でも plugin て Java で書くんだよね。それを思うとやっぱり尻込みしたり。(Python なら書けるのかっていうとそんなことないけど。)
CruiseControl
これも Jav(ry
バカっぽい話だけどドキュメントの見た目は Hudson より好み。いや、こういうフィーリングって大事だと思うんです。
対応 Build ツールに sh script が入っていて PHPUnit が入っている…ように見えるけど PHPUnit の方は 404 だった。うむ。まぁ PHPUnit に対応してても個人的には嬉しくないんだけど。
対応 SCM がちょっと少ない?
Buildbot
Python のバージョンも VCS も比較的広くサポートしているので他のものより導入が楽かも。パッケージ対応はこんな感じ。
| ports | YES |
| MacPorts | YES |
| CentOS 5.0 | NO |
| Debian 5.0 | YES |
ドキュメントは地味だけど、こういう形がいちばんしっくりくる old type なので問題なし。
まだ何もしないよ
いずれにせよ、すごく古くテストも揃っていないアプリなどが対象になるので、すぐにしゃかりきになって頑張ろうという気はないです。とりあえず流してみただけ。
そんなことより Cucumber はどうした。Hudson と組み合わせてる人がいるのは分かった。やっぱ Cucumber で外からテストするのが先なのかなぁ。でもそれこそ Nokogiri で対処できるかどうかも怪しいしなぁ。(まだもやもやしている。)
2010-04-05 [長年日記]
_ SimpleTestをCIへ活かす
まず exit status を返す
昨日(2010-04-04)Integrity を教えてもらった。Integrity 自体は他のツールと違って testing framework との間をわざわざ取り持とうとはしていなくて、exit status さえ返せば判断できるっぽい。
ということでとりあえず普段使っている SimpleTest で exit status に test の結果を載せる方法を調べた。
exit( $test->run( $reporter ) ? 0 : 1 );
でイケる。
これだけ見るとなんのこっちゃって感じなので、次に TestSuite のコードを貼る。
exit status を返す TestSuite
Integrity を使おうと思ったら全テストの結果を exit status で返す必要がある。(はず。)そのためにまず全テストを回す TestSuite を作る。それが以下のコード。
わざわざ __FILE__ と比較して実行開始してるのは個々の test case と同じ書き方をしているため。っていうのと、普段使っている 1.0.0 は autotest に対応していないため。
こうしておくと test case を個別にテストできるし、test suite をまとめてテストすることもできる。個々のテストを回せる方が TDD の回転の速度を稼げる。回転重要。
うん。そんな感じ。
2010-04-13 [長年日記]
_ sh script でコマンドの実行成否で判別
sh script を書いていてときどき
あれ。sh script で他のコマンドを呼び出すのってどうやるんだっけ?
とか
何を言ってるんだお前は
状態に陥ったりするのでメモ。
いちばん簡単に書くと
COMMAND1 && COMMAND2
ってことなんだけど、例えばこれをもう少し読みやすくしたくて
if [ COMMAND1 ]; then
COMMAND2
fi
みたいに書いてもいい。
if COMMAND1; then
COMMAND2
fi
でもいい。自分が間違うのは LL 脳から切り替えられずに
if [ `COMMAND1` ]; then
COMMAND2
fi
みたいに書いちゃうやつ。これでハマるんだ。なんで?って思うかもしれない。オレだってなんで?って思ってるよ!
まとめとしては
そのまま書け
いや、これだけだと sh script 分からない人には意味がないな。んー、まぁいいか。
2010-04-15 [長年日記]
_ Google Form は基本的にガラケー非対応か
- アンケートフォームが超簡単につくれるようになったGoogleドキュメント | Google Mania - グーグルの便利な使い方
- 【連載】中小企業で使う『Google Apps』 (7) Googleフォーム編 Vol.1 - 基礎のキソ | ネット | マイコミジャーナル
sensitive な情報でなければ十分使えると思う Google Form だけど、実際使ってみていちばん困ったのは
日本のケータイには基本的に対応していない
ということだった。今さら何言ってんだと思うかもしれないけど、案外書かれてないんだよね、これ。
試したところ
- 少なくとも2009年春モデルまでの NetFront は利用不可
- i-mode 2.0 は知らない
- Openwave は
- 7 は OK
- 6 は NG
- 同じく Google のサービスである Wireless Transcoder 経由だとイケるという情報も見つかったが、手元で試したところ、かえってひどくなった
という状態。
まぁ、だからどうしたという話でもないんだけど、メモということで。
実は i-mode 2.0 では動くようになっていて、日本のアクティブなモバイルユーザーの大半はカバーできてたりするかもしれないけど、その辺の調査の数字が出そろう頃にはまた状況が変わってたりするんだよねー。
2010-04-25 [長年日記]
_ Integrity思い出しメモ
Integrity | Continuous Integration server
ちょっと調べた範囲で git + Ruby 以外のアプリをどうやってテストするのかをメモ。
git 以外に対応できるか?
lib/integrity/repository.rb
に
def checkout
run "git clone #{@uri} #{directory}", false unless cloned?
run "git fetch origin"
run "git checkout origin/#{@branch}"
run "git reset --hard #{@commit}"
end
って書いてあるので、例えばこれを git-svn を使うように書き換えちゃえば svn には対応できるような気がする。同じ感じで他の scm にも対応できるんじゃないかなぁ。
それか git-svn で mirror する仕組みを用意しておいて、mirror した git repository に対して git fetch; git checkout するようにした方がいいのかな? 本体をいじっちゃうと後々面倒がありそうだし。
テストの実行と結果の取得
lib/integrity/project.rb
module Integrity
class Project
include DataMapper::Resource
include Notifiers
property :id, Serial
property :name, String, :required => true
property :permalink, String
property :uri, URI, :required => true, :length => 255
property :branch, String, :required => true, :default => "master"
property :command, String, :required => true, :length => 255, :default => "rake"
property :public, Boolean, :default => true
この :defaule => "rake" がくさいので、たぶん :command を置き換えればいいんじゃないか。
Integrity.configure do |c| c.builder.project.command COMMAND end
って感じになるのかな? あるいは rake を使ってないなら rake っていう sh script を用意するのもアリかも。個人的には rake 使ってない環境はないので無理だけど。
とりあえず FAQ に以下のように書いてあるので
But does it work with <insert tech here>?
Absolutely! As long as your build process can be run from an UNIX-y environment and that it returns a zero status code for success and non-zero for failure, then Integrity works for you.
exit status さえ返せばどうにかなるんだと思う。
というかそうか、Rakefile 置いて :default タスクでテスト走らせればいいだけか。そっちの方が楽かも。
これで Ruby と git は必要だけど Ruby 以外のアプリ、git 以外の scm でもなんとか使えそうかな? SimpleTest を使っているプロジェクトは SimpleTestをCIへ活かす のようにすればなんとかなるような気がする。まだ試してないけど。
2010-04-28 [長年日記]
_ Forefox 3.6以降でそれ以前と同じようにタブを開く
まぁこんなのは慣れなんですが、なんか気持ち悪かったので。
browser.tabs.insertRelatedAfterCurrent = false
だそうです。
_ しばた [つ integrity http://integrityapp.com/]
_ wtnabe [えーとGitしか対応してないけどexit statusだけで判断してるので、なんかその辺よしなにしてくれってことです..]