Droste式2分木画像を描く (2009/08/18)


2009/06/12

Ruby では false と nil が違うのはなぜかね。

nil には数値に変換する手段があるが、 false には無い。

yuji@tern:~%ruby -e 'p nil.methods - false.methods'
["to_i", "to_f"]

俺はつい if 修飾を map の block で使って最後に compact して 欲しいモノをあつめる、 という事をやってしまうのだが、 それの延長で、うっかり boolean が戻るコードを書いてしまう事がある。 これを compact しても 当然、 false は消えてくれない。

だからそういう処理では inject しとけ、 という事なのだが、これがついやってしまう。 map.compact は何か間違っても compact をやめれば 何をどう間違えたのかすぐ判るが、 inject はじっくり見ないと判らないからかもしれん。

といっても、これはプログラミングというよりはむしろ、 irb で何か分析する場合のはなしなんだけど、 俺の場合は irb で同じ事を何回も書くのが嫌だからライブラリにする、 みたいなコードが多いもので。

もし false が無くて nil だけだったら何か具合が悪い事があるのか無いのか。

2009/06/15

プログラミングは面白いかも、 と思ったのは、じつはメールのベイズ分類器が最初なんだ。 確率って面白いかも、と思ったのとも重なるね。

まだそういう発想をちゃんと修得できていないのだけれど、 データの集積自体に意味が内在していて、これを統計的に分析すると いろんな事が解る。 しかもアルゴリズムは案外単純。 さらに分散処理可能。 というあたりが非常に面白い。

たとえば google の PageRank もその一つですよね。 遷移行列があたえられたとき、分布確率の極限は 行列の最大固有値に対応する固有ベクトルにほかならない、というあれです。 アルゴリズムだって、笑っちゃうくらい単純だしな。

多分、データがたくさん簡単に手に入るようになったのも大きいと思う。

要するに、簡単な事と簡単な事を組み合わせてできる事だけが可能なんだよ。 俺みたいな普通の知能の奴の処世術としては、 イキった話は趣味だけにとどめておくのが人生を楽しむコツだと思ったよ。 ほんと、イキって難しい事やろうとするとロクな事にならないよ。

2009/06/16

カーネルを 2.6.26 にしたら、 ノーパソの内臓無線ネットワーク関係のものが、 独立した制御プロセスではなくカーネル内臓になっていた。

それに気づかず、最初はうろうろ意味不明な事をやっていたが、

   Jun 16 22:29:32 tern kernel: [ 1192.776105] iwl3945: iwlwifi-3945-1.ucode firmware file req failed: Reason -2

と syslog に書いてあったのでどうもファームウェアが無いらしい事に気づき、 firmware-iwlwifi というパッケージをインストールした。

これまで eth3 が無線だったのだが、 syslog をみると wlan0_rename という名前になっているようだったので、

iwconfig wlan0_rename essid any

ってやるとなんかデバイスが認識されたっぽいので

dhclient wlan0_rename

とやったらIPの設定が正確になされて、普通に通信できるようになった。 わーい。

起動時にちゃんと認識されるようにするにはどうすればいいのかのう。 とりあえず /etc/network/interfaces になんとなく wlan0_rename の エントリを作ってみたわけだが。

Droste HOWTO

wloj webmasters 最後のおつとめである。

ちなみに元の画像はこんな感じだ

だいぶ上下比も人物のプロポーションも違うwので、 似たような印象にするにはかなり改変する必要がある。

まず、元画像の背景色を色picker で拾って、背景を塗りつぶす。その上に、 文字を描く。文字のフチどりは、レイヤメニューから alpha channel から選択 というのを実行して2ドット選択範囲を拡大して黒で 塗りつぶしたものと元の文字を統合して作る。 alpha channel から選択、という操作を gimp の仕組み的文脈で解説すると、 透明度(alpha channel)を保持しているデータ(drawable)を、 選択範囲を保持しているデータ(これも実は drawable) にコピーするだけである。 つまり選択範囲というのはレイヤなどとなんら変わりのない、 描画対象データの一族(drawableという)であり、 ただ見せ方と、使える描画機能が多少違うだけである。

なんとなくペンギンの輪郭をアタリをとって作成。 ここはベジェツールを使う。そうすれば、あとで比較的簡単に形をいじれる。 これは背景とは別レイヤに作成する。 その理由はあとで説明する。

人物のプロポーションがだいぶ違うので、 お盆をオリジナル画像と同様の配置で描くと変になる。 では、どこに置けばいいのか、という問題になるので、 箱、茶碗を載せた盆は別レイヤにして移動、サイズを変更できるようにしたい。 なお、サイズはあんまり極端に変わるとテケテケになってしまうので、 できればいじるのは位置だけにしたい。

なお、腹はやはりベジェツールで形をとって、 線形グラデーションで塗った。

手を描く。うまくいったので、ついでに顔も描く。

左下のロゴをいれて、これで再帰の1段目が完成である。 あとは、これを適宜再帰的に縮小して binary tree を構成する。

注意せねばならないのは、箱の画像は、全体画像をそのまま縮小して、 彩度を下げ明度をあげたものを使えばよいが、 カップの画像はそうではなく背景とロゴを除去せねばならない (そのため、背景とロゴは別レイヤに作成したのである。)

まず、この状態でレイヤメニューの「可視レイヤの統合」を 実行し、できた統合レイヤをカットバッファにコピーして、 可視レイヤ統合まえまで undo し、 そこにバッファからペースト。 できたフローティングセレクションを新規レイヤに変換する(レイヤ タブの下に並んだボタンの左端のやつを押す)。

こうしてできた新規レイヤは、上記縮小対象のコピーですな。 これを、拡大/縮小ツールで箱の形に合わせて変換する。 拡大縮小ツールは、上下比を保って変換したり、自由にしたり切替えられるので、 ここでは上下比を自由に変更できるように。

一方、茶碗に貼る方は、こういうのを用意する

これを、さっき同様「可視レイヤ統合」で作成し、コピってから undo してペースト、新規レイヤに変換で作成し、 こっちは右側の茶碗の寸法に縮小する。

これを好きなだけ繰り返せばbinary tree recursive picture のできあがり。

xcfファイル


記事リストへ