These pages are written by only Japanese.

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

おはようございます♪ 現在は4月20日(土)6時42分。 鳥がさえずり始める頃です。


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

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

2008年08月02日(土)

sourceforge jp に swfed プロジェクト申請

試しに sourceforge jp に swfed プロジェクトを申請してみました。
csv repository が欲しかったので。
さて、どんな返事が来るかしら。wkwk

swfed GIF 対応

swfed で GIF ファイルを読めるようにしたいので、 giflib の使い方を調べようと google で色々検索しましたが、 全然、欲しい情報がひっかかりません。
という訳で、cvs でソース一式持ってきて、真面目に眺めてます。
そのうち分かると信じて…
cvs -d:pserver:anonymous@giflib.cvs.sourceforge.net:/cvsroot/giflib login
cvs -z3 -d:pserver:anonymous@giflib.cvs.sourceforge.net:/cvsroot/giflib co -P  giflib
util 以下のがサンプルコード代わりっぽいんですよね。

追記 (2008/10/29):


2008年08月03日(日)

swfedプロジェクトが承認されました。@sourceforge.jp

寝る直前の夜12時に申請を出して、次の日の午前9時に承認のメールが来てました。
クイックレスポンスにも程がある。(´Д`;) さて、頑張ってコードやドキュメントを整理しよっと。

2008年08月04日(月)

swfed@sourceforge.jp

初めて sourceforge にプロジェクトを作ってみました。 便利ですね。これ。 元々、repository を使いたくて登録したのですが、 Wiki, ML, BTS, forum, News, 等々、便利なツールが揃ってるので、 使い倒そうと思ってます。

svn repository:

自宅サーバにしか最新コードが無いのは不安なので、 早速、svn repository にコードを commit しました。 svn からコード取得&ビルドは以下のような手順になります。
% svn checkout http://svn.sourceforge.jp/svnroot/swfed/
% cd swfed/src
% phpize
% ./configure
% make
% su
Password:
# cp modules/swfed.so <php extension dir>/.

某社の人と飲み

前半は真面目に技術的 *1 な話をしていたのですが、 位置情報の話辺りからだんだんと話がそれて、 最後ずっと山登りの話をしてました。
ごめんなさい。もうどうにも止まりません。 *2 (´Д`;)
閉店時間でタイムアウトしてしまい、色々と話し足りない部分が残ってしまった *3 ので、またお話する機会が欲しいなぁ。
特に位置情報は実装面で工夫したい事もあるし、逆に聞きたい事もあるし。
*1: 情報科学的な話からコンピュータ言語の応用面辺りを主に
*2: とても反省してるとは思えない言葉だゎ…
*3: その場では話しきっても、またネタが出てくるけど… それはそれとして…

2008年08月05日(火)

sourcforge.jp で swfed-0.01.tar.gz release

svn レポジトリ閲覧で tarball を作ってファイル名を適当にかえて、 「プロジェクトの管理>リリース>新規作成」で バージョン番号とメモ書きを添えて、tarball をアップロードして、 最後に、ステータスを Active にすると… うーむ。なんて楽なんでしょう。

2008年08月07日(木)

PHP と srand と seed

億のレコード数を目指すサービスで、 レコードの uniq id を生成する PHP コードをみて絶望したっ!
function createUniqID() {
 srand( (double)microtime()*1000000 );
 <略>
それは勘弁して… ・゜・(ノД`)・゜・
最近の PHP で srand を呼ぶのは同じ乱数列を再現させたい時位なので、 今回の場合は srand をただ削るだけで修正は簡単なのですけど。

問題の解説:

microtime() に対してこういう処理をすると、
  • microtime() => string(21) "0.49181000 1218109364"
  • (double)microtime() => float(0.49181)
  • (double)microtime()*1000000 => float(491810)
となるので、seed が 0 - 999,999 の間の数値に収まり、かつ、 srand の後に続く rand の乱数列がその seed で決まるので、 この関数が返す ID は 100万種に限定されてしまいます。
PHP5 から get_as_float の引数が導入されたので、 microtime(true) とすれば、<sec>.<usec> が float の値で貰えて、 もっとマシに出来ますが、microtime が内部で呼ぶ gettimeofday が タスクのスイッチより分解能があるという確信がない限り、 これだけに頼る時点で危険な気がします。
そもそも PHP は結構前から srand を呼ばずに rand をいきなり呼んでも、 内部で勝手に srand 相当の処理が動くようになっています。
更に、この勝手に動く(seed を明示的に指定しない) srand の処理 *1 は、(大雑把だけど)
1,000,000 * | (f1(sec xor ~usec) - f2(thread_id or pid ))*A |
xor unixtime * pid
MODMULT の処理が複雑なので f1, f2 でごまかし。^^;
の値を seed にしていて、下手な seed を渡すより、 これに任せた方がずっと良いです。 (pid と時刻の値を混ぜるのは、結構定石)

昔話:

大昔の PHP では srand を明示的に呼ぶ必要があったので、
srand( (double)microtime()*1000000 );
というのは、よく使われていたようです。
microtime の仕様が今と異なるのか、はたまた、 そんなに沢山の乱数は要らないと思ってるのかワカラナイけど、 google で検索すると、このコードが沢山見つかります。
これはまずいと指摘する人もいるのですが、
Just using microtime() * 1000000 only results in 1000000 possible
seeds (and less on some platforms as noted) 
まだまだ、Web 上ではこの古いサンプルが目立つので 同じ間違いが色んな場所で繰り返されるんでしょうね。

*1: ext/standard/rand.c, rand.h, lcg.c 参照の事。

2008年08月08日(金)

swfed 0.02 release

PNG 画像の吸出しに一部対応しました。 Lossless(可逆圧縮)画像の format は主に、3(index形式)と 5(bitmap形式)があり、 5 の bitmap 形式のみに対応しています。 3 は… 頑張ります。(;ω;)

サンプルコード:

$obj = new SWFEditor();
$obj->input($swfdata);
echo $obj->getPNGData($image_id);

実行結果:

% php swfdump.phps game.swf # format 5 の画像を探す
	<略>
[91] tag=DefineBitsLossless2(36)  length=58282
        image_id=72  format=5  width=155  height=156
        argb bitmap exists
	<略>
% php swfgetpngdata.phps game.swf 72 > test.png
透明度付きで吸い出せてます。(^o^)/

…:

という事はデータ構造の理解は正しいはずなので、 透明度付き PNG画像入れ替えに失敗しているのは、 libpng の使い方を間違えているかも。

libpng で PALETTE 形式を扱う方法

swfed の Lossless format=3 index 形式に対応する為、 libpng の PALETTE 形式の書き出し方を調査。
color_palette=(png_colorp)NewPtr(sizeof(png_color)*num_palette);

ctable=(*savePix)->pmTable;
HLock((Handle)ctable);
for (i=0; i<num_palette; i++)
{
	color_palette[i].red=((*ctable)->ctTable[i].rgb.red)>>8;
	color_palette[i].green=((*ctable)->ctTable[i].rgb.green)>>8;
	color_palette[i].blue=((*ctable)->ctTable[i].rgb.blue)>>8;
}
png_set_PLTE(write_ptr,write_info_ptr,color_palette,num_palette);
なるほど… パレットはこうして設定しつつ、 データ本体は
image_rows = malloc( image_height * sizeof( BYTE *) );
for( i = 0; i < image_height; i++ ) {
    dest = image_rows[ i ] = malloc( bmp_line_byts );
    src  = &bmp_data[ (image_height - 1 - i) * bmp_line_byts ];
    for( j = 0; j < bmp_line_byts; j++ ) {
        *dest++ = *src++;
    }
}
png_write_image( png_ptr, image_rows);
1 pixel 1 byte の生データを放り込むと。

(1008/10/09追記)
libpng について調べた事のまとめは以下の Wiki にあります。

swfed に適用してみました:

% php swfdump.phps game.swf # format=3 の画像を探す
	<略>
[44] tag=DefineBitsLossless2(36)  length=134
        image_id=34  format=3  width=62  height=18
        colormap_count=16  rgba colormap exists  indices exists
	<略>
% php swfgetpngdata.phps game.swf  34 > test2.png
パレット対応成功。(^o^)/
これで Lossless 対応はひと段落ついた感じです。

追記 (2009/10/23):

「swf lossless 2 RGBA」で検索して辿りついた方がいらっしゃったので。

PHP-4.0.0 build

温故知新、古きを知りて新しきを知るという事で、 4.0.0 を build してみました。

改造:

  • sapi 関連の変数 (sapi_module とか)が extern だったり static だったりするので、SAPI.h から衝突する extern を除いて、必要なファイルが各自で extern するよう改造。(apache 越しで動かなくなるかもだけど、言語検証用なので知らないw)
  • ext/libmysql が errno.h を include せずに errno を使うので mismatches non-TLS reference が発生。-include /use/include/errno.h で強制的に取り込ませて解決。

実験:

php-4.0.0% ./php
<?php
var_dump(microtime());
X-Powered-By: PHP/4.0.0
Content-type: text/html

string(21) "0.28143600 1218182721"
これが知りたかっただけです。^^;

swfed 0.04 release

PNG 画像抽出と PALETTE 対応のコードにメモリリークがあったので 治しました。

2008年08月09日(土)

swfed 音声対応開始

手始めに DefineSound の parse/build 処理から。
% php swfdump.phps game.swf
	<略>
[4] tag=DefineSound(14)  length=2505
        sound_id=1
        format=2(MP3) rate=1 is_16bits=1 is_stereo=0 samples_count=11019
        sound_data(length=2498)
[5] tag=DefineSound(14)  length=2505
        sound_id=2
        format=2(MP3) rate=1 is_16bits=1 is_stereo=0 samples_count=11019
        sound_data(length=2498)
[6] tag=DefineSound(14)  length=2505
        sound_id=3
        format=2(MP3) rate=1 is_16bits=1 is_stereo=0 samples_count=11019
        sound_data(length=2498)
[7] tag=DefineSound(14)  length=2505
        sound_id=4
        format=2(MP3) rate=1 is_16bits=1 is_stereo=0 samples_count=11019
        sound_data(length=2498)
	<略>
とりあえず、swfInfo での詳細表示は成功。
ただ、これは大枠の箱でしかなく、 実際にデータの出し入れをする場合は、その中に入っている MP3 や ADPCM 等の 音声フォーマット毎の処理が必要なので、これからが大変そうです。
頑張ります… そろそろ、lame とかに手を出しますか…

0.05 release:

折角なので、0.05 リリース。
DefineSound の parse/build 処理を実装しました。
swfInfo の詳細表示に DefineSound を追加しています。

活発なプロジェクト:

sourceforge.jp トップページの右下に「活発なプロジェクト」の欄が あるのですが、
活発なプロジェクト
1  	(100.00) 	SWF Editor for PHP
2   	(99.39)  	blanco Framework
3  	(98.77) 	mod_chxj
	<略>
タスクとか真面目に使いつつ、コードをコマ目に commit し続けたら上位にw
自分、頑張りすぎww

2008年08月10日(日)

[swfed] Flash から MP3 データ抽出

↑ここの DefineSound に入る MP3 データの構造を眺めていたのですが、
struct swf_mp3_header {
		unsigned		f_sync_word : 11;
		unsigned		f_version : 2;
		unsigned		f_layer : 2;
		unsigned		f_no_protection : 1;
	<略>
よく見ると MP3 ファイルフォーマットそのままのような…
…という訳で、データ部分をそのまま吸い出したら MP3 として再生できました。
% php swfdump.phps  game.swf
	<略>
[4] tag=DefineSound(14)  length=2505
        sound_id=1
        format=2(MP3) rate=1 is_16bits=1 is_stereo=0 samples_count=11019
	<略>
% php swfgetmp3data.phps  game.swf  1 > test.mp3

swfed 0.06 release:

さて、次は mdl/smaf ファイル入りの swf ファイルを入手せねば…

2008年08月11日(月)

[swfed] getSoundData 実装

実装、といいますか、getMP3Data を getSoundData に改名しました。
DefineSound タグから音声ファイルのフォーマットに関わらず、 ファイル全体のデータを抜き出せる事が分かったからです。
つまり、MP3 でも MLD ファイルでも、この getSoundData ですい出せます。 入れ替えの方は、rate, is_16bits 等の属性データをファイルの 中身にあわせて書き換えないといけないので、replaceMP3Data 等の フォーマット毎の関数を作る方が(自分が)楽カナと思ってます。 (そのうち自動判定の処理を入れるかもですけど)

2008年08月13日(水)

[swfed] 着うた MLD 入れ替え機能を実装

知り合いから着うた入りの SWF ファイルを貰えたので中身を見たところ
[661] tag=DefineSound(14)  length=143
        sound_id=941
        format=15(Unknown) rate=0 is_16bits=0 is_stereo=0 samples_count=0
        sound_data(length=433)
でしたので、これを元に MLD データ入れ替え機能を実装しました。

swfed 0.07 release:


2008年08月14日(木)

PHP と srand と seed (2)

google で検索してたら
mt_srand(microtime()*1000000);
の記述を見つけました。
これだと乱数列が100万種に限定されるので、 mt_srand(microtime(true)*1000000); とかの方が良いのでは。 といった指摘をしてみました。
まぁ、そもそも srand 系は下手に呼ばないのが一番なんですけど。^^;

PHP4:

microtime(true)が使えるのは PHP5 からなので、 PHP srand Manual 等にあるように、
list($usec, $sec) = explode(' ', microtime());
(float) $sec + ((float) $usec * 100000);
の方がいいかな。

2008年08月15日(金)

swfed セグメンテーション違反

swfed はまだ荒削りなので渡す素材によって、seg.fault が発生するかもです。
素材を頂ければ、すぐデバッグしますのでご一報を。m(_ _)m > 誰となく

[swfed] MP3 入れ替え開始

ここの SWF にとっての MP3 の説明と、 ここの MP3 frame と frame header の説明を読み合わせると、 どうも一筋縄にいかない感触です。
frame を辿って sound_samples_count を算出するしかないのかな。
めんどー…

lame cvs checkout

とりあえず checkout
cvs -d:pserver:anonymous@lame.cvs.sourceforge.net:/cvsroot/lame login
cvs -z3 -d:pserver:anonymous@lame.cvs.sourceforge.net:/cvsroot/lame co -P .
勉強開始。 色々なるほど。

2008年08月19日(火)

PHP - RETURN_STRINGL(s, l, dup)

extension を作る時に第3引数をあやふやなまま使っていたので、 一応整理。
php-5.2.6/Zend/zend_API.h を見れば一目瞭然。
#define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }
			↓
#define RETVAL_STRINGL(s, l, duplicate)  ZVAL_STRINGL(return_value, s, l, duplicate)
			↓
#define ZVAL_STRINGL(z, s, l, duplicate) {      \
                char *__s=(s); int __l=l;               \
                (z)->value.str.len = __l;           \
                (z)->value.str.val = (duplicate?estrndup(__s, __l):__s)
;        \
                (z)->type = IS_STRING;              \
        }

つまり…:

    data = swf_object_output(swf, &len);
    new_buff = emalloc(len);
    memcpy(new_buff, data, len);
    free(data);
    RETURN_STRINGL(new_buff, len, 1);
}
ここで、1 を渡してるのは無駄って事で… 0 に修正しまくろう。
ちなみに、emalloc して元のデータを free してるのは、 swf_object_output が返すデータは(自作の)swf_object ライブラリの 内部で malloc してるデータで、free するタイミングが見つからないから。
一応、
  • free link list を作って swfed が destroy する際に何とかする
  • swf_object の malloc をユーザ定義関数にして emalloc を使わせる
といった方法を思いつくけど、どうしよう。
前者は、オブジェクトを destroy した後も PHP 処理系側にアクセスされる可能性があるので、無理かな…

2008年08月20日(水)

swfed-0.08 release (不具合修正)

palette 形式の Lossless 画像に対応した際、 色indexを 256 fullに使った画像が扱えないという不具合があるのを指摘頂いていて、 別の目的にリリースに混ぜようと思ったのですが、機能追加の進みが遅いので、 この修正だけでも先にと、0.08 をリリースしました。
色index数は 1-256の範囲なのに、unsigned char で扱おうとして、 0 に戻っていたという恥ずかしいバグです。○rz

機能追加予定:

GIF 対応と MP3 対応を進めています。MP3 対応は思ったより面倒そうなのと特に要望を貰っていないので後回しにするかもです。
MP3 と WAV+MP3 のフォーマットは何となく分かってきましたが、 game.swf から抜き出した MP3 データを見ると、MP3 ヘッダでも WAV ヘッダでもない (RIFF magic文字列が見つからない)、何かっぽくて、 でも、MediaPlayer や Winamp に渡すと普通に MP3 と認識してくれて、 途方にくれてる状態だったりします。 以下のは game.swf から抜き出した MP3 ファイル

2008年08月21日(木)

BitPets

お昼頃、携帯メールでサービス終了のお知らせが来たのですが、 本当なのかしら。PC 版公式サイトを見ても、それっぽい話が書いてないので 半信半疑なのですけど。

動画サービス「Rimo」終了予定について

Rimoは現在専任の開発担当者が不在のため、
不具合修正や機能開発などを迅速に行う事が難しい状態となっており
これって誰か辞めた時に引き継げなかったって事なのかしら。
他人の事いえない気もするので、仕事の水平展開もっと頑張ろう。(焦

これで、15 日分だよ〜。

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