These pages are written by only Japanese.

Welcom to My Diary.com
最新の日記タイトル一覧カテゴリ別タイトル一覧トップへ戻る〜

こんにちは♪ 現在は5月4日(土)15時16分。 TeaBreakにしましょうか?


hns - 日記自動生成システム - Version 2.19.5 (色々 Fixed)

先月 2011年02月 来月
01 2 03 04 05
6 7 08 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
Namazu for hns による簡易全文検索です。
詳細は 詳細指定/ヘルプをご参照下さい。
検索式:

2011年02月01日(火)

SWF Shape サイズ削減(2)

の続き この件、修正しました。

ここまで学習した事:

  • 0 しかない値は numBits を 0 にして値を無展開で OK
  • StyleChangeRecord の座標は MoveDeltaX,Y だが Delta でなく絶対値っぽい
  • NewStyle は Add でなく Replace の動きをする。(StyleChangeRecord の index 値に注意)

パッケージ:

課題:

デフォルメ処理頑張ります。

2011年02月03日(木)

swfed 0.29 replaceShapeData リリース

以前より要望のあった、getShapeData, replaceShapeData を実装して 0.29 でリリースしました。 さりげなく getTagContentsByCID, replaceTagContentsByCID も実装してます。
これを活用すると、replaceJPEG,GIF,PNG 系の処理をかなり軽く出来ます。

ShapeData API:

以下のような Flash ファイルがあるとします。(貰いものなんですが)

A の Shape の上に B の Shape が乗っかっています。
お好きなツールでダンプします。
ツールをお持ちで無い時は、以下の URL に SWF ファイルを投げ込んで下さい。 例えば、swftools についてくる swfdump は以下のように表示します。
awm.jp:~/swfed-0.29% swfdump a+b.swf
[HEADER]        File version: 4
[HEADER]        File size: 511
[HEADER]        Frame rate: 12.000000
[HEADER]        Frame count: 1
[HEADER]        Movie width: 240.00
[HEADER]        Movie height: 240.00
[009]         3 SETBACKGROUNDCOLOR (ff/ff/ff)
[002]       220 DEFINESHAPE defines id 0001
[027]         4 DEFINESPRITE defines id 0002
[01a]         6          PLACEOBJECT2 places id 0001 at depth 0001nbits =0, line=866
[001]         0          SHOWFRAME 1 (00:00:00,000)
[000]         0          END
[01a]         9 PLACEOBJECT2 places id 0002 at depth 0001nbits =10, line=866
[002]       206 DEFINESHAPE defines id 0003
[01a]         9 PLACEOBJECT2 places id 0003 at depth 0003nbits =11, line=866
[001]         0 SHOWFRAME 1 (00:00:00,000)
[000]         0 END
DEFINESHAPE(ベクター情報のタグ) は id 0001 id 0003 の2つある事が分かります。
試しに id 0001 の Shape を取り出して id 0003 の Shape に上書きしてみます。
awm.jp:~/swfed-0.29% php ./swfgetshapedata.php a+b.swf 1 > 1.shape
awm.jp:~/swfed-0.29% php ./swfreplaceshapedata.php a+b.swf 3 1.shape > 3.swf

B が A に入れ替わりました。\(^o^)/

制限事項:

  • ビットマップ画像を張り付けたケースには対応してません。
  • サイズが変わった場合に、どうずれるのか分かりません。

C言語クイズ:

C言語クイズint a=1;func(a);printf("%d,a");void func(int x)内のコードを書いて、
このprintfで2を表示させるのじゃ。printfの書き換えは禁止で、各自の環境で動けば正解
どうという事もなく。
#include <stdio.h>

void func(int x) {
    *(&x + 8) = 2;
}
int main(void) {
    int a=1;
    func(a);
    printf("a=%d\n", a);
}

結果:

awm.jp:~/prog/c% ./a.out
a=2
Intel 32bit Linux マシンで試しました。別の環境だと + 8 を変えないとダメかも。

+ 8 の調べ方:

a は自動変数で x は引数なので、両方スタックにあるはず。
各々のポインタ値(アドレス)を調べる。
void func(int x) {
    printf("&x=%p\n", &x);
}
int main(void) {
    int a=1;
    func(a);
    printf("&a=%p\n", &a);
}
awm.jp:~/prog/c$ ./a.out
x=0xbf9e7350
a=0xbf9e7370
a の方が 0x20 大きい。32bit 機なら int は 4byte なので 0x20/4 = 8
*(&x + 8)
で、a 相当のアドレスの場所を書き換えられる。
それだけ。
引数がレジスタウィンドウに乗ったりして厄介な sparc でなくて良かったw (-O0 でなんとかなるのかなぁ)

2011年02月04日(金)

SWF Shape デフォルメ機能

Flash SWF ファイル内のベクター(Shape)情報から細かい描画を省略する実験です。
100KB 制限の Flash Lite だと 1byte でも削りたいですし。別に Lite でなくても転送量は極力減らしたいですから。

戦略:

  • カーブで一定より短いものは直線にする
  • 線分リストの先頭の先端から一定距離内の線分を1つの線分にまとめる
  • 先端から一定距離以上になったら、その次の線分から同じ事を繰り返す

プログラム:

deforme function
pure PHP でバイナリから描画データを切り出して再構築してます。
アホですね。はい。

元Flash:

適当な SWF を利用。何処から持ってきたかは忘れました。
awm.jp:~/IO_SWF% swfdump bloxorz.swf | grep "File size"
[HEADER]        File size: 3166474

文字の形に注目です。

実験0:

実は、描画データを削らずに、ただ再構築しただけでも少しサイズが減ります。
awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 0 > t-0.swf
awm.jp:~/IO_SWF% swfdump t-0.swf | grep "File size"
[HEADER]        File size: 3166369
100byte も変わりませんが。

実験1:

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 100 > t-100.swf
awm.jp:~/IO_SWF% swfdump  t-100.swf | grep "File size"
[HEADER]        File size: 3160652|<

形が崩れてますが何とか読めます。5822 byte削れました。

実験2:

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 1000 > t-1000.swf
awm.jp:~/IO_SWF% swfdump  t-1000.swf | grep "File size"
[HEADER]        File size: 3157203

小さい文字が消えてしまいました。
9271byte 削れましたが、これじゃダメです。

実験3:

awm.jp:~/IO_SWF%php sample/swfdeformeshape.php bloxorz.swf 10000 > t-10000.swf
awm.jp:~/IO_SWF% swfdump t-10000.swf | grep "File size"
[HEADER]        File size: 3151985

もはや文字が全部見えなくなってます。サイズ以前に完璧NGです。

TODO:

文字が消えるのは閾値の問題なので仕方ないとして、文字の崩れ方が不自然です。
線分の短い順に隣の(角度の似てる)線分に吸収させる方法で作り直してみます。

2011年02月05日(土)

SWF Shape デフォルメ機能(2)

デフォルメ方法を改善しました。 deformeShapeRecordUnit_2 参照

戦略:

  • 旧) 線分リストの先頭から一定距離内の線分を吸収していく
  • 新) 線分リストのうち短い順にひとつ手前の線分に吸収していく

結果:

元Flash の SS

awm.jp:~/IO_SWF% swfdump bloxorz.swf  | grep "File size"
[HEADER]        File size: 3166474
awm.jp:~/IO_SWF% php sample/swfdeformeshape.php bloxorz.swf 1000 > t2-1000.swf
awm.jp:~/IO_SWF% swfdump t2-1000.swf  | grep "File size"
[HEADER]        File size: 3164687
サイズは、あまり減らないけど。

見た目は維持できるので実用的。

TODO:

線分を吸収する際に隣合う2つの線分のうち角度の近い方に吸収させる。

spamassasin 再学習

判定の精度が悪くなってきたのでクリアして学習し直し。

local.cf:

設定見直し。
awm.jp:~# vi /etc/spamassassin/local.cf
# 2011/02/05 added
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
bayes_ignore_header X-Spam-Report
bayes_ignore_header X-Spam-Checker-Version
bayes_ignore_header X-Becky-Status
bayes_ignore_header X-Virus-Scanned
bayes_ignore_header Delivered-To
bayes_ignore_header X-Original-To
awm.jp:~# /etc/init.d/spamassassin stop
Stopping SpamAssassin Mail Filter Daemon: spamd.
awm.jp:~# /etc/init.d/spamassassin start
Starting SpamAssassin Mail Filter Daemon: spamd.

sa-learn:

awm.jp:~% sa-learn --clear
awm.jp:~% sa-learn --spam --mbox  _SPAM
awm.jp:~% sa-learn --ham  --mbox  20??

参考:

PHP vld インストール

Zend 命令を調べるのに apc や eaccelarator が cache したイメージを読む。
という遠回りな事をしていたけど、vld を使えばダンプ出来るのを知って早速インストール。
awm.jp:~# pecl install channel://pecl.php.net/vld-0.10.1
<略>
Build process completed successfully
Installing '/usr/lib/php5/20060613+lfs/vld.so'
install ok: channel://pecl.php.net/vld-0.10.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=vld.so" to php.ini/PRE

使い方:

php -dvld.active=1 -dvld.execute=0 -f test.php
<略>
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   5     0  >   EXT_NOP
   7     1      EXT_STMT
         2      ASSIGN                                                   !0, '332700380566123'
   8     3      EXT_STMT
         4      CAST                                             ~1      !0
         5    > RETURN                                                   ~1
   9     6*     EXT_STMT
         7*     RETURN                                                   null
         8*   > ZEND_HANDLE_EXCEPTION

branch: #  0; line:     5-    9; sop:     0; eop:     8
path #1: 0,
End of function foo.
これは楽ですね。

参考:


2011年02月08日(火)

[SWF] DefineBitsJPEG erroneous header

こちらで、SWF DefineBitJPEG の erroneous header について触れられていたので、折角なので補足します。

経緯と推測:

  • SWF v8 未満では仕様書で定義されていない
    • 仕様に無いけど Flash Lite の世界では erroneous header のノウハウが流通していた
  • SWF v8 の仕様書で errorneous header の定義が追加された
    • 但し「before version 8 of the SWF file format, could contain an errornous header」と限定。
といった流れです。 v8 未満に限定する所からして、以下の観点でのなし崩し的な追加だと思われます。
  • 現状追認
  • Flash Lite での処理性能重視
  • SOI+EOI で行けるという噂もあるけど表示できない処理系があるので、EOI+SOI を明記した方がベター。

取りうる対応:

上記ブログの通りに、
  • version8 未満では errornous header を追加
  • version8 以降では JPEG chunk 入れ替え
が正しいと自分も思います。
仕様に明記されてなかった頃(v7以前)に実装された Flash Lite Player が心配ですが、 仕様を後付けした以上、Adobe さんも過去の処理系で検証してるでしょうし、自分が昔の携帯端末で実験した限りでも errornous header で失敗する例は見つけられなかったので、実質的に問題ないはずです。

個人的な話し:

自分がサービスやライブラリを開発する時は、過去の仕様に respect して全部 chunk 入れ替えしてましたが、見直そうと考えています。
JPEG の chunk 分解は byte の値を scan する必要があって重たいんですよね。。
scan する必要のある Image 系 chunk が一番最後なのを仮定すれば、scan しなくて済みますが、世の中の (Flash Lite の) SWF が errornous header に傾くなら、それに合わせた方が良いと考えています。

更に蛇足:

以上、推測が多くて済みません。
本当の事情は Adobe の中の人に聞かないと分かりませんが、実際に聞いたら色々話せない事が出てきそうなので、アプローチはしてません。コネないし。^^;

Facebook には実名(っぽい名前)で登録しましょう

実名っぽくない名前のアカウントは警告無しでbanされる事があるらしい。
実名使う規約なので当然といえば当然ですけど。
(警告したら偽名で登録されるだけですし)
僕は、よやが実名なので問題ないです。(キリっ ……gkbr 通報しないでつかぁさい。

2011年02月12日(土)

Zend Engine 勉強会、直前準備

の準備中。
実名リストだけ渡せば GREE さんが全てやってくれるみたいだけど、 頼り切るのは悪いので、なるべく自分で把握して進めてる。

会場準備:

  • ビルに入る人の名前一覧、看板の場所指定、受付人数。
    • 名前一覧はあいうえお順にしておく、でないと受付が大変。
    • 入館証が人数分必要。当日、事前にビル管理取りに行く。(GREEの中の人にお願い)
    • 一覧にない人(例えば、直前に参加登録した人)はゲストカードを使うらしい。(これも中の人に頼む?)
  • 看板表示のA3紙を用意。(挟み込むので上質紙とかが良い)
    • ZendEngine の文字に、ATND に張った絵、あと12階GREEセミナールームって書けば多分OK
  • 無線の申請。(SSID 名希望したら、その文字を付けてくれる)
  • UST (交渉中。カメラと有線LANは貸してくれるとの事) 私物の MacBook もってく。
  • お手洗いの場所確認。(地図作らないと)
  • 受付時間。19:30-20:00 は短すぎたので後で訂正しよ… 遅れてくる人多いので 19:30-20:30 にすべき。

懇親会準備:

  • ピザ注文。(遅れる可能性を考えて)30分前に会場に着く指定で。(冷まさない為の保温シートを探す)
  • ピザの受け取り場所が関係者しか入れないらしいので、GREE の中の人にお願いする。
  • アルコール飲み物の予約。(量が多いので買い出しは無理)
  • お菓子の準備。ソフトドリンクの準備。(買い出し、GREEさんの冷蔵庫を借りる)
  • 建て替えのお金を用意する。(今回は懇親会開始時にお金を集めるので、支払に間に合わない)

自分の準備:

  • 挨拶の資料(案内とか注意とか諸々も混み)。
  • 予備用 LT 資料。本枠で使わなければ懇親会で。
  • 懇親会の冒頭の資料(懇親会の挨拶混み)

その他:

  • 中の人や中じゃない人に手伝いお願いしてるので、具体的に何するか頼む。(会場設営、案内、ケータリング、タイムキーパー。その他…)
  • そういえばカンファレンスではカードみたいなのぶら下げたりするけど、どうしよう。

2011年02月16日(水)

ZendEngine勉強会@東京

勉強会、無事に終了しました。
発表のレベルは高いし、運営メンバーは自発的に動いてくれるし、 聴きに来た人達も積極的な感じで、主催者として非常に助かりました。
最後、時間が余ったので moriyoshi さんに LT やってって無茶ぶりしたら、 即興で発表してくれたのには感動しました。恰好良よすぎです。
以下、主催者の観点でのまとめ。というかメモ書き。

まとめ:

発表:

参加人数:

参考までに。
  • ATND: 参加登録 100名(当日cancel20名)、うち 64名懇親会○
  • 実際: 参加46名、うち、18名懇親会参加
そんな訳で、懇親会をケータリングの立食形式にして良かったです。
飲み屋に予約して怒られるより、自分の財布が頑張る方が気が楽。

はじめに反省:

  • 開始が遅すぎた。20時開始は無いですよね。19時からが良いかも。
  • 水曜日で良かったのだろうか。仕事で来れなくなった人が沢山いたみたい。
  • 運営メンバーへの仕事割振りが当日になった (負担かけて御免なさい)
  • カンペ作ってたのに、まともに司会出来なかったです。
  • Twitter 以外でも告知すれば良かったかも。
  • ピザやドリンクが届いた時や遅れてきた人からの電話を受けて走り回ってみましたが、主催があちこち移動するのはマズいですね。
  • ゴミの分別を説明する紙を作るの忘れました。。
  • 〆の挨拶でうまく話せなくて、他の人に頼んじゃいました。
猛省して次回に生かします。

調査:

  • 会場探し。(プロジェクタと無線LANは必須)
  • 何処で告知するか
  • 勉強会のメッセージを考える。
  • 懇親会の方式検討 (飲み屋へ移動か、その場で立食か)
  • 何曜日の何時が良いか。
  • 何人募集するか(会場のキャパ的な問題)
  • 発表の募集タイミング。(発表者の都合で日程を決めるか、日程決めてから募集開始するか)

準備:

  • 会場の予約。設備の確認。無線LANの依頼。
  • 運営メンバー募集。
  • Twitter で反応してくれた人に発表依頼。発表スケジュール作成。
  • お釣り用の5000円札、1000円札を大量に用意。
  • UST 機材の準備。今回は macbook内蔵カメラ。
  • ケータリング注文。Webで注文して電話で細かい指定。
  • ピザ(10分割にした)、ドリンク(アルコールとそれ以外と)、お菓子。
  • ピザの保温用に新品のレスキューシートを準備
  • ドリンクを冷やせるように冷蔵庫利用の許可を取る
  • 紙皿、プラスチックのコップの買い出し
  • 案内板に張る紙(A3縦)を作成
  • 参加者名簿作成。(難読名はふりがなを付けつつ、あいうえお順に並べる)

運営メンバー:

思った以上にやる事ありました。手伝ってくれた人達に感謝。
  • ビル入口受付 2人 (3人頼みましたが、2人で捌けました)
  • 会場設営 4人
  • タイムキーパー 1人
  • UST 2人 (準備は2人、中継は1人で)
  • ケータリング受け取り 4人
  • 懇親会受付 2人
殆どオンラインで相談や調整が出来たのは、皆さんのスキルの高さ故だと思います。

当日:

  • 会場の直前下見。現状復帰レベルの確認。
  • ビル入り口仮設受付の話が通ってる事を、ビルの人に再確認する。
  • 1時間前に会場設営に向かう。
  • 仮設受付をお願いする。
  • 案内板に紙を貼りまくる。(挟み込む形式)
  • 会場設営の確認。
  • 発表者のPCとプロジェクタの接続確認
  • 開催の宣言&挨拶
  • 司会 (発表&LT)
  • 勉強会終了の挨拶と、懇親会の案内
  • 司会 (懇親会LT)
  • 懇親会終了宣言 (うまく話せず、他の人に助けて貰いました。ごめんなさい)
後は、来た電話に応じて必要なアクションを取りました。

後片付け:

  • ゴミの片付け。
  • セミナールームのレイアウトを元に戻す。(ある程度までしか出来ないのは、先に断りました)
  • 名簿のチェック。(余った入館証をビル管理の人に返すので数が合うか)
  • トゥギャッターのまとめ貰ったり。
あ、UST で録音して貰ったの編集してない。後で頑張ろう。

2011年02月18日(金)

swfed 0.30 GIF透明色 bugfix

透明色を含まない GIF89a を replaceGIFData に渡した場合に、colortable 256個目の色が透明になる不具合を修正しました。 あと、0.29 は VERSION マクロを更新し忘れていて php -i で 0.28 と表示されるので、0.30 に更新するのをお勧めします。(混乱させてすみません)

swfed/trunk/src/swf_gif.c:


/*
 * getTransparentIndex
 */
int getTransparentIndex(SavedImage Image) {
    int i;
    unsigned char transparent_index = -1; // ☆チェキ☆
    if ((Image.ExtensionBlockCount == 0) || (Image.ExtensionBlocks == NULL)) {
        return -1; // ☆ GIF97a は大丈夫 ☆
    }
    for (i = 0 ; i < Image.ExtensionBlockCount ; i++ ) {
    	if (<透明色情報が見つかったら>) {
	    transparent_index = <透明色インデックス>
	    return transparent_index;
	}
    }
    return transparent_index; // ☆ -1 でなく 255 が返ります。。☆
}
!||!○| ̄|_

2011年02月23日(水)

swfed 0.31 release - www shape view

swfed 0.31 リリースしました。shape 操作のサポートがメインです。 0.29 で getShapeData, replaceShapeData を実装しましたが、
swf ファイル中にどんな Shape 画像が入っているか見れないと辛い。
といった要望をユーザ様から頂いたので、対応しました。

www shape view:

今まで画像一覧は JPEG,PNG 的なビットマップ画像のみでしたが、
SHAPE(ベクター画像)も表示するようにしました。

getshape bugfix:

今の所、shape tag の build が完璧ではないみたいで、getTagDetail 又は
swfInfo を呼ぶと、shape tag を分解した状態で内部に置きますが、
getShapeData では、この分解された shape tag を組み立ててしまっていて、
shape build の問題にぶつかるようでした。
replace と違って getTagDetail, swfInfo は分解前の生データも残してるので、
そちらを使うように修正しました。

2011年02月24日(木)

Flash Lite 勉強会で話して来ました

折角なので、SWF Editor の宣伝。 ming 使うにしても swfmill を使うにしても、SWF バイナリ構造に詳しくないとダメなので、その辺知らなくても弄れるような API を提供してます。

想定するユーザ:

  • Flash Lite の制限に困ってるので、動的生成したい
  • fla ファイルがないので swf を直接改変したい

出来る事:

  • 画像入れ替え出来ます。(ベクター画像も入れ替え可能)
  • テキストツールの文字を入れ替えられます。(変数名指定でも可)
  • 携帯の音声(MLD とか SMAF 等)入れ替え出来ます。
  • ActionScript の変数を初期化できます。(1コマ目に戻ると再初期化なので定数として使って欲しい)
  • API 一覧を見れば大体分かるはず →http://sourceforge.jp/projects/swfed/wiki/SWFEditor

予定:

  • deformeShape メソッドを実装中です。
  • そろそろ、MovieClip 入れ替えしたい。
    • かなり前から要望を頂いてます。
  • 色指定で入れ替えるの、僕もやりたい。
    • サイズ指定で入れ替えするのは今でも出来るけど(getTagList と getBitmapSize があるので)使いにくいんですよね…

話したかった事:

Twitter では自重せずに SWFバイナリの事話すと宣言しながら、躊躇してしまいました。 swfdump で中身がここまで分かるとか、じゃぁ、実際にバイナリを手で書き換えてみましょう。
みたいな話しを考えていたのですが、Flash Lite 勉強会の範疇を超えてしまいそうなので、
今回は軽いジャブだけで。

これで、10 日分だよ〜。

タイトル一覧
カテゴリ分類
Database
JXTA
Java
XML
awm
bookmark
keyword
memo
news
research
Powered by hns-2.19.5, HyperNikkiSystem Project