ユーザ「猫山ぽるか」の投稿[39件](4ページ目)
2021年11月 この範囲を時系列順で読む
Tweet ⌚ 2021年11月20日(土) 10:26:41 情報 <7610文字>
Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう!
前回に引き続き Arduino 的な諸々をひとつって事で…マルチメディア・キーボードって云うんですかね?
+α的に実装されている音量調節などのキーとかノート PC でよく見かける Fn キーと併用して使える再生とか早送りなどのキーを ATmega32U4 を搭載した Arduino Leonardo (Pro Micro) でどうにかしてみるお話です
そんな今回の実験の様子
以前のマウスクリック超連射実験の回路がくっついたままなんで判りにくいですよね…
申し訳程度に回路図を描いてみたけど…それでも判りづらいですよね(汗 まぁとにかく 2 番ピンと 3 番ピンを使用しました
今回のマルチメディア・キーボード(?)的な機能を簡単に実装するためにライブラリを追加してみました
Arduino IDE で [スケッチ] → [ライブラリをインクルード] → [ライブラリ管理] してライブラリ管理画面を出す
目的のライブラリを「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);
}
}
----------
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_PAUSE と MEDIA_NEXT の他にもいろいろあります 例えば CONSUMER_BROWSER_REFRESH を超連打して…いわゆる F5 アタックを実装するのもいいかもしれません ※やめて!(>_<)q
:
まぁざっくりこんな感じですかね これを用いてちょっと便利な補助キーボードを作れるとイイナ! #Arduino
Tweet ⌚ 2021年11月14日(日) 11:38:29 情報 <3322文字>
Arduino Leonardo (Pro Micro) でマウスクリック連射装置を作ろう!
ワンボードマイコンっていうか…ここんとこ Arduino が人気沸騰で気になりますよね!って事なんでモノは試しに安っすい VKLSVAN Pro Micro USB ATmega32U4 を買ってぼちぼちイジってみることにしました
まぁなんか Arduino にもいろいろあるようで…その中で ATmega32U4 を搭載した Arduino Leonardo と呼ばれるものが HID 機能を搭載しているって事で気になっていました そんな Arduino Leonardo の互換機が今回購入した Pro Micro って感じです
その HID 機能とはなんぞや?って話ですがまぁざっくり PC の標準的なキーボードやマウスを指すようです 要するに USB 接続した Arduino Leonardo (Pro Micro) がキーボードやマウスに化けるって事なんですね
そこで今回は連打系ブラウザゲーとして名高い CookieClicker を超連射できるボタンを実装してみることにしました
そんな Pro Micro のピン配列図 なんかいろいろ書いてあるけど…単純な On/Off スイッチを付ける場合は Arduino と色付けされた 0 から 20 までのピンを使うようです
それを今回はこんな感じで 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(); を実行するとマウスボタンが離されます
どちらの関数をどのようなタイミングで繰り返すかは個々の環境によって違うかと思いますが…
我が家の環境では Mouse.press(); Mouse.release(); を使って 1 秒間に 38 連射を記録しました → マウスクリック連射速度テスト
高橋名人もびっくりな超高速連射を実装できて満足しました!
Arduino Leonardo (Pro Micro) の HID 機能は手軽に有用な機能を実装できてなかなか楽しいです またぼちぼちイジっていきたいと思いました #Arduino
Tweet ⌚ 2021年11月13日(土) 07:23:46 情報 <1926文字>
2021年10月 この範囲を時系列順で読む
ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
・ラズパイとファイルのやり取りしたい
・ラズパイのアプリを 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 コマンドが入ったようです
試しに使ってみたところちゃんとコピーできたようです
:
----- ラズパイのアプリを PC 上で実行する? -----
ラズパイ上で動くアプリケーションの画面を PC 上に持ってくることができるようです
使い方
ssh [オプション] pi@hostname
オプションはいろいろあるけど…よく使うものを勝手に抜粋(汗
-Y 信頼できるX11転送を有効にします
-C データ転送を圧縮します
普通に SSH による接続なんですが…ファイルマネージャ (pcmanfm) とかのグラフィカルなアプリケーションの実行画面を PC 上で再現できるようになるようです
SSH でログインした後にコマンドラインに実行したいアプリケーションのコマンドを打ち込み実行します
pcmanfm :ファイルマネージャ
lxtask :タスクマネージャ
lxterminal :LXTerminal
例えば上記のようなコマンドです
Ubuntu MATE 上に再現されたラズパイのアプリケーション画面 心もち再現しきれてないものもあるけどご愛嬌かな
ファイルマネージャからイメージビューワなんかを起動するとその画面も PC 上に出てきます
ただしログインしたユーザ権限で動作できるアプリケーションに限るようです
macOS 系ではできたって話を聞いたことがあります Windows 系ではできないかも知れません(汗
そろそろネタが尽きてきたかな…って感じで長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
●ラズパイで Apache2 サーバを建ててゆるい設定をする
●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ
Tweet ⌚ 2021年10月24日(日) 16:41:43 情報 <2042文字>
ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
・テキストエディタ nano の超基本の使い方
・ユーザを切り替えて root で作業したい
・ラズパイは sudo した時にパスワードを聞かれないのは何故?
:
----- テキストエディタ nano の超基本の使い方 -----
端末上(LX Terminal等)でテキストファイルを編集するには vi か nano を使うことになるんだけど… vi は操作感が少々特殊でとっつきにくいんでその辺が判りやすい nano を使うことが多いのかな?って事でその nano を初めて使う方向けの超基本の使い方の解説です
コマンド名は nano です 管理者権限で使いたい時は sudo nano って感じで使います
nano もしくは sudo nano とコマンド名のみで起動すると「新規ファイル」の編集として起動します nano 「ファイル名」 とファイル名を付けて起動すると「ファイル名のファイル」を編集します
nano とだけ打ち込み起動した状態
よく使う(と思われる)コマンドが下部に記載されています
この中の 「^G ヘルプ」 とか 「^X 終了」 の「^」意味は以下のようになっています
ショートカットキーの記法は以下の通りです。(^)で表記されているショートカットはCtrlキーを押すか、Escキーを二回続けて押すことを表してします。(M-)で表記されているショートカットはAltキー、Cmdキー、Escキーなどのメタキーを押して入力します。
また、Escキーを二回押した後に000から255までの十進数を入力することで、コードに対応する文字を入力することができます。以下のキーストロークは主なエディタのウィンドウで使用できます。代替のキーストロークは括弧で囲って表記されます。
試しに Ctrl キーを押しながら G キーを押してみましょう
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 にチェンジして作業したいと思ったことはありませんか? 私はたまにあります…って事なんでその辺の話を少々
通常はユーザ pi で作業してるんだけどこれをユーザ切り替えの su コマンドを使って管理者 root になろうとするんだけど…認証失敗して root になれません これは root にパスワードが設定されてないんで「パスワードによる認証ができない」ってのが原因のようです
まぁこれを解決するには root にパスワードを設定すればいいんだけど…世間的にはセキュリティ云々の事情で root にパスワードを設定すべきではないって事なんでちょっと躊躇しちゃいますね ※ root にパスワードを設定すると SSH などで root ログインできるようになるんで好ましくないらしいのです
しかしこれが実機の前に居るのであれば別の方法でどうにかできます LXTerminal を sudo で起動してみましょう
sudo x-terminal-emulator
無事(?)に root に切り替えることができました
でもまぁ何でもできる管理者 root なんで…くれぐれも慎重な操作をお願いします(汗
※ 追記 ※
別のシェルでログインを試みるって手法をもっと試してみるっていうか…なんか su コマンドにシェルを指定するオプションがあるのに気づいたんでそっちも試してみることにします
sudo su -s /bin/bash root
これで root に切り替えることができました こっちのほうがスマートな操作って感じなのかな
ちなみにオプション指定の違いがあるっていうか…
sudo su -s /bin/bash root
sudo su -s /bin/bash - root
「-」オプションを付けない時はコマンドを実行したユーザのホームディレクトリ・環境変数が引き継がれて
「-」オプションを付た時は指定したユーザのホームディレクトリ・環境変数に設定されるようです
※ さらに追記 ※
もうちょっとシンプルにっていうか sudo -i や sudo su や sudo su - でもいいみたい
この場合もそれぞれ環境変数の引き継ぎに違いがあったりするようです 使いやすい手法を覚えておきタイネ!
:
----- ラズパイは sudo した時にパスワードを聞かれないのは何故? -----
Ubuntu などを使っている時に sudo すると…
パスワードを聞かれます
でも 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 接続できるとこまでセットアップ
Tweet ⌚ 2021年10月18日(月) 15:33:15 情報 <3977文字>
ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
・有線 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-manager を Icon=user-desktop に変更する ※アイコンは何でもいいんだけど…個人的にこの辺が判りやすいアイコンだったんでこのようにした
Name=File Manager PCManFM を Name=File Manager sudo に変更する
Name[ja]=ファイルマネージャ PCManFM を Name[ja]=ファイルマネージャ sudo に変更する
GenericName[ja]=ファイルマネージャ を GenericName[ja]=ファイルマネージャ sudo に変更する
Exec=pcmanfm %U を Exec=sudo pcmanfm %U に変更してファイルを保存する
デスクトップの「ランチャアイコン上」で右クリックしてメニューを出しアプリケーション・ランチャー Settings をクリック
何故か「システムツール」に入っているファイルマネージャ sudo を選び 追加(A) ボタンを押す
新しい「ランチャアイコン」が追加された
root 権限なんで(概ね)どのフォルダ/ファイルでも操作できる その際にツールバーの左端に「現在あなたは管理者権限で操作しています」を表す ⚠ マークが表示されています
そしてもちろん右クリックでメニューを出して各種操作もできる
メニュー操作により root 権限が必要なファイルの編集もできる
ただしシステムに関連した重要なファイルの変更などで取り返しのつかない事態に陥る危険性もあります 使用には細心の注意が必要です!
:
----- Raspberry Pi の基盤穴サイズ -----
Raspberry Pi の基盤穴サイズっていうか…適合するボルト径ですかね
M2.5 ってやつがピッタリ合うようです M3 だと微妙に太くて通らないようです
設定って話じゃないけど…ちょっと気になったんでメモしておきます
今回はここまで! 長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
●ラズパイで Apache2 サーバを建ててゆるい設定をする
●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ
Tweet ⌚ 2021年10月16日(土) 16:54:27 情報 <2516文字>
Raspberry Pi 4 で素早く Apache2 サーバを建ててゆるい設定をするメモ
常時接続が当たり前の昨今に於いてお家で Raspberry Pi 4 を Web サーバにする需要が多いと聞きますが…わりと Apache2 の設定って難解で面倒なんですよね その辺をぐぐってみてもバージョン違いや実装の違いでいまいち思ったように設定できないって困ったことはありませんか? 私はあります(汗って事なんで…セキュリティ的な云々は後回しにして手っ取り早く簡単に設定できる方法を模索してみます
そんなラズパイへの Apache2 のインストール自体はコマンド一発で簡単にできます
sudo apt install apache2
これで Apache2 がインストールされサーバが動き出します
試しに PC などのブラウザのアドレス欄に ホスト名.local と入れて確認してみましょう ちなみに標準状態のラズパイのホスト名は raspberrypi なんで raspberrypi.local になります
我が家のラズパイはホスト名を pi4 にしてるんでアレだけど…概ねこんな感じになると思います
これは Apache2 のテスト用に用意されたページで /var/www/html にある index.html を表示しています この /var/www/html をドキュメントルートと呼びます 基本的にこのフォルダにホームページ用のデータを置いていきます
:
初期状態の Apache2 は各種機能が制限されているっていうか CGI が動かなかったりとか物足りない感じなんでその辺をどうにかします
そんな Apache2 の設定ファイルは /etc/apache2 にあります この中の apache2.conf を編集したくなる感じですが…世間的にはよっぽどの事がない限りこのファイルはイジらないほうがいいって事らしいんで別の手法で設定します
/etc/apache2 を眺めてると… conf-available と conf-enabled の対になったフォルダに mods-available と mods-enabled の対と sites-available と sites-enabled の対になったフォルダがあるのに気づきます
これがラズパイの Apache2 の設定ファイル&モジュール管理の基本となります このフォルダ内にファイルを作ったりして設定を進めます
そのそれぞれ対になった *-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 接続できるとこまでセットアップ
Tweet ⌚ 2021年10月16日(土) 09:49:15 情報 <3321文字>
完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ
※ Raspberry Pi OS が新しくなったんで…それに対応した新しい解説はこちら→ 続・モニタ無しでラズパイを VNC 接続できるとこまでセットアップする
:
某風の噂で「ラズパイ4ってモニタが無いと動かないらしいんだぜ?」って聞いたんだけど…いやいやそんなバカな話があるもんかガセネタにも程がある!って思ったんでここはひとつラズパイ4に一切モニタを繋がないで(ついでにキーボードもマウスも繋がないで)セットアップして VNC 接続して操作できる辺りまでどうにかしてみました
:
今回使用したのは Raspberry Pi OS with desktop です
モニタ無しって事はサーバ運用だろ? なんで GUI な環境がいるん?? そう思うかも知れないけど…ド初心者は何かとグラフィカルな操作を求めがちなんだよ察しろ!
ちなみにラズパイ起動用の microSD を作成するのには Raspberry Pi Imager を使うといいらしいんだけどなんか面倒くさかったんで Linux(Ubuntu) 付属の dd コマンドで済ませちゃいました(汗
sudo dd if=2021-05-07-raspios-buster-armhf.img of=/dev/sdX bs=4M conv=fsync status=progress
of=/dev/sdX の X は個々の環境によって違います あと conv=fsync は付けた方がいいらしいです
:
こうして出来た microSD を PC にマウントすると rootfs パーティションと boot パーティションが現れます ただし rootfs パーティションは ext4 ファイルシステムなんで Windows では読めないらしいんで現れないかも知れません
もうひとつの boot パーティションは FAT32 ファイルシステムなんで Windows でも問題なく読み書きできます そして起動前の操作はこの boot パーティションに対して行います
まぁその操作は SSH を使えるようにするおまじないみたいなもんですかね
先ほどの boot パーティションのルートフォルダにファイル名が「ssh」もしくは「ssh.txt」のファイルを新規作成するか…もしくは何処かからコピーするだけです 「ssh」もしくは「ssh.txt」のファイルの中身は何でも構いません 空のファイルでもいいです
これで前準備は完了です この microSD を Raspberry Pi 4 に挿して電源を供給します
赤色のパワー LED が点灯して…その横にある緑色のアクセス LED が不規則に点いたり消えたりして起動していきます
※起動の際に何かエラーがあるとこの緑色のアクセス LED が規則的に点滅して知らせてくれます
※点滅の回数などで何のエラーなのかある程度知ることが出来ます
※こちらのページ に詳しく書かれているんでもしもの時には参考になるかも??
起動が完了すると緑色のアクセス LED が殆ど点灯しなくなります その辺が起動の見極め時ですかね
そして PC から SSH 接続します Ubuntu(Linux) には標準で ssh が用意されているけど… Windows はどうなんだろう? そっちにも用意されているとは聞いたことがあるようなないような(汗
ssh pi@raspberrypi.local
LAN 内にラズパイが 1 台だけなら基本的にこの手法で繋がります
なおラズパイのネットワークへの接続は有線 LAN を使います
無線 LAN(WiFi) を使いたい場合は「wpa_supplicant.conf」でどうにかするらしいのですが…今回は有線 LAN のみを使ったんで詳細は不明です
余談ですが…我が家には既にラズパイ3が動いているんで上記の raspberrypi.local が使えませんでした
それなら IP アドレスで…と思うのですが DHCP による割り当てなんでアドレスが判りません(汗
まぁそんな時は arp -a とかすると活きた IP アドレスが列挙されるんでアタリを付けやすくなりますが
そうこう云いつつ SSH 接続を開始します
今回は ssh の -l オプションでユーザ pi を指定してるけど Windows の ssh はオプションの意味が違うらしい?
ここは ssh pi@192.168.0.34 とかの書き方のほうが判りやすくていいかもだけどどうなんだろう
初接続時のみ「未知の証明書なんだけど大丈夫? 接続していいの??」って聞かれるんで yes する
パスワードを聞かれます ラズパイの初期設定パスワードは raspberry なんでそれを入力する
接続できたら次の作業っていうか sudo raspi-config して設定ツールを起動する
キーボードの矢印キーで移動してエンターキーで決定ってスタイルです
Tab キーを使う場面もあります
3 Interface Options を選ぶ
P3 VNC を選ぶ
VNC サーバを有効にするけどいいの?と聞かれるんで <Yes> を選ぶ
設定完了
それじゃ早速 PC の VNC Viewer で接続してみましょう 我が家では Remmina を使ってみました
・・が繋がりません なんか「Unknown authentication scheme from VNC server: 13, 5, 6, 130, 192」ってエラーっぽい?
これはラズパイ側のセキュリティ設定との兼ね合いらしいんでその辺をどうにかします
先ほどの SSH でラズパイの設定ファイルを編集します
sudo nano /root/.vnc/config.d/vncserver-x11
テキストエディタに nano を使ったけど vi も使えます お好きな方でどうぞ
そして末尾に以下の 3 行を追加します
Authentication=VncAuth
Encryption=AlwaysOff
Password=
sudo systemctl restart vncserver-x11-serviced で VNC サーバを再起動する
再び PC の VNC Viewer で接続を試みる
パスワードを聞いてくるようになりました でもなんかエラーが出て繋がりません
再び SSH で sudo vncpasswd -service と入力する
パスワードを聞かれるのでお好みのパスワードを 2 回入力する
そして sudo systemctl restart vncserver-x11-serviced で VNC サーバを再起動する
またまた PC の VNC Viewer で接続を試みる 先ほど設定したパスワードを入力する
しかしまだ繋がらない(汗
これはラズパイ側のモニタ設定(?)が問題らしいのでその辺を解決する
sudo nano /boot/config.txt を編集する
#hdmi_force_hotplug=1 を探す
あった
先頭の # (コメント記号)を消して有効にする
これで設定は完了なんでラズパイを再起動する
sudo reboot
これで VNC Viewer での操作が可能になりました
なんかデフォルトのパスワードだと云々…のダイアログが出てるけどまぁ OK する
せっかくなんで初期設定も済ませちゃおっか
お国の設定は Japan にすると概ね日本語になるよ
ログインパスワードの再設定をする ラズパイ初期設定パスワード raspberry のままだと何かと不安なんでお好みのものに変更しておく
ラズパイにモニタを繋げている人向けの設定
黒枠があったりして見づらい時にはチェックを入れておくとどうにかしてくれるらしい?
WiFi の設定は使わなかったんで素通りした(汗
最後にソフトウエア等のアップデート 全自動でやってくれるから見てるだけなんだけど結構時間がかかります
:
そんな感じで作業完了してモニタ無しのラズパイを VNC Viewer で操作できるようになりました
そして某風の噂の「ラズパイ4ってモニタが無いと動かないらしいんだぜ?」って話は正しくないと判明しました
まぁ実際に長期の運用をしてみないとアレかもだけど…感触的には大丈夫っぽそうかな
そんなこんなな長々とお疲れさまでした! #[Raspberry Pi]
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
●ラズパイで Apache2 サーバを建ててゆるい設定をする
●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ
Tweet ⌚ 2021年10月15日(金) 18:28:03 情報 <3954文字>
Tweet ⌚ 2021年10月15日(金) 15:18:30 メモ <46文字>
Perl の GD::Simple モジュールでフォントを指定したりしてみるメモ
初期のインターネットっていうか 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);
----------
実行すると以下のような感じの画像が生成されると思います
今回は PNG で保存してみましたが GIF や JPEG でも保存できます 「ファイルへ出力」の辺りのコメントアウトしてある部分で切り替えられるんで試してみてください
:
そんな Perl で画像を生成するって話だと…既存の画像を読み込んで文字とかを描き込んで使いたい場合があると思います そんな時には以下のように指定します
[サンプル画像]
----------
#!/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);
----------
実行すると以下のように読み込んだ画像の上に文字を描き込んだ画像が出力されます
ちゃんと文字が描き込まれていますね なお色数の多い JPEG と PNG は True Color フラグとなる「1」を指定しておかないと色が正しく再現されないような感じでした
:
お次は複数の画像を読み込んで 1 枚の画像に合成するってのをやってみます
[サンプル画像]
----------
#!/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);
----------
実行すると以下のように読み込んだ画像の指定範囲を切り抜き合成してその上に文字を描き込んだ画像が出力されます
なお画像の 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