路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

「マルチパラダイムデザイン」の序論

2006-05-31 18:51:40 | プログラミング
ずっと前に読んだ「マルチパラダイムデザイン」という本ですが、同書の翻訳者の方が「序論」を公開されているのを見付けました。

いわく「『マルチパラダイムデザイン』を読み解くガイドライン」とのことだったので、早速読んでみました。

本書を読んだときに理解できずにもやもやが残っていた、ドメイン分析とオブジェクト指向技術の対応が示してあり、かなりすっきりとした気分です。

本書を読んだ、あるいは、読みはじめようとされている方に、かなりオススメ。是非。

(まあ、弱小ブログで吠えたところで、大勢に影響は無いのですけれども。)

えいやっとメーラー乗り換え

2006-05-31 15:05:41 | その他
今まで使っていたシェアウェアのメーラーが調子悪くなったのをきっかけにして、Mozilla Thunderbirdに乗り換えました。

いろいろ使い勝手は違う部分あるのはしょうがない。スパムメールの学習速度は思ったより早くてびっくり。

ついでにこのブログのデザインも、涼しげなものに変更。

stable_sortはやっぱり遅い

2006-05-29 14:23:27 | プログラミング
stable_sortとは、安定なソートを行う関数です。

安定であるとは、ソート対象の配列の要素の比較を行ったときに同位であった場合にはもとの順序を保存する、ということです。ものの本を読むと、std::stable_sortは、std::sortよりも「遅いことがある」と書いてあります。

今回は、大きな配列に対して安定なソートが必要になりました。どのくらい大きいかというと、実メモリに収まりきらない(ことがある)くらいです。で、やっぱり速いに越したことはないので、ちょっと実験してみました。

実験用のコードは後で示しますが、結果から言うと、普通のソート(std::sort)とくらべると、安定なソート(std::stable_sort)は、明らかに遅い。だいたい2割から5割くらい遅い。

ちょっと調べてみると理由はわかりました。stable_sortで使われているマージソートというアルゴリズムは、ソートの対象となる配列の半分くらいの大きさの一時的な記憶領域を必要とするから、だそうです。

ここで悩みどころです。

実は(というほどもったいぶった話でもありませんが)、通常のstd::sortを使って安定なソートをする簡単なトリックがあります。カギは、比較関数として、要素の比較を行って同位であった場合に、ソート前の配列内での要素の順序の比較結果を返すものを作ることです。

ソート前の配列内での要素の順序を保存する単純な方法としては、要素のデータ構造の中に、順序を保存するための領域を設ける、というものがあります。要素のデータ構造が大きなものであれば、このような余分な領域を設けるペナルティは、メモリ量の観点からは小さなものです。

要素のデータ構造がもっと大きくて、そのまま要素を並べ替えるのが非効率であるために、要素へのポインタの配列を作っておいてからソートしようなどと考えている場合には、この解決策はより魅力的なものになります。なぜなら、要素へのポインタの配列をソートするときに、ソート前の配列内での要素の順序の比較を行うには、ポインタの値の比較を行えばよいわけで、そうなると、先ほどの余分な領域が必要なくなるためです。

問題点としては、それなりに制約があること。前者の方法では、データ構造に余分な領域を設けてもよいか。後者の方法では、ポインタの比較に頼るため、一般的なコンテナには適用できません。適用可能なのは、生の配列、std::vectorとboost::arrayくらいでしょう。

以下、実験に使ったコードです。vcとg++でコンパイルできます。
(ちなみに、メモリ配置が影響しないか心配だったので、std::sortとstd::stable_sortの順序を入れ替えたものも作って実験してみました。結論としては、細かい数値はともかく、傾向は同じでした。)
----------------------------
#include <vector>
#include <utility>
#include <algorithm>
#include <iostream>

#include <stdlib.h>
#include <time.h>
#include <assert.h>

int main(int argc, char* argv[])

std::cout << "size, simple sort, stable sort" << std::endl;

size_t size = 6000;
for (size_t k = 0; k < 30; ++k) {
size = (size_t)(size * 1.5);

std::vector<std::pair<int, int> > values;
values.resize(size);
for (size_t i = 0; i < values.size(); ++i) {
values[i] = std::pair<int, int>(rand(), i);


std::vector<std::pair<int, int> > v2(values);

time_t start1, end1;

time(&start1);
std::sort(values.begin(), values.end());
time(&end1);

time_t start2, end2;

time(&start2);
std::stable_sort(v2.begin(), v2.end());
time(&end2);

for (size_t i = 0; i < values.size(); ++i) {
assert(v2[i] == values[i]);


std::cout << size << ", " << (end1 - start1) << ", " << (end2 - start2) << std::endl;


return 0;

----------------------------

オフィス2007ベータ2インストールしてみました

2006-05-24 15:30:14 | その他
ベータ2が公開されたと聞いたので、おもしろがってインストールしてみました。

まずワードを触ってみます・・・

いろいろなニュースで知ってはいましたが、上段にパネルみたいなものがあり、今までメニューだったものが、そのパネルのタブになっていて、メニューのアイテムをクリックするとパネルが切り替わります。いや、視覚的にはわかりやすいんですけれども。

このパネルがまた、何とも場所を食います。ちょうど、旧ワードで多段にメニューを出したとき、画面が狭ーい感じだったのと同じかそれ以上に。あちゃー。

ファイルメニューが、なんか丸いボタンに変わってます。なぜだー。

気を取り直して、Visioを触ってみます・・・

メニューとツールバーは、現在のものと変わりありません。ほっとしました。って・・・ちょっと待て、ということは、同じベータのワードとは全然違うということだ。あれれ。

ぱっと気づいたのは、テーマが導入されたこと。ちょうど、旧パワーポイントと同じように、テーマを切り替えると、全体的な色がさっと切り替わります。便利かも。

でも、影や立体感については、相変わらずそれほど高度なものはありません。Visioのメニューやボタンにあるような立体的で微妙な影が、Visio自身で作図できないのって、お絵かきツールとしてどうなんでしょうか・・・

今日はこれまで。

※なお、上記はあくまで数分使った段階でのファーストインプレッションであり、これから使い込むにつれて、印象が変わっていく可能性は大いにあります。対象もベータです。そのへんご了承ください。

関西空港は世界4位

2006-05-24 14:24:38 | その他
記事によると、関西空港の「公衆トイレの清潔さと入国審査が世界1位」らしい。

海外旅行に行くとき始めて使ったのが関西空港だったので、気づいていなかったけど、確かに米国の空港とかは「何を考えてるんだー」というくらい入国審査に待たされたりするからなあ。そう言えば、アジアには国際線と国内線の乗り継ぎで空港の中を延々と歩かされたりする空港もあるし。

利用料が高いと文句ばっかり言ってたけど、ちょっと見直した。

ノートPC選定見送り

2006-05-20 03:09:11 | その他
ここ2週間ほど、新しいノートPCを買おうかと考えて、選定作業をしていたのですが、結局先送りすることにしました。

引っかかっていたのはVitaですが、

(1)今Windows VistaがプリインストールされていないPCを買うと、後でリカバリーやら何やらがめんどうくさそう。(リカバリーでWindowsXPをインストール、その後Vistaをインストール・・・)

(2)何となく、秋以降のノートPCでは、HHDのような、起動時間が早くなる技術が主流になりそう。そうなると、それまでのモデルが一気に古めかしく感じられるのは必定。(追記2006/05/25、「低消費電力と高速起動を実現する「ハイブリッドHDD」がWinHECに登場 (1/2)」だそうです。)

(3)思ったよりもVistaの敷居が低かった。現在のノートPCをアップグレードアドバイザでチェックしたら、VistaもAeroも大丈夫らしい。つまり、Vistaを使いたいだけなら、新しいノートPCは不要。

(4)BD vs HD DVDについても、もう少し様子を見たい。メディア単価が下がるまで使わない(使えない)し。

たぶん、今回夏モデルをスキップすると、次は秋か冬か、ひょっとすると来春。

買い控えを防ごうと、各社キャンペーンを張っているのは理解できますが、地デジもロケーションフリーも使わないので・・・

自己解決: 画面(モニタ)の列挙

2006-05-12 17:41:27 | プログラミング
先日、EnumDisplayMonitors()がうまく働かないから、実行時に動的にロードするという記事を書きましたが、その後、まっとうなやり方を見つけましたので、訂正いたします。

EnumDisplayMonitors()を使うには、プリプロセッサマクロで、
WINVER=0x0500
と定義します。

これにより、Windows 2000以降をターゲットとしたプログラムであることを、コンパイラやリンカに伝えることができて、めでたくEnumDisplayMonitors()もリンクされます。

まあ、先日のコードも、Windowsのバージョンがわからない状況で、EnumDisplayMonitors()が使えるかどうかチェックしつつ実行する、という状況では役に立つんだ、と強弁することもできなくはないでしょうけれども・・・

というわけで、お騒がせしました。m(__)m


BOF: 気になった記事

2006-05-10 03:57:46 | Birds-Of-Feather
シリコンバレー技術者の平均年収が8万5000ドルを突破--CおよびC++の人気は変わらず, ZDNet Research

Microsoft OfficeでOpenDocumentファイルが利用可能に--プラグインを開発,
文:Martin LaMonica(CNET News.com), 翻訳校正:坂和敏(編集部)

後藤弘茂のWeekly海外ニュース PS3、“59,800円”の意味, PC Watch

フリーソフト「Bonanza」が初出場で優勝 - 第16回コンピュータ将棋選手権, 佐藤晃洋, MYCOMジャーナル


memo: Joel on Software

2006-05-02 17:55:32 | プログラミング
プログラマ向け(?)の読み物サイト、「Joel on Software」というのを見つけました。

http://www.joelonsoftware.com/

一部の記事については日本語訳サイトで読めるようです。

ここでごちゃごちゃ感想を書くより何より、まずどこからでも読んでみてください。
かなりおすすめ。