These pages are written by only Japanese.

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

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


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

先月 2011年01月 来月
01
2 3 4 5 6 7 8
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 による簡易全文検索です。
詳細は 詳細指定/ヘルプをご参照下さい。
検索式:

2011年01月21日(金)

Zynga Japan さんとこで話してきた事

先週の木曜日に、Zynga Japan さんのオフィスにお邪魔して色々と話してきました。
とりあえず僕が口を開けば SWF しか出てきません。(キリっ
NDA 的な事は話してないので、ブログにまとめてみます。
# 隠し玉のネタも話してきましたが、実装してから公にしたいので秘密 :-)

SWF のおさらい:

ヘッダ構造と画像系のタグ。制御系タグとディスプレイリスト。
gordon.js を知る為の前提知識の復習。

gordon.js について:

JS 製の Flash Player。 但し v1 しか対応してない。
JS で SWF を parse して Shape 構造を Placeタグで配置するのを SVG で表現して、setInterval で ShowFrame までの制御構造を読んで SVG のノードを DOM につけ外しする事でアニメーションしたり、JS の mouse や button のハンドラで、内部イベントを発生させたり、ActionByte コードを 1 operand ずつ読んで VM っぽい構造を操作して動く。
最近は、シンボルによる multi timeline に対応しようとしてるコードがあるけど、オブジェクトの取り回しに失敗してるっぽくて全然動かない。Worker スレッド使ってて、ちょっと嫌な感じがする。(デバッグしにくいし同期とか怪しくなるし微妙)

gordon.js の対案:

gordon.js は js でバイナリパースしたり、コンテンツを base64 で展開したり、ベクトル画像を全て SVG で展開してコマ毎に DOM につけたり外したりしてる。
とにかく重たそう。
透明度付き画像の扱いに難儀してるのを考えると、バックエンドでコンテンツリポジトリを持って URL でアクセスする事にして、画像はすべてα補正を戻した PNG 画像に変換して使ったり、SVG 構造も表示枠の大きさに応じてデフォルメしたりすれば、かなり軽くなるんじゃない?
ActionByteCode を逆アセして JS (変数名に prefix 付けるとかして、ほぼそのまま展開するとかして) で出力すると fetch exec が一段階軽くなるよね。という話もあったけど、Flash Lite で複雑な Script を組むのはあまり無さそうなので、後回しがよさそう。

SWFEditor:

setActionVariables というActionScript の変数代入イメージを、1 frame 目に挿入するメソッドを紹介。そんな処理なので 1 frame 目に戻った時にまた初期化される罠がある。
FlashLite の王道として 1frame 目はダミーで 2frame 目が実質的な先頭コマになる事が多いので大丈夫なはず。。。 setActionVariables で値の入った変数は定数として扱って、別の変数に代入して使いまわすのが良いと思う。
setShapeAdjustMode の紹介。サイズの違う画像を入れ替えた場合に枠に合わせた処理を入れたので、その枠への合わせ方を指定するメソッド。 これを作る為にアフィン変換の処理を書いたので、その処理を直接呼ぶメソッド(applyShapeMatrixFactor)も用意してる。アフィン変換なので本来は傾ける事も出来るが、とりあえず角度を指定して回転させるインターフェースを用意した。ただ、(0,0)原点での回転なので扱いづらい。180度回転する枠の外にはみ出ちゃう。実験段階だし、処理を変える可能性が高い。
それを実装するにあたって、DefineShape タグを一年近くいじってきてて、とても面白い構造をしていたのでその紹介。
画像のスケールに応じてベクトルデータを省略する処理を作っているとも。
縮小して表示する場合は、そもそも細かいベクトルは要らないので、線分の真ん中を端折るとか。そういう処理を実装中。
あと、色々と改善提案も伺いました。もう少し具体的なイメージを固めたら実装に入ります。

その他:

  • FlashLite(SWF動的生成)勉強会お願いしますー。
  • ZendEngine 勉強会2月の真ん中にしました。発表お願いしますー。
  • また遊びに来させて下さい。お願いします。
お願いばっかりで、すみませんw

2011年01月23日(日)

今日は高校の後輩にドラムを教えてました

高校生の演奏を見てると努力不足より、ノウハウが伝わってない所が大きいと思ったので、最近は教えるモードに入ってます。(自分は自分で隙見て練習するけど)
今日は主にベードラとハイハットのへダルの踏み方をレクチャ。
自分はただ適当にへダルを踏んでるつもりが、当たり前のように色々と細かい配慮をしていた事に気付かされました。
その当たり前を再発見して人に教えるので、自分にとっても勉強になります。

ポイント:

ポイントは基本タメは大目に、ペダルを踏む時は音がまとまるようにする。
へダルを緩める時は次に必要な音量に応じて振りかぶる大きさを決めるのと、ハイハットでオープンにもっていく時はデジタル的に力を加減する所。
特にハイハットのオープンとクローズは、1 か 0 かはっきりした音色の違いを出さないといけないので、力の下限が中途半端にならないよう注意が必要です。
足での細かい操作は日常生活に無いので難しいけれど、数を練習して慣れれば何とかなります。
また、練習が少なくても上記の事は知ってるだけで音が変わると思うので、あとどれだけ上達するかは本人の努力次第って事で。

2011年01月24日(月)

FizzBuzz に挑戦

Twitter の TL上で FizzBuzz って単語が飛び交っているので、挑戦してみました。
(take1,2,3 合わせて所要時間5分、気分転換にイイネ)

参考:

お題:

1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、
5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

take1:

何も考えず素直に作ってみました。
<?php
foreach (range(1, 100) as $n) {
    if ($n % 3 == 0)  {
        if ($n % 5 == 0)  {
          echo "FizzBuzz\n";
        } else {
          echo "Fizz\n";
        }
    } elseif ($n % 5 == 0)  {
          echo "Buzz\n";
    } else {
        echo "$n\n";
    }
}

take2:

%5 が二カ所あるのが気持ち悪いのでまとめてみました。
<?php
foreach (range(1, 100) as $n) {
    $d = '';
    if ($n % 3 == 0)  {
        $d .= "Fizz";
    }
    if ($n % 5 == 0)  {
        $d .= "Buzz";
    }
    if ($d === '') {
        $d = $n;
    }
    echo "$d\n";
}

take2':

PHPでは忌み嫌われる三項演算を多用してみました。
<?php
foreach (range(1, 100) as $n) {
    $d = ($n % 3)?'':"Fizz";
    $d .= ($n % 5)?'':"Buzz";
    echo ($d?$d:$n)."\n";
}
三項演算子を入れ子にすれば更に短くなりそうですが、その一線は越えたくないです…

take3:

フラグ使えばキレイにかけないかな? でもコードは余計長くなったような気も…
<?php
foreach (range(1, 100) as $n) {
    $b3 = ($n % 3)?0:1;
    $b5 = ($n % 5)?0:2;
    switch ($b3 | $b5) {
        case 0:
             echo "$n\n";
             break;
        case 1:
             echo "Fizz\n";
             break;
        case 2:
             echo "Buzz\n";
             break;
        case 3:
             echo "FizzBuzz\n";
             break;
    }
}

take3':

4パターンを fmt にして printf 使うと短くなりますね。
$fmt = array('%d', 'Fizz', 'Buzz', 'FizzBuzz');
foreach (range(1, 100) as $n) {
    $b3 = ($n % 3)?0:1;
    $b5 = ($n % 5)?0:2;
    printf($fmt[$b3 | $b5]."\n", $n);
}

perl でも作ってみた:

foreach (1 .. 100) {
    $a = ('FizzBuzz', 'Fizz', 'Buzz', 0)[($_ % 3 > 0) + 2 * ($_ % 5 > 0)] || $_;
    print "$a\n";
}
|| $_ とかトリッキーな事しなくても 0 を $_ にすればよいですね。

perl のを短くしてみた:

foreach (1 .. 100) {
    $_ = ($_, 'Fizz', 'Buzz', 'FizzBuzz')[!($_ % 3) + 2 * !($_ % 5)]."\n"; print
}
奇麗に記述できます。

所感:

噂が本当だとすると、僕は某Y社には入れそうにないですw

2011年01月28日(金)

SWF DefineShape parser

DefineShape1,2,3のバイナリを切り出すプログラムをPHPで作ってみました。

プログラムの概要:

$this->_shapeBounds = IO_SWF_Type::parseRECT($reader);
$this->_parseFILLSTYLEARRAY($reader);
$this->_parseLINESTYLEARRAY($reader);
$reader->byteAlign();
$numFillBits = $reader->getUIBits(4);
$numLineBits = $reader->getUIBits(4);
while ($done === false) {
    $typeFlag = $reader->getUIBit();
    if ($typeFlag == 0) {
        $endOfShape = $reader->getUIBits(5);
        if ($endOfShape == 0) {
            $done = true;
        } else {
            // StyleChangeRecord
            ...
	    $stateNewStyles = $reader->getUIBit();
	    if ($stateNewStyles) {
		$this->_parseFILLSTYLEARRAY($reader);
		$this->_parseLINESTYLEARRAY($reader);
                $reader->byteAlign();
		$numFillBits = $reader->getUIBits(4);
		$numLineBits = $reader->getUIBits(4);
	    }
        }
    } else {
        $straightFlag = $reader->getUIBit();
        if ($straightFlag) {
             // StraightEdgeRecord
             ...
        } else {
             // CurvedEdgeRecord
             ...
        }
    }
}

実行結果:

pear channel-discover openpear.org
pear install openpear/IO_Bit
pear install openpear/IO_SWF
でインストールして、pear ディレクトリの sample/swfdump.php にファイルを渡すと動作します。
ShapeId: 1
ShapeBounds:
        (-7.75, -7.75) - (7.75, 7.75)
FillStyles:
        solid fill: #0066ff
LineStyles:
ShapeRecords:
        ChangeStyle: MoveTo: (-7.75, -7.75)  FillStyle: 0|1  LineStyle: 0
        StraightEdge: MoveTo: (7.75, -7.75)
        StraightEdge: MoveTo: (7.75, 7.75)
        StraightEdge: MoveTo: (-7.75, 7.75)
        StraightEdge: MoveTo: (-7.75, -7.75)
こんな感じです。

TODO:

SVG に変換して表示できれば…

これで、4 日分だよ〜。

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