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 抜きの構成ですよね。
