2009-01-01から1年間の記事一覧

Rubyでカリー化

ピクセル単位でRGB値を比較するCで書いた重たい関数、 doulbe diff(buf *b1, buf *b2) というのを高速化するために、 doulbe diff(buf *b1, buf *b2, int step) : for (i = 0; i < height; i+=step) for (j = 0; j < width; j+=step) : : d = diff(b1, b2, 4…

ハッシュが楽しい

イタリア人ハッカーが中心になって作ってる"Redis"が面白い。memcachedとかTokyo TyrantみたいなキーバリューのKVSに分類されるんだろうけど、リストやセットが扱えたり、keyを指定してintのincrementとかできる。ネットワーク帯域がやたら速くなって、バカ…

gprofを使ってみた

Cで10分とか20分とか時間のかかる処理の高速化をやってみたけど、何よりまずはプロファイリングせよということで、gprofを使ってみた。gprofというツールがあることすら知らなかった。 % gcc -pg -Wall -lm -lpthread paint.cのように「-pg」を付けてコンパ…

並列化よりも、まず最適化オプション

円を塗りつぶす処理を並列化してみたけど、ぜんぜん速度向上につながらない。よく考えてみると、並列化したループは、せいぜい50〜60回のものでしかないから、スレッド生成の準備とかオーバーヘッドで相殺されてるのかも。それより、gccの最適化オプションを…

200個の円で任意の写真を近似

100個とか200個の円で320×240ドットの領域を埋めて、それらのサイズや色、位置、透明度をランダムに変えていくことでターゲットの画像に近づけるという処理。既存画像(ppm形式)をロードする関数を書いたので、実際にどんなもんかと思って数千世代とか1万世…

やや顔が見える

円で顔写真を近似する処理で、円オブジェクトのmutateを3種類に分けた。全パラメータを一度にランダムに変化させる、1つのパラメータをランダムに変化させる、1つのパラメータを微妙に変化させる、の3つ。最初のうちは色々試行錯誤させて、最後のほうは微調…

円を少し進化させてみる

バッファを埋めた塗りつぶしの円を、少しずつ変化させて目的の画像に近づけるという処理をやってみた。 int mutate_circle (circle *cir) { cir->col = rand() & 0x00ffffff; cir->alpha = rand() % 100; cir->rad = rand() % 30 + 10; return 0; } 変化させ…

circleの範囲を最適化

バッファ上で円を塗りつぶすとき、 (0...buf.y).each do |i| (0...buf.x).each do |j| if (y - i)**2 + (x -j)**2 < r**2 then buf.buf[i][j] = color end end end とやっていたけど、明らかにチェックする意味がないところまで調べているので、 upper = (y …

structって何だ

以下のコードがいかにも冗長。 if test.within_circle(x, y, i, j, r) > 0 then old = buf.buf[i][j].r buf.buf[i][j].r = (color.r * fore) + (old * back) old = buf.buf[i][j].g buf.buf[i][j].g = (color.g * fore) + (old * back) old = buf.buf[i][j].…

Cの速さにがっくり来た

Rubyで書いたグラフィックバッファ処理と同じものをCで書き直してみた。 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct { int height; int width; int **raw; } buf; buf *init_buf (int width, int height) { buf *b; int i, j; b = (buf *)malloc(sizeof(</time.h></stdlib.h></stdio.h>…

CでRubyを低速化

「Rubyによる情報科学入門」(久野靖著)に、グラフィックバッファの例が出てたので、その演習の一部をやってみた。Rubyの構造体(Structクラス)を2次元配列にしてバッファを確保して、ピクセル単位でRGB値をいじるという例。PPMフォーマットがえらく手軽な…

AppleLines

これを見て、AppleLinesというのをやってみた。AppleLinesの動作は、こんな感じ。 % ruby apple.rb 0 apple************************* % ruby apple.rb 5 apple************************* *apple************************ **apple*********************** **…

重複ファイルチェック

写真や動画のフォルダを整理したい。なるべくオリジナルを残そうとするあまり、 cp ./orig/photo.jpg ./flower.jpgのように、リネームしてコピーすることが多い。そんなこんなで結構めちゃくちゃに重複が多い。指定したディレクトリ以下にある同一バイナリを…

読書感想とか

あれこれ読みつつ感想をメモ。 「プログラミング言語Ruby」(まつもと ゆきひろ、David Flanagan著) 淡々とした解説で読むのがつらいと思って放置ぎみだったけど、なぜか面白く感じるようになってきた。ちらちらとRubyの中身を見ながら動作を想像するのより…

follow、被followの比率を円グラフで表示

Twitter APIで戻ってくるXMLをパーズして、それから何がしかの情報を取ってくる場合、もしかしてSAXを使うべきじゃないだろうかと思った。XPathとかって、ある階層のノードをまとめて引っ張ってきてイテレートするにはいいけど、例えばuser/nameとuser/idと…

負のインデックス

array.cを少し。pop、shift、[]=あたりを見ていると、何だかRubyがCに見えてくる。Arrayオブジェクトって、結局はVALUE型、つまりunsigned longの配列でしかない。ちょっと今さら驚いたのは、memcpy、memmoveがコピー先、コピー元で重複があってもいいという…

無理してでも

無理してでも色々と記録をつけようとしている。間が空くと、やる気が失せるという経験則から。細切れに何かやってるからダメなのかもしれない。Rubyの中身をのぞくのに、そっかgdbを使えば順が追えそうだと当たり前のことに気づいてやってみた。スタックトレ…

rb_funcallの先って

Rubyでオブジェクトの等値性あたりがどうなっているのか見てみた。Objectクラスの初期化時のメソッド登録は、 2496 rb_define_method(rb_cBasicObject, "==", rb_obj_equal, 1); 2497 rb_define_method(rb_cBasicObject, "equal?", rb_obj_equal, 1); 2498 r…

RHG再び

rb_internは、よく見るとグローバル変数とかクラス変数とかも変換してる。メソッドIDの取得じゃなくて、これはもっと一般に内部の文字列表現とIDの対応だったようだ。と思って久しぶりにRuby Hacking Guideを見てみたら、ちゃーんとあれこれ書いてある。また…

object.c

Rubyの勉強のために始めたブログのはずが、Rubyが置き去り。思い出したように少し何かをと思って、object.cを眺めてみた。すべてのオブジェクトの親ったって何ができるわけでもないし、見てもつまらないと思って、array.cとかstring.cがおもしろいと思ってた…

btrfs

今日は、なんとなくbtrfsのソースコードを眺めてみた。期待のファイルシステム。

ソースコードというのを眺めてみる

このところ、あれこれ本を読んだりソースコードを読んだりしている。Cが少し書けるようになった気がしたので、少しは読めるようになってるのじゃないかと思って、GNU Global+ブラウザでいろいろと読んでみている。読むだけじゃなくて少し手を入れたりできる…

nokogiriを入れてみた

そういえばと思って検索してみたRubyのXML/HTMLパーザライブラリ「Nokogiri」が、実はHpricotよりもイケてるらしい。入れてみた。手元のUbuntu 8.04の環境だとlibxml2とlibxlstの開発用ヘッダファイルが別途インストールする必要があった。 % sudo aptitude …

それでもおかしい並列qsort

segvで落ちる並列qsortについて、どこからともなく神の声が聞こえた。 main()のpはstackにおかないでmallocする、ret1とret2を0以外で初期化する、if (...||...) free(pnext); の行を削除、myqsort()の最後でちゃんとreturn NULL;する、とかすれば多分動きそ…

pthread本

オライリーから出ているPthreadの解説本を通読してみた。前半は割とゆっくり、後半は「そんな議論があるのか、なるほど」と眺める程度に。mutexや状態変数、シグナルを使った同期制御の話とか、スレッドプールの実装例、カーネルとライブラリの実装アプロー…

2つに分けてソートしてからマージソート

与えられた配列を真ん中で2つに分けて、それぞれを並列にクイックソートしてからマージソートするという方針で書いてみた。といいつつ並列化のところだけ後回し。配列が自分の長さを知らないなんておかしいぞと思ったので、arrayという構造体を定義してみた…

pthreadクイックソートは放置することに

pthreadでqsortを並列化するのは、やっぱりうまく行かない。joinなしにすると微妙に結果が並びきっていないので、たぶんタイミングの問題だろうと思って、メインスレッドで以下のようにsleep(1)としてみたら、これがきちんとソートされるではないか。 #inclu…

壊れてた並列クイックソートが直った?

pthreadで並列化したつもりのクイックソートが微妙に壊れていた。 $ ./psort 10 0:3:5:6:9:7:6:6:3:2: --sort-- 0:2:3:3:6:5:6:6:7:9: $ ./psort 20 19:18:7:5:4:8:13:10:17:1:2:7:15:4:10:7:9:6:6:2: --sort-- 1:2:2:5:4:8:13:10:17:19:7:7:15:4:10:7:9:6:6…

クイックソートをpthreadで並列化

クイックソートはソート対象領域をどんどん分割していく方式なので単純に並列化できるらしい。pthreadでやってみた。pthread_createには関数へのポインタと、その関数への引数をvoid型ポインタで渡すようになっている。ということは複数の引数を渡すのって構…

壊れたクイックソート

仕事で海外に出ていて時間があいてしまった。こういうことって一度途切れると中断時間の1.5乗に比例してやる気がなくなる。もっとエントリの粒度を下げたほうがやる気が出そうなので、中途半端でもともかく更新を続けることを優先してみる。最後にやろうとし…