<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ カテゴリ「情報」に属する投稿［21件］ - でんげき☆ 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[ TeraStation™ 5000N Series って N… ]]></title>
	<description><![CDATA[ TeraStation™ 5000N Series って NAS のディスク交換した際のリカバリ方法メモ<br /><img class="embeddedimage nolisted" width="400" height="400" src="https://room.dengeki.jp/images/20240331104654-admin.png" alt="20240331104654-admin.png"><br /><br />時既に死語となりつつある SOHO っていうか小規模企業用のファイルサーバとして多く使われているファイルサーバ(NAS)がリプレースされて大漁にジャンク屋さん等に流れてきて安く叩き売りされているってイメージの TeraStation™ 5000N Series があるんだけど…こいつは動作用のシステム(Linux)を搭載 Disk 上に構築してるって都合上なのかその Disk を抜いちゃうとピクリともしない置物になっちゃうんでその辺をリカバリする方法を今後の忘れ物防止メモ的に記した概ね私的なドキュメントです汗<br /><img class="embeddedimage nolisted" width="1066" height="800" src="https://room.dengeki.jp/images/202403311032107-admin.jpg" alt="202403311032107-admin.jpg"> <img class="embeddedimage nolisted" width="1066" height="800" src="https://room.dengeki.jp/images/202403311032106-admin.jpg" alt="202403311032106-admin.jpg"><br />そんなこなんで今回は前々から使ってた BUFFALO TeraStation TS5200D って NAS のディスクを HDD から…消音化を期待して SSD へと置換した際の作業履歴です　ちなみに HDD として運用してた際のデータは約 4TB ほどあり…それを 2TB の SSD にまるっと複製するのは物理的に不可能だってことなんで HDD のデータは事前にファイルを抜いた後に SSD に換装して真っ更な状態に再構築したって条件になります<br /><br />それでは→ <a class="url labeledlink" href="https://www.buffalotech.com/products/terastation-5000n-series" rel="noopener noreferrer" target="_blank">TeraStation™ 5000N Series | Buffalo Americas</a> から USB メモリに書き込むブート可能なイメージファイルをダウンロードしてきます<br /><br /><img class="embeddedimage nolisted" width="1280" height="800" src="https://room.dengeki.jp/images/202403311032107-admin.png" alt="202403311032107-admin.png"><br />「<span class="decorationC" style="color:red;">DOWNLOAD CONTENTS</span>」タブを選んだ後に…<br /><br /><img class="embeddedimage nolisted" width="1920" height="1200" src="https://room.dengeki.jp/images/202403311032106-admin.png" alt="202403311032106-admin.png"><br />「<span class="decorationC" style="color:red;">Bootable USB recovery image for TS5000 series.</span>」って感じの説明があるものをダウンロードします　※ 2024/03/31 時点で「TS5k_recovery_260.zip」ってファイルでした　これを適当な場所に解凍しておきます<br /><br /><img class="embeddedimage nolisted" width="548" height="511" src="https://room.dengeki.jp/images/202403311032105-admin.png" alt="202403311032105-admin.png"><br />これを別途用意しておいた USB メモリ(※概ね 2GB くらいの容量を必要とするらしく…まぁ余裕を考えて 2.1GB 以上の USB メモリが必須だと思われる)にブートイメージを書き込みます　この際 Windows 利用の場合だと添付の専用ツールでどうにかなるらしいのですが…まぁ Linux とかなら普通に dd を使って TS5000V2.6bootUSB.ddi を書き込めばいいようです ※画像は既に TS5000V2.6bootUSB.ddi を書き込んだ後のものなのでアレですけど汗<br /><br /><img class="embeddedimage nolisted" width="1006" height="724" src="https://room.dengeki.jp/images/202403311032104-admin.png" alt="202403311032104-admin.png"><br />$ <span class="decorationC" style="color:green;">sudo dd if=TS5000V2.6bootUSB.ddi of=/dev/sd<span class="decorationC" style="color:red;">○</span> status=progress</span><br /><br /><img class="embeddedimage nolisted" width="738" height="526" src="https://room.dengeki.jp/images/202403311032103-admin.png" alt="202403311032103-admin.png"><br />of=/dev/sd<span class="decorationC" style="color:red;">○</span> の「<span class="decorationC" style="color:red;">○</span>」の部分は各人の環境により異なります！　必ず「コントロールセンター」→「ハードウェア：ディスク」を参照するなりして適切に指定してください！！　※画像は既に TS5000V2.6bootUSB.ddi を書き込んだ後のものなのでアレですけど再び汗<br /><br />　　：<br /><br />これでブータブル USB メモリの準備ができたんで TeraStation のリカバリをしていきます　もちろんこの段階で TeraStation に HDD なり SSD を正しく装着した状態にしておきます<br /><br /><img class="embeddedimage nolisted" width="1422" height="800" src="https://room.dengeki.jp/images/202403311032105-admin.jpg" alt="202403311032105-admin.jpg"><br />先程の USB メモリを TeraStation 背面の USB ポートに挿し…ブートのセレクタスイッチを「USB」側にセットして電源を接続して本体前面にある電源ボタンを ON にします<br /><br /><img class="embeddedimage nolisted" width="1422" height="800" src="https://room.dengeki.jp/images/202403311032104-admin.jpg" alt="202403311032104-admin.jpg"><br />しばらくすると本体前面の液晶表示部に「Recovery I41 PushFuncToStart」と表示されるんで…同じく本体前面にある「FUNCTION」ボタンを押す<br /><br /><img class="embeddedimage nolisted" width="1422" height="800" src="https://room.dengeki.jp/images/202403311032103-admin.jpg" alt="202403311032103-admin.jpg"><br />本体前面の液晶表示部が「Recovery I37 SystemRecovering」となりリカバリ処理が実行されます<br /><br /><img class="embeddedimage nolisted" width="1422" height="800" src="https://room.dengeki.jp/images/202403311032102-admin.jpg" alt="202403311032102-admin.jpg"><br />リカバリが完了しました<br /><br /><img class="embeddedimage nolisted" width="1422" height="800" src="https://room.dengeki.jp/images/202403311032101-admin.jpg" alt="202403311032101-admin.jpg"><br />電源を切り…本体背面のブートのセレクタスイッチを「HDD」側にセットしてリカバリ USB メモリを抜いて LAN ケーブルなんかを挿して諸々の準備が整ったら再度電源を入れます<br /><br />　　：<br /><br />これで後は BUFFALO TeraStation TS5200D の IP アドレスにブラウザでアクセスすれば設定画面が表示される…らしいんですがなんかバグったような表示になり先に進めない？　困りましたね(-_-；)<br />どうやらこの辺はファームのアップデートを行えば対処できるらしいんでそのようにしてみます<br /><br /><img class="embeddedimage nolisted" width="1920" height="1200" src="https://room.dengeki.jp/images/202403311032102-admin.png" alt="202403311032102-admin.png"><br /><a class="url labeledlink" href="https://www.buffalo.jp/support/download/detail/?dl_contents_id=60784" rel="noopener noreferrer" target="_blank">TeraStation 5000シリーズ ファームウェア アップデーター (Windows)</a> ってのがあるようなのでダウンロードしてきます<br /><br /><img class="embeddedimage nolisted" width="961" height="724" src="https://room.dengeki.jp/images/202403311032101-admin.png" alt="202403311032101-admin.png"><br />ダウンロードした ts5000-v422.exe は…そのまま ZIP ツールで解凍できるんで適当なフォルダに解凍します　そして解凍したフォルダに移動して TS5000-v422 フォルダに移動した後に Windows のアプリケーションを Linux 上で動作させる Wine ってのを使って TSUpdater.exe を実行します<br /><br /><img class="embeddedimage nolisted" width="1348" height="724" src="https://room.dengeki.jp/images/20240331103210-admin.png" alt="20240331103210-admin.png"><br />$ <span class="decorationC" style="color:green;">wine TSUpdater.exe</span><br /><br /><img class="embeddedimage nolisted" width="1422" height="800" src="https://room.dengeki.jp/images/20240331103210-admin.jpg" alt="20240331103210-admin.jpg"><br />TeraStation のファームがいろいろと更新されていきます<br /><br />これらの作業が全て完了すれば…今度こそ BUFFALO TeraStation TS5200D の IP アドレスにブラウザでアクセスできるようになり諸々の設定が可能になります<br />ちなみに初回起動時の管理者ユーザ名とパスワードは<br />ユーザー名：<span class="decorationC" style="color:green;">admin</span><br />パスワード：<span class="decorationC" style="color:green;">password</span><br />で入れます　入ったら直ちにパスワードを別のものに変更しておきましょう<br /><br />そんなこなんないろいろとややこしそうな作業の連続ですが…まぁ間違えたりしても最初のリカバリ USB メモリでのブートの辺りまで戻れば何度でもやり直し可能なんで気楽に作業すればいいかなって感じです　それでは良いジャンク NAS 生活を！(&gt;_&lt;)ｗ <a href="https://room.dengeki.jp/tegalog.cgi?tag=%4e%41%53" class="taglink" title="NAS">#NAS</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%55%62%75%6e%74%75" class="taglink" title="Ubuntu">#Ubuntu</a> -- Posted by 猫山ぽるか 〔2493文字〕 No.39 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=39</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=39</guid>
	<category>info</category>
	<pubDate>Sun, 31 Mar 2024 06:53:43 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ (M5) ATOM Lite でまぁまぁスマートなリモコンを… ]]></title>
	<description><![CDATA[ (M5) ATOM Lite でまぁまぁスマートなリモコンを作ろう<br /><img class="embeddedimage nolisted" width="400" height="400" src="https://room.dengeki.jp/images/202307171653523-admin.png" alt="202307171653523-admin.png"><br />　<br />今年の初めに…かれこれ 18 年くらい住んでたボロアパートをぶっ壊すってんで追い出されて今度は高級マンションの最上階に引っ越してきました！(&gt;_&lt;)ｗ　そんな高級マンションには…ご入居前リフォームで 2022 年製のエアコンに交換されていたのはいいんだけどちょっと使いづらいんですよね<br />何が使いづらいかっていうと…リモコンでのタイマーセットが不便なんですよ　以前のボロアパートで使ってたエアコンはリモコンに RTC(時計) が実装されていたのでタイマーセットも絶対時間で行うことができていたんですよ　それがご新居のエアコンのリモコンには RTC(時計) が付いてないもんだでタイマーセットしようとすると「7時間後」って感じの相対時間での設定になるんですよ　不便ですよね(-_-；)<br />そんな訳なんでもちっとタイマーセットしやすいリモコンをどうにかするっていうか…せっかくなんでスマホちゃん等と連動させて絶対時間でエアコンの On/Off を制御できるリモコンを作ってみることにしました<br /><br />昨年に「安いじゃん！」って思って買っておいた (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> が手元にあるんでそれを使うことにしました　今買うなら (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/8778" rel="noopener noreferrer" target="_blank">ATOMS3 Lite</a> &nbsp;のほうがいいのかも知れないけど未確認です汗<br />それと CGI っていうか Perl が使える Web サーバが必要です　今回は Raspberry Pi OS にセットアップした Apache を使ってるけど…プロバイダなどで供されている CGI の使える Web サーバでも大丈夫だと思います<br /><br />そうそう今回使う (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> には RTC が載っていません　それ即ち時計が使えないって事なんでその辺をどうにかしなければなりません<br />そこで一定時間(今回は約30秒)ごとに Web サーバにアクセスして…アクセスされた Web サーバが現在時刻(とエアコン設定内容)を返しそれにより時刻の判定を行うようにしました<br /><br />　　：<br /><br />それでは最初に (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> の方から初めていきましょう　開発環境は Linux っていうか Snap 版の Arduino IDE を使いました　まぁ Arduino IDE であれば Windows 版とかでも同じく使えるとは思いますが未確認です汗　そんな Arduino IDE の設定は <a class="url labeledlink" href="https://room.dengeki.jp/tegalog.cgi?postid=24" rel="noopener noreferrer" target="_blank">M5StickC Plus の開発環境を構築する</a> が参考になると思います　ボードを追加した後に「M5Stack-ATOM」を設定すれば ok です<br /><br />お次は (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> 向けのライブラリのインストールですかね　これは「<span class="decorationC" style="color:red;">ツール</span>」メニューから「<span class="decorationC" style="color:red;">ライブラリを管理…</span>」を選んで検索窓に必要なキーワードを入れて出てきたものをインストールってする感じですかね<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.jp/images/20230717165352-admin.png" alt="20230717165352-admin.png"><br />「<span class="decorationC" style="color:red;">m5atom</span>」と入れて出てきた「M5Atom」をインストールする<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.jp/images/202307171653522-admin.png" alt="202307171653522-admin.png"><br />「<span class="decorationC" style="color:red;">irremoteesp8266</span>」と入れて出てきた「IRremoteEsp8266」をインストールする<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.jp/images/202307171653521-admin.png" alt="202307171653521-admin.png"><br />「<span class="decorationC" style="color:red;">heatpumpir</span>」と入れて出てきた「HeatpumpIR」をインストールする<br /><br />これでライブラリ類の準備も完了ですかね　それではコードを見ていきましょう…っていうか手探りの「どうにか動く」テスト的なものだったのが意外と問題なく動いてしまって「あーなんか書き直すのもめんどくさいなー」って気分が昂ぶってきたんでそんなテスト的なものをそのまま載せています　動作未保証なのはもちろんとして…諸々をきちっと書き直して使ってください　それだけが私の望みです汗<br /><br />　　：<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">remcon.ino</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#35;include &lt;M5Atom.h&gt; // Atom のヘッダファイルを準備<br />&#35;include &lt;WiFiMulti.h&gt;<br />&#35;include &lt;HTTPClient.h&gt;<br />&#35;include &lt;MitsubishiHeatpumpIR.h&gt;<br /><br />const char* url = &quot;http://user:pass@hoge.orz/remocon/read.cgi&quot;; // 現在時刻＆設定内容の場所<br />const char* ssid = &quot;WiFi_ssid&quot;; &nbsp;// SSID<br />const char* password = &quot;WiFi_pass&quot;; &nbsp;// パスワード<br /><br />const uint16_t kIrLed = 12; // 赤外線 LED 送信用のポート番号<br />IRSenderBitBang irSender(kIrLed); // 赤外線LEDが接続されているピン番号<br />HeatpumpIR *airCon = new MitsubishiFDHeatpumpIR(); &nbsp;// 三菱エアコンのインスタンス<br /><br />// FastLED ライブラリの設定(CRGB構造体)<br />CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {<br />&nbsp; return (CRGB)((r &lt;&lt; 16) | (g &lt;&lt; 8) | b);<br />}<br /><br />WiFiMulti WiFiMulti; &nbsp;// Wi-Fi を使いたい<br /><br />void setup() {<br />&nbsp; Serial.begin(115200);<br />&nbsp; Serial.println(&quot;&quot;);<br /><br />&nbsp; M5.begin(true, false, true); &nbsp;// 本体初期化(UART有効, I2C無効, LED有効)<br />&nbsp; M5.dis.drawpix(0, dispColor(0, 0, 0)); &nbsp;// LED全消灯(赤, 緑, 青)<br /><br />&nbsp; WiFiMulti.addAP(ssid, password); // 「SSID」と「パスワード」を設定しておく<br />&nbsp; Serial.print(&quot;Fi-Fi Connecting.&quot;);<br />}<br /><br />void loop() {<br />&nbsp; while (WiFiMulti.run() != WL_CONNECTED) {<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;.&quot;);<br />&nbsp;&nbsp; &nbsp;M5.dis.drawpix(0, dispColor(255, 0, 0)); &nbsp;//LED(赤)<br />&nbsp;&nbsp; &nbsp;delay(500);<br />&nbsp; }<br />&nbsp; Serial.print(&quot;ADDR: &quot;);<br />&nbsp; Serial.println(WiFi.localIP());<br /><br />&nbsp; M5.dis.drawpix(0, dispColor(20, 20, 20)); // LED(白)<br /><br />&nbsp; HTTPClient http;<br />&nbsp; http.begin(url);<br />&nbsp; Serial.print(&quot;GET: &quot;);<br />&nbsp; int httpCode = http.GET(); &nbsp;// GET メソッドでファイルを取得<br />&nbsp; Serial.println(httpCode);<br />// &nbsp;Serial.println(http.errorToString(httpCode));<br /><br />&nbsp; if (httpCode &gt; 0) {<br />&nbsp;&nbsp; &nbsp;String htdoc = http.getString(); &nbsp;// 取得したファイルの内容<br />&nbsp;&nbsp; &nbsp;Serial.println(htdoc);<br /><br />// &nbsp;YYYY/MM/DD HH:YY:MM(WDAY)\ts?,HH:MM e?,HH:MM m?<br />// &nbsp;現在年/月/日 時:分:秒(曜日)\t開始フラグ,時:分 終了フラグ,時:分 モード<br />&nbsp;&nbsp; &nbsp;String now_hour = htdoc.substring(11, 13); &nbsp;// 現在時を取得<br />&nbsp;&nbsp; &nbsp;String now_min = htdoc.substring(14, 16);&nbsp; &nbsp;// 現在分を取得<br /><br />&nbsp;&nbsp; &nbsp;String st = htdoc.substring(25, 27);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// 開始フラグを取得<br />&nbsp;&nbsp; &nbsp;String ed = htdoc.substring(34, 36);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// 終了フラグを取得<br /><br />&nbsp;&nbsp; &nbsp;String st_hour = htdoc.substring(28, 30);&nbsp; &nbsp;// 開始時<br />&nbsp;&nbsp; &nbsp;String st_min = htdoc.substring(31, 33);&nbsp; &nbsp; // 開始分<br /><br />&nbsp;&nbsp; &nbsp;String ed_hour = htdoc.substring(37, 39);&nbsp; &nbsp;// 終了時<br />&nbsp;&nbsp; &nbsp;String ed_min = htdoc.substring(40, 42);&nbsp; &nbsp; // 終了分<br /><br />&nbsp;&nbsp; &nbsp;String md = htdoc.substring(43, 45);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// モードを取得<br /><br />&nbsp;&nbsp; &nbsp;if (st == &quot;s1&quot; && now_hour == st_hour && now_min == st_min) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (md == &quot;m1&quot;) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Cool&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(0, 0, 255)); &nbsp;//LED(青)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 冷房<br />&nbsp;&nbsp; &nbsp; &nbsp;} else if (md == &quot;m2&quot;) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Hot&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(255, 255, 0)); &nbsp;//LED(黄)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_HEAT, FAN_1, 16, VDIR_DOWN, HDIR_AUTO); // 暖房<br />&nbsp;&nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Dry&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(0, 255, 0)); &nbsp;//LED(緑)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_DRY, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 除湿<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;if (ed == &quot;e1&quot; && now_hour == ed_hour && now_min == ed_min) {<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.println(&quot;--- Stop ---&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;M5.dis.drawpix(0, dispColor(255, 0, 255)); &nbsp;//LED(紫)<br />&nbsp;&nbsp; &nbsp; &nbsp;airCon-&gt;send(irSender, POWER_OFF, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 電源 Off<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp; } else { &nbsp;// ファイルの取得に失敗している<br />&nbsp;&nbsp; &nbsp;Serial.println(&quot;Error&quot;);<br />&nbsp; }<br /><br />&nbsp; delay(30000);<br />}<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">remcon.ino</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />※デバッグ用のシリアル通信のアレが残っているんで実稼働時には消したほうがいいかも知れないです<br /><br />冒頭の <span class="decorationC" style="color:green;">&#35;include &lt;MitsubishiHeatpumpIR.h&gt;</span> は…まぁ見ての通り三菱社製のエアコン制御をする時に使うものです　これが他社製であれば<br /><span class="decorationC" style="color:green;">&#35;include &lt;DaikinHeatpumpIR.h&gt;</span> &nbsp;// ダイキン社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;FujitsuHeatpumpIR.h&gt;</span> &nbsp;// 富士通社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;HitachiHeatpumpIR.h&gt;</span> &nbsp;// 日立社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;PanasonicHeatpumpIR.h&gt;</span> &nbsp;// パナソニック社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;ToshibaHeatpumpIR.h&gt;</span> &nbsp;// 東芝社製<br />こんな感じになるんじゃないかと思います(未確認)　詳しくは Aruduino IDE の関連フォルダ Arduino/libraries/HeatpumpIR/ を眺めてみるといいかと思います<br /><br />　　：<br /><br />データ(と時間)を取ってくる Web サーバの設定と… Wi-Fi 接続に関する設定を行います<br /><span class="decorationC" style="color:green;">const char* url = &quot;http://user:pass@hoge.orz/remcon/read.cgi&quot;; // 現在時刻＆設定内容の場所<br />const char* ssid = &quot;WiFi-ssid&quot;; &nbsp;// SSID<br />const char* password = &quot;WiFi-pass&quot;; &nbsp;// パスワード</span><br />保安上っていうか恐らくベーシック認証なりをかけて運用すると思うのですが…その際に ID とパスワードの入力を自動化しておかねばなりません　そんなときは <span class="decorationC" style="color:red;">http://user:pass@hoge.orz/remcon/read.cgi</span> って感じで URL の前に「<span class="decorationC" style="color:red;">user:pass@</span>」を付ければ自動で認証してくれます　この書き方は一般的なブラウザでも(警告が出るかもだけど)使えます<br />その次に Wi-Fi の SSID とパスワードの設定を行います　上記のベーシック認証と併せて平文のパスワードを記すことになるので取り扱いには十分注意してください<br /><br />　　：<br /><br /><span class="decorationC" style="color:green;">HTTPClient http;<br />http.begin(url);<br />int httpCode = http.GET(); &nbsp;// GET メソッドでファイルを取得</span><br />Wi-Fi 接続が確立したら目的のサーバからデータを取ってきます　後でも説明しますが…ここで得られるデータは次のようになっています<br /><br /><span class="decorationC" style="color:red;">YYYY/MM/DD HH:YY:MM(WDAY)&#91;タブ(\t)&#93;s?,HH:MM e?,HH:MM m?</span><br />&#91;タブ(\t)&#93; の前半がアクセスした時点での日時<br />&#91;タブ(\t)&#93; の後半がエアコンの開始/終了の時刻とモードを指しています<br />例えば <span class="decorationC" style="color:blue;">12 時 34 分</span>に作動させたい場合は <span class="decorationC" style="color:red;">s1,12:34</span> となります　その次が <span class="decorationC" style="color:red;">e1,23:45</span> だったら <span class="decorationC" style="color:blue;">23 時 45 分</span>に電源を切る動作となります　これが <span class="decorationC" style="color:red;">s0</span> もしくは <span class="decorationC" style="color:red;">e0</span> だった場合は何も動作しないようにしています<br />行末の <span class="decorationC" style="color:blue;">m?</span> は動作モードを指しています　<span class="decorationC" style="color:red;">m1</span> が冷房　<span class="decorationC" style="color:red;">m2</span> が暖房　<span class="decorationC" style="color:red;">m3</span> が除湿です　<br />http.GET(); した際のバッファサイズが不明だったんで…できるだけ切り詰めて必要最小限の内容にしました　バッファに余裕があればもっと見やすい内容にするのもアリかもしれませんね<br /><br />　　：<br /><br />そして実際に赤外線で信号を送信する部分です<br /><span class="decorationC" style="color:green;">airCon-&gt;send(irSender, POWER_ON, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 冷房</span><br /><br />各パラメータの意味は以下のようになっています<br />// airCon-&gt;send( irSender, POWER_**, MODE_**, FAN1, 温度設定, VDIR_** , HDIR_** ); // 設定項目 ※温度設定は「整数値」で<br />// &nbsp;Arduino/libraries/HeatpumpIR/HeatpumpIR.h<br />//<br />// ・POWER (電源)<br />//&nbsp; &nbsp; POWER_ON (on)<br />//&nbsp; &nbsp; POWER_OFF (off)<br />// ・MODE (モード)<br />//&nbsp; &nbsp; MODE_AUTO (自動)<br />//&nbsp; &nbsp; MODE_COOL (冷房)<br />//&nbsp; &nbsp; MODE_HEAT (暖房)<br />//&nbsp; &nbsp; MODE_DRY (除湿)<br />//&nbsp; &nbsp; MODE_ON (不明)<br />//&nbsp; &nbsp; MODE_OFF (不明)<br />// ・FAN (風量)<br />//&nbsp; &nbsp; FAN_AUTO<br />//&nbsp; &nbsp; FAN_1 （弱）<br />//&nbsp; &nbsp; FAN_2<br />//&nbsp; &nbsp; FAN_3<br />//&nbsp; &nbsp; FAN_4<br />//&nbsp; &nbsp; FAN_5 （強）<br />// ・VDIR (風向高さ)<br />//&nbsp; &nbsp; VDIR_AUTO<br />//&nbsp; &nbsp; VDIR_UP<br />//&nbsp; &nbsp; VDIR_MUP<br />//&nbsp; &nbsp; VDIR_MIDDLE<br />//&nbsp; &nbsp; VDIR_MDOWN<br />//&nbsp; &nbsp; VDIR_DOWN<br />// ・HDIR (風向左右)<br />//&nbsp; &nbsp; HDIR_AUTO<br />//&nbsp; &nbsp; HDIR_LEFT<br />//&nbsp; &nbsp; HDIR_MLEFT<br />//&nbsp; &nbsp; HDIR_MIDDLE<br />//&nbsp; &nbsp; HDIR_MRIGHT<br />//&nbsp; &nbsp; HDIR_RIGHT<br /><br />エアコンの設定温度は整数値で指定する必要があるようです　最近は 0.5℃ 間隔で設定できるエアコンが増えてる感じですが…そこまで細かい制御には対応できないっぽいです　また今回のプログラムでは設定温度を即値の決め打ちしています　使い勝手を高めるのであればこの辺も外部から変更できるようにすべきですね<br /><br />だいたいこんな感じですかね　これを <span class="decorationC" style="color:green;">delay(30000);</span> して約 30 秒間隔のループで回しています　なにかの都合…例えば <span class="decorationC" style="color:green;">http.GET();</span> した際にサーバの返答が遅れたりするとループ間隔が長くなり指定された時間を通り越してしまうかも？って思ってこのくらいの間隔にしました　まぁこの辺は各環境によりけりで程よい設定にしてもらえればなぁって思います<br /><br />　　：<br /><br />さて…お次は UI っていうか Web サーバ側の云々ですかね　用意するのは 4 つのファイル(<span class="decorationC" style="color:green;">index.html</span>, <span class="decorationC" style="color:green;">index.css</span>, <span class="decorationC" style="color:green;">index.cgi</span>, <span class="decorationC" style="color:green;">read.cgi</span>)とスクリプトが生成する 1 つのファイル(<span class="decorationC" style="color:green;">data.txt</span>)です<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.html</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#60;!DOCTYPE html&#62;<br />&#60;html lang=&quot;ja&quot;&#62;<br />&#60;head&#62;<br />&nbsp; &nbsp;&#60;meta charset=&quot;UTF-8&quot;&#62;<br />&nbsp; &nbsp;&#60;!-- ビューポートの設定 --&#62;<br />&nbsp; &nbsp;&#60;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&#62;<br />&nbsp; &nbsp;&#60;!-- スタイルシートの読み込み --&#62;<br />&nbsp; &nbsp;&#60;link href=&quot;./index.css&quot; rel=&quot;stylesheet&quot;&#62;<br />&nbsp; &nbsp;&#60;title&#62;M5 Atom Lite タイマー予約&#60;/title&#62;<br />&#60;/head&#62;<br />&#60;body&#62;<br /><br />&#60;center&#62;&#60;div class=&quot;red&quot;&#62;&#60;/div&#62;&#60;/center&#62;<br />&#60;center&#62;&#60;form action=&quot;./index.cgi&quot; method=&quot;get&quot;&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label for=&quot;name&quot;&#62;&#60;a href=&quot;./index.cgi&quot;&#62;M5 Atom Lite タイマー予約&#60;/a&#62;&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label&#62;&#60;input class=&quot;st&quot; type=&quot;checkbox&quot; name=&quot;st&quot; value=&quot;1&quot;&#62;「入り」を使う&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;st_hour&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;01&quot;&#62;01&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;02&quot;&#62;02&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;03&quot;&#62;03&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;04&quot;&#62;04&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;05&quot;&#62;05&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;06&quot;&#62;06&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;07&quot;&#62;07&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;08&quot;&#62;08&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;09&quot;&#62;09&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;11&quot;&#62;11&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;12&quot;&#62;12&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;13&quot;&#62;13&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;14&quot;&#62;14&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;15&quot;&#62;15&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;16&quot;&#62;16&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;17&quot;&#62;17&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;18&quot;&#62;18&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;19&quot;&#62;19&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;21&quot;&#62;21&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;22&quot;&#62;22&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;23&quot;&#62;23&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;時<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;st_min&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;30&quot;&#62;30&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;40&quot;&#62;40&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;50&quot;&#62;50&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62; 分<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label&#62;&#60;input class=&quot;ed&quot; type=&quot;checkbox&quot; name=&quot;ed&quot; value=&quot;1&quot;&#62;「切り」を使う&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;ed_hour&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;01&quot;&#62;01&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;02&quot;&#62;02&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;03&quot;&#62;03&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;04&quot;&#62;04&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;05&quot;&#62;05&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;06&quot;&#62;06&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;07&quot;&#62;07&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;08&quot;&#62;08&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;09&quot;&#62;09&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;11&quot;&#62;11&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;12&quot;&#62;12&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;13&quot;&#62;13&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;14&quot;&#62;14&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;15&quot;&#62;15&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;16&quot;&#62;16&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;17&quot;&#62;17&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;18&quot;&#62;18&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;19&quot;&#62;19&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;21&quot;&#62;21&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;22&quot;&#62;22&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;23&quot;&#62;23&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;時<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;ed_min&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;30&quot;&#62;30&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;40&quot;&#62;40&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;50&quot;&#62;50&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;分<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp; &#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;1&quot;&#62;冷房<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;2&quot;&#62;暖房<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;3&quot;&#62;除湿<br />&nbsp; &nbsp;&#60;/div&#62;<br /><br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;hrline&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;submit&quot; type=&quot;submit&quot; value=&quot;予約&quot;&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&#60;/form&#62;&#60;/center&#62;<br /><br />&#60;/body&#62;<br />&#60;/html&#62;<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.html</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />index.html ってファイル名なんで…デフォルトで表示されるファイルっぽいですが実際にはそのような用途には使っていません　デザインしやすいようにファイルを分割してあるだけで実際に表示は index.cgi が行います<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.css</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />/* ボディ */<br />body {&nbsp; &nbsp;/* 一般的な表示部 */<br />&nbsp; &nbsp;margin: 0 ;<br />&nbsp; &nbsp;padding: 0 ;<br />&nbsp; &nbsp;font-size: 20px ;<br />&nbsp; &nbsp;line-height: 3 ;<br />}<br /><br />input {&nbsp; &nbsp;/* チェックボックス */<br />&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />}<br /><br />select {&nbsp; &nbsp;/* プルダウンメニュー */<br />&nbsp; &nbsp;font-size: 30px ;<br />}<br /><br />.hrline {&nbsp; &nbsp;/* 罫線(？) */<br />&nbsp; &nbsp;border: none;<br />&nbsp; &nbsp;background-color: &#35;fff;<br />&nbsp; &nbsp;border-width: 1px 0 0 0;<br />&nbsp; &nbsp;border-top: double;<br />&nbsp; &nbsp;border-color: black;<br />}<br /><br />.submit {&nbsp; &nbsp;/* 送信ボタン */<br />&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;100px;<br />&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40px;<br />&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />}<br /><br />.red {&nbsp; &nbsp;/* 設定変更した */<br />&nbsp; &nbsp;font-size: 40px ;<br />&nbsp; &nbsp;color: &#35;ff0000;<br />}<br /><br />/* スマホだけに適用するCSS */<br />@media screen and ( max-width:479px ) {<br />&nbsp; &nbsp;body {&nbsp; &nbsp;/* 一般的な表示部 */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 20px ;<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;input {&nbsp; &nbsp;/* チェックボックス */<br />&nbsp; &nbsp;&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;select {&nbsp; &nbsp;/* プルダウンメニュー */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 25px ;<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;.hrline {&nbsp; &nbsp;/* 罫線(？) */<br />&nbsp; &nbsp;&nbsp; &nbsp;border: none;<br />&nbsp; &nbsp;&nbsp; &nbsp;background-color: &#35;fff;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-width: 1px 0 0 0;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-top: double;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-color: black;<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;.submit {&nbsp; &nbsp;/* 送信ボタン */<br />&nbsp; &nbsp;&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;100px;<br />&nbsp; &nbsp;&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40px;<br />&nbsp; &nbsp;&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;.red {&nbsp; &nbsp;/* 設定変更した */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 40px ;<br />&nbsp; &nbsp;&nbsp; &nbsp;color: &#35;ff0000;<br />&nbsp; &nbsp;}<br />}<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.css</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />でっか文字な表示にしたくて見様見真似で用意しました　見様見真似の即興ってことで CSS について何一つ理解していません汗　おかしな所しかないと思うけど…まぁその辺は生温かい目で見守って頂けると幸いに思います（瀧汗<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#35;!/usr/bin/perl<br /><br />$datafile = &quot;./data.txt&quot;;&nbsp; &nbsp;&#35; ATOM Lite が読みにくるファイル<br />$htmlfile = &quot;./index.html&quot;;&nbsp; &nbsp;&#35; ベースとなる HTML ファイル<br /><br />if ($ENV{&apos;REQUEST_METHOD&apos;} eq &apos;POST&apos;) {&nbsp; &nbsp;&#35; POST メソッドで送られてきた場合<br />&nbsp; &nbsp;read(STDIN, $query, $ENV{&apos;CONTENT_LENGTH&apos;});<br />} else {&nbsp; &nbsp;&#35; GET メソッドで送られてきた場合<br />&nbsp; &nbsp;$query = $ENV{&apos;QUERY_STRING&apos;};<br />}<br /><br />&#35;&#35;&#35;&#35; ATOM Lite が読みにくるデータファイルを作成する &#35;&#35;&#35;&#35;<br />open (DATA, $datafile);<br />$data = &#60;DATA&#62;;&nbsp; &nbsp;&#35; 既存のデータファイルを読み内容を取り出しておく<br />if ($data =~ /s(\d),(\d\d):(\d\d) e(\d),(\d\d):(\d\d) m(\d)/) {<br />&nbsp; &nbsp;$in{&apos;st&apos;} = $1;<br />&nbsp; &nbsp;$in{&apos;st_hour&apos;} = $2;<br />&nbsp; &nbsp;$in{&apos;st_min&apos;} = $3;<br />&nbsp; &nbsp;$in{&apos;ed&apos;} = $4;<br />&nbsp; &nbsp;$in{&apos;ed_hour&apos;} = $5;<br />&nbsp; &nbsp;$in{&apos;ed_min&apos;} = $6;<br />&nbsp; &nbsp;$in{&apos;md&apos;} = $7;<br />}<br />close (DATA);<br /><br />if ($query) {&nbsp; &nbsp;&#35; データを受信していた場合の処理<br />&nbsp; &nbsp;open (DATA, &quot;&#62;&quot;, $datafile);&nbsp; &nbsp;<br />&nbsp; &nbsp;foreach $data (split(/&/, $query)) {&nbsp; &nbsp;&#35; 「&」で分割して全て処理する<br />&nbsp; &nbsp;&nbsp; &nbsp;($key, $value) = split(/=/, $data);&nbsp; &nbsp;&#35; 「name=value」のそれぞれに分割して連想配列を作っていく<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/\+/ /g;&nbsp; &nbsp;&#35; 以下ざっくりとした URL デコードする<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/%(&#91;a-fA-F0-9&#93;&#91;a-fA-F0-9&#93;)/pack(&apos;C&apos;, hex($1))/eg;<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/\t//g;<br />&nbsp; &nbsp;&nbsp; &nbsp;$in{&quot;$key&quot;} = $value;&nbsp; &nbsp;&#35; value = $in{&quot;$name&quot;} の連想配列が出来上がる<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;&#35; 送られてきた内容を適用してデータファイルを更新<br />&nbsp; &nbsp;if (!($query =~ /st=/)) { $in{&apos;st&apos;} = &apos;0&apos;; }&nbsp; &nbsp;&#35; チェックボックスの挙動がアレなんで個別対応（汗<br />&nbsp; &nbsp;if (!($query =~ /ed=/)) { $in{&apos;ed&apos;} = &apos;0&apos;; }&nbsp; &nbsp;&#35; チェックボックスの挙動がアレなんで個別対応（汗<br />&nbsp; &nbsp;if ($in{&apos;st&apos;}) { print DATA &quot;s1,&quot;; } else { print DATA &quot;s0,&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;st_hour&apos;}) { printf DATA &quot;%02d:&quot;, $in{&apos;st_hour&apos;}; } else { print DATA &quot;00:&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;st_min&apos;}) { printf DATA &quot;%02d &quot;, $in{&apos;st_min&apos;}; } else { print DATA &quot;00 &quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed&apos;}) { print DATA &quot;e1,&quot;; } else { print DATA &quot;e0,&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed_hour&apos;}) { printf DATA &quot;%02d:&quot;, $in{&apos;ed_hour&apos;}; } else { print DATA &quot;00:&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed_min&apos;}) { printf DATA &quot;%02d &quot;, $in{&apos;ed_min&apos;}; } else { print DATA &quot;00 &quot;; }<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if ($in{&apos;md&apos;} eq &quot;1&quot;) { print DATA &quot;m1\n&quot;; } elsif ($in{&apos;md&apos;} eq &quot;2&quot;) { print DATA &quot;m2\n&quot;; } else { print DATA &quot;m3\n&quot;; }<br />&nbsp; &nbsp;close (DATA);<br />}<br /><br />open (IN, $htmlfile);&nbsp; &nbsp;&#35; 以下ベースとなる HTML ファイルを読み込み設定時間などを反映させる<br /><br />print &quot;Content-type: text/html; charset=UTF-8\n\n&quot;;<br />@lines = &#60;IN&#62;;<br />foreach (@lines) {<br />&nbsp; &nbsp;if ($query) { s/(&#60;div class=&quot;red&quot;&#62;)(&#60;\/div&#62;)/$1設定しました$2/; }<br /><br />&nbsp; &nbsp;if ($in{&apos;st&apos;} eq &quot;1&quot;) { s/(class=&quot;st&quot;)/$1 checked/; }<br />&nbsp; &nbsp;if ($in{&apos;st_hour&apos;}) { s/(class=&quot;st_hour&quot; value=&quot;)($in{&apos;st_hour&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;st_min&apos;}) { s/(class=&quot;st_min&quot; value=&quot;)($in{&apos;st_min&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;ed&apos;} eq &quot;1&quot;) { s/(class=&quot;ed&quot;)/$1 checked/; }<br />&nbsp; &nbsp;if ($in{&apos;ed_hour&apos;}) { s/(class=&quot;ed_hour&quot; value=&quot;)($in{&apos;ed_hour&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;ed_min&apos;}) { s/(class=&quot;ed_min&quot; value=&quot;)($in{&apos;ed_min&apos;}&quot;)/$1$2 selected/; }<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if ($in{&apos;md&apos;}) { s/(name=&quot;md&quot; value=&quot;)($in{&apos;md&apos;}&quot;)/$1$2 checked=&quot;checked&quot;/; }<br /><br />&nbsp; &nbsp;print $_;<br />}<br />close (IN);<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />実際に表示を受け持つ index.cgi です　表示を受け持ちつつ…フォームで入力された値を解釈して data.txt を生成します　そしてそのフォームで入力された値 index.html の内容を書き換えて表示するようになっています　こうしておけば以前の設定内容を次回の設定に引き継げるようになるので便利かなーって思いまして<br />そんな訳なんで .htaccess で Web サーバの設定変更が可能な場合は <span class="decorationC" style="color:red;">DirectoryIndex index.cgi</span> としてデフォルトで読み出されるファイルに設定しておくといいでしょう<br /><br />あとこの index.cgi は GET メソッドでデータを受けれられるので…極端な話パラメータ付きの URL を直打ちすることでも設定が可能です　例えば <span class="decorationC" style="color:blue;">08 時 20 分</span> に <span class="decorationC" style="color:blue;">冷房</span> で作動させ <span class="decorationC" style="color:blue;">19 時 30 分</span> に電源を切る場合だと<br /><span class="decorationC" style="color:green;">http://user:pass@hoge.orz/remocon/index.cgi?st=1&st_hour=08&st_min=20&ed=1&ed_hour=19&ed_min=30&md=1</span><br />こんな感じの URL になります　それ即ち wget や curl などのコマンドでアクセスすることが可能となり…さらに cron などを使えば毎日の動作や毎週の動作といった感じで自動化することも可能になります　いや実際に試してはないですけどたぶん大丈夫だと思います汗<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">read.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />#!/usr/bin/perl<br /><br />print &quot;Content-type: text/plain; charset=UTF-8\n\n&quot;;<br /><br /># 現在日時の表示<br />@wdays = ( &quot;Sun&quot;, &quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;, &quot;Sat&quot;);<br />($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time());<br />printf &quot;%04d/%02d/%02d %02d:%02d:%02d(%s)\t&quot;, $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $wdays&#91;$wday&#93;;<br /><br />$datafile = &quot;./data.txt&quot;;&nbsp; &nbsp;# ブラウザで設定した内容のファイル<br />open (DATA, $datafile);<br />print &#60;DATA&#62;;&nbsp; &nbsp;# ファイルの 1 行目を読み取り表示する<br />close (DATA);<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">read.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />(M5) ATOM Lite がアクセスしてくるファイル(CGI)です　現在日時を整形して表示して…あとは index.cgi が生成した data.txt の内容をくっつけて送信してくれます<br /><br />　　：<br /><br />ごちゃごちゃ長くなったんで以下にまとめときます　「名前を付けてリンク先を保存」とかすれば手間がなくていいと思いますたぶん<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/remocon.ino" rel="noopener noreferrer" target="_blank">remcon.ino</a>&nbsp; &nbsp;(M5) ATOM Lite 用 Arduino Sketch ファイル <br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.html" rel="noopener noreferrer" target="_blank">index.html</a>&nbsp; &nbsp;表示のベースとなる HTML ファイル<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.css" rel="noopener noreferrer" target="_blank">index.css</a>&nbsp; &nbsp;でっか文字にするためのアレ<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.cgi" rel="noopener noreferrer" target="_blank">index.cgi</a>&nbsp; &nbsp;ページ表示しつつデータファイルを作成する<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/read.cgi" rel="noopener noreferrer" target="_blank">read.cgi</a>&nbsp; &nbsp;(M5) ATOM Lite が読みに来る先のやつ<br />data.txt &nbsp;index.cgi が作成するデータファイル<br /><br /><img class="embeddedimage nolisted" width="4032" height="2268" src="https://room.dengeki.jp/images/20230717165352-admin.jpg" alt="20230717165352-admin.jpg"><br />そして後はいい感じに設置して完了ですかね　(M5) ATOM Lite の赤外線はかなり飛距離が短いんで…エアコンにへばりつけるような設置になっちゃうのかな<br /><br />あーあと余談っていうか注意事項ですが (M5) ATOM Lite が読みに来る read.cgi は数十秒に 1 回のペースで 24 時間 365 日延々とアクセスがあります　そのままの Web サーバだと…そのアクセス毎にログファイルが蓄積されることになります　もし可能なら Web サーバの設定を変更して…このアクセスに対してのみログの書き込みを抑制するなどしたほうがいいと思います　ざっくり <a class="url labeledlink" href="https://www.google.com/search?q=SetEnvIf+nolog" rel="noopener noreferrer" target="_blank">SetEnvIf nolog</a> &nbsp;なんて感じのキーワードでぐぐれば必要な情報に辿り着けるとイイナ！<br /><br />　　：<br /><br />そんな感じで最後までご覧いただきありがとございました汗　ざっくりテスト用に作ったのをイジくりまわした代物なのでいろいろおかしな部分はありますが…手っ取り早く動作を体感してみたい！って時には役立つかもです　それにしても 1,000円 ちょっとで買える (M5) ATOM Lite はホントすごいですよね　きちんと筐体に収められていつつ… Wi-fi で接続を確立して HTTP でデータを取ってくることができる　赤外線 LED でリモコンのような動作もさせられる　欲を云えば RTC(時計) が欲しかったかなって感じではあるけど…それもどっかのサーバに接続して時刻を取得すればそれほど問題にはならないんでまぁいいかな♪　なんかそんなかんじで <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%4d%35%53%74%69%63%6b%43" class="taglink" title="M5StickC">#M5StickC</a> -- Posted by 猫山ぽるか 〔19935文字〕 No.37 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=37</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=37</guid>
	<category>info</category>
	<pubDate>Mon, 17 Jul 2023 08:43:28 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ MakeMKV の使い方…のもうちょっと前のメモ ]]></title>
	<description><![CDATA[ MakeMKV の使い方…のもうちょっと前のメモ<br /><img class="embeddedimage " width="400" height="400" src="https://room.dengeki.jp/images/20220925101846-admin.png" alt="20220925101846-admin.png"><br />　<br />DVD や BD をアレするのに便利な MakeMKV ですが…そうそう毎日毎日頻繁に使うものじゃないんでイザ使おうと思うとなんかポップアップが出て使えない！ってことはありませんか？　私はあります　でもまぁそうそう毎日毎日頻繁に使うものじゃないんでレアな出来事ではあるのですが（汗<br /><br /><img class="embeddedimage " width="502" height="370" src="https://room.dengeki.jp/images/202209251018461-admin.png" alt="202209251018461-admin.png"><br />では頻繁にアップデートされる MakeMKV の更新方法からですかね　なんか Windows 版とかではバイナリで供されているらしいんで…それを入れればいいらしい？って感じなんですが Linux 版はソースコードでの提供なんでその都度コンパイルしなくちゃいかんっぽいでうね<br /><br /><img class="embeddedimage " width="897" height="659" src="https://room.dengeki.jp/images/202209251018462-admin.png" alt="202209251018462-admin.png"> <img class="embeddedimage " width="897" height="659" src="https://room.dengeki.jp/images/202209251018463-admin.png" alt="202209251018463-admin.png"><br />そんな訳で <a class="url labeledlink" href="https://www.makemkv.com/" rel="noopener noreferrer" target="_blank">MakeMKV</a> のページに行ってみて <a class="url labeledlink" href="https://www.makemkv.com/download/" rel="noopener noreferrer" target="_blank">Download</a> → <a class="url labeledlink" href="https://forum.makemkv.com/forum/viewtopic.php?f=3&t=224" rel="noopener noreferrer" target="_blank">forum page.</a> と進み…<br /><br /><img class="embeddedimage " width="897" height="659" src="https://room.dengeki.jp/images/202209251018464-admin.png" alt="202209251018464-admin.png"><br />makemkv-oss-*.tar.gz makemkv-bin-*.tar.gz の 2 つをダウンロードしてそれぞれ適当なフォルダに解凍しておきます<br /><br /><img class="embeddedimage " width="840" height="630" src="https://room.dengeki.jp/images/202209251018465-admin.png" alt="202209251018465-admin.png"><br />それでは makemkv-oss から処理していきましょう　makemkv-oss を解凍したフォルダに移動して…<br /><br /><span class="decorationC" style="color:green;">./configure<br />make<br />sudo make install</span><br /><br />を順番に実行します　環境にもよるだろうけど…ちょっと時間がかかります<br />つーかまぁこの辺の何行かになってるのを一行づつコピペするのは面倒なんで…<br /><br /><span class="decorationC" style="color:green;">./configure && make && sudo make install</span><br /><br />こんな感じで「<span class="decorationC" style="color:green;">&&</span>」でコマンドをつなげて実行するのもアリですかね<br /><br />※なお MakeMKV の初回のインストールの際には <span class="decorationC" style="color:green;">sudo apt-get install build-essential pkg-config libc6-dev libssl-dev libexpat1-dev libavcodec-dev libgl1-mesa-dev qtbase5-dev zlib1g-dev</span> を真っ先に実行しておいたほうがいいらしいです<br /><br />　　：<br /><br /><img class="embeddedimage " width="840" height="630" src="https://room.dengeki.jp/images/202209251018466-admin.png" alt="202209251018466-admin.png"><br />お次は makemkv-bin を処理しましょう　makemkv-bin を解凍したフォルダに移動して…<br /><br /><span class="decorationC" style="color:green;">make<br />sudo make install</span><br /><br />を順番に実行します　これも先程と同じく「<span class="decorationC" style="color:green;">&&</span>」でコマンドをつなげて実行していいと思います<br /><br /><span class="decorationC" style="color:green;">make && sudo make install</span><br /><br /><img class="embeddedimage " width="840" height="630" src="https://room.dengeki.jp/images/202209251018467-admin.png" alt="202209251018467-admin.png"> <img class="embeddedimage " width="840" height="630" src="https://room.dengeki.jp/images/202209251018468-admin.png" alt="202209251018468-admin.png"><br />途中で重要な注意事項的なものが表示されるので…カーソルキーの↑↓やスペースキーなどを使い読んだ後に「<span class="decorationC" style="color:green;">q</span>」で抜けて了解した場合に「<span class="decorationC" style="color:green;">yes</span>」を入力して次に進みます<br /><br />　　：<br /><br />これで MakeMKV のアップデート(インストール)は完了です　makemkv-*.tar.gz を展開しておいたフォルダは削除しても問題ないんで…まぁ邪魔くさいので消しておいたほうが無難でしょう<br /><br /><img class="embeddedimage " width="509" height="283" src="https://room.dengeki.jp/images/202209251018469-admin.png" alt="202209251018469-admin.png"><br />そしてお次は「期限切れ」となってるこれをどうにかしましょう<br /><br /><img class="embeddedimage " width="897" height="659" src="https://room.dengeki.jp/images/2022092510184610-admin.png" alt="2022092510184610-admin.png"> <img class="embeddedimage " width="897" height="659" src="https://room.dengeki.jp/images/2022092510184611-admin.png" alt="2022092510184611-admin.png"><br /><a class="url labeledlink" href="https://forum.makemkv.com/forum/viewforum.php?f=5" rel="noopener noreferrer" target="_blank">News and Announcements</a> 内の <a class="url labeledlink" href="https://forum.makemkv.com/forum/viewtopic.php?f=5&t=1053" rel="noopener noreferrer" target="_blank">MakeMKV is free while in beta</a> と進み「The current beta key is」の内容を…<br /><br /><img class="embeddedimage " width="985" height="798" src="https://room.dengeki.jp/images/2022092510184612-admin.png" alt="2022092510184612-admin.png"><br />MakeMKV を起動 → ヘルプ(H) → 公認(R) を選び…出てきた入力欄にコピペして「OK」すれば完了です<br /><br /><img class="embeddedimage " width="985" height="798" src="https://room.dengeki.jp/images/2022092510184613-admin.png" alt="2022092510184613-admin.png"><br />あとは MakeMKV を再起動すれば使用できるようになってます　ありがたいですね(&gt;_&lt;)ｗ<br /><br />それほど面倒な手順ってほどでもないんだけど…リンク先とか忘れがちなんでその辺の対策メモってかんじでまとめておきました　ご利用は自己判断でお願いします（汗 <a href="https://room.dengeki.jp/tegalog.cgi?tag=%55%62%75%6e%74%75" class="taglink" title="Ubuntu">#Ubuntu</a> -- Posted by 猫山ぽるか 〔1542文字〕 No.32 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=32</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=32</guid>
	<category>info</category>
	<pubDate>Sun, 25 Sep 2022 10:18:46 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Python の使い方メモ Vol.1 ]]></title>
	<description><![CDATA[ Python の使い方メモ Vol.1<br /><img class="embeddedimage " width="400" height="400" src="https://room.dengeki.jp/images/20220703053348-admin.png" alt="20220703053348-admin.png"><br />　<br />時既に Perl の時代は終わり…世は Python が覇者となっている！って事なんでぼちぼち勉強しようかなーって思いつつちっとも重い腰が上がらないことはありませんか？　私はあります　いやむしろずっとそんな感じです（瀧汗<br />まぁまぁそんな話はともかく…なんか動画サイトのアレをゴニョゴニョするのに便利な yt-dlp ってのがあるのですが…それが Python で書かれているらしいんですよね　そんな訳で手っ取り早いインストール法と…過去のバージョンに戻したい！って時とかの操作法のメモなんかを少々ってかんじで<br /><br />以降のメモは Python 3 を対象にしています<br />$ <span class="decorationC" style="color:green;">python --version</span><br />Python 3.8.10<br /><br />Python モジュールのインストール　※ここでは yt-dlp をインストールする<br />$ <span class="decorationC" style="color:green;">sudo python -m pip install yt-dlp</span><br />もしくは…<br />$ <span class="decorationC" style="color:green;">sudo pip install yt-dlp</span><br />でもいいみたい？　違いがよく判ってないんで調べておくメモ<br /><br />何かの都合で古いバージョンに戻したくなった時　※ここでは yt-dlp を対象とする<br />$ <span class="decorationC" style="color:green;">pip install yt-dlp==</span><br /><span class="decorationC" style="color:red;">ERROR: Could not find a version that satisfies the requirement yt-dlp== (from versions: 2021.1.15, 2021.1.15.post1, 2021.1.16, 2021.1.20, 2021.1.24, 2021.1.24.post1, 2021.1.29, 2021.2.4, 2021.2.9, 2021.2.15, 2021.2.19, 2021.2.24, 2021.3.1, 2021.3.3, 2021.3.3.1, 2021.3.3.2, 2021.3.7, 2021.3.15, 2021.3.21, 2021.3.24, 2021.3.24.1, 2021.4.3, 2021.4.11, 2021.4.22, 2021.5.11, 2021.5.20, 2021.6.1, 2021.6.8, 2021.6.9, 2021.6.23, 2021.7.7, 2021.7.21, 2021.7.24, 2021.8.2, 2021.8.10, 2021.9.1, 2021.9.2, 2021.9.25, 2021.10.9, 2021.10.10, 2021.10.22, 2021.11.10, 2021.11.10.1, 2021.12.1, 2021.12.25, 2021.12.27, 2022.1.21, 2022.2.3, 2022.2.4, 2022.3.8, 2022.3.8.1, 2022.3.8.2, 2022.4.8, 2022.5.18, 2022.6.22, 2022.6.22.1, 2022.6.29)<br />ERROR: No matching distribution found for yt-dlp==</span><br />こんな感じでモジュール名の後ろに「<span class="decorationC" style="color:green;">==</span>」を付ければバージョンが列挙される裏技みたいな感じ？？<br /><br />その中から指定のバージョンをインストールする　※ここでは yt-dlp を対象とする<br />$ <span class="decorationC" style="color:green;">sudo pip install yt-dlp==2022.5.18</span><br />こうすることで過去のバージョンとかでもインストールできます<br /><br /><small class="decorationT"><del class="decorationD">ざっくり使った感じだとこの 2022.5.18 が TVer も abema もアレできていい感じですね</del></small><br /><br />基礎中の基礎の前の初歩中の初歩な内容すぎて申し訳ないです… <a href="https://room.dengeki.jp/tegalog.cgi?tag=%50%79%74%68%6f%6e" class="taglink" title="Python">#Python</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%55%62%75%6e%74%75" class="taglink" title="Ubuntu">#Ubuntu</a> -- Posted by 猫山ぽるか 〔1581文字〕 No.29 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=29</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=29</guid>
	<category>info</category>
	<pubDate>Thu, 30 Jun 2022 23:58:58 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Twitter(ツイッター)の隠しコマンド？ ]]></title>
	<description><![CDATA[ Twitter(ツイッター)の隠しコマンド？<br /><img class="embeddedimage " width="400" height="400" src="https://room.dengeki.jp/images/20220508181222-admin.png" alt="20220508181222-admin.png"><br />　<br />Twitter(ツイッター)使ってますか？　私は使ってます…っていうかわりとべったりです（汗　そんな Twitter のホーム画面っていうかタイムラインに混入してくる「おすすめ」とか「〇〇さんが□□しました」系の推し(？)が本当にウザいですよねって事でその辺をどうにかできるかもしれない隠しコマンドがあるようなんで設定してみたメモです<br /><br />そんな設定は「ミュートするキーワード」で行います　ブラウザ版を使っている場合は→ <a class="url" href="https://twitter.com/settings/muted_keywords" rel="noopener noreferrer" target="_blank" title="https://twitter.com/settings/muted_keywords">https://twitter.com/settings/muted_keywo...</a> にアクセスすることにより直接「ミュートするキーワード」にいけます<br /><br />スマホ(Android)の場合は…<br /><br /><img class="embeddedimage " width="1080" height="608" src="https://room.dengeki.jp/images/202205081812229-admin.png" alt="202205081812229-admin.png"><br />左上のアイコンをタップしてメニューを出す<br /><br /><img class="embeddedimage " width="1080" height="1229" src="https://room.dengeki.jp/images/202205081812228-admin.png" alt="202205081812228-admin.png"><br />下の方にある「設定とプライバシー」をタップする<br /><br /><img class="embeddedimage " width="1080" height="1080" src="https://room.dengeki.jp/images/202205081812227-admin.png" alt="202205081812227-admin.png"><br />そのままメニューをたぐってもいいんだけど…判りやすく検索窓に「ミュート」と入力する<br /><br /><img class="embeddedimage " width="1080" height="1080" src="https://room.dengeki.jp/images/202205081812226-admin.png" alt="202205081812226-admin.png"><br />出てきた「ミュートとブロック」をタップする<br /><br /><img class="embeddedimage " width="1080" height="1440" src="https://room.dengeki.jp/images/202205081812225-admin.png" alt="202205081812225-admin.png"><br />「ミュートするキーワード」でたどり着けます<br /><br /><img class="embeddedimage " width="1080" height="2073" src="https://room.dengeki.jp/images/20220508185124-admin.png" alt="20220508185124-admin.png"> <img class="embeddedimage " width="1080" height="2052" src="https://room.dengeki.jp/images/202205081812224-admin.png" alt="202205081812224-admin.png"><br />右下にあると思われる「＋」でミュートするキーワードを設定するんだけど…この中で「ホームタイムライン」をチェックして「すべてのアカウント」を選び期間は「再度オンにするまで」にしとくと良いようです　なおこの辺の設定はアカウントに対して行われてるようなんで PC ブラウザで設定すればそれがスマホアプリに反映されるし逆もまた然りって感じっぽいです　操作しやすいもので設定すればいいと思います<br />その辺の下準備が済んだところでミュートするキーワードです<br /><br />ハイライト系<br /><span class="decorationC" style="color:green;">suggest_recap</span><br /><span class="decorationC" style="color:green;">suggest_recycled_tweet</span><br /><span class="decorationC" style="color:green;">generic_activity_highlights</span><br /><br />おすすめユーザー系<br /><span class="decorationC" style="color:green;">who_to_follow_entry</span><br /><span class="decorationC" style="color:green;">suggest_who_to_follow</span><br /><br />おすすめのツイート系<br /><span class="decorationC" style="color:green;">suggest_activity</span><br /><br />○○さんがいいねしました系<br /><span class="decorationC" style="color:green;">suggest_activity_tweet</span><br /><span class="decorationC" style="color:green;">tweet-context with-icn</span><br /><br />○○さんがフォローしています系<br /><span class="decorationC" style="color:green;">suggest_pyle_tweet</span><br /><span class="decorationC" style="color:green;">suggest_sc_tweet</span><br /><br />ハッシュタグのおすすめ系<br /><span class="decorationC" style="color:green;">suggest_grouped_tweet_hashtag</span><br /><br />他人のリプ表示をやめる系<br /><span class="decorationC" style="color:green;">filter:follows -filter:replies</span><br /><br />過去のRT表示をやめる系<br /><span class="decorationC" style="color:green;">suggest_recycled_tweet_inline</span><br /><br />よくわからないけど一応メモ<br /><span class="decorationC" style="color:green;">ActivityTweet</span><br /><span class="decorationC" style="color:green;">RankedOrganicTweet</span><br /><br />この中で必要なものを選んで個々に設定すればいいようです。<br /><br /><img class="embeddedimage " width="1080" height="1080" src="https://room.dengeki.jp/images/202205081812223-admin.png" alt="202205081812223-admin.png"><br />あーあとホーム画面の右上にあるアイコンをタップして…<br /><br /><img class="embeddedimage " width="1080" height="1236" src="https://room.dengeki.jp/images/202205081812222-admin.png" alt="202205081812222-admin.png"><br />「最新のツイートがタイムラインに表示されます」って感じに設定しておく必要もあるようです<br /><br />これで余計なものに邪魔されにくい平穏なタイムラインを楽しめます　「邪魔だな」って思ったおすすめなんかをちょっとづつ指定して試してみるといいでしょう<br />つーかまぁしょーみリスト管理しててホーム画面に来ることは滅多にないんでアレなんだけど（汗<br /><br />　　：<br /><br />ミュートとは直接の関係はないんだけど…検索する時に便利なキーワードなどなどもせっかくなんでメモ<br /><br /><img class="embeddedimage " width="1080" height="810" src="https://room.dengeki.jp/images/202205081812221-admin.png" alt="202205081812221-admin.png"><br />そういや Android アプリ版の Twitter で実装されているんだけど…各人のプロフィールの右上にある「虫メガネ」アイコンですね　これをタップすると「その人のツイートに限定した」検索ができるようです　検索クエリ的には <span class="decorationC" style="color:green;">from:@アカウント名</span> って感じですかね<br />その検索の応用っていうか…例えば「リツイートがやたらと多い人なんだけどその人が発したツイートだけを見たい！」って時なんかはその検索欄に「　」←全角スペースを入力するといいようです<br /><br />その他にリプライのみを表示させたい場合は <span class="decorationC" style="color:green;">filter:replies</span> を指定して…逆にリプライを除去したい場合は <span class="decorationC" style="color:green;">-filter:replies</span> を指定します<br />メディア等が含まれたツイートのみを表示させたい場合は <span class="decorationC" style="color:green;">filter:links</span> を指定して…逆にメディア等が含まれたツイートを除去したい場合は <span class="decorationC" style="color:green;">-filter:links</span> を指定します<br /><br />&nbsp;検索するツイートの期間を絞り込みたい場合は…開始を <span class="decorationC" style="color:green;">since:YYYY-MM-DD</span> と指定して終了を <span class="decorationC" style="color:green;">until:YYYY-MM-DD</span> として設定します　※ YYYY は西暦, MM は月, DD は日を指します<br />コピペしやすいようにっていうか…そこそこ使い勝手がいい 1 年単位で列挙しておきます<br /><span class="decorationC" style="color:green;">since:2026-01-01 until:2026-12-31</span><br /><span class="decorationC" style="color:green;">since:2025-01-01 until:2025-12-31</span><br /><span class="decorationC" style="color:green;">since:2024-01-01 until:2024-12-31</span><br /><span class="decorationC" style="color:green;">since:2023-01-01 until:2023-12-31</span><br /><span class="decorationC" style="color:green;">since:2022-01-01 until:2022-12-31</span><br /><span class="decorationC" style="color:green;">since:2021-01-01 until:2021-12-31</span><br /><span class="decorationC" style="color:green;">since:2020-01-01 until:2020-12-31</span><br /><span class="decorationC" style="color:green;">since:2019-01-01 until:2019-12-31</span><br /><span class="decorationC" style="color:green;">since:2018-01-01 until:2018-12-31</span><br /><span class="decorationC" style="color:green;">since:2017-01-01 until:2017-12-31</span><br /><span class="decorationC" style="color:green;">since:2016-01-01 until:2016-12-31</span><br /><span class="decorationC" style="color:green;">since:2015-01-01 until:2015-12-31</span><br /><span class="decorationC" style="color:green;">since:2014-01-01 until:2014-12-31</span><br /><span class="decorationC" style="color:green;">since:2013-01-01 until:2013-12-31</span><br /><span class="decorationC" style="color:green;">since:2012-01-01 until:2012-12-31</span><br /><span class="decorationC" style="color:green;">since:2011-01-01 until:2011-12-31</span><br /><span class="decorationC" style="color:green;">since:2010-01-01 until:2010-12-31</span><br /><br />・・とまぁこんな感じですかね　またなにか思いついたら追加していくかも <a href="https://room.dengeki.jp/tegalog.cgi?tag=%54%77%69%74%74%65%72" class="taglink" title="Twitter">#Twitter</a><br /><br />※追記※<br />だいぶん前に作ったやつだけど…そこそこ詳細に Twitter 検索できるようなやつ<br /><a class="url labeledlink" href="https://twitter.com/nekonyanma/status/1218337751050833920" rel="noopener noreferrer" target="_blank">Tweet</a>  -- Posted by 猫山ぽるか 〔2654文字〕 No.27 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=27</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=27</guid>
	<category>info</category>
	<pubDate>Sun, 08 May 2022 15:55:18 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 続・モニタ無しでラズパイを VNC 接続できるとこまでセット… ]]></title>
	<description><![CDATA[ 続・モニタ無しでラズパイを VNC 接続できるとこまでセットアップする<br /><img class="embeddedimage " width="400" height="400" src="https://room.dengeki.jp/images/20220429192311-admin.png" alt="20220429192311-admin.png"><br />　<br />以前に <span class="decorationM" style="background-color:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=2" class="postidlink">完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ</a></span> なんてのを紹介していたんだけど…それから月日が流れ <a class="url labeledlink" href="https://www.raspberrypi.com/software/operating-systems/" rel="noopener noreferrer" target="_blank">Raspberry Pi OS</a> のバージョンが上がったっていうか色々とセットアップ方法が変更になったんでその辺をざっくり検証してみましたってメモです<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/20220429185131-admin.jpg" alt="20220429185131-admin.jpg"> <img class="embeddedimage " width="900" height="675" src="https://room.dengeki.jp/images/202204291851316-admin.png" alt="202204291851316-admin.png"><br />そんな今回は某案件的な話で貸与して頂けた <a class="url labeledlink" href="https://www.raspberrypi.com/products/raspberry-pi-400/" rel="noopener noreferrer" target="_blank">Raspberry Pi 400</a> を使用して <span class="decorationC" style="color:red;">64-bit 版</span>の <span class="decorationC" style="color:red;">Raspberry Pi OS with desktop</span> をモニタ無しっていうか SSH でログインしつつの VNC 接続できる所まで試してみました<br /><br />今回の <a class="url labeledlink" href="https://www.raspberrypi.com/software/operating-systems/" rel="noopener noreferrer" target="_blank">Raspberry Pi OS</a> のバージョンアップの大きな変更っていうか…今までデフォルトで「pi」ってユーザが用意されていたのが今回からそれが廃止になったようです　それに伴いパスワードを設定したユーザが不在(？)って事になり <span class="decorationC" style="color:green;">dd</span> コマンドなりでイメージを書き込んだ後に boot パーティションのルートフォルダにファイル名が「ssh」もしくは「ssh.txt」のファイルを新規作成しただけでは SSH でログインできなくなってました<br /><br /><img class="embeddedimage " width="682" height="449" src="https://room.dengeki.jp/images/202204291851315-admin.png" alt="202204291851315-admin.png"><br />それじゃどうしよう？って話なんですが…まぁ結果から云うとそれをどうにかする機能が追加された新しい <a class="url labeledlink" href="https://www.raspberrypi.com/software/" rel="noopener noreferrer" target="_blank">Raspberry Pi Imager</a> を使うって事らしいです<br />これの右下にある「歯車」のマークをクリックすると…<br /><br /><img class="embeddedimage " width="677" height="827" src="https://room.dengeki.jp/images/202204291851314-admin.png" alt="202204291851314-admin.png"><br />「詳細な設定」として Pi OS の諸々の設定ができるようになります　ユーザの設定だけでなく SSH の有効化や Wi-Fi の設定も一気に行えるんでこれは便利ですね！(&gt;_&lt;)ｗ<br /><br />　　：<br /><br />・・とまぁこれで話が終わっちゃうのも少々物足りない気がしたっていうか Pi Imager を使うことなくそれらの設定をどうにかする手法を模索してみました<br />まずはイメージファイルを <span class="decorationC" style="color:green;">dd</span> なりで書き込んだものと Pi Imager を使って書き込んだものを比較してみました　その結果 /boot/cmdline.txt に変更が加えられてたのと /boot/firstrun.sh が生成されていた事が判りました<br /><br />それでは /boot/cmdline.txt から見ていきましょう<br /><br />----- オリジナルの /boot/cmdline.txt -----<br />console=serial0,115200 console=tty1 <span class="decorationC" style="color:blue;">root=PARTUUID=50a67c3e-02</span> rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles<br />----------<br /><br />----- Pi Imager が作った /boot/cmdline.txt -----<br />console=serial0,115200 console=tty1 <span class="decorationC" style="color:blue;">root=PARTUUID=50a67c3e-02</span> rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles <span class="decorationC" style="color:red;">systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target</span><br />----------<br /><br />これを見る限り Pi Imager を使わずにどうにかする時にはオリジナルの /boot/cmdline.txt の末尾に <span class="decorationC" style="color:red;"> systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target</span> を付ければよさそうです<br /><br />ただし「<span class="decorationC" style="color:blue;">root=PARTUUID=50a67c3e-02</span>」の部分ですかね…これは配布されるディスクイメージのバージョン毎に異なる値を設定する必要があるようです<br />その辺の PARTUUID を調べるには <span class="decorationC" style="color:green;">lsblk</span> コマンドを使うといいらしい？　試しに実際に USB メモリに書き込んだものと…ディスクイメージを直接マウントしたものとで確認してみました<br /><br />$ <span class="decorationC" style="color:green;">lsblk -o TYPE,KNAME,PARTUUID,LABEL,SIZE,VENDOR</span><br />TYPE KNAME&nbsp; &nbsp; PARTUUID&nbsp; &nbsp; LABEL&nbsp; &nbsp; SIZE VENDOR<br />disk sdg&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;29.9G silicon <br />part sdg1&nbsp; &nbsp; &nbsp;50a67c3e-01 boot&nbsp; &nbsp; &nbsp;256M <br />part sdg2&nbsp; &nbsp; &nbsp;<span class="decorationC" style="color:red;">50a67c3e-02</span> rootfs&nbsp; &nbsp;3.7G <br />rom &nbsp;sr0&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;1024M HL-DT-ST<br />part loop39p1 50a67c3e-01 boot&nbsp; &nbsp; &nbsp;256M <br />part loop39p2 <span class="decorationC" style="color:red;">50a67c3e-02</span> rootfs&nbsp; &nbsp;3.7G <br /><br />これを見る限り /rootfs に設定された PARTUUID をコピペすればいいようですね　この辺は <span class="decorationC" style="color:green;">dd</span> なりでイメージを書き込んだ場合には気にする必要はなさそうだけど /boot/cmdline.txt を全て自作で用意したいような場合には気をつけたほうがいいのかな？って思いました<br /><br />　　：<br /><br />お次は /boot/firstrun.sh です　長くてややこしいですが頑張って見ていきましょう<br /><br />----- Pi Imager が作った /boot/firstrun.sh -----<br />&#35;!/bin/bash<br /><br />set +e<br /><br />CURRENT_HOSTNAME=`cat /etc/hostname | tr -d &quot; \t\n\r&quot;`<br />echo <span class="decorationC" style="color:red;">HostName</span> &gt;/etc/hostname<br />sed -i &quot;s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t<span class="decorationC" style="color:red;">HostName</span>/g&quot; /etc/hosts<br />FIRSTUSER=`getent passwd 1000 | cut -d: -f1`<br />FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`<br />if &#91; -f /usr/lib/userconf-pi/userconf &#93;; then<br />&nbsp; &nbsp;/usr/lib/userconf-pi/userconf &apos;<span class="decorationC" style="color:red;">UserName</span>&apos; &apos;<span class="decorationC" style="color:red;">$5$Salt$xxxxxxxxxx..</span>&apos;<br />else<br />&nbsp; &nbsp;echo &quot;$FIRSTUSER:&quot;&apos;<span class="decorationC" style="color:red;">$5$Salt$xxxxxxxxxx..</span>&apos; | chpasswd -e<br />&nbsp; &nbsp;if [ &quot;$FIRSTUSER&quot; != &quot;<span class="decorationC" style="color:red;">UserName</span>&quot; ]; then<br />&nbsp;&nbsp; &nbsp; &nbsp;usermod -l &quot;<span class="decorationC" style="color:red;">UserName</span>&quot; &quot;$FIRSTUSER&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;usermod -m -d &quot;/home/<span class="decorationC" style="color:red;">UserName</span>&quot; &quot;<span class="decorationC" style="color:red;">UserName</span>&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;groupmod -n &quot;<span class="decorationC" style="color:red;">UserName</span>&quot; &quot;$FIRSTUSER&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;if grep -q &quot;^autologin-user=&quot; /etc/lightdm/lightdm.conf ; then<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;sed /etc/lightdm/lightdm.conf -i -e &quot;s/^autologin-user=.*/autologin-user=<span class="decorationC" style="color:red;">UserName</span>/&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;fi<br />&nbsp;&nbsp; &nbsp; &nbsp;if &#91; -f /etc/systemd/system/getty@tty1.service.d/autologin.conf &#93;; then<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;sed /etc/systemd/system/getty@tty1.service.d/autologin.conf -i -e &quot;s/$FIRSTUSER/<span class="decorationC" style="color:red;">UserName</span>/&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;fi<br />&nbsp;&nbsp; &nbsp; &nbsp;if &#91; -f /etc/sudoers.d/010_pi-nopasswd &#93;; then<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;sed -i &quot;s/^$FIRSTUSER /<span class="decorationC" style="color:red;">UserName</span> /&quot; /etc/sudoers.d/010_pi-nopasswd<br />&nbsp;&nbsp; &nbsp; &nbsp;fi<br />&nbsp; &nbsp;fi<br />fi<br />systemctl enable ssh<br />cat &gt;/etc/wpa_supplicant/wpa_supplicant.conf &lt;&lt;&apos;WPAEOF&apos;<br />country=JP<br />ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />ap_scan=1<br /><br />update_config=1<br />network={<br />&nbsp; &nbsp;ssid=&quot;<span class="decorationC" style="color:red;">Wi-Fi_SSID</span>&quot;<br />&nbsp; &nbsp;psk=<span class="decorationC" style="color:red;">0123456789abcdefxxxx..</span><br />}<br /><br />WPAEOF<br />chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf<br />rfkill unblock wifi<br />for filename in /var/lib/systemd/rfkill/*:wlan ; do<br />&nbsp; echo 0 &gt; $filename<br />done<br />rm -f /etc/localtime<br />echo &quot;Asia/Tokyo&quot; &gt;/etc/timezone<br />dpkg-reconfigure -f noninteractive tzdata<br />cat &gt;/etc/default/keyboard &lt;&lt;&apos;KBEOF&apos;<br />XKBMODEL=&quot;pc105&quot;<br />XKBLAYOUT=&quot;jp&quot;<br />XKBVARIANT=&quot;&quot;<br />XKBOPTIONS=&quot;&quot;<br /><br />KBEOF<br />dpkg-reconfigure -f noninteractive keyboard-configuration<br />rm -f /boot/firstrun.sh<br />sed -i &apos;s| systemd.run.*||g&apos; /boot/cmdline.txt<br />exit 0<br />----------<br /><br />この中で書き換えるべき点はホストネームとなる <span class="decorationC" style="color:red;">HostName</span> と作成するユーザ名 <span class="decorationC" style="color:red;">UserName</span> ＆ パスワード <span class="decorationC" style="color:red;">$5$Salt$xxxxxxxxxx..</span> と Wi-Fi に接続するための <span class="decorationC" style="color:red;">Wi-Fi_SSID</span> ＆パスワード <span class="decorationC" style="color:red;">0123456789abcdefxxxx..</span> の箇所でしょうか<br />その辺を踏まえた上で…もちっと再設定しやすいように改変してみました<br /><br />----- 改変版 /boot/firstrun.sh -----<br />#!/bin/bash<br /><br />USER=&apos;<span class="decorationC" style="color:red;">UserName</span>&apos;<br />PASS=&apos;<span class="decorationC" style="color:red;">$5$Salt$xxxxxxxxxx..</span>&apos;<br />WIFISSID=&apos;<span class="decorationC" style="color:red;">Wi-Fi_SSID</span>&apos;<br />WIFIPASS=&apos;<span class="decorationC" style="color:red;">0123456789abcdefxxxx..</span>&apos;<br />HOST=&apos;<span class="decorationC" style="color:red;">HostName</span>&apos;<br /><br />set +e<br /><br />CURRENT_HOSTNAME=`cat /etc/hostname | tr -d &quot; \t\n\r&quot;`<br />echo $HOST &gt;/etc/hostname<br />sed -i &quot;s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$HOST/g&quot; /etc/hosts<br />FIRSTUSER=`getent passwd 1000 | cut -d: -f1`<br />FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`<br />if &#91; -f /usr/lib/userconf-pi/userconf &#93;; then<br />&nbsp; &nbsp;/usr/lib/userconf-pi/userconf &quot;$USER&quot; &quot;$PASS&quot;<br />else<br />&nbsp; &nbsp;echo &quot;$FIRSTUSER:$PASS&quot; | chpasswd -e<br />&nbsp; &nbsp;if &#91; &quot;$FIRSTUSER&quot; != &quot;$USER&quot; &#93;; then<br />&nbsp;&nbsp; &nbsp; &nbsp;usermod -l &quot;$USER&quot; &quot;$FIRSTUSER&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;usermod -m -d &quot;/home/$USER&quot; &quot;$USER&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;groupmod -n &quot;$USER&quot; &quot;$FIRSTUSER&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;if grep -q &quot;^autologin-user=&quot; /etc/lightdm/lightdm.conf ; then<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;sed /etc/lightdm/lightdm.conf -i -e &quot;s/^autologin-user=.*/autologin-user=$USER/&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;fi<br />&nbsp;&nbsp; &nbsp; &nbsp;if &#91; -f /etc/systemd/system/getty@tty1.service.d/autologin.conf &#93;; then<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;sed /etc/systemd/system/getty@tty1.service.d/autologin.conf -i -e &quot;s/$FIRSTUSER/$USER/&quot;<br />&nbsp;&nbsp; &nbsp; &nbsp;fi<br />&nbsp;&nbsp; &nbsp; &nbsp;if &#91; -f /etc/sudoers.d/010_pi-nopasswd &#93;; then<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;sed -i &quot;s/^$FIRSTUSER /$USER /&quot; /etc/sudoers.d/010_pi-nopasswd<br />&nbsp;&nbsp; &nbsp; &nbsp;fi<br />&nbsp; &nbsp;fi<br />fi<br />systemctl enable ssh<br />cat &gt;/etc/wpa_supplicant/wpa_supplicant.conf &lt;&lt;WPAEOF<br />country=JP<br />ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev<br />ap_scan=1<br /><br />update_config=1<br />network={<br />&nbsp; &nbsp;ssid=&quot;$WIFISSID&quot;<br />&nbsp; &nbsp;psk=$WIFIPASS<br />}<br /><br />WPAEOF<br />chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf<br />rfkill unblock wifi<br />for filename in /var/lib/systemd/rfkill/*:wlan ; do<br />&nbsp; echo 0 &gt; $filename<br />done<br />rm -f /etc/localtime<br />echo &quot;Asia/Tokyo&quot; &gt;/etc/timezone<br />dpkg-reconfigure -f noninteractive tzdata<br />cat &gt;/etc/default/keyboard &lt;&lt;&apos;KBEOF&apos;<br />XKBMODEL=&quot;pc105&quot;<br />XKBLAYOUT=&quot;jp&quot;<br />XKBVARIANT=&quot;&quot;<br />XKBOPTIONS=&quot;&quot;<br /><br />KBEOF<br />dpkg-reconfigure -f noninteractive keyboard-configuration<br />rm -f /boot/firstrun.sh<br />sed -i &apos;s| systemd.run.*||g&apos; /boot/cmdline.txt<br />exit 0<br />----------<br /><br />こんな感じでしょうか　設定すべき項目を最初の方に集めてありそこを書き換えればいいようにしてみました<br />その中で注意すべき点と云いますか…パスワードですね<br />USER=&apos;<span class="decorationC" style="color:red;">UserName</span>&apos;<br />PASS=&apos;<span class="decorationC" style="color:red;">$5$Salt$xxxxxxxxxx..</span>&apos;<br /><br />ログインするユーザのパスワードは暗号化されたものを指定する必要があるようです　これは <span class="decorationC" style="color:green;">openssl passwd</span> コマンドで生成できます<br /><br />$ <span class="decorationC" style="color:green;">openssl passwd -5 -salt=Salt password</span><br /><span class="decorationC" style="color:green;">-5</span> オプションは SHA256 アルゴリズムでの暗号化を行います　この他にも SHA512 で暗号化する <span class="decorationC" style="color:green;">-6</span> オプションや MD5 で暗号化する <span class="decorationC" style="color:green;">-1</span> オプションとかがあるようです<br /><span class="decorationC" style="color:green;">-salt</span> を指定すると更に複雑な暗号化を行うことができるらしい？　本来なら <span class="decorationC" style="color:green;">-salt=$RANDOM</span> のようにランダムに生成した文字列を指定するのが推奨されているようだけどお好みの文字列でも暗号化できます　まぁなんか面倒くさそうだな…って感じなら <span class="decorationC" style="color:green;">-salt</span> オプションを省略しても問題はないんですが汗<br /><br />この /boot/firstrun.sh でユーザのパスワードを指定する際には必ず暗号化されたパスワードを使用する必要があり…平文のパスワードは使えません　どうしても平文のパスワードを使いたい場合は <span class="decorationC" style="color:red;">/boot/firstrun.sh</span> と <span class="decorationC" style="color:red;">/rootfs/usr/lib/userconf-pi/userconf</span> 内の「chpasswd <span class="decorationC" style="color:blue;">-e</span>」の「<span class="decorationC" style="color:blue;">-e</span>」を削除すればできなくもないけど… <span class="decorationC" style="color:red;">/rootfs/usr/lib/userconf-pi/userconf</span> は ext4 ファイルシステムなので OS によっては読み書きできないかもだしアクセス権が root なのでその辺もどうにかしないといけないので色々と面倒です<br /><br />そんな訳なんで…初ログイン後にすぐ別のパスワードに書き換えることを前提に仮的なパスワードを作っておきました<br />$ <span class="decorationC" style="color:green;">openssl passwd -5 -salt=pass pass</span> として作成した <span class="decorationC" style="color:red;">$5$pass$Rl0JZvvs0bt2Lu8dfAumW11vh2yrd.LfOysdTyQ7Yt5</span> って感じのセキュリティのかけらもない意識低すぎて気絶しそうなパスワードですが実際にこれを設定した後に「pass」なるパスワード文字列でログインできます<br /><br /><b class="decorationB">※ これでログインしたら直ちに <span class="decorationC" style="color:green;">passwd</span> コマンドなりで別のパスワードを再設定してください！</b><br /><br />ユーザ名の設定の他に Wi-Fi についての設定というかパスワードについても説明しておきます<br />WIFISSID=&apos;<span class="decorationC" style="color:red;">Wi-Fi_SSID</span>&apos;<br />WIFIPASS=&apos;<span class="decorationC" style="color:red;">0123456789abcdefxxxx..</span>&apos;<br /><br />ここでも暗号化されたパスワードを使用します　これは <span class="decorationC" style="color:green;">wpa_passphrase</span> コマンドで生成できます<br /><br />$ <span class="decorationC" style="color:green;">wpa_passphrase &quot;Wi-Fi_SSID&quot; &quot;password&quot;</span><br />network={<br />&nbsp; &nbsp;ssid=&quot;Wi-Fi_SSID&quot;<br />&nbsp; &nbsp;&#35;psk=<span class="decorationC" style="color:blue;">&quot;password&quot;</span><br />&nbsp; &nbsp;psk=<span class="decorationC" style="color:red;">bd3f1ad8bd45873a14351f4209ab719147a960587508a8c89ef776cd9b43cefb</span><br />}<br />こんな感じで 256bit PSK アルゴリズムを用いた暗号化パスワードが生成されます　このパスワードを WIFIPASS=&apos;<span class="decorationC" style="color:red;">0123456789abcdefxxxx..</span>&apos; の部分に貼り付けてやれば ok です<br />ちなみに &#35;psk=<span class="decorationC" style="color:blue;">&quot;password&quot;</span> って平文のパスワードがコメントして出てるっていうかパスワードをダブルクォート「&quot;&quot;」で囲んでやれば平文のパスワードを指定できるんで… WIFIPASS=&apos;<span class="decorationC" style="color:red;">&quot;password&quot;</span>&apos; って指定も ok です　ただしこの設定はシステムが可動した後も /etc/wpa_supplicant/wpa_supplicant.conf 内に残り続けることになるんでリスクがあります　平文のパスワードは危険を承知した上でご使用ください<br /><br />　　：<br /><br />まぁそんなこんなで上記の /boot/cmdline.txt と /boot/firstrun.sh を用意したらラズパイの電源を入れて起動します　数分ほど待った後に SSH でログインできます　ログインした後は概ね <span class="decorationM" style="background-color:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=2" class="postidlink">完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ</a></span> の手順で VNC 接続できますが…その辺を切り取って手短に解説しておきます<br /><br />まずは SSH でログインして $ <span class="decorationC" style="color:green;">sudo raspi-config</span> 設定ツールを起動する　キーボードの矢印キーで移動してエンターキーで決定ってスタイルです　Tab キーを使う場面もあります　※ 画像は古いバージョンのものなので少々表示が異なる場合があります<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828034-admin.png" alt="202110151828034-admin.png"> <br /><span class="decorationC" style="color:red;">3 Interface Options</span> を選ぶ<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828035-admin.png" alt="202110151828035-admin.png"> <br /><span class="decorationC" style="color:red;">I3 VNC</span> を選ぶ<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828036-admin.png" alt="202110151828036-admin.png"> <br />VNC サーバを有効にするけどいいの？と聞かれるんで <span class="decorationC" style="color:red;">&lt;Yes&gt;</span> を選ぶ<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828037-admin.png" alt="202110151828037-admin.png"> <br />設定完了<br /><br />お次は vncserver-x11 ファイルを編集する<br />$ <span class="decorationC" style="color:green;">sudo nano /root/.vnc/config.d/vncserver-x11</span><br />末尾に以下の 3 行を追加します<br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280310-admin.png" alt="2021101518280310-admin.png"> <br /><span class="decorationC" style="color:red;">Authentication=VncAuth<br />Encryption=AlwaysOff<br />Password=</span><br /><br />VNC サーバを再起動する<br />$ <span class="decorationC" style="color:green;">sudo systemctl restart vncserver-x11-serviced</span><br /><br />VNC のパスワードを設定する<br />$ <span class="decorationC" style="color:green;">sudo vncpasswd -service</span><br /><br />VNC サーバを再起動する<br />$ <span class="decorationC" style="color:green;">sudo systemctl restart vncserver-x11-serviced</span><br /><br /><img class="embeddedimage " width="1069" height="837" src="https://room.dengeki.jp/images/202204291851313-admin.png" alt="202204291851313-admin.png"><br />以前はこの後に /boot/config.txt を編集する必要があったけど…今回はこの作業をする事なく VNC 接続できました<br /><br /><img class="embeddedimage " width="1069" height="837" src="https://room.dengeki.jp/images/202204291851312-admin.png" alt="202204291851312-admin.png"><br />せっかくなんで日本語化の設定も行っておきましょう<br /><br /><img class="embeddedimage " width="532" height="413" src="https://room.dengeki.jp/images/202204291851311-admin.png" alt="202204291851311-admin.png"><br />Raspberry Pi Configuration の Location タブの Set Locate ボタンを押して Language と Character Set を設定して OK ボタンを押下する<br />その後に再起動することにより設定が反映され表示が日本語になります<br /><br />あーあとお好みにより $ <span class="decorationC" style="color:green;">sudo apt install ibus-mozc</span> でローマ字かな漢字変換っていうかインプット・メソッドをインストールしておくのもいいかも知れません　これも再起動後に有効になります<br /><br /><img class="embeddedimage " width="320" height="240" src="https://room.dengeki.jp/images/20220429185131-admin.png" alt="20220429185131-admin.png"><br />既に設定した後なんで心もち表示が違うかもだけど…右上のインジケータにあるキーボードマークをクリックして Mozc を選べば ok です<br /><br />　　：<br /><br />まぁだいたいこんな感じですかね　今後のバージョンアップなりで使えなくなるかもな資料ですが…とりあえず /boot/firstrun.sh が何をしていたのかをざっくり知ることができてよかったです<br />つーか世間的に <a class="url labeledlink" href="https://ubuntu.com/download/raspberry-pi" rel="noopener noreferrer" target="_blank">Ubuntu Desktop 22.04 LTS on a Raspberry Pi</a> が話題のようですね…これはいっぺん試してみなきゃ！(&gt;_&lt;)ｗって感じで今回はこの辺で <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><br /><br />※ 追記 ※<br />上記の話とは概ね関係ないんだけど…ラズパイの Bootloader イメージを <a class="url labeledlink" href="https://www.raspberrypi.com/software/" rel="noopener noreferrer" target="_blank">Raspberry Pi Imager</a> を使わずにダウンロードしたい場合は <a class="url" href="https://downloads.raspberrypi.org/eeprom_recovery.json" rel="noopener noreferrer" target="_blank" title="https://downloads.raspberrypi.org/eeprom_recovery.json">https://downloads.raspberrypi.org/eeprom...</a> に記された &quot;SD Card Boot&quot;, &quot;USB Boot&quot;, &quot;Network Boot&quot; のそれぞれの url を参照するといいらしい？（無保証　ちょっと調べてみたら判明した気がしたんで今後のもしものために記載しておくメモ -- Posted by 猫山ぽるか 〔9939文字〕 No.26 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=26</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=26</guid>
	<category>info</category>
	<pubDate>Fri, 29 Apr 2022 11:48:20 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ M5StickC Plus の開発環境を構築する ]]></title>
	<description><![CDATA[ M5StickC Plus の開発環境を構築する<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20220326153456-admin.jpg" alt="20220326153456-admin.jpg"><br />　<br /><a class="url labeledlink" href="https://elchika.com/" rel="noopener noreferrer" target="_blank">elchika公式</a> <a class="url labeledlink" href="https://twitter.com/elchika_info" rel="noopener noreferrer" target="_blank">@elchika_info</a> さんがリツイートキャンペーンを行っていたのですが…<br /><a class="url labeledlink" href="https://twitter.com/elchika_info/status/1494506958799486977" rel="noopener noreferrer" target="_blank">Tweet</a><br />それに応募したら大当選しちゃいました！！<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202203261507198-admin.jpg" alt="202203261507198-admin.jpg"><br />そんな訳で <a class="url labeledlink" href="https://docs.m5stack.com/en/core/m5stickc_plus" rel="noopener noreferrer" target="_blank">M5StickC Plus</a> を頂きました！　本当にありがとございます！！(&gt;_&lt;)ｗ<br />こないだから Arduino Pro Micro をぼちぼちとイジり始めてマイコンへの興味が盛り上がってきた所なんで…さらに見識を深めることができそうで嬉しいです！(&gt;_&lt;)ｗ<br /><br />　　：<br /><br />そんな M5StickC Plus の外観をざっくり見てみましょう<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202203261507197-admin.jpg" alt="202203261507197-admin.jpg"> <img class="embeddedimage " width="800" height="800" src="https://room.dengeki.jp/images/202203261507191-admin.jpg" alt="202203261507191-admin.jpg"><br />裏面には I/O の説明が所狭しと書かれています　何かとよく使う(と思われる)ボタンや LED のピン番号なんかも書かれているんで…ド忘れした時とかでも困らないと思います<br /><br /><img class="embeddedimage " width="800" height="800" src="https://room.dengeki.jp/images/20220326150719-admin.jpg" alt="20220326150719-admin.jpg"><br />USB は Type-C のようです<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202203261507195-admin.jpg" alt="202203261507195-admin.jpg"> <img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202203261507194-admin.jpg" alt="202203261507194-admin.jpg"><br />USB を挿して電源が供給されると起動するようです　何やらセンサーの状況が見れるようなものとかマイクのテストや赤外線の送信(？)のようなものを「M5」ボタンで切り替えながら楽しめるようです<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202203261507193-admin.jpg" alt="202203261507193-admin.jpg"><br />ちなみに電源の ON/OFF は側面のボタンを長押しすることにより操作できるようです　電源を ON する場合には 2 秒位の長押しで電源を OFF にする場合は 6 秒くらい長押しするといいようです<br /><br />　　：<br /><br />そんな訳なんで動作チェックがてら開発環境を整えていきましょう　M5StickC Plus (M5Stackシリーズ) の開発環境は Arduino IDE を使ってどうにかできるようなんで手軽っちゃぁ手軽ですよね<br />その辺の詳細な手順については <a class="url labeledlink" href="https://docs.m5stack.com/en/arduino/arduino_development" rel="noopener noreferrer" target="_blank">公式</a> に詳しく書かれていたんで…それを実際に試していきたいと思います<br /><br /><img class="embeddedimage " width="732" height="548" src="https://room.dengeki.jp/images/2022032615071914-admin.png" alt="2022032615071914-admin.png"><br />まずは Arduino IDE の「ファイル」→「環境設定」を開きます<br /><br /><img class="embeddedimage " width="925" height="552" src="https://room.dengeki.jp/images/2022032615071913-admin.png" alt="2022032615071913-admin.png"><br />その中の「追加ボードマネージャのURL」に <a class="url" href="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json" rel="noopener noreferrer" target="_blank" title="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json">https://m5stack.oss-cn-shenzhen.aliyuncs...</a> を追加して「ok」します<br /><br /><img class="embeddedimage " width="797" height="555" src="https://room.dengeki.jp/images/2022032615071912-admin.png" alt="2022032615071912-admin.png"><br />お次に「ツール」→「ボード」→「ボードマネージャ」を開きます<br /><br /><img class="embeddedimage " width="998" height="533" src="https://room.dengeki.jp/images/2022032615071911-admin.png" alt="2022032615071911-admin.png"><br />検索欄に「m5stack」と入れて出てきた「M5Stack」をインストールする<br /><br /><img class="embeddedimage " width="894" height="671" src="https://room.dengeki.jp/images/2022032615071910-admin.png" alt="2022032615071910-admin.png"><br />これで「ツール」→「ボード」とした際に「M5Stick-C Plus」を選べるようになります<br /><br />　　：<br /><br />使用ボードの設定が済んだらライブラリをインストールします<br /><br /><img class="embeddedimage " width="746" height="559" src="https://room.dengeki.jp/images/202203261507199-admin.png" alt="202203261507199-admin.png"><br />「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を開きます<br /><br /><img class="embeddedimage " width="998" height="533" src="https://room.dengeki.jp/images/202203261507198-admin.png" alt="202203261507198-admin.png"><br />検索欄に「m5stickcplus」と入れて出てきた「M5StickCPlus」をインストールします<br /><br /><img class="embeddedimage " width="561" height="965" src="https://room.dengeki.jp/images/202203261507197-admin.png" alt="202203261507197-admin.png"><br />なんか関連したライブラリ(？)も一緒にインストールするか聞かれるんだけど…よく判んなかったんで全部入れちゃいました（汗<br /><br /><img class="embeddedimage " width="925" height="552" src="https://room.dengeki.jp/images/202203261507196-admin.png" alt="202203261507196-admin.png"><br />ちなみに…もし間違ったライブラリを入れちゃった時にそれを消したい場合は「ファイル」→「環境設定」で確認できる「スケッチブックの保存場所」で確認できるフォルダを開いて libraries フォルダを開いて<br /><br /><img class="embeddedimage " width="886" height="791" src="https://room.dengeki.jp/images/202203261507195-admin.png" alt="202203261507195-admin.png"><br />該当するライブラリが入っているフォルダを削除して Arduino IDE を再起動すると消すことができるようです<br /><br /><img class="embeddedimage " width="566" height="425" src="https://room.dengeki.jp/images/202203261507194-admin.png" alt="202203261507194-admin.png"> <img class="embeddedimage " width="500" height="374" src="https://room.dengeki.jp/images/202203261507193-admin.png" alt="202203261507193-admin.png"><br />まぁとにかくコレで M5StickC Plus のライブラリをインクルードできるようになりました<br /><br />　　：<br /><br />それじゃ実際にコードを書いてコンパイルして M5StickC Plus に書き込んでみましょう　まぁ本来なら LED を点滅させる…いわゆる「Ｌチカ」を試すべきトコロなんですが液晶ディスプレイが搭載されているって事なんでそれに文字を出力させてみましょう<br /><br />----------<br /><br />&#35; include &lt;M5StickCPlus.h&gt;<br /><br />void setup(){<br />&nbsp; M5.begin(); // M5StickC Plus の初期化？<br />}<br /><br />void loop() {<br />&nbsp; M5.Lcd.setTextSize(3); &nbsp;// フォントサイズ<br />&nbsp; M5.Lcd.setRotation(3); &nbsp;// 画面表示の向き<br />&nbsp; M5.Lcd.print(&quot;Hello World&quot;); &nbsp;// お決まりのやつ<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="500" height="375" src="https://room.dengeki.jp/images/202203261507191-admin.png" alt="202203261507191-admin.png"><br />ざっくりこんな感じですかね　これをマイコンボードに書き込んでみましょう<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202203261507192-admin.jpg" alt="202203261507192-admin.jpg"><br />無事に「Hello World」と表示されて大成功です！<br /><br />　　：<br /><br />ちなみにコンパイル時に…我が家の環境では以下のようなエラーが発生しました<br /><br /><span class="decorationC" style="color:red;">Traceback (most recent call last):<br />&nbsp; File &quot;/home/nekoyama/.arduino15/packages/m5stack/tools/esptool_py/3.1.0/esptool.py&quot;, line 38, in &lt;module&gt;<br />&nbsp;&nbsp; &nbsp;import serial<br />ModuleNotFoundError: No module named &apos;serial&apos;<br />exit status 1<br />ボードM5Stick-C-Plusに対するコンパイル時にエラーが発生しました。</span><br /><br />これは Python にシリアル通信するための pyserial モジュールが入ってない時に発生するらしいので…<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202203261507192-admin.png" alt="202203261507192-admin.png"><br /><span class="decorationC" style="color:green;">pip install pyserial</span> としてインストールしておけばいいようですメモ<br /><br />　　：<br /><br /><img class="embeddedimage " width="617" height="600" src="https://room.dengeki.jp/images/20220326150719-admin.png" alt="20220326150719-admin.png"><br />さらにちなみに初回起動時に動いていたセンサーの状況が見れるようなものとかマイクのテストや赤外線の送信(？)のようなものは「ファイル」→「スケッチ例」→「M5StickCPlus」→「FactoryTest」で再び入れ直せるようです　他にも参考になりそうなものが用意されているんで…ざっと目を通しておくといいかもです<br /><br />　　：<br /><br />Arduino Pro Micro と M5StickC Plus を比べると…すぐに使える I/O が豊富でいろいろ興味を駆り立てられてしまいますね！　特に ESP32 ってやつですかね　Wi-Fi でコネクションを確立したりその後に HTTP としてサーバからドキュメンをを取ってこれたりもできるようなんで Web サーバと連携させて M5StickC Plus をリモートで操作するようなものとか作れるかもしれんですね！<br />そんな感じで引き続きぼちぼちイジっていきたいと思います <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%4d%35%53%74%69%63%6b%43" class="taglink" title="M5StickC">#M5StickC</a> -- Posted by 猫山ぽるか 〔2732文字〕 No.24 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=24</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=24</guid>
	<category>info</category>
	<pubDate>Sat, 26 Mar 2022 15:07:18 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Android と PC のための adb メモ ]]></title>
	<description><![CDATA[ Android と PC のための adb メモ<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20220321135913-admin.png" alt="20220321135913-admin.png"><br />　<br />Android Debug Bridge（adb）なるものがあります　Debug Bridge なんて聞くと「なんか面倒くさそうだな…」って思いがちだけど…一般利用者的な使い方でも「知っておくと得をする」ような便利な機能があるっていうか忘れがちな使い方をまとめて忘れ物防止メモって感じで書き留めておきます<br /><br />　　：<br /><br />一般的には Android 端末と PC を USB ケーブルで繋ぎます　なんかここんとこ Wi-Fi を使ってケーブル無しで繋ぐ手法が確立されてきてるようだけど…その話は後述って感じで<br /><br /><img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591336-admin.png" alt="2022032113591336-admin.png"> <img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591335-admin.png" alt="2022032113591335-admin.png"><br />まずはスマホ側の設定ってことで「設定」メニューから「システム」→「端末情報」と進みます　※機種により若干の操作法の違い有り<br /><br /><img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591334-admin.png" alt="2022032113591334-admin.png"><br />その中にある「ビルド番号」を連打する<br /><br /><img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591333-admin.png" alt="2022032113591333-admin.png"><br />既に有効にしてあったんでアレだけど…これで「開発者向けオプション」を有効にできます<br /><br />※機種によっては「設定」メニューからいきなり「デバイス情報」って入る場合や「詳細設定」の中に入っている場合とかがあるようです　まぁその辺はそれっぽい項目を選びつつ「ビルド番号」を探し出してそれを連打してください（汗<br /><br /><img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591332-admin.png" alt="2022032113591332-admin.png"> <img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591331-admin.png" alt="2022032113591331-admin.png"><br />次に「設定」メニューから「システム」→「詳細設定」と進むと「開発者向けオプション」が現れます　※これも機種によって進むべきメニュー項目が違う場合があるんで…あちこち探して辿り着いてください（汗<br /><br /><img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591330-admin.png" alt="2022032113591330-admin.png"> <img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591329-admin.png" alt="2022032113591329-admin.png"><br />「開発者向けオプション」内にある「USBデバッグ」をオンにして許可する　これで端末側の設定は概ね完了です<br /><br />　　：<br /><br />お次は PC 側の設定ってことで…本来 adb ってやつは Android Studio って開発ツールに含まれているものなんでそれをセットアップする必要があるんだけど単に adb だけを使いたい人向けにシンプルなパッケージが用意されているんでそれを入れることにします<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591328-admin.png" alt="2022032113591328-admin.png"><br /><span class="decorationC" style="color:green;">sudo apt install adb</span><br /><br />なお動作検証っていうか…基本的に <a class="url labeledlink" href="http://ubuntutym2.u-toyama.ac.jp/xubuntu/20.04/release/" rel="noopener noreferrer" target="_blank">xubuntu 20.04 LTS</a> を USB メモリに書き込んだものをお試しモードっていうかライブ起動して諸々を試しています　画像の撮り忘れなんかで…本番環境の <a class="url labeledlink" href="https://ubuntu-mate.org/download/" rel="noopener noreferrer" target="_blank">Ubuntu MATE 20.04 LTS</a> を使う場合もありますがその辺はご了笑ください汗<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591327-admin.png" alt="2022032113591327-admin.png"><br />インストールが完了したら先ほどの「USBデバッグ」をオンにした Android と PC を USB ケーブルで繋ぎ <span class="decorationC" style="color:green;">adb start-server</span> してみましょう　daemon started successfully と出れば成功です<br />この操作は省略してもいいのですが…接続した Android 機と PC とのやりとりを管理するデーモン（adbd）の起動を明確に確認できるので知っておいていいと思います<br />ちなみにデーモン（adbd）を終了する際には <span class="decorationC" style="color:green;">adb kill-server</span> します　いろいろな端末を繋ぎつつ作業してると稀に動作が不安定になる場合とかあるようなので…いったんデーモンを終了させて再び起動させるとうまくいく時があります<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2022032113591326-admin.png" alt="2022032113591326-admin.png"><br />そんな adb ですが 1 台の PC に複数台の Android を接続することができます　接続した Android(のシリアル) は <span class="decorationC" style="color:green;">adb devices</span> で確認することができます<br /><br /><img class="embeddedimage " width="736" height="605" src="https://room.dengeki.jp/images/2022032113591325-admin.png" alt="2022032113591325-admin.png"><br />そのシリアルを adb の -s オプションを使って指定するとその Android 機を操作できます　画像はそれぞれの Android 内の proc フォルダ内にある cpuinfo ファイルの末尾 10 行くらいを表示させた一例です<br />なお PC に 1 台だけ Android 機を接続して使用する際にはこの -s オプションは不要です　今後は説明の簡略化っていうか 1 台だけの接続にして -s オプションは省略した感じでいきます<br /><br />　　：<br /><br />それでは adb のよく使うコマンドの説明をちょびっとだけ…<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591324-admin.png" alt="2022032113591324-admin.png"><br /><span class="decorationC" style="color:green;">adb shell</span> で接続した Android 機にログイン(？)できます　コマンドライン上の操作で Linux 系のコマンドが使えます<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591323-admin.png" alt="2022032113591323-admin.png"><br /><span class="decorationC" style="color:green;">adb shell コマンド名</span> だと PC 側の端末上で接続した Android 機のコマンドを実行できます　実行結果を PC 側のファイルにリダイレクトしたりパイプに送り込んだりできます<br />ちなみにここで試している pm コマンドはパッケージ・マネージャ系のコマンドですね　これに list package なる引数を与えて起動するとその端末にインストールされているアプリの一覧を確認できます　ここではその結果から grep を用いて必要な行だけ抽出して表示させています<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591322-admin.png" alt="2022032113591322-admin.png"> <img class="embeddedimage " width="1442" height="1118" src="https://room.dengeki.jp/images/2022032113591321-admin.png" alt="2022032113591321-admin.png"><br />パッケージの一覧を確認できたってことで…それじゃ Android 機からファイルを取ってくる adb pull を使って apk(アプリ) を抜いてみましょう<br />目的とするアプリの ID(？) を指定することで apk ファイルを取得できます　これはブラウザを使い <a class="url labeledlink" href="https://play.google.com/store/apps" rel="noopener noreferrer" target="_blank">Google Play</a> で目的のアプリを表示させたアドレス欄にも表示されているんでその辺を参考にして grep で絞り込むといいでしょう<br />そうして出てきた中から <span class="decorationC" style="color:red;">/data/app/〜/base.apk</span> を選択してコピーして <span class="decorationC" style="color:green;">adb pull /data/app/〜/base.apk</span> として実行すると PC 側に base.apk として持ってこれます<br /><br />この apk ファイルはそのまま Android 機にインストールすることができます　インストールする場合は目的の Android 機に繋ぎ替えた後に <span class="decorationC" style="color:green;">adb install base.apk</span> とすれば ok です<br /><br /><img class="embeddedimage " width="800" height="1280" src="https://room.dengeki.jp/images/2022032113591320-admin.png" alt="2022032113591320-admin.png"> <img class="embeddedimage " width="800" height="1280" src="https://room.dengeki.jp/images/2022032113591319-admin.png" alt="2022032113591319-admin.png"><br />モノは試しに <a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B01J6RPOJY" rel="noopener noreferrer" target="_blank">Fire HD 10 タブレット (10インチHDディスプレイ) 32GB - Alexa搭載</a> にインストールしてみました　もともと Amazon apps 版の <a class="url labeledlink" href="https://fairydoll.jp/" rel="noopener noreferrer" target="_blank">フェアリードール</a> が入ってたんだけど…それとは別にインストールすることができました<br />Amazon Fire には Google Play が入ってないんだけどこの手法を使えばアプリのインストールが可能です…が多くの場合ハードやセキュリティの制約などで入れられないことが多いです　まぁどうしてもの非常時に入ったらイイナ！って感じで覚えておくといいかもです（汗<br /><br />　　：<br /><br />アプリのバックアップの別の手法として <span class="decorationC" style="color:green;">adb backup アプリID</span> ってのもあるようですね　ただこれは機種ごとのセキュリティ設定が強く影響するのか…同じアプリでも G 社の Android だとうまくいくけど S 社のそれだとうまくいかないなんてことがあるようです<br />まぁもしうまくバックアップすることができたとして…出来上がった *.ab ファイルを展開するツールが存在するっぽい？<br /><a class="url labeledlink" href="https://github.com/nelenkov/android-backup-extractor" rel="noopener noreferrer" target="_blank">android-backup-extractor</a> ってものらしく <a class="url labeledlink" href="https://github.com/nelenkov/android-backup-extractor/releases" rel="noopener noreferrer" target="_blank">abe.jar</a> ってのがそれらしいです　Java 環境が必要で <span class="decorationC" style="color:green;">java -jar abe.jar unpack 解凍元.ab 解凍先.tar</span> で展開できるようです<br /><br />　　：<br /><br />Android 機のスクリーンショットを PC で撮ってそのファイルを PC に保存するなんてこともできるようです<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2022032113591311-admin.png" alt="2022032113591311-admin.png"><br />例えば <span class="decorationC" style="color:green;">adb exec-out screencap -p &gt; ss$(date +%Y%m%d%H%M%S).png</span> なんてすると実行した日時を付加した ss が PNG で PC に直接保存できます　スマホの「電源 + 音量ダウン」のボタン同時押しがそれなりに使いにくいんで…微妙なタイミングを要するスクリーンショットを撮りたい時などに重宝すると思います<br /><br />　　：<br /><br />Android 機の画面を PC 上で表示させられる scrcpy ってのがあるらしいです　これは <span class="decorationC" style="color:green;">sudo apt install scrcpy</span> で入れることができるようだけど…<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591318-admin.png" alt="2022032113591318-admin.png"><br />我が家の環境ではエラーが出て動きませんでした<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591317-admin.png" alt="2022032113591317-admin.png"><br />それじゃ別の手法で！ってことで snap 版の scrcpy を <span class="decorationC" style="color:green;">sudo snap install scrcpy</span> で入れてみました　ちなみに apt で入れる scrcpy の方が PATH の優先順位が高いんで <span class="decorationC" style="color:green;">/snap/bin/scrcpy</span> って感じのフルパス指定で起動してみます<br /><br /><img class="embeddedimage " width="1280" height="800" src="https://room.dengeki.jp/images/2022032113591316-admin.png" alt="2022032113591316-admin.png"><br />snap 版の scrcpy だとうまく動きました！　思ってたより動きもスムーズでいい感じです！(&gt;_&lt;)ｗ<br />そんな snap 版の scrcpy を毎回毎回フルパス指定で起動するのも面倒だな…って事なんで snap の別名設定を使ってみることにします<br /><br /><img class="embeddedimage " width="579" height="412" src="https://room.dengeki.jp/images/2022032113591315-admin.png" alt="2022032113591315-admin.png"><br />設定は <span class="decorationC" style="color:green;">sudo snap alias 元のコマンド名 新しいコマンド名</span> でできるようなんで <span class="decorationC" style="color:green;">sudo snap alias scrcpy Scrcpy</span> って感じで頭文字を大文字にしてみました　エイリアスを確認する際には <span class="decorationC" style="color:green;">snap aliases</span> とするようです<br /><br />　　：<br /><br />同様に Android 機の音声を PC 上で再生させられる sndcpy ってのがあるらしいです　これは <a class="url labeledlink" href="https://github.com/rom1v/sndcpy" rel="noopener noreferrer" target="_blank"> rom1v / sndcpy</a> の Get the app から sndcpy-v1.1.zip (※20220321現在) を落としてきて展開して…その中の sndcpy (シェルスクリプト) を実行すればいいようです<br /><br /><img class="embeddedimage " width="1280" height="800" src="https://room.dengeki.jp/images/2022032113591314-admin.png" alt="2022032113591314-admin.png"><br />先ほどの Scrcpy と sndcpy を同時に使ってみた例　音声は 0.5 秒くらい(？)遅れてきてるみたいですね　あーあと sndcpy を使用する場合には PC に vlc (メディアプレイヤ) を入れておく必要があるようです<br />スマホとかの小さい画面とショボいスピーカーの音声を PC 側に出すと見やすくて音もよくてとてもゴキゲンです！　追加投資は USB ケーブルだけ！って手軽さがいいですね！<br /><br />　　：<br /><br />そんな USB ケーブルで PC と Android 機を繋ぎっぱなしってのもなんか邪魔くさいんで…その辺をネットワーク (Wi-Fi等) でどうにかする手法があるようです　<span class="decorationC" style="color:red;">※使用するにあたり…最初の設定段階では USB ケーブルで繋いでおく必要があります</span><br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2022032113591313-admin.png" alt="2022032113591313-admin.png"> <img class="embeddedimage " width="1080" height="1839" src="https://room.dengeki.jp/images/2022032113591312-admin.png" alt="2022032113591312-admin.png"><br />まず <span class="decorationC" style="color:green;">adb tcpip 5555</span> で listen するポートを 5555 に設定します　ポート番号は 5555～5585 の範囲で奇数番号のポートが使用できるらしい？<br />次に <span class="decorationC" style="color:green;">adb connect 192.16x.x.x32</span> で Android 機の IP アドレスを指定して接続します　Android 機の IP アドレスは「設定」→「ネットワークとインターネット」→「Wi-Fi」→「接続済みのAP」→「詳細設定」等で確認できます　※使用機種によりメニュー構成が若干違います<br /><br />connected to 192.16x.x.x32:5555 などと表示され接続したら…この時点で USB ケーブルを抜いても ok です<br />あとは adb shell なりの adb コマンドをネットワーク経由で使用できます<br /><br />　　：<br /><br />さらに最近では最初からネットワークで全てが完了する「ワイヤレス デバッグ」も使用できるようになりつつあります　<span class="decorationC" style="color:red;">※ Android OS 11 以降で adb も新しいものが必要になります</span><br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202203211359136-admin.png" alt="202203211359136-admin.png"><br /><span class="decorationC" style="color:green;">sudo apt install adb</span> で入れたものは Ver. 1.0.39 で…これは古いので使えません　じゃぁどうしよう？ってことで…それじゃ Android Studio を入れてみましょう<br /><br /><img class="embeddedimage " width="1120" height="819" src="https://room.dengeki.jp/images/202203211359135-admin.png" alt="202203211359135-admin.png"> <img class="embeddedimage " width="1120" height="819" src="https://room.dengeki.jp/images/202203211359134-admin.png" alt="202203211359134-admin.png"><br /><a class="url labeledlink" href="https://developer.android.com/studio" rel="noopener noreferrer" target="_blank">Android Studio のダウンロードページ</a> のダウンロードボタンを押下して…お決まりの了解したぜ！チェックした後にダウンロードします　ダウンロードしたファイルを解凍して <span class="decorationC" style="color:green;">android-studio/bin/studio.sh</span> を実行するとインストールが開始します　本気で使う気がないのなら…まぁこの辺は適当でいいと思います（汗<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202203211359136-admin.png" alt="202203211359136-admin.png"><br />標準的なインストールを行うと ~/Android/Sdk/platform-tools/ の中に adb が用意されるのでこれを使ってみます　Ver. 1.0.41 でした<br /><br /><img class="embeddedimage " width="720" height="1467" src="https://room.dengeki.jp/images/2022032113591310-admin.png" alt="2022032113591310-admin.png"><br />お次は Android OS 11 以降の設定を行います　「設定」→「システム」→「開発者向けオプション」→「ワイヤレス デバッグ」をオンにして…その項目をタップする<br /><br /><img class="embeddedimage " width="720" height="1467" src="https://room.dengeki.jp/images/202203211359139-admin.png" alt="202203211359139-admin.png"><br />タップしたらワイヤレス デバッグの設定に入れるので…「ペア設定コードによるデバイスのペア設定」をタップする<br /><br /><img class="embeddedimage " width="720" height="1467" src="https://room.dengeki.jp/images/202203211359138-admin.png" alt="202203211359138-admin.png"><br />すると必要な情報が表示されるので…これをもとに adb で接続設定していきます　なお古い adb と混同するをアレなんで <span class="decorationC" style="color:red;">~/Android/Sdk/platform-tools/adb</span> って感じのフルパスでコマンドを起動しています<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202203211359133-admin.png" alt="202203211359133-admin.png"><br />先ほど表示されてた IP アドレスとポート番号で <span class="decorationC" style="color:green;">~/Android/Sdk/platform-tools/adb pair 192.16x.x.x31:43015</span> って感じで実行します　するとペアリング・コードを聞かれるのでそれを入力します　※ここでは 226441 でした　これでペアリング設定は完了です<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202203211359132-admin.png" alt="202203211359132-admin.png"> <img class="embeddedimage " width="720" height="1467" src="https://room.dengeki.jp/images/202203211359137-admin.png" alt="202203211359137-admin.png"><br />お次は実際に接続します　これは <span class="decorationC" style="color:green;">~/Android/Sdk/platform-tools/adb connect 192.16x.x.x31:40643</span> って感じで実行します　先ほどのペアリング設定のポート番号とは別のポート番号になるので注意してください<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202203211359131-admin.png" alt="202203211359131-admin.png"> <br />成功すればこれでワイヤレス接続が完了しています　後は <span class="decorationC" style="color:green;">~/Android/Sdk/platform-tools/adb shell</span> するなり色々をネットワーク経由で行えます　少々手順が多くて面倒かなーって思いつつ…まぁ慣れてしまえば USB ケーブルを接続するより楽ちんかなーってイメージです<br />ただし先述の scrcpy や sndcpy は(20220321現在)対応していない感じでした　この辺が早く対応してくれればなーって思います<br /><br />※ 追記 ※<br />テストした環境の PATH 設定の都合で Ver. 1.0.39 の adb が参照されていたので…その辺をどうにかしたら sndcpy は動きました　Android Studio で入れた Ver. 1.0.41 を優先的に使えるよう PATH を以下のように設定しました<br /><span class="decorationC" style="color:green;">export PATH=&quot;/home/$USER/Android/Sdk/platform-tools:$PATH&quot;</span>　※ 標準的(？)な Android Studio のインストールを行った場合<br />一時的な設定ならコマンドラインで上記のように実行するもよし…再起動後とかも永続的に使いたいのであれば ~/.profile を編集して…最終行辺りに上記のパス設定を追加しておくといいでしょう<br /><br />ちなみに scrcpy は apt 版(Ver. 1.12.1)と snap 版(Ver. 1.23)のどちらもワイヤレス環境では動作しませんでした(-_-；)<br /><br />　　：<br /><br />そんなこんなな adb の使い方いろいろでした　他にも音量の操作やら特定のイベントシグナルの送信などなどアプリ開発のデバッグに有用な機能が用意されているのですが…まぁ末端ユーザでは概ね必要のない機能なのでその辺はもっとプロの方が発する情報をご参照くださいってことで <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%6e%64%72%6f%69%64" class="taglink" title="Android">#Android</a> <a href="https://room.dengeki.jp/tegalog.cgi?tag=%55%62%75%6e%74%75" class="taglink" title="Ubuntu">#Ubuntu</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> -- Posted by 猫山ぽるか 〔6454文字〕 No.23 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=23</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=23</guid>
	<category>info</category>
	<pubDate>Mon, 21 Mar 2022 13:59:13 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino とマトリクスキーボード ]]></title>
	<description><![CDATA[ Arduino とマトリクスキーボード<br /><img class="embeddedimage " width="220" height="220" src="https://room.dengeki.jp/images/202202201020325-admin.jpg" alt="202202201020325-admin.jpg"><br />　<br />以前にどうにかしてたっていうか「<a href="https://room.dengeki.jp/tegalog.cgi?postid=8" class="postidlink">Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう！</a>」の後ぐらいにいろいろ調べてたら…なんかマトリクス・キーボードっていうの？　少ないピン数で多くのスイッチを読み取れる方法があるらしい？？ってのを見つけて気になってたんで勉強がてらその辺を試してみることにしました<br /><br />そんなマトリクスってのを日本語的に云うと…碁盤の目みたいなものって感じになるっぽい？　それをキーボード的に実装すると…例えば横方向にマイコンから何本かの出力線を這わせておいてそれと何本かの入力線をスイッチを介してあたかも碁盤の目のように配置したもの？ってなるらしい？？<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/202202201020324-admin.jpg" alt="202202201020324-admin.jpg"> <img class="embeddedimage " width="1000" height="957" src="https://room.dengeki.jp/images/20211113072346-admin.jpg" alt="20211113072346-admin.jpg"><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 と略す)を使って実際に作ってみました　ちなみに Pro Micro のピン配列図はこんな感じです　つーかブレッドボード(？)が狭くて碁盤の目になってなくてアレですよね（汗<br /><br /><img class="embeddedimage " width="850" height="850" src="https://room.dengeki.jp/images/202202201020325-admin.png" alt="202202201020325-admin.png"><br />回路図的なものにするとこんな感じです　つーか回路図なんて描いたことないんで正しくない図かもしれませんが…まぁ概念的な絵だと思って見てください（滝汗<br /><br /><img class="embeddedimage " width="850" height="850" src="https://room.dengeki.jp/images/202202201020324-admin.png" alt="202202201020324-admin.png"><br />ここでは Arduino の <span class="decorationC" style="color:blue;">6</span> 番ピンと <span class="decorationC" style="color:blue;">7</span> 番ピンを出力として使い <span class="decorationC" style="color:darkgreen;">14</span> 番ピンと <span class="decorationC" style="color:darkgreen;">15</span> 番ピンを入力として使います<br />そして <span class="decorationC" style="color:blue;">6</span> 番ピンのみに信号を出力します　その状態で <span class="decorationC" style="color:red;">A</span> もしくは <span class="decorationC" style="color:red;">B</span> のスイッチが押されればそれぞれ対応した <span class="decorationC" style="color:darkgreen;">14</span> 番ピンか <span class="decorationC" style="color:darkgreen;">15</span> 番ピンで信号を読み取ることができます　それにより <span class="decorationC" style="color:red;">A</span> もしくは <span class="decorationC" style="color:red;">B</span> のスイッチが押されたかどうかを特定できます<br />※なんか PULLUP 回路の都合上っていうの？<br />※普段は HIGH にしてあって…「出力する」としたものを LOW にすることで動作する仕組みです　ちょっとややこしいですね(-_-；)<br /><br /><img class="embeddedimage " width="850" height="850" src="https://room.dengeki.jp/images/202202201020323-admin.png" alt="202202201020323-admin.png"><br />引き続き今度は <span class="decorationC" style="color:blue;">7</span> 番ピンにのみ信号を出力します　その状態で <span class="decorationC" style="color:red;">C</span> もしくは <span class="decorationC" style="color:red;">D</span> のスイッチが押されればそれぞれ対応した <span class="decorationC" style="color:darkgreen;">14</span> 番ピンか <span class="decorationC" style="color:darkgreen;">15</span> 番ピンで信号を読み取ることができます　それにより <span class="decorationC" style="color:red;">C</span> もしくは <span class="decorationC" style="color:red;">D</span> のスイッチが押されたかどうかを特定できます<br />この一連の動作を繰り返すことにより碁盤の目のように配置されたスイッチを特定していく…そんな構造のキーボードをマトリクスキーボードと呼ぶらしいです<br /><br />それでは実際にスケッチを書いて動作を確認してみましょう<br /><br />----------<br /><br />&#35;include &quot;Keyboard.h&quot;<br /><br />void setup() {<br />&nbsp; pinMode(6, OUTPUT);<br />&nbsp; pinMode(7, OUTPUT);<br />&nbsp; pinMode(14, INPUT_PULLUP);<br />&nbsp; pinMode(15, INPUT_PULLUP);<br /><br />&nbsp; digitalWrite(6, HIGH); &nbsp;// 6 番ピンを HIGH にしておく<br />&nbsp; digitalWrite(7, HIGH); &nbsp;// 7 番ピンを HIGH にしておく<br /><br />&nbsp; Serial.begin(9600);<br />&nbsp; Keyboard.begin();<br />}<br /><br />void loop() {<br />// -------------------------------- //<br />&nbsp; digitalWrite(6, LOW); // 6 番ピンを LOW にしてスキャン開始<br />&nbsp; if (digitalRead(14) == LOW) { // 14 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;A\n&quot;); &nbsp;// LOW なら A のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;A\n&quot;);<br />&nbsp; }<br />&nbsp; if (digitalRead(15) == LOW) { // 15 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;B\n&quot;); &nbsp;// LOW なら B のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;B\n&quot;);<br />&nbsp; }<br />&nbsp; digitalWrite(6, HIGH); &nbsp;// 6 番ピンを HIGH にしてスキャン終了<br />// -------------------------------- //<br />&nbsp; digitalWrite(7, LOW); // 7 番ピンを LOW にしてスキャン開始<br />&nbsp; if (digitalRead(14) == LOW) { // 14 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;C\n&quot;); &nbsp;// LOW なら C のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;C\n&quot;);<br />&nbsp; }<br />&nbsp; if (digitalRead(15) == LOW) { // 15 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;D\n&quot;); &nbsp;// LOW なら D のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;D\n&quot;);<br />&nbsp; }<br />&nbsp; digitalWrite(7, HIGH); &nbsp;// 7 番ピンを HIGH にしてスキャン終了<br />// -------------------------------- //<br />&nbsp; delay(100); // 適当に待って繰り返し<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="918" height="535" src="https://room.dengeki.jp/images/202202201020322-admin.png" alt="202202201020322-admin.png"><br />シリアルモニタとテキストエディタを並べて動作テストしてみましょう　スイッチに対応した文字が表示されれば成功です　ちなみに今回はシリアルモニタとテキストエディタの両方に出力するようにしてますが…初期のテスト段階ではシリアルモニタだけを使ったほうがいいかもですね<br /><br />　　：<br /><br />さてそんな感じでマトリクス・キーボードの大まかな動作を理解できた気になったんで…ぼちぼちマルチメディアキーボード的なやつを作るか！って思いたいトコロなんだけどスイッチ類を買い揃えて配線したりとかとかしょーみ面倒くさいなぁと思ってたんですよね　そう思いつつ某Ａマゾンを眺めてたら気になるものを見つけました<br /><br /><a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B0978YTZV1" rel="noopener noreferrer" target="_blank">Ren He 5個セット 16キー 4*4 マトリックス フィルム ボタン キーボード マトリックススイッチ キーパッド メンブレン式 マトリックスキーボード Arduinoに対応</a><br /><br />かなり怪しげな感じだけど 5 個入りなのに 600 円でお釣りがきちゃうお値段に釣られてポチっちゃいました　初期不良でいくつか動かなかったとしても十分にお値打ちっポイネ！！<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/202202201020323-admin.jpg" alt="202202201020323-admin.jpg"><br />なんか適当なプチプチに包まれた荷姿で届くと思ってたのに…郵便受けをギリ通る厚みのプラケースに入れられて来ましたｗ　やるじゃんｗｗ<br /><br /><img class="embeddedimage " width="1550" height="1250" src="https://room.dengeki.jp/images/202202201020321-admin.png" alt="202202201020321-admin.png"><br />ちなみにデータシートの類は入ってなかったんで自力で配線を解析する必要があったけど…まぁわりと素直な作りだったんで簡単に判明してよかったです　そして Arduino と接続したピン番号とかも<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/20220220102032-admin.jpg" alt="20220220102032-admin.jpg"> <img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/202202201020321-admin.jpg" alt="202202201020321-admin.jpg"> <img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202202201020322-admin.jpg" alt="202202201020322-admin.jpg"><br />実際に接続してみました　まぁ毎度のごとく「接続例」って感じなんで…この辺は各人のお好みでどうにかしてもらえばいいかと思います<br /><br />それでは早速スケッチを書いて動作を確認してみましょう<br /><br />----------<br /><br />const byte KEYOT&#91;&#93; = {<span class="decorationC" style="color:red;">4</span>, <span class="decorationC" style="color:red;">5</span>, <span class="decorationC" style="color:red;">6</span>, <span class="decorationC" style="color:red;">7</span>}; &nbsp;// 出力ピンの設定<br />const byte KEYIN&#91;&#93; = {<span class="decorationC" style="color:red;">14</span>, <span class="decorationC" style="color:red;">15</span>, <span class="decorationC" style="color:red;">18</span>, <span class="decorationC" style="color:red;">19</span>}; &nbsp;// 入力ピンの設定<br />const int WAIT = <span class="decorationC" style="color:red;">100</span>; // ちょっと待たせる<br /><br />// &nbsp;関数 keyscan() がキーの状態を読み取った値を入れておく配列<br />byte SW&#91;sizeof(KEYOT)&#93;&#91;sizeof(KEYIN)&#93;;<br /><br />const byte ON = LOW; &nbsp;// LOW と HIGH を…<br />const byte OF = HIGH; // ON と OF の別名で定義しておく<br /><br />void setup() {<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYOT); i++) {<br />&nbsp;&nbsp; &nbsp;pinMode(KEYOT&#91;i&#93;, OUTPUT); &nbsp;// 出力ピンのモード設定<br />&nbsp;&nbsp; &nbsp;digitalWrite(KEYOT&#91;i&#93;, HIGH); // 出力ピンを HIGH に設定<br />&nbsp; }<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYIN); i++) {<br />&nbsp;&nbsp; &nbsp;pinMode(KEYIN&#91;i&#93;, INPUT_PULLUP); &nbsp;// 入力ピンを PULLUP モードに設定<br />&nbsp; }<br />&nbsp; Serial.begin(9600); // シリアル通信を開始<br />}<br /><br />void loop() {<br />&nbsp; keyscan(); &nbsp;// キーの状態を読み取る<br />// -------------------------------- //<br />&nbsp; if (SW&#91;0&#93;&#91;0&#93; == ON) { Serial.println(&quot;1&quot;); }<br />&nbsp; if (SW&#91;0&#93;&#91;1&#93; == ON) { Serial.println(&quot;2&quot;); }<br />&nbsp; if (SW&#91;0&#93;&#91;2&#93; == ON) { Serial.println(&quot;3&quot;); }<br />&nbsp; if (SW&#91;0&#93;&#91;3&#93; == ON) { Serial.println(&quot;A&quot;); }<br />// -------------------------------- //<br />&nbsp; if (SW&#91;1&#93;&#91;0&#93; == ON) { Serial.println(&quot;4&quot;); }<br />&nbsp; if (SW&#91;1&#93;&#91;1&#93; == ON) { Serial.println(&quot;5&quot;); }<br />&nbsp; if (SW&#91;1&#93;&#91;2&#93; == ON) { Serial.println(&quot;6&quot;); }<br />&nbsp; if (SW&#91;1&#93;&#91;3&#93; == ON) { Serial.println(&quot;B&quot;); }<br />// -------------------------------- //<br />&nbsp; if (SW&#91;2&#93;&#91;0&#93; == ON) { Serial.println(&quot;7&quot;); }<br />&nbsp; if (SW&#91;2&#93;&#91;1&#93; == ON) { Serial.println(&quot;8&quot;); }<br />&nbsp; if (SW&#91;2&#93;&#91;2&#93; == ON) { Serial.println(&quot;9&quot;); }<br />&nbsp; if (SW&#91;2&#93;&#91;3&#93; == ON) { Serial.println(&quot;C&quot;); }<br />// -------------------------------- //<br />&nbsp; if (SW&#91;3&#93;&#91;0&#93; == ON) { Serial.println(&quot;*&quot;); }<br />&nbsp; if (SW&#91;3&#93;&#91;1&#93; == ON) { Serial.println(&quot;0&quot;); }<br />&nbsp; if (SW&#91;3&#93;&#91;2&#93; == ON) { Serial.println(&quot;&#35;&quot;); }<br />&nbsp; if (SW&#91;3&#93;&#91;3&#93; == ON) { Serial.println(&quot;D&quot;); }<br />// -------------------------------- //<br />&nbsp; delay(WAIT);<br />}<br /><br />void keyscan() { &nbsp;// キーの状態を読み取る関数<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYOT); i++) {<br />&nbsp;&nbsp; &nbsp;digitalWrite(KEYOT&#91;i&#93;, LOW); &nbsp;// 特定の出力ピンを LOW にする<br />&nbsp;&nbsp; &nbsp;for (byte j = 0; j &lt; sizeof(KEYIN); j++) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (digitalRead(KEYIN&#91;j&#93;) == ON) { &nbsp;// 入力ピンの状態を読む<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; SW&#91;i&#93;&#91;j&#93; = ON; &nbsp;// キーが押されている<br />&nbsp;&nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; SW&#91;i&#93;&#91;j&#93; = OF; &nbsp;// キーは離されている<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;digitalWrite(KEYOT&#91;i&#93;, HIGH); // LOW にした出力ピンを HIGH に戻す<br />&nbsp; }<br />}<br /><br />----------<br /><br />冒頭にある<br /><br />const byte KEYOT&#91;&#93; = {<span class="decorationC" style="color:red;">4</span>, <span class="decorationC" style="color:red;">5</span>, <span class="decorationC" style="color:red;">6</span>, <span class="decorationC" style="color:red;">7</span>}; &nbsp;// 出力ピンの設定<br />const byte KEYIN&#91;&#93; = {<span class="decorationC" style="color:red;">14</span>, <span class="decorationC" style="color:red;">15</span>, <span class="decorationC" style="color:red;">18</span>, <span class="decorationC" style="color:red;">19</span>}; &nbsp;// 入力ピンの設定<br />const int WAIT = <span class="decorationC" style="color:red;">100</span>; // ちょっと待たせる<br /><br />この辺と…あとは loop() 内を書き換えるだけでいいように書いてみました　<span class="decorationC" style="color:red;">使用するピン数が増減</span>しても概ね追従できると思います<br />あーあと setup() で使用したい機能を開始させるような辺りの書き換えも必要ですかね<br /><br />それと…話がややこしくなるとアレなんで今回はシリアル通信のみで動作チェックしています<br /><br />キーの状態を読み取る keyscan() 関数ってのがありますが…グローバル変数を使っているので引数も返り値もありません<br />読み取った値は SW&#91;&#93;&#91;&#93; って二次元配列にセットしています<br /><br />あと PULLUP の特性っていうか普段が HIGH となっていて…スイッチが押されると LOW になるって辺りが何となく直感的にイメージしにくいように思えたんで<br />const byte ON = LOW; &nbsp;// LOW と HIGH を…<br />const byte OF = HIGH; // ON と OF の別名で定義しておく<br />って感じでスイッチが押されてる ON ってのとスイッチが離されてる OF って感じの別名で定義してあります<br /><br />　　：<br /><br />そして loop() 内で keyscan() を呼んでキーの状態を読み取っておいて…あとは個々の SW&#91;&#93;&#91;&#93; の状態に応じてお好みの文字(列)を出力させるなり何なりをすればいいでしょう<br />将来的にっていうかもし「1」が押されてたらキーボードとして文字を出力して「&#35;」が押されてたらマウスの右クリックを…って感じで様々な処理を行えるよう少しばかり長ったらしく書いてあります<br /><br />この辺の「やること」の種類が決まりきっているのであれば<br /><br />void loop() {<br />&nbsp; keyscan();<br />// -------------------------------- //<br />&nbsp; const char* str&#91;&#93; = {<br />&nbsp;&nbsp; &nbsp;&quot;1\n&quot;, &quot;2\n&quot;, &quot;3\n&quot;, &quot;A\n&quot;,<br />&nbsp;&nbsp; &nbsp;&quot;4\n&quot;, &quot;5\n&quot;, &quot;6\n&quot;, &quot;B\n&quot;,<br />&nbsp;&nbsp; &nbsp;&quot;7\n&quot;, &quot;8\n&quot;, &quot;9\n&quot;, &quot;C\n&quot;,<br />&nbsp;&nbsp; &nbsp;&quot;*\n&quot;, &quot;0\n&quot;, &quot;&#35;\n&quot;, &quot;D\n&quot;,<br />&nbsp; };<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYOT); i++) {<br />&nbsp;&nbsp; &nbsp;for (byte j = 0; j &lt; sizeof(KEYIN); j++) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (SW&#91;i&#93;&#91;j&#93; == ON) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.print(str&#91;sizeof(KEYOT) * i + j&#93;);<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }<br />// -------------------------------- //<br />&nbsp; delay(WAIT);<br />}<br /><br />こんなふうに for() で回すように書けばもうちょっとスッキリするかもしれんですね　これはまぁ「やること」の内容によっていろいろ書き方があるよねって事で参考までに<br /><br />　　：<br /><br />あーあと後半の中華クソ安 16 キーボードでの実験ではテキストエディタへの文字出力を行っていないんですが…これを実際に行うと不具合が出るものがあります<br /><br /><img class="embeddedimage " width="535" height="535" src="https://room.dengeki.jp/images/20220220102032-admin.png" alt="20220220102032-admin.png"><br />キーボード上の「*」 なんですけどね　シリアルモニタではちゃんと「*」が出力されているのに…テキストエディタ上では「(」になってしまいます<br />※別のスケッチでテストした際の画像です<br /><br />これは &#35;include &quot;Keyboard.h&quot; した際のキーボードレイアウトが KeyboardLayout_en_US になってて…まぁいわゆる US キーボードってやつですかね　これが日本で一般的に使われている JIS キーボードとレイアウト(キーの配置)が違うから起こる現象のようです<br />アルファベットと数字に関しては問題ないのですが…記号はその多くが US と JIS とで配列が違うんで問題になります<br /><br /><img class="embeddedimage " width="1240" height="923" src="https://room.dengeki.jp/images/202202201033061-admin.png" alt="202202201033061-admin.png"><br />先ほどの「*」を例にすると… US キーボードでは「*」が「8」のキーに割り当てられています<br /><br /><img class="embeddedimage " width="1240" height="923" src="https://room.dengeki.jp/images/20220220103306-admin.png" alt="20220220103306-admin.png"><br />そのキーコードを JIS キーボードに当てはめると「8」のキーにあるのは「(」って事になるので正しく表示されないのです<br /><br />困っちゃいますよね…そこそこ数が出回ってる(と思われる) JIS キーボードなんだで Keyboard.begin(KeyboardLayout_ja_JP); くらい通るようにしといてほしいのに！って思うんだけどそうはいきません(-_-；)<br /><br />どうしたもんかなーって思いつつ調べてたら…何やら Keyboard.h を複製した後に JIS キーボード向けに書き換える手法を見つけました→ <a class="url labeledlink" href="https://mgt.blog.ss-blog.jp/2016-01-14" rel="noopener noreferrer" target="_blank">Arduino Leonardoで\記号を打つ：メガギガテラス：So-netブログ</a><br />実際に試してみたところ…これでバッチリ動作しました！　まぁあくまで自己責任で！って感じになるんだけど…自作キーボードでいろいろしたい！って場合にはとても有用な情報だと思うんで参考にしてみてください<br /><br />　　：<br /><br />キーボード自作って話になると耳にするマトリクスキーボードってやつですね　今までは何となく漠然と聞き流していたんですが…今回はその辺に踏み込んでその原理をほんのり理解できた気になれてよかったです　マイコン側のピン数を減らしつつ…より多くのキーを読み取るテクニックは今後も色々と使えそうなんで今後もより掘り下げた勉強をしていきたいなって思いました<br /><br />あと…マトリクスキーボードの構造的な問題っていうか特定条件の複数キーの同時押しをした際に正常に動きません　今回の中華クソ安 16 キーボードを使った実験を例にとると…縦軸に配されたキー(例えば「1と4」とか「AとBとC」とか)を同時押しすると「どれも押されてない」って判定されます　まぁなんか読みたいキーとは別のスイッチを介して HIGH が逆流してくる(？)ことにより誤動作するらしく…そんな逆流を防ぐためにダイオードを入れるって事らしいんですが今回は既成品でその辺をどうにもできかねる感じなんでそのままにしてあります（汗<br /><br />まぁその辺を踏まえた上で…この中華クソ安 16 キーボードでマルチメディアキーボード的なものを作るとしますかね　程々に硬い板に貼り付けて配線の取りまとめをすればいいだけって感じの見栄えよりお手軽さ！って感じのアレですが（瀧汗<br /><br />そんなこなんで今回も長々とお疲れさまでした！　安いのに遊び甲斐のある Arduino をもっと色々と使い倒していきタイネ！(&gt;_&lt;)ｗ <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> -- Posted by 猫山ぽるか 〔7955文字〕 No.21 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=21</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=21</guid>
	<category>info</category>
	<pubDate>Sun, 20 Feb 2022 10:20:32 +0900</pubDate>
</item>
<!-- 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[ 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[ スケジュール実行 cron は 13 日の金曜日の夢を見るか… ]]></title>
	<description><![CDATA[ スケジュール実行 cron は 13 日の金曜日の夢を見るか？<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.jp/images/20211211080738-admin.png" alt="20211211080738-admin.png"><br />　<br />「〇〇〇〇は△△△△の夢を見るか？」ってフレーズを見かけるとなんかえっちな気分になっちゃう！って光栄マイコンシステムのストロベリーなんとか世代のひいおじいちゃんが云ってたけど…自称：ゆとりのない平成のゆとり的なオレ様的にはしょーみなンてるんか全く意味わかんないですｗ　まじまじｗｗｗ<br />まぁそんな茶番はおいといて…諸々の bot 大好きな人々に愛されるスケジュール実行の cron についての諸々です<br /><br />cron - daemon to execute scheduled commands (Vixie Cron)<br />スケジュールされたコマンドを実行するデーモンって事らしいですね（機械翻訳<br /><br />このスケジュールの確認・設定をするには crontab なるコマンドを使います<br />スケジュールの確認 <span class="decorationC" style="color:green;">crontab -l</span><br />スケジュールの設定 <span class="decorationC" style="color:green;">crontab -e</span><br /><br />設定の初回起動時のみ使用するエディタを聞かれるらしい？　なおこの使用するエディタは以下のコマンドで再設定できるようです<br /><span class="decorationC" style="color:green;">select-editor</span><br /><br />Select an editor. &nbsp;To change later, run &apos;select-editor&apos;.<br />&nbsp; 1. /bin/ed<br />&nbsp; 2. /bin/nano&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;<span class="decorationC" style="color:red;">&lt;---- easiest</span><br />&nbsp; 3. /usr/bin/vim.tiny<br /><br />Choose 1-3 <span class="decorationC" style="color:red;">&#91;2&#93;</span>: <br /><br />なんか「<span class="decorationC" style="color:red;">&lt;---- easiest</span>」と「<span class="decorationC" style="color:red;">&#91;2&#93;</span>」ってのが現在設定されているエディタっぽく見えるけどそうじゃなくて…何も入力せずに Enter した時に選択されるデフォルト値を表示しているようです　紛らわしいですね(-_-；)<br /><br />　　：<br /><br />では実際に <span class="decorationC" style="color:green;">crontab -e</span> して設定してみましょう<br />新たなスケジュールを設定する場合は…新しい行として以下の書式を追加します<br /><br /><span class="decorationC" style="color:green;">* * * * * コマンド</span><br /><br />5 個並んだ「*」は順番に… 分 時 日 月 曜日 を指しています<br />「*」は設定可能な全ての値になってるんで…上記の「* * * * * コマンド」は <b class="decorationB">全ての分</b> の <b class="decorationB">全ての時</b> の <b class="decorationB">全ての日</b> の <b class="decorationB">全ての月</b> の <b class="decorationB">全ての曜日</b> って意味となり「毎分(だいたい 0 秒くらい)にコマンドを実行」となります<br />もうちょっと細かく設定した例っていうか…<br /><br /><span class="decorationC" style="color:green;">1 * * * * コマンド</span><br />毎月の毎日の毎時の 1 分にコマンドを実行<br /><br /><span class="decorationC" style="color:green;">1 2 * * * コマンド</span><br />毎月の毎日の 2 時 1 分にコマンドを実行<br /><br /><span class="decorationC" style="color:green;">1 2 3 * * コマンド</span><br />毎月の 3 日の 2 時 1 分にコマンドを実行<br /><br /><span class="decorationC" style="color:green;">1 2 3 4 * コマンド</span><br />4 月 3 日の 2 時 1 分にコマンドを実行<br /><br />曜日は少々特殊な扱いになってるってるんでアレだけど…例えば<br /><span class="decorationC" style="color:green;">* * * * 6 コマンド</span> もしくは<br /><span class="decorationC" style="color:green;">* * * * sat コマンド</span> で毎月の<b class="decorationB">毎土曜日</b>の毎時の毎分にコマンドを実行します<br />数字と曜日は 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun に対応しています　大文字小文字は関係ないようです<br /><br />　　：<br /><br />もっと細やかな設定をしてみましょう　例えば勤務時間内にありがちな設定っていうか 8 時から 17 時までの毎時 0 分にコマンドを実行するって例だと…<br /><span class="decorationC" style="color:green;">0 8,9,10,11,12,13,14,15,16,17 * * * コマンド</span><br /><span class="decorationC" style="color:green;">0 8-17 * * * コマンド</span><br />設定したい内容を「,(カンマ)」で区切って列挙するとか「-(ハイフン)」で 8 から 17 までって感じで指定します<br /><span class="decorationC" style="color:green;">0 8-12,13-17 * * * コマンド</span><br />こんな感じで範囲指定を列挙することもできるようです<br /><br />ただし分なり時なりの境い目をまたいで設定する場合には注意が必要です　例えば毎時の 50 分から次の 10 分までって場合だと…<br /><span class="decorationC" style="color:green;">50-10 * * * * コマンド</span><br />この指定では動きません　この場合だと…<br /><span class="decorationC" style="color:green;">50-59,0-10 * * * * コマンド</span><br />こんな感じで途中に「,(カンマ)」を入れて区切ってやらないとダメなようです　ちなみに「,(カンマ)」で列挙する場合には数の大小の順番は関係ないらしいです<br /><br />　　：<br /><br />さらに細やかな設定をしてみましょう　例えば（どのような状況でそのような必要があるのかイマイチ思い浮かばないけど）偶数日（2 で割り切れる日）の 10 時 20 分のみコマンドを実行するって例だと…<br /><span class="decorationC" style="color:green;">20 10 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 * * コマンド</span><br /><span class="decorationC" style="color:green;">20 10 2-30/2 * * コマンド</span><br />こんな感じで指定できます　まぁ「全ての偶数日」って事なんで「2-30/2」なんて指定じゃなく「*/2」でもイケるようです<br />ちなみに「全ての奇数日」ってしたいのあれば「1-31/2」って感じになるみたいです<br />　　：<br /><br />月初にコマンドを実行したい時っていうか月初は 1 日に決まってるんでその辺は簡単だってことで…じゃぁ月末にコマンドを実行したい時はどうしたらいいんでしょうか<br />カレンダーをざっと眺めて 12 ヶ月分の設定を用意しとけば…って「あーでも 2 月の月末は 28 日だけじゃなくてうるう年とかどうしよう！！」ってなるんでもうちょっと手の込んだ設定でどうにかしてみましょう<br />この場合っていうか cron の設定だけでは毎月の月末を判定することはできません　なので<b class="decorationB">コマンド側</b>でその辺をどうにか対処してみます<br /><br /><span class="decorationC" style="color:green;">* * 28-31 * * /usr/bin/test $(/bin/date -d &apos;+1 day&apos; +%d) -eq 1 && コマンド</span><br />いきなりややこしい感じになって申し訳ないかんじで（汗<br />これは月末としてなり得る 28 日 から 31 日にかけて <span class="decorationC" style="color:green;">/bin/date</span> に「翌日」を出力させた後に <span class="decorationC" style="color:green;">/usr/bin/test</span> でそれが「月初」を意味する「1」であるかを判定して「1」であれば <span class="decorationC" style="color:green;">&&</span> でくっつけたコマンドを実行するって意味になります<br /><br />cron 内での使用に限った話じゃないけど…この <span class="decorationC" style="color:green;">&&</span> でコマンドを並べると「直前のコマンドが正常終了した場合に次のコマンドを実行」って動作をします　例えば Web サイトの証明書の更新コマンドを実行して…それが成功して更新コマンドが正常終了した時のみ Web サーバを再起動するなんて処理を 1 行にまとめて書けるんで便利だと思います<br /><br />　　：<br /><br />そんな感じの複雑な判定を求められるスケジュール設定っていうか…少し特別動作をする「曜日」の設定についての注意事項を少々<br />例えば「13 日の金曜日の 0 時 0 分にコマンドを実行」なんてありがちなスケジュール設定をしたいと思いました<br /><span class="decorationC" style="color:green;">0 0 13 * fri コマンド</span><br />これでバッチリだぜ！！(&gt;_&lt;)ｗって思いたい所ですが…これでは思った動作をしません<br />これだと「毎月の 13 日」と「毎月の金曜日」の両方でコマンドが実行されてしまします<br /><br />何となくこれまで見てきた cron の動作的に「設定した項目の全てに合致した AND 的な動作」を期待しがちなんだけど…「日の設定」と「曜日の設定」に関しては「どちらか一方でも合致したら動く OR 的な動作」になってしまうようです　※ただし「*」での設定は除く<br /><br /><span class="decorationC" style="color:green;">0 0 13 * * /usr/bin/test $(/bin/date +\%w) -eq 5 && コマンド</span><br /><span class="decorationC" style="color:green;">0 0 * * fri /usr/bin/test $(/bin/date +\%d) -eq 13 && コマンド</span><br />そんな 13 日の金曜日を判定するには上記のように設定します<br />※ 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun<br /><br />前者は<b class="decorationB">毎月の 13 日</b>に <span class="decorationC" style="color:green;">/bin/date</span> を使って曜日を出力させてそれが<b class="decorationB">金曜日かどうか</b>を判定する手法<br />後者は<b class="decorationB">毎月の金曜日</b>に <span class="decorationC" style="color:green;">/bin/date</span> を使って日付を出力させてそれが<b class="decorationB"> 13 日かどうか</b>を判定する手法です<br />後者の手法は「毎月の金曜日」って感じで月に 4〜5 回ほど動作することになって無駄が多いんで…この場合は前者の「毎月の 13 日」って設定の方が好ましいと思います<br /><br />　　：<br /><br />あと cron の設定でミスりやすい点と云うかコマンドや入出力に使用するファイルへのパスですかね<br />コマンドというかスクリプトを作ってる時にありがちなんだけど…どこかのフォルダをカレントディレクトリに設定してスクリプトをテストしていて「できた！さぁ cron に設定しよう！」ってしたら思った動作をしない時があるんですよね<br />これは cron が実行するカレントディレクトリが往々にしてテストしていたフォルダと違う事により指定したファイルを読めない・書けないって事が原因にあるようです<br />なので cron で実行されるコマンド（スクリプト）はフルパスで指定して…かつ読み書きするファイルなどもフルパスで設定する必要があります　うっかりしてるとやらかしがちなミスなんで注意していきタイネ！<br /><br />※なお今回紹介した <span class="decorationC" style="color:green;">/usr/bin/test</span> と <span class="decorationC" style="color:green;">/bin/date</span> のパスは我が家でのもので…環境によって違う場合があるので事前に which コマンド等で調べてから使用してください <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=%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=%63%72%6f%6e" class="taglink" title="cron">#cron</a> -- Posted by 猫山ぽるか 〔3967文字〕 No.12 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=12</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=12</guid>
	<category>info</category>
	<pubDate>Sat, 11 Dec 2021 08:07:38 +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[ Perl の GD::Simple モジュールでフォントを指… ]]></title>
	<description><![CDATA[ Perl の GD::Simple モジュールでフォントを指定したりしてみるメモ<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203182031-admin.png" alt="20211203182031-admin.png"><br />　<br />初期のインターネットっていうか Web サイト黎明期の CGI と云えば Perl でキマリ！！って時代もありましたよね…って感じすらすっかり忘れ去られたかのように近年では全く話題にもならない Perl ですが「三つ子の魂百まで」なのか何なのかあまりにも手に馴染みすぎてついつい使っちゃうって事はありませんか？　私はあります　いやむしろ未だに他の言語が使えず Perl にどっぷりなんです悪いか！！(-_-#)って事なのか何なのかそんな忘れ去られつつある言語である Perl と…その Perl で画像を扱う GD ライブラリの（主に文字フォント系の）使い方を少しばかり探求してみたかなりニッチな需要的な忘れ物防止メモです<br /><br />そんな Perl の GD ライブラリですが…以下のようにコマンド一発で簡単にインストールできます<br /><span class="decorationC" style="color:green;">sudo apt install libgd-perl</span><br />依存関係とか詳しく調べてないんでアレだけど…ちょっと見た感じでは我が家の環境にいつの間にか libgd-text-perl なんてのも入っていたんで文字フォントの扱いに不具合が発生した時には <span class="decorationC" style="color:green;">sudo apt install libgd-text-perl</span> してみるのもいいかもです（汗<br /><br />あーあと標準的な Raspberry Pi OS のセットアップではゴシック書体の日本語フォントしか入ってないっぽい？　後に説明するけど…フォント名に Sans とだけ付いてるフォントは概ねゴシック書体です　明朝書体には Serif と付くらしいんだけどラズパイにはそれが入ってないみたい？なんで…後の動作確認しやすいように明朝書体が含まれる程よいフォントを追加でインストールしておきます<br /><span class="decorationC" style="color:green;">sudo apt install fonts-ipaexfont</span><br />日本語フォントファイルってのはそれなりに容量が大きいんで…少容量 microSD とかで運用してる方などには要注意かもですがまぁその辺はうまいことどうにかしてやってください（瀧汗<br /><br />※ 追記 ※<br />Google の「No more 豆腐」と呼ばれるフォントのインストール方法<br /><span class="decorationC" style="color:green;">sudo apt install fonts-noto-cjk</span><br />中国語(C)と日本語(J)と韓国語(K)が一緒くたに入っちゃう感じっぽいです<br /><br />そんな下準備が済んだトコロで…現在システムに入ってるフォントの一覧を取得する方法です　それには <span class="decorationC" style="color:green;">fc-list</span> ってコマンドを使うんだけど…日本語に非対応なフォントとかも羅列されて心もち見づらいんでその辺を絞り込んで表示させてみましょう<br /><span class="decorationC" style="color:green;">fc-list :lang=ja | sort | uniq</span><br />sort と uniq は並べ替えてダブり行を除去してくれるんで見やすくなると思います<br />ここで表示される内容は…フォントのパス付きファイル名とフォントファミリー名とスタイルです　後に説明する GD のフォント指定で…何となくフォントのパス付きファイル名で指定してたんだけどそれではダメでデフォルトのフォントが使用され続けてて悩んでたんだけどどうやら「フォントファミリー名：スタイル」で指定するといいって事を突き止めたんで<br /><span class="decorationC" style="color:green;">fc-list -f &apos;%{family}:%{style}\n&apos; :lang=ja | sort | uniq</span><br />このようなオプション指定で実行するといいと思います<br /><br />実行すると（環境によって違うと思うけど）こんな感じの一覧が出ます<br />Droid Sans Fallback:Regular<br />IPAexゴシック,IPAexGothic:Regular<br /><span class="decorationC" style="color:red;">IPAex明朝,IPAexMincho:Regular</span><br />Noto Sans CJK JP,Noto Sans CJK JP Black:Black,Regular<br />Noto Sans CJK JP,Noto Sans CJK JP Bold:Bold,Regular<br />Noto Sans CJK JP,Noto Sans CJK JP DemiLight:DemiLight,Regular<br />Noto Sans CJK JP,Noto Sans CJK JP Light:Light,Regular<br />Noto Sans CJK JP,Noto Sans CJK JP Medium:Medium,Regular<br />Noto Sans CJK JP,Noto Sans CJK JP Regular:Regular<br />Noto Sans CJK JP,Noto Sans CJK JP Thin:Thin,Regular<br />Noto Sans CJK KR,Noto Sans CJK KR Black:Black,Regular<br />---- 中略 ----<br />この中から使いたいフォントの行をコピーして後の GD のフォント指定に使用するといい感じに使えるようです　そして今後は「<span class="decorationC" style="color:red;">IPAex明朝,IPAexMincho:Regular</span>」を使って話を進めていきます<br /><br />それでは早速その辺を使ったサンプルを作ってみますかね<br /><br />----------<br /><br /><span class="decorationC" style="color:darkgray;">&#35;!/usr/bin/perl</span><br /><span class="decorationC" style="color:cornflowerblue;">use</span> GD<span class="decorationC" style="color:firebrick;">::</span>Simple;<br /><br /><span class="decorationC" style="color:orange;">$img_obj</span> <span class="decorationC" style="color:firebrick;">=</span> GD<span class="decorationC" style="color:firebrick;">::</span>Simple<span class="decorationC" style="color:firebrick;">-&gt;</span><span class="decorationC" style="color:mediumblue;">new</span>(500, 500);<br /><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>font(<span class="decorationC" style="color:deepskyblue;">&apos;IPAex明朝,IPAexMincho:Regular&apos;</span>); <span class="decorationC" style="color:darkgray;">&#35; フォント</span><br /><span class="decorationC" style="color:darkgray;">&#35;$img_obj-&gt;font(&apos;/usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf&apos;); &#35; このフォント指定じゃダメみたい</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>fgcolor(<span class="decorationC" style="color:deepskyblue;">&apos;red&apos;</span>); <span class="decorationC" style="color:darkgray;">&#35; 文字色</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>fontsize(30); <span class="decorationC" style="color:darkgray;">&#35; フォントサイズ</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>moveTo(20, 100); <span class="decorationC" style="color:darkgray;">&#35; 始点 x, y</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>string(&quot;<span class="decorationC" style="color:deepskyblue;">日本語フォント表示</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">Raspberry Pi</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">1234567890</span>&quot;); <span class="decorationC" style="color:darkgray;">&#35; 文字列（最後に記述）</span><br /><br /><span class="decorationC" style="color:darkgray;">&#35; ファイルへ出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;open(IMG, &quot;&gt; gd_out1.gif&quot;); &#35; GIF で出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;open(IMG, &quot;&gt; gd_out1.jpg&quot;); &#35; JPEG で出力</span><br /><span class="decorationC" style="color:mediumblue;">open</span>(IMG, <span class="decorationC" style="color:deepskyblue;">&quot;&gt; gd_out1.png&quot;</span>); <span class="decorationC" style="color:darkgray;">&#35; PNG で出力</span><br /><span class="decorationC" style="color:mediumblue;">binmode</span> IMG; <span class="decorationC" style="color:darkgray;">&#35; バイナリ・ストリームへ書き込む</span><br /><span class="decorationC" style="color:darkgray;">&#35;print IMG $img_obj-&gt;gif(); &#35; GIF で出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;print IMG $img_obj-&gt;jpeg(100); &#35; JPEG (品質：0〜100) で出力</span><br /><span class="decorationC" style="color:mediumblue;">print</span> IMG <span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>png(); <span class="decorationC" style="color:darkgray;">&#35; PNG で出力</span><br /><span class="decorationC" style="color:mediumblue;">close</span>(IMG);<br /><br />----------<br /><br />実行すると以下のような感じの画像が生成されると思います<br /><img class="embeddedimage " width="500" height="500" src="https://room.dengeki.jp/images/20211120103516-admin.png" alt="20211120103516-admin.png"><br />今回は PNG で保存してみましたが GIF や JPEG でも保存できます　「ファイルへ出力」の辺りのコメントアウトしてある部分で切り替えられるんで試してみてください<br /><br />　　：<br /><br />そんな Perl で画像を生成するって話だと…既存の画像を読み込んで文字とかを描き込んで使いたい場合があると思います　そんな時には以下のように指定します<br /><a class="url urlimage selflink" href="https://yqn.f5.si/pic/gd_test2.gif"><img src="https://yqn.f5.si/pic/gd_test2.gif" class="embeddedimage" alt="gd_test2.gif"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/gd_test2.jpg"><img src="https://yqn.f5.si/pic/gd_test2.jpg" class="embeddedimage" alt="gd_test2.jpg"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/gd_test2.png"><img src="https://yqn.f5.si/pic/gd_test2.png" class="embeddedimage" alt="gd_test2.png"></a><br />&#91;サンプル画像&#93;<br /><br />----------<br /><br /><span class="decorationC" style="color:darkgray;">&#35;!/usr/bin/perl</span><br /><span class="decorationC" style="color:cornflowerblue;">use</span> GD<span class="decorationC" style="color:firebrick;">::</span>Simple;<br /><br /><span class="decorationC" style="color:darkgray;">&#35;$img_obj = GD::Simple-&gt;newFromGif(&quot;./gd_test2.gif&quot;); # GIF 画像の時</span><br /><span class="decorationC" style="color:darkgray;">&#35;$img_obj = GD::Simple-&gt;newFromJpeg(&quot;./gd_test2.jpg&quot;, 1); # JPEG 画像の時　最後の「1」は True Color のフラグ？（未解明）</span><br /><span class="decorationC" style="color:orange;">$img_obj</span> <span class="decorationC" style="color:firebrick;">=</span> GD<span class="decorationC" style="color:firebrick;">::</span>Simple<span class="decorationC" style="color:firebrick;">-&gt;</span>newFromPng(<span class="decorationC" style="color:deepskyblue;">&quot;./gd_test2.png&quot;</span>, 1); <span class="decorationC" style="color:darkgray;">&#35; PNG 画像の時　最後の「1」は True Color のフラグ？（未解明）</span><br /><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>font(<span class="decorationC" style="color:deepskyblue;">&apos;IPAex明朝,IPAexMincho:Regular&apos;</span>); <span class="decorationC" style="color:darkgray;">&#35; フォント</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>fgcolor(<span class="decorationC" style="color:deepskyblue;">&apos;red&apos;</span>); <span class="decorationC" style="color:darkgray;">&#35; 文字色</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>fontsize(30); <span class="decorationC" style="color:darkgray;">&#35; フォントサイズ</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>moveTo(20, 100); <span class="decorationC" style="color:darkgray;">&#35; 始点 x, y</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>string(&quot;<span class="decorationC" style="color:deepskyblue;">日本語フォント表示</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">Raspberry Pi</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">1234567890</span>&quot;); <span class="decorationC" style="color:darkgray;">&#35; 文字列（最後に記述）</span><br /><br /><span class="decorationC" style="color:darkgray;">&#35; ファイルへ出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;open(IMG, &quot;&gt; gd_out1.gif&quot;); &#35; GIF で出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;open(IMG, &quot;&gt; gd_out1.jpg&quot;); &#35; JPEG で出力</span><br /><span class="decorationC" style="color:mediumblue;">open</span>(IMG, <span class="decorationC" style="color:deepskyblue;">&quot;&gt; gd_out1.png&quot;</span>); <span class="decorationC" style="color:darkgray;">&#35; PNG で出力</span><br /><span class="decorationC" style="color:mediumblue;">binmode</span> IMG; <span class="decorationC" style="color:darkgray;">&#35; バイナリ・ストリームへ書き込む</span><br /><span class="decorationC" style="color:darkgray;">&#35;print IMG $img_obj-&gt;gif(); &#35; GIF で出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;print IMG $img_obj-&gt;jpeg(100); &#35; JPEG (品質：0〜100) で出力</span><br /><span class="decorationC" style="color:mediumblue;">print</span> IMG <span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>png(); <span class="decorationC" style="color:darkgray;">&#35; PNG で出力</span><br /><span class="decorationC" style="color:mediumblue;">close</span>(IMG);<br /><br />----------<br /><br />実行すると以下のように読み込んだ画像の上に文字を描き込んだ画像が出力されます<br /><img class="embeddedimage " width="500" height="689" src="https://room.dengeki.jp/images/202111201035162-admin.png" alt="202111201035162-admin.png"><br />ちゃんと文字が描き込まれていますね　なお色数の多い JPEG と PNG は True Color フラグとなる「1」を指定しておかないと色が正しく再現されないような感じでした<br /><br />　　：<br /><br />お次は複数の画像を読み込んで 1 枚の画像に合成するってのをやってみます<br /><a class="url urlimage selflink" href="https://yqn.f5.si/pic/gd_test2.gif"><img src="https://yqn.f5.si/pic/gd_test2.gif" class="embeddedimage" alt="gd_test2.gif"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/gd_test2.jpg"><img src="https://yqn.f5.si/pic/gd_test2.jpg" class="embeddedimage" alt="gd_test2.jpg"></a> <a class="url urlimage selflink" href="https://yqn.f5.si/pic/gd_test2.png"><img src="https://yqn.f5.si/pic/gd_test2.png" class="embeddedimage" alt="gd_test2.png"></a><br />&#91;サンプル画像&#93;<br /><br />----------<br /><br /><span class="decorationC" style="color:darkgray;">&#35;!/usr/bin/perl</span><br /><span class="decorationC" style="color:cornflowerblue;">use</span> GD<span class="decorationC" style="color:firebrick;">::</span>Simple;<br /><br /><span class="decorationC" style="color:orange;">$img_obj</span> <span class="decorationC" style="color:firebrick;">=</span> GD<span class="decorationC" style="color:firebrick;">::</span>Simple<span class="decorationC" style="color:firebrick;">-&gt;</span><span class="decorationC" style="color:mediumblue;">new</span>(500, 500, 1); <span class="decorationC" style="color:darkgray;">&#35; 最後の「1」は True Color のフラグ？（未解明）</span><br /><br /><span class="decorationC" style="color:orange;">$img_gif</span> <span class="decorationC" style="color:firebrick;">=</span> GD<span class="decorationC" style="color:firebrick;">::</span>Image<span class="decorationC" style="color:firebrick;">-&gt;</span>newFromGif(<span class="decorationC" style="color:deepskyblue;">&quot;./gd_test2.gif&quot;</span>); <span class="decorationC" style="color:darkgray;">&#35; GIF 画像の時</span><br /><span class="decorationC" style="color:orange;">$img_jpg</span> <span class="decorationC" style="color:firebrick;">=</span> GD<span class="decorationC" style="color:firebrick;">::</span>Image<span class="decorationC" style="color:firebrick;">-&gt;</span>newFromJpeg(<span class="decorationC" style="color:deepskyblue;">&quot;./gd_test2.jpg&quot;</span>, 1); <span class="decorationC" style="color:darkgray;">&#35; JPEG 画像の時　最後の「1」は True Color のフラグ？（未解明）</span><br /><span class="decorationC" style="color:orange;">$img_png</span> <span class="decorationC" style="color:firebrick;">=</span> GD<span class="decorationC" style="color:firebrick;">::</span>Image<span class="decorationC" style="color:firebrick;">-&gt;</span>newFromPng(<span class="decorationC" style="color:deepskyblue;">&quot;./gd_test2.png&quot;</span>, 1); <span class="decorationC" style="color:darkgray;">&#35; PNG 画像の時　最後の「1」は True Color のフラグ？（未解明）</span><br /><br /><span class="decorationC" style="color:darkgray;">&#35; 参考までに…読み込んだ画像の簡易な情報を表示</span><br />(<span class="decorationC" style="color:orange;">$width</span>, <span class="decorationC" style="color:orange;">$height</span>) <span class="decorationC" style="color:firebrick;">=</span> <span class="decorationC" style="color:orange;">$img_gif</span><span class="decorationC" style="color:firebrick;">-&gt;</span>getBounds();<br /><span class="decorationC" style="color:orange;">$is_truecolor</span> <span class="decorationC" style="color:firebrick;">=</span> <span class="decorationC" style="color:orange;">$img_gif</span><span class="decorationC" style="color:firebrick;">-&gt;</span>isTrueColor();<br />print <span class="decorationC" style="color:deepskyblue;">&quot;GIF:&#91;</span><span class="decorationC" style="color:orange;">$width</span><span class="decorationC" style="color:deepskyblue;">&#93;&#91;</span><span class="decorationC" style="color:orange;">$height</span><span class="decorationC" style="color:deepskyblue;">&#93;&#91;</span><span class="decorationC" style="color:orange;">$is_truecolor</span><span class="decorationC" style="color:deepskyblue;">&#93;</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />(<span class="decorationC" style="color:orange;">$width</span>, <span class="decorationC" style="color:orange;">$height</span>) <span class="decorationC" style="color:firebrick;">=</span> <span class="decorationC" style="color:orange;">$img_jpg</span><span class="decorationC" style="color:firebrick;">-&gt;</span>getBounds();<br /><span class="decorationC" style="color:orange;">$is_truecolor</span> <span class="decorationC" style="color:firebrick;">=</span> <span class="decorationC" style="color:orange;">$img_jpg</span><span class="decorationC" style="color:firebrick;">-&gt;</span>isTrueColor();<br />print <span class="decorationC" style="color:deepskyblue;">&quot;JPG:&#91;</span><span class="decorationC" style="color:orange;">$width</span><span class="decorationC" style="color:deepskyblue;">&#93;&#91;</span><span class="decorationC" style="color:orange;">$height</span><span class="decorationC" style="color:deepskyblue;">&#93;&#91;</span><span class="decorationC" style="color:orange;">$is_truecolor</span><span class="decorationC" style="color:deepskyblue;">&#93;</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />(<span class="decorationC" style="color:orange;">$width</span>, <span class="decorationC" style="color:orange;">$height</span>) <span class="decorationC" style="color:firebrick;">=</span> <span class="decorationC" style="color:orange;">$img_png</span><span class="decorationC" style="color:firebrick;">-&gt;</span>getBounds();<br /><span class="decorationC" style="color:orange;">$is_truecolor</span> <span class="decorationC" style="color:firebrick;">=</span> <span class="decorationC" style="color:orange;">$img_png</span><span class="decorationC" style="color:firebrick;">-&gt;</span>isTrueColor();<br />print <span class="decorationC" style="color:deepskyblue;">&quot;PNG:&#91;</span><span class="decorationC" style="color:orange;">$width</span><span class="decorationC" style="color:deepskyblue;">&#93;&#91;</span><span class="decorationC" style="color:orange;">$height</span><span class="decorationC" style="color:deepskyblue;">&#93;&#91;</span><span class="decorationC" style="color:orange;">$is_truecolor</span><span class="decorationC" style="color:deepskyblue;">&#93;</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br /><br /><span class="decorationC" style="color:darkgray;">&#35; コピー元オブジェクト, コピー先X座標, コピー先Y座標, コピー元X座標, コピー元Y座標, 横サイズ, 縦サイズ</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>copy(<span class="decorationC" style="color:orange;">$img_gif</span>, 0, 150, 200, 140, 200, 200); <span class="decorationC" style="color:darkgray;">&#35; GIF 画像をコピーする</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>copy(<span class="decorationC" style="color:orange;">$img_jpg</span>, 180, 280, 240, 135, 200, 200); <span class="decorationC" style="color:darkgray;">&#35; JPEG 画像をコピーする</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>copy(<span class="decorationC" style="color:orange;">$img_png</span>, 300, 100, 140, 140, 200, 200); <span class="decorationC" style="color:darkgray;">&#35; PNG 画像をコピーする</span><br /><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>font(<span class="decorationC" style="color:deepskyblue;">&apos;IPAex明朝,IPAexMincho:Regular&apos;</span>); <span class="decorationC" style="color:darkgray;">&#35; フォント</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>fgcolor(<span class="decorationC" style="color:deepskyblue;">&apos;red&apos;</span>); <span class="decorationC" style="color:darkgray;">&#35; 文字色</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>fontsize(30); <span class="decorationC" style="color:darkgray;">&#35; フォントサイズ</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>moveTo(20, 100); <span class="decorationC" style="color:darkgray;">&#35; 始点 x, y</span><br /><span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>string(&quot;<span class="decorationC" style="color:deepskyblue;">日本語フォント表示</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">Raspberry Pi</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">1234567890</span>&quot;); <span class="decorationC" style="color:darkgray;">&#35; 文字列（最後に記述）</span><br /><br /><span class="decorationC" style="color:darkgray;">&#35; ファイルへ出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;open(IMG, &quot;&gt; gd_out1.gif&quot;); &#35; GIF で出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;open(IMG, &quot;&gt; gd_out1.jpg&quot;); &#35; JPEG で出力</span><br /><span class="decorationC" style="color:mediumblue;">open</span>(IMG, <span class="decorationC" style="color:deepskyblue;">&quot;&gt; gd_out1.png&quot;</span>); <span class="decorationC" style="color:darkgray;">&#35; PNG で出力</span><br /><span class="decorationC" style="color:mediumblue;">binmode</span> IMG; <span class="decorationC" style="color:darkgray;">&#35; バイナリ・ストリームへ書き込む</span><br /><span class="decorationC" style="color:darkgray;">&#35;print IMG $img_obj-&gt;gif(); &#35; GIF で出力</span><br /><span class="decorationC" style="color:darkgray;">&#35;print IMG $img_obj-&gt;jpeg(100); &#35; JPEG (品質：0〜100) で出力</span><br /><span class="decorationC" style="color:mediumblue;">print</span> IMG <span class="decorationC" style="color:orange;">$img_obj</span><span class="decorationC" style="color:firebrick;">-&gt;</span>png(); <span class="decorationC" style="color:darkgray;">&#35; PNG で出力</span><br /><span class="decorationC" style="color:mediumblue;">close</span>(IMG);<br /><br />----------<br /><br />実行すると以下のように読み込んだ画像の指定範囲を切り抜き合成してその上に文字を描き込んだ画像が出力されます<br /><img class="embeddedimage " width="500" height="500" src="https://room.dengeki.jp/images/202111201035161-admin.png" alt="202111201035161-admin.png"><br />なお画像の copy にはパラメータを全て指定する必要があるようです　ちょっと面倒ですね(-_-；)　今回は指定範囲を切り抜くような形でコピーしたけど…サイズが不定な画像を読み込んだ際に正しく範囲指定できるように読み込んだ画像サイズを取得できる getBounds ってのも使っているので参考までに<br /><br />なお既存のファイルを読み込む際に newFromGif や newFromJpeg や newFromPng といった感じに予め画像フォーマットを知っておく必要があるようです　しかしざっと調べた感じでは GD で画像フォーマットを調べる術がないようなんで…ちょっと困りますね<br />そこで標準的に用意されている file コマンドを使って画像フォーマットを調べるサンプルを即興で用意してみました<br /><br />----------<br /><br /><span class="decorationC" style="color:darkgray;">&#35;!/usr/bin/perl</span><br /><br /><span class="decorationC" style="color:orange;">$cmd</span> = <span class="decorationC" style="color:deepskyblue;">&apos;file -b -i&apos;</span>; <span class="decorationC" style="color:darkgray;">&#35; file コマンドを使う</span><br /><span class="decorationC" style="color:orange;">$file</span> = <span class="decorationC" style="color:deepskyblue;">&apos;./gd_test2.gif&apos;</span>; <span class="decorationC" style="color:darkgray;">&#35; 画像ファイル名 &#91;GIF&#93;</span><br /><span class="decorationC" style="color:darkgray;">&#35;$file = &apos;./gd_test2.jpg&apos;; &#35; 画像ファイル名 &#91;JPEG&#93;</span><br /><span class="decorationC" style="color:darkgray;">&#35;$file = &apos;./gd_test2.png&apos;; &#35; 画像ファイル名 &#91;PNG&#93;</span><br /><br />chomp(<span class="decorationC" style="color:orange;">$res</span> = `<span class="decorationC" style="color:orange;">$cmd</span> <span class="decorationC" style="color:orange;">$file</span>`); <span class="decorationC" style="color:darkgray;">&#35; コマンドを実行して出力を取り込む</span><br />if (<span class="decorationC" style="color:orange;">$?</span>) { die <span class="decorationC" style="color:deepskyblue;">&quot;Command error:&quot;</span>; } <span class="decorationC" style="color:darkgray;">&#35; 何らかのエラーが発生</span><br />print &quot;<span class="decorationC" style="color:orange;">$res</span><span class="decorationC" style="color:olivedrab;">\n</span>&quot;; <span class="decorationC" style="color:darkgray;">&#35; コマンドを実行した出力はこんな感じ</span><br /><br />if (<span class="decorationC" style="color:orange;">$res</span> =~ <span class="decorationC" style="color:deepskyblue;">/^cannot open/</span>) { <span class="decorationC" style="color:darkgray;">&#35; file コマンドが何らかのエラーを返した</span><br />&nbsp;&nbsp;print <span class="decorationC" style="color:deepskyblue;">&quot;File error:</span> <span class="decorationC" style="color:orange;">$file</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />} elsif (<span class="decorationC" style="color:orange;">$res</span> =~ <span class="decorationC" style="color:deepskyblue;">/^image</span><span class="decorationC" style="color:olivedrab;">\/</span><span class="decorationC" style="color:deepskyblue;">gif;/</span>) { <span class="decorationC" style="color:darkgray;">&#35; GIF ファイルらしい</span><br />&nbsp;&nbsp;print &quot;[<span class="decorationC" style="color:olivedrab;">\$</span><span class="decorationC" style="color:deepskyblue;">img_obj = GD::Simple-&gt;newFromGif(</span><span class="decorationC" style="color:olivedrab;">\&quot;</span><span class="decorationC" style="color:orange;">$file</span><span class="decorationC" style="color:olivedrab;">\&quot;</span><span class="decorationC" style="color:deepskyblue;">);</span> を使う]<span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />} elsif (<span class="decorationC" style="color:orange;">$res</span> =~ <span class="decorationC" style="color:deepskyblue;">/^image</span><span class="decorationC" style="color:olivedrab;">\/</span><span class="decorationC" style="color:deepskyblue;">jpeg;/</span>) { <span class="decorationC" style="color:darkgray;">&#35; JPEG ファイルらしい</span><br />&nbsp;&nbsp;print &quot;[<span class="decorationC" style="color:olivedrab;">\$</span><span class="decorationC" style="color:deepskyblue;">img_obj = GD::Simple-&gt;newFromJpeg(</span><span class="decorationC" style="color:olivedrab;">\&quot;</span><span class="decorationC" style="color:orange;">$file</span><span class="decorationC" style="color:olivedrab;">\&quot;</span><span class="decorationC" style="color:deepskyblue;">);</span> を使う]<span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />} elsif (<span class="decorationC" style="color:orange;">$res</span> =~ <span class="decorationC" style="color:deepskyblue;">/^image</span><span class="decorationC" style="color:olivedrab;">\/</span><span class="decorationC" style="color:deepskyblue;">png;/</span>) { <span class="decorationC" style="color:darkgray;">&#35; PNG ファイルらしい</span><br />&nbsp;&nbsp;print &quot;[<span class="decorationC" style="color:olivedrab;">\$</span><span class="decorationC" style="color:deepskyblue;">img_obj = GD::Simple-&gt;newFromPng(</span><span class="decorationC" style="color:olivedrab;">\&quot;</span><span class="decorationC" style="color:orange;">$file</span><span class="decorationC" style="color:olivedrab;">\&quot;</span><span class="decorationC" style="color:deepskyblue;">);</span> を使う]<span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />} else { <span class="decorationC" style="color:darkgray;">&#35; それ以外のファイルっぽい</span><br />&nbsp;&nbsp;print <span class="decorationC" style="color:deepskyblue;">&quot;扱えないファイルです(-_-；)</span><span class="decorationC" style="color:olivedrab;">\n</span><span class="decorationC" style="color:deepskyblue;">&quot;</span>;<br />}<br /><br />----------<br /><br />file コマンドについて詳しく調べてないんでアレなんだけど…これで概ね画像フォーマットを特定できると思います　この辺ちょっと面倒ですね(-_-；)<br /><br />まぁそんなこなんで時既に情報が古すぎて調べられない GD::Simple のアレこれをまとめてみました　この GD::Simple は…その昔の N88-Disk Basic の LINE 文や CIRCLE 文とかでお絵描きしてた頃のようなシンプルな操作で作画できて懐かしく思ったりしながら愛用しています　しょーみこれを今さらわざわざ使おうって思う人も居ないかなーって思いつつ今後の参考ってことで残しておきます　長々とお疲れさまでした！ <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=%50%65%72%6c" class="taglink" title="Perl">#Perl</a> -- Posted by 猫山ぽるか 〔7610文字〕 No.9 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=9</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=9</guid>
	<category>info</category>
	<pubDate>Sat, 20 Nov 2021 10:26:41 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino Leonardo (Pro Micro) で… ]]></title>
	<description><![CDATA[ Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう！<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203181404-admin.jpeg" alt="20211203181404-admin.jpeg"><br />　<br />前回に引き続き Arduino 的な諸々をひとつって事で…マルチメディア・キーボードって云うんですかね？<br /><img class="embeddedimage " width="640" height="480" src="https://room.dengeki.jp/images/20211114113829-admin.png" alt="20211114113829-admin.png"><br />＋α的に実装されている音量調節などのキーとかノート PC でよく見かける Fn キーと併用して使える再生とか早送りなどのキーを ATmega32U4 を搭載した Arduino Leonardo (Pro Micro) でどうにかしてみるお話です<br /><br />そんな今回の実験の様子<br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202111141138293-admin.jpeg" alt="202111141138293-admin.jpeg"><br />以前のマウスクリック超連射実験の回路がくっついたままなんで判りにくいですよね…<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/202111141138291-admin.png" alt="202111141138291-admin.png"><br />申し訳程度に回路図を描いてみたけど…それでも判りづらいですよね（汗　まぁとにかく 2 番ピンと 3 番ピンを使用しました<br /><br />今回のマルチメディア・キーボード(？)的な機能を簡単に実装するためにライブラリを追加してみました<br /><img class="embeddedimage " width="1000" height="982" src="https://room.dengeki.jp/images/202111141138292-admin.jpeg" alt="202111141138292-admin.jpeg"><br />Arduino IDE で &#91;スケッチ&#93; → &#91;ライブラリをインクルード&#93; → &#91;ライブラリ管理&#93; してライブラリ管理画面を出す<br /><br /><img class="embeddedimage " width="1000" height="982" src="https://room.dengeki.jp/images/202111141138291-admin.jpeg" alt="202111141138291-admin.jpeg"><br />目的のライブラリを「hid」ってキーワードで検索して…出てきた「HID-Project」をインストールする　※画面は既にインストール済みだけどまぁそんな感じで（汗<br /><br />後は Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます<br /><br />----------<br /><br /><span class="decorationC" style="color:darkgray;">// include the HID library</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;include</span> <span class="decorationC" style="color:deepskyblue;">&quot;HID-Project.h&quot;</span> <span class="decorationC" style="color:darkgray;">// 今回インストールしたやつをインクルードする</span><br /><br /><span class="decorationC" style="color:darkgray;">// definitions for each pin used</span><br /><span class="decorationC" style="color:orange;">const int</span> pinLed = LED_BUILTIN;<br /><span class="decorationC" style="color:orange;">const int</span> playButton = <span class="decorationC" style="color:deepskyblue;">2</span>; <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br /><span class="decorationC" style="color:orange;">const int</span> fwdButton = <span class="decorationC" style="color:deepskyblue;">3</span>; <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br /><span class="decorationC" style="color:orange;">const int</span> backButton = <span class="decorationC" style="color:deepskyblue;">4</span>; <span class="decorationC" style="color:darkgray;">// 以下今回は使わない(-_-；)</span><br /><span class="decorationC" style="color:orange;">const int</span> volUpButton = <span class="decorationC" style="color:deepskyblue;">5</span>;<br /><span class="decorationC" style="color:orange;">const int</span> volDwnButton = <span class="decorationC" style="color:deepskyblue;">6</span>;<br /><span class="decorationC" style="color:orange;">const int</span> muteButton = <span class="decorationC" style="color:deepskyblue;">7</span>;<br /><br /><br /><span class="decorationC" style="color:orange;">void</span> setup() {<br />&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">// define the pin mode for each pin used</span><br />&nbsp;&nbsp;pinMode(pinLed, OUTPUT);<br />&nbsp;&nbsp;pinMode(playButton, INPUT_PULLUP); <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br />&nbsp;&nbsp;pinMode(fwdButton, INPUT_PULLUP); <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br />&nbsp;&nbsp;pinMode(backButton, INPUT_PULLUP); <span class="decorationC" style="color:darkgray;">// 以下今回は使わない(-_-；)</span><br />&nbsp;&nbsp;pinMode(volUpButton, INPUT_PULLUP);<br />&nbsp;&nbsp;pinMode(volDwnButton, INPUT_PULLUP);<br />&nbsp;&nbsp;pinMode(muteButton, INPUT_PULLUP);<br /><br />&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">// begin HID connection</span><br />&nbsp;&nbsp;Consumer.begin();<br />}<br /><br /><span class="decorationC" style="color:orange;">void</span> loop() {<br />&nbsp;&nbsp;<span class="decorationC" style="color:firebrick;">if</span> (!digitalRead(playButton)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(pinLed, HIGH); <span class="decorationC" style="color:darkgray;">// turn on LED</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Consumer.write(MEDIA_PLAY_PAUSE); <span class="decorationC" style="color:darkgray;">// 一時停止・再生的なコマンド</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">500</span>); <span class="decorationC" style="color:darkgray;">// 動作確認用の LED 点滅</span><br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(pinLed, LOW); <span class="decorationC" style="color:darkgray;">// turn off LED</span><br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span class="decorationC" style="color:firebrick;">if</span> (!digitalRead(fwdButton)) {<br />&nbsp;&nbsp;&nbsp; digitalWrite(pinLed, HIGH);<br />&nbsp;&nbsp;&nbsp;&nbsp;Consumer.write(MEDIA_NEXT); <span class="decorationC" style="color:darkgray;">// 次の曲的なコマンド</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">500</span>); <span class="decorationC" style="color:darkgray;">// 動作確認用の LED 点滅</span><br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(pinLed, LOW);<br />&nbsp;&nbsp;}<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="1920" height="1230" src="https://room.dengeki.jp/images/20211114113829-admin.jpeg" alt="20211114113829-admin.jpeg"><br />Ubuntu 20.04.3 LTS と Audacious 3.10.1 で動作チェックしたところ…「再生/一時停止」と「次の曲」の動作をタクトスイッチの押下にて実現できました　やったね！<br /><br />わりと入手しづらいイメージのマルチメディア・キーボード(？)の拡張部分を Arduino Leonardo (Pro Micro) でどうにかできる事が判明しました　後は程よいケースとスイッチを用意すれば完成なんだけど…それはまた後の話ってかんじで<br /><br />　　：<br /><br />他にも機能があるっていうか…キーコードは Arduino/libraries/HID-Project/src/HID-APIs/ConsumerAPI.h に定義されています　※ファイルの場所は環境によって異なる場合があります<br /><br />enum ConsumerKeycode : uint16_t {<br />&nbsp;&nbsp;// Some keys might only work with linux<br />&nbsp;&nbsp;CONSUMER_POWER = 0x30,<br />&nbsp;&nbsp;CONSUMER_SLEEP = 0x32,<br /><br />&nbsp;&nbsp;MEDIA_RECORD = 0xB2,<br />&nbsp;&nbsp;MEDIA_FAST_FORWARD = 0xB3,<br />&nbsp;&nbsp;MEDIA_REWIND = 0xB4,<br />&nbsp;&nbsp;<span class="decorationC" style="color:red;">MEDIA_NEXT</span> = <span class="decorationC" style="color:blue;">0xB5</span>,<br />&nbsp;&nbsp;MEDIA_PREVIOUS = 0xB6,<br />&nbsp;&nbsp;MEDIA_PREV = 0xB6, // Alias<br />&nbsp;&nbsp;MEDIA_STOP = 0xB7,<br />&nbsp;&nbsp;<span class="decorationC" style="color:red;">MEDIA_PLAY_PAUSE</span> = <span class="decorationC" style="color:blue;">0xCD</span>,<br />&nbsp;&nbsp;MEDIA_PAUSE = 0xB0,<br /><br />&nbsp;&nbsp;MEDIA_VOLUME_MUTE = 0xE2,<br />&nbsp;&nbsp;MEDIA_VOL_MUTE = 0xE2, // Alias<br />&nbsp;&nbsp;MEDIA_VOLUME_UP = 0xE9,<br />&nbsp;&nbsp;MEDIA_VOL_UP = 0xE9, // Alias<br />&nbsp;&nbsp;MEDIA_VOLUME_DOWN = 0xEA,<br />&nbsp;&nbsp;MEDIA_VOL_DOWN = 0xEA, // Alias<br /><br />&nbsp;&nbsp;CONSUMER_BRIGHTNESS_UP = 0x006F,<br />&nbsp;&nbsp;CONSUMER_BRIGHTNESS_DOWN = 0x0070,<br /><br />&nbsp;&nbsp;CONSUMER_SCREENSAVER = 0x19e,<br /><br />&nbsp;&nbsp;CONSUMER_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182,<br />&nbsp;&nbsp;CONSUMER_CONTROL_CONFIGURATION = 0x183,<br />&nbsp;&nbsp;CONSUMER_EMAIL_READER = 0x18A,<br />&nbsp;&nbsp;CONSUMER_CALCULATOR = 0x192,<br />&nbsp;&nbsp;CONSUMER_EXPLORER = 0x194,<br /><br />&nbsp;&nbsp;CONSUMER_BROWSER_HOME = 0x223,<br />&nbsp;&nbsp;CONSUMER_BROWSER_BACK = 0x224,<br />&nbsp;&nbsp;CONSUMER_BROWSER_FORWARD = 0x225,<br />&nbsp;&nbsp;<span class="decorationC" style="color:green;">CONSUMER_BROWSER_REFRESH</span> = <span class="decorationC" style="color:blue;">0x227</span>,<br />&nbsp;&nbsp;CONSUMER_BROWSER_BOOKMARKS = 0x22A,<br /><br />今回使った <span class="decorationC" style="color:red;">MEDIA_PLAY_PAUSE</span> と <span class="decorationC" style="color:red;">MEDIA_NEXT</span> の他にもいろいろあります　例えば <span class="decorationC" style="color:green;">CONSUMER_BROWSER_REFRESH</span> を超連打して…いわゆる F5 アタックを実装するのもいいかもしれません　※やめて！(&gt;_&lt;)ｑ<br /><br />　　：<br /><br />まぁざっくりこんな感じですかね　これを用いてちょっと便利な補助キーボードを作れるとイイナ！ <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> -- Posted by 猫山ぽるか 〔3322文字〕 No.8 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=8</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=8</guid>
	<category>info</category>
	<pubDate>Sun, 14 Nov 2021 11:38:29 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino Leonardo (Pro Micro) で… ]]></title>
	<description><![CDATA[ Arduino Leonardo (Pro Micro) でマウスクリック連射装置を作ろう！<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203180938-admin.jpg" alt="20211203180938-admin.jpg"><br />　<br />ワンボードマイコンっていうか…ここんとこ Arduino が人気沸騰で気になりますよね！って事なんでモノは試しに安っすい <a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B086GPX434" rel="noopener noreferrer" target="_blank">VKLSVAN Pro Micro USB ATmega32U4</a> を買ってぼちぼちイジってみることにしました<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.jp/images/202111130723461-admin.jpeg" alt="202111130723461-admin.jpeg"><br />まぁなんか Arduino にもいろいろあるようで…その中で ATmega32U4 を搭載した Arduino Leonardo と呼ばれるものが HID 機能を搭載しているって事で気になっていました　そんな Arduino Leonardo の互換機が今回購入した Pro Micro って感じです<br />その HID 機能とはなんぞや？って話ですがまぁざっくり PC の標準的なキーボードやマウスを指すようです　要するに USB 接続した Arduino Leonardo (Pro Micro) がキーボードやマウスに化けるって事なんですね<br />そこで今回は連打系ブラウザゲーとして名高い <a class="url labeledlink" href="https://natto0wtr.web.fc2.com/CookieClicker/" rel="noopener noreferrer" target="_blank">CookieClicker</a> を超連射できるボタンを実装してみることにしました<br /><br /><img class="embeddedimage " width="1000" height="957" src="https://room.dengeki.jp/images/20211113072346-admin.jpg" alt="20211113072346-admin.jpg"><br />そんな Pro Micro のピン配列図　なんかいろいろ書いてあるけど…単純な On/Off スイッチを付ける場合は <span class="decorationM" style="background-color:teal;">　<span class="decorationC" style="color:white;">Arduino</span>　</span> と色付けされた 0 から 20 までのピンを使うようです<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/20211113072346-admin.png" alt="20211113072346-admin.png"><br />それを今回はこんな感じで 10 番ピンに配線しました<br />そしてお次はそれを制御するプログラムで…<br /><br />----------<br /><br /><span class="decorationC" style="color:cornflowerblue;">&#35;define RX_LED 17</span> <span class="decorationC" style="color:darkgray;">// RX LED はポート 17 っぽい？</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;define TX_LED 30</span> <span class="decorationC" style="color:darkgray;">// TX LED はポート 30 っぽい？</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;define SW 10</span> <span class="decorationC" style="color:darkgray;">// スイッチ用</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;include</span> <span class="decorationC" style="color:deepskyblue;">&lt;Mouse.h&gt;</span> <span class="decorationC" style="color:darkgray;">// マウス機能を使いたい</span><br /><br /><span class="decorationC" style="color:orange;">void</span> setup() {<br />&nbsp;&nbsp;pinMode(SW, INPUT_PULLUP);<br />&nbsp;&nbsp;Mouse.begin();<br />}<br /><br /><span class="decorationC" style="color:orange;">void</span> loop() {<br />&nbsp;&nbsp;<span class="decorationC" style="color:firebrick;">if</span>(!digitalRead(SW)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(TX_LED, LOW); <span class="decorationC" style="color:darkgray;">// TX LED を点灯</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//Mouse.click();</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//delay(100);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Mouse.press(MOUSE_LEFT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//delay(17); // 最速</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">20</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;Mouse.release(MOUSE_LEFT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//delay(9); // 最速</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">10</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(TX_LED, HIGH); <span class="decorationC" style="color:darkgray;">// TX LED 消灯</span><br />&nbsp;&nbsp;} <span class="decorationC" style="color:firebrick;">else</span> {<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(RX_LED, LOW); <span class="decorationC" style="color:darkgray;">// RX LED を点灯</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">40</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(RX_LED, HIGH); <span class="decorationC" style="color:darkgray;">// RX LED 消灯</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">20</span>);<br />&nbsp;&nbsp;}<br />}<br /><br />----------<br /><br />Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます　書き込まれた後に直ちに動作を開始します<br />スイッチが Off の時には基板上の LED が細かく点滅しています　スイッチを On にするとマウスクリックの連射が始まります<br /><br />マウスのクリックには Mouse.click(); って関数と Mouse.press(); Mouse.release(); とを選べるようです<br />Mouse.click(); は…いい感じに「押して離す」をまとめて実行できるようです<br />Mouse.press(); は…ドラッグ操作っていうんですかね　この関数を実行するとマウスボタンが押されたままになり Mouse.release(); を実行するとマウスボタンが離されます<br /><br />どちらの関数をどのようなタイミングで繰り返すかは個々の環境によって違うかと思いますが…<br /><img class="embeddedimage " width="1288" height="997" src="https://room.dengeki.jp/images/20211113072346-admin.jpeg" alt="20211113072346-admin.jpeg"><br />我が家の環境では Mouse.press(); Mouse.release(); を使って 1 秒間に 38 連射を記録しました → <a class="url labeledlink" href="https://www.usamimi.info/~geko/arch_pro/0x002_js/05_mouse/" rel="noopener noreferrer" target="_blank">マウスクリック連射速度テスト</a><br />高橋名人もびっくりな超高速連射を実装できて満足しました！<br /><br />Arduino Leonardo (Pro Micro) の HID 機能は手軽に有用な機能を実装できてなかなか楽しいです　またぼちぼちイジっていきたいと思いました <a href="https://room.dengeki.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> -- Posted by 猫山ぽるか 〔1926文字〕 No.7 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=7</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=7</guid>
	<category>info</category>
	<pubDate>Sat, 13 Nov 2021 07:23:46 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3 ]]></title>
	<description><![CDATA[ ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203180402-admin.png" alt="20211203180402-admin.png"><br />　<br />・ラズパイとファイルのやり取りしたい<br />・ラズパイのアプリを PC 上で実行する？<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">ラズパイとファイルのやりとりしたい</b> <b class="decorationB">-----</b><br /><br />ファイル共有に samba サーバを建てるほどじゃないんだけど… PC とちょっとしたファイルのやりとりをしたい！って場面はちょくちょくあると思います　そんな時は scp コマンドを使うと良いみたいです<br /><br />使い方<br /><span class="decorationC" style="color:green;">scp &#91;オプション&#93; コピー元 コピー先</span><br /><br />オプションはいろいろあるけど…よく使うものを勝手に抜粋（汗<br /><span class="decorationC" style="color:green;">-p</span>　元のファイルの変更時間とアクセス時間およびモードを維持します<br /><span class="decorationC" style="color:green;">-r</span>　ディレクトリ全体を再帰的にコピーします<br /><br />PC からラズパイにファイルを送信する　その１<br /><span class="decorationC" style="color:green;">scp ./dir/filename.ext pi@hostname:</span><br />PC 上の ./dir/filename.ext ってファイルをラズパイにコピーする　この場合…ユーザ pi のホームフォルダ (/home/pi) に filename.ext がコピーされる<br /><br />ラズパイから PC にファイルを受信する　その１<br /><span class="decorationC" style="color:green;">scp pi@hostname:/var/www.html/index.html ./</span><br />ラズパイ上の /var/www.html/index.html が PC 上のカレントフォルダに index.html としてコピーされる<br /><br />PC からラズパイにフォルダを送信する　その２<br /><span class="decorationC" style="color:green;">scp -pr ./pic pi@hostname:</span><br />PC 上の ./pic ってフォルダとその中身の全てをファイル更新日時・モードを保持したままラズパイにコピーする　この場合…ユーザ pi のホームフォルダ (/home/pi) に pic フォルダを作成してコピーする<br /><br />ラズパイから PC にフォルダを受信する　その２<br /><span class="decorationC" style="color:green;">scp -pr pi@hostname:/etc/apache2 ./</span><br />ラズパイ上の /etc/apache2 ってフォルダとその中身の全てをファイル更新日時・モードを保持したまま PC に apache2 フォルダを作成してコピーする<br />※ ただし /etc/apache2 はユーザ pi で読めるけど…逆に書き込もうとすると root 権限が無いんで失敗しますが<br /><br />hostname は IP アドレスでも OK です　ファイル名にはワイルドカードも使えるようです<br /><br />2018 年 4 月頃のアップデートで Windows 10 に OpenSSH ってのが導入されているらしく…その時に scp コマンドが入ったようです<br /><img class="embeddedimage " width="800" height="636" src="https://room.dengeki.jp/images/20211024175230-admin.png" alt="20211024175230-admin.png"><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/202110241752301-admin.png" alt="202110241752301-admin.png"><br />試しに使ってみたところちゃんとコピーできたようです<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">ラズパイのアプリを PC 上で実行する？</b> <b class="decorationB">-----</b><br /><br />ラズパイ上で動くアプリケーションの画面を PC 上に持ってくることができるようです<br /><br />使い方<br /><span class="decorationC" style="color:green;">ssh &#91;オプション&#93; pi@hostname</span><br /><br />オプションはいろいろあるけど…よく使うものを勝手に抜粋（汗<br /><span class="decorationC" style="color:green;">-Y</span>　信頼できるX11転送を有効にします<br /><span class="decorationC" style="color:green;">-C</span>　データ転送を圧縮します<br /><br />普通に SSH による接続なんですが…ファイルマネージャ (pcmanfm) とかのグラフィカルなアプリケーションの実行画面を PC 上で再現できるようになるようです<br />SSH でログインした後にコマンドラインに実行したいアプリケーションのコマンドを打ち込み実行します<br /><span class="decorationC" style="color:green;">pcmanfm</span> ：ファイルマネージャ<br /><span class="decorationC" style="color:green;">lxtask</span> ：タスクマネージャ<br /><span class="decorationC" style="color:green;">lxterminal</span> ：LXTerminal<br />例えば上記のようなコマンドです<br /><br /><img class="embeddedimage " width="1600" height="1200" src="https://room.dengeki.jp/images/20211024175159-admin.png" alt="20211024175159-admin.png"><br />Ubuntu MATE 上に再現されたラズパイのアプリケーション画面　心もち再現しきれてないものもあるけどご愛嬌かな<br />ファイルマネージャからイメージビューワなんかを起動するとその画面も PC 上に出てきます<br />ただしログインしたユーザ権限で動作できるアプリケーションに限るようです<br />macOS 系ではできたって話を聞いたことがあります　Windows 系ではできないかも知れません（汗<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=%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><br /><small class="decorationS"><br />　　●<span class="decorationM" style="background-color:lightpink;"><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:lightcyan;"><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 猫山ぽるか 〔2042文字〕 No.6 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=6</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=6</guid>
	<category>info</category>
	<pubDate>Sun, 24 Oct 2021 16:41:43 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2 ]]></title>
	<description><![CDATA[ ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203175809-admin.png" alt="20211203175809-admin.png"><br />　<br />・テキストエディタ nano の超基本の使い方<br />・ユーザを切り替えて root で作業したい<br />・ラズパイは sudo した時にパスワードを聞かれないのは何故？<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">テキストエディタ nano の超基本の使い方</b> <b class="decorationB">-----</b><br /><br />端末上(LX Terminal等)でテキストファイルを編集するには vi か nano を使うことになるんだけど… vi は操作感が少々特殊でとっつきにくいんでその辺が判りやすい nano を使うことが多いのかな？って事でその nano を初めて使う方向けの超基本の使い方の解説です<br /><br />コマンド名は <span class="decorationC" style="color:green;">nano</span> です　管理者権限で使いたい時は <span class="decorationC" style="color:green;">sudo nano</span> って感じで使います<br /><span class="decorationC" style="color:green;">nano</span> もしくは <span class="decorationC" style="color:green;">sudo nano</span> とコマンド名のみで起動すると「新規ファイル」の編集として起動します　<span class="decorationC" style="color:green;">nano 「ファイル名」</span> とファイル名を付けて起動すると「ファイル名のファイル」を編集します<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110181533153-admin.png" alt="202110181533153-admin.png"><br /><span class="decorationC" style="color:green;">nano</span> とだけ打ち込み起動した状態<br />よく使う（と思われる）コマンドが下部に記載されています<br />この中の 「<span class="decorationM" style="background-color:white;">^G</span> ヘルプ」 とか 「<span class="decorationM" style="background-color:white;">^X</span> 終了」 の「^」意味は以下のようになっています<br /><br /><small class="decorationS">ショートカットキーの記法は以下の通りです。<span class="decorationC" style="color:red;">(^)</span>で表記されているショートカットは<span class="decorationC" style="color:red;">Ctrlキー</span>を押すか、<span class="decorationC" style="color:red;">Escキーを二回続けて押す</span>ことを表してします。<span class="decorationC" style="color:green;">(M-)</span>で表記されているショートカットは<span class="decorationC" style="color:green;">Altキー</span>、<span class="decorationC" style="color:green;">Cmdキー</span>、<span class="decorationC" style="color:green;">Escキー</span>などのメタキーを押して入力します。<br />&nbsp;また、Escキーを二回押した後に000から255までの十進数を入力することで、コードに対応する文字を入力することができます。以下のキーストロークは主なエディタのウィンドウで使用できます。代替のキーストロークは括弧で囲って表記されます。</small><br /><br />試しに <span class="decorationC" style="color:red;">Ctrl</span> キーを押しながら <span class="decorationC" style="color:red;">G</span> キーを押してみましょう<br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110181533152-admin.png" alt="202110181533152-admin.png"><br />nano のヘルプが表示されました<br />長くて表示しきれてないんでキーボードの ↑ キーと ↓ キーを使ってスクロールさせます<br />ヘルプの終了は <span class="decorationC" style="color:red;">Ctrl</span> キーを押しながら <span class="decorationC" style="color:red;">X</span> キーを押します<br />いっぱいコマンドがあって覚えきれなさそうだけど…実際には「ちょっと編集を」って感じなんで数個のコマンドを使うだけになると思います<br /><br />そんなよく使うコマンド例<br /><br /><span class="decorationC" style="color:red;">Ctrl</span> + <span class="decorationC" style="color:red;">X</span> ：nano の終了　ファイルに変更がなければそのまま終了します　変更があれば保存するか破棄するか聞いてきます<br /><span class="decorationC" style="color:red;">Ctrl</span> + <span class="decorationC" style="color:red;">O</span> ：ファイルの書き込み　新規ファイルとして編集していればファイル名を聞いてきます　既存ファイルを編集していればそのファイル名が表示されそこに保存します<br /><span class="decorationC" style="color:red;">Ctrl</span> + <span class="decorationC" style="color:red;">S</span> ：ファイルを確認なしで保存する　慣れてくるとこれをよく使います<br /><span class="decorationC" style="color:red;">Ctrl</span> + <span class="decorationC" style="color:red;">W</span> ：文字列の検索　指定した文字列が見つかればカーソルがその文字列の場所に移動する　さらに次の文字列を探す場合には <span class="decorationC" style="color:green;">Alt</span> + <span class="decorationC" style="color:green;">W</span> もしくは <span class="decorationC" style="color:green;">Alt</span> + <span class="decorationC" style="color:green;">↓</span> で…逆向きに探す場合には <span class="decorationC" style="color:green;">Alt</span> + <span class="decorationC" style="color:green;">Q</span> もしくは <span class="decorationC" style="color:green;">Alt</span> + <span class="decorationC" style="color:green;">↑</span> と操作します<br /><span class="decorationC" style="color:red;">Ctrl</span> + <span class="decorationC" style="color:red;">&#47;</span> ：文字列の置換　探す文字列を指定した後に置き換える文字列を指定します　見つかった時に「１箇所置換」するか「全部を置換」するかを聞いてきます<br /><span class="decorationC" style="color:green;">Alt</span> + <span class="decorationC" style="color:green;">&#35;</span> ：コメント行の切り替え　カーソルがいる行の先頭に <span class="decorationC" style="color:lightseagreen;">&#35;</span> を付ける/付けないを繰り返す　わりと便利なんでよく使う<br /><br />だいたいこんなもんですかね　しょーみもっと込み入った編集をしたい時には GUI で操作できる <span class="decorationC" style="color:green;">mousepad</span> とかを使ったほうが判りやすくて便利だと思います　ただ <span class="decorationC" style="color:green;">nano</span> は諸々の設定作業なんかで「使わない訳にはいかない」テキスト・エディタなんで最低限の操作は覚えておきたいものです<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">ユーザを切り替えて root で作業したい</b> <b class="decorationB">-----</b><br /><br />サーバの設定をしてる時とかに…いちいち sudo + コマンド ってやるんがめんどくさい！！(-_-&#35;)って時に感情に任せて root にチェンジして作業したいと思ったことはありませんか？　私はたまにあります…って事なんでその辺の話を少々<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/202110181533155-admin.png" alt="202110181533155-admin.png"><br />通常はユーザ pi で作業してるんだけどこれをユーザ切り替えの su コマンドを使って管理者 root になろうとするんだけど…認証失敗して root になれません　これは root にパスワードが設定されてないんで「パスワードによる認証ができない」ってのが原因のようです<br /><br />まぁこれを解決するには root にパスワードを設定すればいいんだけど…世間的にはセキュリティ云々の事情で root にパスワードを設定すべきではないって事なんでちょっと躊躇しちゃいますね　※ root にパスワードを設定すると SSH などで root ログインできるようになるんで好ましくないらしいのです<br /><br />しかしこれが実機の前に居るのであれば別の方法でどうにかできます　LXTerminal を sudo で起動してみましょう<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/202110181533154-admin.png" alt="202110181533154-admin.png"><br /><span class="decorationC" style="color:green;">sudo x-terminal-emulator</span><br />無事(？)に root に切り替えることができました<br />でもまぁ何でもできる管理者 root なんで…くれぐれも慎重な操作をお願いします（汗<br /><br />※ 追記 ※<br />別のシェルでログインを試みるって手法をもっと試してみるっていうか…なんか su コマンドにシェルを指定するオプションがあるのに気づいたんでそっちも試してみることにします<br /><span class="decorationC" style="color:green;">sudo su -s /bin/bash root</span><br />これで root に切り替えることができました　こっちのほうがスマートな操作って感じなのかな<br /><br />ちなみにオプション指定の違いがあるっていうか…<br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/20211205041659-admin.png" alt="20211205041659-admin.png"><br /><span class="decorationC" style="color:green;">sudo su -s /bin/bash root</span><br /><span class="decorationC" style="color:green;">sudo su -s /bin/bash <span class="decorationC" style="color:red;">-</span> root</span><br />「-」オプションを付けない時はコマンドを実行したユーザのホームディレクトリ・環境変数が引き継がれて<br />「-」オプションを付た時は指定したユーザのホームディレクトリ・環境変数に設定されるようです<br /><br />※ さらに追記 ※<br />もうちょっとシンプルにっていうか <span class="decorationC" style="color:green;">sudo -i</span> や <span class="decorationC" style="color:green;">sudo su</span> や <span class="decorationC" style="color:green;">sudo su -</span> でもいいみたい<br />この場合もそれぞれ環境変数の引き継ぎに違いがあったりするようです　使いやすい手法を覚えておきタイネ！<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">ラズパイは sudo した時にパスワードを聞かれないのは何故？</b> <b class="decorationB">-----</b><br /><br />Ubuntu などを使っている時に sudo すると…<br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110181533151-admin.png" alt="202110181533151-admin.png"><br />パスワードを聞かれます<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/20211018153315-admin.png" alt="20211018153315-admin.png"><br />でも Raspberry Pi OS の sudo だとパスワードを聞かれません　これは何故なんでしょう？<br /><br />まぁ sudo がそう云う設定になってるんですけどね…って事でその設定を見てみましょう　sudo の設定内容は <span class="decorationC" style="color:green;">sudo cat /etc/sudoers</span> で確認することができます<br />その中に %sudo ALL=(ALL:ALL) ALL なんて行があります　これはグループ sudo に属する全てのユーザが全てのコマンドを実行できるって定義らしいです<br /><br />それではグループ sudo に誰が属しているのか見てみましょう　これは <span class="decorationC" style="color:green;">sudo getent group sudo</span> で確認できます　おそらく sudo:x:27:pi ってなってると思うんだけど…まぁグループ sudo にユーザ pi が含まれているのが判ります　この設定によりユーザ pi が sudo した時に全てのコマンドが使えるって事になるらしいです<br /><br />ちなみに /etc/sudoers は極めて重要なファイルなんで直接編集しないほうがいいらしいです　これを編集するには専用コマンドの <span class="decorationC" style="color:green;">sudo visudo</span> を使います　なんでも書き込んだ内容に間違いがないか構文チェックして正しければ書き込むって感じになってるらしいです<br /><br />まぁそれはともかく sudo した時にパスワードを聞かれないって話でしたよね　これはさらに細やかな設定ファイルが /etc/sudoers.d/ に入ってるらしいのでそれを <span class="decorationC" style="color:green;">sudo cat /etc/sudoers.d/010_pi-nopasswd</span> で確認してみましょう<br />すると pi ALL=(ALL) NOPASSWD: ALL ってのがあります　この NOPASSWD ってのがパスワードを聞かれないための設定らしいです<br />この /etc/sudoers.d の設定ファイルも直接書き換えるのではなく専用コマンドの <span class="decorationC" style="color:green;">sudo visudo -f /etc/sudoers.d/010_pi-nopasswd</span> を使うらしいです<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=%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><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:lightpink;"><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:lightcyan;"><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 猫山ぽるか 〔3977文字〕 No.5 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=5</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=5</guid>
	<category>info</category>
	<pubDate>Mon, 18 Oct 2021 15:33:15 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1 ]]></title>
	<description><![CDATA[ ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203174442-admin.jpg" alt="20211203174442-admin.jpg"><br />　<br />・有線 LAN 接続時の固定 IP な設定<br />・ホストネームの変更<br />・ファイルマネージャを root 権限で使う<br />・Raspberry Pi の基盤穴サイズ<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">有線 LAN 接続時の固定 IP な設定</b> <b class="decorationB">-----</b><br /><br /><span class="decorationC" style="color:green;">/etc/dhcpcd.conf</span> を編集<br /><span class="decorationC" style="color:lightseagreen;">&#35; Example static IP configuration:<br />&#35;interface eth0<br />&#35;static ip_address=192.168.0.10/24<br />&#35;static ip6_address=fd51:42f8:caae:d92e::ff/64<br />&#35;static routers=192.168.0.1<br />&#35;static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1</span><br /><br />この部分で設定する　必要な行の先頭の &#35; (コメント記号)を消して有効にして必要な内容に書き換える<br />以下は設定例(IP アドレスが 192.168.0.80 でゲートウェイ(ホームルータ)アドレスが 192.168.0.100 で Google のパブリック DNS を使用の場合)<br /><br /><span class="decorationC" style="color:lightseagreen;">&#35; Example static IP configuration:</span><br />interface eth0<br />static ip_address=192.168.0.80/24<br /><span class="decorationC" style="color:lightseagreen;">&#35;static ip6_address=fd51:42f8:caae:d92e::ff/64</span><br />static routers=192.168.0.100<br />static domain_name_servers=8.8.8.8 8.8.4.4<br /><br />ファイル保存後に OS を再起動することにより有効になる<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">ホストネームの変更</b> <b class="decorationB">-----</b><br /><br /><span class="decorationC" style="color:green;">/etc/hostname</span> を編集<br />標準状態で <span class="decorationC" style="color:red;">raspberrypi</span> が設定されているのでそれを適宜書き換える<br /><br /><span class="decorationC" style="color:green;">sudo nano /etc/hosts</span> で編集<br />最終行の <span class="decorationC" style="color:red;">127.0.1.1&nbsp;&nbsp;&nbsp;&nbsp;raspberrypi</span> の raspberrypi の部分を上記と同じものに書き換える<br /><br />ファイル保存後に OS を再起動することにより有効になる<br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">ファイルマネージャを root 権限で使う</b> <b class="decorationB">-----</b><br /><br />重要なファイル類の操作や編集を GUI でどうにかしたい時に便利かもしれないけど危険かも知れない（汗<br />ターミナル内で <span class="decorationC" style="color:green;">sudo pcmanfm</span> としてもいいんだけど…何かと面倒なんでアプリケーションランチャーに登録しておく<br /><br />DESKTOP ファイルとか云うものを作成する　※既にあるファイルマネージャのものをコピーして編集する<br /><span class="decorationC" style="color:green;">sudo cp /usr/share/applications/pcmanfm.desktop /usr/share/applications/pcmanfm_sudo.desktop</span><br /><br /><span class="decorationC" style="color:green;">sudo nano /usr/share/applications/pcmanfm_sudo.desktop</span><br /><span class="decorationC" style="color:red;">Icon=system-file-manager</span> を <span class="decorationC" style="color:red;">Icon=user-desktop</span> に変更する　※アイコンは何でもいいんだけど…個人的にこの辺が判りやすいアイコンだったんでこのようにした<br /><span class="decorationC" style="color:red;">Name=File Manager PCManFM</span> を <span class="decorationC" style="color:red;">Name=File Manager sudo</span> に変更する<br /><span class="decorationC" style="color:red;">Name&#91;ja&#93;=ファイルマネージャ PCManFM</span> を <span class="decorationC" style="color:red;">Name&#91;ja&#93;=ファイルマネージャ sudo</span> に変更する<br /><span class="decorationC" style="color:red;">GenericName&#91;ja&#93;=ファイルマネージャ</span> を <span class="decorationC" style="color:red;">GenericName&#91;ja&#93;=ファイルマネージャ sudo</span> に変更する<br /><span class="decorationC" style="color:red;">Exec=pcmanfm %U</span> を <span class="decorationC" style="color:red;">Exec=sudo pcmanfm %U</span> に変更してファイルを保存する<br /><br /><img class="embeddedimage " width="1056" height="786" src="https://room.dengeki.jp/images/202110161733492-admin.png" alt="202110161733492-admin.png"><br />デスクトップの「ランチャアイコン上」で<span class="decorationC" style="color:green;">右クリック</span>してメニューを出し<span class="decorationC" style="color:red;">アプリケーション・ランチャー Settings</span> をクリック<br /><br /><img class="embeddedimage " width="1056" height="786" src="https://room.dengeki.jp/images/202110161733491-admin.png" alt="202110161733491-admin.png"><br />何故か「システムツール」に入っている<span class="decorationC" style="color:red;">ファイルマネージャ sudo</span> を選び <span class="decorationC" style="color:red;">追加(A)</span> ボタンを押す<br /><br /><img class="embeddedimage " width="1056" height="786" src="https://room.dengeki.jp/images/20211016173349-admin.png" alt="20211016173349-admin.png"><br />新しい「ランチャアイコン」が追加された<br /><br /><img class="embeddedimage " width="1056" height="786" src="https://room.dengeki.jp/images/202110161747561-admin.png" alt="202110161747561-admin.png"><br />root 権限なんで(概ね)どのフォルダ/ファイルでも操作できる　その際にツールバーの左端に「現在あなたは管理者権限で操作しています」を表す <span class="decorationM" style="background-color:yellow;"><b class="decorationB">&#x26A0;</b></span> マークが表示されています<br />そしてもちろん右クリックでメニューを出して各種操作もできる<br /><br /><img class="embeddedimage " width="1056" height="786" src="https://room.dengeki.jp/images/20211016174756-admin.png" alt="20211016174756-admin.png"><br />メニュー操作により root 権限が必要なファイルの編集もできる<br />ただしシステムに関連した重要なファイルの変更などで取り返しのつかない事態に陥る危険性もあります　<span class="decorationC" style="color:red;">使用には細心の注意が必要です！</span><br /><br />　　：<br /><br /><b class="decorationB">-----</b> <b class="decorationB">Raspberry Pi の基盤穴サイズ</b> <b class="decorationB">-----</b><br /><br />Raspberry Pi の基盤穴サイズっていうか…適合するボルト径ですかね<br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.jp/images/20211016234940-admin.jpg" alt="20211016234940-admin.jpg"><br />M2.5 ってやつがピッタリ合うようです　M3 だと微妙に太くて通らないようです<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=%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><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:lightpink;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=4" class="postidlink">ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1</a></span><br />　　●<span class="decorationM" style="background-color:lightcyan;"><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 猫山ぽるか 〔2516文字〕 No.4 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=4</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=4</guid>
	<category>info</category>
	<pubDate>Sat, 16 Oct 2021 16:54:27 +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>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 完全モニタ無しで Raspberry Pi 4 を VNC … ]]></title>
	<description><![CDATA[ 完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.jp/images/20211203170030-admin.png" alt="20211203170030-admin.png"><br />　<br />※ Raspberry Pi OS が新しくなったんで…それに対応した新しい解説はこちら→ <a href="https://room.dengeki.jp/tegalog.cgi?postid=26" class="postidlink">続・モニタ無しでラズパイを VNC 接続できるとこまでセットアップする</a><br /><br />　　：<br /><br />某風の噂で「ラズパイ4ってモニタが無いと動かないらしいんだぜ？」って聞いたんだけど…いやいやそんなバカな話があるもんかガセネタにも程がある！って思ったんでここはひとつラズパイ4に一切モニタを繋がないで(ついでにキーボードもマウスも繋がないで)セットアップして VNC 接続して操作できる辺りまでどうにかしてみました<br /><br />　　：<br /><br />今回使用したのは <a class="url labeledlink" href="https://www.raspberrypi.com/software/operating-systems/" rel="noopener noreferrer" target="_blank">Raspberry Pi OS with desktop</a> です<br /><img class="embeddedimage " width="1560" height="1016" src="https://room.dengeki.jp/images/20211015182803-admin.png" alt="20211015182803-admin.png"> <br />モニタ無しって事はサーバ運用だろ？　なんで GUI な環境がいるん？？　そう思うかも知れないけど…ド初心者は何かとグラフィカルな操作を求めがちなんだよ察しろ！<br /><br />ちなみにラズパイ起動用の microSD を作成するのには <a class="url labeledlink" href="https://www.raspberrypi.com/software/" rel="noopener noreferrer" target="_blank">Raspberry Pi Imager</a> を使うといいらしいんだけどなんか面倒くさかったんで Linux(Ubuntu) 付属の dd コマンドで済ませちゃいました（汗<br /><span class="decorationC" style="color:green;">sudo dd if=2021-05-07-raspios-buster-armhf.img of=/dev/sd<span class="decorationC" style="color:red;">X</span> bs=4M conv=fsync status=progress</span><br />of=/dev/sd<span class="decorationC" style="color:red;">X</span> の <span class="decorationC" style="color:red;">X</span> は個々の環境によって違います　あと conv=fsync は付けた方がいいらしいです<br /><br />　　：<br /><br />こうして出来た microSD を PC にマウントすると rootfs パーティションと boot パーティションが現れます　ただし rootfs パーティションは ext4 ファイルシステムなんで Windows では読めないらしいんで現れないかも知れません<br />もうひとつの boot パーティションは FAT32 ファイルシステムなんで Windows でも問題なく読み書きできます　そして起動前の操作はこの boot パーティションに対して行います<br /><br />まぁその操作は SSH を使えるようにするおまじないみたいなもんですかね<br />先ほどの <span class="decorationC" style="color:green;">boot パーティションのルートフォルダ</span>にファイル名が「<span class="decorationC" style="color:green;">ssh</span>」もしくは「<span class="decorationC" style="color:green;">ssh.txt</span>」のファイルを新規作成するか…もしくは何処かからコピーするだけです　「<span class="decorationC" style="color:green;">ssh</span>」もしくは「<span class="decorationC" style="color:green;">ssh.txt</span>」のファイルの中身は何でも構いません　空のファイルでもいいです<br /><br />これで前準備は完了です　この microSD を Raspberry Pi 4 に挿して電源を供給します<br />赤色のパワー LED が点灯して…その横にある緑色のアクセス LED が不規則に点いたり消えたりして起動していきます<br /><br />※起動の際に何かエラーがあるとこの緑色のアクセス LED が規則的に点滅して知らせてくれます<br />※点滅の回数などで何のエラーなのかある程度知ることが出来ます<br />※<a class="url labeledlink" href="https://support-pishop-ca.translate.goog/article/33-raspberry-pi-act-led-error-patterns?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui,sc" rel="noopener noreferrer" target="_blank">こちらのページ</a> に詳しく書かれているんでもしもの時には参考になるかも？？<br /><br />起動が完了すると緑色のアクセス LED が殆ど点灯しなくなります　その辺が起動の見極め時ですかね<br />そして PC から SSH 接続します　Ubuntu(Linux) には標準で ssh が用意されているけど… Windows はどうなんだろう？　そっちにも用意されているとは聞いたことがあるようなないような（汗<br /><br /><span class="decorationC" style="color:green;">ssh pi@raspberrypi.local</span><br />LAN 内にラズパイが 1 台だけなら基本的にこの手法で繋がります<br />なおラズパイのネットワークへの接続は有線 LAN を使います<br />無線 LAN(WiFi) を使いたい場合は「wpa_supplicant.conf」でどうにかするらしいのですが…今回は有線 LAN のみを使ったんで詳細は不明です<br /><br />余談ですが…我が家には既にラズパイ3が動いているんで上記の <span class="decorationC" style="color:green;">raspberrypi.local</span> が使えませんでした<br />それなら IP アドレスで…と思うのですが DHCP による割り当てなんでアドレスが判りません（汗<br />まぁそんな時は <span class="decorationC" style="color:green;">arp -a</span> とかすると活きた IP アドレスが列挙されるんでアタリを付けやすくなりますが<br /><br />そうこう云いつつ SSH 接続を開始します<br />今回は ssh の -l オプションでユーザ pi を指定してるけど Windows の ssh はオプションの意味が違うらしい？<br />ここは <span class="decorationC" style="color:green;">ssh pi@192.168.0.34</span> とかの書き方のほうが判りやすくていいかもだけどどうなんだろう<br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828031-admin.png" alt="202110151828031-admin.png"> <br />初接続時のみ「未知の証明書なんだけど大丈夫？　接続していいの？？」って聞かれるんで <span class="decorationC" style="color:green;">yes</span> する<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828032-admin.png" alt="202110151828032-admin.png"> <br />パスワードを聞かれます　ラズパイの初期設定パスワードは <span class="decorationC" style="color:red;">raspberry</span> なんでそれを入力する<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828033-admin.png" alt="202110151828033-admin.png"> <br />接続できたら次の作業っていうか <span class="decorationC" style="color:green;">sudo raspi-config</span> して設定ツールを起動する<br />キーボードの矢印キーで移動してエンターキーで決定ってスタイルです<br />Tab キーを使う場面もあります<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828034-admin.png" alt="202110151828034-admin.png"> <br /><span class="decorationC" style="color:red;">3 Interface Options</span> を選ぶ<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828035-admin.png" alt="202110151828035-admin.png"> <br /><span class="decorationC" style="color:red;">P3 VNC</span> を選ぶ<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828036-admin.png" alt="202110151828036-admin.png"> <br />VNC サーバを有効にするけどいいの？と聞かれるんで <span class="decorationC" style="color:red;">&lt;Yes&gt;</span> を選ぶ<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828037-admin.png" alt="202110151828037-admin.png"> <br />設定完了<br />それじゃ早速 PC の VNC Viewer で接続してみましょう　我が家では <a class="url labeledlink" href="https://remmina.org/" rel="noopener noreferrer" target="_blank">Remmina</a> を使ってみました<br /><br /><img class="embeddedimage " width="640" height="480" src="https://room.dengeki.jp/images/202110151828038-admin.png" alt="202110151828038-admin.png"> <br />・・が繋がりません　なんか「Unknown authentication scheme from VNC server: 13, 5, 6, 130, 192」ってエラーっぽい？<br />これはラズパイ側のセキュリティ設定との兼ね合いらしいんでその辺をどうにかします<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/202110151828039-admin.png" alt="202110151828039-admin.png"> <br />先ほどの SSH でラズパイの設定ファイルを編集します<br /><span class="decorationC" style="color:green;">sudo nano /root/.vnc/config.d/vncserver-x11</span><br /><br />テキストエディタに nano を使ったけど vi も使えます　お好きな方でどうぞ<br />そして末尾に以下の 3 行を追加します<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280310-admin.png" alt="2021101518280310-admin.png"> <br /><span class="decorationC" style="color:red;">Authentication=VncAuth<br />Encryption=AlwaysOff<br />Password=</span><br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280311-admin.png" alt="2021101518280311-admin.png"> <br /><span class="decorationC" style="color:green;">sudo systemctl restart vncserver-x11-serviced</span> で VNC サーバを再起動する<br /><br /><img class="embeddedimage " width="640" height="480" src="https://room.dengeki.jp/images/2021101518280312-admin.png" alt="2021101518280312-admin.png"> <br />再び PC の VNC Viewer で接続を試みる<br />パスワードを聞いてくるようになりました　でもなんかエラーが出て繋がりません<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280313-admin.png" alt="2021101518280313-admin.png"> <br />再び SSH で <span class="decorationC" style="color:green;">sudo vncpasswd -service</span> と入力する<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280314-admin.png" alt="2021101518280314-admin.png"> <br />パスワードを聞かれるのでお好みのパスワードを 2 回入力する<br />そして <span class="decorationC" style="color:green;">sudo systemctl restart vncserver-x11-serviced</span> で VNC サーバを再起動する<br /><br /><img class="embeddedimage " width="640" height="480" src="https://room.dengeki.jp/images/2021101518280315-admin.png" alt="2021101518280315-admin.png"> <br />またまた PC の VNC Viewer で接続を試みる　先ほど設定したパスワードを入力する<br />しかしまだ繋がらない（汗<br /><br />これはラズパイ側のモニタ設定(？)が問題らしいのでその辺を解決する<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280316-admin.png" alt="2021101518280316-admin.png"> <br /><span class="decorationC" style="color:green;">sudo nano /boot/config.txt</span> を編集する<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280317-admin.png" alt="2021101518280317-admin.png"> <br /><span class="decorationC" style="color:lightseagreen;">&#35;hdmi_force_hotplug=1</span> を探す<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280318-admin.png" alt="2021101518280318-admin.png"> <br />あった<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280319-admin.png" alt="2021101518280319-admin.png"> <br />先頭の &#35; (コメント記号)を消して有効にする<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.jp/images/2021101518280320-admin.png" alt="2021101518280320-admin.png"> <br />これで設定は完了なんでラズパイを再起動する<br /><span class="decorationC" style="color:green;">sudo reboot</span><br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280321-admin.png" alt="2021101518280321-admin.png"> <br />これで VNC Viewer での操作が可能になりました<br />なんかデフォルトのパスワードだと云々…のダイアログが出てるけどまぁ OK する<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280322-admin.png" alt="2021101518280322-admin.png"> <br />せっかくなんで初期設定も済ませちゃおっか<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280323-admin.png" alt="2021101518280323-admin.png"> <br />お国の設定は Japan にすると概ね日本語になるよ<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280324-admin.png" alt="2021101518280324-admin.png"> <br />ログインパスワードの再設定をする　ラズパイ初期設定パスワード <span class="decorationC" style="color:red;">raspberry</span> のままだと何かと不安なんでお好みのものに変更しておく<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280325-admin.png" alt="2021101518280325-admin.png"> <br />ラズパイにモニタを繋げている人向けの設定<br />黒枠があったりして見づらい時にはチェックを入れておくとどうにかしてくれるらしい？<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280326-admin.png" alt="2021101518280326-admin.png"> <br />WiFi の設定は使わなかったんで素通りした（汗<br /><br /><img class="embeddedimage " width="1056" height="800" src="https://room.dengeki.jp/images/2021101518280327-admin.png" alt="2021101518280327-admin.png"><br />最後にソフトウエア等のアップデート　全自動でやってくれるから見てるだけなんだけど結構時間がかかります<br /><br />　　：<br /><br />そんな感じで作業完了してモニタ無しのラズパイを VNC Viewer で操作できるようになりました<br />そして某風の噂の「ラズパイ4ってモニタが無いと動かないらしいんだぜ？」って話は正しくないと判明しました<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><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:lightcyan;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=3" class="postidlink">ラズパイで Apache2 サーバを建ててゆるい設定をする</a></span><br />　　●<span class="decorationM" style="background-color:lightpink;"><a href="https://room.dengeki.jp/tegalog.cgi?postid=2" class="postidlink">モニタ無しでラズパイを VNC 接続できるとこまでセットアップ</a></span><br /></small> -- Posted by 猫山ぽるか 〔3954文字〕 No.2 ]]></description>
	<link>https://room.dengeki.jp/tegalog.cgi?postid=2</link>
	<guid>https://room.dengeki.jp/tegalog.cgi?postid=2</guid>
	<category>info</category>
	<pubDate>Fri, 15 Oct 2021 18:28:03 +0900</pubDate>
</item>

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

