スタッフブログ
WebアプリケーションのテストといえばSeleniumが有名です。
Seleniumは便利なのですが、HTMLでテストケースを書くのは面倒です。
通常はSelenium IDEを使うと思いますが、そもそもプログラマーはGUIを叩くのが面倒というケースが多いです。
Seleniumのプロダクトの中にSelenium RCというのがあります。
RCはRemote Controlの略で、その名の通りSeleniumをリモートから操作することができます。
操作に使う言語はJava/Perl/PHP/Ruby等多種多様に対応しているので、自分の好きな言語でテストを書くことができます。
これにより、例えばGUIの無い環境から、Selenium RCのサーバを動かしているPCでアプリケーションのテストを行うことが可能になります。
Selenium IDEの出力も、HTMLだけではなく各言語の形式で出力することができるようになっているので、ベースはSelenium IDEで作って、細かい調整は直接編集する、ということもできます。
サーバ側の使い方は簡単で、ダウンロードしたファイルの中の、selenium-server-[バージョン名]/selenium-server.jarを実行する(java -jar [ファイル名])だけです。当然JREが必要になります。
Windows Vistaの場合は管理者権限で動かす必要があります。
クライアント側は、PHPで動かす場合はPHPUnitが必要です。
pear channel-discover pear.phpunit.de pear install phpunit/PHPUnit
さらに、Testing_Seleniumが必要なので、
pear install Testing_Selenium-beta
でインストールします。
実際には以下のようなコードで動かすことになります。(Selenium RCに付属のサンプルを多少変更したものです)
Firefoxでは動かなかったのでIE(7)にしています。
<?php require_once 'Testing/Selenium.php'; require_once 'PHPUnit/Framework/TestCase.php'; class GoogleTest extends PHPUnit_Framework_TestCase { private $selenium; public function setUp() { $this->selenium = new Testing_Selenium("*iexplore", "http://www.google.com", "192.168.1.1"); // 192.168.1.1はSelenium RCサーバのIPアドレス。同じPC上で行う場合は省略可 $this->selenium->start(); } public function tearDown() { $this->selenium->stop(); } public function testGoogle() { $this->selenium->open("/webhp"); $this->selenium->type("q", "hello world"); $this->selenium->click("btnG"); $this->selenium->waitForPageToLoad(10000); $this->assertRegExp("/Google/", $this->selenium->getTitle()); } }
これをphpunitで動かすとサーバ上で動作すると思います。
詳しくはドキュメントを参照してください。
テストケースを用意するのも簡単ではないので、できるだけ作りやすい方法で作業できるようにしておくといいと思います。
また個人的には、Selenium RCを使うと、Selenium本体のファイルを置いておかなくてもいい(恐らくjarに全部含まれている)のが好きです。
先日、openpearがリリースされました。
PHPのライブラリのサイトといえばPEARがあります。PEARはいいライブラリが揃っていて、pearコマンドで簡単にインストールできるので便利なのですが、自分の作ったライブラリをPEARに登録するのは非常に面倒でした。
openpearは、独自のリポジトリを構築することで、誰でも簡単にPHPのライブラリを公開できるようにしたものです。
nequalのriafさんがメインで開発しております。
ライブラリを使う側からは、トップページに書いてある通り、一度
pear channel-discover openpear.orgすれば、あとは
pear install openpear/パッケージ名
で簡単にインストールすることができます。
ライブラリ開発側も、OpenIDでログインし、Subversionでソースをコミットしてリリース作業をすれば簡単にパッケージをリリースすることができます。
まだサイト自体がリリースした直後なので、登録されているパッケージはそれほど多くないですが、これから順次増えていくと思われます。
ちなみにopenpearのサイト自体はrhacoで作られているようです。
PHP用のCodeReposやSpark Project的な存在になっていくと思われるので、まずはライブラリを抱えている方は積極的にコミットしてみてください。
拡張現実(Augmented Reality、AR)というものがあります。
似たような単語に仮想現実(Virtual Reality、VR)というものがありますが、VRは完全な仮想空間に対して現実のデバイスでアクセスするのに対し、ARは現実空間に対して仮想空間を「拡張」するものです。
わかりやすい例だと、テレビ番組で実際の人間とCGのキャラが喋っているようなものです。
なにやら難しそうに見えますが、これを手軽に作るARToolKitというものが存在します。
このサイトのトップページに出ている画像がサンプルそのものなのですが、これは特定の現実空間にあるマーカー(実際はカメラから取り込んだ動画)上に3Dオブジェクトを配置するという処理を簡略化するためのライブラリです。
このようなものが簡単に作れてしまいます。
WindowsでOpenGLのプログラミング経験のある方ならすぐ作れると思います。
実際の使用方法などは、「攻殻機動隊」「電脳コイル」の世界を実現! - ARToolKitを使った拡張現実感プログラミングで詳しく紹介されているので、興味のある方は読んでみてください。Visual C++ 2008 Express Editionでビルドができるので、無料で一通りの環境は揃います。(カメラは自前で用意してください)
またこのARToolKitは、WindowsMobileやiPhoneにも移植されています。
若干処理は重そうですが、持ち運びできるデバイスでARを簡単に実現できるのはいろいろ使い道がありそうです。(例えば、展示品をiPhoneを通して見ると3Dキャラクターが解説してくれるとか)
ARを扱うライブラリは他にもあるので(マーカー不要のものとかも研究されています)、いろいろ試してみてください。
iPhoneの日本語入力は、ひらがなの頭文字からスライドさせて入力するという、iPhoneの全面タッチパネルを有効活用した入力方法になっています。
そして全面液晶といえばWILLCOM 03ですが(個人的に)、このWILLCOM 03でもiPhone同様の日本語入力が可能になるgesture10keyというものが公開されています。
これはtouchkeysipという、WindowsMobile用の日本語入力をカスタマイズするツールの上で作られています。
これを使うと、以下の動画のように、iPhoneライクな日本語入力が可能になります。
縦持ちでの入力が弱かったWILLCOM 03ですが、これを使うとメールも普通に入力できるようになります。是非導入してみてください。
最近開発環境はすっかりvimに移行してしまったので、なんでもvimで開発したいのですが、pluginとかが充実していないファイルタイプには不便だったりします。
今回はvimでActionScript(AS3)の開発をする方法をまとめてみます。
■syntax
ActionScript - ActionScript syntax highligting : vim onlineからダウンロードできます。しかしAS2レベルっぽいので、AS3のsyntaxを自力で追加する必要があります。class周りとか、importとかそのあたりが抜けているので適当に追記しましょう。
■rascut
id:secondlife氏が開発した、fcshをwrapして自動コンパイルとかをしてくれるものです。前はfcwrapとか呼ばれていたやつです。
詳細に関しては、ActionScript やるなら入れとけ。rascut 導入と使い方。 - てっく煮ブログが詳しいです。
rascutはいくつか問題があるので修正します。
・fcshが日本語版だとおかしくなる
rascutとFlex3 SDK beta - holidays-l開発ブログが詳しいです。
trunkだと修正されているようなので、trunkから持ってくるのが早いと思います。
・swfobject.jsが読まれない
lib/rascut/httpd.rbの27行目で
@path = env["PATH_INFO"] == '/' ? @root : F.join(@root, env['PATH_INFO'])
としていて、PATH_INFOが空の際にF.join(@root, env['PATH_INFO'])が呼ばれるため、無駄な/が末尾についてしまい読めなくなっているようです。
同じ行を
@path = (env["PATH_INFO"] == '/' or env["PATH_INFO"].empty?) ? @root : F.join(@root, env['PATH_INFO'])
とすることで対応できました。
ちなみにこちらもtrunkでは修正されているようです。最初からtrunkを使ったほうがいいと思います。
・画像が出ない
rascutのhttpdは、swf関係のファイルを/swf以下に配置するので、画像パスも/swf以下から読むように設定する必要があります。(rascut側の設定で対応できるのかもしれません)
親のasファイルと同じ場所にswfと画像を置くようにしておいて、as側でパスを/swf以下にしておけば大丈夫です。
[Embed(source='〜')]で埋め込む画像はもちろん関係ありません。
Eclipse周辺だと便利なツールはいろいろあるのですが、どうしても重くなりがちなので、自分の使いやすい環境で開発できるのが一番だと思います。
PHPは、昨日のほとんどが組み込み関数によって実装されているため、各関数の命名規則はprefix等で統一されていることが多いです。
しかし、中には命名規則が一致してないのに似たような挙動をするものがあったり、一致しているのに微妙に挙動が違うものがあります。今回はsatoが気になった例を紹介します。
・array_pop/array_shift
配列の最後の値を取り出すarray_popと、配列の最初の値を取り出すarray_shiftですが、若干挙動が違います。
array_popはそのままなのですが、array_shiftは
array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります。とあります。 つまり、
PHP: array_shift - Manual
array(100=>'a', 110=>'b', 120=>'c');という配列があった場合、array_popの結果は
array(100=>'a', 110=>'b');ですが、array_shiftは
array(0=>'b', 1=>'c');となってしまいます。 array_popと対象の動作を行いたい場合は、array_sliceの$preserve_keysをTRUEにして動作させるとうまく行きます。ただしPHP5専用なので、PHP4では他の方法で行う必要があります。
他にも似たような例は存在すると思うので、気になる場合は必ずPHPマニュアルを参照するようにしましょう。
弊社では毎週金曜日に何か発表とかがあるのですが、今回はOpenIDのRPの実装方法について話しました。
プレゼン資料を置いておきますので、参考になれば幸いです。(カーソルキーで操作します)
OpenID RPの作り方
OpenIDまわりの用語は結構多いのですが、どれもわかりづらいものが多いのでここでまとめてみます。
・OP
認証を行うサーバ。OpenID Provider。IdPとも。
・RP
OPを使って認証をするサービス。Relying Party。Consumerとも。「Relaying」ではないので注意。
・Claimed Identifier
ユーザが自分のものだと主張するID。いわゆる「あなたのID」。
・SREG
OpenIDに付随するユーザの情報を取得するためのプロトコル。OpenID Simple Registration Extension。
・Yadis
URIからその対応するプロトコルを取得するためのプロトコル。OpenIDに限ったものではない。
・nonce
なりすまし防止のための文字列。
・Diffie-Hellman鍵共有
一般経路で暗号鍵の安全な共有を行うアルゴリズム。PGP等でも使用されている。
・XRDS
Yadisで使われるXML文書の形式。
その他に関しては、OpenIDドキュメントの和訳(他にもあります)などを見るとわかると思います。
このあたりの用語と、セキュリティ問題とかを覚えておくと、実装の話以外では大体理解できると思います。
satoです。
今回はPHP5.2のreadline拡張をビルドしたときにハマったことを書いておきます。
PHPの拡張はPHPのビルド時に指定することが多いと思いますが、sharedでビルドしてextension=〜.soで適用することもできます。こちらのほうが後から取り外しもできるので便利です。
しかし今回はそもそもPHPのビルド時の指定を忘れていたので、直接単体でビルドを試してみます。
拡張はPHPのソースのext以下に入っています。今回はreadlineなので、ext/readlineに移動してphpizeしてconfigureします。
checking for readline in -ledit... no
configure: error: edit library required by readline not found
とか言われてしまいます。
libeditは、readlineのBSDライセンス版的なものなのですが、私の環境ではreadlineしか入っていなかったのでreadlineを使いたいところです。
configureを見ると
# Check whether --with-libedit or --without-libedit was given.
とか書いてある行があります。
--without-libeditとか書けば大丈夫なのでしょうか。
./configure --with-php-config=/opt/php5.2/bin/php-config --without-libedit --with-readline=/usr/lib
checking for readline in -ledit... no
configure: error: edit library required by readline not found
変化がありません。--with-libedit=noでも変わらないようです。
configureを追うと、
echo "$as_me:$LINENO: checking for libedit readline replacement" >&5
echo $ECHO_N "checking for libedit readline replacement... $ECHO_C" >&6
# Check whether --with-libedit or --without-libedit was given.
if test "${with_libedit+set}" = set; then
withval="$with_libedit"
PHP_LIBEDIT=$withval
else
PHP_LIBEDIT=no
if test "$PHP_ENABLE_ALL" && test "yes" = "yes"; then
PHP_LIBEDIT=$PHP_ENABLE_ALL
fi
fi;
このあたりでlibeditのチェックをしていることがわかります。
echoでデバッグすると、どうやらPHP_ENABLE_ALL="yes, shared"になっているため、常に通ってしまうようです。
しかしconfigureを読むのに慣れていないので、この変数がどこで設定されているのかはわかりませんでした。
よくわからないので、
if test "$PHP_ENABLE_ALL" && test "yes" = "yes"; then
PHP_LIBEDIT=$PHP_ENABLE_ALL
fi
を削除してしまします。が、変化がありません。
PHP_LIBEDIT=no
の次の行で、echo $PHP_LIBEDITとしても"yes, shared"と出力されています。
よくわからないので、その後のチェック終了後だと思われる(3242行目あたり)
ext_output="yes, shared"
ext_shared=yes
test "$PHP_LIBEDIT" = "no" && PHP_LIBEDIT=yes
の後に
PHP_LIBEDIT=no
と追加してしまいます。これでconfigureが通り、無事ビルドできました。
もしかすると何か設定があるのかもしれませんが、とりあえず今回はこれで正常に利用できているのでこれでよしとします。
正しい方法をご存じの方がいらっしゃいましたら是非ご教授お願いします。
phpのマニュアルを見てると、下のほうに英語でBBSの投稿みたいなのがくっついています。
例えば、
http://jp.php.net/manual/ja/function.sha1.php#39492
のような感じです。
ここで、ここに書いてあるhmacsha1()関数をどこかで使いたいという場合、ライセンス的にどうなるのか調べてみました。
ユーザノートについて
http://jp.php.net/manual/ja/about.notes.php
注意: 著作権の適用範囲として、ユーザノートは PHP マニュアルの一部と見なされます。 それゆえ、このドキュメンテーションのライセンス(現状は Creative Commons Attribution License)が適用されます。 詳細は Manual's Copyright をご覧ください。
とのことなので、
Creative Commons Attribution 3.0
http://jp.php.net/manual/ja/cc.license.php
が適用されます。
これは、Creative Commonsライセンスの一種で、
・原著作者のクレジットを表示すれば
・作品を複製、頒布、展示、実演が可能
・二次著作物を作成することが可能
となります。
なので、利用する部分に著作者表示(作者名、メールアドレス、元のURLあたりを書いておくといいと思います)を書いて、その部分のライセンス(CC Attribution 3.0)を明記しておけば、自由に利用することができるようです。
ちなみに、例示で出したhmacsha1()関数は、PHP5.1.2以降であればhash_hmac関数が組み込みで存在します。