Home > 開発環境

開発環境 Archive

今見ているURLを手軽に携帯に移せるFirefox拡張-Mobile Barcode-

この記事の所要時間: 156

携帯サイトの開発中にPCで見ているページを携帯で見たい時ってありません?

これまではURLをメールで送ったりしてたのですが、これが意外と面倒だったります。なんとかならんかなあ、と思ってたところで、知ったのがMobile Barcodeです。

Mobile BarcodeでURLのQRコード生成

Mobile Barcodeは名前から想像できるとおり、今アドレスバーに表示されているURLをQRコードで表示してくれる拡張です。

操作も簡単で、ステータスバー右にある「Barcode」の部分にマウスカーソルを当てるだけでQRコードを表示してくれます。あとはQRコードを携帯のバーコードリーダーで読めばokです。

最近の携帯のバーコードリーダーは精度も上がっていて、瞬時に認識してくれるので楽チンですね。

QRコード生成は外部サイトを利用

ただ1つ気をつけないといけないのが、この拡張は自身でQRコードを生成しているのではなく、mobilecodes.nokia.comのQRコード作成サービスを利用している点です。

つまり一度このサイトにURLが送られることになるので、外部に出すとマズいURLには使わない方が安全かと。(悪用されることは無いかもしれませんが)

# 中の人もそこが気になっているようで、addon単体でQRコードを生成する方法があれば、教えて欲しいとの事です。

その場でURLを共有したい時に便利

先日も携帯サイトの打ち合わせ時にPC上で開発サイトを見ながら話を進めていました。ただやはり実機で確認するのが一番という事でQRコードを表示して、各自の携帯で読んで貰いました。こういう場合メールだと各自のアドレスを知る必要がありますが、QRコード読み取りならそういった情報を知る必要がありません。

邪魔にはならないので入れておくと便利ですよ:-D

Mobile Barcoder

2008/08/21 追記:
vectorさん情報で、外部サイト通信を行わない、QR Code という拡張があるようです。
こちらはURLが漏れるリスクが無いですし生成も早いので、かなりいけてます!

これに含まれている、JavaScriptでQRコードを生成するライブラリが気になります。:-D

PHPソースからドキュメントを生成するツール

この記事の所要時間: 524

PHPソースからドキュメントを生成する主要な3ツールを試してみました。どのツールもそれほど深くは調べていないのでインストール+アルファ程度の設定変更で試しています。

環境はCentOS4.4+PHP5.2.3です。

phpDocumentor

PHPでできたツールです。pearコマンドでインストールできることもあって、PHPのドキュメントジェネレータとして人気があります。

  • インストール

pearコマンドでインストールできます。

$ pear install --alldeps phpdocumentor
  • ドキュメント生成

phpdocコマンドで生成します。とりあえずドキュメントを生成するだけなら設定ファイルの変更は不要です。

./src 以下のPHPファイルを対象に ./doc 以下にドキュメントを生成
$ phpdoc -t ./doc -d ./src 

[参考サイト]

Doxygen

C++でできたツールです。DoxygenはC/C++、Javaをはじめ様々な言語についてドキュメントを生成することができます。どちらかと言うと、C/C++、Java、Pythonがメインのツールですが、PHPでも十分なドキュメントを生成することができます。

  • インストール

CentOS4用はRPMがあるのでyumコマンドでインストールできます。

$ sudo yum install Doxygen

ただRPMは1.3.9ですので、最新版(1.5.3)がよければソースからインストールします。

$ tar zxvf doxygen-1.5.3.src.tar.gz
$ cd doxygen-1.5.3
$ ./configure
$ make
$ sudo make install
  • ドキュメント生成

まず設定ファイルを生成します。-gで生成する設定ファイルのファイル名を指定します。ファイル名を指定しなければDoxyfileという設定ファイルがカレントディレクトリに生成されます。

$ doxygen -g [config]

次に設定ファイルを編集します。下記は最低限変更した方が良いと思う項目です。

$ vi Doxyfile
# ドキュメント出力ディレクトリ(省略すればカレントディレクトリに出力)
# => doc ディレクトリに出力
#OUTPUT_DIRECTORY =
OUTPUT_DIRECTORY = doc

# ソースディレクトリ(省略すればカレントディレクトリ)
# => src ディレクトリ以下のファイルを解析
#INPUT =
INPUT = src

# 再帰的にソースディレクトリを解析する
# => 再帰する(YESにしないとINPUTで指定したディレクトリのみ解析する)
#RECURSIVE = NO
RECURSIVE = YES

# ソースコードページを生成する
# => ソースコードページを生成
#SOURCE_BROWSER = NO
SOURCE_BROWSER = YES

# ソースコードページにてコメントを削除する
# => ソースコードページにコメント出力
#STRIP_CODE_COMMENTS = YES
STRIP_CODE_COMMENTS = NO

ドキュメント生成コマンドを実行するとドキュメントが生成されます。

$ doxygen Doxyfile

[参考サイト]

PHPXRef

Perlでできたツールです。phpDocumentorやDoxygenとは少し毛色が異なり、クラス図などは表示されません。上記2ツールはクラス構造などをドキュメント化しますが、PHPXRefはソースコード自体をドキュメント化するのを目的としています。

  • インストール

PHPXref – The PHP Cross Referencing Documentation Utilityから最新版ソース(0.7)をダウンロードして展開するだけでokです。

$ tar zxvf phpxref-0.7.tar.gz
$ cd phpxref-0.7
  • ドキュメント生成

設定ファイルを編集します。展開したディレクトリ内にあるphpxref.cfgが設定ファイルになります。

$ vi phpxref.cfg
# ソースディレクトリ(省略すればカレントディレクトリ)
SOURCE=src

# ドキュメント出力ディレクトリ(省略すればカレントディレクトリに出力)
OUTPUT=doc

ドキュメント生成コマンドを実行するとドキュメントが生成されます。

$ ./phpxref.pl

[参考サイト]

出力サンプル

CakePHP1.1.17.5612のソースを各ツールで出力してみました。

クラス構造を確認するならDoxygenが、ファイル構造を確認するならPHPXRefが良さそうです。ただDoxygenにはクセがあるようで、PEARパッケージのようにファイル名とクラス名が異なる場合は上手く生成ができませんでした。(良い方法があればどなたかヘルプを・・・;-))

svn log –xml

この記事の所要時間: 131

Yesterday I was struggling trying to get svn log to display the results for a certain user and this was very annoying.. then I jumped on #svn on freenode, and someone mentionned svn log –xml

SVN log-per-user parser using SimpleXML – David Coallier

svn logをXMLで出力できるんですね。知りませんでした。。。

試しにCakePHP1.1.xリポジトリのログを出力してみました。

$ svn log --verbose --limit 10 --xml 
<?xml version="1.0"?>
<log>
<logentry
   revision="4693">
<author>phpnut</author>
<date>2007-03-27T04:32:47.490451Z</date>
<paths>
<path
   action="M">/branches/1.1.x.x/cake/config/config.php</path>
<path
   action="M">/trunk/cake/1.1.x.x/cake/config/config.php</path>
<path
   action="M">/branches/1.1.x.x/cake/VERSION.txt</path>
<path
   action="M">/trunk/cake/1.1.x.x/cake/libs/session.php</path>
<path
   action="M">/trunk/cake/1.1.x.x/cake/VERSION.txt</path>
</paths>
<msg>Merging fixes into the trunk

Revision: [4692]
Merging fix for Ticket #2295</msg>
</logentry>
</log>

SimpleXmlElementなんかでパースすればすぐに使えそうです。さて何に使おうかなー。

PHPソースからフローチャートを生成する

この記事の所要時間: 054

Visustin – Flow chart generator sofware

PHPのソースからフローチャートを生成するツールです。

対応している言語はPHPの他にC/C++、Java、VBといった主要な言語はもちろんのこと、さらにPerlやPythonといったLL系の言語も網羅されています。(Rubyはまだのようです)

デモ版でCakePHPのソース[cake/dispatcher.php]からフローチャート生成してみました。

visustin_flowchart

※デモ版ではプリントアウト・エクスポートといった出力ができないので画面をキャプチャしています。

フローチャートの他にUMLのアクティビティー図も生成できます。

visustin_activity

ソースの規模にもよりますが、生成した図は画面で見るには大きいですし、デバッグやコードレビュー時に参考資料として使えそうなので、やはりプリントアウト機能は欲しいです。実用するには有料版を購入する必要があるという事ですね。

# 自分が書いたソースが図になると何だか嬉しいです。:-)

PHPUnitでMockオブジェクトを使う2

この記事の所要時間: 338

PHPUnitでMockオブジェクトを使うで紹介したMockオブジェクトですが、これは元クラスを継承しているわけではないので当然ながら元クラスの実装は使えません。

ただテストする場面によっては、基本は元クラスの振る舞いをして、一部のメソッドだけMockにしたいという場合があります。

そこで元クラスを継承したMockオブジェクトを作ってみます。

元クラス

< ?php
class Hoge {
  // このメソッドはそのまま
  function execute() {
    if ($this->request()) {
      // OK
      return 1;
    } else {
      // NG
      return -1;
    }
  }

  // このメソッドをMockにしたい
  function request(&$db) {
    $db->query();
    sleep(100);
    return true;
  }
}
?>

テストケース

Mockオブジェクトをテストケースに書いています。単にHogeクラスを継承してrequest()をオーバーライドするだけです。

< ?php
require_once 'PHPUnit.php';
require_once 'Hoge.php';

class MockHoge extends Hoge {
  function request() {
    return true;
  }
}

class HogeTest extends PHPUnit_TestCase {
  function testExecute() {
    $obj = new MockHoge();
    $this->assertTrue($obj->execute());
  }
}

$suite = new PHPUnit_TestSuite('HogeTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>

テストケース-返り値を設定

こちらではMockHogeに変数を追加して、インスタンス変数に応じてrequest()メソッドの返り値が変わるようにしています。

< ?php
require_once 'PHPUnit.php';
require_once 'Hoge.php';

class MockHoge extends Hoge {
  var $mockRequestValue;

  function request() {
    return $this->mockRequestValue;
  }
}

class HogeTest extends PHPUnit_TestCase {
  function testExecute() {
    $obj = new MockHoge();

    $obj->mockRequestValue = true;
    $this->assertEquals(1, $obj->execute());
    $obj->mockRequestValue = false;
    $this->assertEquals(-1, $obj->execute());
  }
}

$suite = new PHPUnit_TestSuite('HogeTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>

この方法では(Mockオブジェクト用の)コンポーネントは必要ないので手軽にMockオブジェクトを使う事ができます。また元クラスの実装を生かせるのでこの例のように一部だけを変えたい場合には有用です。

SimpleTestのようなMockオブジェクトとケースバイケースで使い分けるのが良いですね。

PHPUnitでMockオブジェクトを使う

この記事の所要時間: 347

PHPUnit3がリリースされました。このバージョンにはMockがサポートされているのですが、PHPUnit3はPHP5を対象としているので残念ながらPHP4では動作しません。ですのでPHP4対応のPHPUnitでMockクラスを使う方法を探ってみました。

使うのはPHPUnitと並ぶユニットテストツールのSimpleTestです。こちらはPHP4対応でMockクラスがサポートされています。これをPHPUnitと組み合わせて使ってみます。

SimpleTestインストール

PEARパッケージが以前はあったようなのですが、sourceforgeにはそれらしいものが見当たりませんでした。
zuzara : symfonyチュートリアル実践【第14~16日目】を参考に以下のコマンドでインストールしました。

$ pear install http://jaist.dl.sourceforge.net/sourceforge/simpletest/simpletest_1.0.0.tgz

PEARパッケージが見つからない場合でもsourceforgeからソースを取得してinclude_pathで参照できる位置に配置すればOKです。

PHPUnit用Mockクラス

SimpleTestのSimpleMockを継承してPHPUnitで使うMockクラスを記述します。

< ?php
require_once 'simpletest/mock_objects.php';

class PHPUnitMock extends SimpleMock {
  function PHPUnitMock($test, $wildcard) {
    $this->SimpleMock($test, $wildcard);
  }
}
SimpleTestOptions::setMockBaseClass('PHPUnitMock');
?>

テスト対象クラス

テスト対象のクラスはこちらです。selectCount()はテーブル名を引数に取り、テーブルのレコード数を整数で返します。擬似的に処理時間が100秒かかるようにしています。

< ?php
class Database {
  function selectCount($table) {
    sleep(100);
    return null;
  }
}
?>

テストケース

Databaseクラスのテストケースを記述します。Mockクラスを使用することに定義した処理結果[100]がすぐに返ってきます。

< ?php
require_once 'PHPUnit.php';
require_once 'PHPUnitMock.php';
require_once 'Database.php';

Mock::generate('Database');

class DatabaseTest extends PHPUnit_TestCase {
  function DatabaseTest ($name) {
    $this->PHPUnit_TestCase($name);
  }

  function setup() {
  }

  function testQuery() {
    $mock =& new MockDatabase($this);
    $mock->setReturnValue('selectCount', 100, 'users');

    $ret = $mock->selectCount('users');
    $this->assertEquals($ret, 100);
  }
}

$suite = new PHPUnit_TestSuite('DatabaseTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>

SimpleTestはMockクラスの他にHTTPテストも行えるなど高機能なのですが、すでにPHPUnitを使用していたので今更移行するのも億劫でした。あとはコードカバレッジも使えると良いのですが。;-)

ユニットテストでデータ検証

この記事の所要時間: 35

ユニットテストでプログラムで生成したデータを検証する方法です。

CSVファイルを検証するテストをPHPUnitで書いてみました。

< ?php
require_once "PHPUnit.php";

class DataTest extends PHPUnit_TestCase {
  function DataTest($name) {
    $this->PHPUnit_TestCase($name);
  }

  function testData() {
    // データ読み込み
    $fp = fopen('data.csv', 'r');
    if (!$fp) {
      die('data not found.');
    }

    // テストループ
    $line = 0;
    while(!feof($fp)) {
      $line++;
      $row = fgetcsv($fp, 4096);
      if (empty($row)) {
        continue;
      }

      if (count($row) != 3) {
        $this->fail('Line: ' . $line);
        continue;
      }

   // id は数値のみ
      $id = $row[0];
      $this->assertRegExp('/^[0-9]+$/', $id, $line);

   // code は英数字のみ
      $code = $row[1];
      $this->assertRegExp('/^[A-Za-z0-9]+$/', $code, $line);

   // name は値があれば良い
      $name = $row[2];
      $this->assertTrue(strlen($code) > 0, $line);
    }

    fclose($fp);
  }
}


$suite = new PHPUnit_TestSuite('DataTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>

ポイントは「assert失敗時のメッセージにデータを特定する項目を含めておく」くらいでしょうか。(このソースでは行数を入れていますが、DBのRecordsetを検証する時はpkeyの値を入れています。)あとはdata.csvが何万行あろうが何回テストしようがphpunitがきっちりテストしてくれます。やっている事は単純なのですが効果は高いです。

他にも複雑なSQLで生成されるデータをPHPで取得して検証したり、DBに問い合わせてデータが正しいかを検証するという方法もあります。もちろん正となるデータを用意しておいてそれと比較するというのもありです。

あと、ここではPHPUnitを使いましたが、データを相手にテストを行うので別にSimpleTestでも良いですし、PerlでもRubyでも何でもOKです。Javaで開発したシステムのデータをPHPで検証する、なんてこともできますね。(LL言語の利用範囲がこんなところにも;-))

ロジックの自動テストも大事ですが、生成物の自動テスト(チェック)もあると心強いものです。

Subversion1.4.0にアップグレード

この記事の所要時間: 227

TortoiseSVNを1.4.0にアップグレードしたらSubclipseやsvnコマンドでエラーが出るようになりました。

    Unsupported working copy format
svn: This client is too old to work with working copy 'xxxxxxxxxxxxxxx'; please get a newer Subversion client

subversion1.4.0のリリースノートを見ると作業コピー・リボジトリのフォーマットが変わったので、1.4クライアントからコミットしたファイルは以前のバージョンでは読めないようです。

そこでSubcliseとSubversionを1.4対応にアップグレードしました。

Subclipse

Subclipseでは1.1.7から1.4.0フォーマットに対応しました。しかし1.1.7はEclipse3.2が必要なのでまずはEclipseをアップグレードします。(ウチの環境は3.1)以前はAll-In-One Eclipseをインストールしていました。はじめから色々入っていて便利なのですが、結局Subversionクライアントしか使っていないので今度はSDKからインストールします。

まずはEclipse3.2+LanguagePackをEclipse downloads homeからダウンロード。あとはzipファイルを解凍してEclipseは完了です。Eclipseを起動後、[ソフトウェア更新][検索およびインストール][インストールする新規フィーチャーを検索]で更新アクセス先サイトに[http://subclipse.tigris.org/update_1.2.x]を設定します。そのまま進めばSubclipse1.1.7がインストールされます。

Subversion – CentOS

subversion1.1.4がRPMで入っていました。[rpm -Uvh]で関連ライブラリと共に1.4.0にアップグレードして完了です。このサーバにリポジトリがあるのですが、1.4.0アップグレード後も特に問題なく動作しています。

 $ sudo rpm -Uvh apr-0.9.12-1.i386.rpm 
 $ sudo rpm -Uvh apr-util-0.9.12-1.i386.rpm 
 $ sudo rpm -Uvh subversion-1.4.0-1.i386.rpm 

Subversion – FreeBSD

subversionをportsで入れていたので、portupgradeでアップグレード完了です。

# portupgrade -r subversion-1.3.2

ホーム > 開発環境

検索
フィード
メタ情報

Return to page top