2008年11月29日土曜日

テンションダウン

 結局、利用する予定だったモジュールは不安定で遅いので、一部自分で書いたやつを使う事にしました・・・。その方が10倍速いし安定している・・・。しかし、今後の展開を考えると面倒くさい・・・。仕事山積・・・。

うけけ

 明け方ハイ~!冴えてる~ハイ!

んがーーーーーー

 仕事かかえ杉だろーーーーーーーーーーーーーーーー。

2008年11月27日木曜日

nested_exception の例

 nested_exception の良い例を作成せよと、指令が出ていたけど、漫然と思い当たるところを書き散らしてみる。ちなみに、良い例なんて思いつきません(爆)。

 外部から安全にスレッドを中断させる方法が無い Windows では、boost::thread のinterruption において、例外を流用するというトリッキーで賢い方法を採用しています。

class BOOST_THREAD_DECL thread_interrupted
{};

std::exception から派生すると、途中で例外をキャッチした後に、thread_interrupted かどうかを調べて、例外の再送をしないといけないので面倒です。MIXIN 用との事だけど、このように例外もグループ化できれば、さぞかし便利な場面があるのかもしれない・・・という感覚だけは残ります。

 で、更に進めて、階層化できた方が面白いんじゃなかろうか?って感じて、考えたのが下。

template<int LEVEL>
class level_exception : public std::nested_exception {
public:
int level() const { return LEVEL; }
bool deeper( int level ) const { return level >= LEVEL; }
};

階層で捕まえたければ

} catch( level_exception<3>& le ) {
...
}

ネストで捕まえたければ

} catch( nested_exception& ne ) {
if( ne.deeper( 3 ) ) {
...
} else {
throw;
}
}

と、こんな感じ。あんまり面白くないか…。

2008年11月26日水曜日

線引き

 何について書いたら良いのか悩みますが、今回は、インターネットを使う上での線引きを自分の中ではしているので、その点について書いてみます。
 絶対に避けているものが3つ。
  1. クラウドの世界をデスクトップに持ち込む事
  2. 携帯電話で個人情報を入力する事
  3. オンライン・バンクインターネット・バンキング(銀行)
 1は、例え個人情報保護方針やプライバシーポリシで、デスクトップの情報を収集する事が無いと表明されていても、サードパーティ(具体的にはGoogleDesktop)にデスクトップの検索まで任せる事はしていません。昨日テレビで(忙しくてテレビ自体を見る事も珍しい状況ですが)GMail をもっと活用すれば良いなどとワールドビジネスサテライトで紹介されていましたが、どこまでを委ねるか線引きをしておくべきだと強く思います。ウィンドウズのOS上でマイクロソフトがデスクトップ検索機能を提供するのと、無料でGoogleが検索機能を提供するのとでは、意味合いが全く異なります。いつ方針転換するか、信用できたもんじゃないです。JavaScriptを埋め込むだけでサービスを享受できるものをカヌークラブのサイトに入れてみた事がありました。ある日、そのJavaScriptが牙を剥いたのです(サイトのデザインを変更して、情報を収集するための検索ボックスを邪魔な位置にドカンと表示するようになった)。裏切られても大丈夫な線はどこか?考えてみてはどうでしょうか?「クラウドにあるから安全」という論調は、悪意に満ちた一面に対して目をつぶっていると言えます。

 2は、携帯電話における個人情報の取り扱いは出鱈目もいいところで、基本の設定は固有IDを送信します。私はAUの携帯を利用していますが、IDを非送信にするURLは非公開ですし、アクセスしてもエラーを頻発するような代物で、DoCoMoに関しては ?GUID=ON のパラメータを付加すれば問答無用で固有IDを送信する状況です。クッキーが無いので、これをサービス提供側(コンテンツ配信側)がアクセス解析に利用するのは自然な流れで、ここまでは私も問題にせずEZウェブも利用しています。しかし、携帯電話に個人情報を入力するとなると話は別です。携帯電話のメールアドレスを使ってサービスを享受するとか、個人情報を必要とする会員制サイトは、全く利用していません。

 3は、利用しても良いとは思っているけど、ITのプログラミングを職業とするプロでさえオンライン・バンクインターネット・バンキングを安全に利用する自信が持てないという事です。私の所属するカヌークラブにて、会費をオンラインバンクを利用して収集できればいいのでは?という話になったことがありました。しかしプロの立場から見て、パワーユーザ以下のユーザがオンラインバンクインターネット・バンキングをするのは、極めて危険が高いという判断から、導入させませんでした。実際、多くの知り合いがスパイウェアの類に感染しておりました。

Windows Vista は眠らない その3

 前回からの続き、UACを無効にしたものの状況は改善しているとは言えない。もちろん、くそUACにはサッサと逝ってもらって良かったと思っている。しかし、相変わらず、いつまでたってもシャットダウンやログオフできない時がある。あれからも、電源ボタンを長押しして強制オフの刑を実行し、強制チェックディスクの刑を頻繁に食らったりしている。
 パソコンを買うときに、WindowsXPへのダウングレード権は、人間らしいパソコン生活を送るためには欠かせない権利だとしか言いようがない。頼むよ、マイクロソフト。

2008年11月25日火曜日

boost thread interruption


#include <iostream>
#include <boost/thread.hpp>

void f() {
while( 1 ) {
std::cout << "interrupt OK" << std::endl;
{
boost::this_thread::disable_interruption di;
std::cout << "interrupt NG" << std::endl;
boost::this_thread::interruption_point();
{
boost::this_thread::restore_interruption ri(di);
std::cout << "interrupt OK" << std::endl;
}
std::cout << "interrupt NG" << std::endl;
}
std::cout << "interrupt OK" << std::endl;
boost::this_thread::interruption_point();
}
}

int main() {
boost::thread t(f);
t.interrupt();
t.join();
return 0;
}

おおーっ、スゲー。windowsでも中断するよ!disable_interruption の意味がいまいち、よくわかんねーけど、規模が大きくなったら効いてくるのかな?

2008年11月24日月曜日

PostGIS の領域判定

 ここギコさんの記事からパクらせていただきました。
PostgreSQL には、GIST という領域型のインデックスがあり、これを利用できるとクエリを劇的に速くすることができます。さて、地図で利用する座標系は、いろいろあって、広い領域を扱おうと思うとJGD2000などの緯度経度の座標系を扱う事になると思います。ところが、点から半径10km圏内といった指定をするためには、距離を緯度経度に変換しなければならず、面倒です。しかも、長さは緯度により変化するので、厄介です。
 以下の関数は、指定図形を指定座標系(SRID)と、その単位により拡張した領域を返すものです。

CREATE OR REPLACE FUNCTION expand_pseudo(geometry, integer, double precision)
RETURNS geometry AS
$BODY$
DECLARE
sid integer;
geo geometry;
BEGIN
-- SRIDを退避
sid := SRID($1);
-- 指定のSRIDにGeometryを変換する
geo := Transform( $1, $2 );
-- 指定SRIDの単位系で図形を拡張する
geo := expand( geo, $3 );
-- 元のSRIDへ変換する
geo := Transform( geo, sid );
-- バウンディング・ボックスを返す
RETURN Envelope( geo );
END
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE
COST 100;

 いちいち、geo という変数に代入していますが、連結した方が効率は良いかもしれません。何をやっているか、コメントを書いて、効率よりもわかり易さを重点に書いてます。

 使い方は、

DECLARE
geo geometry;
rec record;
BEGIN
-- JGD2000: 4612
-- 世界測地日本公共座標12系: 2454
geo := GeomFromString('POINT(140.223412,42.123456)', 4612);
geo := expand_pseudo( geo, 2454, 10000 );
FOR rec IN select * from hoge_table where geom && expand_pseudo( geo, 2454, 10000 ) LOOP
--- 何か
END LOOP;
END

という感じです。

plpgsql で配列

 plpgsql で配列を扱います。配列要素の削除とか、基本的な関数が足りなくて、俺が関数付け足さなきゃダメって事?と思うけど、とてもそんな時間は取れない。直前のポストの cat_multistrings の使い方を提示するのが目的なので、そこに絞ります(前置きが長いって…)。

配列の宣言は、型の後に[]を付加する。

DECLARE
new_geom geometry;
geoms geometry[];
BEGIN


配列の初期化

geoms := string_to_array('',',');


要素の追加

geoms := array_append( geoms, new_geom );

cat_multilinestrings

 世間では3連休なんだけど、家で仕事・・・orz。マネジメントもするけど、諸々の事情で、多岐にわたってコーディングもしなければならない。
 PostGis で、MULTILINESTRING 型の図形を連結したいと思ったのだが、plpgsqlで関数を書くことに・・・。


CREATE OR REPLACE FUNCTION cat_multilinestrings(geoms geometry[])
RETURNS geometry AS
$BODY$
DECLARE
i integer;
j integer;
n integer;
sid integer;
pstr text;
tg geometry;
BEGIN
n := array_upper( geoms, 1 );
if n < 1 then
RAISE EXCEPTION 'cat_multilinestring: empty input';
elseif n < 2 then
RETURN geoms[1];
end if;
pstr := '';
sid := SRID(geoms[1]);
FOR i IN 1..n LOOP
if GeometryType( geoms[i] ) != 'MULTILINESTRING' then
RAISE EXCEPTION 'cat_multilinestring: invalid geometry type %1 in %2', GeometryType(geoms[i]), i;
end if;
if sid != GetSRID(geoms[i]) then
tg := Transform(geoms[i],sid);
else
tg := geoms[i];
end if;
FOR j IN 1..NumPoints(tg) LOOP
pstr := pstr || ',' || X(PointN(tg,j))::varchar || ' ' || Y(PointN(tg,j))::varchar;
END LOOP;
END LOOP;
-- 先頭のカンマを除去
pstr := substr( pstr, 2 );
RETURN GeomFromText( 'MULTILINESTRING((' || pstr || '))', sid );
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;

 バッファ長の問題で、あまり長い図形を連結すると空になるという問題があります。plpgsqlにおける配列の取り扱いについては、次のポストで書きます。

2008年11月21日金曜日

効率化について

 マネジメントに引っ張られるまでは、これからの時代は効率化よりも循環型の社会が望ましいと考えていました。地球温暖化などの問題を考えたとき、循環型の社会が理想的に思えたからです。そのためには効率は少々後回しにしても良いとさえ感じていました。
 それまではアルゴリズムを中心としたプログラミングの世界ばかりやっていたので、私の読んでいる本も技術系の本に偏っていました。だから人に薦められて利益の方程式を読んだ時には思考が循環型の考えから効率化の考えに一変し、目から鱗が落ちる思いがしました。著者の勝間さんが情報時代を熟知しているので共感しやすかった点も大きいです。
 ところが、最近また効率化も大事だが循環型の社会が望ましいのではないか?という考えが持ち上がるようになりました。情報革命により徹底して効率化し、その果てに人は幸せになっていったか?効率化した分だけ人々は裕福になれるはずなのに、ちっとも幸せじゃない。効率化した分だけ仕事が無くなっているからだと思えてしょうがないのです。働かざるもの食うべからず。非効率的でも、みんなで仕事を分け合った方がよっぽどか幸福じゃなかろうか?と・・・。
 フラットな世界にも疑問があります。労働力が安い国に仕事もお金も流れるのは自然な流れですが、そこへお金が流れていけば、いずれは格差も狭まりフラット化するはずです。ところが、なかなかそうは成っていない気がしてしょうがない。きっと誰かが中間にいて搾取しているからに違いないと感じるのです。こう考えたとき、フラットな世界においては、ワーキング・プア問題と、中国の労働者の権利や人権問題がリンクしてくるような気がします。
 効率化も大切だけど、人としての尊厳を見失ってはいけないのだと思います。

デジタル化について

 この時代のキーワードは何だろう?と考えた時に、「デジタル化」が挙げられると思います。
デジタル化できるものであれば、何でもネットを介して送信できます。生き残るために何を生産すれば食っていけるか?を考える時に、デジタル化できないものは何か?をキーワードにしてみてはどうでしょうか?
 逆にデジタル化できるけど、デジタル化されていないものは何だろう?と考えてみるのも面白いでしょう。
 最近、面白い製品が考案されるようになりましたが、ハードウェアの世界は、まだまだイノベーションを行う余地が残っていると思います。オーディオセットのイコライザーなどデジタルエフェクトをインターネットを通じてサービスするというのはどうでしょうか?DVD機器からサービスセンターへ信号が飛んで、サービスセンターからアンプへと信号が飛ぶ。様々なエフェクトはネットを通じてサービスされるのです。この例は、さして面白くもないですが、サービスを主体に考えた方が良いです。
 デジタル化されているけど、ブレイクスルーしていないものに本があります。パラパラめくり見の術が使えないからブレイクスルーしていないだけで、電子ペーパーが発展すれば、本も現在の音楽市場と同様の道を辿ると感じています。
 デジタル化できるもので商売をしていた業種は、ことごとく死に目を見ている事と思います。そのような業種は売る事からサービスする事へと発想を転換していかなければならないのです。私の職業であるソフトウェア産業も例外ではないのです。今はまだデジタル化できないけど、ちょっとした事でデジタル化できるようになる産業で仕事をしている人は、気をつけた方が良いです。

GMAILのテーマについて一言

 日本語版にもGMailのテーマが追加されて、さっそく設定しようと思ったら、このテーマには場所が必要です。と、個人情報の入力を迫られる仕掛けになっている。しかも、キャンセルボタンが無い。キャンセルするためには、他のページに移動するか、受信トレイを表示するかしなければならない。
 これで、Googleは、地域マッチング広告の機能を手に入れるという寸法だ。シリウス・テクノロジーのやっているadLocal の居住地版というわけだ。プライバシーポリシーにも、この情報をどのように利用するのか書かれていないので、私は怖くなって、テーマを導入する事ができませんでした。
 もしくは、首都圏のどこかにでもしてやれば良かったか?
 次は、グーグルリーダにテーマが導入されて、このテーマを利用するには、性別が必要です。となるのか、生年月日が必要です。となるのか?ターゲッティング広告の時代という事だろうけど、慎重にならないといけない

 重大そうなので、緊急で記事をポストする事にしました。

めんどくさい

 ポストして、いちいちHaloScanに行ってトラックバックしなきゃならないし、タイトルや概略や記事のURLを打ち込まないといけない。めんどくせーぞ>Gooooooooooooooogle
 次は、デジタルと効率について書く。

2008年11月20日木曜日

情報革命 その2

 「ITに携わる仕事をしているのであれば、時代の流れを察知するためにもRSSリーダぐらい使え」と何度忠告しても、使わない人は使いません。そのような姿勢の人は、どうなったか?会社では(特に中小企業)そのような人を養うだけの余裕も体力も無いので、辞めてもらうしかないのが現実です。
 首都圏と地方では温度差があると思いますが、さすがに最近は、地方でも皆、身の回りに何か大変な事が起こっていると自覚しています。それでも、情報革命が起こっているという確たる事実が、意外にわかっていません。ブログを読んでいる人に書いても、あまり意味が無いような気はするのですが、どの本を読めば、情報革命が起こっている事を理解できるか、3冊上げてみようと思います。

 一番のおすすめは、フラット化する世界(上下)です。原題は「World is flat」で、フラット化ではなく、既にフラットでな状態で、ニュアンスは若干異なる気がします。恥ずかしながら本書を読むまで、ウォルマートがITバリバリの企業である事も知りませんでしたし、アウトソーシングは聞いた事があってもインソーシングも知りませんでした。随所に生き残るためのヒントが散りばめられており、刺激的です。増補版では、フラットな時代に相応しく世界中の反響をネットで集めて更に考察が加わっています。

 二番目は、ウェブを変える10の破壊的トレンドです。本書が出た時は、「自分の専門分野の秘密が暴露されているので勘弁してくれ」と思いました。出版されてから1年ぐらい経過して、状況も変化していますが、本質をついていると思います。書いてある事が一部は難しくてピンと来ないかもしれません。

 三番目は、神々の「Web3.0」です。いろんな本を読んで考察されており、よく書けていると思います。私は特にGoogleとSNSの事が理解できて良かったと感じました(インフォコモンズを読んだ方が理解しやすいかもしれません)。

2008年11月19日水曜日

スパムメール対策

 自分の中では今更感が強いのですが、ウィンドウズ環境におけるスパムメール対策に関して書こうと思います。と言っても、メールサーバを運用している場合の話で、パーソナルな環境での話ではありません。
今ではLinuxサーバを構築するのも楽になったので、敢えてウィンドウズ環境でメールサーバを構築しなくても良さそうに感じますが、ウィンドウズ環境でお金をかけずにメールサーバを構築しようと思った場合にはXMailServer という GPL のメールサーバとXMailCfgの組み合わせがお勧めです。スパム対策ソフトとして有名なものとしてはSpamAssassinがあります。このXMailServerでSpamAssassinを活用するためのフィルタxmspamcを公開しています。
一般的には、スパムメールは破棄しないでスパム扱いを行った上で別フォルダに退避するという運用をされている事と思います。しかし、私の会社の環境では、スパム度の高いメールは、ユーザが見る事もなくサーバ側で完全に破棄する運用をしています。そんな危ない事を???と疑問を抱く人もいるかと思いますが、そもそもスパムメールの量は尋常ではなく、メールサーバが受信するメールの70%以上はスパムメールであり、その中からスパムでないメールを発掘するのは至難の業です。
スパムメールを破棄しないで運用してみて思ったのは、ある程度スコアが高くなると、100%スパムメールです。高スコアのスパムメールは捨てて問題ないです(保障はできませんが・・・)。生真面目にスパムメールを残してスパムでないメールを見逃すよりは、高スコアのスパムメールを捨ててみては如何でしょうか?数が少なければ見逃す確率も減るってもんです。
参考までに、私は毎日、低スコアのスパムメールを20通から80通ぐらい受け取っています。

2008年11月18日火曜日

Windows Vista は眠らない その後

 前回 UAC Tool をインストールしたと書きましたが、その後の話です。UAC Tool を入れて、Windows Vista が快眠してくれるようになったか?と、問われると、否。強制的に電源を切る回数が3回に1回の頻度から、7回に1回の頻度に下がっただけでした。
 そもそも、パーミッションを管理するのが本筋であって、UIで何とかしようという発想自体が既に可笑しいと思うのです。UACは、無効にしました。私はこれに付き合っていられません。セキュリィティが必要とされるフォルダでは、たかだかファイルをコピーするのに5分以上待たされた挙句の果てに、コピーに失敗して、シャットダウンもままなくなるなんて状況はうんざりです。毎回電源を強制切断する方が、よっぽどかセキュリィティ上の問題を抱えてます。
 ことわっておきますが、スパイウェア対策とウィルス対策等には神経を使っています。プログラマ系の職業にUACはイラネー。

うげー

 Alchemy は勘弁してくれー。そんなに調べられないよー。タスクが・・・

2008年11月17日月曜日

クラスターフォーラム

 今日は、クラスターフォーラム。デジタル・アースの雨車社長のお話を聞けて、楽しかったです。GoogleEarthって、白地図の地球儀だって部分は完全に誤解していました。

2008年11月16日日曜日

「日本語が滅びるとき」を読まずに感想

 私も、この本は読む必要が無いだろと思っている人間のうちの一人。
 まず、5年後、いや、10年後に日本語が滅んでいるという状況が想像できない。ここ10年の変化を振り返ってみてどうだろう?10年前に今の状況が予測できたであろうか?予測からそんなに外れていない?では、この先10年後を予測できますか?私が生きている以上、日本語が滅んでいるという事は無さそうである。であれば、90歳まで生きれるとは思ってないけど50年後に日本語が滅んでいるなんて、ファンタジーの世界の話にしか聞こえないし、思えない。

 

2008年11月15日土曜日

研究会

 今日はサイバーフィールド研究会でした。学術的な話題は、難しいけど楽しい。まあ、研究する立場じゃないから、そう言いきれるのだろうけど・・・。

2008年11月12日水曜日

情報リテラシー

 奥村先生のブログで、よく情報リテラシーの重要性について触れられていますが、私も情報リテラシーは重要だと思うので、書いてみようと思います。
 情報化社会において、考慮すべき事が大きく4つあると思います。
  1. 個人情報について
  2. サービスを享受する事とのトレードオフ
  3. 客観的に判断する事
  4. 統計の罠
 個人情報ですが、情報化社会では価値あるものとして扱われ、取り返しのつかない有価証券のような存在でもあります。よくあるパターンとして、姓名判断や占いを装って個人情報を収集するサイトがあります。ひっそりと、ページ下にある「個人情報の取り扱いについて」をクリックすると、個人情報収集の目的について、「集めた個人情報を顧客情報として利用します」とか、「顧客情報として第三者に提供します」と書かれています。

 サービスを享受する事とのトレードオフとは、現在、様々な無料のサービスで溢れていますが、サービスを提供する側は、どこでお金を入手するのかビジネスモデルを考慮する必要があるという事です。あるサービスでは、アマゾン書籍のリンクがサービス運営サイトのアフィリエイトになっています。ガジェットという形を取っている事もあれば、形態は様々です。また、サービスを利用してもらう事により、データマイニングやテキストマイニングを行って付加価値を得るという手法もあります。情報=お金である事を認識し、サービスを享受する事とのトレードオフを認識すべきであると思います。

 客観的に判断する事とは、ごく当たり前の事で、例を挙げると、痛いニュースで「こんにゃくゼリーで窒息死」という記事を見たとき、他の食品ではどうだろうか?と考える力を持つ事です。この後、GIGAZINEで実際に他の食品でどれぐらいの事故が起こっているのか調査した記事が発表されましたが、これは情報リテラシーをネタにした記事であるといえます。技術情報を調べる場合には、その記事が何時書かれたものなのか?という事が気になります。
 
 統計の罠とは、グラフの表示方法を変える事により意図的に事実を曲げて見せる手法や、標本サンプルを偏って扱う事や、アンケートで誘導するような質問を設定するといった事があげられます。

2008年11月11日火曜日

Androidで閃いた

 今日、閃いてしまいました。AppStoreが活況で、恐らくAndroidでも同じような状況が生まれると思います。そして、アプリケーションが充実してきたその時!
 デスクトップ環境にAndroidアプリを逆輸入するというのはどうでしょうか?JavaVMで動かすのだから当然できるよね?Google Chrome なんて作らずに、AppBrowser を作ればいいんじゃないか?って・・・

Hyper-v その3

 Hyper-vを試験してきましたが、良好です。Windows2003-R2ゲストOSの動作も軽いし、安定しています。なんと言ってもシャットダウン時も考慮されているので安心できます。Windows-2008も軽量ですし、この分なら Windows-7 も期待できるかも…。

2008年11月8日土曜日

情報統制

 情報化社会において、誰かが発信した価値ある情報は、高速光速で世界中を駆け巡り、あっという間にコモディティ化してしまいます。競争社会における価値観とは他者との差別化を如何に図れるか?であり、ある程度の情報統制が必要だと思います。その辺の切り分けをどこで行うのか?
  1. 自分の利害と一致しない情報は発信可能
  2. 準備万端で発信する時が来た(iPhone や iPod の発表など)
  3. 情報発信しても他者が侵略できない領域を持っている場合
  4. すでに勝者の地位を得ている場合
  5. 信頼を得るための発信
  6. 社会的貢献活動のための発信
  7. 共同戦線をはる(協調作業を行う)ための発信
  8. 情報を得るための発信
  9. 利己的な発信
ざっと思いつくのは、こんなところでしょうか?

utf8の扱い

Coyoliteさんが書いたUTF-8Nを吐くワイドストリーム の逆バージョンを試してみたくて、書いてみました。
これ、標準で欲しいです。一応 utf8_codecvt_facet.hpp, utf8_codecvt_facet.cpp を作成して、使います。namespace boost::detail は、ちょっといただけないかもしれませんが、そこはご愛嬌。
// utf8_codecvt_facet.hpp
#ifndef BOOST_DETAIL_UTF8_CODECVT_FACET_HPP
#define BOOST_DETAIL_UTF8_CODECVT_FACET_HPP

#define BOOST_UTF8_BEGIN_NAMESPACE \
namespace boost { namespace detail {
#define BOOST_UTF8_DECL
#define BOOST_UTF8_END_NAMESPACE }}

#include <boost/detail/utf8_codecvt_facet.hpp>

#undef BOOST_UTF8_END_NAMESPACE
#undef BOOST_UTF8_DECL
#undef BOOST_UTF8_BEGIN_NAMESPACE

#endif // BOOST_DETAIL_UTF8_CODECVT_FACET_HPP


// utf8_codecvt_facet.cpp
#include <boost/config.hpp>
#ifdef BOOST_NO_STD_WSTREAMBUF
#error "wide char i/o not supported on this platform"
#else

#define BOOST_UTF8_BEGIN_NAMESPACE \
namespace boost { namespace detail {
#define BOOST_UTF8_DECL
#define BOOST_UTF8_END_NAMESPACE }}
#include <libs/detail/utf8_codecvt_facet.cpp>
#undef BOOST_UTF8_END_NAMESPACE
#undef BOOST_UTF8_DECL
#undef BOOST_UTF8_BEGIN_NAMESPACE

#endif // BOOST_NO_STD_WSTREAMBUF


#include <iostream>
#include <fstream>
#include <string>
#include "utf8_codecvt_facet.hpp"

int main() {
std::locale::global( std::locale("") );
std::wifstream ifs( "x.txt" );
ifs.imbue( std::locale(ifs.getloc(), new boost::detail::utf8_codecvt_facet ) );
while( ifs.good() ) {
std::wstring wstr;
std::getline( ifs, wstr );
std::wcout << wstr << std::endl;
}
}

ほんとは、char型のバッファに読み込まれてしまった utf8のコードに対して変換をかけたいのだが、めんどくさそうだ。
標準機能として、トラックバック機能が無いのは超めんどくさい

2011/07/07 追記: error C2661: 'std::locale::facet::operator new' というエラーになるのは、MFC のデバッグバージョン用 new が原因である。正直、この DEBUG_NEW 鬱陶しい。

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

expat で遊ぼ


#include <iostream>
#include <string>
#include <vector>
#include <expat.h>
#include <boost/shared_ptr.hpp>
#include <boost/foreach.hpp>

class xml_node;

class xml_node {
public:
xml_node( const XML_Char* name ) : node_name_(name) {}
public:
std::basic_string<XML_Char> node_name_;
std::basic_string<XML_Char> node_value_;
std::vector< boost::shared_ptr<xml_node> > childs_;
};


class xml_holder {
public:
std::vector< boost::shared_ptr<xml_node> > stack_;
boost::shared_ptr<xml_node> current_;
};

void starter(void* userData, const XML_Char* name, const XML_Char* attrs[]) {
xml_holder* holder = reinterpret_cast<xml_holder*>(userData);
holder->stack_.push_back( holder->current_ );
boost::shared_ptr<xml_node> element( new xml_node( name ) );
holder->current_->childs_.push_back( element );
holder->current_ = element;
}

void ender( void* userData, const XML_Char* name) {
xml_holder* holder = reinterpret_cast<xml_holder*>(userData);
holder->current_ = holder->stack_.back();
holder->stack_.pop_back();
}

void data( void* userData, const XML_Char* s, int len ) {
xml_holder* holder = reinterpret_cast<xml_holder*>(userData);
holder->current_->node_value_.assign( s, s + len );
}

void trace( int depth, boost::shared_ptr<xml_node> elem ) {
for( int i = 0; i < depth; ++i ) { std::cout << " "; }
std::cout << elem->node_name_ << ":" << elem->node_value_ << std::endl;
BOOST_FOREACH( boost::shared_ptr<xml_node> e, elem->childs_ ) {
trace( depth+1, e );
}
}

bool parse_xml( const std::string& xml ) {
xml_holder holder;
holder.current_ = boost::shared_ptr<xml_node>( new xml_node( "root" ) );
XML_Parser parser = XML_ParserCreate("UTF-8");
if( !parser ) return false;
XML_SetUserData( parser, &holder );
XML_SetElementHandler( parser, starter, ender );
XML_SetCharacterDataHandler( parser, data );
int iseof = 0;
XML_Parse( parser, xml.c_str(), xml.size(), iseof );
XML_ParserFree( parser );
trace( 0, holder.current_ );
return !iseof;
}

2008年11月7日金曜日

windows vista は眠らない

 Windows Vista は、なかなかシャットダウンやログオフをしてくれません。今日なんかは、10分以上待ってもシャットダウンしないので、強制的に電源を切ったら、再起動時にチェックディスクで15分以上待たされました。まあ、シャットダウンやログオフができないので3回に1回は、強制的に電源を切ってます。Unexpected shutdown detected... の文字を見るたびに、Windows Vista の filesystem は強固だなぁと、違った意味で感動します。
 あまりに酷く、きっとシャットダウンやログオフしようとしているのに、糞重たい UAC が悪さをしているに違いない!と、UAC Tool をインストールしました。日本語化のパッチも出回っているのですが、あいくに x64環境のものはありません。Visual Studio でSymconsent.exe を編集して保存すると日本語もOKみたいです。

 まだ1日目ですが、なかなか快適です。さっさとインストールすればよかった…。

ウィンドウズは、IObjectSafety とか、やることの観点がズレてるように感じます。

マルチコア

 Windows7では 255CPUまでしか対応しないといった記事を読んだので、その辺に関して、でたらめ右脳的な発言をしてみよう。
 クロックアップによる速度競争は、消費電力が高くなっていくため、コア数が増える方向に変わってきています。よって今後は、OSのアーキテクチャも巻き込んで、マルチコアなアルゴリズムや分散アルゴリズムが重要になるであろうと思います。まず、マルチスレッドな処理でネックになってくるのが、同期保護の問題。しかし冷静に考えてみよう???全てのプロセスやスレッド間で、そもそも同期を取る必要があるのだろうか???
 こう考えた時、ドメインのようなモデルが導入されていくと感じます。なんでも直列に繋いでもしょうがない、64個とか32個とか16個を区切りとして、メモリアクセスのバスも区切られたハードウェア構成になり、それらをドメインと呼び、分散処理する。あるいは、コアが複数個ある1次キャッシュメモリに動的にバインドできるとか・・・。
 うーん・・・まとまりがなくなってしまった・・・。

2008年11月6日木曜日

家電操作ML

 これは、何年前のアイデアだったろうか…。QRコードですが、家電の操作を記録するのに使えないだろうか?と、思った事があります。携帯電話の普及により、小型カメラのデバイスは安くなっています。例えば、プリンタに内臓させるとします。印刷用紙を買ってきたら、その包装袋にQRコードが印刷されていて、8つ切り写真、6つ切り写真とか、字も添えられている…。この印刷がしたいと思ったら、包装紙に印刷されているQRコードを読み取れば、プリンタ設定が完了するというものです。マニュアルにも操作と共に、QRコードを載せればいい。

2008年11月5日水曜日

ubuntu 8.10 いろいろ

 8.10 にすると gcc のバージョンが 4.3.2 と新しくなって嬉しいが、Kernel 2.6.27-7 で起動すると、無線Lanがうまく動作しない・・・。長期安定版である 8.04 を使い続けた方が良さそう気がします。
 それはそうと、boost_1_37_0 が出たので、コンパイルしようと思ったら、"duplicate initialization of gcc" とかエラーが出て make が通らない。検索してみたら、boost ml にもポストされていたが完全にスルーされていた。で、user-config.jam をうんたらとメッセージが出ているので、中を覗いたら、あんまし嬉しくなさそうな設定が書かれている。全部コメントアウトしたら、make も通るようになった。


$ ./configure

user-config.jam を編集して、コメントアウトしまくる。

# Boost.Build Configuration
# Automatically generated by Boost configure

# Compiler configuration
# using gcc ;

# Python configuration
# using python : 2.5 : /usr ;

boost-python も使う予定が無いし、うぜーと思っていたのでちょうど良い。

$ make
$ make install


2009/12/12 追記
configure 無くなってた…。

$ chmod +x bootstrap.sh
$ chmod +x tools/jam/src/build.sh
$ ./bootstrap.sh
$ ./bjam

2008年11月4日火曜日

セミナー漬け

 マネジメントに関わるようになってから、セミナーとか研究会に参加する機会が増えた…。今日は、SaaSビジネス研究会と戦略的経営マーケティングセミナーの梯子。
 返ってきたら、ガイアの夜明けで、鬱病の話が出てた。まあ、今「情報革命」が起こっていて、旧来のビジネスモデルが成り立たなくなってきている。そこを無償の人件費だけで乗り切ろうとすると鬱にもなるわなぁと思った。

2008年11月2日日曜日

getuntil.hpp

c++ の getline は、なんとなく改行コードまでを取得するという仕様で、ネットのプロトコル等で利用するには、不満が残ります。そこで、汎用的な以下のようなものが有用ではないか?と思い、以前に作成したものを貼っときます。

>>> getuntil.hpp

//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Copyright (c) 2007 OKI Miyuki (oki.miyuki at gmail dot com)
//
#include <iostream>
#include <string>

template<typename CharT, typename CharTraits, typename Allocator>
std::basic_istream<CharT, CharTraits>& getuntil(
std::basic_istream<CharT, CharTraits>& istrm,
std::basic_string<CharT, CharTraits, Allocator>& str,
const std::basic_string<CharT, CharTraits, Allocator>& delm
) {
typedef std::basic_istream<CharT, CharTraits> istrm_type;
std::ios_base::iostate cur_state = std::ios_base::goodbit;
bool read_once = false;
const typename istrm_type::sentry sync( istrm, true );
if( sync ) {
try {
str.clear();
typename CharTraits::int_type row_xor = 0;
typename CharTraits::int_type ins_xor = 0;
size_t delm_len = delm.size();
typename CharTraits::int_type val = istrm.rdbuf()->sgetc();
for( size_t i = 0; i < delm_len - 1; ++i, val = istrm.rdbuf()->snextc() ) {
if( CharTraits::eq_int_type( CharTraits::eof(), val ) ) break;
read_once = true;
ins_xor ^= val;
row_xor ^= CharTraits::to_int_type( delm[ i ] );
str += CharTraits::to_char_type( val );
}
row_xor ^= CharTraits::to_int_type( *delm.rbegin() );
for( size_t ipos = 0; ; val = istrm.rdbuf()->snextc(), ++ipos ) {
if( CharTraits::eq_int_type( CharTraits::eof(), val ) ) {
cur_state |= std::ios_base::eofbit;
break;
}
read_once = true;
ins_xor ^= val;
str += CharTraits::to_char_type( val );
if(
ins_xor == row_xor
&& val == CharTraits::to_int_type( *delm.rbegin() )
&& str.substr( ipos ) == delm
) {
istrm.rdbuf()->sbumpc();
break;
}
if( str.max_size() <= str.size() ) {
cur_state |= std::ios_base::failbit;
break;
}
ins_xor ^= CharTraits::to_int_type( str[ipos] );
}
} catch(...) {
istrm.setstate( std::ios_base::badbit, true );
}
}
if( !read_once ) {
cur_state |= std::ios_base::failbit;
}
istrm.setstate( cur_state );

return istrm;
}

template<typename CharT, typename CharTraits, typename Allocator>
std::basic_istream<CharT, CharTraits>& getuntil(
std::basic_istream<CharT, CharTraits>& istrm,
std::basic_string<CharT, CharTraits, Allocator>& str,
const CharT* delm
) {
std::basic_string<CharT,CharTraits,Allocator> delimiter( delm );
return getuntil( istrm, str, delimiter );
}


 使い方は、こんな感じです。

>>> getuntil.cpp

#include "getuntil.hpp"
#include <fstream>
#include <sstream>
#include <iomanip>

#include <boost/asio.hpp>

int main() {
std::ifstream ifs( "getuntil.cpp", std::ios::binary );

int i = 0;
std::string delm( "\r\n" );
std::string line;
while( ifs.good() ) {
getuntil( ifs, line, delm );
std::cout << std::setw(3) << ++i << ": " << line;
}

std::cout << std::endl;
std::cout << "Enter stringstream test" << std::endl;

std::stringstream ss;
ss << "high-ho, high-ho!";
ss << "It's home from work we go! high-ho, high-ho!...";

while( ss.good() ) {
getuntil( ss, line, "ho!" );
std::cout << line << std::endl;
}

std::cout << std::endl;
std::cout << "Enter boost::asio::streambuf test" << std::endl;

boost::asio::streambuf sb;

std::ostream ostrm( &sb );
ostrm << "This is data from client\r\n";
ostrm << "And flying send\r\n";

std::istream istrm( &sb );

while( istrm.good() ) {
getuntil( istrm, line, "\r\n" );
std::cout << line;
}
}