100円ショップダイソーのmicriSDを購入

先日100円ショップのダイソーに数カ月ぶりに行ったところ550円で32GのmicroSDとUSBメモリが売られていました.
秋葉原や通信販売であれば著名メーカーの同等以上のものが変える値段ですが,今日必要と行った場合には家電量販店やコンビニエンスストアでもっと高い値段で売られています.(未だにclass 4なんかも売っていたり……)
メーカーは磁気研究所で謎メーカーよりは良さそうだし保証期間も1年あるので普通に使えるようなら急に必要になったときに便利かもとmicroSD を1枚買って少し試してみました.

daisos microsd sale

続きを読む

カラフルでかわいい prettyping

pingのカラフルなラッパーの prettyping というものを知りました.

少し試してみました.

$ curl -O https://raw.githubusercontent.com/denilsonsa/prettyping/master/prettyping
$ install -m 755 ./prettyping ~/bin/
$ ls -l ~/bin/prettyping
-rwxr-xr-x 1 pi pi 23396 Apr  1 22:08 /home/pi/bin/prettyping
$ ~/bin/prettyping 1.1.1.1
0 ▁ 10 ▂ 20 ▃ 30 ▄ 40 ▅ 50 ▆ 60 ▇ 70 █ 80 ▁ 90 ▂ 100 ▃ 110 ▄ 120 ▅ 130 ▆ 140 ▇ 150 █ 160 ▁ 170 ▂
180 ▃ 190 ▄ 200 ▅ 210 ▆ 220 ▇ 230 █ ∞
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
▂▅█▁▄▂█
 0/  7 ( 0%) lost;   76/ 107/ 178ms; last:   76ms
 0/  7 ( 0%) lost;   76/ 107/ 178/  27ms (last 7)

カラーで見るときれいです.

prettyping

安定した回線だと緑で面白くないので不安定な回線や遠くのアドレスを指定するといいかもしれません.今回は電波状況の悪い携帯回線で試しました.(-120dBM前後の圏外になったり戻ったりな場所)


https://www.youtube.com/watch?v=gL87DBohRaQ
環境
$ dpkg-query -W iputils-ping curl coreutils
coreutils	8.30-3
curl	7.64.0-4+deb10u1
iputils-ping	3:20180629-2+deb10u2
$ lsb_release -dr
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
$ arch
armv7l
$ cat /proc/device-tree/model ;echo
Raspberry Pi 3 Model B Rev 1.2

標準入力の結果をシームレスに選択してクリップボードにコピーする「yank」

ターミナルからの標準入力の結果をシームレスに選択してクリップボードにコピーしてくれる yank というコマンドを知りました.

yankは各種環境のパッケージが用意されています.
Debian sid amd64 / Ubuntu 21,04 amd64 / Raspberry Pi OS buster armhf では yank というパッケージで提供されているのでこれを導入します.

$ sudo apt install yank (1)
$ yank (2)
bash: yank: command not found
$ dpkg -L yank | grep bin/ (3)
/usr/bin/yank-cli
  1. yank パッケージを導入
  2. yankコマンドが見つからない
  3. Debian系では名前空間の衝突のためにコマンド名が yank-cli になっている.

とりあえず導入できましたが,Debian環境だと yank コマンドが見つかりません.他のパッケージと名前が競合してしまっているので yank-cli として提供されているようです.

The binary is installed at /usr/bin/yank-cli due to a naming conflict.

— ‘https://github.com/mptre/yank
$ apt-file search /bin/yank
emboss: /usr/bin/yank
yank: /usr/bin/yank-cli

競合しているのはなんds楼と検索してみると emboss というパッケージのようです.

ヨーロッパ分子生物学オープンソフトウェアスイート
EMBOSS は、分子生物学のユーザコミュニティ (例: EMBnet) のために開発された オープンソースな解析用ソフトウェアパッケージです。このソフトウェアを 使うことで、様々なフォーマットで書かれたデータを自動的に処理したり、 ウェブから配列データを透過的に取得したりもできます。また、このパッケージには 拡張ライブラリが含まれているので、真のオープンソース精神に則って ソフトウェアを開発しリリースできるプラットフォームです。 さらに、EMBOSS は様々な配列解析用パッケージやツールとシームレスに 統合されています。EMBOSS は、長く続いた商用パッケージソフトウェアへの流れを 断ち切ったのです。

なかなか熱そうなプロジェクトのようです.

使わないならalias等でyankに向けてもいいかもしれません.

とりあえず導入出来たので試してみます.

yank 01

$ apt-cache search yank | yank-cli
elpa-csv-mode - Emacs major mode for editing comma/char separated values
python3-readlike - GNU Readline-like line editing module
yank - interactively select and yank terminal output to stdout or xsel

apt-cache search の結果を yank で受けてカーソルなどで単語単位で移動してEnterで選択した部分をクリップボードにコピーします.
クリップボード貼付けをするとたしかにコピーされていました.
例えばパッケージ名をコピーして, $ sudo apt install \`xsel\` のようにして使うと便利そうです.

その他便利そうなオプションとして, -d があります.cutコマンドの-dと同じようにデリミタが指定できます.

$ nkf -w mntemsadext00_rct.csv | yank-cli -d,

こんな感じでcsvファイルに , を指定してあげると,各項目がコピーできます.

しかし,yankはページ跨ぎが出来ないようです.1ページ目のものしかコピーできません.こういう場合はyankに渡す前にフィルタしてあげるといいようです.grepや,昨日このblogで紹介したyankと同じ作者の「pick」もこういうときに便利です.

$ nkf -w mntemsadext00_rct.csv | grep 田代 | yank-cli -d,`
$ nkf -w mntemsadext00_rct.csv | pick | yank-cli -d,`

なにかの結果の一部が欲しいときに便利そうです.

環境1
$ dpkg-query -W yank pick
pick	2.0.2-1
yank	1.1.0-2
$ lsb_release -dr
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
$ uname -m
armv7l
$ cat /proc/device-tree/model ;echo
Raspberry Pi 3 Model B Rev 1.2
環境2
$ dpkg-query -W yank pick
pick	2.0.2-1.1
yank	1.2.0-1
$ lsb_release -dr
Description:	Debian GNU/Linux bullseye/sid
Release:	unstable
$ uname -m
x86_64

ターミナルダッシュボードのWTFを少し試す

WTFというGo製のターミナルダッシュボードを見かけたので少し試してみました.

導入はLinuxのamd64/armv6/arm64,macOSのamd64/arm64はGitHub releaseページにあるのでそれを使うのが手っ取り早いです.
今回はarmv6をRaspberry Pi 3 Model BのRaspberry Pi OS armhfで試しました.

$ wget https://github.com/wtfutil/wtf/releases/download/v0.36.0/wtf_0.36.0_linux_armv6.tar.gz https://github.com/wtfutil/wtf/releases/download/v0.36.0/wtf_0.36.0_checksums.txt (1)
$ sha256sum -c ./wtf_0.36.0_checksums.txt 2>&1 | grep wtf_0.36.0_linux_armv6.tar.gz: (2)
wtf_0.36.0_linux_armv6.tar.gz: OK
$ tar tvf ./wtf_0.36.0_linux_armv6.tar.gz (3)
-rw-r--r-- ccummer/staff 34534 2021-03-23 19:20 wtf_0.36.0_linux_armv6/CHANGELOG.md
-rw-r--r-- ccummer/staff 14878 2018-12-01 01:13 wtf_0.36.0_linux_armv6/LICENSE.md
-rw-r--r-- ccummer/staff 39700 2021-03-20 13:46 wtf_0.36.0_linux_armv6/README.md
-rwxr-xr-x ccummer/staff 41615360 2021-03-23 19:35 wtf_0.36.0_linux_armv6/wtfutil
$ tar xf ./wtf_0.36.0_linux_armv6.tar.gz (4)
$ wtf_0.36.0_linux_armv6/wtfutil (5)
  1. Releases ページから最新のバイナリとチェックサムファイルを入手
  2. チェックサムファイルの中を見ると桁数的にsha256のようだったので,sha256sumでチェックサムを確認
  3. アーカイブの確認
  4. アーカイブの展開
  5. WTF起動

バイナリアーカイブをダウンロードして展開しました.
wtf_0.36.0_linux_armv6/wtfutil を実行すると既定値で起動します.しかし娘の設定だとターミナルサイズ固定だったりあまり嬉しくありません.

リポジトリの _sample_configs 以下にサンプルがあるのでこれを指定して起動してみます.

設定ファイルは既定値は ~/.config/wtf/config.yml を使います.存在しない場合はデフォルトのものが生成されます.若しくは wtf の -c, --config= オプションで指定した設定ファイルを指定できます.

$ wtf_0.36.0_linux_armv6/wtfutil --config=../src/wtf/_sample_configs/sample_config.yml

wtf 01

wtfリポジトリの _sample_configs/sample_config.yml を指定して起動するとこんな感じでターミナルサイズにも追従していい感じです.

wtf 02

diff --git a/_sample_configs/sample_config.yml b/_sample_configs/sample_config.yml
index e16690a0..fa3bf5c0 100644
--- a/_sample_configs/sample_config.yml
+++ b/_sample_configs/sample_config.yml
@@ -73,10 +73,21 @@ wtf:
         width: 1
       refreshInterval: 15
       sort: "alphabetical"
+    feedreader:
+      enabled: true
+      feeds:
+        - https://nitter.matoken.org/matoken1/rss
+      feedLimit: 10
+      position:
+        top: 1
+        left: 3
+        height: 1
+        width: 1
+      updateInterval: 14400
     battery:
       type: power
       title: "⚡️"
-      enabled: true
+      enabled: false
       position:
         top: 1
         left: 3

Raspberry Piは電源ステータスは見えないので無効にして代わりにfeedreaderを有効にしてNitter経由でTwitterのRSSフィードを表示してみました.

日本語や絵文字も崩れず表示できて良さそうですね.

その他にもたくさんのモジュールがあるようです.こちらのページから確認できます.(Nitterを通さなくてもTwitterモジュールもあった)

自分の用途に合わせて設定していくと便利そうです.

環境
$ wtf_0.36.0_linux_armv6/wtfutil --version
0.36.0 (2021-03-23T10:33:30Z)
$ lsb_release -dr
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
$ uname -m
armv7l
$ cat /proc/device-tree/model ;echo
Raspberry Pi 3 Model B Rev 1.2

Raspberry Pi の OSイメージを書き込む Raspberry Pi Imager v1.6 の新機能で書き込み時にカスタマイズ

Raspberry Pi で利用するストレージへのOSイメージ書き込みツールのRaspberry Pi Imagerの最新版のv1.6がリリースされたようです.

自分は出た当初少し試しただけで他のツールに比べて嬉しいことがあまりないと感じたので使っていなかったのですが,このv1.6ではイメージのカスタマイズ機能が入ったようなので試してみました.

Raspberry Pi Imagerの導入

$ sudo apt install rpi-imager

Raspberry Pi OSであればパッケージが存在するのでこれを導入すればokです.

Linux/Windows/macOSはGitHubのreleaseページから入手できます.
若しくは,Raspberry Pi downloadsページにもあります.こちらだとGutHubとファイル名が違いますがamd64の.debをdiffしてみると同じもので署名ファイルもあります..AppImageもありますが試してみると最新ではないようでした.

$ wget https://github.com/raspberrypi/rpi-imager/releases/download/v1.6/rpi-imager_1.6_amd64.deb (1)
$ wget https://downloads.raspberrypi.org/imager/imager_1.6_amd64.deb https://downloads.raspberrypi.org/imager/imager_1.6_amd64.deb.sig (2)
$ diff ./imager_1.6_amd64.deb ./rpi-imager_1.6_amd64.deb (3)
$ gpg2 --verify ./imager_1.6_amd64.deb.sig (4)
gpg: assuming signed data in './imager_1.6_amd64.deb'
gpg: Signature made Tue 16 Mar 2021 08:56:51 PM JST
gpg:                using RSA key 54C3DD610D9D1B4AF82A37758738CD6B956F460C
gpg: Good signature from "Raspberry Pi Downloads Signing Key" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 54C3 DD61 0D9D 1B4A F82A  3775 8738 CD6B 956F 460C
$ gpg2 --verify ./imager_1.6_amd64.deb.sig ./rpi-imager_1.6_amd64.deb
gpg: Signature made Tue 16 Mar 2021 08:56:51 PM JST
gpg:                using RSA key 54C3DD610D9D1B4AF82A37758738CD6B956F460C
gpg: Good signature from "Raspberry Pi Downloads Signing Key" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 54C3 DD61 0D9D 1B4A F82A  3775 8738 CD6B 956F 460C
$ sudo apt install ././imager_1.6_amd64.deb (5)
  1. GitHubからダウンロード
  2. downloads.raspberrypi.orgからダウンロード
  3. ファイル名は違うけど同じ内容なのを確認
  4. 署名確認
  5. インストール

Debian sid amd64環境ではAppImageが古いので.debを導入しました.

Imagerの起動と書き込み設定

Raspberry Pi ロゴのアイコンの「Imager」や, rpi-imager を実行すると起動します.

ここで,「ctrl + shift + x」を押すことで今回のカスタマイズ用の拡張オプション画面が表示されます.

rpi imager01
rpi imager02
rpi imager03
rpi imager04

今回はhostnameの修正,SSHの有効化,ssh公開鍵の登録,Wi-Fi 設定,タイムゾーンの設定を行いました.

「SAVE」して「RASPBERRY PI OS LITE (32-BIT)」を書き込んでみました.

書き込みが終了しても1つ目のパーティション(/boot)がマウントされたままでした.これはバグかな?(1回しか試していないので勘違いかもしれない)

$ mount | grep /dev/mmcblk0p1 (1)
/dev/mmcblk0p1 on /media/matoken/boot type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
$ sudo umount /dev/mmcblk0p1 (2)
  1. 1つ目のパーティションがマウントされたまま
  2. アンマウントする

カスタマイズ内容確認

書き込まれたメディアの中を見ると /boot/firstrun.sh が作成されていました.Raspberry Pi Imagerは直接設定を書き換えるわけではなく,OSイメージを書き込んだあと子のファイルを作って,Raspberry Pi OSの初回起動時にこのscriptを実行して設定を反映していくようです.

/boot/firstrun.sh
#!/bin/bash

set +e

CURRENT_HOSTNAME=`cat /etc/hostname | tr -d " \t\n\r"`
echo raspberrypi-custom >/etc/hostname
sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\traspberrypi-custom/g" /etc/hosts
FIRSTUSER=`getent passwd 1000 | cut -d: -f1`
FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`
install -o "$FIRSTUSER" -m 700 -d "$FIRSTUSERHOME/.ssh"
install -o "$FIRSTUSER" -m 600 <(echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPgwY9aZPxN/YoBBzd7TOcCk7EuGO0E9PuUjCHPtTuHP mk@x220") "$FIRSTUSERHOME/.ssh/authorized_keys"
echo 'PasswordAuthentication no' >>/etc/ssh/sshd_config
systemctl enable ssh
cat >/etc/wpa_supplicant/wpa_supplicant.conf <<WPAEOF
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1

update_config=1
network={
	ssid="matoken"
	psk="○○○○○○○○○○○○"
}

WPAEOF
chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
rfkill unblock wifi
for filename in /var/lib/systemd/rfkill/*:wlan ; do
  echo 0 > $filename
done
rm -f /etc/xdg/autostart/piwiz.desktop
rm -f /etc/localtime
echo "Asia/Tokyo" >/etc/timezone
dpkg-reconfigure -f noninteractive tzdata
cat >/etc/default/keyboard <<KBEOF
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
KBEOF
dpkg-reconfigure -f noninteractive keyboard-configuration
rm -f /boot/firstrun.sh
sed -i 's| systemd.run.*||g' /boot/cmdline.txt
exit 0

ちょっと雑かなと感じるところもありますが便利な感じです.
( /etc/wpa_supplicant/wpa_supplicant.confwpa_passphrase コマンドを通してpskにしておきたいとか)

自分はsd card書き込み前にPCでマウントしてパッケージを最新にしたりインストールしたりといったことをしているので,sd card書き込みをしなくてもこのファイルを書き出してくれると嬉しいかなと思いました.

アンインストール

$ sudo apt purge rpi-imager
$ rm -r ~/.config/Raspberry\ Pi/Imager.conf ~/.cache/Raspberry\ Pi/Imager

パッケージを削除して,設定ファイルとキャッシュを削除しました.

環境

$ dpkg-query -W rpi-imager
rpi-imager      1.6
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

Raspberry Pi OS armhfでWidevineDRMビデオを観られるようになったので試す

Raspberry Pi OS armhfに libwidevinecdm0 パッケージが入ったようです.Raspberry Pi 3 Model Bでも動作したのでメモしておきます.

libwidevinecdm0 パッケージはWidevineというDRM付きコンテンツを閲覧するためのパッケージです.

Widevineは結構あちこちで見かけます.siteには以下のようなサービスが載っていました.

libwidevinecdm0 services

まずWidevineに非対応な状態でNetflixのコンテンツを閲覧しようとするとこのようなエラーになります.

libwidevinecdm0 ng

Note
Netflixの会員じゃなくても次で試せます.
TV番組・ドラマを無料で視聴 | Netflix お試し無料配信

ここで libwidevinecdm0 パッケージを導入してChromiumを起動しなおせばOKなはずですがうまく行きません.
chrome://components/ を見ても Widevine が出てきません.

https://bitmovin.com/demos/drm にアクセスしてみると, Detected , using No DRM と表示されDRMが使えないようです.

Raspberry Pi 4 Model B/400以外の事例が見当たらないのでもしかして何らかの要件が足りなくてRaspberry Pi 4 より前のバージョンでは動かないのかな?とか思ったのですが,もう少し調べるとRaspberry Pi OSのChromiumには chromiumchromium-browser の2つのパッケージがあるようです.

chromium
$ apt show chromium
Package: chromium
Version: 88.0.4324.146-1~deb10u1
Priority: optional
Section: web
Maintainer: Debian Chromium Team <chromium@packages.debian.org>
Installed-Size: 114 MB
Provides: gnome-www-browser, www-browser
Depends: libasound2 (>= 1.0.16), libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 2.2.0), libatomic1 (>= 4.8), libatspi2.0-0 (>= 2.9.90), libavcode
c58 (>= 7:4.0), libavformat58 (>= 7:4.1), libavutil56 (>= 7:4.0), libc6 (>= 2.28), libcairo2 (>= 1.6.0), libcups2 (>= 1.7.0), libdbus-1-3 (>= 1.9
.14), libdrm2 (>= 2.4.38), libevent-2.1-6 (>= 2.1.8-stable), libexpat1 (>= 2.0.1), libflac8 (>= 1.3.0), libfontconfig1 (>= 2.12.6), libfreetype6
(>= 2.3.9), libgbm1 (>= 17.1.0~rc2), libgcc1 (>= 1:4.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.39.4), libgtk-3-0 (>= 3.19.12), libha
rfbuzz0b (>= 2.2.0), libicu63 (>= 63.1-1~), libjpeg62-turbo (>= 1.5.0), libjsoncpp1 (>= 1.7.4), liblcms2-2 (>= 2.2+git20110628), libminizip1 (>=
1.1), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.22), libopenjp2-7 (>= 2.2.0), libopus0 (>= 1.1), libpango-1.0-0 (>= 1.14.0), libpng16-16 (>= 1.6.2-
1), libpulse0 (>= 0.99.1), libre2-5 (>= 20160901), libsnappy1v5, libstdc++6 (>= 7), libvpx5 (>= 1.6.0), libwebp6 (>= 0.5.1), libwebpdemux2 (>= 0.
5.1), libwebpmux3 (>= 0.6.1-2), libx11-6 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2), libxcomposite1 (>= 1:0.3-1), libxdamage1 (>= 1:1.1), libxext6, libx
fixes3, libxml2 (>= 2.7.4), libxrandr2, libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.2.2), chromium-common (= 88.0.4324.146-1~deb10u1)
Recommends: chromium-sandbox
Suggests: chromium-l10n, chromium-shell, chromium-driver
Conflicts: libgl1-mesa-swx11, libnettle4, libsecret-1-0 (<< 0.18)
Breaks: chromium-lwn4chrome (<= 1.0-2), chromium-tt-rss-notifier (<= 0.5.2-2)
Homepage: http://www.chromium.org/Home
Download-Size: 48.9 MB
APT-Sources: http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
Description: web browser
 Web browser that aims to build a safer, faster, and more stable internet
 browsing experience.
 .
 This package contains the web browser component.
chromium-browser
$ apt show chromium-browser
Package: chromium-browser
Version: 88.0.4324.187-rpt1
Priority: optional
Section: web
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Installed-Size: 329 MB
Provides: chromium, chromium-browser-inspector, www-browser
Pre-Depends: dpkg (>= 1.15.6)
Depends: libasound2 (>= 1.0.16), libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 2.2.0), libatspi2.0-0 (>= 2.9.90), libc6 (>= 2.18), libcairo2 (>=
 1.6.0), libcups2 (>= 1.7.0), libdbus-1-3 (>= 1.9.14), libdrm2 (>= 2.4.38), libexpat1 (>= 2.0.1), libgbm1 (>= 17.1.0~rc2), libgcc1 (>= 1:4.3), li
bgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.39.4), libgtk-3-0 (>= 3.21.5), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.22), libpango-1.0-0 (>= 1
.14.0), libx11-6 (>= 2:1.4.99.1), libxcb1 (>= 1.9.2), libxcomposite1 (>= 1:0.3-1), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxkbcommon0 (>
= 0.5.0), libxrandr2, libxtst6, bash (>= 4), xdg-utils, chromium-codecs-ffmpeg-extra (= 88.0.4324.187-rpt1) | chromium-codecs-ffmpeg (= 88.0.4324
.187-rpt1), libraspberrypi0, libgl1-mesa-dri
Recommends: chromium-browser-l10n
Suggests: webaccounts-chromium-extension, unity-chromium-extension, adobe-flashplugin
Conflicts: chromium, chromium-browser-inspector
Replaces: chromium, chromium-browser-inspector
Homepage: https://chromium.googlesource.com/chromium/src/
Download-Size: 103 MB
APT-Manual-Installed: no
APT-Sources: http://archive.raspberrypi.org/debian buster/main armhf Packages
Description: Chromium web browser, open-source version of Chrome
 An open-source browser project that aims to build a safer, faster, and more
 stable way for all Internet users to experience the web.

そしてうまく行かなかったのは chromium でした.
chromium-browser を入れて(排他なので chromim パッケージは削除される)再度試すと,chrome://components/Widevine が現れて,

libwidevinecdm0 componets

https://bitmovin.com/demos/drm にアクセスしてみると, Detected , using widevine と表示されるようになりNetflixのコンテンツも閲覧できました.

libwidevinecdm0 netflix

Note
攻殻機動隊 SAC_2045 より.なんだかOPがPortal感

ということで,Raspberry Pi 3 Model B + Raspberry Pi OS armhf でも libwidevinecdm0 パッケージと chromium-browser パッケージを導入することでWidevineのDRMコンテンツが観られるようになりました :)
(DRMなしで閲覧できたほうが嬉しいですが)

$ sudo apt update
$ sudo apt install chromium-browser libwidevinecdm0
$ chromium-browser &
環境
$ dpkg-query -W chromium-browser* libwidevinecdm0
chromium-browser        88.0.4324.187-rpt1
chromium-browser-inspector
chromium-browser-l10n   88.0.4324.187-rpt1
libwidevinecdm0 4.10.1679.0-1
$ lsb_release -dr
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
$ uname -m
armv7l
$ cat /proc/device-tree/model ;echo
Raspberry Pi 3 Model B Rev 1.2

Raspberry Pi の温度管理をソフトウェアで頑張る

この記事は日本Androidの会秋葉原支部ロボット部 Advent Calendar 2020 の12/07分の記事です.

内容は 日本Androidの会秋葉原支部ロボット部 第96回勉強会 で発表した内容を加筆修正したものです.

はじめに

Raspberry Pi という英国発の教育向けとして2012年に発売された安価なシングルボードコンピュータがあります.教育向けとして発売されましたが趣味にもよく使われています.OSは標準ではLinux(DebianベースのRaspberry Pi OS)が採用されています.

私はもっぱら省電力のLinuxマシンとして使うことが多いです.

トラブル

今夏空調のない部屋の自宅サーバの横でRaspberry Pi 3 model B + Raspberry Pi OS arm64(β)で計算をさせていたのですが,しばらく動かしていると固まるようになりました.

再起動すればしばらく動きますがしばらくするとやはり固まります.これをどうにか出来ないかと調べてみました.

ログの取得

まずはログを録ってみます.

crontabで1分毎に情報を記録
* * * * *       printf "`date +\%s`,`cat /sys/class/thermal/thermal_zone0/temp`,`echo "obase=2; ibase=16; \`vcgencmd get_throttled | cut -f2 -dx\`" | bc`,`vcgencmd measure_clock arm|cut -f2 -d=`\n" >> ~/.temp.log

内容はこんな感じです.(外気温度も録ればよかった)

UNIX Time
date +%s
SoC温度
/sys/class/thermal/thermal_zone0/temp
スロットリング周りのフラグ
vcgencmd get_throttled
arm周波数
vcgencmd measure_clock arm

ログがファイルに書かれる間にフリーズしてデータが失われるのを防ぐために /etc/fstab のマウントオプションに sync オプションも付けておきます.(再起動かremountで反映)

ログを取得している状態で負荷を掛けます.今回は /dev/urandom をcatすることで計算させました.今回のRaspberry Pi 3 model Bは4coreあるので4つ動かしています.

今回のテストで使った負荷(いつもはvanity address/vttとかとか)
$ cat /dev/urandom > /dev/null &
$ cat /dev/urandom > /dev/null &
$ cat /dev/urandom > /dev/null &
$ cat /dev/urandom > /dev/null &

熱が原因?

しばらく動かしてRaspberry Piが固まった後にログを確認してみます.
SoCの温度が85度を何度か記録した後に固まっているようです.
85度というのはRaspberry Pi OSでの標準のSoC制限温度のようです.この温度の5度前(標準では80度)からサーマルスロットリングが始まるようです.

サーマルスロットリングでクロックが下がって温度が下がれば問題無さそうだけど80度からクロックが下がっても85度を超えて固まってしまっているようです.
ベータ版のRaspberry Pi OS amd64を使っているせいかもしれないと思い,標準のRaspberry Pi OS armhf(32bit)版に変更して同様に試してみましたが同様の動きのようです.

正攻法としてはヒートシンク,ファンの増設や空調を入れるとよさそうですが,金欠なのでとりあえずソフトだけでどうにか出来ないかと試しました.

SoC制限温度を下げる

まずSoCの制限温度ですが,公式フォーラムで70度以下にしたほうがいいという書き込みを見かけました.逆に100度でも大丈夫という人も居るのですが安全側の70度にしてみます.

この設定は /boot/config.txt でパラメータを設定できます.以下は70度に設定たときの例です.この状態で再起動すると反映されます.

temp_limit=70

再起動後以下のコマンドで設定が反映されているか確認が出来ます.

$ vcgencmd get_config int | grep ^temp_limit=
temp_limit=70

この状態で負荷を掛けると70度を越えるくらいで固まりました.やはり制限温度を越えると固まってい舞うようです.

SoCの最大周波数を下げてみる

Raspberry Pi 3 model B のSoCは最大周波数1.2GHzです.これを下げてみます.

/boot/config.txtarm_freq= で設定できます.以下は800MHzに設定したときの例です.再起動で反映されます.

arm_freq=800

再起動後に設定が反映されているか確認します.

$ vcgencmd get_config int | grep ^arm_freq=
arm_freq=800

この状態で負荷を掛けるとやはり固まります.まあサーマルスロットリングが効いても固まるので仕方がない感じです.

SoCの最小周波数を下げてみる(これが効くのでは?)

次にSoC最小周波数を下げてみます.既定値は600MHzで,サーマルスロットリングでもここまで下がっているのでこれを更に下げると温度が下がりそうな気がします.

/boot/config.txtarm_freq_min= で設定できます.以下は400MHzに設定したときの例です.再起動で反映されます.

arm_freq_min=400

しかし再起動後に確認してみると600MHzより下には設定できないみたいで600MHzになってしまいます.

$ vcgencmd get_config int | grep ^arm_freq_min=
arm_freq_min=600

この状態で負荷を掛けるとやはり600Mhzまでしか下がらず固まります.

残念ながらRaspberry Pi のスロットリングでは無理そうです.

maxcpusでコアを制限してみる

Linuxのブートパラメータで maxcpus を指定することでコアを制限できます.Raspberry Pi の場合は /boot/cmdline.txt で設定できます.

設定後以下のコマンドで確認できます.

$ grep -o -E 'maxcpus=.{0,9} ' /proc/cmdline
maxcpus=1
$ grep ^processor /proc/cpuinfo | wc -l
1

これでCPU core1津で動作しています.しかし最大周波数を600MHzかつ1coreでも同様にフリーズしてしまいました.

cpufreqでクロック制御

IntelCPUのNotePCなどではcoufreqを使ってこのあたりの制御をするのですが,これでも600mHzより下には下げられないようで駄目でした.

LimitCPUで指定プロセスの制限を行う

LimitCPUは指定プロセスを監視し,CPU利用率や%で制限するプログラムです.Linux, MacOS, *BSDなどのUNIX-Likesystemで利用できます.
Raspberry Pi OSではcpulimitパッケージとしてパッケージングされており,コマンドもcoulimitです.

cpulimitの導入
$ sudo apt install cpulimit

cpulimitコマンドに制限したいプロセスIDやプロセス名と制限を指定することで動作します.

cat からはじまるプロセスを50%に制限
$ pgrep ^cat | xargs -n1 -I{} sh -c "cpulimit -p {} -l 50 -v &"

cpulimitで50%に制限してみたt頃温度が下がるのを確認できました.数日動かしても固まらなくなったようです.
定期的にSoCの温度を確認して制限を変更していくと良さそうでうs.

LimitCPUはCPUlimitの開発が止まった後のフォークですが,その後CPUlimitが新しく開発が始まっているようです.詳細は以下のページを参照してください.

cgroupでCPUリソース制限(未確認)

LimitCPUが効いたので恐らくcgroupでのCPUリソース制限でも大丈夫そうです.(未確認)

おわりに

現在は気温も下がり制限などしなくても問題ありません.でもきっと来夏にまた起こると思うのでそこでまた確認するつもりです.

しかし,今回の解決方法はCPUのリソースを制限して温度を下げて居るので計算量は減っています.空調を入れたりCPUファンを導入するのが正攻法になるのかなと思います.
CPUファンはサードパーティーから各種発売されているのでそれらを使うかDIYする感じになると思います.

そういえば最近Raspberry Pi OSの設定コマンドの raspi-config の中に Set behaviour of GPIO fan というメニューが出来たり,Raspberry Pi 4には公式のCPUファンが発売されているのでこれらを使うのが良さそうです.

Sipeed Lichee Nanoでhello world

2020-07-23低レベル勉強会に参加しました.Zoom.usでの開催でした.

内容はLinux名刺的なものを開発しようという内容で,リファレンスとしてSDカードサイズの小さなLinuxの動作するarmコンピュータのSipeed Lichee Nanoを使いました.

欲しい場合は1000円ちょいくらいからで入手できそうです.

Lichee Nanoを持っていない人はリモートで触れるようにしてあったので持っていない私も楽しめました.

このリモート開発の仕組みはLichee NanoとRaspberry PiをUSB経由のUARTで接続し,Raspberry PiでGNU screenを起動,ssh経由でGNU screenに繋いで操作という感じです.
GNU screenをGotty等にするとウェブブラウザで参加できてちょっと便利かもと思ったりも.(GoTTYは開発止まってるように見えるから別のもののほうがいいかもしれない)

Lichee Nanoで何かを動かしたい.armだけどarmhf動くのかな?とりあえずなにか転送して動かしてみようと.

とりあえずDebianのarmhfバイナリをuuencodeしてコピペで転送してみます.これが動けばDebianのパッケージ群が利用できるかもだけど…….

まずは簡単そうなfortuneを試します.

Debian sidでfortune-modパッケージのarmhfバイナリパッケージをダウンロードして展開(add archtecture armhfしてある環境)
$ apt download -t armhf fortune-mod
$ unar fortune-mod_1.99.1-7+b1_armhf.deb
$ cd fortune-mod_1.99.1-7+b1_armhf
$ tar xf data.tar.xz
$ cd usr/games

Lichee Nanoはserialで接続されていて,Internetには繋がっていないのでバイナリファイルの転送にはuudecode/uuencodeを使いました.久々です.
手元のGNU sharutils 4.15.2のuudecodeにはbase64を使う -m, --base64 があるので良さそう.と思ったけどLichee Nanoの方はbusyboxのもので非対応でした.

ローカル端末で圧縮してuuencodeしてクリップボードへ
$ gzip -c fortune | uuencode fortune.gz > fortune.gz.uu
$ cat fortune.gz.uu | xclip
リモートで伸張して解凍
# cat | uudecode    #ここでクリップボードから貼り付け
# zcat fortune.gz > fortune
# rm fortune.gz

そして…​…​

# ./fortune
-sh: ./fortune: not found
# ldd ./fortune
checking sub-depends for 'not found'
checking sub-depends for '/lib/libc.so.6'
/lib/ld-linux.so.3 (0xb6fa0000)
librecode.so.0 => not found (0x00000000)
libc.so.6 => /lib/libc.so.6 (0x00000000)
/lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

これを動かすのはダイナミックリンクされているものを用意してあげないといけないのでストレージの容量的に難しいですね.

ここではgzipで圧縮しましたが,Lichee Nanoのbusyboxにxzがありました.gzipよりxzにしたほうが小さくなりますね.試してみるとこんな感じでした.$ xz -c fortune | uuencode fortune.xz > fortune.xz.uu

サイズ比較
-rw-r--r-- 1 matoken matoken 22368 Jul 23 15:11 fortune #元ファイル
-rw-r--r-- 1 matoken matoken 30844 Jul 23 14:58 fortune.uu #uudecode
-rw-r--r-- 1 matoken matoken 14975 Jul 23 15:08 fortune.gz.uu #zip + uudecode
-rw-r--r-- 1 matoken matoken 13047 Jul 23 15:47 fortune.xz.uu #xz + uudecode

そういえばあまり有名ではないですがbasE91なんてものもあります.base64よりサイズが小さくなりますが導入からやらないといけないのでちょっと面倒.

Hello worldを試してみます.適当にプログラムを用意してスタティックリンクでコンパイルしてみます.

$ cat hello.c
#include <stdio.h>
int
main(void)
{
    printf("Hello, world!\n");
    return 0;
}
$ gcc -static ./hello.c
$ ./a.out
Hello, world!
$ ls -l a.out
-rwxr-xr-x 1 pi pi 571120 7月 23 16:18 a.out

でかい…​…​

とりあえずでかいのはおいといてこれだとarm64なので動くはずがない.ということでクロスコンパイル環境を用意します.

今回試したホストはDebian sid amd64/Ubuntu 20.04 LTS arm64/Raspberry Pi OS arm64です.いずれも同じ手順でOKでした.

crossbuild-essential-<arch> パッケージで各種アーキテクチャの環境が導入できるようです.

$ apt-cache search crossbuild-essential-
crossbuild-essential-amd64 - Informational list of cross-build-essential packages
crossbuild-essential-arm64 - Informational list of cross-build-essential packages
crossbuild-essential-armel - Informational list of cross-build-essential packages
crossbuild-essential-armhf - Informational list of cross-build-essential packages
crossbuild-essential-i386 - Informational list of cross-build-essential packages
crossbuild-essential-powerpc - Informational list of cross-build-essential packages
crossbuild-essential-ppc64el - Informational list of cross-build-essential packages
crossbuild-essential-s390x - Informational list of cross-build-essential packages
crossbuild-essential-mips - Informational list of cross-build-essential packages
crossbuild-essential-mips64 - Informational list of cross-build-essential packages
crossbuild-essential-mips64el - Informational list of cross-build-essential packages
crossbuild-essential-mips64r6 - Informational list of cross-build-essential packages
crossbuild-essential-mips64r6el - Informational list of cross-build-essential packages
crossbuild-essential-mipsel - Informational list of cross-build-essential packages
crossbuild-essential-mipsr6 - Informational list of cross-build-essential packages
crossbuild-essential-mipsr6el - Informational list of cross-build-essential packages

沢山あります.今回はarmlf/armhfの crossbuild-essential-armel, crossbuild-essential-armhf を導入しました.

$ sudo apt install crossbuild-essential-armel crossbuild-essential-armhf

gccだけでいい場合はarmlfは gcc-arm-linux-gnueabi,armhfは gcc-arm-linux-gnueabihf だけでOKです.

まずは arm-linux-gnueabihf-gcc を使ってarmhfのバイナリを作ります.

$ /usr/bin/arm-linux-gnueabihf-gcc -static ./hello.c
$ strip a.out
$ xz -c a.out | uuencode a.out.xz > a.out.xz.uu

armhfは駄目そうです.

# cat | uudecode
^d
# xzcat ./a.out.xz > ./a.out
# chmod +x ./a.out
# ./a.out
Segmentation fault

次は gcc-arm-linux-gnueabi でarmlfのバイナリを作って試すと動きました.

$ /usr/bin/arm-linux-gnueabi-gcc -static ./hello.c
$ strip a.out
$ xz -c a.out | uuencode a.out.xz > a.out.xz.uu
# cat | uudecode
^d
# xzcat ./a.out.xz > ./a.out
# chmod +x ./a.out
# ./a.out
Hello, world!
# /usr/bin/time -f "%M KB" ./a.out
Hello, world!
2144 KB

この辺りで今回は時間切れ.次回の同じような感じになりそうです.興味のある方は以下のページから.

とりあえずarmelのバイナリが動くようなのがわかったので面白そうな小さなプログラムを試そうかなと思っています.cowsayとか好きなんだけどこれはPerlなので容量的に難しそう.とりあえずfortuneあたりかな?

以前PQI Air PenでやったようにSD cardを用意してそこにDebian armlf環境を展開してchrootとかもできそうです.