These pages are written by only Japanese.

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

こんばんわ♪ 現在は8月9日(日)18時10分。 今日も残業なのでしょうか?


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

先月 2008年07月 来月
01 2 3 04 05
06 07 08 9 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年07月01日(火)

NW-A828 を使ってみて

先週、sony のウォークマン NW-A828 を購入して使っているのですが、 ノイズキャンセラーの性能がすさまじいですね…
どの位すごいかというと、電車にのってて車体の轟音が殆ど聞こえなくなる位。
あと、音楽を聞き終わると、ノイズキャンセラもoffになるのですが、 その時の感覚が、集中が切れて周りの色んな音が聞こえ始める、 あの感覚に見てて妙な気分になれます。

ソフトがダメすぎ:


プレイヤー自体は素晴らしいのですが、音楽を転送する為の付属ソフト SonicStage がいけてない。というか最悪。たかが数曲のカテゴリを書き換える のに、なんで十数秒ソフトが固まるのさ。 それ以外でも色々と操作をしてると頻繁に考え込みます。 結構イライラ…
毎日、曲を転送する訳じゃないので、それほど困らないけど。 製品自体はいいのに勿体ないなぁ…
あ。そうそう。あと、WALKMAN Launcher もダメ。
Launcher が表示する各々のボタンが、どのソフトを起動するか。 を指定するのですが、この設定画面のキャンセルボタンが押せません。(´Д`;)

この UI ありえないだろう。JK *1
確かに何指定しても後で変更できるんだろうから、 キャンセルする必要は無いのですが、 気持ち的にキャンセルボタンが表示されていて、 それが押せないのは気持ち悪いのに…
このLancher経由で起動する Media Manager もユーザを馬鹿にしてる。 avi ファイルをプレイヤーで見ようとして、ドラッグ&ドロップで転送 しようとしたら、 「次のファイルは互換ではありません」
じゃぁ、どうすればいいんですか…
初めから入ってる mp4 ファイルを見るに、 自分で mp4 にエンコードしろとでも? (´д`)

要望:

クラシック派の自分としては作曲者指定で再生できるといいなぁ…

追記:

動画の件は Craving Explorer で解決したので、その日記へのリンク。↓

*1: 色々選択肢をかえてみたけど、キャンセルボタンを有効に出来ませんでした。

2008年07月04日(金)

Wassr(ワッサー)楽しすぎる

Twitter が流行っていると聞いて少し前から使っていましたが、 いまいちピンと来ない上に、最近は重たくて使い物にならない。
…と思っていた所に別のつぶやきシステムを教えてもらったので そちらに浮気しました。 携帯インターフェースがシンプルで使いやすく、いい感じです。
自分のページは↓ココ

関連URL:


2008年07月05日(土)

モバゲーのPC版

アクセスしようとしたら、symantec に遮断されました。

今まで散々怪しいサイトでもスルーされてて、 遮断されたのは初めてですが、一体どうなってるんでしょ…

2008年07月06日(日)

Wassr API

試しに php で叩いてみました。
require('WassrClient.php');
$ws = new WassrClient('yoya', '(パスワードなので秘密)');
$ws->channel_message_update('test', 'This is TEST. a.b.c...');
実行結果 (json_decode する前)
{"error":"you are not a member of #test"}
えーっと。異常系のテストですよ。ぇぇ。ぇえ… (チャネルに参加するの忘れてました…)

Bot 作り:

震度4以上の地震があった時に地震チャネルにメッセージを送るbotを作ってみました。 ↑ここの情報を10分毎にチェックして、sqlite DB に無い震度4以上の エントリがあったら、地震チャネルにメッセージを送りつつ、 sqlite DB にエントリ追加。それだけ。

幕末古写真ジェネレーター

こないだの山登りで撮った写真で試してみました。

なるほど、それっぽいです。

2008年07月07日(月)

swfed Lossless 画像対応開始

swfed を使ってくれてる人から png 画像に対応するといいな。 といった意見を頂いたので、やる気 120% で開始。

マイルストーン設定:

  • 7/10 までに Lossless 画像の parse 処理実装。
  • 7/13 までに Lossless 画像を PNG として出力する。
  • 7/16 までに PNG 画像を取り込む処理実装。
  • 7/20 までに 取り込んで PNG 画像を Lossless 画像と入れ替える。
てな具合で。
libpng の読み込みは調査の途中で止まってますが、 それは後回しでとりあえず、 先に、Lossless タグブロックの parse & build 機能を作る事にします。

追記 (2008/10/22):

こちらに入れ替えツールの説明があります。

2008年07月08日(火)

pChart - a PHP class to build charts

見た目がいい感じです。

2008年07月11日(金)

swfed Lossless 画像対応

予定より一日遅れて、parse & build 処理実装完了。

実行結果:

php swfdump.phps  5791.swf
<略>
[12397] tag=DefineBitsLossless2(36)  length=9938
        image_id=1136  format=5  width=160  height=160
        argb bitmap exists
<略>
[12748] tag=DefineBitsLossless2(36)  length=2471
        image_id=1196  format=5  width=80  height=80
        argb bitmap exists
<略>

プログラム:

mkdir -p ~/public_html/diary/data/2008/07/11/swfed
cp config.m4  swfed.c php_swfed.h \
     swf_*.? jpeg_segment.? bitstream.? swf*.phps \
     ~/public_html/diary/data/2008/07/11/swfed/.

修正:

ビットマップデータ部は zlib 圧縮がかかっているので、 それの伸張処理を入れました。

2008年07月14日(月)

(ファイルでなく)配列変数で PNGデータを libpng に渡す方法

これ の続き
libpng で(ファイルストリームでなく)配列変数から直接PNGデータを 読み書きする方法がようやく分かったので、その顛末。

調査:

libpng の使い方のページを探しても、ファイルポインタを渡すのばかりで メモリオブジェクトを直接渡すサンプルプログラムが殆ど見つかりません。 その上、見つけたモノもオーバーフロウの対策が入ってない(ように見える)ので、 libpng.txt を見直すことにしました。
libpng にある入出力はpng_read() や png_write() を通して処理されます。
現行では fread() や fwrite() を呼ぶだけです。FILE * は png_struct
内部に記憶され、png_init_io() を経由して初期化されます。
I/O 命令を変更したいなら、png_init_io() を呼ぶ代わりに実行時に
png_set_read_fn() と png_set_write_fn() 関数を通してライブラリ指定
のコールバックを設定することができます。
という事ですが、
png_set_read_fn(png_structp read_ptr,
                voidp read_io_ptr, png_rw_ptr read_data_fn)
png_set_write_fn(png_structp write_ptr,
                  voidp write_io_ptr, png_rw_ptr write_data_fn,
                  png_flush_ptr output_flush_fn);
voidp read_io_ptr = png_get_io_ptr(read_ptr);
voidp write_io_ptr = png_get_io_ptr(write_ptr);

void user_read_data(png_structp png_ptr,
                    png_bytep data, png_size_t length);
void user_write_data(png_structp png_ptr,
                     png_bytep data, png_size_t length);
void user_flush_data(png_structp png_ptr);
API群を見てもいまいちピンと来ないので、 「png_set_write_fn」で検索したところ以下のページを発見。
png_get_io_ptrによって、png_set_read_fun/png_set_write_funで与えた引数を
png_ptrで示されるコンテキストオブジェクトから取得できるので、それを
ストリームへのポインタにキャストして仕事をまっとうしているわけです。
あー。なるほど。
libpng.txt にも同じ意味の事が書いてありますが、 こういう説明の仕方でないと自分には分からないのです。^^;
static void png_default_write_data(png_structp png_ptr,png_bytep data,png_size_
t length)
{
        OSErr   err;
        long    llong=length;
        short   refNum=((MyPNGFileRec *)png_ptr->io_ptr)->refNum;

        err=FSWrite(refNum,&llong,data);
        if (err!=noErr)
        {
                png_error(png_ptr,"Write Error");
        }
}
なるほど。なるほど。
コンテキストオブジェクトに汎用ポインタで任意の構造体データを渡せるので 最大長も一緒に渡してカスタム関数でオフセットと長さの比較をすれば、 オーバーフロウを防御できそうです。

テストコード:

typedef struct my_png_buffer_ {
    unsigned char *data;
    unsigned long data_len;
    unsigned long data_offset;
} my_png_buffer;

void png_memread_func(png_structp png_ptr, png_bytep buf, png_size_t size){
    my_png_buffer *png_buff = (my_png_buffer *)png_get_io_ptr(png_ptr);
    if (png_buff->data_offset + size <= png_buff->data_len) {
        memcpy(buf, png_buff->data + png_buff->data_offset, size);
        png_buff->data_offset += size;
    } else {
        png_error(png_ptr,"png_mem_read_func failed");
    }
}

void png_data_read(png_structp png_ptr, my_png_buffer *png_buff) {
    png_set_read_fn(png_ptr, (png_voidp) png_buff,
                    (png_rw_ptr)png_memread_func);
}
こんな感じでいいかな。

結果:

正常なファイル。(3x3 の青い画像)
% ./a.out cyan_3x3.PNG
png_filename=cyan_3x3.PNG
png_buff.data_len=152
(width, height)=(3,3) bpp=8 color_type=2
異常なファイル1 (バッファオーバーフロウ)
% ./a.out cyan_3x3-cut.PNG
png_filename=cyan_3x2-cut.PNG
png_buff.data_len=91
libpng error: png_mem_read_func failed
アボートしました
ファイルの後ろを少し削ったファイルを渡したところ、 長さチェックで弾いてくれました。よしっ。

ついでに:

↑ここで紹介されてた異常なファイル (何かの攻撃用らしい)
% ./a.out pngtest.png
png_filename=pngtest.png
png_buff.data_len=8574
libpng error: PNG unsigned integer out of range.
アボートしました
ふむ。完璧。
続く

swfed 要望

Lossless 対応が一息ついたら、こちらに取り掛かる予定です。

2008年07月16日(水)

メールが届かない。

今朝から awm.jp にメールが届かなくなっていたので、調査。

ディスク溢れ:

メールは /var/spool/ に貯めてますが、 /var を 100% 使い切ってました。
# du -sk *
	<略>
3724    php-pear
2402880 yum
/var/cache/yum が多すぎるので /awm/yum_cache を作って、そこに退避。

named が動いていない:

named が死んでいたので restart したのですが起動しません。 原因は、named.pid を格納するフォルダの所有者が root になっていた事。 あれ、以前は named だったはずなのに…
とりあえず、chown named して解決。

PNGデータのdump

前回のコード ではヘッダ情報の表示をしましたが、 今度は画像データも吸い出してみました。

プログラム:

    image_data = (png_bytepp) malloc(png_height * sizeof(png_bytep));
    for (y=0; y < png_height; y++) {
        image_data[y] = (png_bytep) malloc(png_get_rowbytes(png_ptr, info_ptr));
    }
    png_read_image(png_ptr, image_data);
    for (y=0; y < png_height; y++) {
        printf("y=%lu: ", y);
        for (x=0; x < png_width; x++) {
            printf("%02x%02x%02x  ",
                   image_data[y][3*x],
                   image_data[y][3*x+1],
                   image_data[y][3*x+2]);
        }
        printf("\n");
    }

実行結果:

% ./png_dump  cyan_3x3.PNG
png_filename=cyan_3x3.PNG
png_buff.data_len=152
(width, height)=(3,3) bpp=8 color_type=2
y=0: 00ffff  00ffff  00ffff
y=1: 00ffff  00ffff  00ffff
y=2: 00ffff  00ffff  00ffff
%

課題:

depth8 の RGB データ以外のファイルを食わせた場合に どうなるのかは分かりません。
1pixel 3byte 決めうちにしてるので、多分ダメそうですが。^^;

2008年07月17日(木)

PHPカンファレンス2008 LT ネタ採用通知

ライトニングトークの採用通知が来ました。 「7/16(火)頃までに」だったので、もしかして忘れられたのかなと心配してました。(汗
さて、今日中に帰宅してデモを作りつつ、発表資料をまとめますか。 ネタはこれ↑

2008年07月18日(金)

swfed Lossless 画像入れ替え一部対応

何となくできました。
ただし、color_type が 8bit RGB でαチャネル無しのみ対応です。

実行結果:

まず入れ替えたい画像を探します。
% php  swfdump.phps 5791.swf
	<略>
[12397] tag=DefineBitsLossless2(36)  length=9938
        image_id=1136  format=5  width=160  height=160
        argb bitmap exists
image_id 1136 の画像を見つけたので、それを入れ替えてみます。
% php  swfreplacepngdata.phps 5791.swf 1136 cyan_3x3.PNG   > tmp.swf
さて、dump して確認。
% php  swfdump.phps 5791.swf
	<略>
[12397] tag=DefineBitsLossless(20)  length=22
        image_id=1136  format=5  width=3  height=3
        xrgb bitmap exists
入れ替わりました… ( ̄― ̄)
後でαチャネル処理も実装しようっと。

プログラム:

メモリチェック:

少なくとも正常系では free 忘れはないようです。
さすが自分。(*'ω'*)

libpng で (ファイルを介さず) PNG データを生成する

↑このサイトを参考にしました。
typedef struct my_png_buffer_ {
    unsigned char *data;
    unsigned long data_len;
    unsigned long data_offset;
} my_png_buffer;

void png_data_write_func(png_structp png_ptr, png_bytep buf, png_size_t size){
    my_png_buffer *png_buff = (my_png_buffer *)png_get_io_ptr(png_ptr);
    unsigned long new_data_len;
    if (png_buff->data_offset + size > png_buff->data_len) {
        new_data_len = 2 * png_buff->data_len;
        if (png_buff->data_offset + size > new_data_len) {
            new_data_len = png_buff->data_offset + size;
        }
        png_buff->data = realloc(png_buff->data, new_data_len);
        if (png_buff->data == NULL) {
            fprintf(stderr, "can't realloc: new_data_len(%lu), data_len(%lu)\n",
                    new_data_len, png_buff->data_len);
            png_error(png_ptr,"png_data_write_func failed");

        }
        png_buff->data_len = new_data_len;
    }
    memcpy(png_buff->data + png_buff->data_offset, buf, size);
    png_buff->data_offset += size;
}

void png_data_write(png_structp png_ptr, my_png_buffer *png_buff) {
    png_set_write_fn(png_ptr, (png_voidp) png_buff,
                     (png_rw_ptr)png_data_write_func, NULL);
}

/* ... */

    my_png_buffer png_buff;
    png_buff.data = NULL;
    png_buff.data_len = 0;
    png_buff.data_offset = 0;
    png_data_write(png_ptr, &png_buff);

    png_write_info(png_ptr, info_ptr);
    png_write_image(png_ptr, image_data);
    png_write_end(png_ptr, info_ptr);

実行結果:

% ./a.out foo.png
png_filename=foo.png
(width, height)=(3,3) bpp=8 color_type=2
png_buff.(data=0x8b9ebf8,data_len=128,data_offset=96)
%
% ./png_dump foo.png
png_filename=foo.png
png_buff.data_len=96
(width, height)=(3,3) bpp=8 color_type=2
y=0: 102030  102030  102030
y=1: 102030  102030  102030
y=2: 102030  102030  102030
出来たー。(*'ω'*)

2008年07月21日(月)

PHP カンファレンス LT

の発表は gdgd で終了ー ○rz
ノートPCのモニタ設定が練習時と変わってて、 司会の方のヘルプのおかげでパワポの表示はできたのですが、 ブラウザがプロジェクタの方に表示できず、用意したデモが全滅したので、 急遽、他で使う予定だった Lite じゃない方の説明に切り替えました。
ちなみに。見せる予定だったサンプルはこんなの。 クリボー(版権処理忘れてたので目を塗りつぶしてますw)の画像に 入れ替えただけですけど。
細かい話より実際に動いているのを見せ続けた方がいいのが 分かっていただけに、残念無念。

でも…:

今回は、発表者、つまり当事者として経験できたので、見るだけの時より ずっと色々勉強になったし、折角なので懲りずにリベンジします。
どこか発表の場を頂けませんかっ。(⊃д⊂)

2008年07月22日(火)

swfed バグ修正 (JPEG入れ替え)

DefineBitsJPEG の JPEGデータ入れ替えの不具合対処をしました。
DefineBitsJPEG2,3 対応した時に、そのフォーマットに合わせて JPEGセグメント並び替え処理を追加してますが、DefineBitsJPEG の時も その処理が動いてました。
具体的には、2,3 は ( EOI(End of Image) SOI(Start of Image)が余計にあるように見えるのはそのせい)
- DefineBitsJPEG2,3 の JPEGセグメントの並び
  - 圧縮テーブルフィールド
                SOI(0xD8): len=0
                DQT(0xDB): len=65
                DQT(0xDB): len=65
                DHT(0xC4): len=29
                DHT(0xC4): len=179
                DHT(0xC4): len=29
                DHT(0xC4): len=179
                EOI(0xD9): len=0
  - 画像データフィールド
                SOI(0xD8): len=0
                APP0(0xE0): len=14
                APP1(0xE1): len=32
                SOF0(0xC0): len=15
                SOS(0xDA): len=9536
                EOI(0xD9): len=0
…というのが正しいのですけど、無印の DefineBitsJPEG は 標準的な JPEG データ(メタ情報、圧縮テーブル、圧縮された画像データ)をそのまま入れるべき。
- DefineBitsJPEG の JPEGセグメントの並び
  - 画像データフィールド
                SOI(0xD8): len=0
                APP0(0xE0): len=14
                APP1(0xE1): len=32
                DQT(0xDB): len=65
                DQT(0xDB): len=65
                SOF0(0xC0): len=15
                DHT(0xC4): len=29
                DHT(0xC4): len=179
                DHT(0xC4): len=29
                DHT(0xC4): len=179
                SOS(0xDA): len=9536
                EOI(0xD9): len=0
↑詳しくはこちらで。

…って事は DefineBitsJPEG2,3 入れた時からバグってたのか。 うかつすぎ… ○rz

プログラム:

ついでに、αチャネル付き PNG 画像を指定して入れ替えが出来るようにしました。
といって、透明度が有効にならないので、まだ何か変ですけど…
あと、replace 系を二度連続で呼ぶと seg.fault する恥ずかしいバグもこっそり修正…更に、image_id 検索を少し高速化してみるテスト

一日に書けるコードの行数

PHP カンファレンスのアンケートで一日にかける行数はいくつ という設問がありました。
自分は swfed を作り始めて4ヶ月ですが、まだ5600行程なので、 単純計算すると 1日41-42行程度になります。
しかも、C言語で実装してるので PHP 単位だと 20行程度かもしれません。
まー。日曜プログラマなので、そんな程度で許して下さい。(;^ω^)

2008年07月23日(水)

swfed DefineBitsLossless format=3 の読み込みで不具合

format=3 (インデックス方式)は parse がうまく出来ていません。
% php swfdump.phps game.swf > /dev/null
swf_tag_lossless_create_detail: uncompress: Z_BUF_ERROR: not enough buff size
can't create tag detail (tag=36)
swf_tag_lossless_print_detail: detail == NULL
swf_tag_lossless_create_detail: uncompress: Z_BUF_ERROR: not enough buff size
can't create tag detail (tag=36)
swf_tag_lossless_print_detail: detail == NULL
デバッグメッセージを入れたところ、
XXX origsize=1212 # 予想
ZZZ origsize=1216 # 実際の伸長後の長さ
4byte 足りません。
indices_len = ((swf_tag_lossless->width + 3) & -4) * swf_tag_lossless->height;
origsize = 4 * swf_tag_lossless->colormap_count + indices_len;
これらの計算が間違っているようですが、indices_len は、
1 => 1+3 & -4 = 4   & -4 = 4
2 => 2+3 & -4 = 4+1 & -4 = 4
3 => 3+3 & -4 = 4+2 & -4 = 4
4 => 4+3 & -4 = 4+3 & -4 = 4
5 => 5+3 & -4 = 8   & -4 = 8
のような4の倍数への繰上げ処理なので問題ないはず…
まさかだけど、colormap_count が 0 数えってオチはないよね…
試しに 0 数えの処理をいれつつ、整合性チェックを入れて検証開始します。

swftools のコードを見ると:

swftools-0.8.1/lib/modules/swfbits.c
	<出力>
L780:   swf_SetU8(t, ncolors - 1);  // number of pal entries
	<入力>
L958    if (format == 3)
L959        cols = swf_GetU8(tag) + 1;
やっぱり、0 数えで処理してる…

swf_file_format_spec を読んでみた:

そういえば、仕様書読めるようになってたの忘れてました。
COLORMAPDATA
Field Type Comment
ColorTableRGB RGB[color table size] Defines the mapping from color
indices to RGB values. Number
of RGB values is
BitmapColorTableSize + 1.
ColormapPixelData UI8[image data size] Array of color indices. Number
という訳で、+1 して使います。はい。

プログラム:

安心してコードを公開。 # 今回からは tarball もつけます。:-)
少し仕様を変更してて、 テキスト入れ替えの際には対象を変数名で指定しますが、 edit_id でも引っかかるようにしてます。 万が一、衝突したらごめんなさい…
(でも、数値だけの変数名をつける事はないので、いいのかなと)

apache が起動しなくなりました (デジャヴ)

/var/log/httpd/error_log を見ると、
[Wed Jul 23 02:01:15 2008] [notice] mod_python: Creating 4 session mutexes based
 on 256 max processes and 0 max threads.
[Wed Jul 23 02:01:15 2008] [error] (28)No space left on device: mod_python: Fail
ed to create global mutex 1 of 4 (/tmp/mpmtx59601).
Configuration Failed
(END)
↑ココを見て、以下のコマンドで解決。
ipcs -s | grep apache | perl -e 'while (<>) { @a=split(/\s+/); print `echo  $a[1]`}'
以前にも同じ事があったような…

飲み

発表で swfed に興味を持ってくれた人がいて、 一緒に飲みに行ってきました。その時の話のメモ。 後は話が外れて P2P ネタで色々。

2008年07月24日(木)

swfed Windows dll 化

Visual C++ 2008 で挑戦中。
自分の作ったコードは当然のごとくコンパイル出来るんだけど、 php の binding のコードから標準ヘッダを呼んだ先でコケる。
道は長そうな気がしてきた。

「マイミクシィ追加リクエスト機能改善」はどう考えても改悪

今回の仕様変更で、追加リクエストを送った後に送信済みフォルダを覗くと、
メールアドレスからIDを特定できるようになってしまった。
ほんとだ。出来た…
自分はこの日記を mixi に登録してる位で隠してないので別にいいけど、 気にする人はいるだろうなぁ。

FlashLite1.x で画像読み込み

おっと…
こういうアプローチがありましたか… 今度、実験してみよっと。

iPhone に絶望した

絶望というのは言葉のあやみたいだけど、 SMB のアンケートが自虐的で面白いらしい。
「電話機能の使いやすさについて、改善が必要な物をいくつでもお選びください。」
・通話中の音量が小さいこと・着信履歴を1件ずつ削除することが出来ない
・アドレス帳のフォルダ分けが出来ない ・非通知拒否設定が出来ない
へーっ ( ̄― ̄)

これで、15 日分だよ〜。

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