如何優雅地使用 macOS

iTwocucao發表於2019-03-04

當時寫這篇文章的時候才接觸 mac 沒多久,使用快兩年之後,再次修訂了本文。

0x00 前言

談及 macOS , 很多人喜歡和 Win 比個高下。在我看來, Win 雖在非程式設計類生態和易用性比 Mac 要好很多,可專業人士之所以專業是因為他能挑選適合的武器發揮最大的效用,不是嗎?

適合自己的,能讓自己用最大效率生產或者是娛樂的,才是更好的工具。

Win 的優點如下:

  • 優良的相容性。
  • 由於出自於什麼都愛做的微軟公司,從整體來說,VS,.NET, 遊戲性,相容性,效能,新手上手速度來說,都是遙遙領先 Mac 的。

Win 的缺點如下:

  • 微軟的戰線實在是拉的太長,什麼都想做,什麼都想壟斷。於是,與之服務密切相關的公司也就受到了 MS 的牽制。這對大公司來說,幾乎是不能夠忍受的行為。矽谷的公司使用微軟服務的也就接近 5%(可能有誤差)。
  • 糟糕的終端環境(DOS)和無法與、*nux 世界的指令碼友好相處使得系統的可定製性和進階操作性大大降低。
  • 雖然有 Everything,TotalCMD,AHK 這種神級輔助工具可以滿足定製要求。但由於過高的學習成本(哈哈哈,混亂也是學習成本之一,AHK 語言真的很混亂啊,TC 實在是太不人性化了)。
  • Python 的環境配置實在是太頭疼了

Win 的缺點就是我切到 Mac 上面的原因。

macOS 的優點如下:

  • Mac 的好在於終端和美觀的圖形的結合。適合不是微軟技術棧和重度 Office 的使用者。
  • *nux 應用的方便以及非常容易與指令碼檔案配合出強大的組合技能。
  • 反觀 Win 上,則這種組合技能則在環境配置上和操作流暢度上差了很多。

macOS 的缺點如下:

  • 娛樂專案實在是少的要死。Metal 和 DirectX 相差不是一點點。
  • 軟體和有些少的不只一點點。

本文從下面幾處入手,分別從下面幾個角度介紹了 macOS

▼ 如何優雅地使用 macOS
    0x00 前言
▼ 0x01 系統內建
    1.1 系統設定
    1.2 自帶軟體
    1.3 快捷鍵與觸控板
▼ 0x02 必備軟體
    2.1 必備軟體 之 日常必備
    ▼ 2.2 必備軟體 之 開發必備
        2.2.1 GUI 應用
        2.2.2 CMD 命令
    ▼ 2.3 必備軟體 之 程式語言
        2.3.1 Shell
        2.3.2 Python
▼ 0x03 踩坑史
    ▼ 3.1 日常類
        01. 時間機器無法完成備份
        02. 下載站的軟體包顯示損壞
    ▼ 3.2 程式設計類
        01. homebrew 的與 Python 的問題
    0xEE 參考連結複製程式碼

0x01 系統內建

1.1 系統設定

General

  • 預設瀏覽器 : Google Chrome

Decktop & Screen Saver

  • 桌面 / 屏保

Language & Region

  • 語言
  • 地區設定

Security & Privacy

  • 防火牆

Sharing

  • Remote Control – SSH

Trackpad

  • 設定手勢
  • 滾輪 Scrool Direction : Natural

1.2 自帶軟體

  • iTunes
  • iPhoto
  • iMessage
  • SpotLight -> Alfred 3

1.3 快捷鍵與觸控板

  • cmd 為 command 按鍵,通常情況下為所有桌面程式通用性的快捷鍵。
  • ctrl ,通常情況下是針對程式的功能進行加強,並且此功能往往是非 cmd 類(視窗操作,選擇,複製貼上等等)操作。
  • shift 按鍵通常用於加強操作。一般會讓操作更進一步 or 相反操作。

  • cmd+tab =~ alt+tab 程式之間的切換

  • cmd+` 應用內視窗切換

  • cmd+h 視窗 hide

  • cmd+m 視窗 minimize
  • cmd+n 新建視窗
  • cmd+o 開啟
  • cmd+s 儲存
  • cmd+shift+s 另存為
  • cmd+p 列印 print
  • cmd+w 關閉
  • cmd+q quit

  • cmd+a select all

  • cmd+i show info
  • cmd+n create a new folder
  • cmd+f search
  • cmd+c copy
  • cmd+v paste
  • cmd+delete 刪除選中檔案
  • cmd+shift+delete 清空回收站

  • cmd+= 放大

  • cmd+- 縮小
  • cmd+t 新建選項卡
  • cmd+r 重新整理

  • cmd+shift+3 擷取整個螢幕

  • cmd+shift+4 擷取選擇區域
  • cmd+shift+4+SPACE 擷取選擇視窗
  • cmd+ 滑鼠點選 -> 選中不連續檔案
  • control+ 滑鼠點選 -> 相當於 win 中右鍵點選

  • fn+left home

  • fn+right end
  • fn+up pageup
  • fn+down pagedown

觸控板手勢:

  • 點選

    • 單指點選 – 單擊
    • 單指滑動 – 滑動滑鼠游標
    • 雙指點選 – 相當於 Windows 的滑鼠右鍵
    • 三指點選 – 劃詞查詢
  • 滑動與縮放

    • 雙指上下滑動 – 滾動
    • 雙指縮放 – 與 Android 上圖片縮放一致
    • 雙指雙擊 – 只能縮放
    • 雙指旋轉 – 旋轉
    • 雙指左右滑動 – 應用內切換網頁
    • 雙指頭從右往左
    • 三指頭左右滑動 – 全螢幕 App 切換
    • 大拇指和食中無名縮放 – launchpad

0x02 必備軟體

2.1 必備軟體 之 日常必備

  • 啟動器

    • Alfred 3
    • SpotLight
  • 網路工具

    • Chrome
  • 社交通訊

    • QQ
    • WeXin
  • 圖形影像

    • Adobe PhotoShop CC
    • Adobe PhotoShop LightRoom
    • Sketch
    • Annotate
    • Camtasia 2
    • Snagit
    • ScreenFlow
    • Final Cut Pro
    • MPlayerX
    • QuickTime
    • iQiyi
    • NeteaseMusic
    • IINA
  • 辦公軟體

    • 歐陸詞典
    • Calibre
    • Wiznote
    • PDF Reader
    • iBook
    • Microsoft Office
    • Work 套件:包括 pages, numbers, keynote
    • XMind
    • Airmail
    • TeamViewer
    • OmniFocus
    • OmniGraffle
    • OmniOutline
    • OmniPlan
  • 系統軟體

    • 搜狗輸入法
    • AppCleaner
    • CleanMyMac
    • VMWare
    • BetterZip
    • Caffeine / Amphetamine
    • PopClip
    • HandShaker
    • AirDroid

2.2 必備軟體 之 開發必備

2.2.1 GUI 應用

  • 終端使用者

    • iTerm2
  • IDE

    • PyCharm
    • IntellijIDEA
    • WebStorm
  • 編輯器

    • MacVim 配合 C-VIM
    • Sublime Text 3
  • 後臺元件

    • MySQL
    • PostgreSQL
    • Redis
    • MongoDB
  • 資料庫管理軟體

    • Navicat
    • Datagrip
    • RoboMongo
    • RDM
    • Dash
  • 網路工具

    • SS QT
    • Charles, Wireshark
  • Chrome

    • Exporter : 百度雲,需要離線安裝
    • AdBlock : 廣告攔截
    • AutoPatchWork : 連結下一頁
    • Axure RP Extension : Axure
    • CSSViewer
    • Dream Afar New Tab
    • JSON Editor
    • JSON View
    • Octotree
    • One-Click Extensions Manager
    • Proxy SwitchyOmega
    • React Developer Tools
    • Redux DevTools
    • Vue.js devtools
    • Vimium
  • 程式碼倉庫

    • Github Desktop
    • SourceTree
  • GIS 相關

    • ArcGIS
    • QGIS
    • PostgreSQL + PostGIS

2.2.2 CMD 命令

if test ! $(which brew); then
    echo "Installing homebrew..."
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

# Make sure we’re using the latest Homebrew.
brew update

# Upgrade any already-installed formulae.
brew upgrade --all

# Install GNU core utilities (those that come with OS X are outdated).
# Don’t forget to add `$(brew --prefix coreutils)/libexec/gnubin` to `$PATH`.
brew install coreutils
sudo ln -s /usr/local/bin/gsha256sum /usr/local/bin/sha256sum

# Install some other useful utilities like `sponge`.
brew install moreutils
# Install GNU `find`, `locate`, `updatedb`, and `xargs`, `g`-prefixed.
brew install findutils
# Install GNU `sed`, overwriting the built-in `sed`.
brew install gnu-sed --with-default-names
# Install Bash 4.
brew install bash
brew tap homebrew/versions
brew install bash-completion2
# We installed the new shell, now we have to activate it
echo "Adding the newly installed shell to the list of allowed shells"
# Prompts for password
sudo bash -c `echo /usr/local/bin/bash >> /etc/shells`
# Change to the new shell, prompts for password
chsh -s /usr/local/bin/bash

# Install `wget` with IRI support.
brew install wget --with-iri

# Install RingoJS and Narwhal.
# Note that the order in which these are installed is important;
# see http://git.io/brew-narwhal-ringo.
brew install ringojs
brew install narwhal

# Install Python
brew install python
brew install python3

# Install ruby-build and rbenv
brew install ruby-build
brew install rbenv
LINE=`eval "$(rbenv init -)"`
grep -q "$LINE" ~/.extra || echo "$LINE" >> ~/.extra

# Install more recent versions of some OS X tools.
brew install vim --override-system-vi
brew install homebrew/dupes/grep
brew install homebrew/dupes/openssh
brew install homebrew/dupes/screen
brew install homebrew/php/php55 --with-gmp

# Install font tools.
brew tap bramstein/webfonttools
brew install sfnt2woff
brew install sfnt2woff-zopfli
brew install woff2

# Install some CTF tools; see https://github.com/ctfs/write-ups.
brew install aircrack-ng
brew install bfg
brew install binutils
brew install binwalk
brew install cifer
brew install dex2jar
brew install dns2tcp
brew install fcrackzip
brew install foremost
brew install hashpump
brew install hydra
brew install john
brew install knock
brew install netpbm
brew install nmap
brew install pngcheck
brew install socat
brew install sqlmap
brew install tcpflow
brew install tcpreplay
brew install tcptrace
brew install ucspi-tcp # `tcpserver` etc.
brew install homebrew/x11/xpdf
brew install xz

# Install other useful binaries.
brew install ack
brew install dark-mode
#brew install exiv2
brew install git
brew install git-lfs
brew install git-flow
brew install git-extras
brew install hub
brew install imagemagick --with-webp
brew install lua
brew install lynx
brew install p7zip
brew install pigz
brew install pv
brew install rename
brew install rhino
brew install speedtest_cli
brew install ssh-copy-id
brew install tree
brew install webkit2png
brew install zopfli
brew install pkg-config libffi
brew install pandoc

# Lxml and Libxslt
brew install libxml2
brew install libxslt
brew link libxml2 --force
brew link libxslt --force

# gitbook autocover
brew install pkg-config cairo pango libpng jpeg giflib

# Install Cask
brew install caskroom/cask/brew-cask
brew tap caskroom/versions

# aerial 屏保
# https://github.com/JohnCoates/Aerial
brew cask install aerial
# https://github.com/sindresorhus/quick-look-plugins
brew cask install qlcolorcode qlstephen qlmarkdown quicklook-json qlprettypatch quicklook-csv betterzipql qlimagesize webpquicklook suspicious-package quicklookase qlvideo

brew update && brew upgrade --all && brew cleanup && brew prune複製程式碼

2.3 必備軟體 之 程式語言

2.3.1 Shell

MAC 使用的大多命令列工具來自於 FreeBSD , 並不是來自 GNU , 所以很多命令會與常規的 linux 命令大同小異。

而本人喜歡 GNU 系軟體。

Shell 指令碼可參考我的筆記。 第九節如何優雅的使用 Shell_

說到 shell, 除了要使用 bash 的 shell 之外,zsh 的 shell 也值得一試。(不過大神 kennethreitz 最喜歡 fish shell )

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"複製程式碼

2.3.1.1 Oh My Zsh

2.3.2 Python

筆者雖然也接觸過很多語言,都是粗淺一過,但無一精通,唯一可以稍微談談的就是 Python 語言。

當然,安裝完畢自然是可以參考一下我的 第三節 Pythonista 的工具集_

國內外網路環境不通暢,安裝與配置環境這件小事也就成了一個大事情。

我對於 Python 版本的安裝 和 Python 依賴包管理有三個階段:

  • 入門級
  • 新手級
  • 熟手級

2.3.2.1 入門級

最初是入門級,我配置環境和大部分的 Pythonista 一樣,最初版:

  • 面對 Python 版本的管理,乾脆就是不管理,brew 安裝一個 Python2 用於開發 Python2 的程式碼,brew install 一個 Python3 用於 Python3 的程式碼開發。
  • 面對 Python 依賴包管理,乾脆就是直接使用 virualenv 或者他的 wrapper 直接 venv 一個環境,然後 active 一下,接著 PIP install -r req.txt

2.3.2.2 新手級

  • 面對 Python 版本的管理,使用 pyenv
  • 面對 Python 依賴包管理,使用 pyenv virtualenv 出多個環境,然後切換環境就好了。

brew install pipenv
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo `export PYENV_ROOT="$HOME/.pyenv"` >> ~/.zshrc
echo `export PATH="$PYENV_ROOT/bin:$PATH"` >> ~/.zshrc
echo `eval "$(pyenv init -)"` >> ~/.zshrc
echo `eval "$(pyenv virtualenv-init -)"` >> ~/.zshrc

# 接著另開終端
# 不喜寫相容程式碼,所有程式碼均向 3.5+ 靠攏
v=3.5.2|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
v=3.6.0|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
v=2.7.11|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
# 可以先用迅雷把 官網的 Anaconda3-4.4.0-MacOSX-x86_64.sh 下載下來,然後
mv Anaconda3-4.4.0-MacOSX-x86_64.sh ~/.pyenv/cache/ && pyenv install anaconda3-4.4.0

# 設定 Global Python 為 2.7.11, 備註:儘量不要把 Py3 設定為全域性,否則由於 Homebrew 本身有一些依賴是依賴於 Py2 的,這樣容易出現一些奇怪的問題。
pyenv global 2.7.11
pip install -i https://pypi.doubanio.com/simple requests
# 下面這個是用於安裝基本的程式碼補全功能
pip install -i https://pypi.doubanio.com/simple --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5" flake8 pytest autoflake hy

# 建立最常用 Py3 虛擬環境
pyenv virtualenv 3.5.2 py3-daily
pyenv activate py3-daily
pip install -i https://pypi.doubanio.com/simple requests
pip install -i https://pypi.doubanio.com/simple beatutifulsoup4
pip install -i https://pypi.doubanio.com/simple ipython[notebook]
pip install -i https://pypi.doubanio.com/simple jupyter
# 下面這個是用於安裝基本的程式碼補全功能
pip install -i https://pypi.doubanio.com/simple --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5" flake8 pytest autoflake hy

# 建立 Anaconda 的資料科學 AI 環境
pyenv virtualenv anaconda3-4.4.0 py3-ai
pyenv activate anaconda3-4.4.0/envs/py3-ai
pyenv deactivate

# 進入一個專案之後
pyenv activate py3-proj
pip install -r requirements/local.txt
pip install -r requirements/prod.txt
# requirements/local.txt 與 requirements/prod.txt 依賴於 requirements/base.txt複製程式碼

2.3.2.3 熟手級

其實,第一種入門級管理方式弊病在於,python 版本太粗糙,之前遇到一個 python3.3 的問題,python3.4 就解決了。而為了避免這種奇葩的版本差異帶來的潛在風險,開發與部署一般要鎖死 Python 版本。

即便是解決了入門級管理方式帶來的版本管理粗糙的問題,同樣的,依賴也要鎖死。一個專案對應一種環境該多好 通過 PIP 的確可以用 freeze 輸出為 txt 達到鎖死的目的。但個人認為,這個還不夠,至少要知道依賴樹之類的吧?還要知道哪些東西是可以更新的吧?

而且,就應該像 node 專案裡面的 package.json 一樣,把依賴什麼亂七八糟的東西都放進去才好。

  • 面對 Python 版本和依賴包管理,使用 pipenv

這代表著,只要一個就行了。

2.3.3 JavaScript 與 Node 環境

nvm && npm && yarn

nvm 主要使用者管理 node 的版本,linux / mac only ,windower 最好下載 node 版本安裝,記得配置環境變數。

npm 主要使用者管理包,國內人喜歡使用 cnpm, 但是 cnpm 包管理比較渣,所以一般情況下選擇 Yarn 配合管理

npm install cnpm
cnpm install yarn -g
# 檢視下載源
# yarn config get registry
yarn config set registry https://registry.npm.taobao.org複製程式碼

yarn 在使用包管理的時候會分析依賴,這對總是 BUG 不斷的 node_module 簡直是福音。

2.3.4 Java

Java 環境安裝稍微有一丟丟蛋疼。特別是多版本管理。

TODO: 以後補充 JAVA 環境安裝複製程式碼

2.4 必備配置 之 dotfiles

詳細內容請見 yadotfiles

  • 依照我個人的習慣,在 OhMyZsh 基礎上增加了個人習慣的環境變數的配置,一些函式的封裝。

比如,當我在寫本文的目錄中輸入 todos, 就可以檢視該我在寫文章的時候裡面挖了多少個還沒有填上去的 TODO(坑)。如下

3e383c54 (Micheal Gardner 2017-11-18 12:40:38 +0800 422) ## 0xEE TODO TO LIST
ae86b7cb (Micheal Gardner 2017-11-19 21:39:49 +0800 245) ### 5. TODO
c0d51990 (Micheal Gardner 2017-11-22 16:42:08 +0800 552) TODO: 以後補充 JAVA 環境安裝
c0d51990 (Micheal Gardner 2017-11-22 16:42:08 +0800 561) 比如,當我在寫本文的目錄中輸入 todos, 就可以檢視該我在寫文章的時候裡面挖了多少個還沒有填上去的 TODO(坑)。複製程式碼

詳細請參考 yadotfiles

0x03 踩坑史

3.1 日常類

01. 時間機器無法完成備份

我有定期備份的習慣,在一次備份中,意外的發現怎麼備份都無法備份完畢,經過幾次測試:

  1. 我首先猜測是硬碟問題,換了一塊硬碟,問題依舊。
  2. 複製了幾個大檔案,感覺也不太像是介面接觸不良的問題。
  3. 我認為可能是檔案數量過多導致的問題。於是刪除掉 node_module 後再次備份,備份成功。當然,這也有一定概率是誤打誤撞。畢竟從概率學上講,壞掉的鐘還能一天有兩次時間是對的呢。

外接硬碟的時候,將網路關閉即可。

02. 下載站的軟體包顯示損壞

有的時候並不是軟體損壞,而是 macOS 的安全配置中配置關掉了未識別出的 App

在終端中開啟這個選項,並在安全與隱私處點上 anywhere 即可。

sudo spctl --master-disable複製程式碼

3.2 程式設計類

01. homebrew 的與 Python 的問題

在 Python 中執行下面的程式碼的時候總是報錯:

ip = socket.gethostbyname(socket.gethostname())
# socket.gaierror: [Errno 8] nodename nor servname provided, or not known

# 最後發現是因為設定主機名沒有設定好
sudo scutil --set ComputerName "newname"
sudo scutil --set LocalHostName "newname"
sudo scutil --set HostName "newname"
dscacheutil -flushcache
# 然後重啟電腦即可複製程式碼

如果本機安裝了 Homebrew 如果後面使用 PyEnv 或者 Anaconda 並且設定當前環境為預設 Python 為 Python3(不建議這麼搞), 但是如果偏偏要把預設的 Python 版本換成 Python3, 會彈出一些 pythonpath
的問題,執行下面命令即可暫時遮蔽這個問題,但是沒有隱患則不清楚。

mv /usr/local/lib/python2.7/site-packages/sitecustomize.py /usr/local/lib/python2.7/site-packages/sitecustomize.py.back複製程式碼

02. Homebrew 安裝過去的檔案

0xEE 參考連結

  • 本文部分命令列安裝借鑑了 dev-setup

ChangeLog:

  • 2016-02 確定大致內容
  • 2017-06-28 重修文字,調整文章結構,Python 環境 和 Homebrew 安裝環境
  • 2017-10-05 再次重修文字,不定期更新

相關文章