ユーザ「猫山ぽるか」の投稿[39件](3ページ目)
2022年1月 この範囲を時系列順で読む
Tweet ⌚ 2022年1月30日(日) 15:35:43 情報 <3825文字>
かつや・デミチキンカツ丼
かつや の期間限定! 濃厚デミグラスソースにチーズのコクがたまらない デミチキンカツ丼 を食べてきました
オーダーして…厨房から漂ってくるデミグラスソースの香りからして気分が盛り上がってきます そして丼を覆い隠さんばかりのチキンカツが 2 枚! そこに豚肉たっぷりなデミソースがかかっています!
最初はデミソースがかかってないサックリした部分のチキンカツから楽しみ…お次はデミソースがかかったしっとりした衣を楽しむ流れがイイネ!
たっぷり豚肉も食べ応えあってたまりません! もちろん刻みキャベツも入っているし飽きること無く最後まで楽しめます
いやむしろ具だくさんすぎてご飯とのペース配分が困難すぎますねw これは丼より…ちょっと奮発して定食にしたほうが余すとこなく味わえるのかなーって思いました
期間限定なのが惜しい逸品です! また近いうちに食べに行きたいです #外食記録
Tweet ⌚ 2022年1月16日(日) 10:10:03 日記 <404文字>
Windows の BAT ファイルで CGI しよう
ぺけぽんっていうか Windows XP の頃にあまりにも怒り心頭になって勢い Microsoft に三行半を叩きつけてからずっと Linux な生活の日々なんですが…まぁそうは云いつつ Windows も使える事をアピールしておかないとオファーが来ないんでって感じなんで今回は Windows 的な話題っていうか BAT ファイルを CGI にしちゃおう!って解説です(汗
つーか初っ端から言い訳を並べるっていうか…我が家の Windows 機は 2015 年くらいに発売された 2 万円くらいの 8 型 Windows 10 タブレットって事なんでものすっごい低スペックです リソースなんて OS を起動するだけで使い果たしちゃう感じなんで新たにアプリケーションとか入れる余裕が全くありません なんか Windows でも CGI を動かす時は Perl や Python なんかを導入してるようですが…そんなんが入る空きなんてこれっぽっちも無いんで「それじゃ今あるもので何とかするか」ってことで標準的に使える BAT ファイルを引っ張り出してきた感じですかね(泪
世間的には Windows の Web サーバは Apache や IIS がよく使われている感じ?らしいですが…もちろんその辺を入れる余裕がないんで軽量コンパクトな Web サーバとして有名だった AN HTTPD を microSD に入れて一時的なテスト環境をざっくり構築してみました ただ AN HTTPD はかなり前に開発が終了しちゃってるらしく正規のルートでは配布されていないらしい? まぁとりあえず anhttpd download なるキーワードでぐぐってみたらどうにかなったけどお約束っていうかこの辺は自己責任でお願いします
:
あーあと殆ど大半の方には関係のない話っていうか Windows の BAT ファイルを Linux で作ろうとすると色々と不都合が発生するようです…いや発生しました ごくシンプルにっていうか @echo off とだけ書いた BAT ファイルすら動かない致命的な不都合でありつつ原因に気付くまで結構かかりました orz
まずは改行コードです Windows 系列の改行コードは「CR+LF」なのに対して Linux 系列の多くは「LF」のみとなっていて…この改行コードの違いが問題になります ちなみに Mac OS では「CR」な改行コードを吐くものもあるとか??
Windows のみで開発していれば(ほぼ)気にする必要はないようですが…他の OS 上で書いた場合は改行コードの違いに要注意です
お次は文字コードです これもうっかりやらかしたっていうか Linux 上で何気に UTF-8 で書いた BAT ファイルを Windows に持ってきてテストしたらうまく動きませんでした
この文字コードの問題は改行コード以上に呪わしいっていうか…例えば Windows 標準の「メモ帳」を使用したとしてもバージョンの違いによりデフォルトの文字コードが Shift-JIS (ANSI) だったり UTF-8 だったりするので注意する必要があります
なお我が家の Microsoft Windows [Version 10.0.19042.1348] に付属のメモ帳ではデフォルト文字コードが UTF-8 だったようですが…いつの間にかメモ帳も進化したのか保存時に文字コードを選択できるようになってました ちなみに ANSI ってやつが Shift-JIS っぽいですね
つーかそもそもコマンドプロンプトで使用する文字コードが Shift-JIS (ANSI) だって保証がどこにも無いみたいです 我が家は(たぶん)何も設定していないので Shift-JIS (ANSI) になってましたが…これを他の文字コードに設定することも可能のようです
単に現在の文字コードを確認するだけなら「コマンドプロンプト」のタイトルバーを右クリックして「プロパティ」を参照するといいでしょう
もし他の文字コードに変更したい場合は chcp コマンドを使います 単に chcp とした場合には現在の設定値を表示します 変更したい場合は chcp 番号 という感じで番号を指定します 代表的なものだと「ANSI/OEM 日本語;日本語 (shift-jis) が 932」で「EUC 日本語が 51932」で「Unicode (UTF-8) が 65001」となるようです この辺の コードページ識別子の一覧 が公式(?)にあったんで参考になるかも? ちなみになんか面倒くさそうだったんで実際に変更して試してないんで今後は Shift-JIS (ANSI) で話を進めます(瀧汗
:
さて…その辺の注意事項もろもろを無事にクリアしたところで実際に BAT ファイルを CGI として動かしてみましょう
とりあえず AN HTTPD に CGI の設定をしましょう…っていうか特に何もしなくても動くっぽい?
我が家では拡張子「.bat」に対する「実行プログラム」を「空欄」もしくは「c:\windows\system32\cmd.exe /c」で動作しました テストする環境が無いんで IIS (Internet Information Services) 等では試せてないのですが…おそらくそっちも「.bat」に対する設定で「(空欄)」もしくは「c:\windows\system32\cmd.exe /c」を設定すれば動くのかなーって思ってます この辺はどなたか実際に試して教えて頂きたい感じですね ※ご連絡頂いたんで…本記事の最下部くらいに設定法などを転載してあります
そんな設定が済んだ所で…それじゃ実際に BAT ファイルを作って試してみましょう 以下のバッチファイルを適切な改行コードと文字コードで保存した後に Web サーバのドキュメントルート以下に配置してブラウザからアクセスしてみましょう
----- bat_cgi01.bat -----
@echo off
REM ブラウザに「Content-type:」を出力する(単純なTEXTファイル用)
echo Content-type: text/plain; charset=Shift_JIS
echo.
REM Windows のバージョンを表示 ※空行も表示されている
ver
REM 環境変数に設定されている CPU の種類を表示
echo %PROCESSOR_IDENTIFIER%
echo.
REM 現在日時を date と time コマンドで表示
echo. | date
echo. | time
echo.
REM 必要な所だけ抽出してみる
echo. | date | find "現在の日付"
echo. | time | find "現在の時刻"
echo.
REM 環境変数でも現在日時を取得できるっぽい??
echo %DATE%
echo %TIME%
echo.
REM 日付が設定されている変数から「年月日」を取得してログファイル的なファイル名を作ってみる
echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
----------
正しく動作すればこんな感じの内容がブラウザに表示されます
今回は単純なテキストを表示するのに適した「Content-type: text/plain; charset=Shift_JIS」で表示させてみました コマンドプロンプトを別の文字コードに設定している場合はここの「charset=」以降を適当なものに変更する必要があると思います
Linux の Web サーバだと実行属性がどうのこうのとかありますが Windows にはそんなものは無いので「.bat」の拡張子のものであればそれだけで動きます ちなみに大文字/小文字の区別も無いのでブラウザのアドレス欄で「BAT_CGI01.BAT」なんて大文字で指定しても動きます
※少なくことも我が家の AN HTTPD を使用した環境では動きました
※テストした環境が FAT32 ファイルシステムの microSD だったから大文字/小文字の区別がない? これが NTFS ファイルシステム上だと大文字/小文字を区別するの? どうなの??
さて…うまく動きましたか? 無事に動いたのなら次にいってみましょう
----- bat_cgi02.bat -----
@echo off
REM ブラウザに「Content-type:」を出力する(HTML出力用)
echo Content-type: text/html; charset=Shift_JIS
echo.
REM HTML なページとしてのお約束的なヘッダ部
echo ^<!doctype html^>
echo ^<html^>^<head^>^<title^>今日の運勢的な?^</title^>^</head^>^<body^>
echo 今日の運勢は…^<font color=red^>
REM コマンドの実行結果を変数に取り込む
for /f "usebackq delims=" %%A in (`echo. ^| time ^| find "現在の時刻"`) do set RAND=%%A
REM 「%RAND:~-1%」で変数の末尾 1 文字を取り出す
if %RAND:~-1% == 0 echo [%RAND:~-1%] ☆大吉☆
if %RAND:~-1% == 1 echo [%RAND:~-1%] 中吉
if %RAND:~-1% == 2 echo [%RAND:~-1%] 中吉
if %RAND:~-1% == 3 echo [%RAND:~-1%] 吉
if %RAND:~-1% == 4 echo [%RAND:~-1%] 吉
if %RAND:~-1% == 5 echo [%RAND:~-1%] 吉
if %RAND:~-1% == 6 echo [%RAND:~-1%] まぁまぁ
if %RAND:~-1% == 7 echo [%RAND:~-1%] 凶
if %RAND:~-1% == 8 echo [%RAND:~-1%] 凶
if %RAND:~-1% == 9 echo [%RAND:~-1%] 大凶(-_-;)
echo ^</font^>です^<br^>
REM HTML なページとしてのお約束的なフッタ部
echo ^</body^>^</html^>
----------
正しく動作すればこんな感じの内容がブラウザに表示されます 何度かロリードして試してみたってイメージでw
今回はホームページな表示をさせるために「Content-type: text/html; charset=Shift_JIS」を設定してみました これで文字装飾などの「タグ」が使えるようになるのですが…この「タグ」に使用する「<」と「>」はそのまま使うとファイルにリダイレクト/インリダイレクトするための記号として解釈されてうまく動かなくなるのでそれをエスケープするための記号「^」を使用しています コマンドの実行結果を変数に取り込むバッククオート内ではパイプに使用する記号「|」なんかも誤動作するんでエスケープする必要があります
そんなこの CGI はありがちな「おみくじ CGI」です 標準コマンドである time の出力の中から「現在の時刻」が含まれる行を変数に取り込み…その文字列の末尾(この場合 0〜9 になる)を取り出しその値に対して処理を振り分けています
ざっと見た感じ time は 1/100 秒の値まで表示している感じなんで…その値をざっくりした乱数値として使用しています ちなみに大まか作ってから気づいたのですが…バッチファイル内で乱数となる変数 %RANDOM% なんてのもあるようです これは 0~32767 の得られるようですね たぶん動作はこちらのほうが軽いと思います
さてさて…うまく動きましたか? 無事に動いたのなら次にいってみましょう
----- bat_cgi03.bat -----
@echo off
REM ブラウザに「Content-type:」を出力する(PNG画像用)
echo Content-type: image/png
echo.
goto MAIN
REM 時間を判定して画像を表示する用のサブルーチン
REM call :SUB <時間> <ファイル名>
REM <時間> は 0~23 で指定
REM <ファイル名> は表示させたい PNG 画像を指定
:SUB
echo. | time | find " %1:" > NUL
if %errorlevel% == 0 type %2
exit /b
REM サブルーチンを呼んだりするメイン的な処理
:MAIN
call :SUB 0 img_shinya.png
call :SUB 1 img_shinya.png
call :SUB 2 img_shinya.png
call :SUB 3 img_shinya.png
call :SUB 4 img_shinya.png
call :SUB 5 img_asa.png
call :SUB 6 img_asa.png
call :SUB 7 img_asa.png
call :SUB 8 img_asa.png
call :SUB 9 img_asa.png
call :SUB 10 img_hiru.png
call :SUB 11 img_hiru.png
call :SUB 12 img_hiru.png
call :SUB 13 img_hiru.png
call :SUB 14 img_hiru.png
call :SUB 15 img_hiru.png
call :SUB 16 img_hiru.png
call :SUB 17 img_hiru.png
call :SUB 18 img_yoru.png
call :SUB 19 img_yoru.png
call :SUB 20 img_yoru.png
call :SUB 21 img_yoru.png
call :SUB 22 img_yoru.png
call :SUB 23 img_yoru.png
----------
以下の画像を bat_cgi03.bat と同じフォルダ内に用意しておいてください
※画像は いらすとや さんから拝借しました いつもありがとございます
今度は少し変わり種っていうか…正しく動作すればこんな感じの内容がブラウザに表示されます(表示は時間帯によって変化します)
今回は HTTP ヘッダとして「Content-type: image/png」出力しています これは一体何なのかと云うと…ブラウザから見たこの CGI (bat_cgi03.bat) 自体が画像となっている事を意味しています
つまりブラウザから見れば「同じファイル名」なのに「アクセス毎に違う画像」を表示できることなんですね
※なお本来はテキストデータを扱う type コマンドでバイナリデータを標準出力に流しています ざっとテストした感じではうまく動いているっぽいけど…どうなんだろうね? なんか type コマンドの仕様に「EOF」が出現したら動作を終了する的なものがあるらしいんだけど…ねぇ?
※バイナリを扱える copy コマンドで出力先を CON にして試してもみたんだけど…こちらは明確に誤動作していました 確か CON デバイスは改行コードの置換などそんな動作を行うんだっけ? 何も変換とかの動作をしない…シンプルに全てのデータをそのまま標準出力に流してくれるものがあればいいのですが
話を元に戻して… CGI (bat_cgi03.bat) 自体が画像ファイルとして動作することのメリットを考えてみましょう
例えば迷惑系の HTML メールですかね その中の画像として他のサーバにある bat_cgi03.bat を呼ばれたとしましょう するとその他の場所にあるサーバ内ではアクセスログが記録されます それ即ち「メールが読まれたこと」を記録することになります
もちろんそれだけでは大きな脅威にならないかもだけど…そこには面白い使い方があるんですよ
ブラウザから見た bat_cgi03.bat は単なる画像ファイルだけど実際にはプログラム的な動作をしています そしてプログラムの動作には「引数」を与えることができます
先ほどの bat_cgi03.bat の呼び出しに対して bat_cgi03.bat?HOGEHOGE と云った感じで「引数」を与えて呼び出しそれを解釈できるようになります この引数の部分にメールを受信した人を特定する一意のデータ(この場合はHOGEHOGE)を付けておき…その一意のデータと送信したメールアドレスを紐づけておけば「誰がメールを読んだのか」を知ることができます
例として先ほどの bat_cgi03.bat の末尾にログを収集するものを付加してみましょう
----- bat_cgi04.bat -----
@echo off
REM ブラウザに「Content-type:」を出力する(PNG画像用)
echo Content-type: image/png
echo.
goto MAIN
REM 時間を判定して画像を表示する用のサブルーチン
REM call :SUB <時間> <ファイル名>
REM <時間> は 0~23 で指定
REM <ファイル名> は表示させたい PNG 画像を指定
:SUB
echo. | time | find " %1:" > NUL
if %errorlevel% == 0 type %2
exit /b
REM サブルーチンを呼んだりするメイン的な処理
:MAIN
call :SUB 0 img_shinya.png
call :SUB 1 img_shinya.png
call :SUB 2 img_shinya.png
call :SUB 3 img_shinya.png
call :SUB 4 img_shinya.png
call :SUB 5 img_asa.png
call :SUB 6 img_asa.png
call :SUB 7 img_asa.png
call :SUB 8 img_asa.png
call :SUB 9 img_asa.png
call :SUB 10 img_hiru.png
call :SUB 11 img_hiru.png
call :SUB 12 img_hiru.png
call :SUB 13 img_hiru.png
call :SUB 14 img_hiru.png
call :SUB 15 img_hiru.png
call :SUB 16 img_hiru.png
call :SUB 17 img_hiru.png
call :SUB 18 img_yoru.png
call :SUB 19 img_yoru.png
call :SUB 20 img_yoru.png
call :SUB 21 img_yoru.png
call :SUB 22 img_yoru.png
call :SUB 23 img_yoru.png
REM 最後にログを保存する
REM 例)[日 時],[引数],[相手ホスト名(相手IPアドレス)],[ブラウザ名]
echo [%DATE% %TIME%],[%QUERY_STRING%],[%REMOTE_HOST%(%REMOTE_ADDR%)],[%HTTP_USER_AGENT%] >> %date:~0,4%%date:~5,2%%date:~8,2%.log
----------
これで「アクセス日時」「引数」「相手ホスト名(相手IPアドレス)」「ブラウザ名」がログとして記録されるようになります
たったこれだけの仕組みで「単に HTML メールを見ただけ」なのにいろいろ収集できるんで…画像ファイルとして動作する CGI には大きな意義があると思います
※なお最近のメーラは「外部コンテンツを読み込まない」的なオプションがデフォルトでオフになっていると聞きます しかしその意味をよく判らないまま「便利さを求めて」読み込むような設定に変更してる人も多いと聞きます
※まぁもちろん外部コンテンツの全部が全部にそのような動作が仕掛けられている事は無いとは思いますが…そのような危険性があることを覚えておきたいですね
:
なんて感じで長々とお疲れさまでした 久しぶりのバッチファイルっていうか…思い返せば X68000 の Human68k の AUTOEXEC.BAT の頃以来ですかね(汗 なんか今回いろいろ調べてて「サブルーチンなんて使えてたっけ??」とか新しい発見があってよかったです
今回 Web サーバ以外は最初から用意されている(と思われる)標準的なコマンドをどうにか組み合わせて機能を実現してみました それ故にっていうか…久しぶりだったんでいろいろ無駄な部分とかもあるけどその辺はご了笑くださいませ
まぁしょーみ今さらバッチファイルを CGI に使おうなんて奇特な人も居ないだろうで全く問題ないだろうけどww
あと今回テストに使った Web サーバは一時的なものなので WAN に公開していません つーか使いたくないんで年に数回くらいしか電源を入れることがない代物なんでその辺はお察しください… #Windows #CGI
:
今回使用した bat_cgi*.bat と img*.png をひとまとめにした配布セットを用意しました
bat_cgi.zip
なおこれを使用した際に発生したあらゆる利益・不利益について当方は一切の責任を負いませんって定型文でよろしくお願いします
:
※ 追記 ※
今回は AN HTTPD のみでの動作テストだった訳ですが…有志のえらいひとが IIS (Internet Information Services) でのテストをしてくれて問題点と解決法をご連絡頂けたんでここに転載させていただきます
まずは IIS の設定から
「CGI」の設定で「起動ごとに新しいコンソールを使用する」を「True」にする
「ハンドラー マッピング」の設定で「マネージハンドラーの追加」をして
「要求パス」に「*.bat」を
「実行可能ファイル」に「c:\windows\system32\cmd.exe /c %s」を
「名前」には「判りやすそうな適当な名前」を設定します
あとは上の方で示してる BAT ファイルの内容的な問題っていうか…その BAT ファイルが参照/作成するファイルへのパスですかね
どうも IIS の場合だとカレントディレクトリが「BAT ファイルを実行した場所」ではなく「物理パス(ドキュメント ルート)」となるらしく…その辺を考慮してないと誤作動となるようなのでその辺を改良します まぁ基本的には BAT ファイルを実行した場所を示す変数である「%~dp0」を追加します
----- bat_cgi01.bat -----
REM 日付が設定されている変数から「年月日」を取得してログファイル的なファイル名を作ってみる
echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
↓
REM 日付が設定されている変数から「年月日」を取得してログファイル的なファイル名を作ってみる
echo %~dp0%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
----------
----- bat_cgi03.bat -----
REM 時間を判定して画像を表示する用のサブルーチン
REM call :SUB <時間> <ファイル名>
REM <時間> は 0~23 で指定
REM <ファイル名> は表示させたい PNG 画像を指定
:SUB
echo. | time | find " %1:" > NUL
if %errorlevel% == 0 type %2
exit /b
↓
REM 時間を判定して画像を表示する用のサブルーチン
REM call :SUB <時間> <ファイル名>
REM <時間> は 0~23 で指定
REM <ファイル名> は表示させたい PNG 画像を指定
:SUB
echo. | time | find " %1:" > NUL
if %errorlevel% == 0 type %~dp0%2
exit /b
----------
----- bat_cgi04.bat -----
上記 bat_cgi03.bat のサブルーチン部と同じく if %errorlevel% == 0 type %~dp0%2 と直して…
REM 最後にログを保存する
REM 例)[日 時],[引数],[相手ホスト名(相手IPアドレス)],[ブラウザ名]
echo [%DATE% %TIME%],[%QUERY_STRING%],[%REMOTE_HOST%(%REMOTE_ADDR%)],[%HTTP_USER_AGENT%] >> %date:~0,4%%date:~5,2%%date:~8,2%.log
↓
REM 最後にログを保存する
REM 例)[日 時],[引数],[相手ホスト名(相手IPアドレス)],[ブラウザ名]
echo [%DATE% %TIME%],[%QUERY_STRING%],[%REMOTE_HOST%(%REMOTE_ADDR%)],[%HTTP_USER_AGENT%] >> %~dp0%date:~0,4%%date:~5,2%%date:~8,2%.log
----------
こんな感じに修正します これで正しく動くようになるようです
わざわざのご連絡ありがとございました!(>_<)w
Tweet ⌚ 2022年1月3日(月) 16:27:56 情報 <11014文字>
2021年12月 この範囲を時系列順で読む
粉もん屋 八・たこ焼ハイボール酒場 近鉄蟹江駅前店
最寄り駅の構内 に 粉もん屋 八・たこ焼ハイボール酒場 が出来てたんで早速行ってみました
パッと見…駅前のたこ焼き屋さんな感じなんだけど「たこ焼ハイボール酒場」の名前の通り店内で呑めましたw
店内には狭めのカウンターで 3 席用意されていました
そんな訳でなんで…せっかくなんで醤油たこ焼きとソースたこ焼きとビームハイボールを頂きます!(>_<)w
表面はサクサク感を演出しつつ中はトロットロの熱々のたこ焼きが美味い!
なんか粉かつおをどうにか薄く固めたような不思議なかつお節もイケてますね!
醤油とソースの食べ比べでは…圧倒的に醤油が美味しいですね
まだまだ他にも多彩なテイストが用意されているんでそっちも試してみたいと思いました
関西系の方言が色濃い感じの気さくな店員さんの対応もいい感じですね
午前 11 時から呑み始められるスピーディーなのも評価高いです! また食べに行きたいです!!(>_<)w #外食記録
Tweet ⌚ 2021年12月26日(日) 14:39:04 日記 <442文字>
吉野家・カリガリ肉だく牛カレー
毎日の日記って程の頻度じゃないかもだけど…日記的な使い方として外食の記録を残していこうと思いました
そんな訳で第1回目は 吉野家 ・ カリガリ肉だく牛カレー です
「カリカリ」でも「ガリガリ」でもなく…「カリガリ」って一体なんなの?って思ってたんだけどなんか カリガリカレー ってお店が監修して カリガリ監修の吉野家カレー として出てきたものらしい?
そんな カリガリ肉だく牛カレー のお味は…薬膳っぽいスパイスっていうの? なんとなく漠然とそんな雰囲気の味がほんのり効いてて身体に良さそうな美味しさでした
ちょっと贅沢して肉だくにしたんだけど…しょーみ牛丼の具的なものと薬膳っぽいスパイスのカレーはベストマッチではないかなーって印象でした
純粋に標準状態の カリガリ牛カレー として頂くのがベストなのかな?って思ったりしていました
ちょっと不満点っぽいことを書いちゃってるけど…とても満足な美味しさでした! また食べに行きたいです!!(>_<)w #外食記録
Tweet ⌚ 2021年12月19日(日) 15:44:16 日記 <450文字>
スケジュール実行 cron は 13 日の金曜日の夢を見るか?
「〇〇〇〇は△△△△の夢を見るか?」ってフレーズを見かけるとなんかえっちな気分になっちゃう!って光栄マイコンシステムのストロベリーなんとか世代のひいおじいちゃんが云ってたけど…自称:ゆとりのない平成のゆとり的なオレ様的にはしょーみなンてるんか全く意味わかんないですw まじまじwww
まぁそんな茶番はおいといて…諸々の bot 大好きな人々に愛されるスケジュール実行の cron についての諸々です
cron - daemon to execute scheduled commands (Vixie Cron)
スケジュールされたコマンドを実行するデーモンって事らしいですね(機械翻訳
このスケジュールの確認・設定をするには crontab なるコマンドを使います
スケジュールの確認 crontab -l
スケジュールの設定 crontab -e
設定の初回起動時のみ使用するエディタを聞かれるらしい? なおこの使用するエディタは以下のコマンドで再設定できるようです
select-editor
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.tiny
Choose 1-3 [2]:
なんか「<---- easiest」と「[2]」ってのが現在設定されているエディタっぽく見えるけどそうじゃなくて…何も入力せずに Enter した時に選択されるデフォルト値を表示しているようです 紛らわしいですね(-_-;)
:
では実際に crontab -e して設定してみましょう
新たなスケジュールを設定する場合は…新しい行として以下の書式を追加します
* * * * * コマンド
5 個並んだ「*」は順番に… 分 時 日 月 曜日 を指しています
「*」は設定可能な全ての値になってるんで…上記の「* * * * * コマンド」は 全ての分 の 全ての時 の 全ての日 の 全ての月 の 全ての曜日 って意味となり「毎分(だいたい 0 秒くらい)にコマンドを実行」となります
もうちょっと細かく設定した例っていうか…
1 * * * * コマンド
毎月の毎日の毎時の 1 分にコマンドを実行
1 2 * * * コマンド
毎月の毎日の 2 時 1 分にコマンドを実行
1 2 3 * * コマンド
毎月の 3 日の 2 時 1 分にコマンドを実行
1 2 3 4 * コマンド
4 月 3 日の 2 時 1 分にコマンドを実行
曜日は少々特殊な扱いになってるってるんでアレだけど…例えば
* * * * 6 コマンド もしくは
* * * * sat コマンド で毎月の毎土曜日の毎時の毎分にコマンドを実行します
数字と曜日は 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun に対応しています 大文字小文字は関係ないようです
:
もっと細やかな設定をしてみましょう 例えば勤務時間内にありがちな設定っていうか 8 時から 17 時までの毎時 0 分にコマンドを実行するって例だと…
0 8,9,10,11,12,13,14,15,16,17 * * * コマンド
0 8-17 * * * コマンド
設定したい内容を「,(カンマ)」で区切って列挙するとか「-(ハイフン)」で 8 から 17 までって感じで指定します
0 8-12,13-17 * * * コマンド
こんな感じで範囲指定を列挙することもできるようです
ただし分なり時なりの境い目をまたいで設定する場合には注意が必要です 例えば毎時の 50 分から次の 10 分までって場合だと…
50-10 * * * * コマンド
この指定では動きません この場合だと…
50-59,0-10 * * * * コマンド
こんな感じで途中に「,(カンマ)」を入れて区切ってやらないとダメなようです ちなみに「,(カンマ)」で列挙する場合には数の大小の順番は関係ないらしいです
:
さらに細やかな設定をしてみましょう 例えば(どのような状況でそのような必要があるのかイマイチ思い浮かばないけど)偶数日(2 で割り切れる日)の 10 時 20 分のみコマンドを実行するって例だと…
20 10 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 * * コマンド
20 10 2-30/2 * * コマンド
こんな感じで指定できます まぁ「全ての偶数日」って事なんで「2-30/2」なんて指定じゃなく「*/2」でもイケるようです
ちなみに「全ての奇数日」ってしたいのあれば「1-31/2」って感じになるみたいです
:
月初にコマンドを実行したい時っていうか月初は 1 日に決まってるんでその辺は簡単だってことで…じゃぁ月末にコマンドを実行したい時はどうしたらいいんでしょうか
カレンダーをざっと眺めて 12 ヶ月分の設定を用意しとけば…って「あーでも 2 月の月末は 28 日だけじゃなくてうるう年とかどうしよう!!」ってなるんでもうちょっと手の込んだ設定でどうにかしてみましょう
この場合っていうか cron の設定だけでは毎月の月末を判定することはできません なのでコマンド側でその辺をどうにか対処してみます
* * 28-31 * * /usr/bin/test $(/bin/date -d '+1 day' +%d) -eq 1 && コマンド
いきなりややこしい感じになって申し訳ないかんじで(汗
これは月末としてなり得る 28 日 から 31 日にかけて /bin/date に「翌日」を出力させた後に /usr/bin/test でそれが「月初」を意味する「1」であるかを判定して「1」であれば && でくっつけたコマンドを実行するって意味になります
cron 内での使用に限った話じゃないけど…この && でコマンドを並べると「直前のコマンドが正常終了した場合に次のコマンドを実行」って動作をします 例えば Web サイトの証明書の更新コマンドを実行して…それが成功して更新コマンドが正常終了した時のみ Web サーバを再起動するなんて処理を 1 行にまとめて書けるんで便利だと思います
:
そんな感じの複雑な判定を求められるスケジュール設定っていうか…少し特別動作をする「曜日」の設定についての注意事項を少々
例えば「13 日の金曜日の 0 時 0 分にコマンドを実行」なんてありがちなスケジュール設定をしたいと思いました
0 0 13 * fri コマンド
これでバッチリだぜ!!(>_<)wって思いたい所ですが…これでは思った動作をしません
これだと「毎月の 13 日」と「毎月の金曜日」の両方でコマンドが実行されてしまします
何となくこれまで見てきた cron の動作的に「設定した項目の全てに合致した AND 的な動作」を期待しがちなんだけど…「日の設定」と「曜日の設定」に関しては「どちらか一方でも合致したら動く OR 的な動作」になってしまうようです ※ただし「*」での設定は除く
0 0 13 * * /usr/bin/test $(/bin/date +\%w) -eq 5 && コマンド
0 0 * * fri /usr/bin/test $(/bin/date +\%d) -eq 13 && コマンド
そんな 13 日の金曜日を判定するには上記のように設定します
※ 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun
前者は毎月の 13 日に /bin/date を使って曜日を出力させてそれが金曜日かどうかを判定する手法
後者は毎月の金曜日に /bin/date を使って日付を出力させてそれが 13 日かどうかを判定する手法です
後者の手法は「毎月の金曜日」って感じで月に 4〜5 回ほど動作することになって無駄が多いんで…この場合は前者の「毎月の 13 日」って設定の方が好ましいと思います
:
あと cron の設定でミスりやすい点と云うかコマンドや入出力に使用するファイルへのパスですかね
コマンドというかスクリプトを作ってる時にありがちなんだけど…どこかのフォルダをカレントディレクトリに設定してスクリプトをテストしていて「できた!さぁ cron に設定しよう!」ってしたら思った動作をしない時があるんですよね
これは cron が実行するカレントディレクトリが往々にしてテストしていたフォルダと違う事により指定したファイルを読めない・書けないって事が原因にあるようです
なので cron で実行されるコマンド(スクリプト)はフルパスで指定して…かつ読み書きするファイルなどもフルパスで設定する必要があります うっかりしてるとやらかしがちなミスなんで注意していきタイネ!
※なお今回紹介した /usr/bin/test と /bin/date のパスは我が家でのもので…環境によって違う場合があるので事前に which コマンド等で調べてから使用してください #[Raspberry Pi] #コマンドヘルプ #cron
Tweet ⌚ 2021年12月11日(土) 08:07:38 情報 <3967文字>
ラズパイの Apache で CPU 情報を取得する vcgencmd が CGI で動かない問題を解決する
Raspberry Pi 4 (ラズパイ) に CPU のクロック周波数や温度やらを取得する vcgencmd なるコマンドが用意されています
CPU などなどのクロック周波数を表示
for src in arm core h264 isp v3d uart pwm emmc pixel vec hdmi dpi ; do echo -e "$src:\t$(vcgencmd measure_clock $src)" ; done
CPU の温度を表示
vcgencmd measure_temp
利用可能・不可能なコーデックの表示
for codec in H264 MPG2 WVC1 MPG4 MJPG WMV9 ; do echo -e "$codec:\t$(vcgencmd codec_enabled $codec)" ; done
実行例
その他にもいろいろあるんで…詳しくは 解説ページをご覧ください って感じの vcgencmd コマンドなんですが Apache 上の CGI として実行させようとすると失敗するんでその辺をどうにかしてみます
まぁ結論から云ってしまうと…グループ video に Apache が実行するユーザである www-data が入っていないから動かないって事らしいです
cat /etc/group | grep video
video:x:44:pi
ちなみに Apache が実行するユーザは /etc/apache2/envvars で指定しているようです
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
試しにコマンドラインでユーザを www-data に切り替えて確認してみましょう
sudo su -s /bin/bash www-data
vcgencmd measure_temp
VCHI initialization failed
やはり使えないみたいですね…
それじゃグループ video にユーザ www-data を追加していきましょう まぁコマンド一発なんですが
sudo usermod -aG video www-data
これで追加できます 確認すると…
cat /etc/group | grep video
video:x:44:pi,www-data
グループ video にユーザ www-data が追加されました
それでは再びユーザを www-data に切り替えて確認してみましょう
sudo su -s /bin/bash www-data
vcgencmd measure_temp
temp=28.2'C
ちゃんと使えるようになりました
:
しかし Apache 上の CGI として vcgencmd コマンドを実行しても「VCHI initialization failed」のエラーが出続けます なんで??
いろいろと試していて…まぁはっきりとした理由は不明なんですが Apache を再起動させたらこの問題が解決しました
sudo systemctl restart apache2
これで Apache 上の CGI として vcgencmd コマンドが使えるようになりました 何か別の所に問題があるかもだけど…我が家の環境ではこの手法で解決できました
そんな操作の過程のスクリーンショットをぺたり
※参考資料 グループからユーザを削除するには…
トラブルの解決中っていうか…いろいろやってて勢い余って必要のないユーザをグループに追加しちゃった!(>_<)qって時なんかにグループからユーザを削除する場合には以下のようにします
例えばグループ video に追加されたユーザ www-data を削除する場合は
sudo gpasswd -d www-data video
こんな感じに操作します 先ほどの usermod の場合とユーザ名とグループ名の指定が逆になってるので注意が必要です なんなら gpasswd -a でグループにユーザを追加することができるらしいんですが…どっちを使うといいんだろうね
:
さてさてそんな vcgencmd を使ってこんな感じで動かしています
その都度都度で PNG 画像を生成しています
Web サーバの処理やら画像の生成などで一時的にクロック高めな感じですがアイドル時は 600MHz くらいになってるようです
そんなこんなで何かの都合でラズパイを再セットアップした際に悩まないようなメモでした #[Raspberry Pi] #Apache #コマンドヘルプ #CGI
Tweet ⌚ 2021年12月5日(日) 05:34:33 情報 <2063文字>
貧者のラーツー・装備品解説
キャンプツーリングは楽しい! 楽しいんだけど…準備したり後片付けしたりがかなり面倒!!って事なんでついつい疎遠になっちゃうっていうかなかなか実行に移せないんだけどそれでもやっぱりお外で何かしたい!って気分をお手軽にどうにかしてプチ・アウトドア気分を満喫できるラーメンツーリング略してラーツーが大好きな感じなんですが「それどんな装備でやってんの??」ってお問い合わせをぼつぼつ頂いたりするんでせっかくなんで解説したいと思います
まぁ安め狙いの装備なんで映えませんが(-_-;)
そんな装備品は100均の巾着袋に収まる感じです
どっか景色のいいお気に入りの場所でお湯を沸かしてカプ麺を作って仕上げに即席コーヒーを楽しむって辺りまで実現できる装備をお安くコンパクトにまとめてみました
中身を広げてみた 更に詳しく解説していきましょう
季節により使わないかもだけど…虫除けスプレーと軍手
アルミ製ぺんぺんの風防と割り箸とスティック型・インスタントコーヒーと水筒です 水筒は 500ml のもので水道水が入ってます
某Dイソーで売ってた 450ml くらい入るらしいデカ目の(たぶん)ステンレス製のマグカップとシリコン製のフタと 98 円以下で買ってくるカプ麺 デカ目のマグカップはそのままコッヘルとして使うっていうかこれでお湯を沸かします フタは少ない燃料でお湯を沸かす際に必須となるので何があっても用意したい感じです
ちなみにカプ麺はこんな感じでマグカップにスタッキングできます スタッキングが可能になるのでカプ麺のサイズ・形状が限定されてしまいますが…まぁこのサイズのカプ麺はお値打ちなんで納得しちゃう!(>_<)w
使用する燃料は「ゲルネン着火剤 25g 8個入り」か「パック燃料 27g 4個入り」です ゲルネン着火剤はホームセンターで見かけることがあります パック燃料は某Dイソーで売ってることがあります 内容量に微妙な違いがあるけど性能的にはどちらも同じ感じかな?ってイメージなんで…その時々の入手性の良いほうを選んでるって感じです
ただこの燃料にそのまま点火すると結構な勢いで燃え盛ってしまうっていうか早々に燃え尽きてしまうので…アルミ箔で周囲と底面を包んで燃焼範囲を制限して持続力を延長できる細工を施しています こうして無駄な放熱を抑制することにより気温 0℃ の環境下でも 500ml の水をギリ沸騰させることができます 夏場とかならそれほど気にすることではないのだけど…真冬だと最高の効率を求めないと沸騰する前に燃え尽きてしまう感じです
そしてコンパクトに収納できるエスビット・ポケットストーブ…のパチものっていうか某Aマゾンで 300 円チョイで買ってきたエスビットと同サイズの固形燃料ストーブです→ https://www.amazon.co.jp/gp/product/B00F... ポーチ付きでした
同等品と思われるエスビット・ポケットストーブっぽいストーブが某Dイソーで売られていたんでコレでもいいかも知れません
最大限の熱効率を得られるように…シーチキン缶をぱっかんした時のフタを折り曲げてセッティングしています 無くてもいいかもだけど…コレがあるとお湯が早く沸くなぁってイメージです
それではコッヘル(マグカップ)に水を 350ml くらい入れてパック燃料に点火してみましょう 点火しづらい時は…パック燃料を仕込んだストーブごと持ち上げてひっくり返すような格好にすると簡単に火が付きます
そしてお湯が沸くまでのこの待ち時間に周囲の自然を満喫しよう! 最高に楽しい時間すぎる!!(>_<)w
ラーツーは楽しい(定型文)
カプ麺にお湯を注いで 3 分待つ間に…食後のコーヒー用っていうか残りの 150ml くらいの水を沸かしておくのを忘れずに!
そんな食後のコーヒーでほっと一息
お家で飲むと心もちイマイチなお味のスティック型・インスタントコーヒーだけど…大自然に囲まれた中で頂くと本当に美味しい!
そんな感じでごちそうさまでした! ゴミなど一切の痕跡を残さないようコンパクトに収納して撤収です
コンパクトさ故っていうか…イスもテーブルも無いんでその辺は現地調達となります でもまぁそれもアリかな!って思っちゃうww
そんなこんなな不要な物を削りに削って必要最小限な装備をできるだけお安く!ってコンセプトでまとめたラーツー装備でした そんなに頑張らなくても楽しめるラーツーがもっと流行るといいですね! 概ね貧乏装備すぎてあ んまり参考にならないかもだけど(汗 #アウトドア
Tweet ⌚ 2021年12月4日(土) 06:21:41 趣味 <1952文字>
Arduino の シリアル通信
Arduino VKLSVAN Pro Micro USB ATmega32U4 (※以下 Arduino と略す)で開発してる際のデバッグとかで「変数がどうなってるのか」を見たくなることはありませんか? 私はあります いやむしろ見ないとやってられません!!(>_<)wって感じなんだけど Arduino にはモニタ出力がありません
なんか LCD ディスプレイとやらを接続すれば文字なんかを表示させられるっぽいけど…接続とか面倒そうだし手が出ないなぁと思ってたけど何やら「シリアル通信」ってので PC と文字のやりとりができるらしいじゃん!? まじか!!
そんなシリアル通信は Arduino IDE から使えるようです
[メニュー] → [ツール] → [シリアルモニタ] と操作するか…
もしくはツールバーにある虫メガネみたいなアイコンを押下すると出てきます
出てきた「シリアルモニタ」はこんな感じです
我が家の環境では「改行コード = LFのみ」で「通信速度 = 9600bps」が初期設定となっていました
通信速度は Arduino 側で設定した速度とシリアルモニタで設定する速度は同じものにしておく必要がある…らしいんですが軽くイジってみた感じでは設定値に関係なく動作しているっぽい感じなんで気にする必要はないのかもしれません
改行コードは Linux 系が「LF」で Mac 系(の昔のやつ?)が「CR」で… Windows 系が「CR+LF」と聞いたことがあるので機種ごとに適切なものに変更しておいたほうがいいの?
ざっくり使ってみた感じでは… Arduino からシリアルモニタに送られてくる場合の改行コードは設定の影響を受けないっぽいです シリアルモニタから Arduino に送信する際に「送信ボタンを押した」もしくは「エンターキーを押した」時に改行コードをどのようにするかの設定となるようです なおここでの解説は改行コードを「LFのみ」に設定してあるものとします
:
それでは早速と言うか Arduino からシリアルモニタに文字を送信してみましょう シリアル通信を開始するには以下のように記述します
Serial.begin(speed) ってやつですね speed は BPS で… 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 なんかがよく使われがちですがそれ以外の値も指定できるようです ここでの解説では「9600」を使用するとします
その後は Serial.print() や Serial.println() を使ってシリアルモニタに数値や文字列を送信できます Serial.print() は C で云うトコロの sprintf() を意識した作りとなってるようですが…書式を全て解説するのもアレなんでその辺は手を抜いてざっくりサンプルを載せておきます
----------
void setup() {
Serial.begin(9600); // シリアル通信を開始する
}
void loop() {
unsigned long time = millis() / 1000; // 動作時間を秒の単位で取得
String h = String(time / 3600); // 「時」を文字列にして取得
String m = String((time % 3600) / 60); // 「分」を文字列にして取得
String s = String(time % 60); // 「秒」を文字列にして取得
Serial.println(String(h + ":" + m + ":" + s)); // 整形して送信
delay(1000); // 1 秒待って繰り返し
}
----------
これは Arduino が動作開始してからの時間を延々と表示し続けるってものです 動作開始してからの時間をミリ秒で取得できる millis() 関数を使い…そこで得られた変数の値を人の目で確認しやすい(と思われる)「時:分:秒」に整形して表示しています こんな感じで変数の内容を確認できるんでデバッグなどでは大いに助かりますね!
:
シリアルモニタには Arduino に対して文字を送信する機能も備えられています それを Arduino 側から Serial.read() などを使って読み取るわけですが…基本的に「1文字づつ」送られてくる扱いになるようです
例えば「a10Z」と送信すれば「a」と「1」と「0」と「Z」に「設定した改行コード」が加えられて順番に送られてきます
あと文字は「文字コード」として送られてきます 「a」だと「97 (0x61)」となり「1」だと「49 (0x31)」となり「0」だと「48 (0x30)」となり「Z」だと「90 (0x5A)」で…最後に「改行コード(LF)」が「10 (0x0A)」って感じになります
デバッグ時に「ループ回数の変数をプログラム実行中に指定の値に変更したい」とかの場合だとシリアルモニタから送られてきた「文字」を「数値」に変換する必要があります
----------
void setup() {
Serial.begin(9600); // シリアル通信を開始する
}
void loop() {
if (Serial.available() > 0) // 文字(列)が送信されてきた?
{
byte data = (Serial.read()); // 送信されてきた文字を読み込む
if (data >= '0' && data <= '9') { // 文字は数字か?
data = data - '0'; // 文字コードを数値に変換
Serial.print("数字が入力された [" + String(data) + "]\n");
} else {
if (data == 10) { // 改行コードは表示に不都合があるんで
data = 0; // 何も表示しないようにしておく
}
Serial.print("数字以外 [" + String((char)data) + "]\n");
data = 0; // 数字以外は「0」と扱うことにする
}
for (int i=1; i <= data; i++){ // 送信された数値の数だけループしてみる
Serial.print(String(data) + " 回ループの " + String(i) + " 回目\n");
}
}
}
----------
シリアルモニタに適当な適当な文字(列)を入力して「送信」します
送信した文字に「数値」があればその数だけ for() のループ回数を変更します 「数値」以外の文字は処理しないようにしてあります
なお「1文字づつ」送られてくるってのが少々厄介で…「10以上の数値」を扱う場合にはひと工夫必要です どうしたらいいんだろう? 先に送られてきた数値を10倍してそこに新たに送られてきた数値を足すって流れになるのでしょうか ちょっと大掛かりになってくるっていうか面倒なんで今回はスルーしときますが概ねそんな流れになると思います(汗
そんなこんなな Arduino のシリアル通信なお話でした しょーみもっと早く知っとっけばよかった!って思いつつ書いてましたとさ(瀧汗 #Arduino
:
※ 追記 ※
「いやいや Arduino でも sprintf() って使えるじゃん?」ってタレコミを頂いんたんでよくよく調べたらありました(汗 参照している Arduino リファレンス にはその辺が載ってなかったんで…無いものとばっか思ってました
他にも数値かどうか?を判定する isDigit() や改行の判定に使ってたものを isPrintable() に置き換えられるようなものもありました
上で説明してる数値を変数に代入して云々…で書いてるものもこんな感じでできそうです
if (data >= '0' && data <= '9') { // 文字は数字か?
↓
if (isDigit(data)) { // 文字は数字か?
----
if (data == 10) { // 改行コードは表示に不都合があるんで
↓
if (!isPrintable(data)) { // 改行コード等は表示に不都合があるんで
いやはや勉強になりました! 興味本位でなんとなく始めた Arduino ってことでまだまだ知らないことだらけなんで…こうして知識が広がっていくのは楽しいです どもありがとございました!(>_<)w