2008年12月26日金曜日
2008年12月23日火曜日
2008年12月22日月曜日
久々に映画を見に行った
CGが綺麗で、大人でも楽しめました。エンディングのスタッフロールを見て、これはデザイナの力量がもの凄いかも?と感じました。WALL-Eなら、もう一回映画館に足を運んでも良いかも?世界観も結構、好きです。
ちらっと本屋に寄って、「数学イノベーション」という本を見つけて買いました。文部科学省科学技術政策研究所が編著で、へぇーって感心しました。一通りの分野を押さえてあり、おもしろそうでした。アマゾンのアフィリエイトで紹介しようかとも思いましたが、冊数が無いorz。
2008年12月19日金曜日
Google App Engine アカウントが
2008年12月18日木曜日
世界不況
日本のゼロ金利で預金者の利子は金融機関の懐に入ってバブルから回復したはずなのに、軒並みサブプライムローンの影響を受けて多大な損失を出しているこの現状…。庶民も、さすがに頭にきてまっせ。
世界が協力して人権問題に取り組むべきなのではないか?最低賃金の水準を世界的に引き上げるとかしないと、搾取の価格競争から抜け出せないのではないか?などと、声をあげたくなります。
boost serialization で template class
template <typename T>
class foo {
...
};
を定義するには?
namespace boost {
namespace serialization {
template <typename T>
struct implementation_level< foo<T> > {
typedef mpl::integral_c_tag tag;
typedef mpl::int_<primitive_type> type;
BOOST_STATIC_CONSTANT( int, value = implementation_level::type::value );
};
}
}
ネタでした…。
2008年12月17日水曜日
VC8のintellisense死ね(備忘録)
- <vs>\VC\vcpackages\feacp.dll の
を削除するか、名前を変更する。 - プロジェクト中の *.ncb ファイルを削除する。
2008/12/19 追記
ただし、ATL において接続ポイント(SynkPoint)を正しく認識しなくなるという問題があるため、インタフェイスを変更した場合に限り、intellisense を復活させなければならない。
2008年12月16日火曜日
2008年12月12日金曜日
UTF-8(adhoc)
オープンソース界の流れは、完全に UTF-8 が主流です。特に欧米人から見れば ASCII だけで済むのに、なんで面倒くさい大量に存在する漢字に対応しなければならないんだ?というのが心情だと思います。もちろん言語の国際化に理解を示してくださる方が多数を占めると思いますが、中には、なんでASCIIがデフォルトじゃないの?とか、ASCII以外はやめろコンニャローというニュアンスの方もいます。
もうひとつ重要な点は、ネットワーク・プログラミングが避けて通れない時代において、プロトコルとの親和性という点でもUTF-8がASCIIのサブセット的な感覚で使えるので普及しているという面が言えると思います。
歴史的にはモリサワ(変形JIS:Slave写植の仕事で使った)とか、JIS,SJIS,EUC,EBCDICと、それなりの思い入れもあるとは思いますが、いちいちコード対応するのは、大変なので統一して欲しいのが本音です。こんな事を書くと旧字の対応をどうしてくれるんだ?ってクレームが来そうですね・・・。地籍の仕事もしているので、旧字には悩まされており心情もわからぬではないのですが・・・。
日本SpamAssassinユーザ会で活動していますが、世界中の言語を透過的に扱いたい!とか考えたときには、やはりUTF-8がベストな選択だと強く感じます。
私の意見は、「互換性なんてどうでもいいから、UTF-8 を標準にした方が良い」です。その方がイノベーションも加速しますし、どんどん面白いプログラムが出てくると思います。フラットな世界に相応しいのは、フラットに扱える UTF-8。
2008年12月11日木曜日
C言語にはまる
まず、基本的な所で、参照渡しの引数を C言語では使えなくて、なんでエラーになるのか、しばらく悩んだんですわ。そん次には、C++でコンパイルするときにC++側の関数に extern "C" の修飾子が無いと、Cライブラリから「そんな関数はねぇー」って怒られてはまったんですわ。
そして、ただいま、C <-> C++ 間での同一型のサイズ不一致か、アライメント不一致によると思われるポインタ化けと間接ポインタによる整数値化けに、はまってるんですわ。x86_64環境だから余計にしんどいのかな?
gcc の情報源って、みんなどこから仕入れているんだろう?
2008年12月10日水曜日
書く事に関する本
そんな自分も年齢と共に書く事を要求される場面が多くなってきました。苦手を克服しようと思って、読んだ本の中から面白かったものを紹介したいと思います。
1冊目は、「日本語の歴史」です。驚いたのは、暴走族が漢字の当て字で名前を付けたりしているのと同様に、ひらがな、片仮名が作られてきた事実です。書き言葉と話言葉が明治になるまで統一されていなかった事実も知りませんでした。国語で、わかりもしない作者の主張や主人公の心情などを教えないで、こういう基本的な事を教えるべきなんじゃないの?と思いました。
2冊目は、「原稿用紙10枚を書く力」です。書く事に対するツボを押さえているように感じました。ただし、自分がこの本に書いてある事を実践できているとは言えないです。それでも、企画の文章を書く時には、本書が大変助けになりました。
3冊目は、「本の読み方 スロー・リーディングの実践」です。自分の読書スピードは遅い方だと思います。速読なんて自分の中では逆立ちしてもあり得ないです。そんな自分の心境を見透かしてか、実に惹かれるタイトルだったので手にとりました。本書は読み方なのですが、小説の書き方として一人称で文章を綴るか、二人称で文章を綴るか?等、書き手の意図するところの機微を書いています。これには感動しました。
ブランドについて勉強
ポイントは、Aというブランドで参入するのか?違うブランドを新規に立ち上げて参入するのか?ブランドの持つ軸を基準にして、ブレの無い決断を下すという所にありました。自分は、この点に関しては考慮が弱かったように思います。まぁ、お題を出す方も、そう簡単に竹を割ったような結論が出せないものをお題にしているので、とても勉強になりました。
2008年12月9日火曜日
Postgresql と C++
extern "C" {
#include <postgres.h>
#include <executor/spi.h>
#include <funcapi.h>
}
...
のようにしたが、以下のようなエラーが出てしまいます。
/usr/include/postgresql/8.3/server/nodes/parsenodes.h:167: error: expected unqualified-id before ‘typeid’
/usr/include/postgresql/8.3/server/nodes/parsenodes.h:238: error: expected unqualified-id before ‘typename’
サクッとググると、こんなページが…。うぉーっ、変数に予約語使うのは、勘弁しでぐれ〜。
2008年12月7日日曜日
自動車産業について2
普段の買い物に車を利用したいという用途の場合には、大勢の人で、うまくシェアできると思いますが、休日だけ利用したいという人が多いと、シェアするのが難しくなります。ここをクリアするために、企業の営業車とシェアするというサービスを思いつきました。シェアしたいのは、個人だけではないと思います。
また、車は移動するための手段みたいな書き方で終わってしまいましたが、もちろん多様化の時代においては、運転する事を主に考える人もいると思います。レンタルの形態も判で押したように店まで車を取りにきてもらい指定先に車を戻すのではなく、お届け、引き取りサービス等があっても良いと思います。個別サービスが厳しいなら、公共交通機関と連動したパックサービスなどはどうでしょうか?この場合ネックになるのは、荷物です。運送会社と共同で事前に必要な荷物を車にパッキングし、帰りには家まで荷物を届けるサービスがあれば、使いやすいのではないでしょうか?
おもしろかったミステリー
陰鬱な雰囲気の中、スクレイピー病というイギリスに古くからある羊の病気にはじまり、緩急を織り交ぜながら展開されるストーリー、途中、プリオンを提唱したプルシナー博士の論文に隠された意図的なグラフの表現方法も交え、移動する蛋白質の不可思議から、20〜30nm(ナノミクロン)の世界へと、ぐいぐい引きずり込まれます。
自分の中では「黒い家」以来の怖さでした。
2008年12月5日金曜日
2008年12月4日木曜日
2008年12月2日火曜日
2008年12月1日月曜日
自動車産業について
実は、我が家では車に関して計画している事があります。今持っている車を廃車にして、車を持たない生活を送る事です。言い出したのは嫁さんの方で、バリバリのアウトドア派である私には、車のない生活は考えられない事だったのですが、事情の変化により賛同する事にしました。その事情とは
- 仕事が忙しいのと息子(もうすぐ4歳)の相手で、休日にカヤックやスキーに行ける回数が激減している。
- ゴルフ3(ディーゼル)の修理費や維持費に年間30万ぐらいかかる
- 地球温暖化
- 運動時間の確保
まあ、効率が10倍アップする新・知的生産術にも刺激を受けている事は否めませんが、車を所有する時代は終わりを告げつつあるのではないか?と感じています。この事は、サラリーマン「再起動」マニュアルにも、3大費用を節約しろという形で触れられています。
現在、電車通勤を使っていますが、この利点は何と言っても、自分で運転しないので本を読む時間がとれる所にあります。たまに集中し過ぎて気がつくと乗り過ごしてしまうという危険はありますが、時間を有効に使える点は大きいです。後は、休日の車を使わないで済ます方法を考え、車をレンタルした場合と車を所有する場合を比較してみれば良いのです。
車でなければならない場合は、工夫すれば、ほとんど無いはずで、どうしても必要な場合はレンタルすれば良いだけで、レンタル料金と車を所有する事で生じる金額を比較してみれば良いです。
- 車保険料金 12万/年
- 税金 -
- 車検・修理 30万/年
- 減価償却費 -
- 駐車場代 -
浮いたお金で、
- マウンテンバイクを買う
- モバイルパソコンを買う
- 軽量のテントなどを買う
- ミシンを買う
「自動車は所有するものではなく、シェアするもの」という時代になってきているのです。この構造は、どこかで見た事がありませんか?ソフトウェア産業と同じ、ソフトウェアを買う時代から、サービスを享受する時代へと同じです。人は車が欲しいのでは無い、簡単に移動するためのサービスが欲しいのです。
フラット化する世界の中で、みんながみんな車を使うなんてナンセンス、山の雪解けが早いとか、今年はキノコが採れなかったとか、黄色信号が灯っています。
所有する時代からシェアする時代へ・・・自動車産業も売る時代からサービスする時代をキーワードに考え直す時がきたのではないかと思います。
2008年11月29日土曜日
2008年11月27日木曜日
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つ。
- クラウドの世界をデスクトップに持ち込む事
- 携帯電話で個人情報を入力する事
オンライン・バンクインターネット・バンキング(銀行)
2は、携帯電話における個人情報の取り扱いは出鱈目もいいところで、基本の設定は固有IDを送信します。私はAUの携帯を利用していますが、IDを非送信にするURLは非公開ですし、アクセスしてもエラーを頻発するような代物で、DoCoMoに関しては ?GUID=ON のパラメータを付加すれば問答無用で固有IDを送信する状況です。クッキーが無いので、これをサービス提供側(コンテンツ配信側)がアクセス解析に利用するのは自然な流れで、ここまでは私も問題にせずEZウェブも利用しています。しかし、携帯電話に個人情報を入力するとなると話は別です。携帯電話のメールアドレスを使ってサービスを享受するとか、個人情報を必要とする会員制サイトは、全く利用していません。
3は、利用しても良いとは思っているけど、ITのプログラミングを職業とするプロでさえ
Windows Vista は眠らない その3
パソコンを買うときに、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 で配列
配列の宣言は、型の後に[]を付加する。
DECLARE
new_geom geometry;
geoms geometry[];
BEGIN
配列の初期化
geoms := string_to_array('',',');
要素の追加
geoms := array_append( geoms, new_geom );
cat_multilinestrings
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のテーマについて一言
これで、Googleは、地域マッチング広告の機能を手に入れるという寸法だ。シリウス・テクノロジーのやっているadLocal の居住地版というわけだ。プライバシーポリシーにも、この情報をどのように利用するのか書かれていないので、私は怖くなって、テーマを導入する事ができませんでした。
もしくは、首都圏のどこかにでもしてやれば良かったか?
次は、グーグルリーダにテーマが導入されて、このテーマを利用するには、性別が必要です。となるのか、生年月日が必要です。となるのか?ターゲッティング広告の時代という事だろうけど、慎重にならないといけない
重大そうなので、緊急で記事をポストする事にしました。
2008年11月20日木曜日
情報革命 その2
首都圏と地方では温度差があると思いますが、さすがに最近は、地方でも皆、身の回りに何か大変な事が起こっていると自覚しています。それでも、情報革命が起こっているという確たる事実が、意外にわかっていません。ブログを読んでいる人に書いても、あまり意味が無いような気はするのですが、どの本を読めば、情報革命が起こっている事を理解できるか、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 は眠らない その後
そもそも、パーミッションを管理するのが本筋であって、UIで何とかしようという発想自体が既に可笑しいと思うのです。UACは、無効にしました。私はこれに付き合っていられません。セキュリィティが必要とされるフォルダでは、たかだかファイルをコピーするのに5分以上待たされた挙句の果てに、コピーに失敗して、シャットダウンもままなくなるなんて状況はうんざりです。毎回電源を強制切断する方が、よっぽどかセキュリィティ上の問題を抱えてます。
ことわっておきますが、スパイウェア対策とウィルス対策等には神経を使っています。プログラマ系の職業にUACはイラネー。
2008年11月17日月曜日
2008年11月16日日曜日
「日本語が滅びるとき」を読まずに感想
まず、5年後、いや、10年後に日本語が滅んでいるという状況が想像できない。ここ10年の変化を振り返ってみてどうだろう?10年前に今の状況が予測できたであろうか?予測からそんなに外れていない?では、この先10年後を予測できますか?私が生きている以上、日本語が滅んでいるという事は無さそうである。であれば、90歳まで生きれるとは思ってないけど50年後に日本語が滅んでいるなんて、ファンタジーの世界の話にしか聞こえないし、思えない。
2008年11月15日土曜日
2008年11月12日水曜日
情報リテラシー
情報化社会において、考慮すべき事が大きく4つあると思います。
- 個人情報について
- サービスを享受する事とのトレードオフ
- 客観的に判断する事
- 統計の罠
サービスを享受する事とのトレードオフとは、現在、様々な無料のサービスで溢れていますが、サービスを提供する側は、どこでお金を入手するのかビジネスモデルを考慮する必要があるという事です。あるサービスでは、アマゾン書籍のリンクがサービス運営サイトのアフィリエイトになっています。ガジェットという形を取っている事もあれば、形態は様々です。また、サービスを利用してもらう事により、データマイニングやテキストマイニングを行って付加価値を得るという手法もあります。情報=お金である事を認識し、サービスを享受する事とのトレードオフを認識すべきであると思います。
客観的に判断する事とは、ごく当たり前の事で、例を挙げると、痛いニュースで「こんにゃくゼリーで窒息死」という記事を見たとき、他の食品ではどうだろうか?と考える力を持つ事です。この後、GIGAZINEで実際に他の食品でどれぐらいの事故が起こっているのか調査した記事が発表されましたが、これは情報リテラシーをネタにした記事であるといえます。技術情報を調べる場合には、その記事が何時書かれたものなのか?という事が気になります。
統計の罠とは、グラフの表示方法を変える事により意図的に事実を曲げて見せる手法や、標本サンプルを偏って扱う事や、アンケートで誘導するような質問を設定するといった事があげられます。
2008年11月11日火曜日
Androidで閃いた
デスクトップ環境にAndroidアプリを逆輸入するというのはどうでしょうか?JavaVMで動かすのだから当然できるよね?Google Chrome なんて作らずに、AppBrowser を作ればいいんじゃないか?って・・・
Hyper-v その3
2008年11月8日土曜日
情報統制
- 自分の利害と一致しない情報は発信可能
- 準備万端で発信する時が来た(iPhone や iPod の発表など)
- 情報発信しても他者が侵略できない領域を持っている場合
- すでに勝者の地位を得ている場合
- 信頼を得るための発信
- 社会的貢献活動のための発信
- 共同戦線をはる(協調作業を行う)ための発信
- 情報を得るための発信
- 利己的な発信
utf8の扱い
これ、標準で欲しいです。一応 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 は眠らない
あまりに酷く、きっとシャットダウンやログオフしようとしているのに、糞重たい UAC が悪さをしているに違いない!と、UAC Tool をインストールしました。日本語化のパッチも出回っているのですが、あいくに x64環境のものはありません。Visual Studio でSymconsent.exe を編集して保存すると日本語もOKみたいです。
まだ1日目ですが、なかなか快適です。さっさとインストールすればよかった…。
ウィンドウズは、IObjectSafety とか、やることの観点がズレてるように感じます。
マルチコア
クロックアップによる速度競争は、消費電力が高くなっていくため、コア数が増える方向に変わってきています。よって今後は、OSのアーキテクチャも巻き込んで、マルチコアなアルゴリズムや分散アルゴリズムが重要になるであろうと思います。まず、マルチスレッドな処理でネックになってくるのが、同期保護の問題。しかし冷静に考えてみよう???全てのプロセスやスレッド間で、そもそも同期を取る必要があるのだろうか???
こう考えた時、ドメインのようなモデルが導入されていくと感じます。なんでも直列に繋いでもしょうがない、64個とか32個とか16個を区切りとして、メモリアクセスのバスも区切られたハードウェア構成になり、それらをドメインと呼び、分散処理する。あるいは、コアが複数個ある1次キャッシュメモリに動的にバインドできるとか・・・。
うーん・・・まとまりがなくなってしまった・・・。
2008年11月6日木曜日
2008年11月5日水曜日
ubuntu 8.10 いろいろ
それはそうと、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日火曜日
2008年11月2日日曜日
getuntil.hpp
>>> 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;
}
}
2008年10月31日金曜日
岐路
S3サービスを利用したサービスで、1人当たり1回につき600kb、30 request を20回行い、1日に100人が利用したと仮定すると、1Gあたり 0.15$ なので、一ヶ月に 0.0006 * 20 * 100 * 31 days * 0.15 $ * 110 yen = 613.8 円 の転送料と、30 * 20 * 100 * 31 / 10000 * 0.01 $ * 110 yen = 204.6 円 のリクエスト料になります。もし、転送速度が一定で使い物になるならば、ものすごい事です。
一方で、マイクロソフトは Software + Service を掲げ、既存のビジネスパートナーと協力して、サービス志向型の業態を創り上げましょう!と真剣に提案しています。つい先日発表されたWindows Asureは、その解答のうちのひとつですが、その記事の中に Amazon と協調してサービスを提供するとあります。
イノベーションが受け入れられる要素として、「移行コストが低い事」というのがあり、ブラウザの世界では、ActiveXコントローラは失敗し、生のブラウザだけで動作する JavaScript が主流になってしまいました。Write Once Run AnyWhere の標語と共に席巻した Java の Applet さえ主流に成り得ずに、Sun は、せめて Flash の地位ぐらいは取ろうと Java の軽量化に励んでいます。
ここで熟考しなければならないのは、.Net である Silverlight, Moonlight の立ち位置です。マイクロソフトの力が低下してきているとは言え、一般ユーザには、まだウィンドウズが主流です。OSのシェアを握っている間に、.Net を核としたサービスを上記のようなデータセンターと共に構築できるならば、まだまだ捨てたもんじゃないかもしれない。
Google Gears の狙いのひとつにトラフィック量の低減というのがあると思いますが、.Net ならば、もっとスマートにトラフィック量の低減を実現できるかもしれません。そうすると、サービスを提供するために必要な費用を更に下げる事ができます。運用コストが下がるならば、サービスを提供する側もそちらに流れてみよう・・・という潮流が起これば、.Net を利用するための移行コストが下がるという事を意味します。
もうひとつ無視できない潮流に、アナログ放送の空き 130Mhz が開放され、次世代通信規格と共にモバイル革命が起こる事があります。実は、HDDからSSDと同じように、パソコンからモバイル機器へのパラダイムシフトが始まっているのではないか?と感じるのですが、モバイルに焦点を当てた場合に .Net はどうなんだろう?という疑問も残ります。
今、難しい選択の岐路に立たされているような気がしてなりません。
boost::asio syslog daemon service for windows
単純に UDP で、メッセージを受け取って書き出すだけなので、syslog に則ったフォーマットである必要も無いです。boost::asio::io_service はクライアント側で使うには重いぞなもし…って場合は、以下のような感じでいけると思います。
void udp_send( const char* buf, size_t len ) {
WSAData wsaData;
SOCKET sock;
struct sockaddr_in addr;
if( !WSAStartup(MAKEWORD(2,0), &wsaData) ) {
sock = socket(AF_INET, SOCK_DGRAM, 0);
if( sock != INVALID_SOCKET ) {
addr.sin_family = AF_INET;
addr.sin_port = htons(514);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sendto(sock, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr));
closesocket(sock);
}
WSACleanup();
}
}
2008年10月30日木曜日
boost::asio syslog
// syslog daemon sample
#include <boost/asio.hpp>
#include <boost/bind.hpp>
class syslog_daemon {
public:
syslog_daemon(
boost::asio::io_service& io_service,
short port = 514
) :
io_service_(io_service),
socket_(
io_service,
boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port)
)
{
invoke_recieve();
}
void handle_receive_from(
const boost::system::error_code& error,
size_t bytes_recvd
) {
if( error ) {
} else {
if( bytes_recvd > 0 ) {
std::string log;
log.assign( &data_[0], &data_[bytes_recvd] );
std::cout << log << std::endl;
// do logging
}
invoke_recieve();
}
}
private:
void invoke_recieve() {
socket_.async_receive_from(
boost::asio::buffer( data_, buffer_length ),
sender_endpoint_,
boost::bind(
&syslog_daemon::handle_receive_from,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
}
private:
enum { buffer_length = 4096, };
char data_[ buffer_length ];
boost::asio::io_service& io_service_;
boost::asio::ip::udp::socket socket_;
boost::asio::ip::udp::endpoint sender_endpoint_;
};
int main() {
try {
boost::asio::io_service io_service;
syslog_daemon sd( io_service );
io_service.run();
} catch( std::exception& e ) {
std::cout << e.what() << std::endl;
}
return 0;
}
// syslog send sample
#include <string>
#include <boost/asio.hpp>
#include <boost/date_time/date_facet.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
//! syslog facility code
enum syslog_facility {
kernel_messages = 0,
user_level_messages = 1,
mail_system_messages = 2,
system_daemons = 3,
security_authorization_messages = 4,
messages_generated_internally_by_syslogd = 5,
line_printer_subsystem = 6,
network_news_subsystem = 7,
subsystem = 8,
clock_daemon = 9,
security_authorization_messages2 = 10,
ftp_daemon = 11,
ntp_daemon = 12,
log_audit = 13,
log_alert = 14,
clock_daemon2 = 15,
local_use0 = 16,
local_use1 = 17,
local_use2 = 18,
local_use3 = 19,
local_use4 = 20,
local_use5 = 21,
local_use6 = 22,
local_use7 = 23,
};
//! syslog severity code
enum syslog_severity {
emergency = 0, // system is unusable
alert = 1, // action must be taken immediately
critical = 2, // critical conditions
error = 3, // error conditions
warning = 4, // warning conditions
notice = 5, // normal but significant condition
information = 6, // informational messages
debug = 7, // debug-level messages
};
//! get syslog PRI part
/*!
@retval syslog PRI part string.
*/
std::string get_pri_part(
syslog_facility facility, //!< [in] facility code
syslog_severity severity //!< [in] severity code
) {
std::ostringstream oss;
oss << "<" << (facility * 8 + severity) << ">";
return oss.str();
}
//! get syslog HEAD part
/*!
@retval syslog HEAD part
*/
std::string get_head_part(
const boost::posix_time::ptime& ptime,
const boost::asio::ip::address_v4& address
) {
typedef boost::date_time::time_facet<boost::posix_time::ptime, char> ldt_facet;
ldt_facet* facet = new ldt_facet("%b %d %H:%M:%S");
std::ostringstream oss;
oss.imbue( std::locale( std::locale::classic(), facet ) );
oss << ptime << " " << address << " ";
return oss.str();
}
//! get syslog MSG part
/*!
@attention
@retval syslog MSG part
*/
std::string get_msg_part(
const std::string& tag, //!< [in] tag
const std::string& msg //!< [in] message
) {
BOOST_ASSERT( tag.size() <= 32 );
std::ostringstream oss;
oss << tag << ":" << msg;
return oss.str();
}
class syslog_transfer {
public:
syslog_transfer(
boost::asio::io_service& io_service ) :
io_service_(io_service),
resolver_(io_service),
socket_(
io_service,
boost::asio::ip::udp::endpoint( boost::asio::ip::udp::v4(), 0)
)
{
}
void connect( const std::string& host_name, const std::string& port ) {
boost::asio::ip::udp::resolver::query query( boost::asio::ip::udp::v4(), host_name.c_str(), port.c_str() );
iter_ = resolver_.resolve( query );
}
void transfer( const std::string& log ) {
boost::asio::ip::udp::resolver::iterator iter = iter_;
socket_.send_to( boost::asio::buffer( log, log.size() ), *iter );
}
private:
boost::asio::io_service& io_service_;
boost::asio::ip::udp::resolver resolver_;
boost::asio::ip::udp::resolver::iterator iter_;
boost::asio::ip::udp::socket socket_;
};
#include <sstream>
int main() {
std::ostringstream oss;
boost::posix_time::ptime ptime = boost::posix_time::second_clock::local_time();
boost::asio::ip::address_v4 addr = boost::asio::ip::address_v4::from_string( "192.168.1.1" );
oss << get_pri_part( log_audit, notice ) << get_head_part( ptime, addr )
<< get_msg_part( "tag", "message" );
boost::asio::io_service io_service;
syslog_transfer st( io_service );
try {
st.connect( "localhost", "514" );
st.transfer( oss.str() );
} catch( std::exception& e ) {
std::cerr << e.what() << std::endl;
}
return 0;
}
ファイルの追加は、どこぞにアップしてリンクするしかないのかな?
追記:いまどき void main は無いだろ・・・と、from_string の部分のバグを修正しました。
2008年10月29日水曜日
YahooBBのDHCPアドレス
2008/07/27 0:01:00 から 2008/8/18 12:16:00 までは、A.B.C.114/22 (7回確認)
この後、ノートパソコンが故障したので、モデムを一旦リセットしている。
2008/10/13 から 2008/10/29 0:29:00 まで A.B.C.76/22 (4回確認)
のままです。
タイトルにもある通り、YahooBB で ADSL 12M を契約しています。
個人情報特定を気にするならば、モデムは定期的にリセットした方が良いのかもしれません。
2008年10月27日月曜日
古いノートにUbuntu
今回、試みた方法は、Ubuntu-Server 版をインストールするという方法です。インストーラを起動してから、初期の入力画面が現れず、反応しなくなったので、CDをイジェクトして、再度CDを挿入しました。しかし、この操作は不要かもしれません。こうすると、コマンドプロンプト環境ながら、Ubuntuがインストールできます。ちなみに、LANはUSBに接続するタイプのものを最初から接続しながらインストールしました。
次に、デスクトップ環境の構築に入ります。
$ sudo apt-get install ubuntu-desktop
$ sudo apt-get install ubuntu-desktop-ja
と、タイプして再起動するだけです。
まぁ、今時のリッチなLinux環境は、それなりにマシン・スペックが必要なので、快適か?と問われれば、どうなんでしょう…って所で落ち着いてしまうのですが…。
味噌
料理に使う味噌を物色しているときに、どうせなら地元産の味噌を使おうという事でマルヤス味噌をチョイスしました。この味噌は、麦味噌で、大麦から作られているので、大豆アレルギー・小麦アレルギーでも食べられます。キャンプの時に食べた味噌の味が忘れられなくて、家に帰ってからもネットで調べて取り寄せ、今でも愛用しています。
お勧めの食べ方は、
- マヨネーズと味噌を半分づつ混ぜて、キュウリやラディッシュなど野菜スティックにつける
- 豚のロース肉に、この味噌を塗りラップに包んで冷凍する(もちろん焼いて食う)
- 高知の食材である鰹節でタップリ出汁をとり、味噌汁にする
- 豚のロース肉と同様に、白身魚に塗って冷凍
知り合いに味噌を製造している方がいて、その方の話によると、店頭で売っている袋に入った味噌は、アルコールを加えるなどして、菌を殺し醗酵を止めるそうです。ところが、この味噌、通販では、麹も生きたまま蔵出し味噌を送ってくれます。現代人には酵素が不足しているそうで、食を見直してみるのも良いと思うのですが、いかがでしょうか?
追伸:残念ながら広告料は入りません:-)。完全、口コミな記事です。
2008年10月25日土曜日
行動ターゲッティング
これを逆手に取れないだろうか?と考えてみたアイデアを発表してみようと思います。
HTTPのリクエストには、
Host: grayhole.blogspot.com
UserAgent:....
などと、今でも多様な情報が付随しています。そこで、ブラウザに、
自分が興味を持っている分野
X-User-Interest: 'Kayak', 'Outdoor', 'IT', 'Programing Language'
現在、ブラウジングしている目的
X-Browsing-Purpose: 'ぽにょ'
というヘッダ情報を付加してみるというのはどうでしょうか?X-Browsing-Purpose なんかは、検索入力項目と連動させても、面白いかもしれません。X-User-Interest は、Ontologyを使って表現すると、売上に直結する情報だけに、一挙に、この分野が発展するかもしれません。
公に採用されれば、行動ターゲッティングというプライバシーの問題も緩和されるかもしれません。問題は、これをユーザが設定するかどうか?という部分が大きいと思います。
2008年10月24日金曜日
ひさびさにJavaを弄った
@Override によってオーバーライドのタイプミスを防げるらしい。
@SuppressWarnings は、C++で言うところの #pragma で警告の抑止ってところらしい。
JavaGenericsが面白そうで、java.nio.ByteBuffer で利用してみようかと構想したけど、型に応じたメソッドが用意されていて、単純にキャストして良いものかどうかが、判断できずに諦めました。
思わず sizeof 演算子を使おうとして考え込むなど、慣れるまでには時間がかかりそうです…。
2008年10月23日木曜日
Rails ActiveRecord 備忘録
keyword: rails active_record table relation same column
class User < ActiveRecord::Base
has_many :Hoges
...
end
class Hoge < ActiveRecord::Base
belongs_to :user, :foreign_key => 'user_id'
belongs_to :manager, :class_name => 'User', :foreign_key => 'manager_id'
...
end
class HogesController < ApplicationController
active_scaffold :hoge do |config|
config.columns = [..., :user, :manager, ...]
config.columns[:user].form_ui = :select
config.columns[:manager].form_ui = :select
...
end
...
end
2008年10月22日水曜日
Software and Service
しかし、ロングテールで開発が成立するようなメジャーな分野(例えばエディタ)では、無料でも成立します。また、広告を行うためのプラットフォームとして無料でソフトウェアを配布する場合には、無料で成立しなくても無料を強いられます。私の頭では、どう考えても Software and Service ではなくて、Software for Service という時代になっていくという結論にしか至りません。
そうすると、オープンソースとか、そんな事は関係なく、自社の価値を高めるための秘密のSoftwareというのが流行するのではないか?と思っています。
聖人君子は除いて、一般人の感覚では、人に施す事ができるのは自分に施す余裕があるからです。一般人にも施しを受けるからには聖人君子たらんを強要するGPLは、正直言って嫌いです。そのGPLがバージョン3では、インターネット上でコンテンツを公開するために利用しても公開を強要するという項目が話題になっていましたが、秘密のSoftwareという時代に対する措置という事なのかもしれません。
ブラウザに変わって .Net が主流になる時代は来るのでしょうか?
2008年10月21日火曜日
Railsについて思うこと
- 生産性は高く素晴らしい!しかし、レールが敷かれている限りにおいては・・・
- 安定稼動しないのでアプリケーションとして提供するには、不満
- 革新的な技術がどんどん導入されて楽しいが、バージョンアップに伴うアプリケーションメンテナンスが大変
2008年10月20日月曜日
プログラマのための眼鏡
遠くを見るのに比べて、近くを見るという作業は、まず、焦点が近いという他に左目と右目の角度が普段よりも内側へと寄ります。このように、とても不自然です。
若いときに比べて眼の筋力が落ちると、長時間モニタを見ることにより、疲れて焦点を合わせるのと、凝視角度を内側へ寄せる事ができなくなります。その状態を繰り返していると、不自然な眼の筋力の使い方をするために、視力が落ちるだけでなく、乱視になります。
40歳になったある日、視力も0.7を切り、モニタを正視する事ができなくなりました。これでは仕事に支障があるので、眼鏡屋さんへ行き、OA用のカラーレンズで近々と呼ばれる眼鏡を少し遠視を入れて作ってもらいました。ところが、眼鏡屋さんへ行った時が最悪の状態だったので、眼が疲れていない状態で、この眼鏡をかけると余計つらくなりました。この調整をしてもらうために再度、眼鏡屋さんを訪れました。
眼が寄るような感じで辛いと事情を話したところ、眼鏡のフレームを凹型に曲げて(鼻の部分を顔側へ、外側を顔と反対側へ)調整してくれました。近々の眼鏡というのは、凝視角度を内側へ寄せるような構造をしているそうで、作り上、プロ仕様のOA用途に向いているとは思えません。
それでも違和感が残るので、別の眼鏡屋さんで、上記を踏まえた相談をして、もう一本OA用眼鏡を作成しました。今度の眼鏡は、普通の眼鏡に遠視を入れてもらっただけの状態(この時には、視力が更に落ちていたので近視用眼鏡の度数を落とした状態)、即ち、度数を単純に足し算・引き算しただけの状態です。
これはバッチリでしたが、一度落ち始めた視力の悪化は、なかなか留まる事を知りません。現在は42歳ですが、眼の状態に応じて両方の眼鏡を使い分けています。
もし、若いプログラマが、このブログを目にする事があるならば、近々でなく引き算で遠視を入れた状態、かつ、OA用カラーレンズの眼鏡を作り、モニタを見る時には、その眼鏡を使用する事をお勧めします。1万5千円ぐらい投資する価値は十分にあります。
若いときには「モニタを凝視しないで、焦点をモニタになるべく合わせずプログラミングしている」などと眼鏡不要と考えていましたが、年齢による衰えは確実かつ平等に、誰にでも訪れます。
砂粒
さすがにTracbackすらインプリメントしていないGoogleのBloggerサービスでは、プロフィールにおける趣味のカテゴリを通じて以外に接点が一切無く、とても硬派です。OpenSNSなどと必死にSNSの世界を検索の及ぶ世界へと繫ぎ止める戦略を打ってでているGoogleですが、インフォ・コモンズに関しては音痴なのではないでしょうか?
インターネット上で、秘密の日記状態って、なんか素敵だ・・・。面白いから、このまま続けてみよう。
2008年10月15日水曜日
TrackBack
まさか、Googleの提供するBlogサービスに、Trackbackの機能が無いなんて一秒たりとも想像すらできなかった。
この際だから、はっきり書こう。
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
トラックバック機能の無いブログなんて、存在する価値が無い
Haloscan というサービスで、トラックバック機能を付加できる事がわかったが、冗談も休み休みにしてほしい。という訳で、Bloggerは閉鎖します。Googleという会社が凄いのか、単なる烏合の衆なのか、わからなくなりました。携帯サイトのクローラはYahooのように Docomo, au, Softbank のフリをしてクロールするという高度な事もせず、ウェブ・マスタ・ツールに頼りきり、しかも、ウェブ・マスタ・ツールでは、URLに?や&を含める事ができない。これは高木さんのブログに書かれているように、Googleには技術力なんて皆無なのではないか?
雁首そろえて、はてな・・・という選択は自分の性に合わないし、かと言って、サービスが独立していて、設定した内容と不整合の生じるlivedoorも自分の性に合わない・・・。ごちゃごちゃとしたレイアウトは嫌だし、会社のサーバにブログを設置するのは、趣旨に反する。
残された道は、自宅サーバ…。つうと、ADSLから光に契約し直して常時稼働のサーバを設置する交渉を嫁さんとしなければならないが、通るとも思えない…。設定するならWordpressで、Akismet+SpamKarma2の組み合わせなんだろうけど…。
そうか、WindowLiveか!まじ?
Hyper-v セットアップ スイッチ エラー 2
そこで、外部仮想ネットワークをひとつ作成してから、ネットワーク接続の詳細を開いて、NICの設定で、マイクロソフト仮想スイッチプロトコルのチェックを外してから、再度、仮想ネットワーク・マネージャで外部仮想ネットワークを作成すると、2つ目の外部仮想ネットワークの作成に成功した。何が違うのか注意深く、外部仮想ネットワークの違いを見てみると、2つ目は、マイクロソフトRPCサービスのチェックが有効にできない。Ping系の低レベルなネットワーク層の実装が影響しているのかもしれないです。
毎回、ネットワーク接続の詳細からNICの設定で、マイクロソフト仮想スイッチプロトコルのチェックを外せば、マイクロソフトRPCサービスが使えませんが、外部仮想ネットワークを増やす事が可能なようです。
2008年10月14日火曜日
windows , ubuntu, Android SDK インストール
追記(2010/05/08)
JDKのインストール
ウィンドウズの場合は、SunMicroSystemのページから最新の Java SE SDK をダウンロードしてインストールします。Ubuntuの場合は、Javaを入れます sun-java6-bin 以下のコマンドに同じ
ただし、Ubuntu x86_64環境の場合には ia32-sun-java6-bin の方を入れます。
$ sudo apt-get install sun-java6-bin
$ sudo apt-get install ia32-sun-java6-bin
Eclipseを入れる
ウィンドウズ版では、これらをショートカットしてeclipse 日本語パッケージが配布されているので、おしまいです。解凍して、C:/Program Files/ | C:/Program Files (x86)/ フォルダの下にでも移動しておきましょう。
Ubuntu の場合eclipse から "Eclipse IDE for Java EE Developers" をダウンロードします。64bit環境の場合でも、Linux32bit版を選択して下さい。
$ sudo tar xvf eclipse-jee-ganymede-SR1-linux-gtk.tar.gz
$ sudo mv eclipse-jee-ganymede-SR1-linux-gtk /usr/local/eclipse3.4
次に pleiades から 日本語化プラグインをダウンロードします。
$ sudo unzip pleiades_1.2.3.p6.zip
$ sudo cp -r features /usr/local/eclipse3.4
$ sudo cp -r plugins /usr/local/eclipse3.4
$ sudo cp -r readme /usr/local/eclipse3.4
$ sudo rm -rf features
$ sudo rm -rf plugins
$ sudo rm -rf readme
$ sudo rm -f *.cmd
pleiades は、eclipse3.4 をインストールしたフォルダに下に features, plugins というディレクトリが存在するのでマージします。
eclipse.ini をエディタで編集し、最後の行に以下を追加します。
-javaagent:/usr/local/eclipse3.4/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
尚、エディタの起動がわからない方は
$ gksudo gedit /usr/local/eclipse3.4/eclipse.ini&
とでもしてください。 そして、
$ /usr/local/eclipse3.4/eclipse -clean
とします。次回以降は
$ /usr/local/eclipse3.4/eclipse
でOKです。
Android SDKを入れる
android sdk pageから、SDKをダウンロードし、解凍します。ウィンドウズ版では、"C:/Program Files/android" というディレクトリにでもコピーして下さい。x64 環境では "C:/Program Files (x86)/android" というディレクトリになります(長い元のディレクトリ名でも可)。
Ubuntuでは、
$ unzip android-sdk-linux_x86-1.0_r1.zipとします。
$ sudo mv android* /usr/local
$ cd /usr/local
$ sudo ln -s android-sdk-linux_x86-1.0_r1 android-sdk
以下は共通の操作です。
eclipse を起動します。 メニューの「ヘルプ」>「ソフトウェア更新...」を選択し、「使用可能なソフトウェア」タブを選択します。右脇の「サイトの追加」というボタンを押すとダイアログが表示されるので、「ロケーション」に
https://dl-ssl.google.com/android/eclipse/
を入力し「OK」ボタンを押します。
「使用可能なソフトウェア」の中に「"https://dl-ssl.google.com/android/eclipse/"」が追加されたので、チェックを入れて、「インストール」ボタンを押します。
「次へ」「同意して完了」「eclipse再起動」という流れになります。
メニューの「ウィンドウ」>「設定」を選択し、「android」を選択します。統計情報をGoogleに送信するかどうか聞かれるので、自分の判 断でどうするか選択してください。Android SDK のロケーションが未設定だと怒られますが、これから設定します。
Android 設定
SDK ロケーション
SDK ロケーションに 絶対パスで C:\Program Files\android-sdk もしくは /usr/local/android-sdk と指定します。自分の環境に合わせてください。
環境変数 Pathの設定は、特に必要ありません。
Ubuntu 補足
上記の SDK ロケーションのパスを設定する段になって、"Failed to get the required ADT version number from the SDK" といったエラーが出る事があります。
/usr/local/android-sdk/tools/emulator
を実行すると、
"WARNNING: Cannot write user data file '/home/oki/.android/SDK-1.0/userdata-qemu.img': Permission denied
となってます!よくわからないですが
$ cd
$ cd .android
$ sudo chown -R yourname:yourname SDK-1.0
$ cd SDK-1.0
$ chmod 666 *.img
とでもしておけば、この問題は回避できました。しかし、
NAND: could not create temp file for system NAND disk image: Permission denied
root 権限で開発しろって事?んがぁ
$ chown -R yourname:yourname android-sdk-linux_x86-1.0_r1
で開発しろって事のようです。
Hyper-v セットアップ スイッチ エラー
Hyper-vにおいては、ホストOSとゲストOSのNICは別々にするのが常識らしい。まぁ、今時NICなんて安いからゴージャスに決めるのも良いかもしれないが、稼働率の低いサーバをたくさん抱えている場合には、一々NIC1枚なんて割り当ててられないし、稼働したいゲストOSの組み合わせもTPOに応じて変わってきます。弊社では12台中のどれか4台が稼働すれば十分なんて使い方がしたいわけです。なのに外部仮想ネットワークは、どうも1NICに2ゲストOSしか割り当てられないらしい。1NICに3ゲストOS目を入れようとしたところで、「セットアップ スイッチ エラー」うんぬんのエラーメッセージが発生するようになりました。
ところが、このエラーメッセージが出てからというもの、1NICに2仮想ネットワークを再度追加しなおすという事すらできなくなりました。まあ、検索したけれども情報が無いのなんの‥・。日本語の情報源は諦めて setup switch error virtual network というキーワードでようやく見つけたのが、このページ。
どうやら、皆一様に同じ問題に突き当たっているようです。Hyper-vを再インストールしようと、ネットワークカードのドライバを再インストールしようと、堅牢なウィンドウズは不整合になったと思われる情報を堅持します。で、結論は、OSから再インストールですよー。
Android SDK
風邪をひいてしまった・・・。
2008年10月11日土曜日
OS
随分昔の話になりますが、Linuxを設定するのは大変でした。まず、ネットワークに繋がらなければ、面白くもなんともない。せめてXだけでも動作させようとしても解像度・周波数・インタレス・+ー微調整をトライ&エラーで繰り返し、やっと使える感じ・・・。それが、今やインストーラ一発で比較的新しいパソコンでもホイホイとインストールできます。会社のウェブサーバはセキュリィティを考慮に入れてSELinuxのあるCentOSをチョイスしましたが、最近のお気に入りは、Ubuntu。
会社の環境と、自宅の環境も Windows と Ubuntu のデュアル・ブートにしてあります。しかも、最近はリソースをクラウド(ここではイントラも含むウェブサーバの意)に置く事が多いので、何の支障もありません。
- OpenOfficeのレイアウトが、ウィンドウズ環境で見た場合と、Linux環境で見た場合で改行位置等が違いバラバラである
- Linuxにおける端末のフォントが汚くて見にくい(TrueTypeを入れても)
- 品質は上がったとは言え、Linuxの方は、まだまだ足りないなと思う事が多い
- 無線LANの設定は、Linuxは相当苦労する(この問題は解消しつつあります)
- 逆にウィンドウズは、やっぱりな・・・情けないだろ・・・と思うことも多い
- さすがに離れた両親のパソコンにLinuxを入れる度胸はない
で、サーバが多いので仮想化も導入して稼働率を上げようとXenを導入していたのですが、長時間稼働するとお亡くなりになるため、Hyper-Vでしょ・・・と設定していました。Hyper-Vは、仮想ネットワークの設定がやたらと難しいです。それでも、仮想端末も含めて、やはり快適です。まだ出たばかりなので、まともな解説本はありません。どの本も仮想ネットワークの設定がわからないので、ゲストOSひとつにつきNIC1枚を割り当てる方法しか触れていません。まともな解説書が欲しい・・・。
2008年10月10日金曜日
2008年10月9日木曜日
2008年10月7日火曜日
情報革命
数年前までは、コマーシャルでITだのICTだの、何をかっこつけてるんだ?と軽く考えていましたが、この事について真剣に考えなければならなくなりました。今、破竹の勢いで時代が変革しています。
私の職業はITに携わる事ですから、変革している個々の事象については把握していました。しかし、情報革命が起こっているという事が、こんなにも重要な事だという認識を得たのは、ここ2・3年の話です。ブログをはじめるにあたって、まずは、この事の重要性を書きたかった。