トップ 最新 追記

2010-04-01 [長年日記]

_ 測る - PHP編

必要に迫られて『ソフトウェア見積り―人月の暗黙知を解き明かす(スティーブ マコネル/久手堅 憲之)』を読み始めている。チケットの時間なんかもそういうネタなんだけど、この本を読んで、数えられるものをとにかく数えるということから始めている。

で、手元の PHP のコードをどうにか数えないとなと思ってハタと困った。

  1. PHP にはコメントを取り除いたプレーンな PHP コードだけを取り出す簡単な方法がない
  2. もともとが 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 の混在スクリプトはどうするのがよいか?

という疑問が出てきた。こうした混在スクリプトには

  1. HTML の比重の大きいタイプ
  2. PHP の比重の大きいタイプ

に大別できるが、いずれも多くのケースで Controller, View 相当のコードは

一直線に上から下へ書くシーケンシャルなコード

となりやすい。?>HTML<?php による HTML 出力はそのコードが実行されたタイミングで問答無用で行われるので、V, C 相当の部分で凝ったテクニックは使えない。従って HTML, PHP 混在スクリプトは

メンテナンス性? なにそれおいしいの?

な状態であることが多い。つまり

とにかく大変な状態

なので、

丸ごと行数を規模としてカウントしちゃうことにした。

ほんとに大変なんだよ、こういうコードのメンテは。恐ろしく生産性低いんだ。やったら長くなるしものすごく繊細なんだ。

Tags: PHP

*1 基本的にTDDなのでテストはなくならない。ただし乱暴な確認だけでどんどん進んでしまっている場合もある。


2010-04-02 [長年日記]

_ Twitterfeed試してみた

twitterfeed.com : feed your blog to twitter

twitterfeedのサービスイメージ

実際には feed 流してないけど。

  • 登録は独自 sign up か OpenID
    • 日本の OpenID Provider は直接認証に飛べない
    • 任意の OpenID Provider を選ぶ方法がちょっと分かりにくい
  • 基本的には、「feed を対応しているサービスに紐づけて流す」サービス
  • オプションが色々あって、取得タイミングや流すときの prefix, 並べ替えの基準や短縮 URL サービスなんかが選べる

すごい今さらだけどこれはなかなか面白い。

個人的には生成される feed は全部 friendfeed の方に集約してるので、twitter は手で書くようにしてるけど、twitter 始めようかと思ってるけどとりあえず何したらいいか分からない人(会社)なんかはこういうのも一つの手なんだろうな。あんまり一方通行だと twitter っぽくないけど。

あと、Twitter が OpenID を提供したらこういうサイトは便利なんじゃないかと思った。OAuth もいいんだけど、Twitter しか使う気がない場合はわざわざ別アカウントを作るのがなんかちょっとイヤじゃないかな。

Tags: Feed 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

mixi の使っている CI ツール

Python のバージョンも VCS も比較的広くサポートしているので他のものより導入が楽かも。パッケージ対応はこんな感じ。

ports YES
MacPorts YES
CentOS 5.0 NO
Debian 5.0 YES

ドキュメントは地味だけど、こういう形がいちばんしっくりくる old type なので問題なし。

まだ何もしないよ

いずれにせよ、すごく古くテストも揃っていないアプリなどが対象になるので、すぐにしゃかりきになって頑張ろうという気はないです。とりあえず流してみただけ。

そんなことより Cucumber はどうした。Hudson と組み合わせてる人がいるのは分かった。やっぱ Cucumber で外からテストするのが先なのかなぁ。でもそれこそ Nokogiri で対処できるかどうかも怪しいしなぁ。(まだもやもやしている。)

Tags: Test

*1 日本語訳は自分の中では継続的統合がメジャーなんだけど、どれもしっくりはこないですなぁ。

*2 今はそんなことないはず。

本日のツッコミ(全2件) [ツッコミを入れる]

_ しばた [つ integrity http://integrityapp.com/]

_ wtnabe [えーとGitしか対応してないけどexit statusだけで判断してるので、なんかその辺よしなにしてくれってことです..]


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 の回転の速度を稼げる。回転重要。

うん。そんな感じ。

Tags: Test PHP 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 分からない人には意味がないな。んー、まぁいいか。

Tags: Sysadmin

2010-04-15 [長年日記]

_ Google Form は基本的にガラケー非対応か

sensitive な情報でなければ十分使えると思う Google Form だけど、実際使ってみていちばん困ったのは

日本のケータイには基本的に対応していない

ということだった。今さら何言ってんだと思うかもしれないけど、案外書かれてないんだよね、これ。

試したところ

  • 少なくとも2009年春モデルまでの NetFront は利用不可
    • i-mode 2.0 は知らない
  • Openwave は
    • 7 は OK
    • 6 は NG
  • 同じく Google のサービスである Wireless Transcoder 経由だとイケるという情報も見つかったが、手元で試したところ、かえってひどくなった

という状態。

まぁ、だからどうしたという話でもないんだけど、メモということで。

実は i-mode 2.0 では動くようになっていて、日本のアクティブなモバイルユーザーの大半はカバーできてたりするかもしれないけど、その辺の調査の数字が出そろう頃にはまた状況が変わってたりするんだよねー。

Tags: Google

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へ活かす のようにすればなんとかなるような気がする。まだ試してないけど。

Tags: Ruby Test Git

2010-04-28 [長年日記]

_ Forefox 3.6以降でそれ以前と同じようにタブを開く

まぁこんなのは慣れなんですが、なんか気持ち悪かったので。

browser.tabs.insertRelatedAfterCurrent = false

だそうです。

参考

Tags: Firefox