Author Archives: admin

PHPでLAN内やローカルホストからのアクセスで制御を分ける

PHPの$_SERVER[‘REMOTE_ADDR’]にはアクセスしてきた相手のIPアドレスが入ってくるのでこれによって分ければいい。

ネットワークアドレスが192.168.1.0/255.255.255.0の場合は以下のようにすればいいかな?

もっともまともな方法があるかも知れないけど・・・

Fedora10にKDEをインストールする

Fedoraのパッケージマネージャyumにはグループインストール機能がついているのでここではこれを使う。グループとはたくさんのパッケージをひとまとまりにしたものだと思う。

yumでgrouplistコマンドを使うと、インストールできるグループが表示される。

# yum grouplist

Available Groups:
Fedora Eclipse
GNOME ソフトウェア開発
GNOME デスクトップ環境
Haskell 開発
Java 開発
KDE ( K デスクトップ環境)
KDE ソフトウェア開発
LXDE
PostgreSQL データベース
SUGAR デスクトップ環境
X ソフトウェア開発
XFCE ソフトウェア開発
ウィンドウマネージャ
ウェブ開発
クラスタリング
ニュースサーバー
レガシーなネットワークサーバー
仮想化
教育用ソフトウェア
開発ライブラリ

このなかに KDE ( K デスクトップ環境) があるのでこれをyumのgroupinstallコマンドで指定してインストールする。

# yum groupinstall 'KDE ( K デスクトップ環境)'

インストールが終わったらログアウトして、ログイン画面の下にあるSessionからKDEを選んでログインすればいいです。

kde

KDE4がインストールできた。

FedoraのFirefoxでasx再生をvlcで行う

衆議院TVなどのasfのストリームをFedoraのFirefoxで見ると以下のようになって再生できなかった。
screenshot-wmpdynaasx-video-x-ms-asf-e382aae38396e382b8e382a7e382afe38388-mozilla-firefox
これをvlcで見れるように設定する。vlcはいろいろなフォーマットに対応した動画プレーヤー。ここではすでにインストールされているものとする。

まず衆議院TVの場合、コンテントタイプはvideo/x-ms-asfになるようなので、Firefoxの以下の設定のところで、このコンテントタイプのとき/usr/bin/vlcを起動するようにする。コンテントタイプとはhttpでデータが送られてくるときそのデータのヘッダとして送られて、そのデータがなんであるかを示すもの。

以下の設定のvideo/x-ms-asfのところの設定を変えて/usr/bin/vlcを起動するようにする。
screenshot-firefox-e381aee8a8ade5ae9a

vlcで開くようになった。

vlc-e383a1e38387e382a3e382a2e38397e383ace382a4e383a4e383bc

ただしvlcで音が出なかったので、以下のようにALSAにしたら音が出るようになった。Linuxの音関係は複雑でむずかしいなぁ。

screenshot-e8a8ade5ae9a

Windows 98 でIEが動かない

Windows98を新規にインストールして、IEを起動させると以下のようなダイアログになってIEが起動してくれない。

kkk

これはダイアルアップを想定してるので出てくるのだと思うが、今はほとんどLAN接続なので、これは必要ない。

IEを動くようにする

以下のようにすると直る。
コントロールパネルからインターネットオプションを選択する。
接続タブ接続ボタンをクリックする。
・あとは選択項目からLANを選択する。

Firefox 2を使う

Firefox 3はWindows98では動かないが、2なら動く。これを使えばインターネットには接続できるし、古いIEよりも安全で新しいページにも対応している。ここからダウンロードできる。

Linuxの実効ユーザIDについて実験してみた

Linuxのプロセス(実行中のプログラム)にはいろいろなIDが関わってくる。

・プロセスID(PID)
そのプロセスに付けされた番号、正の値。違うプロセスは違うプロセスIDを持つ。プログラム中から自分のプロセスIDを取得するにはgetpid()を使う。

・親プロセスID(PPID)
そのプロセスを起動したプロセスのプロセスID。getppid()で取得できる。

・実ユーザID(UID)
そのプロセスがどのユーザによって所有されているかを表す。プロセス開始時は親プロセスのUIDが引き継がれる。

・実効ユーザID(EUID)
これがよくわからないので、少し調べて見る。まず以下のCソース(showid.c)をコンパイルして実行して見る。

実効結果は以下

getpid() : 5005
getuid() : 506
geteuid() : 506

よってデフォルトでは実効ユーザIDはUIDと同じになる。

ところでLinuxにはset-user-IDという概念がある。passwdコマンドは/etc/passwdファイルを変更するが、このファイルはrootしか変更できない。しかしこのコマンドは一般ユーザが実行してもこのファイルを変更できる。passwdコマンドのファイル属性を見て見ると以下のようになっている。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 25700 2008-04-08 22:48 /usr/bin/passwd
$

そこでさっき作ったshowidの属性をこれと同じにして実行して見る。

$ gcc showid.c -o showid
$ su
パスワード:
# chown root:root showid
# chmod 755 showid
# chmod u+s showid
# ls -l
合計 12
-rwsr-xr-x 1 root root 5217 2009-01-23 09:52 showid
-rw-rw-r-- 1 ebisu ebisu 206 2009-01-23 09:34 showid.c
# exit
exit
$ ./showid
getpid() : 5240
getuid() : 506
geteuid() : 0
$

geteuidが0になった。これはこのファイルの所有者rootのUIDだろう。ところでEUIDが0になることはわかったがこれはどこで使われているのか?man credentialsを見て見ると、EUIDはメッセージキュー、共有メモリ、セマフォなどにアクセスする際にアクセス許可の判定に用いられるものらしい。しかしながらファイルのアクセス判定にはファイルシステムIDが用いられるようなので、passwdの例は適切ではないのかもしれない。ファイルシステムIDについてはあとで考えよう。

・保存set-user-id(saved set-user-id)
マニュアルには「set-user-idされたプログラムにおいて、プログラムの実行時に設定された実効ユーザIDのコピーを保存する」と書いてある。上の例で見たとおりset-user-idされたプログラムは実効ユーザIDがrootなので、0が保存されていることになる。さらにマニュアルには「set-user-ID プログラムは、実効ユーザ ID を実ユーザID と保存 set-user-ID の間で行ったり来たり切り替えることで、特権を得たり落としたりできる」とあるので、0であった実効ユーザIDを一般ユーザに戻したり、また0にすることができるということだろう。そして、現在の保存set-user-idはgetresuid()で取得できるようなので、showid.cを書き換えておこう。

これをコンパイルして普通に実行した場合は以下のようになる。

getpid() : 5410
uid : 506
euid() : 506
suid() : 506

set-user-IDして実行すると以下のようになる。

getpid() : 5453
uid : 506
euid() : 0
suid() : 0

とすればあと問題になるのはどーやって実効ユーザIDを切り替えるか、ということだが、これにはseteuid()を使えばいいようだ。そこでshowid.cを書き換えてみる。

これを普通に実行すると以下のようになる。

-------- default ----------
getpid() : 5770
uid : 506
euid() : 506
suid() : 506
-------- after seteuid(getuid())----------
getpid() : 5770
uid : 506
euid() : 506
suid() : 506
-------- after seteuid(suid)----------
getpid() : 5770
uid : 506
euid() : 506
suid() : 506

set-user-IDして実行すると以下。

-------- default ----------
getpid() : 5772
uid : 506
euid() : 0
suid() : 0
-------- after seteuid(getuid())----------
getpid() : 5772
uid : 506
euid() : 506
suid() : 0
-------- after seteuid(suid)----------
getpid() : 5772
uid : 506
euid() : 0
suid() : 0

実効ユーザIDを切り替えることができた。しかしseteuid()以外にも、setresuid()がありこれは実ユーザも保存set-user-IDも切り替えることができるみたいだ。こうなってくるとわけがわからなくなるのでこのあたりにしておこう。

もうひとつ気になるのは保存set-user-IDなるものは何のためにあるのかがよくわからなかった。プログラム実行時は実効ユーザIDと保存set-user-IDは常に同じになるはずだから、わざわざカーネルレベルで保存set-user-IDを持っておく必要性がよくわからない。きっと理由はあるか、勘違いしているだけだろうから、ここではもう考えないでおこう。

・ファイルシステムID
マニュアルによるとファイルシステムIDは、実効ユーザIDが変更されるたびにそれと同じ値にするそうなので、上のpasswdの例はこれで納得がいった。もちろんファイルシステムIDだけを変更することはできるようだが、ここではもうオシマイにしたい。

Windows 7 ベータがブルースクリーンで落ちる

Windows 7をVMWareにインストールして遊んでいたが32bit版でも64版でも以下のようなブルースクリーンになって落ちてしまう。

bs

この画面を見ると、落ちたときのメモリダンプをとっているようなので調べてみると、これらはC:\Windows\Minidump\に保存されていることがわかった。(参照

そこでこのダンプファイルを解析して、原因を突き止めて直したい。まずここ32bit版のDebugging Tools for Windowsを他のWindowsマシンにインストールした。ダウンロードしたファイルはdbg_x86_6.10.3.233.msi。

スタートメニューから、WinDbgを管理者で実行する。シンボルを読み込むために、[File]-[Symbols File Path…]を開いて、”SRV*c:\symbols*http://msdl.microsoft.com/download/symbols”を入力する。

symbol
次に、メニューから[File]-[Open Crush Dump File]を選択して、Windows 7のC:\Windows\Minidump\の中のあったファイルをこっちに持ってきて開く。

windbg

!analyze -v のところをクリックしてスタックダンプが得られた。

STACK_TEXT:
881de720 86fd3b93 badb0d00 00000002 83235040 nt!KiTrap0E+0x2cf
881de850 8727e58e 853b85d0 881de8bc 881de9b0 tdx!TdxEventReceiveConnection+0x2d3
881de8e0 8727d42b 852d90ac 000004c0 881de9b0 tcpip!TcpIndicateData+0x203
881de974 8727d87e 853c4008 853c4100 881de9b0 tcpip!TcpDeliverDataToClient+0x2fa
881de9c8 8727b06d 853c4008 853c4100 85c8a2b0 tcpip!TcpDeliverReceive+0x96
881de9f8 8727ac3b 34737feb 881dea1c 881dea4c tcpip!TcpTcbFastDatagram+0x27a
881dea54 8727b33f 852c6428 853c4008 001deac8 tcpip!TcpTcbReceive+0x108
881deabc 8727babc 852ad340 852c1000 00000000 tcpip!TcpMatchReceive+0x1fe
881deb0c 87261bc9 852c6428 852c1000 0000bd01 tcpip!TcpPreValidatedReceive+0x293
881deb28 87261def 852c6428 852c1000 881deb64 tcpip!TcpReceive+0x2d
881deb38 87298cae 881deb4c c000023e 00000000 tcpip!TcpNlClientReceiveDatagrams+0x12
881deb64 87298e57 87302f58 881debb8 c000023e tcpip!IppDeliverListToProtocol+0x49
881deb84 87299284 87302d68 00000006 881debb8 tcpip!IppProcessDeliverList+0x2a
881debdc 872981a5 87302d68 00000006 00000000 tcpip!IppReceiveHeaderBatch+0x1f2
881dec6c 87293824 85583568 00000000 00000001 tcpip!IpFlcReceivePackets+0xb98
881dece8 872f404a 855a49d8 85c8a2b0 00000000 tcpip!FlpReceiveNonPreValidatedNetBufferListChain+0x745
881ded1c 82eb4423 85c8a2b0 00000000 ffffffff tcpip!FlReceiveNetBufferListChainCalloutRoutine+0x11d
881ded1c 82eb4519 85c8a2b0 00000000 ffffffff nt!KiSwapKernelStackAndExit+0x13f
82f4e338 00000000 00000000 00000000 00000000 nt!KiSwitchKernelStackAndCallout+0x31

せっかくスタックダンプを持ってきたのに、ここに出てるモジュールはntとtcpipとtdxだけで、これ以上はよくわからなかった。

おわり

アプリケーションの起動や終了を監視していろいろできるKiwi application monitor

Kiwi application monitorは指定したアプリケーションを監視して、それを起動や終了を通知したり、メモリやCPUの使用状況を監視してアプリケーションを終了させたり、他のアプリケーションを起動させたり、Windowsをシャットダウンすることができる。

ここではwinampを監視して、winampの終了と同時にコンピュータの電源を切る設定をしてみる。

Kiwi application monitorを起動したらADDボタンをクリックする。
k1
ここで、Browseボタンをクリックして、C:\Program Files\winamp\winamp.exeを選択する。右側のテキストボックスには適当な説明文を入れ、[When it ends, turn off the computer]をチェックする。
k2

winampを起動してから終了すると以下のようなダイアログが表示され、コンピュータがシャットダウンされる。
k3

gzipを使って圧縮したファイルをマウントできるSQUASHFS

2012/4/16更新
SquashFSを使いファイルやディレクトリを圧縮して1つのファイルにし、そのファイルをリードオンリーでマウントすることができる。

まったく変更しないファイルに対してこの方法を使うとハードディスクを節約することができるし、そもそも変更を許したくないファイルには好都合だ。たとえばヘッダファイルなどに使えるかもしれない。この方法を使っても当然クライアントからは透過的に見える。

ここではUbuntu 10.04.4 LTSを使って行った。

インストール

mksquashfsコマンドをつかって圧縮ファイルシステムファイルを作成する。ディレクトリ/a/b/cに対して行う。

これでc.sqfsができたので、マウントしてみる。そのまえにcをリネームしておく。

これで、マウントできた。サイズは1/3になった。あとは/etc/fstabに記述して、自動でマウントするようにすればいい。以下の行を/etc/fstabに追加

確認する。

確認したら c-todelを削除する。

最後にここでは試さなかったがlzmaを使って圧縮することもできるらしい。またCopy-on-Writeを使って書き込みもできるようだ。

VMware playerのカーソルキーが機能しない

Fedora10にインストールしたVMware player 2.5.10においてゲストOSのカーソルキーがうまく機動しない問題。

どうやらバグのようです。とりあえずの直し方(ここを参照しました)

/etc/vmware/configを開いて以下を追加する。

 

[追記ここから]
上のようなことをしなくても、~/.vmware/preferences に以下の一行を追加すればいいようです。

xkeymap.nokeycodeMap = true

でもまだアンダーバーが入力できず縦バーになってしまう・・・