My Daily Programming Life...

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があまりにも一般化して、よくわかっていないプログラマでもアプリケーションが作れる状況になっているのは、よい面も悪い面もあるように思う。
feedSubscribe to my feed