tthttpd がこんなに可愛いわけがない

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください