HOW TO: 升级Mac OS X上的GIT

  在MacOSX下使用Homebrew或其它方式安装最新版本的GIT后,往往并不能使用,系统默认调用的依旧还是比较旧的版本,原因是已经通过XCode等方式安装过git,且它们的路径优先级较高。

  下面假设你已经通过Homebrewbrew install git成功安装了GIT,但系统默认使用的还是旧版本。

1. 检查系统默认调用的是否是通过Homebrew安装的最新版本

  Homebrew安装的GIT会被软链接到/usr/local/bin目录下,所以如果你使用which git看到的结果不是/usr/local/bin/git,那么你就需要通过后面的方法修改以便能够默认使用你所安装版本的GIT。

2. 移除系统自带的版本

  如果which git返回的结果是/usr/bin/git,说明你可能通过XCode安装了其自带的GIT,其版本一般都比较低,需要移除。

cd /usr/bin
sudo mkdir backup-git-apple
sudo mv git* backup-git-apple

3. 移除可能存在的其它版本

  如果which git返回的结果是/usr/local/git/bin/git,则表示可能是你曾经使用git-osx-installer或其它方式安装过GIT,检查系统环境变量PATH可能还包含形如/usr/local/git/bin的路径。

sudo rm -rf /usr/local/git
sudo rm /etc/paths.d/git
sudo rm /etc/manpaths.d/git

  最后,重启终端,再次检查which gitgit version

  BTW: 2、3的情况可能同时存在。

终端脚本统一入口

  相较Windows用户而言,Mac和*nix用户更喜欢用脚本处理一些日常的操作,脚本语言可以是Shell、Python、Ruby、Perl或甚至是Mac上的Applescript,一段时间下来可能累计了不少,但这时又会遇到想进行某项操作时却无法快速获取相应的脚本文件,失去了使用脚本原本该有的便捷与效率。

  其实我们可以建立一个简单的Shell文件做为这些脚本的入口,只要记住一些简单的命令就可以快速的执行相应的脚本,实现方法如下:

1. 建立统一入口脚本

#!/bin/bash

#检查环境变量
if [ -z $KITS ]; then
    . $(cd $(dirname $0); pwd)/build-env.sh
fi

#Applescrit接口文件
OSASPORT=$KITSSHELL/osasport.applescript

#使用说明
function usage() {
    more "${KITSSHELL}/misc/kits-usage.txt"
}

function sshkey() {
    if [ -f $KITSSHELL/private.sh ]; then 
        . $KITSSHELL/private.sh sshkey 
    else
        echo 'kits: sshkey is not a kits command.'
    fi
}

case $1 in
    'backup' )     #备份文件到NAS
        $KITSSHELL/backup/backup.sh
        ;;
    'genpac' )     #通过GenPAC生成自动代理配置文件
        $KITS/GenPAC/genpac.py
        ;;
    'mamp' )       #MAMP管理
        $KITSSHELL/mamp.sh $2
        ;;
    'itunes' )     #部分itunes操作
        osascript $OSASPORT itunes $2 $3
        ;;
    'sshkey' )     #SSH秘钥处理
        sshkey
        ;;
    'usage' )      #使用说明
        usage
        ;;
    '' )
        usage
        ;;
    * )
        echo "kits: '$1' is not a kits command. See 'kits usage'."
        ;;
esac

  将上述内容保存为kits.sh或其它任意名称,需要注意的是上面脚本里的内容是我个人所使用的,只是作为例子,大部分是无法运行的,你需要根据自己的需要修改。

2. 添加系统环境变量

  上面的脚本虽然已经实现了做为其它脚本入口的功能,但使用时还不够方便,需要将它系统环境变量中,更容易访问,可能有人已经注意到上面代码中出现的build-env.sh文件,它的目的就是建立一些环境变量。

#!/bin/bash

# 建立Kits的运行环境
# 在~/.bash_profile 添加 source PATH/TO/build-env.sh

# 注意 这里不能用相对路径

#Kits所在目录
export KITS="${HOME}/Developer/Misc/MacOSX-Kits"

export KITSSHELL="${KITS}/Shell"
export PATH="${KITSSHELL}:${PATH}"

#建立别名
alias kits="kits.sh"

  最后再在~/.bash_profile的末尾添加. /PATH/TO/builde-env.sh(或source /PATH/TO/builde-env.sh)让它在用户登陆终端时被执行。

  经过这样设置,在任意时候任意目录下只要在终端输入形如kits usagekit mamp start等命令就可以快速执行相应的脚本了。

  BTW: 我日常使用的部分脚本都陆续放到GitHub上了,有兴趣可以看看。

MacOSX Kits

让iTunes的歌曲自动获取歌词

Fetch Lyric for iTunes

  在4321.la看到使用AppleScript自动获取iTunes曲目歌词的脚本,相当不错,自己做了些修改,添加了当歌词已存在时忽略获取,可以通过Growl通知获取的结果等功能。代码如下:

-- FetchLyric
-- DESCRIPTION: 让iTunes内当前被选中的曲目自动下载并保存歌词,若歌词已存在将被忽略,支持Growl通知
-- AUTHOR: JinnLynn http:://jeeker.net
-- LAST UPDATED: 2012-05-04
-- INTRO PAGE: http://jeeker.net/fetch-lyric-for-itunes/
-- REF: Martian http://blog.4321.la/articles/2012/01/27/use-applescript-to-set-itunes-lyrics/
property scriptName : "FetchLyric"
property baseURL : "http://lyrics.sinaapp.com/"
property isGrowlRunning : false
property statusDesc : {"歌词已存在,无需再获取。", "歌词获取成功。", "歌词获取失败。", "未选择歌曲。"}
property STATUS_LYRIC_EXIST : 1
property STATUS_LYRIC_SUCCESS : 2
property STATUS_LYRIC_FAIL : 3
property STATUS_LYRIC_UNSELECTED : 4

tell application "System Events"
    set isGrowlRunning to (count of (every process whose bundle identifier is "com.Growl.GrowlHelperApp")) > 0
end tell

script growl
    on growlNotify(artist, title, status)
        if isGrowlRunning = false then return
        tell application id "com.Growl.GrowlHelperApp"
            if title = "" then set title to "unknown"
            set the_title to title
            if artist is not equal to "" then set the_title to artist & " - " & the_title
            set the_desc to item status of statusDesc
            set the allNotificationsList to {scriptName}
            set the enabledNotificationsList to {scriptName}
            register as application ¬
                scriptName all notifications allNotificationsList ¬
                default notifications enabledNotificationsList ¬
                icon of application "iTunes"
            notify with name ¬
                scriptName title ¬
                the_title description ¬
                the_desc application name scriptName
            -- 尝试使用歌曲封面作为Growl图标出错
        end tell
    end growlNotify
end script

tell application "iTunes"
    if selection is {} then
        tell growl to growlNotify("", "", STATUS_LYRIC_UNSELECTED)
        return
    end if
    set k to count (item of selection)
    set i to 1
    repeat
        set theTrack to (item i of selection)
        set this_artist to (get artist of theTrack)
        set this_title to (get name of theTrack)
        set this_lyric to (get lyrics of theTrack)
        -- set this_artwork to data of artwork 1 of theTrack

        set fetch_status to STATUS_LYRIC_FAIL

        if length of this_lyric < 1 then
            -- 只有当歌曲中未存在歌词时才尝试获取歌词
            set requestData to "title=" & this_title & "&artist=" & this_artist
            set songLyrics to do shell script "curl -d '" & requestData & "' " & baseURL
            if length of songLyrics > 1 then
                -- 歌词成功获取
                set lyrics of theTrack to songLyrics
                set fetch_status to STATUS_LYRIC_SUCCESS
            end if
        else
            set fetch_status to STATUS_LYRIC_EXIST
        end if

        tell growl to growlNotify(this_artist, this_title, fetch_status)

        set i to i + 1
        if i > k then exit repeat
    end repeat
    -- 如果Growl未运行则显示对话框
    if isGrowlRunning = false then
        display dialog return & "歌词获取结束!" buttons {"确定"} default button 1 with icon 1 giving up after 5 with title scriptName
    end if
end tell

  USAGE: 在AppleScript Editor中新建包含上述脚本的文件,保存在 ~/Library/iTunes/Scripts 目录下,这时在iTunes菜单栏中就会出现AppleScript的下拉菜单,选中需要的歌曲执行其中的命令即可。或者也可以使用Automator将上述脚本生成系统服务,具体本文不做详述,自行Google。

  实际上实现功能需要服务端的支持,上述脚本中使用了Martian搭建在SAE上的服务端,如果你想搭建自己的服务端可以在Martian的文章中找到代码,或下载下面的文件,里面也包含了一个在服务端运行的PHP文件。

Project on GitHubDownload

  BTW: 尝试过使用歌曲封面做为Growl的图标没有成功,总提示无法生成数据,不知道什么原因。

Evernote入门教程

Evernote Logo

  这是早前给某同学写的Evernote入门教程,原文已通过Evernote共享

Read more...

禁用Mac OS X Lion的Resume功能

  Mac OS X Lion新增加的Resume功能在给使用者带来便利的同时也引发了隐私上的问题,没人希望尴尬的内容因此被呈现在他人眼前,可惜对于Resume,Lion并没有提供比较完善的配置功能,很多时候需要手动进行设置。

1. 关闭所有应用的Resume功能

  System Preferences - General - Restore windows when quitting and re-opening apps 取消选中该选项。

Resume

2. 临时禁用某个应用的Resume功能

  使用快捷键⌥⌘Q退出某个应用,下次再次打开时就不会恢复窗口,除非该应用关闭时正在编辑的文件尚未保存。

  如果某个应用已经被退出,则可以在Finder前往~/Library/Saved Application State/文件夹,找到不想再次打开时恢复窗口的应用目录,如com.apple.Safari.savedState,将其删除即可(注:比较特别的是Preview在这个目录下只是一个链接,需要进入其目录后删除其下的所有文件)。

3. 永久关闭特定应用的Resume功能

  以Safari为例,打开终端,输入以下命令:

defaults write com.apple.Safari NSQuitAlwaysKeepsWindows -int 0

  要开启Resume功能,删除该键值即可:

defaults delete com.apple.Safari NSQuitAlwaysKeepsWindows

  也可以使用Pref Setter、PlistEdit Pro等plist工具对应用的配置文件添加或删除NSQuitAlwaysKeepsWindows键值。

BTW: 不是使用Mac OS X Lion的API而是自己控制窗口恢复的应用使用上述方法无效,如Chrome 15.0.865.0 dev