M1 Macbookを買うかどうか
4年前にずっと愛用していたWindowsからMacbookに乗り換えました。当時、アルバイトしていた開発会社がMacbookをメインに使っていたので、その流れに乗ったという感じです。早いものでMacbookを使い始めてから4年の歳月が流れておりました。元々、自分が使っていたMacbookは2016年のMacbookProでした。詳しいスペックについては省きますが、当時、なけなしのお金をかき集めて買った思い出ある一台です。
しかしながら、ある日、Macbookから唐突に火花が出ました。「ジュッ!」という音と共に、電源がつかなくなり、「あー、これは終わったな...」と思いAppleのカスタムサポートの方とやり取りをしました。
どうやら機種が古いため、修理するのに5万ほどかかるとのことで、「新しい機種を買った方がいいですね」とアドバイスを頂きました。すでに5年前の機種となっていたため、思いきってMacbookを買い換えようと考えていました。
ProかAirか
元々はMacbookProを使っていましたが、スペックはオーダーできる最低スペックのものでした(お金が無かった💰)。
当時は機械学習をやりたかったのと、「エンジニアならMacbookProでしょ」という先輩のアドバイスからMacbookProを使っていましたが、機械学習も実機ではやらなくなり、WEBアプリの開発がほとんどだったので、次に買うのは別にMacbookProでなくてもいいかもなぁとは思っていました。
M1 Macbookシリーズの発表
そんな時に丁度、M1チップを搭載したMacbookシリーズが発表されました。
今まではIntelのCPUを搭載してきたMacbookですが、なんとApple社オリジナルのCPUを搭載してしまいました。結果的に金額はかなり安くなり、性能も大きく改善されているとAppleが公言しており、ベンチマークでも輝かしい結果を残しています。
僕が使っていたMacbookProに搭載されていたCPUよりもスコアが高い👀
「お、これはM1 Macありだなぁ」と考えておりましたが、当時、Twitterでは以下のような問題が確認されていました。
homebrew
が使えないDocker
が正式にサポートされていない(サポートされたとのことだったが、安定するかは不明)- プログラミング言語によってはM1対応がまだされていない
- M1搭載されていない新型Macbookが近々、発表されるのではないか
特にDocker
が使えないというのが、痛手でした。開発環境にDocker
を用いるのが当たり前となっていたので、購入を思い留まらせる大きな要素です。ところがある日、Docker
の公式よりM1に対応したという内容がアップされました。
いいや!限界だッ!買うねッ!
まだ上記の他の問題ありましたが、この勢いにのってしまおうと流されるままにM1 Macbookを買うことにしました。最後にM1 MacbookAirとM1 MacbookProのどちらがいいかなと悩みましたが、パフォーマンス比較を確認したところ、M1 MacbookAirとM1 MacbookProでほとんど違いがないようです。合わせて、個人的にTouchBarがあまり好きではないので、TouchBarが搭載されていないM1 MacbookAirの方が良いと判断しました。
端末名 | 発売年 | プロセッサ | シングルコア | マルチコア |
---|---|---|---|---|
MacBook Air(M1) | 2020 | Apple M1 | 1705 | 7220 |
MacBook Pro(13-inch, M1) | 2020 | Apple M1 | 1717 | 7602 |
とはいえメモリ8GBでは心許ないと思い、メモリだけは16GBにしました。グラフィックをいじったり機械学習をガンガン回すこともないので16GBで十分です。
購入してから二週間ほどしてM1を搭載したMacbookAirが我が家に到着しました🎉(写真を撮り忘れるorz)
2ヶ月使った感想 / 良かった点
使い方によって所感は変わってくると思うので、先に普段、僕がどのようにMacbookを使っているのかを記載しておきます。最も多いのはネットサーフィンです。不明点や疑問点を調べることが多いです。youtubeで動画を見ることもあります。 次に多いのはWEBアプリの開発、markdown形式でのブログ記事の執筆 & メモです。特に重い処理をやっているなと感じることはありません。どれも一般的なレベルの内容でしょう。
上記を踏まえてM1 MacbookAirを購入して良かった点から順に紹介していきます。
動作が圧倒的に早い
過去に使用していた2016年モデルのMacbookProと比べると圧倒的に早いです。 業務で使っている2019年のフルスペックのMacbookProにも負けない快適さを感じています。なんなら、「M1 MacbookAirの方が早いんじゃ...」と思っています。カクつく時間が圧倒的に少ないです。めちゃくちゃありがたい。 特定のソフトが軽いと感じるよりは平均的に全ての動作がスムーズになったという感じです。
今のところ、Macのローダー(虹色のぐるぐるするやつ)を一度も見ていません。
バッテリーの持ち時間が長い / めちゃくちゃ静か
購入したばかりなのでバイアスがあるのは承知ですが、バッテリーの持ちがかなり良いです。フル充電してから電源アダプターに接続せずに、8時間程度の作業をしてもバッテリーの充電残量が半分いくか、いかないかぐらいで残っています。Appleの公式を確認する限りは最大15時間程度は稼働できるとのことですので、間違っていないようです。
バッテリーと電源1 - 最大15時間のワイヤレスインターネット - 最大18時間のApple TVアプリのムービー再生 - 49.9Whリチウムポリマーバッテリー内蔵 - 30W USB-C電源アダプタ
電源アダプターを持っていかなくても1日は問題なく作業が出来るでしょう。
また、M1 MacbookAirはファンレスでめちゃくちゃ静かです。雑音が一切ありません。MacbookProを使っていた時、動作がカクついた時などにファンが一気に音を立てるのが気になっていました。しかも一度、音が鳴り出すと数分間はずっとうるさいんですよね。ファンレスになって、雑音が完全になくなり、ストレスから開放されました。
「おいおい、ファンが無いって熱は大丈夫なのか」と思われるかもしれませんが、キータイプをしていて本体が熱いなと感じたことは今のところありません。今後、気温が高くなるので、気になることがあれば、こちらに追加しようと考えています。
(というか業務で使っている2019年モデルのMacbookProの方がファンあるのに本体が熱くなりやすいと感じています🤔)
Dockerが問題なく使える
当初はDocker
が使えないという声をTwitterでよく見かけましたが、公式が発表した通り、Docker
を問題なく使えるようになりました。
以下の内容に従ってセットアップをするだけです。インストールも従来方法と変わりませんし、インストール作業中にトラブルは何も起きませんでした。
注意しなければいけない点としては、従来のM1対応されていないDocker
でもM1 Macbookにインストールをすることが出来てしまいますので、インストールするべきバージョンを確認した方が良いです。一度、誤って従来バージョンをインストールしてしまいました。インストール後にM1だと使えないよ?というエラーが出てきた時は驚きました👀
またdocker-compose
も問題なく使えます。
$ docker-compose up Docker Compose is now in the Docker CLI, try `docker compose up` Starting next_demo_client_1 ... done Attaching to next_demo_client_1 client_1 | client_1 | > with-firebase-hosting@5.0.0 dev client_1 | > next client_1 | client_1 | ready - started server on 0.0.0.0:3000, url: http://localhost:3000 client_1 | info - Using webpack 5. Reason: no next.config.js https://nextjs.org/docs/messages/webpack5 client_1 | event - compiled successfully
悪かった点
Node.js関連がフルサポートされていない
個人開発でフロントに、React.js
, Next.js
をよく使っています。また、バックエンドをサーバー用意してAPIやらを構築するとお金がかかってしまうことが多いのでサーバーレスに使えるFirebase
を合わせてよく使っています。なのでNode.js
には大変お世話になっています。いつものノリでcreate-react-app
を使って、新規のプロジェクトを作成してフロントを立ち上げようとしたら、以下のエラーが発生してしまいました。
<--- JS stacktrace ---> FATAL ERROR: wasm code commit Allocation failed - process out of memory 1: 0x1030059d8 node::Abort() [/Users/okb/.nodenv/versions/14.16.0/bin/node] 2: 0x103005b58 node::errors::TryCatchScope::~TryCatchScope() [/Users/okb/.nodenv/versions/14.16.0/bin/node] 3: 0x10311f330 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 4: 0x10311f2c4 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 5: 0x1036b4cbc v8::internal::wasm::WasmCodeAllocator::AllocateForCodeInRegion(v8::internal::wasm::NativeModule*, unsigned long, v8::base::AddressRegion, v8::internal::wasm::WasmCodeAllocator::OptionalLock const&) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 6: 0x1036b5950 v8::internal::wasm::NativeModule::CreateEmptyJumpTableInRegion(int, v8::base::AddressRegion, v8::internal::wasm::WasmCodeAllocator::OptionalLock const&) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 7: 0x1036b4618 v8::internal::wasm::NativeModule::AddCodeSpace(v8::base::AddressRegion, v8::internal::wasm::WasmCodeAllocator::OptionalLock const&) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 8: 0x1036b5760 v8::internal::wasm::NativeModule::NativeModule(v8::internal::wasm::WasmEngine*, v8::internal::wasm::WasmFeatures const&, v8::internal::VirtualMemory, std::__1::shared_ptr<v8::internal::wasm::WasmModule const>, std::__1::shared_ptr<v8::internal::Counters>, std::__1::shared_ptr<v8::internal::wasm::NativeModule>*) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 9: 0x1036b7cd4 v8::internal::wasm::WasmCodeManager::NewNativeModule(v8::internal::wasm::WasmEngine*, v8::internal::Isolate*, v8::internal::wasm::WasmFeatures const&, unsigned long, std::__1::shared_ptr<v8::internal::wasm::WasmModule const>) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 10: 0x1036c37e8 v8::internal::wasm::WasmEngine::NewNativeModule(v8::internal::Isolate*, v8::internal::wasm::WasmFeatures const&, std::__1::shared_ptr<v8::internal::wasm::WasmModule const>, unsigned long) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 11: 0x103692b34 v8::internal::wasm::AsyncCompileJob::CreateNativeModule(std::__1::shared_ptr<v8::internal::wasm::WasmModule const>, unsigned long) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 12: 0x103692cfc v8::internal::wasm::AsyncCompileJob::GetOrCreateNativeModule(std::__1::shared_ptr<v8::internal::wasm::WasmModule const>, unsigned long) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 13: 0x10369b360 v8::internal::wasm::AsyncCompileJob::PrepareAndStartCompile::RunInForeground(v8::internal::wasm::AsyncCompileJob*) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 14: 0x10369b12c v8::internal::wasm::AsyncCompileJob::CompileTask::RunInternal() [/Users/okb/.nodenv/versions/14.16.0/bin/node] 15: 0x103062c08 node::PerIsolatePlatformData::RunForegroundTask(std::__1::unique_ptr<v8::Task, std::__1::default_delete<v8::Task> >) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 16: 0x1030618a0 node::PerIsolatePlatformData::FlushForegroundTasksInternal() [/Users/okb/.nodenv/versions/14.16.0/bin/node] 17: 0x103818c00 uv__async_io [/Users/okb/.nodenv/versions/14.16.0/bin/node] 18: 0x10382a7c0 uv__io_poll [/Users/okb/.nodenv/versions/14.16.0/bin/node] 19: 0x103819090 uv_run [/Users/okb/.nodenv/versions/14.16.0/bin/node] 20: 0x10308de7c node::worker::Worker::Run() [/Users/okb/.nodenv/versions/14.16.0/bin/node] 21: 0x103090b90 node::worker::Worker::StartThread(v8::FunctionCallbackInfo<v8::Value> const&)::$_3::__invoke(void*) [/Users/okb/.nodenv/versions/14.16.0/bin/node] 22: 0x19534206c _pthread_start [/usr/lib/system/libsystem_pthread.dylib] 23: 0x19533cda0 thread_start [/usr/lib/system/libsystem_pthread.dylib] Abort trap: 6
エラーを見てみると、メモリ関連でWASM(WebAssembly)
を使っている箇所でエラーが出ているのでしょうか。
FATAL ERROR: wasm code commit Allocation failed - process out of memory 1: 0x1030059d8 node::Abort() [/Users/okb/.nodenv/versions/14.16.0/bin/node]
詳しくない領域なので、何が原因で発生しているエラーなのかまでは特定できませんでしたが、M1 MacbookAirに買い替える前からNode.js
は14系を使っており、version管理にはnodenv
を使っていました。なので、M1 Macbookに買い替えたことで発生したエラーということになります。
(Node.js
を14系にしているのはcloud function
の最新対応versionが14系だからです)
この問題は15系で公式に解消されたようです。また、合わせて14.17でも解消されたようですがパッチの配布元が公式ではなく個人とのことで、使用するかどうかは自己責任になります。
僕はDocker
でcontainer内で実行させることで、この問題を回避しています。Docker
最高。使えて本当に良かったです。
ドキュメントが更新されていない場合がある
よくインストールページにWindowsの方はこちら、MacOSの方はこちら...という記載があることがあります。しかし、サイトによってはM1 Macbookへのインストールを想定していないことがあり、従来のまま更新されていないことがほとんどです。そのため、MacOS環境へ提供されているインストーラーを使っても、上手くインストールが出来ないことがあります。
Docker
でこの問題に遭遇しました。今では、分かりやすく専用ページが作られて何をインストールすれば良いかが明確になりました。また、Elixir
かhaskell
をインストールしようとした時にも同じ問題に遭遇した記憶があります。結局はどちらもbrew
経由でインストールしました。
それでもダメな時はDocker
でイメージをbuildしてあげれば何とかなるので、特定の言語が使えない!という状況は現在ではほとんど発生しておりません。
その分、Dockerfile
だったりを用意したり、brew
しか選択肢がないという状況が発生するので、嫌な人にはつらいかもしれません😅
キーボードの打感が軽すぎる
これは好みの問題なので、あまり言及するつもりはないのですが、元々使っていた2016年モデルのMacBookProがバタフライキーボードでした。M1 MacbookAirに搭載されているMagic keyboardの打感が軽すぎて、中々、慣れることが出来ません。とはいえ、外部キーボードを使えば何の問題もなかったりするので、それほど大きな問題ではないかなと思っています。
自分は付属のキーボードを使う派なので、少し気にしています。机が狭くなるのが嫌なのです🙇♂️
片手で開閉する際にディスプレイ側に倒れる(追加: 2021/08/02)
MacbookAirが物理的に閉じている状態の場合に、使用するために当然、開閉をする必要があります。以前、MacbookProを使っていたand業務でMacbookProをずっと使っているので、片手で開けようとしてしまう癖が付いています。
M1 MacbookAirはキーボード側の重量が軽いためか、片手で開閉を行おうとすると、ディスプレイ側に傾きキーボードが浮いてしまいます。そのまま片手で開閉しようものなら、後ろに倒れてしまいます。
キーボード側を押さえながら開閉すれば良いだけなのですが、地味に気になっているポイントです。
scikit-learn, scipyのインストールに失敗する(追加: 2022/07/06)
先ほどM1 MacbookAirで機械学習をやることはないと書きましたが、副業で機械学習(python)をやらせて頂くことになりました。 最初はライトな内容だったので、GoogleColaboratoryで事足りていましたが、実行に2時間を超過するケースや、出力結果が消えてしまい前回の途中から実施できないという問題があり、手元のPCで実行することになりました。
まず、問題となったのはscikit-learn, scipyといったpythonで機械学習をやるならほぼ必須のライブラリがM1 MacbookAirだとインストールに失敗するということです。
一応、回避策はありインストールをすることが可能ですが、手順が面倒なのと自分がよく分からないものをインストールしたくないという気持ちがあり、結局Dockerでコンテナを作って、その中でインストールしています。
同じ悩みを持つ方から、教えて頂いたscipy-noteboookを愛用しています。
総評
M1 MacbookAirは間違いなく買って良かったと言えます。性能面でも快適さを感じますし、現状ではこれといって、大きな問題になっていることはありません。悪かった点でNode.js
がサポートされていないと書きましたが、現在の最新versionではサポートされているようです。M1への対応も各所でどんどん進められています。
とはいえ、情報量がまだ少ないというのも事実なので、購入される方は「問題が起きても何とかするぞ」という気持ちでいた方がいいかなと思います。
ありがとうM1 Macbook!買って良かった🎉🎉🎉