2018年8月5日日曜日

もうChromebookでいいなと思ったのでPixelbookを買った話

自分の求めているものがコンフィグフリーのライトウェイトなOSだということに気がついてしまったので、安定して継続的なアップデートが望めるChrome OS搭載PCの最高峰、Google Pixelbookを買うことにしました。日本や香港では売っていないので米Amazonなどを使うことになります。

Googleから直接買えば999USDなのですが、日本に直送することができません。Amazonだともう少し安くて820USDくらいからあります。eBayなどでも似たような感じ。
面白いのは、オークションでも使い込まれてボロボロというのはほとんどないことです。いわゆる“mint condition”(ほとんど使っていなく、状態は非常によい、という自己評価の表記)が多くて、要するにeBayなどで手放す人はChrome OSそのものについていけなかった人たちなんですね。

AmazonでもeBayでも、商品の代金に加えて送料や諸税が5〜60USDくらい乗るので、最終的にだいたい900USD超えるかなくらいの感じ。10万円のPCって今となっては高級品の部類だよね。

対抗馬としてのSurface Laptop

第7世代Core i5にメモリ8GBなので、実はほぼ同等スペックのSurface Laptopが+100USDくらいで買えるわけで、最後までどちらにするか悩みました。Windowsは嫌いでもBurgandyカラーは好きなんですよ。

PixelbookもSurface Laptopもパームレストの素材が特殊で汚れやすいので、最終的には(自分が)メンテのしやすいPixelbookに落ち着きました。ThinkPad Yoga 260での、コンバーチブルタイプPCにおけるChrome OSの素晴らしい体験も寄与したかな。自分が使うシーンに合致するかどうか、事前にイメージが掴めるのは大事だと思いました。

Pixelbookでは昨今Android appとLinux appが公式にサポートされ、Windows appもaltOSモードでサポートされるのではないかという噂があるので、そこにも期待値があります。Surface LaptopでOSX86するのとどっちが楽しかったかな。

買ってから届くまでのラグ

これはもう、海外からものを買う人には常識でもあると思うんですが、非常に時間がかかります。あちらの国内だけで4日、土日は何もしなくて2日、通関に何故か2日、飛行機は飛び立ったのに3日行方不明(※経由地ではスキャンされないため)、みたいな感じでどんどん日数が経過していきます。

国内に入りさえすれば、通関は基本的に24時間通るし、物流も365日動いているので、めっちゃ速いです。3日とかそれくらい。

外観とか

めっちゃ薄いですね。USB-Cになって本体を薄型化できるようになったのは本当に良かった。

ふつうの現代的なフィーチャーがひととおり揃ったパココンなので、それ以上の感想は出てこないです。モデル末期に買ってるので、外観とか語り尽くされてるしね。

USB-Cが左右に1基ずつ、それぞれに電源インジケータが準備されているのが心憎いです。とてもわかりやすい。

最初にやったこと

Dev channelに切り替えること、Developer modeに入れること、rootfs verificationをoffにすること、の3つです。これをやると、保証が失われる可能性が高いです。

Dev channelに切り替えるのは設定から、その更新が終わってから電源を完全に切って、esc-refresh-powerを同時に押して起動するとDeveloper modeに切り替える確認が出ます。
Developer modeに切り替えると、シャットダウンやリブートからの起動のたびにctrl-alt-Dを押して確認ダイアログをキャンセルしないとならなくなります。

rootfs verificationは、ctrl-alt-Tで出せるDeveloper shellから以下のようなコマンドで切ります(たぶん、ここの時点で保証が失われます)。

$ sudo /usr/libexec/debugd/helpers/dev_features_rootfs_verification

これで行けるはずですが、パーティション周りでエラーが出たら以下のコマンドでパーティションを直接指定してみるといいかもしれません。

$ sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification --partitions 4

これで再起動後 ( sudo reboot ) から、 sudo remount -o rw,remount / などが実行できるようになり、root file systemを自由にいじることが可能となります。

都合3回くらい初期化することになるので、何度もGoogleアカウントを入力することになりますが、がんばってください。

ソフトウェア的なこととか

chromebrew, そこからの nginx, php5, dropbox はいつものとおりです。
CloudReadyと比べるとFlatpakのサポートが失われていますので、『FileZilla』代わりのアプリケーションをどうするかという問題がありますが、これはAndroid/Linuxサポート (Beta)があるので、そちらでどうとでもなりそうです。Androidアプリの『FX File Explorer』(有償版)あたりを使おうかな。

Androidアプリのサポートは、CloudReadyにおけるArcWelderより実機に近くなっているので、Androidタブレットで使っているPhotoshop SketchやLightroom CCなどを入れました。

そうそう、このエントリを書いている段階のDev channelはChrome v69なのですが、外見がキモくなった!ということを声高に主張しておきたいです。なんだこのFirefoxみたいな外見。

フォントのレンダラが変わって? 日本語フォントが見づらくなったシーンがあるので、フォントを追加しました。(OS Xから持ってきた)ヒラギノフォントを例にします。まず Downloads フォルダにフォントをごそっと置きます。

$ mkdir ~/opt/
$ mkdir ~/opt/fonts/
$ cp -r ~/Downloads/Hira* ~/opt/fonts/
$ sudo mount -o rw,remount /
$ sudo ln -s ~/opt/fonts/Hira* /usr/share/fonts/notocjk/
$ sudo fc-cache -fv
$ fc-list | grep Hira

最後の fc-list に Hira* なフォントが含まれていれば成功です。あとは設定からフォントを変更すれば反映されると思います。

Android環境を使いやすくする

Androidアプリのサポートですが、フォントが小さいように感じたので調整しました。Android 設定の画面側でUSB(ADB)デバッグの設定が必要です(やり方は通常のAndroid端末と同じ)。

ちなみにこれをやるだけでもrootfs verificationを切る必要があるので、先に紹介した手順を実行していない場合はやってからどうぞ。

まず、Android端末へのSSH接続を有効化します。

$ sudo /usr/libexec/debugd/helpers/dev_features_ssh

その後、adbを接続させます。

$ adb connect 127.0.0.1:22

で、以下のようにしてみると、デフォルトのlcd_densityが 240 であることがわかります。

$ adb shell wm density
    240

ここでは 320 に変更します。

$ adb shell wm density 320

これで表示が潰れていたアプリがだいたいいい感じになったので、Chrome OS側を高解像度に設定していてAndroid側もつられて小さくなりすぎた、みたいな方はお試しください。

再起動のたびに実行しないといけないようなので、.bashrc などに以下のようなスクリプトを仕込んでおくといいんじゃないでしょうか。

    _isExistAdbLocal () {
      local LINE ADB_LOCAL=1

      while read LINE; do
        if [ ! "$LINE" = "" ] && [ `echo $LINE | awk '{print $2}'` = "device" ]; then
          DEVICE=$(echo "$LINE" | awk '{print $1}')
          if [ `echo "$DEVICE" | fgrep '127.0.0.1:22'` ]; then
            ADB_LOCAL=0
          fi
        fi
      done

      echo "$ADB_LOCAL"
      return 0
    }

    AdbLocal () {
      local rc ADB_LOCAL=1

      ADB_LOCAL=`adb devices | _isExistAdbLocal`
      if [ "$ADB_LOCAL" -ne 0 ]; then
        echo "Starting adb over SSH ..."
        sudo /usr/libexec/debugd/helpers/dev_features_ssh
        adb connect 127.0.0.1:22
        adb shell wm density 320
      fi
    }
    AdbLocal

ちょっとトリッキーな感じになっているのは、while ... do ループを回すと判定用の変数がスコープから外れる関係上です。bashなので仕方がない。解決するにはrootedにするしかなさそう。

完全に root を取る場合は、以下のスクリプトが参考になります(そのままでは動かないと思います)。

https://nolirium.blogspot.com/2016/12/android-on-chrome-os-rooting-shell.html

あと、Terminalなどから“Play ファイル”フォルダを直接いじりたい場合は /run/arc/sdcard/write/emulated/0/ をいじるといいと思います。

で、結局Linuxサポート (crostini)って何なの?

crostiniの導入方法やアプリ事例などを書いている例は見つかるのですが、これが結局何なのかを説明しているエントリを見かけていないので、書いておきます。

crostiniは仮想化技術を応用したVMコンテナです。VMとしてはDebian GNU/Linuxが走っています。VM上のLinuxへ『Terminal』アプリを介してログインし、そこでアプリ(各コンテナ)の導入やメンテナンスを行っている、ということになります。
なので、Chrome OSの設定からすぐ削除(オールクリア)できるし、またインストールすることが可能になっています。

詳しいドキュメントは、Googleの公式リポジトリに掲載されています。

https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md

Debianなので、aptがベースのパッケージマネージャとなりますので、ここからX11向けアプリを導入すると、それが検出されてコンテナを作ってくれるようになっていて、ランチャーにも登録されるのでアプリをインストールさえしてしまえば、扱いはChrome OS/Androidアプリとほとんど変わらないことになります。

まず最初に、以下はやっておいたほうがいいでしょう。

$ sudo apt-get update
$ sudo apt-get upgrade

これでパッケージ情報とすでにインストール済みのパッケージが最新になりました。あと、タイムゾーンがUTCになっているのでJSTに変更しましょう。

$ sudo dpkg-reconfigure tzdata

Asia/Tokyo を選べばOKです。

なにかアプリを入れる例として、ちょうど先ほど『Filezilla』について触れたので、入れてみましょう。

aptitude コマンドがあったほうがいいと思うので、以下のように実行します。

$ sudo apt-get install aptitude

これで aptitude コマンドが使えるようになったはずなので、以下のように。

$ sudo aptitude install filezilla

8つくらいパッケージを入れたがると思うので、[Y] でインストールを許可します。しばらく待つと完了して、Chrome OSのランチャーにFilezillaのアイコンが追加されているはずです。簡単。

aptitude search hoge で入れたいアプリ名を探してみて、あれば sudo aptitude install hoge で入れていくようなイメージでいれば、だいたい間違っていないです。

制約事項として、Androidアプリと違ってChrome OS側の Downloads フォルダ内をLinuxアプリから見ることができません。事前に『ファイル』アプリから“Linux ファイル”フォルダへコピーするなどの対応が必要となります。

なお、最終的には『ファイル』アプリから *.deb ファイルのダブルクリックで自動的にVMへのインストールが完了するようになるようで、すでにCanaryチャンネルにそのような変更が入っています。

コンソール環境の日本語化

デフォルトだとロケールが en_US なので、これを ja_JP に変更します。まず、日本語周りのパッケージを一括で導入します。

$ sudo apt -y install task-japanese locales-all

次に、ロケール設定を変更します。

$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
$ source /etc/default/locale

そのままだとX11アプリの日本語フォントがめちゃくちゃ汚いので、ついでにIPAゴシック/明朝を入れて改善します。

$ sudo apt-get install fonts-ipafont-gothic fonts-ipafont-mincho

これで日本語環境になるのですが、完全に日本語化するにはVMの再起動が必要になります。面倒な場合はPixelbookごと再起動すればよいと思います。

Chrome OSもLinuxなのに、なぜcrostiniが必要だったの?

これは、まず仮想化することで得られる、VMコンテナの強固なサンドボックスが必要だったと考えられます。

Chrome OSは、GUI (X11)の上でネイティブアプリの動作を認めていません。また、CUIにおいても強力なrootfs verificationがあり、意図的にこれを無効化していない場合は、何らかの形でシステムに改変を行ったとしてもブートプロセスの中で元に戻されます。

この状況下でネイティブアプリを例外的に認めるには、物理的にプロセスが切り離せる仮想化技術が必要であり、そのための機構としてcrostiniが開発されたのではないかと推測できます。

また、Googleは将来的に『Fuchsia』と呼ばれるGoogle製のマイクロカーネルを搭載した独自OSへの移行を宣言しており、この場合には後方互換性の観点からもAndroidやLinux/*BSD (そして既に認証が取られているWindows)との互換性を担保する必要があると考えられます。

ChromebookがFuchsiaベースになった際、スムーズな移行のためには現在から仮想化技術を応用した実装をしておく必要があります。crostiniはこのような将来性を見越した設計となっているように見受けられます。

Linuxのユーザー名が気に入らなかったりする問題 (未解決)

Googleアカウントからピリオドなどを抜いた形式になってしまうので、ケースによってはLinuxのユーザー名が気持ち悪いということがあります。

ctrl-alt-TのDeveloper shellから、以下のようにして修正できます(適宜置き換えてください)。

crosh> vmc start termina
$ run_container.sh --container_name=penguin --user=root --shell
# usermod -l new_name old_name
# groupmod -n new_group old_group
# usermod -d /home/old_name -m new_name
# vi /etc/passwd

最後の vi で、末尾の uid=1000 なユーザーの /home/old_name を /home/new_name に書き直してください。

直し終わったら、以下のようにしてテストしてみてください。

# exit
$ run_container.sh --container_name=penguin --user=new_name --shell

これで起動できればOKです。

ここまでやった問題として、ランチャーのTerminalが使えなくなるので、run_container.sh あたりを適宜調整する必要があると思います。難しい。

あと、mount コマンドを実行してみると、以下のようなsshfsが“どこかで”マウントされています。

username@penguin.termina.linux.test: on /media/fuse/crostini_****************************************_termina_penguin type fuse.sshfs

これが『ファイル』アプリに現れる“Linux ファイル”の正体ではないかと思うのですが、具体的にどこでマウントされているのかよく分かりません。現在のところ、(副産物として)ただ fuse.sshfs が使えるということが分かっただけに過ぎません。
しかし、“Linux ファイル”フォルダへ直接書き込む際は /media/fuse/crostini_****************************************_termina_penguin/ をいじればいいということが分かるので、シンボリックリンクとか作っておくといいんじゃないでしょうか。

サプライ品とか

Chromebook Penを買っていないのですが、Wacom AESテクノロジとのことなので、ThinkPad Yoga 260内蔵のThinkPad Pro Pen-2がふつうに使えました。つまり、WacomのBamboo Inkも使えることになります。
他に使えるペンとして見つけたのは、Huawei Matebookのオプション『MatePen』で、これも正しく描画できます。これが純正に最も近いような気がしたので、使っていくことにしましょう(レーザーポインタついてるけど)。

トラックパッドのフィルムは使わなくなったフィルムをサイズに合わせて切ったやつを使っていますが、画面の保護フィルムはそういうわけにも行かないので『PDA工房 ペーパーライク保護フィルム Pixelbook (液晶用)』を使いました。

よかったところ

キー配列がChrome OSに最適化されているので、ランチャーを出す・通知を出す、といった日常操作に支障がないのが良い点の筆頭だと思います。Windowsとかメーカーごとにファンクションの並びが違ってて反吐が出そうだけど、ちゃんと指針を作って自社も守るし他社にも守らせるってのはいいところですね。

これもキー関連で、タイプ音がとても静かでよいです。クリック感が強めだけど、それはたぶんこの薄い本体で打鍵感を再現するのに必要だったことだろうし、ストロークに不安な点もないので結構ちゃんと打てて感動した。あと当然だけどUS配列なのもぼくとしてはよかった点です。

バッテリーが半日くらい持つのもよいですね。残り12時間とか表示されて事実それくらい持つので、ちょっとした外出ならACアダプタがなくてもいいかもしれない。

悪かったところ

home/endキーどこいったの…… テキストエディタで結構使うと思うんだけど、ないし該当するキーバインドも存在しなそうだし戸惑ったし、今後も永遠にhome/endキーを探しそう。いつでも探しているよ。

// ctrl-launcher(◉)-Left/Right で行けるっぽい。ランチャーキー……

これまたキー関連で、一部キーにキーボードバックライトが薄いところがあって、もやっとして打ちにくいというときがあります。ファンクションの段とかね。LEDの仕込み方にもうちょっと工夫があればよかったんじゃないでしょうか。

ペンの追従性が悪いというのも、聞いてはいたものの実際に遅くて、ここはiPadやGalaxy Tabなどに追いついていないな、と感じます。また、ペンを使うアプリが現状Androidアプリ頼りなのも、この描写遅延に大きく影響していると思います。

総括

思っていた以上に出来が良くて、所有欲みたいなものを満たしてくれると思います。シンメトリックなデザインで多様なテクスチャを使用していて、触っていて心地よいというのもあります。
画面が縦に長いのも正義で、最近のトレンドである16:9な画面よりもずっと帳票やWebページの類が見やすいし、表示できる情報量も多いです。ウィンドウをたくさん展開しやすい。

OSとハードウェアが密結合しているのは昨今とても重要で、AppleのMacも、MicrosoftのSurfaceも、純正だけの使い勝手を提供していて、それと同じ土俵に立つGoogleのPixelbookなのですから、やはり非常にGoogleのサービスが使いやすいし、クラウド志向のOSなので他社のクラウドとの親和性も高いです。

AndroidアプリやLinuxアプリが動くようになっているのも使い勝手の向上に一役買っていて、これはChrome OSが基本的にWebアプリしか走らせられないことを補完してくれています。