流行のスクリプト言語を使うウェブアプリケーションフレームワークで遊んでみた。

OSC2012 愛媛でEjectコマンドユーザ会の展示を見てインスパイアされた(ことにする)。
#方眼紙に飽きたとか言わない。
 
Ejectコマンドユーザ会
http://eject.kokuda.org/
 
イケメンの某氏と立ち話で「Windowsとか安い端末で実装されてるといいよね。」などと
OSCらしくない他力本願寺なことを零してしまったので、反省して自分で実装することにした。
#EjectコマンドがLinuxのコマンドだと後で知ったくらいなので申し訳ない。
 
Windows上でサーバを立てることになるわけだけど
本家がPHPLinuxコマンドを叩いているのもあって
流行りのP系言語のフレームワークとか使うのがカッコイイよねぇと思う。
 
ということで探してみた。
 
PowerShell Ad-Hoc Web Server (paws)
http://paws.codeplex.com/
 
これが何かというと今最もホットなスクリプト言語であるPowerShellのみで実装された
Webフレームワークである。
Windows7上であればこのスクリプトだけでサービスが提供できる(らしい)。
#素のPowerShellでソケット叩いてます。
 
解凍したらすぐ動くと期待していたのだが色々エラーが出た。
スクリプト文字コードが違うらしい。
ってことで秀丸の欧州コードで読んでUTF-16で保存する応急処置。
 
そうすると普通に動いた。すばらしい。
 
で、「run-test-form.ps1」と「WebApp.TestForm.ps1」を改変してサーバアプリを書いてみた。
「WebApp.Eject.ps1」が以下のようになる。
EjectにShell.Applicationを使うのが定番らしいのだが、Closeが出来なかったので
VB4以来COM好きの私としてはWMPlayer.OCXを使用した。
 
もし、興味がある人は試してください。
必要ないと思いますが、要望あれば他のソースも出すかもしれません。
 


. .\Lib.WebPage.ps1


#====================================================================
#
#		EJECT WEB APPLICATION
#
#====================================================================


#--------------------------------------------------------------------
Function Get-HtmlEjectForm
{
@"
<FORM action="eject-form" method="GET">
<P>
	<INPUT type="submit" value="Eject">
</P>
</FORM>
"@
}

#--------------------------------------------------------------------
Function Get-HtmlCloseForm
{
@"
<FORM action="close-form" method="GET">
<P>
	<INPUT type="submit" value="Close">
</P>
</FORM>
"@
}

#--------------------------------------------------------------------
Function Let-CDROM-Eject
{
$wmp = New-object -COM WMPlayer.OCX
for($i = 0; $i -lt $wmp.cdromcollection.count; $i++) {
  $wmp.cdromcollection.item($i).eject()
}
}

#--------------------------------------------------------------------
Function Let-CDROM-Close
{
$wmp = New-object -COM WMPlayer.OCX
for($i = 0; $i -lt $wmp.cdromcollection.count; $i++) {
  $wmp.cdromcollection.item($i).eject()
  $wmp.cdromcollection.item($i).eject()
}
}

#--------------------------------------------------------------------
Function Process-Web-GET
{
	param
	(
		  [psobject] $WebRequest
	)

	[psobject] $WebResponse = New-WebResponse
	$WebResponse.WebRequest		= $WebRequest
	$WebResponse.Resource		= $null
	$WebResponse.ResponseCode	= "501 Not Implemented"

	# Construct the request path.
	[string] $ResourcePath = $WebRequest.WebServer.ApplicationFolder
	[string] $ResourceName = $WebRequest.ResourceName
	[string] $html = ""

	if( $ResourceName -eq "" )
	{
		# Show the test form.
		$html = ""
		$html += Get-HtmlHeader $WebRequest "Test Form" ""
		$html += Get-HtmlEjectForm
		$html += Get-HtmlFooter $WebRequest ""
	}
	elseif( $ResourceName -eq "eject-form" )
	{
		# Eject !
		Let-CDROM-Eject
		$html = ""
		$html += Get-HtmlHeader $WebRequest "Test Form" ""
		$html += Get-HtmlCloseForm
		$html += Get-HtmlFooter $WebRequest ""

	}
	elseif( $ResourceName -eq "close-form" )
	{
		# Close !
		Let-CDROM-Close
		$html = ""
		$html += Get-HtmlHeader $WebRequest "Test Form" ""
		$html += Get-HtmlEjectForm
		$html += Get-HtmlFooter $WebRequest ""

	}

	if( $html -ne "" )
	{
		$WebResponse.Resource = New-Resource
		$WebResponse.Resource.Root = ""
		$WebResponse.Resource.Path = $WebRequest.ResourceName
		$WebResponse.Resource.Name = ""
		$WebResponse.Resource.Mime = "text/html"
		$WebResponse.Resource.Data = AsciiString2Bytes( $html )
		$WebResponse.Resource.Size = $WebResponse.Resource.Data.Length
		$WebResponse.ResponseCode = "200 OK"
	}
	else
	{
		$WebResponse.ResponseCode = "404 Not Found"
	}


	if( $WebResponse.Resource -eq $null )
	{
		# Not found
		$WebResponse.ResponseCode = "404 Not Found"
	}
	
	# Send the response.
	[bool] $b = Send-WebResponse $WebResponse $true
	if( $b -eq $false ) { return $false }

	# Return, OK
	return $true
}

 

    • -

Powershell習作「EjectコマンドをWindows上に実装してみた」が仮タイトルでした。
タイトルでネタバレはねぇ。