These pages are written by only Japanese.

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

こんばんわ♪ 現在は3月29日(金)2時27分。 丑三つ時です。


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

これで、7 日分だよ〜。

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