Raspberry Pi 3 Model Bの本体に付いているLEDの点滅を自在に操作する

Raspberry Pi 3 Model B
OS: Raspbian Stretch lite March 2018

緑のLEDを司るファイルは /sys/class/leds/led0/、オレンジのLEDを司るファイルは /sys/class/leds/led1/ 以下に配置されているようである。何をきっかけにLEDを点滅させるかはtriggerファイルの内容を確認すればよろしい。デフォルトでは緑のLEDがmmc0、オレンジのLEDがinputである。

$ cat /sys/class/leds/led0/trigger
none (snip) panic mmc1 [mmc0] rfkill-any rfkill0 rfkill1

$ cat /sys/class/leds/led1/trigger
none (snip) default-on [input] panic mmc1 mmc0 rfkill-any rfkill0 rfkill1

mmc0はSDカードにアクセスがあった時に点滅する。inputはなんだかよくわからないが何しろinputであるからなんらかの入力であろうと思う。heartbeatやtimerを選択すると規則的に点滅させることができる。じっと眺めているとまばゆさで目が潰れてしまう。

heartbeatを選択したときのLEDのようす

点滅の制御はbrightnessでおこなう。0から255までの値を取り0で消灯、1~255で点灯する。数値の大小で輝度が変えられるように見えるけれどもどうやら一様な明るさである。なおbrightnessの数値を0に変更するとtriggerは勝手にnoneへ変更された。

$ sudo su -c "echo 0 > /sys/class/leds/led0/brightness"
$ sudo su -c "echo 1 > /sys/class/leds/led0/brightness"

一秒ごとに緑のLEDを明滅させる拙いシェルスクリプトled.shは概ねこんな具合である。あとはsudo bash led.shとすれば緑LEDが毎秒明滅するようになった。

#!/bin/bash

if [ $(id -u) != '0' ]; then
  echo 'Run as root.'
  exit 1
fi

GREEN='/sys/class/leds/led0'
trap 'echo mmc0 > ${GREEN}/trigger; exit 1' 1 2 9 15
echo none > ${GREEN}/trigger

while true
do
  echo 0 > ${GREEN}/brightness
  sleep 1
  echo 1 > ${GREEN}/brightness
  sleep 1
done

参考:
Can we control the on-board leds
How do I control the system LEDs using my software?
Are there other act_led_trigger options besides “mmc” and “heartbeat”?

Cドライブ直下にあらわれたmsdia80.dllについて

OS: Windows 10 version 1709 64bit

いつの頃からか知れないけれどもCドライブの直下にmsdia80.dllという名のファイルが居る。Cドライブの直下が混雑するのは好きでないから何とかならないかと調べると、64bitのOSにMicrosoft Visual C++ 2005 再頒布可能パッケージをインストールしたことが原因であるという。本来あるべき場所は

%programfiles%\Common Files\Microsoft Shared\VC

ということであるから示されている回避策を参考にして移動する。コマンドプロンプトを管理者で起動してファイルを移動したあとにregsvr32とか言うコマンドで以ってdllを登録し直すのである。そうすると「~msdia80.dll の DllRegisterServer は成功しました。」というダイアログが出現するから恙無く移動できた模様である。

c:\>move msdia80.dll "%programfiles%\Common Files\Microsoft Shared\VC"
c:\>regsvr32 "%programfiles%\Common Files\Microsoft Shared\VC\msdia80.dll"

なお、msdia80.dllのプロパティを具に見てゆくと製品名にMicrosoft Visual Studio 2005とあるから確かにMicrosoft Visual C++ 2005 再頒布可能パッケージと繋がりがありそうな風情である。またmsdiaがMicrosoft Debug Information Accessorの略ではなかろうかということも分かる。

参考:
Microsoft Visual C++ 2005 再頒布可能パッケージ (x64)
The Msdia80.dll file is installed in the root folder of the boot drive when you install the Visual C++ 2005 Redistributable Package by using the Vcredist_x64.exe file or the Vcredist_ia64.exe file

bcで小数の比較をおこなう

[コマンドは整数同士しか比較しないので小数点を含む数があらわれるとたちまち「integer expression expected」というエラーに見舞われる。そうすると小数の比較を[コマンドでも可能にする工夫を凝らすか別の方法を模索しなければならない。暇を掛けずにやるならbcがよさそうである。bcにパイプで不等式を渡してやると関係を満たさないものは0、満たすものは1を返してくる。

$ echo '1.99 == 2.00' | bc
0
$ echo '2.00 != 2.00' | bc
0
$ echo '1.99 > 2.00' | bc
0
$ echo '1.99 >= 2.00' | bc
0

$ echo '2.00 == 2.00' | bc
1
$ echo '1.99 != 2.00' | bc
1
$ echo '1.99 < 2.00' | bc
1
$ echo '1.99 <= 2.00' | bc
1

なおbcはbasic calculator或いはbench calculatorの略のようであるけれどもはっきりした出典は探し当てられなかった。

参考:
bc (programming language)

Microsoft Sticky Notesの内容を別PCへ移行

OS: Windows 10 version 1709
Microsoft Sticky Notes 1.8.2.0, 2.1.17.0

Microsoft Sticky Notesの内容をひとしべひとしべコピーして別PCへ移行してくださいと作業監督の人はかつて仰っていたのだけれどもべらぼうな数の付箋を持つ人だと骨の折れることだからもう少し容易い手口はなかろうかと調べるものである。近頃のSticky Notesであるとデータは以下のフォルダにplum.sqliteのファイル名で作成されるようである。

%localappdata%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState

これを別PCの同じフォルダへコピーしてやれば内容だけでなく太字やアンダーラインなどの装飾や付箋のカラー、ウィンドウの位置からサイズまで再現された。試みにplum.sqliteの中身を拝見するとそういった情報が格納されている様が見て取れるからなるほどとおもう。

$ sqlite3 plum.sqlite
sqlite> .header on
sqlite> .mode column

sqlite> .table
InkListItem       StorageChangeSet  StrokeMetadata    User
Note              Stroke            UpgradedNote

sqlite> select * from Note;
Text                                                                                             WindowPosition                                CreationNoteIdAnchor  CreationWidth  CreationHeight  Theme       Id                                    ParentId                              Revision    SyncRevision  CreatedById  CreatedAt           DeletedAt   DeletedById  UpdatedAt           UpdatedById
---------------------------------------------------------------------------------------------    --------------------------------------------  --------------------  -------------  --------------  ----------  ------------------------------------  ------------------------------------  ----------  ------------  -----------  ------------------  ----------  -----------  ------------------  -----------
%localappdata%\\Packages\\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\\LocalState\\plum.sqlite  V1NERgMAAAABAAAAAUUBAAAVAQAAMgEAAKsAAAAAAAA=                        320.0          320.0           Blue        a3758da8-c8c1-4d83-9707-2826a8293d0b  5e09a04a-7767-4cc3-bcdd-9995acd44d53  0           0                          636584095623655018                           636584369343910652
\b\i http://www7390uo.sakura.ne.jp/wordpress/                                                    V1NERgMAAAABAAAAAYABAACJAQAAXQEAAH4AAAAAAAA=  a3758da8-c8c1-4d83-9  0.0            0.0             Green       60a73dd6-8b3d-421b-9246-30dce0900128  5e09a04a-7767-4cc3-bcdd-9995acd44d53  0           0                          636584100076882996                           636584369448910247

なおまるきり異なるユーザへも移行できたし1.8.2.0から2.1.17.0への移行も可能であった。然し乍ら2.1.17.0から1.8.2.0へplum.sqliteを移すとSticky Notesが起動しなかったのでどうやらこのバージョン間での前方互換性はない模様である。ずっと古いSticky Notesであるとplum.sqliteではなく以下のフォルダにStickyNotes.sntとしてデータが保存されているということであった。

%appdata%\Microsoft\Sticky Notes

これを今どきのSticky Notesへ移行するのであればStickyNotes.sntをThresholdNotes.sntにリネームして次のフォルダへ放り込むと良いようである。

%localappdata%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\Legacy

移行が都合良く運ばないときはSticky Notesをリセットしてやると順調に進むことがあった。

参考:
Microsoft Sticky Notes Importing Legacy Sticky Notes

カスタマイズしたRaspbianが入ったmicroSDのディスクイメージを能う限りコンパクトに取得する

OS: Ubuntu Server 12.04

大規模な変更や無謀な試みを施す直前にRaspbianのバックアップを取っておきたいけれども64GBの容量を謳うmicroSDのイメージファイルをそのままddコマンドで吐き出すと時間とストレージがいくらあっても足りないものである。容量いっぱいまで拡げられたルートパーティションを縮める手続きが必要である。

$ lsblk -i
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
(snip)
sdf      8:80   1  60.1G  0 disk
|-sdf1   8:81   1  41.8M  0 part
`-sdf2   8:82   1    60G  0 part

作業の大雑把な流れはファイルシステムのサイズを縮小→パーティションサイズを縮小、という具合である。また

 パーティションサイズ >= ファイルシステムサイズ

という掟もあるようであるから計算を誤るとKernel PanicでOSが起動しないイメージファイルが生まれるおそれがあり心を砕いて取り組む繊細な仕事である。利用できる環境であればGPartedでシュッとやるのが早くて確かでよりコンパクトになるからもう絶対GPartedがよかろうとおもう。

仕事をするGPartedのようす

ファイルシステムを縮小

/dev/sdfとして認識されたmicroSDのパーティション構成を具に確認するとこうである。ブートパーティションが/dev/sdf1、ルートパーティションが/dev/sdf2のようである。ルートパーティションのサイズは概ね60GiBであった。此れをresize2fsコマンドで以って縮めることを目当てにする。

$ sudo fdisk -l /dev/sdf
(snip)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1            8192       93802       42805+   c  W95 FAT32 (LBA)
/dev/sdf2           98304   125958143    62929920   83  Linux

$ echo 'scale = 3; (125958143 - 98304 + 1) * 512 / 1024 ^ 3' | bc
60.014

ひとまずe2fsckコマンドを前もって実施しておかないと「Please run ‘e2fsck -f /dev/sdf2’ first.」などと言われて終いであった。

$ sudo e2fsck -f -y -v -C 0 /dev/sdf2

無闇に縮小する訳にはいけないからどれだけの容量が実際に使用されているかを前もって把握せねばならない。tune2fsで以って使用済みのブロック数から値を割り出すとだいたい2.01GiBを使用中というふうに観察できる。

$ sudo tune2fs -l /dev/sdf2
(snip)
Block count:              15732480
Free blocks:              15204597
Block size:               4096

$ echo 'scale = 3; (15732480 - 15204597) * 4096 / 1024 ^ 3' | bc
2.013

まったく隙間なく縮めてしまうとOS起動後に容量不足で禄な操作が許されないので、少しゆとりをもたせて2.1GiBに定めた。これをresize2fsコマンドに渡すと「resize2fs: Invalid new size: 2.1G」というエラーになるからどうも自然数しか受け付けてもらえない情勢である。さりとて3GiBでは目当ての値より一寸隔たりが大きいのでMiB単位で考えるのがよさそうである。2.1GiBは2.1 * 1024 = 2150.4MiBであるから2150Mとすれば概ねよかろうと思う。

$ sudo resize2fs -p /dev/sdf2 2150M

パーティションサイズを縮小

fdiskでルートパーティションのサイズを縮めるには現在のルートパーティションを一旦削除して新たに作り直せばよかった。終了セクタはファイルシステムのサイズより大きくなるよう取らねば都合が悪いようだから2200MiBとした。

$ sudo fdisk /dev/sdf
Command (m for help): p
(snip)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1            8192       93802       42805+   c  W95 FAT32 (LBA)
/dev/sdf2           98304   125958143    62929920   83  Linux

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (2048-125958143, default 2048): 98304
Last sector, +sectors or +size{K,M,G} (98304-125958143, default 125958143): +2200M

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

このあとサイズを指定せずにresize2fsを実行することでファイルシステムのサイズをパーティションサイズに一致するよううまい具合に膨らませてくれるようである。

$ sudo resize2fs -p /dev/sdf2
$ sudo fdisk -l /dev/sdf
(snip)
   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1            8192       93802       42805+   c  W95 FAT32 (LBA)
/dev/sdf2           98304     4603903     2252800   83  Linux

これで漸くルートパーティションのサイズがコンパクトにまとまった。あとは512byte * (4603903 + 1)sectorだけddコマンドで以ってディスクイメージをファイルに書き出せば終いである。GPartedの仕事にくらぶればやや肥大気味ではあるけれども1bitをシビアに争う要請ではないから良しとしたいところである。

$ sudo dd if=/dev/sdf of=raspbian.img bs=512 count=4603904

なおresize2fsのマニュアルを読み進めているとKiBやGiBに対して風当たりの強い様が見られて大変興味深かった。

Note: when kilobytes is used above, I mean real, power-of-2 kilobytes, (i.e., 1024 bytes), which some politically correct folks insist should be the stupid-sounding “kibibytes”. The same holds true for megabytes, also sometimes known as “mebibytes”, or gigabytes, as the amazingly silly “gibibytes”. Makes you want to gibber, doesn’t it?

参考:
Raspberry Piで最小限に切り詰めたSDカードのイメージをバックアップする手順メモ.md
Linuxファイルシステムのサイズ変更とデフラグ
Raspberry Pi Visual identity guidelines