2017年12月28日木曜日

OMRON BY50Sのバッテリー交換

先日、使用中のUPS (OMRON BY50S)のバッテリ交換ランプが点灯、アラームが鳴ったので、その交換を行った。

申し込み手続き


OMRONのUPSを購入して3ヶ月以内に利用者登録をすることで、3年以内にバッテリ交換が必要となった場合の無料交換サービスを受けられる。

* OMRONのwebsiteから必要な手続きをする
* このとき、UPSのserial numberなどが必要になるので控えておく
* 申し込むと折り返しemailでの連絡がある
* 受け付けられると納入日などの連絡があり、交換用バッテリが送られてくる

交換作業


必要なもの


* UPS本体
* 交換用バッテリ
* プラスドライバ (2番)
* ペンチ or プライヤ
* 保護用のテープ (マスキングテープ、ガムテープ、etc)
* 絶縁テープ (ケーブルの被覆を傷付けてしまった場合に巻く)
* UPSの取り扱い説明書

UPSの電源を切るか、入れたままか


BY50Sは電源を入れたままでもバッテリ交換が可能なので、今回はそうした。ただし、その場合は以下のような注意がある:

* UL規格 (機能と安全性の規格)を満たさなくなる (cf. [UL (安全機関) - Wikipedia](https://ja.wikipedia.org/wiki/UL_(%E5%AE%89%E5%85%A8%E6%A9%9F%E9%96%A2)))
* 交換中の瞬停、停電は保護されない

従って、負荷側の電源を落としUPSを停止させてからの交換が推奨される。設置した場所から動かすことで交換作業がしやすくなる利点もある。

手順


* UPSの右側面を上にしてゆっくり倒す
* 底面のネジを1本外してカバーを開く
* バッテリに貼られているラベルの一部が接着されていないので、そこを引っ張り半分くらい取り出す
* 赤と黒の電源ケーブルを外す
* バッテリを完全に引き抜く

新しいバッテリは逆の順で挿入、装着する。

交換後、ブザー停止/テストボタンを長押しして新しいバッテリを認識させる。

注意点など


実際にやってみるとバッテリとケーブルを接続するコネクタが固くてなかなか外れなかった。説明書にあるように、ペンチやプライヤの類で上下に揺らしながら少しづつ外していく必要があった。このとき、ケーブルの被覆を傷付けないように、金属部分を予めテープで巻いておくと良いだろう。

また、新しいバッテリにケーブルを接続する際もなかなか奥まで入らなかった。やはりケーブルの被覆を傷付けないように注意しながら、道具をうまく活用する必要がある。

交換後のバッテリーの処分


送料のみ負担で不要となったバッテリを処分してもらえる。バッテリが送られてきた箱はそのまま使えるので取っておく。

不要となったバッテリの処分を急ぐ必要は特にないので、年末年始の混雑を避けて、来年の適当な時期まで待つ予定。

2017年12月27日水曜日

今年破壊したモノたち (2017年)

2017年中に主に不注意で破壊してしまったモノたち


Linear Technology LT1364CN8


OPAMP。方向を間違えてICソケットに挿入、通電 → 破損。

0.5mmピンバイス (ダイソー)


スルーホール基板に残ったハンダに穴開け作業中に折れた。セットの0.8mmは存命、使用中。

ネオンランプ ×2


電流制限抵抗なしで100VACに直結 → 破裂。

SHARP S108T02


SSR。

SSRでネオンランプ点灯を制御する実験中↑に巻き込まれ、AC側に過電流が流れた。ショートモードで故障。

Cree XP-L


パワーLED。

放熱対策のためアルミ基板の裏にはんだを盛っている最中に加熱し過ぎた。樹脂製カバーが外れ破損。

豆電球


昔ながらの豆電球。電圧を盛り過ぎて焼き切れた。

キセノンランプ


National SemiconductorのレギュレータLM338Tで実験中に、可変抵抗器の調整が狂って電圧を上げ過ぎ焼き切れた。

不注意ではなく、意図して破壊 (分解)したモノたち


コイズミ 蛍光灯


部屋の照明をLEDに変更し不要になった。別の部屋での再利用も考えたが、もう10年以上経過していたので分解。

アイリスオーヤマ ECOLUX


LED電球。

点灯しているとチラつくようになり、分解して調べてみた。


番外編 寿命を迎えたモノたち


ASUS A31N1302


Li-ion battery pack。

分解してみると、3本の18650セルが直列に繋がっており、そのうちの1本が死亡していた (起電力0V)。

OMRON BY50Sのlead battery


交換用batteryを手配中。 → 交換した cf. http://typeinf-memo.blogspot.com/2017/12/omron-by50s.html

2017年12月26日火曜日

SwissMicros DM42のfirmware update (w/ dfu-util)

update information:

* 2018-10-15: 2018-10-07にfirmware v3.11がreleaseされた。USB cable接続時にfreezeするbugが解決されたのでupgrade推奨
* 2018-03-26: 2018-03-25にfirmware v3.5がreleaseされた
* 2018-02-19: 2018-02-12にfirmware v3.3がreleaseされた
* 2018-01-07: 2018-01-05にfirmware v3.2がreleaseされた

(追記は以上)


届いたDM42のfirmwareはv3.0だったので、2017-12-26現在の最新版であるv3.1にupgradeした。

upgrade前 (v3.0)

upgrade後 (v3.1)

手順はhttps://www.swissmicros.com/dm42/doc/dm42_user_manual/#_firmware_updateに詳しく解説されているので参照のこと。

たぶん、Windowsでdm_toolを使ったfirmware upgradeは誰かがやっていると思うので、Linux (Debian)からdfu-utilを使ってやってみた。

概要

必要なもの


* SwissMicros DM42
* Linux box (w/ USB)
* USB cable (A-microB)
* 細いピン (或いは伸ばしたゼムクリップ)



手順


準備 ※一度行えば以降は不要


* Linux machineにdfu-utilをinstall (apt-get install dfu-util)
* DM42を認識するようにudevを設定 (あるいはsudoでdfu-utilを使う)

firmware update


* firmwareをdownload (DM42_flash_XX.bin)
* DM42をbootloader modeに移行
* DM42とLinux machineをUSB cableで接続 (DM42側はmicroUSB, PC側はA)
* dfu-utilsで書き込み
* DM42の背面にあるRESET buttonを細いピンのようなもので押してreset

実際のlog


USB cableでDM42 (bootloader mode)を接続した際のdmesg。

% dmesg
...
[676590.811335] usb 1-1.7: new full-speed USB device number 8 using ehci-pci
[676590.890786] usb 1-1.7: New USB device found, idVendor=0483, idProduct=df11
[676590.890789] usb 1-1.7: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[676590.890791] usb 1-1.7: Product: STM32  BOOTLOADER
[676590.890792] usb 1-1.7: Manufacturer: STMicroelectronics
[676590.890794] usb 1-1.7: SerialNumber: ************

dfu-utilで認識しているか確認。

% dfu-util -l
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Found DFU: [0483:df11] ver=2200, devnum=8, cfg=1, intf=0, path="1-1.7", alt=2, name="@OTP Memory /0x1FFF7000/01*0001Ke", serial="************"
Found DFU: [0483:df11] ver=2200, devnum=8, cfg=1, intf=0, path="1-1.7", alt=1, name="@Option Bytes  /0x1FFF7800/01*040 e/0x1FFFF800/01*040 e", serial="2069328B4834"
Found DFU: [0483:df11] ver=2200, devnum=8, cfg=1, intf=0, path="1-1.7", alt=0, name="@Internal Flash  /0x08000000/512*0002Kg", serial="************"

実際の書き込み。

% dfu-util -D DM42_flash_3.1.bin -d 0483:df11 -a "@Internal Flash  /0x08000000/512*0002Kg" -s 0x8000000
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing 
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
Downloading to address = 0x08000000, size = 865928
Download        [=========================] 100%       865928 bytes
Download done.
File downloaded successfully

蛇足: 失敗例


ちなみに、CLIで実行する場合には手順を説明したpageから (ここからではなく)のcopy'n'pasteを推奨する。著者は-s 0x8000000とすべきところを-s 0x800000と「0」を1つ少なく書いたばかりに「書き込めない」とのerrorを見る羽目になった。


% dfu-util -D DM42_flash_3.1.bin -d 0483:df11 -a "@Internal Flash  /0x08000000/512*0002Kg" -s 0x800000
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
Downloading to address = 0x00800000, size = 865928
dfu-util: Last page at 0x008d3687 is not writeable


SwissMicros DM42が届いたのでfirst impressionなど (2018-10-15更新)

*** 更新情報 ***

2018-10-15: DM42のfirmware v3.7以降には、一部個体でUSB cableを接続するとfreezeするbugがある。Affectしている場合はv3.11へのupdateで解消するので適用を検討されたい。

*** 更新情報ここまで ***


注文していたSwissMicros DM42 (往年の名機HP-42Sのclone)が届いた。


左側はDM42、右側はSwissMicros DM-15L (HP-15Cのclone)



* 寒いせいもあってかcoverから取り出すときにとてもキツかった
* key pressの感触は固め (特にENTER)
* LCDが大きくとても見やすい
* 本体の質量は176g (電池込み)で、SwissMicros DM15L (電池込み)が129gなのと比較して重い
* 黒い艶消しの塗装・表面処理がなされているAl製 (かは未確認だがおそらく金属製)筐体
* DM42が薄いこともあり、よりsolidに感じられる

User manualが公開されているので参照されたい。

cf. [DM42 User Manual](https://www.swissmicros.com/dm42/doc/dm42_user_manual/)

なお、現時点 (2017-12-26)では電池交換についていまいち分からないので、今後情報のupdateがなされるのを待ちたい (ざっくり検索してみた限りはCR2032×1のようだ)。

 cf. [SwissMicros DM42 | A collection of programmable and non-programmable calculators](http://calculators.torensma.net/index.php?page.id=16&calculator.id=724&action=detail)。

ちょっと使ってみる


よくわからなくなったときは、とりあえずEXITを押せばOK。とにかく元に画面表示に戻るまでEXITを押す。

日付と時間がズレているので修正


* □+SETUP (0)でSetup menuに入る
* 3. Settingsを△/▽で選択してENTER
* 1. Set Timeと2. Set Dateでそれぞれ時間と日付を調整できる。下に+1Y (1年足す)とか出ているのでそれらの中から適切な機能を選んで日付と時刻を合わせたらENTERを押して確定する


stack表示の調整


* XYZTL (default) → X, Y, Z, Tの4つに加えてlast answer (L)を表示する。L-registerの内容は□+LAST X (x≶y)でX-registerにcopyされる。T-registerは特殊で、ここに入った値はstackが1段下がった時にZ-registerにcopyされる

stackを用いた演算について


数値を入力すると最初にX-registerに、以下ENTERを押すごとにY → Z  → Tと順に積まれていく。1つのoperandに対する演算はX-registerに適用される (eg. √とかlogとかsinとか)。2つのoperandsに対する演算はXとYの両registersを引数とし、演算結果をX-registerに積む。このとき、Y←Z, Z←Tでregistersの内容がcopyされる。

mode設定


□+MODES (+/-)でmode設定に入る。

関数電卓ではお約束の角度単位 (DEG/RAD/GRAD)、複素数表示形式のRECT/POLARなどが調整できる。

disp設定


□+DISP (E)でdisp設定に入る。

やはり関数電卓で重要な数値の表示形式を設定する。

* FIX → 小数点以下の表示桁数を固定
* SCI → scientific notation、科学技術計算でよく出てくる指数による表示
* ENG → engineering notation、指数表示だが3ごと (SI接頭辞に対応する)表示

など。

CASIOの関数電卓とかだと確か[E↔F]みたいな名前の機能があって (手持ちのfx-JP500だとENGと←が対応?)表示を切り替えるが、HPのRPN電卓ではdisp設定から行う。

menu keyについて


* menu key (function key)はdefaultでは表示されていないが、機能そのものは
[Help][Menu][     ][Volum][RegFm][FonSz]
の順に割り当てられている。[Menu] (左から2番目)を押下して表示/非表示を切り替える
* □+CUSTOM (2)でcustom menuを表示 → □+ASSIGN (1)でよく使う機能を最大18個登録できる

よく使う関数や機能が何かは人や用途によって違うが、以下のようなものは候補になるんじゃないかと:

* IP (integer part) → 整数部分を取り出す eg. 16.22 → 16.00
* MOD (modulo) → 整数除算の余り eg. 2 MOD 7 → 2
* GAM (gamma) → Γ function (階乗の一般化)
* COMB (combination) → nCr (組み合わせ)
* PERM (permutation) → nPr (順列)

既に割り当てられていても□ (shift?)を押さないといけない機能 (πとかy^xとか)をよく使う場合には有効活用できるだろう。

その他、気になったことなど


off時の画面表示


DM42のdefaultでは電源offでも画面に何かしら表示されているがこれは正常。

確か設定で切れるはず。

なお、好きな画像を表示するようにもできる:

cf. [DM42の画面にNieR:Automataの2Bさんの画像を表示する](https://typeinf-memo.blogspot.com/2018/02/swissmicros-dm42off-imagenierautomata2b.html)

stack段数設定について


HP 50gだとstack段数は実質的に∞ (memoryの上限がlimit)だし、WP 34S (HP 10b/HP 20bのfirmware改造版)だと4段と8段を切り替えられるが、DM42 (中身のFree42)では今のところこの機能はないようだ。

programmable


programはまだ試していないので、時間を見つけていずれ。

試しにユークリッドの互除法を実装してみたので参照されたい:

cf. [SwissMicros DM42で簡単なprogramを組んでみる](https://typeinf-memo.blogspot.com/2018/03/swissmicros-dm42program.html)

firmware updateについて


DM42はfirmware updateによりbugfixや機能強化がなされる。方法については既に記事を書いているので参照されたい:

cf. [SwissMicros DM42のfirmware update](https://typeinf-memo.blogspot.com/2017/12/swissmicros-dm42firmware-update.html)

参考URL


* [SwissMicros](https://www.swissmicros.com/dm42.php)
* [HP-42S - Wikipedia](https://en.wikipedia.org/wiki/HP-42S)


2017年12月9日土曜日

shell scriptでsignal handling (w/ trap)

ちょっとしたshell scriptを書いていると、Ctrl-Cでprocessを殺した時などに適当な処理をさせたいことがある。

例えば、gpioに出力するscriptを実行中にCtrl-Cを押下すると、タイミングによってはgpioに出力しっ放しになり、後からpinを調べてgpio write $PIN 0などと手作業で始末しなければならない。これはいかにも面倒なので、Ctrl-Cによる中断 (SIGINT)が発生した際に終了処理を行わせたくなる。

この目的を達成するために、shell builtin commandであるtrapが使える。ただし、trapの仕様 (受け付けるoptionの種類や数)がshellによって異なるので注意が必要。以下、bashにおける利用例を挙げる。

使い方


singalに対する処理を指定する


trap <commands> <signals>

<commands>にはdouble quotation (")で括ってcommandの羅列が指定できる。

<signals>にはSIGINTやSIGTERMなどが指定できる。bashのtrapでは、trap -pで指定できるsignalsのlistが表示される。1つの処理に対して複数のsignalsを指定できる。

例: SIGINT (Ctrl-C)とSIGTERMが発生した時にgpio 25番 (WiringPi)に0を出力して終了する

$ trap "gpio out 25 0; exit" SIGINT SIGTERM

signalを単に無視する


<commands>に"" (空文字列)を渡す。

trap "" <signals>

例: SIGINTを無視する

$ trap "" SIGINT

signal handlingをdefaultに戻す


<commands>に"-" (hyphen)を指定する。

trap - <signals>

例: SIGINTのsiginal handlingをdefaultに戻す

$ trap - SIGINT

※bashの場合は<commands>を省略しても同じ効果。

$ trap SIGINT

注意


* shebang (shell scriptの1行目)を/bin/bashにしておくこと
* trapはshell scriptで使う場合が殆どだが、その際、なるべく早い段階で設定しておくこと → trapによるsignal handlingが設定されていない状態で主たる処理が始まってしまう。

少し考えれば当たり前なのだが、なぜか最後にtrapを指定していたscriptがあったので敢えて注意を。

補遺


shellによるtrapの動作やoptionsの違いについて。

options

* bashのtrapのみ、-lや-pといったoptionを受け付ける
* zshのtrapは何もしない
* dash (Debian defaultの/bin/sh)のtrapではerror

書式


* bashやzshのtrapは、<signals>として例えば"SIGINT"もしくはSIG抜きの省略形"INT"のような名前、或いは対応する番号 (SIGINTは2)で指定する
* dashでは、"INT" (SIG抜き)或いは番号 (2)で指定する

出典


* man bash-builtins
* man zshbuiltins
* man dash


2017年12月4日月曜日

Saka Keyという選択肢

Firefox 57 (Firefox Quantum)ではlegacy extensionsであるVimperatorや (そのalternativeであった)VimFxが押し並べて使えなくなる (cf. http://typeinf-memo.blogspot.com/2017/11/firefox-57-aka-firefox-quantum.html)。以前のentryでalternative browserであるWaterfoxについて紹介した (cf. http://typeinf-memo.blogspot.com/2017/11/keysnail-user-waterfox.html)が、最新のFxに乗り換える場合にはSaka Keyという選択肢がある。

cf. https://github.com/lusakasa/saka-key

Saka Key


Saka KeyはWebExtensions対応なのでFx 57以降も継続して利用可能だ。VimperatorやVimFxほどcustomizeの自由度はないが、差し当たってVi(m)っぽいkeybindでFxを操るには問題ない。

個人的にSaka Keyは設定が簡単 (項目数が多過ぎない、変更方法が直感的)で使いやすいと思う。

一方で、addonの画面など一部のwindowでkeyboard navigationがきかなくなる場合がある (おそらく仕様)のと、history関連にkeyを割り当てられないなどの不便な点もあるので、これから改善されていけば良いなと思った。

Extensionsやcustomizeとの付き合い方


KeySnailとかVimperatorとかがそうなのだが、徹底的にcustomizeできるようにしようと頑張れば頑張るほど、Fxの(公開されていない)深い部分に突っ込むことになり、core側で大きな変更があった場合に対応不能 (或いは全面的なrewrite)になってしまう。そうならないためには、web browserの浅い部分だけをさらっとなぞるだけにする (=WebExtensionsを使う)必要があるが、今度は痒い所に手が届かない (届きにくい)。

変化が早い時代には、好みに基いて徹底したcustomizeを施すよりも、適当な所で妥協して御仕着せのUIに合わせる方が良いのかもしれない (web browserに限らず)。表層だけならどのweb browserも似たようなものだから乗り換えも自由自在だ。

2017年12月3日日曜日

Waterfoxでkeysnailの調子が悪かったので修正した

Waterfoxをupgradeした所、KeySnailの調子が悪くなったので原因を探ってみた。

症状


* KeySnailが有効になっているのにkeybindsが反応しない
* tanything (KeySnail pluginの一つ)が反応しない
* 一部の機能は動くが"C-g" (cancel)でwindowが消えない

原因と解消法


Waterfoxの最近の更新でdefaultの設定値が変わったのが原因のようだ。

* extensions.e10sBlocksEnablingをfalse → true
* extensions.e10sMultiBlocksEnablingをfalse → true

へ変更してrestartした結果、正常動作するようになった。

発見までの道程


* "Add-ons" (about:addons)の画面を眺めていた所、multiprocessがonになっていることに気付く
* about:configでe10s関連の設定値を眺めて、怪しそうな所を取り敢えず変えてみた → うまくいった

2017年12月2日土曜日

PostgreSQL10への移行に伴うMediaWikiのupgrade

注: 2017-09-23ごろの情報なので古い (eg. PostgreSQLは10rc1ではなく10.1になっている)が、うっかり忘れていたので今更ではあるがup。



PostgreSQLをupgradeした際 (cf. http://typeinf-memo.blogspot.com/2017/09/postgresql-10.html)に、PostgreSQLをbackendとして利用しているMediaWikiのupgradeも行ったのでメモ。

環境は:

* Debian GNU/Linux (AMD64)
* MediaWiki 1.29.1
* Nginx 1.13.5-1
* PHP-FPM 7.0.22-3
* PostgreSQL 10rc1

という、主流ではない構成なので注意。大体の場合はapache2 + php module + MySQLとか、nginx + php-fpm + mariaDBとかだと思う。

MediaWiki本体のupgrade手順


* sudo service php7.0-fpm stop
* sudo service nginx stop
* cd /path/to/wiki/
* git checkout <VERSION>
* cd maintenance/
* php update.php
* sudo service nginx start
* sudo service php7.0-fpm start

※MediaWikiをgitでinstallする場合は、必要に応じてPHPのpackage managerであるcomposerのupdateを行う → composer update

外部packageのupgrade


pg_upgradeclusterを使ったdatabaseの移行に際し、必要に応じてtextsearch_jaなど外部packageのupgradeも行う

* make USE_PGXS=1
* sudo make USE_PGXS=1 install
→ これで/usr/lib/postgresql/10/textsearch_ja.so他必要filesがinstallされる

sudo -u postgres psql -f /usr/share/postgresql/10/contrib/textsearch_ja.sql wikidb
が失敗する場合は、一度uninstallを試みる
sudo -u postgres psql -f /usr/share/postgresql/10/contrib/uninstall_textsearch_ja.sql
そしてもう一度改めてinstallを試みるとうまくいく場合がある

MediaWikiでerrorが出た時見るべきlog files


* MediaWikiのlogは、LocaleSettings.phpの$wgDebugLogFile = "/path/to/the/debuglogfile";で指定する。comment outするとlog fileを作らない
* /var/log/postgresql/
* /var/log/nginx/
* /var/log/syslog
* /var/log/php7.0-fpm.log

GNU screenのvisual bellがvimやlessと干渉していた

地味に不便な不具合


Terminal emulator使いにとっては欠かせないterminal multiplexerのGNU screen (今時はtmuxとかneercsとかmtmなんだろうか)。

そんなscreenの内部でlessやvimを使っている時、fileの先頭や末尾にcursorが到達した後もうっかりkeyを押下し続けているとterminal emulator全体がしばらく固まってしまう現象に悩まされていた。硬直時間はkeyを押下していた時間 (=入力文字数)に比例して長くなるので、repeat speedを上げ、repeat delayを短かく設定している (=短時間に多くのkey repeatが発生する)環境では顕著だった。

いろいろと試してみた結果、screenが提供しているvisual bellの機能を切れば問題が発生しないと分かった。

Visual bellの切り方 (audible bellへの戻し方)


* ~/.screenrcにてvbell offの行を追加する (或いはcomment outする)。
* 起動中のscreenでは、C-a : (prefix + :)でvbell offを実行する。

Visual bellについて


音ではなく「目で見 (え)るベル」という意味合い。

pager (lessとか)やeditor (vimとか)でfileの先頭或いは末尾に達してそれ以上はscrollできない時とか、何かしらのactionをcancelした時など、eventが発生した時に音を鳴らすのではなく、かわりに画面を瞬間的に反転させたり、最上行・最下行を反転させたりする機能である。

今回の問題は以下のような機序で発生するものと推察する:

* visual bellをonにしたscreen内部でvimやlessを使っている時、fileの先頭や末尾に到達したなどの理由でvisual bellが発動すると、screenがそのための処理をする
* その最中にkey inputが継続すると、screenはbufferに蓄えられていたその一つ一つに対して馬鹿正直にvisual bellの処理を実行する
* key inputが大量だった場合、結果としてterminal emulator全体をfreezeさせてしまう
* 何れ処理が終わると復帰し、その後に入力されていたkeyに反応しはじめる

問題の原因特定に至る試行過程


* Editorやpagerを疑う → lessとvimでは発生したが、lv (Powerful Multilingual File Viewer, lessのかわりに使えるpager)やnano (editor)では発生しなかった
* Terminal emulatorを疑う → Xfce4 terminalを使っていたので、xtermなどで実験した
* screenを疑う → Xfce4 terminalでもxtermでもscreenを使っている時のみ発生したのでscreenが怪しいと思い始めた
* visual bellを疑う → 何となく「visual bellを切ったらどうなるのか」と思い試してみたら当たりだった

その他の対処法


著者の使い方ではvisual bellを切るのが最も簡単な手段だったので採用したが、他にも幾つか方法は考えられる:

* screenから乗り換える → tmuxなどでは試していないので不明
* key repeatのspeedを下げ、delayを大きくする
* lessではなくlvを使う、vimではなくnanoを使う


2017年12月1日金曜日

Shuttle SZ170R8のBIOSをupdateし、Intel MEのvulnerabilitiesに対応する

Skylake以降のIntel CPUに (明示的にdisableできない状態で)搭載されているIntel ME (Intel Management Engine)にて、remote control vulnerabilitiesが発見されて問題になっている。これがどんなものかについては以下のlinksを見てほしい:

* [Intel® Product Security Center](https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00086&languageid=en-fr)

そもそも、Intel MEとは?については以下のsiteが参考になる:

* [インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor…](https://www.slideshare.net/codeblue_jp/me-32214055)

各vendorsが対応に追われているが、11/26にShuttleも対応BIOSを公開した (cf. [Shuttle Global - SZ170R8](http://global.shuttle.com/main/productsDownload?productId=1995))ので、手持ちのSZ170R8に適用した。

手順の概要


* 起動用のUSB flash keyを作る
* SZ170R8をUSB flash keyからboot
* FreeDOSのcommand promptからflash.batを実行

以上の手順でBIOSのversionが2.07→2.08に更新される。なお、Windows usersは別途"Driver"のpageにあるChipset → ME_Intel_Z170の11.8.50.3399も適用のこと。

適用後の確認


適用後、Intelが公開している、Intel ME関連のvulnerabilityをcheckするscriptを実行して確認 (環境はDebian GNU/Linux (4.15-rc1)):

> % sudo intel_sa00086.py
> ...
> *** Intel(R) ME Information ***
> Engine: Intel(R) Management Engine
> Version: 11.8.50.3399
> SVN: 3
>
> *** Risk Assessment ***
> Based on the analysis performed by this tool: This system is not vulnerable. It has already been patched.

きちんとpatchされていると確認できた。

なお、適用前のIntel MEのversionは11.6.10.1196だった。

今後の予定


Intel MEは、主となるcomputer systemから独立した、別個の(another) computer systemであり、普段userが触れているOS (WindowsやLinux)からはそれが何をしているのか感知できない。そのような場所に今回のような外部からaccessibleなvulnerabilitiesがあり、しかもIntel MEの機能を必要としないuserが明示的にそれをdisableできないのは問題である。

そこで、Intel MEのfirmwareを無効化したBIOSの作製に挑戦してみたい。SZ170R8でBIOS記録用として用いられているWinbondのflash chipと、SOIC用のsocket adapterを注文したので、届き次第Raspberry Pi 3を使って実験する予定だ。

cf. [Neutralizing the Intel Management Engine on Librem Laptops – Purism](https://puri.sm/posts/neutralizing-intel-management-engine-on-librem-laptops/)