特に内容の無い雑記

本気で内容が無い雑記。ただただキーボードをぽちぽちやりたくなったのよ。 何故か22/7にハマった。アイドルものにハマる事はあんまり無い自分なのだが、珍しく大好きになった気がする。きっかけはアニメ。普通に作画も良かったし、戸田ジュンの話なんかは涙も流しそうになりながら見た。本放送見て、Amazon Prime Videoで見直して、今再放送を見ている。
河野都推しになった。どのシーンでもなんだかんだ周りを見て、良い方向に良い方向にって行くように奮闘する姿がもう愛しすぎる。円陣のコールかわいいなぁ。
さらに、計算中のSeason 1を友人から録画を借りて見たのだけど、とにかく楽しいのだよなぁ。最初にやっていた絶叫マシーンリポでの、藤間桜の「あ、車だ」とか河野都の「オカン!!」とかでげらげら笑ったりした。よいしょー。
ちょうどゲームも始まったので多少課金しながら遊ばせてもらいます。
あと、コラボのNW-A105とWH-XB900N買いました(謎に日和ってWH-XB900Nはつい数日前に注文したのでまだ届いていないけど)。コラボグッズなので使うか非常に迷うけど、眠らせておくのも勿体無い金額だし()大事に大事に使わせてもらおうと思います。勿論河野都モデル。 次の話題。シャープのマスクの話。普通に初回抽選のときにがんばって応募した。当選してないけど。
当時本当にマスク無くて、本来なら使い捨てのマスクを4枚程度ローテにして何週間も使いまわしたりしていたのだけど、50枚も買えるなら3000円くらい全然いいよって感じだった。
ところで、「毎週毎週倍率が100倍とか、凄い!」みたいなツイートをたまに見るのだけど(応募した人ですらこう言っている事があるのだけど)なんともだね。何故なら「これまでの抽選販売でご応募された方」は「自動的に今後の抽選販売の対象と」なるし、毎週7万箱ずつの販売なので、毎週のン百万人は殆どが同じ人なのだ。
結局普通に箱でマスク調達できたので今やどうでも良いのだが… さーて次の話題。MacBookシリーズの何かが欲しい。
定期的にこういう気持ちにはなるんだけど、最終的に買ったことはない。
どうして欲しくなるかというと、あんまり判然としないんだけど、やっぱりもう見た目がきれいだよね。本体デザインに調和するかっこいい周辺機器とか使ってみたいのもある。あとiOSアプリ開発を少しやってみたいというのもある。
よく、何も考えなくてもUNIXライクなシステムが動いてるみたいなのも聞くけど、WindowsでもWSLを使えば割と簡単にUNIXライクなシステムが使えるようになる訳だし、そこは薄くなっているかもしれないね。

購入を躊躇わせるところはいくつかある。
ひとつは、今はArchLinux使っているところ、macOSにどうしても馴染めなかったら逃げる事ができるか?というやつ。これが一番大きい。Linuxカーネルが普通にブートできるかどうか不安なのよな。古いモデルなら情報が色々あるけど、買うなら最新のやつだしね。最悪、中古で売ってしまって、もとに戻ればいい気もするのだけど…
それから、キーボードがバタフライからシザーになったけど、本当に改善したのか?という。最悪、金に物を言わせて尊師スタイルすれば良いのだがなんとも…外出時は使いにくいしね。
あと、どうせmacOSを使うならiOS端末を使うべきな気もするけど、iPhoneの7(ほぼ使ってない)とiPad mini 4(ナナオンとYouTubeアプリにしか使ってない)しか持ってない。メインのスマホをAndroidから変える事はまず無いしなぁ。

お金が余ってたら買ってみようかなとか思うけど、金が余ってるならもっとバンバンNAS新調したり現メインのデスクトップPCを組み直したりしたいところだしなぁ。 そうそう、現メインのデスクトップPCですよ。
NVMe固定用の足って取れるんですね。お陰様で2280サイズだけ固定できなくなりました。写真下部のPCI-eに刺さってるやつにそのまま載せて起動できたから良いものの、危うく完全に起動不能になるところだった。(PCI-eに刺さってるのは以下みたいなやつ) Ryzen 3700Xの隣で動くCore i7 6700Kってそんなに強くない訳だし、普通にメインマシン組み直そうかな的な。今のところWindowsでCPU使う処理って大して無くて、動画エンコード(aviutl使ってる)くらいしかないので、ハイパワーをやめてコスパとか消費電力を重視して組むのも良いのかなと。ゲームはCPUよりもGPUが大事だし。この辺はまだ全然構想固まってないんだけどねー。 そろそろ眠くなってきたので最後。PCデスクを新調したい。
今はホームセンターでてきとうに買ってきた棚の上に厚み10mmちょいで1畳サイズの板を渡しているのを「デスク」と言い張って使っている。
新調したいモチベーションは、板が重みに負けて歪んじゃって怖いっていうのもあるけど、それ以上に、足元が暗くなるのがストレスな気がした。何か落とした時拾うのしんどいのもあるし、視界がスッキリしなくなるっていうのもある。
という訳で、スチールラックでPCデスク組んだら足元明るくなるし良いんじゃなかろかと。どこ触ってもひんやりするっていう、暑がりの自分にはめちゃ嬉しい副次効果もある。
問題はやっぱりお金で、なんとなく構想した状態では合計で5万円くらい必要。きちんとしたPCデスクっていうとそれくらいはかかるのかもしれないけど、ポンッと出すには厳しい金額。特別定額給付金はナナニジコラボグッズとナナオン課金に消えたし、なかなか…
スチールラックの構想を練るにあたって、イメージを作るのが結構大変だったので、自前でなんかそういうツールでも作れたらいいなーとぼんやり思いつつ、これでおしまいにしよう。

ArchLinuxの上のQtアプリケーションでfcitx-mozcが有効にならんやつ

~/.xprofileでは以下3行は記述済み。

export QTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

fcitx-diagnoseを実行すると、Qt IM モジュールファイルのところで、Qt5のFcitx入力メソッドモジュールが見つかりません。の文字が。(Qt4も出てる) Fcitx – ArchWikiの「インプットメソッドモジュール」のところを見ながら入れてみる(ここまででIMモジュールだったり入力メソッドモジュールだったりインプットメソッドモジュールだったり色々表現があるが、どれも同じだろう)

$ sudo pacman -S fcitx-im

再度fcitx-diagnoseを実行すると、Qt5についての表記は消えて、目的のQtアプリケーションでも日本語が入力できるようになった。Qt4についてはaurから拾えというような感じだが、Qt4製アプリケーションを今使う予定は無いので入れないでおこう。

JavaScriptで数値をn進法で表現する

自分用メモ。しょぼい話。
数値を2進法とか16進法とかで表現したいときにべんり。(冪乗を効率的に計算する場合に、指数を2進法で表現したくなったりするのだ)

const i = 256;
console.log(i.toString(2)); // 100000000
console.log(i.toString(16)); // 100
const j = -5;
console.log(j.toString(2)); // -101

Number.prototype.toString() – JavaScript | MDNによると、引数は基数を指定すれば良く、2〜36の整数が許容されるらしい。
気をつけるべきは、負数を2進法で表現しようとした場合は、補数表現ではなく、先頭に-符号がついた正の表現が返される(-5は補数表現するなら8ビットの場合は11111011とかになるはず)。それと、戻りは当然ながらstring(typeof(i.toString(2))stringになる)なので、場合によっては気をつけるべきかも?

Raspberry pi 3 B+でPXEブート

大変今更だが、Raspberry pi 3 B+でPXEブートをしたい気がした。
我が家の構成は、DHCPはEdge Router X(192.168.0.1)がその役割を果たし、TFTPとNFSは自宅サーバ(192.168.0.4)にやらせる。 てきとうにいじっていたので、設定の記述は要らんやつとかもあるかも。 まずはDHCPでTFTPの情報を渡させる必要がある。EdgeRouter XのConfig Treeから、service -> dhcp-server -> shared-network-name -> LAN -> subnet -> 使うサブネットを選び、以下設定を行う。
tftp-server-name: 192.168.0.4 dnsmasqの設定。

dhcp-range=192.168.0.0,proxy
dhcp-boot=pxelinux.0
pxe-service=0,"Raspberry Pi Boot",pxelinux,192.168.0.4
enable-tftp
tftp-root=/srv/tftp/pxe-boot

nfsの設定。

sudo pacman -S nfs-utils
sudo vim /etc/exports
/srv/nfs/pi3/rpi-netboot 192.168.0.0/24(rw,no_root_squash)
sudo systemctl start nfs-server

データの配置。事前にCPUのシリアル番号をcat /proc/cpuinfo | grep Serialで調べておく。今回は12345678だった想定。

$ sudo mkdir -p /srv/tftp/pxe-boot/12345678
// Raspbianインストールイメージのboot領域を/mntにmountした前提で
$ sudo cp -r /mnt/* /srv/tftp/pxe-boot/12345678/
$ sudo mv /srv/tftp/pxe-boot/12345678/bootcode.bin /srv/tftp/pxe-boot/
$ cat /srv/tftp/pxe-boot/12345678/cmdline.txt
root=/dev/nfs nfsroot=192.168.0.4:/srv/nfs/pi3/rpi-netboot,vers=4,proto=tcp rw ip=dhcp rootwait elevator=deadline
// Raspbianインストールイメージのroot領域を/mntにmountした前提で
$ sudo mkdir -p /srv/nfs/pi3/rpi-netboot
$ sudo rsync -xa /mnt/ /srv/nfs/pi3/rpi-netboot

最後に、/srv/nfs/pi3/rpi-netboot/etc/fstabからmmcblk0の記述行を消しておく。
あとはRaspberry piからSDカードを抜いたまま電源を入れれば、起動できるはず。 つまずきポイント。 その1、dnsmasqのログに何も出ない(Raspberry piから何も取得しようとしない)。これはEdge Router Xの設定を間違えていただけ。Edge Router「を」PXEで起動するための設定を眺めていたのが間違いで、tftpのサーバがどこにあるのか教えてあげればそれで十分でした。 その2、カーネルの起動までは通っても、rootファイルシステムがマウントできなくてKernel panicになる。
散々困ったのだけど、nfsのログを眺めていたところ(# sysctl -w sunrp.rpc_debug=1023 && sysctl -w sunrpc.nfsd_debug=1023してから、journalctlで見れる)unknown version (2 for prog 100003, nfsd)とか出ていて、あーこれまさかプロトコルバージョン2で接続してないかね?ということで…cmdline.txtにvers=4を追加したところ無事通過。よかったよかった。

Raspbianのインストールイメージをmountする

SDカードとかUSBスティックにddして使うつもりのインストールイメージの中身を見たいとき、mountしたいが、ひと手間が必要。
インストールイメージという事はbootできるように作られているわけで、つまり複数のパーティションを持っているのだ。
これをmountするためには、offsetオプションをつける必要がある。素直に実行すると以下のような感じでエラーが出る。

$ sudo mount 2020-02-13-raspbian-buster.img /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other error.

offsetの値を調べるため、fdisk -l -u

$ fdisk -l -u 2020-02-13-raspbian-buster.img
Disk 2020-02-13-raspbian-buster.img: 3.54 GiB, 3787456512 bytes, 7397376 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xea7d04d6

Device                          Boot  Start     End Sectors Size Id Type
2020-02-13-raspbian-buster.img1        8192  532479  524288 256M  c W95 FAT32 (LBA)
2020-02-13-raspbian-buster.img2      532480 7397375 6864896 3.3G 83 Linux

Sector sizeStartの積をoffsetに指定すれば良い。

// 第1パーティション
$ sudo mount -o loop,offset=`expr 8192 \* 512` 2020-02-13-raspbian-buster.img /mnt
// 第2パーティション
$ sudo mount -o loop,offset=`expr 532480  \* 512` 2020-02-13-raspbian-buster.img /mnt

お名前.comのIPアドレス更新を自動化する

Windowsだと公式の更新クライアントが使えるんだけど、Linuxではダメなので、expectを使う。
参考サイト:お名前.com DDNS – scientia est potentia expectの導入は何も考えずpacmanで良い。IPアドレスはcurl inet-ip.infoで得られる。以下ではtea-soak.orgとblog.tea-soak.orgを更新してみている。

export IP=`curl inet-ip.info`
expect -c "
spawn env LANG=C openssl s_client -connect ddnsclient.onamae.com:65010 -quiet

send \"LOGIN\n\"
send \"USERID:お名前.comのユーザ名\n\"
send \"PASSWORD:お名前.comのパスワード\n\"
send \".\n\"

expect \"000 COMMAND SUCCESSFUL\" {
  send \"MODIP\n\"
  send \"DOMNAME:tea-soak.org\n\"
  send \"IPV4:${IP}\n\"
  send \".\n\"
  expect \"000 COMMAND SUCCESSFUL\" {
    send \"MODIP\n\"
    send \"HOSTNAME:blog\n\"
    send \"DOMNAME:tea-soak.org\n\"
    send \"IPV4:${IP}\n\"
    send \".\n\"
    expect \"000 COMMAND SUCCESSFUL\" {
      send \"LOGOUT\n\"
      send \".\n\"
      exit 0
    }
  }
  exit 0
}
"

異常系の処理とかはてきとう。

WindowsでChromiumをビルドする

諸事情によりオレオレビルドをしたくなった。ちょろっと修正したバイナリが欲しかったのだ。
今回はWindowsで使う必要があったのだが、我が家で一番パワーのあるCPUであるRyzen 3700XなマシンにはArch Linuxが載っているので、ここでソース修正を試行錯誤した後、Windowsで同様のソース修正をしてバイナリを生成するって感じのことをしようと思う。
Arch LinuxでのビルドはPKGBUILD使えばなんにも難しくないので割愛。ここではWindowsでビルドするぞ。つっても基本的にはChecking out and Building Chromium for Windowsに従うだけ。 必要なものは以下。カッコ書きは今回の環境。
・64bitなIntel CPU(Core i7 6700K)
・RAMは16GB以上推奨(48GB)
・NTFSでフォーマットされた100GB以上のストレージ(Samsung 860 QVO 1TB)
・Visual Studio 2019
・Windows7以降(Windows 10 Pro 1909)

Visual Studio 2019のインストール

まずはVS2019のインストール。Communityで良いのでてきとうに。インストールするコンポーネントは、C++によるデスクトップ開発と、個別で最新の v142 ビルド ツールの C++ MFC (x86 および x64)最新の v142 ビルド ツールの C++ ATL (x86 および x64)を入れた。(ほんとにこれが必要なのかはちょっとわからん)
最後に、Windows 10 SDK (10.0.18362.0)が入っていることを確認して、インストール。 それから、以下の手順でデバッギングのためのツールをインストールしておく。
コントロールパネル→プログラム→プログラムと機能→Windows Software Development Kit - Windows 10.0.18362.1を右クリック→変更→Changeにチェックを入れてNext→Debugging Tools For Windowsにチェックを入れてChangeボタンでインストール。

depot_toolsのインストール

次、depot_toolsのインストール。手順サイトからスッとダウンロードできる。パスにスペースを含まないてきとうなところに展開して、PATHを通す。(中に色々ツールが入ってるので、これが優先されるように)
システム環境変数にDEPOT_TOOLS_WIN_TOOLCHAIN(値は0)を追加する。
この状態で、cmd.exeを開いて、gclientを実行すると、諸々の必要なツール郡がインストールされるので、これを待つ。
インストールが完了した状態で、where pythonを実行して、depot_tools内のpython.batが呼ばれていることを確認する。(インストール完了確認)

ソースの入手

つぎ。
まずはgitの初期設定から。

$ git config --global user.name "hoge"
$ git config --global user.email "hoge@fuga.com"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global branch.autosetuprebase always

パスにスペースを含まない場所を選んで、てきとうにフォルダを作る。そこの中で、fetch chromiumでリポジトリをcloneする。フルで要らない場合は--no-historyとかしろって書いてあるけど気にしない。20GB超ダウンロードしたし、最終的には1時間半くらいかかったかな。

$ mkdir chromium
$ cd chromium
$ fetch chromium

ビルド

ChromiumではビルドツールとしてNinjaというものを使んだけど、そのための.ninjaファイルを生成するのがGNというツール。こいつを使ってコンフィグ(ビルドディレクトリ)を作成して、autoninjaコマンドでビルドする。
Visual StudioをIDEとして使う場合には--ideオプションをつけろとかあるけど、今回は修正内容がはっきりしているので、気にしない。

$ cd src
$ gn gen out/Default
$ autoninja -C out/Default chrome

0:50頃スタートして、バイナリのタイムスタンプが5:20だったので、4時間半かかった。他にも色々やってたしこんなもんか? 手順通りに進めるだけでうまくいくっていいよね(?)

ArchLinux+btrfsでストレージを組む練習

NASていうかbtrfsを使う練習。 今は自宅内NASとして2TB*4で作ったRAID10なストレージをそのまま使っているのだけど、容量を大きくしたいというのと、組んだまま6年も使い続けているので、組み直したいという話。
同じようにRAID10で組み直すのも芸がないし、容量の変更に対応できるような構成にしたい。当初はZFSを検討していたのだけど、ライセンス的に面倒だし、Linuxのファイルシステム「Btrfs」を5年間使用した記録 – GIGAZINEとかによると、構成の変更が視野に入っているならbtrfsのほうが良さそう。 というわけでbtrfsを使う練習をしてみる。 取り敢えず4本一挙に買うお金が無いので、2本で構成→後からお金があるタイミングで4本に増やす、みたいなのを想定。
ただし、システムのパーティションは素直に組んで、NAS用ストレージだけbtrfsにする。
・ストレージ1本で構成
・1本追加してRAID1にする(メタデータもRAID1)
・1本壊れた想定で、差し替える
・2本追加して、4本で構成する
・1本壊れた想定で、差し替える
・1本を大容量のものに差し替える

ArchLinuxセットアップ

何はともあれ実験環境のセットアップ。物理マシン(物理ストレージ)を用意するのは面倒なので、仮想マシンで。
2020.04.01なISOを読ませて起動して、以下つらつらと構成。

// それっぽくパーティショニング
# fdisk /dev/sda
// マウントとpacstrap
# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
# pacstrap /mnt base base-devel linux linux-firmware
// fstab生成とchroot
# genfstab -U /mnt >> /mnt/etc/fstab
# arch-chroot /mnt
// タイムゾーン、ロケール、ホスト名、パスワード
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/locale.gen
# locale-gen
# cat hostname > /etc/hostname
# pacman -S vim
# vim /etc/hosts
# passwd
// ネットワーク
# pacman -S dhcpcd
# systemctl enable dhcpcd.service
// ブートローダ
# pacman -S grub
# grub-install --target=i386-pc --recheck /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg
// 再起動
# exit
# umount -R /mnt
# reboot

お次は一般ユーザの作成。

// 一般ユーザの作成
# useradd -m tea
# passwd tea
# ln -s /usr/bin/vim /usr/bin/vi
# visudo
# su tea
$ sudo whoami

ストレージ1本で構成

デフォルトで入ってるストレージは/dev/sdaとして認識されている。ここにストレージを追加したところ、/dev/sdbとして認識されたので、これ1本で構成してみよう。

$ sudo pacman -S btrfs-progs
$ sudo mkfs.btrfs -L tank /dev/sdb
$ sudo sh -c "echo UUID=`ls -l /dev/disk/by-uuid/ | grep sdb | awk '{print $9}'` /mnt btrfs rw,relatime 0 0 >>/etc/fstab"
$ sudo mount -a
$ btrfs filesystem df /mnt
Data, single: total=8.00MiB, used=0.00B
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=112.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B

取り敢えずの作成とマウントはできたっぽい。snapshotはsubvolume単位で作成するので、subvolumeも触ってみる。

$ sudo btrfs subvolume create /mnt/sv1
$ sudo chown tea:tea /mnt/sv1
$ cd /mnt/sv1
// てきとうにファイルを作成
$ dd if=/dev/zero of=/mnt/sv1/data bs=10M count=1
$ ls -l
-rw-r--r-- 1 tea tea 10485760 Apr 28 03:56 data
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=128.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// snapshotを作成する
$ sudo btrfs subvolume snapshot /mnt/sv1 /mnt/sv1.snap
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=144.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// subvolume内をいじる
$ rm data
// snapshotは残っている
$ ls /mnt/sv1.snap/
data
$ btrfs filesystem df /mnt
Data, single: total=100.62MiB, used=10.06MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=51.19MiB, used=144.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
// 弄ったsubvolumeにsnapshotを差し替える
$ sudo btrfs subvolume delete /mnt/sv1
$ sudo btrfs subvolume snapshot /mnt/sv1.snap /mnt/sv1
$ ls /mnt/sv1/
data

subvolumeのsnapshotをとって、それからまるっと書き戻す、みたいなことができるようになった。

1本追加してRAID1にする(メタデータもRAID1)


$ sudo btrfs device add /mnt/sdc /mnt
$ sudo btrfs filesystem show /mnt
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.20MiB
        devid    1 size 1.00GiB used 238.38MiB path /dev/sdb
        devid    2 size 1.00GiB used 0.00B path /dev/sdc
// まずbalance
$ sudo btrfs balance start /mnt
// metadataがDUPなのでRAID0に変更ついでにbalance
$ sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
$ btrfs filesystem df /mnt
Data, RAID1: total=416.00MiB, used=10.12MiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=208.00MiB, used=160.00KiB
GlobalReserve, single: total=3.25MiB, used=0.00B
$ sudo btrfs filesystem show /mnt
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.30MiB
        devid    1 size 1.00GiB used 656.00MiB path /dev/sdb
        devid    2 size 1.00GiB used 656.00MiB path /dev/sdc

usedが増えすぎてる気がしてならない…が、dconvertmconvertを外してbalanceしても240.00MiBと448.00MiBなので、似たようなものか?raid1指定して再度balanceすると使用量が同じになったので間違っていなさそう(ふんいき)

1本壊れた想定で、差し替える

仮想マシンの設定でHDDを1本取り除いておく(そのままだと起動できないので、fstabから自動マウントしないようにしておくか、マウントオプションにdegradedを追加しておく)

$ sudo btrfs filesystem show
warning, device 1 is missing
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.30MiB
        devid    2 size 1.00GiB used 656.00MiB path /dev/sdc
        *** Some devices missing
// 強引にmount
$ sudo mount -o degraded /dev/sdb /mnt
// デバイスを取り除く
$ sudo btrfs device delete missing /mnt
ERROR: error removing device 'missing': unable to go below two devices on raid1

RAIDを組んでいる時に、必要台数を下回ることはできないエラー。RAID1なら2台を下回ってはいけない。Using Btrfs with Multiple Devices – btrfs Wikiによると、とにかく1台追加してからdeleteしろとのこと。

$ sudo btrfs device add /dev/sdb /mnt
$ sudo btrfs device delete missing /mnt
$ sudo btrfs balance start /mnt
$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 416.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 416.00MiB path /dev/sdb

2本追加して、4本で構成する

あとはもう同じようにやるだけ。

$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 416.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 416.00MiB path /dev/sdb
$ sudo btrfs device add /dev/sdd /dev/sde /mnt
$ sudo btrfs balance start /mnt
$ sudo btrfs filesystem show
Label: 'tank'  uuid: ~略~
        Total devices 2 FS bytes used 10.27MiB
        devid    2 size 1.00GiB used 288.00MiB path /dev/sdc
        devid    3 size 1.00GiB used 288.00MiB path /dev/sdb
        devid    4 size 1.00GiB used 416.00MiB path /dev/sdd
        devid    5 size 1.00GiB used 416.00MiB path /dev/sde

同じ使用量のセットが2つあるのでうまくいってそう。

1本壊れた想定で、差し替える

今や4台あるので、btrfs device delete missingして、差し替えのストレージをbtrfs device addするだけ。

1本を大容量のものに差し替える


$ btrfs filesystem usage /mnt
WARNING: cannot read detailed chunk info, per-device usage will not be show, run as root
Overall:
    Device size:                   4.00GiB
    Device allocated:              1.38GiB
    Device unallocated:            2.62GiB
    Device missing:                4.00GiB
    Used:                         20.66MiB
    Free (estimated):              1.71GiB      (min: 1.71GiB)
~以下略~
$ btrfs device delete /dev/sdc /mnt
$ btrfs device add /dev/sdf /mnt
$ btrfs filesystem usage /mnt
WARNING: cannot read detailed chunk info, per-device usage will not be show, run as root
Overall:
    Device size:                  11.00GiB
    Device allocated:              1.69GiB
    Device unallocated:            9.31GiB
    Device missing:               11.00GiB
    Used:                         20.78MiB
    Free (estimated):              5.21GiB      (min: 5.21GiB)
~以下略~

Device missingは何を表しているのだろうかな~ 取り敢えず使うぶんにはこんくらいあればいいんだろうかな、実際に使うときには、定期的にsnapshotとるとか、色々とメンテが必要なんだろうなとは思いつつ、今回はおしまい どうでも良いが、モニタの液晶とパネルの間に、小さい虫が入ってしまったようで、ず~~~っと画面中でうろうろ動き回っていてつらい。分解するのもしんどいしなぁ。どうするかなぁ

3変数の鶴亀算

唐突だが、3変数の鶴亀算を解けるようにしておきたい。ぶっちゃけ数学は苦手科目だが、それっぽく言葉で表現できるようにしたい。完全に自分用メモである。 よく聞く、つまり2変数の鶴亀算は、例えば次のようなもの。
鶴と亀が合計10匹いる。足の本数は合計34本である。鶴と亀はそれぞれ何匹ずついるだろうか?
但し、鶴の足は2本、亀の足は4本とする。

10匹全て鶴だったとすると、足の総数は以下の通り。 $$10[匹]\times2[本/匹] = 20[本]$$ これだと本数が不足しているため、数匹を鶴ではなく亀に変更したい。足の本数は、1匹変更するごとに2→4[本]になるので、1匹変更ごとの増分は2[本/匹]である。 合計本数に辿り着くまで鶴→亀に変更するとき、必要匹数は以下の通り計算できる。 $$\frac{34[本]-20[本]}{2[本/匹]}=7[匹]$$ よって、亀が7匹、鶴は3匹いるということがわかる。 これくらいなら大して考えずノリで計算できる。 さて、問題は3変数のとき。
10000円札、5000円札、1000円札が手元に合計1000枚あり、その総額は1234000円である。各お札は何枚ずつあるのだろうか?
3変数の場合は、図を使うと表現しやすい。
各頂点の名前は利用有無に関わらずてきとうに付けている
突然階段状の図を掲載したが、横軸が枚数、縦軸が1枚あたりの金額、そして面積が総額を表現している。
全て書き連ねてみると、以下の感じ。
AB:10000円札の枚数
DE:5000円札の枚数
HI:1000円札の枚数
AJ:10000円
DK:5000円
HL:1000円
AJKB:10000円札の総額
DKLE:5000円札の総額
HLMI:1000円札の総額 手順は全部で4段階。
10000円札、5000円札、1000円札の枚数をそれぞれa, b, cとする(当然全て0か自然数である)。また、煩雑になるため、以降の金額は全て3桁落として記述する。 1. どのお札であろうと、必ず1円はかかるため、その分を取り除く。つまり全体の面積から、FJMIの面積を引く。 $$1234 – (1\times1000) = 234$$ 2. 多角形AFHEDBについて考える。これはAFGBとDGHEの和のため、以下の式で表現できる。 $$9\times a + 4\times b = 234$$ $$4\times b = 234 – 9\times a$$ $$b = \frac{234 – 9\times a}{4}$$ 3. 試しに値を入れてみて、それっぽい数字が出るか試す。 $$a=0のとき、b=\frac{234}{4}であり不適$$ $$a=2のとき、b=\frac{216}{4}=54であり適当$$ 4. 以下の通り、全ての未知数の候補が見つかる(他にも条件を満たす組み合わせがあるため「候補」)。 $$c=1000-(a+b)=944$$ ※試しに計算してみると以下の通り、確かに満たしている。 $$10\times2 + 5\times54 + 1\times944 = 1234$$ いやー、数学って難しいね(しみじみ)