最新 追記

Hena Hena Nikki

2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|10|11|12|
2012|01|02|03|04|05|06|07|08|10|12|
2013|01|02|04|06|

2006.08.01 / Tuesday [長年日記]

* [computer/update] Julius ver.3.5.2

BSD ライセンスに近い条件で使用できる大語彙連続音声認識システム。 約 4 ヶ月ぶりの version up。

* [computer/update] DarwinPorts ver.1.3.1

Mac OS X でオープン・ソース・ソフトウェアをパッケージ管理するツール。

* [computer/update] flat assembler ver.1.67.7

MMX や各 SSE, 3DNow! などをサポートした 80x86 環境向けアセンブラ。

* [computer] Julius を Mac OS X 10.4 にインストールする

要 flex (僕の環境には zlib, libiconv, nkf, readline なんかも入っている)。 実は、少し前のバージョンから Core Audio に対応したので、 簡単に試用することができる。 まあ、モデル群の確保が少し面倒だけど…。

$ wget -c http://osdn.dl.sourceforge.jp/julius/21175/julius-3.5.2.tar.gz
$ zcat julius-3.5.2.tar.gz | tar xvf -
$ cd julius-3.5.2/
$ ./configure --enable-multipath --enable-iwcdl
$ make
$ sudo make install
$ ./configure --enable-multipath --enable-iwcdl --enable-julian
$ make clean && make
$ sudo make install

もちろん CFLAGS はお好みで。 ついでに configure する時のメモを以下に列挙。

  • --enable-words-int を指定して組んだら、言語モデル読み込みで落ちた。←修正していただいたので、最新 CVS 版では問題なし。
  • zlib がインストールされていない環境の場合、ちゃんと --disable-zlib を指定しないとダメだった…?
  • G4 系ノートみたいな遅い計算機では、変にオプションを増やすとまともに使えなくなる。

libsndfile 対応は自動ではいかなかったけど、 使う人はそんなにいないよね。たぶん。 ←後でインストールし直したら、configure で自動認識された。 何で最初はダメだったのだろう? 気付いてないミスがあるのかなぁ?

* [computer] libsndfile を Mac OS X 10.4 にインストールする

順番が前後しちゃったけど、本当なら Julius を組み立てる前にすべき作業。 やはり CFLAGS はお好みで。

$ wget -c http://www.mega-nerd.com/libsndfile/libsndfile-1.0.16.tar.gz
$ zcat libsndfile-1.0.16.tar.gz | tar xvf -
$ cd libsndfile-1.0.16/
$ ./configure --disable-flac --disable-alsa
$ make && make check
$ sudo make install

と言うわけで、普通、FLAC は要らんよなぁ…。

* [computer/update] MeCab ver.0.93

高速な形態素解析エンジン。 約 20 日ぶりの version up。

Mac OS X では、0.92 の時と同様、 ちょっといじらないとインストールできなかった。 まあ、ライセンスのみの変更みたいなので当たり前か。

* [myself] 7 月のお仕事

8 月から始まるかなり厳しめに設定した某プロジェクトの準備、 某大学に納入した実験機器用アプリケーションのカスタマイズや不具合修正、 新人の C++ 習得のフォローなど。

けっきょく某プロジェクトの準備はあまりはかどらなかった。 対象物が僕の経験してきた領域から離れすぎていること、 対象物の規模が大きすぎてどこから着手すべきか決め難いこと。 これらが原因か。 理解しちゃえば実装は比較的スムーズに進みそうな気もするけど、 そこまで到達するのにどれだけ時間がかかるか不安だ。

アプリケーションのカスタマイズ (と不具合修正) はボチボチと。 特許申請したアイディア群は既に実装済みなので、本質的に新規性のある作業はなし。 不具合修正時に良くない実装を仕方無くすることになってしまったけど、 それ以外は特別なことはなかった。

今回の新人には“独習 C++”を読ませた。 “Accelerated C++”にしなかったのにはそれなりの理由がある。 …さてさて、次のステップを終えたら遂に本格的な OJT か。

* [myself] 8 月からのお仕事

学生に逆戻り。 情報系研究室の研究員として、市内の某大学に行かせてもらうことになりました。 週の半分はそちらで作業することになってます。 一時期、名古屋市内の某大学とどちらにすべきか悩んでいましたが、 最終的に京都市内の某大学に決まりました。 順調に成果を出すことができたら、来年度末まで京都で作業している予定です。

今、京都市北部に引っ越そうかと悩んでます。 京阪本線と地下鉄烏丸線、どちらを生活の中心にすべきかな…。

実は学割で MacBook が買えちゃうわけで、 今は「早く出ろ出ろ Intel Core 2 Duo の MacBook!」って感じです。 ちなみに今の iMac は見た目が悪いので却下です。 :-p

* [book] 30 日間マクドナルド生活 / マツモトケイジ

今更だけど、面白そう。 買って読もうかな。

* [hobby] 原酒 竹の皮包み (招徳)

僕と相性の良い招徳の純米吟醸原酒。 すっきり・さっぱりして美味しい。

* [computer/update] 鬼車 ver.4.2.1

複数の文字コードに対応した C の正規表現ライブラリ (BSD ライセンス)。 約 2 週間ぶりの version up。

* [myself] 夏休みとお盆休み

通常の休日を含めて 7/30〜8/2 が夏休みで、8/13〜20 がお盆休み。 そんなわけで、福井に遊びに行ったりのんびりしたりしてます。


2006.08.02 / Wednesday [長年日記]

* [computer/update] GnuPG 1.4.5

PGP を置き換える完全かつフリーなソフトウェア。 約 1 ヶ月ぶりの version up。

1.4.4 の時と同様、 Mac OS X 10.4 上で問題なくインストールできた。

* [computer/update] AC3Filter ver.1.06a

AC3, DTS および MPEG1/2 Audio Layer I/II のデコードをサポートした DirectShow フィルタ。

* [computer] 本気の音声認識、「声 de 入力」のこだわり (ITmedia)

もう半年くらい前の記事になるけどメモ。 読み直すつもり (? な点が多かったような)。

音声通話型に関する「ユーザーの操作性」の説明がちょっと分からない。 KDDI 社の発言をかなり削った結果だろうな…。

* [computer/update] Sylpheed ver.2.2.7

美しい GUI を持つ多機能と軽快さを兼ね備えた message user agent。 安定版としては約 2 ヶ月ぶりの version up。

* [cd/dvd] SENSUOUS / Cornelius

10/25 発売予定の新作。 ああ、何年ぶりだろうか…。楽しみ。

* [cd/dvd] 39108 / 吉井 和哉

10/4 発売予定の新作。 残念ながら僕は買わないです。

* [computer] bzip2 1.0.3 を Mac OS X 10.4 にインストールする

DarwinPorts のパッチを流用 (patch-Makefile-man.diff の方は不要かも)。

$ wget -c http://www.bzip.org/1.0.3/bzip2-1.0.3.tar.gz
$ zcat bzip2-1.0.3.tar.gz | tar xvf -
$ cd bzip2-1.0.3
$ patch -p0 < /opt/local/var/db/dports/sources/rsync.rsync.darwinports.org_dpupdate_dports/archivers/bzip2/files/patch-Makefile-dylib.diff
$ patch -p0 < /opt/local/var/db/dports/sources/rsync.rsync.darwinports.org_dpupdate_dports/archivers/bzip2/files/patch-Makefile-man.diff
$ vim Makefile

ここで適当に CFLAGSPREFIX の値を変更。

$ make && make check
$ sudo make install

この手順は、「DarwinPorts で bzip2 をインストール済み」な状態が前提なので、 あまり意味がないですね。

というわけで、8/4 にもうちょっと頑張ってみた


2006.08.03 / Thursday [長年日記]

* [book] 韻律と音声言語情報処理 / 広瀬 啓吉 (他)

文科省の特定領域研究の成果を読み易くまとめ直して出版された本。 図書館でチェックした後、良かったら買っちゃおうかな。

* [computer/update] Mozilla Firefox 1.5.0.6

定番の multi platform な web browser。 約 1 週間ぶりの version up。

* [computer/update] Mozilla Firefox 1.5.0.6 日本語版

multi platform な web browser, Firefox の日本語版。 約 1 週間ぶりの version up。

* [computer/update] 鬼車 ver.4.2.2

複数の文字コードに対応した C の正規表現ライブラリ (BSD ライセンス)。

* [computer/update] QuickTime Alternative ver.1.73

QuickTime 形式のメディア・ファイルを再生するライブラリなどの詰合せ for Windows。

* [computer/update] PHP ver.4.4.3

動的な web page 作成に向いているスクリプト言語。

* [computer/update] MySQL ver.4.1.21

高速性と堅牢性を追及した SQL データ・ベース。

* [computer] 鬼車 4.2.2 を Mac OS X 10.4 にインストールする

特別なところは何もない。

$ wget -c http://www.geocities.jp/kosako3/oniguruma/archive/onig-4.2.2.tar.gz
$ zcat onig-4.2.2.tar.gz | tar xvf -
$ cd onig-4.2.2
$ ./configure
$ make && make check
$ sudo make install

もちろん CFLAGS はお好みで。


2006.08.04 / Friday [長年日記]

* [computer/update] Python ver.2.5 beta3

本質的なシンプルさを備えているスクリプト言語。 所謂人柱版。

* [computer/update] DivX 6.3 for Windows

MPEG4 系ビデオ codec の有力な選択肢の一つ。

* [computer/update] AC3Filter ver.1.07a

AC3, DTS および MPEG1/2 Audio Layer I/II のデコードをサポートした DirectShow フィルタ。 数日ぶりの version up。

* [computer] Re: bzip2 1.0.3 を Mac OS X 10.4 にインストールする

先日の続き。 とりあえず、パッチを www.fan.gr.jp に置いてみた (bzip2-1.0.3.diff.gz)。

$ wget -c http://www.bzip.org/1.0.3/bzip2-1.0.3.tar.gz
$ zcat bzip2-1.0.3.tar.gz | tar xvf -
$ cd bzip2-1.0.3
$ wget -c http://www.fan.gr.jp/~ring/misc/bzip2-1.0.3.diff.gz
$ zcat bzip2-1.0.3.diff.gz | patch -p0
$ make && make check
$ sudo make install

デフォルトで /usr/local 以下のディレクトリにインストールされるようにしてある。

$ ls -l /usr/local/lib | grep 'libbz2'
$ ls -l /usr/local/bin | grep 'bz'

CFLAGSPREFIX の値の変更は、 make の前に Makefile を書き換えるのが楽。 ;-)

* [computer] Readline 5.1 を Mac OS X 10.4 にインストールする

これもそれほど難しくない。

$ wget -c ftp://ftp.gnu.org/gnu/readline/readline-5.1.tar.gz
$ zcat readline-5.1.tar.gz | tar xvf -
$ cd readline-5.1/
$ mkdir patches
$ cd patches/
$ wget -c 'ftp://ftp.gnu.org/gnu/readline/readline-5.1-patches/readline51-*'
$ rm *.sig
$ cd ../
$ foreach f (./patches/readline51-*)
foreach? patch -p0 < $f
foreach? end
$ ./configure --enable-multibyte
$ make
$ sudo make install

もちろん CFLAGS はお好みで。


2006.08.06 / Sunday [長年日記]

* [computer] libogg 1.1.3 を Mac OS X 10.4 にインストールする

こういうの、DarwinPorts を使ってる人は、 特別な事情がなければそちらで入れた方が良い。

$ wget -c http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz
$ zcat libogg-1.1.3.tar.gz | tar xvf -
$ cd libogg-1.1.3/
$ ./configure
$ make && make check
$ sudo make install

もちろん CFLAGS はお好みで。

* [computer] libvorbis 1.1.2 を Mac OS X 10.4 にインストールする

これも特別なことはないけど…。 環境によっては、自前で入れた libogg ではなく、 パッケージ管理システムで入れた libogg を見にいくみたい。 --with-hoge=/foo/bar とかしても。 その点だけ注意が必要かな。 ←事前に自分で pkg-config, libogg を入れておくのが吉。

$ wget -c http://downloads.xiph.org/releases/vorbis/libvorbis-1.1.2.tar.gz
$ zcat libvorbis-1.1.2.tar.gz | tar xvf -
$ cd libvorbis-1.1.2/
$ ./configure
$ make
$ sudo make install

CFLAGS の設定は不要っぽい。

* [computer] pkg-config 0.20 を Mac OS X 10.4 にインストールする

libvorbis を入れる前にやっておけば良かった?

$ wget -c http://pkgconfig.freedesktop.org/releases/pkg-config-0.20.tar.gz
$ zcat pkg-config-0.20.tar.gz | tar xvf -
$ cd pkg-config-0.20/
$ ./configure
$ make && make check
$ sudo make install

これも CFLAGS はお好みで。

* [computer/update] Lancer 20060806

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。 所謂人柱版。

* [computer] FLAC 1.1.2 を Mac OS X 10.4 にインストールする

先に libiconv, libogg を入れおてく。 遅い CPU の場合、make check でかなりの時間がかかる (本格的に買い物に出ることが可能な位。iBook G4 1.0GHz で数時間) ので、要注意。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/flac/flac-1.1.2.tar.gz
$ zcat flac-1.1.2.tar.gz | tar xvf -
$ cd flac-1.1.2/
$ ./configure
$ make && make check
$ sudo make install

やはり CFLAGS はお好みで。

Intel Core Duo 環境では、configure 時に --disable-asm-optimizations を付加した方が良さそう。

これで libsndfile の FLAC 対応もできるけど、 やっぱり使う機会があまりなさそうなんだよなぁ…。

* [computer/update] Momonga Linux 3 rc

先端感覚が心地良い Linux ディストリビューション。 所謂人柱版。

* [myself] 先週のお仕事

仕事といっても、夏期休暇中なので休日出勤の形で 8/3, 4 だけ。 しかも大学の施設内でじっと調べものばかりしていたので、 頭の固い人から見たら「仕事してる」とは言えない内容。 まあ、仕事という概念をどう定義しているかによるわけですが。

研究員生活が始まったと言っても、 立場は学生もどきですので、特別なところは何もない。 学校行って (所属企業のために) 研究して、普通に成果目標を達成するだけ。 自分の意思を強く反映できる部分はそれほどない。

僕が前の会社を辞めたのは、以下に関して希望を持てなかったからだ。

  • 既存製品をただ真似たものではない、 作り手の意思を感じさせる新しいものを作りたい。
  • 作り手の独り善がりを排除して、 ユーザーが道具として選ぶものを作りたい。
  • 論理に振り回されず、経験で視野を狭めず、 両方のバランスがとれた作業をしたい。

今の会社でこれらは実現できているのか? 最初の項目は少しだけできているけど、他は全くできていない。 自分一人でやる今回のプロジェクトで、これらをどれだけ達成できるかなぁ…。 とにかく意識していかなくっちゃ。 単純に成果物を出すだけじゃダメだ。


2006.08.07 / Monday [長年日記]

* [computer/update] EasyPG ver.0.0.4

Emacs 用の GnuPG インターフェイス。 約 1 ヶ月ぶりの version up。

* [computer/update] MySQL ver.5.0.24

高速性と堅牢性を追及した SQL データ・ベース。


2006.08.09 / Wednesday [長年日記]

* [computer/update] Ruby ver.1.8.5 preview3

object-oriented programming を意識して作られた interpreted scripting language。 所謂人柱版。

* [computer/update] Xcode 2.4

Apple 社提供の Mac OS X 向け開発環境。 約 2 ヶ月半ぶりの version up。

GCC 4 のビルド情報が 5341 から 5363 に変わった。 ベースとなっている GCC 自体は 4.0.1 のままのようだ。

$ gcc --version
powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)

* [computer/update] wxWidgets ver.2.7.0

かつて wxWindows と呼ばれていた cross-platform な C++ 環境向け GUI ライブラリ 。 約 4 ヶ月半ぶりの version up。

* [computer/update] AC3Filter ver.1.09a

AC3, DTS および MPEG1/2 Audio Layer I/II のデコードをサポートした DirectShow フィルタ。

* [computer/update] Lancer 20060807

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。

* [computer/update] Y.OzFont ver.10.22

美しいペン習字風 font。

* [myself] 今週前半のお仕事

月曜日は本社で作業。 と言っても、書類処理などの雑用ばかりだったので、 さっさと片付けて大学の方に行くべきだったかも。 正直言って、会社だと作業効率が上がらない。

火曜日、水曜日は大学で作業。 図書館が使えるようになったので、2 日連続で数時間ずつ利用した。 …あまり比較するのは良くないかもしれないけど、 僕がお世話になった大学の同タイプの施設よりも環境が良くない。 机の多さは評価できるけど、全体的に設備が古すぎるしとにかく狭い。 ちょっと残念。 こういう点に関しては移転経験のある大学の方が良いのかも。

この数日で改めてはっきりと分かった。 ソフトウェア中心の研究開発において (もっと言うと僕にとって)、 “人の行き来が目に見える環境や雑談の聞こえる環境は非常に良くない”ということが。 ある程度以上の研究作業が必要な成果物に高い質を求めるなら、 十分なパーティションや個室と雑音消しの BGM はあった方が良い。 高い集中力を発揮し易い環境じゃないと、良いものを作るなんて無理じゃなかろうか。

「どんな環境でも集中できるのがプロだ!」という考え方もあるかもしれないけど、 それは上記のパーティションや個室、BGM を否定するものじゃないと思う。 …まあ、「人の行き来が見えて雑談が聞こえた方が集中できる!」という超人や、 「人を監視したり雑談したりしないと集中できない!」という素晴らしい人は、 また違った意見を持つのでしょうけど。

* [computer/update] Xkeymacs ver.3.38

Windows な application を emacsen ライクな使い勝手にする tool。


2006.08.10 / Thursday [長年日記]

* [computer] Dmalloc - Debug Malloc Library

メモ。 某ライブラリを作るときに使えそう。

The debug memory allocation or dmalloc library has been designed as a drop in replacement for the system's malloc, realloc, calloc, free and other memory management routines while providing powerful debugging facilities configurable at runtime. These facilities include such things as memory-leak tracking, fence-post write detection, file/line number reporting, and general logging of statistics.

Mac OS X 10.4 で組むには、 古いパッチを いじってどうにかする必要がある?

* [computer] LAME 3.96.1 を Mac OS X 10.4 にインストールする

ちょっと古いけど (beta 版とかの方を選択すべきか?)、 必要な音声関連のツール SoX を組み立てる関係で。 事前に libsndfile を入れておいた方が良い。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/lame/lame-3.96.1.tar.gz
$ gzip -cd lame-3.96.1.tar.gz | tar xvf -
$ cd lame-3.96.1/
$ ./configure --enable-decode-layer1
$ make && make test
$ sudo make install

CFLAGS はお好みで。

* [computer] SoX 12.18.1 を Mac OS X 10.4 にインストールする

続けて SoX のインストール。 事前に libvorbis, LAME, libmad を入れておいた方が良い。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/sox/sox-12.18.1.tar.gz
$ gzip -cd sox-12.18.1.tar.gz | tar xvf -
$ cd sox-12.18.1/
$ vim Makefile.in +33

ここで開いた行にある install: $(PLAY_INSTALL_$(PLAY_SUPPORT)) を、 install: all $(PLAY_INSTALL_$(PLAY_SUPPORT)) に書き換える。

$ ./configure
$ make
$ sudo make install
$ sudo make install-lib

こちらも CFLAGS はお好みで。

* [computer] libmad 0.15.1b を Mac OS X 10.4 にインストールする

Audacity 関連。 もちろん CFLAGS はお好みで。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/mad/libmad-0.15.1b.tar.gz
$ gzip -cd libmad-0.15.1b.tar.gz | tar xvf -
$ cd libmad-0.15.1b/
$ ./configure
$ make
$ sudo make install

* [computer] libid3tag 0.15.1b を Mac OS X 10.4 にインストールする

これも Audacity 関連。 事前に zlib を入れておくのが吉。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/mad/libid3tag-0.15.1b.tar.gz
$ gzip -cd libid3tag-0.15.1b.tar.gz | tar xvf -
$ cd libid3tag-0.15.1b/
$ ./configure
$ make
$ sudo make install

CFLAGS はお好みで。

* [computer/update] Lancer 20060810

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。 所謂人柱版。

* [computer/update] Java 2 SDK (Standard Edition) 5.0 Update 8

Java の開発・実行環境。 約 2 ヶ月ぶりの version up。

* [cd/dvd] Wave / YUKI

9/6 発売予定の新作。 最近ずっとシングルが好調だっただけに、かなり売れるんじゃないかな。


2006.08.11 / Friday [長年日記]

* [computer] FFTW 3.1.2 を Mac OS X 10.4 にインストールする

高速な FFT の実装 (GPL)、FFTW をインストール。 下手に CFLAGS を設定せず、 configure 時のオプションのみを適切に指定すると良さそう。 以下 Intel Core Duo 環境。

$ wget -c http://www.fftw.org/fftw-3.1.2.tar.gz
$ zcat fftw-3.1.2.tar.gz | tar xvf -
$ cd fftw-3.1.2/
$ ./configure --help
$ ./configure --enable-shared --enable-threads --enable-sse2
$ make && make check
$ sudo make install

ちなみに、configure 時に --enable-altivec--enable-sse, --enable-sse2 を指定した上で CFLAGS-pipe を含めると、 make に失敗するみたいなので注意。

* [computer] libsamplerate 0.1.2 を Mac OS X 10.4 にインストールする

これも音声信号処理関連のライブラリで、 サンプル・レート・コンバータの実装 (GPL or 独自ライセンス)。 事前に FFTW, libsndfile を入れておくのが良い。

$ wget -c http://www.mega-nerd.com/SRC/libsamplerate-0.1.2.tar.gz
$ zcat libsamplerate-0.1.2.tar.gz | tar xvf -
$ cd libsamplerate-0.1.2/
$ ./configure
$ make && make check
$ sudo make install

やはり CFLAGS はお好みで。

* [myself] 10 月と 12 月の出張予定

10/19 (と 20) に NHK 放送技術研究所で開催される信学会の NLC の集会、 10/20 に早稲田大学で開催される情処学会の SLP の集会、 12/21, 22 に名古屋大学で開催される音声言語シンポジウム。 今年の後半はこれらを聴講しに行く予定です。 まあ、あくまで予定なので、直前になってキャンセルになるかもしれませんが。

* [myself] Re: 今週前半のお仕事

isshiki さんが反応して下さった

この話はなにも「研究開発」に留まらなくて、 むしろどういう開発にしろ、人によっては切実な問題なのではないでしょうか?

僕は“動くものが気になって仕方のない、集中力のない子供みたいな人間”なので、 目に入る人の動きや中途半端に聞き取れる雑談 (純粋な仕事の話は気にならない)、 予想・想像のつかない奇声・物音は、やはり作業の邪魔になりますね。 と言っても、調査・設計が終わって完全なコーディング作業に入っている状況だと、 これらの邪魔は意外と気にならなくなる様です。 集中し易い作業とそうでない作業があるって事かな。

正直「研究職」でそんな状況でなければ、 そもそもゲーム作りの現場でそんな状況なんて望むべくも無いというか。

昨年 2 月までソフトウェア開発者として勤めていた某社は、 比較的最近移転したこともあって、 ちょっとパーティションが低めだった事を除けばかなり良い環境でした。 もちろん単純に比較すべきじゃないけど…、 機械系事業部の影響からパーティションをあえて導入しない今の職場、 正直言ってしまうと集中し難くて本当に辛い…。 そんなこんなで、会社で作業するより大学で作業した方が効率が良くなってしまいます。 資料の豊富さも関係してるとは言え…、こんなんじゃダメなんだけど…。


2006.08.13 / Sunday [長年日記]

* [computer] libmp4v2 1.5.0.1 を Mac OS X 10.4 にインストールする

CFLAGS はお好みで。

$ wget -c http://resare.com/libmp4v2/dist/libmp4v2-1.5.0.1.tar.bz2
$ bzcat libmp4v2-1.5.0.1.tar.bz2 | tar xvxf -
$ cd libmp4v2-1.5.0.1/
$ ./configure
$ make && make check
$ sudo make install

* [computer/update] SQLite ver.3.3.7

軽量コンパクトな SQL データベース・エンジン。 約 2 ヶ月ぶりの version up。

3.3.6 の時もそうだったんだけど、 Mac OS X で組むと make test でエラーが発生する。 後で他の環境でも試してみて、必要だったら追おう。

* [computer/update] VirtualDub ver.1.6.16

高機能な動画編集ツール for Windows。 約 2 ヶ月半ぶりの version up。

* [computer/update] QuickTime Alternative ver.1.74

QuickTime 形式のメディア・ファイルを再生するライブラリなどの詰合せ for Windows。 約 10 日ぶりの version up。

* [computer/update] Lancer 20060811

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。

* [computer/update] Nullsoft Scriptable Install System ver.2.19

Windows 向けのインストーラ作成ツール。 約 1 ヶ月ぶりの version up。

* [computer][bookmark] Windows 64bit Edition まとめ Wiki

オレンジニュースから。 メモ。

本サイトは、Windows の AMD64 および Intel 64 対応版、 Windows x64 Edition に関する話題をまとめるサイトです。

* [computer] libmpeg2 0.4.0b を Mac OS X 10.4 にインストールする

Intel Core Duo 環境では、以下の要領でインストールできた。 もちろん CFLAGS はお好みで。

$ wget -c http://libmpeg2.sourceforge.net/files/mpeg2dec-0.4.0b.tar.gz
$ zcat mpeg2dec-0.4.0b.tar.gz | tar xvf -
$ cd mpeg2dec-0.4.0/
$ ./configure --enable-shared --disable-sdl
$ make && make check
$ sudo make install

インストールされるのは、libmpeg2 と libmpeg2convert。

$ ls -l /usr/local/lib/ | grep 'libmpeg2'
$ ls -l /usr/local/include/mpeg2dec/
$ ls -l /usr/local/lib/pkgconfig/ | grep 'libmpeg2'

G4 環境では、CFLAGS を設定せずに以下の要領でインストールできた。

$ wget -c http://libmpeg2.sourceforge.net/files/mpeg2dec-0.4.0b.tar.gz
$ zcat mpeg2dec-0.4.0b.tar.gz | tar xvf -
$ cd mpeg2dec-0.4.0/
$ ./configure --enable-shared --disable-sdl --disable-accel-detect
$ make && make check
$ sudo make install

* [computer/update] Cyberduck ver.2.6.1

Mac OS X 上で動く FTP, SFTP クライアント。 約 2 ヶ月ぶりの version up。

* [computer] floatdouble はどちらが速い?

ちょっとした事情から気になって へるみさんのページC プログラミング診断室のページ を読んで、 「ああ、ちゃんと知っといた方が良いよなぁ」などと思ったりしたわけで…。 :-)

/**
 * @file    main.cpp
 * @brief   float と double の速度チェック
 */
#include <iostream>
#ifdef USING_DOUBLE double Calculate(const int n) { double ret(0.0); for (int i(1); i < n; i++) { ret += 1.0 / i / i; } return ret; } #else // USING_DOUBLE float Calculate(const int n) { float ret(0.0f); for (int i(1); i < n; i++) { ret += 1.0f / i / i; } return ret; } #endif // USING_DOUBLE
int main(void) { std::cout << "Calculate = " << Calculate(100000000) << std::endl; return 0; }

以下、MacBook Pro (Mac OS X 10.4, Intel Core Duo 2GHz) で試した結果。

$ g++ --version
i686-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)
$ g++ -Wall -O2 main.cpp -o float
$ time ./float 
Calculate = 1.64473
2.059u 0.010s 0:02.18 94.4%     0+0k 0+1io 0pf+0w
$ g++ -Wall -O2 -DUSING_DOUBLE main.cpp -o double
$ time ./double 
Calculate = 1.64493
3.618u 0.015s 0:03.76 96.2%     0+0k 0+1io 0pf+0w

次に iBook (Mac OS X 10.4, G4 1GHz) で試した結果。

$ g++ --version
powerpc-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)
$ g++ -Wall -O2 main.cpp -o float
$ time ./float 
Calculate = 1.64473
7.102u 0.035s 0:07.44 95.8%     0+0k 0+3io 0pf+0w
$ g++ -Wall -O2 -DUSING_DOUBLE main.cpp -o double
$ time ./double
Calculate = 1.64493
9.244u 0.033s 0:09.46 97.9%     0+0k 0+2io 0pf+0w

まあ、環境によって違うなんて当然なことなんだけど、 こういう事もあるって事実は知っておいた方が良いよね。 ある種のスコア計算とかで、比較的精度を無視できる状況であれば、 double ではなく float を 積極的に使える場合もあるってことで。

こういった「〜と〜を組み合わせた環境では〜の方が速い」という事実は、 前半の「〜と〜を組み合わせた環境では」を忘れると痛い目に遭いそう。 僕は今まで高速化を狙う必要のある作業をまともに担当したことがなかったけど、 今回担当しているプロジェクトではこういった知識も多少必要になるので、 意識しておかないとなぁ…。

以下、後日追記した文章。

以下は自作の PC/AT 互換機 (Windows XP SP2, Cygwin/MinGW, Pentium III 1GHz x2) で試した結果。 当然なのかもしれないけど、数字だけ見ると、へるみさんの結果と一緒と考えられる。

$ g++ --version
g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
$ g++ -Wall -O2 main.cpp -mno-cygwin -o float
$ time ./float.exe
Calculate = 1.64493
7.625 secs
$ g++ -Wall -O2 -DUSING_DOUBLE main.cpp -mno-cygwin -o double
$ time ./double.exe
Calculate = 1.64493
7.672 secs

以下は Gateway SOLO 3350 (Debian Sarge, 低電圧版 Pentium III 600MHz) の結果。 やはりへるみさんの結果と同じ模様。

$ g++ --version
g++ (GCC) 3.3.5 (Debian 1:3.3.5-13)
$ g++ -Wall -O2 main.cpp -o float
$ time ./float
Calculate = 1.64493
12.626 secs
$ g++ -Wall -O2 -DUSING_DOUBLE main.cpp -o double
$ time ./double
Calculate = 1.64493
12.503 secs

* [computer] libpng 1.2.12 を Mac OS X 10.4 にインストールする

Intel Core Duo 環境向けに、 .so ファイルのシンボリック・リンク生成を抑えただけのパッチを www.fan.gr.jp に置いてみた (libpng-1.2.12.diff.bz2)。

これも CFLAGS はお好みで。 また、事前に zlib を入れておいた方が良い。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.12.tar.bz2
$ bzcat libpng-1.2.12.tar.bz2 | tar xvf -
$ cd libpng-1.2.12/
$ wget -c http://www.fan.gr.jp/~ring/misc/libpng-1.2.12.diff.bz2
$ bzcat libpng-1.2.12.diff.bz2 | patch -p0
$ ./configure
$ make && make check
$ sudo make install

G4 系環境の場合は、以下の要領で。 zlib については必須っぽい (ちゃんと見てないけど)。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.12.tar.bz2
$ bzcat libpng-1.2.12.tar.bz2 | tar xvf -
$ cd libpng-1.2.12/
$ cp scripts/makefile.darwin ./Makefile
$ vim Makefile +16

ここで ZLIBLIB, ZLIBINC の値を適切なものに変更。

$ make
$ sudo make install

2006.08.14 / Monday [長年日記]

* [computer] giflib 4.1.4 を Mac OS X 10.4 にインストールする

もし libungif もインストールしたいのであれば、 そちらを先にした方が良さそう。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/libungif/giflib-4.1.4.tar.bz2
$ bzcat giflib-4.1.4.tar.bz2 | tar xvf -
$ cd giflib-4.1.4/
$ ./configure
$ make
$ sudo make install

CFLAGS はお好みで。 また、今回は librle, libgl_s を気にしない方向で。

* [computer] libungif 4.1.4 を Mac OS X 10.4 にインストールする

もちろん CFLAGS はお好みで。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/libungif/libungif-4.1.4.tar.bz2
$ bzcat libungif-4.1.4.tar.bz2 | tar xvf -
$ cd libungif-4.1.4/
$ ./configure
$ make
$ sudo make install

やはり今回は librle, libgl_s を気にしない方向で。

* [computer] libjpeg 6b を Mac OS X 10.4 にインストールする

もちろん CFLAGS はお好みで。

$ wget -c ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
$ zcat jpegsrc.v6b.tar.gz | tar xvf -
$ cd jpeg-6b/
$ cp /usr/share/libtool/config.* ./
$ ./configure --enable-shared
$ make
$ sudo make install
$ sudo ranlib /usr/local/lib/libjpeg.a

* [computer] libtiff 3.8.2 を Mac OS X 10.4 にインストールする

事前に libjpeg, zlib をインストールしておくと良さそう。

$ wget -c ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.8.2.tar.gz
$ zcat tiff-3.8.2.tar.gz | tar xvfp -
$ cd tiff-3.8.2/
$ ./configure --with-apple-opengl-framework
$ make && make check
$ sudo make install

CFLAGS はお好みで。


2006.08.15 / Tuesday [長年日記]

* [computer/update] Momonga Linux 3

先端感覚が心地良い Linux ディストリビューション。

GCC が 4.1 系であることなどから、早めに触ってみたいところ。 さてさて、何に入れるかな…。

* [computer/update] Lancer 20060815

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。 所謂人柱版。

* [cd/dvd] 転々 / ヒカシュー

10/1 発売予定の新作。13 年ぶり。 ヒカシューって、最近の若い人はさすがに知らないよね?

巻上さんと言えば、学部生の時、 知り合い (今も尊敬してる方) に誘われて行ったライブを思い出す。 もちろんそれが僕のホーメイ初体験で、他に三線か何かも使われていたような…。 あと、ライブの後に夜食をご一緒させていただいたのも記憶に残っている。 懐かしいなぁ。

* [myself] 今日の散財

ちょっと遠出した帰りに、ミナミの TOWER RECORDS によって買い物。 このお店で CD 買ったのってかなり久々だったりして。

  • FLASH / THE HIGH-LOWS
  • さよならストレンジャー / くるり

ジュンク堂で日本史の本棚をちょこっと見たんだけど、これがなかなか…。 鎌倉時代以前に興味があるんだけど、どこから手をつければ良いのかなぁ…。

* [myself] 先週後半のお仕事

木曜日、金曜日は大学で作業。 サマリを作成しながら調査したり、既存コードを解読したり。 本格的なコードの解読、けっこう久々。 処理の流れが比較的シンプルなこともあって、無難に構造化されてる。 もちろん読み難くはない。 パッと見で気付いた問題点はいくつかあるけど、 普通に C で書いたらこうなって不思議じゃない内容なので、 別に驚くような点はないかな。

土曜日は本社で作業。 とりあえず「ま、そんなところですか…」って感じで、特別なことはなし。 いろいろな意味で。


2006.08.17 / Thursday [長年日記]

* [computer] 頻繁に素数の判定を行いたい

とりあえず、一番簡単そうな方法で実装してみた。 …まあ、こう言っては何だけど、もっとちゃんとした方法で作るべきみたいだね。

/**
 * @file    prime.hpp
 * @brief   テーブルを利用した素数判定クラス
 */
#ifndef _PRIME_HPP_ #define _PRIME_HPP_
// ヘッダ・ファイル #include <vector> #include <cmath>
/** * @brief テーブルを利用した素数判定クラス * @note UINT_TYPE には (unsigned 系の) 整数型を適用すること。 */ template<typename UINT_TYPE> class PrimeChecker { // 型 private:
typedef std::vector<UINT_TYPE> TABLE_TYPE; /// テーブルの型 typedef typename TABLE_TYPE::size_type SIZE_TYPE; /// テーブルの幅の型
// インスタンス・フィールド private:
TABLE_TYPE primes_; /// 奇数の素数によるテーブル UINT_TYPE next_check_; /// 素数テーブル追加探索をまだしてない最小奇数
// インスタンス・メソッド public:
/** * @brief デフォルト・コンストラクタ * @note 最小のテーブル {3} により構成される。 */ inline PrimeChecker(void) : primes_(1, 3), next_check_(5) { ; }
/** * @brief 引数 number 以下の全ての素数を含むようにテーブルを拡張 * @param number [in] テーブルを拡張する際の素数の上限 * @return テーブルに格納されてる最大の素数 * @note 引数 number が既存のテーブルの最大素数より小さい場合、 * 何も起こらない。 */ inline void extendTable(const UINT_TYPE number) { UINT_TYPE sqrt_target; SIZE_TYPE i; bool divisible; UINT_TYPE target(next_check_); while (target <= number) { sqrt_target = std::sqrt(target); divisible = false; for (i = 0; primes_[i] <= sqrt_target; ++i) { if (target % primes_[i] == 0) { divisible = true; break; } } if (!divisible) { primes_.push_back(target); } target += 2; } next_check_ = target; }
/** * @brief テーブルを構築できるコンストラクタ * @param number [in] テーブルを拡張する際の素数の上限 */ inline PrimeChecker(const UINT_TYPE number) : primes_(1, 3), next_check_(5) { extendTable(number); }
/** * @brief 素数か否かのチェック * @param target [in] チェック対象の数 * @return * - true: 引数 target は素数 * - false: 引数 target は合成数か、1 以下の数 */ inline bool checkPrime(const UINT_TYPE target) { if (target % 2 == 0) return target == 2; if (target < 2) return false; SIZE_TYPE i(0); SIZE_TYPE size = primes_.size(); while (i < size) { if (target % primes_[i] == 0) { return target == primes_[i]; } ++i; } UINT_TYPE divisor(next_check_); const UINT_TYPE sqrt_target = std::sqrt(target); while (divisor <= sqrt_target) { for (i = 0; i < size; ++i) { if (divisor % primes_[i] == 0) break; } if (i >= size) { primes_.push_back(divisor); ++size; if (target % divisor == 0) { next_check_ = divisor + 2; return false; } } divisor += 2; } next_check_ = divisor; return true; } };
#endif // _PRIME_HPP_

ついでにこのクラスを試用するためのコマンド。

/**
 * @file    main.cpp
 * @brief   素数の個数を算出するコマンド
 */
// ヘッダ・ファイル #include <iostream> #include <cctype> #include "prime.hpp"
// 名前の解決 using namespace std;
/** * @brief 使用方法の表示 * @param command [in] コマンド名 */ void PrintUsage(const char* const command) { cerr << "Usage: " << command << " [integer (>1)]" << endl; }
/** * @brief 素数の個数を算出するコマンド */ int main(int arg_count, char** arg_strings) { // 引数のチェック int max_value(10000000); if (arg_count > 2) { PrintUsage(arg_strings[0]); return -1; } else if (arg_count == 2) { const char* arg_string = arg_strings[1]; while (*arg_string != '\0') { if (isdigit(*arg_string) == 0) { PrintUsage(arg_strings[0]); return -2; } ++arg_string; } max_value = atoi(arg_strings[1]); if (max_value <= 1) { PrintUsage(arg_strings[0]); return -3; } }
// 計算開始の出力 clog << "Calculating..." << endl;
// 素数チェッカーの準備 PrimeChecker<int> pchecker;
// 素数のチェック size_t number_of_results(0); int i(1); int largest_prime(2); do { ++i; if (pchecker.checkPrime(i)) { ++number_of_results; largest_prime = i; } if (i % 10000000 == 0) { clog << "> " << number_of_results << " primes exist... (" << i << '/' << max_value << ')' << endl; } } while (i < max_value);
// 結果の出力 clog << number_of_results << " primes exist in {1, ..., " << max_value << "}.\n" << largest_prime << " is largest prime in {1, ..., " << max_value << "}." << endl;
return 0; }

残念ながら、「動いてるかな?」程度の成果物。

$ g++ -Wall -O3 main.cpp -o primes
$ time ./primes 2147483647
[...]
105097565 primes exist in {1, ..., 2147483647}.
2147483647 is largest prime in {1, ..., 2147483647}.
6709.182u 9.502s 1:52:02.18 99.9%       0+0k 0+2io 0pf+0w

この結果で当ってるのかな?

少しいじってみた。 PrimeChecker::checkPrime() で算出した数値の再利用は実装してない。 もちろん、テスト用と位置付けてる main() の方で工夫する気はない。

$ g++ -Wall -O3 main.cpp -o primes
$ time ./primes 2147483647
[...]
105097565 primes exist in {1, ..., 2147483647}.
2147483647 is largest prime in {1, ..., 2147483647}.
6597.111u 12.122s 1:50:23.99 99.7%      0+0k 0+0io 0pf+0w

* [cd/dvd] パレード / GO!GO!7188

10/13 発売予定の新作。 けっこう久々だったかな。

* [computer/update] Apple Boot Camp ver.1.1 Public Beta

Mac で Mac OS X と Windows の dual boot を実現するためのツール。 所謂人柱版。

* [computer/update] Python ver.2.5 RC1

本質的なシンプルさを備えているスクリプト言語。 所謂人柱版。

* [computer/update] 鬼車 ver.4.3.0

複数の文字コードに対応した C の正規表現ライブラリ (BSD ライセンス)。 約 2 週間ぶりの version up。


2006.08.18 / Friday [長年日記]

* [computer/update] Ruby ver.1.8.5 preview4

object-oriented programming を意識して作られた interpreted scripting language。 所謂人柱版。

* [computer/update] PHP ver.5.1.5

動的な web page 作成に向いているスクリプト言語。

* [computer/update] PHP ver.4.4.4

動的な web page 作成に向いているスクリプト言語。

* [computer/update] QuickTime Alternative ver.1.75

QuickTime 形式のメディア・ファイルを再生するライブラリなどの詰合せ for Windows。

* [computer/update] Real Alternative ver.1.50

RealMedia 形式のメディア・ファイルを再生するライブラリなどの詰合せ for Windows。 約 2 ヶ月ぶりの version up。

* [computer] SDL 1.2.11 を Mac OS X 10.4 にインストールする

特別なことは無さそう。 もちろん CFLAGS はお好みで。

$ wget -c http://www.libsdl.org/release/SDL-1.2.11.tar.gz
$ zcat SDL-1.2.11.tar.gz | tar xvf -
$ cd SDL-1.2.11/
$ ./configure
$ make && make test
$ sudo make install

ついでに SDL_mixer 1.2.7 も入れる。 事前に libogg, libvorbis (とずっと更新されてない SMPEG) を入れておくと、勝手に使ってくれるみたいだ。

$ wget -c http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.7.tar.gz
$ zcat SDL_mixer-1.2.7.tar.gz | tar xvf -
$ cd SDL_mixer-1.2.7/
$ ./configure
$ make
$ sudo make install

この状態で wxWidgets を入れたかったわけですよ。 :-)

* [computer/update] Lancer 20060818

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。

* [myself] お盆休みを振り返って

外出して遊んでばかりいたけど、いちおう移動時の一部は本を読んで勉強した。 本を読むこと自体は別に良いと思うんだけど、 解らない箇所があると理解できるまで気になってしかたなく、 遊びに集中し切れずちょっと損した感じ。 研究開発関係も含め、仕事やその他の勉強、 そして遊びも集中して手抜きせずにいきたいのに。

奈良県南部って面白い。 記紀の世界の面影がそこら中に残っていて、 ちょっとした資料片手に歩くだけでもとても楽しめる。 秋になって涼しくなったら、 折り畳み自転車を持っていって、じっくり古墳巡りをしたい。

* [computer] Re: 頻繁に素数の判定を行いたい

というわけで、更にちょっとだけ prime.hpp を書き直した。 ついでに自分の実装の効果を確認できる様な main.cpp を作ってみた。

/**
 * @file    main.cpp
 * @brief   PrimeChecker クラスのテスト・コマンド
 */
// ヘッダ・ファイル #include <iostream> #include <cmath> #include <cctype> #include <cstdlib> #include <ctime> #ifndef USING_INTERNAL_PRIME_CHECKER #include "prime.hpp" #endif // USING_INTERNAL_PRIME_CHECKER
// 名前の解決 using namespace std;
/** * @brief 使用方法の表示 * @param command [in] コマンド名 */ void PrintUsage(const char* const command) { cerr << "Usage: " << command << " [integer (>1)]" << endl; }
/** * @brief 素数か否かのチェック * @param target [in] チェック対象の数 * @return * - true: 引数 target は素数 * - false: 引数 target は合成数か、1 以下の数 * @note UINT_TYPE には (unsigned 系の) 整数型を適用すること。 */ template<typename UINT_TYPE> inline bool IsPrime(const UINT_TYPE target) { if (target % 2 == 0) return target == 2; if (target < 2) return false; const UINT_TYPE sqrt_target = sqrt(target); for (UINT_TYPE i(3); i <= sqrt_target; i += 2) { if (target % i == 0) return false; } return true; }
/** * @brief PrimeChecker クラスのテスト・コマンド */ int main(int arg_count, char** arg_strings) { // 引数のチェック unsigned int loop(10000000); if (arg_count > 2) { PrintUsage(arg_strings[0]); return -1; } else if (arg_count == 2) { const char* arg_string = arg_strings[1]; while (*arg_string != '\0') { if (isdigit(*arg_string) == 0) { PrintUsage(arg_strings[0]); return -2; } ++arg_string; } loop = atoi(arg_strings[1]); if (loop < 1) { PrintUsage(arg_strings[0]); return -3; } }
// 計算開始の出力 clog << "Calculating..." << endl;
#ifndef USING_INTERNAL_PRIME_CHECKER // 素数チェッカーの準備 PrimeChecker<unsigned int> pchecker; #endif // USING_INTERNAL_PRIME_CHECKER
// 素数のチェック srand(static_cast<unsigned int>(time(0))); size_t interval_results(0); size_t total_results(0); unsigned int i(0); unsigned int maximal_prime(0); unsigned int largest_prime(0); unsigned int number; unsigned long long int total_number(0); bool result; do { ++i; number = rand(); total_number += number; #ifndef USING_INTERNAL_PRIME_CHECKER result = pchecker.checkPrime(number); #else // USING_INTERNAL_PRIME_CHECKER result = IsPrime(number); #endif // USING_INTERNAL_PRIME_CHECKER if (result) { ++interval_results; if (maximal_prime < number) { maximal_prime = number; } } if (i % 1000000 == 0) { clog << "> " << interval_results << " primes found... (MP: " << maximal_prime << ')' << endl; total_results += interval_results; interval_results = 0; if (largest_prime < maximal_prime) { largest_prime = maximal_prime; } maximal_prime = 0; } } while (i < loop); total_results += interval_results; if (largest_prime < maximal_prime) { largest_prime = maximal_prime; }
// 結果の出力 clog << total_results << " primes exist in " << loop << " numbers.\n" << "\t- " << total_number / loop << ": Average of numbers."; if (total_results > 0) { clog << "\n\t- " << largest_prime <<": Largest prime in numbers."; } clog << endl;
return 0; }

IsPrime() の実装は他のにしたいところだけど、 とりあえず実行結果を…。

$ g++ -Wall -O3 -DUSING_INTERNAL_PRIME_CHECKER main.cpp -o primes
$ time ./primes 50000000
[...]
2447754 primes exist in 50000000 numbers.
        - 1073897874: Average of numbers.
        - 2147483179: Largest prime in numbers.
666.775u 0.868s 11:09.15 99.7%  0+0k 0+0io 0pf+0w
$ g++ -Wall -O3 main.cpp -o primes
$ time ./primes 50000000
[...]
2447219 primes exist in 50000000 numbers.
        - 1073695078: Average of numbers.
        - 2147483549: Largest prime in numbers.
205.007u 0.214s 3:25.34 99.9%   0+0k 0+2io 0pf+0w

まあ…、この程度は当然の結果か。

アホなミスを複数見つけたので、こそこそ修正。 駄目だなぁ…。

当たり前だけど、このコマンドの場合、 PrimeChecker::checkPrime() は以下の形にした方が速い。 というわけで、0 からの指定範囲の素数の個数を算出するテスト・コマンドは破棄。

    /**
     * @brief   素数か否かのチェック
     * @param   target [in] チェック対象の数
     * @return
     *          - true: 引数 target は素数
     *          - false: 引数 target は合成数か、1 以下の数
     */
    inline bool checkPrime(const UINT_TYPE target)
        {
            if (target % 2 == 0) return target == 2;
            if (target < 1) return false;
            SIZE_TYPE i(0);
            const UINT_TYPE sqrt_target = std::sqrt(target);
            if (sqrt_target < primes_.back()) {
                while (primes_[i] <= sqrt_target) {
                    if (target % primes_[i] == 0) return false;
                    ++i;
                }
                return true;
            }
            SIZE_TYPE size = primes_.size();
            while (i < size) {
                if (target % primes_[i] == 0) return false;
                ++i;
            }
            UINT_TYPE divisor(next_check_);
            while (divisor <= sqrt_target) {
                for (i = 0; i < size; ++i) {
                    if (divisor % primes_[i] == 0) break;
                }
                if (i >= size) {
                    primes_.push_back(divisor);
                    if (target % divisor == 0) {
                        next_check_ = divisor + 2;
                        return false;
                    }
                    ++size;
                }
                divisor += 2;
            }
            next_check_ = divisor;
            return true;
        }
$ g++ -Wall -O3 main.cpp -o primes
$ time ./primes 50000000
[...]
2449294 primes exist in 50000000 numbers.
        - 1073763094: Average of numbers.
        - 2147483171: Largest prime in numbers.
155.911u 0.194s 2:36.25 99.9%   0+0k 0+2io 0pf+0w

以上、大量のランダムな数を対象にした素数判定クラスを、 普通の工夫をして実装してみました。 PrimeChecker::checkPrime() 中の素数テーブル拡大の処理部分は、 本当はもっとしっかり書くべきなんですけど、 意外に効果がなかったので気にしない方向で。


2006.08.19 / Saturday [長年日記]

* [computer] Yasm 0.5.0 を Mac OS X 10.4 にインストールする

事前に libiconv, gettext を入れておいた方が良い。 CFLAGS はお好みで。

$ wget -c http://www.tortall.net/projects/yasm/releases/yasm-0.5.0.tar.gz
$ zcat yasm-0.5.0.tar.gz | tar xvf -
$ cd yasm-0.5.0/
$ ./configure
$ make && make check
$ sudo make install

* [computer] wxWidgets 2.7.0 を Mac OS X 10.4 にインストールする

事前に関係ライブラリ群 (SDL, libpng, libjpeg, libtiff, Expat, libiconv, libzlib など) を出来るだけ多く入れておきたいところ。 もちろん CFLAGS はお好みで。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/wxwindows/wxWidgets-2.7.0-1.tar.bz2
$ bzcat wxWidgets-2.7.0-1.tar.bz2 | tar xvf -
$ mkdir wxWidgets-2.7.0-1/carbon_build
$ cd wxWidgets-2.7.0-1/carbon_build
$ ../configure --enable-monolithic --with-sdl --enable-stl --enable-unicode --with-opengl
$ make && make samples
$ sudo make install

* [computer] GCC の最適化

ずっと SH でソフトウェア開発している方に、 「for ループはインクリメントよりデクリメントの方が速いよ」と言われ、 実験してみた。

#include <iostream>
static const int loop(100000000);
size_t LoopFunctionI(void) { size_t ret_val(0); for (int i(0); i < loop; ++i) { ++ret_val; } return ret_val; }
size_t LoopFunctionD(void) { size_t ret_val(0); for (int i(loop); 0 < i; --i) { ++ret_val; } return ret_val; }
int main(void) { std::cout << LoopFunctionI() << ':' << LoopFunctionD() << std::endl;
return 0; }

で、これを Mac OS X (on x86), GCC 4.0.1 で g++ -O2 main.cpp -S して、main.s を開くと…。

.globl __Z13LoopFunctionIv
__Z13LoopFunctionIv:
LFB1447:
        pushl   %ebp
LCFI0:
        movl    %esp, %ebp
LCFI1:
        xorl    %eax, %eax
L2:
        addl    $1, %eax
        cmpl    $100000000, %eax
        jne     L2
        popl    %ebp
        ret
LFE1447:
        .align 1,0x90
.globl __Z13LoopFunctionDv
__Z13LoopFunctionDv:
LFB1448:
        pushl   %ebp
LCFI2:
        movl    %esp, %ebp
LCFI3:
        xorl    %eax, %eax
L9:
        addl    $1, %eax
        cmpl    $100000000, %eax
        jne     L9
        popl    %ebp
        ret
LFE1448:
        .align 1,0x90

ふむ…? 最適化って凄い・怖いですねぇ…。 って言うか、そこまでやるならいきなり 100000000 返して欲しい…。 (← shinh さんとこの GCC 4.1 on Linux だとこうなったそうだ)

loopiunsigned int にしたら、 ちゃんとインクリメントとデクリメントが保持された。 けっこう神経質なんだ、GCC って。

もっとちゃんと考えた例じゃないと意味がなさそう (LoopFunctionI(), LoopFunctionD() がダメすぎ等) なので、またそのうち実験してみるか…。


2006.08.20 / Sunday [長年日記]

* [book] GNU 開発ツール / 西田 亙

予約受け付け開始。 欲しいけどさすがに少し高い…。 どうしようかな…。

* [miscellaneous] 等身大“コピーロボット”で存在感の本質を追求する〜大阪大学 石黒 浩 教授 (Robot Watch)

阪大の石黒先生と言えば、 「この業界で知らない人はいない」と言い切れる位の有名人。 どうしても独自の方向性を打ち出している点が目立つけど、その活動量もとにかく凄い。 自由で意思の強い“ものづくり”の人、僕はそんな印象を勝手に持ってる。

昨年、長久手で見た Repliee Q1 expo の完成度はかなりのものだった (見た目や細かな動作に関して) んだけど、 一般の人を対象にした実験は多く・広くされたのだろうか。 データ見てみたいなぁ…。

* [hobby] 杏仁豆腐

杏仁豆腐と言えば、 アーモンド・エッセンスを使った“なんちゃって”なものばかりをよく見かける、 南杏など本来の材料を使った「本物だ!」と思えるものに出会ったことのない、 恐ろしい食べ物の一つだ。 先日晩御飯を食べたちょっと高めの中華料理屋さんでも、 メニューに堂々と「アーモンド〜」とか書いてあった。 がっくり。

京都駅周辺か伏見区内で本物の美味しい杏仁豆腐を出してるお店、無いのかな。 まあ、あったとしても、けっこう高くつきそうだなぁ…。

埼玉の某大学で教員をされている某お方なら、そちらで良いお店を知ってそう。 10 月の出張時に (都合が良ければ) 連れてっていただこうかな。


2006.08.21 / Monday [長年日記]

* [computer/update] 鬼車 ver.4.3.1

複数の文字コードに対応した C の正規表現ライブラリ (BSD ライセンス)。 数日ぶりの version up。

* [computer/update] ATI Catalyst ver.6.8

ATI Radeon 用公式ドライバ for Windows 2k/XP。 約 3 週間ぶりの version up。


2006.08.22 / Tuesday [長年日記]

* [cd/dvd] Classics / 朝日 美穂

10/11 発売予定のセフル・カバー盤。 そうか、彼女ももう 10 年やってるのかぁ…。

* [myself] 昨日と今日のお仕事

昨日は本社で作業。 夏期休暇 (+α) 明けだったこともあって、さすがに調子が上がらなかった。 まあ、仕方ないところか…。

今日の午前中は本社で、午後は某大学で作業。 大学の付属図書館、快適すぎ。 資料の豊富さと空間の落ち着き、そして BGM 効果で高い作業効率を維持できる。 やっぱり環境は重要。

しかしこの研究室の (この大学の、かな?) 学生さん達は本当に研究熱心ですね。 ほとんどの子達が、しっかり毎日学校に来てみっちり勉強してる。 修士課程で怠けや手抜きの気配を感じさせないのは、本当に素晴らしい事だと思う。 これなら確かに企業の研究所も欲しがるだろうね。 もっと言うと、研究所で最先端のテーマを担当させないと勿体無い感じかな。 凄いところだ…。


2006.08.24 / Thursday [長年日記]

* [computer/update] Sleipnir ver.2.4.6

Windows 上で動く高機能なタブ型 web browser。 約 1 ヶ月ぶりの version up。

* [computer/update] Lancer 20060824

Ogg Vorbis 系ツールやライブラリの高速化を狙ったもの。

* [hobby] Re: 杏仁豆腐

sin-x さんが反応して下さった小鬼來了というお店と その系列店が美味しい本物の杏仁豆腐を出すらしい。 …でも名古屋じゃ。 orz

と言っても、 通販で買っても そんなに食べないだろうから送料もったいないし…。 まあ、12 月に名古屋行った時に食べに行けるし、もうちょっと我慢しとこう。

と思ったら、もったいないと言うほど送料かからないみたい。 これはまずい。注文しちゃいそうだ。


2006.08.25 / Friday [長年日記]

* [computer/update] PHP ver.5.1.6

動的な web page 作成に向いているスクリプト言語。

* [computer/update] Gimp ver.2.2.13

非常に高機能な画像処理ツール。 安定版としては約 1 ヶ月半ぶりの version up。

* [computer/update] Gimp 2.2.13 for Windows

非常に高機能な画像処理ツール Gimp の Windows 版。 約 1 ヶ月半ぶりの version up。

* [computer/update] MacUIM ver.0.5.0-1

MacOS X の通常のアプリケーションで Anthy や PRIME を利用できるようにするツール。

* [miscellaneous] 太陽系惑星の新定義

荒川さんのもう一つの日記の記事。 後で読もう。

* [computer] バッテリー交換プログラム - iBook G4 および PowerBook G4 (Apple Computer)

2004 年のゴールデン・ウィークに購入した iBook G4 がうちにあるのですが、 該当バッテリーを積んでいることが判明しました。 めんどう臭いけど、休み中に処理しちゃおう。


2006.08.26 / Saturday [長年日記]

* [computer/update] Ruby ver.1.8.5

object-oriented programming を意識して作られた interpreted scripting language。 約 8 ヶ月ぶりの version up。

* [computer/update] 鬼車 ver.4.4.0

複数の文字コードに対応した C の正規表現ライブラリ (BSD ライセンス)。 約 1 週間ぶりの version up。

* [myself] 今週後半のお仕事

ずっと某大学の付属図書館で作業。 残念ながらまだネットワーク環境を確保できてないけど、 紙の資料がある程度豊富にあるので作業し易い。 木曜日の作業中、目の前にあった携帯電話のバイブレーション音が 異常に頻繁かつ豪快に聞こえた (机の上に直接置いてあった!) のが気になったけど、 3 日間を通してなかなかの作業効率を維持できた。

水曜日の作業後、自然に「あー、集中しすぎて疲れたー」と思った。久々。 今の会社に来てからあまり感じる機会のない、この充実した疲労感。 作業を中断させる要素がないって、やはり重要なことみたいだ。 …まあ、そういった要素にうまく対応した上で 効率的に作業することを求められてる (事業部的?) のでしょうけど、 そんな器用に立ち回るのは正直難しい。

工学の数学って不思議だ。 演算時に近似を多用、既知の命題であればその途中経過は軽視 (だよなぁ…) など。 数学科出身の人間から見ると「あれ? あれれ?」って感じ。 まあ、僕は数学科出身と言ってはまずい位にダメダメ学生だったので、 他の数学科出身の方であればまた違った印象を抱くのでしょうけどね。

博士課程に在籍している (かつ企業での研究開発を経験されている) 方に 「○×は信号処理方面と情報処理方面の両方の技術が基礎になっていて、それらは水と油の関係」といった話をしていただいた。 どうも僕が特徴量抽出などで苦労しているのは自然な事らしい。 いやいや、それでもやらなくちゃいけないのですがね。

* [computer] GMP -The GNU MP Bignum Library-

メモ。

GMP is a free library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating point numbers. There is no practical limit to the precision except the ones implied by the available memory in the machine GMP runs on. GMP has a rich set of functions, and the functions have a regular interface.

2006.08.27 / Sunday [長年日記]

* [computer][bookmark] 知っていると便利な gcc のオプション

激しく今更なんだけど、どうしても -dM -E を忘れてしまうのでメモ。

* [computer] C 言語のための現実的なポインタ解析

関口龍郎さんが書かれた PPL 2004 の推薦論文。 面白そうなので後で読もう。

著者の関口さん、理学の博士なのか。 この分野が理学扱いになるのは少し不思議な気がする (ズレてる?) けど、 単に所属の関係でそうなっただけなのかな?


2006.08.28 / Monday [長年日記]

* [computer] OpenCV 0.9.9 を Mac OS X 10.4 にインストールする

事前に pkg-config, libjpeg, zlib, libpng, libtiff (と ffmpeg) あたりを入れておくと吉。 また、CFLAGS CXXFLAGS で適当に -mcpu, -march, -mtune のいずれかを設定しておいた方が良さそう (僕は -O2 -mcpu=7450 -maltivec -mabi=altivec -pipe -fno-strict-aliasing としておいた) だけど、それ位かなぁ。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/opencvlibrary/opencv-0.9.9.tar.gz
$ zcat opencv-0.9.9.tar.gz | tar xvf -
$ cd opencv-0.9.9/
$ ./configure --with-python --with-quicktime --with-carbon
$ make && make check
$ sudo make install

ちなみに 上記は PowerPC G4 2nd Gen. 環境でインストールした手順。 Intel Mac 環境はまだ試してないけど、明日、試す予定。

Intel Core Duo 環境にもインストールした。 こちらは特別 CXXFLAGS を設定しなくても良さそう (さすが Intel CPU 環境!) だけど、 インストール手順の方は PowerPC G4 と一緒。


2006.08.30 / Wednesday [長年日記]

* [computer/update] 風博士 ver.0.4.0

レンダリングに Gecko エンジンを利用した web browser。 1 ヶ月ぶりの version up。

* [computer/update] 鬼車 ver.4.4.1

複数の文字コードに対応した C の正規表現ライブラリ (BSD ライセンス)。

* [computer/update] TinyXml ver.2.5.1

シンプルで小さい DOM な XML パーサ。 約 7 ヶ月半ぶりの version up。

* [computer] GCC: -Weffc++ (C++ only)

g++ にはこんなオプションがあるそうだ。 知らんかった。 orz

Warn about violations of the following style guidelines from Scott Meyers' Effective C++ book:

  • Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory.
  • Item 12: Prefer initialization to assignment in constructors.
  • Item 14: Make destructors virtual in base classes.
  • Item 15: Have "operator=" return a reference to *this.
  • Item 23: Don't try to return a reference when you must return an object.

Also warn about violations of the following style guidelines from Scott Meyers' More Effective C++ book:

  • Item 6: Distinguish between prefix and postfix forms of increment and decrement operators.
  • Item 7: Never overload "&&", "||", or ",".

When selecting this option, be aware that the standard library headers do not obey all of these guidelines; use grep -v to filter out those warnings.


2006.08.31 / Thursday [長年日記]

* [book] 工学のための確率・統計 / 北村, 尾崎, 東野, 中北, 堀

メモ。 工学系出身者はこういう基礎知識を持ってるから羨ましい。

* [computer][bookmark] Perl-5.8 覚え書き

土屋さんの文書。メモ。

このページは,Perl-5.8.2 を使う上で困ったことなどの覚え書きです.

* [computer] PowerPC G4 1GHz vs. Intel Core Duo 2GHz

新人研修でやらせた N クイーンの回答に 「ああ、なるほど」と思うものがあったので、 その実装を一部利用して適当に書いてみた。 要 C99 環境。

/**
 * @file    main.c
 * @brief   N クイーン問題の解の個数を求めるコマンド
 */
/* ヘッダ・ファイルの読み込み */ #include <stddef.h> /* NULL, size_t */ #include <stdio.h> /* printf, fprintf, putchar */ #include <stdlib.h> /* atoi */ #include <string.h> /* strcmp, memset */ #include <ctype.h> /* isdigit */ #include <assert.h> /* assert */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) #include <stdbool.h> /* bool (C99) */ #else /* C99 */ #error このコマンドのコンパイルには C99 対応コンパイラが必要です。 #endif /* C99 */
/* * ** 盤の表現について ** * - 盤は 1 次元配列を 2 次元配列と見たもので表現している。 * - 値が負であれば、それは効き筋となっている。 * - 値が 0 であれば、それは効き筋ではなく、クイーンもまだ置いてない。 * - 値が正であれば、クイーンが既に置いてある。 */
/** * @brief 盤の状態を出力 * @param file [out] 出力先 * @param board [in] 盤の情報 * @param width [in] 盤の幅 * @param count [in] 盤の表示の前に付ける正の数 * @note 引数 count が負の数の場合、数字のつかない盤の表示になる。 * @note 不適切な引数を適用した場合の動作は不定。 */ void Print(FILE* const file, const int* board, const size_t width, const int count) { assert(file); assert(board); if (count < 0) { fprintf(file, ">>>>\n"); } else { fprintf(file, ">>%d\n", count); } for (size_t l = width; l > 0; --l) { for (size_t c = width; c > 0; --c) { if (*board < 0) { fputc('X', file); } else if (*board == 0) { fputc('-', file); } else { fputc('Q', file); } ++board; } fputc('\n', file); } }
/** * @brief クイーンを置ける可能性を確認 * @param board [in] 盤の情報 * @param width [in] 盤の幅 * @param line [in] 行 * @param column [in] 列 * @retval true: 置ける * @retval false: 置けない * @note 不適切な引数を適用した場合の動作は不定。 */ inline bool PutQueenOk(const int* const board, const size_t width, const size_t line, const size_t column) { assert(board); assert(line < width); assert(column < width); return board[line*width+column] == 0; }
/** * @brief クイーンを置く * @param board [in/out] 盤の情報 * @param width [in] 盤の幅 * @param line [in] 行 * @param column [in] 列 * @note 不適切な引数を適用した場合の動作は不定。 */ void PutQueen(int* const board, const size_t width, size_t line, const size_t column) { size_t left = column; size_t right = column; size_t line_width = line*width; assert(board); assert(line < width); assert(column < width); assert(board[line_width+column] == 0); board[line_width+column] = 1; while (++line < width) { #if defined(__i386__) || defined(__x86_64__) line_width += width; #else /* x86, x86_64 */ line_width = line*width; #endif /* x86, x86_64 */ if (left > 0) { --left; --board[line_width+left]; } --board[line_width+column]; if (++right < width) { --board[line_width+right]; } } }
/** * @brief クイーンをどかす * @param board [in/out] 盤の情報 * @param width [in] 盤の幅 * @param line [in] 行 * @param column [in] 列 * @note 不適切な引数を適用した場合の動作は不定。 */ void RemoveQueen(int* const board, const size_t width, size_t line, const size_t column) { size_t left = column; size_t right = column; size_t line_width = line*width; assert(board); assert(line < width); assert(column < width); assert(board[line_width+column] == 1); board[line_width+column] = 0; while (++line < width) { #if defined(__i386__) || defined(__x86_64__) line_width += width; #else /* x86, x86_64 */ line_width = line*width; #endif /* x86, x86_64 */ if (left > 0) { --left; ++board[line_width+left]; } ++board[line_width+column]; if (++right < width) { ++board[line_width+right]; } } }
/** * @brief N クイーンの解を求める (盤の状態の出力あり) * @param file [out] 出力先 * @param width [in] 盤の幅 */ size_t GetSolutions(FILE* const file, const size_t width) { assert(file); size_t count = 0; if (width > 0) { int line = 0; int board[width*width]; size_t columns[width]; size_t column; memset((void*)board, 0, sizeof(int)*width*width); memset((void*)columns, 0, sizeof(size_t)*width); while (true) { column = columns[line]; if (column < width) { if (!PutQueenOk(board, width, line, column)) { ++columns[line]; } else { PutQueen(board, width, line, column); if (++line >= width) { ++count; Print(file, board, width, count); --line; RemoveQueen(board, width, line, column); ++columns[line]; } } } else { columns[line] = 0; if (--line < 0) break; RemoveQueen(board, width, line, columns[line]); ++columns[line]; } } } return count; }
/** * @brief N クイーンの解を求める (表示なし) * @param width [in] 盤の幅 * @note まだまだ改良の余地あり。 */ size_t GetNumberOfSolutions(const size_t width) { size_t count = 0; if (width > 1) { const size_t half_width = width / 2; size_t line = 0; size_t i = 0; int board[width*width]; size_t columns[width]; size_t column; memset((void*)board, 0, sizeof(int)*width*width); memset((void*)columns, 0, sizeof(size_t)*width); while (i < half_width) { PutQueen(board, width, line, i); ++line; while (true) { column = columns[line]; if (column < width) { if (!PutQueenOk(board, width, line, column)) { ++columns[line]; } else { PutQueen(board, width, line, column); if (++line >= width) { count += 2; --line; RemoveQueen(board, width, line, column); ++columns[line]; } } } else { columns[line] = 0; if (--line < 1) break; RemoveQueen(board, width, line, columns[line]); ++columns[line]; } } RemoveQueen(board, width, line, i); ++i; } if (width % 2 > 0) { PutQueen(board, width, 0, half_width); i = 0; const size_t loop = half_width - 1; while (i < loop) { PutQueen(board, width, 1, i); line = 2; while (true) { column = columns[line]; if (column < width) { if (!PutQueenOk(board, width, line, column)) { ++columns[line]; } else { PutQueen(board, width, line, column); if (++line >= width) { count += 2; --line; RemoveQueen(board, width, line, column); ++columns[line]; } } } else { columns[line] = 0; if (--line < 2) break; RemoveQueen(board, width, line, columns[line]); ++columns[line]; } } RemoveQueen(board, width, 1, i); ++i; } RemoveQueen(board, width, 0, half_width); } } else if (width == 1) { ++count; } return count; }
/** * @brief メイン関数 * @note コマンドとして呼ぶ際にオプションとして * -p や -print を与えると解の盤を表示します。 * 数字を与えると、その幅・高さを持つ盤で探索します。 * -h や -help を与えると使用方法を表示します。 */ int main(int arg_count, char** arg_strings) { int width = 8; bool print = false; bool help = false; bool bad_arg = false; const char* arg_string = NULL; while (arg_count > 1) { arg_string = arg_strings[arg_count - 1]; if (isdigit(*arg_string)) { const int number = atoi(arg_string); if (number > 0) { width = number; } } else if (*arg_string == '-') { ++arg_string; if (!strcmp(arg_string,"p")) { print = true; } else if (!strcmp(arg_string,"-print")) { print = true; } else { if (!strcmp(arg_string,"h")) { help = true; } else if (!strcmp(arg_string,"-help")) { help = true; } else if (!strcmp(arg_string,"hp")) { help = true; } else if (!strcmp(arg_string,"ph")) { help = true; } else { --arg_string; bad_arg = true; } break; } } else { bad_arg = true; break; } --arg_count; }
if (!help && !bad_arg) { unsigned int number = 0; if (print) { number = GetSolutions(stdout, width); fprintf(stdout, ">>RESULT\n"); } else { number = GetNumberOfSolutions(width); } fprintf(stdout, "解の数 (%d クイーン): %u\n", width, number); } else { if (bad_arg) { fprintf(stderr, "\"%s\"は不正なオプションです。\n", arg_string); } fprintf(stderr, "Usage: %s [-ph] [number]\n" "\tnumber\t\tボードの幅\n" "\t-p, --print\t解のボードをプリント\n" "\t-h, --help\tこのヘルプをプリント\n", *arg_strings); }
return 0; }

で、まあ、動くのは別に良いとして、 とりあえず Mac OS X 10.4.7 / iBook G4 1GHz / GCC 4.0.1 の結果。

$ gcc -Wall -O3 -mcpu=7450 -pipe -fno-strict-aliasing -std=c99 -DNDEBUG main.c -o nqueen
$ time ./nqueen 15
解の数 (15 クイーン): 2279184
16.753u 0.068s 0:18.40 91.3%    0+0k 0+2io 0pf+0w
$ gcc -Wall -Os -mcpu=7450 -pipe -fno-strict-aliasing -std=c99 -DNDEBUG main.c -o nqueen
$ time ./nqueen 15
解の数 (15 クイーン): 2279184
26.024u 0.106s 0:29.28 89.2%    0+0k 0+2io 0pf+0w

次に Mac OS X 10.4.7 / MacBook Pro Intel Core Duo 2GHz / GCC 4.0.1 の結果。

$ gcc -Wall -O3 -march=prescott -pipe -fomit-frame-pointer -std=c99 -DNDEBUG *.c -o nqueen
$ time ./nqueen 15
解の数 (15 クイーン): 2279184
20.514u 0.030s 0:20.55 99.9%    0+0k 0+0io 0pf+0w
$ gcc -Wall -Os -march=prescott -pipe -fomit-frame-pointer -std=c99 -DNDEBUG *.c -o nqueen
$ time ./nqueen 15
解の数 (15 クイーン): 2279184
17.249u 0.025s 0:17.28 99.8%    0+0k 0+2io 0pf+0w

うーん、G4 1.25GHz dual とかで試したら、 もしかして完全に (ハッキリと分かる程度に!) 逆転する可能性があるんじゃ…。

その前に本当に速い N クイーンのプログラムを作ってみたいかも。 以前 C++ で作成したのは、これよりは速いけど、けっこう不満点が多いので…。 とりあえずビット演算主体で実装してみたいな。


  • この日記には本日 名の方が訪問してくださっているようです。 また、昨日は 名の方が訪問してくださったようです。
  • この日記の更新情報の取得には antenna.lirs を利用するのがおすすめです。