OSX(macOS)开发环境配置 and Tweaks

安装OSX

快捷键

  • Command + Option + Esc : 相当于Windows上的 Ctrl + Alt + Del,或者点击左上角图标-强制退出

参考 https://support.apple.com/zh-cn/HT201236

开发工具 & 常用软件

常用软件(DMG安装文件)

英雄留步

关于Xcode, 不做iOS开发也要安装, Xcode作用相当于Windows上的.NET Framework, 直接在App Store上安装即可, 下载时间很长, 可以先睡一会, 醒来就装好了.

安装完Xcode后, 命令行执行:

xcode-select --install  # 安装 Command Line Tools
sudo xcodebuild -license accept # 同意协议, 不用再打开一次 Xcode了

Homebrew & cask

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew tap caskroom/cask

brew 和 brew cask 的区别:

  1. brew 是从下载源码解压然后 ./configure && make install, brew主要用来安装不带UI的命令行或者库, brew安装的程序包在/usr/local/Cellar/, 可执行文件链接到/usr/local/bin/
  2. brew cask 是安装已经编译好了的应用包, brew cask主要用来下载一些带界面的应用软件, 安装目录默认在/usr/local/Caskroom/

安装了 Homebrew 和 Homebrew-cask 之后就可以用brew installbrew cask install命令安装其他程序,
brew 命令参考: https://docs.brew.sh/Manpage

替换为国内镜像

替换及重置Homebrew默认源

替换为 USTC 镜像:

cd "$(brew --repo)"/Library/Taps/caskroom/homebrew-cask
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

重置为官方地址:

cd "$(brew --repo)"/Library/Taps/caskroom/homebrew-cask
git remote set-url origin https://github.com/caskroom/homebrew-cask

Homebrew常用命令

brew install xxx   # 按名称安装
brew uninstall xxx # 按名称卸载
brew list # 列出已安装的包
brew outdated # 列出可更新的包
brew update # 更新Homebrew自身
brew upgrade xxx # 升级某个软件包
brew upgrade # 升级全部软件包
brew pin/unpin xxx # 锁定或者解锁软件包版本,防止误升级
brew search xxx # 按名称搜索
brew info xxx # 查看包信息
brew doctor # 诊断关于Homebrew的问题(Homebrew 有问题时请用它)
brew cleanup # 清理老版本软件包或者无用的文件

# 第三方Repositories相关:
brew tap # 列出所有安装的第三方Repositories
brew tap <user/repo> # 安装第三方Repositories

Homebrew-Cask常用命令

注: 不再支持 brew cask xx命令, 改为: brew xx --cask

brew cask install xxx # 安装软件
brew cask uninstall xxx # 卸载软件
brew cask search xxx # 模糊搜索软件
brew cask info xxx # 显示软件的详细信息
brew cask list # 列出所有已安装的软件
brew cask upgrade # 更新所有已安装的软件

安装统计

Homebrew Analytics Install Events — Homebrew可以看到被安装的app排名

使用命令brew analytics off来退出 Homebrew 的分析。

Zsh 和终端替代品iTerm2

  • Zsh:

    sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
  • 终端替代品iTerm2: brew cask install iterm2

  • Zsh插件 brew install autojump zsh-syntax-highlighting zsh-autosuggestions
    并在~/.zshrc下增加:

    [ -f /usr/local/etc/profile.d/autojump.sh ] && . /usr/local/etc/profile.d/autojump.sh`
  • 补充, 如果使用了Oh-my-zsh就不用上面这么麻烦了, 直接在~/.zshrc里这样enable插件:

    plugins=(git autojump osx mvn gradle zsh-syntax-highlighting zsh-autosuggestions)

编辑器(Vim & Sublime)

  • MacVim: brew cask install macvim
  • Sublime text: brew cask install sublime-text

java环境

brew tap caskroom/versions
brew cask install java8

或者直接在Oracle官网下载, 并在.bashrc(如果你用的zsh,则是.zshrc)添加$JAVA_HOME环境变量:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

Mac上Java的安装目录

在终端输入which java, 返回的是: “/usr/bin/java” ,
/usr/bin/java 是个链接, 指向: “/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java” ,
但是我输入echo $JAVA_HOME, 返回: “/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home” ,
那么 /System/Library/Frameworks/JavaVM.framework//Library/Java/JavaVirtualMachines 哪个才是真正的Java安装目录?

答案是后者, 我发现 “/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/“ 下所有的可执行文件大小都是完全相同的,
该目录中的二进制文件是确定要使用哪个Java VM的存根应用程序, 可以使用dtrace查看java -version命令调用的全过程:

sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"

# 返回如下:
dtrace: description 'syscall::posix_spawn:entry ' matched 1 probe
dtrace: pid 44727 has exited
CPU ID FUNCTION:NAME
8 619 posix_spawn:entry /System/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/bin/java

多版本Java共存

管理多版本Java的工具: jEnv

安装 & 配置:

# 安装 jenv
brew install jenv
mkdir -p ~/.jenv

# 添加到你的 shell profile文件:
echo 'eval "$(jenv init -)"' >> ~/.zshrc

添加 jdk:

# jenv add 会在 ~/.jenv/versions 下建立对应 jdk的软链
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home

How to Use:

# 列出所有的 jdk
$ jenv versions
system
openjdk12.0.2
oraclejdk1.8.0_172

# 使用jdk 12(全局生效)
$ jenv global openjdk12.0.2

# 使用jdk 12(当前shell生效)
$ jenv shell openjdk12.0.2

jenv 在我的MBP上一直有问题, jenv global无效, 港真我还是觉得自己手动修改 $JAVA_HOME 的方式比较好

python环境

brew install python ## will install python & pip

由于 macOS 10.13已经预安装了Python 2.7.10, 上面的命令会安装Python3 到/usr/local/Cellar/python/Version并在/usr/local/bin/创建链接:
python3, pip3, easy_install-3.6

对于用系统默认easy_install安装的包, 会放在/Library/Python/2.7/site-packages, 所以需要sudo:
sudo easy_install tornado

如果不喜欢sudo, 则可以用pip仅在当前用户下安装, 尤其对于需要升级系统自带的package时:
pip install --user --upgrade matplotlib

easy_install和pip
两者都是 setuptools 基础上的工具,pip 比 easy_install 提供更多高级选项, 比如uninstall, freeze

golang环境

@ref: https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md

php环境

brew tap homebrew/php
brew install php70
brew install mcrypt php70-mcrypt
brew install composer

Add PATH:

export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"

node环境

brew install node ## will install node & npm

NPM命令: [[../41.Uncategorized/NPM命令速查]]

下载工具Aira2

安装aira2:

brew install aria2

touch ~/.aria2/aria2.conf

配置文件:

使用下面的token方式
rpc-secret=thats_a_token

#允许rpc
enable-rpc=true

#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true


#RPC端口
rpc-listen-port=6800

使用aira2:

# 使用aria2下载单个文件:
/usr/local/bin/aria2c -s10 -x10 <下载url>

# 启动 aria2 demon:
/usr/local/bin/aria2c --conf-path=/Users/heisenbug/.aria2/aria2.conf -D

使用UI:下载 AriaNg,浏览器打开index.htm(建议加进浏览器收藏夹),第一步先配置参数:

其他工具

  • 常用开发套件: brew install ctags cscope wget watch tmux cmake openssl geoip automake autoconf
  • 虚拟机: brew cask install virtualbox
  • 压缩工具: brew cask install the-unarchiver

生成SSH公钥

  • 生成ssh key ssh-keygen -t rsa -C "邮箱"
  • 添加到系统: ssh-add ~/.ssh/你的私钥

cURL

macOS 中 Curl 的版本针对 SSL/TLS 验证使用安全传输。
如果你更愿意使用 OpenSSL,用 brew install curl --with-openssl 安装并通过 brew link --force curl 确保它是默认的。

Jupyter Notebook

升级python3、pip3:

pip3 install --upgrade pip

安装:

pip install jupyterlab
pip install notebook

修改默认目录:

jupyter notebook --generate-config # 生成一个新配置文件
gvim ~/.jupyter/jupyter_notebook_config.py
# 找到c.NotebookApp.notebook_dir 并修改路径, 这里是相对路径(当前用户$HOME)

启动:

jupyter notebook

入门:

系统设置

Launchpad

重置 Launchpad 图标数据库:在 Terminal 中键入
defaults write com.apple.dock ResetLaunchPad -bool true && killall Dock

配置文件位置:
~/Library/Application\ Support/Dock/desktoppicture.db

mac-os-x-menu-bar

Dock

重置Dock
defaults delete com.apple.dock; killall Dock

Notification Center

@todo

Finder

@todo

Spotlight

@todo

WIFI

重启airportd:

#/bin/bash
airportd_pid=`ps -ef | grep airportd | grep -v grep | awk '{print $2}'`; echo ${airportd_pid}; sudo kill -9 ${airportd_pid};

DNS 缓存

如何清理DNS缓存:

如果操作系统是Lion、Mountain Lion和Mavericks+:

sudo killall -HUP mDNSResponder

如果操作系统是Leopard和Snow Leopard:

sudo dscacheutil -flushcache

定时任务(launchd)

launchctl 是一个统一的服务管理框架,可以启动、停止和管理进程、应用程序、脚本等。
参考: Creating Launch Daemons and Agents

  • 创建可执行脚本 task.sh
  • 在 ~/Library/LaunchAgents 目录下创建 plist文件: touch ~/Library/LaunchAgents/com.myMac.cron.task.plist
  • 编辑 plist 文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <!-- 唯一plist名字 -->
    <key>Label</key>
    <string>com.myMac.cron.task</string>

    <!-- 可执行命令, 第一个为命令,其它为参数 -->
    <key>ProgramArguments</key>
    <array>
    <string>/Users/xxx/Scripts/task.sh</string>
    </array>

    <!-- 定时执行 这里的例子每天22点 -->
    <key>StartCalendarInterval</key>
    <dict>
    <key>Minute</key>
    <integer>0</integer>
    <key>Hour</key>
    <integer>22</integer>
    <key>Weekday</key>
    <integer>0</integer>
    </dict>

    <!-- 标准输出和错误输出 -->
    <key>StandardOutPath</key>
    <string>/tmp/cron-task.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/cron-task.log</string>
    </dict>
    </plist>
  • 加载到系统: launchctl load com.myMac.cron.task.plist;

  • 如果查看所有载入的: launchctl list;
  • 如果需要移除: launchctl unload com.myMac.cron.task.plist, 注:已经载入的任务要先 unload 才可以 load
  • StartCalendarInterval项的解释:
    • <key>Hour</key>: Hour of the day (0-24).
    • <key>Weekday</key>: Weekday is the day of the week (0 and 7 == Sunday).
    • <key>Day</key>: Day is the day of the month.
  • 如果间隔 5 分钟执行:
    <key>StartInterval</key>
    <integer>300</integer>

➤ 升级后发现的,原本正常执行的 shell 脚本报错 operation not permitted,更改为 chmod 777也不行,

ls -l@ script.sh # 查看隐藏的@属性

# 或者
xattr -l script.sh

# 发现多了一行 com.apple.quarantine,删除:
sudo xattr -d com.apple.quarantine script.sh

删除了多余属性还是不行…

参考 how to fix “Operation not permitted” when i use launchctl in macos catalina - Stack Overflow 的方案,是因为 Catalina 升级了权限管理,要给 /bin/bash 「full disk access」,想想还是算了吧

Safari

推荐扩展:

  • AdBlock: 拦截广告
  • webQR: 当前的地址转换为二维码
  • Tab Lister: Chrome上的 OneTab, 可以将打开的标签页收纳到一个标签页, 关闭所有标签页节省资源
  • sVim: 为Safari增加Vim的快捷键 链接
  • AutoPagerize: 自动再入”下一页” 链接
  • Reverse Image Search : 图片上右键搜索相似图 链接

WeChat

清理微信的存储空间:

cd ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/2.0b4.0.9/

du -d 1 -h | sort -h

cd 3592d0142e681d9a9e3333959dae1bad/Message

du -d 1 -h | sort -h

macOS Mojave(10.14)

开启子像素抗锯齿

升级 macOS Mojave 新系统后,苹果默认关闭了子像素抗锯齿(也称为字体平滑),导致字体变细锯齿增多。在连接到非Retina显示屏的MacBook Air或桌面Mac上,升级会使您的字体看起来更糟。
如果您的Mac带有Retina显示屏,我们不建议启用亚像素抗锯齿功能。 即使没有亚像素抗锯齿,字体在Retina显示屏上看起来也应该看起来不错且可读。 但是,如果您有非Retina显示屏,我们建议您重新启用此功能。
像素抗锯齿是一种技巧,旨在使字体在较低分辨率的显示器上看起来更好。 如果默认情况下未启用此功能,则macOS Mojave会使非Retina显示屏上的文本看起来更薄更模糊。
虽然默认情况下禁用子像素字体平滑,但您可以使用terminal命令重新启用它。 有四种可能的设置:0(禁用),1(光平滑),2(中等平滑)和3(重平滑)。

打开 【终端】应用,输入下面命令,全局启用 次像素抗锯齿 渲染: defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO

设置字体 次像素抗锯齿 级别 (类似 Linux 的 hintstyle 微调样式) 的命令: defaults -currentHost write -globalDomain AppleFontSmoothing -int 3

查看设置后的选项值:

$ defaults read -g CGFontRenderingFontSmoothingDisabled
0

$ defaults -currentHost read -globalDomain AppleFontSmoothing
3

参考: macOS Mojave 字体渲染由默认的灰度抗锯齿改回之前的次像素抗锯齿

macOS Catalina(10.15)

升级到 10.15后要做的:

  • xcode-select --install
  • sudo xcodebuild -license accept
  • brew update && brew upgrade
  • type reload into Alfred to refresh the application cache

APFS 文件系统下, macOS的系统路径有了一些变化, 可能对使用者造成困扰:
更新 macOS 10.15 你需要知道的APFS 磁盘格式的变化 - 系统分区独立加密 - 知乎

macOS Big Sur(11)

TODO


附录

OSX系统目录

  • OneDrice & Dropbox: ~/Library/CloudStorage
  • 当前用户的软件数据目录: ~/Library/Application\ Support
  • 系统的软件数据目录: /Library/Application\ Support
  • iCloud云盘在本地的路径: ~/Library/Mobile\ Documents/com~apple~CloudDocs
  • App 在 iCloud中的文档路径:
    • Obsidian: ~/Library/Mobile\ Documents/iCloud~md~obsidian/Documents
    • Surge: ~/Library/Mobile\ Documents/iCloud~run~surge/Documents
    • MWeb:
      • 新版: ~/Library/Containers/com.coderforart.MWeb3/Data/Library/Application\ Support/MWebLibrary // CloudKit
      • 旧版: ~/Library/Mobile\ Documents/iCloud~com~coderforart~iOS~MWeb/Documents
    • 自带TextEdit: ~/Library/Mobile\ Documents/com~apple~TextEdit/Documents
    • 自带Knote: ~/Library/Mobile\ Documents/com~apple~Keynote/Documents
    • 自带Page: ~/Library/Mobile\ Documents/com~apple~Pages/Documents
    • 自带便笺: ~/Library/Containers/com.apple.Stickies/Data/Library/Stickies

自启动程序目录

  • ~/Library/LaunchAgents/
  • /Library/LaunchAgents/
  • /Library/LaunchDaemons/
  • /Library/StartupItems/
  • /Library/PrivilegedHelperTools/

参考: 解剖最近被发现的Mac OS木马 – OSX/Keydnap

Disable Microsoft OneDrive AutoUpdate

How to Stop Microsoft AutoUpdate on Mac

rm -fr /Library/Application Support/Microsoft/MAU2.0

rm -fr /Library/LaunchAgents/com.microsoft.update.agent.plist

rm -fr /Library/LaunchDaemons/com.microsoft.autoupdate.helper