2008年12月26日金曜日

帰省

 しばらくすると、インターネットのない生活をしばらくします。次回の復帰は、1月5日以降。みなさん、良い年を!

2008年12月23日火曜日

車検切れ

 自動車産業についてのエントリに書いたとおり、12月21日をもって車検が切れて廃車する事になりました。今はもう車を持たない生活に突入しています。これから、自動車保険をどうするか決めないといけません。もしかしたら、こういうニーズに対応した保険も、これからの時代には必要とされるのかもしれません。
 次に車を買うとしたら用途を限定したこんな車とか、ナノテクのカーボン素材等で軽量化したイノベーション車が欲しいかも?

2008年12月22日月曜日

久々に映画を見に行った

 4歳の息子に誕生日プレゼントとクリスマスプレゼントは何がいいか偵察へおもちゃ屋さんへ行ったら、WALL-Eのロボットに釘付け・・・。どうしようか悩んで後日WALL-EのU-COMMANDを買いに行ったら、映画公開後という事もあって、アマゾンでプレミアム価格でしか手に入らない。あの時買っておけば良かったかも?と半分後悔しながら、また、おもちゃ屋さんへ連れて行ったら、今度は、さほどWALL-Eのおもちゃには興味を示さなかった・・・良かった・・・。そんな、こんなで、息子を連れてWALL-Eを観に行ってきました。
 CGが綺麗で、大人でも楽しめました。エンディングのスタッフロールを見て、これはデザイナの力量がもの凄いかも?と感じました。WALL-Eなら、もう一回映画館に足を運んでも良いかも?世界観も結構、好きです。
 ちらっと本屋に寄って、「数学イノベーション」という本を見つけて買いました。文部科学省科学技術政策研究所が編著で、へぇーって感心しました。一通りの分野を押さえてあり、おもしろそうでした。アマゾンのアフィリエイトで紹介しようかとも思いましたが、冊数が無いorz。

2008年12月19日金曜日

Google App Engine アカウントが

 今頃になって、Google App Engine のアカウントが到着した。その存在すら、すっかり忘れていたよ。何に使おうか?500Mの容量って多いようで少ない、少ないようで多い。3枚のお札じゃ、おいそれとホイホイ投げられないし、そもそも Google App Engine をいじれる状況じゃないし・・・orz

2008年12月18日木曜日

世界不況

 いやはや凄い時代が来たもんだ…。北海道でもトヨタショックで、カーナビ系のシステム会社やディーゼルエンジン関連産業が停止状態。そして、Androidの登場により、100億円規模の携帯電話関連産業が消失する中、この円高…。どうすんのコレ?
 日本のゼロ金利で預金者の利子は金融機関の懐に入ってバブルから回復したはずなのに、軒並みサブプライムローンの影響を受けて多大な損失を出しているこの現状…。庶民も、さすがに頭にきてまっせ。
 世界が協力して人権問題に取り組むべきなのではないか?最低賃金の水準を世界的に引き上げるとかしないと、搾取の価格競争から抜け出せないのではないか?などと、声をあげたくなります。

boost serialization で template class

boost::serialization で プリミティブな

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 );
};
}
}

ネタでした…。

なぜ円高?3

 アメリカがゼロ金利政策をしてるやんかー。そりゃ円高にもなるわ・・・。円高?ドル安????

2008年12月17日水曜日

なぜ円高?2

 このエントリですが、朝起きたら、なんとなく、投資信託が悪いのではないかという気がしてきました。

 お金のまわりかたが変な感じがします。現在の問題も、RIETという不動産投資商品を格付けAAAクラスの会社がリスクの高いサブプライム絡みの債権を信託に紛れ込ませたのが大きな一因とされています。同様に極端な話、投資信託が投資信託に投資するというような循環で、1000円の投資が10000万円の投資効果をもたらしている歪みが、現在の円高なのではないか?という根拠のない直感が働きました。

 2次以後の金融商品は規制すべきじゃないだろうか?と…。

VC8のintellisense死ね(備忘録)

 *.ncb ファイルの更新をはじめたら最後、固まったまま何の操作もできなくなってしまう intellisense。何かタイプする度にディスプレイにちょろちょろ文字が出て、鬱陶しい。はっきり言って迷惑以外の何者でもない。そんな intellisense を無効にする機能は無い。ncbファイルがDB化されれば問題は解消されるかもしれないが、調べたのは2回目なので、こいつの殺し方をメモっておく事にし
投稿を公開
た。
  1. <vs>\VC\vcpackages\feacp.dll のを削除するか、名前を変更する。
  2. プロジェクト中の *.ncb ファイルを削除する。
Visual Studio 2005, 2008 と複数ある場合には、それぞれに対して行う事。

2008/12/19 追記
ただし、ATL において接続ポイント(SynkPoint)を正しく認識しなくなるという問題があるため、インタフェイスを変更した場合に限り、intellisense を復活させなければならない。

2008年12月16日火曜日

なぜ円高?

 経済は難しい、今、なぜ円高になっているのだろうか?うーわからん・・・。円高じゃなくてドル安と読むべきなのか?それなら、他の通貨も価値が下がっているのは何故?
 これだけ経済が下がると、今の姿が真の姿なのか?今までの姿が真の姿なのか?わからなくなってきます。と言っても、過去とは比較のしようもないか?実は消費社会の限界もやって来ているというオチだったりして・・・?

中だるみ

 なんとなく、中だるみ・・・。やることも山積なんで、しょうがないか・・・来月頭までは、しんどいかも?

2008年12月12日金曜日

かたづいた

 とりあえず、今日、postgresql サーバサイド・プログラミングは完了。めでたし、めでたし。疲れた・・・。

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日木曜日

むかついてきた

 ダントツで実務作業をやっている俺が、なんでマネジメントしなきゃなんねぇんだ?しかも、ネットワーク管理と個人情報管理責任者とシステム管理責任者のおまけつき、都合が良すぎだろ?実務作業で3つの競技場のグランドに立って、監督なんかできるか?あと1〜2年で会社が持ち直さなかったら、無駄だから会社を辞めちゃおう。

C言語にはまる

 いやー、C++でコーディングをしているとですよ…。Cの世界がキツいんですわ。Postgresql が変数名に "typename", "typeid", "namespace" を使ってくれちゃってるもんだから、SPI系のラッパ関数を書いて、間接的に呼び出す事により問題を解決しようと思ったら、思いのほか、はまってるんですわ…。なんつっても gcc をまじめに使った事が無いんで、どの辺ではまっているのか、当たりをつけるのが難しいんですわ…。

 まず、基本的な所で、参照渡しの引数を C言語では使えなくて、なんでエラーになるのか、しばらく悩んだんですわ。そん次には、C++でコンパイルするときにC++側の関数に extern "C" の修飾子が無いと、Cライブラリから「そんな関数はねぇー」って怒られてはまったんですわ。
 そして、ただいま、C <-> C++ 間での同一型のサイズ不一致か、アライメント不一致によると思われるポインタ化けと間接ポインタによる整数値化けに、はまってるんですわ。x86_64環境だから余計にしんどいのかな?

 gcc の情報源って、みんなどこから仕入れているんだろう?

2008年12月10日水曜日

書く事に関する本

 自分は国語が極端に苦手です。どのぐらい苦手かというと、理数系のテストで、いつも88点、その原因が問題文の趣旨を誤読して必ず1〜2問間違えるというぐらい苦手です。共通一次試験も自己採点で804/1000点でしたが、そのうち国語の点数が110/200点前後でした。
 そんな自分も年齢と共に書く事を要求される場面が多くなってきました。苦手を克服しようと思って、読んだ本の中から面白かったものを紹介したいと思います。

 1冊目は、「日本語の歴史」です。驚いたのは、暴走族が漢字の当て字で名前を付けたりしているのと同様に、ひらがな、片仮名が作られてきた事実です。書き言葉と話言葉が明治になるまで統一されていなかった事実も知りませんでした。国語で、わかりもしない作者の主張や主人公の心情などを教えないで、こういう基本的な事を教えるべきなんじゃないの?と思いました。

 2冊目は、「原稿用紙10枚を書く力」です。書く事に対するツボを押さえているように感じました。ただし、自分がこの本に書いてある事を実践できているとは言えないです。それでも、企画の文章を書く時には、本書が大変助けになりました。

 3冊目は、「本の読み方 スロー・リーディングの実践」です。自分の読書スピードは遅い方だと思います。速読なんて自分の中では逆立ちしてもあり得ないです。そんな自分の心境を見透かしてか、実に惹かれるタイトルだったので手にとりました。本書は読み方なのですが、小説の書き方として一人称で文章を綴るか、二人称で文章を綴るか?等、書き手の意図するところの機微を書いています。これには感動しました。

ブログについて思う

 読者を獲得するのって、難しいですねー。何かに特化して記事を書かないとSNS的な世界ではS/N比の低い記事って事になってしまいそう。書くネタは、たくさんあるんだけど、八方美人的で節操が無いしな〜。知人も含めて普通の人がC++の記事を見ても、ひくだろうに…。そろそろ知人にもブログの存在を告知しようかな?

ブランドについて勉強

 本日は、戦略的マーケティング・セミナーでした。ブランディングについてケース・スタディ。やはり、ちゃんと勉強すると実感が違います。Aというブランドがあり、このブランドでプレミアム市場に参入すべきか?というお題に対して、参加したメンバーは全員「いいえ」、唯一人「はい」で対抗する事になりました。
 ポイントは、Aというブランドで参入するのか?違うブランドを新規に立ち上げて参入するのか?ブランドの持つ軸を基準にして、ブレの無い決断を下すという所にありました。自分は、この点に関しては考慮が弱かったように思います。まぁ、お題を出す方も、そう簡単に竹を割ったような結論が出せないものをお題にしているので、とても勉強になりました。

2008年12月9日火曜日

Postgresql と C++

 postgresql でサーバサイド・プログラミングをしようと思って、


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

 システム屋さんの性として、このシステムはどうなのか?ついつい考えてしまうところがあります。車はシェアする時代と、前回書きましたが、ホンダがF1を撤退した事ですし、そこを掘り下げていきたいと思います。(実はマネジメントに引っ張られてからというものビジネスモデルを考える機会が多くなったので、このような事を書けるのです。)
 普段の買い物に車を利用したいという用途の場合には、大勢の人で、うまくシェアできると思いますが、休日だけ利用したいという人が多いと、シェアするのが難しくなります。ここをクリアするために、企業の営業車とシェアするというサービスを思いつきました。シェアしたいのは、個人だけではないと思います。
 また、車は移動するための手段みたいな書き方で終わってしまいましたが、もちろん多様化の時代においては、運転する事を主に考える人もいると思います。レンタルの形態も判で押したように店まで車を取りにきてもらい指定先に車を戻すのではなく、お届け、引き取りサービス等があっても良いと思います。個別サービスが厳しいなら、公共交通機関と連動したパックサービスなどはどうでしょうか?この場合ネックになるのは、荷物です。運送会社と共同で事前に必要な荷物を車にパッキングし、帰りには家まで荷物を届けるサービスがあれば、使いやすいのではないでしょうか?

おもしろかったミステリー

 「プリオン説はほんとうか?」この本が面白かったです。まじ怖いです。ミステリーと言ってもフィクションではなく、プリオンという異常蛋白について焦点をあてた研究者としてのまじめな提言です。それだけに、生半可な怖さじゃありません。
 陰鬱な雰囲気の中、スクレイピー病というイギリスに古くからある羊の病気にはじまり、緩急を織り交ぜながら展開されるストーリー、途中、プリオンを提唱したプルシナー博士の論文に隠された意図的なグラフの表現方法も交え、移動する蛋白質の不可思議から、20〜30nm(ナノミクロン)の世界へと、ぐいぐい引きずり込まれます。
 自分の中では「黒い家」以来の怖さでした。

2008年12月5日金曜日

今週末は・・・

 システム管理者・ネットワーク管理者・個人情報保護責任者の三段活用。という訳で、今週末はPマークの更新を控えて、こちらのお勉強なのだーーーーーーーーーーーーーーーーーーーーーー。

2008年12月4日木曜日

帰ってきました

 東京というか首都圏は、やはり熱い。面白かったです。たくさんの方とお話ができて良かった。クラスタージャパンよりも、国際画像機器展の方が10倍面白かった。中でも韓国の企業が出展されていた小さい3D液晶は、価格100$で発売する予定だそうで、近い将来モバイルに3D液晶が仲間入りしそうな予感がしました。

2008年12月2日火曜日

技術書

 自分では、どんな技術書を選択すべきか迷った事は、無いのですが、何を読んだら良いのか悩むような迷える子羊は多いのだろうか?2003年ごろのブログの状況と違って、今はブログもコモディティ化してしまったので、カテゴリーで結びつくというよりも、SNS的な結びつきの方が強いのかな~というのを、実際にブログをやってみて強く感じます。
 すんません、ちょっと酔っ払ってます。
クラスター・ジャパン展示会より

2008年12月1日月曜日

横浜

 横浜に来てます。夕食を食べようと店に入ったら料金先払いとか書いてあって、とりあえず注文してからビールを頼もうと店員さんに、「あのーここのシステムが良くわからんのですが~」と声をかけたら、中国人やんか~。もう、普通に働いてますやん?この感覚は、首都圏に住んでいないとわかんねーです。
 時給いくら貰ってるんだろ・・・?最低賃金で、その分が価格に反映されてるって寸法か?とか、いろいろと考えてしまいました。

自動車産業について

 TechLrunchの記事にiPhoneのような車を作れ!とあったためか、車の話題も多い気がします。アメリカの事情は知らないが、自分の感覚で、この事について書いてみます。
 実は、我が家では車に関して計画している事があります。今持っている車を廃車にして、車を持たない生活を送る事です。言い出したのは嫁さんの方で、バリバリのアウトドア派である私には、車のない生活は考えられない事だったのですが、事情の変化により賛同する事にしました。その事情とは
  • 仕事が忙しいのと息子(もうすぐ4歳)の相手で、休日にカヤックやスキーに行ける回数が激減している。
  • ゴルフ3(ディーゼル)の修理費や維持費に年間30万ぐらいかかる
  • 地球温暖化
  • 運動時間の確保
 といったところです。

 まあ、効率が10倍アップする新・知的生産術にも刺激を受けている事は否めませんが、車を所有する時代は終わりを告げつつあるのではないか?と感じています。この事は、サラリーマン「再起動」マニュアルにも、3大費用を節約しろという形で触れられています。
 現在、電車通勤を使っていますが、この利点は何と言っても、自分で運転しないので本を読む時間がとれる所にあります。たまに集中し過ぎて気がつくと乗り過ごしてしまうという危険はありますが、時間を有効に使える点は大きいです。後は、休日の車を使わないで済ます方法を考え、車をレンタルした場合と車を所有する場合を比較してみれば良いのです。
 車でなければならない場合は、工夫すれば、ほとんど無いはずで、どうしても必要な場合はレンタルすれば良いだけで、レンタル料金と車を所有する事で生じる金額を比較してみれば良いです。
  • 車保険料金  12万/年
  • 税金       -
  • 車検・修理   30万/年
  • 減価償却費 -
  • 駐車場代 -
こうやって考えていくと、維持費で年間 50万ぐらいはかかる計算になります。修理費が高いだろう!って、ツッコミを喰らうかもしれませんが、これは、新車と中古車における減価償却費とのトレードオフの関係が成立するので、良しとしてください。どうしても車を使用しなければならないのが年に数回であれば、レンタルしてもお釣りが出ます。また、タクシーを活用したって知れています。
 浮いたお金で、
  • マウンテンバイクを買う
  • モバイルパソコンを買う
  • 軽量のテントなどを買う
  • ミシンを買う
などと、広がる夢!健康のために自転車に乗って〜と、ルンルン気分になりませんか?多くの人にとって、もう自動車は所有する産物では無くなっていると思うのです。
 「自動車は所有するものではなく、シェアするもの」という時代になってきているのです。この構造は、どこかで見た事がありませんか?ソフトウェア産業と同じ、ソフトウェアを買う時代から、サービスを享受する時代へと同じです。人は車が欲しいのでは無い、簡単に移動するためのサービスが欲しいのです。
 フラット化する世界の中で、みんながみんな車を使うなんてナンセンス、山の雪解けが早いとか、今年はキノコが採れなかったとか、黄色信号が灯っています。
 所有する時代からシェアする時代へ・・・自動車産業も売る時代からサービスする時代をキーワードに考え直す時がきたのではないかと思います。

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;
}
}

2008年10月31日金曜日

岐路

 何かサービスを始めようと思うと、データセンタの利用等についても考えなければなりません。Amazon S3 サービスは、選択肢のひとつですが、日本では転送速度が遅いとか、使い勝手にもう一工夫ほしいとか、いろいろあります。Amazon のブログによると、Akamai のようなCDNサービスを始める計画らしく、これが実現すると、イノベーションが加速する事は間違いなさそうです。

 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

以前cppllにポストしたものですが、boost-1.36.0用に焼き直したものを貼っときます。

// 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アドレス

 高木さんのブログにIPV4においてもプロバイダのTCP/IPアドレスがランダムに変化しているかどうか調べて欲しいと書いてあったので、自分の環境で不真面目ながらも、IPアドレスを追跡してみました。結論から言うと、「ルータ・モデムをリセットしない限り、IPアドレスは変化しない」でした。
 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 を入れてみました。ソニー製のPCG-SR9M/K というノートです。このノート、PCMCIAカードでCD-ROMを接続しなければならないので、普通にLinuxをインストールしようと思っても、うまくいきません。実際、今まで何かとトライしてきましたが、失敗続きでした。
 今回、試みた方法は、Ubuntu-Server 版をインストールするという方法です。インストーラを起動してから、初期の入力画面が現れず、反応しなくなったので、CDをイジェクトして、再度CDを挿入しました。しかし、この操作は不要かもしれません。こうすると、コマンドプロンプト環境ながら、Ubuntuがインストールできます。ちなみに、LANはUSBに接続するタイプのものを最初から接続しながらインストールしました。
 次に、デスクトップ環境の構築に入ります。

$ sudo apt-get install ubuntu-desktop
$ sudo apt-get install ubuntu-desktop-ja

と、タイプして再起動するだけです。
 まぁ、今時のリッチなLinux環境は、それなりにマシン・スペックが必要なので、快適か?と問われれば、どうなんでしょう…って所で落ち着いてしまうのですが…。

味噌

 数年前に四国へキャンプ旅行した時に出会った味噌の話をします。
料理に使う味噌を物色しているときに、どうせなら地元産の味噌を使おうという事でマルヤス味噌をチョイスしました。この味噌は、麦味噌で、大麦から作られているので、大豆アレルギー・小麦アレルギーでも食べられます。キャンプの時に食べた味噌の味が忘れられなくて、家に帰ってからもネットで調べて取り寄せ、今でも愛用しています。
 お勧めの食べ方は、
  • マヨネーズと味噌を半分づつ混ぜて、キュウリやラディッシュなど野菜スティックにつける
  • 豚のロース肉に、この味噌を塗りラップに包んで冷凍する(もちろん焼いて食う)
  • 高知の食材である鰹節でタップリ出汁をとり、味噌汁にする
  • 豚のロース肉と同様に、白身魚に塗って冷凍
というような感じです。あと、我が家では、自家製味噌とブレンドして使ったりしています。
 知り合いに味噌を製造している方がいて、その方の話によると、店頭で売っている袋に入った味噌は、アルコールを加えるなどして、菌を殺し醗酵を止めるそうです。ところが、この味噌、通販では、麹も生きたまま蔵出し味噌を送ってくれます。現代人には酵素が不足しているそうで、食を見直してみるのも良いと思うのですが、いかがでしょうか?

 追伸:残念ながら広告料は入りません:-)。完全、口コミな記事です。

 

2008年10月25日土曜日

行動ターゲッティング

 最近、ユーザの行動を追跡して個人の趣向を把握し、超B2Cビジネスに繋げようという事に関する記事が多くなっています。これは、プライバシーの問題が絡んでくるためで、「Aさんは、こんな趣向の人ですよ」というような有難くない情報が、ビジネスを行う上で価値ある情報として流通してしまうからです。
 これを逆手に取れないだろうか?と考えてみたアイデアを発表してみようと思います。

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を弄った

 私のJavaの知識はJDK1.3 前後の知識で止まっています。久しぶりに、やや本格的にJavaを書こうとすると、コード中に @Override とか @SuppressWarnings とかが出てきて面食らってしまいました。
@Override によってオーバーライドのタイプミスを防げるらしい。
@SuppressWarnings は、C++で言うところの #pragma で警告の抑止ってところらしい。
JavaGenericsが面白そうで、java.nio.ByteBuffer で利用してみようかと構想したけど、型に応じたメソッドが用意されていて、単純にキャストして良いものかどうかが、判断できずに諦めました。
思わず sizeof 演算子を使おうとして考え込むなど、慣れるまでには時間がかかりそうです…。

2008年10月23日木曜日

Rails ActiveRecord 備忘録

モデル User と Hoge があり、Hoge から、多対1の関係で User にリレーションを2箇所設定したい場合、はて?どうしたものか?となった。


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
keyword: rails active_record table relation same column

2008年10月22日水曜日

孤立

しかし、ほんとBloggerって孤立してるよな・・・。違った意味で感心する。

Software and Service

 マイクロソフトは、Software and Service を提唱しています。言い分は、よくわかります。今、ソフトウェアの価値は、どんどん低下し、ほとんど価値が無くなってしまいました。プログラマはプログラムを組んでお金をいただく職業です。そこで、何かプログラムを創出しようと思うと費用がかかるので、Softwareは無料には成り得ないはずだ!という事だと理解しています。
 しかし、ロングテールで開発が成立するようなメジャーな分野(例えばエディタ)では、無料でも成立します。また、広告を行うためのプラットフォームとして無料でソフトウェアを配布する場合には、無料で成立しなくても無料を強いられます。私の頭では、どう考えても Software and Service ではなくて、Software for Service という時代になっていくという結論にしか至りません。
 そうすると、オープンソースとか、そんな事は関係なく、自社の価値を高めるための秘密のSoftwareというのが流行するのではないか?と思っています。
 聖人君子は除いて、一般人の感覚では、人に施す事ができるのは自分に施す余裕があるからです。一般人にも施しを受けるからには聖人君子たらんを強要するGPLは、正直言って嫌いです。そのGPLがバージョン3では、インターネット上でコンテンツを公開するために利用しても公開を強要するという項目が話題になっていましたが、秘密のSoftwareという時代に対する措置という事なのかもしれません。
 ブラウザに変わって .Net が主流になる時代は来るのでしょうか?

2008年10月21日火曜日

Railsについて思うこと

 実はRuby On Rails に(ゾッコン)はまりました。やってみて思った事を書きます。

  1. 生産性は高く素晴らしい!しかし、レールが敷かれている限りにおいては・・・
  2. 安定稼動しないのでアプリケーションとして提供するには、不満
  3. 革新的な技術がどんどん導入されて楽しいが、バージョンアップに伴うアプリケーションメンテナンスが大変
 active_scaffold と JasperReports の組み合わせで、型どおりのアプリケーションを作成するのは速く、生産性が高いわけですが、ちょっと細かい事をしようと思うと、とたんに難しくなります。みんなで新しいレールを敷設してまわれば楽しいわけですが、レールを外れた場合に生産性が高いか?と問われれば、極めて疑問を感じます。

 社内の日報管理システムをRoRで組みました。実際に長期稼動をしてみると、安定しているのですが、別の環境の別システムでは、システムが止まるので、1日1回に cron でリスタートをかけるという選択をしました。サービスとして選択するのは、まだ厳しいのではないかと感じます。

 Rubyの環境がアップデートされた場合に、rails が急に動作しなくなるといった事があります。また、railsのバージョンが上がると、後方互換性は捨てられていくわけですが、古いバージョンには脆弱性というものが付き物です。古いバージョンはサポートされなくなるので、ブラウザの挙動が変更された場合などにも対応されなくなります。そこで、railsのバージョンも追随したい訳ですが、レールを外れるほどに追随するための作業が大量に発生します。正直、つらいです(Zope & Plone に似た状況)。

 私の感覚では、RoRは斬新で素晴らしいけれども、仕事に向いているとは、必ずしも言えない。です。

2008年10月20日月曜日

プログラマのための眼鏡

 年齢と共に体力は落ちていきます。若い頃には、長時間モニタを見ていても視力に影響が無い状態であっても、ある年齢から徐々に視力は奪われていきます。振り返って考えてみると、私の場合は32歳ぐらいからだったように思います。
 遠くを見るのに比べて、近くを見るという作業は、まず、焦点が近いという他に左目と右目の角度が普段よりも内側へと寄ります。このように、とても不自然です。
 若いときに比べて眼の筋力が落ちると、長時間モニタを見ることにより、疲れて焦点を合わせるのと、凝視角度を内側へ寄せる事ができなくなります。その状態を繰り返していると、不自然な眼の筋力の使い方をするために、視力が落ちるだけでなく、乱視になります。
 40歳になったある日、視力も0.7を切り、モニタを正視する事ができなくなりました。これでは仕事に支障があるので、眼鏡屋さんへ行き、OA用のカラーレンズで近々と呼ばれる眼鏡を少し遠視を入れて作ってもらいました。ところが、眼鏡屋さんへ行った時が最悪の状態だったので、眼が疲れていない状態で、この眼鏡をかけると余計つらくなりました。この調整をしてもらうために再度、眼鏡屋さんを訪れました。
 眼が寄るような感じで辛いと事情を話したところ、眼鏡のフレームを凹型に曲げて(鼻の部分を顔側へ、外側を顔と反対側へ)調整してくれました。近々の眼鏡というのは、凝視角度を内側へ寄せるような構造をしているそうで、作り上、プロ仕様のOA用途に向いているとは思えません。
 それでも違和感が残るので、別の眼鏡屋さんで、上記を踏まえた相談をして、もう一本OA用眼鏡を作成しました。今度の眼鏡は、普通の眼鏡に遠視を入れてもらっただけの状態(この時には、視力が更に落ちていたので近視用眼鏡の度数を落とした状態)、即ち、度数を単純に足し算・引き算しただけの状態です。
 これはバッチリでしたが、一度落ち始めた視力の悪化は、なかなか留まる事を知りません。現在は42歳ですが、眼の状態に応じて両方の眼鏡を使い分けています。

 もし、若いプログラマが、このブログを目にする事があるならば、近々でなく引き算で遠視を入れた状態、かつ、OA用カラーレンズの眼鏡を作り、モニタを見る時には、その眼鏡を使用する事をお勧めします。1万5千円ぐらい投資する価値は十分にあります。
 若いときには「モニタを凝視しないで、焦点をモニタになるべく合わせずプログラミングしている」などと眼鏡不要と考えていましたが、年齢による衰えは確実かつ平等に、誰にでも訪れます。

砂粒

敢えて、リンク無しの宣伝無しでブログを始めると、一体どのようになるのか…。GoogleAnalyticsで見ると、始めて一週間では、ほぼ私以外には見ていない事がわかる。嫁さんのブログだと、始めてから割りとすぐに交流が始まったのに比べると、えらい違いです。
さすがにTracbackすらインプリメントしていないGoogleのBloggerサービスでは、プロフィールにおける趣味のカテゴリを通じて以外に接点が一切無く、とても硬派です。OpenSNSなどと必死にSNSの世界を検索の及ぶ世界へと繫ぎ止める戦略を打ってでているGoogleですが、インフォ・コモンズに関しては音痴なのではないでしょうか?
インターネット上で、秘密の日記状態って、なんか素敵だ・・・。面白いから、このまま続けてみよう。

2008年10月15日水曜日

TrackBack

選択を誤ってしまったorz...
まさか、Googleの提供するBlogサービスに、Trackbackの機能が無いなんて一秒たりとも想像すらできなかった。
この際だから、はっきり書こう。

 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い
 トラックバック機能の無いブログなんて、存在する価値が無い

Haloscan というサービスで、トラックバック機能を付加できる事がわかったが、冗談も休み休みにしてほしい。という訳で、Bloggerは閉鎖します。Googleという会社が凄いのか、単なる烏合の衆なのか、わからなくなりました。携帯サイトのクローラはYahooのように Docomo, au, Softbank のフリをしてクロールするという高度な事もせず、ウェブ・マスタ・ツールに頼りきり、しかも、ウェブ・マスタ・ツールでは、URLに?や&を含める事ができない。これは高木さんのブログに書かれているように、Googleには技術力なんて皆無なのではないか?

雁首そろえて、はてな・・・という選択は自分の性に合わないし、かと言って、サービスが独立していて、設定した内容と不整合の生じるlivedoorも自分の性に合わない・・・。ごちゃごちゃとしたレイアウトは嫌だし、会社のサーバにブログを設置するのは、趣旨に反する。

残された道は、自宅サーバ…。つうと、ADSLから光に契約し直して常時稼働のサーバを設置する交渉を嫁さんとしなければならないが、通るとも思えない…。設定するならWordpressで、Akismet+SpamKarma2の組み合わせなんだろうけど…。

そうか、WindowLiveか!まじ?

Hyper-v セットアップ スイッチ エラー 2

 OSから再インストールしてみたが、状況は変わらなかった。どうやら、サービス・パックにより1NICにつき1外部仮想ネットワークという構成へと制限されたのではないか?と推察するしかない。
 そこで、外部仮想ネットワークをひとつ作成してから、ネットワーク接続の詳細を開いて、NICの設定で、マイクロソフト仮想スイッチプロトコルのチェックを外してから、再度、仮想ネットワーク・マネージャで外部仮想ネットワークを作成すると、2つ目の外部仮想ネットワークの作成に成功した。何が違うのか注意深く、外部仮想ネットワークの違いを見てみると、2つ目は、マイクロソフトRPCサービスのチェックが有効にできない。Ping系の低レベルなネットワーク層の実装が影響しているのかもしれないです。
 毎回、ネットワーク接続の詳細からNICの設定で、マイクロソフト仮想スイッチプロトコルのチェックを外せば、マイクロソフトRPCサービスが使えませんが、外部仮想ネットワークを増やす事が可能なようです。

2008年10月14日火曜日

windows , ubuntu, Android SDK インストール

追記(2010/05/08)

そろそろ、この記事の情報は古くなりつつあります。Ubuntu 10.04 からは、sun-java6 が標準パッケージから外れたようです。こちらを参考にされた方が良さそうです。私自身、android sdk をいじる時間なんて、これっぽっちも無い状態なので、64環境でも動作するようになったのかどうか検証すらしていません。この記事を書いた時点(2008/10/14)では、64環境では32で構築しないと動作しませんでした。

JDKのインストール

ウィンドウズの場合は、SunMicroSystemのページから最新の Java SE SDK をダウンロードしてインストールします。
Ubuntuの場合は、Javaを入れます sun-java6-bin 以下のコマンドに同じ

$ sudo apt-get install sun-java6-bin
ただし、Ubuntu x86_64環境の場合には ia32-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

休日は、Android SDKの開発環境を整えました。と言っても、何かを作るあては、ありません(^^;。よせばいいのに、Windows環境に加えて、Ubuntuでの環境も構築してしまいました。時間があれば手順を書くこともあるかも・・・。
風邪をひいてしまった・・・。

2008年10月11日土曜日

OS

 ここ2年で Linux を使う機会が増えてきました。メインはWindowsですが、ウェブ・サーバ等を構築するにはLinuxの方が楽だと思います。マイクロソフトには大変お世話になっているので、こんな事を書くのも気がひけるのですが、IISは気に入らない方向へと進化してて付き合いきれないです(C|C++のISAPIを捨てるな!.NetのISAPI書くぐらいならApache2をとります)。
 随分昔の話になりますが、Linuxを設定するのは大変でした。まず、ネットワークに繋がらなければ、面白くもなんともない。せめてXだけでも動作させようとしても解像度・周波数・インタレス・+ー微調整をトライ&エラーで繰り返し、やっと使える感じ・・・。それが、今やインストーラ一発で比較的新しいパソコンでもホイホイとインストールできます。会社のウェブサーバはセキュリィティを考慮に入れてSELinuxのあるCentOSをチョイスしましたが、最近のお気に入りは、Ubuntu。
 会社の環境と、自宅の環境も Windows と Ubuntu のデュアル・ブートにしてあります。しかも、最近はリソースをクラウド(ここではイントラも含むウェブサーバの意)に置く事が多いので、何の支障もありません。

  1. OpenOfficeのレイアウトが、ウィンドウズ環境で見た場合と、Linux環境で見た場合で改行位置等が違いバラバラである
  2. Linuxにおける端末のフォントが汚くて見にくい(TrueTypeを入れても)
  3. 品質は上がったとは言え、Linuxの方は、まだまだ足りないなと思う事が多い
  4. 無線LANの設定は、Linuxは相当苦労する(この問題は解消しつつあります)
  5. 逆にウィンドウズは、やっぱりな・・・情けないだろ・・・と思うことも多い
  6. さすがに離れた両親のパソコンにLinuxを入れる度胸はない
といったあたりの違いで落ち着くでしょうか?

で、サーバが多いので仮想化も導入して稼働率を上げようとXenを導入していたのですが、長時間稼働するとお亡くなりになるため、Hyper-Vでしょ・・・と設定していました。Hyper-Vは、仮想ネットワークの設定がやたらと難しいです。それでも、仮想端末も含めて、やはり快適です。まだ出たばかりなので、まともな解説本はありません。どの本も仮想ネットワークの設定がわからないので、ゲストOSひとつにつきNIC1枚を割り当てる方法しか触れていません。まともな解説書が欲しい・・・。

2008年10月10日金曜日

時間が・・・

 いざ、ブログをはじめたものの、時間が無いときている・・・。手広くやりすぎて(やらざるをえない)生産性が低くなっているのも自覚しているが、他の人は、もっと生産性が低いので参ってしまう。働きすぎかな・・・。

2008年10月9日木曜日

スパム

 「いきなり規約違反の疑いがある」と言われて出だしから停滞する。
grayhole って、何か変な slung だったか?と調べてしまった。
ま、放置プレーには慣れているからいいけど、放置プレーは良くない。
人が全く介在しない仕組みは、難しいですね・・・。グーグルの欠点は
自主性に任せきりな所にあるのではないか?と感じます。
投稿確認の文字ですが、私は機械学習より劣るので読めません(成功率は低い)。

2008年10月7日火曜日

情報革命

 19世紀にイギリスで産業革命が起こり、大量生産と植民地時代を築きました。20世紀にはエネルギー革命が起こり、ライフスタイルに変革をもたらしました。そして21世紀に入り、我々の身に起こっている事が情報革命です。これは、「グリッド時代」という本に書かれていた事の受け売りです。
数年前までは、コマーシャルでITだのICTだの、何をかっこつけてるんだ?と軽く考えていましたが、この事について真剣に考えなければならなくなりました。今、破竹の勢いで時代が変革しています。
 私の職業はITに携わる事ですから、変革している個々の事象については把握していました。しかし、情報革命が起こっているという事が、こんなにも重要な事だという認識を得たのは、ここ2・3年の話です。ブログをはじめるにあたって、まずは、この事の重要性を書きたかった。

「情報革命」

 この事を意識できていない人は、敗者へと転落していく可能性が高いのだ。毎日毎日、時代が変革していく音が聞こえてきそうだ。この事を意識できていない人でも、違った形で何か違和感を覚えているはずだ。まずは、認識するところからはじめよう。

2008年10月6日月曜日

目的

1.ブログをする気はなかったのだが、インターネットの主たる収益である広告とは、どの程度のものなのか皮膚感覚として実感したいという気になった。
2.マネジメントに引っ張られてしまったので、捨てたものがある。boost develpment, boost users ML の購読、アルゴリズム系のコーディング遊び、など。ストレス解消になるのかどうかは疑問だが、どこかでバランスを取る必要がある。ライフスタイルの保険としてブログをしなければならないと感じた。