By

Macbook Pro から Razer Blade + Ubuntu に移行した

今年初めくらいに、今まで使っていた Macbook Pro (13インチ 2014年モデル) に別れを告げ、全面的に Linux (Ubuntu GNOME 16.10) に移行しました。

会社から支給されている Razer Blade 2016 GTX 1060 を使用しているのですが、結論から申し上げるとハードウェア問題もなく、これまでないくらいに快適で、完璧に動作しています。(後述しますが、僕の使う範囲のハードウェアに問題がないだけで、一部のデバイスは動作に難があります。

主として Rails や go を使用したWebサービス開発とインフラ開発が中心である一個人の感想ですが、なぜ今まで Macbook 使ってたのだろうと自分を責める程度に現状に満足しています。

さて、本記事では Razer Blade に Ubuntu をインストールして環境設定したところまで紹介します。

Ubuntu のインストール

USBメモリスティックにインストーラを入れて、Razer Blade からブート、インストーラの指示に従うだけです。 これは本当に拍子抜けしたのですが、何一つ問題に遭遇することなくインストールが完了しました。Hacker News などを眺めていると、Razer Blade と Linux の組み合わせは必ずしも評判の良いものではありませんが、僕の使用しているモデルに限って言えば全く問題ありません。

僕はあまり Unity が好きではないので Ubuntu GNOME を使ってます。XFCE と LXDE も試したんですが、マルチモニタでの動作がやや不安定だったので使うのはやめました。

必須の設定

先人の努力の賜物で、インターネットに完璧なマニュアルが存在します。基本的にこのドキュメントを参照すれば問題なく動作するようになります。

https://docs.google.com/document/d/1jI2jlVi1V0H8SeNm5kspJ1qXVtibLOnxNOkDr8ExoSI/edit#heading=h.nkiewtcyw910 (Thank you very much author!)

英語なので、このドキュメントを元にして僕が設定した項目を以下にまとめます。

サスペンドループの解決

インストールが完了した状態で蓋を閉じて開けると、以降サスペンドと復帰を繰り返すという問題がありますが、これは簡単に解決できます。

/etc/default/grub を開いて button.lid_init_state=openGRUB_CMDLINE_LINUX_DEFAULT の末尾に追記します。

NVIDIA ドライバ

ドキュメント内には NVIDIA GPU の設定が書かれてますが、Optimus / Bumblebee によるGPU切り替えが上手く実現できなくて、NVIDIA GPU 使ってるとものすごく電池持ちが悪いので Discrete GPU は完全にオフにしてます。

でも、Linux で機械学習とか GPU を使ってやりたいですよね。これは将来の課題として残っています。

Webcam

Webcam はドキュメントに書かれてるとおり、まともに動作しません。僕は使わないので気にしません。

HDMI ポート

HDMI ポートが動きません。でも、HDMI-USB3 Type-C アダプター経由で Razer Blade のUSB type-C ポートに挿すとHDMIケーブルを使って出力できます。

その他

Wifi に問題があると書かれていますが、僕の環境では何も設定しなくても動作しています。タッチスクリーンは搭載されていないモデルなのでわかりません。

個人設定

キーボードバインディング

Macbook を使っていた時は OSX の Emacs キーバインディングをよく使っていたので、それを再現しています。

gnome-tweak-tool

gnome-tweak-tool で “Key Theme” を “Emacs” にします。

xremap

gnome-tweak-tool だけだと、ChromeやSlackが一部のキーを奪うので (Ctrl-b がGitHubの入力フォームで奪われたり)、これらのキーバインディングを強制的に上書きするために xremap を利用しています。@k0kubun さん、ありがとうございます。

 1window class_only: ['google-chrome', 'slack'] do
 2  remap 'C-b', to: 'Left'
 3  remap 'C-f', to: 'Right'
 4  remap 'C-p', to: 'Up'
 5  remap 'C-n', to: 'Down'
 6
 7  remap 'C-a', to: 'Home'
 8  remap 'C-e', to: 'End'
 9
10  remap 'M-b', to: 'Ctrl-Left'
11  remap 'M-f', to: 'Ctrl-Right'
12
13  remap 'C-k', to: ['Shift-End', 'Ctrl-x']
14  remap 'C-d', to: 'Delete'
15  remap 'M-d', to: 'Ctrl-Delete'
16
17  %w[f l].each do |key|
18    remap "Alt-#{key}", to: "C-#{key}"
19  end
20end

グローバルショートカットキー

フォアグラウンドアプリの切り替えをするグローバルショートカットキーを GNOME に設定しています。例えば Ctrl-Alt-e で Emacs がフォアグラウンドになるように、このキーコンビネーションが押された時に次のコマンドを実行するようにしています。

wmctrl -xa "emacs"

(ディスプレイサーバーが Wayland になると wmctrl が動かなくなるけど、どうしたらいいんでしょうね。何か代替案を知ってる方、教えてください)

ウィンドウレイアウトの保存

カフェで使うときは ラップトップ単体、オフィスで使うときは 27inch 2560x1440 のデュアルモニタ、家で使うときは 4K のディスプレイとデュアルと、使用場所でウィンドウのレイアウトが変わるので、簡単にレイアウトを復元できるスクリプトを作りました。

#!/usr/bin/env python3
import subprocess
import os
import argparse

wdir = os.environ["HOME"]+"/.wa"

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def winlist_path(name):
    return wdir + "/" + name

def check_window(w_id):
    w_type = get("xprop -id "+w_id)
    if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
        return True
    else:
        return False

def read_windows(args):
    w_list =  [l.split()[:7] for l in get("wmctrl -lGx").splitlines()]
    relevant = [(" ").join(w[2:7]) for w in w_list if check_window(w[0]) == True]
    winlist = winlist_path(args.name)
    with open(winlist, "wt") as out:
        for item in relevant:
            print(item)
            out.write(item+"\n")

def restore_windows(args):
    winlist = winlist_path(args.name)
    try:
        wlist = [l.split() for l in open(winlist).read().splitlines()]
    except FileNotFoundError:
        print(args.name + " not found")
        pass
    else:
        for w in wlist:
            try:
                cmd = "wmctrl -xr "+w[4]+" -e 0,"+(",").join(w[0:4])
                subprocess.Popen(["/bin/bash", "-c", cmd])
            except:
                pass

parser = argparse.ArgumentParser()
parser.add_argument("name", type=str, default="default")
parser.add_argument("--dump", action="store_true", default=False)

args = parser.parse_args()

os.makedirs(wdir, exist_ok=True)

if args.dump:
    read_windows(args)
else:
    restore_windows(args)

このスクリプトを使ってレイアウトを保存・復元しています。僕はこのスクリプトを wa という名前 (Window Arrangementです)で PATH に置いているので wa --dump office でレイアウト保存、wa office でレイアウト復元という感じです。

所感

  • Emacs (特に magit) が全体的に速くなりました。これが OS の違いに起因するのか、それともハードウェアがグレードアップしたからなのかはわかりません。
  • Docker がすごく使いやすくなりました。Docker for Mac はたくさん問題がありましたが、linux にはそういう問題はもちろんありません。
  • Razer Blade、見た目がかっこよくて気に入ってます。Web開発の目的だと Razer Blade Stealth の方が軽くてよいという人が多いかもしれません。
  • GTX 1060 を積んでるのでWindowsを起動したらゲームもできます。僕が Razer Blade を選んだ一番の理由はこれです。

Linux用の PC というと Thinkpad とか DELL XPS などが有名ですが、Razer Blade もすごくいいですよ。

一緒にユニークな決済サービスを作ってくれる Rails エンジニアを募集中です!
多国籍なメンバーと一緒に仕事をしてみませんか?詳細はこちらのリンクです:D