今日はRedmine勉強会

今日はRedmine勉強会が開催されます。
私は普段、Subversion+Tracという環境で開発だったり、コーディングだったりデザインだったりをしてますが、最近はgit+Redmineなんて環境で環境を作っていらっしゃる方の話をよく聞きます。
とても楽しみ♪

redmineのことを知りたくて買った本です。これのsubversion本が非常にすばらしかったことから、trac本も購入済み。

サーバにredmineが動く環境を作ってみました。
tracだと、gitに対応していないため、今後は切り替えていくのもありかなぁと思っています。
(もっとtracをがっつり使うぞ!という気持ちもありますが・・・(^-^;))

資料
★git勉強会・動画 2008.10.7

phpカンファレンス2009

phpカンファレンス2009

公式サイトがオープンしました。
http://phpcon.php.gr.jp/2009/

記念すべき第10回にふさわしく,
* Facebook 開発者 Brian Shire 氏
* symfony 開発者 Fabien Potencier 氏
* Taiwan PHP User Group の Finjon Kiang 氏

など豪華スピーカーを迎えて開催いたします!
PHP カンファレンス 2009 | 2009年9月4日・5日開催 日本PHPユーザ会主催

すっかりサボってしまっていた、smart.fmを再開しようと思います(><)

[メモ]構造を調べるツール

20090607.jpg

MyNETS2(というよりもCodeIgniter本体なんですが・・・)のコードを読み始めました。
全体像を想像しつつ、ノートに手書きでメモを書いてるのですが、どこまで読んだのかとか、メモを取るのに軸が欲しくなりました。
・・・・で使ってみたのが解析ソフトです。

GraphvizとDoxygenというソフトをWindows環境にインストールしました。
参考にさせていただいたサイトは私がインストールしたバージョンよりも少し古い情報のようですが、とても参考になりました。

参考にさせていただいたサイト
http://skazami.web.infoseek.co.jp/tools/Graphviz_Doxygen.htm

ためしに、破壊中(?)のMyNETS2を解析してみた結果のキャプチャです。(わりと大きい画像ファイルです)
CIUnitが入ったままなので、CIUnitも一緒に解析されています。
Class階層図がテキストリンクと画像が生成されたのがとても嬉しくて、キャプチャをとってみました。
生成される階層図の画像は、フォントサイズがあまりに小さかったので、設定画面で大きくしています。

現状のMyNETS2でCIUnit

MyNETS2

今現在の状況で言えば、
modules以下の本当にテストをしたい箇所がテストが出来ませんが、
動くところまでもっていくことができました。

ただ、MyNETS2のコードを書き換えての対応なので、
あまりよくない対応です。

Loader.phpのモバイルかどうかを判定して、
モバイル用のviewファイルがあれば、
そっちをとりにいく処理を
コメントアウトして動かしてます・・・・orz

あきらめずにコードを追いたいと思います。

追記:2009.06.07
CodeIgniterの話題とMyNETS2(アプリケーションプラットフォーム)との話題の差がわかりにくいので画像を作成してみました。MyNETS2の話題に関してはしばらくこれを使おうかなと思います。

さらに追記:2009.06.07 17:36
コメントアウトした部分は、携帯からのアクセスの場合、携帯用のviewフォルダにファイルがあればそっちを読むべし的な処理部分でした。1つのコントローラが、件数の表示を切り替えるにしても同じコントローラを使う場合使わない場合もありそうなので、コメントアウトのままでもいいかもしれないと思い始めています。・・・・でもやっぱりあったほうがいいのかなぁ・・・・(汗)

CIUnit: Unit testing for CodeIgniter(2)の続き

CodeIgnigter


CIUnit: Unit testing for CodeIgniter(2)
の続きです。
(3)ではありませn・・・・・(汗)
phpunitの再インストールで動き出したと思われたCIUnitですが、
正常な動作ではありませんでした。

$ cd controllers/

$ phpunit testWelcome.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)

$ phpunit ControllersAllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)

ここまでは正常です。

controllreのテストまで正常に動きましたが、
全テストではエラーが発生します

$ cd ../
phpunit AllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

.............<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(/var/www/html/works/system/application/controllers/Welcome.php): failed to open stream: No such file or directory</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(): Failed opening '/var/www/html/works/system/application/controllers/Welcome.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php')</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div>PHP Fatal error:  Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
PHP   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
PHP   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
PHP   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
PHP   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
PHP   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
PHP  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
PHP  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
PHP  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
PHP  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
PHP  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
PHP  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

Fatal error: Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130

Call Stack:
    0.0005	83784   1. {main}() /usr/bin/phpunit:0
    0.1485    5663072   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
    0.3327    9503688   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
    0.3333    9506304   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
    0.3342    9506512   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4183    9597480   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4809   10191464   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
    0.4809   10191464   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
    0.4809   10191464   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
    0.4811   10191464  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
    0.4825   10201528  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
    0.4826   10201528  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
    0.4826   10201528  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
    0.4827   10201528  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
    0.4827   10201528  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

$ cd controllers/
$phpunit testWelcome.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)
[root@localhost controllers]# phpunit ControllersAllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 2 assertions)
$  cd ../
$ phpunit AllTests.php 
PHPUnit 3.3.16 by Sebastian Bergmann.

.............<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(/var/www/html/works/system/application/controllers/Welcome.php): failed to open stream: No such file or directory</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  CIUnit::include_once(): Failed opening '/var/www/html/works/system/application/controllers/Welcome.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php')</p>
<p>Filename: tests/CIUnit.php</p>
<p>Line Number: 124</p>

</div>PHP Fatal error:  Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
PHP   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
PHP   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
PHP   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
PHP   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
PHP   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
PHP   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
PHP  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
PHP  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
PHP  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
PHP  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
PHP  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
PHP  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

Fatal error: Class 'Welcome' not found in /var/www/html/works/system/application/tests/CIUnit.php on line 130

Call Stack:
    0.0006	83784   1. {main}() /usr/bin/phpunit:0
    0.1494    5663072   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:52
    0.3345    9503688   3. PHPUnit_TextUI_TestRunner->doRun() /usr/share/pear/PHPUnit/TextUI/Command.php:128
    0.3351    9506304   4. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/TextUI/TestRunner.php:324
    0.3360    9506512   5. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4190    9597480   6. PHPUnit_Framework_TestSuite->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:621
    0.4814   10191464   7. PHPUnit_Framework_TestSuite->runTest() /usr/share/pear/PHPUnit/Framework/TestSuite.php:658
    0.4814   10191464   8. PHPUnit_Framework_TestCase->run() /usr/share/pear/PHPUnit/Framework/TestSuite.php:677
    0.4814   10191464   9. PHPUnit_Framework_TestResult->run() /usr/share/pear/PHPUnit/Framework/TestCase.php:375
    0.4816   10191464  10. PHPUnit_Framework_TestCase->runBare() /usr/share/pear/PHPUnit/Framework/TestResult.php:607
    0.4831   10201528  11. PHPUnit_Framework_TestCase->runTest() /usr/share/pear/PHPUnit/Framework/TestCase.php:404
    0.4831   10201528  12. ReflectionMethod->invoke() /usr/share/pear/PHPUnit/Framework/TestCase.php:489
    0.4831   10201528  13. testCIUnit->testDifferentControllers() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:0
    0.4832   10201528  14. set_controller() /var/www/html/works/system/application/tests/ciunit/testCIUnit.php:147
    0.4832   10201528  15. CIUnit::set_controller() /var/www/html/works/system/application/tests/CIUnit.php:195

なぜかAllTTestの場合、controllerのwelcomeを呼び出しているところが、Welcomeを呼び出そうとして失敗をしています。

CIUnit.phpの124行目

include_once(APPPATH . ‘controllers/’ . $controller . EXT);
の部分の$controller がwelcomeからWelcomeに変化しています。それによってファイルが読み込めずのエラーのようです。

無理やりな感じになおしてみました。

CIUnit.phpの124行目
include_once(APPPATH . ‘controllers/’ . $controller . EXT);
大文字でファイルがなかったら、小文字にしてファイル読み込んでよね的。

if(is_file(APPPATH . 'controllers/' . $controller . EXT)){
		    include_once(APPPATH . 'controllers/' . $controller . EXT);
		}else{
		    $controller2 = strtolower($controller);
		    include_once(APPPATH . 'controllers/' . $controller2 . EXT);
		}

やっとやっと、テストができるところまで到着(TAT)

ここまでの感想
phpunitの再インストールの記事を自力で探せませんでした。
基礎力がおそろしく足りないことを自覚しました。
「何がわからないか?」がわからないと解答が目の前にあってもそれが解答と理解できないのだなぁ・・・・

CIUnitへの挑戦はこんな流れでがんばってみる予定です

  • CIUnitを設置してみる
  • CodeIgniterでテストができるようにする ←今ココ
  • 実際にテストを書いてみる
  • テストの効果を実感してみる
  • CIUnitのコードを読んでみる
  • MyNETS2(CodeIgniter 1.7.0改)で使えないか模索してみる

    MacbookPro修理

    MacBookPro(Core2Duo 2.33Ghz 15.4インチワイド液晶

    MacbookProのDVDドライブとHDDが不調なためApple銀座へ持ち込み、修理をお願いしました。
    DVDドライブは修理、HDDは交換となりました。
    思っていた以上に早く修理から戻り助かりました。
    AppleCare入ってて良かった♪

    修理から戻ったMacbookProは
    修理に出す前にCarbon Copy Cloner(カーボン コピー クローナー)でバックアップを外付けHDDにとっておいたので、OSXの移行ツールを使ってバックアップから復旧。

    BootCamp領域は、Wincloneで作っておいたバックアップイメージから復旧。

    あっさりと元の環境を取り戻しました。

    SubversionとWebdavとhocks

    subversion
    SubversionとWebdavとhocksでwebdavにコミットした内容を、コミットした直後に、動作確認をプロジェクトメンバー皆で確認できる環境が欲しいなと思い、環境を作ってみました。

    Webdavの利用
    webdavからのオートコミットであるという定型文がコミットログとして保存されます。
    大きなメリットとしては、dreamweaverではFTPを使うのと全く同じ操作感でファイルをwebdavへUPすることができます。今まで全くwebdavを使ったことが無い人でもFTPでアップしながらの製作作業を行った経験のある方であれば、全く作業の内容を変えることなく、webdavを利用することが出来ます。
    新たに覚えることは、dreamweaverでのwebdavサーバの設定方法だけです。
    実際の製作内容で、新たに操作方法を覚えたり、普段と違う作業を行うといったことは一切ありません。

    webdavはSVNの連動ではなく、webdav単体で利用する場合、アップされたファイルは指定のURLに保存されます。
    apacheの拡張機能で、ファイルの操作をapacheが行うので、当然アップされたファイルはすべてapacheユーザのものになるため、パーミッションの問題が発生することはまずありません。
    webdavのアクセス権限を制限するために使用する認証情報(ID,PASS)は、ファイルをアップする時にも使え、また表示確認の際、ブラウザ越しにurlへアクセスする場合にベーシック認証として動作するためID,PASSの管理が容易です。

    WebdavとSubversionとの連動
    subversionとwebdavを連動するように設定すると、webdavへのファイルアップ(削除も…)=コミットとなります。
    自動的にsubversionへコミットしたことになります。
    subversionクライアントソフトを使う場合との差は、コミットログの登録ができないことです。

    webdavからのオートコミットの場合は次のようなコミットログが保存されます

    Autoversioning commit:  a non-deltaV client made 
    a change to
    /xxxxx/xxxxx.text ←コミットしたファイルのパス

    オートコミットしたコードの動作確認?
    webdav経由でのオートコミットの場合、そのままではwebdav単体での利用とは違い、即ブラウザから表示確認(動作確認)を行うことが出来ません。表示確認を行う場所を作り、表示確認をするまえにsvn updateを実行する必要があります。
    あらかじめ、サーバ上に動作環境としてソースコードをチェックアウトしておき、
    subversionの機能で、コミットをしたタイミングで、プログラムを実行させるhocksという機能があります。
    これを利用し、あらかじめ用意をしておいたサーバ上の動作環境に対して、svn updateを実行します。

    レポジトリを設置したディレクトリ/hocks/post-commit.tmpl というファイルをpost-commitというファイルにコピーをして、実行権限をつけます

    # cp post-commit.tmpl  post-commit
    # chmod 755 post-commit

    hocksで実行するファイルを、レポジトリのフォルダの中に設置場所を作り、そこに置きました。

    # mkdir レポジトリのフォルダ/script_hocks/
    # chmod 755 レポジトリのフォルダ/script_hocks/
    # chown apache.apache レポジトリのフォルダ/script_hocks/

    実行するファイルを作成

    # vi レポジトリのフォルダ/script_hocks/svnupdate.cgi
    #!/usr/bin/env python
    import os;
    result = os.system("svn update [チェックアウトした場所のパス]");

    このままだと、svn updateをするapacheユーザがsvnのアカウントの情報をもっていない状態なのでrootで、一時的にapacheでログインできるようにし、svn updateをチェックアウトした場所のパス上で一度実行します。
    順番はこんな感じ。

    • apacheが使用するためのsubvsersionのアカウントを作る。(ID,PASSの発行)
    • 上記で作ったアカウントに対してsubvsersionのアクセス権をつける・・・反映させるだけならreadだけでOK
    • サーバ上で、apacheユーザに対して、シェルを使えるように設定する
    • rootからsu apache で、apacheユーザになり、svn updateを実行する。
      • このとき、subversionのIDとPASSを聞かれます。
      • opensslを使用している場合は、接続を許可するかどうかも聞かれます
    • apacheユーザに対して、シェルを使えなくする
      (/sbin/nologinの設定に戻す)

    今回試してみた環境

    • subversion-1.4.4-7
    • httpd-2.2.8-1.fc8
    • python-2.5.1-15.fc8

    補足的に・・・・

    • OS Fedora 8 (・・・そろそろ入れ替えたい)
    • Trac 0.11.2.1.ja1

    関連記事

    –TODO
    CodeIgniterでTDDができるようにする!
     CIUnitを使ってみる
     DocTestをCodeigniterで使えないか試してみるとかしてみる。
     MyNETS2のコードを読んでみる。