Quantcast
Channel: ひろまさ – hiromasa.another :o)
Viewing all 96 articles
Browse latest View live

Windows 11 で USB ThinkPad トラックポイント・キーボードの縦スクロールがダウンする

$
0
0

USB (有線)版の ThinkPad トラックポイント・キーボードで、真ん中ボタンによる縦スクロールを行った場合に「ThinkPad 優先スクローリング」機能がダウンする場合があります。抜本的に解決できませんでしたがメモ。

利用しているドライバー(Windows 11 は対応しておらず古い)

ThinkPad Compact USB Keyboard with Trackpoint Driver (18.8 MB)

https://support.lenovo.com/jp/ja/solutions/pd026745-thinkpad-compact-usb-keyboard-with-trackpoint-overview-and-service-parts

このドライバーを導入すると、マウスのプロパティーに次の設定が追加されます。

ThinkPad 優先スクローリング機能はおそらく、ソフトウェアの中ボタン処理を無効にして、スクロールイベントを発生させる機能です。(中ボタンを押したときに、スクロールバーアイコンになれば機能しています)

この機能が特定のソフトウェアで動作した場合にダウンし(Visual Studio 2022 で確認)、スクロール機能が動かなくなるようです。

なお、ThinkPad 優先スクローリングを無効にすると、アプリ側のスクロールが効くので動くようになりますが、Microsoft Edge などが微妙な動きになります。

残念ながら対応する方法は分かりませんでしたが、以下の .exe を起動することで、OS の再起動をすることなく復帰は可能なようです。スタートメニューにピン止めしておくといいかもです。

“C:\Program Files (x86)\Lenovo\ThinkPad Compact Keyboard with TrackPoint driver\HScrollFun.exe”

Visual Studio 利用時は ThinkPad 優先スクロールのチェックを外すことにより対応。

古い製品なのでしょうがないですかね。。対応されたドライバーがでるといいのですが。いったんがまんして使うこととします。

追伸。同件を書かれている方がいらっしゃいました。Bluetooth 版でも発生するようです。 Visual Studio で起きるのも同じですね。。とほほ。

ThinkPad Bluetooth キーボードで縦・横スクロールが出来なくなった場合の対処法

トラックポイントとセンターボタンによる、縦および横スクロールが全くできない

Windows WSL2 の Ubuntu 22.04 上から USB-UART 経由で M5Stack に書き込みする

$
0
0

Windows WSL2 の 1.0 版以降のカーネルでは、usbipd を経由することで Windows 側の USB 機器を IP 経由で参照することができます。

この動きを利用して、USB に接続した M5Stack(USB-UART) に WSL2 Ubuntu 上の esp-tools から書き込みする手順を記載してみます。数コマンド叩くだけで完了します。便利。

WSL2 Ubuntu 上にセットアップした Linux 版の esp-idf 開発系から直接マイコンに書き込みできるようになります。おそらく他のマイコンや PlatformIO 環境でも同じ手順で USB を認識させれば Linux 側から書き込みできるようになると思います。

環境

Windows WSL2 (Windows 10 の場合 1.0 以降)

> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.1105

WSL2 Ubuntu 22.04

$ uname -a
Linux minis-um690 5.15.79.1-microsoft-standard-WSL2 #1 SMP Wed Nov 23 01:01:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu 22.04 上の esp-idf

$ get_idf
$ echo ${IDF_PATH}
/home/hiromasa/devel/toolchain/esp-idf
$ idf.py --version
ESP-IDF v4.4.3

Windows に usbipd-win を導入

基本的に以下の Microsoft のガイドに従うと OK ですが、一部コマンドがカーネルバージョンに依存しているので、usbipd-win の手順も参照しています。

USB デバイスを接続する

このガイドでは、USB/IP オープンソース プロジェクト usbipd-win を使用して、WSL 2 で実行されている Linux ディストリビューションに USB デバイスを接続するために必要な手順について説明します。

まずは Windows 側に usbipd-win を導入します。 PowerShell 窓より以下のコマンドにて。

> winget install --interactive --exact dorssel.usbipd-win

次に WSL2 Ubuntu 22.04 に apt で usbipd を導入します。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install linux-tools-virtual hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

この流れでついでに Ubuntu の udev を構成して、マイコンの USB 接続をユーザ権限から見れるようにしておきます。 PlatformIO の udev 定義を使うとほとんどのマイコンで使えて便利です。

$ curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules

ここでいったん Windows ごと再起動します。

USB 機器のバインド

Windows 起動後、先に Ubuntu の usbipd を起動するために、WSL2 Ubuntu 窓を上げておきます。

次に Windows の PowerShell 窓を「管理者で起動」し、使いたい USB 機器を usbipdにアタッチします。

usbipd wsl list コマンドで USB 機器を表示。

> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
3-1    17ef:6047  Lenovo USB Interface Device(HID), USB 入力デバイス            Not attached
3-3    0e8d:0608  RZ608 Bluetooth(R) Adapter                                    Not attached
7-1    0499:170d  AG06/AG03, Line (AG06/AG03)                                   Not attached
9-1    10c4:ea60  CP2104 USB to UART Bridge Controller                          Not attached

CP2104 USB to UART が M5Stack なので 9-1 をアタッチ。なお、初回のアタッチの操作のみ管理者権限が必要で次回からはユーザ権限でいけるようです。

> usbipd wsl attach --busid 9-1

うまくいけば、upsipd wsl list コマンドのデバイス部分が Ubuntu になります。

> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
9-1    10c4:ea60  CP2104 USB to UART Bridge Controller                          Attached - Ubuntu-22.04

できたら、WSL2 Ubuntu で lsusb してみて機器(CP210)が見えればOKです。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

PlatformIO からお借りした udev 定義が効いていれば /dev/ttyUSB0 あたりにユーザ権限の書き込み付きでブロックデバイスが見えます。rw-rw-rw なら成功です。

$ ls -laF /dev/ttyUSB*
crw-rw-rw- 1 root dialout 188, 0  1月 28 17:17 /dev/ttyUSB0

マイコンへの書き込み

/dev/ttyUSB0 宛てにそれぞれのマイコンの書き込みツールを設定すれば書けるはずです。esp-idf (esp-tools) は自動的にシリアルポートを探してくれますので、以下のいつものコマンドで書き込みからモニターまで動作します。

$ idf.py build flash monitor
Executing action: all (aliases: build)
Running ninja in directory /home/hiromasa/devel/esp32/m5stack-core2-wasm3-as/build
Executing "ninja all"...
[1/4] cd /home/hiromasa/devel/esp32/m5stack-core2-wasm3-as/b...asa/devel/esp32/m5stack-core2-wasm3-as/build/hello_world.bin
hello_world.bin binary size 0x124cb0 bytes. Smallest app partition is 0x200000 bytes. 0xdb350 bytes (43%) free.
[2/4] Performing build step for 'bootloader'
[1/1] cd /home/hiromasa/devel/esp32/m5stack-core2-wasm3-as/build/bootloader/esp-idf/esptool_py && /home/hiromasa/.espressif/python_env/idf4.4_py3.10_env/bin/python /home/hiromasa/devel/toolchain/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 /home/hiromasa/devel/esp32/m5stack-core2-wasm3-as/build/bootloader/bootloader.bin
Bootloader binary size 0x6330 bytes. 0xcd0 bytes (11%) free.
Executing action: flash
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting.....
Detecting chip type... ESP32
...以下略...

以上です。

本環境設定と合わせて、プロジェクトディレクトリを VSCode の WSL Remote 拡張で開けば、ソースコードの編集からマイコンへの書き込みまで Linux 周りのツールで揃えることができるので便利なのではないかと思います。

Longan Nano (GD32V) + VSCode + PlatformIO

Longan Nano dfu 用の udev 構成。

$ cat /etc/udev/rules.d/70-ttyusb.rules #ファイル追加
# Longan Nano
SUBSYSTEM=="usb", ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666"
SUBSYSTEM=="usb_device", ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666"
$ sudo service udev restart # udev restart

Longan Nano を BOOT + RESET 起動で dfu モードに入れて attach。

> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
3-1    17ef:6047  Lenovo USB Interface Device(HID), USB 入力デバイス            Not attached
3-3    0e8d:0608  RZ608 Bluetooth(R) Adapter                                    Not attached
7-1    0499:170d  AG06/AG03, Line (AG06/AG03)                                   Not attached
9-1    28e9:0189                                                                Not attached

先に管理者権限 PowerShell でアタッチした後、リセットするとアタッチが切れるので、再アタッチ。 WSL2 Ubuntu 側からも Windows の usbipd.exe を呼べるのでビルド、アップロードとセットでコマンドを実行すると便利。

$ usbipd.exe wsl attach --busid 9-1
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 28e9:0189 GDMicroelectronics GD32 DFU Bootloader (Longan Nano)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

あとは WSL2 側に入れた VSCode と PlatformIO 拡張から、いつも通り Upload を起動すれば書き込みできます。

openocd デバッグを行う場合

M5Stamp C3 の USB JTAG デバッグを行う設定は次のようになります。

openocd の依存となる libusb の導入(どちらかでだけでもいいかものと、-dev を入れているのは癖なので外しても OK です)

$ sudo apt install libusb-dev libusb-1.0-0-dev

openocd の依存となる libpython2.7 導入

$ sudo apt install libpython2.7

USB ポートに M5Stamp C3 の JTAG USB 側(?) を引き出して接続、Windows 側でアタッチ後 Linux で USB 認識確認

$ lsusb | grep JTAG
Bus 001 Device 007: ID 303a:1001 Espressif USB JTAG/serial debug unit

udev 構成追加( 303a の 追加)

$ cat /etc/udev/rules.d/99-platformio-udev.rules | grep 303a
# 以下を追加
ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"

udev restart

$ sudo service udev restart

接続確認

いったん USB を抜き差しして、Windows 側で再アタッチなどして、接続確認します。

$ ls -laF /dev/ttyACM*
crw-rw-rw- 1 root dialout 166, 0  1月 28 19:46 /dev/ttyACM0

openocd 起動

$ openocd -f board/esp32c3-builtin.cfg
Open On-Chip Debugger  v0.11.0-esp32-20220706 (2022-07-06-15:48)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
Info : esp_usb_jtag: VID set to 0x303a and PID to 0x1001
Info : esp_usb_jtag: capabilities descriptor set to 0x2000
Warn : Transport "jtag" was already selected
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : esp_usb_jtag: serial (34:B4:72:12:94:14)
Info : esp_usb_jtag: Device found. Base speed 40000KHz, div range 1 to 255
Info : clock speed 40000 kHz
Info : JTAG tap: esp32c3.cpu tap/device found: 0x00005c25 (mfg: 0x612 (Espressif Systems), part: 0x0005, ver: 0x0)
Info : datacount=2 progbufsize=16
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=32, misa=0x40101104
Info : starting gdb server for esp32c3 on 3333
Info : Listening on port 3333 for gdb connections

VSCode などから接続(設定例

おそらく openocd 接続後初回の Debug Launch は(マイコンの状態により)失敗するので、2回 Debug Launch するとブレイクすると思います。

関連

M5Stack RCA Module の I2S PCM5102A と Rust ESP32 xtensa-esp32-espidf ビルド

$
0
0

M5Stack RCA Module に搭載されている I2S (PCM5102APWR) を、Rust で生成した PCM 波形で発音させたメモです。

波形の生成は libymfm.wasm として WebAssembly 向けに作成している Rust 製のシーケンサーとサウンドチップエミュレーションをそのまま esp-idf に持ってきて xtensa-esp32-espidf ビルドしています。また、libymfm.wasm は C++ でつくられた FM 音源エミュレータの ymfm もリンクしています。

ESP32 Xtensa の Rust は初挑戦でしたが、確認した範囲で問題なくすんなり動作しました。ESP32 Xtensa Rust ツールチェインの準備やビルドは大変な印象がありましたが、昨今は esp-rs の各プロジェクトを組み合わせることで簡単に設定できるようになっています。

ちなみに ESP32-S3 開発ボードでも軽く動かしてみましたが問題なさそうです。ESP-S3 では PSRAM 80MHz Octa 設定にしているのが効いたか、波形生成は 1.4 倍程度高速でした。(Rust モジュールの細かなメモリ配置については未調査で課題としています)

ということで、この記事には以下の内容が含まれます。

  • I2S PCM5102APWR のイニシャライズ方法
  • ESP32 Xtensa Rust のビルド
実は M5Stack のスタックするモジュールを初めて買ったので、ボトムがないと寂しいことになると知らなかったのは内緒です。でも手軽に接続できてかっこいいです!

ソースコードは以下のリポジトリから見ることができます。詳しくはソースを見ていただくのが早いかもしれません。

https://github.com/h1romas4/m5stack-chipstream

This is a test to port C++’s ymfm and Rust’s vgmplay to ESP32(Xtensa).

Rust でつくられた VGM パーサーと SEGAPCM エミュレーションで I2S を発音させてるデモ:(残念ながら今回のビルドでは、ymfm の FM 音源エミュレーションは ESP32 で処理速度が間に合いませんでした

I2S PCM5102APWR のイニシャライズ

M5Stack Core2 に接続した RCA Module の PCM5102A の i2s_config と pin_config は以下のように設定すると良いようです。

// i2s_driver_install
i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
    .sample_rate = sample_rate,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_I2S),
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = dma_buf_count,
    .dma_buf_len = dma_buf_len,
    .use_apll = false,
    .tx_desc_auto_clear = true,
    .fixed_mclk = I2S_PIN_NO_CHANGE
};
ESP_ERROR_CHECK(i2s_driver_install(I2S_NUM_1, &i2s_config, 0, NULL));

// i2s_set_pin
i2s_pin_config_t i2s_pin_config = {
    .mck_io_num = GPIO_NUM_0,
    .bck_io_num = GPIO_NUM_19,
    .ws_io_num = GPIO_NUM_0,
    .data_out_num = GPIO_NUM_2,
    .data_in_num = I2S_PIN_NO_CHANGE
};
ESP_ERROR_CHECK(i2s_set_pin(I2S_NUM_1, &i2s_pin_config));

communication_format は必ず I2S_COMM_FORMAT_STAND_I2S を設定のこと。

うっかり I2S_COMM_FORMAT_STAND_MSB を設定するとなんとなく発音するものの、送信する PCM の先頭 1bit が無視されるような動きになってややはまり。(-32768, 32767 のフルスイング矩形波が正しく発音しなくて気が付きました…)

bits_per_sampleI2S_BITS_PER_SAMPLE_16BITchannel_formatI2S_CHANNEL_FMT_RIGHT_LEFT することで、int16_t のステレオ PCM 形式になります。

DMA バッファは、波形生成側のプリレンダのバッファリングに合わせて dma_buf_len を 1024 で dma_buf_count を 32個設定して動作させています。一度に扱うサンプル数としては int16_t ステレオにて 256 です。

今回のオーディオ系の実装ですが、波形生成を ESP32 の core 0 で、I2S への PCM の送信を core 1 と FreeRTOS タスクを分割して実行しています。なお、i2s_write にはほとんど時間がかからないようですので、波形生成は core 1 に持ってきても影響ないかもしれません。

タスク間の通信には、esp-idf の FreeRTOS Additions になっている RingBuffer の Byte buffers を介して PCM データの送受信を行っています。

FreeRTOS AdditionsRing Buffers

Byte buffers do not store data as separate items. All data is stored as a sequence of bytes, and any number of bytes can be sent or retrieved each time. Use byte buffers when separate items do not need to be maintained (e.g. a byte stream).

ESP32 Xtensa Rust のビルド方法

Xtensa の Rust ツールチェインは espup で導入するのが簡単でした。Windows の場合は WSL2 の Ubuntu 22.04 を使うと便利かもです。(sysroot は esp-idf 4.4.3 を使っています)

詳しくはリポジトリに GitHub Actions のビルドを入れていますの参考にしてください。

https://github.com/esp-rs/espup

Tool for installing and maintaining Espressif Rust ecosystem.

espup で Rust を導入すると ~/.rustup/toolchains/esp に Xtensa の Rust が導入されます。また .espressif/tools/xtensa-esp32-elf-clang に clang が入ります。

$ ls -laF ~/.rustup/toolchains/esp/bin/
合計 58120
drwxr-xr-x 2 hiromasa hiromasa     4096  2月 19 15:56 ./
drwxr-xr-x 7 hiromasa hiromasa     4096  2月 19 15:56 ../
-rwxr-xr-x 1 hiromasa hiromasa 21897920  2月 19 15:56 cargo*
-rwxr-xr-x 1 hiromasa hiromasa   954888  2月 19 15:56 cargo-clippy*
-rwxr-xr-x 1 hiromasa hiromasa  1796976  2月 19 15:56 cargo-fmt*
-rwxr-xr-x 1 hiromasa hiromasa 11781088  2月 19 15:56 clippy-driver*
-rwxr-xr-x 1 hiromasa hiromasa      759  2月 19 15:56 rust-gdb*
-rwxr-xr-x 1 hiromasa hiromasa     1933  2月 19 15:56 rust-gdbgui*
-rwxr-xr-x 1 hiromasa hiromasa     1072  2月 19 15:56 rust-lldb*
-rwxr-xr-x 1 hiromasa hiromasa    17264  2月 19 15:56 rustc*
-rwxr-xr-x 1 hiromasa hiromasa 11124040  2月 19 15:56 rustdoc*
-rwxr-xr-x 1 hiromasa hiromasa 11906968  2月 19 15:56 rustfmt*
$ ls -laF ~/.espressif/tools/xtensa-esp32-elf-clang/esp-15.0.0-20221201-x86_64-unknown-linux-gnu/esp-clang
合計 44
drwxr-xr-x 11 hiromasa hiromasa 4096  2月 19 15:57 ./
drwxr-xr-x  3 hiromasa hiromasa 4096  2月 19 15:57 ../
drwxr-xr-x  2 hiromasa hiromasa 4096  2月 19 15:57 bin/
drwxr-xr-x  4 hiromasa hiromasa 4096  2月 19 15:57 include/
drwxr-xr-x  8 hiromasa hiromasa 4096  2月 19 15:57 lib/
drwxr-xr-x  2 hiromasa hiromasa 4096  2月 19 15:57 libexec/
drwxr-xr-x  5 hiromasa hiromasa 4096  2月 19 15:57 riscv32-esp-elf/
drwxr-xr-x  9 hiromasa hiromasa 4096  2月 19 15:57 share/
drwxr-xr-x  5 hiromasa hiromasa 4096  2月 19 15:57 xtensa-esp32-elf/
drwxr-xr-x  5 hiromasa hiromasa 4096  2月 19 15:57 xtensa-esp32s2-elf/
drwxr-xr-x  5 hiromasa hiromasa 4096  2月 19 15:57 xtensa-esp32s3-elf/

ちなみに espup でツールチェインを入れると、esp-idf とは別のディレクトリ名に同バージョンの gcc が入るようです。(?)

さて、今回は Rust は波形生成をするライブラリの形で、C/C++ の Arduino Loop をメインとしたかったので、”esp-idf first” という構成としています。components 配下に Rust のプロジェクトをおいて、いつも通り idf.py build すると Rust ごとビルドしてくれます。

cargo generate で以下のテンプレートを cmake 指定してビルドスクリプトやディレクトリストラクチャーをつくっています。(引数を cargo にすると Rust 中心の構成になります)

https://github.com/esp-rs/esp-idf-template

cargo generate https://github.com/esp-rs/esp-idf-template cmake

esp-idf first のビルドでは components の下にいつも通りコンポーネントを配置し、CMakeLists.txt から external project として Rust を追加してビルドする動作するようにつくってくれます。

ビルドさえできてしまえば、あとは std 環境の Rust で、今回は外部ライブラリとしてバイナリーパーサ nom や JSON シリアライズ serde などを入れていますが、そのまま動作しました。

というわけで、ESP32 で Rust std が呼べる。とても便利す。

Rust の特定モジュールを IRAM に載せたり、ヒープアロケータの SRAM/PSRAM コントロール(できる?)など未調査の部分もありますので、引き続きやってみたいと思います。

関連

Zellij ターミナルワークスペースと WebAssembly プラグイン

$
0
0

自分は Linux をセットアップして最初に行う設定が tmux 関連だったりするのですが、新しい Windows 機の WSL2 にも秘伝の .tmux.conf を入れつつ、そうだ Zellij を試してみようと思い立ち、良い感じだったので紹介です。

Zellij

A terminal workspace with batteries included

Zellij (ぜりーじゅと読むそうです)は、いわゆるターミナルマルチプレクサーに種別されるソフトウェアで、セッション管理や、ターミナルエミュレータ上での画面分割やタブ制御を行うことができます。

Windows Terminal WSL2 上で動作している Zellij。

tmux よりも新しく作られていることもあり、デフォルトで自動起動スクリプトの出力やシステムクリップボード連携設定などが備わっており、また操作系も画面下部に表示することができるので非常に導入しやすいつくりとなっています。

導入

絶賛開発中 (記事執筆時点 0.36.0) の Rust でできたソフトウェアにて、導入は cargo install を使ってソースからビルドする方法が良いと思います。cargo なのでコマンド一発です。

Zellij User Guide – Installation

The easiest way to install Zellij is through a package for your OS.

If one is not available for your OS, you can download a prebuilt binary or even try Zellij without installing.

Otherwise, you can install it with Cargo.

cargo install --locked zellij
$ ls -laF ~/.cargo/bin/ | grep zel
-rwxr-xr-x  1 hiromasa hiromasa 17380208  4月 20 17:31 zellij*

フォント

Zellij は標準で powerline フォントに対応しています。自分は HackGen を使わせていただいています。(とてもきれいです…!)

https://github.com/yuru7/HackGen

白源 (はくげん/HackGen) は、プログラミング向け英文フォント Hack と、源ノ角ゴシックの派生フォント源柔ゴシックを合成したプログラミングフォントです。

なお、Windows Terminal だと Ricty 系の powerline フォントの罫線がずれるようです。

自動起動設定

バイナリー導入後、シェル設定ファイルに Zellij の自動起動設定を入れると便利です。

Zellij User Guide – Autostart on shell creation

Autostart a new zellij shell, if not already inside one. Shell dependent, fish:

自分は .bashrc ですので次のようになります。

echo 'eval "$(zellij setup --generate-auto-start bash)"' >> ~/.bashrc

ちなみに zellij setup --generate-auto-start bash の中身は次のようになっています。tmux だと自分で書かなければいけないので小粋な感じでぐー。

if [[ -z "$ZELLIJ" ]]; then
    if [[ "$ZELLIJ_AUTO_ATTACH" == "true" ]]; then
        zellij attach -c
    else
        zellij
    fi

    if [[ "$ZELLIJ_AUTO_EXIT" == "true" ]]; then
        exit
    fi
fi

というわけで、お好みで ZELLIJ_AUTO_ATTACH を設定すると、Windows Teminal などがダウンしたときにや誤ってタブを落とした時に自動復帰できて良いかと思います。

`.bashrc`

ZELLIJ_AUTO_ATTACH=true
eval "$(zellij setup --generate-auto-start bash)"

設定

Zellij はシングルバイナリーで動作するようになっていますが、設定ファイルを使うこともできます。デフォルト設定を最初に出力すると良いかと思います。

Zellij User Guide – Configuration

Zellij uses KDL as its configuration language.

mkdir ~/.config/zellij
# 設定ファイル
zellij setup --dump-config > ~/.config/zellij/config.kdl

自分のデフォルト設定から変えている定義は次の通りです。ほとんど変えてないですねw

// ペインのフレームをボーダレスに
pane_frames false
// 起動時の操作モードをインターフェース locked に
default_mode "locked"
// 配色テーマ
themes {
    tokyo-night-dark {
        fg 169 177 214
        bg 26 27 38
        black 56 62 90
        red 249 51 87
        green 158 206 106
        yellow 224 175 104
        blue 122 162 247
        magenta 187 154 247
        cyan 42 195 222
        white 192 202 245
        orange 255 158 100
    }
}
theme "tokyo-night-dark"

テーマは次のドキュメントからいただいてきたものです。

Zellij User Guide – Themes

Themes can be specified either in the configuration file under the themes section, or directly in a separate file.

レイアウト

Zellij の肝のひとつですが、レイアウトファイルを使うことによりペインに好きなパーツを配置することができます。

mkdir ~/.config/zellij/layouts
# デフォルト画面レイアウトファイル
zellij setup --dump-layout default > ~/.config/zellij/layouts/default.kdl

pain の一番目に後述する自分の WebAssembly プラグインを追加していますが、ファイルの内容は次のようになります。

layout {
    pane size=1 borderless=true {
        plugin location="file:/home/hiromasa/.config/zellij/plugins/zellij-datetime.wasm"
    }
    pane size=1 borderless=true {
        plugin location="zellij:tab-bar"
    }
    pane
    pane size=2 borderless=true {
        plugin location="zellij:status-bar"
    }
}

この定義が起動時の画面レイアウトと対応する形のつくりになっています。タブバーや下部のステータスバーがデフォルトプラグインとして実装されているのが分かります。

レイアウトファイルの記述方法は以下のドキュメントが参考になります。

Zellij User Guide – Layouts

Layouts are text files that define an arrangement of Zellij panes and tabs.

You can read more about creating a layout

また Zellij 起動時の引数でレイアウトファイルを指定できるため、作業によってワークスペースを切り替えるようなことも可能です。

WebAssembly プラグイン拡張

Zellij プラグインは WebAssembly/WASI で作成することができます。勉強がてら 日時 date-time を表示するプラグインを Rust でかいてみました。

https://github.com/h1romas4/zellij-datetime

This plugin adds a date and time pane to [Zellij](https://zellij.dev/), a terminal multiplexer.

Ubuntu/Alacritty で動作している様子。

なお、システムインターフェースは WASI API の範囲となります。とりあえずまだ TIMEZONE がとれない気がした(たぶん)ので +9 JST 固定でビルドしました。

WASI API 超えをしたい場合のアイディアメモ:(ホスト側で情報を取得するシェルスクリプトを動かして、結果をファイルかソケットでプロキシしていると思います)

https://github.com/yvt/zellij-cpulamp

Minimal CPU activity indicator plugin for Zellij

ファイルシステムへのセキュリティーポリシーなどがどうなっているかなど継続調査。ちなみに、WebAssembly ランタイムは Wasmer (執筆時点 2.3 系) が使われています。

Wasm を使っているため .wasm ファイルは amd64 や Arm といった CPU の違いを気にせず同一バイナリーが使えますので便利です。 .wasm を配置してレイアウトファイルで読み込ませれば動作を開始します。気軽に作成できます。

今回は Rust を使いましたが、言語を選ばずプラグインがかけるのも良いです。

ただ、まだ Rust と Zig 言語以外にはバインディングがなく、そのほかの言語では、引数をもらうのに WASI の stdin から JSON をがばっともらって自前でパースする必要がありそうです。この辺は、WebAssembly の Component Model (Interface Types) の仕様ができれば改善されることでしょう。


今回 Zellij のプラグインをかいていたら、昔よく VZ Editor のマクロをかいていたことを思い出しました。。Zellij 拡張も テトリスやスネークゲームなどもつくれそうな雰囲気です。

これだけ拡張性が高いと心強いですね。良ければお試しください。

AIMP オーディオプレイヤーでリッピングしたノンストップ系の CD で途切れなく再生する設定

$
0
0

表題の通りの設定メモです。

AIMP Enjoy The Music!

デフォルト設定だと、ノンストップ系の音源で曲と曲の間がクロスフェードしてつながってしまうので、次のように設定すると想定通り繋がるようになります。(トータルフレームサイズが分かる) .flac 形式で確認していますが、おそらく他の形式でも大丈夫です。

  • 設定 -> 再生
  • 再生右下 “DSP 管理”
  • ミキシングタブ -> ☑トラックの自動切換え -> “何もしない”

また、トラック先読み設定にも☑しておくと良い結果になるかもしれません。

以上、ぱっと見当たらなくて困ったのでメモでした。(再導入するたびにあれ?ってなってる気がしますw

Powerline 説明用メモ

$
0
0

Linux のプロンプトを彩る Powerline ですが、説明用メモ画像です。

以下、キャラクターコードごとそのままコピペ。

~  devel  rust  hello  $  echo 'hego' | grep 'hoge' > /dev/null
~  devel  rust  hello  $  # ← コマンドの $? が 0 以外だと赤くなる
~  devel  rust  hello  $  echo 'hego' | grep 'hego' > /dev/null
~  devel  rust  hello  $  # ← コマンドが $? が 0 なので赤くならない
~  devel  rust  hello  $ 
~  devel  rust  hello  $  cd ../../amd64/mame/
~  devel  amd64  mame  master  $  # git 配下の場合はカレントブランチ名がでる
~  devel  amd64  mame  master  $  echo "test/" >> .gitignore
~  devel  amd64  mame  master  ✎  $  # 未コミットだと赤鉛筆マーク
~  devel  amd64  mame  master  ✎  $  git add .gitignore
~  devel  amd64  mame  master  ✔  $  # ステージングで緑
~  devel  amd64  mame  master  ✔  $  git commit -m 'test'
[master 2058a2e6c50] test
 1 file changed, 1 insertion(+)
~  devel  amd64  mame  master  ⬆  $  # コミット済み & 未push で上矢印
~  devel  amd64  mame  master  ⬆  $  git reset --hard HEAD^1
HEAD is now at fb2b5745d1d namco/namcos10.cpp: Add MP3 decoder support to the MEM(P3) board. (#11210)
~  devel  amd64  mame  master  $  # 元通り

自分は Rust cargo でお手軽に導入できて高速な powerline-rs を使っています。

powerline-shell rewritten in Rust. Inspired by powerline-go.

$ cargo install powerline-rs
$ vi ~/.bashrc # 以下を追加
prompt() {
    PS1="$(powerline-rs --shell bash $?)"
}
PROMPT_COMMAND=prompt

Powerline フォントは HackGen Console NFが良いと思います…!(なお、最初のスクショは Ubuntu/Alacritty 上の Ricty Diminished for Powerline です)

https://github.com/yuru7/HackGen

白源 (はくげん/HackGen) は、プログラミング向け英文フォント Hack と、源ノ角ゴシックの派生フォント源柔ゴシックを合成したプログラミングフォントです。

ダウンロード(執筆時点で v2.9.0 です)

https://github.com/yuru7/HackGen/releases/tag/v2.9.0

HackGen_NF_v2.9.0.zip

以下、Windows Terminal と HackGen Console NF の表示です。


関連

Sipeed LicheePi 4A 導入記

$
0
0

Sipeed LicheePi 4A を購入しました…! プレオーダーして発売を楽しみにしていた RISC-V シングルボードコンピュータです。

https://sipeed.com/licheepi4a

Lichee Pi 4A
Powerful RISC-V SBC ever!

TH1520, 12nm, RISC-V 2.0G C910 x4
4 / 8 / 16 GB 64bit LPDDR4X-3733
TF Card, or 16 / 32 / 64 / 128 GB eMMC

今回購入したのは最初期バージョンの 8GB memory + 8GB storage (日本円で 1.7万円ほど)のもとのなり、しばらくすると各バリエーションが増えていくと思います。(そういえばこちらのスペック表に eMMC 8GB 版の記載がされてないですね… Wiki によると16GB 版はなくて 8GB 版になったようです)

https://wiki.sipeed.com/hardware/en/lichee/th1520/lpi4a/1_intro.html

· eMMC: 可选 空贴、 8G、 32G、 128G

メインボード(?) と、LM4A と呼ばれる RISC-V SoC と eMMC・メモリーとが 260P SODIMM で接続されているのが特徴で、おそらく今後 LM4A の各バリエーションの単体売りや、LM4A を使った機器の販売が予定されているのだと思います。楽しみです…!


ドキュメント Wiki(英語翻訳中とのこと) :

https://wiki.sipeed.com/hardware/en/lichee/th1520/lpi4a/1_intro.html

LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板,以 TH1520 为主控核心(4xC910@1.85G, RV64GCV,4TOPS@int8 NPU, 50GFLOP GPU),板载最大 16GB 64bit LPDDR4X,128GB eMMC,支持 HDMI+MIPI 双4K 显示输出,支持 4K 摄像头接入,双千兆网口(其中一个支持POE供电)和 4 个 USB3.0 接口,多种音频输入输出(由专用 C906 核心处理)。

本記事(2023-05)は発売直後のものです。OS や Wiki など今後変わる可能性が高い情報ですが、動かしてみた部分をいくつか書いておきたいと思います。

  • HDMI とオーディオコネクタはしっかり奥まで差し込みましょう。特に HDMI は割と硬いので奥まで刺さないと写りません。
  • 空冷用のファンとサーマルグリースシートが付属します。RISC-V 4コアを 1.85GHz で回すとファン付きで 60度くらいまで上がりますので付けましょう。
  • 電源は USB-C の 2A で SoC と HDMI、USB-SSD、Ethernet の動作は問題ありませんでした。Anker のスマホ充電用 USB Type C アダプタと(オーバースペックですが) 60W 通せる USB Type C to C ケーブルを使いました。
  • 12V DC Power は MISI LCDパネル(基板背面にコネクタあり)などを利用するときに使うとよいとのこと。

以下は OS に Debian イメージを使ったときの話題です。

  • 消費電力にも関係しますがメインボード側(LM4A の外側)に付いている WiFi/BT モジュールは(技適の関係もありますので)disable に設定。なお執筆時点(2023-05) BT については OSから認識されていません。
  • こちらも執筆時点(2023-05)、GPU についてもドライバーがフルサポートではないようです。自分もいくつかの GPU アクセラレーションを使うソフトが真っ黒になるなどを確認しました。また恐らく関連してか Firefox もダウンすることがあるようです。

eMMC への OS イメージの焼き方

ドキュメント記載の通りですが、執筆時点(2023-05)で最新だった Debian – GNOME(LPi4A_20230511_gnome.zip)イメージを使っています。

ダウンロード:

https://wiki.sipeed.com/hardware/en/lichee/th1520/lpi4a/3_images.html

Mega 云盘:点我 (←ここにあります)

焼き方:

https://wiki.sipeed.com/hardware/en/lichee/th1520/lpi4a/4_burn_image.html

電源の USB-C の上にある BOOT ボタンを押しながら、USB-C を PC の USB-C に接続すれば認識されるはずです。

自分は PC に Ubuntu/ThinkPad を使っているので dmesg lsusb は次のようになります。

$ sudo dmesg | tail -5
[ 2827.718195] usb 6-1: new high-speed USB device number 4 using xhci_hcd
[ 2827.882776] usb 6-1: New USB device found, idVendor=2345, idProduct=7654, bcdDevice= 2.23
[ 2827.882787] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2827.882791] usb 6-1: Product: USB download gadget
[ 2827.882794] usb 6-1: Manufacturer: T-HEAD
$ lsusb | grep 2345
Bus 006 Device 004: ID 2345:7654 T-HEAD USB download gadget

Windows の方は先程のダウンロード先にドライバーがあります。(WSL2 + usbipd でもいいかもしれません)

認識できたらアーカイブ内の burn_gnome_gpu.sh を実行すれば OK です。fastboot コマンドは Linux バイナリで、burn_gnome_gpu.sh もシェルスクリプトなので、Windows の方もやはり WSL2 でやったほうが簡単かもしれません。ドライバーも入れる必要がありません(認識のさせ方を記事の最後の「関連」に記載しておきます)

$ pwd
/home/hiromasa/devel/riscv/LPi4A/images/0511_gnome
$ ls -laF
合計 4259020
drwxrwxr-x 2 hiromasa hiromasa       4096  5月 12 12:04 ./
drwxrwxr-x 3 hiromasa hiromasa       4096  5月 17 16:05 ../
-rw-rw-r-- 1 hiromasa hiromasa   62914560  5月 12 11:35 boot-20230510-230240.ext4
-rwxrwxr-x 1 hiromasa hiromasa        368  5月 12 11:29 burn_gnome_gpu.sh*
-rwxrwxr-x 1 hiromasa hiromasa    2230360  5月  5 23:47 fastboot*
-rw-rw-r-- 1 hiromasa hiromasa       2022  5月 12 11:38 image_intro.txt
-rw-r--r-- 1 hiromasa hiromasa      68443  5月 12 11:36 light-lpi4a_1.85GHz.dtb
-rw-r--r-- 1 hiromasa hiromasa      68464  5月 12 11:36 light-lpi4a_2Ghz.dtb
-rw-rw-r-- 1 hiromasa hiromasa        259  5月 12 11:21 md5sum.txt
-rw-rw-r-- 1 hiromasa hiromasa 4294967296  5月 12 11:32 rootfs-20230511-183752-gnome.ext4
-rw-rw-r-- 1 hiromasa hiromasa     957728  5月 12 11:21 u-boot-with-spl-lpi4a-20230510.bin
$ cat burn_gnome_gpu.sh
#! /bin/sh
# Script to flash images via fastboot, edit image path first
#


sudo ./fastboot flash ram ./u-boot-with-spl-lpi4a-20230510.bin
sudo ./fastboot reboot
sleep 10
sudo ./fastboot flash uboot ./u-boot-with-spl-lpi4a-20230510.bin
sudo ./fastboot flash boot ./boot-20230510-230240.ext4
sudo ./fastboot flash root ./rootfs-20230511-183752-gnome.ext4

ちなみに、最初は慎重にやるために burn_gnome_gpu.sh を使わずに 1行づつ手で実行していたのですが flash uboot が waiting device になってしまいうまくいきませんでした。シェルスクリプトでやるとうまくいったので、reboot 後の sleep 10 後のタイミングが重要なのかもしれません。

起動

イメージが焼けたら HDMI をしっかり接続して USB-C 電源に接続すれば、ファンが始動し始め GUI が表示されると思います。ちなみにうちの 2560 x 1440 HDMI モニターだとログイン GDM から 2560 x 480 みたいな解像度で起動しました。w

$ cat /etc/debian_version
12.0
$ uname -a
Linux lpi4a 5.10.113-gbb4691fe5572 #1 SMP PREEMPT Wed May 10 14:16:50 UTC 2023 riscv64 GNU/Linux
$ arch
riscv64
$ cat /proc/cpuinfo | grep -e 'isa' -e 'freq'
isa             : rv64imafdcvsu
cpu-freq        : 1.848Ghz
isa             : rv64imafdcvsu
cpu-freq        : 1.848Ghz
isa             : rv64imafdcvsu
cpu-freq        : 1.848Ghz
isa             : rv64imafdcvsu
cpu-freq        : 1.848Ghz

ログインユーザは debian と sipeed ユーザの 2つがデフォルトで用意されています。最初は sipeed/licheepi でログインすると良いでしょう。sudo することができます。

eMMC の rootfs が 8GB とデスクトップ Linux としては小さいので自分は /mnt/ssd に ext4 フォーマットをした外付けの USB 3.1 SSD を接続してマウントしてなんとかしています。専用にして fstab でオートマウントしてもいいかもしれません。

$ mount | grep ssd
/dev/sda2 on /mnt/ssd type ext4 (rw,relatime)
$ pwd
/home/sipeed
$ ls -laF | grep /mnt
lrwxrwxrwx  1 sipeed sipeed   28 May 18 15:51 .cargo -> /mnt/ssd/home/sipeed/.cargo//
lrwxrwxrwx  1 sipeed sipeed   29 May 18 16:10 .rustup -> /mnt/ssd/home/sipeed/.rustup//
lrwxrwxrwx  1 sipeed sipeed   28 May 18 15:51 .wasmer -> /mnt/ssd/home/sipeed/.wasmer/
lrwxrwxrwx  1 sipeed sipeed   30 May 18 15:51 .wasmtime -> /mnt/ssd/home/sipeed/.wasmtime/
lrwxrwxrwx  1 sipeed sipeed   27 May 18 15:51 devel -> /mnt/ssd/home/sipeed/devel//
lrwxrwxrwx  1 sipeed sipeed   25 May 19 03:02 vgm -> /mnt/ssd/home/sipeed/vgm//

プログラムを LicheePi 4A 上でビルドすることを試してみたかったので gcc/clang と Rust 等を導入しています。

$ sudo apt install curl
$ sudo apt install build-essential cmake git
$ sudo apt install lm-sensors nmon
$ sudo apt install ssh openssh-server # ssh リモート接続したい場合
$ df -k | grep /
/dev/root        6923792  4086040   2494596  63% /
devtmpfs         3822156        0   3822156   0% /dev
tmpfs            3986160        0   3986160   0% /dev/shm
tmpfs            1594464     2152   1592312   1% /run
tmpfs               5120        8      5112   1% /run/lock
/dev/mmcblk0p2     52197    24842     23055  52% /boot
tmpfs             797232       28    797204   1% /run/user/1001
/dev/sda2      115012332 33002628  77233588  30% /mnt/ssd

なお、Rust toolchaine は Debian の rust-all ではなく rustup で導入しています。上記の通り Rust 系の導入場所はシンボリックリンクで USB-SSD 側に飛ばしていますので rootfs の容量には含まれていません。

$ pwd
/home/sipeed/.cargo
$ cat config.toml
[env]
TMPDIR = { value = "/mnt/ssd/home/sipeed/tmp2", force = true }
$ # cargo install する場合は rootfs /tmp を使われないように --target-dir を指定
$ cargo install --target-dir /mnt/ssd/home/sipeed/tmp alacritty

なお、openssh-server で導入した SSH でのリモート接続はデフォルトでパスワード認証になっています。

接続先は ip address コマンドで IP アドレスを取得すると良いでしょう。また、DHCP では起動のたびにアドレスが変わってしまうようなので、GNOME のネットワーク設定から固定にしたほうがいいかもしれません。

以下、LicheePi 4A 上で Rust アプリケーションのビルドをしている様子。RISC-V 4コア全てが 100% となり、SoC の温度は 60度くらいに。ファンコントロールもうまく動作しています。

$ watch df -k
$ watch sensors
$ sudo cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

以下、観測できた CPU クロック周波数です。

# /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq の結果例
800000  # Silence
1500000 # Normal
1848000 # Peek
300000  # Thermal Throttling?

一日中 rustc などでビルドを回していたら、一度だけサーマルスロットリング機能が働いて速度が低下するのを確認しました。断続的に休んだり働いたりする動きとなります。

ヘビーに使う場合は、ターミナルマルチプレクサなどで画面分割して、次のように CPU クロックを watch しておくと良いでしょう。なお、Debian は 1.84GHz で動作するように設定されています。(Wiki にありますが、個体によっては 2GHz でも動作するかもとのことです)

sudo watch -n1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_fre

Alacritty

試しに、GPU アクセラレーションを使う Rust 製のターミナルエミュレータである Alacritty のビルドしてみました。

$ sudo apt install pkg-config libfontconfig-dev
$ time cargo install --target-dir /mnt/ssd/home/sipeed/tmp alacritty
...(snip)..
   Installed package `alacritty v0.12.0` (executable `alacritty`)
real    16m22.428s
user    60m41.044s
sys     1m26.451s

起動ですが(予想はしていましたが)恐らく GPU ドライバーが未完成のため真っ黒画面でした。コマンドを打つとカーソルは動いているのが見えるので動作はしていそうです。(スクリーンショット右下で CPU が MAX になっているのは偶然です)

Zellij

ターミナルマルチプレクサ・ワークスペースである Zellij のビルド。こちらも Rust 製。

$ time cargo install --target-dir /mnt/ssd/home/sipeed/tmp zellij
real    51m20.308s
user    127m50.878s
sys     2m56.126s
$ zellij
Error occurred in server:

  × Thread 'async-std/runtime' panicked.
  ├─▶ At /home/sipeed/.cargo/registry/src/github.com-1ecc6299db9ec823/wasmer-compiler-cranelift-2.3.0/src/config.rs:73:45
  ╰─▶ construct Cranelift ISA for triple: Unsupported

実はこれも予想通りの結果なのですが、Zellij がプラグインシステムのために内蔵する WebAssembly ランタイム(Wasmer 2.3)が riscv64gc-unknown-linux-gnu に対応していないため Unsuppoted でダウンしました。OK です。

なお、本記事のスクリーンショットで使われている Zellij は、ssh 接続元のホスト側で動作しているものです。 LPi 4A 側でターミナルマルチプレクサを使いたい場合は tmux を使うと良いでしょう。

sudo apt install tmux

Wasmer

WebAssembly ランタイムである Wasmer(3.2 以降で RISC-V を initial support)を導入して、自分がつくっている VGM parser を動作させてみました。

Wasmer の速度が思ったとおりにでなくてリアルタイム演算できていないのですが、メインボード側の I2S デバイスで発音しています。(詳しくは動画概要欄をご覧ください)

Rust LLVM ビルドしたプログラムの実行速度については現在いろいろ検証中です。どうも生成するバイナリーが機械の性能に対して想定より遅いような気がしていますが、はっきりとまだ特定できていません。

target=riscv64gc-unknown-linux-gnu だけでなく、LLVM に RISC-V C910 に合わせた optimize option を指定する必要があるかもしれません。

ツイッターでいくつかつぶやいていますのでご参考程度で…

おわりに

というわけで、実機の RISC-V Linux を堪能できて楽しいボードだと感じています。 LM4A モジュールが単体発売されたら、自作でシンセサイザーになるボードをつくってみたいと夢見ていろいろ検証中です。

LM4A モジュールを使ったプロダクトの発売もいろいろ予定されているようなので、そちらも楽しみにしています…!


関連

Ubuntu 22.04 LTS で Microsoft PPA 版の dotnet-sdk-7.0 を導入するメモ

$
0
0

Ubuntu 上で .NET Core を使いたい場合は、Microsoft PPA から dotnet-sdk-7.0 パッケージを導入すると便利です。

Ubuntu に .NET SDK または .NET ランタイムをインストールする

この記事では、Ubuntu に .NET をインストールする方法について説明します。 Microsoft パッケージ リポジトリには、Ubuntu で現在または以前にサポートされていたすべてのバージョンの .NET が含まれています。 Ubuntu 22.04 以降では、Ubuntu パッケージ フィードで一部のバージョンの .NET を使用できます。 使用可能なバージョンの詳細については、「 サポートされているディストリビューション 」セクションを参照してください。

Ubuntu PPA 上にもパッケージが用意されていますが、Microsoft PPA を使う場合は次のようにします。

# Get Ubuntu version
declare repo_version=$(if command -v lsb_release &> /dev/null; then lsb_release -r -s; else grep -oP '(?<=^VERSION_ID=).+' /etc/os-release | tr -d '"'; fi)

# Download Microsoft signing key and repository
wget https://packages.microsoft.com/config/ubuntu/$repo_version/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

# Install Microsoft signing key and repository
sudo dpkg -i packages-microsoft-prod.deb

# Clean up
rm packages-microsoft-prod.deb

# Update packages
sudo apt update

ここまでドキュメントの通りですが、同名で Ubuntu PPA のパッケージがあるため、Microsoft PPA を優先させるために次のようにします。

これをしないと Ubuntu PPA 版のアップデートが起きた場合に上書きされて、dotnet コマンドは効けど SDK が見えなくなったりします。

(不具合が発生している場合は一度 dotnet* package を削除:)

sudo apt purge dotnet*
sudo apt autoremove

Microsoft PPA を優先設定:

sudo sh -c "cat > /etc/apt/preferences.d/dotnet <<'EOF'
Package: dotnet*
Pin: origin packages.microsoft.com
Pin-Priority: 1001
EOF"
sudo sh -c "cat > /etc/apt/preferences.d/aspnet <<'EOF'
Package: aspnet*
Pin: origin packages.microsoft.com
Pin-Priority: 1001
EOF"

dot-net-sdk-7.0 を導入:

sudo apt update
sudo apt install dotnet-sdk-7.0

これで dotnet --info が次のようになれば OK です。

$ dotnet --info
.NET SDK:
 Version:   7.0.302
 Commit:    990cf98a27

ランタイム環境:
 OS Name:     ubuntu
 OS Version:  22.04
 OS Platform: Linux
 RID:         ubuntu.22.04-x64
 Base Path:   /usr/share/dotnet/sdk/7.0.302/

Host:
  Version:      7.0.5
  Architecture: x64
  Commit:       8042d61b17

.NET SDKs installed:
  7.0.302 [/usr/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.5 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.5 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  DOTNET_ROOT       [/usr/lib/dotnet]

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

ハローワールド:

$ mkdir hello && cd hello
$ dotnet new console
テンプレート "コンソール アプリ" が正常に作成されました。

作成後の操作を処理しています...
/home/hiromasa/devel/dotnet/hello/hello.csproj を復元しています:
  復元対象のプロジェクトを決定しています...
  /home/hiromasa/devel/dotnet/hello/hello.csproj を復元しました (108 ms)。
正常に復元されました。
$ ls -laF
合計 20
drwxrwxr-x 3 hiromasa hiromasa 4096  5月 28 19:00 ./
drwxrwxr-x 5 hiromasa hiromasa 4096  5月 28 18:59 ../
-rw-rw-r-- 1 hiromasa hiromasa  105  5月 28 19:00 Program.cs
-rw-rw-r-- 1 hiromasa hiromasa  249  5月 28 19:00 hello.csproj
drwxrwxr-x 2 hiromasa hiromasa 4096  5月 28 19:00 obj/
$ dotnet run
Hello, World!
$ file obj/Debug/net7.0/hello.dll
obj/Debug/net7.0/hello.dll: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

VS Code の C# Extention でコーディングしてデバッグブレイクしている様子:


ファイルツリー表記をテキストで記述する

$
0
0

技術文書などでファイルとディレクトリ・フォルダ構造を図解したい場合に、テキストを使った定義から .svg.png を生成する方法メモです。

出力例:

いくつか方法があると思いますが、Docker – PlaantUML Server と VS Code – PlantUML 拡張を使うとお手軽にいけると思います。

Docker で PlantUML Server を起動。8080 ポートが何かとかぶっている場合は変更のこと。(9090:8080 等。ホスト側: コンテナ側 にて、ホスト側を設定します)

docker run -d --rm -p 8080:8080 plantuml/plantuml-server:jetty

VS Code に PlantUML 拡張を導入。

https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml

Rich PlantUML support for Visual Studio Code.

VS Code .vscode/settings.json などで以下を設定。Docker で起動した PlantUML Server とポートを合わせます。

    "plantuml.server": "http://localhost:8080"

VS Code で test.puml など *.puml 拡張子でファイルを新規作成し PlantUML Salt 記法でファイル、ディレクトリツリーをテキストで定義。なお、<&folder> などのアイコン定義名は open-iconic のものが使えます。

@startsalt diag-sequence-sample2
{
{T
 + <&folder> wp-admin
 + <&folder> wp-content
 ++ <&folder> themes
 +++ <&folder> my-theme   | 新規作成
 ++++ <&file> style.css   | 新規作成
 ++++ <&file> index.php   | 新規作成
 ++ <&folder> uploads
 + <&folder> wp-includes
 + <&file> .htaccess      | 自動作成
 + <&file> index.php
}
}
@endsalt

VS Code でカーソルを @startsalt@endsalt の間に合わせ、 [F1] 押下後、PlantUML: Preview Current Diagram を選択。

プレビューしながらいい感じになったら、[F1] から PlantUML: Export Current Diagram.svg.png を選択してファイルエクスポート。なお、.png のサイズはプレビューしているのと同じ大きさになるようです。

以上です。

PlantUML は Salt 以外にもテキスト定義でいろいろ描けますので、準備しておくと何かと便利ではないかと思います。

AsciiMath の例:

@startmath math-sample1
f(t)=(a_0)/2 + sum_(n=1)^ooa_ncos((npit)/L)+sum_(n=1)^oo b_n\ sin((npit)/L)
@endmath

起動した PlantUML Server の停止:

$ docker ps
CONTAINER ID   IMAGE                            COMMAND            CREATED          STATUS          PORTS                                       NAMES
8ca704e9a848   plantuml/plantuml-server:jetty   "/entrypoint.sh"   54 minutes ago   Up 54 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   cranky_chandrasekhar
$ docker stop 8ca704e9a848
$ docker ps -a
# --rm 指定で PlantUML Server を起動しているので終了と同時に破棄される

関連

Asciidoc 文書及びその中に含まれる PlantUML 形式を HTML/PDF に自動ビルドできるようにした文書執筆環境についての記事が以下にあります。

Sixel グラフィックス対応ターミナル

$
0
0

Sixel グラフィックスは、キャラクターベースのターミナルエミュレータを拡張し、特別なエスケープシーケンスを送信することでビットマップグラフィックを表示する技術です。

この記事は、2023-06 に VS Code 内蔵ターミナルエミュレータが Sixel グラフィックスを実験的にサポートしたので試してみたのと、他の使っているターミナルについても対応状況を調べてみたメモです。

Sixel グラフィックスに対応したターミナルは、curl した画像やジェネレータコマンドで生成した画像をそのままの流れで確認できたりするので便利です。

VS Code

VS Code 設定:(expertimertal から stable に昇格した時は設定不要になるはずです)

{ "terminal.integrated.experimentalImageSupport": true }

ImageMagick の convert コマンドで出力を sixel:- とすると標準出力に sixel 形式が出力されターミナルにグラフィックが表示されます。

$ convert -font 'Noto-Sans-CJK-JP' math-sample1.svg sixel:-

なお .svg 表示などのレンダリングで使われる、convert コマンドから見えるフォント名は以下のようにすると得ることができます。

$ convert -list font | grep -e Font | egrep 'JP$'
  Font: Noto-Sans-CJK-JP
  Font: Noto-Sans-Mono-CJK-JP
  Font: Noto-Serif-CJK-JP

Alacritty

2023-06 現在まだマージされていませんが、対応が進んでいるようです。

Support for graphics in the terminal #4763

This patch adds support for graphics in the terminal. Graphics can be sent as Sixel images.

ビルドして Zellij + Alacritty で動作させてみた様子。(Zellij を通すと clearコマンドなどが正常に機能しないパターンがあるかも。Alacritty のみだと綺麗に動作しています)

$ montage *.jpg -tile 4x3 -geometry 240x240 sixel:-

Windows Terminal

Windows Terminal はサポートリクエストがあがっています。ソースコードを grep すると sixel という文字列がいくつか見えるので対応するのかな?(未確認)

Feature Request: sixel graphics support #448

Would like to see Sixel support in the Terminal, this is the standard used to show graphics in the console.

継続ウォッチしていきます。

関連

WSL2 上の VS Code で Paste Image 拡張を使う

$
0
0

WSL2 と VS Code WSL Remote 拡張で Linux 上の Markdown や Asciidoc を編集している場合に、Paste Image 拡張や Asciidoc 拡張のクリップボード経由での画像挿入を有効にする方法です。

ワークアラウンドではありますが、WSL2 側 Paste Image 拡張のファイルを次のように置き換えます。(Asciidoc 拡張も同ファイル res/linux.sh があります)

~/.vscode-server/extensions/mushan.vscode-paste-image-1.0.4/res/linux.sh

#!/bin/sh
# change current directory
cd `dirname $0`
# set dist path
DISTPATH=//wsl.localhost/Ubuntu-22.04 # <1>
# call Windows PowerShell
powershell.exe -ExecutionPolicy Bypass -File pc.ps1 ${DISTPATH}$1

<1> 行はお使いの WSL2 Linux ディストリビューションのパスを設定してください。

$ pwd
/home/hiromasa
$ powershell.exe -Command "pwd"
Path
----
Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Ubuntu-22.04\home\hiromasa

WSL2 から powershell.exe を呼び出せることを利用して、linux.sh から Windows 版の Paste Image の pc.ps1 を呼び出し Windows 側のクリップボードから画像を取得し、画像出力先を WSL2 側のパスになるような処理をしています。(VS Code のセキュリティーポリシー外の世界で動作しますので、動作をご理解の上設定してください)

なお、拡張のアップデート時にはファイルが上書きされると思いますので再パッチしてください。

関連

WordPress Playgorund と wp-now と VS Code Extention

$
0
0

札幌の SaCSS Season 2 Vol.2 勉強会にて「WebAssembly でつくる簡単 WordPress 製作環境」というお題目で LT をさせていただきました。

SaCSS 参加は 3年半振り…!ご無沙汰してしまいました…!

WordPress Playground を使った、WordPress のローカル環境への導入方法を、

  • なんもいれたくない派閥
  • VS Code は入っている派
  • コマンドライン派

ごとにお話しています。

WebAssembly を活用し、PHP や DB などのミドルの個別導入が不要なことから(.wasm にビルドされ内包されています)、いずれも思いついてから 10分以内で動作すると思います。

PDF スライドを以下に配置しました。手順やドキュメント URL など掲載がありますので、よければご覧ください。

style.css

/*
Theme Name: WordPress Theme
Author: h1romas4
Description: WordPress Theme
Version: 1.0
*/

index.php

<p>Hello, World</p>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
    <?php the_content(); ?>
<?php endwhile; endif; ?>

管理画面 URL http://localhost:8881/wp-admin/

最新の WordPress が本当にお手軽に試せますので良ければ遊んでみてください…!

(まだリリースされて時期が浅くインターネット検索が混乱していますので)ドキュメント等へのリンクを以下に掲載しておきます。

関連

Asciidoc と PlantUML で文書をつくる

$
0
0

技術書系のドキュメントを書く場合に使いたくなる表現をテキストで書きたいなと考え、以前からつくっていた「Asciidoctor と Gradle でつくる文書執筆環境」というドキュメントを刷新してみました。

AsciidoctorとGradleでつくる文書執筆環境(HTML version)

AsciidoctorとGradleでつくる文書執筆環境(PDF version)

同人系の PDF 本技術書執筆環境としても使えそうなので、試行的に BOOTH 頒布もしてみています。表紙は @Fujix さん に描いていただきました!

[BOOTH] AsciidoctorとGradleでつくる文書執筆環境 応援版

技術書や文書を執筆する際に使える簡単お手軽 Asciidoc 執筆環境構築ガイドです。環境構築手順や執筆時のノウハウを 1冊の本にまとめました。

今回の刷新では、自分が書きそうなものに寄っていますが、特に PlantUML と dataa 記法による、ダイアグラムに関する部分を追加執筆しています。

アイディア次第でいろいろ応用できそうです。プレゼンテーションのスライドに入れる図をつくるにも便利かもしれません。

シーケンス図:

フォルダツリー:

ブロック図:

メモリーマップ:

タイミングチャート:

マインドマップ:


テキストダイアログ記法は「考えながら描ける」のがとても良いです。図表の最終点を定まってない場合に試行錯誤するのが手軽です。また、一度、図表は画像書き出ししてしまうと修正が億劫になるものですが、テキスト記法だとメンテナンス性も高いように思います。良い。

Windows WSL2 の Ubuntu 22.04 で WSLg アプリをダークモードで起動する

$
0
0

WSL2/WSLg な Ubuntu 22.04 の GTK アプリに GNOME のダークモード系のテーマを適用する手順です。

以下の設定で GTK 系は Ubuntu 22.04 の黒系デフォルトと(Yaru-dark)と同じ表示になると思います。

# 日本語系導入とロケールを ja_JP.UTF8 に設定
sudo apt -y install language-pack-ja
sudo update-locale LANG=ja_JP.UTF8
# 何かひとつ GUI アプリ入れて GTK 依存関係を導入
sudo apt install nemo
# テーマやカラースキーム導入
sudo apt install yaru-*
gsettings set org.gnome.desktop.interface gtk-theme 'Yaru-dark'
gsettings set org.gnome.desktop.interface icon-theme 'Yaru'
gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
gsettings set org.gnome.desktop.wm.preferences theme 'Yaru-dark'

本家の GNOME 系と単純に GTK を使っているアプリで見ている設定が異なるようすでしたメモ。(org.gnome.desktop.interface color-scheme 設定も入れないと GNOME 系が白くなってた)

さて、あまり関係ないですがファイラーの nemo は WSL2 ターミナルから nemo . とするとカレントディレクトリで起動できます。WSL2 側のコマンドラインで扱いずらい非定型のファイル操作をするとき便利と思います。

関連

Sipeed Lichee Pi 4A 導入記 (2023-07-11 版)

$
0
0

2023-07-11 の記事です。

RISC-V SBC である Sipeed Lichee Pi 4A の、新しい OS イメージ(& Linux カーネル)が公開されていましたので早速試してみました。

なお、自分が使っている LPi 4A のハードウェアは 2023-07 に発売になったリリース版ではなく 2023-05 発売のベータ版です。動作が違う部分があるかもなのでご注意ください。

revyos 編

Official Sipeed image としてリリースされている Debian sid ベースのイメージです。Linux カーネルなどは revyos | thead-kernel という名前のリポジトリでホストされています。この記事では revyos kernel と呼ぶことにします。

Official Sipeed image

The image for the LicheePi 4A is updated irregularly. The initial image may not be stable, or it may not be able to fully utilize the performance of the TH1520. Please follow the steps below to get the latest image.

Mega Cloud Storage:click me

LPI4A_20230706.zip

2023-07-06 版では、試したところ以前は動作しなかった Vulkan が動作するようになっています。

つきまして MAME を Vulkan backend 指定で起動できました。good…!

$ sudo apt install mame
$ mame -window -resolution 800x600 \
    -video bgfx -bgfx_backend vulkan \
    -bgfx_screen_chains unfiltered \
    -bgfx_debug # -rompath ./roms mslug

glmark2-es も 500fps や 600fps といった動作を見せています。(下のスクリーンショットは横でキャプチャなどの操作をしているので本来の値ではないです)

ちなみに GPU 系は revyos-elgs24 package として通常の main とリポジトリが分かれているようです。

以下、ToDo メモ:

まだ詳しく見ていないのですが package 外の自前の Vulkan を使うソースをビルドするとイニシャライズに失敗するような気がしました。libvulkan-dev ? こちらの issue と似ていますが後日再検証。

https://github.com/sipeed/LicheePi4A/issues/15

The good news: lichee pi4a has a vulkan driver.
The bad news: vkcube will refuse to run, due to an assertion failure:

OpenCL については先月 issue が上がっていますが、こちらも未検証です。clinfo はそのまま正しく動作するようになっていました。

https://github.com/sipeed/LicheePi4A/issues/13

I can use OpenCL now, but sadly it segfaults as soon as I enqueue my kernel.
The callstack is of little use. Is there any way that I can get the debug symbols for libPVROCL.so perhaps?

動画エンコード・デコード支援。こちらも後日確認すること。

Ubuntu 22.04 編

公式 Wiki に Ubuntu の文字が見えますので、おそらくそのうちに Ubuntu ベースのイメージもでると思いますが、試しに自分で revyos kernel と kernel module を使って Ubuntu 22.04 を起動してみました。

Ubuntu 22.04 の rootfs としては RISC-V 版 rootfs (Ubuntu Base) の最小構成を使っています。

Ubuntu Base 22.04.2 LTS (Jammy Jellyfish)

ubuntu-base-22.04-base-riscv64.tar.gz

ネットワークや ALSA、USB 機器など、確認した範囲で正しく動作しています。(無線系は未検証です)

残念ながら GDM3 や GNOME を起動するとグラフィックの矩形描画が異常に遅い事象が発生しました。原因は特定できませんでしたが、Ubuntu 22.04 の場合は今の所画面を使わない CUI での利用が良さそうです。(どうも frame buffer の書き込みで CPU が高付加になるような動きでした。libdrm? mutter?)

ちなみに squashfs ファイルシステムが有効になっていなくて snapd は試せませんでした。今度試すメモ。 以下のカーネルパラメータ追加で snapd が動作することを確認しました。なお riscv64 に対応した snap パッケージはまだ多くはないですので、Snapcraft サイトで arch を確認のこと。

kernel/arch/riscv/configs/revyos_defconfig

CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
CONFIG_SQUASHFS_LZO=y

スクリーンショットは Ubuntu 20.04 のもの。22.04 でも大丈夫です。

revyos が Debian sid なので Ubuntu 23.10(10月) が動くと嬉しいですね…!

openSUSE Linux

openSUSE も RISC-V 版の rootfs が公開されていますので試しに起動してみました。

openSUSE images for RISC-V

Tumbleweed Port Images | openSUSE-Tumbleweed-RISC-V-XFCE.riscv64-rootfs.riscv64-2023.05.15-Build2.15.tar.xz

openSUSE は XFCE 版にて GUI も良好な速度で実行できています。(少しマウスカーソルの表示位置がずれているかな?あと RPi 4A よか速く感じます) なお、GNOME 版は起動時に gnome-shell が signal 11 でダウンにて起動できず。

Vulkan や OpenGL ES はバイナリや定義を配置してみましたが、うまくイニシャライズできずでした。(深くやってないので、自分が何か間違っているかもです)

rootfs イメージのつくりかた (openSUSE)

openSUSE の LPi 4A 用の rootfs のつくりかたの例です。

amd64 の普通の(?) Ubuntu 22.04 を使ってイメージ作成の作業をします。(Windows/WSL2 な Ubuntu 22.04 で行う場合の準備はこの記事の下の方に記載しました)

手順中、mount/unmount したり RISC-V 側の root のファイルを上書きしたりするため sudo している箇所があります。うっかりパスの先頭に / をつけてしまうなどして、ホスト側の Ubuntu を壊さないように注意してください。

amd64 Ubuntu 側の準備(RISC-V qemu と systemd を起動する systemd-container を導入)

sudo apt install systemd-container binfmt-support qemu-user-static

amd64 Ubuntu 側に、これからつくる rootfs 用の領域作成:

mkdir work && cd work
# create fs
dd if=/dev/zero of=rootfs-suse-image.ext4 bs=1M count=4096
mkfs.ext4 -b 4096 -L root rootfs-suse-image.ext4
# mount
mkdir rootfs
sudo mount -o loop rootfs-suse-image.ext4 rootfs/

ダウンロードしてきた OS の rootfs を展開、qemu のバイナリ配置:

# openSUSE rootfs ダウンロード
wget https://download.opensuse.org/ports/riscv/tumbleweed/images/openSUSE-Tumbleweed-RISC-V-XFCE.riscv64-rootfs.riscv64-2023.05.15-Build2.17.tar.xz
# ダウンロードしておいたイメージを展開
sudo tar xvf openSUSE-Tumbleweed-RISC-V-XFCE.riscv64-rootfs.riscv64-2023.05.15-Build2.15.tar.xz -C rootfs/
# RISC-V エミュを rootfs に入れる
sudo cp /usr/bin/qemu-riscv64-static rootfs/usr/bin/
# RISC-V として OS をコンテナ起動
sudo systemd-nspawn -D rootfs

ここから qemu 起動した openSUSE の世界 (openSUSE にログインできてない状態でコマンドを実行すると悲劇が起きるのでご注意ください)

# OS パッケージを最新化
sudo zypper dup
# ユーザー作成・パスワード設定(ここでは sipeed に)
useradd -m -u 1001 sipeed
passwd sipeed
# 念の為 openSUSE カーネルのカーネルモジュールを削除
rm -Rf /usr/lib/modules/*
rm -Rf /usr/lib/firmware/*
rm -Rf /boot/*
# Ubuntu の世界に戻る
exit

クリーンアップ:

sudo rm rootfs/usr/bin/qemu-riscv64-static 

revyos (rootfs-thead-image-linux_sing.ext4) からカーネルモジュールと `fstab` を抽出して openSUSE に配置:

# revyos image LPI4A_20230706.zip を
# ダウンロード後、展開して
# rootfs-thead-image-linux_sing.ext4 をカレントディレクトリに
# 配置しておくこと。
mkdir revyos 
sudo mount -o loop rootfs-thead-image-linux_sing.ext4 revyfs/
# カーネルモジュールコピー(root のファイルがあるので sudo するのに注意)
sudo mkdir -p rootfs/usr/lib/modules/
sudo cp -Rfp revyfs/usr/lib/modules/* rootfs/usr/lib/modules/
sudo cp -Rfp revyfs/usr/lib/firmware/ rootfs/usr/lib/
# fstab コピー
sudo cp -p revyfs/etc/fstab rootfs/etc/
# GPU のバイナリのライブラリ等をコピー(試す場合も、OS 起動確認後で OK なのでここではコメントアウト)
# memo: /usr/lib/libvulkan.so* は使われてなさそう
# sudo cp -p revyfs/usr/lib/lib*.so rootfs/lib64/
# sudo cp -p revyfs/usr/lib/lib*.so.1 rootfs/lib64/
# sudo cp -Rfp revyfs/etc/vulcan rootfs/etc/
# sudo cp -Rfp revyfs/etc/OpenCL rootfs/etc/
# できたので umount
sync && sync && sync
sudo umount revyfs
sudo umount rootfs

これにて openSUSE の .ext4 イメージが rootfs-suse-image.ext4 としてできたので、あとは revyos と同じように LPi 4A に flash します。

Linux カーネルは、LPi 4A の RAM が 8GB 版が boot_8gddr.ext4 で 16GB は boot_16gddr.ext4 にしてください。

Lichee Pi 4A の boot ボタンを押しながら amd64 Ubuntu に接続。Windows の方は公式の方法か WSL2 にて認識させて実行

sudo fastboot flash ram u-boot-with-spl.bin
sudo fastboot reboot
sleep 10
sudo fastboot flash uboot u-boot-with-spl.bin
sudo fastboot flash boot boot_8gddr.ext4
sudo fastboot flash root rootfs-suse-image.ext4

うまく openSUSE が起動したら最後に rootfs のパーティションの拡張を行います。(イメージを 4GB でつくっているため)

$ df -k
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/root        4046560  1978100   1842364  52% /
...snip...
$ sudo parted -s /dev/mmcblk0 "resizepart 3 -0"
$ sudo resize2fs /dev/mmcblk0p2
$ sudo resize2fs /dev/mmcblk0p3
$ df -k
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/root        6923792  1978100   4602536  31% /
...snip...

なお、このイメージの openSUSE の root のパスワードは linux です。

もし以下の「Oh no!」画面でうまく起動しなかったら、ctrl + alt + F2 で tty2 に移動してコンソールから dmesg などを見てください。

rootfs イメージのつくりかた (Ubuntu 22.04.2)

openSUSE の手順と同じ要領で。

amd64 Ubuntu 側の準備(RISC-V qemu と systemd を起動する systemd-container を導入):

sudo apt install systemd-container binfmt-support qemu-user-static

ファイルシステム作成:

mkdir work && cd work
# create fs
dd if=/dev/zero of=rootfs-ubuntu-image.ext4 bs=1M count=4096
mkfs.ext4 -b 4096 -L root rootfs-ubuntu-image.ext4
# mount
mkdir rootfs
sudo mount -o loop rootfs-ubuntu-image.ext4 rootfs/

ダウンロードしてきた OS の rootfs を展開、qemu のバイナリ配置:

# Ubuntu base ダウンロード
wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04.2-base-riscv64.tar.gz
# extract
sudo tar pxf ubuntu-base-22.04.2-base-riscv64.tar.gz -C rootfs
# apt を clean に
echo 'APT::Sandbox::User "root";' | sudo tee rootfs/etc/apt/apt.conf.d/90run-as-root
# RISC-V エミュ配置
sudo cp /usr/bin/qemu-riscv64-static rootfs/usr/bin/
# RISC-V として OS をコンテナ起動
sudo systemd-nspawn -D rootfs

ここから RISC-V Ubuntu 22.04 の世界。(RISC-V Ubuntu 22.04 にログインできてない状態でコマンドを実行すると悲劇が起きるのでご注意ください)

# package update
apt update && apt full-upgrade -y && apt autoremove -y
# create manual
/usr/local/sbin/unminimize
# create user
adduser -u 1000 --gecos debian debian
adduser -u 1001 --gecos sipeed sipeed
usermod -aG adm,cdrom,sudo,dip,plugdev debian
usermod -aG adm,cdrom,sudo,dip,plugdev sipeed
# cli からサウンドを試したい場合
# sudo usermod -aG audio sipeed
# 最小限使える packege 導入
# ちなみに server^ 系を入れると cloud-* 系の systemd 起動に数分時間がかかった
# standard^ までなら数秒で起動します
apt install -y minimal^ standard^
apt install language-pack-ja avahi-daemon
# ネットワーク設定
cat <<EOF > /etc/netplan/01-base.yaml
network:
  ethernets:
    eth0:
      dhcp4: true
  version: 2
EOF
# ネットワーク作成
netplan generate
# hostname 設定
echo "licheepi" > /etc/hostname
cat <<EOF >/etc/hosts
127.0.0.1       localhost
127.0.1.1       licheepi
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
# sshd 構成 - パスワード認証 OK
sudo apt install openssh-server
sed -i 's/^#\(PasswordAuthentication\) .*$/\1 yes/' /etc/ssh/sshd_config
# もしもスローダウンする gnome を試す場合(しない場合は以下不要)
sudo apt-get install \
  adwaita-icon-theme-full \
  mutter \
  gdm3 \
  gnome \
  gnome-shell-extension-appindicator \
  gnome-shell-extension-desktop-icons-ng \
  gnome-shell-extension-ubuntu-dock \
  gnome-terminal \
  network-manager-gnome \
  ubuntu-gnome-wallpapers \
  ubuntu-settings
# desktop を入れた場合 Wayland 無効 - WaylandEnable=false
# 初期解像度がおかしくなるため
vi /etc/gdm3/custom.conf 
# exit
exit

クリーンアップ:

sudo rm rootfs/etc/apt/apt.conf.d/90run-as-root
sudo rm rootfs/usr/bin/qemu-riscv64-static 

revyos (rootfs-thead-image-linux_sing.ext4) からカーネルモジュールと `fstab` を抽出して RISC-V Ubuntu 22.04 に配置:

# revyos image LPI4A_20230706.zip を
# ダウンロード後、展開して
# rootfs-thead-image-linux_sing.ext4 をカレントディレクトリに
# 配置しておくこと。
mkdir revyfs 
sudo mount -o loop rootfs-thead-image-linux_sing.ext4 revyfs/
# カーネルモジュールコピー(root のファイルがあるので sudo するのに注意)
sudo mkdir -p rootfs/usr/lib/modules/
sudo cp -Rfp revyfs/usr/lib/modules/* rootfs/usr/lib/modules/
sudo cp -Rfp revyfs/usr/lib/firmware/ rootfs/usr/lib/
# fstab コピー
sudo cp -p revyfs/etc/fstab rootfs/etc/
# GPU のバイナリのライブラリ等をコピー(試す場合も、OS 起動確認後で OK なのでここではコメントアウト)
# memo: /usr/lib/libvulkan.so* は使われてなさそう
# sudo cp -p revyfs/usr/lib/lib*.so rootfs/usr/lib/
# sudo cp -p revyfs/usr/lib/lib*.so.1 rootfs/usr/lib/
# sudo cp -Rfp revyfs/etc/vulcan rootfs/etc/
# sudo cp -Rfp revyfs/etc/OpenCL rootfs/etc/
# できたので umount
sync && sync && sync
sudo umount revyfs
sudo umount rootfs

あとは openSUSE の手順と同様に、できた rootfs-ubuntu-image を flash して、起動後に rootfs を resize すれば OK と思います。

その他

revyos では、以下の特別な systemd が使われているようです。(今回の rootfs 作成手順にはこれらの systemd 設定を入れていません)

  • firstboot.service : 初期起動時のファイルシステムのリサイズと sshd-keygen。この記事の手順では手動で resize しているので起動しなくて OK。
  • pvrsrvkm.service : GPU のカーネルモジュールを再ロード?(/usr/share/gpu/insmod.sh を起動しているが失敗している)必要なしかも?
  • rtk-hciattach.service : Realtek H5 bluetooth support。(無線なので)未検証。
├── etc
│   ├── systemd
│       └── system
│           ├── firstboot.service
│           ├── pvrsrvkm.service
│           └── rtk-hciattach.service
├── opt
│   └── firstboot.sh
└── usr
    ├── local
    │   └── bin
    │       ├── hdmi-toggle
    │       └── rtk_hciattach
    └── share
        └── gpu
            ├── insmod.sh
            └── rmmod.sh
  • hdmi-toggle : 未検証。
$ cat /etc/udev/rules.d/hdmi.rules
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi-toggle"
$ cat /etc/udev/rules.d/hdmi_first_hotplug
0

rebyos ユーザーランドバイナリーのありか

revyos の rootfs にあるユーザーランドのドライババイナリや、GPU ファームウェアは以下のリポジトリのブランチ(uos_test) や deb repository に格納されています。

revyos / gpu_bxm_4_64-kernel

libVK_IMG.so

https://mirror.iscas.ac.cn/revyos/revyos-gles-21/pool/main/t/thead-gles-addons/

thead-gles-addons_1.16.tar.xz

その他の addons。

https://github.com/revyos/mkimg-th1520

build system image for TH1520 boards

Windows/WSL2 Ubuntu 22.04 上で systemd-container を起動

Windows の方は WSL2 Ubuntu 22.04 で rootfs の作成を実施するのが便利です。若干、追加の設定が要ります。手順 1-3 までを実施します。

手順1)とりあえず WSL2/Ubuntu 22.04 にパッケージをインストール。

sudo apt install systemd-container binfmt-support qemu-user-static

手順2)WSL2 の [boot] systemd=true を有効にして、この後 wsl --shutdown などで再起動。

$ sudo vi /etc/wsl.conf
[user]
default=hiromasa
[boot]
systemd=true

(メモ)コンテナ起動するも riscv64 のバイナリがうまく qemu-riscv64-static に渡っていなそうな雰囲気。

# RISC-V エミュを rootfs に入れる
$ sudo cp /usr/bin/qemu-riscv64-static rootfs/usr/bin/
# riscv64 systemd な Linux 起動
$ sudo systemd-nspawn -D rootfs
Spawning container rootfs on /home/hiromasa/devel/riscv/lip4a/revyos-build/create/rootfs.
Press ^] three times within 1s to kill container.
execv(/bin/bash, /bin/sh) failed: Exec format error
Container rootfs failed with error code 1.

(メモ)qemu-riscv64 が見当たらない。

$ update-binfmts --display
llvm-14-runtime.binfmt (enabled):
     package = llvm-14-runtime
        type = magic
      offset = 0
       magic = BC
        mask =
 interpreter = /usr/bin/lli-14
    detector =
python3.10 (enabled):
     package = python3.10
        type = magic
      offset = 0
       magic = \x6f\x0d\x0d\x0a
        mask =
 interpreter = /usr/bin/python3.10
    detector =

手順3)riscv64 の定義はあるが import されていないのでインポート。(aarch64 などの場合も同様に /usr/share/binfmts 内で定義を探して import)

$ ls -laF  /usr/share/binfmts | grep riscv
-rw-r--r--   1 root root   305  6月 13 20:33 qemu-riscv32
-rw-r--r--   1 root root   305  6月 13 20:33 qemu-riscv64
$ sudo update-binfmts --import qemu-riscv64
$ update-binfmts --display
...snip...
qemu-riscv64 (enabled):
     package = qemu-user-static
        type = magic
      offset = 0
       magic = \x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00
        mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
 interpreter = /usr/libexec/qemu-binfmt/riscv64-binfmt-P
    detector =

(メモ)これで WSL2 でも riscv64 の rootfs を起動できます。

$ sudo systemd-nspawn -D rootfs/
Spawning container rootfs on /home/hiromasa/devel/riscv/lip4a/revyos-build/create/rootfs.
Press ^] three times within 1s to kill container.
root@rootfs:~#
# neofetch
OS: Ubuntu 22.04.2 on Windows 10 riscv64

ちなみに ThinkPad の生 Ubuntu 22.04 では import は不要でした。直接原因は未調査です(systemd 入れないで apt したため?)。

systemd-nspawn の起動が failed: Exec format error になった場合はお試しください。

systemd-nspawn のコンテナを systemd ブートする場合

rootfs にマウントした RISC-V の OS を systemd ブートしたい場合は次のように -b オプションを付与します。このことにより初期設定で入れた systemd が実際に動作するようになります。

$ sudo systemd-nspawn -b -D rootfs
...snip...
Ubuntu 22.04.2 LTS localhost.localdomain console
localhost login: sipeed
Password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 riscv64)
$ sudo shutdown
[sudo] password for sipeed:
...snip...
Shutdown scheduled for Fri 2023-07-14 18:12:52 JST, use 'shutdown -c' to cancel.

なお、rootfs が Ubuntu 22.04 や 20.04 の場合で systemd コンフィグレーション後に DNS を引きたい場合は次のファイルを修正して -b ブートすれば OK です。

$ sudo vi /etc/systemd/resolved.conf
[Resolve]
DNS=192.168.0.1 # や 1.1.1.1 など

参考記事

Ubuntu 22.04 Base の導入で非常に参考になりました。

VisionFive 2でriscv64なUbuntuを動かす

第752回ではStarFiveのRISC-Vボードである「VisionFive 2」について紹介し、初期ファームウェアのアップグレード方法と、StarFiveが提供するDebianイメージをインストールする方法を紹介しました。今回はこれをUbuntu化してみましょう。

LPi 4A にさまざまな Linux を導入している記事。こちらも非常に参考になりました。感謝。

LicheePi 4A —— 这个小板有点意思(第一部分)

约莫去年,折腾一段时间 StarFive RISC-V 开发板,后因工作繁忙,停滞半年有余。去年底、今年初吧,RISC-V 开发板如雨后春笋般冒出来。前不久,吴老师非常慷慨的赠予我一块最新的 Sipeed LicheePi 4A 开发板,于是,家里又有好玩的玩具了。

関連


WSL2/WSLg にインストールすると便利な Ubuntu アプリケーション

$
0
0

Windows の WSL2/WSLg を使うと Linux の GUI アプリが活用できて良い感じです。近年の Linux GUI アプリは使い勝手もグッドで、Windows よりもフォントが綺麗に出力できるなど利点も多いです。コマンド 1行で導入できるのも手軽です。

ということでこの記事では自分が普段使っているソフトウェアを紹介したいと思います。日本語の「入力」はいくつか問題があるので、行わなくても問題がないシチュエーションで使えるものを選択しています。

導入は WSL2/Ubuntu 22.04 LTS を想定です。また、この記事のスクリーンショットでは Ubuntu 標準テーマのダークモードを設定しています。GNOME/GTK テーマの設定方法は末尾の関連記事に掲載しました。

なお、WSL2 は Windows 側のファイルシステム(/mnt/c) を扱うと動作が遅くなりますので、なるべく /home/username 配下など Linux 側のファイルシステムを使うように運用すると良いと思います。

準備

Windows の Powershell 窓などで WSLg が入っていることを確認のこと。

❯ wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.1992

入っていなければ、確認の上 wsl --update でアップデートします。

❯ wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。

日本語フォントの導入。 Ubuntu 上で以下のコマンドで入ります。

$ sudo apt install fonts-noto-*

お使いの Ubuntu の活用範囲で問題なければ、日本語ロケールも設定しておくと良いかもしれません。

$ sudo apt -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF8

nemo ファイルマネージャ

ファイルマネージャの nemo です。GNOME の Files アプリよりもペイン分割(F3キー)や、キーボード押下からの先頭文字ジャンプなどが標準で使えて便利です。

導入。

$ sudo apt install nemo

コマンドラインだとワイルドカード選択が難しいパターンなどの操作で、次のようにカレントディレクトリ . などを指定して nemo を起動するとすっ飛べて良いと思います。

$ nemo .

GNOME 画像ビュアー(Eye of GNOME Image Viewer)

nemo と一緒に GNOME 画像ビュアーを入れておくと、nemo のファイルダブルクリックから画像ファイルが開けます。また PDF の表示もいけます。

$ sudo apt install eog

PDF では FreeType フォントレンダラが選択されますので、通常の Windows ウェブブラウザによる PDF 表示よりも美しいです。

Meld

フォルダ単位で diff がとれる Meld。導入。

$ sudo apt install meld

こちらもコマンドラインから次のように引数でディレクトリ指定して起動すると便利です。

$ meld dir1/ dir2/

ソースコードフォントには HackGen を使わせていただいております。(メニュー Meld -> 設定より)

なお、Ubuntu へのフォントの導入は /usr/share/fonts/truetype/ にディレクトリを作成しフォントを配置して、 fc-cache コマンドでシステムに認識されるようになります。

$ ls -l /usr/share/fonts/truetype/hackgen/
合計 49968
-rw-r--r-- 1 hiromasa hiromasa 13060044  5月  3 17:51 HackGen35ConsoleNF-Bold.ttf
-rw-r--r-- 1 hiromasa hiromasa 12520684  5月  3 17:51 HackGen35ConsoleNF-Regular.ttf
-rw-r--r-- 1 hiromasa hiromasa 13061184  5月  3 17:51 HackGenConsoleNF-Bold.ttf
-rw-r--r-- 1 hiromasa hiromasa 12519656  5月  3 17:51 HackGenConsoleNF-Regular.ttf
$ fc-cache
$  fc-list | grep hack
/usr/share/fonts/truetype/hackgen/HackGen35ConsoleNF-Bold.ttf: HackGen35 Console NF:style=Bold
/usr/share/fonts/truetype/hackgen/HackGenConsoleNF-Bold.ttf: HackGen Console NF:style=Bold
/usr/share/fonts/truetype/hackgen/HackGen35ConsoleNF-Regular.ttf: HackGen35 Console NF:style=Regular
/usr/share/fonts/truetype/hackgen/HackGenConsoleNF-Regular.ttf: HackGen Console NF:style=Regula

RSS リーダー NewsFlash

モダンでナイスな RSS リーダー NewsFlash です。こちらも FreeType/Noto で表示できるので綺麗です。また、RSS のソースコードブロックがいい感じにレンダリングされるのでお気に入りです。

このアプリは snap 提供があるので snap で導入してみました。Ubuntu の snap を使う場合は WSL2/Ubuntu を systemd 起動にする必要があります。(Flatpack 版がオフィシャルのようなので systemd 起動をしたくない方はそちらで…!)

WSL2/Ubuntu の systemd を有効にします。ファイルがない方は新規作成のこと。

$ cat /etc/wsl.conf
[user]
default=hiromasa
[boot]
systemd=true

いったん WSL2 を再起動します。これで systemd が有効になった Ubuntu になりますので snap が使えるようになります。(わずかに Ubuntu の起動が遅くなります)

> wsl --shutdown

NewsFlash 導入。

$ sudo snap install newsflash

起動して RSS URL を登録後、フィードタイトルペインの上にあるリロードボタンを押すと時間を置かずにフィードを取得してくれるようです。

Windows のタスクバーにアプリを登録したい

Windows のタスクバーに Ubuntu アプリを登録するには次のように操作します。アイコンが選べない、アプリによってはペンギンアイコンになって識別しにくいなどまだ少し癖がありますが、RSS リーダなどは登録しておくと便利です。

Windows のスタートメニューを押してお目当てのアプリを検索で選択し「スタートにピン止めする」を選択します。

関連

Viewing all 96 articles
Browse latest View live