<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ タグ「CGI」を含む投稿［3件］ - でんげき☆ Network Service ]]></title>
	<link>https://room.dengeki.jp/tegalog.cgi</link>
	<description><![CDATA[ Raspberry Pi 4 で運用実験中 ]]></description>
	<language>ja</language>
	<copyright>Copyright 2025</copyright>
	<lastBuildDate>Thu, 05 Jun 2025 14:05:45 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" rel="noreferrer" target="_top">てがろぐ</a> Ver 4.4.5 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Windows の BAT ファイルで CGI しよう ]]></title>
	<description><![CDATA[ Windows の BAT ファイルで CGI しよう<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20220103162756-admin.png" alt="20220103162756-admin.png"><br />　<br />ぺけぽんっていうか Windows XP の頃にあまりにも怒り心頭になって勢い Microsoft に三行半を叩きつけてからずっと Linux な生活の日々なんですが…まぁそうは云いつつ Windows も使える事をアピールしておかないとオファーが来ないんでって感じなんで今回は Windows 的な話題っていうか BAT ファイルを CGI にしちゃおう！って解説です（汗<br /><br />つーか初っ端から言い訳を並べるっていうか…我が家の Windows 機は 2015 年くらいに発売された 2 万円くらいの 8 型 Windows 10 タブレットって事なんでものすっごい低スペックです　リソースなんて OS を起動するだけで使い果たしちゃう感じなんで新たにアプリケーションとか入れる余裕が全くありません　なんか Windows でも CGI を動かす時は Perl や Python なんかを導入してるようですが…そんなんが入る空きなんてこれっぽっちも無いんで「それじゃ今あるもので何とかするか」ってことで標準的に使える BAT ファイルを引っ張り出してきた感じですかね（泪<br /><br />世間的には Windows の Web サーバは Apache や IIS がよく使われている感じ？らしいですが…もちろんその辺を入れる余裕がないんで軽量コンパクトな Web サーバとして有名だった AN HTTPD を microSD に入れて一時的なテスト環境をざっくり構築してみました　ただ AN HTTPD はかなり前に開発が終了しちゃってるらしく正規のルートでは配布されていないらしい？　まぁとりあえず <a class="url labeledlink" href="https://www.google.com/search?q=anhttpd+download" rel="noopener noreferrer" target="_blank">anhttpd download</a> なるキーワードでぐぐってみたらどうにかなったけどお約束っていうかこの辺は自己責任でお願いします<br /><br />　　：<br /><br />あーあと殆ど大半の方には関係のない話っていうか Windows の BAT ファイルを Linux で作ろうとすると色々と不都合が発生するようです…いや発生しました　ごくシンプルにっていうか <span class="decorationC" style="color:green;">@echo off</span> とだけ書いた BAT ファイルすら動かない致命的な不都合でありつつ原因に気付くまで結構かかりました orz<br /><br />まずは改行コードです　Windows 系列の改行コードは「CR+LF」なのに対して Linux 系列の多くは「LF」のみとなっていて…この改行コードの違いが問題になります　ちなみに Mac OS では「CR」な改行コードを吐くものもあるとか？？<br />Windows のみで開発していれば（ほぼ）気にする必要はないようですが…他の OS 上で書いた場合は改行コードの違いに要注意です<br /><br />お次は文字コードです　これもうっかりやらかしたっていうか Linux 上で何気に UTF-8 で書いた BAT ファイルを Windows に持ってきてテストしたらうまく動きませんでした<br />この文字コードの問題は改行コード以上に呪わしいっていうか…例えば Windows 標準の「メモ帳」を使用したとしてもバージョンの違いによりデフォルトの文字コードが Shift-JIS (ANSI) だったり UTF-8 だったりするので注意する必要があります<br /><br /><img class="embeddedimage " width="800" height="800" src="https://room.dengeki.jp/images/202201031627564-admin.png" alt="202201031627564-admin.png"><br />なお我が家の Microsoft Windows &#91;Version 10.0.19042.1348&#93; に付属のメモ帳ではデフォルト文字コードが UTF-8 だったようですが…いつの間にかメモ帳も進化したのか保存時に文字コードを選択できるようになってました　ちなみに ANSI ってやつが Shift-JIS っぽいですね<br /><br />つーかそもそもコマンドプロンプトで使用する文字コードが Shift-JIS (ANSI) だって保証がどこにも無いみたいです　我が家は（たぶん）何も設定していないので Shift-JIS (ANSI) になってましたが…これを他の文字コードに設定することも可能のようです<br /><br /><img class="embeddedimage " width="800" height="800" src="https://room.dengeki.jp/images/202201031627563-admin.png" alt="202201031627563-admin.png"><br />単に現在の文字コードを確認するだけなら「コマンドプロンプト」のタイトルバーを右クリックして「プロパティ」を参照するといいでしょう<br />もし他の文字コードに変更したい場合は <span class="decorationC" style="color:green;">chcp</span> コマンドを使います　単に <span class="decorationC" style="color:green;">chcp</span> とした場合には現在の設定値を表示します　変更したい場合は <span class="decorationC" style="color:green;">chcp 番号</span> という感じで番号を指定します　代表的なものだと「ANSI/OEM 日本語;日本語 (shift-jis) が <span class="decorationC" style="color:red;">932</span>」で「EUC 日本語が <span class="decorationC" style="color:red;">51932</span>」で「Unicode (UTF-8) が <span class="decorationC" style="color:red;">65001</span>」となるようです　この辺の <a class="url labeledlink" href="https://docs.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers" rel="noopener noreferrer" target="_blank">コードページ識別子の一覧</a> が公式(？)にあったんで参考になるかも？　ちなみになんか面倒くさそうだったんで実際に変更して試してないんで今後は Shift-JIS (ANSI) で話を進めます（瀧汗<br /><br />　　：<br /><br />さて…その辺の注意事項もろもろを無事にクリアしたところで実際に BAT ファイルを CGI として動かしてみましょう<br /><br /><img class="embeddedimage " width="590" height="735" src="https://room.dengeki.jp/images/202201031627561-admin.png" alt="202201031627561-admin.png"> <img class="embeddedimage " width="590" height="735" src="https://room.dengeki.jp/images/202201031627562-admin.png" alt="202201031627562-admin.png"><br />とりあえず AN HTTPD に CGI の設定をしましょう…っていうか特に何もしなくても動くっぽい？<br />我が家では拡張子「.bat」に対する「実行プログラム」を「<span class="decorationC" style="color:red;">空欄</span>」もしくは「<span class="decorationC" style="color:red;">c:\windows\system32\cmd.exe /c</span>」で動作しました　テストする環境が無いんで IIS (Internet Information Services) 等では試せてないのですが…おそらくそっちも「.bat」に対する設定で「<span class="decorationC" style="color:red;">(空欄)</span>」もしくは「<span class="decorationC" style="color:red;">c:\windows\system32\cmd.exe /c</span>」を設定すれば動くのかなーって思ってます　この辺はどなたか実際に試して教えて頂きたい感じですね　※ご連絡頂いたんで…本記事の最下部くらいに設定法などを転載してあります<br /><br />そんな設定が済んだ所で…それじゃ実際に BAT ファイルを作って試してみましょう　以下のバッチファイルを適切な改行コードと文字コードで保存した後に Web サーバのドキュメントルート以下に配置してブラウザからアクセスしてみましょう<br /><br />----- bat_cgi01.bat -----<br /><br />@echo off<br /><br />REM ブラウザに「Content-type:」を出力する（単純なTEXTファイル用）<br />echo Content-type: text/plain; charset=Shift_JIS<br />echo.<br /><br />REM Windows のバージョンを表示　※空行も表示されている<br />ver<br /><br />REM 環境変数に設定されている CPU の種類を表示<br />echo %PROCESSOR_IDENTIFIER%<br /><br />echo.<br /><br />REM 現在日時を date と time コマンドで表示<br />echo. | date<br />echo. | time<br /><br />echo.<br /><br />REM 必要な所だけ抽出してみる<br />echo. | date | find &quot;現在の日付&quot;<br />echo. | time | find &quot;現在の時刻&quot;<br /><br />echo.<br /><br />REM 環境変数でも現在日時を取得できるっぽい？？<br />echo %DATE%<br />echo %TIME%<br /><br />echo.<br /><br />REM 日付が設定されている変数から「年月日」を取得してログファイル的なファイル名を作ってみる<br />echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log<br /><br />----------<br /><br /><img class="embeddedimage " width="782" height="575" src="https://room.dengeki.jp/images/202201031627569-admin.png" alt="202201031627569-admin.png"><br />正しく動作すればこんな感じの内容がブラウザに表示されます<br />今回は単純なテキストを表示するのに適した「<span class="decorationC" style="color:red;">Content-type: text/plain; charset=Shift_JIS</span>」で表示させてみました　コマンドプロンプトを別の文字コードに設定している場合はここの「<span class="decorationC" style="color:red;">charset=</span>」以降を適当なものに変更する必要があると思います<br /><br />Linux の Web サーバだと実行属性がどうのこうのとかありますが Windows にはそんなものは無いので「.bat」の拡張子のものであればそれだけで動きます　ちなみに大文字/小文字の区別も無いのでブラウザのアドレス欄で「BAT_CGI01.BAT」なんて大文字で指定しても動きます<br />※少なくことも我が家の AN HTTPD を使用した環境では動きました<br />※テストした環境が FAT32 ファイルシステムの microSD だったから大文字/小文字の区別がない？　これが NTFS ファイルシステム上だと大文字/小文字を区別するの？　どうなの？？<br /><br />さて…うまく動きましたか？　無事に動いたのなら次にいってみましょう<br /><br />----- bat_cgi02.bat -----<br /><br />@echo off<br /><br />REM ブラウザに「Content-type:」を出力する（HTML出力用）<br />echo Content-type: text/html; charset=Shift_JIS<br />echo.<br /><br />REM HTML なページとしてのお約束的なヘッダ部<br />echo ^&lt;!doctype html^&gt;<br />echo ^&lt;html^&gt;^&lt;head^&gt;^&lt;title^&gt;今日の運勢的な？^&lt;/title^&gt;^&lt;/head^&gt;^&lt;body^&gt;<br /><br />echo 今日の運勢は…^&lt;font color=red^&gt;<br /><br />REM コマンドの実行結果を変数に取り込む<br />for /f &quot;usebackq delims=&quot; %%A in (`echo. ^| time ^| find &quot;現在の時刻&quot;`) do set RAND=%%A<br /><br />REM 「%RAND:~-1%」で変数の末尾 1 文字を取り出す<br />if %RAND:~-1% == 0 echo &#91;%RAND:~-1%&#93; ☆大吉☆<br />if %RAND:~-1% == 1 echo &#91;%RAND:~-1%&#93; 中吉<br />if %RAND:~-1% == 2 echo &#91;%RAND:~-1%&#93; 中吉<br />if %RAND:~-1% == 3 echo &#91;%RAND:~-1%&#93; 吉<br />if %RAND:~-1% == 4 echo &#91;%RAND:~-1%&#93; 吉<br />if %RAND:~-1% == 5 echo &#91;%RAND:~-1%&#93; 吉<br />if %RAND:~-1% == 6 echo &#91;%RAND:~-1%&#93; まぁまぁ<br />if %RAND:~-1% == 7 echo &#91;%RAND:~-1%&#93; 凶<br />if %RAND:~-1% == 8 echo &#91;%RAND:~-1%&#93; 凶<br />if %RAND:~-1% == 9 echo &#91;%RAND:~-1%&#93; 大凶(-_-；)<br /><br />echo ^&lt;/font^&gt;です^&lt;br^&gt;<br /><br />REM HTML なページとしてのお約束的なフッタ部<br />echo ^&lt;/body^&gt;^&lt;/html^&gt;<br /><br />----------<br /><br /><img class="embeddedimage " width="782" height="575" src="https://room.dengeki.jp/images/202201031627568-admin.png" alt="202201031627568-admin.png"><br />正しく動作すればこんな感じの内容がブラウザに表示されます　何度かロリードして試してみたってイメージでｗ<br />今回はホームページな表示をさせるために「<span class="decorationC" style="color:red;">Content-type: text/html; charset=Shift_JIS</span>」を設定してみました　これで文字装飾などの「タグ」が使えるようになるのですが…この「タグ」に使用する「&lt;」と「&gt;」はそのまま使うとファイルにリダイレクト/インリダイレクトするための記号として解釈されてうまく動かなくなるのでそれをエスケープするための記号「^」を使用しています　コマンドの実行結果を変数に取り込むバッククオート内ではパイプに使用する記号「|」なんかも誤動作するんでエスケープする必要があります<br /><br />そんなこの CGI はありがちな「おみくじ CGI」です　標準コマンドである <span class="decorationC" style="color:green;">time</span> の出力の中から「現在の時刻」が含まれる行を変数に取り込み…その文字列の末尾（この場合 0〜9 になる）を取り出しその値に対して処理を振り分けています<br />ざっと見た感じ <span class="decorationC" style="color:green;">time</span> は 1/100 秒の値まで表示している感じなんで…その値をざっくりした乱数値として使用しています　ちなみに大まか作ってから気づいたのですが…バッチファイル内で乱数となる変数 <span class="decorationC" style="color:red;">%RANDOM%</span> なんてのもあるようです　これは 0～32767 の得られるようですね　たぶん動作はこちらのほうが軽いと思います<br /><br />さてさて…うまく動きましたか？　無事に動いたのなら次にいってみましょう<br /><br />----- bat_cgi03.bat -----<br /><br />@echo off<br /><br />REM ブラウザに「Content-type:」を出力する（PNG画像用）<br />echo Content-type: image/png<br />echo.<br />goto MAIN<br /><br />REM 時間を判定して画像を表示する用のサブルーチン<br />REM call :SUB &lt;時間&gt; &lt;ファイル名&gt;<br />REM &nbsp;&lt;時間&gt; は 0～23 で指定<br />REM &nbsp;&lt;ファイル名&gt; は表示させたい PNG 画像を指定<br />:SUB<br />echo. | time | find &quot; %1:&quot; &gt; NUL<br />if %errorlevel% == 0 type %2<br />exit /b<br /><br />REM サブルーチンを呼んだりするメイン的な処理<br />:MAIN<br />call :SUB 0 img_shinya.png<br />call :SUB 1 img_shinya.png<br />call :SUB 2 img_shinya.png<br />call :SUB 3 img_shinya.png<br />call :SUB 4 img_shinya.png<br />call :SUB 5 img_asa.png<br />call :SUB 6 img_asa.png<br />call :SUB 7 img_asa.png<br />call :SUB 8 img_asa.png<br />call :SUB 9 img_asa.png<br />call :SUB 10 img_hiru.png<br />call :SUB 11 img_hiru.png<br />call :SUB 12 img_hiru.png<br />call :SUB 13 img_hiru.png<br />call :SUB 14 img_hiru.png<br />call :SUB 15 img_hiru.png<br />call :SUB 16 img_hiru.png<br />call :SUB 17 img_hiru.png<br />call :SUB 18 img_yoru.png<br />call :SUB 19 img_yoru.png<br />call :SUB 20 img_yoru.png<br />call :SUB 21 img_yoru.png<br />call :SUB 22 img_yoru.png<br />call :SUB 23 img_yoru.png<br /><br />----------<br /><br />以下の画像を bat_cgi03.bat と同じフォルダ内に用意しておいてください<br /><a class="url urlimage selflink" href="https://yqn.f5.si/pic/img_asa.png"><img src="https://yqn.f5.si/pic/img_asa.png" class="embeddedimage" alt="img_asa.png"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/img_hiru.png"><img src="https://yqn.f5.si/pic/img_hiru.png" class="embeddedimage" alt="img_hiru.png"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/img_yoru.png"><img src="https://yqn.f5.si/pic/img_yoru.png" class="embeddedimage" alt="img_yoru.png"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/img_shinya.png"><img src="https://yqn.f5.si/pic/img_shinya.png" class="embeddedimage" alt="img_shinya.png"></a><br />※画像は <a class="url labeledlink" href="https://www.irasutoya.com/" rel="noopener noreferrer" target="_blank">いらすとや</a> さんから拝借しました　いつもありがとございます<br /><br /><img class="embeddedimage " width="782" height="575" src="https://room.dengeki.jp/images/202201031627567-admin.png" alt="202201031627567-admin.png"><br />今度は少し変わり種っていうか…正しく動作すればこんな感じの内容がブラウザに表示されます（表示は時間帯によって変化します）<br />今回は HTTP ヘッダとして「<span class="decorationC" style="color:red;">Content-type: image/png</span>」出力しています　これは一体何なのかと云うと…ブラウザから見たこの CGI (bat_cgi03.bat) 自体が画像となっている事を意味しています<br />つまりブラウザから見れば「同じファイル名」なのに「アクセス毎に違う画像」を表示できることなんですね<br /><br />※なお本来はテキストデータを扱う <span class="decorationC" style="color:green;">type</span> コマンドでバイナリデータを標準出力に流しています　ざっとテストした感じではうまく動いているっぽいけど…どうなんだろうね？　なんか <span class="decorationC" style="color:green;">type</span> コマンドの仕様に「EOF」が出現したら動作を終了する的なものがあるらしいんだけど…ねぇ？<br />※バイナリを扱える <span class="decorationC" style="color:green;">copy</span> コマンドで出力先を <span class="decorationC" style="color:red;">CON</span> にして試してもみたんだけど…こちらは明確に誤動作していました　確か <span class="decorationC" style="color:red;">CON</span> デバイスは改行コードの置換などそんな動作を行うんだっけ？　何も変換とかの動作をしない…シンプルに全てのデータをそのまま標準出力に流してくれるものがあればいいのですが<br /><br />話を元に戻して… CGI (bat_cgi03.bat) 自体が画像ファイルとして動作することのメリットを考えてみましょう<br />例えば迷惑系の HTML メールですかね　その中の画像として他のサーバにある bat_cgi03.bat を呼ばれたとしましょう　するとその他の場所にあるサーバ内ではアクセスログが記録されます　それ即ち「メールが読まれたこと」を記録することになります<br /><br />もちろんそれだけでは大きな脅威にならないかもだけど…そこには面白い使い方があるんですよ<br /><br />ブラウザから見た bat_cgi03.bat は単なる画像ファイルだけど実際にはプログラム的な動作をしています　そしてプログラムの動作には「引数」を与えることができます<br />先ほどの bat_cgi03.bat の呼び出しに対して bat_cgi03.bat<span class="decorationC" style="color:red;">?HOGEHOGE</span> と云った感じで「引数」を与えて呼び出しそれを解釈できるようになります　この引数の部分にメールを受信した人を特定する一意のデータ（この場合は<span class="decorationC" style="color:red;">HOGEHOGE</span>）を付けておき…その一意のデータと送信したメールアドレスを紐づけておけば「誰がメールを読んだのか」を知ることができます<br /><br />例として先ほどの bat_cgi03.bat の末尾にログを収集するものを付加してみましょう<br /><br />----- bat_cgi04.bat -----<br /><br />@echo off<br /><br />REM ブラウザに「Content-type:」を出力する（PNG画像用）<br />echo Content-type: image/png<br />echo.<br />goto MAIN<br /><br />REM 時間を判定して画像を表示する用のサブルーチン<br />REM call :SUB &lt;時間&gt; &lt;ファイル名&gt;<br />REM &nbsp;&lt;時間&gt; は 0～23 で指定<br />REM &nbsp;&lt;ファイル名&gt; は表示させたい PNG 画像を指定<br />:SUB<br />echo. | time | find &quot; %1:&quot; &gt; NUL<br />if %errorlevel% == 0 type %2<br />exit /b<br /><br />REM サブルーチンを呼んだりするメイン的な処理<br />:MAIN<br />call :SUB 0 img_shinya.png<br />call :SUB 1 img_shinya.png<br />call :SUB 2 img_shinya.png<br />call :SUB 3 img_shinya.png<br />call :SUB 4 img_shinya.png<br />call :SUB 5 img_asa.png<br />call :SUB 6 img_asa.png<br />call :SUB 7 img_asa.png<br />call :SUB 8 img_asa.png<br />call :SUB 9 img_asa.png<br />call :SUB 10 img_hiru.png<br />call :SUB 11 img_hiru.png<br />call :SUB 12 img_hiru.png<br />call :SUB 13 img_hiru.png<br />call :SUB 14 img_hiru.png<br />call :SUB 15 img_hiru.png<br />call :SUB 16 img_hiru.png<br />call :SUB 17 img_hiru.png<br />call :SUB 18 img_yoru.png<br />call :SUB 19 img_yoru.png<br />call :SUB 20 img_yoru.png<br />call :SUB 21 img_yoru.png<br />call :SUB 22 img_yoru.png<br />call :SUB 23 img_yoru.png<br /><br />REM 最後にログを保存する<br />REM 例）&#91;日 時&#93;,&#91;引数&#93;,&#91;相手ホスト名(相手IPアドレス)&#93;,&#91;ブラウザ名&#93;<br />echo &#91;%DATE% %TIME%&#93;,&#91;%QUERY_STRING%&#93;,&#91;%REMOTE_HOST%(%REMOTE_ADDR%)&#93;,&#91;%HTTP_USER_AGENT%&#93; &gt;&gt; %date:~0,4%%date:~5,2%%date:~8,2%.log<br /><br />----------<br /><br /><img class="embeddedimage " width="782" height="575" src="https://room.dengeki.jp/images/202201031627566-admin.png" alt="202201031627566-admin.png"><br />これで「アクセス日時」「引数」「相手ホスト名(相手IPアドレス)」「ブラウザ名」がログとして記録されるようになります<br /><br /><img class="embeddedimage " width="800" height="450" src="https://room.dengeki.jp/images/202201031627565-admin.png" alt="202201031627565-admin.png"><br />たったこれだけの仕組みで「単に HTML メールを見ただけ」なのにいろいろ収集できるんで…画像ファイルとして動作する CGI には大きな意義があると思います<br /><br />※なお最近のメーラは「外部コンテンツを読み込まない」的なオプションがデフォルトでオフになっていると聞きます　しかしその意味をよく判らないまま「便利さを求めて」読み込むような設定に変更してる人も多いと聞きます<br />※まぁもちろん外部コンテンツの全部が全部にそのような動作が仕掛けられている事は無いとは思いますが…そのような危険性があることを覚えておきたいですね<br /><br />　　：<br /><br />なんて感じで長々とお疲れさまでした　久しぶりのバッチファイルっていうか…思い返せば X68000 の Human68k の AUTOEXEC.BAT の頃以来ですかね（汗　なんか今回いろいろ調べてて「サブルーチンなんて使えてたっけ？？」とか新しい発見があってよかったです<br />今回 Web サーバ以外は最初から用意されている（と思われる）標準的なコマンドをどうにか組み合わせて機能を実現してみました　それ故にっていうか…久しぶりだったんでいろいろ無駄な部分とかもあるけどその辺はご了笑くださいませ<br />まぁしょーみ今さらバッチファイルを CGI に使おうなんて奇特な人も居ないだろうで全く問題ないだろうけどｗｗ<br /><br />あと今回テストに使った Web サーバは一時的なものなので WAN に公開していません　つーか使いたくないんで年に数回くらいしか電源を入れることがない代物なんでその辺はお察しください… <a href="https://room.dengeki.jp/tegalog.cgi?tag=%57%69%6e%64%6f%77%73" class="taglink" title="Windows">#Windows</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%43%47%49" class="taglink" title="CGI">#CGI</a><br /><br />　　：<br /><br />今回使用した bat_cgi*.bat と img*.png をひとまとめにした配布セットを用意しました<br />　　<a class="url labeledlink" href="https://yqn.f5.si/data/bat_cgi.zip" rel="noopener noreferrer" target="_blank">bat_cgi.zip</a><br />なおこれを使用した際に発生したあらゆる利益・不利益について当方は一切の責任を負いませんって定型文でよろしくお願いします<br /><br />　　：<br /><br />※ 追記 ※<br />今回は AN HTTPD のみでの動作テストだった訳ですが…有志のえらいひとが IIS (Internet Information Services) でのテストをしてくれて問題点と解決法をご連絡頂けたんでここに転載させていただきます<br /><br />まずは IIS の設定から<br /><img class="embeddedimage " width="800" height="1000" src="https://room.dengeki.jp/images/202201101418043-admin.png" alt="202201101418043-admin.png"> <img class="embeddedimage " width="800" height="1000" src="https://room.dengeki.jp/images/202201101418042-admin.png" alt="202201101418042-admin.png"><br />「CGI」の設定で「起動ごとに新しいコンソールを使用する」を「True」にする<br /><br /><img class="embeddedimage " width="800" height="1000" src="https://room.dengeki.jp/images/202201101418041-admin.png" alt="202201101418041-admin.png"><br />「ハンドラー マッピング」の設定で「マネージハンドラーの追加」をして<br /><br /><img class="embeddedimage " width="800" height="1000" src="https://room.dengeki.jp/images/20220110141804-admin.png" alt="20220110141804-admin.png"><br />「要求パス」に「*.bat」を<br />「実行可能ファイル」に「c:\windows\system32\cmd.exe /c %s」を<br />「名前」には「判りやすそうな適当な名前」を設定します<br /><br />あとは上の方で示してる BAT ファイルの内容的な問題っていうか…その BAT ファイルが参照/作成するファイルへのパスですかね<br />どうも IIS の場合だとカレントディレクトリが「BAT ファイルを実行した場所」ではなく「物理パス(ドキュメント ルート)」となるらしく…その辺を考慮してないと誤作動となるようなのでその辺を改良します　まぁ基本的には BAT ファイルを実行した場所を示す変数である「%~dp0」を追加します<br /><br />----- bat_cgi01.bat -----<br />REM 日付が設定されている変数から「年月日」を取得してログファイル的なファイル名を作ってみる<br />echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log<br /><br />　　↓<br /><br />REM 日付が設定されている変数から「年月日」を取得してログファイル的なファイル名を作ってみる<br />echo <span class="decorationC" style="color:red;">%~dp0</span>%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log<br />----------<br /><br />----- bat_cgi03.bat -----<br />REM 時間を判定して画像を表示する用のサブルーチン<br />REM call :SUB &lt;時間&gt; &lt;ファイル名&gt;<br />REM &nbsp;&lt;時間&gt; は 0～23 で指定<br />REM &nbsp;&lt;ファイル名&gt; は表示させたい PNG 画像を指定<br />:SUB<br />echo. | time | find &quot; %1:&quot; &gt; NUL<br />if %errorlevel% == 0 type %2<br />exit /b<br /><br />　　↓<br /><br />REM 時間を判定して画像を表示する用のサブルーチン<br />REM call :SUB &lt;時間&gt; &lt;ファイル名&gt;<br />REM &nbsp;&lt;時間&gt; は 0～23 で指定<br />REM &nbsp;&lt;ファイル名&gt; は表示させたい PNG 画像を指定<br />:SUB<br />echo. | time | find &quot; %1:&quot; &gt; NUL<br />if %errorlevel% == 0 type <span class="decorationC" style="color:red;">%~dp0</span>%2<br />exit /b<br />----------<br /><br />----- bat_cgi04.bat -----<br />上記 bat_cgi03.bat のサブルーチン部と同じく if %errorlevel% == 0 type <span class="decorationC" style="color:red;">%~dp0</span>%2 と直して…<br /><br />REM 最後にログを保存する<br />REM 例）&#91;日 時&#93;,&#91;引数&#93;,&#91;相手ホスト名(相手IPアドレス)&#93;,&#91;ブラウザ名&#93;<br />echo &#91;%DATE% %TIME%&#93;,&#91;%QUERY_STRING%&#93;,&#91;%REMOTE_HOST%(%REMOTE_ADDR%)&#93;,&#91;%HTTP_USER_AGENT%&#93; &gt;&gt; %date:~0,4%%date:~5,2%%date:~8,2%.log<br /><br />　　↓<br /><br />REM 最後にログを保存する<br />REM 例）&#91;日 時&#93;,&#91;引数&#93;,&#91;相手ホスト名(相手IPアドレス)&#93;,&#91;ブラウザ名&#93;<br />echo &#91;%DATE% %TIME%&#93;,&#91;%QUERY_STRING%&#93;,&#91;%REMOTE_HOST%(%REMOTE_ADDR%)&#93;,&#91;%HTTP_USER_AGENT%&#93; &gt;&gt; <span class="decorationC" style="color:red;">%~dp0</span>%date:~0,4%%date:~5,2%%date:~8,2%.log<br />----------<br /><br />こんな感じに修正します　これで正しく動くようになるようです<br />わざわざのご連絡ありがとございました！(&gt;_&lt;)ｗ -- Posted by 猫山ぽるか 〔11014文字〕 No.16 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=16</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=16</guid>
	<category>info</category>
	<pubDate>Mon, 03 Jan 2022 16:27:56 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ ラズパイの Apache で CPU 情報を取得する vcg… ]]></title>
	<description><![CDATA[ ラズパイの Apache で CPU 情報を取得する vcgencmd が CGI で動かない問題を解決する<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20211205061157-admin.png" alt="20211205061157-admin.png"><br />　<br />Raspberry Pi 4 (ラズパイ) に CPU のクロック周波数や温度やらを取得する vcgencmd なるコマンドが用意されています<br />CPU などなどのクロック周波数を表示<br /><span class="decorationC" style="color:green;">for src in arm core h264 isp v3d uart pwm emmc pixel vec hdmi dpi ; do echo -e &quot;$src:\t$(vcgencmd measure_clock $src)&quot; ; done</span><br />CPU の温度を表示<br /><span class="decorationC" style="color:green;">vcgencmd measure_temp</span><br />利用可能・不可能なコーデックの表示<br /><span class="decorationC" style="color:green;">for codec in H264 MPG2 WVC1 MPG4 MJPG WMV9 ; do &nbsp;echo -e &quot;$codec:\t$(vcgencmd codec_enabled $codec)&quot; ; done</span><br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/20211205053433-admin.png" alt="20211205053433-admin.png"><br />実行例<br /><br />その他にもいろいろあるんで…詳しくは <a class="url labeledlink" href="https://elinux.org/RPI_vcgencmd_usage" rel="noopener noreferrer" target="_blank">解説ページをご覧ください</a> って感じの vcgencmd コマンドなんですが Apache 上の CGI として実行させようとすると失敗するんでその辺をどうにかしてみます<br /><br />まぁ結論から云ってしまうと…グループ video に Apache が実行するユーザである www-data が入っていないから動かないって事らしいです<br /><span class="decorationC" style="color:green;">cat /etc/group | grep video</span><br /><b class="decorationB"><span class="decorationC" style="color:red;">video</span>:x:44:pi</b><br /><br />ちなみに Apache が実行するユーザは /etc/apache2/envvars で指定しているようです<br />export APACHE_RUN_USER=www-data<br />export APACHE_RUN_GROUP=www-data<br /><br />試しにコマンドラインでユーザを www-data に切り替えて確認してみましょう<br /><span class="decorationC" style="color:green;">sudo su -s /bin/bash www-data</span><br /><span class="decorationC" style="color:green;">vcgencmd measure_temp</span><br /><b class="decorationB">VCHI initialization failed</b><br />やはり使えないみたいですね…<br /><br />それじゃグループ video にユーザ www-data を追加していきましょう　まぁコマンド一発なんですが<br /><span class="decorationC" style="color:green;">sudo usermod -aG video www-data</span><br />これで追加できます　確認すると…<br /><span class="decorationC" style="color:green;">cat /etc/group | grep video</span><br /><b class="decorationB"><span class="decorationC" style="color:red;">video</span>:x:44:pi,www-data</b><br />グループ video にユーザ www-data が追加されました<br /><br />それでは再びユーザを www-data に切り替えて確認してみましょう<br /><span class="decorationC" style="color:green;">sudo su -s /bin/bash www-data</span><br /><span class="decorationC" style="color:green;">vcgencmd measure_temp</span><br /><b class="decorationB">temp=28.2&apos;C</b><br />ちゃんと使えるようになりました<br /><br />　　：<br /><br />しかし Apache 上の CGI として vcgencmd コマンドを実行しても「VCHI initialization failed」のエラーが出続けます　なんで？？<br />いろいろと試していて…まぁはっきりとした理由は不明なんですが Apache を再起動させたらこの問題が解決しました<br /><span class="decorationC" style="color:green;">sudo systemctl restart apache2</span><br />これで Apache 上の CGI として vcgencmd コマンドが使えるようになりました　何か別の所に問題があるかもだけど…我が家の環境ではこの手法で解決できました<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202112050534331-admin.png" alt="202112050534331-admin.png"><br />そんな操作の過程のスクリーンショットをぺたり　<del class="decorationD"><small class="decorationT">改竄の余地のないよう作業の過程を全て収録してあります</small></del><br /><br />※参考資料　グループからユーザを削除するには…<br />トラブルの解決中っていうか…いろいろやってて勢い余って必要のないユーザをグループに追加しちゃった！(&gt;_&lt;)ｑって時なんかにグループからユーザを削除する場合には以下のようにします<br />例えばグループ <span class="decorationC" style="color:red;">video</span> に追加されたユーザ <span class="decorationC" style="color:blue;">www-data</span> を削除する場合は<br /><span class="decorationC" style="color:green;">sudo gpasswd -d <span class="decorationC" style="color:blue;">www-data</span> <span class="decorationC" style="color:red;">video</span></span><br />こんな感じに操作します　先ほどの <span class="decorationC" style="color:green;">usermod</span> の場合とユーザ名とグループ名の指定が逆になってるので注意が必要です　なんなら <span class="decorationC" style="color:green;">gpasswd -a</span> でグループにユーザを追加することができるらしいんですが…どっちを使うといいんだろうね<br /><br />　　：<br /><br />さてさてそんな vcgencmd を使ってこんな感じで動かしています<br />&nbsp;<img class="embeddedimage" src="https://yqn.f5.si/pic/pi4.png" alt="(キャプション自動取得対象外)">　その都度都度で PNG 画像を生成しています<br />Web サーバの処理やら画像の生成などで一時的にクロック高めな感じですがアイドル時は 600MHz くらいになってるようです<br />そんなこんなで何かの都合でラズパイを再セットアップした際に悩まないようなメモでした <a href="https://room.dengeki.jp/tegalog.cgi?tag=%52%61%73%70%62%65%72%72%79%20%50%69" class="taglink" title="Raspberry Pi">#&#91;Raspberry Pi&#93;</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%70%61%63%68%65" class="taglink" title="Apache">#Apache</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%98%e3%83%ab%e3%83%97" class="taglink" title="コマンドヘルプ">#コマンドヘルプ</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%43%47%49" class="taglink" title="CGI">#CGI</a> -- Posted by 猫山ぽるか 〔2063文字〕 No.11 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=11</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=11</guid>
	<category>info</category>
	<pubDate>Sun, 05 Dec 2021 05:34:33 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Raspberry Pi 4 で素早く Apache2 サー… ]]></title>
	<description><![CDATA[ Raspberry Pi 4 で素早く Apache2 サーバを建ててゆるい設定をするメモ<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203173447-admin.png" alt="20211203173447-admin.png"><br />　<br />常時接続が当たり前の昨今に於いてお家で Raspberry Pi 4 を Web サーバにする需要が多いと聞きますが…わりと Apache2 の設定って難解で面倒なんですよね　その辺をぐぐってみてもバージョン違いや実装の違いでいまいち思ったように設定できないって困ったことはありませんか？　私はあります（汗って事なんで…セキュリティ的な云々は後回しにして手っ取り早く簡単に設定できる方法を模索してみます<br /><br />そんなラズパイへの Apache2 のインストール自体はコマンド一発で簡単にできます<br /><span class="decorationC" style="color:green;">sudo apt install apache2</span><br />これで Apache2 がインストールされサーバが動き出します<br />試しに PC などのブラウザのアドレス欄に <span class="decorationC" style="color:green;">ホスト名.local</span> と入れて確認してみましょう　ちなみに標準状態のラズパイのホスト名は raspberrypi なんで <span class="decorationC" style="color:green;">raspberrypi.local</span> になります<br /><br /><img class="embeddedimage " width="1011" height="677" src="https://room.dengeki.jp/images/20211016095920-admin.png" alt="20211016095920-admin.png"><br />我が家のラズパイはホスト名を <span class="decorationC" style="color:green;">pi4</span> にしてるんでアレだけど…概ねこんな感じになると思います<br />これは Apache2 のテスト用に用意されたページで <span class="decorationC" style="color:red;">/var/www/html</span> にある <span class="decorationC" style="color:red;">index.html</span> を表示しています　この <span class="decorationC" style="color:red;">/var/www/html</span> をドキュメントルートと呼びます　基本的にこのフォルダにホームページ用のデータを置いていきます<br /><br />　　：<br /><br />初期状態の Apache2 は各種機能が制限されているっていうか CGI が動かなかったりとか物足りない感じなんでその辺をどうにかします<br /><img class="embeddedimage " width="1186" height="749" src="https://room.dengeki.jp/images/20211016101700-admin.png" alt="20211016101700-admin.png"><br />そんな Apache2 の設定ファイルは <span class="decorationC" style="color:red;">/etc/apache2</span> にあります　この中の <span class="decorationC" style="color:red;">apache2.conf</span> を編集したくなる感じですが…世間的にはよっぽどの事がない限りこのファイルはイジらないほうがいいって事らしいんで別の手法で設定します<br /><br /><img class="embeddedimage " width="1186" height="749" src="https://room.dengeki.jp/images/20211016102522-admin.png" alt="20211016102522-admin.png"><br /><span class="decorationC" style="color:red;">/etc/apache2</span> を眺めてると… <span class="decorationC" style="color:red;">conf-available</span> と <span class="decorationC" style="color:red;">conf-enabled</span> の対になったフォルダに <span class="decorationC" style="color:red;">mods-available</span> と <span class="decorationC" style="color:red;">mods-enabled</span> の対と <span class="decorationC" style="color:red;">sites-available</span> と <span class="decorationC" style="color:red;">sites-enabled</span> の対になったフォルダがあるのに気づきます<br />これがラズパイの Apache2 の設定ファイル＆モジュール管理の基本となります　このフォルダ内にファイルを作ったりして設定を進めます<br /><br /><img class="embeddedimage " width="1186" height="749" src="https://room.dengeki.jp/images/20211016103332-admin.png" alt="20211016103332-admin.png"><br />そのそれぞれ対になった <span class="decorationC" style="color:red;">*-available</span> と <span class="decorationC" style="color:red;">*-enabled</span> 関係ですが… available は編集中のものを含め全ての候補となるファイルが入っています　対する enabled には Apache2 を起動する際に実際に読み込まれるファイルのシンボリック・リンクが入ります<br />※いろいろ設定した後の内容なんで…インストール直後のものとは違いがあります（汗<br /><br />それぞれ対になってる conf と mods と sites の意味ですが… conf にはアクセス制御系の設定が mods には拡張モジュールが sites にはバーチャルホスト系の設定が入ります<br />そしてその 有効/無効 にするための専用のコマンドが用意されています<br />conf の有効化には <span class="decorationC" style="color:green;">a2enconf</span> で無効化には <span class="decorationC" style="color:green;">a2disconf</span> を使います<br />mods の有効化には <span class="decorationC" style="color:green;">a2enmod</span> で無効化には <span class="decorationC" style="color:green;">a2dismod</span> を使います<br />sites の有効化には <span class="decorationC" style="color:green;">a2ensite</span> で無効化には <span class="decorationC" style="color:green;">a2dissite</span> を使います<br /><br />　　：<br /><br />では試しに CGI を有効化する設定をしてみましょう<br />CGI を使うにはそれ用のモジュールが必要らしいんで <span class="decorationC" style="color:green;">sudo a2enmod cgid</span> で有効化します<br />一応 <span class="decorationC" style="color:green;">sudo systemctl restart apache2</span> で Apache2 を再起動します<br /><br />これで <span class="decorationC" style="color:red;">/usr/lib/cgi-bin</span> に配置した CGI 的なプログラムが<a class="url labeledlink" href="https://room.dengeki.jp/cgi-bin/gd.cgi?hogehoge" rel="noopener noreferrer" target="_blank">動</a><a class="url labeledlink" href="https://room.dengeki.ne.jp/cgi-bin/gd.cgi?hogehoge" rel="noopener noreferrer" target="_blank">作</a><a class="url labeledlink" href="https://yqn.f5.si/cgi-bin/gd.cgi?hogehoge" rel="noopener noreferrer" target="_blank">可能</a>になりますが…どうせならドキュメントルートである <span class="decorationC" style="color:red;">/var/www/html</span> でも CGI を使えるようにしましょう<br /><br /><span class="decorationC" style="color:green;">sudo nano /etc/apache2/conf-available/cgi.conf</span> で新規ファイルとして編集して…<br /><span class="decorationC" style="color:red;">&lt;Directory &quot;/var/www/html&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;Options +ExecCGI<br />&nbsp;&nbsp;&nbsp;&nbsp;AddHandler cgi-script .cgi .pl .py .rb<br />&nbsp;&nbsp;&nbsp;&nbsp;AllowOverride All<br />&lt;/Directory&gt;</span><br />上記の 5 行を追加して保存します　今回は cgi.conf としましたが他の名前にしても大丈夫です<br /><br />保存したら <span class="decorationC" style="color:green;">sudo a2enconf cgi</span> でその設定ファイルを有効化します<br />最後に <span class="decorationC" style="color:green;">sudo systemctl restart apache2</span> で Apache2 を再起動します<br />これで <span class="decorationC" style="color:red;">/var/www/html</span> でも CGI が使用可能になりました<br /><br />　　：<br /><br />CGI の設定とは少し違いますが…上記の <span class="decorationC" style="color:green;">cgi.conf</span> に書き込んだ <span class="decorationC" style="color:green;">AllowOverride All</span> って設定があります　これは &nbsp;<span class="decorationC" style="color:green;">.htaccess</span> を使用可能にする設定です<br /><span class="decorationC" style="color:green;">.htaccess</span> が使えれば Apache2 の再起動をすることなく設定を即座に反映させることができるようになります　その分ページ表示されるまで余計な処理が増えて重くなるらしいんだけど…めったにアクセスの無い個人ページならまぁ問題にならないでしょう（滅<br /><span class="decorationC" style="color:green;">.htaccess</span> についての詳しい説明は…いろいろ多岐にわたる内容すぎて書ききれないんで省略します　気になる方は<a class="url labeledlink" href="https://www.google.com/search?q=.htaccess" rel="noopener noreferrer" target="_blank">ぐぐってみる</a>と良いでしょう（瀧汗<br /><br />　　：<br /><br />そうそう Perl で書かれた CGI で「CGI モジュールが必要」ってのをちょくちょく見かけるんで…そんな Perl のモジュールインストールメモをひとつ<br />Perl のモジュール管理(？)に CPAN (Comprehensive Perl Archive Network) を使うって話を度々目にすることがあったのも時既に過去の話だったのかなって遠い目をする話じゃなくて（汗そんな Perl モジュールの中で必須とする数個のインストールのためだけに CPAN を入れるのもめんどっちぃなぁって事なんで…普段使ってる <span class="decorationC" style="color:green;">sudo apt install</span> でその辺をどうにかするメモ<br /><br />結論から云うと CGI モジュールは <span class="decorationC" style="color:green;">sudo apt install libcgi-session-perl</span> で入ります　その他の有名どころのモジュールもだいたい <span class="decorationC" style="color:green;">sudo apt install</span> で入れることができます<br />上記のCGI モジュールは心もち特殊な例なんでアレだけど…他の多くは <span class="decorationC" style="color:green;">sudo apt install lib<span class="decorationC" style="color:red;">(モジュール名)</span>-perl</span> でイケる事が多いです<br /><br />例．GD モジュール→ <span class="decorationC" style="color:green;">sudo apt install lib<span class="decorationC" style="color:red;">gd</span>-perl</span> 　NKF モジュール→ <span class="decorationC" style="color:green;">sudo apt install lib<span class="decorationC" style="color:red;">nkf</span>-perl</span> などなど<br />確証はないけど…知っておくと損はないかもです<br /><br />そんなこんなな長々とお疲れさまでした！ <a href="https://room.dengeki.jp/tegalog.cgi?tag=%52%61%73%70%62%65%72%72%79%20%50%69" class="taglink" title="Raspberry Pi">#&#91;Raspberry Pi&#93;</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%70%61%63%68%65" class="taglink" title="Apache">#Apache</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%43%47%49" class="taglink" title="CGI">#CGI</a><br /><small class="decorationS"><br />　　●<span class="decorationM" style="background-color:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=6" class="postidlink">ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3</a></span><br />　　●<span class="decorationM" style="background-color:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=5" class="postidlink">ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2</a></span><br />　　●<span class="decorationM" style="background-color:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=4" class="postidlink">ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1</a></span><br />　　●<span class="decorationM" style="background-color:lightpink;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=3" class="postidlink">ラズパイで Apache2 サーバを建ててゆるい設定をする</a></span><br />　　●<span class="decorationM" style="background-color:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=2" class="postidlink">モニタ無しでラズパイを VNC 接続できるとこまでセットアップ</a></span><br /></small> -- Posted by 猫山ぽるか 〔3321文字〕 No.3 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=3</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=3</guid>
	<category>info</category>
	<pubDate>Sat, 16 Oct 2021 09:49:15 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

