でんげき☆ Network Service

Raspberry Pi 4 で運用実験中 Connect checker

No.9, No.8, No.7, No.6, No.5, No.4, No.37件]

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文字>

Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう!

20211203181404-admin.jpeg
 
前回に引き続き Arduino 的な諸々をひとつって事で…マルチメディア・キーボードって云うんですかね?
20211114113829-admin.png
+α的に実装されている音量調節などのキーとかノート PC でよく見かける Fn キーと併用して使える再生とか早送りなどのキーを ATmega32U4 を搭載した Arduino Leonardo (Pro Micro) でどうにかしてみるお話です

そんな今回の実験の様子
202111141138293-admin.jpeg
以前のマウスクリック超連射実験の回路がくっついたままなんで判りにくいですよね…

202111141138291-admin.png
申し訳程度に回路図を描いてみたけど…それでも判りづらいですよね(汗 まぁとにかく 2 番ピンと 3 番ピンを使用しました

今回のマルチメディア・キーボード(?)的な機能を簡単に実装するためにライブラリを追加してみました
202111141138292-admin.jpeg
Arduino IDE で [スケッチ] → [ライブラリをインクルード] → [ライブラリ管理] してライブラリ管理画面を出す

202111141138291-admin.jpeg
目的のライブラリを「hid」ってキーワードで検索して…出てきた「HID-Project」をインストールする ※画面は既にインストール済みだけどまぁそんな感じで(汗

後は Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます

----------

// include the HID library
#include "HID-Project.h" // 今回インストールしたやつをインクルードする

// definitions for each pin used
const int pinLed = LED_BUILTIN;
const int playButton = 2; // 今回使うピン番号
const int fwdButton = 3; // 今回使うピン番号
const int backButton = 4; // 以下今回は使わない(-_-;)
const int volUpButton = 5;
const int volDwnButton = 6;
const int muteButton = 7;


void setup() {
  // define the pin mode for each pin used
  pinMode(pinLed, OUTPUT);
  pinMode(playButton, INPUT_PULLUP); // 今回使うピン番号
  pinMode(fwdButton, INPUT_PULLUP); // 今回使うピン番号
  pinMode(backButton, INPUT_PULLUP); // 以下今回は使わない(-_-;)
  pinMode(volUpButton, INPUT_PULLUP);
  pinMode(volDwnButton, INPUT_PULLUP);
  pinMode(muteButton, INPUT_PULLUP);

  // begin HID connection
  Consumer.begin();
}

void loop() {
  if (!digitalRead(playButton)) {
    digitalWrite(pinLed, HIGH); // turn on LED
    Consumer.write(MEDIA_PLAY_PAUSE); // 一時停止・再生的なコマンド
    delay(500); // 動作確認用の LED 点滅
    digitalWrite(pinLed, LOW); // turn off LED
  }
  
  if (!digitalRead(fwdButton)) {
    digitalWrite(pinLed, HIGH);
    Consumer.write(MEDIA_NEXT); // 次の曲的なコマンド
    delay(500); // 動作確認用の LED 点滅
    digitalWrite(pinLed, LOW);
  }
}

----------

20211114113829-admin.jpeg
Ubuntu 20.04.3 LTS と Audacious 3.10.1 で動作チェックしたところ…「再生/一時停止」と「次の曲」の動作をタクトスイッチの押下にて実現できました やったね!

わりと入手しづらいイメージのマルチメディア・キーボード(?)の拡張部分を Arduino Leonardo (Pro Micro) でどうにかできる事が判明しました 後は程よいケースとスイッチを用意すれば完成なんだけど…それはまた後の話ってかんじで

  :

他にも機能があるっていうか…キーコードは Arduino/libraries/HID-Project/src/HID-APIs/ConsumerAPI.h に定義されています ※ファイルの場所は環境によって異なる場合があります

enum ConsumerKeycode : uint16_t {
  // Some keys might only work with linux
  CONSUMER_POWER = 0x30,
  CONSUMER_SLEEP = 0x32,

  MEDIA_RECORD = 0xB2,
  MEDIA_FAST_FORWARD = 0xB3,
  MEDIA_REWIND = 0xB4,
  MEDIA_NEXT = 0xB5,
  MEDIA_PREVIOUS = 0xB6,
  MEDIA_PREV = 0xB6, // Alias
  MEDIA_STOP = 0xB7,
  MEDIA_PLAY_PAUSE = 0xCD,
  MEDIA_PAUSE = 0xB0,

  MEDIA_VOLUME_MUTE = 0xE2,
  MEDIA_VOL_MUTE = 0xE2, // Alias
  MEDIA_VOLUME_UP = 0xE9,
  MEDIA_VOL_UP = 0xE9, // Alias
  MEDIA_VOLUME_DOWN = 0xEA,
  MEDIA_VOL_DOWN = 0xEA, // Alias

  CONSUMER_BRIGHTNESS_UP = 0x006F,
  CONSUMER_BRIGHTNESS_DOWN = 0x0070,

  CONSUMER_SCREENSAVER = 0x19e,

  CONSUMER_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182,
  CONSUMER_CONTROL_CONFIGURATION = 0x183,
  CONSUMER_EMAIL_READER = 0x18A,
  CONSUMER_CALCULATOR = 0x192,
  CONSUMER_EXPLORER = 0x194,

  CONSUMER_BROWSER_HOME = 0x223,
  CONSUMER_BROWSER_BACK = 0x224,
  CONSUMER_BROWSER_FORWARD = 0x225,
  CONSUMER_BROWSER_REFRESH = 0x227,
  CONSUMER_BROWSER_BOOKMARKS = 0x22A,

今回使った MEDIA_PLAY_PAUSEMEDIA_NEXT の他にもいろいろあります 例えば CONSUMER_BROWSER_REFRESH を超連打して…いわゆる F5 アタックを実装するのもいいかもしれません ※やめて!(>_<)q

  :

まぁざっくりこんな感じですかね これを用いてちょっと便利な補助キーボードを作れるとイイナ! #Arduino

情報 <3322文字>

Arduino Leonardo (Pro Micro) でマウスクリック連射装置を作ろう!

20211203180938-admin.jpg
 
ワンボードマイコンっていうか…ここんとこ Arduino が人気沸騰で気になりますよね!って事なんでモノは試しに安っすい VKLSVAN Pro Micro USB ATmega32U4 を買ってぼちぼちイジってみることにしました

202111130723461-admin.jpeg
まぁなんか Arduino にもいろいろあるようで…その中で ATmega32U4 を搭載した Arduino Leonardo と呼ばれるものが HID 機能を搭載しているって事で気になっていました そんな Arduino Leonardo の互換機が今回購入した Pro Micro って感じです
その HID 機能とはなんぞや?って話ですがまぁざっくり PC の標準的なキーボードやマウスを指すようです 要するに USB 接続した Arduino Leonardo (Pro Micro) がキーボードやマウスに化けるって事なんですね
そこで今回は連打系ブラウザゲーとして名高い CookieClicker を超連射できるボタンを実装してみることにしました

20211113072346-admin.jpg
そんな Pro Micro のピン配列図 なんかいろいろ書いてあるけど…単純な On/Off スイッチを付ける場合は  Arduino  と色付けされた 0 から 20 までのピンを使うようです

20211113072346-admin.png
それを今回はこんな感じで 10 番ピンに配線しました
そしてお次はそれを制御するプログラムで…

----------

#define RX_LED 17 // RX LED はポート 17 っぽい?
#define TX_LED 30 // TX LED はポート 30 っぽい?
#define SW 10 // スイッチ用
#include <Mouse.h> // マウス機能を使いたい

void setup() {
  pinMode(SW, INPUT_PULLUP);
  Mouse.begin();
}

void loop() {
  if(!digitalRead(SW)) {
    digitalWrite(TX_LED, LOW); // TX LED を点灯
    //Mouse.click();
    //delay(100);
    Mouse.press(MOUSE_LEFT);
    //delay(17); // 最速
    delay(20);
    Mouse.release(MOUSE_LEFT);
    //delay(9); // 最速
    delay(10);
    digitalWrite(TX_LED, HIGH); // TX LED 消灯
  } else {
    digitalWrite(RX_LED, LOW); // RX LED を点灯
    delay(40);
    digitalWrite(RX_LED, HIGH); // RX LED 消灯
    delay(20);
  }
}

----------

Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます 書き込まれた後に直ちに動作を開始します
スイッチが Off の時には基板上の LED が細かく点滅しています スイッチを On にするとマウスクリックの連射が始まります

マウスのクリックには Mouse.click(); って関数と Mouse.press(); Mouse.release(); とを選べるようです
Mouse.click(); は…いい感じに「押して離す」をまとめて実行できるようです
Mouse.press(); は…ドラッグ操作っていうんですかね この関数を実行するとマウスボタンが押されたままになり Mouse.release(); を実行するとマウスボタンが離されます

どちらの関数をどのようなタイミングで繰り返すかは個々の環境によって違うかと思いますが…
20211113072346-admin.jpeg
我が家の環境では Mouse.press(); Mouse.release(); を使って 1 秒間に 38 連射を記録しました → マウスクリック連射速度テスト
高橋名人もびっくりな超高速連射を実装できて満足しました!

Arduino Leonardo (Pro Micro) の HID 機能は手軽に有用な機能を実装できてなかなか楽しいです またぼちぼちイジっていきたいと思いました #Arduino

情報 <1926文字>

ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3

20211203180402-admin.png
 
・ラズパイとファイルのやり取りしたい
・ラズパイのアプリを PC 上で実行する?

  :

----- ラズパイとファイルのやりとりしたい -----

ファイル共有に samba サーバを建てるほどじゃないんだけど… PC とちょっとしたファイルのやりとりをしたい!って場面はちょくちょくあると思います そんな時は scp コマンドを使うと良いみたいです

使い方
scp [オプション] コピー元 コピー先

オプションはいろいろあるけど…よく使うものを勝手に抜粋(汗
-p 元のファイルの変更時間とアクセス時間およびモードを維持します
-r ディレクトリ全体を再帰的にコピーします

PC からラズパイにファイルを送信する その1
scp ./dir/filename.ext pi@hostname:
PC 上の ./dir/filename.ext ってファイルをラズパイにコピーする この場合…ユーザ pi のホームフォルダ (/home/pi) に filename.ext がコピーされる

ラズパイから PC にファイルを受信する その1
scp pi@hostname:/var/www.html/index.html ./
ラズパイ上の /var/www.html/index.html が PC 上のカレントフォルダに index.html としてコピーされる

PC からラズパイにフォルダを送信する その2
scp -pr ./pic pi@hostname:
PC 上の ./pic ってフォルダとその中身の全てをファイル更新日時・モードを保持したままラズパイにコピーする この場合…ユーザ pi のホームフォルダ (/home/pi) に pic フォルダを作成してコピーする

ラズパイから PC にフォルダを受信する その2
scp -pr pi@hostname:/etc/apache2 ./
ラズパイ上の /etc/apache2 ってフォルダとその中身の全てをファイル更新日時・モードを保持したまま PC に apache2 フォルダを作成してコピーする
※ ただし /etc/apache2 はユーザ pi で読めるけど…逆に書き込もうとすると root 権限が無いんで失敗しますが

hostname は IP アドレスでも OK です ファイル名にはワイルドカードも使えるようです

2018 年 4 月頃のアップデートで Windows 10 に OpenSSH ってのが導入されているらしく…その時に scp コマンドが入ったようです
20211024175230-admin.png
202110241752301-admin.png
試しに使ってみたところちゃんとコピーできたようです

  :

----- ラズパイのアプリを PC 上で実行する? -----

ラズパイ上で動くアプリケーションの画面を PC 上に持ってくることができるようです

使い方
ssh [オプション] pi@hostname

オプションはいろいろあるけど…よく使うものを勝手に抜粋(汗
-Y 信頼できるX11転送を有効にします
-C データ転送を圧縮します

普通に SSH による接続なんですが…ファイルマネージャ (pcmanfm) とかのグラフィカルなアプリケーションの実行画面を PC 上で再現できるようになるようです
SSH でログインした後にコマンドラインに実行したいアプリケーションのコマンドを打ち込み実行します
pcmanfm :ファイルマネージャ
lxtask :タスクマネージャ
lxterminal :LXTerminal
例えば上記のようなコマンドです

20211024175159-admin.png
Ubuntu MATE 上に再現されたラズパイのアプリケーション画面 心もち再現しきれてないものもあるけどご愛嬌かな
ファイルマネージャからイメージビューワなんかを起動するとその画面も PC 上に出てきます
ただしログインしたユーザ権限で動作できるアプリケーションに限るようです
macOS 系ではできたって話を聞いたことがあります Windows 系ではできないかも知れません(汗

そろそろネタが尽きてきたかな…って感じで長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ

  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
  ●ラズパイで Apache2 サーバを建ててゆるい設定をする
  ●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ

情報 <2042文字>

ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2

20211203175809-admin.png
 
・テキストエディタ nano の超基本の使い方
・ユーザを切り替えて root で作業したい
・ラズパイは sudo した時にパスワードを聞かれないのは何故?

  :

----- テキストエディタ nano の超基本の使い方 -----

端末上(LX Terminal等)でテキストファイルを編集するには vi か nano を使うことになるんだけど… vi は操作感が少々特殊でとっつきにくいんでその辺が判りやすい nano を使うことが多いのかな?って事でその nano を初めて使う方向けの超基本の使い方の解説です

コマンド名は nano です 管理者権限で使いたい時は sudo nano って感じで使います
nano もしくは sudo nano とコマンド名のみで起動すると「新規ファイル」の編集として起動します nano 「ファイル名」 とファイル名を付けて起動すると「ファイル名のファイル」を編集します

202110181533153-admin.png
nano とだけ打ち込み起動した状態
よく使う(と思われる)コマンドが下部に記載されています
この中の 「^G ヘルプ」 とか 「^X 終了」 の「^」意味は以下のようになっています

ショートカットキーの記法は以下の通りです。(^)で表記されているショートカットはCtrlキーを押すか、Escキーを二回続けて押すことを表してします。(M-)で表記されているショートカットはAltキーCmdキーEscキーなどのメタキーを押して入力します。
 また、Escキーを二回押した後に000から255までの十進数を入力することで、コードに対応する文字を入力することができます。以下のキーストロークは主なエディタのウィンドウで使用できます。代替のキーストロークは括弧で囲って表記されます。


試しに Ctrl キーを押しながら G キーを押してみましょう
202110181533152-admin.png
nano のヘルプが表示されました
長くて表示しきれてないんでキーボードの ↑ キーと ↓ キーを使ってスクロールさせます
ヘルプの終了は Ctrl キーを押しながら X キーを押します
いっぱいコマンドがあって覚えきれなさそうだけど…実際には「ちょっと編集を」って感じなんで数個のコマンドを使うだけになると思います

そんなよく使うコマンド例

Ctrl + X :nano の終了 ファイルに変更がなければそのまま終了します 変更があれば保存するか破棄するか聞いてきます
Ctrl + O :ファイルの書き込み 新規ファイルとして編集していればファイル名を聞いてきます 既存ファイルを編集していればそのファイル名が表示されそこに保存します
Ctrl + S :ファイルを確認なしで保存する 慣れてくるとこれをよく使います
Ctrl + W :文字列の検索 指定した文字列が見つかればカーソルがその文字列の場所に移動する さらに次の文字列を探す場合には Alt + W もしくは Alt + で…逆向きに探す場合には Alt + Q もしくは Alt + と操作します
Ctrl + / :文字列の置換 探す文字列を指定した後に置き換える文字列を指定します 見つかった時に「1箇所置換」するか「全部を置換」するかを聞いてきます
Alt + # :コメント行の切り替え カーソルがいる行の先頭に # を付ける/付けないを繰り返す わりと便利なんでよく使う

だいたいこんなもんですかね しょーみもっと込み入った編集をしたい時には GUI で操作できる mousepad とかを使ったほうが判りやすくて便利だと思います ただ nano は諸々の設定作業なんかで「使わない訳にはいかない」テキスト・エディタなんで最低限の操作は覚えておきたいものです

  :

----- ユーザを切り替えて root で作業したい -----

サーバの設定をしてる時とかに…いちいち sudo + コマンド ってやるんがめんどくさい!!(-_-#)って時に感情に任せて root にチェンジして作業したいと思ったことはありませんか? 私はたまにあります…って事なんでその辺の話を少々

202110181533155-admin.png
通常はユーザ pi で作業してるんだけどこれをユーザ切り替えの su コマンドを使って管理者 root になろうとするんだけど…認証失敗して root になれません これは root にパスワードが設定されてないんで「パスワードによる認証ができない」ってのが原因のようです

まぁこれを解決するには root にパスワードを設定すればいいんだけど…世間的にはセキュリティ云々の事情で root にパスワードを設定すべきではないって事なんでちょっと躊躇しちゃいますね ※ root にパスワードを設定すると SSH などで root ログインできるようになるんで好ましくないらしいのです

しかしこれが実機の前に居るのであれば別の方法でどうにかできます LXTerminal を sudo で起動してみましょう

202110181533154-admin.png
sudo x-terminal-emulator
無事(?)に root に切り替えることができました
でもまぁ何でもできる管理者 root なんで…くれぐれも慎重な操作をお願いします(汗

※ 追記 ※
別のシェルでログインを試みるって手法をもっと試してみるっていうか…なんか su コマンドにシェルを指定するオプションがあるのに気づいたんでそっちも試してみることにします
sudo su -s /bin/bash root
これで root に切り替えることができました こっちのほうがスマートな操作って感じなのかな

ちなみにオプション指定の違いがあるっていうか…
20211205041659-admin.png
sudo su -s /bin/bash root
sudo su -s /bin/bash - root
「-」オプションを付けない時はコマンドを実行したユーザのホームディレクトリ・環境変数が引き継がれて
「-」オプションを付た時は指定したユーザのホームディレクトリ・環境変数に設定されるようです

※ さらに追記 ※
もうちょっとシンプルにっていうか sudo -isudo susudo su - でもいいみたい
この場合もそれぞれ環境変数の引き継ぎに違いがあったりするようです 使いやすい手法を覚えておきタイネ!

  :

----- ラズパイは sudo した時にパスワードを聞かれないのは何故? -----

Ubuntu などを使っている時に sudo すると…
202110181533151-admin.png
パスワードを聞かれます

20211018153315-admin.png
でも Raspberry Pi OS の sudo だとパスワードを聞かれません これは何故なんでしょう?

まぁ sudo がそう云う設定になってるんですけどね…って事でその設定を見てみましょう sudo の設定内容は sudo cat /etc/sudoers で確認することができます
その中に %sudo ALL=(ALL:ALL) ALL なんて行があります これはグループ sudo に属する全てのユーザが全てのコマンドを実行できるって定義らしいです

それではグループ sudo に誰が属しているのか見てみましょう これは sudo getent group sudo で確認できます おそらく sudo:x:27:pi ってなってると思うんだけど…まぁグループ sudo にユーザ pi が含まれているのが判ります この設定によりユーザ pi が sudo した時に全てのコマンドが使えるって事になるらしいです

ちなみに /etc/sudoers は極めて重要なファイルなんで直接編集しないほうがいいらしいです これを編集するには専用コマンドの sudo visudo を使います なんでも書き込んだ内容に間違いがないか構文チェックして正しければ書き込むって感じになってるらしいです

まぁそれはともかく sudo した時にパスワードを聞かれないって話でしたよね これはさらに細やかな設定ファイルが /etc/sudoers.d/ に入ってるらしいのでそれを sudo cat /etc/sudoers.d/010_pi-nopasswd で確認してみましょう
すると pi ALL=(ALL) NOPASSWD: ALL ってのがあります この NOPASSWD ってのがパスワードを聞かれないための設定らしいです
この /etc/sudoers.d の設定ファイルも直接書き換えるのではなく専用コマンドの sudo visudo -f /etc/sudoers.d/010_pi-nopasswd を使うらしいです

まぁただそれだけの話なんですけどね モヤモヤしてた謎が解けたらイイネ!って感じで長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ

  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
  ●ラズパイで Apache2 サーバを建ててゆるい設定をする
  ●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ

情報 <3977文字>

ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1

20211203174442-admin.jpg
 
・有線 LAN 接続時の固定 IP な設定
・ホストネームの変更
・ファイルマネージャを root 権限で使う
・Raspberry Pi の基盤穴サイズ

  :

----- 有線 LAN 接続時の固定 IP な設定 -----

/etc/dhcpcd.conf を編集
# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1


この部分で設定する 必要な行の先頭の # (コメント記号)を消して有効にして必要な内容に書き換える
以下は設定例(IP アドレスが 192.168.0.80 でゲートウェイ(ホームルータ)アドレスが 192.168.0.100 で Google のパブリック DNS を使用の場合)

# Example static IP configuration:
interface eth0
static ip_address=192.168.0.80/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.0.100
static domain_name_servers=8.8.8.8 8.8.4.4

ファイル保存後に OS を再起動することにより有効になる

  :

----- ホストネームの変更 -----

/etc/hostname を編集
標準状態で raspberrypi が設定されているのでそれを適宜書き換える

sudo nano /etc/hosts で編集
最終行の 127.0.1.1    raspberrypi の raspberrypi の部分を上記と同じものに書き換える

ファイル保存後に OS を再起動することにより有効になる

  :

----- ファイルマネージャを root 権限で使う -----

重要なファイル類の操作や編集を GUI でどうにかしたい時に便利かもしれないけど危険かも知れない(汗
ターミナル内で sudo pcmanfm としてもいいんだけど…何かと面倒なんでアプリケーションランチャーに登録しておく

DESKTOP ファイルとか云うものを作成する ※既にあるファイルマネージャのものをコピーして編集する
sudo cp /usr/share/applications/pcmanfm.desktop /usr/share/applications/pcmanfm_sudo.desktop

sudo nano /usr/share/applications/pcmanfm_sudo.desktop
Icon=system-file-managerIcon=user-desktop に変更する ※アイコンは何でもいいんだけど…個人的にこの辺が判りやすいアイコンだったんでこのようにした
Name=File Manager PCManFMName=File Manager sudo に変更する
Name[ja]=ファイルマネージャ PCManFMName[ja]=ファイルマネージャ sudo に変更する
GenericName[ja]=ファイルマネージャGenericName[ja]=ファイルマネージャ sudo に変更する
Exec=pcmanfm %UExec=sudo pcmanfm %U に変更してファイルを保存する

202110161733492-admin.png
デスクトップの「ランチャアイコン上」で右クリックしてメニューを出しアプリケーション・ランチャー Settings をクリック

202110161733491-admin.png
何故か「システムツール」に入っているファイルマネージャ sudo を選び 追加(A) ボタンを押す

20211016173349-admin.png
新しい「ランチャアイコン」が追加された

202110161747561-admin.png
root 権限なんで(概ね)どのフォルダ/ファイルでも操作できる その際にツールバーの左端に「現在あなたは管理者権限で操作しています」を表す マークが表示されています
そしてもちろん右クリックでメニューを出して各種操作もできる

20211016174756-admin.png
メニュー操作により root 権限が必要なファイルの編集もできる
ただしシステムに関連した重要なファイルの変更などで取り返しのつかない事態に陥る危険性もあります 使用には細心の注意が必要です!

  :

----- Raspberry Pi の基盤穴サイズ -----

Raspberry Pi の基盤穴サイズっていうか…適合するボルト径ですかね
20211016234940-admin.jpg
M2.5 ってやつがピッタリ合うようです M3 だと微妙に太くて通らないようです
設定って話じゃないけど…ちょっと気になったんでメモしておきます

今回はここまで! 長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ

  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
  ●ラズパイで Apache2 サーバを建ててゆるい設定をする
  ●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ

情報 <2516文字>

Raspberry Pi 4 で素早く Apache2 サーバを建ててゆるい設定をするメモ

20211203173447-admin.png
 
常時接続が当たり前の昨今に於いてお家で Raspberry Pi 4 を Web サーバにする需要が多いと聞きますが…わりと Apache2 の設定って難解で面倒なんですよね その辺をぐぐってみてもバージョン違いや実装の違いでいまいち思ったように設定できないって困ったことはありませんか? 私はあります(汗って事なんで…セキュリティ的な云々は後回しにして手っ取り早く簡単に設定できる方法を模索してみます

そんなラズパイへの Apache2 のインストール自体はコマンド一発で簡単にできます
sudo apt install apache2
これで Apache2 がインストールされサーバが動き出します
試しに PC などのブラウザのアドレス欄に ホスト名.local と入れて確認してみましょう ちなみに標準状態のラズパイのホスト名は raspberrypi なんで raspberrypi.local になります

20211016095920-admin.png
我が家のラズパイはホスト名を pi4 にしてるんでアレだけど…概ねこんな感じになると思います
これは Apache2 のテスト用に用意されたページで /var/www/html にある index.html を表示しています この /var/www/html をドキュメントルートと呼びます 基本的にこのフォルダにホームページ用のデータを置いていきます

  :

初期状態の Apache2 は各種機能が制限されているっていうか CGI が動かなかったりとか物足りない感じなんでその辺をどうにかします
20211016101700-admin.png
そんな Apache2 の設定ファイルは /etc/apache2 にあります この中の apache2.conf を編集したくなる感じですが…世間的にはよっぽどの事がない限りこのファイルはイジらないほうがいいって事らしいんで別の手法で設定します

20211016102522-admin.png
/etc/apache2 を眺めてると… conf-availableconf-enabled の対になったフォルダに mods-availablemods-enabled の対と sites-availablesites-enabled の対になったフォルダがあるのに気づきます
これがラズパイの Apache2 の設定ファイル&モジュール管理の基本となります このフォルダ内にファイルを作ったりして設定を進めます

20211016103332-admin.png
そのそれぞれ対になった *-available*-enabled 関係ですが… available は編集中のものを含め全ての候補となるファイルが入っています 対する enabled には Apache2 を起動する際に実際に読み込まれるファイルのシンボリック・リンクが入ります
※いろいろ設定した後の内容なんで…インストール直後のものとは違いがあります(汗

それぞれ対になってる conf と mods と sites の意味ですが… conf にはアクセス制御系の設定が mods には拡張モジュールが sites にはバーチャルホスト系の設定が入ります
そしてその 有効/無効 にするための専用のコマンドが用意されています
conf の有効化には a2enconf で無効化には a2disconf を使います
mods の有効化には a2enmod で無効化には a2dismod を使います
sites の有効化には a2ensite で無効化には a2dissite を使います

  :

では試しに CGI を有効化する設定をしてみましょう
CGI を使うにはそれ用のモジュールが必要らしいんで sudo a2enmod cgid で有効化します
一応 sudo systemctl restart apache2 で Apache2 を再起動します

これで /usr/lib/cgi-bin に配置した CGI 的なプログラムが可能になりますが…どうせならドキュメントルートである /var/www/html でも CGI を使えるようにしましょう

sudo nano /etc/apache2/conf-available/cgi.conf で新規ファイルとして編集して…
<Directory "/var/www/html">
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl .py .rb
    AllowOverride All
</Directory>

上記の 5 行を追加して保存します 今回は cgi.conf としましたが他の名前にしても大丈夫です

保存したら sudo a2enconf cgi でその設定ファイルを有効化します
最後に sudo systemctl restart apache2 で Apache2 を再起動します
これで /var/www/html でも CGI が使用可能になりました

  :

CGI の設定とは少し違いますが…上記の cgi.conf に書き込んだ AllowOverride All って設定があります これは  .htaccess を使用可能にする設定です
.htaccess が使えれば Apache2 の再起動をすることなく設定を即座に反映させることができるようになります その分ページ表示されるまで余計な処理が増えて重くなるらしいんだけど…めったにアクセスの無い個人ページならまぁ問題にならないでしょう(滅
.htaccess についての詳しい説明は…いろいろ多岐にわたる内容すぎて書ききれないんで省略します 気になる方はぐぐってみると良いでしょう(瀧汗

  :

そうそう Perl で書かれた CGI で「CGI モジュールが必要」ってのをちょくちょく見かけるんで…そんな Perl のモジュールインストールメモをひとつ
Perl のモジュール管理(?)に CPAN (Comprehensive Perl Archive Network) を使うって話を度々目にすることがあったのも時既に過去の話だったのかなって遠い目をする話じゃなくて(汗そんな Perl モジュールの中で必須とする数個のインストールのためだけに CPAN を入れるのもめんどっちぃなぁって事なんで…普段使ってる sudo apt install でその辺をどうにかするメモ

結論から云うと CGI モジュールは sudo apt install libcgi-session-perl で入ります その他の有名どころのモジュールもだいたい sudo apt install で入れることができます
上記のCGI モジュールは心もち特殊な例なんでアレだけど…他の多くは sudo apt install lib(モジュール名)-perl でイケる事が多いです

例.GD モジュール→ sudo apt install libgd-perl  NKF モジュール→ sudo apt install libnkf-perl などなど
確証はないけど…知っておくと損はないかもです

そんなこんなな長々とお疲れさまでした! #[Raspberry Pi] #Apache #CGI

  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
  ●ラズパイで Apache2 サーバを建ててゆるい設定をする
  ●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ

情報 <3321文字>

DASHBOARD

■複合検索:

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

■ハッシュタグ:

■カテゴリ:

■日付検索:

■機器状態:

Raspberry Pi 4 Status

編集

RSSフィード