2007年6月30日土曜日

次世代DVDの威力

このブログ記事をはてなブックマークに追加

Blu-ray Disk(BD)の映画を観たが、今までのDVDとまるきり違う精細さに驚いた。今までは内容の良し悪しが重要で映像など二の次だと考えていた。ある意味そうなのだろうが、映像の表現力がここまで変わってくると断言できなくなる。今までつぶれて見えなかった部分が見えてくる。映像の情報量が違うのだ。

これからは映像のHD化が進み、2011年7月24日には地上アナログTV放送は姿を消す予定だ。そのため、かなりの世帯でHD対応TVを持つことになるだろうし、そうするとDVDは一般の放送よりも劣った映像になってしまう。対価を払って購入したDVDが普段のTV放送よりも画質が劣っていてはさすがに納得いかない。ここで、BDやHD DVDなどの次世代DVDに存在価値が出てくる。次々世代DVDを待つという人もいるが、2011年にそれが普及しているとはとても思えないので、多分、BDかHD DVDはそれなりに認められ、ある程度普及しているのではないだろうか。BDとHD DVDのどちらがより多く普及しているか現段階では断言できないが、今のところBDが一歩リードしているようだ。

もし、Full HD対応TVで次世代DVDプレイヤーを利用できる機会があったら是非観て欲しい。今までの違いに驚くはずだ。(注: BD/HD DVDのソフトの中には劣悪なものも含まれるのでその辺はちゃんと確認して欲しい。)

続きを読む...

たまには独り言

このブログ記事をはてなブックマークに追加

京速コンピュータ…三社連合の複合アーキテクチャは良い。決定が遅すぎるのは悪い。

マスコミ…何であんなにいい加減なことで許されるんだ? 能力の限界か。せめて嘘言うのはやめよう。

Advanced/W-ZERO3[es]…まあまあ良い。多分使う。

次世代ゲーム機…Wiiはまったく興味がなくなってしまった。やりたいゲームも無い。PS3のゲームはかなり期待してる。Xbox360でも良いんだけど、PS3のほうがアーキテクチャが面白かった。やはり、ゲーム機に性能は必須。世間一般のゲームの捉え方と自分の理想との乖離が酷くなってきているようだ。

携帯ゲーム機…PSPは自分のおもちゃになった。NDSは子供のおもちゃになった。

ドリンクの自販機…取り出し口から取り出しにくい。これじゃ駄目だ。失格。そう思っていたら、取り出し口から自動でせり出てくる自販機に出会った。これはすばらしい。合格。

続きを読む...

2007年6月29日金曜日

Civilization Revolution

このブログ記事をはてなブックマークに追加

次世代ゲーム機および携帯ゲーム機用にCivilization Revolutionが作成されるらしい。PC用ゲームのCivilizationを元にしているが、コンシューマゲーム用にいろいろと変更を加えるようだ。PC用のCivilization IVは持っているが、腰を据えてプレイするだけの時間がなかなか取れないので、PSPで出ると嬉しい。正式なアナウンスはまだ無いが、対応機種は、PS3, PSP, Xbox360, NDSのようだ。


続きを読む...

matplotlib: 多項式によるフィッティング

このブログ記事をはてなブックマークに追加

matplotlibでは、polyfitを使えば簡単に多項式によるフィッティングを行える。図ではオリジナルのデータを赤でプロットし、それに対し、1次(黒)、2次(緑)、3次(青)の多項式によるラインを描いている。

以下、ソースコード。

from pylab import * x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] y = [1, 1, 2, 3, 5, 6, 8, 9, 8, 6] coeffs1 = polyfit(x, y, 1) coeffs2 = polyfit(x, y, 2) coeffs3 = polyfit(x, y, 3) besty1 = polyval(coeffs1, x) besty2 = polyval(coeffs2, x) besty3 = polyval(coeffs3, x) plot(x, y, "ro") plot(x, besty1, "-k", linewidth=2) plot(x, besty2, "-g", linewidth=2) plot(x, besty3, "-b", linewidth=2) grid(True) legend(["Data", "Order=1", "Order=2", "Order=3"], "best", numpoints=3) show()

続きを読む...

iGoogleのすゝめ

このブログ記事をはてなブックマークに追加

「Yahoo! Japan」が5月の月間ページビュー数で世界一になったらしい。自分はシンプルなGoogle派なのでごちゃごちゃしてるYahoo!はあまり見ることは無いのだけど、一般には受けるんかね。

単に検索するためだけならブラウザの検索ボックスがあるからページを開く必要は無いんだけど、iGoogleは便利なのでそれを良く使ってる。コンテンツをページの好きな場所に自由に貼り付ける感じもいい。Yahoo!にもMy Yahoo!があるけど、やっぱり広告が邪魔だし、ごちゃごちゃしているので自分の好みじゃないんだよね。

と云うわけで、iGoogleお勧めです。

続きを読む...

2007年6月28日木曜日

matplotlibによる線種や色などの指定方法

このブログ記事をはてなブックマークに追加

matplotlibの線の色、線種、線幅の指定方法を記しておく。

線の色はplot上で、青なら"b"、緑なら"g"のように指定する。ここでは、白い線を見せるために背景を灰色にしている。



以下、図の作成に使ったソースコード。

from pylab import * axes(axisbg="#777777") # 背景を灰色に. x = arange(-20, 20, 0.3) plot(x+1, x, "b") # 青. plot(x+2, x, "g") # 緑. plot(x+3, x, "r") # 赤. plot(x+4, x, "c") # シアン. plot(x+5, x, "m") # マゼンタ. plot(x+6, x, "y") # 黄. plot(x+7, x, "k") # 黒. plot(x+8, x, "w") # 白. plot(x+9, x, color="#77ff77") # エメラルドグリーン. legend(["blue", "green", "red", "cyan", "magenta", "yellow", "black", "white", "#77ff77"], "lower right") xlim(2, 12) ylim(-5, 5) show()

次に、線種の指定方法を示す。



以下、ソースコード。

from pylab import * x = arange(-20, 20, 0.3) plot(x+1, x, "-") plot(x+2, x, "--") plot(x+3, x, "-.") plot(x+4, x, ":") plot(x+5, x, ".") plot(x+6, x, ",") plot(x+7, x, "o") plot(x+8, x, "^") plot(x+9, x, "v") plot(x+10, x, "<") plot(x+11, x, ">") plot(x+12, x, "s") plot(x+13, x, "+") plot(x+14, x, "x") plot(x+15, x, "D") plot(x+16, x, "d") plot(x+17, x, "1") plot(x+18, x, "2") plot(x+19, x, "3") plot(x+20, x, "4") plot(x+21, x, "h") plot(x+22, x, "H") plot(x+23, x, "p") plot(x+24, x, "|") plot(x+25, x, "_") legend(["-", "--", "-.", ":", ".", ",", "o", "^", "v", "<", ">", "s", "+", "x", "D", "d", "1", "2", "3", "4", "h", "H", "p", "|", "_"], numpoints=5, pad=0.1) xlim(0, 30) ylim(-5, 5) show()

線の色や線種は複数を同時に指定することができる。また、線の幅も指定できる。



from pylab import * # linewidth の代わりに lw と書くこともできる. plot(arange(0, 10), "r--o", linewidth=2) show()

続きを読む...

バーナム効果

このブログ記事をはてなブックマークに追加

まずは、究極の血液型心理検査を実際に試してから続きを読んで欲しい。

誰にでも当てはまるような適当な話をされると、多くの人は自分にだけに当てはまるもののように錯覚し、自分をぴたりと言い当てているように感じる。占いや血液型性格診断で良く当たると思われるものはこのバーナム効果のためだと解釈できる。

まあ、人に迷惑をかけない限り占いや血液型診断を信じるのは構わないが、このバーナム効果のことは知っておいたほうが良いだろう。多くの詐欺に使える手口なので、これを知っていることで騙されることが回避できるかもしれない。まあ、騙される人はそれでもきっと騙されるのかもしれないけど。人を見たら泥棒と思え…とはまで言わないけど、冷静になって客観的に自分を見る目を養うことは重要だと思う。

続きを読む...

2007年6月27日水曜日

Internet Archive: Wayback Machine

このブログ記事をはてなブックマークに追加

Internet Archive: Wayback Machineで、過去のウェブサイトの情報を得ることができる。既になくなってしまったサイトなどを探すときに便利。

続きを読む...

matplotlibで3次元プロット

このブログ記事をはてなブックマークに追加

一昔前は2次元しか扱えなかったが、最近では3次元プロットも利用できるmatplotlib。Cookbook/Matplotlib/mplot3Dあたりを読めばなんとなく使い方はわかる。利用するには、以下のようにモジュールを読み込んでおく。

import pylab as p import matplotlib.axes3d as p3

ネットで調べてみたらscipy+matplotlibによる3元連立常微分方程式の軌道について書かれているサイトを発見。ふむふむ、参考になる。Gnuplot.pyは知らなかったな。でも最終更新が2003年と古い。numpyではなく古いNumericを使っているっぽい。やはり、matplotlibがいいなぁ。でも、plot3Dだとうまくいかないようなことが書かれている。そうなのか…と思って試してみた。例示されているコード中のscatter3Dをplot3Dに変更するだけ。見た目はまったく問題ないように見えるけど、何か問題があるのかな? バージョンの違い? どちらにしろ自分としてはこれで十分かな。

余談だが、現時点で最新のscipy-0.5.2とnumpy-1.0.3の組み合わせでは正常にコンパイルできない。

svc co http://svn.scipy.org/svn/numpy/trunk numpy svc co http://svn.scipy.org/svn/scipy/trunk scipy

上記のようにsvcで最新のバージョンを取ってくるか、numpy-1.0.2を利用しなければならない。

続きを読む...

2007年6月26日火曜日

PythonでRSSやAtomを読み込む

このブログ記事をはてなブックマークに追加

PythonでRSSやAtomなどのフィードを読み込んでみた。feedparserを使えば一発。簡単。

import feedparser d = feedparser.parse("http://handasse.blogspot.com/feeds/posts/default") print d.feed.title 良いもの。悪いもの。 print d.feed.link http://handasse.blogspot.com/

続きを読む...

C言語で実行時間測定

このブログ記事をはてなブックマークに追加

C言語で実行時間を測定する方法。覚書。正確さから言えばgettimeofdayかな。手軽さからならclockあたりで。Unixであれば、timeコマンドがソースの変更もなく手間もかからず簡単。Windowsの場合は、timeitコマンドリソースキットに含まれている。

% time 実行ファイル

以下、Cのコード。

clock

#include <stdio.h> #include <time.h> int main() { clock_t t1, t2; t1 = clock(); /* 処理. */ t2 = clock(); printf("%f\n", (double)(t2 - t1) / CLOCKS_PER_SEC); return 0; }

gettimeofday

#include <stdio.h> #include <time.h> #include <sys/time.h> double gettimeofday_sec() { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec + tv.tv_usec * 1e-6; } int main() { double t1, t2; t1 = gettimeofday_sec(); /* 処理. */ t2 = gettimeofday_sec(); printf("%f\n", t2 - t1); return 0; }

getrusage

#include <stdio.h> #include <time.h> #include <sys/time.h> #include <sys/resource.h> double getrusage_sec() { struct rusage t; struct timeval tv; getrusage(RUSAGE_SELF, &t); tv = t.ru_utime; return tv.tv_sec + tv.tv_usec * 1e-6; } int main() { double t1, t2; t1 = getrusage_sec(); /* 処理. */ t2 = getrusage_sec(); printf("%f\n", t2 - t1); return 0; }

times

#include <stdio.h> #include <time.h> #include <unistd.h> #include <sys/time.h> #include <sys/times.h> clock_t times_clock() { struct tms t; return times(&t); } int main() { clock_t t1, t2; t1 = times_clock(); /* 処理. */ t2 = times_clock(); printf("%f\n", (double)(t2 - t1) / sysconf(_SC_CLK_TCK)); return 0; }

続きを読む...

2007年6月25日月曜日

カオス - 新しい科学をつくる

このブログ記事をはてなブックマークに追加

カオス―新しい科学をつくる」は15年も前に読んだ本なのだが、非常に面白かった。以前からマンデルブロ集合やローレンツアトラクタなどに興味を持っていたのだが、素人にもわかりやすく記述されており、世界にはなんて奇妙で不可思議な現象があるのだろうと素直に感じた。事実は小説より奇なりとはよく言ったものだ。こんなこと、事実を目の当たりにしなければ、到底信じられない。

例えば、x(next)=rx(1-x) という式がある。これは一見何の変哲もない式に見えるが、rのパラメータを変化させていき、xがどの値に落ち着くか観察してみるといい。とても奇妙な振る舞いが見られる。xの初期値を0.4としたとき、r=2.8ならばxの値は1つに落ち着くが、r=3.2だと2つ、r=3.5だと4つ、r=3.7だと無数になる。そうかと思えば、r=3.84だと3つに収束する。なんとも不思議だ。こういった予測できない振る舞いがカオスなのである。

上記のグラフはPython+matplotlibで描いたが、そのコードを書いておく。

from pylab import * def calc(r, x, n): values = [] f = lambda r, x: r * x * (1.0 - x) for i in xrange(n): x = f(r, x) values.append(x) return values if __name__ == "__main__": n = 1000 x = 0.4 for r in arange(2.8, 4.0, 0.001): plot([r for i in xrange(n-n//10)], calc(r, x, n)[n//10:], "b.", markersize=1) axis([2.8, 4.0, 0.0, 1.0]) text(2.9, 0.2, r"$x_\rm{next} = rx(1-x)$", fontsize=30) xlabel(r"$r$", fontsize=20) ylabel(r"$x$", fontsize=20) show()

続きを読む...

複数のSPEを利用したCellプログラムの雛形

このブログ記事をはてなブックマークに追加

入力データ in を複数のSPEに割り当てて処理を行う。結果は出力データ out に格納される。

program_ppe.c

/* ppu-gcc -lspe2 -lpthread program_ppe.c -o program_ppe */ #include <stdio.h> #include <libspe2.h> #include <pthread.h> #define SPE_PROGRAM "program_spe" #define NUM_SPE 4 #define SIZE (10000) #define DMA_BY_TYPE (16) /* (16) for char, (4) for int */ typedef struct { unsigned long long ea_in; unsigned long long ea_out; unsigned int size; int pad[3]; } params_t; params_t params[NUM_SPE] __attribute__((aligned(16))); typedef struct { spe_context_ptr_t spe; params_t *params; } thread_arg_t; void *run_spe(void *thread_arg) { int ret; thread_arg_t *arg = (thread_arg_t *)thread_arg; unsigned int entry; spe_stop_info_t stop_info; entry = SPE_DEFAULT_ENTRY; spe_context_run(arg->spe, &entry, 0, arg->params, NULL, &stop_info); return NULL; } void process_spe(unsigned char *in, unsigned char *out) { int i; int size, spe_size[NUM_SPE]; spe_program_handle_t *prog; spe_context_ptr_t spe[NUM_SPE]; pthread_t thread[NUM_SPE]; thread_arg_t arg[NUM_SPE]; prog = spe_image_open(SPE_PROGRAM); for (i = 0; i < NUM_SPE; i++) { spe[i] = spe_context_create(0, NULL); spe_program_load(spe[i], prog); } size = SIZE / DMA_BY_TYPE / NUM_SPE; for (i = 0; i < NUM_SPE - 1; i++) spe_size[i] = size * DMA_BY_TYPE; spe_size[NUM_SPE - 1] = (SIZE - size * DMA_BY_TYPE * (NUM_SPE - 1)); size = 0; for (i = 0; i < NUM_SPE; i++) { params[i].ea_in = (unsigned long)&in[size]; params[i].ea_out = (unsigned long)&out[size]; params[i].size = spe_size[i]; size += spe_size[i]; arg[i].spe = spe[i]; arg[i].params = &params[i]; pthread_create(&thread[i], NULL, run_spe, &arg[i]); } for (i = 0; i < NUM_SPE; i++) { pthread_join(thread[i], NULL); spe_context_destroy(spe[i]); } } int main() { unsigned char in[SIZE] __attribute__((aligned(16))) = { 0 }; unsigned char out[SIZE] __attribute__((aligned(16))); process_spe(in, out); return 0; }

program_spe.c

/* spu-gcc program_spe.c -o program_spe */ #include <stdio.h> #include <spu_intrinsics.h> #include <spu_mfcio.h> #define DMA_BUFSIZE (16 << 10) #define DMA_BY_TYPE (16) /* (16) for char, (4) for int */ unsigned char in[DMA_BUFSIZE] __attribute((aligned(16))); unsigned char out[DMA_BUFSIZE] __attribute((aligned(16))); typedef struct { unsigned long long ea_in; unsigned long long ea_out; unsigned int size; int pad[3]; } params_t; params_t params __attribute__((aligned(16))); int main(unsigned long long spe, unsigned long long argp, unsigned long long envp) { int i; int tag = 1; unsigned int bufsize; unsigned int padding = 0; spu_mfcdma64(&params, mfc_ea2h(argp), mfc_ea2l(argp), sizeof(params_t), tag, MFC_GET_CMD); spu_writech(MFC_WrTagMask, 1 << tag); spu_mfcstat(MFC_TAG_UPDATE_ALL); for (i = 0; i < params.size; i += DMA_BUFSIZE) { if (i + DMA_BUFSIZE > params.size) { bufsize = params.size - i; padding = bufsize % DMA_BY_TYPE; if (padding != 0) bufsize += (DMA_BY_TYPE - padding); } else bufsize = DMA_BUFSIZE; spu_mfcdma64(in, mfc_ea2h(params.ea_in+i), mfc_ea2l(params.ea_in+i), bufsize * sizeof(char), tag, MFC_GET_CMD); spu_writech(MFC_WrTagMask, 1 << tag); spu_mfcstat(MFC_TAG_UPDATE_ALL); /* processing */ spu_mfcdma64(out, mfc_ea2h(params.ea_out+i), mfc_ea2l(params.ea_out+i), bufsize * sizeof(char), tag, MFC_PUT_CMD); spu_writech(MFC_WrTagMask, 1 << tag); spu_mfcstat(MFC_TAG_UPDATE_ALL); } return 0; }

続きを読む...

2007年6月24日日曜日

氷と炎の歌

このブログ記事をはてなブックマークに追加

久々に寝食を忘れて読める本に出会った。

氷と炎の歌シリーズは、ジョージ・R・R・マーティンが著者のローカス賞受賞作だ。全7部作("A Game of Thrones" (1996), "A Clash of Kings" (1998), "A Storm of Swords" (2000), "A Feast for Crows" (2005), "A Dance with Dragons", "The Winds of Winter", "A Dream of Spring")の予定で、現在、原書で第4部まで刊行されており、日本語訳は第3部(「七王国の玉座(しちおうこくのぎょくざ)」、「王狼たちの戦旗(おうろうたちのせんき)」、「剣嵐の大地(けんらんのだいち)」)まで出ている。

内容は簡単に言えば、戦記もので第1部のタイトルにも入っているように、ある事件がきっかけで複数に分裂した王国の群雄割拠物語である。それだけに登場人物も非常に多い。北部では人外の者である「異形人(The Others)」、現在では死に絶えたと言われる「ドラゴン」、ある種の魔法など、いくつかのファンタジーの要素もあるにはあるが、物語を味付けするためのスパイスとして入れられているに過ぎず、それが主となることはない。この物語は、現実世界となんら変わるところはない人間の生き様や愛憎を扱った、ヒューマンドラマなのだ。それだけに、嫉妬や憎悪など人間の負の面が赤裸々に描かれており、所謂「綺麗な」話を望む人々や子供たちは読まないほうが良いだろう。

この氷と炎の歌で特筆されることは、明確な主人公がいないことである。それぞれの章で登場人物の一人が指定され、その主観で物語が綴られている。その人物が感じたこと考えていることで構成されいるので、同じ物事の描写も章によって大きく異なる。また、選ばれる人物は基本的に立場の弱い人々である。弱いといっても社会的弱者という意味ではなく、その環境で困難な状況にある人物という意味であり、身分としての弱者ではない。このマーティンという作家は弱者を描くのがとてもうまいと思う。

この物語では主人公がいないと書いたが、裏を返せば安全な人物はいないということだ。どんな人物もいつでも死と隣りあわせなのだ。たとえいなくなれば物語が破綻しそうなだと思われるような本当に重要な人物だとしてもだ。それだけに、先の読めない展開にはらはらどきどきし、時を忘れて読み耽ってしまうのだ。

三国志演義や戦国時代の歴史小説などが好きな人やダーク・ファンタジーの好きな人には薦められると思う。

文庫本





単行本(ハードカバー)






続きを読む...

2007年6月22日金曜日

C++による数値・文字列の変換

このブログ記事をはてなブックマークに追加

C++ではsstreamを使うことで、数値から文字列、文字列から数値への変換を行うことができる。

#include <iostream> #include <sstream> using namespace std; int main() { stringstream ss; double pi; // 文字列から数値に変換. ss << "3.14"; ss >> pi; cout << showpoint << pi << endl; ss.clear(); // 状態をクリア. ss.str(""); // 文字列をクリア. // 数値から文字列に変換. ss << 123 << "NUMBER"; cout << ss.str() << endl; return 0; } 3.14000 123NUMBER

続きを読む...

C++マニピュレータ

このブログ記事をはてなブックマークに追加

#include <iostream> // 引数なしマニピュレータ #include <iomanip> // 引数付きマニピュレータ

endl
改行文字"\n"を負荷して出力をフラッシュ。

ends
NULL文字"\0"を負荷して出力をフラッシュ。

flush
出力をフラッシュ。

boolalpha | noboolalpha
boolの値を "true", "false" で出力する/しない(デフォルトでは 1, 0)。

showbase | noshowbase
16進数のとき"0x"、8進数のとき"0"を先頭に付加して出力する/しない。

showpos | noshowpos
正の数のとき + 符号を出力する/しない。

showpoint | noshowpoint
浮動小数点表示で末尾の 0 を出力する/しない。

skipws | noskipws
入力時、空白を読み飛ばす/読み飛ばさない。

uppercase | nouppercase
16進数表示(a~f)や概数表示(e)のときアルファベットを大文字で出力する/しない。

left
フィールド幅が設定されているとき、値を左寄せ。"123 "

right
フィールド幅が設定されているとき、値を右寄せ。" 123"

internal
フィールド幅が設定されているとき、符号を左寄せ、値を右寄せ。"+ 123"

dec
10進数で出力(デフォルト)。

hex
16進数で出力。

oct
8進数で出力。

fixed
概数表示をしない(デフォルト)。"123.456"

scientific
概数表示をする。"1.23456e+003"

setbase(int base)
基数を設定。16進数ならば、setbase(16)

setfill(char f)
詰め文字を設定。setfill('0')の場合、"000123"

setprecision(int p)
浮動小数点表示のときの表示桁数を設定(デフォルトは6)。

setw(int width)
フィールド幅を設定(デフォルトは 0)。

setioflags(ios_base::fmtflags f)
指定の書式設定フラグを設定。

使い方の例:

#include <iostream> #include <iomanip> using namespace std; int main() { cout << "PI = "; cout << fixed << setw(7) << setprecision(5) << 3.14159265 << endl; cout << scientific << uppercase << 123.456789 << endl; return 0; } PI = 3.14159 1.23457E+002

続きを読む...

2007年6月20日水曜日

matplotlibの簡単な説明

このブログ記事をはてなブックマークに追加

matplotlibはPythonで利用できるグラフ作成モジュールで、高機能で使いやすい。とても便利なので是非ともインストールしておこう。

以下のようにモジュールを読み込み、matplotlibを利用できるようにする。

from pylab import *

直線を描く。

plot([1, 2, 3]) show()



続けてグラフを描くとき、以前のグラフを残したままだと同じ図にプロットされてしまう。以前の図の内容を消去したい場合は、

clf()

とすればよい。

グラフの範囲をaxisで指定し、x, yに対応したリストでポイントに赤丸を打ち、赤い線で結ぶ("ro-")。

plot([1, 2, 3, 4, 5], [5, 10, 20, 50, 100], "ro-") axis([0, 6, 0, 100]) show()

axisの代わりに、

xlim(0, 6) ylim(0, 100)

でも可。



二次曲線を緑の線("g")で描く。タイトルもつける。

x = arange(0.0, 10.0, 0.01) title(r"Quadratic Curve", fontsize=20) plot(x, x**2, "g") show()



正弦曲線を描く。タイトルとラベルをつける。タイトルやラベルにはTeXの形式で数式を書くこともできる。

t = arange(0.0, 2.0, 0.01) s = sin(pi * t) plot(t, s) title(r"Sine Curve", fontsize=20) xlabel(r"$\theta$", fontsize=15) ylabel(r"$\rm{sin}(\theta)$", fontsize=15) show()



正弦曲線のグラフ内に二次曲線のグラフを埋め込む。さらに、EPS形式でグラフをファイルに書き出す。

t = arange(0.0, 2.0, 0.01) s = sin(pi * t) plot(t, s) title(r"Sine Curve", fontsize=20) xlabel(r"$\theta$", fontsize=15) ylabel(r"$\rm{sin}(\theta)$", fontsize=15) a = axes([0.60, 0.55, 0.25, 0.25]) x = arange(0.0, 10.0, 0.01) title(r"Quadratic Curve") plot(x, x**2, "g") setp(a) savefig("curve.eps") show()



後は、チュートリアルユーザーズガイド(PDF)を参考に。

続きを読む...

2007年6月19日火曜日

Pythonで宛先ごとにスパムメール数を調べる

このブログ記事をはてなブックマークに追加

1日200通ほどのスパムメールが来る。ほとんどのスパムメールはフィルターを通して処理されるので実害は少ないが、気持ちの良いものではない。ふと、複数のメールアカウントを使っていてどのアカウントが一番被害があるのかちょっと気になったので、メールアドレスごとにスパムメールを数え上げ、数の多い順に表示するPythonプログラムを書いてみた。Pythonらしからぬばっちぃコードなのであまりコーディングの参考にしないこと。

import re def read_spam(fname, pattern): data = [] for d in [[s for s in l.replace(":", " ").replace("<", " ").replace(">", " ").strip().rstrip().split()[1:] if not re.search("\"", s) if re.search(".+@.+", s)] for l in file(fname) if re.search(pattern, l)]: data.extend(d) data_counts = {} for d in set(data): data_counts[d] = data.count(d) for d in sorted(data_counts, cmp=lambda x, y: cmp(data_counts[x], data_counts[y]), reverse=True): print "%5d %s" % (data_counts[d], d)

普段はThunderbirdを利用しており、デフォルトではスパムメールはJunkファイルに落とされる。その場合、以下のように実行すればOK。

read_spam("Junk", "^To: ")

以下のように表示される。

4652 aaa@mail.address 3745 bbb@mail.address 2176 ccc@mail.address 1819 ddd@mail.address 686 eee@mail.address (以下、略)

メールアドレスは変更しているがメール数は実際に計測した数値である。まあ、大体予想通りであったが、それにしても多すぎる。ひどいものだ。

続きを読む...

2007年6月18日月曜日

Pythonを利用してプロキシ経由でウェブを読み込む方法

このブログ記事をはてなブックマークに追加

プロキシのリストはCyberSyndromeあたりでどうぞ。

import urllib2 def get_web(url, proxy): proxy_handler = urllib2.ProxyHandler({"http": proxy}) opener = urllib2.build_opener(proxy_handler) web = opener.open(url) print web.read() if __name__ == "__main__": get_web("http://目的のURL/", "http://プロキシのURL/")

続きを読む...

2007年6月17日日曜日

Googleのソフトウェア・エンジニアって?

このブログ記事をはてなブックマークに追加

Slashdot.jpGoogleのソフトウェア・エンジニアはこんなことをしていますという記事がしばらく前に掲載された。そこから、へ~たのめも:Google のソフトウェア・エンジニアリングがリンクされているのだが、その記事を読むと20%ルール適用など、Googleの仕事のやり方が垣間見えて面白い。この記事はGoogle Developer Day Tokyoで行われた鵜飼文敏さんのプレゼンの要約らしい。



ところで、GoogleではC++, Java, Pythonが3大言語らしいが、自分ではC++, Pythonを良く使っている。特にPythonは何をする上でも必要になってきてる。numpy, scipy, matplotlibは必須。便利すぎ。

続きを読む...

SPE用SIMD演算を利用した大文字変換プログラムにバグ

このブログ記事をはてなブックマークに追加

フィックスターズ3.7 演習問題 (3-2) 大文字変換プログラム解答で示されたSPE用ソースコードにバグがあることを見つけた。

小文字を大文字に変換する単純なプログラムで、サンプルの文字列、"A Quick Brown Fox Jumps Over The Lazy Dog.\0"だと問題ないように見えるが、代わりに"Linux\0"を処理すると、"LINUW"と表示されてしまう。

SPE用ソースコード内の小文字を大文字に変換する部分を以下に示すが、赤字で示すコードが誤りだ。

vpata = spu_cmpgt(va, vin[i]); vpatz = spu_cmpgt(vin[i], vz); vpat = spu_or(vpata, vpatz); vout_upper = (vector unsigned char) spu_sub((vector unsigned short) vin[i], (vector unsigned short) voffset); vout[i] = spu_sel(vout_upper, vin[i], vpat);

無理やりvector unsigned charからvector unsigned shortにキャストしてvoffset(0x20)の引き算を行っているが、これだと、"Linux\0"は"Li", "nu", "x\0"となり、それぞれから"0x20, 0x20"を引くことになる。上位の桁と下位の桁で繰り下げがなければ問題がないが、繰り下げがあると上位の桁に影響が出てきてしまうのである。"Li", "nu"は繰り下げは起きないが、"x\0"の場合、"0x78, 0x00"からそれぞれ0x20を引くわけで、"0x57, 0xe0"となる。0xe0は小文字の文字コード範囲から外れているので無視されるが、0x57は"W"として認識される。よって、出力が"LINUW"となってしまうのだ。

以下のように直せばよい(赤字で示したコードが変更部分)。voffsetは型が変わっているので注意。

vector unsigned short voffset = spu_splats((unsigned short) ('a' - 'A')); vector unsigned char vzero = spu_splats((unsigned char) 0); vector unsigned char vpat1 = (vector unsigned char) { 0x10, 0x00, 0x10, 0x01, 0x10, 0x02, 0x10, 0x03, 0x10, 0x04, 0x10, 0x05, 0x10, 0x06, 0x10, 0x07 }; vector unsigned char vpat2 = (vector unsigned char) { 0x10, 0x09, 0x10, 0x0a, 0x10, 0x0b, 0x10, 0x0c, 0x10, 0x0d, 0x10, 0x0e, 0x01, 0x0e, 0x10, 0x0f }; vector unsigned char vpat3 = (vector unsigned char) { 0x01, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x1f }; vector unsigned short vin_s1, vin_s2, vin_s1_sub, vin_s2_sub; vpata = spu_cmpgt(va, vin[i]); vpatz = spu_cmpgt(vin[i], vz); vpat = spu_or(vpata, vpatz); vin_s1 = (vector unsigned short) spu_shuffle(vin[i], vzero, vpat1); vin_s2 = (vector unsigned short) spu_shuffle(vin[i], vzero, vpat2); vin_s1_sub = spu_sub(vin_s1, voffset); vin_s2_sub = spu_sub(vin_s2, voffset); vout_upper = (vector unsigned char) spu_shuffle(vin_s1_sub, vin_s2_sub, vpat3); vout[i] = spu_sel(vout_upper, vin[i], vpat);

もしかしたら、複雑な操作を避けるためにわざとバグ入りコードにしているかもしれないが、これで学習した人が誤って覚えてしまう危険性があるので、一言注意書きはいると思う。

続きを読む...

2007年6月16日土曜日

PS3からWindows Media Playerを利用したDLNA接続ができないときの対処方法

このブログ記事をはてなブックマークに追加

PS3 WikiDLNAクライアントにPS3からWindows Media Playerを利用したDLNA接続の方法がある。ただし、Windows Media Playerのデジタル著作権(DRM)ファイルが壊れていると、PS3デバイスが認識されず、DLNAを利用できない。

これは以下の方法で修復することができる。

スタート→コントロールパネル→パフォーマンスとメンテナンス→管理ツール→サービス→Windows Media Player Network Sharing Serviceを停止する。

コマンドプロンプトを立ち上げ、

cd "C:\Documents and Settings\All Users\DRM"

と入力する。確認のために、

dir /a /b

と打ち込むと、以下のようなファイルが表示されると思う。

Cache drmstore.hds migration.log v3ks.bla v3ks.sec

続けて以下のコマンドを入力して、そのフォルダにあるファイルを削除。

del *.* /f /a

Windows Media Player Network Sharing Serviceを開始する。

これで修復することができる。ただし、この方法は自己責任で。

続きを読む...

2007年6月15日金曜日

gccからppu-gccに変更したらAltiVecを利用したSIMD演算でエラー

このブログ記事をはてなブックマークに追加

フィックススターズCellプログラミングチュートリアルは初めてPS3でCellのプログラムを作るのには丁度良い内容と分量になっている。それほど難しいことは無く、基本を習得できるのだ。しかし、この記事を書いている時点では、最終更新日が2007年2月2日と、内容が若干古い。

PPE用のプログラムもすべてgccでコンパイルするようになっている。PPE用のプログラムはppu-gccを利用したほうがCell用に最適化してくれるので実行効率が良い。なので、gccでコンパイルされているところはすべてppu-gccにすればよいのだが、実はこのチュートリアルではそれではエラーが出てしまうのである。

たとえば、SIMDを使った条件分岐の削除にあるプログラムだが、これをppu-gccでコンパイルすると、

error: incompatible types in assignment

と、エラーが出る。これは

vpat = vec_cmpgt(va[i], vb[i]);

に示すコードの返り値の型が一致していないことが原因である。なので、

vector unsigned int vpat;

の部分を、

vector bool int vpat;

のように変更する必要がある。

別のソースコードも似たようなエラーが起こるが、ほとんどが型の不一致が原因なので、宣言の型を変更したり、目的の型にキャストすればエラーは解消される。

続きを読む...

Bloggerに「続きを読む」機能を導入

このブログ記事をはてなブックマークに追加

このBlogger、なかなか使い勝手が良いのだけど、一つ大きな不満がある。「続きを読む」機能がないのだ。英語で言えば"Read more"だ。そこでネット上を検索したところ、クリボウの Blogger Tipsなるページを見つけた。ふむふむ、これならできそうかな…? しかし、すべての記事に「続きを読む」リンクが表示されてしまう。これをどうにかできないかと思ったら、同じサイトでそれを消すやり方が出ていた…が、今度は投稿記事中にその記事自体のURLを埋め込まないといけないらしい。これでは手軽に投稿できる機能に価値を見出していた自分としては意味がなくなってしまう。う~ん、自分でスクリプト書けば何とかなるかなぁ…とも思ったが、広い世の中、同じことを考えている人は絶対いるはずだともう少し探し回ってみたところ、Blogger Beta Tipsなるサイトを見つけた。どうやら、Beautiful BetaというサイトでJavaScriptによって「続きを読む」機能を実装したらしい。早速、使わせてもらったが、素晴らしい!

Blogger Beta Tipsのページとかなり被ってしまうが、Beautiful Betaの日本語訳と日本語化した導入方法を以下に書いておく。

1. まずは「テンプレート」タブから「HTMLの編集」タブを開き、「テンプレートをすべてダウンロード」で現在のテンプレートを保存する。そのテンプレートを編集するのだが、編集前にバックアップファイルは残しておいたほうが良い。

2. 以下のコードをメモ帳などのテキストエディタを使って、</head>タグの直前に書き込む。

<script type='text/javascript' src='http://www.anniyalogam.com/widgets/hackosphere.js' />

3. テンプレートコード中で下記の赤字の部分を書き加える。

<b:includable id='post' var='post'> <div class='post'> <a expr:name='data:post.id'/> <b:if cond='data:post.title'> <h3 class='post-title'> <b:if cond='data:post.url'> <a expr:href='data:post.url'><data:post.title/></a> <b:else/> <data:post.title/> </b:if> </h3> </b:if> <div class='post-header-line-1'/> <div class='post-body' expr:id='"post-" + data:post.id'> <b:if cond='data:blog.pageType == "item"'> <p><data:post.body/></p> <b:else/> <style>#fullpost {display:none;}</style> <p><data:post.body/></p> <span id='showlink'> <p><a expr:onclick='"javascript:showFull(\"post-" + data:post.id + "\");"' href='javascript:void(0);'>続きを読む...</a></p> </span> <span id='hidelink' style='display:none'> <p><a expr:onclick='"javascript:hideFull(\"post-" + data:post.id + "\");"' href='javascript:void(0);'>要約を表示...</a></p> </span> <script type='text/javascript'>checkFull("post-" + "<data:post.id/>")</script> </b:if> <div style='clear: both;'/> <!-- clear for photos floats --> </div> </div>

ここでテンプレートファイルを保存する。「テンプレート」タブから「HTMLの編集」タブを再び開き、「参照」ボタンで修正したテンプレートファイルを選択し、「アップロード」ボタンでアップロードをする。

4. 「設定」タブの「フォーマット」タブを開いて、「投稿テンプレート」のところに、以下のコードを書き込む。

ここに要約を書く。 <span id="fullpost"> ここに残りの文章を書く。 </span>

因みに、このスクリプトの作者によれば、http://www.anniyalogam.com/widgets/hackosphere.js の読み込みが遅かったり、ブロックされている場合は、スクリプト自体をテンプレートに埋め込むか、正常に読み込めるホストに置くようにしてくれとのこと。

続きを読む...

2007年6月13日水曜日

リンク先のウェブサイトをサムネイル表示 - Snap Shots

このブログ記事をはてなブックマークに追加

まずは下記のリンク上にマウスポインタを置いて欲しい。

Snap Shots

リンク先のウェブサイトのサムネイルが表示されたと思う。この機能、適当なウェブを閲覧していたときに見つけたのだけど、一目で気に入ってしまった。しかも、自分のサイトに導入するのもとても簡単。<head>~</head>内の最後に指定されたHTMLテキストをカット&ペーストするだけ。

リリースとともにすぐに弄り回したJavaのときやまだほとんどの人に存在すら知られていなかったGoogleベータ版のサービスを見たときも絶対流行ると思ったけど(そしてどちらも爆発的に普及した)、これも流行る予感。すでに広まりつつあるしね。

続きを読む...

PcCtlCom moduleエラーでウイルスバスター2007が起動しない

このブログ記事をはてなブックマークに追加

タイトルの通りで、少し前からPcCtlCom moduleエラーのダイアログが出てトレンドマイクロのウイルスバスター2007が起動しなくなっていた。ウイルスやスパイウェアなどが悪さしているのかと思い、いろいろ調べたが特にそれらしい形跡は見当たらなかったので、普通にコントロールパネルからウイルスバスターをアンインストールして、再度インストールをしてもやはりエラーが出る。

そこで、ウイルスバスターのインストールディレクトリにできるPCCTool.exeというプログラムを起動して、ファイアーウォールを削除、次いでプログラムの削除を実行し、そのあと再インストールしたら正常に起動するようになった。どうやら、何かの拍子でレジストリが壊れたか競合するようになってしまったらしい。

ウイルスバスターで問題が出たらまずはPCCTool.exeで削除するのが良いようだ。あと、インストールするプログラムは最新のものをダウンロードしておくのが吉。

続きを読む...

2007年6月12日火曜日

PLAYSTATION 3を購入

このブログ記事をはてなブックマークに追加

しばらく前にPS3を買った。最近は据え置き型のゲーム機はあまり弄らなくなってきたが、PS3とWiiのどちらかは買ってみようかなと、前々から考えていた。以前はWiiの方が面白いかもと思っていたけど、よくよく自分がやりたいもの・したいことを考えた場合、PS3の方が良いことに気がついた。

まず、うちにはまともなテレビがない。そこで、半分壊れかけた10年近く前のCRTモニタをFullHDのディスプレイに交換して、それに合わせてBlu-ray Disc(BD)/DVD再生機として使ってみることに。
次に、PS3, Wiiのどちらもゲームソフトはまだまだ少ないが、それでも今後のことを考えると自分としてはPS3に分があるように思う。God of War 3, Lair, GT5, Killzone, Assassin's Creedなど。やはり本体のポテンシャルが高いことは重要だ。
で、最後にこれが一番の理由だったのだけど、アーキテクチャが面白い。LinuxでCellを使ったプログラミングができるのが良い。SPEやSIMDを利用したプログラミングはパズルを解いているようで楽しい。ま、これが仕事だとそうもいってられないかもしれないけど、趣味でやるには丁度良いです。

購入後は、Fedora Core 6入れてプログラミングしている時間が一番長いかも。面白いよ。あとは、一つぐらいはゲームソフトも買っておくかということで、MOTORSTORMを買ってみた。こちらも期待していた以上に面白い。まあ、レースゲームは結構好きだからかも。WipeOutとかGTとか。でも毛色の変わったレースゲームであることは確か。車やバイクで格闘する感じ? まだLevel1をクリアしたところだけど今のところ非常に簡単。

あ、そうだ。PS3を買ったとき007カジノロワイヤルのBD版が無料で付いてきたんだけど、再生させてびっくり。こんなにも違うものなのか~。凄く綺麗。24は全シリーズDVDで持っているけど、BDで出して欲しくなった。ずいぶん前にリストに上がっていたんだけどな。出ないかな。

続きを読む...

W-ZERO3でssh2によるポートフォワーディング

このブログ記事をはてなブックマークに追加

W-ZERO3でポートフォワーディングを行うことにした。ただし条件があり、

・ssh2を利用する。
・ワンタイムパスワードのため、パスワード入力は利用時に入力。

これらを満たさなくてはならない。

なので、ssh2未対応のPortForwarderは却下。また、zaTunnelはあらかじめパスワードを入れなくてはならない。その都度パスワードを設定してもダメだった。Webを見回してみると、SSH client for Pocket PCを利用すれば良いらしいとのことだったので、Pocket ConsolePocket CMDWindows Mobile Development Power Toysに入っている、cmd.exe, shell.exeを手に入れて、コマンドライン環境を構築。レジストリエディタを持ってきてゴニョゴニョいじって完了。で実際使ってみたが、確かにsshでポートフォワーディングはできているようだが、なぜかターミナルでエラーが出る。どうやらPocketPuTTYのバグらしい。PocketPuTTY単独でもできなかったし、ほかのターミナルソフトでもうまく繋がらなかった。

ほかにもいろいろと試してみたが、どれもうまくいかず。結局、自宅に2台のLinuxマシンが常時起動しているのでそれを介してポートフォワーディングをすることに。なかなか良いものがない。自分で作るしかないかなぁ。そういや、CISCOのVPN互換のVPNクライアントも良いものが見つからなかったな。

続きを読む...