最近は頭の中はコンピュータのこと考えているのが80%ぐらいになっている。とにかく本を読んでいる。Webもかなり参考になる。
こうして今いろいろ勉強してみると、やっぱり素直に大学で情報工学科行っておいた方がよかったのかなぁとか思う。自分が知りたいことをいろいろ検索していると、しょっちゅう大学の講義資料とかそういうのに出くわす。情報工学科の人たちはこんなに楽しいことを学部の3年とかで勉強しているのかぁ、とか思うと、やっぱりそっちのほうがよかったかなぁって思う。まあいまさらどうしようもないので、いまからでも順番に勉強していく。
以前に日本のソフトウェア輸入額は輸出額の100倍あるって書いた。いろんな本を一度に読んでみて、その理由の一つが分かった気がする。情報が足りないか、誤っていることが多いと言うこと。
だいたい読む本は海外で出版されたものの翻訳が多い。海外の本にはかなりいい書籍があるということが最近分かってきて、さらにそれらは本当に今の、最新の情報が載っている。でも、それが翻訳されて発売されるまでにはかなりの時間を要するし、すべての本が翻訳される訳じゃない。
そしてその翻訳が意味不明なことが多いのも問題を大きくしていると思う。Windows SDKとかでもそうだったりすることもある。デバイスドライバの本を読んでいて、意味の分からないところがあって、なんどかその前後のページを読み直していて、ちょっと気がついて、それがもともとどんな英語だったか想像してみたら理解できたって事があった。
コンピュータの独特の用語とかそういったものが翻訳されるときに、どうするかというのは結構難しいと思う。
たぶん英語の文章も慣れれば日本語と大差なく読み進められると思うし、多少時間がかかってでも読めるようにしておいたほうが、あとあと楽だろうと思う。とにかく日本語翻訳の本を読むのはなるべく避けた方がいい気がしてきた。
日本の技術者が自分で書いている本はすごくいい本がたくさんあると思う。でも翻訳の本は、やっぱり読みにくいし分かりにくいと感じることが多い。
タイトルに「プログラミングは楽しいね」と書いたけど、今はプログラミングそのものよりコンピュータとOSの仕組みの理解に時間をかけている感じ。プログラミングの勉強としては、デザインパターンが最近の課題かと思う。言われれば分かるけど、自分でやってみてそれが本当にその方法論を実践できているのかを確認できるだけの力がない。
C++のライブラリでPOCOというのがある。これはデザインパターンを駆使して作られていると思う。そしてそれをC++で実装しているわけで、最近はこのソースコードが僕の教科書になっている。教科書にしてよいかどうかははっきりとは分かっていないけど、いろいろな評判を聞くと、決して悪いことはなさそう。
ところでC++難しいね、やっぱり。少しずつ理解していこう。
My Daily Programming Life...
APIフックとかドライバとか
仕事の中で今はWindowsのAPIフックとかフィルタドライバとかの話が面白い。まあ、普通のAPIフックはユーザーモードのちょっとテクニカルな話なだけでそれほど目新しいことはないけれど、フィルタドライバはかなり違った世界だ。
デバイスドライバは情報も少ないし、種類もいろいろあるし、かなり理解は大変。とくに最初がたいへん。なんとなくその世界が分かってくるまでにかなりいろいろ読んだ。CプログラミングのHellow Worldのようにはいかない。
まだまだドライバを書けるレベルにはほど遠いけど、入り口にはたどり着いた感じ。これまではどこが入り口かも分からなかった。
ドライバはなんか、Windowsと対等に渡り合える感じがいい(笑)Windowsだろうがなんだろうが、俺が支配者だ!みたいな感じです。まあ、その結果がブルースクリーンだったりするわけですが・・・。
フィルタドライバに関しては、実デバイスをいじる訳じゃないのでハードウェアの知識が直接必要になるわけじゃない。でもその周辺で何が行われるかは知らないといけない。とりあえず、ファイルシステムフィルタをきちんと理解して自由に書けるようになりたい。
デバイスドライバは情報も少ないし、種類もいろいろあるし、かなり理解は大変。とくに最初がたいへん。なんとなくその世界が分かってくるまでにかなりいろいろ読んだ。CプログラミングのHellow Worldのようにはいかない。
まだまだドライバを書けるレベルにはほど遠いけど、入り口にはたどり着いた感じ。これまではどこが入り口かも分からなかった。
ドライバはなんか、Windowsと対等に渡り合える感じがいい(笑)Windowsだろうがなんだろうが、俺が支配者だ!みたいな感じです。まあ、その結果がブルースクリーンだったりするわけですが・・・。
フィルタドライバに関しては、実デバイスをいじる訳じゃないのでハードウェアの知識が直接必要になるわけじゃない。でもその周辺で何が行われるかは知らないといけない。とりあえず、ファイルシステムフィルタをきちんと理解して自由に書けるようになりたい。
あけましておめでとうございます
新年ですね。今の自分の状況で新年を迎えられたのは、本当によかったと思う(就職できたりとか)
ところで、ちょっと読んだ記事で、ソフトウェアの輸出入の差は100倍以上あるそうな。輸出額が約90億に対して輸入額が9000億以上なんだそうだ。この差はひどい。
なんでだろ・・・。日本は世界に売れるソフトを作っていないのか。
確かに考えてみると、Windows,Officeなんてのは当然ながらアメリカ製。フリーソフトだけどFireFoxやThunderbird,Operaなんかも海外製っちゃ海外製。Flashなんかもアメリカ製(Adobeはアメリカ?)。
んー、自分のパソコンの中身を見ても、日本製のソフトはFTPクライアントのFFFTPぐらいしかないかも。あとはゲームとか。
ゲームは是非日本から世界に発信してほしいなぁと思う。やっぱゲームは日本は強いんじゃないかと思うし。
一応今の会社は自社製品を作って売っているので、それが世界で売れるようになったらいいなぁ。決してどんなソフトだって世界で売るのは不可能じゃないと思うんだけどなぁ。
そういうものに向けていろいろ勉強しなきゃね。
ところで、ちょっと読んだ記事で、ソフトウェアの輸出入の差は100倍以上あるそうな。輸出額が約90億に対して輸入額が9000億以上なんだそうだ。この差はひどい。
なんでだろ・・・。日本は世界に売れるソフトを作っていないのか。
確かに考えてみると、Windows,Officeなんてのは当然ながらアメリカ製。フリーソフトだけどFireFoxやThunderbird,Operaなんかも海外製っちゃ海外製。Flashなんかもアメリカ製(Adobeはアメリカ?)。
んー、自分のパソコンの中身を見ても、日本製のソフトはFTPクライアントのFFFTPぐらいしかないかも。あとはゲームとか。
ゲームは是非日本から世界に発信してほしいなぁと思う。やっぱゲームは日本は強いんじゃないかと思うし。
一応今の会社は自社製品を作って売っているので、それが世界で売れるようになったらいいなぁ。決してどんなソフトだって世界で売るのは不可能じゃないと思うんだけどなぁ。
そういうものに向けていろいろ勉強しなきゃね。
仮想メモリとアドレス変換
難しい・・・きちんと理解できない。たぶんまだ知識不足だな。
プロセスメモリ空間(論理アドレス)→(Intel x86の場合)セグメンテーション→リニアアドレス→ページング(PTEなどを経由)→物理アドレス・・・なのだと思う。きっと・・・。
よ くわからないのは、x86のセグメンテーションの部分。Windowsのメモリ管理の解説を読むと、たいていこの部分は飛ばしてあるように見える。ページ ングの仕組みがメインなので、ある意味自動的に行われるセグメンテーションは飛ばしているのかもしれない・・・。最初はセグメンテーションは利用しないの かと思った。
この辺がきちんと説明できるようになりたいなぁ。CPUに関しては「はじめて読む486」っていうすばらしい本があって、結構昔に 読んだ。でも実際OSがどんな風に利用しているかはきちんと知らずにいたので、ここへきてちゃんと理解しようと思っていろいろ読んで、かなりいい線まで来 たと思うのだけれど・・・。CPUの機能で実装されている部分と、OSの機能で実装されている部分と、CPUの機能をOSが利用して実装されている部分の 区別がいまいちはっきりつかない。でも結局はすべてCPUの機能をOSが利用しているってことか・・・。
もうちょい勉強が必要。
2009/7/1 追記
前のブログを読み直して、これを見つけた。とりあえず今はだいたい理解しているはず。
セグメンテーションの部分はWindowsもしっかり利用している。でもコードセグメントもデータセグメントもすべて0~4GBの範囲を利用できるようにディスクリプタが設定されているから、仮想アドレス空間内でばらばらに存在するようなことはない。CSもDSも領域がかぶっているような感じかな。
プロセスメモリ空間(論理アドレス)→(Intel x86の場合)セグメンテーション→リニアアドレス→ページング(PTEなどを経由)→物理アドレス・・・なのだと思う。きっと・・・。
よ くわからないのは、x86のセグメンテーションの部分。Windowsのメモリ管理の解説を読むと、たいていこの部分は飛ばしてあるように見える。ページ ングの仕組みがメインなので、ある意味自動的に行われるセグメンテーションは飛ばしているのかもしれない・・・。最初はセグメンテーションは利用しないの かと思った。
この辺がきちんと説明できるようになりたいなぁ。CPUに関しては「はじめて読む486」っていうすばらしい本があって、結構昔に 読んだ。でも実際OSがどんな風に利用しているかはきちんと知らずにいたので、ここへきてちゃんと理解しようと思っていろいろ読んで、かなりいい線まで来 たと思うのだけれど・・・。CPUの機能で実装されている部分と、OSの機能で実装されている部分と、CPUの機能をOSが利用して実装されている部分の 区別がいまいちはっきりつかない。でも結局はすべてCPUの機能をOSが利用しているってことか・・・。
もうちょい勉強が必要。
2009/7/1 追記
前のブログを読み直して、これを見つけた。とりあえず今はだいたい理解しているはず。
セグメンテーションの部分はWindowsもしっかり利用している。でもコードセグメントもデータセグメントもすべて0~4GBの範囲を利用できるようにディスクリプタが設定されているから、仮想アドレス空間内でばらばらに存在するようなことはない。CSもDSも領域がかぶっているような感じかな。
一部間違えた
前に書いたPHPをSSIで動かす話。一部理解を間違えていた。<--#include virtual="foo.php" -->で動かす場合、Content-Typeのヘッダが必要ないと書いたけれど、実際には必要で、だけどPHPだから不必要ということだった。 CGI版PHPでは、勝手にContent-Typeを出力する。だから不必要と言うことだった。だからこれがPerlとかのCGIだったら、 Content-Typeの出力が自分で必要になるはず。今日は色々調べていったら、自分のサーバーではsuPHPを使っているということが分かった。最近はこれになってきているみたいね。確かにユーザー権限ですべてが動くというのは管理も楽だしセキュリティ上もよいはず。
PHPとデフォルト引数と参照渡し
PHPでプログラムを書いていた。PHP4のオブジェクトを利用したプログラム・・・。PHP4のオブジェクトはかなり貧弱なので使いたくないとは思っていたのだけれど、やっぱり使った方が管理が楽と言うことで使ってみた。
んで、やっぱりオブジェクト指向で書いていれば、どうしたって参照渡しが必要になる。
関数を書くときに、よくデフォルト引数を指定する。今回参照渡しの引数に対してNULLをデフォルトで指定したかったのだけれど、ダメだった。できないらしい。検索したけどやっぱりできないって結論のものが見つかった。ちょっと不便かな。
んー、そういえば、ちょっと前にJJFの申し込みフォームを作ってたときは、PHP4のnewが参照ではなくコピーを返すことを知らずにかなり悩ん だ覚えがある。この辺もPHP4でオブジェクトを利用したくない理由。でも結局オブジェクトを使った方が何かと後で変更が楽。んー、悩ましい。PHP5が 使えるレンタルサーバー増えないかな。
ApacheとSSIとPHP
PHPをSSIでインクルードしたい場合にはどうしたらよいのか。今回いろいろ試したので書いておこうと思う。Apacheのバージョンは2.2.3で試した。foo.html内にfoo.phpをインクルードするとする。
---Apacheの関係する設定---
OptionsにIncludesは必須。これは普通のSSIと同じ。さて、ここで二つの場合がある。
Includesが指定されている場合 - すべてのSSIコマンドが使える。重要なのは<!--#exec cmd=... -->、<!--#exec cgi=...-->、<!--#include virtual=...-->の三つ。これらすべてが使える。 IncludesNoExecが指定されている場合 - 上記三つのうち、<!--#exec ...-->の二つのコマンドは利用できない。<!--#include virtual=...-->のみが使える。共用サーバーではよくある設定。
--- foo.htmlの設定---
SSI を利用するためには、どこかでAddHandlerを指定しないといけない。共用サーバーなら、.htaccessに書くことになる。パフォーマンス上は 良くないらしいけど、僕はshtmlという拡張子が好きじゃないので、.htmlをすべてSSI有効にしている。つまり以下のようになっている。アクセス のある程度多いWebならshtmlにして別にしたほうがいいと思う。 AddHander server-parsed .html これで.htmlファイルはすべてSSIが有効になって、<!--#....-->の部分が解析されるようになる。 foo.htmlの中身については後述。
--- foo.phpの設定とその中身 ---
.htaccess にAddHander php-script .phpとか書いておけば、通常PHPファイルはApacheがそれを.phpをPHPモジュールで処理してくれる。重要なのはこの場合実行属性は必要な いということ。ただし、今回は、CGIとして実行するわけで、PHPモジュールは動かない。と言うわけで、コマンドラインのPHPを使うことになる。 つまり、コマンドラインで
>./foo.php [ENTER]
として実行ときの実行結果が返されることになる。さて、普通の PHPファイルは実行属性はついていないので当然実行することはできない。なので755あたりのパーミションに変更する。これでうまくいくかというとそう いうわけにもいかず、スクリプトの最初の行に必要に#!/usr/bin/phpが必要になる。これがないとこのスクリプトを何で処理して良いのか分から ないので、うまくいかない。 というわけで、foo.phpはパーミッション755を付けて、中身はたとえばこんな感じ #!/usr/bin/php
--- foo.htmlの中身---
PHPのファイルをSSIでインクルードするにはどの方法が使えるのか。考えられるのはだいたい次のコマンド。 <!--#exec cgi="foo.php" -->
<!--#exec cmd="./foo.php" -->
<!--#exec cmd="php foo.php" -->
<!--#include virtual="foo.php" --> さて、まずはこれらすべてのコマンドが使えるという状況で、それぞれの違いについて。細かい違いはバージョンやプラットフォームで違うらしいので、重要なところだけ。
<!--#exec cgi="foo.php" -->の場合、PHPでContent-type: text/htmlを出力しないといけない。そうでないと失敗する。
<!--#exec cmd="foo.php"-->の場合は、Content-type: text/htmlの出力は必要ない。さらに引数を取ることもプラットフォームによっては可能らしい。<!--#exec cmd="foo.php arg1 arg2" -->のように。ただしSuexecを使っているUNIXやWin32では利用不可らしい・・・。
<!--#exec cmd="php foo.php" -->は、一応利用可能っぽいが、やっぱりSuexecが有効の場合にはつかえないっぽい。
<!--#include virtual="foo.php" -->はContent-typeの出力は必要ない。さらに引数も<!--#include virtual="foo.php?arg1=var1"-->というように指定可能らしい。
--- さらに設定が・・・ ---
こ れですべてうまくいくはずが、まだ考えなくてはいけないことがあった。IncludesNoExecを指定されている場 合、<!--#include virtual="foo.php"-->でしていするファイルのMimeタイプが重要になってくる。普通.phpファイルはMimeタイプとして
AddType application/x-httpd-php .php
の ように指定されている。ApacheはIncludesNoExecを処理するとき、その対象ファイルのMimeタイプを見て、それがtext/*でない とエラーにするというようになっている。なぜかは分からないがセキュリティ上の都合だろうか。そのままfoo.phpをvirtualに指定すると
unable to include potential exec
というエラーが出てしまう。直訳すると「潜在的なExecはインクルードできない」となる。これの対処方法は二つ。一つはfoo.phpをfoo.cgiにしてしまうこと。こうするとfoo.cgiは普通に実行されてその結果が返る。た だ、どうしてもphpファイルの拡張子は.phpがよいと感じたので、その方法も探った。まあ、簡単なことだけど、foo.phpのあるフォルダ の.htaccessに AddHander cgi-script .php
AddType text/html .php の2行を書く。ただしこうすると、そのフォルダ内のPHPは普通のPHPとしては動かなくなるので注意。
--- まとめ ---
PHPをSSIでインクルードするにはCGIでPHPを動かす。
PHPファイルには#!/usr/bin/phpといった1行目が必要。
PHPファイルには実行権限を付ける
IncludesNoExec下で、<!--#include virtual=...-->でインクルードする場合は、拡張子を.cgiにするか、AddHander,AddTypeの二つを用いて、.phpの扱いを変更する。
--- その後追記 ---
こちらをご覧ください
---Apacheの関係する設定---
OptionsにIncludesは必須。これは普通のSSIと同じ。さて、ここで二つの場合がある。
Includesが指定されている場合 - すべてのSSIコマンドが使える。重要なのは<!--#exec cmd=... -->、<!--#exec cgi=...-->、<!--#include virtual=...-->の三つ。これらすべてが使える。 IncludesNoExecが指定されている場合 - 上記三つのうち、<!--#exec ...-->の二つのコマンドは利用できない。<!--#include virtual=...-->のみが使える。共用サーバーではよくある設定。
--- foo.htmlの設定---
SSI を利用するためには、どこかでAddHandlerを指定しないといけない。共用サーバーなら、.htaccessに書くことになる。パフォーマンス上は 良くないらしいけど、僕はshtmlという拡張子が好きじゃないので、.htmlをすべてSSI有効にしている。つまり以下のようになっている。アクセス のある程度多いWebならshtmlにして別にしたほうがいいと思う。 AddHander server-parsed .html これで.htmlファイルはすべてSSIが有効になって、<!--#....-->の部分が解析されるようになる。 foo.htmlの中身については後述。
--- foo.phpの設定とその中身 ---
.htaccess にAddHander php-script .phpとか書いておけば、通常PHPファイルはApacheがそれを.phpをPHPモジュールで処理してくれる。重要なのはこの場合実行属性は必要な いということ。ただし、今回は、CGIとして実行するわけで、PHPモジュールは動かない。と言うわけで、コマンドラインのPHPを使うことになる。 つまり、コマンドラインで
>./foo.php [ENTER]
として実行ときの実行結果が返されることになる。さて、普通の PHPファイルは実行属性はついていないので当然実行することはできない。なので755あたりのパーミションに変更する。これでうまくいくかというとそう いうわけにもいかず、スクリプトの最初の行に必要に#!/usr/bin/phpが必要になる。これがないとこのスクリプトを何で処理して良いのか分から ないので、うまくいかない。 というわけで、foo.phpはパーミッション755を付けて、中身はたとえばこんな感じ #!/usr/bin/php
--- foo.htmlの中身---
PHPのファイルをSSIでインクルードするにはどの方法が使えるのか。考えられるのはだいたい次のコマンド。 <!--#exec cgi="foo.php" -->
<!--#exec cmd="./foo.php" -->
<!--#exec cmd="php foo.php" -->
<!--#include virtual="foo.php" --> さて、まずはこれらすべてのコマンドが使えるという状況で、それぞれの違いについて。細かい違いはバージョンやプラットフォームで違うらしいので、重要なところだけ。
<!--#exec cgi="foo.php" -->の場合、PHPでContent-type: text/htmlを出力しないといけない。そうでないと失敗する。
<!--#exec cmd="foo.php"-->の場合は、Content-type: text/htmlの出力は必要ない。さらに引数を取ることもプラットフォームによっては可能らしい。<!--#exec cmd="foo.php arg1 arg2" -->のように。ただしSuexecを使っているUNIXやWin32では利用不可らしい・・・。
<!--#exec cmd="php foo.php" -->は、一応利用可能っぽいが、やっぱりSuexecが有効の場合にはつかえないっぽい。
<!--#include virtual="foo.php" -->はContent-typeの出力は必要ない。さらに引数も<!--#include virtual="foo.php?arg1=var1"-->というように指定可能らしい。
--- さらに設定が・・・ ---
こ れですべてうまくいくはずが、まだ考えなくてはいけないことがあった。IncludesNoExecを指定されている場 合、<!--#include virtual="foo.php"-->でしていするファイルのMimeタイプが重要になってくる。普通.phpファイルはMimeタイプとして
AddType application/x-httpd-php .php
の ように指定されている。ApacheはIncludesNoExecを処理するとき、その対象ファイルのMimeタイプを見て、それがtext/*でない とエラーにするというようになっている。なぜかは分からないがセキュリティ上の都合だろうか。そのままfoo.phpをvirtualに指定すると
unable to include potential exec
というエラーが出てしまう。直訳すると「潜在的なExecはインクルードできない」となる。これの対処方法は二つ。一つはfoo.phpをfoo.cgiにしてしまうこと。こうするとfoo.cgiは普通に実行されてその結果が返る。た だ、どうしてもphpファイルの拡張子は.phpがよいと感じたので、その方法も探った。まあ、簡単なことだけど、foo.phpのあるフォルダ の.htaccessに AddHander cgi-script .php
AddType text/html .php の2行を書く。ただしこうすると、そのフォルダ内のPHPは普通のPHPとしては動かなくなるので注意。
--- まとめ ---
PHPをSSIでインクルードするにはCGIでPHPを動かす。
PHPファイルには#!/usr/bin/phpといった1行目が必要。
PHPファイルには実行権限を付ける
IncludesNoExec下で、<!--#include virtual=...-->でインクルードする場合は、拡張子を.cgiにするか、AddHander,AddTypeの二つを用いて、.phpの扱いを変更する。
--- その後追記 ---
こちらをご覧ください