My Daily Programming Life...

情報セキュリティスペシャリスト

合格した。よかった。
初めて持つこんな感じの資格。
結構ぎりぎりだと思っていたけど、本当にぎりぎりだった。

次は何を受けようか。応用情報技術者試験がいいかな。個人的な興味としてはエンベデッドシステムスペシャリストというももいいかも。
今回は勉強しなくても大丈夫そうだと思って、しなかったけど、エンベデッドはきびしいだろうなぁ。
でも勉強するために受けるんだからそれでいいか。

要求を知ること

プログラムの設計の話を読んでいると、よく要求を知ることが難しいとか、それをきちんと決めていくことが重要であるということが書いてある。
今日読んだ本には、要求は顧客も分かっていない部分があり、それを出して行かなくてはいけない、顧客以上に顧客の要求を知らなくてはいけないと書いてあった。

一般的な感覚では、顧客以上に顧客の要求を知るなんて無理な感じがするけどそうじゃないんだな。それはただ努力が足りないだけなんだ。というかシステムやプログラムを作る人の立場と顧客の立場からは見える物が違うし、その両方をシステム設計者は要求に書き出さなくてはいけない。

顧客以上に要求を知る・・・アップルとかはそんな感じだろうか。みんながこんなのがほしいって言ってから作るのではなく、こんなのがほしいんでしょと言って出してくる感じがする。うん、それそれ、みたいな。僕たちもそんなものがほしかったかどうかは知らなかったけど、目の前に見せられるとそれがほしかったと思う。こんなのすてきだ

Rubyで++演算子

Rubyでは++演算子でインクリメントできない。結構とまどう。
でも実はRubyは++演算子なしでプログラムが組めるようになっている、と考えたほうがいいのかもしれない。
++がほしいのはCとかならwhileとかforとか。
Rubyでは++を用いてループ処理をあまりしないっぽい。というかそうやるとちょっとRubyのいいところがなくなってしまいそうな感じはする。
++が必要になったら、ちょっとやり方が違っていると考えてもいいかも

Rubyの真偽

Rubyのif文などでは、0とかはしっかり==で判定しないといけないらしい。

condition = 1
if condition
puts "condition is true"
end

これは動かない


condition = 1
if 1 == condition
puts "condition is true"
end

が正しい

Windows Kernel Debuggerの仕組み

WindowsでKernel Debuggerがどうやって動いているのか興味があったけど、なかなかそれについて調べられずにいたら、今日たまたまいい記事を見つけた。

http://www.vsj.co.uk/articles/display.asp?id=265

こういうのあるなら早く言ってほしい・・・。

これでだいたいの動きは納得がいくようになった。
最近IDAを利用してカーネルデバッグができるようになったということで、なかなかおもしろいかもしれない。IDAがないとアセンブラコード読む気にならないし。

SafeSEHとSoftware DEP

SEH関連の情報をひたすらに収集しているのだけれど、いまいちSafeSEHとSoftware DEPとの関係性が分からない。
あるところでは全く同じ物だと書いてあったり、そうでないところもあったり。全く関係がないわけではないことは確かなのだけど。
SafeSEHオプションがなくてもSoftware DEPの一部は機能する気がするし、一方でSoftware DEPを実行属性なしメモリを例外ハンドラとして呼ばない機能とすれば、SafeSEHオプションだけでも意味のある物になる(登録されている例外ハンドラしか呼ばないという機能になるから)。

いまのところ、僕のイメージは、別々の物だけれどどちらもSEHを攻撃から保護してくれる機能という感じ。
でもなんか違うのかも。どこからどこまでがSafeSEHで、どこからどこまでがSoftware DEPなのかはっきりしてほしいと思うのだけれど・・・。

まあ、もうすぐ整理して書かなくてはいけないので、これから必死になっていろいろ読んで理解するしかない。

マルウェアって

ここ数日いろいろなマルウェアをいじっている。
感染させたりしながら挙動を見たりとか。
うまくできている物もあれば、そうでないものもある。

そんななか、ちょっと調べたConfickerはなかなかすごそう。
手が込んでいる感じ。すごくきれいに設計されている気がする。

というか、なんでこんなとこにそんな能力使ってるのか疑問だ。
こんなの作れる人なら、きっといい物作れるだろうに。

あと、意外に簡単にそういう攻撃コードは書けてしまうということもだんだん分かってきた。まだそういうバイナリレベルのセキュリティとかのことを勉強し始めて半年だけど、書けそうにない訳じゃない。
表現はちょっと悪いけど、質のいいマルウェアは作れないかもしれないけど、ちょっとしたものなら作れる。
けどやっぱり最終的に重要なのは脆弱性を見つけられるかということなんだろう。見つければそれを利用するのは簡単で、コードを書くのも簡単と言うことだ。普通のアプリケーション作るのとほとんど変わらない。

最近、PDFとか開くの怖くなってきたよ

情報セキュリティスペシャリスト

10月に行われる情報セキュリティスペシャリスト試験を受けることにしました。

ちょっと見た感じでは午前中は少なくともなんとかなりそう。
あとは午後の筆記とかかな。でも問われているのは、基本的なことだと思う。

大学受験のときとかもそうだけど、結局教科書をきちんと理解することが大事で、これもそういった類の試験だと思う。
逆に本当に基本的なこと、根本的なことを聞かれるので、ただ表面上サーバー作れますとかそういうことではだめなんだと思う。

一度基本を勉強するいい機会なのでがんばってみよう

目標とスキル

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

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

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

就職とか転職とかでも「スキルアップ」なんて言葉がやたらと並ぶ。もともと僕はこの言葉を現実社会の目標とかの中に使うのがそんなに好きじゃない。なんかファミコンで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で実現されると知ったら、それで満足なんだと思う。

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

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

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

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

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

Picasaでアルバム

Webページを更新しようと思って、いろいろ作業しているうちに、アルバム管理をなんとかしたくてGoogle Picasaを使ってみることにした。なかなかすごい。

かなり簡単に写真管理ができるし、軽快に動く。使いやすい。で、PicasaにはHTMLエクスポート機能があって、選択したフォルダや、写真をHTMLアルバムにしてくれる。既定では何種類かのアルバムテンプレートHTMLがあって、それらの形(見た目)のHTMLをエクスポートしてくれる。

ただ今回はは、アルバム表示のためにLightBox(写真をきれいに表示してくれるJavaScript)を利用することにしていたため、そのままでは使えない。それらのHTMLにJavaScriptを埋め込んで、さらにimgタグを編集して・・・とやらなくちゃいけない。さらに自分のWebページの見た目に合わせるためにも編集しなくちゃいけない。

いくつものアルバムを作成する場合にはちょっとやってられない。ここは是非、PicasaのHTMLテンプレートに自分のWebサイト用のものを入れたい。

Picasaのインストールフォルダを見ると、Web→Templateというフォルダがあってどうやらここにテンプレートファイルがあるらしい。簡単説明テキストもついている。テンプレートごとにフォルダに別れているっぽい。

index.tplというのがテンプレートの元になるファイル。これをまあ、スクリプト言語のようにPicasaが処理して、最終的なHTMLや画像ファイルをはき出してくれる。

  1. header.html
  2. イメージループ
  3. footer.html

というような形のindex.htmlを作るというのが基本的な形っぽい。具体的にはいろんなテンプレートのindex.tplファイルを見ればなんとなくわかってくるはず。まあ、理解するのに簡単なプログラミング経験は必要かもしれないけど。

Picasa Web Templating
ここに変数とか、コマンドの説明がある。

というわけで、自分用のテンプレートを作成した。当然その中には自動的にLightBoxのJavaScriptが埋め込まれるようになっていて、自分のWebサイト用のデザイン(css)を埋め込んだものが簡単に作れるようになった。

で、まあ基本的には満足したわけですが、ちょっと欲張ってshadowedThumbnailsという変数を使ってサムネイルに陰を付けるようにした。さらに調べてみるとbgColorで陰の色を変えられるっぽいみたいなことが書いてある。でも、bgColorを設定すると陰が全部真っ黒になってしまう。僕がなんか間違っているんだろうか。どんな値でも同じようになってしまう。bgColorがなければ通常の陰がつく。

さらにPicasaのデフォルトの.tplファイルを見ていたらfgColorとかいうのが設定されているファイルがあった。さっきのサイトには載ってない値の気がする。

うーん、もうちょいちゃんとしたドキュメントがほしい。というか、あんまり公の機能じゃないんだろうか。でも結構Picasa Web Templateとかいって検索すると作っている人いるみたいだけど。。。

TortoiseSVNの無視設定@VS

Visual StudioプロジェクトをSVN管理していてTortoiseSVNを使っていたら以下の無視設定をしておくといいと思う

*.ncb *.suo *.user

やり方は適当にフォルダ右クリックして、TortoiseSVN->SettingsのGeneralタブでできる。

svn:ignoreプロパティなんてのもあるけど、全体に適用してしまっていいようなときはこっちの方が便利

WDKビルドコマンドライン

WDKでデバイスドライバ開発を行っていて、おそらく誰もが不便に感じることは、
ビルドが基本的にはコマンドラインからしかできず、しかも、そのコマンドライン環境はスタートメニューのBuild Environmentから選択しなくてはいけないこと。
これだけなら、ショートカット作ればまあいいやですむのだけれど、問題はその先で、
コマンドラインで、ビルドするためのフォルダに移動しなきゃいけない。
かなり面倒くさい。
このBuild Environment用のスクリプトsetenv.batは第一引数にWDKのホームディレクトリを指定しなくてはいけなくて、しかもスタートのディレクトリをそのディレクトリにするようなスクリプトになっている。

エクスプローラから、今開発しているプロジェクトのフォルダを見て、右クリックからそのフォルダをスタートとして、Build Environmentを使えるようにしたい。

というわけで、setenv.batを改造して作りました。
mysetenv.batというバッチファイルで、これは/DIRオプションを取ることができて、スタートフォルダをその指定されたフォルダにします。
mysetenv C:\WDK\Version x86 chk w2k /DIR D:\MyProject
こんな感じで使います。 /DIRの位置はどこでもかまいません。

さて、こうしたところで、エクスプローラから簡単にその位置でBuild Environmentを開けるわけじゃないので、さらにここでお気に入りツールLopeSoftのFileMenu Toolsを使います。これを使ってフォルダの右クリックメニューにコマンドを追加。コマンドプロパティで
Programを C:\WINDOWS\system32\cmd.exe
Argumentsを /k C:\WinDDK\6001.18002\bin\mysetenv.bat C:\WinDDK\6001.18002\ chk x86 W2K /DIR %FILENAMES%
というような感じで指定します。
これでそのフォルダでW2K Checkedビルド用環境が立ち上がります。
後はそこでbuildコマンドをたたけばいいだけ。うーん、すてきだ。

buildまで一気にやってしまうオプションをさらに用意して、それも右クリックメニューに追加しておいてもいいかもしれない。

setenv.bat
Bloggerはファイルを添付できないってことを今知りました。しょうがないのでGoogle Docで共有です。ファイルはtextなので、拡張子をbatに変更してください。

Google Desktopのショートカット

GoogleデスクトップはCtrlを2回押すとサーチボックスが出てくるのだけれど、そこでのショートカットを発見したのでメモ。
Web探したけど、一覧が載ってないような・・・。正式な機能じゃないのかな。

サーチボックスに文字を入れた状態で、
Ctrl + P : Google Map検索
Ctrl + D : Desktop検索
Ctrl + I : Image検索
Ctrl + N : News検索
Ctrl + U : Group検索
Ctrl + W : Web検索(Enterと同じ)
Ctrl + A : サーチボックス終了(Ctrl 2回と同じ)
Ctrl + H : Backspace
Ctrl + [ : 入力文字全消去(Escと同じ)

最後の二つはなんとなくviっぽい感じ。
Ctrl + P はかなりほしかったものなので、うれしい発見。

NICに二つのIPAアドレスを持たせる

Linuxで一つのNICに二つのIPアドレスを振りたいときIP Aliasというのが使える。
今192.168.1.10というアドレスがeth0に割り当てられているとして
/etc/sysconfig/network-scripts/のifcfg-eth0をifcfg-eth0:1という名前でコピーする。
そして、ifcfg-eth0:1というファイルの以下の該当部分をこんな風に変える。
DEVICE=eth0:1 # デバイス
IPADDR=192.168.1.11 # IPアドレス

これで、eth0:1というデバイスができて、それが192.168.1.11に割り当てられる。
あとは
ifdown eth0
ifup eth0
(再起動)
をするだけ。

Apacheのバーチャルホストとかやる場合にも使える。
僕はよく自分のテスト環境で利用している。

Windows Kernel

なんだかWindows Kernelのよさげな資料を発見
http://www.i.u-tokyo.ac.jp/edu/training/ss/msprojects/index.html
東大ではこんな授業やってんのかぁ。いいなぁ。でもこれ4年ぐらい前の話だな。
今もやってるのかな。

Google Desktopとアドレスバー

Google Desktopがなんとなく変な動きをしているっぽい。
エクスプローラでアドレスバーに直接アドレスを入れたい場合(たとえば\\192.168.1.2とか)がある。Google Desktopを起動した状態でそれをやると、一定時間ごとに入力文字がキャンセルされて今いるアドレスに表示が戻ってしまう。

いま「マイドキュメント」にいるとすると、エクスプローラのアドレスバーの表示は「マイドキュメント」になる。んで、それを消して\\192....と入力していくと、途中でパッと「マイドキュメント」に戻ってしまう。一瞬でアドレスを入力してEnter押せば大丈夫だけど、5秒に一回ぐらい、そういう風な処理が走っているらしく、うまくいかない。
Google Desktopを終了させると、その現象はなくなる。

いろいろ設定変更してみたりしたけど、うまくいかなかった。Google Desktopグループでも見つけられなかった。報告してみるかな・・・。

マジック?

今一番知りたいことは、オブジェクト指向のよりよい設計はどのようにして考えられて、生まれるのかということ。何か基本原則というか、こういうときはこう作ればよいのようなものがあるのだろうか。デザインパターンとかそういうのはあるけど、本当にそれだけでは無理じゃないだろうか。

いまだに理解できないのはPoco(C++のライブラリ)の設計がどのようにして考えられたものなのかということ。僕にはマジックに見える。なんでこんなにうまくできてるんだ、と思えるところがいたるところにある。つまり、簡単に再利用できて、組み合わせることでどんどん新しい物が作れる。実際に目には見えるし(ソースは公開されているし)、何がどうなっているかもすべてわかる。でも"どのように"がわからない。

いつもプログラムを書くときに、どのように全体を組み立てるかを考えるけど、何をインターフェースとして、何を抽象クラスとして、そしてそれらの依存関係・・・と考えるけど、結局途中でなにかおかしくなる。

これでいいのだろうか。

Pocoのようにするには何を勉強すればいいんだろうか。単なる経験だろうか。それならそれでよいけど、なんとなくそうじゃない気がする。もっとなにかこういうことだ、ということがあってよいように思う。

よく使いそうなrpmコマンド

- インストール
rpm -ihv test.rpm

- アップグレード
rpm -U test.rpm

- パッケージ情報の取得
rpm -q package-name

- インストール済みのパッケージ一覧表示
rpm -qa

- ある名前(部分一致でも)のパッケージがインストールされているか表示
rpm -qa | grep partial-name

- パッケージ情報を取得
rpm -qi package-name
(表示されればそんなパッケージがある)

- パッケージに属するファイル一覧
rpm -ql package-name

- あるファイルがどのパッケージに属するか表示
rpm -qf /path/to/file

mallocの2の累乗確保

Joel On Softwareの最初のほうに、mallocは2の累乗を必ず確保するようにすれば、無駄が少なくて済むということが書いてあった。・・・ちょっと考えればすぐわかるって書いてあるんだけど・・・わかんね・・・。

こんなやりとりもあったけど、結局のところよくわからん。
http://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=118148&ixReplies=12

誰かわかりやすく教えてください。

Postgresに外部から接続

mysqlよりちょっと難しかったのでメモ。

環境
- CentOS5
- Postgres 8.1.1

とりあえず初期設定は
postgresユーザーになって、initdbを行う。DB用フォルダは自分で-Dオプションで指定してもいいし、環境変数PGDATAに入れておいてもいいらしい。とりあえずCentOS5で標準でインストールされているPosgtresを使うと、postgresユーザーの.bash_profileにすでに環境変数が登録されているので、そのままにしておいた。

その後はrootユーザーでservice postgresql startなどのコマンドで起動。

とりあえずそのlocalhostからpsqlで接続。psql -U postgres でよい。これで接続できればとりあえずPostgresサーバーは動いている。
ここまでは簡単だった。

次に外部からの接続設定。
今回は、192.168.1.0ネットワークでPostgresサーバーが192.168.10で動いているものとする。
設定箇所は2か所。DB用フォルダの中にpostgresql.confとpg_hba.confがある。(CentOSの場合 /var/lib/pgsql/dataが標準の場所)
postgresql.confがサーバー全体の設定で、pg_hba.confが接続許可設定という感じだと思う。

まず、postgresql.confでlisten_addressの行を変更する。これはどのIPアドレスで接続待ちをするかの設定。接続を許可するIPアドレスとは異なるので注意。一回間違えた。というわけでサーバー側のIPアドレスを指定。デフォルトだとlocalhostとなっているため、192.168.1.10に変更するか、"*"(all)にしてしまう。
listen_address = "*"
というかんじ。
これで192.168.1.10で待ち受けてくれる。

次にportの指定。
デフォルトだとportの行はコメントアウトされているので、それをコメントイン。とりあえずデフォルトの5432にしておく。
port=5432
というかんじ。これでpostgresql.confの設定は終わり。

次にpg_hba.confの設定。これは接続してくるホストの許可リスト。
デフォルトだと、localhostのみが許可されているので、192.168.1.0ネットワーク内から接続許可するようにする。
host all all 192.168.1.0/24 trust
こんな感じの行を一番下に追加する。特定のデータベースやユーザーのみ許可したいときは
host dbname user address/mask trust
のような感じで書けばよい。詳しくはpg_hba.confに書いてある。

これで外部から接続できるはず。
外部pgAdminなどから接続できるようになるはず。

あ、あと注意としてファイアウォール。CentOS5はpostgresをインストールしても5432ポートは自動的には開いてくれない。ファイアーウォール設定でTPC 5432ポートを開けておく必要がある。

Asus P5Q-Eが異常に遅い

Asus P5Q-Eを使ってPCを組み立てた。
とりあえず問題なく動いたのだけれど、とにかく起動が長い。
使っているOSはWindows XP。
以前より早いCPU、早いHDDなのに遅い。

最初に思いついた原因はドライバのロード時間。前とは構成が全然違うからWindowsがドライバを読み込む時間が長くなっている可能性がある。
しかし、それにしても長い。

いろいろ調べてみると海外サイトとかでも同じようなことが話題になっていて、どうやらIDEデバイスが問題らしい。
とりあえずBIOSにIDE Detectのタイムアウトみたいな設定が35秒とかなっていたのでこれを5秒に変更。
起動してみた。あんまり変わらず・・・。
今度は、Onboardデバイスの設定でIDEをDisableに。
起動してみた。早い!
なんなんだこの違いは。なんだかよくわからん。つないでいるのはDVD-Rドライブ。これに時間がかかるのか・・・。
短くなったのはWindowsのロゴが表示されている時間。これはこれで劇的に短くなった(ただし、DVD-Rドライブは使えず。SATAドライブを購入しろということらしい)
もう一つ遅いと感じているのはその後の「Windowsを起動しています」というダイアログボックスの表示されている時間。ここではスタートアップのドライバやサービスが起動されているはず。ここら辺はソフトウェアの設定でもう少し何とかなるだろうか。不必要サービスはほとんど切ったけど、ドライバもちゃんと調べる必要があるかな。

Documents and Settingsの位置を変える方法

データの保存用に別ディスクを使っている人は多いと思う。
僕はRAIDでミラーリングしているディスクをデータ保存用に使っていて、それをD:ドライブに割り当てて使っていた。
Dの中にフォルダを作ってそこをMy Documentにする。通常のC:\Documents And Settings\UserName\My Documentsからそちらにマイドキュメントフォルダを移動するのは簡単で、マイドキュメントフォルダのプロパティを開いて、移動ボタンで移動先を指定すればいい。

でも、これだとUserName下のApplication DataとかLocal SettingsとかがいまだにC:\に残ってしまう。LinuxでいうホームフォルダがこのUserName下になるわけだけど、できればここから下をD:\に持って行きたい。そうすれば、システムを入れ替えた後でも簡単に自分のデータや環境を移行できる。

というわけで調べてみると
レジストリでHKLM\Software\Microsoft\WindowsNT\CurrentVersion\ProfileListのなかに各ユーザーのホームディレクトリの位置が書いてあるらしく、それを変えればいいらしい。
ただし簡単には移動できない。(ここで紹介する方法は何の保証もしないので、自己責任でやってください。)

ProfileListの中の数字の羅列のキーを一つずつ調べていき自分のユーザー名のものを見つける。(各キーの中の値のProfileImagePathが自分のものになっているものを見つければいい。)これを自分の好きなディレクトリに変える。たとえばD:\homeにする。
このままだともとのデータがなくなってしまうので、もとのC:\Documents And Settings\Usernameの中身をすべてD:\homeにコピーする。・・・がファイルのいくつかはロックされていてコピーできない。
というわけで、セーフモード(コマンドライン)で起動しなして、Administratorでログインする。その状態で"xcopy /S /E /H "を使ってファイルをすべてコピーする。そして再起動する。

これで新しい環境に移行できているはず。もともとC:\Documents And Settings\UserName内に保存されていた環境はそのまま移行しているはず。

PHPのリモートデバッグ(ZendDebugger)

まだ環境構築途中だけど、メモ。
環境は
CentOS5 + PHP5.1 + Apache/2.2.3

とりあえずPHPをApacheモジュールとして動かすところまではできるという前提で。

必要なのはPHPのZendDebuggerモジュール
http://downloads.zend.com/pdt/
のserver-debuggerのなかから自分の環境のものを持ってくる。

んで解凍してその中から、PHPバージョンにあったものを取り出す。
それをPHPの拡張モジュールディレクトリにコピー。
僕の場合は/usr/lib/php/modules/ZendDebugger.so
とコピーした。

次にphp.iniの書き換え
[Zend]
zend_extension=/usr/lib/php/modules/ZendDebugger.so
zend_debugger.allow_hosts=192.168.110.1
zend_debugger.expose_remotely=always
のようにした。

注意:僕の環境では allow_hostsには"all"とか"*"とか指定できなかった。コンマ区切りでIPアドレス指定らしいけど、とりあえずひとつしか指定できなかった。

あとはApacheを再起動。phpinfo()を見ればデバッガーのロゴが出ているはず・・・。

その他の環境の設定は
http://www.thierryb.net/pdtwiki/index.php?title=Using_PDT_:_Installation_:_Installing_the_Zend_Debugger

これからEclipseでデバッグをしてみるところ。
それは後ほど

Adminはすべて許可される

http://japan.zdnet.com/sp/feature/07microsoft/story/0,3800083079,20387740,00.htm?ref=rss

Windows7のセキュリティが問題だとか、UACの機能がどうたらこうたら、そんな話。

詳しくどこが問題なのか調べていないけど、僕はどちらかというとMicrosoft側を支持するかもしれない。
現在のWindowsの利用上、セキュリティや使い勝手を悪くしているのはOSではなくて、その上で動いているアプリケーションだと思う。これらを作っている人たちがルールを守らない、または守れない状況にあるのが問題だと思う。
一言で言えば、「管理者権限下でないと正常に動作しない通常アプリケーション」が問題。Windowsはきちんとした処理を加えれば、通常ユーザー権限下で十分な機能を提供できるAPIを用意しているはずだと思う。
問題は、管理者権限でWindowsを使っている人が多すぎる、というか使わざるを得ない状況だと思う。
この状況で、さらにマルウェアからPCを守ろうとしてUACなんてものがでてきて、あのやたらと面倒なポップアップが表示されるようになったのだと思う。

ただ、確かに通常ユーザー下で動作するアプリケーションを開発するのがちょっと面倒というのはある。僕もプログラムを書いていて、管理者権限でデバッグして、通常ユーザーで動かすと、動かないことがよくある。まあ、Windows APIのセキュリティに関するパラメータが結構面倒だったり、権限管理が面倒だったりするため、時間との問題でどうしてもそうなる。

やっぱりこの辺をうまく変えないと、この問題は解決しないんじゃないだろうか。

Unixとかはrootで動かすことは特別なことという認識が強くあるので、この辺の問題はプログラマの共通意識のなかである程度解決されているのだと思う。まあ、だからUnixプログラミングはちょっと面倒だったりするわけだけど。
だから、WindowsもUnix同様、Adminはデフォルトすべて許可されるでいいんじゃないだろうかと思う。

Windowsがあまりにも一般化して、よくわかっていないプログラマでもアプリケーションが作れる状況になっているのは、よい面も悪い面もあるように思う。

おすすめソフト

エクスプローラで右クリックメニューを簡単に改造できるソフト。
http://www.lopesoft.com/en/
かなり便利です。
自分でレジストリとかいじらなきゃいけなかったり、もしかしたらシェルエクステンションとか自分で書かないといけないようなことが簡単にできます。

僕はただ右クリックメニューにそのディレクトリでコマンドラインを開くというメニューが欲しかっただけなのでしたが、いろいろ使えそうです。

一緒のところにある、LopeEditは使いやすいんだろうか。
feedSubscribe to my feed