2018年4月21日土曜日

fontconfigの設定が腐っていたので修正

最近、何かにつけて

Fontconfig error: failed reading config file

というerror messageが目に付いたので、何が原因なのかを探って解決するまで。

概要


症状


* 様々なapplication softawreを立ち上げ時に"Fontconfig error: failed reading config file"というerror messageが複数回 (4回)出る


推測


* fontconfigに関する設定の間違い
* これまで出ていた記憶がない(最近になって見掛けるようになった)ので、updateによる書式やoptionの変更があった?

原因


* fontconfigの設定directory `/etc/fonts/conf.avail/`にある一部のfilesがおかしなことになっていた
* 具体的には`65-0-fonts-beng-extra.conf`など、設定filesと同じdirectoriesが複数存在しており、そのdirectoriesの中にそれぞれ更に同名のfileが存在していた
* `/etc/fonts/conf.d/`以下から貼られているsymlinksは当然切れている → 読み込めないerrorの原因
* なぜ`65-0-fonts-beng-extra.conf`などと言ったdirectoriesが作られたのかは分からないが、過去のinstallerのbugとか野良packagesの仕業とか何かのworkaroundで忘れていたものかも知れない?

対処


* 当該directoriesを削除し、.dpkg-new suffixのついたfilesをmv


2018年4月13日金曜日

Shuttle SZ170R8のBIOS (UEFI) v2.10がreleaseされていたのでupdate

3/27にShuttle SZ170R8のBIOS (UEFI)のv2.10がreleaseされていたのでupdateした。

Intel CPUのspeculative executionに関するvulnerabilities (いわゆる"Meltdown"と"Spectre")に対応したmicrocodeを含む。

BIOS v2.10 cf. [Shuttle Global - SZ170R8](http://global.shuttle.com/main/productsDownload?productId=1995)

update手順の概要


Boot mediaの準備


Rufus (cf. [Rufus - Create bootable USB drives the easy way](https://rufus.akeo.ie/))でbootable USB memoryを作り、そこにdownloadしてきたzip archiveの中身を展開して書き込む。

* Rufusで、vfat (FreeDOS)なbootable USB memoryを作製
* BIOS (UEFI)のzip archiveをdownloadして展開
* DOS/の中にあるflash.batとBIOS/をflash memoryのtop directoryにcp

SZ170R8の準備


* 何度も電源が切れたり入ったりを繰り返すので、予めHDDとか周辺機器は外しておく

Update process


* USB memoryからbootしてcommand promptが出たらflash.batを実行
* 画面に進捗状況が表示されるので暫く待つ
* 更新が終わるまで何度かrebootを繰り返す

BIOS設定の確認


* DEL keyを何度か押すとBIOS画面に入るので、設定を戻すなり確認するなりして保存
* 適当にmenu画面か何かで止めておいてスイッチで電源断
* この辺りでHDDや周辺機器を戻す

Bootの確認


* 電源を投入し正常にOSがbootすることを確かめる


2018年3月26日月曜日

SwissMicros DM42 及び DM15Lのfirmwareがupdateされた

SwissMicros DM42とDM15Lのfirmwareがそれぞれupdateされた。

DM42はv3.5が、DM15Lはv26がそれぞれ最新のfirmware。詳しくはlink先を参照のこと:

cf. [SwissMicros | Firmware](https://www.swissmicros.com/firmware.php)

また、firmware updateの方法については以前書いているので参照されたい:

* https://typeinf-memo.blogspot.com/2017/12/swissmicros-dm42firmware-update.html ※DM42のfirmware updateについて
* https://typeinf-memo.blogspot.com/2016/07/swissmicros-dm-15lfirmware-upgrade.html ※DM15Lのfirmware updateについて

2018年3月17日土曜日

Raspberry Pi 3 Model B+が発表された

先日、Raspberry Pi財団よりRaspberry Pi 3 Model B+ (3B+)が発表された。

cf. [Raspberry Pi 3 Model B+ on sale now at $35 - Raspberry Pi](https://www.raspberrypi.org/blog/raspberry-pi-3-model-bplus-sale-now-35/)

Raspberry Pi 3 Model Bからの主な改良点は:

* SoCがBCM2837B0へupgrade (1.4GHz)
* SoCが金属ヒートシンクに覆われた → 放熱性up
* GbEへの対応 (3までは100BASE-Tだった) ※USB2.0 (up to 480MB/s)での接続
* PoEへの対応 ※HATによる対応
* Wi-Fiのupgrade (802.11ac対応、特に5GHz帯の改善)
* 電源の強化

など、Network関連の強化 (connectivity)に主眼が置かれている。

なお、価格は据え置かれて$35のまま。例として、RSコンポーネンツでは「発売開始時期未定」となっているが、日本では電源を除いて4500円ぐらいで購入できるだろう (2018-03-17現在入手可能な3Bは税込み4320円)。

2018年3月16日金曜日

SwissMicros DM42のfirmware 3.4aが公開された (3/7)

DM42のfirmware 3.4aが3/7に公開されていたのでupgrade。

3.4ではoccasionally lockupなどの不具合に対する修正が行われているので、所有者はfirmware updateを検討されたい。

cf. [Firmware History](https://www.swissmicros.com/dm42/firmware/history.html)


2018年3月12日月曜日

SwissMicros DM42で簡単なprogramを組んでみる

SwissMicros DM42 (HP-42Sの互換機)で、有名な「ユークリッドの互除法」(Euclidean algorithm)を実装してみる。


ユークリッドの互除法について


ユークリッドの互除法は2つの自然数xとyがあった時に、その最大公約数 (xとyに共通する最も大きな約数、割り切る数)を求める手順だ。面倒なので、最大公約数を以後GCD (greatest common divisor)と書く。

古代ギリシアの数学者ユークリッド (Euclid)によって記された『原論』(Elements)の中に書かれており、紀元前300年ごろには存在していたというから凄い。

このアルゴリズムでは、以下のように計算を進める:

1. xをyで割った余りをrとする
2. rが0でなければ、x←y、y←rとして1.に戻る
3. rが0ならば、その時のyが元々のxおよびyのGCDである


電卓を叩いて確かめてみる


例として、DM42を使い手動で1785と374のGCDを求めてみる。

使うDM42の機能について:

* MOD → y÷xの余りを計算してxに積む
* LASTX → 直前までxに入っていた内容を保持するL-registerの内容をxに積む
* x≶y → X-registerとY-registerの内容を交換する


1. 1785
2. ENTER
3. 374
4. MOD ⇒ 289 ※余りは0ではない
5. LASTX ⇒ 374 ※直前のxの内容を呼び出した
6. x≶y ⇒ 289 ※xとyの内容を交換
7. MOD ⇒ 85 ※余りは0ではない
8. LASTX ⇒ 289
9. x≶y ⇒ 85
10. MOD ⇒ 34 ※余りは0ではない
11. LASTX ⇒ 85
12. x≶y ⇒ 34
13. MOD ⇒ 17 ※余りは0ではない
14. LASTX ⇒ 34
15. x≶y ⇒ 17
16. MOD ⇒ 0 ※余りが0になった!
17. LASTX ⇒ 17 ※これが1785と374のGCD

MODの結果が0になるまで、ひたすらLASTXしてx≶yしてMODする、を繰り返すだけでGCDが計算できるとわかる。このような単純作業はもちろん機械にやらせるべきだ。


DM42でprogramming


DM42 (HP-42S)に限らず、RPN方式の関数電卓では基本的にキー入力の羅列がそのままprogramになる。ただし、practicalなprogramを記述するには、LBLや条件分岐やjump命令などが必要になる。

DM42のprogramの構造は:

LBL "LABEL"
...
END (或いはRTN)

のようになっている。LBL (label)はprogram (或いはsubroutine)の名前で、様々な手順が続き、最後はRTN (return)或いはENDである。


PRGM (□+R/S)でprogram modeに入る。

先頭の行番号はDM42が勝手につけてくれるので無視すると、こんな感じに書ける:

LBL "GCD"
LBL 02
MOD
X=0?
GTO 01
LASTX
X<>Y
GTO 02
LBL 01
LASTX
RTN

EXITでprogram modeを抜ける。

programを実行するにはXEQを押す。すると、software menuにprogramで指定したlabel (LBL)が表示されるので、GCDを選ぶ。ただし、今回のprogramはとにかく手順をそのまま書いただけなので、予めY-registerに大きい方の自然数を、X-registerに小さい方の自然数をそれぞれ積んでおく必要がある。

1. 1785 [ENTER]
2. 374
3. XEQ → GCD ⇒ 17

X-registerには17が残っているはずだ。


そして最小公倍数へ


ちなみに、GCDとくればLCM (least common multiple)——最小公倍数も忘れてはならない。2つの正の整数について:

GCD(x,y) LCM(x,y) = xy

という関係が成り立つと知られているので、GCDが分かっていればLCMも計算できる。

LCM(x,y) = xy / GCD(x,y)

1785と374の場合は39270である。


2018年3月11日日曜日

Seagateの12TB (≒10.91TiB) HDDを導入した

メインマシン兼NASとして使っているPCのデータストレージとして、これまではWestern DigitalのNAS向け製品であるWD RedシリーズのWD80EFZX (8TB ≒ 7.28TiB)を使っていた。これを新たにSeagateのNAS向け製品であるIronWolfシリーズのST12000VN0007 (12TB ≒ 10.91TiB)へ換装した。ここ数年はWestern DigitalのHDDばかり購入してきた (Redの6TB、8TB)ので、SeagateのHDDを購入するのは久し振りだ。

換装した一番の理由は、WD80EFZXの残り容量がほぼ無くなったこと。丁度決算期で普段より値引きが期待できる時期なのと、前回HDDを導入してから2年ほど経っているので頃合いなこともあった。

LUKS+Btrfsで運用している。RMAの兼ね合いもあるので、2年くらい持てばいいのだが。


S.M.A.R.T.の情報を見てみる


Linuxなので、smartctlを使ってみた:

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   079   068   044    Pre-fail  Always       -       74220560
  3 Spin_Up_Time            0x0003   097   097   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       2
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   068   060   045    Pre-fail  Always       -       5995223
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       15
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       2
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   064   062   040    Old_age   Always       -       36 (Min/Max 25/38)
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       2
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       2
194 Temperature_Celsius     0x0022   036   040   000    Old_age   Always       -       36 (0 25 0 0 0)
195 Hardware_ECC_Recovered  0x001a   040   036   000    Old_age   Always       -       74220560
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0023   100   100   001    Pre-fail  Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       15 (143 172 0)
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       13528061790
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       455020

WDのHDDと違い、SeagateのHDDでは1 Raw_Read_Error_Rateや7 Seek_Error_Rate、195 Hardware_ECC_Recoveredといった値が物凄い勢いで増加しているので、最初diskの故障を疑った。

しかし、これらのraw valueをそのまま解釈するのは無意味であり、本当に気にするべきなのは5 Reallocated_Sector_Ctや197 Current_Pending_Sector、198 Offline_Uncorrectableの値であるとの情報があった。

* [Just got a Seagate Ironwolf... are these SMART readings normal? : DataHoarder](https://www.reddit.com/r/DataHoarder/comments/61pmsb/just_got_a_seagate_ironwolf_are_these_smart/)
* [Seagate製HDDが故障する直前のsmart値 – UbuntuによるEco Linuxサーバ構築記](http://eco.senritu.net/seagate%E8%A3%BDhdd%E3%81%8C%E6%95%85%E9%9A%9C%E3%81%99%E3%82%8B%E7%9B%B4%E5%89%8D%E3%81%AEsmart%E5%80%A4/)


RAIDでもNAS専用機でもなくsingle disk換装を選んだ理由


Single disk換装を行ったのは、費用や運用の面で最も適していると考えたからだ。

他にはNASを組む (或いはNASキットを買う)、RAIDを組むなどの方法もあるが:

* 初期コストが高い (diskが複数本必要、それを格納できるケースやマザーボード或いはNAS本体、etc)
* 運用の複雑さが増す
* 電気代が増す
* 総容量が大きくなるとバックアップを取るのが難しくなる

といった問題がある。Single disk運用は、そのdiskが故障すると終わりという問題があるものの、これまで使っていたdisks (8TBと6TB)に定期的にbackupを取ることで影響をある程度緩和する方針を取る。

raidzを使い、信頼性のあるきちんとしたfile serverを構築する場合には、以下のpageが参考になるだろう: