My Daily Programming Life...

目標とスキル

次にどんなことをしようかとか、どんなことを勉強してみようかとか考え始めると、だんだんと本質を見失うことがよくある。

コンピュータエンジニアとして働いていると、なんとなく常に何か新しいことを覚えなくてはとか、新しいものを使えるようにならなくてはという思いがどこかにある。そんなことを考えていると、じゃあ今後必要になる技術はなんなのかとか、価値のある(希少性のある)技術や、なかなか手に入れられないような技術とは何なのかということを考え出す。・・・そうしているうちに、だんだんとそれらの物に対する本質的な興味とは別に、「やらなくてはいけない」のではないかというような思いになる。

でも、この時点で何かを見失っていることに気づく。そもそも自分は何をやりたいのかということから来た物ではないということに気づく。いまセキュリティ関係の仕事をしているけれども、僕は本当に日本をそして世界を安全にしたいのか。それともコンピュータが好きだから、これをしているのか。それともお金が必要だからやっているのか。何をしたくて、今何をしているのだろうか。

就職とか転職とかでも「スキルアップ」なんて言葉がやたらと並ぶ。もともと僕はこの言葉を現実社会の目標とかの中に使うのがそんなに好きじゃない。なんかファミコンでRPGでもやっているみたいだ。レベル上げしなきゃみたいな。

そういうときにちょっと思いを巡らせると、だいたい結局は誰かの役に立つことをしたいんだという思いに至る。誰かが、それを喜んでくれればいい。対象はなんでもいい。でも僕はコンピュータが好きだし、コンピュータのことで困っている人がいたら、助けられそうだから、こういう仕事をしているんだということに気づく。

あまり表面的な技術とか、流行とかそういう物に自分の考えを奪われてしまわないようにしないと、やっていることがなんなんだか分からなくなってしまう。

でも、上に書いたこともいつかは自分の動機としてはなくなってしまうかもしれない。やっぱり僕の中にある順番は、「コンピュータが好き」→「それなら人の役に立てそう」だから。コンピュータが好きなのは、知らないことが多いから。どうなっているのか分からないけど、なんかすごいから。自分でいろんなものが作れるから。そんな理由。もしかしたらあるときコンピュータに興味がなくなってしまうかもしれない・・・というかたぶんなくなる。このままいったら確実になくなる。

その前にもっと本質的な、自分が人のためにできることを見つけたい

RTX1000 その2

RTX1000届きました。
さっそくつなげてみた。Webに設定例とかのPDFがあったのでそれを参考に。
うちはCATVなので、まあ簡単なIPマスカレード設定と、DHCP設定とDNS設定程度。

いまのところ、自宅内にサーバーとかはないのだけれど、いまMac miniが余っているのでそれをサーバーとして使ってDMZに置いてみようかと・・・。うーん、今頭の中でイメージしている物がDMZとというのかどうかわからないけど、たぶん大丈夫。
外部からの接続は・・・Dynamic DNSか・・・。なんかもっといい方法内のだろうか。

RTX1000

YAMAHAのルータRTX1000を買ってしまった。まだ届いてないけど。
前にいた会社でたぶん同じやつ使っていたんだけど、とってもよかったので、自宅用にと思って。今のルータがだめだめなので。やっぱ業務用の方が安定してるっぽいし。
RTX1000はかなり評判がいいみたい。

しかも定価は11万ぐらいするんだけど、中古で買ったら18000円だった。これは安い。しかもいろいろ遊べそうだし。いろんな設定を試して遊んでみよう。

こういう業務用の中古を買うって言うのは意外にいいのかも。おすすめですね。

問題は設定するのがが難しいこと。このルータも一応簡単なWebインターフェースは持っているけど、きちんと設定するにはコンソールでコマンドたたかなくちゃいけない。しかもかなりたくさんの設定があって、それこそTCP/IPの知識がフルで必要になる。初期設定でLAN側のIPアドレスとかも設定されていないらしいから、自分で設定しなくちゃいけない。さすがに一般家庭じゃ使えないよなぁ。技術者で一通りネットワークの勉強したい人にはいいかも。

SEH and SEHOP 現在の疑問 とりあえず解決?

前の投稿からちょっとしか時間がたってないけど、もう一度読み返して解決したかなぁといった感じ。
uninformedの方のPDFには、スタック上の_EXCEPTION_REGISTRATION_RECORDのnextを0xffffffffに攻撃者が書き換えたらどうなるか、ということを考察してあって、その場合はpop,pop,ret命令に飛ばすことで、このnextのコードを実行するという利点が生かせなくなるため、そうする意味がなくなると書いてある。これが僕の考えていたことであって、そうなんだったら、わざわざ終端用フレームを入れる必要がない。でも、さらに付け加えて、それでも何らかのコードを任意に実行されることは確かなので、念のためにランダムな終端フレームを入れてチェックするように下ほうがいい、と言っている。

つまりは念のためにそうしているという感じなのかもしれない。まあ、pop,pop,retを利用できないとなれば、基本的にはスタックオーバーフローならリターンアドレス書き換えの方が素直な方法だし、SEH Overwritingの利点がなくなっちゃうし。

とりあえず、こんな感じで解決と言うことにしておきます。

SEH and SEHOP 現在の疑問

SEHについて今いろいろ調べている。そのうちまとめてこのサイトにも載せる予定。
最初は単純にSEHの仕組みを知りたかったのだけれど、だんだんと深くなってしまい、
まずは下のを読んで
http://uninformed.org/?v=5&a=2&t=pdf
それから
http://blogs.technet.com/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx
を読んだ。
他にもいろいろ読んだのだけれど、とりあえずこの二つで今のところ疑問なのは、
なぜスレッドの開始時に終端例外フレームを挿入しておかないといけないのかということ。例外フレーム(_EXCEPTION_REGISTRATION_RECORD)のnextポインタが0xffffffffに突き当たればそれでOKなんじゃないのか?と思った。でもきっと違うんだろう。入れておかないといけないんだろうなぁ。でもなんでだか今のところよく分からない。

誰か分かる人教えてください。

BLOGGERでFTP公開ブログに最近のコメントを載せる

ブログを少し改良した。Recent Commentsというのをサイドバーにのせるようにした。
そんなの最近のブログなら当然できるだろと思うのが普通だと思うのですが、
BLOGGERを利用していて、それをFTP公開(自分のサーバーを利用して使う)場合には簡単にはいかない。基本的には、最近の投稿とアーカイブの部分のサイドバーしか用意されていない。ラベルとかもない(これは後で付ける予定)。

さすがに最近のコメントというのはほしいと思って、探したら見つかった。
http://www.bloggerbuster.com/2008/06/update-ftp-blogs-do-publish-comment.html
要点は、JavaScriptを使って、Blogspotにある、自分のブログのフィードを読み込んでそれをそのサイトに合わせて表示させるということ。自分のブログのフィードのありかは上のサイトにかいてあるように、一定の形をしていて、自分のBlogIDというものを入れればアドレスができあがる。BlogIDはダッシュボードに入ったときにURLにblogID=...と表示される20桁ぐらいの数字。

あとは、上のサイトで公開されているJavaScriptを使って、その部分にスクリプトを埋め込めばいいだけ。

このブログではスクリプトそのままだと見た目がおかしかったのでスクリプトで出力しているタグを少し修正した。

失敗

Deskmanというプログラムを公開し始めたけど、CのランタイムをDLLのままにしてしまった。今はStaticになっているのでどのPCでも動くはず。まだVistaでのテストができていないので、近々やる予定。まだまだBetaなので、お許しください。

ちょっとずついいソフトにしていきた。

人生最大の矛盾

まだ生まれてから30年たっていないけれど、そのなかでもっとも長く解決できなかった、納得できなかった問題がある。それはコンピュータのコンパイラ、またはOSのこと。問題は、コンパイラやOSがどうやって作られているかということだった。

僕が初めてプログラミングをしたのは中学生の時。それっぽいのを書いたのはDOSのバッチファイルが最初。だけど、すぐに情報不足に陥ったし、なんだかできることが少なくてつまらなかった。僕のなかでやりたかったのは、MS-DOSを作ること。コンピュータを初めてさわったときから、ずっとそのことを考えていた。
だけど、当然当時はネットなく、本も田舎じゃほとんどないしお金もないから買えない。ASCIIなどの雑誌を読んでも結局表面的なことしか書いていないし、わからずじまい。

その後、Visual Basicを買った。これは本格的なプログラミングをしてみたいという一心で買った物。当時の買い物としてはかなり高かった。中学生が2万6千円もするソフトを買わなくちゃ行けない。それでプログラム書いた。それまでにできなかったようなことがたくさんできたしかなり楽しかった。そのころはWindows 3.1。Windows 95が出る直前で、95はハードディスクの容量が円グラフで表示された最初のWindowsだった。当時そのスクリーンショットを見てそれをWindows 3.1でやりたいと思って、Visual Basicでがんばった。でもVisual Basicにはディスク容量を取得する関数はなく、Windows APIを直接呼ぶ必要があった・・・というのは今だから説明できること。当時はなんとしてもそれがやりたくて、ひたすらにいろんなことをしらべて、APIを呼び出す方法みたいなのをたまたま見つけて、それでやったらうまくいった。理由や仕組みなんて全然わからなかったけど、うれしかった。でも残念ながら円グラフにすることはできず・・・当時はまだπやらθとかラジアンとかの意味を知らなかったから。しかたなく棒グラフにした。今考えると我ながらよくやったもんだなぁと思う。

ちょっと話は脱線したけど、問題はVisual BasicでもMS-DOSが作れないことだった。その気配すら感じられない。つまりWindows上で動くウィンドウは作れるけど、スイッチ入れたら動き出すようなプログラムは作れない。そりゃそうだ・・・っていうのは後になってわかったこと。当時はどうなってるんだかさっぱりだった。

その後、Cという言語が重要なことを知った。うーん、もしかしてCならOS作れるのかなぁなんて当時は思った。んで勉強した。でもやっぱりOSは作れそうになかった。だって、CのコンパイラはOSの上で動いている。どうしたって無理だ。これが最大の矛盾だった。というのもMS-DOSやWindowsはCで書かれているなんていう情報を見たことがあったからだ。
Cで書かれているなら、それをコンパイルしなきゃ行けない。でもコンパイルするにはOSとコンパイラが必要なんじゃないの?・・・ってことになる。これが中学生の時から頭の中にあった矛盾。

中学から高校ぐらいのころの僕はずっとこれが頭に引っかかったままソフトウェアを作ってた。つまりコンピュータそのものはきちんと理解せず、Windowsプラットフォームという抽象マシンの上でだけプログラムを作ることができた。

それから、かれこれ13年ぐらいたつ。意味がはっきりわかったのは3,4年前だった。「
はじめて読む486」これをきちんと読んだときだった。そういうことなのかって。もちろんそれまでWindows APIや、Cでプログラムを書いてきていたのでだいたいの感じはわかっていた。でもその瞬間というか、それがわかったときは本当に長年もやもやしていた物が取れて、世界が開けた感じがした。きっと情報系の学科に行っていたりすればとっくにわかっていたことなのかもしれない。でもまあいい。

いまでも正直直感的には、コンパイラの話というのは不思議な感覚がある。つまりコンパイラもCとかで作られていて、それをコンパイルするにはコンパイラが必要であると言うこと。これは基本的には、はじめは小さなコンパイラを機械語で作って、それを利用してより強力なコンパイラを作って・・・と繰り返すことで巨大なコンパイラができあがってきたということなんだと今は理解している。
この、自分が自分より大きな物を生み出す感覚、なんとなくエネルギー保存則を破っているような感覚が直感的に違和感がある。これがコンピュータのすごいところなのかもしれない。

Windowsキーを無効にする

今作っているソフトで、一時的にWindowsキーを無効にしたいときがあった。
普通だとスタートメニューが表示されたり、ショートカットがいくつか使えたりするけど、
Windowsキーを利用するアプリを作っていて、自分のウィンドウにフォーカスがあるときだけはWindowsキーを無効にしたかった。

とりあえずその方法

まずは単純に無効にする方法。キーボードフックを利用すればよいらしい。

hHook = SetWindowsHookEx( WH_KEYBOARD_LL , WinKeyHook , hInst , 0 );

以下のURLを見れば全体が書いてある。
http://www.programmersheaven.com/mb/windows/344596/344596/how-to-disable-the-start-menu-button/

で、そこから、自分のウィンドウにフォーカスがあるときだけという条件を付けるカスタマイズ
フック関数を以下のようにする

LRESULT CALLBACK WinKeyHook(int code, WPARAM wparam, LPARAM lparam)
{
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lparam;
DWORD pid=0;

switch(wparam)
{
case WM_KEYDOWN:
case WiM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
if(key->vkCode==VK_LWIN || key->vkCode==VK_RWIN){
GetWindowThreadProcessId( GetForegroundWindow() , &pid );
if( GetCurrentProcessId() == pid ){
return 1;
}
}
}
return CallNextHookEx(NULL, code, wparam, lparam);
}


これで自分がフォアグラウンドにいるときはWindowsキーが無効になる。
ただし、自分自身のウィンドウもWindowsキーのイベントを取得できなくなるので注意。
自分も必要な場合は・・・これからどうするか考えます。

一般ユーザー向けソフト

今日こんな記事を見た

http://japan.zdnet.com/news/sec/story/0,2000056194,20396473,00.htm?ref=rss

アンチウィルスソフトがファイルを誤判定し、問題になったらしい。僕が興味があるのはこの部分。 

「『CA Internet Security Suite』のユーザーは、GUIを使って、影響を受けたファイルを隔離状態から復元することができる。『CA Threat Manager』を利用している場合は、ローカルのハードドライブ上で拡張子が『.AVB』のファイルを検索した後、手動で元のファイル名に付加された文字を削除することによって、元のファイル拡張子に戻して欲しい」

この前も似たようなことを書いたけど、こういうのがどうしても納得がいかないというか、どうしたらこれをなくせるんだという思いになる。僕も開発者なのでこうなってしまうのは仕方がないと正直思うのだけれど、これって普通の人ができることじゃないと思う。そういう人はPCなんて使うなってことか。でもこの製品は、そういう人も対象として売っているんじゃないだろうか。「フォルダとファイルのツリー構造が分かっていない人は購入しないでください。また拡張子の手動での変更方法がわからない人、ここまで読んでなんのことだかさっぱりな方は購入しないでください。」とでも書いておかなくてはいけない。

テレビに欠陥があったので、基盤を取り出して、はんだごてで、ここを接続してくださいって書いているようなものだと思う。

うちの母親じゃ無理だ。
こういう状況をなんとかするためにはどうしたらいいんだろうか。
なるべくそういうものを覆い隠そうとして、いろんなソフトウェアががんばっているのはわかるんだけど、あまりうまくいっていないように思う。なんというか、統一感のないUIだったり、言葉だったり、いろんなものがあって、結局使う人は内部がどうなっているかをイメージしないと、使えない。

たまに家族にPCの使い方を教えるときがあるけど、結局僕たちの頭の中にあることは伝わらない。たとえば、「リンク」。僕たちはリンクが大好き。実体は一つで、それへの参照をいろんなところに置いておけば、あたかもそこにあるかのように使える。
でもこんなこと現実的にはあまりない。そこにあるものはそこにあるものであり、あっちにあるものは必ず別のもの。同じような見た目でも違うもの。
しかも、リンクは同じものなのに、名前が違ったりする。あっちではマイドキュメント、こっちではC:\Documents and Settings\My Documents
これが同じだとは普通思えないだろう。仕組みを知っているから当然だと思える。
ツリー構造とか、配列とか、僕たちがこんな便利なものはないと思っているものが、一番彼らには理解できない。そこが難しいところだ。PCはまだまだ高度な道具なんだと思う。

でも、その意味ではWindowsはすごいのかもしれない。うちの母親がPCを使うまでにしてしまったのだから。開発者でさえ、OSとかCPUとかメモリとかその辺のことをしっかり理解している人は少ない。Windowsの上ならAPIで順番に書いていけばものが作れるから。その辺はすごい。
そして、今もそれを加速させようとしているんだと思う。

Windows Internals

Windows Internals 5th Editionが届きました。まだ4版との違いをすべて見てはいないけど、メモリ関連の部分も一部追加されていたり、セキュリティではUACについてくわしくかかれていたりしているみたい。

少しずつ読み進めなくては。もうすぐWindows7も出ることだし、いろいろ勉強しなきゃ行けないことが多い。

"ソフト"の矛盾

ソフトウェアの「ソフト」は、柔軟であることを意味する。簡単に変更できるし、取り換えられる。一般にソフトウェア開発ではその柔軟性を失わせずに、いかに構築していくか、つまり要求が増えたときにいかに簡単に対処できるようにしておくかが問われる。

この柔軟性はとってもうれしいことで、プラグインを入れたりすることでソフトはどんどん個人的なカスタマイズに応じてくれて、自分好みに変形させることができる。

ただ、これは開発者から見た場合だけに当てはまるものだと思う。ほとんどのユーザーはカスタマイズしたくないのだと思う。要求はある、でもカスタマイズはしたくない。それは手間がかかるしそんな知識はそもそもないからだ。

開発者はどうしても自分視点でソフトウェアを作ってしまう。たとえばある機能をF1キーで実現したとして、次にそのソフトウェアが目指すところは、その機能をほかのキーにも割り当てられるように、つまりカスタマイズできるようにすることだったりする。これは明らかに開発者視点である改善であると思う。たしかにほかのキーに割り当てられるようになれば自分の好きなキーに割り当てられて便利だ。でも、そんなことできることをしらないユーザーが使うのであればほとんど意味がなくなる。そういうユーザーはその機能がF1で実現されると知ったら、それで満足なんだと思う。

僕は一般ユーザーに使ってもらうソフトウェアは、いかにハードにするかが重要だと思っている。できることをひたすらに狭くする。でも必要なことはできなくてはいけない。

なにかを開発しているときに、いろんな選択肢にぶつかる。これをユーザーに表示すべきかそうでないか、などだ。そのときに、解決案として「設定できるようにしておこう」がよく持ち上がる。そして解決したことになる。

本当にそれでいいのだろうか。一般的な物理的な製品ではどうだろうか。テレビとか洗濯機とか。ここにボタンを付けるべきか、そんな壁にぶち当たるとハードな製品はおそらくそれを使う人と使わない人どちらが多いかを調べるのではないだろうか。

ソフトウェア開発にこの過程が少し欠けているのではないかと思うことがある。物理的な製品開発ではそれは少なくとも設定不可能であるため、あらかじめユーザーに対する調査がはるかに大きな規模で行われているんではないだろうか。

設定可能だから、たぶんこういうユーザーの方が多いから、または実装が簡単だから、デフォルトはこっちにしておこう。一般ユーザーに対する製品開発としてはこれではだめなんじゃないだろうか
feedSubscribe to my feed