😺

MacBookが合わな過ぎて半年で売った私がリベンジする話

2024/08/23に公開
5

背景

5年前、学校の指示で購入したMacBook Air (Retina, 13-inch, 2019)でMacOSデビューしました。しかし、その時点で7年間Windowsを使用していた私には、MacOSが合わず、ストレスがたまり、半年で売却しました。
その後、42TokyoなどでもMacOSが強制されましたが、依然として慣れることができませんでした。今回、インターンに参加する際、再びMacBookが強制されたため、この機会に克服しようと思います。

当時の印象(偏見が多分に含まれています)

1. Type-Cのみのインターフェース

最初にMacBookを開いたとき、驚いたのはインターフェースがUSB Type-Cポートが2つしかなく、充電も兼ねているため、実質的に使えるポートは1つしかないことでした。
当時はまだUSB Type-Cのノートパソコンが少なく、正直なところ、従来のUSB Type-Aポートが主流だったため、非常に困りました。
私自身は、「薄型化のためにUSB Type-Aを搭載しなかった」と感じ、「見た目のために使いやすさを犠牲にする」というスタンスに強い嫌悪感を覚えた記憶があります。

2. 薄すぎるキーボード

次に、あまりにも大きな起動音に驚きながら触れたキーボードは非常に薄く、使いづらいと感じました。最初は慣れの問題かと思っていましたが、半年間使っても慣れることができず、他のノートパソコンでは問題がなかったため、これも「見た目のために使いやすさを犠牲にしているのではないか」と感じました。

外付けキーボードを使おうにも、先ほど述べたように普段使えるUSBポートは1つしかなく、その上USB Type-Cです。変換ケーブルを使うと、実質的に自由に使えるUSBポートがなくなります。
MacBook用のUSBハブを購入しようと思った際、かなり高価で驚いた記憶があります(そもそも、ノートパソコン用のUSBハブを買わなければならないのはどういうことなのかと思いました)。もともとMacBookの価格自体が割高に感じていた私には、こうした点で非常に嫌な印象を受けました。

3. 押しにくいCmdキー

WindowsユーザーであればCtrlキーを小指で押すことが多いですが、このMacBookではスペースキー、英数キー、かなキーの左隣と右隣にCmdキーがあります。これが非常に押しにくく、Cmdキーは手をホームポジションに置くとほぼ手の中心に来るため、Macユーザーには第六の指でも存在するのでしょうか? 頻繁に使用するCmd+CやCmd+Vを押すのにも、指がつりそうになります。また、Windowsと混同しやすいことにControlキーも別にあり、私は以下のように考えていました。

win mac
ctl cmd
alt option
win ctl

みたいな対応になっていると思っていたのですが、実際にはCtrlとCmdの対応関係以外はほぼこの通りではありません。また、ControlとCommandもWindowsにあるControlと混同することがあり、どちらも頭文字が同じであるため、混乱しやすいです。この点も非常に困難でした。

さらに、Mac特有の「ショートカットキー」を記号で表す文化にも慣れず、正直に言うとControlが ^ で表されるのは直感的ではないと感じました(もちろん、Commandに関しても同様です)。

4. 慣れないカーソル移動

マウスの加速度やスクロールの向きがすべてWindowsと異なります。スクロールの向きを合わせたものの、なぜかマウスのホイールにも加速度が設定されているため、かなり強い力でスクロールしなければまともに動きません。また、マウスの加速度をWindows風に変更するには、別のアプリケーションを購入する必要があるため、USBハブの件と合わせて、MacOSは経済的にも手間がかかると感じました。

総括

インターフェースは使いづらく、マウスを使おうとしても違和感が大きいです。キーボードで操作しようにも使いづらく、さらにOSのキーボードショートカットが異なるため、非常にストレスを感じました。

反論

5年経って振り返ると、当時の感想にはいくつかおかしな点があったり、考え方が変わったり、逆により悪いと思った点について言及します。

1. Type-Cのみのインターフェース

この点について最近は、薄型ノートパソコンにUSB Type-Cのみのモデルが増えてきたと感じます。また、USB Type-Cに対応した周辺機器やC to Cケーブルの普及も進んでいるため、当時ほどの問題は少なくなっていると思います。

2. 薄すぎるキーボード

Appleのバタフライキーボードに関しては、以前から批判が多かったことを最近知りました。いくつかのバタフライキーボードに対する批判記事も見つけ、この点について私の当時の感想がそこまで的外れではなかったと安心しました。

バタフライキーボードの導入は、ジョナサン・アイヴがアップルの最高デザイン責任者(CDO)だった時代の最盛期に決定された。当時は同社の設計哲学において、スリムで滑らかな美しさが何よりも優先されていたのだ(機能性より重視されることもあった)。(アップルの「キーボード問題」を巡る集団訴訟、多額の和解金でようやく決着へより)

また、実際に2019年以降のMacBookではバタフライ構造のキーボードが「廃止」されていることから、Apple自体もこれが失敗だったと認識しているのかもしれません。
逆に言えば、当時私が嫌っていた「見た目のために実利を捨てる」という思想は薄れてきたのではないでしょうか。
どうやら私自身、ちょうど運悪くその時期のモデルを選んでしまったようです。

3. 押しにくいCmdキー

この点についても、いくつかの私の勘違いがありました。まず、MacのControlキーについてですが、後から考えてみると、むしろMacの方がエンジニア向きなのではないかと思うようになりました。

MacのControlキーには基本的にEmacsキーバインドが割り当てられています。Windowsの場合は関係ありませんが、MacのベースがUnixであるため、CLIからGUIへの移行があったわけです。その際、MacではGUI用の修飾キーをCommandキーに、従来のCLI用の修飾キーの役割をControlに割り当てるという、エンジニアフレンドリーな思想を感じました。

逆に、Windowsは最初からGUIを前提としているため、機能をコントロールする修飾キーをControlキーのみに任せることができたのだと思います。

さらに、私は自作キーボードのレイヤー機能を使ったり、最初はAutoHotkeyを使って無変換キーをControlキーとして扱い、ホームポジションから動かずに矢印キーやバックスペースなどにアクセスできるようにしていました。
しかし、OS側でそうした機能が標準で担保されているのはなかなか良いものだと感じました(カスタマイズが可能ならばなお良かったのですが…)。

結果として、Emacsキーバインドを使わない人にとっては、MacのControlキーがそれほど価値のあるものではない(むしろ押しにくく感じる理由になっている)とはいえ、個人的には以前ほどの嫌悪感はなくなりました。

4. 慣れないカーソル移動

この点についても、大きな誤解がありました。まず、MacOSはAppleが作ったハードウェア専用に設計されているため、Apple以外のデバイスを使用するとMacOSが使いづらくなるのは、プログラマーが新しいプログラミング言語を学ぶ際に、元の言語の考え方を引きずってしまうような、少なくとも優れたエンジニアとはとても言えないことをしていたことに気付きました。

つまり、Appleは基本的にマウスを使った操作を前提としておらず、主にトラックパッドを使って操作することを想定しています。ここは完全に私の先入観、すなわち「PCはマウスを使って操作するものだ」という考えに影響を受けた未熟さが現れていました。

(Appleのマウス製品への注力度合からも、マウスで操作することをあまり想定していないことがうかがえます。)

そのため、MacOSを使用する場合は、その考え方に適応する必要があります。当時、私が使っていた明らかに硬すぎるホイールを持つマウスを使って「ホイールが使いづらい」「カーソルの速度が不自然だ」と指摘するのは、本質から外れていた可能性があります。

実際にトラックパッドを使ってみて、その使用感がマウスと比べてどうであるかについては、次の「再び触れてみて」で詳しく述べたいと思います。

再び触れてみて

今回貸与されたのはMacBook Pro M3 ProとMacBook Pro 2018でした。ちょうど当時のProと最新のProが手に入ったので、当時を思い出しながら触れていきます。

こまかなスペック

インターン先1 インターン先2
製品名 MacBook Pro M3 MacBook Pro
販売年 2023 2018
CPU M3 Pro Intel Core i9(Core i9-8950HK)
RAM 36GB 16GB
SSD容量 1TB 512GB
インターフェース MagSafe 3, SDXCカードスロット, HDMIポート, Thunderbolt 4 * 3 Thunderbolt 3(USB-C)* 4

ディスプレイ環境

インターン先1 インターン先1
ディスプレイ 4k*2
位置 上下(下がmacbookのディスプレイ)
inch 30inch&15inch

環境構築

MacOSというシステムに慣れるためにマウスは使わず(動画編集や画像編集はしないためいらないと判断)あくまでトラックパッドとキーボードのみで操作していきます。

エディタ

Cursorエディタをインストールしようと思いましたが、せっかくならHomebrewからやってみます。Windowsではここ数年wingetという公式パッケージマネージャが追加されましたが、とはいってもまだまだ少なく、scoopchocolateyなど複数のパッケージマネージャに散らばってしまっています。
こういうスタンダードになっているパッケージ管理ソフトウェアが昔からあるのはいいですね。

アローキー

ここで気づいたのですがMacでは単語ごとにカーソルを飛ばすのがoption+arrowなんですね・・・
windowsやlinuxではctrl+arrowで、windows換算するとalt+arrowみたいになる都合上正直かなり操作感は違いますね。
またHomeとEndも効かないので、これはさすがにqmkでMac用のものを作らないといけなさそうです。

これはアローキーのVSCodeでの動作の違い

動作 win mac
right right right
left left left
upper line up up
below line down down
next word ctrl+right alt+right
pre word ctrl+left alt+left
line start home ctrl+a
select to line start shift+home shift+ctrl+a
line end end ctrl+e
select line end shift+end shift+ctrl+e
file start ctrl+home cmd+up
file end ctrl+end cmd+down
delete to word start ctrl+backspace alt+backspace
delete to word end ctrl+delete alt+delete
move to pre page alt+left cmd+left
move to next page alt+right cmd+right

Windows化

ある程度MacOSの文脈になれるとはいえ、ショートカットキーのちょっとした違いなどあまり本質的でない部分で引っかかるのは不本意なのでQMKでゴリゴリにカスタマイズします。
具体的にはモディファイアキーと矢印、Backspaceを押したあたりの挙動を統一します。

QMK

qmkではprocess_record_userとos_detectionを使って、以下のキーを擬似的にスワップします。
命令的な書き方しかできないので、かなり不安ですが今のところうまく動いています

OS Detection

以下のコードでApple系のOSの場合はis_appleグローバル変数をtrueにします

void keyboard_post_init_user(void) {
    debug_enable = true;
    debug_matrix = true;

    wait_ms(500);
    os_variant_t host = detected_host_os();
    if (host == OS_MACOS || host == OS_IOS || host == 0) {
        // keymap_config.swap_lctl_lgui = true;
        is_apple = true;
        default_layer_set(1UL << MAC_DEFAULT_LAYER);
        layer_move(MAC_DEFAULT_LAYER);
    }
    is_called_keyboard_post_init_user = detected_host_os();
}

mac用レイヤー

全部書いても分かりづらいので要点だけ

  • is_appleがtrueの時はdefaultのレイヤーをmacレイヤーへ
  • Homeの位置のキーコードをMC_HOMEへ
  • Endの位置のキーコードをMC_ENDへ
  • Ctrlの位置にCmd
  • Winキーの位置にCtrl

process_record_user

  • MC_HOMEでHomeキーを再現
  • MAC_ENDでEndキーを再現
  • (Left,Right)+Cmdが押されていた場合は(Left,Right)+Option
  • (Left,Right)+Optionが押されていた場合は(Left,Right)+Cmd
  • Backspace+Cmd => Backspace+Option

以下のコードで以上のような挙動を再現しています

    if (is_apple) {
        switch (keycode) {
            case MC_HOME:
                if (record->event.pressed) {
                    if ((get_mods() & MOD_MASK_GUI)) {
                        tap_code(KC_UP);
                    } else {
                        register_code(KC_LCTL);
                        tap_code(KC_A);
                        unregister_code(KC_LCTL);
                    }
                }
                return false;
            case MAC_END:
                if (record->event.pressed) {
                    if ((get_mods() & MOD_MASK_GUI)) {
                        tap_code(KC_DOWN);
                    } else {
                        register_code(KC_LCTL);
                        tap_code(KC_E);
                        unregister_code(KC_LCTL);
                    }
                }
                return false;
            case KC_LEFT:
                if ((get_mods() & MOD_MASK_GUI)) {
                    if (record->event.pressed) {
                        unregister_code(KC_LCMD);
                        tap_code_with_mod(KC_LEFT, KC_LOPT);
                        register_code(KC_LCMD);
                    }
                    return false;
                }
                if (get_mods() & MOD_MASK_ALT && !is_open_window_changer) {
                    if (record->event.pressed) {
                        unregister_code(KC_LALT);
                        tap_code_with_mod(KC_LEFT, KC_LCMD);
                    }
                    return false;
                }
                return true;
            case KC_RIGHT:
                if ((get_mods() & MOD_MASK_GUI)) {
                    if (record->event.pressed) {
                        unregister_code(KC_LCMD);
                        tap_code_with_mod(KC_RIGHT, KC_LOPT);
                        register_code(KC_LCMD);
                    }
                    return false;
                }
                if (get_mods() & MOD_MASK_ALT && !is_open_window_changer) {
                    if (record->event.pressed) {
                        unregister_code(KC_LALT);
                        tap_code_with_mod(KC_RIGHT, KC_LCMD);
                    }
                    return false;
                }
                return true;
            case KC_BACKSPACE:
                if ((get_mods() & MOD_MASK_GUI)) {
                    if (record->event.pressed) {
                        unregister_code(KC_LCMD);
                        tap_code_with_mod(KC_BACKSPACE, KC_LOPT);
                        register_code(KC_LCMD);
                    }
                    return false;
                }
                return true;
        }
    }

VSCode設定

マジで多すぎるのでWindows化に関係するものだけを抜粋します

keybindings.json
[
  {
    "key": "cmd+z",
    "command": "undo"
  },
  {
    "key": "cmd+y",
    "command": "redo"
  },
  {
    "key": "cmd+w",
    "command": "workbench.action.closeActiveEditor"
  },
  {
    "key": "cmd+q",
    "command": "workbench.action.closeWindow"
  },
  {
    "key": "cmd+w",
    "command": "workbench.files.action.collapseExplorerFolders",
    "when": "filesExplorerFocus"
  },
  {
    "key": "cmd+tab",
    "command": "workbench.action.terminal.focusPrevious",
    "when": "terminalFocus && terminalHasBeenCreated && !terminalEditorFocus || terminalFocus && terminalProcessSupported && !terminalEditorFocus"
  },
  {
    "key": "cmd+oem_7",
    "command": "editor.action.quickFix",
    "when": "editorHasCodeActionsProvider && textInputFocus && !editorReadonly"
  },
  {
    "key": "cmd+k cmd+s",
    "command": "workbench.action.openGlobalKeybindings"
  },
  {
    "key": "cmd+k cmd+c",
    "command": "aichat.newchataction"
  },
  {
    "key": "cmd+k cmd+i",
    "command": "editor.action.showHover",
    "when": "editorTextFocus"
  },
  {
    "key": "f2",
    "command": "renameFile",
    "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "enter",
    "command": "-renameFile",
    "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
  },
  {
    "key": "alt+cmd+right",
    "command": "workbench.action.navigateForwardInNavigationLocations"
  },
  {
    "key": "alt+cmd+left",
    "command": "workbench.action.navigateBackInNavigationLocations"
  },
  {
    "key": "enter",
    "command": "explorer.openAndPassFocus",
    "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsFolder && !inputFocus"
  },
  {
    "key": "ctrl+tab",
    "command": "workbench.action.nextEditor"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "workbench.action.previousEditor"
  }
]

AltTabの導入

流石にこれがないときつい

Raycastの導入

Windowsとは違いディスプレイ間ウィンドウの移動のショートカットキーがないため、それを代わりに使うようcmd+ctrl+l,cmd+ctrl+jを割り当てる。
使い道としてはcmd+ctrlを押した状態で、「flf」とおすと最大化している画面を次のディスプレイでフルスクリーンとして開ける
Option(Alt)+Spaceでランチャーが開けますが、今回はMacに慣れるため頑なにcmd+スペースで開かれる方を使っていきます。

触って見た感想

良かったところ

  • ⌘+wでウィンドウが閉じれるのはとてもいい +3
    • ⌘+qもおそらくmac全体で統一されておりalt+f4とらくべてはるかに押しやすく、とはいえホームポジションから多少逸脱するため間違えて押すこともないとても良いショートカットキー
  • フォントが綺麗 +3
    • これは高DPIだからというわけではなくWindowsで普段使っているディスプレイでも同じように使ったのですが、フォントのアンチエイリアスがわずかに綺麗です。Windowsはあくまでドット絵のような感触を覚えるのですが、Macはちゃんと高DPIを基準にアンチエイリアス効かせている感じなのか読みやすい。
    • これはAdobeがMacOSに最適化する理由がわかりますわ
      • でもMacライクな操作感のままWindowsに出すのはやめてくれ
  • VSCodeの立ち上がりの速さ
    • というよりWindowsくん時々WSLにリモート用のサーバー入れ直すんですよね・・・
  • PosixShell
    • 私はWindowsの中身がLinuxになればいいのに派です(それLinuxや)
    • 開発周りの設定をいちいちWSLでどうこうするのそろそろめんどくさくなって来た
      • 自分がどうしてWindowsを使っているのか、なぜMacOS、Linuxだとダメなのかを近日中に調査したい
  • トラックパッドの操作感
    • Windowsと比べてマウス側でできることがかなり多かったです。三本指タッチや二段階クリックなどかなりクオリティが高く、汎用的な用途ではマウスを上回る使いやすさがありました。
      • 特定の用途である「動画編集」や「画像編集」などをする場合はマウスを使った方がいい場面もありますが、汎用的なポインティングデバイスとしてトラックパッドを標準で採用するのはかなりありなのでは?という気がしてきました。
      • ただ、トラックパッドを机にそのまま置いた場合、手首をテーブルにつけるとかなり手首に角度がかかってしまい、負荷になる
        • テーブルにつけないとこんどは不安定になる
        • ここら辺はマウスの方がまだ人間に優しいかもしれない
      • All in One の観点的にはマウスよりこっちの方がGood
  • キーボードの日本語、英語配列をキーボードごとに認識すること
    • WindowsではOS全体で接続されたキーボードが日本語配列なのか、英語配列なのか認識するため、日本語配列のキーボードと英語配列のキーボードを同時に接続するとどちらかが印字と違う状況になります
    • 一方macではキーボードごとに認識するため、外部キーボードはUS配列、内臓キーボードは

やっぱり慣れられなかったところ

  • スクリーンショットがクリップボードに自動でコピーされない
    • Windowsの方がUXがいいの珍しい(偏見)
      • セキュリティ的な観点?
  • ~shift+ctl+aとshift+ctl+eの非対称性 -1~
    • shift+ctl+eはその位置から行終わりまでを選択してくれる
    • ~しかし、shift+ctl+aはなにもしない(その位置から行終わりまで選択してくれてもいいじゃないか)~
      • これは勘違いだった、正しくは「SlackでIMEが日本語モードの時はshift+ctrl+aが働かない?」みたいな感じ?もうちょっと詳しく検証した方がいいかも
      • 少なくとも安定稼働しないイメージ
  • ctrl+eとendの違い -1
    • Windowsのendはその行の最後まで行くのに対して、MacOSのctrl+eは次の\nまですすむ(つまり見た目上改行されているなどの要素はctrl+eの場合は考慮されない)
      • これはcmd+右左の場合はhomeとendが再現できるが、下記の理由から使えない
  • 戻る、進むショートカット -2
    • Windowsではalt+右左で使える
    • Macではcmd+右左で使える
      • がしかし、行頭、行末への移動にもcmd+右左を使う
      • テキスト入力状態かそれ以外かで挙動が変わるのがきつい
        • 非テキスト入力中の時はブラウザの「戻る」「進む」になってしまい、VSCodeで使うには現実的ではない
    • とはいってもトラックパッドの二本指スワイプで行けるのでそこまで困らない(でもショートカットキー使いたい)
  • Enterキーの立ち位置がちょっと違う -.1
    • Windowsだとフォーカスしている項目を決定する際に使用しますが、Macではその役割はSpaceのみに任されており、Enterを押すと必ずハイライトされている方の項目をクリックしたことになる
  • 起動音がうるさい(うるさい) -.1
  • cmdキー
    • ctrlキーと分かれているのはかなりいい発想だとは思う。
    • Win、Linuxではショートカットーキー周りの設定を使いまわせる
      • がMacでは使い回すことができない

Discussion

kkddkkdd

含蓄深い御記事をありがとうございます。
私も同様に当初の反感を、後になってから反省することも少なくないです。
なお、コマンドキーコントロールキー(Wikipedia)にも解説がありました。
また私はCmdキーについては親指を使います。CUI用のCtlキーはAの左へ割り当て小指で使っており、Emacsキーバインド利用です。(functionキー、arrow移動キー、deleteキーは使いません)

こう?こう?

コメントありがとうございます。
Emacsキーバインド利用者的にはかなりいいOSですよね~
Wikipedia読んでみます!

kkddkkdd

こんにちは。
「shift+ctl+aはなにもしない(その位置から行先頭まで選択してくれない)」ことを初めて知りました。mac のバグの第一御発見者なのかもしれませんね(Apple の言い分を聞いてみたいです)。

😺😺

こんにちは!最近MacからThinkPadに移行したのでなかなか興味深い内容でした。やっぱりキーストロークはなるべくあった方が嬉しいですよね。

以下、もしまだご存知でなければ…

  • スクリーンショットがクリップボードにコピーされないところは、Controlキーを追加で押してスクリーンショットするとクリップボードにコピーされると思います!
  • 起動音をオフにする設定は試されましたか?最新のmacOSだと設定のサウンドのところにオフにするオプションがあると思います!
こう?こう?

どちらも知らなかったです・・・
コメントありがとうございます。助かりました。