豪鬼メモ

一瞬千撃

Dell XPS 13 9370購入とデュアルブート環境の構築

ラップトップPCを買ってWindowsLinuxデュアルブート環境を構築するまでのメモ。
f:id:fridaynight:20181228173050j:plain


普段はMacbook Proを使っているが、プログラミングはやはりLinux上でやりたくなることが多い。今までは自分のレンタルサーバVPS)にsshで入ってゴニョゴニョしていたのだが、やはり性能に不満が出てくる。ビルドも実行も遅いし、画像処理をよくやるのでメモリもディスクも不足しがちだ。CPUが仮想3コアでメモリが2GBでHDDが200GBとかいう廉価VPSよりは、近頃のラップトップPCの方が遥かに高性能なので、できればローカルで作業を完結させたい。それに、ネットに繋がっていないと作業できないというのは、生産性がよくない。テザリングすればいつでもネットに繋げられるのだが、それを敢えてしない方が生産性が高いことが多い。

ということで、Linuxが動くラップトップPCを入手しようということになった。MacbookLinuxを入れるという選択肢も考えられるが、会社から借りているMacbookはいじれないし、自分のMacbookは妻が主に使っていてディスク容量も足りないので断念。コスパの良さげなWindows PCを買ってLinuxとのデュアルブートにすることにした。Windowsは基本的に使わないのでデュアルブートにする必要性はあまりないのだが、筐体を買った時点でWindows分のライセンス費も払っているからそのまま消すのが癪に障るとか、たまにテストでWindows上での動作を試したい場合があったりするとかいう理由で、いちおうWindowsも利用できるようにしておきたい。

どの機種を選ぶかが問題だ。要件としては以下のものがある。

  • 画面解像度は高いほうがいい。最低でも縦1200ピクセルは欲しいので、Full HD以下は却下。
  • 筐体のサイズはA4ワイドくらい、画面サイズは13インチくらいが望ましい。
  • CPU性能は並でよく、8コアの1.8Ghzくらいで十分。
  • メモリは16GB以上。ストレージはSSDの512GB以上。

まず考えたのは、ThinkpadのX1 Carbonだ。私は昔からThinkpad使いだったのだが、10年くらい前から画面解像度が据え置きになっているのに嫌気がさして、Macbookに乗り換えたという経緯がある。しかし、X1 Carbonは良い出来っぽくて、FHDを超える高解像度モデルも出てきたので、ちょっと欲しくなっていたのだ。赤ポッチのポインタ移動と中クリックのスクロールがかなり快適なThinkpadが恋しい。X1 Carbon Extremeとかいう最新モデルだと4K(UHD)ディスプレイも選べるので食指が動きかけた。しかし、4Kディスプレイモデルは値段が28万円からということで、予算オーバーで断念。高すぎるだろJK。

その他の国内のメーカーや中韓の新興メーカーの機種も調べたが、あまりピンとくるものがない。で、結局Dellに行き着いた。オジサンのメーカーだなどと妻には揶揄されたが、Dellの機種は独自仕様が少ないので使いやすそうだし、やはりコスパがいい。選んだ機種はXPS 13のモデル9370だ。上述の要件を全て満たした上で、お値段19万円弱。それでも高いけど、13.3インチで4Kディスプレイ搭載というのが決め手だった。USB-C端子が3つと、マイクロSDスロットがついているのとか、パームレストがカーボンファイバーでひんやりしないのとかも良さげだ。

買って実際に使ってみたXPS 13の感想なのだが、点数をつけるのなら60点くらいかな。Macbook Proに比べると、ディスプレイの解像度は高いが、発色では負けている。キーボードの打ち心地は、ペラペラなキーのMacbookよりは幾分マシだが、取り立てて良いわけでもない。最大の欠点は、トラックバッドの使い心地が悪いことだ。OS上でいくら感度や加速を調整してもポインタが思った通りに動かない。動かしたくないときに動くし、ウインドウの端を掴むといった細かいことをやろうとすると思ったところで止まらない。最も苛つくのが、トラックパッド上でクリックしたときにポインタがちょっとずれてしまうことだ。そーっと押してもずれるもんはずれる。そして、クリックするたびにベコベコと音がなってうるさい。Macbookでは操作性も静音性も申し分ないので、これはこの機種の欠点としか言いようがない。正直言ってこのトラックパッドはクソである。この欠点だけでも、奮発してThinkpadにしておけば良かったと後悔させられるに十分だ。Thinkpadだったらクリックボタンが独立しているから誤動作はありえないし、赤ポッチで迅速かつ精密なポインタ移動ができるのだ。

とはいえ、しばらくはこの機種と仲良くせねばならないので、なんとかうまく使う方法を考えたい。まずトラックパッドの問題に関してだが、Linux側ではポインタが暴走する問題はあまり起きなかった。Windows側は、もうどうでもいい。クリックするとポインタずれる問題に関しては、トラックパッドの下端ギリギリをクリックするとずれないという回避策を見つけた。自分がそんな操作に慣れさせられる屈辱はあるが、ずれて発狂しそうになるよりはマシだ。トラックパッド上のクリックする場所で中クリックや右クリックがエミュレートされるのだが、それらの境界線が曖昧なので、よく誤操作してしまう。これに関しては慣れるしかない。というか、このトラックパッドはクソなので、さっさと見切りをつけてBluetoothマウスを導入した方が幸せになれそうだ。

久しぶりにWindowsを触ったが、やっぱ使いにくい。とにかく動作が遅い。CPUはそこそこ速いはずなのに、使い始めたばっかりでここまで動作がもたつくのは不思議なくらいだ。ブラウザを開くだけで何秒も待たされるし、不意に数秒間固まって操作ができなくなることが多い。バンドルの不要なソフトを消して回ったが、それでも改善しない。Windowsの問題なのかこの機種との相性の問題なのかはわからないが、これはひどい。ポインタが思ったとおりに動かないストレスも重なって、もう耐えられない。通常使用は諦めた。テスト用と、出先でLightroomを使わざるを得ない場合用ということに割り切って考えることとする。一般的なWindowsユーザがこれ買ってたらと思うと、ぞっとする。怒りすら覚える。


気を取り直して、Linuxのインストール作業に入った。Dell自身がやり方の文書を公開しているので、基本的にはそれを追って作業を進めればよい。BIOSの設定が肝で、件の文書にある設定を全てやらないとうまくいかない。私がハマったのは、さらっと書いてあるSATAの設定をAHCIにするのを忘れたことだ。BIOSのSystem configuration - Sata OperationからAHCIを選択する必要がある。ついでに、後でUSBメモリから起動する必要があるので、その設定もしておくとよい。この記事が参考になる。

Linuxをインストールする領域を作り出すべく、Windows側のパーティションを縮小する必要があるのだが、その作業にちょっと注意を要する。パーティションを縮小するにあたっては、そのパーティションに割り当てられたドライブ上にあるファイルサイズが制限になるかもしれないので、予め不要ファイルの削除やデフラグを行っておいた方がいいっぽい。その上でディスク管理ツールを使って作業を行うのだが、私の場合はなぜか標準のディスク管理ツールだと、パーティションの編集作業ができなかった。よって、Windows power shellからdiskpartというユーティリティを呼び出して作業を行った。diskpartの使い方についてはこの記事あたりが詳しい。私の場合、Cドライブのパーティションのサイズを100GBまで縮小した。そうすると400GBくらいをLinux用に使えることになる。さらに、後々のややこしいトラブルを避けるべく、Cドライブに対するBitlockerによる暗号化も解除しておくことにする。この記事あたりが参考になる。

Ubuntu 18.04をインストールすることにして、本家の記事を見ながらUSBメモリに起動可能なUbuntuインストーラを作成する。あとはそれを差して起動して、普通にUbuntuのインストールを進めればよい。インストールが完了したら、sudo su - でrootユーザになって、apt-get updateとapt-get dist-upgradeをして最新パッケージに追いつかせてから、あとはお好みの設定を行っていけばよい。
f:id:fridaynight:20181228171408j:plain


全く個人的な趣味だが、インストール直後に私は以下の作業を行う。aptのパッケージはapt-cache search hogehogeとかやって探す。

  • デスクトップ環境のUnityが嫌いなので、Cinnamonを入れる。
    • apt-get install cinnamon-desktop-environment lightdm でインストールして再ログイン。
    • 設定のKeyboardのOptionsで、Caps LockをCtrlに割り当てる。
    • 設定のMouse and Touchpadで、タッチパッドのボタン割り当てやスクロール方法などを変える。
    • 設定のGeneralで、User interface scalingをNormalにする。いわゆるドットバイドット。
    • 設定のFontsで、読みやすいフォントサイズにする。4K画面の場合は18ptくらいがよさげ。
  • キーボードショートカットをひたすら設定する
    • 予期せぬ動作を防ぐため、デフォルトのショートカットを全て切る。スクリーンキャプチャと音量関係だけはそのまま。
    • Alt-1,2,3,4でワークスペース1,2,3,4に直接切り替えできるように。
    • Alt-Tabでフォーカスウィンドウ切り替え。
    • Alt-Qでウィンドウ閉じ、Alt-Eで最大化切り替え、Alt-Wでシェード切り替え
    • Super-1で端末、Super-2でカスタムランチャのemacs、Super-3でブラウザ、Super-4でファイラを起動
  • .bashrcを旧環境からコピーする。
  • .sshを旧環境からコピーする。known_hostsファイルだけは消す。
  • emacsを入れる。.emacsは旧環境からコピーする。
  • mozcを入れる。
    • apt-get install fcitx-mozc emacs-mozc-bin mozc-utils-gui
    • Language SupportでIMをfcitxにする。
    • fcitx-configtoolでIMの設定。mozcを追加し、Hot KeysでAlt-Spaceを割り当てる。
  • Google Chromeを入れる。本家からパッケージをダウンロードしてインストーラを起動する。
  • デスクトップ環境のパネルを設定する。
    • 端末とエディタとブラウザとファイラのランチャを置く。
    • ワークスペーススイッチャを置く。
  • 端末のプロファイルを設定する。
  • 各種プログラミング環境を入れる。*-devパッケージがあればそれも入れる。
    • apt-get install gcc g++ python3 python3-dev ruby ruby-dev perl libperl-dev lua5.3 liblua5.3-dev
    • apt-get install make automake autoconf pkgconf libtool libgtest-dev cmake
    • JavaJDKを取ってきて入れる。
  • 使いそうなコマンドやライブラリを入れる。*-devパッケージがあればそれも入れる。
    • apt-get install wget curl
    • apt-get install imagemagick ffmpeg dcraw enfuse exiftool
    • apt-get install zlib1g-dev libbz2-dev liblzo2-dev liblz-dev lzma lzma-dev p7zip-full
    • apt-get install libltdl-dev libxml2-dev libxml2-utils
    • apt-get install cdparanoia lame eyed3
  • ImageMagickの関連ライブラリを入れてから、ImageMagickの最新版をソースからビルドして /usr/local に入れる。
    • ソースパッケージの ./configure --helpで、with-xxxオプションのxxxをapt-cache searchで探して、それっぽいのを入れまくる。
  • Exiftoolの最新版をソースからビルドして /usr/local に入れる。
  • ldconfigの設定。
    • echo /usr/local/bin > /etc/ld.so.conf.d/local.conf ; ldconfig
  • ファイアウォールの設定。
    • ufwを有効化して、全てのoutgoingと、incomingのsshとhttpとhttpsだけ通す。
  • Webサーバを入れて設定。
    • apt-get install apache2
    • /etc/apache2/apache2.confと/etc/apache2/sites-available/localhost.confを編集
    • a2enmod/a2dismodでモジュール有効化/無効化。a2ensite/a2dissiteでサイト有効化/無効化。

4Kなどの高解像度ディスプレイでドットバイドットの表示設定にすると、やたら文字が小さくなるのだが、フォントを大きくしてやると見やすくなる。メニューバーなどのパーツが相対的に小さくなるのだが、それらは利便性に影響しないので問題ない。むしろ実務に使える領域が大きくなるので、使いやすくなる。私はMacbookでも同様の設定にしている(標準ではできないのでDisplay Menuというアプリケーションで実現する)。Chromeは設定でデフォルトズーム倍率を150%とか175%とかにしておくと、だいたいのページが見やすくなる。特定のサイトの倍率だけを変えられるのも便利だ。写真の解像を判断するには表示環境がドットバイドットであることは必須だ。


欲を言えば、コピーペーストを全てのアプリケーションでAlt-CおよびAlt-Vで統一するように設定したい。端末がCtrl-Cを割り込みに使うのでCtrlの代わりにSuper(Win)かAltを修飾キーに使うしかない。Superキーにはアプリケーションの起動に関連する機能を集めているので、Altが最有力だ。しかし、各アプリケーションごとに事情があって面倒なので断念した。端末に関してはコピペのデフォルトはShift-Ctrl-C/Vだが、それをAlt-C/Vに割り当てるのは簡単だ。しかし、emacsは伝統的にCtrl-Yであってそれは変えられず、ChromeはCtrl-C/Vでそれも変えられない(機能拡張でできるらしいけど)。他のアプリケーションも設定できたりできなかったりでまちまちだが、Alt-C/Vであることはまずない。となると、端末だけAlt-C/Vにすることのメリットはない。まあ、慣れの問題ではあるし、選択だけして中クリックでペーストするというアプリケーションに中立な方法があるので、それで我慢するか。


.bashrcには、インストール後のテンプレートの末尾に以下のものを足している。emacsのニョロファイルを消すのと、端末間でコマンド実行履歴を共有するのが個人的にかなり重要。

export PS1='\h[\w]\$ '
export LANG="en_US.UTF-8"
export LANGUAGE="en_US.UTF-8"
export LC_ALL="$LANG"
export PATH="$PATH:/usr/local/bin:/usr/local/sbin:$HOME/bin"
export PAGER='/usr/bin/less -i'
export EDITOR='/usr/bin/emacs -nw'

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias less='less -if'
alias diet='rm -f *~ \#* .*~ .\#* #'
alias nyoro="find . -type f | egrep '(/\#)|(~$)|core$'"
alias rmnyoro='rm -f `nyoro` #'
alias dots='find . -name ".*" -print'

unset command_not_found_handle

export HISTSIZE=9000
export HISTFILESIZE=$HISTSIZE
export HISTCONTROL=ignorespace:ignoredups
history() {
  _bash_history_sync
  builtin history "$@"
}
_bash_history_sync() {
  builtin history -a
  builtin history -c
  builtin history -r
}
PROMPT_COMMAND=_bash_history_sync


.emacsには、以下の設定をしている。column-markerについては以前の記事で述べた。フォントはInconsolataを取ってきて入れ、日本語だけはNoto Sans CJK JPを使う。emacs-mozcも有効化する。

(global-unset-key "\C-h") (global-set-key "\C-h" 'backward-delete-char)
(global-unset-key "\C-\\") (global-set-key "\C-\\" 'scroll-other-window-down)
(global-unset-key "\C-^") (global-set-key "\C-^" 'scroll-other-window)
(global-unset-key "\C-z") (global-set-key "\C-z" 'call-last-kbd-macro)

(menu-bar-mode -1) 
(toggle-scroll-bar -1) 
(tool-bar-mode -1) 
(blink-cursor-mode -1)
(column-number-mode t)

(setq initial-scratch-message nil)
(setq inhibit-startup-message t)
(setq next-line-add-newlines nil)

(setq initial-major-mode 'fundamental-mode)
(setq default-major-mode 'fundamental-mode)
(setq auto-fill-mode nil)
(setq fill-mode nil)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)
(add-hook 'c-mode-common-hook (lambda ()
  (setq indent-tabs-mode nil)
  (setq c-basic-offset 2)
  (c-set-offset 'innamespace 0)
  (c-set-offset 'inextern-lang 0)
  (c-set-offset 'case-label 0)
))
(add-hook 'html-mode-hook (lambda ()
  (electric-indent-mode -1)
))

(set-keyboard-coding-system 'utf-8-unix)
(set-terminal-coding-system 'utf-8-unix)
(set-buffer-file-coding-system 'utf-8-unix)
(set-default-coding-systems 'utf-8-unix)
(prefer-coding-system 'utf-8-unix)

(if (eq window-system 'x) (progn
  (setq default-frame-alist '(
      (foreground-color . "#ddeeff")
      (background-color . "#002222")
      (width . 120) (height . 65)))))

(require 'column-marker)
(defface my-face-folding '((t (:background "#444444"))) nil)
(defvar my-face-folding 'my-face-folding)
(column-marker-create column-marker-9 my-face-folding)
(add-hook 'c-mode-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'c++-mode-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'ruby-mode-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'python-mode-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'java-mode-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'perl-mode-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'lua-hook (lambda () (interactive) (column-marker-9 120)))
(add-hook 'sh-hook (lambda () (interactive) (column-marker-9 120)))

(set-default-font "Inconsolata")
(set-face-attribute 'default nil :height 210)
(set-fontset-font (frame-parameter nil 'font) 'japanese-jisx0208
                  (font-spec :family "Noto Sans CJK JP" :size 24))

(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")
(global-set-key (kbd "M-SPC") 'toggle-input-method)


インストールと設定だけで半日仕事になったが、なんとか普通に使えるようになってきた。Linux側だけで言えば、性能的には全く問題なく、ビルド作業もWebブラウジングもサクサクだ。Linuxもだいぶ熟成してきたもので、自分なりに設定してしまえば、Windowsはおろか、Macよりも使いやすくなってくる。しかし、普通に使うだけでここまでの前提知識と作業量を要求するシステムがエンドユーザに広く受け入れられるのは難しいだろう。でも、Plamo LinuxとかKondara MNU/Linuxとかをゴニョゴニョしてた20年前に比べたら半日作業で終わるだけでだいぶ楽になった。あと何年かで普通にみんながLinuxを使う時代になるかもしれない。まあ、AndroidLinuxベースなので、そういう意味では既にみんなが使っているのだけれど。

設定だけして満足してしまった感があるが、それを使って何をするかが問題だ。主な用途としては写真データの整理をするための母艦にするというのがあるのだが、それ以外にも、日曜大工的につまらぬものをぼちぼち作っていきたい。

Dell XPS 13についてだが、Windows機としては全く使い物にならないくらい使いにくいので、買わない方が良いと断言したい。Linux機として買うならまあ許容範囲だと思うが、それだったらThinkpad X1 Carbonの方がいいと思う。OSについて頓着がない人はとりあえずMacbook ProMacbook Airを買えばいいと思う。