tthttpd がいろいろ楽しそうな事になっているので、Windows7 + MinGW 環境でビルドして遊んでみた。
設定ファイルは説明不要なくらいシンプルで綺麗。
[global] port=7749 root=./htdocs indexpages=index.html,index.cgi,index.pl,index.py,index.rb,index.vbs,index.php,index.sh,index.exe charset=utf-8 [mime/types] cgi=@bin/perl/perl.exe pl=@bin/perl/perl.exe py=@bin/python/python.exe rb=@bin/ruby/ruby.exe vbs=@cscript.exe /nologo ps1=@powershell php=@bin/php/php-cgi.exe sh=@bin/sh.exe exe=@bin/sh.exe -c
mime/types の上から、Perl、Python、Ruby、VBScript、Windows Power Shell、PHP、シェルスクリプト、実行形式バイナリ(onシェル) を指定している。
以下のテストスクリプトが、それぞれ動作した。
- Perl
#!/usr/bin/perl print "Content-type:text/html;\n\n"; print "<h1>Hello,Perl!</h1>\n";
- Python
#!/usr/bin/python # -*- coding: utf-8 -*- print "Content-Type:text/html" print print "<h1>Hello, Python!</h1>"
- Ruby
#!/usr/bin/ruby # encoding: utf-8 puts "Content-type:text/html" puts "" puts "<h1>Hello,Ruby!</h1>"
- VBScript
Option Explicit Dim objStdIn, objStdOut Set objStdIn = WScript.StdIn Set objStdOut = WScript.StdOut Dim strFromStdIn objStdOut.WriteLine "Content-type: text/html" objStdOut.WriteLine "" objStdOut.WriteLine "Hello,VBS" objStdIn.Close() objStdOut.Close() Set objStdIn = Nothing Set objStdOut = Nothing
- PHP
<?php echo "Hello,php!"; ?>
- シェルスクリプト
#!/bin/sh echo "Content-type:text/html" echo echo "<H1>Hello,Shell Script!</H1>"
- 実行形式バイナリ
C コンパイラでビルド後、exe として配置し、sh に -c で投げてやる。
#include <stdio.h> int main() { puts("Content-type:text/html"); puts(""); puts("<H1>Hello,Binary!</H1>"); return 0; }
ちゃんと動いてくれてるなぁハァハァ。実行形式バイナリと似たような考えで、BAT ファイルを cmd.exe に投げてみようとしたんだけれども、どうも Windows は標準入出力の感覚がめちゃくちゃのようで上手くいかない。VBScript もすごく醜い記述に。
tthttpd で簡易 GUI アプリ
作り手にとって、まあまあ便利*1なのにあまり日の目を見ない HTML アプリケーション (HTA) にインラインフレームを埋め込んで*2、ローカルサーバ(tthttpd)にアクセスさせる。
好きなスクリプト言語を用いて開発が可能で、サーバがローカルだろうとリモートだろうと柔軟に対応出来る。また、通常の GUI アプリケーション開発に比べて、HTML5、CSS、JavaScript/Ajax、Flash といった豊富なコンテンツデザイン要素、およびインタラクティブな表現をより容易に実現する事が可能。
<html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>新しいアプリケーション 1</title> <hta:application APPLICATIONNAME="appname" VERSION="1.0" SINGLEINSTANCE="yes" SHOWINTASKBAR="yes" NAVIGABLE="no" WINDOWSTATE="normal" BORDER="dialog" INNERBORDER="no" BORDERSTYLE="normal" CONTEXTMENU="no" SELECTION="no" SCROLL="no" SCROLLFLAT="no" CAPTION="yes" ICON="" SYSMENU="yes" MAXIMIZEBUTTON="no" MINIMIZEBUTTON="yes" /> <style> * { margin: 0px; padding: 0px; background-color: threedface; } </style> </head> <body> <iframe border="0" width="100%" height="100%" src="http://127.0.0.1:7749/hoge.cgi" > </iframe> </body> </html>
上のような HTA ファイル IFrame.hta を準備しておき、次の起動スクリプトを RunUI.vbs として保存。
Dim oShell Set oShell = WScript.CreateObject("WScript.Shell") ' HTTP サーバを起動 Call oShell.Run("bin\tthttpd.exe -c etc\tthttpd.conf",0) ' インタフェイスを起動(終了するまで待機) Call oShell.Run("IFrame.hta",1,TRUE) ' インタフェイスを閉じたら、サーバも終了 Call oShell.Run("taskkill /im tthttpd.exe",0)
RunUI.vbs のショートカットをデスクトップに配置し、アイコンをオシャレなものに変更しておけば、ユーザ側からは普通(?)のスタンドアロンバイナリアプリケーションと見た目、変わらないハズ。
ローカルサーバは、X Window サーバだって IM サーバだってやっている事なので珍しくはないが、生粋の Windows アプリケーションではあまりお目にかかれないのが不思議。
もちろん、三次元 CAD のような多量のデータをリアルタイムで描写するアプリケーションなどでは、この形態は不向きだけれども、簡単なデータ管理やレポート作成システム程度なら、このような形もアリなんじゃないかなあ、と思った。
*1:ただし、Trident 依存。
*2:Windows 上では見た目上、スタンドアロンな GUI アプリケーション、その他の OS で使う場合はウェブブラウザから使うアプリケーション、といった雰囲気かな。
※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。これって Electron の Chromium 抜きの構成ですよね。