升级到 Mac OS X 10.10 Yosemite (Beta)

上周四苹果发布了 Mac OS X 10.10 Yosemite Beta 公开测试版,如果你提前加入了 OS X Beta Program 的话会收到邮件,按照提示提取或手动输入 Redemption Code 后就可以下载安装了。和升级 Mac OS X 10.9 Mavericks 时候一样,升级 Mac OS X 10.10 Yosemite 直接通过 App Store 就可以完成。

目测改变最大的是界面,继续向扁平化、iOS 7 风格靠拢,菜单字体也变了。自己用得最多、最在意的两个程序是 Safari 和 Terminal.

Safari.app 改进挺大,终于加上了 Google Chrome 几年前就有的 “直接在地址栏搜索”,因为从来不关机,所以浏览器经常会有 n 个 tab 页放在那里,时间长了这些 tab 不容易找,单从 tab 上面的 title 没法快速识别自己要找哪个 tab,Safari 菜单上的 show all tabs 能快速预览所有 tabs,正是我想要的。

Mac OS X 10.10 Yosemite

Terminal.app 没有多大变化,依然没有 iTerm2.app 那种多窗口切分功能,只能依靠 tmux 做窗口、会话切分。

Calendar.app 也是常用的 app,这年头记不住事,全靠 Calendar/Reminder/Notes/Timer 之类的工具。不知道大脑退化是否和这些 app 有关,反正自从可以用电脑打字以后,很少碰过笔,现在拿笔写出来的字惨不忍睹~,不知道大家还记不记得曾经有 “书法” 这个词~

Mac OS X 10.10 Yosemite

Spotlight 功能大大加强,而且搜索的速度大大提高,也可能是因为硬盘是 SSD 的缘故,搜索结果基本上可以做到实时显示。

Notifications 增加了 “Today” 标签页,用户可以在 “Today” 里看日历、提醒、天气、股票、计算器等常用信息,据说苹果开放了 API,第三方程序也可以将信息显示到 “Today” 里,貌似苹果打算这个新的信息展示页面替代老的 Dashboard.

iCloud Drive 可以到 System Preferences -> iCloud 开启,5GB 免费,和 Dropbox 用法一样。

可能因为我的使用习惯是保持系统最简,不怎么用第三方软件,不会出现乱七八糟的软件兼容、干扰等问题,Mac OS X 10.10 Yosemite 公开测试版在我的 Mac 上运行很稳定,完全可以当作正式版用~

修改 Mac 的 MAC 地址

以前在学校下载电影 IP 老是被封,后来进化到管理员封物理网卡地址(MAC),每隔一段时间就得换个 MAC 地址。听说苹果在最新将要发布的 iOS 8 上增加了 MAC 地址随机化功能,也就是说在扫描 Wi-Fi 的时候会随机生成 MAC 地址,扫描完成后才会给出真实 MAC 地址,这个功能可以更好的保护用户的隐私和安全,据说一些营销和数据分析公司会通过免费的 Wi-Fi 收集信息,这点信息也不放过实在可恶,所以在外面用公共的 Wi-Fi 最好加一层 VPN 后再用。

假设在 Mac 上通过 ifconfig 查到 Wi-Fi 网卡接口是 en0,更换一个随机的 MAC 地址一句话就可以搞定:

$ sudo ifconfig en0 ether `openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'`

上面的命令没有加到系统启动文件里,所以每次系统启动后会还原真实 MAC 地址。除非系统出问题,一般不会重启 Mac,平时用 Mac 也没必要关机,一般屏幕一合上就走人~

在 Linux 的 KVM 上安装 Mac OS X Mavericks 虚拟机

现在我们很方便就能在 Mac 上通过 VirtualBox 安装 Mac OS X 虚拟机,如果没 Mac 的话也能很容易在 Linux/Windows 下通过 VirtualBox 体验 Mac,甚至把 Mac OS X 直接装在 PC 上也是可能的。如果想在数据中心这种 KVM/Xen 虚拟环境里安装 Mac OS X 呢?通过 Apple Remote Desktop 连接 n 个 Mac 虚拟机,应该会比较好玩吧。

以下操作在 CentOS 6.5 上测试通过。更详细的资料请参考 Running Mac OS X as a QEMU/KVM Guest.

首先需要 Linux 3.x 以上的内核,CentOS 6.5 上默认是 2.6.x 内核,所以需要另装或升级内核,我们这里用 CentOS 官方 Xen 源(Xen4CentOS6)里面的最新 Linux 内核,注意这里用的是源里的普通内核,不是要用 Xen 内核,你也可以用其他第三方源的内核或者自己下载内核编译。注意修改 grub.conf 文件的 default=0 部分确认系统启动后启动的是普通内核(不是启动 Xen 内核):

# yum install centos-release-xen
# yum update

# vi /etc/grub.conf
...
default=0
...

# reboot

当前的主流 Linux 发行版自带的 kvm/qemu 都不支持 OS X 作为 guest 系统,所以我们需要自己编译 kvm, kvm-kmod, qemu 加上 OS X 的支持。下载 kvm 和 kvm-kmod 源代码后编译,编译会出错,解决办法见后面:

# yum install git
# yum groupinstall 'Development Tools'

# git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git
# git clone git://git.kiszka.org/kvm-kmod.git
# cd kvm-kmod
# ./configure
# make LINUX=../kvm clean sync all
...
/root/kvm-kmod/x86/assigned-dev.c: In function ‘assigned_device_enable_host_msix’:
/root/kvm-kmod/x86/assigned-dev.c:434:2: error: implicit declaration of function ‘pci_enable_msix_exact’ [-Werror=implicit-function-declaration]
  r = pci_enable_msix_exact(dev->dev,
  ^
cc1: some warnings being treated as errors
make[3]: *** [/root/kvm-kmod/x86/assigned-dev.o] Error 1
make[2]: *** [/root/kvm-kmod/x86] Error 2
make[1]: *** [_module_/root/kvm-kmod] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.10.34-11.el6.centos.alt.x86_64'
make: *** [all] Error 2

修改 assigned-dev.c 这个文件的第434行,用 pci_enable_msix 函数替代 pci_enable_msix_exact,查看 git 修改记录和日志,貌似 pci_enable_msix_exact 是 Linus 上个月刚加上去的,我们这里还原,还是用原先的 pci_enable_msix 就可以了。

# vi /root/kvm-kmod/x86/assigned-dev.c
...
        /*r = pci_enable_msix_exact(dev->dev,
                                  dev->host_msix_entries, dev->entries_nr);*/
        r = pci_enable_msix(dev->dev, dev->host_msix_entries, dev->entries_nr);
...

修改代码后重新编译,注意这时候 make clean all 不要 sync,否则上面的修改会被重新覆盖:

# make LINUX=../kvm clean all

编译成功后,就可以加载 kvm-intel 内核了,使用 dmesg 确认内核加载成功:

# modprobe -r kvm_intel
# cp ./x86/kvm*.ko /lib/modules/$(uname -r)/kernel/arch/x86/kvm/
# modprobe kvm_intel

# dmesg | tail -n1
loaded kvm module (for-linus-40872-ga4e91d0)

kvm 部分告一段落,现在来编译 qemu:

# yum install zlib zlib-devel glib2-devel pixman-devel

# cd
# mkdir osx

# git clone git://git.qemu.org/qemu.git
# cd qemu
# ./configure --prefix=/root/osx --target-list=x86_64-softmmu
# make clean; make; make install

我们要安装 OS X 当然需要 OS X 的启动盘。到 App Store 里下载 Install OS X Mavericks.app 安装文件,然后在 Mac 上用下面的脚本生成一个可启动的 Mavericks ISO 文件,我们将要用这个 Mavericks.iso 安装系统,所以我们还需要把这个 Mavericks.iso 拷贝到 KVM 服务器上 :

$ vi createiso.sh
# Mount the installer image
hdiutil attach /Applications/Install\ OS\ X\ Mavericks.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/install_app

# Convert the boot image to a sparse bundle
hdiutil convert /Volumes/install_app/BaseSystem.dmg -format UDSP -o /tmp/Mavericks

# Increase the sparse bundle capacity to accommodate the packages
hdiutil resize -size 8g /tmp/Mavericks.sparseimage

# Mount the sparse bundle for package addition
hdiutil attach /tmp/Mavericks.sparseimage -noverify -nobrowse -mountpoint /Volumes/install_build

# Remove Package link and replace with actual files
rm /Volumes/install_build/System/Installation/Packages
cp -rp /Volumes/install_app/Packages /Volumes/install_build/System/Installation/

# Unmount the installer image
hdiutil detach /Volumes/install_app

# Unmount the sparse bundle
hdiutil detach /Volumes/install_build

# Resize the partition in the sparse bundle to remove any free space
hdiutil resize -size `hdiutil resize -limits /tmp/Mavericks.sparseimage | tail -n 1 | awk '{ print $1 }'`b /tmp/Mavericks.sparseimage

# Convert the sparse bundle to ISO/CD master
hdiutil convert /tmp/Mavericks.sparseimage -format UDTO -o /tmp/Mavericks

# Remove the sparse bundle
rm /tmp/Mavericks.sparseimage

# Rename the ISO and move it to the desktop
mv /tmp/Mavericks.cdr ~/Desktop/Mavericks.iso

$ sudo sh createiso.sh

在 Mac 上编译 smc_read.c 这个文件并运行得到 SMC,这个 SMC 序号我们会在后面用到:

$ vi smc_read.c
/*
 * smc_read.c: Written for Mac OS X 10.5. Compile as follows:
 *
 * gcc -Wall -o smc_read smc_read.c -framework IOKit
 */

#include 
#include 

typedef struct {
    uint32_t key;
    uint8_t  __d0[22];
    uint32_t datasize;
    uint8_t  __d1[10];
    uint8_t  cmd;
    uint32_t __d2;
    uint8_t  data[32];
} AppleSMCBuffer_t;

int
main(void)
{
    io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
                               IOServiceMatching("AppleSMC"));
    if (!service)
        return -1;

    io_connect_t port = (io_connect_t)0;
    kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port);
    IOObjectRelease(service);
    if (kr != kIOReturnSuccess)
        return kr;

    AppleSMCBuffer_t inputStruct = { 'OSK0', {0}, 32, {0}, 5, }, outputStruct;
    size_t outputStructCnt = sizeof(outputStruct);

    kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2,
             (const void*)&inputStruct, sizeof(inputStruct),
             (void*)&outputStruct, &outputStructCnt);
    if (kr != kIOReturnSuccess)
        return kr;

    int i = 0;
    for (i = 0; i < 32; i++)
        printf("%c", outputStruct.data[i]);

    inputStruct.key = 'OSK1';
    kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2,
             (const void*)&inputStruct, sizeof(inputStruct),
             (void*)&outputStruct, &outputStructCnt);
    if (kr == kIOReturnSuccess)
        for (i = 0; i < 32; i++)
            printf("%c", outputStruct.data[i]);

    printf("\n");

    return IOServiceClose(port);
}

$ gcc -Wall -o smc_read smc_read.c -framework IOKit
$ ./smc_read
REPLACE-YOUR-KEY-HERE(c)AppleComputerInc

快搞定了,最后我们还需要一个硬盘文件来充当虚拟机的硬盘以及 chameleon_svn2360_boot 这个文件,Chameleon 是 Darwin/XNU 系统的启动器(boot loader),用来在非苹果硬件上启动 OS X:

# /root/osx/bin/qemu-img create -f qcow2 osx.img 20G

# wget http://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/chameleon_svn2360_boot

在 KVM 上启动安装这个我们准备已久的 OS X Mavericks 虚拟机吧,注意下面的 osk="REPLACE-YOUR-KEY-HERE(c)AppleComputerInc" 部分用上面的 SMC 序号替代:

# /root/osx/bin/qemu-system-x86_64 -enable-kvm -m 2048 -cpu core2duo \
-smp 2 \
-vga std \
-device ahci,id=ide \
-usbdevice keyboard -usbdevice mouse \
-device isa-applesmc,osk="REPLACE-YOUR-KEY-HERE(c)AppleComputerInc" \
-kernel /root/chameleon_svn2360_boot \
-smbios type=2 \
-device ide-drive,bus=ide.2,drive=MacHDD \
-drive id=MacHDD,if=none,cache=none,file=/root/osx.img \
-vnc 0.0.0.0:1 \
-device ide-drive,bus=ide.0,drive=MacDVD \
-drive id=MacDVD,if=none,snapshot=on,file=/root/Mavericks.iso -boot once=d

打开 VNC 客户端连接上面 KVM 服务器 IP 和端口 5901 就会看到安装界面了,先按回车开始安装,然后用菜单里的 Disk Utility 工具分区,退出 Disk Utility 就可以看到安装盘了,点击安装盘后就可以看到 Install OS X 安装界面了:
mac os x running on linux kvm

安装完后会重启进入系统:

mac os x running on linux kvm

升级到 Mac OS X 10.9 Mavericks

现在升级操作系统这种在以前看来很麻烦的事情变得越来越简单,就像升级一次应用程序一样。升级 Tiger 到 Snow Leopard 从订购安装盘到完成升级花了几天的时间,Snow Leopard 时代就不需要安装光盘了,直接到 App Store 购买后下载升级,这次升级到 Mavericks 更快,在苹果发布会宣布的同一天就完成了升级,昨天得知 OS X 10.9 Mavericks 免费后惊呆了,立刻 Software Update… 果然看到 FREE UPGRADE 按钮:

OS X 10.9 Mavericks

下载速度很快,5.29GB 的系统镜像下载+安装不到一小时就搞定了。

OS X 10.9 Mavericks

据说新版系统有200多项改进,玩了两下没发现什么特别激动的,小改进挺多,iCloud Keychain 能方便记住各种密码并且自动同步到其他 Apple 设备上,在 Mac 上输入的密码在 iPad/iPhone 上就不用输入了,很方便;Finder 增加了 Tabs,不用开多个 Finder 窗口了;新系统增加了两个比较有用的应用程序,iBooks 和 Maps;Calendar 改进了很多,类似 iOS 7 的界面风格;点击 Battery 会看到哪些应用程序很耗电(Apps Using Significant Energy),这个能方便用户在需要的时候关闭这些程序 …

这次宣布免费的重量级应用还有 Pages, Numbers, Keynote. 苹果把操作系统和办公套件(Mac OS X + Pages/Numbers/Keynote)都免费了,难道不知道微软是靠 Windows + Word/Excel/Powerpoint 吃饭的么?这算不算 “走别人的路,让别人无路可走” 呢~

在 Mac OS X 终端里使用 Solarized 配色方案

相信长期浸泡在终端和代码的小伙伴们都有一套自己喜爱的配色方案。以前一直在用简单、适合阅读的 Terminal.app 配色方案换到 MacBook Pro with Retina display 后发现这个配色时间看长了眼睛有点累。不断有人推荐 Solarized,看了一些截图,感觉还不错,决定试一下。

Solarized 是目前最完整的 Terminal/Editor/IDE 配色项目,几乎覆盖所有主流操作系统(Mac OS X, Linux, Windows)、编辑器和 IDE(Vim, Emacs, Xcode, TextMate, NetBeans, Visual Studio 等),终端(iTerm2, Terminal.app, Putty 等)。类似的项目还有 Tomorrow Theme.

要在 Mac OS X 终端里舒服的使用命令行(至少)需要给3个工具配色,terminal、vim 和 ls. 首先下载 Solarized:

$ git clone git://github.com/altercation/solarized.git

Terminal/iTerm2

Mac OS X 自带的 Terminal 和免费的 iTerm2 都是很好用的工具,iTerm2 可以切分成多窗口,更方便一些。

如果你使用的是 Terminal 的话,在 solarized/osx-terminal.app-colors-solarized 下双击 Solarized Dark ansi.terminal 和 Solarized Light ansi.terminal 就会自动导入两种配色方案 Dark 和 Light 到 Terminal.app 里。

如果你使用的是 iTerm2 的话,到 solarized/iterm2-colors-solarized 下双击 Solarized Dark.itermcolors 和 Solarized Light.itermcolors 两个文件就可以把配置文件导入到 iTerm 里。

Vim

Vim 的配色最好和终端的配色保持一致,不然在 Terminal/iTerm2 里使用命令行 Vim 会很别扭:

$ cd solarized
$ cd vim-colors-solarized/colors
$ mkdir -p ~/.vim/colors
$ cp solarized.vim ~/.vim/colors/

$ vi ~/.vimrc
syntax on
set background=dark
colorscheme solarized

iterm2 and solarized

ls

Mac OS X 是基于 FreeBSD 的,所以一些工具 ls, top 等都是 BSD 那一套,ls 不是 GNU ls,所以即使 Terminal/iTerm2 配置了颜色,但是在 Mac 上敲入 ls 命令也不会显示高亮,可以通过安装 coreutils 来解决(brew install coreutils),不过如果对 ls 颜色不挑剔的话有个简单办法就是在 .bash_profile 里输出 CLICOLOR=1:

$ vi ~/.bash_profile
export CLICOLOR=1

vim and solarized

把 Time Machine 备份到 FreeNAS 上

Mac 上的 Time Machine 很好用,不过每次备份都要用移动硬盘挺麻烦的。如果有多人使用多台 Mac 能不能把大家的 Time Machine 统一备份到云里或者局域网的某台服务器上呢?我们实验室大部分人都在用 Mac,现在正需要这么一个备份方案。谷歌了一下,发现这种使用 Time Machine 备份到远程电脑的方案是最方便、廉价的了,只需要一台普通 PC 就可以充当备份服务器。

Apple 使用自己的 Apple Filing Protocol (AFP) 协议提供文件共享服务,FreeNAS 刚好支持这一协议(貌似 Openfiler 目前还没有实现 AFP)。在一台服务器或虚拟机上安装 FreeNAS,安装过程很容易,这里省略。

配置 FreeNAS

安装好后进入 web 管理界面创建一个新用户,然后创建一个新 APF 共享, 在左边菜单里面选择 Sharing->Add Apple (AFP) Share,这里需要注意钩上 Disk Discovery 并选择 Disk discovery mode 为 Time Machine:

create a afp share

搞定~

配置 Mac

现在剩下的配置在 Mac 完成,让 Mac 连接刚创建的 AFP Share,点击 Mac 顶部菜单 Go->Connect to Server…,填入 freenas 服务器的 IP 地址 192.168.2.200 连接服务器:

time machine backup

成功连接后会挂载一个 AFP share 盘,然后配置 Time Machine 选择这个盘当作备份盘:

time machine backup

大功告成,等着自动备份吧:

time machine backup

使用 Fabric 批量执行服务器任务

我们的服务器和虚拟机的环境配置都由 puppet 管理,但有时候需要临时执行某些任务和操作,比如同时更换500台服务器的密码、同时更新或者重启500台虚拟机、在特定几台服务器上添加或者一个用户、上传一个特定文件/脚本到1000台服务器等等。这些任务用 Puppet 可以做,但是不是最简洁的办法。我们需要一种工具能完成大量服务器上的批量操作,并且要简单可编程,Fabric 就是这样一个基于 Python 的服务器批量管理库/工具,Fabric 使用 ssh(通过 paramiko 库)在多个服务器上批量执行任务,我们只需要用 Python 编写这些任务脚本并指定要执行这些任务的服务器就可以了。

Fabric 依赖 paramiko,所以需要安装这两个:

$ sudo pip install fabric
$ sudo pip install paramiko

编写一个简单的 Fabric 例子,在1台服务器上打印系统信息(uname -s):

$ vi fabfile.py
#!/usr/bin/python

from fabric.api import run

def host_os():
    run('uname -s')

在 vpsee.com 这台主机(host)上使用 root 帐户执行上面的任务 host_os:

$ fab -H root@vpsee.com host_os
[root@vpsee.com] Executing task 'host_os'
[root@vpsee.com] run: uname -s
[root@vpsee.com] Login password for 'root': 
[root@vpsee.com] out: Linux

Done.
Disconnecting from root@vpsee.com... done.

来看一个更复杂点的例子,在多个服务器(grid00, grid02, …, grid05)上更换 root 密码(假设原密码是 root),注意加上 @parallel,这样任务是并行执行的,在大量服务器上会快很多:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from fabric.api import *
import string
from random import choice
import socket
import paramiko

env.user = 'root'
env.password = 'root'
env.hosts = [ 'grid00', 'grid01', 'grid02', 'grid03', 'grid04', 'grid05']

@task
@parallel
def passwd(user, passwd=False):
    with settings(hide('running', 'stdout', 'stderr'), warn_only=True):
        if isup(env.host):
            if not passwd:
                passwd = genpass()
            sudo("echo -e '%s\n%s' | passwd %s" % (passwd, passwd, user))

def genpass(length=10):
    return ''.join(choice(string.ascii_letters + string.digits) for _ in range(length))

def isup(host):
    print 'connecting host: %s' % host
    timeout = socket.getdefaulttimeout()
    socket.setdefaulttimeout(1)
    up = True
    try:
        paramiko.Transport((host, 22))
    except Exception, e:
        up = False
        print '%s down, %s' % (host, e)
    finally:
        socket.setdefaulttimeout(timeout)
        return up

使用 fab -l 查看我们刚编写的 fabfile.py 里面的可用命令,这个命令就是那个函数名 def passwd(user, passwd=False):

$ fab -l
Available commands:

    passwd

使用这个命令批量更换 grid00-grid05 的 root 密码为 test,passwd 传递参数的时候接冒号,并且用户名和密码参数用逗号隔开:

$ fab passwd:root,test
[grid00] Executing task 'passwd'
[grid01] Executing task 'passwd'
[grid02] Executing task 'passwd'
[grid03] Executing task 'passwd'
[grid04] Executing task 'passwd'
[grid05] Executing task 'passwd'
connecting host: grid05
connecting host: grid04
connecting host: grid02
connecting host: grid03
connecting host: grid01
connecting host: grid00

Done.

Fabric 的强大之处在于可以用 Python 编写各种任务(函数),这些任务可以指定到任何服务器上(通过 ssh),非常适合管理大量服务器、批量处理任务。另外 Fabric 工作方式非常简单容易理解,就是简单的 ssh 而已,没有内幕没有架构,不像其他工具什么客户端服务器端、什么中间代码、什么 DSL 领域专属语言(嗯,说的就是 puppet, chef)。Fabric 使用起来只需要懂点 Python 就可以了,不需要学命令、api、框架之类的。我们喜欢简单、容易理解的工具。

升级到 Mac OS X 10.8 Mountain Lion

mac os x mountain lion

苹果上周发售了新版的 Mac OS X Mountain Lion,周末升了一下级。购买和升级过程越来越容易了,上次从 Tiger 升级到 Leopard 的时候从订购安装盘到完成升级花了几天。这次升级到 Mountain Lion 要简单方便得多,登陆 Mac App Store 点击 install,输入帐号后就开始下载了,下载完后自动启动安装界面,只需要点击一次就开始升级安装,整个升级过程无需任何干预(期间两次重启也是自动的)。

晚上给另一台 Macbook Pro 升级的时候发现一个比较坑爹的地方,下午下载的 4GB 多的 Mountain Lion 安装镜像升级完后就消失了,这样不得不在另一台 Macbook Pro 上重新下载一遍(购买 Mountain Lion 一次后可以不限次下载,20美元的 Mountain Lion 授权可以用在自己的多台 Mac 上)。所以家里有多台 Mac 的话最好先下载、拷贝镜像或者做成 DVD/USB 后再升级。

完成升级后登陆最先看到的是变化是壁纸,桌面壁纸改成了更简洁的淡蓝银河,不知道是心理作用还是审美疲劳?每次升级 Mac OS X 后都觉得壁纸比前一个版本要好看。

外观方面没有大的变化,但很多细节都有改进。比如以前的滚动条很小不容易鼠标点击到,现在的滚动条会在鼠标碰到的时候自动放大,不过在 Mac 上都是用双指触摸来上下拖动页面的,滚动条其实不是那么常用,所以这个改进对用户来说不是那么重要(如果不是追求完美的话~)。拷贝和下载大文件的时候进度条出现在文件的图标(icon)上。3个指头点击触摸板就可以预览,这个挺方便。Dock, Dashboard, 桌面屏保和壁纸等等都有变化。

点击苹果主菜单的软件升级 Software update… 后自动连上 App Store,以后的 update 和 App store 紧密连在一起,而不是分开的程序了。

到处都是 Share 按钮,share 无处不在。

Notification Center 整合了所有烦人的通知消息,不用单独去查看和处理哪里来的 notification 了,生产力大大提高。

mountain lion notification

应用程序增加了 Reminder, iMessage,Reminder 对于我来说比较有用,可以当作简单的 todo list 用,之前一直在用第三方的 Wunderlist.

Safari 升级到了 6.0,改进很大,地址栏搜索历史纪录、书签等响应很快,终于有了 Chrome 里面早就有的直接在地址栏输入查询关键字的功能,而且比 Chrome 做的更好。Safari 增加了一个 Reader 按钮更加专注于阅读,还可以把未看完的文章加入 Reading list. 增加了 tab 预览,对于我这种一次开 n 个 tab 的人来说这个功能实在来得太及时了,很容易在不同 tab 里(依靠预览)切换,不用一个一个点击 tab 看内容。

mountain lion notification

Mail, QuickTime, Dictionary, Time Machine, Photo Booth 等都有升级和改进。

自带的中文输入法有一些改进,加入了手写识别,词库更大了,还加入了中文字典释义功能,有汉字不懂意思的话选中后用3个指头轻击触摸板就会出现意思,类似中文-中文字典。

字体有改进,更加精致饱满了。下面这张截图是刚从 Mountain Lion + Safari 6.0 上拔下来的,对比一下以前 Mac OS X 上的字体:Mac 和 Windows 的中文字体显示效果看看。

font on mountain lion

网上很多人讨论这次升级19.99美元值不值,这个价格比苹果应用商店上的小应用程序还便宜,一个 Things.app 要 $49.99,连一个 Todo.app 都要 $14.99,这样比较起来有 4GB 体积的 Mountain Lion 可以简直就是免费。苹果说这次有200多项改进,没有一一去核实,不过从这两天使用来看,系统和浏览器性能明显有提升,系统响应快、稳定,细节改进很多。按照 OS X Mountain Lion 10.8 License Agreement,Mountain Lion 可以授权安装在任何属于自己的 Mac 上,如果家里有多台 Mac(家人都在用 Mac 的话),20美元就更超值了~

Mac OS X Lion 上使用 TTLS/PAP 访问 Wi-Fi

我们实验室的 Wi-Fi 更改了认证方式,不再采用简单的 WPA2/PSK (Pre-Shared Key),这种方式的弊端显而易见,所有人都知道 Wi-Fi 密码,大家容易把这个 “共用” 密码传给外人,如果是 “个人” 密码的话会好一些,所以我们打算通过 LDAP 把这个密码和个人的邮件密码连在一起,这样会有效的阻止密码扩散(不会有人轻易告诉别人自己的邮件密码),还减轻了管理员经常换密码的痛苦。除了密码管理方面的好处外,还可以通过 Radius 对用户进行统计、对通讯加密等等。我们采用了 DD-WRT + Radius + LDAP 这种方式和现有的基础设施连在一起,用户通过 Linksys WRT 54GS 无线 AP 输入自己内部的 LDAP 帐号就可以登陆 Wi-Fi,和我们其他服务一样 “一次登陆到处使用”。

Mac OS X Lion (10.7) 上默认使用的是 TTLS/MSCHAPv2 方式,如果使用 TTLS/PAP 的话就需要更改配置,问题是 Mac OS X Lion 的配置文件页面没有提供任何方式更改或新建配置来支持 PAP. 打开 Apple > System Preferences … > Network > Wi-Fi > Advanced … > 802.1X 后会发现是空的列表,没有新建按钮也没有导人,怎么增加一个 Profile 呢?我记得 Mac OS X Snow Leopard (10.6) 是有个新建按钮的,不知道为啥 Apple 把这个按钮去掉了,官方给的解释是通常这个 .mobileconfig 配置文件都是由网络管理员提供的,用户拿到这个文件双击就可以完成配置,不需要自己动手配置。

解决这个问题有两个办法:第一个是下载一个别人配置好的.mobileconfig 文件,其实就是一个 xml,然后调整一下后双击使用;第二个是下载 iPhone Configuration Utility 工具自己创建一个 .mobileconfig 文件。办法一可以直接到这里下载 .mobileconfig 后修改,这里不详细介绍了。这里采用办法二:

1、下载和安装 iPhone Configuration Utility 3.5 for Mac OS X 工具
2、打开 Applications > Utilities > iPhone Configuration Utility.app 选择左边列表的 Configurations Profiles;
3、按照下图在 General 页面填写信息;

ttls/pap on mac os x

4、按照下图在 Wi-Fi 页面填写必要的信息,比如 SSID 等,注意选择 WPA/WPA2 Enterprise, TTLS 和 PAP;

ttls/pap on mac os x

5、点击菜单的 Export 配置到某个文件,然后双击这个后缀名为 .mobileconfig 的文件就会自动导入到上面的 802.1X 页面,会提示输入 Radius 服务器的登陆信息等;
6、最后切换无线网络测试一下。

在 Mac OS X Snow Leopard 上安装 Ruby 和 Rails

昨天刚发布的 Rails 3.0.6 包含重要的安全更新,所以刚好在升级 Rails 的时候顺便把 Ruby 也升级一下。Mac OS X Snow Leopard 默认的 Ruby 版本是 1.8.7 的,貌似直接源代码编译升级到 1.9.2 有一些问题(网上有不少人升级到 1.9.2 的时候出问题)。最好的办法是用 RVM (Ruby Version Manager),又简单又方便,而且不会替代系统自带的 Ruby 1.8.7,以后可以随时在 1.8.7 和 1.9.2 之间切换,适合开发和移植程序,Rails 3 也支持 Ruby 1.9.2 版本。

安装必要工具

安装前确定 Mac OS X 已经安装了最新的 Xcode 开发工具,至少是 3.2.1 版本。然后安装 git 工具:

$ xcodebuild -version
Xcode 3.2.6
Component versions: DevToolsCore-1809.0; DevToolsSupport-1806.0
BuildVersion: 10M2518

$ sudo port install git

安装 RVM

安装 RVM 的方法有点不同:

$ bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

如果有代理的话,用 -x 设置代理服务器:

$ bash < <( curl -x 192.168.0.1:3128 http://rvm.beginrescueend.com/releases/rvm-install-head )

配置 RVM:

$ vi ~/.bashrc
# This loads RVM into a shell session.
[[ -s "/Users/vpsee/.rvm/scripts/rvm" ]] && source "/Users/vpsee/.rvm/scripts/rvm"

关闭 Terminal 后重新打开以便 .bash_profile 文件生效,这个时候用下面命令可以验证 rvm 是否安装成功:

$ type rvm | head -n1
rvm is a function

安装 Ruby

安装最新的 Ruby 1.9.2-p180 稳定版本:

$ rvm install 1.9.2

系统上原来是 1.8.7 的,把系统默认的 ruby 解释器设置成 1.9.2:

$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
$ rvm --default 1.9.2
$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]

检查 gem 版本是 1.3.7 或以上,以及 sqlite3 版本是 3.6.12 或以上,然后使用 gem 安装 sqlite3-ruby:

$ gem -v
1.3.7

$ sqlite3 -version
3.7.5

$ gem install sqlite3-ruby
/Users/vpsee/.rvm/rubies/ruby-1.9.2-p180/bin/gem:4: warning: Insecure world writable dir /usr/local/bin in PATH, mode 040777

$ sudo chmod go-w /usr/local/bin
$ gem install sqlite3-ruby

安装 sqlite3-ruby 的时候出现目录权限警告, 修改一下 /usr/local/bin 的权限就好了。

安装 Rails

安装 Rails 3.0.6 版本:

$ gem install rails

$ rails -v
Rails 3.0.6

升级 Ruby 和 Rails 完毕后我们就在 Snow Leopard (Mac OS X 10.6.7) 上有了一个最新的 Ruby on Rails 开发环境。