2014年5月3日土曜日

PHP: Windowsでもreadlineを邪悪にエミュレートするreadline_exを書きましたとさ

PHPのreadlineWindowsではふつーは使えません

でも、PHPのコードだけ(本当のような嘘)でreadlineするクロスプラットフォーム()readline_exは以下のように邪悪な実装を行う事で実現できます。

evil code:

このコードはWindowsにも対応したreadlineを実現()するreadline_exを定義しています。PHP_OSの前方3文字がWINである場合にはreadlineの代わりに邪悪なPHPコード()を実行してWindowsプラットフォームでも特にPHPの他に何も必要とせずにreadlineをエミュレーションします。

echoでプロンプトを表示した後、何故か file_put_contents で呪文を唱え、どこからともなく`tmp.bat`を実行した結果を得て、さり気なくそんなファイル無かった事にunlinkしています。

中身は tmp.bat としてWindowsで実行可能な.batファイルに set /p を仕込んで、そこでユーザーからの入力を待機、得させた結果を、echoで出力させます。これをPHPから実行演算子により評価し、ユーザーからの入力を得て、 tmp.bat は何事も無かったかのように削除しています。

この方法で得た入力には改行がくっついて来るのでPHPで入力を受け取る際に trim でしれっと無かった事にしています。

邪悪ですが、 readline を使った対話的なコンソールアプリの開発はプログラミング学習の基礎として題材に扱いやすいものです。

PHPを教えなければならないが、学生に対話的なUIをreadlineを用いて勉強させる為に、それまでずっとWindowsしか使って来なかった学生に仮想マシンとかCygwinとかMinGWとか用意させたり、あるいはどこかに非WindowsのPHPテスト環境のサーバーを用意したり、そういう事をするまでもないのに、という場合に、もののついでに邪悪なプログラムの深淵を垣間見せたりして話題にするのも面白いかな、と思い書いてみました。

安直にこうすればできるっていう話ではなくて、こんな邪悪な、そしてそれがどうして邪悪か、そういうはなしを学生にできればいいかな。

0 件のコメント:

コメントを投稿