10
2 月

[Adobe AIR] ActionScript で動的に作った NativeWindow に Flex コンポーネントは追加出来ない

うーん。これは困った。

Adobe AIR API を使って NativeWindow を動的に生成したのは良いのですが、Flexコンポーネントが window.stage に addChild 出来ません。何でやねん。

NativeWindowクラスを継承した自前クラスで

[code language=”javascript”]
// ボタンを設置
var btnClose:Button = new Button();
btnClose.label = ‘閉じる’;
stage.addChild(btnClose);
btnClose.x = 5;
btnClose.y = 5;
btnClose.addEventListener(MouseEvent.CLICK, function(event:Event):void{
close();
});
[/code]

こんな感じで閉じるボタンを付けたいのだけど、全然表示されてくれません。ネットを徘徊して

NativeWindowにFlexコンポーネントが追加できない
AIRでテストアプリを作成していたら、新しく追加したNativeWindowにFlexコンポーネントが追加出来ないことに気がついた。
(中略)
Buttonは追加しても何も表示されず、TextFieldとSpriteは表示されている。akihiro kamijoさんのこの記事によるとベータ1の時からこの問題は修正されていないようだ。

こんな記事を発見。beta2でそうだというなら、現在beta3な訳だし、出来るようになってるんじゃないかと淡い期待てドキュメント調査。…してみたのですが、見事に玉砕。Developing AIR Applications with Adobe Flex 3 の299ページにしっかり書いてありましたよ。

Note: You cannot add Flex components to a native window.

あーあ。ちょいと Flex 使う魅力半減なんですけど。仕方ないから drawXXXXX 関数使って自分で簡易ボタンを描く事にしましたとさ。近々発表される正規版で対応されている事に期待。

09
2 月

SimpleTestでフォルダ配下のテストケースを再帰的に全て登録して実行するTestRunner

PHPな開発ではお馴染み SimpleTest を使ってUnitTestをしています。

自作ライブラリやフレームワークは規模が大きくなればなる程、テストはもちろんのことテストケースも相当な数になってきます。テストケースを格納するディレクトリ内にサブディレクトリが出来て更にまた階層構造を持つってな具合になると、テストを走らせるスクリプトもグチャグチャに。

なので、ディレクトリを再帰的に走査して見付けたテストケースを全部登録してイッキにテストする自作クラスを使っています。コマンドラインからもブラウザからもどっちから叩いてもokにする為、少し変な事をしていますが。

[code language=”php”]
< ?php
define('SIMPLETEST_DIR', '/path/to/simpletest');
require_once(SIMPLETEST_DIR.'/unit_tester.php');
require_once(SIMPLETEST_DIR.'/reporter.php');

/**
* 再帰的にテストケースを登録して全部実行するテストランナー
*
* newする時にコンソール引数($argv)を渡す。
* コンソールからかブラウザからかを判定して
* 指定されたディレクトリ以下のテストを全て一度に実行する支援クラス
*/
class SimpleTestRunner
{
private $reporter;
private $console;
private $group;

/**
* コンストラクタ
*
* @param string $argv コンソールから使うスクリプトの場合は引数群をそのまま渡す(省略可)
* @return void
* @author Yuichi Oishi
**/
function SimpleTestRunner($argv = null) {
// コンソールからかどうかを判定
$this->console = !isset($_SERVER[’HTTP_HOST’]);

// console からの実行かどうか調べてディレクトリとレポーターを指定する
if($this->console){
$testdir = isset($argv[1]) ? $argv[1] : ‘.’;
$this->reporter = ‘TextReporter’;
}
else{
$testdir = !is_null($_REQUEST[’dir’]) ? $_REQUEST[’dir’] : ‘.’;
$this->reporter = ‘HtmlReporter’;
}
$this->group = new GroupTest(’All of tests’);

//
$this->load($testdir);
}

/**
* ディレクトリ内のファイルを一覧してテストケースとして追加して行く再帰関数
*
* @param string $directory 対象とするディレクトリの絶対パス(相対パスではない)
* @return void
* @author Yuichi Oishi
**/
private function load($directory) {
// 指定されたディレクトリ配下を走査
$dh = opendir($directory);
while($filename = readdir($dh)){
// 隠しファイルは無視
if(preg_match(’|^\.+?|’, $filename)){continue;}

// ディレクトリであれば再帰的にファイルを辿る
if(is_dir($filename)){
$this->load($directory.’/’.$filename);
}

// Testで始まらないファイル名は無視
if(!preg_match(’|^Test.+$|’, $filename)){continue;}

// class名
$testcase = str_replace(’.php’, ”, $filename);

// テストケースのファイルを読み込む
require_once($directory.”/{$filename}”);

// テストケースを登録して
$this->group->addTestCase(new $testcase);

// ログ出力
echo “added test case : {$testcase}”.($this->console ? PHP_EOL : ‘
‘);
}
closedir($dh);

}

/**
* テストを実行する
*
* @return void
* @author Yuichi Oishi
**/
public function run() {
$this->group->run(new $this->reporter);
}
}
?>
[/code]

こんな感じのテスト実行用スクリプト(runner.php)を書いて

[code language=”php”]
< ?php
require_once("SimpleTestRunner.php");
$runner = new SimpleTestRunner($argv);
$runner->run();
?>
[/code]

coreディレクトリ以下をテストする場合は

$ php ./runner.php core

ブラウザからだったら http://path/to/test/runner.php?dir=core って感じで。パラメタ付けなければ runner.php のあるディレクトリ以下のサブディレクトリを全て走査します。

 

テストは重要ですね。今更感ありますけど。でも、思いのほかUnitTestなるものを知らない方に出会う事が時々ありビックリしてる今日この頃です。

24
1 月

mod_rewriteにログ出力させる

Apache module の黒魔術 mod_rewrite。

便利なので多用する訳ですが、非常に簡単なルールならともかく、ちょっと複雑な事をしたり RewriteCond も組み合わせだすと、mod_rewrite がどのように挙動しているか確認しながらでないとなかなか所望の設定にたどり着けません。

そんな訳で、mod_rewrite のログ出力設定の方法をメモ。

RewriteLog /var/log/apache2/rewrite.log
RewriteLogLevel 4

この2行を加えるだけで黒魔術が発動している様子を手に取るように把握可能なよう。

ただし、htaccess内や <DirectoryMatch> , <LocationMatch> 等のディレクティブ内には書けないので要注意です。

mod_rewrite のドキュメントによると、コンテキストは server config, virtual hostという事なので、httpd.conf 内に直接とか virtual host 設定内へ。

 

そして再起動…すると、めでたく mod_rewrite のログが出力されるようになります。

ちなみに、RewriteCond 周りの動きを見たい場合(正規表現にマッチしてるかとか)は、RewriteLogLevel を4まで上げないといけません。mod_rewrite ログの多さにめげそうになりますが、そこは気合いでなんとか。

 

という訳で apache ネタでした。

19
1 月

MySQL な環境で文字化けが起こった時に確認すべき5つのこと

文字化けは本当に嫌いです。MySQL4.1系以上を使っていると、文字化けに悩まされなかった事が無いってぐらい。理解不能な文字化け問題が発生すると、いっきに萎えますよね。ため息が出る。

…その度にネットで調べて理解度を少し上げて解決して、また遭遇して解決してを繰り返しているウチに、どうも自分の中で調べるべき項目を列挙出来るようになってきた気がします。今日はそれを並べてみたいなと。

 

ポイントは以下の5つ。

  1. MySQLコマンドの STATUS の characterset
  2. MySQLコマンドの SHOW VARIABLES LIKE ‘char%’
  3. /etc/my.cnf の default-character-set と skip-character-set-client-handshake
  4. 念のために SHOW CREATE DATABASE [データベース名]
  5. 念のために SHOW CREATE TABLE [テーブル名]

意図する文字コード表記になるような指針で臨むと、だいたい解決。デフォルトのlatin1のまま何となく巧く行ってるから良いやー的に進めていると必ずどこかでハマるので、最近は文字化け問題に遭遇したら全てを確認するようにしています。

 

1と2.文字コード周りの状態確認

1は、こんな感じになってるか。

mysql> STATUS;
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8

2は、こんな感じになってるか。

mysql> SHOW VARIABLES LIKE 'char%';
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |

綺麗に意図する文字コード表記が並んでいる状態であれば、文字化けは起こってない事がほとんどの筈。意図する文字コードになってない場合は設定に問題ありな場合が大半です。

 

3.MySQLの設定確認
設定ファイルでもってmysqldの起動時に1と2のようになってるのが理想でしょうから、設定ファイルを以下のように。/etc/my.cnf にこの記述があるかどうか。

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

無い場合は追加してMySQLを再起動ですね。もいちど1と2の確認です。ちなみに、このへんの詳細な解説は文字化け問題を本気で直すに詳しいですので、そちらを熟読される事をお勧めします。

 

1〜3が出来ていれば文字化けしそうにありませんが、それでも化ける場合は以下を確認してみると良いでしょう。滅多にないケースだとは思いますが。

 

4.データベース作成時のステートメント確認
文字化け問題のターゲットになってるデータベースを作成した時に発行されたSQLを確認します。

mysql > SHOW CREATE DATABASE [データベース名]
| hoge | CREATE DATABASE `hoge ` /*!40100 DEFAULT CHARACTER SET utf8 */ |

3のような設定を施す前に作っていたデータベースが文字化け問題を引き起こしている場合が相当しますね。作り直すなり、ALTER DATABASE の発行が必要になります(但し、テーブル毎や特定フィールドの文字コードが異なっている場合は要注意)。

 

5.テーブル作成時のステートメント確認
ついでにテーブルの文字コードも調べます。

mysql> SHOW CREATE TABLE huge \\G
************** 1. row ******************
Table: movies
Create Table: CREATE TABLE `huge` (
  `id` int(11) NOT NULL auto_increment,
  `code` varchar(16),
  `created` datetime,
  `modified` datetime,
  `enable` enum('Y','N') NOT NULL default 'Y',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

\Gは見やすくする為のモノです。DEFAULT CHARSET に指定されている文字コードが正しいか確認しましょう。一度だけ、どういう訳だか1〜4まで問題ないのに5だけがlatin1になっていてハマった事がありました。

いちいち全テーブルを SHOW CREATE TABLE するのが面倒くさい場合は

$ mysqldump -d [データベース名]

等で CREATE TABLE ステートメントだけ出力して確認しても良いでしょう。

 

という訳でMySQLの文字化け問題に悩まされた時に確認すべき項目を列挙してみました。それでもまだ文字化けが起こる場合は、スクリプト言語の設定や、プログラムがDBにアクセスしている箇所を確認するようにしています。

何かのご参考になれば。

14
1 月

Flex QAチームのPeter deHaanのブログが凄すぎる件

いぁもうFlex使いな人には当たり前なのかも知れないですけど、とっても有用なサイトなので自分用にもメモ。Flex Examples というブログです。

screenshot_01

ブログのタイトル通り、Flexで使える(主に)GUIなサンプルが紹介されているのですが、その数が半端じゃありません。毎日最低1つ、多いときは1週間に40を超える事もあります。

著者の Peter deHaan 氏は、Flex SDK のQAチームに在籍中。それまではFlex, Flash, ColdFusion な環境でのアプリケーション開発をしていたのだとか。

中の人がマジモードでブログ書くとこうなるのか…と素直に驚いた次第。しかも全サンプルのソースも公開されていますから、Flexを使い始めの人にとっては貴重なリソース群となるでしょう。

ちなみに、Adobeドメイン内で週間更新されるサンプル一覧掲載ブログはこちら

 

RIAが注目される昨今、2008年はあの Adobe AIR も正式リリースがされて新しいうねりになるだろうという事もあり、ActionScriptはもちろんのことFlex界隈の盛り上がりは結構なものになるでしょう。

当社でも、とある Adobe AIR アプリ制作にFlexを使用してまして、Peter deHaan の Flex Examples はその調査の過程で見付けた有用サイトの一つです。

何かの参考になれば幸いです。

12
1 月

Apach, MySQL, PHPの組み合わせでPHPだけソースビルドしたLAMP環境の構築

LAMPな環境前提のサービス構築の為に新しくLinuxなサーバーを作るとなると、ウチ的にはCentOS5系。

基本的にyumでパッケージ管理するのがストレス溜まらなくて良いんですが、どうしても最新バージョンをソースからビルドしたいって時がある訳です。

ウチでよく遭遇するのは Apache と MySQL はパッケージベースで良いんだけど、PHPだけソースビルドしたいんだよな…ってなケース。

そんな時、以下のような手順でphpをコンパイルしています。(例えば2008年1月12日現在最新の5.2.5の場合)

yumから mysql-devel パッケージをインストール(phpのコンパイルに必要)
# yum install mysql-devel

phpの取得とコンパイル
$ cd ~/src
$ wget http://jp2.php.net/get/php-5.2.5.tar.gz/from/jp.php.net/mirror
$ tar zxf php-5.2.5.tar.gz
$ cd php-5.2.5
$ configure -enable-mbstring -enable-mbregex -enable-mbstr-enc-trans --enable-iconv --with-zlib --with-curl -with-mysql=/usr --with-apxs2=/usr/sbin/apxs
$ make;make test;
# make install

–with-mysql と –with-apxs2 の値をパッケージによってインストールされているディレクトリにしてやるだけです。

MySQLもApacheも全部ソースビルドしていたとすると、

--with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache2/bin/apxs

ってな感じのオプションにしますよね、たいがい。その他のPHPオプションは必要に応じて変えましょう。

以上、Apache, MySQL は既存のパッケージのままPHPだけ自由にソースビルドして使えるLAMP環境について書いてみました。

02
1 月

YouTubeAPIを使って動画の情報を取得する方法

YouTubeAPIが面白い。色んな事が出来そうだなぁと仕様書を眺めるだけで感じます。

で、掲題の動画情報を取得する方法ですが、以下のURLにアクセスするだけ。RESTな感じが分かり易いですね。

http://gdata.youtube.com/feeds/api/videos/[Video ID]

Video ID はYouTubeの動画再生URLに含まれる v= の後に続いている値。当該IDの動画に関する情報がXMLで提供されるのですが内容は豊富です。

動画のタイトルや説明文、投稿者情報はもちろんの事ですが、個人的には以下の情報も取得できてしまえるのが面白いなと。

  • サムネイル画像
  • レーティング情報
  • コメントのRSSフィード
  • 視聴数
  • 携帯視聴用3gpファイルURL

創造するだけで色んな事が出来そうな気がしてきますね。