Cài đặt môi trường trên Macbook Pro M1
Chào các bạn, chào mừng các bạn đã quay lại blog của mình. Khi lập blog mình đã nghĩ đây chỉ là một nơi chia sẻ kiến thức đơn thuần thôi, nhưng rồi mình cũng tự nhận thấy như vậy thì nhạt nhẽo quá, mà các bài viết của mình chưa chắc đã phải là kiến thức cao siêu mà các bạn chưa hề biết tới. Vì thế mà mình quyết định viết thêm một chủ đề để chia sẻ thêm những nội dung về đời sống, công việc hằng ngày của mình.
Chả là gần đây mình mới đổi việc và chuyển sang một công ty làm remote. Chính vì là làm remote fulltime nên công ty có chính sách hỗ trợ nhân viên chính thức mua Macbook để phục vụ công việc. Chính vì là có cái chính sách như vậy nên ngay sau khi pass probation, mình đã quyết định sắm ngay một chiếc Macbook Pro với chip M1.
Đây là lần đầu tiên mình mua đồ mà không xem review một chút nào, vì mình nghĩ là đồ của Apple thì auto là tốt rồi và chip M1 thì ai cũng nói về nó và về hiệu năng của nó. Thế nên là mình quyết định xách người đi mua luôn mà không cần hỏi han nhiều.
Chiếc máy mình mua là Macbook Pro 2020, bản 16GB RAM và 512GB SSD.
Chắc hẳn sẽ có nhiều người hỏi là tại sao 2021 rồi, Macbook Pro 2021 cũng sắp về Việt Nam rồi, sao không đặt hàng hoặc chờ mua bản 2021 ấy? Nhưng lý do đơn giản là vì mình không có tiền 🥲. Và hiệu năng của con máy Macbook Pro 2021 thật sự cũng hơi thừa so với nhu cầu để lập trình của mình, nó phù hợp với dân làm content và video creator nhiều hơn nhờ vào số lượng nhân GPU “khổng lồ”.
Chip M1 có gì hot?
Chip này có gì hot mà mình lại có thể đâm đầu mua mà không tìm hiểu trước như vậy. Mình sẽ không phân tích chuyên sâu, nhưng mình có thể tóm gọn lại bằng các điểm nổi bật sau:
Tiết kiệm điện năng

Điểm đầu tiên mình muốn nói đến là chip M1 vô cùng tiết kiệm.
Sau khi mua máy về và sạc đầy máy, mình đã sử dụng liên tục cả ngày, khoảng hơn 10 tiếng đồng hồ và sau khi sử dụng xong máy vẫn còn đến hơn 20% pin. Trong khi làm việc thì mình thường sử dụng VSCode để lập trình, bật các server nodeJS, Rails, chạy Docker, trình duyệt web.
Trong khi với con laptop lenovo cũ của mình cài Ubuntu, thì cứ cách 2 – 3 tiếng là mình lại phải cắm sạc một lần.
Lý do mà nó có hiệu năng vượt trội hơn nằm ở chính cái kiến trúc nhân xử lý ARM:
- Nó có khả năng chia nhân CPU thành 2 loại: hiệu năng cao và hiệu năng thấp phù hợp với tác vụ công việc đang sử dụng.
- Đồng thời nó được tích hợp chip xử lý RAM, GPU, mạng, các cổng kết nối nên nó giúp giảm thời gian trao đổi dữ liệu nhờ đó tiêu thụ ít năng lượng hơn.
Tốc độ xử lý cao hơn
Nhờ việc tích hợp chip xử lý tác vụ lại vào với M1 nên tốc độ trao đổi dữ liệu của nó nhanh và dẫn đến xử lý nhanh hơn rất nhiều. Chip M1 có tốc độ xử lý CPU nhanh hơn đáng kể so với chip Intel trên các đời máy thế hệ trước đó và kể cả so với chip trên các dòng máy PC.
Bản thân mình sau một thời gian sử dụng cũng thấy các tác vụ như boot máy, start các server rails, nodejs hay thời gian bật app cũng nhanh hơn rất nhiều khi sử dụng laptop cài Ubuntu và PC.
Sử dụng được App iOS
Một điểm thú vị khác là vì sử dụng kiến trúc ARM nên giờ đây Macbook có thể sử dụng được khá nhiều app điện thoại trên iOS. Điều này khá tiện dụng khi có thể tải trực tiếp ứng dụng từ App Store về và một số ứng dụng có giao diện mobile đẹp và dễ sử dụng hơn.
Có nên sử dụng Mac M1 cho lập trình?
Vậy kết luận lại là có nên sử dụng Macbook với chip M1 để lập trình không. Hiệu năng và tốc độ xử lý hoàn hảo như vậy cơ mà? Thì thực ra, câu trả lời nằm ở nhu cầu và những phần mềm bạn sử dụng cho lập trình.
Mình đã mất nguyên 1 ngày chỉ để cài đi cài lại các package cũng như setup môi trường cho việc lập trình – thứ mà thường chỉ mất 1 đến 2 tiếng, cùng lắm là một buổi chiều của mình.
Nguyên nhân là đây cũng là lần đầu mình sử dụng MacOS, và cũng nằm ở chính cái con chip M1 này. Vì kiến trúc của nó là ARM, nên những package thông thường mà bạn sử dụng với các máy sử dụng chip Intel không phải sẽ hoạt động ngay khi lúc bạn cài đặt xong. Nó không lỗi runtime thì cũng là lỗi compile trong quá trình cài đặt.
Đối với mình là một lập trình viên Ruby, thì khi cài đặt những phiên bản ruby mới từ 2.7 trở lên, mọi thứ diễn ra rất tốt. Nhưng khi làm việc với những dự án mà yêu cầu các phiên bản cũ hơn, thì cái máy của mình bắt đầu chập cheng. 😭
Vì sử dụng chip M1 nên đôi khi có những thư viện hay ứng dụng không có sẵn tương thích với ARM nên khi tải các package cũ, nó luôn bắt mình phải compile lại, dẫn đến thời gian cài đặt của một package lâu như chờ thưởng ngày tết. Chưa kể là khi nó chạy đến gần cuối thì lúc đấy nó mới bắt đầu xuất hiện lỗi và lúc đấy đã tốn chục phút cuộc đời rồi.
Vì vậy, mình khuyên các bạn đang có ý định mua Macbook Pro M1 nên tham khảo sự tương thích của các ứng dụng các bạn sử dụng để lập trình trước khi mua. Các bạn nên chú ý cả vào phiên bản nữa khi tham khảo link trên, bởi lẽ mình biết là không phải dự án nào cũng luôn sử dụng stack công nghệ với version mới nhất.
Cài đặt môi trường để lập trình Rails
Nếu bạn là Ruby developer thì các bạn tham khảo tiếp cách cài đặt mình dùng sau đây, mình đã thử và đảm bảo work trên cả các version cũ. Còn với các bạn không phải là ruby developer thì mình nghĩ vẫn có thể sử dụng được hướng dẫn sau đây, vì mình nghĩ nó cũng work với nodejs, php, hay python…
Những thứ mà bạn cần cài đặt trước tiên khi muốn lập trình trên Macbook M1:
- Rosetta 2
- Developer CommandLine Tool
- Homebrew
- Version manager: ASDF
Rosetta 2
Mình đã thử dùng các package, thư viện trực tiếp trên kiến trúc ARM của chip M1, nhưng nói thật là kể cả có cài đặt thành công đi chăng nữa thì sau đó đến lúc start development server hay chạy lệnh migrate db là một đống lỗi nhảy tùm lum trên terminal liền. Vì vậy mình bắt buộc phải chuyển sang sử dụng Rosetta 2 để đỡ tốn thời gian mò mẫm nữa.
Rosetta là một trình giả lập (emulator) được thiết kế để có thể biên dịch các tập lệnh trên Intel để sử dụng được trên M1. Vì các ứng dụng trên Intel có một tập lệnh riêng để giao tiếp vì vậy chúng không thể chạy trực tiếp trên M1 được.
Khi chạy ứng dụng chứa tập lệnh của Intel, Rosetta sẽ tự động start và bắt đầu quá trình biên dịch. Các bạn yên tâm là nó sẽ chỉ chậm một lần khởi động khi quá trình biên dịch này diễn ra thôi, từ lần chạy sau nó sẽ không còn chậm nữa.
Để cài đặt Rosetta 2 các bạn sử dụng Terminal:
$ softwareupdate --install-rosetta --agree-to-license
option --agree-to-license
sử dụng để bỏ qua bước confirm license. Sau khi quá trình cài đặt hoàn tất, bạn có thể launch cứ ứng dụng nào với Rosetta. Ở đây, để phục vụ mục đích lập trình, ta sẽ làm như sau:
- Bật Finder -> Applications -> Utilities -> right click vào biểu tượng Terminal -> chọn Get Info
- Chọn Option
Open with Rosetta
- Tắt cửa sổ sau đó thoát hoàn toàn Terminal bằng ⌘+
Q
- Sau khi bật lại Terminal ta có thể xác minh bằng lệnh:
uname -m
. Nếu cài đặt thành công nó sẽ trả vềx86_64
- Ta có thể chọn Duplicate Terminal lên và đặt tên nó là Rosetta Terminal để khỏi phải cài đặt qua lại khi muốn chuyển về M1.
Command Line Tools
Cũng giống như khi cài đặt môi trường trên Ubuntu, chúng ta phải cài các thư viện phục vụ cho việc lập trình, biên dịch điển hình như là build-essentials
. Trên MacOS chúng ta cũng phải cài một bộ công cụ tương đương như vậy đó là XCode CommandLineTools.
Nếu bạn là lập trình viên iOS hay ứng dụng cho Macbook. Bạn cần tải toàn bộ XCode tại App Store. Còn nếu bạn chỉ là lập trình viên Web, bạn chỉ cần cài bộ CommandLineTool là vừa đủ mà lại nhẹ nhàng. Bật terminal rosetta mà bạn vừa cài đặt và gõ:
$ xcode-select --install
Một cửa sổ popup sẽ hiện lên và bắt đầu quá trình cài đặt. Sau khi chạy xong chúng ta confirm lại bằng lệnh:
$ xcode-select -p
/Library/Developer/CommandLineTools
Nếu trả về như trên là đã thành công.
Homebrew
Bước tiếp theo chúng ta cài đặt Homebrew, đây là một package manager phổ biến và hay được sử dụng trên Macbook, mỗi tội nó không được cài đặt mặc định. Ta có thể làm theo hướng dẫn trên trang chủ của Homebrew:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Sau khi cài đặt xong chúng ta confirm bằng lệnh:
$ brew --prefix
/usr/local
$ brew doctor
Your system is ready to brew.
Lệnh đầu đảm bảo chúng ta đang dùng Terminal Rosetta (nếu dùng Terminal mặc định với ARM, nó sẽ có prefix là /opt/homebrew
)
Với lệnh sau nếu hiện như ví dụ trên thì bạn đã cài đặt thành công. Nếu nó hiện ra bất kì warning nào, hãy chạy các lệnh theo hướng dẫn của brew đến khi có được kết quả như trên.
asdf
asdf
là một công cụ quản lý nhiều loại runtime versions như của ruby, java, php, scala, nodejs… Với asdf
chúng ta sẽ không cần phải cài đặt nhiều công cụ quản lý version như rbenv, nvm, … Rất tiện lợi và dễ dùng.
Với mỗi dự án, chúng ta có thể tạo một file quản lý version tập trung gọi là .tool-versions
. Ví dụ, với một dự án ruby của mình sử dụng ruby 2.6.6 và node 12.18.3 sẽ như sau:
ruby 2.6.6
nodejs 12.18.3
Một công cụ quản lý version của một ngôn ngữ cụ thể được gọi là plugin, ví dụ mình muốn cài đặt công cụ quản lý version cho ruby thì mình cài đặt ruby plugin:
asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git
Sau khi cài đặt plugin ruby xong chúng ta có thể cài đặt bất kỳ phiên bản ruby nào bằng lệnh:
asdf install ruby 2.6.6
Tương tự với nodeJS chúng ta cũng sẽ làm các bước như trên. Để biết được asdf có những plugin nào chúng ta có thể chạy lệnh:
$ asdf plugin list all
1password-cli https://github.com/NeoHsu/asdf-1password-cli.git
R https://github.com/asdf-community/asdf-r.git
act https://github.com/grimoh/asdf-act.git
...
allure https://github.com/comdotlinux/asdf-allure.git
alp https://github.com/asdf-community/asdf-alp.git
ansible-base https://github.com/amrox/asdf-pyapp.git
...
asciidoctorj https://github.com/gliwka/asdf-asciidoctorj.git
aws-copilot https://github.com/NeoHsu/asdf-copilot
aws-iam-authenticator https://github.com/stefansedich/asdf-aws-iam-authenticator.git
aws-nuke https://github.com/bersalazar/asdf-aws-nuke.git
aws-sam-cli https://github.com/amrox/asdf-pyapp.git
aws-vault https://github.com/karancode/asdf-aws-vault.git
awscli https://github.com/MetricMike/asdf-awscli.git
awsebcli https://github.com/amrox/asdf-pyapp.git
babashka https://github.com/fredZen/asdf-babashka
bashbot https://github.com/mathew-fleisch/asdf-bashbot.git
bat https://gitlab.com/wt0f/asdf-bat.git
batect https://github.com/johnlayton/asdf-batect.git
Đây là một công cụ khá hữu ích cho lập trình viên khi không phải đau đầu cài đặt và config cho bất kỳ version manager nào khác.
Và thế là xong, chiếc Macbook M1 của bạn đã có thể sẵn sàng cho công việc lập trình rồi. Thú thực là lúc bỏ ra một ngày để cài đặt theo những tutorial mới có, cũ có trên mạng thì mình thấy rất nản và hối hận khi đã sắm chiếc M1 này. Nhưng sau khi cài đặt thành công và sử dụng, chứng kiến nó có một thời lượng pin trâu và máy vô cùng mát, mình đã có suy nghĩ là nó rất đáng tiền.
Tuy nhiên là mình vẫn lưu ý là các bạn cần kiểm tra kỹ tính tương thích của chip M1 với những dự án sử dụng những thư viện mà bạn đang làm việc, và suy nghĩ trước khi xuống tiền nhé. Chúc các bạn thành công.
不知道说啥,开心快乐每一天吧!