Wedge Mobile Keyboardの電源接触不良の修理

店でさわってみて、キータッチがよさげで気になっていたMSのWedge Mobile Keyboardが某フリマに出ていた。
電源入らなくなったということでゼロ円。
先日まで使えていたということで、BTキーボードゆえ特に劣化するようなパーツもない構造と推測、修理可能ではないかと判断する。
さっそく依頼。
送料380円で東京から送ってもらった。
実際には、500円かかってたけど差額はいらないって。どうもありがとうw
電池交換したら使えなくなったということで、電池ボックス付近の接触不良という見立て。


単4電池を2本入れてみる。
なんか、電池ボックスのロックがガバガバなんだけど...
ロックしても、少し突出しているような。原因はこれっぽい。
電源はFn+ESCという変な組み合わせ。押しても反応しない。
電源状態は数字の7の下あたりにあるLEDでわかるのだけど、これが点灯しない。
通常はどこかに照度センサーがあって、カバー外したら電源入る仕様のようだ。
つまり、暗いところでは使えない?
照度センサーにゴミでも付いたという可能性もある。


分解は難しい筐体だ。
ネジ類は表面には見当たらない。
キートップは外れない。キーを壊したら使えないので無理はしない。
電池と回路が内蔵されていると思われるスタンド部のラバータッチのカバーも外れない。
BTボタン側もすぐには外れない感じ。
可動部のある電池ボックス側からアプローチする。
電池ボックスのレールからスライド部が外れた。
特に破損している部品はなさそう。
ロック機構にはまる突出部がある。
端子が少しへこんだところに付いている。
本体側はスプリングが出ていて、そこに端子が接触するようだ。
電池ボックスのレールやロックにガタがきやすく、そこから接触不良になる構造だった。
接点のスプリングも短い。
これ以上の分解は破壊なしには困難な感じ。
使えることが前提なので破壊は避ける。
接点を調整すると、普通に電源が入り、BTボタンの長押しでペアリングして使えるようになった。


全体にあんまり設計よくない感じ。
キーの隙間にはゴミが入りやすいし、キートップが外しにくく、掃除も困難。
打ち心地は悪く無い。
BSボタンが小さいので自分で使うにはイマイチか。
英語配列ならよかったのに日本語配列なのが残念だ。
中央で曲げてスタンドにもなるラバー加工のカバーが重い。
セットすると持ち歩く気をなくす重さ。たぶん、中にズズかなんかの合金のプレートが入っているのじゃなかろうか。
重くないと、タブレットを保持できないという設計なんだろうけど、持ち歩きでこれは致命的。
カバーの装着もスライドさせるのははめにくいし、外しにくい。上からかぶせたり、そのまま無理やり取ったりするのもなんかダメな感じ。
カバーは自作で代替品を3Dプリントしたらよくなるんじゃないだろうか。

SparkFun Pi Zero USB Stem

https://www.sparkfun.com/products/14526
KIT-14526 $5.95
PiZeroをUSBドングルにするキット。

他でもやっていないか調べてみた。
youtubeにこんな動画が見つかった。

Raspberry Pi Zero usb Dongle Project - YouTube
https://www.youtube.com/watch?v=wUNPiCfCUzI

2016年からやってる人がいるのか。
SparkFunのは、このネタのキット化?

ガジェットドライバ使ってストレージとしてマウントしているのかと思ったら、USB-Ether経由だった。
Ether経由なので、リモート接続で画面出せるのがいいね。

しかし、ドングルにする必然性についてはよくわからないw

node.jsで自分に割あたったIPアドレスを調べる

自分メモ。
WAN側から見えるアドレスと自鯖にふられたアドレスが異なる環境のインスタンスがあって、stunモジュール使ってアドレス調べてたのだけど、モジュールが1.0系に上がったら、前に書いたのがエラーになる変更が入っていた。

もう、そういう苦労はしなくてよさげの環境になったので、インターフェイスに振られたアドレスを調べる方法に置き換えることに。

osモジュールとか使って、長々と書くとできるのはわかっているんだけど、あんまり長く書きたくない。

$ npm i ip
+ ip@1.1.5
added 1 package in 1.626s

$ cat ip.js
var ip = require("ip");
console.dir ( ip.address() );

$ node ip.js
'xxx.xxx.xxx.xxx'

NICが複数ある環境でもないので、これでいいや。
stunで使ってた関数を捨てて、こちらに置き換えた。すっきり。

技術書典3に薄い本出しました

いままで技術書典には開催趣旨に反して本は出さない感じで、VRゴーグルとかストローで組み立てるC60キットとかやってきました。
が、なんか一日ちょっとでネタができて、あんまりWebに書けるようなネタでもなかったので、薄い本にしてみることにしました。


印刷屋に出すにはコスパがよくなかったし、おそらく頒布に参加してくれるような人はゼロ人というニッチネタでしたので部数も少ないため、自家製本にしました。急に思い立って時間もなかったということもあります。
事務局に発禁措置をくらいかねない内容であったりしたので、全損になってもダメージ少なめにという狙いもあります。

アプリ

使ったアプリはPages。
それもOSの都合なんかで、だいぶバージョンの古いものです。
前に、イベント用にCardboardアプリを作る薄い本を配布したことがあるので、A5での書式のテンプレートは作ってありました。その時は、ただのホッチキス綴じだったのであんまり工夫はないのですが、そのまま使用。
miで書いた中身を流し込んでレイアウトするだけです。ページ数も少ないので目次もなし。

用紙

用紙は、いくつか試した上で、白がきれいで厚みがある程度あるTOUHOKUのコピー用紙を使ったのですが、黒文字で両面刷ると透けが気になります。前回は印刷コストが安かったので、文字はグレイにして透けを防止したのですが、今回はプリンタの変更で印刷コストが高くなってしまったので透過率を変えることで色を落としました。しかし、白黒を選択してプリントしても、いろんな色を使って印刷しているようで、思わぬ色のインクが減って、夜中にスーパーにインクカートリッジを買いに走ることになりました。
あとは、今のプリンタは、この用紙だと紙送りで二枚出てくることがあって、チェックが全数で泣けてきました。事前に空気吹き込んでやっても結果に変わりはありませんでした。

印刷

古いPagesには、ページ番号を表示しないページを作る機能はないので、作ったデータを2つに分けて、ページ番号の入る本文とそれ以外分割にしました。
プリンタには両面印刷の機能はないので、部数を決めて手差しで両面印刷しました。
部数の決定は、ビニ本にしようと思っていたので、ラッピング用の糊付き透明フィルム封筒のロットの倍数に合わせました。

綴じ

表側の見返し用紙にはステープラーの針の位置を三ヶ所印刷しておきました。
ステープラーの針は、普通のものだとあとで錆びてくるので、ステンレス製の針を使いました。普通のものより硬さもあるので貫通力が強いです。
ステープラーは、30年くらいまえに自営の時に買ったフラットクリンチの初代のものを使っています。樹脂は変色していますが、今でも普通に使えます。

表紙

さて、表紙が問題です。プリンタを変更したので、A4までしか印刷できません。リーガルサイズが、A4よりわずかに大きく、ギリギリでA5二面と厚さの印刷面をカバーできそうだったので、これで行くことにしました。
在庫の100均の色画用紙があったので、全数同じ色にはならないのですが、それもいいかということで、これを使うことに決めました。
サイズ的にはそのままプリンタに入らないので、リーカルの短辺に合わせてカット。
一枚ずつ手差しで印刷しました。

筋つけ

表紙の筋つけですが、以前は手芸用のヘラでやったのですが、行方不明なので100均で手芸用のヘラを買ってきました。しかし使ってみると、2枚ほどで磨り減ってエッジがなくなってしまいます。さすが100均クオリティ。
千枚通しでは画用紙相手には強すぎて切れてしまうので、以前ノベルティでもらったペーパーナイフ兼定規の三角形の金属のものをエッジをやや潰して使いました。
印刷時に薄い下線を入れてあったのですが、グレイにしたので見にくく作業効率はイマイチでした。

合わせ

ステープラーでとめた本文と表紙の接着は、お手軽に両面テープにしました。一応、速乾の木工用ボンドも買ってありましたが、乾燥に時間がかかるので、ギリギリのスケジュールに向かないので使いませんでした。
100均で一番細いものが1リールでだいぶ余りました。

化粧断ち

化粧断ちは、スチール定規とカッターマット、アートナイフで手でやりました。
手持ちのカール事務器の裁断用のカッターは、10枚までしか対応していないので、今回は使用を断念しました。下押さえマットの消耗品がだいぶ弱くなっていて、薄いものはきれいにカットできないという点も見送り理由です。
手作業になったので、仕上がりにはややむらがあります。


100部程度であれば、手作業でも十分に買ってもらえる本が作れると思います。
技術書典後に、50枚が切れる裁断機を新調したので、次回からはこれが活躍してくれると思います。
もし、次回があれば、筋つけをもっとスピードアップできる治具を作りたいと思います。

専用のユーザー作らなくても素直にsshしたらシリアル出るようにしたい(失敗)

そういえば、昔、こんなの書いたな。
Ubuntuでminicom起動すると/dev/ttyUSB0のパーミッションがないと言われる
http://d.hatena.ne.jp/kinneko/20140118/p2


Rasbianではどうなっているかというと、こんな感じ。

pi@raspberrypi:~ $ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 Sep 6 04:00 /dev/ttyUSB0

pi@raspberrypi:~ $ grep dialout /etc/group
dialout:x:20:pi

piユーザーはdialoutグループに入っているので、ttyUSB0は使える。
Debian系は楽だな。
グループがdialoutというのが前時代の遺産な感じだけど。


というわけで、sshごしに直接起動できるハズ。

MacBook:~ kinneko$ ssh pi@192.168.2.124 "minicom"
pi@192.168.2.124's password:
No cursor motion capability (cm)

できません。


rootなら?

MacBook:~ kinneko$ ssh pi@192.168.2.124 "sudo minicom"
pi@192.168.2.124's password:
No termcap entry for unknown

できません。
termcap書くとか、ほんと前時代だ。


cmエラーは、端末の設定がないから。
とりあえず、vt100にしてみる。

MacBook:~ kinneko$ ssh pi@192.168.2.124 "export TERM=vt100 && minicom -D /dev/ttyUSB0"

minicomで入れますが、Ctr+コマンドが通りません。
Ctr+Zでssh切れちゃうし。
minicomの終了もできないので、セッションの正常な終わり方ができずに、Raspi側にプロセスが残ってしまう。
これでは使えない。
エスケープシーケンスもおかしいようで、kernelの起動メッセージとか一行で繰り返してしまう。
これでは使えない。
vt102にしてみたが同じ。
xtermではどうかな。同じ。


cuは?

MacBook:~ kinneko$ ssh pi@192.168.2.124 "cu -l /dev/ttyUSB0 -s 115200"
pi@192.168.2.124's password:
bash: cu: command not found

うぐぐ。

pi@raspberrypi:~ $ sudo apt-get install cu

再度。

MacBook:~ kinneko$ ssh pi@192.168.2.124 "cu -l /dev/ttyUSB0 -s 115200"
pi@192.168.2.124's password:
cu: Stale lock /var/lock/LCK..ttyUSB0 held by process 1366 created 2017-09-06 05:02:02


Debian GNU/Linux 7 beaglebone ttyO0

これは普通にできるな。
ただ、打ったのがエコーバックしてきちゃう。
~.(チルダ ピリオド)で終了できないな。
Raspi上での実行は終了含めてうまくいく。

pi@raspberrypi:~ $ cu -l /dev/ttyUSB0 -s 115200
Connected.

Debian GNU/Linux 7 beaglebone ttyO0

default username:password is [debian:temppwd]

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

The IP Address for usb0 is: 192.168.7.2
beaglebone login: Connection to 192.168.2.124 closed.


こんなことに時間使っている暇がないので、タイムアップ。

Mac OSXでFTDIのドライバが刺さって強制再起動になるのでRaspiでシリアルサーバーを作った

Mac OSXでスイッチサイエンスのUSB-TTL変換を使っていると、抜いたタイミングでドライバが刺さって、OSXが強制再起動してしまうことがある。
何かと面倒くさいし心が折れるので、遊んでいるRaspiでシリアルサーバーを作ることにした。
特に難しいことはない。ether経由でログインして、USBシリアルを有効にして、minicom使うだけ。
RaspiのSDカードをインストールし直すのも面倒くさいので、raspbianは入ってたjessieのまま使う。

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install minicom lrzsz

USBシリアルを刺す。

[  415.459959] usb 1-1.2: new full-speed USB device number 4 using dwc_otg
[  415.617059] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6001
[  415.617080] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  415.617091] usb 1-1.2: Product: FT232R USB UART
[  415.617101] usb 1-1.2: Manufacturer: FTDI
[  415.617112] usb 1-1.2: SerialNumber: A702IZ5W
[  416.734320] usbcore: registered new interface driver usbserial
[  416.734465] usbcore: registered new interface driver usbserial_generic
[  416.734629] usbserial: USB Serial support registered for generic
[  416.749000] usbcore: registered new interface driver ftdi_sio
[  416.749157] usbserial: USB Serial support registered for FTDI USB Serial Device
[  416.749672] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[  416.784749] usb 1-1.2: Detected FT232RL
[  416.786093] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0

バイス名は、普通にttyUSB0か。

pi@raspberrypi:~ $ sudo minicom -s

+-----[configuration]------+
| Filenames and paths |
| File transfer protocols |
| Serial port setup |
| Modem and dialing |
| Screen and keyboard |
| Save setup as dfl |
| Save setup as.. |
| Exit |
| Exit from Minicom |
+--------------------------+

Serial port setupを選んでAキーを押し、デバイス名を変更する。

A - Serial Device : /dev/ttyUSB0

Save setup as dflで設定を変更して、Exit from Minicomで一旦終了。
BBBにTTL側を接続して、minicomを起動する。

pi@raspberrypi:~ $ sudo minicom

Debian GNU/Linux 7 beaglebone ttyO0

default username:password is [debian:temppwd]

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

The IP Address for usb0 is: 192.168.7.2
beaglebone login:

よし来た。
これで、強制再起動に怯えずに作業できるわー。
お手軽さはだいぶ下がるけどね。


このRaspiは他の用途にも使っているので、sshログインですぐにシリアル出るような設定にはしない。
ほんとは、アカウント別に作ってログインシェルをターミナルアプリにしたほうがシリアルサーバーっぽくて楽かな?


minicomじゃなくてscreenを使うと、面倒くさくはないんだけど動的にボーレートの変更できないのがイマイチ。

smartctlを実行するとエラーが出るドライブをseatoolしてみる

Error 9358 occurred at disk power-on lifetime: 21915 hours (913 days + 3 hours)
When the command that caused the error occurred, the device was active or idle.

ドライブはこれ。

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda 7200.14 (AF)
Device Model: ST1000DM003-9YN162
Serial Number: S1D212JR
LU WWN Device Id: 5 000c50 04b59ca33
Firmware Version: CC82
User Capacity: 1,000,204,886,016 bytes [1.00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is: Fri Jul 21 10:27:34 2017 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

しかし、普通に書く分には問題なく動いている様子。全面ddは普通に通る。

root@ubuntu:~# dd if=/dev/zero of=/dev/sdb bs=100M status=progress
1000131788800 bytes (1.0 TB, 931 GiB) copied, 9616.44 s, 104 MB/s
dd: error writing '/dev/sdb': No space left on device
9539+0 records in
9538+0 records out
1000204886016 bytes (1.0 TB, 932 GiB) copied, 9618.34 s, 104 MB/s

もっとも、これでは使う気にはなれないんだけど。

1 Raw_Read_Error_Rate 0x000f 087 070 006 Pre-fail Always - 86951457
5 Reallocated_Sector_Ct 0x0033 083 083 036 Pre-fail Always - 22576
7 Seek_Error_Rate 0x000f 077 060 030 Pre-fail Always - 8695524939

Seagateって、Raw_Read_Error_Rateは買ったばかりでもこんな感じのようで、あんまり気にしないでいいのかも。ただ、Seek_Error_Rateは桁が異常な感じ。


seatoolを落としてくる。

root@ubuntu:~# wget http://www.seagate.com/files/www-content/support-content/downloads/seatools/_shared/downloads/seatools_cli.tar
root@ubuntu:~# tar xvf seatools_cli.tar
st
sthelp.txt

sthelpを見ると、2001年のツールのようだ。動くのかしらん。

root@ubuntu:~# ls -l st
-rwxr-xr-x 1 root root 180149 Sep 12 2001 st
root@ubuntu:~# ./st
-su: ./st: No such file or directory

動かないわ。

root@ubuntu:~# file st
st: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

あらら。

root@ubuntu:~# apt-get install libc6-i386


接続ドライブのリストを取得。

root@ubuntu:~# ./st -l
GetSGVersions - open error: No such file or directory

Drive information:

/dev/sg0 ATA ST3500418AS CC44 976773167 blocks
/dev/sg1 ATA ST1000DM003-9YN1 CC82 1953525167 blocks


ターゲットの情報を取得。

root@ubuntu:~# ./st -i /dev/sg1
/dev/sg1
Vendor = ATA
Product = ST1000DM003-9YN1
Version = CC82
Serial Number =
Copyright =
SCSI Firmware =
Servo RAM Release =
Servo ROM Release =
Servo RAM Date =
Servo ROM Date =

Blocksize = 512, Highblock = 1953525167, Capacity = 976763 MB
-this is a Seagate drive
-this drive does not support DST
-Mode Page Settings [current value (default)]:
-WCE bit = 1 (1)
-RCD bit = 0 (0)
-AWRE bit = 1 (1)
-ARRE bit = 0 (0)
-DExcpt bit = 0 (0)
-Number of cache segments = 0 (0)
-JIT bit 0 = 0 (0)
-JIT bit 1 = 0 (0)
-JIT bit 2 = 0 (0)
-JIT bit 3 = 0 (0)

なんも取れてないなぁ...


ショートテストはパスしちゃう。

root@ubuntu:~# ./st -t 100 /dev/sg1
Drive /dev/sg1 does not support DST - generic short test will be run
Starting 100 % Generic Short Test on drive /dev/sg1 (^C will abort test)
-Starting 30 second sequential reads from block 0 on drive /dev/sg1
-Starting 30 second sequential reads to end of disk on drive /dev/sg1
-Starting 30 second random reads on drive /dev/sg1
-Starting 30 second random seeks on drive /dev/sg1
Generic Short Test PASSED on drive /dev/sg1

ロングテストではエラー。

root@ubuntu:~# ./st -T 100 /dev/sg1
Drive /dev/sg1 does not support DST - generic long test will be run
Starting generic long (full sequential verify) test (1953525167 blocks) on drive /dev/sg1 (^C will abort test)
VERIFY failed on block 20602368 Sense data = 21/00/00
TEST FAILED at block -144986080 on drive /dev/sg1

というわけでゴミ箱行き。


SeagateもWDもRMAが国内発送先になてったので、便利な時代だと思いました。
memo: https://support.wdc.com/warranty/warrantystatus.aspx?lang=jp