<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ 2022年1月の投稿［5件］ - でんげき☆ 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[ Arduino の シリアル通信 ]]></title>
	<description><![CDATA[ Arduino の シリアル通信<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20220130153543-admin.png" alt="20220130153543-admin.png"><br />　<br /><a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B086GPX434" rel="noopener noreferrer" target="_blank">Arduino VKLSVAN Pro Micro USB ATmega32U4</a> (※以下 Arduino と略す)で開発してる際のデバッグとかで「変数がどうなってるのか」を見たくなることはありませんか？　私はあります　いやむしろ見ないとやってられません！！(&gt;_&lt;)ｗって感じなんだけど Arduino にはモニタ出力がありません<br /><br /><img class="embeddedimage " width="970" height="624" src="https://room.dengeki.jp/images/20220130153543-admin.jpg" alt="20220130153543-admin.jpg"><br />なんか LCD ディスプレイとやらを接続すれば文字なんかを表示させられるっぽいけど…接続とか面倒そうだし手が出ないなぁと思ってたけど何やら「シリアル通信」ってので PC と文字のやりとりができるらしいじゃん！？　まじか！！<br /><br />そんなシリアル通信は Arduino IDE から使えるようです<br /><br /><img class="embeddedimage " width="500" height="362" src="https://room.dengeki.jp/images/202201301535436-admin.png" alt="202201301535436-admin.png"><br />&#91;メニュー&#93; → &#91;ツール&#93; → &#91;シリアルモニタ&#93; と操作するか…<br /><br /><img class="embeddedimage " width="500" height="362" src="https://room.dengeki.jp/images/202201301535435-admin.png" alt="202201301535435-admin.png"><br />もしくはツールバーにある虫メガネみたいなアイコンを押下すると出てきます<br /><br /><img class="embeddedimage " width="850" height="505" src="https://room.dengeki.jp/images/202201301535434-admin.png" alt="202201301535434-admin.png"><br />出てきた「シリアルモニタ」はこんな感じです<br />我が家の環境では「改行コード = LFのみ」で「通信速度 = 9600bps」が初期設定となっていました<br /><br />通信速度は Arduino 側で設定した速度とシリアルモニタで設定する速度は同じものにしておく必要がある…らしいんですが軽くイジってみた感じでは設定値に関係なく動作しているっぽい感じなんで気にする必要はないのかもしれません<br /><br />改行コードは Linux 系が「LF」で Mac 系(の昔のやつ？)が「CR」で… Windows 系が「CR+LF」と聞いたことがあるので機種ごとに適切なものに変更しておいたほうがいいの？<br />ざっくり使ってみた感じでは… Arduino からシリアルモニタに送られてくる場合の改行コードは設定の影響を受けないっぽいです　シリアルモニタから Arduino に送信する際に「送信ボタンを押した」もしくは「エンターキーを押した」時に改行コードをどのようにするかの設定となるようです　なおここでの解説は改行コードを「LFのみ」に設定してあるものとします<br /><br />　　：<br /><br />それでは早速と言うか Arduino からシリアルモニタに文字を送信してみましょう　シリアル通信を開始するには以下のように記述します<br />Serial.begin(speed) ってやつですね　speed は BPS で… 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 なんかがよく使われがちですがそれ以外の値も指定できるようです　ここでの解説では「9600」を使用するとします<br /><br />その後は Serial.print() や Serial.println() を使ってシリアルモニタに数値や文字列を送信できます　Serial.print() は C で云うトコロの sprintf() を意識した作りとなってるようですが…書式を全て解説するのもアレなんでその辺は手を抜いてざっくりサンプルを載せておきます<br /><br />----------<br /><br />void setup() {<br />&nbsp; Serial.begin(9600); // シリアル通信を開始する<br />}<br /><br />void loop() {<br />&nbsp; unsigned long time = millis() / 1000; // 動作時間を秒の単位で取得<br />&nbsp; String h = String(time / 3600); // 「時」を文字列にして取得<br />&nbsp; String m = String((time % 3600) / 60); // 「分」を文字列にして取得<br />&nbsp; String s = String(time % 60); // 「秒」を文字列にして取得<br /><br />&nbsp; Serial.println(String(h + &quot;:&quot; + m + &quot;:&quot; + s)); // 整形して送信<br />&nbsp; delay(1000); // 1 秒待って繰り返し<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="850" height="426" src="https://room.dengeki.jp/images/202201301535431-admin.png" alt="202201301535431-admin.png"><br />これは Arduino が動作開始してからの時間を延々と表示し続けるってものです　動作開始してからの時間をミリ秒で取得できる millis() 関数を使い…そこで得られた変数の値を人の目で確認しやすい(と思われる)「時:分:秒」に整形して表示しています　こんな感じで変数の内容を確認できるんでデバッグなどでは大いに助かりますね！<br /><br />　　：<br /><br />シリアルモニタには Arduino に対して文字を送信する機能も備えられています　それを Arduino 側から Serial.read() などを使って読み取るわけですが…基本的に「1文字づつ」送られてくる扱いになるようです<br />例えば「a10Z」と送信すれば「a」と「1」と「0」と「Z」に「設定した改行コード」が加えられて順番に送られてきます<br /><br />あと文字は「文字コード」として送られてきます　「a」だと「97 (0x61)」となり「1」だと「49 (0x31)」となり「0」だと「48 (0x30)」となり「Z」だと「90 (0x5A)」で…最後に「改行コード(LF)」が「10 (0x0A)」って感じになります<br />デバッグ時に「ループ回数の変数をプログラム実行中に指定の値に変更したい」とかの場合だとシリアルモニタから送られてきた「文字」を「数値」に変換する必要があります<br /><br />----------<br /><br />void setup() {<br />&nbsp; Serial.begin(9600); // シリアル通信を開始する<br />}<br />&nbsp;<br />void loop() {<br />&nbsp; if (Serial.available() &gt; 0) // 文字(列)が送信されてきた？<br />&nbsp; {<br />&nbsp;&nbsp; &nbsp;byte data = (Serial.read()); // 送信されてきた文字を読み込む<br />&nbsp;&nbsp; &nbsp;if (data &gt;= &apos;0&apos; && data &lt;= &apos;9&apos;) { // 文字は数字か？<br />&nbsp;&nbsp; &nbsp; &nbsp;data = data - &apos;0&apos;; // 文字コードを数値に変換<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.print(&quot;数字が入力された &#91;&quot; + String(data) + &quot;&#93;\n&quot;);<br />&nbsp;&nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (data == 10) { // 改行コードは表示に不都合があるんで<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; data = 0; // 何も表示しないようにしておく<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.print(&quot;数字以外 &#91;&quot; + String((char)data) + &quot;&#93;\n&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;data = 0; // 数字以外は「0」と扱うことにする<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;for (int i=1; i &lt;= data; i++){ // 送信された数値の数だけループしてみる<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.print(String(data) + &quot; 回ループの &quot; + String(i) + &quot; 回目\n&quot;);<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="850" height="426" src="https://room.dengeki.jp/images/202201301535433-admin.png" alt="202201301535433-admin.png"><br />シリアルモニタに適当な適当な文字(列)を入力して「送信」します<br /><br /><img class="embeddedimage " width="850" height="426" src="https://room.dengeki.jp/images/202201301535432-admin.png" alt="202201301535432-admin.png"><br />送信した文字に「数値」があればその数だけ for() のループ回数を変更します　「数値」以外の文字は処理しないようにしてあります<br />なお「1文字づつ」送られてくるってのが少々厄介で…「10以上の数値」を扱う場合にはひと工夫必要です　どうしたらいいんだろう？　先に送られてきた数値を10倍してそこに新たに送られてきた数値を足すって流れになるのでしょうか　ちょっと大掛かりになってくるっていうか面倒なんで今回はスルーしときますが概ねそんな流れになると思います（汗<br /><br />そんなこんなな Arduino のシリアル通信なお話でした　しょーみもっと早く知っとっけばよかった！って思いつつ書いてましたとさ（瀧汗 <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a><br /><br />　　：<br /><br />※ 追記 ※<br />「いやいや Arduino でも sprintf() って使えるじゃん？」ってタレコミを頂いんたんでよくよく調べたらありました（汗　参照している <a class="url labeledlink" href="http://www.musashinodenpa.com/arduino/ref/index.php" rel="noopener noreferrer" target="_blank">Arduino リファレンス</a> にはその辺が載ってなかったんで…無いものとばっか思ってました<br /><br />他にも数値かどうか？を判定する isDigit() や改行の判定に使ってたものを isPrintable() に置き換えられるようなものもありました<br />上で説明してる数値を変数に代入して云々…で書いてるものもこんな感じでできそうです<br /><br />&nbsp;&nbsp; &nbsp;if (data &gt;= &apos;0&apos; && data &lt;= &apos;9&apos;) { // 文字は数字か？<br />　　　　　　　　↓<br />&nbsp;&nbsp; &nbsp;if (isDigit(data)) { // 文字は数字か？<br /><br />----<br /><br />&nbsp;&nbsp; &nbsp; &nbsp;if (data == 10) { // 改行コードは表示に不都合があるんで<br />　　　　　　　　↓<br />&nbsp;&nbsp; &nbsp; &nbsp;if (!isPrintable(data)) { // 改行コード等は表示に不都合があるんで<br /><br />いやはや勉強になりました！　興味本位でなんとなく始めた Arduino ってことでまだまだ知らないことだらけなんで…こうして知識が広がっていくのは楽しいです　どもありがとございました！(&gt;_&lt;)ｗ -- Posted by 猫山ぽるか 〔3825文字〕 No.19 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=19</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=19</guid>
	<category>info</category>
	<pubDate>Sun, 30 Jan 2022 15:35:43 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 吉野家・豚生姜焼き丼 ]]></title>
	<description><![CDATA[ 吉野家・豚生姜焼き丼<br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/20220123055712-admin.jpg" alt="20220123055712-admin.jpg"><br />　<br />生姜の刺激的な味がとにかく効いてる <a class="url labeledlink" href="https://www.yoshinoya.com/" rel="noopener noreferrer" target="_blank">吉野家</a> の <a class="url labeledlink" href="https://www.yoshinoya.com/menu/butadon/buta-syouga-don/" rel="noopener noreferrer" target="_blank">豚生姜焼き丼</a> を食べてきました<br />生姜の風味がたっぷり味わえる生姜焼きが丼でお手軽に頂けちゃう！　そこに更におろし生姜まで載っててイイネ！　寒い時期にうれしい身体がポカポカ温まる美味しさです<br />大きめカットの白ネギの風味もアクセントとなり最後まで飽きること無く楽しめる！<br /><br />定番メニューなのか季節限定メニューなのかはちょっとよく判らない感じですが…冬に嬉しいお味なんでまた早いうちに食べに行きたいです！ <a href="https://room.dengeki.jp/tegalog.cgi?tag=%e5%a4%96%e9%a3%9f%e8%a8%98%e9%8c%b2" class="taglink" title="外食記録">#外食記録</a> -- Posted by 猫山ぽるか 〔243文字〕 No.18 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=18</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=18</guid>
	<category>diary</category>
	<pubDate>Sun, 23 Jan 2022 05:57:12 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ かつや・デミチキンカツ丼 ]]></title>
	<description><![CDATA[ かつや・デミチキンカツ丼<br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/20220116101003-admin.jpg" alt="20220116101003-admin.jpg"><br />　<br /><a class="url labeledlink" href="https://www.arclandservice.co.jp/katsuya/" rel="noopener noreferrer" target="_blank">かつや</a> の期間限定！　濃厚デミグラスソースにチーズのコクがたまらない <a class="url labeledlink" href="https://prtimes.jp/main/html/rd/p/000000541.000032350.html" rel="noopener noreferrer" target="_blank">デミチキンカツ丼</a> を食べてきました<br />オーダーして…厨房から漂ってくるデミグラスソースの香りからして気分が盛り上がってきます　そして丼を覆い隠さんばかりのチキンカツが 2 枚！　そこに豚肉たっぷりなデミソースがかかっています！<br /><br />最初はデミソースがかかってないサックリした部分のチキンカツから楽しみ…お次はデミソースがかかったしっとりした衣を楽しむ流れがイイネ！<br />たっぷり豚肉も食べ応えあってたまりません！　もちろん刻みキャベツも入っているし飽きること無く最後まで楽しめます<br />いやむしろ具だくさんすぎてご飯とのペース配分が困難すぎますねｗ　これは丼より…ちょっと奮発して定食にしたほうが余すとこなく味わえるのかなーって思いました<br /><br />期間限定なのが惜しい逸品です！　また近いうちに食べに行きたいです <a href="https://room.dengeki.jp/tegalog.cgi?tag=%e5%a4%96%e9%a3%9f%e8%a8%98%e9%8c%b2" class="taglink" title="外食記録">#外食記録</a> -- Posted by 猫山ぽるか 〔404文字〕 No.17 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=17</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=17</guid>
	<category>diary</category>
	<pubDate>Sun, 16 Jan 2022 10:10:03 +0900</pubDate>
</item>
<!-- 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[ スガキヤ・味噌ラーメン ]]></title>
	<description><![CDATA[ スガキヤ・味噌ラーメン<br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/20220102175047-admin.jpg" alt="20220102175047-admin.jpg"><br />　<br />我らが <a class="url labeledlink" href="http://www.sugakico.co.jp/" rel="noopener noreferrer" target="_blank">スガキヤ</a> の新メニューに <a class="url labeledlink" href="http://www.sugakico.co.jp/menu/noodle_menu/entry-1607.html" rel="noopener noreferrer" target="_blank">味噌ラーメン</a> が登場したんで食べてきました<br />伝統の豚骨スープに味噌を加えたって感じでしょうか　食べ慣れた味に味噌のコッテリ感が加わって美味しいですね！<br />そこに別添のバターを入れて更にまろやかさがアップ！　モヤシとコーンの相性も抜群ですね<br /><br />名古屋の血液と云いますか…豚骨スープな白血球に味噌の赤血球が加わったって感じで身も心も癒やされるｗｗ<br />スガキヤ的にはちょっとお値段高めですが…いやいやこれはまた食べに行きたくなるお味です！　おすすめです！ <a href="https://room.dengeki.jp/tegalog.cgi?tag=%e5%a4%96%e9%a3%9f%e8%a8%98%e9%8c%b2" class="taglink" title="外食記録">#外食記録</a> -- Posted by 猫山ぽるか 〔260文字〕 No.15 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=15</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=15</guid>
	<category>diary</category>
	<pubDate>Sun, 02 Jan 2022 17:50:47 +0900</pubDate>
</item>

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

