読者です 読者をやめる 読者になる 読者になる

Ryzen上でlinuxカーネルをテストしようとしたら問題が出た(未解決)

最近Ryzenを積んだデスクトップマシンを買いました。その上でカーネルビルド&テストをしようとしたんですが、2点問題が発生しました。先代のCore i5を積んだマシンでは起きなかった現象です。

このエントリはメモがてら、随時更新していきます。落ち着いたらどこかにまとめるかも。

問題1: linux カーネルのビルドには成功するが、ビルドしたカーネルをguest上でブートしたら起動中に死ぬ(原因判明、修正待ち)

ブート時のカーネルのログはこんなかんじ。

...
[    0.227720] raid6: sse2x1   gen()  7985 MB/s
[    0.295709] raid6: sse2x1   xor()  8181 MB/s
[    0.363706] raid6: sse2x2   gen() 17531 MB/s
[    0.431699] raid6: sse2x2   xor() 11098 MB/s
[    0.499693] raid6: sse2x4   gen() 18509 MB/s
[    0.567688] raid6: sse2x4   xor() 10177 MB/s
[    0.571692] invalid opcode: 0000 [#1] SMP
[    0.572312] Modules linked in:
[    0.572822] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.11.0-rc8-ktest #1
[    0.573734] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
[    0.575040] task: ffff8f791e1c0000 task.stack: ffff9c72c00d0000
[    0.575865] RIP: 0010:raid6_avx21_gen_syndrome+0x3d/0x120
[    0.576634] RSP: 0018:ffff9c72c00d3d70 EFLAGS: 00010246
[    0.577376] RAX: 0000000000000000 RBX: ffff9c72c00d3dc0 RCX: 00000000fffedb97
[    0.578327] RDX: 0000000000000000 RSI: 0000000000001000 RDI: 0000000000000012
[    0.579283] RBP: ffff9c72c00d3da0 R08: 0000000000000000 R09: 00000000000000cd
[    0.580243] R10: 00000000fffedb86 R11: ffffffffa617008d R12: 0000000000001000
[    0.581211] R13: ffff8f791e39e000 R14: ffff8f791e39f000 R15: 0000000000000012
[    0.582163] FS:  0000000000000000(0000) GS:ffff8f791fc00000(0000) knlGS:0000000000000000
[    0.583324] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    0.584128] CR2: 0000000000000000 CR3: 000000001be09000 CR4: 00000000003006f0
[    0.585078] Call Trace:
[    0.594952]  raid6_select_algo+0x116/0x30b
[    0.595592]  ? libcrc32c_mod_init+0x2b/0x2b
[    0.596240]  do_one_initcall+0x53/0x1a0
[    0.596843]  ? parse_args+0x2cf/0x490
[    0.597421]  kernel_init_freeable+0x182/0x21c
[    0.598077]  ? rest_init+0x80/0x80
[    0.598626]  kernel_init+0xe/0x100
[    0.599175]  ret_from_fork+0x2c/0x40
[    0.599741] Code: 55 41 54 53 48 89 d3 48 8d 14 c5 00 00 00 00 41 89 ff 49 89 f4 48 83 ec 08 4c 8b 2c c3 4c 8b 74 13 08 48 89 55 d0 e8 53 ed a9 ff <c5> fd 6f 05 2b 2d 4e 00 c5 e5 ef db 4d 85 e4 48 8b 55 d0 0f 84
[    0.602215] RIP: raid6_avx21_gen_syndrome+0x3d/0x120 RSP: ffff9c72c00d3d70
[    0.603154] ---[ end trace 17ee01f86b8fc548 ]---
[    0.603850] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[    0.603850]
[    0.605276] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
...

AVX2命令の実行中に不正な命令を発行したとしてパニックしています。RyzenではAVX2命令が使えるはずだし、AMDのマニュアルを見ると仮想化環境では使えないとか書いてないように見えるし(隅から隅まで読んだわけではないので間違ってるかも)、なんかおかしい。次のようなダーティハックでとりあえずブートできるようにはなった。as-instrが何をするものなのかは知りません。

]diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 2d44933..b589097 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -162,7 +162,7 @@ asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1)
 asinstr += $(call as-instr,pshufb %xmm0$(comma)%xmm0,-DCONFIG_AS_SSSE3=1)
 asinstr += $(call as-instr,crc32l %eax$(comma)%eax,-DCONFIG_AS_CRC32=1)
 avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1)
-avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)
+#avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1)
 avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1)
 sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1)
 sha256_ni_instr :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA256_NI=1)

とりえあずは問題を整理してバグ報告しました。

LKML: Satoru Takeuchi: [BUG] x86: failed to boot a kernel on a Ryzen machine

幸いにもBorislav Petkovさん(linuxカーネルのいろんなコンポのメンテナ)からレスをいただき、彼のの環境で再現もできました。かつ、AMDRyzen Engineering Teamにも転送されたようです。

その後Masami Hiramatsuさん(kprobesのメンテナ)から、VMに見えているCPUのモデルと機能フラグの組み合わせの問題では、という指摘を受けました。

www.spinics.net

自分の環境ではlibvirtを使ってVMを管理しています。CPUのモデルはhostと同じもの(host-model)になるよう設定しているのですが、今のlibvirtではそれが実際には古いOpteron_G3に設定されます。これを、CPUのモデルをOpteron_G5にして、かつ、Ryzenがサポートしない機能(fma4, tbm, およびXOP)のフラグを落としたところ、無事上記カーネルで起動成功しました。

その後さらにPaolo Bonziniさん(KVMのメンテナかつqemu開発者)に、新しいCPUではこういうことがよくあること、およびmodeを"host-passthrough"にするように言われ、その通りにするとパニックしなくなりました。これでqemuのCPU modelにRyzen(あるいはZen)を追加してもらえれば完了なはずです。

問題2: linuxカーネルのビルド中に gcc が SEGV で死ぬ(原因不明、調査中)

/home/sat/src/elkdat/linux/block/partition-generic.c: In function 'part_alignment_offset_show':
/home/sat/src/elkdat/linux/block/partition-generic.c:103:1: internal compiler error: Segmentation fault
 }
 ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions.
/home/sat/src/elkdat/linux/scripts/Makefile.build:294: recipe for target 'block/partition-generic.o' failed
make[2]: *** [block/partition-generic.o] Error 1

この後カーネルを10回連続でビルドしたら、7回成功して3回はsegmentation faultで死にました。死んだ場所はそれぞれ全然違うところです。このため、gccに関する問題というよりも、CPUやメモリなどのハードの問題に見えます。Gentoo Forumでも類似の報告があります。

Gentoo Forums :: View topic - Segfaults during compilation on AMD Ryzen.

とりあえず自分の環境でも再現したことを同フォーラムに報告しました。が、Ubuntuの話をしたことが気にくわなかった人に怒られて、すぐに削除されました。とりあえずフォーラムの流れをROMると共に、もう少し調査します。もしかすると最新カーネルにアップデートすると直るかもしれないので、後で試してみる予定です。

オフライン状態においてWSLでemacsやsudoが起動中に固まる(解決済)

結論

WSLを使うときは次のように/etc/hostsにマシンのホスト名を書くべし。

127.0.0.1 localhost puffy         # puffyは私のwindowsマシン名

そうしないとemacs, sudoなどの、実行時にホスト名を解決しようとするソフトが固まる

問題の認識

数日前に買ったノートPCでWSLをしばらく快適に使っていたのですが、emacsが起動中に固まって動かなくなる問題がさきほど発生しました。その後sudoにも同じ問題が起きることがわかりました。つい数十分前には正しく使えており、かつ、その後Windows Updateはしていないし、設定変更もしていないので、これはおかしいです。

トラブルシューティング

最後に問題が発生していなかった時点(今朝9時ごろ)と問題発生を確認した時点(9時30分ごろ)の差分をしばらく考えてみたところ、前者はオンライン環境であり、後者はオフライン環境だったことを思い出しました。ネットワーク環境に関係あるのかを確認するために、オンラインにしてから同じ操作をすると、問題は発生しませんでした。ここで一つ「ネットワーク関係の疑いが強い」という切り分けに成功。

デバッグのためにstrace -o emacs.log emacsを実行すると、次のように/etc/resolv.confをopen(2)したり、uname(2)コマンドでホスト名を取ったりした後に発行した複数回のsenddmsg()にそれぞれ10秒前後時間がかかっていることがわかりました。

emacs.log

...
1492485708.123190 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=189, ...}) = 0
1492485708.123497 open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
1492485708.123952 fstat(3, {st_mode=S_IFREG|0644, st_size=189, ...}) = 0
1492485708.124115 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa4fe940000
1492485708.124295 read(3, "# This file was automatically ge"..., 4096) = 189
1492485708.124478 read(3, "", 4096)     = 0
1492485708.124648 close(3)              = 0
1492485708.124820 munmap(0x7fa4fe940000, 4096) = 0
1492485708.124986 uname({sys="Linux", node="puffy", ...}) = 0
1492485708.125249 socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
1492485708.125475 connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.43.1")}, 16) = 0
1492485708.125710 gettimeofday({1492485708, 125750}, NULL) = 0
1492485708.125859 poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
1492485708.126111 sendmmsg(3, {{{msg_name(0)=NULL, msg_iov(1)=[{"t\246\1\0\0\1\0\0\0\0\0\0\5puffy\0\0\1\0\1", 23}], msg_controllen=0, msg_flags=0}, 23}, {{msg_name(0)=NULL, msg_iov(1)=[{"_\200\1\0\0\1\0\0\0\0\0\0\5puffy\0\0\34\0\1", 2
3}], msg_controllen=0, msg_flags=0}, 23}}, 2, MSG_NOSIGNAL) = 2
1492485714.097840 poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout)
1492485719.099159 socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
1492485719.099929 connect(4, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "fec0:0:0:ffff::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
1492485719.100742 gettimeofday({1492485719, 100932}, NULL) = 0
1492485719.101843 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}])
1492485719.103170 sendmmsg(4, {{{msg_name(0)=NULL, msg_iov(1)=[{"t\246\1\0\0\1\0\0\0\0\0\0\5puffy\0\0\1\0\1", 23}], msg_controllen=0, msg_flags=0}, 23}, {{msg_name(0)=NULL, msg_iov(1)=[{"_\200\1\0\0\1\0\0\0\0\0\0\5puffy\0\0\34\0\1", 2
3}], msg_controllen=0, msg_flags=0}, 23}}, 2, MSG_NOSIGNAL) = 2
1492485731.096900 poll([{fd=4, events=POLLIN}], 1, 3000) = 0 (Timeout)
1492485734.098345 socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 5
1492485734.099193 connect(5, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "fec0:0:0:ffff::2", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
1492485734.099969 gettimeofday({1492485734, 100273}, NULL) = 0
1492485734.101202 poll([{fd=5, events=POLLOUT}], 1, 0) = 1 ([{fd=5, revents=POLLOUT}])
1492485734.102447 sendmmsg(5, {{{msg_name(0)=NULL, msg_iov(1)=[{"t\246\1\0\0\1\0\0\0\0\0\0\5puffy\0\0\1\0\1", 23}], msg_controllen=0, msg_flags=0}, 23}, {{msg_name(0)=NULL, msg_iov(1)=[{"_\200\1\0\0\1\0\0\0\0\0\0\5puffy\0\0\34\0\1", 2
3}], msg_controllen=0, msg_flags=0}, 23}}, 2, MSG_NOSIGNAL) = 2
1492485746.097900 --- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
1492485746.098406 rt_sigaction(SIGINT, {SIG_DFL, [INT], SA_RESTORER|SA_RESTART, 0x7fa4fc946cb0}, {0x4a6200, ~[RTMIN RT_1], SA_RESTORER, 0x7fa4fd000330}, 8) = 0
1492485746.099849 getpgrp()             = 139
1492485746.100944 ioctl(0, TIOCGPGRP, [139]) = 0
1492485746.102129 rt_sigprocmask(SIG_BLOCK, [WINCH IO], NULL, 8) = 0
1492485746.103238 rt_sigaction(SIGIO, {SIG_IGN, [IO], SA_RESTORER|SA_RESTART, 0x7fa4fc946cb0}, {SIG_DFL, [], SA_RESTORER, 0x7f161b466cb0}, 8) = 0
1492485746.104837 exit_group(2)         = ?
1492485746.105671 +++ exited with 2 +++

resolv.confの読み出しもuname(2)の発行もホスト名に関するものであり、かつ、sendmmsg()によって送信したメッセージの中にもホスト名を示す文字列(“puffy”)が入っていたので、問題はホスト名の解決に関するものかなと推測しました。

hostnameコマンドは一瞬で"puffy"を返すので問題ないとして、/etc/hostsはどうなっているかを見ると、127.0.0.1puffyは結び付けられていませんでした。

/etc/hosts

...
127.0.0.1 localhost
...

これを次のように変更したらオフラインでもうまく動くようになりました。

/etc/hosts

...
127.0.0.1 localhost puffy
...

Windows 10 Creators Updateを適用したらmoshが動くようになった

2, 3日前にWSL上でmoshを動かしたところ、ログインした瞬間にプロセスが終了してしまうという問題が発生しました。ぐぐったところ、既知の問題でした。

github.com

上記Issueを追ってみると、Creators Updateを適用すると直るとのことなので早速適用してみると、うまく動きました。やったぜ。

Windows UpdateによってSIMの通信規制された&対策をとった

最近、数年ぶりにWindows PCを買いました。モバイルノートなので、どれくらいバッテリが持つものなのかを試すために、外出先でテザリングによって通信しながらバッテリが切れるまで作業しました。すると、ある時点から通信が極端に遅くなってしまいました。なぜかと思ってスマホの通信量を確認すると、案の定、一日あたりの通信規制にひっかかる通信量を超えていました。あーあ。

きっとWindows Updateの自動ダウンロードの仕業だろうと思って、Windows Updateの設定から自動ダウンロードを無効化しようとするも、そういう設定はありませんでした。但し書きを見たところ、

利用可能な更新プログラムが自動的にダウンロードされ、インストールされます。従量制課金接続(料金が発生する場合があります)では実行されません。

と書いてありましたが、どうやって従量制課金接続かどうかを判定しているのかは不明でした。

調べた結果、wifiの設定の中でアクセスポイントごとに従量制課金接続かどうかを設定できるようです。具体的には次の設定項目です。

設定 → ネットワークとインターネット → wifi → <AP名> → 従量課金制接続として設定する

これを設定したら通信量の急激な増加が収まったので、おそらくWindows Updateが原因という仮説も正しかったのでしょう。

さくらVPSから無期限無料で使えるGCEインスタンスへ乗り換えた

私は、さくらVPS(1GBプラン)を数年間使ってきました。昔はこのサーバを多種多様な用途に使っていたのですが、最近では一部を除くほとんどの機能は無料で使える、他者が提供するwebサービス(github, qiita, はてなブログなど)に移行してしまいました。

現在の用途は次の通りです。

  • 公開webサイト(ほぼ静的コンテンツ)の提供。アクセス数は一日に数百程度と、非常に少ない
  • 自宅の計算能力の高いマシンのインターネット側IPアドレス(非固定)の記録: インターネットから自宅マシンに接続するために必要。
  • ホームティレクトリ以外のシステム領域の変更も含めた種々の実験。動作確認程度なのでCPU性能は必要ない

用途がこれだけになったことによって、元々それほど性能が高くない上記VPSであっても、要求スペックに対する価格が若干上回ってしまっていました。そのため、次のような要求仕様のマシンをしばらく探していました。

  • 1サーバを専有できる
  • 静的IPアドレス
  • CPU性能はほとんど必要ない
  • メモリはUbuntuの要求仕様の最低である512MBもあれば十分
  • ストレージは20GB程度あればOK。HDDかSSDかは問わない
  • 現在のVPS(年間一万円強)より安価

その最中、無期限無償で使えるGCEインスタンスの存在を知りました。このインスタンスについては過去に以下のエントリで触れました。

satoru-takeuchi.hatenablog.com

このインスタンスはCPUとメモリのスペックが非常に低いのですが*1、ここ最近色々と評価した結果、私の用途では一応要件を満たすことを確認しました。VMインスタンス以外にも通信料と固定IPアドレスに関して課金要素がありますが、通信料については枠内に収まりそうですし、静的IPアドレスについては、マシンの電源を落とさなければ課金されない、かつ、落とすつもりはないので問題ありません。

本日移行したところ、移行そのものはあっさり終わって(待ち時間を含めて4,5時間)、いまのところ問題なく動いています。元々は、「今のところより安いものがあればいいな」程度に思っていましたが、まさか無料になってしまうとは思いませんでした。これだけのものが無料で使えるというのは凄いと共に、恐ろしいものです。今後はサービス規約の変更が無いかを注意深く観察しながら、しばらく使ってみようと思います。

*1:linuxなどの大きなプロジェクトのgitリポジトリの操作やビルドなどは非常に辛い…というか無理です

sshを使ってリモートマシンでコマンドを叩く際の注意点

知ってる人には当たり前なのかもしれないですが、自分用のメモです。

先に結論を書くと次の通り。

  • sshでリモートマシンにログインするのではなく<ssh command>によってコマンドを叩く場合には、ttyが割り当てられない。sshに-tオプションを付与すると、端末を無理矢理割り当てられる
  • cronなどのttyが割り当てられていない環境からは-tオプションだけでは不十分で、-ttオプションが必要

事の経緯は、固定IPアドレスが無い自宅マシン(回線はフレッツ光)にインターネットからアクセスしたいというものでした。DDNSを使うんではなく、固定IPを持っている自前VPSと"who am i"を使えば、簡単になんとかできるだろ、と思ったのが運の尽き。どハマリしました。

最初に思い描いたサービスは次の通りです。

  • 自宅マシンからVPSsshで定期的に接続して、IPアドレスを所定のファイルに書き込む。ssh接続時はパスフレーズ無しの鍵を使う。接続時に使うユーザは、上記作業以外をする以外の権限を持たない特別なものを使う
  • 自宅マシンのIPアドレスは、"who am i"の出力(例: “sat pts/8 2017-04-11 22:19 (xxx.xxx.xxx.xxx)”)の第5フィールドを整形する
  • インターネットから自宅マシンに接続する前に、VPSに自宅マシンのIPアドレスを問い合わせる。もちろんIPアドレスの問い合わせとsshによる接続は1つにまとめてスクリプト化する

うまくいかなかったのは自宅マシンのIPアドレスを取得するところです。取得したIPアドレスを書き込んでいるはずのファイルが空になっていました。問題切り分けのために、インターネット上からsshで自宅マシンに一旦ログインして、そこからIPアドレス取得コマンドを実行するとうまくいきました。

色々とぐぐった結果、sshからログインでなく直接コマンドを叩くときは、ttyが割り当てられないことがわかりました。ttyが無いとwhoコマンドの出力の元ネタであるutmpファイルにログが残りませんので、IPアドレス取得コマンド内のsshの出力も空になった、それに伴ってコマンド全体の出力も空になってしまったというわけです。回避策は、以下の通りsshに-tオプションを付けることです。

man(1) sshより抜粋:

-t Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.

まずはインターネット上からcrontabに書いたコマンドを実行すると、正しくIPアドレスが得られました。これで解決したと思ってcrontab上のsshに-tオプションを付与したものの、またしてもIPアドレスを書き込んでいるはずのファイルは空でした。

man(1) sshを再度読んでみると、さきほど抜粋した-tオプションの説明には続きがありました。

-t Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.

cronなどのttyを持たないプロセス(daemon)からsshを実行する場合は、-tオプションだけでは不十分で、-ttオプションが必要と書いてあります。crontab上のsshに-ttオプションを付与したところ、無事問題は解決できました。最初からmanをちゃんと読んでおけばもう少し解決が楽でした。反省。

追記。優しい人に、IPアドレスを知る目的であれば$SSH_CLIENTないし$SSH_CONNECTIONが使えるということを教えていただきました。なんてこった

ノートPCを買い替えました

今使っているMacBook Air (13-inch, Mid 2012)のバッテリが劣化してきたので、新しいマシンを買いました。

HP EliteBook Folio G1/CT Notebook PC

あまりカスタマイズはしていませんが、ストレージだけは256GBに増量しました。SSDSATA接続のものにするかNVMe接続のものにするかで少し悩んだのですが、後述の通り性能よりも駆動時間重視だったので、消費電力がSATAのものに比べて高くなると考えられるNVMe接続のものは避けました。ストレージをわざわざ増量したのは、増量することによって税引き価格が10万円を超えるのと、税引き価格が10万円を超えると7%offになるクーポンがあったからです(別サイト)。結果、5000円くらいの追加でSSDを128GB追加できました。まんまと売り手の思惑にハマってます。

もともと探していたマシンの要求仕様は次の通りです。一言で言えば性能はどうでもよくて、高性能なマシンに接続して繋ぐシンクラっぽい使い方を想定していました。

  • ディスプレイの解像度はfull HDなら嬉しいけど1280x800あれば十分
  • CPU性能にはこだわらない。Chromessh(mosh)クライアントがさくさく使えればそれでいい。前者についてはタブはあんまり開かないし、重い動画を見たりはしない
  • ストレージ容量は購入後のアップデートに支障が無い程度(最悪32GBでもアリ?)でよい。その他のデータは上述の理由により手元に置いておかなくてもよい
  • サイズは10インチ以上、13インチ以下
  • 重量は1.2kg以下、できれば1kgを切って欲しい
  • キーボードはプログラミングに支障を来さない程度に。変な配置になっていなければ各キーのサイズは若干小さくてもよい
  • バッテリ駆動時間は最低8時間、できれば10時間以上
  • OSにこだわりは無い
  • 価格は5万円前後が嬉しい。出しても10万円くらいまで

これらを考慮した結果、次のような候補が挙がっていました

  1. ASUS TransBook Mini R106HA-GR053T
  2. ASUS Vivobook E200HA
  3. Lenovo ideapad MIIX 310

これらのうち、とくにaかcがいいかなと思っていました。バッテリ寿命はどちらも申し分なく、さらにaについてはとにかく軽いこと、cについては価格とディスプレイ解像度が高いことが魅力でした。ただしcについては、cの実機を触ったところ、キー配置が微妙であり、かつ、比較的近い使い方をしていると考えられる(プログラミング)実際のユーザのかたからも同じことを伺ったので、見送りました。

「さあaで決まりか」というときに、上述のideapadのユーザのかたに、上述のHPのマシンを教えていただきました(余談ですが、なぜかこれらの2つのマシン以外にも複数のマシンを同時に持ち歩いておられるとか…)。このマシンは価格帯はa, b, cよりもだいぶ上ですが、同一価格帯の他のマシンに比べてのコストパフォーマンスがぶっちぎりだったので、一目惚れで買ってしまいました。同じかたから、実機を触らなければ本来わからないキーボード配置についても不満無しという感想を得られたことも購入を後押ししました。

結局、性能はどうでいいというようなことを言いながら、そこそこの性能のものを買ってしまいましたが、「たまの散財はいいものだ」と自分を納得させることにしました。