Posted by yamada on 2010/05/24 – 09:00
Filed under AS3, Flash
Tagged as AS3, Flash, 正規表現
スコッ..
ガリガリ順調にコーディングしていたところを、ActionScript3 正規表現周りのヘルプのミスリードでスコッっと足下をすくわれたので、メモしておきます。
正規表現リテラルと正規表現クラス
“2009/03/01″という日付文字列をマッチさせたいと思って作った正規表現パターンはわかりやすくシンプルなモノだと “/\d\d\d\d/\d\d/\d\d”となるわけですが、これを例にしてみます。
まず、下記のコードは問題無く動作します。
1
2
3
4
| // 正規表現リテラルの使用例
var str:String = "2009/03/01";
var re0:RegExp = /\d\d\d\d\/\d\d\/\d\d/;
trace( re0.test( str ) ); // true |
で、オンラインヘルプによると、正規表現リテラルと同じようにRegExpクラスのコンストラクタで設定できる、とのことなので、書きのようなコードに変えてみました。
1
2
3
4
| // RegExpクラスコンストラクタの使用例:失敗パターン
var str:String = "2009/03/01";
var re0:RegExp = new RegExp("\d\d\d\d\/\d\d\/\d\d"); // ←ここを変えた.
trace( re0.test( str ) ); // false |
すると、結果がfalseになってしまいます。
早速結論を言ってしまうと、当たり前ですが「RegExpのコンストラクタに渡すパターンは文字列リテラルなので、正規表現リテラルとは違うエスケープを施さないと行けない」ということです。
RegExpクラスを使う場合、上記例の正しい書き方は以下のようになります。
1
2
3
4
| // RegExpクラスコンストラクタの使用例:成功パターン
var str:String = "2009/03/01";
var re0:RegExp = new RegExp("\\d\\d\\d\\d/\\d\\d/\\d\\d");
trace( re0.test( str ) ); // true |
違いは2箇所です。
- 正規表現の”\”を残すためにエスケープする。(”\”→”\\”)
- 正規表現区切りと同じ”/”につけていたエスケープははずす。(”\/”→”/”)
一度分かってしまえば簡単なんですが、気づかないでいきなりRegExpコンストラクタの方を使うと、私のようにはまります・・。
あの人も!
ちなみに、Flasherの間では有名なkamijo さんのblogエントリ「AS3 と正規表現 – akihiro kamijo」でも、同じ感じで意図通りに動作しないコード書かれています。はまりやすいんですね。

本当は、ここは”d+”と出力されます。
RegExp.source
AS3の正規表現クラス RegExpにはsourceというパラメータがあります。
これはそのクラスが持っているパターンを文字列で出力してくれるモノで、デバッグに便利です。
1
2
| var re0:RegExp = new RegExp("\\d\\d\\d\\d/\\d\\d/\\d\\d");
trace( re0.source ); // \d\d\d\d/\d\d/\d\d |
RegExpに文字列で渡したパターンが正しく正規表現パターンとなっているか不安になったら、このパラメータでチェックすると良さそうですね。
ズコッ..
と、ここまで書いて、アップする前に確認してみよう、と思い、最初のヘルプをよく読んでみたら最後の最後に、そういうことを書いていた箇所がありました!
また、new コンストラクタによる正規表現定義の中で、円記号(¥)から始まるメタシーケンス(任意の数字を意味する ¥d など)を使用する場合は、次のように円記号を二重に入力する必要があります。
今日の教訓:ヘルプは最後まで読みましょう。
[AD]
↓オライリーの正規表現本。これで勉強しよう!

詳説 正規表現 第3版
著者/訳者:Jeffrey E.F. Friedl
出版社:オライリージャパン( 2008-04-26 )
定価:¥ 5,040
Amazon価格:¥ 5,040
大型本 ( 528 ページ )
ISBN-10 : 4873113598
ISBN-13 : 9784873113593
↓ミスリードをさせない文章の書き方は重要ですね。
↓デキる人の言い回しが気になる今日この頃なんです。

デキる人は「言い回し」が凄い (角川oneテーマ21)
著者/訳者:日本語力向上会議
出版社:角川学芸出版( 2010-02-10 )
定価:¥ 740
Amazon価格:¥ 740
新書 ( 181 ページ )
ISBN-10 : 4047102253
ISBN-13 : 9784047102255
Posted by yamada on 2010/05/21 – 09:00
Progressionを使い、とある大規模プロジェクトでFlashコンテンツ制作したのですが、特定環境で発生した問題には戸惑いました。
PPC Mac only!
その問題が発生する環境とは「PowerPC Macでのみ発生」というもの。
ちょっと調べてみたところ、確かにブラウザやFlash PlayerやOSのバージョンは関係なく、本当にただPowerPC Macである、というだけで発生するのです。
具体的な症状は、ProgressionのメソッドであるAddChildで配置するパーツが配置(表示)されない、という現象。
しかも、「一つも AddChild出来ない」というわけではなく、ある特定のパーツ以降で発生する。
なんだか、メモリリークのにおいプンプンである。
ググれ!きっと先人がいるはず!
で、ググりにググってみたところ、同様の症状について言及されいてるページを発見した。
この方によれば、「new AddChildを、コンストラクタのaddChildに変更すると正常に動作する」とのことで、たしかに、コマンドリストにnew AddChildしていた箇所だったのでそのコードを以下のように変更してみました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| /*
// Progression標準的コード.
addCommand(
new AddChild( partsRoot, _partsA ),
new AddChild( partsRoot, _partsB ),
new AddChild( partsRoot, _partsC )
};
*/
// PPC Mac対応コード.
partsRoot.addChild( _partsA );
partsRoot.addChild( _partsB );
partsRoot.addChild( _partsC );
_partsC.initOnAdded(); // ←必要に応じて初期化メソッド呼び出し. |
AddChildしてた箇所を全てこのようにしたところ、問題は発生しなくなりました!
かなり規模が大きいプロジェクトだったので同様なコードはかなりあり、それぞれ動作確認を取るのも結構大変でしたが、大抵これでうまくいくと思います。
それでも、便利なProgression
まさかのこの問題では手こずりましたが、このプロジェクトで初めて使ったProgression、総じてかなり便利でした。
クラスとかの構造もわかりやすかったので、自前でラッパークラスをつくり、便利に使いました。
使用していたProgressionのバージョンは3.1.62でしたが、最新版では直っていたりするのかな?
[AD]
↓最近発売されたオフィシャルProgression本!バージョン4にも対応、とのことで、これからProgressionやるなら必携!

ProgressionによるFlashコンテンツ開発ガイドブック
著者/訳者:阿部貴弘 池田泰延 楢山哲弘 松竹 誠 山上健一
出版社:毎日コミュニケーションズ( 2010-04-28 )
定価:¥ 2,940
Amazon価格:¥ 2,940
単行本(ソフトカバー) ( 312 ページ )
ISBN-10 : 4839931798
ISBN-13 : 9784839931797
↓今までの歴代Macが載っているらしい。話が通じる人と呑むときにこの本があれば酒も進みそう!

Macintosh名機図鑑 (エイムック 1512)
著者/訳者:大谷 和利
出版社:エイ出版社( 2008-03-24 )
定価:¥ 1,260
Amazon価格:¥ 1,260
単行本 ( 157 ページ )
ISBN-10 : 4777909921
ISBN-13 : 9784777909926
Posted by yamada on 2010/05/20 – 09:00
Shift_JISを使うように設定している状態で、Macで動作させているときのみ通信時に処理する文字コードが化けることがあり、調べて見たところShift_JISの仕様の差違が原因で発生していた問題でした。
ちょっと原因と対応が複雑だったので、まとめてメモしておきます。
バグの症状について
発生する問題は「WindowsとMacで通信するときに送られる文字が違い、特定の環境で特定の文字のみが化ける」というものです。
私の遭遇したケースは、以下のような状態でした。
- Mac OS Xで、FlashからPostメソッドで送信したデータに含まれる特定の文字が化ける
- 特定の文字は「ー(全角ダッシュ)」「~(波ダッシュ)」
- Flash上の表示、traceで確認する内部データは問題なし
- Windowsでは問題なし
- System.useCodePage = true; とし、Flashで通信はShift_JISを使用
つまり、「MacのFlashから送信するときにのみ何かおかしくなっている」という状況でした。
バグの原因
現在のFlashは内部は UTF-8を使用しているので、なんとなくShift_JISに変換しているところに問題がありそう、と予想は出来ました。参考:http://kb2.adobe.com/jp/cps/228/228624.html
結局、原因は、Shift_JISには亜種が多数存在していること、でした。
おそらく、FlashPlayerはUTF-8からShift_JISに変換するのに、OS依存のライブラリを使っているのだろう。それがWindowsと Mac OS Xで違う挙動をしているため、送信されたデータの文字コードが変わってしまうのだ。Flash Playerがその変換ライブラリを固定で内部に持っていてくれたらいいのだけど、それではAIRとかで問題が発生することになるかもしれない。 Shift_JISを使ってマルチプラットフォームとかやるもんじゃないね、と再確認されました。
バグへの対応
原因は分かって、いざ対応!というところですが、原因が原因なのでOSを判定し、送信前に文字コードを変換するしかありません。
どの文字コードをどのように変換すべきか、というのは下記のページにわかりやすくまとめられていました。

ちょっと文字コードを出力しつつ調べて見たら、Macの場合にはCP943に自前で変換すれば良さそう、というところまで分かりました。
で、今回私の遭遇した問題に対しての対応では、下記のようなコードで変換し、問題を回避しました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| var strInput:String; // 送信したい文字列.
var lenStr:int = strInput.length;
var strPost:String = ""; // POST用に変換した文字列.
for ( var i:int = 0; i < lenStr; i++ ) {
var curCode:int = strInput.charCodeAt( i );
if( isMac ){ // Mac OS Xの場合のみ、以下の変換処理.
switch (curCode) {
case 0x2015: curCode = 0x2014; break; // 0x815C:EM DASH EMダッシュ.
case 0xFF5E: curCode = 0x301C; break; // 0x8160:WAVE DASH 波ダッシュ.
case 0xFF0D: curCode = 0x2212; break; // 0x817C:MINUS SIGN 全角ハイフン.
}
}
strPost += String.fromCharCode(curCode);
} |
上記コードで変換している文字コードをまとめたテーブルも添付しておきます。
その他の可能性
ちなみに、FlashでShift_JISを使用していると発生する問題は他にもあります。
以前書いたエントリへリンクを張っておきます。
[AD]
↓WEB+DB PRESS plusシリーズで文字コード本が出てるのか!波ダッシュ問題も載ってるようだし、これは良さそう!
↓文字コードに関する本では、こちらも評価が良いみたい。

文字コード超研究
著者/訳者:深沢 千尋
出版社:ラトルズ( 2003-07 )
定価:¥ 3,129
Amazon価格:¥ 3,129
単行本 ( 614 ページ )
ISBN-10 : 4899770510
ISBN-13 : 9784899770510
↓上記のような問題を抱えているときに心が和む。か、もっと苛立つかw、そんなおもちゃ発見!
Posted by yamada on 2010/04/23 – 18:00
Filed under AS3, Flash
Tagged as AS3, Flash
Flash Optimizer
Flash Optimizerというのを見つけた。swfのサイズを最適化してくれるものらしい。
無料の試用版があったのでダウンロードして使ってみました。
が!試しに読みこませたswfがフィルターを使っていたので、これを外していいか?というダイアログが表示された。

ダメダメ!そんなのダメですよ!と、「いいえ」を押すと、そのswfファイルの最適化は行われない。。
フィルタの設定には手を付けないでよ、という設定も、ちょっと見てみたところ出来ないようだ。
がっかりしつつアンインストールしました。
フィルタ無視して最適化する設定がどこかにあったのかなー。知っている人いたら教えてください。
やっぱり自力で。。
やっぱりいろいろな本を読みつつ、自分で何とかするしかないですかね。
Flash Hacks

Flash Hacks ―プロが教えるテクニック&ツール100選
著者/訳者:Sham Bhangal
出版社:オライリージャパン( 2005-07-11 )
定価:¥ 3,780
Amazon価格:¥ 3,780
単行本(ソフトカバー) ( 516 ページ )
ISBN-10 : 4873112354
ISBN-13 : 9784873112350
2005年発売だからAS3に関する情報は無いですが、コードに関わらないFlashのグラフィックスなどの最適化についてはいろいろ載ってそうで、ちょっと目を通しておきたいかな。
9章 パフォーマンスと最適化
65. Flashファイルの肥大化への対処
66. 複雑なサイトのための帯域幅のテスト
67. 低品質な設定のカモフラージュ
68. パフォーマンスを向上させるグラフィックの最適化
詳説 ActionScript 3.0

詳説 ActionScript 3.0
著者/訳者:Colin Moock
出版社:オライリージャパン( 2008-11-22 )
定価:¥ 6,090
Amazon価格:¥ 6,090
大型本 ( 1044 ページ )
ISBN-10 : 4873113873
ISBN-13 : 9784873113876
あとは、こちらの本でActionScript3周りをしっかり固めておけばいいかな。
ガベージコレクションやE4Xについても章が割かれているから結構良さそう。
14章 ガベージコレクション
15章 ダイナミックなActionScript
16章 スコープ
17章 名前空間
18章 XMLとE4X