c-geru のすべての投稿

OSXでパケットキャプチャ

OSXでパケットキャプチャ(パケットニスファ)できそうなソフトを物色。今まではWindowsで横取り丸InetSpyを使ってたけど、Windowsマシンの調子相変わらず悪いので、この際OSXでやろうかと。で探したのが・・・

Wiresharkはアプリで、他の2つはFirefoxのアドオン。使った感じではHttpFoxが個人的には一番よさそう。パケットの中身だけチェックできればいいし、画面も見やすい。何よりアドオンは導入がカンタン。

Wiresharkはターミナル使ったり、インストールが面倒。
下記のサイトにお世話になりました。
ウチはLepard(10.5.8)だけど、この手順でOKでした。

Timer()で発生する誤差

Timerクラスを使ってのインターバル処理で音を鳴らしていたら、間隔を縮めていくとタイミングがずれてきた。ググってみると、やっぱり起こるらしい。以下、関連リンク。


ていたら、間隔ミリ秒単位の(なるべく)正確な制御は、やっぱりgetTimer()とEvevt.ENTER_FRAMEの方がいいのかな?

Arrayの落とし穴(1) – Array.sort()

表示リストのindexをArrayで管理していて、はまった罠。
var list:Array = [7,8,9,10]
list.sort()
trace(list)
—10,7,8,9
var list:Array = [7,8,9,10]
list.sort(Array.NUMERIC)
trace(list)
—7,8,9,10
Array.sort()ってデフォルトだと文字扱いでソートになるのね。いつもインスタンス名とかでsortするときは、必ず「mc00」「mc01」とか文字列(主にインスタンス名など)に使ってて、あまり数値そのもののソートをしたことないってことか…。お恥ずかしい話でした(^^;。
※一応、カテゴリをAS3.0にしているけど、AS2.0でも同じです。
[追記]2011.5.10
Arrayについて整理するため、カテゴリを追加してタイトルも変更しました。

グローとグラデーショングロー

ある人に「MovieClipに選択表示の枠線つけるのってどうすればいいか?」と聞かれて、「フィルタでやればいいのでは?」といっていろいろいじってたときに発見。プロパティタブにあるフィルタは「グラデーショングロー(GradientGlowFilter)」だけど、スクリプトにはそれとは別に「グロー(GlowFilter)」があったのね。何でプロパティパネルにないんだろう?

で、あるサンプルを見て単にnewしてるだけで不思議に思ったら、コンストラクタに初期値があるんですね。値を設定しないで使うという発想がなかったので、気づかなかった。
で、枠線をつけるためのスクリプトサンプルはこちら。ちなみにグローとグラデーショングローでは、色、アルファ値のプロパティ名が微妙に違いますのでご注意。これはグローを使っています。

btn_glow.addEventListener(MouseEvent.CLICK, onSetFilterglow);
function onSetFilterglow(event:MouseEvent):void {
//—枠線設定(グロー)
var c:uint=0x00FF00;
var a:Number=1;
var bX:Number=6;
var bY:Number=6;
var st:Number=10;
var filterglow:GlowFilter=new GlowFilter(c,a,bX,bY,st);

//枠線適用
mymc.filters = [filterglow];
}

CS4でフレームラベルエラー

flaファイルの受け渡しが必要になり先方に送信したところ、下記のエラーが出て動かないとの連絡があった。CS4/Flash Player10/Actionscript3で作成、

ArgumentError: Error #2109: フレームラベル f_intro がシーン s_intro で見つかりません。
at flash.display::MovieClip/gotoAndPlay()
at iwd_fla::MainTimeline/frame5()

もちろん動作確認しているので、フレームラベルもシーンも間違っていない。こちらでは問題なく動作するので、いろいろ調べてみたらバージョンの問題でした。こちらは10.0.2、先方はインストールしたてで10.0.0。アップデータを当てて解決。
しかしまさかgotoAndPlay()で問題が起こるとは思わなかった。flaファイルをやりとりするような作業も久しぶりなので…。
アップデートの内容については、本家アドビのFlashサポートサイトからもリンクが貼られている 野中さんの翻訳を参照。下記です。

フィルタの値を加算する

フィルタをいじっていて、加算するときはどうするのかと疑問が。例えば0〜30までblurをかけるときは、数値(下記の場合はval_x, val_y)を可変にして・・・

var filter:flash.filters.BlurFilter = new flash.filters.BlurFilter();
filter.blurX = val_x;
filter.blurY = val_y;
filter.quality = 1;
mc.filters = [filter];

を繰り返せばいいのだけれど、既に設定されているblurに対して加算する場合はどうするか?それに・・・

mc.filters = [filter];

だとblur以外のフィルタが設定されていた場合は消えてしまうわけだし。で、考えてみた関数がコレ。

//ぼかし処理(加算)
function xAddFilter_blur(mc:MovieClip,val_x:Number,val_y:Number):void {
var array_filter:Array = mc.filters;
var exist_blur:Boolean = false;
var filter:flash.filters.BlurFilter;

for (var i:int = 0; i<array_filter.length; i++) {
var wObj_filter:Object = array_filter[i];
if (wObj_filter is BlurFilter) {
exist_blur = true;
var current_blur:Number = isNaN(wObj_filter.blurX) ? 0:wObj_filter.blurX;
filter = new flash.filters.BlurFilter();
filter.blurX = current_blur + val_x;
filter.blurY = current_blur + val_y;
filter.quality = 1;

array_filter.splice(i,1);
array_filter.push(filter);
mc.filters = array_filter;

break;
}
}

if (! exist_blur) {
filter = new flash.filters.BlurFilter();
filter.blurX = current_blur + val_x;
filter.blurY = current_blur + val_y;
filter.quality = 1;

array_filter.push(filter);
mc.filters = array_filter;
}
}

mc.filtersの中にあるフィルタの種類をどうやって判断するのかな〜と考えていたら、is がありましたね。AS2.0なら instaceof。

if (wObj_filter is BlurFilter) {

あとは他のフィルタを上書きしないことと、BlurFilterがない(設定されていない)場合を考慮すればOK。

なんか今更だけど、備忘録として。

PlaneのMaterialに設定したムービークリップを参照する

ひとつ前のポストに関連してるけど、PlaneのMaterialに設定(適用)したムービークリップ(以下、mc)を参照できるかなと(注:targetPlaneはPlaneオブジェクトです)・・・

 trace(“targetPlane”,targetPlane.material);

とやると・・・

targetPlane Texture:s02 lineColor:0 lineAlpha:0

と出てくるので、

 trace(“targetPlane”,targetPlane.material.Texture);

とすると、

1119: 未定義である可能性が高いプロパティ Texture に静的型 org.papervision3d.core.proto:MaterialObject3D の参照を使用してアクセスしています。

とエラーになってしまう。lineColorとlineAlphaは参照できるのに、何で??
いろいろ調べたら、事前にmaterialを配列化しておいて、そこから参照する方法があった。
例)配列に保存

var material:MovieAssetMaterial = new MovieAssetMaterial(name_slide,true,true,false,true);
//後からMovieAssetMaterialのmcを制御するためにリスト化
array_materials.push(material);

例)参照するときには配列から取り出す

for (var i:int = 0;i<array_materials.length;i++) {
var mc:MovieClip = array_materials[i].movie as MovieClip;
mc.content.gotoAndStop(1)
}

一応コレで出来るんだけど、どうして参照が出来ないのかが納得できない。
何か大きな勘違いをしているような気もするけど・・・・。
ちなみに上の方法は下記サイトにて発見。感謝。

MovieAssetMaterialで適用したmcから上の階層への参照

またしてもPapervison3Dネタで。

PlaneのMovieAssetMaterialに適用したムービークリップ(以下、mc)の中に書いたスクリプトで、上の階層を参照しようとしたらnullが返ってきた。materialで使ったmcは、あくまで3Dオブジェクト(Plane)の素材なので、階層からは切り離されているってことなのかしらん。予想としては・・・

Scene3D > DisplayObject3D > Plane > MovieAssetMaterial

みたいになるのではと思っていたんだけど。
仕方がないのでPlaneを生成したときに、そのクラスからrootのオブジェクトを渡しておいて、mcからはそれを使って参照するようにした。抜粋すると、こんな感じ。
例1)Planeを生成するクラス

var name_slide:String = “panel”;

var material:MovieAssetMaterial = new MovieAssetMaterial(name_slide,true,true,false,true);
var mc:MovieClicp = material.movie as MovieClip;
material.xSaveObj_root(obj_root);

例2)MovieAssetMaterialで使用されたmc

var obj_root:Object;
function xSaveObj_root(obj:Object):void {
obj_root = obj;
}

一応これでmc側からrootにアクセスできるようになった。もっと簡単な方法はないのかな?

iPhone:実機にAppが送れない

昨年iPhoneデベロッパー登録して、ようやくぼちぼちいじってます。で、デバイス(実機)での確認テストをしようとして躓いた点。

この辺のサイトを参考にしつつ、一通り設定してビルドするも下記のようなエラーが出ます。

Code Sign error: Provisioning profile ‘XXXXXX’ specifies the Application Identifier ‘com.XXXX.*’ which doesn’t match the current setting ‘com.yourcompany.Counter’

ググってみたら、このサイトで・・・

3. プロパティの項目にある識別子にApp IDで設定したApp ID name(10文字)を除いた残り 例えばcom.domainname.*の場合はcom.domainname.${PRODUCT_NAME:identifier}とする。


てな記述を見つけ、「プロパティって、何のプロパティ???」と思いつつ調べてみたら、info.plistの中にある「Bundle identifier」のことでした。ここの指定が「プロジェクト」>「プロジェクト設定を編集」から「ビルド」を選んで、Code Signing>コード署名 ID>Any iPhone OS Device で指定した「Provisioning」で指定したデベロッパー名と合ってないといけないようです。さらに調べると、plistってプロパティリストと呼ばれるファイルだそうで、だから上の引用で「プロパティ」って書いているのね・・・。この辺をみると、OSX独自のファイルのようです。


Xcodeというか、CもObject-Cもよく知らないので、なかなかハードル高いです。きっと同じ目に遭う人がいると思うので(^^;、書いておきます。以下、参考にしたサイトです。感謝。

[追記]後からよく見たら、我が参考書「iPhone SDKの教科書」にバッチリ出てました(P195)。さすが!…っていうかよく読めよ(T_T)。

Materialで使用するmcで、アニメーション中に位置がずれる

PlaneのMaterialに適用したmcで、アニメーションで(0,0)より左(xのマイナス方向)にオブジェクトが出てくるとPlaneのx方向の位置がずれる事象が発生。マスクされていて、オブジェクトが(0,0)より左に表示されなくても、置いてあるとダメ。はみ出した分だけ、xの正方向にずれる。つまりmcに含まれるオブジェクトで一番左が原点になるようにmcが動いている感じ。何でだ?
MovieAssetMaterial、MovieMaterialのどちらでも発生。
たぶんカメラを等倍設定(camera.z = -(camera.zoom * camera.focus);)にしているので、カメラの位置がずれるのかな・・・と気がするけど、現時点では対処法わからず。とりあえず(0,0)より左にはオブジェクト配置しないようにすることで対処。