Linuxで洞窟物語を動かす

洞窟物語は横スクロールアクションゲーム。Linuxのを見つけたので動かしてみた。ただし日本語は表示できないみたい。

ここへいってlinuxdoukutsu-1.01.tar.bz2をダウンロード。

$ tar xfvj linuxdoukutsu-1.01.tar.bz2
$ cd linuxDoukutsu-1.01/
$ ls
Config.dat Profile.dat doc doukutsu.bin
DoConfig.exe data doukutsu libSDL-1.2.so.0
$

インストール作業は不要で、doukutsuを実行すれば動く。

$ ./doukutsu

screenshot-cave-story

wineを使ってDoConfig.exeを起動できる。

$ wine DoConfig.exe

screenshot-doukutsu-monogatari-settings

RubyでマルチプラットフォームなGUIアプリを作ってみる

Rubyを使いWindowsでもLinuxでも動くGUIアプリケーションを作ってみたい。作るアプリケーションは、引数としてプログラムパスを受け取り、一定時間経過後そのプログラムを実行するというシンプルなものにする。起動したらダイアログを表示し、カウントダウンタイマ付のボタンを用意する。ボタンは「はい」と「いいえ」とし、引数でタイムアウト時のデフォルト処理をしていする。タイムアウトすればデフォルトの処理が動き、ユーザがボタンをクリックすれば、希望の動作を行うようにする。GUIライブラリはtkを使う。

WindowsにRubyをインストール

ここからruby-1.9.1-p0-i386-mswin32.zipをダウンロード、C:\Ruby\に展開した。libフォルダのなかにtkがあるのでtkをインストール必要はないのだろう。

簡単なGUIプログラムが動くかテストしてみる。ここを参考に以下のようなファイルHello.rbを作る。

コマンドプロンプトを開き、実行してみるとまずいかのようなメッセージボックスがでた。

---------------------------
ruby.exe - DLL が見つかりません
---------------------------
ダイナミック リンク ライブラリ tk84.dll が指定されたパス c:\Ruby\bin;.;C:\WINNT\system32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32
に見つかりませんでした。
---------------------------
OK
---------------------------

コマンドの出力は以下のようなものだった。

C:\Work\Ruby>c:\ruby\bin\ruby hello.rb
c:/ruby/lib/ruby/1.9.1/tk.rb:6:in require': 126: 指定されたモジュールが見つかり
ません。 - c:/ruby/lib/ruby/1.9.1/i386-mswin32/tcltklib.so (LoadError)
from c:/ruby/lib/ruby/1.9.1/tk.rb:6:in
'
from hello.rb:3:in require'
from hello.rb:3:in

'

C:\Work\Ruby>

126というのはおそらくGetLastError()の戻り値だろう、そしてtcltklib.soは存在するので、これをLoadLibrary()したとき依存するtk84.dllが読めないということ?

tk.rbはあくまでtkを使うためのラッパーであってtkそのものはインストールしなければならないということだと思うのでここへ行ってActiveTCLをダウンロードする。といってもエラーはtk84.dllで出たので同じバージョンをダウンロードしよう。「Other System and Version」をクリックしてActiveTcl8.4.9.1.139183-win32-ix86.exeをインストールした。リブートご再び実行すると、以下のように起動できた。

hello

これで作り始める準備が整った。ここで作るのは最初に書いたように以下のようなイメージのアプリだ。

ところがここで問題が。Rubyスクリプトファイルをいくら書き換えても、最初に実験したHello.rbの内容が表示される。以下のような1行だけのファイルでも実行される。

Rubyのことはまだよくわかっていないが、これは何かのバグだろうか?どっかにキャッシュが残っているのだろうか?ググってもよくわからない。仕方ないのでいったんActiveTCLをアンインストールしもっと古いヴァージョンを使ってみる。

ActiveTcl8.4.17.0.283511-win32-ix86-threaded.exeをダウンロード、インストールし、リブートした結果、以下のように正常に動くようになった。

okn

よくみるとWindowsの場合と違ってクライアントエリアにもHello World!の表示がある。Windowsの方はインストールに失敗があったのだろうか?

よってWindowsはここで止めてFedora10に移る。rubyはインストールしてあるので以下のようにtkをインストールした。

# yum install ruby-tcltk

次に上のHello.rbを実行してみる。
screenshot-hellorb
実行できた。

あとは頑張って以下のプログラムを書いてみた。多分いい加減なところがいっぱいあるだろうが。

アプリの起動にはsystemメソッドを使っているが、これを使うと起動したアプリが終了するまで戻ってこなくなる。が、まぁいいや。以下のように実行できた。

$ ruby rubytk.rb gedit

screenshot-rubytkrb

C:\T>c:\ruby\bin\ruby.exe -Ku rubytk.rb notepad

tkwin

Fedora10のupdatedbを少なくする

Fedora10を使っているとやたらとマシンが忙しくなるのだが、それはupdatedbが動いているためだった。これはlocateプログラムがつかうデータベースを作るもので、locateプログラムとはファイル名の検索に用いられる。そのためファイルを全部走査してデータベースを常に更新する必要がある。

まずupdatedbがどのように実行されるのか調べてみる。

# which updatedb
/usr/bin/updatedb
# rpm -qf /usr/bin/updatedb
mlocate-0.21.1-1.i386
# rpm -ql mlocate
/etc/cron.daily/mlocate.cron
/etc/updatedb.conf
....
#

/etc/cron.daily/mlocate.cronがあるので、anacronから起動されることがわかる。だが/etc/updatedb.confでも設定できるかもしれないのでこっちを見てみよう。

このファイルは「変数=値」の形式で記述してupdatedbの動作を制御するもののようだ。しかしここでの設定はスキャンする対象を限定するためのもののようなので今は関係ない。

よってanacronの設定を変えるのだが、まずanacronとは何かを調べておこう。anacronはつけっぱなしじゃないマシンで自動実行するためのもののようで、cronよりも簡単に設定できるやつみたいだ。

/etc/cron.daily/に置いたファイルは1日毎に実行されるようだ。そしてcron場合は指定時間にマシンが起動していない場合は無視されるが、anacronの場合は一日に一回は起動するっていう意味になるのだと思う。

そこで今回は、/etc/cron.daily/mlocate.cronを/etc/cron.weeklyに置くことで対応しようと思う。

# mv /etc/cron.daily/mlocate.cron /etc/cron.weekly/

GetLastErrorで取得した番号をFormatMessageで文字列に変換する

MFCのCStringバージョン。
GetLastErrorの値を上書きされないために、変な宣言になってる。

一部はMSのサイトに載ってたもので、詳しくは調べていない。

Windows2000のコマンドプロンプトでTABキーによる補完を行う。

お約束:レジストリをいじるとシステムが壊れたりします。

以下の内容を”2ktabhokan.reg”などとして保存し、実行する。

CompletionCharはフォルダの補完で、PathCompletionCharはファイルの保管。9はタブキーを表す。この設定はHKEY_LOCAL_MACHINEを変えるので、システム全体の設定。ユーザごとの設定の場合はHKEY_CURRENT_USERに置き換える。

これを実行しなくても、コマンドプロンプトから以下のようにすれば補完機能を有効にできる。デフォルトは無効で起動されている。

>cmd /f

この場合、CTRL+DやCTRL+Fで補完できる。

詳しくは以下のコマンドで確認できる。

>cmd /?

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

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

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

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