Author Archives: admin

IEのmime typeの判定

IEに限らずブラウザを使っていると、ダウンロードしたいものなのに、ブラウザで開いてしまうことが起こる。ここではmp3を開いたときに、quicktimeのアドオンが起動する場合にこれをダウンロードするように直す方法を調べてみる。

一般的にはファイルの種類を知りたいとき、拡張子というのがあるが、Mine Typeはこの拡張子をもっと一般的にしたものだと思う。サーバーはブラウザからの要求に対して、Content-typeヘッダを返す。たとえばhtmlデータを返す場合は以下のようなヘッダを返す。

Content-type: text/html

サーバがどのようなContent-typeを返すかは、通常拡張子によって決まると思われる。apacheなどの場合はmod-mimeのAddTypeなどを使っていろいろカスタマイズできるのだろう。またPerlなどのCGIの場合には自分でContent-typeを指定することもできる。

IEがこのContent-typeを受け取ったときどう処理されるかはここなどに書いてあり、ここにも要約があるが、複雑みたいなので、ここでは勝手に解釈して作業を続行する。

問題のmp3の時、サーバはContent-typeとして、audio/mpegを返していた。これを調べるにはレスポンスヘッダを見れるダウンロードマネージャを使ったり、プロキシで見てみたりいろいろやり方はあるが、ここではスルー。

このaudio/mpegの時、IEがどう動くかだが多分レジストリーの
HKEY_CLASSES_ROOT\MIME\Database\Content Type\audio/mpeg
を見ているのだろう。で、このキーの中のCLSIDで指定されているGUIDのコンポーネントを起動しているものと思われる。ここでは
{4063BE15-3B08-470D-A0D5-B37161CFFD69}
になっていた。これ以上はCOMの話になると思うので詳しくは書かないが、ここからレジストリキー

HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}
をみて動作しているものと思われる。

そこでレジストリーから
HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}
を削除してみたら、mp3がquicktimeによるアドオン再生から、ダウンロードに変わって希望の動作ができたので終了。

ちなみにfirefoxの場合は、オプションのプログラムで設定できるものと思われる。
firefox-contenttype

javascriptでURLを解析

ここにあるparseUriを使ってみる。ソースは以下。

http://user:pass@www.example.com/dir1/dir2/file.php?aaa=111&bbb=222&ccc=333#anchor を解析してクエリーのaaaを取得する。

bashのリダイレクション 覚え書

コマンドラインプログラムは何らかのメッセージを出力する際、標準出力標準エラー出力の2から選ぶことができる。普通のメッセージは標準出力で、エラーを出力する場合は標準エラー出力を使う。

練習用に以下のファイル “redtest”を作成する。chmod 755して実行可能にしておく。

このスクリプトは標準出力に”standard”を出力し、標準エラー出力に”error”を出力する。

普通に起動すると、両方画面上に出力される。

$ ./redtest
standard
error
$

以下のように実行すると、標準出力はファイル s に保存されて、標準エラー出力は画面に表示される。

$ ./redtest > s
error
$

以下のように実行すると、標準出力は画面に、標準エラー出力はファイル e に保存される。

$ ./redtest 2> e
standard
$

2は標準エラー出力を表し、1は標準出力を表す。最初の例は 1> と書いても動く。

以下のように書くと、両方の出力をファイル a に保存する。

$ ./redtest > a 2>&1
$

2>&1 は「2を1と同じところに出力する」と読む。ここで以下の例を考える。

$ ./redtest 2>&1 > t
error
$ cat t
standard
$

これだとtには標準出力しか保存されていない。これは最初の 2>&1 で「2を1と同じところに出力する」がここではまだ1は画面なので、「標準エラー出力を画面に出力する」と解釈される。つまりその時さしている最終地点に直接結びつくと言うことだと思う。

さらに1個上の例で作ったファイルを見てみると、”error”の出力の方が先に来ているかもしれない。これはバッファリングに関係しているのだと思うがよく分からなかった。

.NETのFormClosingとFormClosed

フォームが閉じられるときの動作の覚書。

ユーザが閉じたとき

ユーザがフォームの右上のXをクリックした場合、WM_CLOSEが送られ、FormClosingが呼ばれる。引数のFormClosingEventArgのCloseReasonにはUserClosingが設定される。Cancelプロパティをtrueに設定すると閉じるのをやめることができる。
Cancelをtrueにしなければ続いてFormClosedが呼ばれる。この時点ではフォームはまだ生きているが閉じるのをやめることはできない。FormClosedの後にDisposeが呼ばれる。

タスクマネージャから閉じられたとき(タスクマネージャのアプリケーションタグからのときで、プロセスタブのときは違うと思われる)はCloseResonにTaskManagerClosingが設定される。

タスクマネージャはWM_CLOSEを送るだけだと思うが、アプリから終了した場合はSC_CLOSEが先に来るのでそこで分けられると思われる。

システムがシャットダウンするとき

Win32の整理。システムがシャットダウンするときまずアプリにWM_QUERYENDSESSIONが送れられる。誰かが0を返すと送るのをやめる(途中で0が来たら残りのアプリには送らないと思われる)。次にWM_ENDSESSIONを送る。これを送るアプリはWM_QUERYENDSESSIONを送ったアプリと思われる。つまりWM_QUERYENDSESSIONを送ったときすべてのアプリが非ゼロを返せばすべてのアプリということになる。このときこの2つのメッセージは一気に送るのか、1つのアプリに対して毎に2つ送るのかはよくわからない。WM_ENDSESSIONのWParamはWM_QUERYENDSESSIONの戻り値が返るのでアプリはシャットダウンするのかしないのか判断できると思われる。これら2つのメッセージにはLparamもあるがここでは0(シャットダウンORリスタート)を考える。

WM_QUERYENDSESSIONが送られるとFormClosingが呼ばれる。CloseReasonはWindowsShutDown。Cancelをtrueにすると。メッセージの戻り値が0に設定される(つまりシャットダウンがキャンセルされる)。この時点では当然FormClosedは呼ばれない。

次にWM_ENDSESSIONが送られる。WParamが非ゼロの時(シャットダウン実行)はFormClosedが呼ばれる。

フローチャート

[OSがシャットダウン開始]
       ↓
[WM_QUERYENDSESSION送られてFormClosing呼ばれる]
       ↓
[Cancel=falseのまま?]→NO[WM_ENDSESSION送られる]→[なにもなし]
       ↓ YES
[WM_ENDSESSION送られる]
       ↓
[FormClosed呼ばれる]
       ↓
[シャットダウン]

なので注意すべき点はFormClosingでCancel=trueするときは、最初にCancelすべきかどうかを済ませて、内部の変更を行うコードはそれ以降に書く、ということかな。

「めにゅ」を使ってYoutubeの高画質表示に切り替えるメニューをIEに追加する

できたものは一番下にあります。

ここへいってめにゅをダウンロードして実行する。

main

「プロジェクトの作成」をクリックして適当な名前を入力する。ここでは「Youtube高画質」とした。
proj

「コマンド作成」をクリックして、以下のようにコマンドを追加する。
commnad

作成されたコマンドをダブルクリックして編集する。デフォルトのものをすべて消して、以下のように入力する。

「テスト」をクリックして、コマンドをシステムに登録し、IEからYoutubeの動画ページを表示し、右クリックして、「Youtube高画質」をクリックして実験する。

実験が成功したら、ウインドウ左上のアイコンをクリックして、配布ファイルを作成し、*.infを右クリックしてから、インストールできる。

出来上がったもの。infファイルを右クリックしてインストールする。

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 /?