でんげき☆ Network Service

Raspberry Pi 4 で運用実験中 Connect checker

ユーザ「猫山ぽるか」の投稿38件]3ページ目)

2022年1月 この範囲を時系列順で読む

吉野家・豚生姜焼き丼

20220123055712-admin.jpg
 
生姜の刺激的な味がとにかく効いてる 吉野家豚生姜焼き丼 を食べてきました
生姜の風味がたっぷり味わえる生姜焼きが丼でお手軽に頂けちゃう! そこに更におろし生姜まで載っててイイネ! 寒い時期にうれしい身体がポカポカ温まる美味しさです
大きめカットの白ネギの風味もアクセントとなり最後まで飽きること無く楽しめる!

定番メニューなのか季節限定メニューなのかはちょっとよく判らない感じですが…冬に嬉しいお味なんでまた早いうちに食べに行きたいです! #外食記録

日記 <243文字>

かつや・デミチキンカツ丼

20220116101003-admin.jpg
 
かつや の期間限定! 濃厚デミグラスソースにチーズのコクがたまらない デミチキンカツ丼 を食べてきました
オーダーして…厨房から漂ってくるデミグラスソースの香りからして気分が盛り上がってきます そして丼を覆い隠さんばかりのチキンカツが 2 枚! そこに豚肉たっぷりなデミソースがかかっています!

最初はデミソースがかかってないサックリした部分のチキンカツから楽しみ…お次はデミソースがかかったしっとりした衣を楽しむ流れがイイネ!
たっぷり豚肉も食べ応えあってたまりません! もちろん刻みキャベツも入っているし飽きること無く最後まで楽しめます
いやむしろ具だくさんすぎてご飯とのペース配分が困難すぎますねw これは丼より…ちょっと奮発して定食にしたほうが余すとこなく味わえるのかなーって思いました

期間限定なのが惜しい逸品です! また近いうちに食べに行きたいです #外食記録

日記 <404文字>

Windows の BAT ファイルで CGI しよう

20220103162756-admin.png
 
ぺけぽんっていうか 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 だったりするので注意する必要があります

202201031627564-admin.png
なお我が家の Microsoft Windows [Version 10.0.19042.1348] に付属のメモ帳ではデフォルト文字コードが UTF-8 だったようですが…いつの間にかメモ帳も進化したのか保存時に文字コードを選択できるようになってました ちなみに ANSI ってやつが Shift-JIS っぽいですね

つーかそもそもコマンドプロンプトで使用する文字コードが Shift-JIS (ANSI) だって保証がどこにも無いみたいです 我が家は(たぶん)何も設定していないので Shift-JIS (ANSI) になってましたが…これを他の文字コードに設定することも可能のようです

202201031627563-admin.png
単に現在の文字コードを確認するだけなら「コマンドプロンプト」のタイトルバーを右クリックして「プロパティ」を参照するといいでしょう
もし他の文字コードに変更したい場合は chcp コマンドを使います 単に chcp とした場合には現在の設定値を表示します 変更したい場合は chcp 番号 という感じで番号を指定します 代表的なものだと「ANSI/OEM 日本語;日本語 (shift-jis) が 932」で「EUC 日本語が 51932」で「Unicode (UTF-8) が 65001」となるようです この辺の コードページ識別子の一覧 が公式(?)にあったんで参考になるかも? ちなみになんか面倒くさそうだったんで実際に変更して試してないんで今後は Shift-JIS (ANSI) で話を進めます(瀧汗

  :

さて…その辺の注意事項もろもろを無事にクリアしたところで実際に BAT ファイルを CGI として動かしてみましょう

202201031627561-admin.png 202201031627562-admin.png
とりあえず 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

----------

202201031627569-admin.png
正しく動作すればこんな感じの内容がブラウザに表示されます
今回は単純なテキストを表示するのに適した「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^>

----------

202201031627568-admin.png
正しく動作すればこんな感じの内容がブラウザに表示されます 何度かロリードして試してみたってイメージで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 と同じフォルダ内に用意しておいてください
img_asa.png img_hiru.png img_yoru.png img_shinya.png
※画像は いらすとや さんから拝借しました いつもありがとございます

202201031627567-admin.png
今度は少し変わり種っていうか…正しく動作すればこんな感じの内容がブラウザに表示されます(表示は時間帯によって変化します)
今回は 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

----------

202201031627566-admin.png
これで「アクセス日時」「引数」「相手ホスト名(相手IPアドレス)」「ブラウザ名」がログとして記録されるようになります

202201031627565-admin.png
たったこれだけの仕組みで「単に 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 の設定から
202201101418043-admin.png 202201101418042-admin.png
「CGI」の設定で「起動ごとに新しいコンソールを使用する」を「True」にする

202201101418041-admin.png
「ハンドラー マッピング」の設定で「マネージハンドラーの追加」をして

20220110141804-admin.png
「要求パス」に「*.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

情報 <11014文字>

スガキヤ・味噌ラーメン

20220102175047-admin.jpg
 
我らが スガキヤ の新メニューに 味噌ラーメン が登場したんで食べてきました
伝統の豚骨スープに味噌を加えたって感じでしょうか 食べ慣れた味に味噌のコッテリ感が加わって美味しいですね!
そこに別添のバターを入れて更にまろやかさがアップ! モヤシとコーンの相性も抜群ですね

名古屋の血液と云いますか…豚骨スープな白血球に味噌の赤血球が加わったって感じで身も心も癒やされるww
スガキヤ的にはちょっとお値段高めですが…いやいやこれはまた食べに行きたくなるお味です! おすすめです! #外食記録

日記 <260文字>

2021年12月 この範囲を時系列順で読む

粉もん屋 八・たこ焼ハイボール酒場 近鉄蟹江駅前店

202112261439041-admin.jpg
 
最寄り駅の構内粉もん屋 八・たこ焼ハイボール酒場 が出来てたんで早速行ってみました
パッと見…駅前のたこ焼き屋さんな感じなんだけど「たこ焼ハイボール酒場」の名前の通り店内で呑めましたw

20211226143904-admin.jpg
店内には狭めのカウンターで 3 席用意されていました
そんな訳でなんで…せっかくなんで醤油たこ焼きとソースたこ焼きとビームハイボールを頂きます!(>_<)w

表面はサクサク感を演出しつつ中はトロットロの熱々のたこ焼きが美味い!
なんか粉かつおをどうにか薄く固めたような不思議なかつお節もイケてますね!

醤油とソースの食べ比べでは…圧倒的に醤油が美味しいですね
まだまだ他にも多彩なテイストが用意されているんでそっちも試してみたいと思いました

関西系の方言が色濃い感じの気さくな店員さんの対応もいい感じですね
午前 11 時から呑み始められるスピーディーなのも評価高いです! また食べに行きたいです!!(>_<)w #外食記録

日記 <442文字>

吉野家・カリガリ肉だく牛カレー

20211219154416-admin.jpg
 
毎日の日記って程の頻度じゃないかもだけど…日記的な使い方として外食の記録を残していこうと思いました
そんな訳で第1回目は 吉野家カリガリ肉だく牛カレー です
「カリカリ」でも「ガリガリ」でもなく…「カリガリ」って一体なんなの?って思ってたんだけどなんか カリガリカレー ってお店が監修して カリガリ監修の吉野家カレー として出てきたものらしい?

そんな カリガリ肉だく牛カレー のお味は…薬膳っぽいスパイスっていうの? なんとなく漠然とそんな雰囲気の味がほんのり効いてて身体に良さそうな美味しさでした
ちょっと贅沢して肉だくにしたんだけど…しょーみ牛丼の具的なものと薬膳っぽいスパイスのカレーはベストマッチではないかなーって印象でした
純粋に標準状態の カリガリ牛カレー として頂くのがベストなのかな?って思ったりしていました
ちょっと不満点っぽいことを書いちゃってるけど…とても満足な美味しさでした! また食べに行きたいです!!(>_<)w #外食記録

日記 <450文字>

スケジュール実行 cron は 13 日の金曜日の夢を見るか?

20211211080738-admin.png
 
「〇〇〇〇は△△△△の夢を見るか?」ってフレーズを見かけるとなんかえっちな気分になっちゃう!って光栄マイコンシステムのストロベリーなんとか世代のひいおじいちゃんが云ってたけど…自称:ゆとりのない平成のゆとり的なオレ様的にはしょーみなンてるんか全く意味わかんないです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

情報 <3967文字>

ラズパイの Apache で CPU 情報を取得する vcgencmd が CGI で動かない問題を解決する

20211205061157-admin.png
 
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

20211205053433-admin.png
実行例

その他にもいろいろあるんで…詳しくは 解説ページをご覧ください って感じの 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 コマンドが使えるようになりました 何か別の所に問題があるかもだけど…我が家の環境ではこの手法で解決できました

202112050534331-admin.png
そんな操作の過程のスクリーンショットをぺたり 改竄の余地のないよう作業の過程を全て収録してあります

※参考資料 グループからユーザを削除するには…
トラブルの解決中っていうか…いろいろやってて勢い余って必要のないユーザをグループに追加しちゃった!(>_<)qって時なんかにグループからユーザを削除する場合には以下のようにします
例えばグループ video に追加されたユーザ www-data を削除する場合は
sudo gpasswd -d www-data video
こんな感じに操作します 先ほどの usermod の場合とユーザ名とグループ名の指定が逆になってるので注意が必要です なんなら gpasswd -a でグループにユーザを追加することができるらしいんですが…どっちを使うといいんだろうね

  :

さてさてそんな vcgencmd を使ってこんな感じで動かしています
 (キャプション自動取得対象外) その都度都度で PNG 画像を生成しています
Web サーバの処理やら画像の生成などで一時的にクロック高めな感じですがアイドル時は 600MHz くらいになってるようです
そんなこんなで何かの都合でラズパイを再セットアップした際に悩まないようなメモでした #[Raspberry Pi] #Apache #コマンドヘルプ #CGI

情報 <2063文字>

貧者のラーツー・装備品解説

20211204062141-admin.png
 
キャンプツーリングは楽しい! 楽しいんだけど…準備したり後片付けしたりがかなり面倒!!って事なんでついつい疎遠になっちゃうっていうかなかなか実行に移せないんだけどそれでもやっぱりお外で何かしたい!って気分をお手軽にどうにかしてプチ・アウトドア気分を満喫できるラーメンツーリング略してラーツーが大好きな感じなんですが「それどんな装備でやってんの??」ってお問い合わせをぼつぼつ頂いたりするんでせっかくなんで解説したいと思います
まぁ安め狙いの装備なんで映えませんが(-_-;)

2021120406214115-admin.jpg
そんな装備品は100均の巾着袋に収まる感じです
どっか景色のいいお気に入りの場所でお湯を沸かしてカプ麺を作って仕上げに即席コーヒーを楽しむって辺りまで実現できる装備をお安くコンパクトにまとめてみました

2021120406214114-admin.jpg
中身を広げてみた 更に詳しく解説していきましょう

2021120406214113-admin.jpg
季節により使わないかもだけど…虫除けスプレーと軍手

2021120406214112-admin.jpg
アルミ製ぺんぺんの風防と割り箸とスティック型・インスタントコーヒーと水筒です 水筒は 500ml のもので水道水が入ってます

2021120406214111-admin.jpg
某Dイソーで売ってた 450ml くらい入るらしいデカ目の(たぶん)ステンレス製のマグカップとシリコン製のフタと 98 円以下で買ってくるカプ麺 デカ目のマグカップはそのままコッヘルとして使うっていうかこれでお湯を沸かします フタは少ない燃料でお湯を沸かす際に必須となるので何があっても用意したい感じです

2021120406214110-admin.jpg
ちなみにカプ麺はこんな感じでマグカップにスタッキングできます スタッキングが可能になるのでカプ麺のサイズ・形状が限定されてしまいますが…まぁこのサイズのカプ麺はお値打ちなんで納得しちゃう!(>_<)w

202112040621419-admin.jpg
使用する燃料は「ゲルネン着火剤 25g 8個入り」か「パック燃料 27g 4個入り」です ゲルネン着火剤はホームセンターで見かけることがあります パック燃料は某Dイソーで売ってることがあります 内容量に微妙な違いがあるけど性能的にはどちらも同じ感じかな?ってイメージなんで…その時々の入手性の良いほうを選んでるって感じです

202112040621418-admin.jpg 202112040621417-admin.jpg
ただこの燃料にそのまま点火すると結構な勢いで燃え盛ってしまうっていうか早々に燃え尽きてしまうので…アルミ箔で周囲と底面を包んで燃焼範囲を制限して持続力を延長できる細工を施しています こうして無駄な放熱を抑制することにより気温 0℃ の環境下でも 500ml の水をギリ沸騰させることができます 夏場とかならそれほど気にすることではないのだけど…真冬だと最高の効率を求めないと沸騰する前に燃え尽きてしまう感じです

202112040621416-admin.jpg 202112040621411-admin.jpeg
そしてコンパクトに収納できるエスビット・ポケットストーブ…のパチものっていうか某Aマゾンで 300 円チョイで買ってきたエスビットと同サイズの固形燃料ストーブです→ https://www.amazon.co.jp/gp/product/B00F... ポーチ付きでした
同等品と思われるエスビット・ポケットストーブっぽいストーブが某Dイソーで売られていたんでコレでもいいかも知れません

202112040621415-admin.jpg 202112040621414-admin.jpg
最大限の熱効率を得られるように…シーチキン缶をぱっかんした時のフタを折り曲げてセッティングしています 無くてもいいかもだけど…コレがあるとお湯が早く沸くなぁってイメージです

202112040621413-admin.jpg
それではコッヘル(マグカップ)に水を 350ml くらい入れてパック燃料に点火してみましょう 点火しづらい時は…パック燃料を仕込んだストーブごと持ち上げてひっくり返すような格好にすると簡単に火が付きます
そしてお湯が沸くまでのこの待ち時間に周囲の自然を満喫しよう! 最高に楽しい時間すぎる!!(>_<)w

202112040621412-admin.jpg
ラーツーは楽しい(定型文)
カプ麺にお湯を注いで 3 分待つ間に…食後のコーヒー用っていうか残りの 150ml くらいの水を沸かしておくのを忘れずに!

202112040621411-admin.jpg
そんな食後のコーヒーでほっと一息
お家で飲むと心もちイマイチなお味のスティック型・インスタントコーヒーだけど…大自然に囲まれた中で頂くと本当に美味しい!

20211204062141-admin.jpg
そんな感じでごちそうさまでした! ゴミなど一切の痕跡を残さないようコンパクトに収納して撤収です

20211204062141-admin.jpeg
コンパクトさ故っていうか…イスもテーブルも無いんでその辺は現地調達となります でもまぁそれもアリかな!って思っちゃうww

そんなこんなな不要な物を削りに削って必要最小限な装備をできるだけお安く!ってコンセプトでまとめたラーツー装備でした そんなに頑張らなくても楽しめるラーツーがもっと流行るといいですね! 概ね貧乏装備すぎてあ んまり参考にならないかもだけど(汗 #アウトドア

趣味 <1952文字>

2021年11月 この範囲を時系列順で読む

Perl の GD::Simple モジュールでフォントを指定したりしてみるメモ

20211203182031-admin.png
 
初期のインターネットっていうか Web サイト黎明期の CGI と云えば Perl でキマリ!!って時代もありましたよね…って感じすらすっかり忘れ去られたかのように近年では全く話題にもならない Perl ですが「三つ子の魂百まで」なのか何なのかあまりにも手に馴染みすぎてついつい使っちゃうって事はありませんか? 私はあります いやむしろ未だに他の言語が使えず Perl にどっぷりなんです悪いか!!(-_-#)って事なのか何なのかそんな忘れ去られつつある言語である Perl と…その Perl で画像を扱う GD ライブラリの(主に文字フォント系の)使い方を少しばかり探求してみたかなりニッチな需要的な忘れ物防止メモです

そんな Perl の GD ライブラリですが…以下のようにコマンド一発で簡単にインストールできます
sudo apt install libgd-perl
依存関係とか詳しく調べてないんでアレだけど…ちょっと見た感じでは我が家の環境にいつの間にか libgd-text-perl なんてのも入っていたんで文字フォントの扱いに不具合が発生した時には sudo apt install libgd-text-perl してみるのもいいかもです(汗

あーあと標準的な Raspberry Pi OS のセットアップではゴシック書体の日本語フォントしか入ってないっぽい? 後に説明するけど…フォント名に Sans とだけ付いてるフォントは概ねゴシック書体です 明朝書体には Serif と付くらしいんだけどラズパイにはそれが入ってないみたい?なんで…後の動作確認しやすいように明朝書体が含まれる程よいフォントを追加でインストールしておきます
sudo apt install fonts-ipaexfont
日本語フォントファイルってのはそれなりに容量が大きいんで…少容量 microSD とかで運用してる方などには要注意かもですがまぁその辺はうまいことどうにかしてやってください(瀧汗

※ 追記 ※
Google の「No more 豆腐」と呼ばれるフォントのインストール方法
sudo apt install fonts-noto-cjk
中国語(C)と日本語(J)と韓国語(K)が一緒くたに入っちゃう感じっぽいです

そんな下準備が済んだトコロで…現在システムに入ってるフォントの一覧を取得する方法です それには fc-list ってコマンドを使うんだけど…日本語に非対応なフォントとかも羅列されて心もち見づらいんでその辺を絞り込んで表示させてみましょう
fc-list :lang=ja | sort | uniq
sort と uniq は並べ替えてダブり行を除去してくれるんで見やすくなると思います
ここで表示される内容は…フォントのパス付きファイル名とフォントファミリー名とスタイルです 後に説明する GD のフォント指定で…何となくフォントのパス付きファイル名で指定してたんだけどそれではダメでデフォルトのフォントが使用され続けてて悩んでたんだけどどうやら「フォントファミリー名:スタイル」で指定するといいって事を突き止めたんで
fc-list -f '%{family}:%{style}\n' :lang=ja | sort | uniq
このようなオプション指定で実行するといいと思います

実行すると(環境によって違うと思うけど)こんな感じの一覧が出ます
Droid Sans Fallback:Regular
IPAexゴシック,IPAexGothic:Regular
IPAex明朝,IPAexMincho:Regular
Noto Sans CJK JP,Noto Sans CJK JP Black:Black,Regular
Noto Sans CJK JP,Noto Sans CJK JP Bold:Bold,Regular
Noto Sans CJK JP,Noto Sans CJK JP DemiLight:DemiLight,Regular
Noto Sans CJK JP,Noto Sans CJK JP Light:Light,Regular
Noto Sans CJK JP,Noto Sans CJK JP Medium:Medium,Regular
Noto Sans CJK JP,Noto Sans CJK JP Regular:Regular
Noto Sans CJK JP,Noto Sans CJK JP Thin:Thin,Regular
Noto Sans CJK KR,Noto Sans CJK KR Black:Black,Regular
---- 中略 ----
この中から使いたいフォントの行をコピーして後の GD のフォント指定に使用するといい感じに使えるようです そして今後は「IPAex明朝,IPAexMincho:Regular」を使って話を進めていきます

それでは早速その辺を使ったサンプルを作ってみますかね

----------

#!/usr/bin/perl
use GD::Simple;

$img_obj = GD::Simple->new(500, 500);

$img_obj->font('IPAex明朝,IPAexMincho:Regular'); # フォント
#$img_obj->font('/usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf'); # このフォント指定じゃダメみたい
$img_obj->fgcolor('red'); # 文字色
$img_obj->fontsize(30); # フォントサイズ
$img_obj->moveTo(20, 100); # 始点 x, y
$img_obj->string("日本語フォント表示\nRaspberry Pi\n1234567890"); # 文字列(最後に記述)

# ファイルへ出力
#open(IMG, "> gd_out1.gif"); # GIF で出力
#open(IMG, "> gd_out1.jpg"); # JPEG で出力
open(IMG, "> gd_out1.png"); # PNG で出力
binmode IMG; # バイナリ・ストリームへ書き込む
#print IMG $img_obj->gif(); # GIF で出力
#print IMG $img_obj->jpeg(100); # JPEG (品質:0〜100) で出力
print IMG $img_obj->png(); # PNG で出力
close(IMG);

----------

実行すると以下のような感じの画像が生成されると思います
20211120103516-admin.png
今回は PNG で保存してみましたが GIF や JPEG でも保存できます 「ファイルへ出力」の辺りのコメントアウトしてある部分で切り替えられるんで試してみてください

  :

そんな Perl で画像を生成するって話だと…既存の画像を読み込んで文字とかを描き込んで使いたい場合があると思います そんな時には以下のように指定します
gd_test2.gif gd_test2.jpg gd_test2.png
[サンプル画像]

----------

#!/usr/bin/perl
use GD::Simple;

#$img_obj = GD::Simple->newFromGif("./gd_test2.gif"); # GIF 画像の時
#$img_obj = GD::Simple->newFromJpeg("./gd_test2.jpg", 1); # JPEG 画像の時 最後の「1」は True Color のフラグ?(未解明)
$img_obj = GD::Simple->newFromPng("./gd_test2.png", 1); # PNG 画像の時 最後の「1」は True Color のフラグ?(未解明)

$img_obj->font('IPAex明朝,IPAexMincho:Regular'); # フォント
$img_obj->fgcolor('red'); # 文字色
$img_obj->fontsize(30); # フォントサイズ
$img_obj->moveTo(20, 100); # 始点 x, y
$img_obj->string("日本語フォント表示\nRaspberry Pi\n1234567890"); # 文字列(最後に記述)

# ファイルへ出力
#open(IMG, "> gd_out1.gif"); # GIF で出力
#open(IMG, "> gd_out1.jpg"); # JPEG で出力
open(IMG, "> gd_out1.png"); # PNG で出力
binmode IMG; # バイナリ・ストリームへ書き込む
#print IMG $img_obj->gif(); # GIF で出力
#print IMG $img_obj->jpeg(100); # JPEG (品質:0〜100) で出力
print IMG $img_obj->png(); # PNG で出力
close(IMG);

----------

実行すると以下のように読み込んだ画像の上に文字を描き込んだ画像が出力されます
202111201035162-admin.png
ちゃんと文字が描き込まれていますね なお色数の多い JPEG と PNG は True Color フラグとなる「1」を指定しておかないと色が正しく再現されないような感じでした

  :

お次は複数の画像を読み込んで 1 枚の画像に合成するってのをやってみます
gd_test2.gif gd_test2.jpg gd_test2.png
[サンプル画像]

----------

#!/usr/bin/perl
use GD::Simple;

$img_obj = GD::Simple->new(500, 500, 1); # 最後の「1」は True Color のフラグ?(未解明)

$img_gif = GD::Image->newFromGif("./gd_test2.gif"); # GIF 画像の時
$img_jpg = GD::Image->newFromJpeg("./gd_test2.jpg", 1); # JPEG 画像の時 最後の「1」は True Color のフラグ?(未解明)
$img_png = GD::Image->newFromPng("./gd_test2.png", 1); # PNG 画像の時 最後の「1」は True Color のフラグ?(未解明)

# 参考までに…読み込んだ画像の簡易な情報を表示
($width, $height) = $img_gif->getBounds();
$is_truecolor = $img_gif->isTrueColor();
print "GIF:[$width][$height][$is_truecolor]\n";
($width, $height) = $img_jpg->getBounds();
$is_truecolor = $img_jpg->isTrueColor();
print "JPG:[$width][$height][$is_truecolor]\n";
($width, $height) = $img_png->getBounds();
$is_truecolor = $img_png->isTrueColor();
print "PNG:[$width][$height][$is_truecolor]\n";

# コピー元オブジェクト, コピー先X座標, コピー先Y座標, コピー元X座標, コピー元Y座標, 横サイズ, 縦サイズ
$img_obj->copy($img_gif, 0, 150, 200, 140, 200, 200); # GIF 画像をコピーする
$img_obj->copy($img_jpg, 180, 280, 240, 135, 200, 200); # JPEG 画像をコピーする
$img_obj->copy($img_png, 300, 100, 140, 140, 200, 200); # PNG 画像をコピーする

$img_obj->font('IPAex明朝,IPAexMincho:Regular'); # フォント
$img_obj->fgcolor('red'); # 文字色
$img_obj->fontsize(30); # フォントサイズ
$img_obj->moveTo(20, 100); # 始点 x, y
$img_obj->string("日本語フォント表示\nRaspberry Pi\n1234567890"); # 文字列(最後に記述)

# ファイルへ出力
#open(IMG, "> gd_out1.gif"); # GIF で出力
#open(IMG, "> gd_out1.jpg"); # JPEG で出力
open(IMG, "> gd_out1.png"); # PNG で出力
binmode IMG; # バイナリ・ストリームへ書き込む
#print IMG $img_obj->gif(); # GIF で出力
#print IMG $img_obj->jpeg(100); # JPEG (品質:0〜100) で出力
print IMG $img_obj->png(); # PNG で出力
close(IMG);

----------

実行すると以下のように読み込んだ画像の指定範囲を切り抜き合成してその上に文字を描き込んだ画像が出力されます
202111201035161-admin.png
なお画像の copy にはパラメータを全て指定する必要があるようです ちょっと面倒ですね(-_-;) 今回は指定範囲を切り抜くような形でコピーしたけど…サイズが不定な画像を読み込んだ際に正しく範囲指定できるように読み込んだ画像サイズを取得できる getBounds ってのも使っているので参考までに

なお既存のファイルを読み込む際に newFromGif や newFromJpeg や newFromPng といった感じに予め画像フォーマットを知っておく必要があるようです しかしざっと調べた感じでは GD で画像フォーマットを調べる術がないようなんで…ちょっと困りますね
そこで標準的に用意されている file コマンドを使って画像フォーマットを調べるサンプルを即興で用意してみました

----------

#!/usr/bin/perl

$cmd = 'file -b -i'; # file コマンドを使う
$file = './gd_test2.gif'; # 画像ファイル名 [GIF]
#$file = './gd_test2.jpg'; # 画像ファイル名 [JPEG]
#$file = './gd_test2.png'; # 画像ファイル名 [PNG]

chomp($res = `$cmd $file`); # コマンドを実行して出力を取り込む
if ($?) { die "Command error:"; } # 何らかのエラーが発生
print "$res\n"; # コマンドを実行した出力はこんな感じ

if ($res =~ /^cannot open/) { # file コマンドが何らかのエラーを返した
  print "File error: $file\n";
} elsif ($res =~ /^image\/gif;/) { # GIF ファイルらしい
  print "[\$img_obj = GD::Simple->newFromGif(\"$file\"); を使う]\n";
} elsif ($res =~ /^image\/jpeg;/) { # JPEG ファイルらしい
  print "[\$img_obj = GD::Simple->newFromJpeg(\"$file\"); を使う]\n";
} elsif ($res =~ /^image\/png;/) { # PNG ファイルらしい
  print "[\$img_obj = GD::Simple->newFromPng(\"$file\"); を使う]\n";
} else { # それ以外のファイルっぽい
  print "扱えないファイルです(-_-;)\n";
}

----------

file コマンドについて詳しく調べてないんでアレなんだけど…これで概ね画像フォーマットを特定できると思います この辺ちょっと面倒ですね(-_-;)

まぁそんなこなんで時既に情報が古すぎて調べられない GD::Simple のアレこれをまとめてみました この GD::Simple は…その昔の N88-Disk Basic の LINE 文や CIRCLE 文とかでお絵描きしてた頃のようなシンプルな操作で作画できて懐かしく思ったりしながら愛用しています しょーみこれを今さらわざわざ使おうって思う人も居ないかなーって思いつつ今後の参考ってことで残しておきます 長々とお疲れさまでした! #[Raspberry Pi] #Perl

情報 <7610文字>

DASHBOARD

■全文検索:

複合検索窓に切り替える

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■ハッシュタグ:

■カテゴリ:

■日付検索:

■機器状態:

Raspberry Pi 4 Status

編集

RSSフィード