e4x: XMLの要素を検索・フィルタリングする方法
6月 6th
E4Xは非常に強力なのでXMLから値を検索したり、特定の値を持つ要素をとり除くたりといった処理が簡単にできます。
package
{
import flash.display.Sprite;
/**
* ...
* @author Motoki Matsumoto
*/
public class E4XFiltering extends Sprite
{
private var _xml:XML =
<books xmlns = "http://book/namespace/" xmlns:p = "http://parson/namespace/" >
<book name="PHPで作る携帯サイトデベロッパーズガイド" price ="3150">
<author>
<p:parson p:name="滝下 真玄" uri="http://blog.ecworks.jp/" />
</author>
</book>
<book name="PHP×携帯サイト 実践アプリケーション集" price="2940">
<author>株式会社マイネット・ジャパン</author>
<author>
<p:parson p:name="平島 浩一郎" />
</author>
<author>
<p:parson p:name="伊藤 祐策" />
</author>
<author>
<p:parson p:name="中元 正也" />
</author>
</book>
<book name="PHP×携帯サイト デベロッパーズバイブル" price="2940">
<author>
<p:parson p:name="荒木 稔" uri="http://memokami.com/" />
</author>
</book>
<book name="Adobe Flex 3 & AIRではじめるアプリケーション開発" price="4410">
<author>
<p:parson p:name="公門 和也" />
</author>
<author>
<p:parson p:name="大谷 晋平" />
</author>
<author>
<p:parson p:name="堀越 悠久史" />
</author>
</book>
</books>
public function E4XFiltering()
{
//
var book:Namespace = new Namespace('http://book/namespace/');
var parson:Namespace = new Namespace('http://parson/namespace/');
trace(_xml.book::book);
//authorが複数いる本を探す。
trace(_xml.book::book.(book::author.length() > 1));
//本のタイトルにFlexを含む本を探す
trace(_xml.book::book.( /flex/i.test(@name) ));
//価格が2900円カラ3500円の本を探す
trace(_xml.book::book.( @price > 2900 && @price < 3500 ));
//著者の名前をリストアップ
trace(_xml..parson::parson.@parson::name);
//uriをもつ著者のみをリストアップ
trace( _xml..parson::parson.( hasOwnProperty( new QName( parson, '@uri') ) ) );
}
}
}
AS3オブジェクトからそのクラスの参照を取得する
6月 5th
もしオブジェクトからそのクラスの参照が必要な場合、関数flash.utils.getQualifiedClassNameでクラス名を取得、
flash.utils.getDefinitionByNameにクラス名を渡して、クラスへの参照を得る。
package
{
import flash.display.Sprite;
import flash.utils.getQualifiedClassName;
import flash.utils.getDefinitionByName;
/**
* ...
* @author Motoki Matsumoto
*/
public class GetClassRef extends Sprite
{
public static const TEST_MESSAGE:String = "foobar";
public function GetClassRef()
{
super();
var s:Sprite = new Sprite();
var cls:Class = getClass(s);
}
private function getClass( obj:* ):Class
{
return getDefinitionByName( getQualifiedClassName(obj)) as Class;
}
}
}
PHP:メンバメソッドをスタティックメソッドと間違えてハマるの巻。
6月 4th
メンバメソッドをスタティックメソッドと間違えて実行していたおかげでハマった。
PHPは、他のクラスで定義されているメソッドでもNoticeやWarningなしで実行できたりする。
以下の例だと、クラスBClassに定義されてるメソッドtestFuncを
クラスAClassの中からスタティックメソッドとして実行している。
もちろん、$thisのスコープはAClassのインスタンスとなる。
んで、運悪く、AClassにもBClassにも同じ名前のメソッド
sayHelloなんてものがあると、気づかずに処理が進んでしまったりするわけだ。
バリバリPHPやってる人には常識なのかな?
他のクラスのメソッドをコール出来るって時点でかなり違和感。
<?php
//filename: exp001.php
class AClass{
public function test(){
BClass::testFunc();
}
public function sayHello(){
echo "Hello, World. I'm a AClass.";
}
}
class BClass{
public function testFunc(){
echo "-------inside BClass::testFunc-----\n";
$this->sayHello(); echo "\n";
echo "------------------------------------\n";
}
public function sayHello(){
echo "Hello, World. I'm a BClass.";
}
}
$test = new AClass();
$test->test(); echo "\n";
BClass::sayHello(); echo "\n";
>php exp001.php -------inside BClass::testFunc----- Hello, World. I'm a AClass. ------------------------------------ Hello, World. I'm a BClass.
PHP基礎 関数で参照を返す場合の注意
5月 27th
参照はあくまで変数に対してのみ作られるので、
関数で参照を返すような場合に、returnに変数を渡さないとWarningやNoticeの原因になります。
たとえば、リテラルや式を直接returnの引数に渡すとかするケース。
// 引数に文字リテラルを渡しているので警告が発生。
funciton &returnRef(){
return "Hello world";
}
//何も返さない場合は、
//return を引数なしで実行して強制的にNULLを返すようにする。
function &returnEmpty(){
echo 'Some process';
return ; //NULLが返る。
}
PHPでのUnicodeと正規表現
5月 25th
PHP4.4.0およびPHP5.1.0以降では、UTF-8モードのときに文字タイプにマッチするエスケープシーケンスが3つ追加されています。
このエスケープシーケンスによってUnicodeの文字カテゴリーや文字コード値をつかって文字集合マッチングパターンに指定する事ができます。
指定した文字プロパティとマッチする \p{xx}
Unicodeにはキャラクタカテゴリーといって、文字の種類によってカテゴリーごとに分類がされています。
$、€、¥はなどの通貨記号はSymbol Currencyカテゴリーに、+や-などの数学に使う記号はMathematical Symbolと言った具合にカテゴリーが割り当てられています。
たとえば、通貨記号にマッチさせたい場合は、
通貨記号が属すカテゴリーSymbol Currencyの文字プロパティ(Sc)をマッチングパターンに指定してやります。
//例
preg_match(/\p{Sc}/u, $str);
さらに、\pの後に一文字だけ記述すると、その文字で始まるすべての文字プロパティを指定することもできます。
たとえば、アルファベットを表す文字プロパティLは、Ll, Lm, Lo, Lt, Luといった他の文字プロパティをすべて含みます。
指定した文字プロパティを持たない \P{xx}
\p{XX]の否定を\P{XX}と表す。
例えば大文字のアルファベットLu を含まない文字とマッチは\P{Lu}と表し、これは\p{^Lu}同じ意味になります。
拡張Unicodeシーケンス(結合文字)とマッチする \X
\Xは 拡張Unicodeシーケンスを構成するUnicode文字にマッチします。
これは、正規表現 ?>\P{M}\p{M} と等価で、記号を含まない文字\P{M}とそれに続く、0個以上の記号を含む文字\p{M}のアトミックなグループにマッチします。
具体的な例をあげると、「が」を結合文字として表すと「か」(U+304B)+「゛」(U+3099)というという2つの文字から作られる結合文字としてあらわす事が出来ます。このような結合文字に対して\Xはマッチします。
もちろん、結合済みの「が」(U+304C)も存在します。
http://www.php.net/manual/ja/regexp.reference.unicode.php
WordPressでoutput bufferingを有効に
4月 30th
wordpressの開発をしているときouput_bufferingを有効にしたい場合があります、例えば、FirePHPなどはHTTPヘッダーをつかってログを出力していますが、HTTPヘッダを変更するような処理にはoutput bufferingが必要になるケースがほとんどだと思います。
そういう時は、wp_head とwp_footのアクションフックにoutput bufferingを有効にする処理を追加してやると便利です。
以下のような感じで、my-hack.phpにコードを追加するかプラグインとして追加してやると簡単に機能が追加できます。
/*
* Plugin Name: Enable Output Buffering
* Description: Enable output buffering
* Author:
* Version: 0.1
* License: GPL
*/
//関数名等は一意になるように適当に変えてください
function callback($buffer) {
// modify buffer here, and then return the updated code
return $buffer;
}
function buffer_start() { ob_start("callback"); }
function buffer_end() { ob_end_flush(); }
add_action('wp_head', 'buffer_start');
add_action('wp_foot', 'buffer_end');
SQLiteのGUI管理ツール
4月 15th
SQLite管理ツールいろいろ
SQLiteのGUI管理ツールを探してみました。
SQLite Administrator
SQLite Administratorは、Windows向けのSQLite管理ツールです。Table作成ウィザード、コード補完、シンタックスハイライトなど多機能で使いやすいのフリーウェアなのでおススメする1つです。
日本語は未対応なのでメニューは英語のまま、入力した日本語も文字化けします。ただ、テーブルからフェッチしたレコードに含まれる日本語は表示できるのでなので気にしなきゃ気にしないで使えます。
SQLite Admin AIR
SQLite Admin AIR Applicationは、Adobe Airで作られたSQLiteの簡易管理ツールです。レコードをフェッチしたり、テーブルを作成したりと一通りの操作はできます。SQLステートメントにエラーがあっても、ただエラーとでるだけで、どこが間違っているのかは判らなかったりと機能的にはイマイチです。
SQLite Manager Firefox Extension
SQLite Manager Firefox Extensionは、XULベースのアプリケーションでFirefoxの拡張としてインストールするか方法と、XULRunnerをつかって起動するか2通りの使い方があります。Firefoxの拡張としてインストール場合はFirefoxが重くなるので、XULRunnerを使う方をおススメします。
XULRunnerはFirefoxに含まれるのでFirefoxを使用しているのならXULRunner改めてインストールする必要はありません。XULアプリケーションの起動方法は、コマンドプロンプトからappオプションを付けて起動します。
firefox -app application.ini
SQLite Administratorのコード補完やシンタックスハイライトなどの機能はないですが、日本語にもしっかり対応していてデータベースのキャッシュサイズなどの細かい設定も可能な高機能な管理ツールです。
SQLite Database Browser
SQLite Database BrowserはQtを使ったアプリケーションです。一通りの機能は備えていますが、テーブルフィールドのデータタイプで選択できるデータタイプが少なかったり、日本語が表示できなかったりとSQLite AdministratorやSQLite Managerと比べると見劣りします。
MySqlのSHOW TABLESをSqliteで行う
4月 11th
SqliteでSHOW TABLES
Sqliteあるあるネタ。
Sqliteで、MySQLのSHOW TABLESクエリーのようにデータベース内のテーブルをリストアップしたい場合は、
コマンド.tablesを実行してやるか、データベースのスキーマ情報が収められているsqlite_masterテーブルからカラムtypeの値がtabelの物を抽出してやる。こんな感じ↓
select name From sqlite_master where type='table' order by name;
Adobe AirのデータベースでSHOW TABLES
Adobe Airのデータベースは、SQLiteをベースにしていますが、Airではsqlite_masterテーブルに直接アクセスする事が出来ないので、その代わりにSQLConnectionオブジェクトのloadSchemaメソッドを使います。
loadSchemaメソッドを実行した後に、getSchemaResultメソッドでSQLSchemaResultオブジェクトを得ます。SQLSchemaResultオブジェクトのtablesプロパティから、各テーブルのSQLTableSchemaオブジェクトにアクセスできるので、そのSQLTableSchemaオブジェクトのnameプロパティからテーブル名を取得します。
Sqliteの場合と比べると、ちょっと面倒くさい。
//SQLコネクションを作る
var con:SQLConnection = new SQLConnection();
con.open(File.applicationStorageDirectory.resolvePath("sampleDB.sqlite"));
//テーブルを作る。
var q:SQLStatement = new SQLStatement();
q.sqlConnection = con;
q.text = "CREATE TABLE 'main'.'sample_tbl'('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE);";
q.execute();
//スキーマをロード
con.loadSchema(SQLTableSchema);
var result:SQLSchemaResult = con.getSchemaResult();
//テーブル名をリストアップ
result.tables.forEach(
function(e:*, i:int, ary:Array):void{
trace(e.name);
}
);
Flash vs HTML5 ビデオ再生は?
3月 14th
Flashは本当に重いのか?
アップルは、FlashがCPUを多く使用しブラウザをクラッシュさせると批判、さらに、バッテリーの消費が早すると自社のiPhoneにFlashを搭載しないと方針をとっていますが、実際にこのAppleのFlashは重いという主張はどうなのか、Jan Ozer氏がMac、Windowのそれぞれの環境でFlash10.0 およびFlash10.1とメジャーなブラウザ Safari, Google Chrome, Firefoxでのムービーの再生時の負荷テストを公開してくれています。
Flash Player: CPU Hog or Hot Tamale? It Depends.
Jan Ozer氏のテスト
Jan Ozer氏のテストを見てみよう。
テストの内容は、Youtubeのビデオを再生させて、CPUの占有率を計測するというものです。テスト環境は以下
Window環境
- Apple Safari (4.0.4)
- Firefox (3.6)
- Google Chrome (4.0.249.89)
- Microsoft Internet Explorer (8.0.7600.16385)
- Flash Player (10.0.45.2 と 10.1.51.95)
Macintosh 環境
- Apple Safari (4.0.4)
- Firefox (3.6)
- Google Chrome (5.0.307.9 beta)
- Flash Player (10.0.45.2 と 10.1.51.95)
結果:Macintosh
| MacBook Pro | Safari - HTML5 | Safari - Flash | Chrome - HTML5 | Chorme Flash | Firefox |
|---|---|---|---|---|---|
| CPU 占有率 Flash Player 10.0 | 12.39 | 37.41 | 49.89 | 50.39 | 40.25 |
| Flash 10 vs HTML5 | 202% | 1% | |||
| CPU 占有率 Flash Player 10.1 | 12.39 | 32.07 | 49.89 | 49.79 | 42.07 |
| Flash 10 vs HTML5 | 159% | 0% | |||
| 10.0と10.1の差 | -14% | -1 | 2% |
見ての通り、HTM5のビデオ再生がMacでは、Safariがダントツに効率が良い。これはSafariがH.264の再生をハードウェアアクセララレーションを利用して再生できるおかげ。Apple主張するFlashは遅いっていうのは、Safariが早いってだけで他のブラウザもそんなに効率がいいわけではない。Appleはハードウェアアクセラレーションに必要なAPIを公開していないらしく、MacではSafariに勝てるプレーヤは出ないだろう。
ChromeではHTML5とFlashの効率はほとんど変わらない。
FirefoxではFP10.0とFP10.1を比較すると、FP10.1の方が効率が落ちてしまっている。SafariではFP10.1の方が14%も効率が良くなっているのと比べると不思議かんじだが、これはSafariのFP10.1がSafariのCore Animationを利用しているおかげらしい。一方、FirefoxのFP10.1はQuickDrawからQuartz2Dに描画方法を変えたらしくその事が原因と推測される。
結果:Windows
| HP 8710p Windows | Safari - HTML5 | Safari - Flash | Chrome - HTML5 | Chorme Flash | Firefox | IE - Flash |
|---|---|---|---|---|---|---|
| CPU 占有率 Flash Player 10.0 | 未対応 | 23.22 | 25.66 | 19.55 | 22.00 | 22.41 |
| Flash 10 vs HTML5 | NA | -24% | NA | NA | ||
| CPU 占有率 Flash Player 10.1 | 未対応 | 7.43 | 25.66 | 10.73 | 6.00 | 14.62 |
| Flash 10 vs HTML5 | NA | -58% | NA | NA | ||
| 10.0と10.1の差 | -68% | NA | -45 | -73% | -35% |
Window向けのSafariはHTML5ビデオを再生できない。FP10とFP10.1の比較では、FP10.1がハードウェアアクセラレーションをサポートしたおかげで68%も効率が良くなっている。
Chromeでは、HTML5とFP10,HTML5とFP10.1ともにFPの方が効率が良い。HTML5とFP10.1との比較に至っては58%も効率がよくなっている。
Firefox,IEもともにFPの効率が良い事がわかる。FirefoxのFP10とFP10.1の比較では73%も効率が良くなっているのは凄い。
結局はハードウェアアクセラレーション次第
Windowsでは、HTML5よりもFlashPlayerの方が効率がよく、ハードウェアアクセラレーションが利用可能なFlashPlayer10.1ではその差は顕著になる。いずれはその差は縮まるだろう。
一方、Macでは、Safariがダントツで効率が良い。確かにAppleの主張は正しい。しかし、これはハードウェアアクセラレーションのAPIをAppleが公開していないからで、この事でFlashや他のブラウザが劣る批判するのは、すこし不公平な感じもする。
Windows版のSafariでは、QuickTimeがインストールされてる場合、mp4の動画を再生することができます。
ページに『投稿』を挿入するWordPress プラグイン:Inline Posts
3月 9th
Inline Postsとは
WordPressの記事には、ページ(Page)と投稿(Post)の2種類があります。
WordpressのプラグインInline Postsは、ページ中に『投稿』を挿入してくれるプラグインです。
これを使うと、『投稿』をページ内のセクションのようにして扱う事ができるので、過去に書いた『投稿』をまとめてページとして公開するとうような便利な使い方ができます。
作者は、SWXの作者でもあるAral Balkan氏です。実際にSWXFormat.orgのサイトもこのプラグインを使っているようです。
インストール
- ここのページのInline Posts WordPress Pluginのzipアーカイブをダウンロードする
- ダウンロードしたzipアーカイブの中身をWordpressのプラグインフォルダに配置して、プラグインをアクティベーションします。
使い方
使い方は簡単で、挿入したい『投稿』のIDを角括弧で2重に囲ってやるだけでOK。例えばIDが43の『投稿』は、
[[43]]
としてやります。
さらに、プラグインUltimate Category Excluderを使えば、メインページに表示したくないカテゴリの『投稿』を非表示にすることもできるので、Inline Postsと組み合わせて使うとかなり便利です。



