移転しました。
2013年2月〜
http://kanonji.info/blog/

2008年11月〜2013年1月
http://d.hatena.ne.jp/kanonji/

はてなダイアリーに移転してたけど、そっからさらにWordPressでのブログに移転しました。
 
201302061607
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
別窓 | スポンサー広告
----------
Windows用ポータブルwebサーバ Apache Mobile
Blackdot.be :: Run Apache From USB

USBに入れて持ち歩けるApache。
スペックは以下の通り。

Features:

* Management Application
* Apache 2.2.x
o mod_deflate
o mod_ssl
* mod_security
* mod_perl
* PHP 5.1.2
* Perl 5.8

Requirements:

* Windows 2000, Windows XP or Windows 2003
* 256mb USB-key



PHPやPerlが組み込まれている上に、サイトには書いてないがSSLとwebDAVも組み込まれている。
256MBの容量があるUSBフラッシュメモリ等に入れておけば、Windows2000以上のPCがあれば直ぐにwebサーバが立ち上がる。
webアプリのデモやプレゼン、簡易の開発環境として使えそうという紹介をちらほら見かける。

PHPのちょっとしたツールの開発に使ってみたが、自分のWindowsマシンにApache入れてPHP入れてとしなくても良かったので確かに便利だった。
ただ、WindowsのPHPだからなのか、それともApache Mobileという特殊環境だからなのか、PHPの挙動が少しおかしい点があった。

変な挙動1:exec, system, shell_exec等を使う場合のファイルパスのあたり

Windowsサーバでexecコマンドなどを使う場合、シェルはDOSコマンドになる。
DOSコマンドでスペースを含むファイルパスを記述する場合、以下のように「"」で囲む必要がある。

"C:\Document and Settings"

逆に半角スペースを含まないファイルパスの場合「"」で囲っても囲まなくても問題は無い。

"C:\Windows"
C:\Windows

execコマンドで実行したいexeや引数としてファイルパスを渡す場合に半角スペースを含むならば、上記のように「"」で囲まなければならない。

おかしい挙動はここからだが、なぜか「"」で囲む必要が無い場合に囲むとうまくコマンドが実行されないといった動きがある。
具体例を挙げると以下のようになる。

下記からexec($cmd), system($cmd), shell_exec($cmd)などを実行する。

NGな例
$cmd = '"C:\example.exe" -a';
$cmd = 'C:\example.exe -a "D:\folder\example.txt"';
$cmd = 'C:\Program files\example.exe -a';
$cmd = 'C:\example.exe -a D:\My folder\example.txt';

OKな例
$cmd = 'C:\example.exe -a';
$cmd = 'C:\example.exe -a D:\folder\example.txt';
$cmd = '"C:\Program files\example.exe" -a';
$cmd = 'C:\example.exe -a "D:\My folder\example.txt"';

ファイルパスに半角スペースが必ず含まれる・含まれないと分かっている場合は回避できるが、実行毎に変わる場合に非常に困ることになる。

変な挙動2:\3を消すpreg_replace

これもファイルパスだが、文字列としてファイルパスをpreg_replaceしたときに起こった。
例えば以下のような文字列を置換対象(subject)としてpreg_replaceすると、\3が消えてしまう。
もちろん、\3の部分は置換とは無関係でも。

"c:\example\3test.jpg"

具体例で説明すると以下のようになる。

$pattern = '/\.jpg/';
$replacement = '.gif';
$sucject = 'c:\example\3test.jpg';
$result = preg_relace($pattern, $replacement, $sucject);
echo $sucject;
echo $result;

"c:\example\3test.jpg"
"c:\exampletest.gif"


とりあえずは上記2つの挙動を除けば、一応普通に使えている。
上記2つの挙動がApache Mobile固有なのか、Windows上のApache+PHPだからなのかは、あまり検証していないので分からない。
スポンサーサイト
別窓 | 開発環境 | コメント:0 | トラックバック:0
200704140851
webDAVまとめ
webDAVはHTTPを拡張して策定され、FTPの後継としてPCやサーバ間でのファイル転送が行えるシステム。
実際には単にFTPの代わりのファイル転送ではなく、もっと深い役割があるようだけど。

WebDAV(Web-based Distributed Authoring and Versioning)はウェブを使った分散オーサリングとバージョン管理のプロトコルである。



Wikipediaによると一言で上記らしいが、とりあえずの用途としてFTPの代わりとして使いたいと思った。
FTPはなんとなく古いし、使いやすくてかっこいいクライアントソフトもないしで、どうも好きになれず。
ただ新しいということでかっこよさを秘めているwebDAVに興味がわきわきしたというわけです。

webDAVの現状大きな問題点といえば、日本語やその他マルチバイト言語を扱う場合、文字コードが指定できないらしい点。
HTTPはヘッダーに文字コードを書いて送信できるが、webDAVにはそういう仕様になっていないらしい。
これはちょっと聞きかじっただけで調べてもいないけど、実際に現状の実装では日本語の扱いが問題になっている。

今のところの使えそうなwebDAVサーバ

・Apache + mod_webDAV
・lighttpd + mod_webDAV
・IIS
・04WebServer

まずwebサーバの代表であるApache、そしてlighttpdはおそらく一緒くたにしてもかまわないと思うが、基本的にはLinux上にサーバを設置することが多いと思う。
その場合、Windowsクライアントから利用すると文字コードが違い文字化けしてしまう。
それを回避するため、WebDAV Resources JPの有志の方が作ったらしいmod_encodingを使うが、ここを見ると対応バージョンも多くは無くつぎはぎ的な印象を受ける。
lighttpdもmod_encodingが使えるらしいが上記サイトでは配布されていないようだ。もしかしたらapache用のものが使えるのかもしれないが、その辺は不明。

一応、Apache2 + mod_webDAV + mod_encoding + Linuxはそれなりに実績があるようだが、Windows上にサーバを設置する場合はどうなるだろうか。
残念ながらweb上にはそういったドキュメントは見当たらなかった。

Windows上にwebDAVサーバを設置する場合、IISか04WebServerのどちらかが良さそう。
IISはマイクロソフト製で、流石にIISとwindowsクライアント間の通信で文字化けといったトラブルは発生しなかった。
逆にIISとLinuxクライアント間はどうなるかが心配ではある。

04WebServerはいわゆるフリーウェア(今はGPLにてオープンソース化している)のサーバソフトウェアで知名度はほとんど無いが、WindowsでwebDAVサーバについて調べていると、たまに名前を見ることがある。
これも04WebServerとLinuxクライアント間で問題が無いかは未知数だが、少なくともWindowsクライアントとのやり取りは書き込み等を見る限り出来そう。

lighttpdは最近RoRの影響で知名度が上がっている、名前のとおり軽量なwebサーバらしいが、WindowsにインストールするにはCygwinを使う必要がある。
Cygwinは使いこなせば便利だけど、どうもひとつのアプリケーションだけのためにとりあえず入れるにはちょっと重たい。
後々困ったことにもなりそうだし。

と思ったら、公式ではないがCygwinなしで(cygwin.dllは同梱しているが)動作するlighttpdのバイナリを配布しているところがあった。
mod_webDAV用のDLLも付属していたのでこれはと思ったが、文字化けが発生してしまった。
このWindows用lighttpdの場合、モジュールはすべてDLLとして提供されているので、通常の.soファイルでは組み込めない。
そのためmod_encoding.soも適用出来ないことになる。

クライアントのほうに目を向けると、WindowsXPでは標準でwebDAVクライアント機能が搭載されている。
ネットワークプレースという機能で、webDAV以外にもFTPなどをUIとしてはローカルにアクセスしているのと同じように使えるという、目指すもの自体はすばらしい機能。

昼間のメモ WindowsのWebDAVクライアントからの文字コードについてによると、このネットワークプレース機能が扱う文字コードはバージョンによって異なるという。
webDAVがまだ新しい仕組みなので仕方が無いのかもしれないが、これもまた混乱の1つの原因になってそう。

大きく分けて3パターンあるようだ。

・MS932のMBCS形式。ただし一部記号はURLEncodingされる。
・UTF-8のMBCS形式。ただし一部記号はURLEncodingされる。
・UTF-8のURLEncoding形式。

バージョンの新しいほうは、UTF-8のURLEncoding形式になっているので、これに落ち着くんじゃないかな~と思うが胴なんだろうか。

前述のmod_encodeingの設定も、ネットワークプレース機能のバージョンを見て、それぞれ適切な設定を行う必要がある。
ちなみにmod_encodingのサーバ側文字コードはUTF-8固定となっている。
であれば、Apache2 + mod_webDAV + mod_encodingな構成でwebDAVサーバを設置した場合、mod_encodingを通すことでApacheはすべてUTF-8で受け取っていることになる。
もしかしたらApache2 + mod_webDAVなwebDAVサーバと、UTF-8のURLEncoding形式をとるネットワークプレース機能の間のやり取りなら、mod_encoding不要なんじゃないだろうか。
Windows・Linuxどちらに設置してもUTF-8で扱うんだから、そういうことになりそうなんだけど。

今度時間をみつけて、Apache2 + mod_webDAV + Windowsをやってみたいと思う。
別窓 | 未分類 | コメント:1 | トラックバック:0
200703052200
| プログラマのチラシの裏 |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。