https://isehara-3lv.sakura.ne.jp/blog/2025/01/23/hub75-ledアレイの表示画像を任意に変更できるようにし/
作成されてるイメージのアップロードだけではなく、テキスト入力してそれをイメージ化して送信するように機能追加、フォントはMacでは、
コードのGitHubへのリンクに変更はありません
<ブラウザ画面>
<表示されたイメージ>
LEDアレイでの表示ポジションや縮尺、倍率などの改良の余地はありますが、機能的にはこれでほぼ完成形
admin
la vie libre
https://isehara-3lv.sakura.ne.jp/blog/2025/01/23/hub75-ledアレイの表示画像を任意に変更できるようにし/
作成されてるイメージのアップロードだけではなく、テキスト入力してそれをイメージ化して送信するように機能追加、フォントはMacでは、
コードのGitHubへのリンクに変更はありません
<ブラウザ画面>
<表示されたイメージ>
LEDアレイでの表示ポジションや縮尺、倍率などの改良の余地はありますが、機能的にはこれでほぼ完成形
admin
固定した画像ファイルを選択するだけではイマイチだから、webサーバー(ラズパイzero)にブラウザ経由で任意の画像をアップロードして、サーバー側で画像の圧縮処理、rgb抽出を行いTCPでラズピコに送信して表示させるようにした
構成はwebアプリをgolangで作成し、ラズピコ側のコードも対応して変更、途中でデータロスはできないからUDPはあり得なくてTCPは前提
コード生成はPerplexityが無償でもgolangでは使えるコードが出てくるので活用、多分コードの生産性からいったら倍以上にはなる
<web application code>
https://github.com/chateight/golang/tree/master/image
<raspberry pi pico code>
https://github.com/chateight/hub75_led_array_image_upload/tree/main
ラズパイzeroでの実行速度は150KBぐらいのイメージファイルでLEDアレイに表示されるまで2秒ちょっとといったところ(Wi-Fi転送は過去の経験で1MB/secは出るからほぼイメージ処理の時間)だけど実用的には問題ないレベル
ラズピコ側でTCP通信するのにどうやるのかを検索してもイマイチだったので、それもPerplexityからの回答で、主要なコードを抜き出すとこんな感じ、
void setup(){
IPAddress staticIP(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
WiFi.config(staticIP, gateway, subnet);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
server.begin();
}
void loop() {
client = server.accept(); // TCP start
// if network is active
if (client) {
while (client.connected()) {
if (client.available()) {
// receive binary data
int bytesRead = 0;
unsigned long startTime = millis();
// Read all available data within a 500ms window
while (client.available() && (millis() - startTime < 500) && bytesRead < MAX_BUFFER) {
receivedData[bytesRead] = client.read();
bytesRead++;
}
// response to the server
const char* response = "Resp from Pico W!";
client.write(response, strlen(response));
}
}
今更ながらコード作成でもLLMはもはや必需品で、用途ごとに要求されるものが違うからそれは人間社会と同じかもしれない
admin
多分ようやくなのだろうけれども、データベースサーバーの更新(5.7系 -> 8系)への移行の催促が来ていたので移行
事前にメニューで移行処理(移行先にコピーして二重で持つだけ)の予約、実行完了後に、実際に使われるデータベースを、コントロールパネルのファイルマネージャーからwp-config.phpのデータベース指定先に書き換え(/** MySQL のホスト名 */)、保存して、正規のページにアクセスして正常に表示されれば、移行が完了しているということです
WoedPressだけなので作業自体は簡単、
admin
ラズパイ/ラズピコ限定の話になりますが、現時点での整理です
① golang : ラズパイ用にはcgoがあるとターゲットマシン用にgolangとc用に二種類のコンパイラが必要になるので、単純化のためにはcgo freeのライブラリだけ使って、(現時点ではcgoライブラリはほぼ回避手段があるはず)クロスコンパイルを実行する
たとえば、ラズパイzero用バイナリならば、以下のようなコンパイルオプションつけて実行できる
% GOOS=linux GOARCH=arm GOARM=6 go build -o rasp_zero
ラズピコで組み込み用にはgolangというのは選択肢にはならないしそもそも手段があるのか、golang使うならRustでしょう
② Rust:ラズパイ用はCross + Dockerが一番素直か、Intel MacならばVM上のUbuntuでもtoolchainが存在してるからできるけど
ラズピコは組み込みだからクロスビルドしかなくて、Baker link. ENV + Rancher Desktop(docker)がCross + Dockerに相当する機能で使える、ラズピコはデバッガ(debug probe)を簡単に使えるという点でもBaker link. ENVが良さそう、おそらくBaker link. ENVと類似のツールはこの先出てくるかもしれないけど、いずれにしてもそれは仮想環境を使ったもので開発環境を自分で作ることが必要なケースはそれほどないはず(Docker用のイメージ作成は別にして)、いまだラズピコでRustはかなりニッチではあるから歩みは遅いかもしれないが
admin
以前の記事で、cross使う時には
CROSS_CONTAINER_OPTS=”–platform linux/amd64″
を先頭に付加しないと動作しなかったけれども、今日使ってみると、
% CROSS_CONTAINER_OPTS="--platform linux/amd64" cross build --target arm-unknown-linux-gnueabihf —release
The application panicked (crashed).
Message: byte index 1 is not a char boundary; it is inside '—' (bytes 0..3) of `—release`
Location: /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/str/mod.rs:659
のようなエラーが出て起動できない、単純に削除して$ cross build *********で動作するようになってました(そこに至るまでにはcrossで–releaseを付加するとなぜがエラーは継続して、–releaseを削除すると動いて、その後に–release追加というこれも不可思議な現象を経由してます)
ちなみにIntel MacでDockerで環境インストして動かしてみると、なぜかDockerのuser権限なくてもコンパイルできてしまいます
admin
二年ぐらい前には、まだcgoしか無いようなドライバもそこそこ存在してましたが、cgo freeのドライバに変えてコンパイルをすっきりさせた方が良さそうです
cgo freeでは無いドライバが含まれるコードを普通にコンパイルしてラズパイzeroで実行させると、
$ ./rasp_zero
2025/01/12 17:17:17 "Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub":
create table foo (id integer not null primary key, name text);
delete from foo;
と言われるし、cgo対応のlinkerはいまいち不明だし、というわけで以下のリンクのサンプルコード(実は上のエラーメッセージはオリジナルのソースをコンパイルしてます)をcgo freeドライバに入れ替え
https://zenn.dev/teasy/articles/go-sqlite3-sample
github.com/mattn/go-sqlite3
を、
modernc.org/sqlite
に変更して、db openのコードを変更するだけでcgo freeとなって、
% GOOS=linux GOARCH=arm GOARM=6 go build -o rasp_zero
でコンパイルするとラズパイzeroで動くバイナリが出力されます
実はcgo free以外に、M1 Macの動作ではgo run ***では動作しても、./***では起動も終了もしないという不思議な現象が出てましたが、この件も一緒に解決、ただしこの現象ではIntel Macでは出ないという怪しげな現象でした
orm(例えばgormなど)もcgo freeにできるので、今後はcgoが必要なのはおそらくよほどな時になりそうです
<コードは>
sql.open()が変わっただけです
package main
import (
"database/sql"
"fmt"
"log"
"os"
_ "modernc.org/sqlite"
)
func main() {
os.Remove("./foo.db")
// original
// db, err := sql.Open("sqlite3", "./foo.db")
//
db, err := sql.Open("sqlite", "./foo.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
sqlStmt := `
create table foo (id integer not null primary key, name text);
delete from foo;
`
_, err = db.Exec(sqlStmt)
if err != nil {
log.Printf("%q: %s\n", err, sqlStmt)
return
}
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
stmt, err := tx.Prepare("insert into foo(id, name) values(?, ?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
for i := 0; i < 100; i++ {
_, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))
if err != nil {
log.Fatal(err)
}
}
tx.Commit()
rows, err := db.Query("select id, name from foo")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
stmt, err = db.Prepare("select name from foo where id = ?")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
var name string
err = stmt.QueryRow("3").Scan(&name)
if err != nil {
log.Fatal(err)
}
fmt.Println(name)
_, err = db.Exec("delete from foo")
if err != nil {
log.Fatal(err)
}
_, err = db.Exec("insert into foo(id, name) values(1, 'foo'), (2, 'bar'), (3, 'baz')")
if err != nil {
log.Fatal(err)
}
rows, err = db.Query("select id, name from foo")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
P.S. 2025/1/13
”実はcgo free以外に、M1 Macの動作ではgo run ***では動作しても、./***では起動も終了もしないという不思議な現象が出てました”
この件に関連して、DB(sqlite3)を使う別のコードではビルドもできず、やはりIntel Macでは問題なくビルドできて動作したので、おそらくVenturaのアップデートと関連ありますね
admin
おそらくMac OSのsequoiaと関連していてDocker Desktopのアップデートが原因思われますが、このようなエラーが出て起動できません
検索すると、https://zenn.dev/masakiee/articles/4c6f7e68a5a31c
同じような事例は見えるのでworkaroundで緊急避難はできるようですが、
恒久対策は検討中、
January 8, 2025 10:41 PST
January 8, 2025 18:41 UTC[Identified] The root cause has been identified: some files in existing installations are incorrectly signed which can be fixed by copying correctly signed files from the Docker.app application bundle.
We are working on a proper fix.
まあDocker Desktopは使わないで、Rancher Desktop(Baker link.ですでにインスト済み)に移行してしまうというのもありだろうね、Rustのクロス環境はPodman + Podman DesktopだからあまりDocker Desktopにこだわる必要もない
ついでに、% docker versionで見てみると、Client(rancher-desktop)もServerもgolangで書かれてるんだね
% docker version
Client:
Version: 27.2.1-rd
API version: 1.45 (downgraded from 1.47)
Go version: go1.22.7
Git commit: cc0ee3e
Built: Tue Sep 10 15:41:09 2024
OS/Arch: darwin/arm64
Context: rancher-desktop
Server:
Engine:
Version: 26.1.5
API version: 1.45 (minimum version 1.24)
Go version: go1.22.5
Git commit: 411e817ddf710ff8e08fa193da80cb78af708191
Built: Fri Jul 26 17:51:06 2024
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: v1.7.17
GitCommit: 3a4de459a68952ffb703bbe7f2290861a75b6b67
runc:
Version: 1.1.14
GitCommit: 2c9f5602f0ba3d9da1c2596322dfc4e156844890
docker-init:
Version: 0.19.0
GitCommit:
admin
Baker link. ENVは今少し不安定(Dockerの対応するコンテナを削除しないと動かない時がある)のように見えるので、手順を補足説明
<環境>
M1 MacBook Air sequoia
cargo/rustc 1.82.0
Rancher Desktop 1.16.0
<手順>
基本は、
https://baker-link.org/Blink/Baker_link_Env_page.html
ですが、途中いくつか鬼門あるので手順を記載
① historyから作成済みならば、作成済みプロジェクトの履歴からクリックして開く
② 「コンテナで再度開く」を選択
ここでコンテナにファイルが存在しない状態、つまりVScodeでソースコードが開かない時があって、その場合にはDockerのコンテナ(dockerという名前)を削除して最初からやるとうまくいく、imageはbaker-link-envという名前でこれが残っていればコンテナ展開されるだけ、このイメージがDockerに存在していなければBaker link. ENVがダウンロードするんだろう
③ probe-rs見つからないと言われる -> install/failどちらも無視
④ F5でデバッガ起動
⑤ 「cargo buildを見つけられません」のポップアップ -> 「このままデバッグ」を選択(すでに作成済みなので)
もし現在のソースファイルでビルドされていなければ、bash(Docker コンソール)でビルドする(qemu-system-aarch64使っているのでそこそこ遅い)
F5を押したタイミングでラズピコにDocker上のビルドされたバイナリを転送するようです
⑥ デバッグボタンが現れる
⑦ デバッグボタン列の一番左の青ボタンでデバッグが起動する
この時にはdfmtコンソール現れてデバッグ開始できる状態になってます
コンソールで前回の出力と連続しているけれども、INF0 Program start!がソースの22行目に埋め込まれてるinfo!(“Program start!”);からの出力でデバッグ開始の確認になります
admin
今年の九月ごろにリリースされていますが、Baker link.がdebug-probe(ラズパイ財団純正)でも動くという記述あったので使ってみた
<確認環境>
・M1 Mac Sequia 15.2
・debug-probe
<Baker link. tutorial>
https://baker-link.org/introduction.html
tutorial実行で必要な開発環境としては、
① Docker Desktop(suse版):Rancherなので実際はDockerが起動される
② VScode
③ probe-rs
開発コンソールには、Baker link.Envをインストールして、そこから起動できます
<つかえたところ>
なぜかVScode起動後の『コンテナでサイド開く』クリックでprobe-rs見つからないと言われ(ちゃんとインストしてるのに)たので再度コンソールからインスト、以下はVScode ポップアップメニューのインストールを選んだ後のメッセージ、サイドのインストでも同じメッセージ出たけど無視して進めたら通った
Installation failed. Go to https://probe.rs to check out the setup and troubleshooting instructions. baker link
probe-rsのインストコマンド、
% curl --proto '=https' --tlsv1.2 -LsSf https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.sh | sh
F5起動(デバッグスタート)すると実行ファイル見つからないと言われる、ならばとDockerのコンソールからコマンドラインでビルドしてやるとF5でデバッガ起動して普通に使えるようになりました
ハードはHUB75 LEDアレイ駆動時そのままの接続、
コードエディタはVScodeそのまま、新規にウインドを開きます
現在までに種々のデバッグ環境が公開されてますが、Dockerを使う(クロス環境のCross + Podmanに似ている)のが一番筋が良さそうだからこれが今のデフォルト
P.S. リソースは大量消費しているようだけど宿命
admin