These pages are written by only Japanese.

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

こんにちは♪ 現在は5月18日(土)13時54分。 そろそろお仕事に戻る時間です


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 通報しないでつかぁさい。

これで、5 日分だよ〜。

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