My Daily Programming Life...

Fedora9の日本語入力

Anthyっていう変換サーバーを使いたいと思ったのだけれど、うまくいかずしばらくほったらかしにして再度チャレンジ。
そもそものLinuxの日本語入力の仕組みとか、調べていたんだけれど
yum groupinstall japanese-support
って一発やれば「システム」→「設定」→「ユーザー向け」→「入力メソッド」から設定できるようになりました。これでいいらしいです。理由は知りません。

CppUnitでstd::exceptionのテストはできない?

現在ユニットテストにCppUnitを使っている。最近使い始めて、今日直面した問題。
あるメソッドがstd::exceptionを投げることを確認するテストをしたかった。
CPPUNIT_ASSERT_THROW( obj.foo() , std::exception );
が・・・
コンパイルエラー : error C2312(Visual Studio 2005)が出てしまう。
問題は、上記マクロがstd::expressionを用いて実装されていること。
std::expeptionのcatch部分が二つになってしまう。

http://www.nabble.com/CPPUNIT_ASSERT_THROW-double-handling-of-STL-std::exception-tc9497496.html
こんなのは見つけたけど、結局あまり良い解決策は見つけられなかった。

Visual Studioって・・・

たまたま見つけたこのやりとりががかなり笑えた。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1010463885?fr=rcmd_chie_detail

Binary Treeの実装

今日はアルゴリズム、データ構造の勉強。
BinaryTreeのInsert部分だけ作ってみた

#include <cstddef>

template<class T> class BinaryTree
{
template <class T> class Element{
public:
Element()
:parent(NULL),child_less(NULL),child_more(NULL)
{
};
~Element(){ 
delete child_less;
delete child_more;
};

Element* parent;
Element* child_less;
Element* child_more;
T  obj;
};
public:
BinaryTree(void)
:m_first(NULL)
{
}

~BinaryTree(void){
delete m_first;
};

int Insert(const T& obj){
Element<T> *el = new Element<T>();
el->obj = obj;

if( !m_first ){
m_first = el;
return 1;
}

return CheckAndInsertObject( m_first , el ); 
};

private:
Element<T>* m_first;

int CheckAndInsertObject( Element<T>* target_el, Element<T>* new_el ){
if( !target_el ){
return 0;
}

if( target_el->obj < new_el->obj ){
if( target_el->child_more ){
return CheckAndInsertObject( target_el->child_more , new_el );
}
else{
target_el->child_more = new_el;
new_el->parent = target_el;
return 1;
}

}
else if( target_el->obj > new_el->obj ){
if( target_el->child_less ){
return CheckAndInsertObject( target_el->child_less , new_el );
}
else{
target_el->child_less = new_el;
new_el->parent = target_el;
return 1;
}
}

delete new_el;
return 0;

};
};

XCodeで別ディレクトリのライブラリへリンク

普段はWindowsしか使わないけど、今日はMacでこの前作ったPersistentQueueをビルドするためにXCodeプロジェクトを作った。
構成はこう。
PersistentQueue本体と(static library)とPersistenteQueueTest(本体のテストプログラム)の二つがプロジェクトとしてある。
それぞれにDebugとRelease版がある。
PersistenteQueueはSQLiteのライブラリをリンクする(これもDebugとRelease)がある

ひとまず、PersistentQueueというXCodeプロジェクトを作った。
そこに本体のヘッダとソースを追加して、Debug版はPersistentQueued.a , Release版はPersistentQueue.aをビルドするように設定した。
出力先は$(MYPROJ_HOME)/lib と自分で設定した環境変数を利用し設定。
Debug版はSQLited.aを、ReleaseはSQLite.aをリンクするように設定。
これでここまではうまくいった。

問題はPersistentQueueTestのほう。もともとVisualStudioで作っていたもので、そこではPersistentQueueソリューションの中に、両プロジェクトが入る形で構成されていた。
んじゃ、同じように、このPersistentQueueというXCodeプロジェクトに両方入れられるんじゃないかと言うことで、やってみた。

XCodeプロジェクトにはターゲットという物がある。これがビルドプロセスの一つの単位になっているっぽい。PersistentQueueライブラリ用にひとつ、PersistentQueueTestプログラム用に一つのターゲットをつくればよさそう。ということで作った。問題ない。

さて、このPersistentQueueTestは、先ほど出力したPersistentQueue.a ( $(MYPROJ_HOME)/lib内 )をリンクしたい。もちろんデバッグ版とリリース版分けて。

どうやったらいいのだろうかと思って、プロジェクト設定やターゲット設定をいじってみたが、これがうまくいかない。
いちばんそれっぽい方法として、PersistentQueueターゲットの出力であるPersistentQueue.aがプロジェクト管理ウィンドウの「Products」フォルダに表示されていたので、それをドラッグして、リンクプロセスに入れてみた。一応自動的にデバッグ版とリリース版でリンクするライブラリ名が変わるようになった。

でもさらに問題。なぜかリンクプロセスが失敗する。PersistentQueuTestがそのライブラリを自分のビルドプロダクト出力フォルダから探そうとする。なぜだ・・・。ライブラリ検索パスとかしていしたし、そもそもさっきドラッグしてリンクプロセスに追加したライブラリはは$(MYPROJ_HOME)/libにあって、その情報を見てもそうかかれているのに・・・。

色々調べたら、ターゲット設定の「構成別のビルドプロダクトパス」みたいなやつの中を探すらしい。これがPersistentQueueとPersistentQueueTestでまったく異なるフォルダを示しているとうまくいかない。
でも、やりたいことはまさに、この異なるフォルダにそれぞれの生成物を出力したいのですが・・・。

どうすりゃいいんでしょうか。

まあ、まだ今日が初日だし、いろいろ試してみよう

キーボードを使いやすく

最近どうも右手、右腕が変。なんか気持ち悪い。なんか常に違和感がある。痛い訳じゃないしかゆいわけでもないんだけど。
おそらくマウスの使いすぎなんだと思う。右肩も痛い。プログラマーなんだから、もっとキーボードで操作出来るようになればいいんだと思って、勉強中。エディタももっときちんと使えるように練習しなくちゃ。

今回は、まずWindowsでCapsとCtrlの入れ替え。
http://uguisu.skr.jp/Windows/winCaps.html
を見てやった。
Controlは左下にあるんだけど、それがちょっと使いにくいと感じて替えた。それに慣れてるからまだ間違えるけど、あきらかにCapsよりCtrlの方が使う頻度が高いのに、打ちにくい場所にあってもしょうがないし。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,06,00,00,00,3a,00,1d,00,1d,00,3a,00,\
29,00,79,00,5b,e0,7b,00,38,e0,70,00,00,00,00,00

これをテキストに保存して.regという拡張子を付ければ、僕の設定になる。
Ctrl ←→ Caps Lock
変換(スペースの右) → 全角/半角
無変換 → Windows Key
かな → Alt
に変換しているはず。

あとはキーボードショートカット
http://qune.cside.com/archives/000515.html
http://homepage1.nifty.com/keyboard_maniac/SpecialKT.htm
のとか。

エクスプローラの拡張とか、もっと使いやすいファイラとか誰か知ってたら教えてください。

2009/3/20 追記
各ユーザー別にキーボード設定したい場合はHKEY_CURRENT_USER\Keyboard Layout にScancode mapを作ればよいらしい

PersistentQueue

仕事でQueueをファイル上作る必要があってPersistentQueueクラス作った。
PopやPush、Frontとかのインターフェースをくっつけて、
インプリメンテーションはSQLiteを用いて行った。

Pushはバイト列をもらって、blob型で入れるだけ。Popはその逆の順番で出せばいい。でも、その順番を保障するために、idフィールドを入れておいた。auto_incrementになるので、いつも一番小さい値のやつを出せばいい。idは64bitもあるから、まあ、まず使い切ることはない。

このQueueには少し特別な仕様が要求されていて、あるファイルサイズを超えない範囲で追加可能というものが必要になっている。
1Byte単位で正確に指定されたファイルサイズを超えない必要はなかったので、SQLiteのPragma max_page_countを利用してサイズを制限することにした。

擬似コードはこんな感じ。
SetMaxSize( int size ){
sql = "pragma page_size";
int pagesize = GetValue( sql ); //SQLiteのページサイズ取得
int pagecount = size / pagesize;
sql = "pramga max_page_count=" + pagecount;
ExecQuery(sql); // max_page_countを設定
}

ちなみに、pagecountに0が入ると、サイズは制限されないっぽかった。

SetMaxSizeに指定されるものよりすでにファイルサイズが大きくなってしまっている場合には、それ以下にはmax_page_countの値は下がらない。でもそれからはPushできなくなるので今回の使用にはちょう
どよかった。

ただ、このままだと、Popしたときにファイルサイズがもとにもどらない。もともとSQLiteの使うファイルはレコードをdeleteしてもファイルサイズは勝手には減らない。それをするためにVACUUMというSQLを発行することが出来て、こうするとファイルのデフラグが行われる。
・・・ただ、これがかなり遅い。それなりにパフォーマンスが要求されたので、毎回PopしたときにVACUUMする訳にはいかない。
というわけで、とりあえずPop 100回に1回の割合でVACUUMを行うことにした。
ここら辺は要求される仕様と相談ですね。今回はこれでよさそう。クラスにはその値を設定できるようにはした。

SQLiteにはincremental_vacuumというのがあって、今回はそっちを利用した。
"pragma auto_vacuum = 2"として、"pragma incremental_vacuum"を実行すればいい。
dailog2.gifdialog1.jpg
Windows XPのフォルダのセキュリティの詳細設定のダイアログ。セキュリティ設定に関するところをいろいろ調べていてこの画面の説明があった。見ていたのは英語のサイトで、上のダイアログボックスが例として表示されていた。んで、同じように僕も開いて、一つ一つ見ていったら、一番最後の一文が意味不明・・・。「子オブジェクトすべてのアクセス許可エントリを、ここに表示されているエントリで子オブジェクトに適用するもので置換する」って・・・。日本語変じゃない?3回くらいゆっくり一つ一つ読んでいったけど理解できなかった。英語の方のダイアログ見ればなんとなくは分かる。きっと「ここに表示されている子オブジェクトに適用されるエントリで、すべての子オブジェクトのエントリを置き換える」ことを言っているんだろう。

Vistaではこういうのは直っているんだろうか。

日本のIT

久しぶりにブログ。

最近はずっと忙しかった。プログラム作る仕事だから基本的には楽しいからいいのだけど。

今日は朝まで生テレビを見ていた。非正規雇用者の貧困問題についてだった。僕はこの貧困問題については、市場主義が生み出したものなのかなと思っている。価値を作れる能力のある人はそれだけもらえるし、そうでない人はもらえない。僕は超市場主義者なのでこれでいいと思っている。弱肉強食。勝てないなら消えていく。その中で自分の勝てる分野を探していく。そういうことでいいと思う。

ただ、社会というものがある以上、その中でどうしても自分の場所を確保できなかった人のための最低限の保障は必要なのかなとも思う。しかし結局これは早い話が、能力のある人からの寄付(税金)ということになる。社会全体がそれだけの力がなければそれもままらなない。今日本はそれが出来ない状況に陥っているのだろうか。そんな寄付をしていたら高齢者への保障も、医療も、道路も、そして企業もダメになっていってしまう。そんな状況なのかもしれない。

結局お金が足りないのだと思う。国内でこちょこちょあっちからこっちにお金や物を動かしてもそもそも足りていないのだと思う。日本は対世界の価値を、僕たちが求めているほど生み出せていないのだと思う。

番組の中で日本の経済は良くなっていくのか、そしてどうしたら良くなるのかという問いに、堀紘一さん(僕はこの人が言っていることが番組全体を通して一番まともだと思った)が、日本の得意なものをやるしかない、それはコツコツやること、そしてチームワークであり、製造業を強くしていかなくてはいけない、ということを言っていた。そして「日本人はITではインドに、金融ではアメリカに絶対に勝てない」ということを言っていた。

この二つの勝てないものの発言は、ものすごく僕にとっては興味深い物だったし、確かにその通りだと思った。「ITは論理力、英語力、数学力この3つでだいたい決まる。そしてそれはインドには勝てない。金融は日本はもともとお金に対してあまり良いイメージを持っていない文化があり、向いていない。アメリカには勝てない。」というものだった。

結局のところ日本人はチームワークで戦うしかない。そして、製造業で、日本にしか持てない技術で戦うしかない。そういうことだと思う。

さて、僕はIT企業に勤めている。プログラマーをやっている。僕はインド人に勝たなくてはいけない。もちろんアメリカ人にも。そうしなくては生活ができない。論理、英語、数学。僕はどれも日本のIT企業の中ではまだぎりぎり勝負できるかもしれない。でもおそらくインドでは全く勝負にならないだろうと感じる。そしてアメリカでも同様に。

最近読むコンピュータ関連の情報は50%ぐらいは英語の情報になってきている。英語の方が新しいし、正しいし、量も圧倒的に多い。英語ができなければITの世界ではやっていけない。マイクロソフトの日本語訳のドキュメントの範囲でプログラムを書くだけなら問題ないが、それでは日本の片隅で動くプログラムしか書けない。それでいいなら別だけど、いまのところ僕はそのつもりはない。

プログラミングは楽しいね

最近は頭の中はコンピュータのこと考えているのが80%ぐらいになっている。とにかく本を読んでいる。Webもかなり参考になる。

こうして今いろいろ勉強してみると、やっぱり素直に大学で情報工学科行っておいた方がよかったのかなぁとか思う。自分が知りたいことをいろいろ検索していると、しょっちゅう大学の講義資料とかそういうのに出くわす。情報工学科の人たちはこんなに楽しいことを学部の3年とかで勉強しているのかぁ、とか思うと、やっぱりそっちのほうがよかったかなぁって思う。まあいまさらどうしようもないので、いまからでも順番に勉強していく。

以前に日本のソフトウェア輸入額は輸出額の100倍あるって書いた。いろんな本を一度に読んでみて、その理由の一つが分かった気がする。情報が足りないか、誤っていることが多いと言うこと。

だいたい読む本は海外で出版されたものの翻訳が多い。海外の本にはかなりいい書籍があるということが最近分かってきて、さらにそれらは本当に今の、最新の情報が載っている。でも、それが翻訳されて発売されるまでにはかなりの時間を要するし、すべての本が翻訳される訳じゃない。

そしてその翻訳が意味不明なことが多いのも問題を大きくしていると思う。Windows SDKとかでもそうだったりすることもある。デバイスドライバの本を読んでいて、意味の分からないところがあって、なんどかその前後のページを読み直していて、ちょっと気がついて、それがもともとどんな英語だったか想像してみたら理解できたって事があった。

コンピュータの独特の用語とかそういったものが翻訳されるときに、どうするかというのは結構難しいと思う。

たぶん英語の文章も慣れれば日本語と大差なく読み進められると思うし、多少時間がかかってでも読めるようにしておいたほうが、あとあと楽だろうと思う。とにかく日本語翻訳の本を読むのはなるべく避けた方がいい気がしてきた。

日本の技術者が自分で書いている本はすごくいい本がたくさんあると思う。でも翻訳の本は、やっぱり読みにくいし分かりにくいと感じることが多い。

タイトルに「プログラミングは楽しいね」と書いたけど、今はプログラミングそのものよりコンピュータとOSの仕組みの理解に時間をかけている感じ。プログラミングの勉強としては、デザインパターンが最近の課題かと思う。言われれば分かるけど、自分でやってみてそれが本当にその方法論を実践できているのかを確認できるだけの力がない。

C++のライブラリでPOCOというのがある。これはデザインパターンを駆使して作られていると思う。そしてそれをC++で実装しているわけで、最近はこのソースコードが僕の教科書になっている。教科書にしてよいかどうかははっきりとは分かっていないけど、いろいろな評判を聞くと、決して悪いことはなさそう。

ところでC++難しいね、やっぱり。少しずつ理解していこう。

APIフックとかドライバとか

仕事の中で今はWindowsのAPIフックとかフィルタドライバとかの話が面白い。まあ、普通のAPIフックはユーザーモードのちょっとテクニカルな話なだけでそれほど目新しいことはないけれど、フィルタドライバはかなり違った世界だ。

デバイスドライバは情報も少ないし、種類もいろいろあるし、かなり理解は大変。とくに最初がたいへん。なんとなくその世界が分かってくるまでにかなりいろいろ読んだ。CプログラミングのHellow Worldのようにはいかない。

まだまだドライバを書けるレベルにはほど遠いけど、入り口にはたどり着いた感じ。これまではどこが入り口かも分からなかった。

ドライバはなんか、Windowsと対等に渡り合える感じがいい(笑)Windowsだろうがなんだろうが、俺が支配者だ!みたいな感じです。まあ、その結果がブルースクリーンだったりするわけですが・・・。

フィルタドライバに関しては、実デバイスをいじる訳じゃないのでハードウェアの知識が直接必要になるわけじゃない。でもその周辺で何が行われるかは知らないといけない。とりあえず、ファイルシステムフィルタをきちんと理解して自由に書けるようになりたい。

あけましておめでとうございます

新年ですね。今の自分の状況で新年を迎えられたのは、本当によかったと思う(就職できたりとか)

ところで、ちょっと読んだ記事で、ソフトウェアの輸出入の差は100倍以上あるそうな。輸出額が約90億に対して輸入額が9000億以上なんだそうだ。この差はひどい。

なんでだろ・・・。日本は世界に売れるソフトを作っていないのか。

確かに考えてみると、Windows,Officeなんてのは当然ながらアメリカ製。フリーソフトだけどFireFoxやThunderbird,Operaなんかも海外製っちゃ海外製。Flashなんかもアメリカ製(Adobeはアメリカ?)。

んー、自分のパソコンの中身を見ても、日本製のソフトはFTPクライアントのFFFTPぐらいしかないかも。あとはゲームとか。

ゲームは是非日本から世界に発信してほしいなぁと思う。やっぱゲームは日本は強いんじゃないかと思うし。

一応今の会社は自社製品を作って売っているので、それが世界で売れるようになったらいいなぁ。決してどんなソフトだって世界で売るのは不可能じゃないと思うんだけどなぁ。

そういうものに向けていろいろ勉強しなきゃね。
feedSubscribe to my feed