如何提高工作效率 - 自動化篇

擺脫瞎忙人生,從自動化做起浪耘。作為一名職場人罢洲,有沒有為忘發(fā)匯報郵件而煩惱過踢故,有沒有因繁忙的工作而丟三落四過;作為一名程序員惹苗,有沒為每天早上 pull 代碼后漫長的編譯時間而煩躁過殿较,有沒有為各種無腦的系統(tǒng)配置而無聊過。每天我們都在這些重復(fù)枯燥的事情中桩蓉,浪費著我們寶貴的生命淋纲。如何提高工作效率成為我們至關(guān)重要的事情 ,這篇文件將會帶領(lǐng)我們通過自動化的方式院究,來有效地提高我們的工作效率帚戳。

本文大部內(nèi)容是基于 MacOS 環(huán)境的玷或,非 Mac 黨也可以借鑒其中的一些思想。

Shell Script

Shell 與 Shell Script

在談自動化之前片任,我們先來了解下 Shell Script 這門有點古老而又非常強大的腳本語言,首先我們要分清一個概念性的問題蔬胯,Shell 和 Shell Script 之間的區(qū)別:

Shell 是指一種應(yīng)用程序对供,這個應(yīng)用程序提供了一個界面,用戶通過這個界面訪問操作系統(tǒng)內(nèi)核的服務(wù)氛濒。

Shell 腳本(Shell Script)产场,是一種為 Shell 編寫的腳本程序。

這里先給大家科普下概念舞竿,但大多的時候京景,我們都統(tǒng)稱 Shell Script 為 shell,文中的其它地方的 "shell" 指的同樣是 Shell Script骗奖。關(guān)于 shell 的基礎(chǔ)語法确徙,并不在本文的討論范圍內(nèi),但在開始實踐如何通過 shell 來提高我們工作效率之前执桌,我來我簡單介紹 shell 幾個常用而又強大的功能鄙皇。

常用串聯(lián)命令

管道

管道是 shell 中非常常用的功能之一,它允許不同腳本仰挣、命令之間互相傳遞數(shù)據(jù)伴逸,例如:

ls | grep 'pars'

該命令意思是將 ls 輸出的內(nèi)容傳遞到 grep 'pars' 命令,grep 會把包含 'pars' 的內(nèi)容過慮出來膘壶。我們再舉個栗子错蝴,通過 shell 獲取 git 倉庫里中的當(dāng)前分支名:

currentBranch=`git branch | grep "*"`
currentBranch=${currentBranch/* /}

重定向

大多數(shù) UNIX 系統(tǒng)命令從終端接受輸入并將所產(chǎn)生的輸出發(fā)送回終端。一個命令通常從一個叫標(biāo)準(zhǔn)輸入的地方讀取輸入颓芭,默認(rèn)情況下是終端顷锰。同樣,一個命令通常將其輸出寫入到標(biāo)準(zhǔn)輸出畜伐,默認(rèn)情況下也是終端馍惹。如果你需要修改輸入或輸出,就需要使用到重定向功能玛界。

命令 說明
command > file 將輸出重定向到 file万矾。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file慎框。

輸出重定向良狈,指將一條命令的輸入位置重新定義,舉個例子:

ls > ls.txt

ls 輸出結(jié)果應(yīng)顯示在終端笨枯,而上面命令將 ls 的輸出結(jié)果寫到 ls.txt 這個文件中薪丁。需要注意遇西,用 > 重定向到 ls.txt 文件默認(rèn)是覆蓋的,如果需要用追加的方式寫入文件严嗜,則需要使用 >>:

pwd >> ls.txt

輸入重定向:

pbcopy < ls.txt

上面的命令的意思是粱檀,將 ls.txt 的內(nèi)容復(fù)制到粘貼板。

之所以簡單介紹這幾個常用功能漫玄,是因為如果不懂這些功能茄蚯,會影響理解下面的內(nèi)容。如果你對 shell 腳本不熟悉睦优,建議你抽空學(xué)習(xí)一下渗常,日常工作中,用到 shell 的頻率還是非常高的汗盘。

實踐是檢驗學(xué)習(xí)的唯一標(biāo)準(zhǔn)

簡單聊完 shell 這幾個常用而又強大的功能后皱碘,我們開始實踐如何通過 shell 來提高工作效率。

雙網(wǎng)卡自動配置

因我日常工作的需要隐孽,電腦需要配置雙網(wǎng)卡癌椿,這里以配置電腦的雙網(wǎng)卡為例,先附上部分配置腳本:

inside_ssid=\"WIFINAME\";
en0_ssid=\"$(networksetup -getairportnetwork en0 | sed 's/.*[:] //')\"
if [ \"$en0_ssid\" != \"$inside_ssid\" ]; then
 echo -n \"請先將內(nèi)網(wǎng)卡設(shè)置到$inside_ssid\"
else
 inside_adaptor_index=\"$(netstat -rn|grep default |grep en0 -n | cut -d: -f1)\"
 if [ \"$inside_adaptor_index\" = 1 ]; then
  echo -n \"請開啟外網(wǎng)卡缓醋,且服務(wù)順序在內(nèi)網(wǎng)卡前\"
 else
  inside_gateway=\"$(netstat -rn|grep default |grep en0|awk '{print $2}')\"
  sudo echo \"刷新配置成功\";
  sudo route -n delete -net 10.*.*.128;
  sudo route -n delete -net 10;
  sudo route -n delete -net 30;
  sudo route -n add -net 10.*.*.128 $inside_gateway;
  sudo route -n add -net 10 $inside_gateway;
  sudo route -n add -net 30 $inside_gateway
 fi
fi

這里不解析這些腳本的作用如失,我們的重點在于如何進(jìn)一步提高效率上。由于每次重啟電腦送粱,都需重新配置雙網(wǎng)卡褪贵,才能正常同時使用內(nèi)外網(wǎng),也就是說抗俄,每次重啟電腦需要重新執(zhí)行一次這個操作脆丁。懶是人類的天性,如果我們連執(zhí)行一下腳本也不想干的話动雹,那么我們需要怎么做呢槽卫?

我們可以在在電腦開機時設(shè)置自啟動任務(wù)。首先我需要創(chuàng)建一個 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>
    <key>LaunchOnlyOnce</key>
    <true/>
    <key>Label</key>
    <string>com.dengyonghao.xxxx</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/xxxxx/work/Tools/xxxx.sh</string>
    </array>
</dict>
</plist>

簡單解析下各個 key 的作用胰蝠,LaunchOnlyOnce 指定開機后只執(zhí)行一次歼培,不指定則每隔一段時間就會執(zhí)行一次。Label 指定該 plist 的唯一標(biāo)識茸塞。ProgramArguments 則是設(shè)置執(zhí)行腳本的路徑躲庄,指向你想要啟動時自動執(zhí)行的腳本路徑。

完成上面操作后钾虐,把創(chuàng)建的 plist 文件拷貝到 ~/Library/LaunchAgents目錄下噪窘,表示僅對當(dāng)前用戶生效,然后執(zhí)行:

sudo launchctl load ~/Library/LaunchAgents/xxxxxx.plist

將這個文件注冊到系統(tǒng)中效扫,然后電腦啟動時就會自動執(zhí)行倔监,完成雙網(wǎng)上的配置直砂。這里有一個問題,如果啟動時自動執(zhí)行上面的雙網(wǎng)卡配置腳本浩习,真的能正常運行嗎静暂?

事實上是不行的,因為 sudo 命令需要你輸入管理員密碼瘦锹,但你并沒有地方輸入籍嘹,所以是沒有權(quán)限進(jìn)行這些操作的。故我們需要用到 Apple Script弯院,從而引出下一節(jié)的內(nèi)容,這里先附上 Apple Script 腳本:

do shell script "
inside_ssid=\"WIFINAME\";
en0_ssid=\"$(networksetup -getairportnetwork en0 | sed 's/.*[:] //')\"
if [ \"$en0_ssid\" != \"$inside_ssid\" ]; then
 echo -n \"請先將內(nèi)網(wǎng)卡設(shè)置到$inside_ssid\"
else
 inside_adaptor_index=\"$(netstat -rn|grep default |grep en0 -n | cut -d: -f1)\"
 if [ \"$inside_adaptor_index\" = 1 ]; then
  echo -n \"請開啟外網(wǎng)卡泪掀,且服務(wù)順序在內(nèi)網(wǎng)卡前\"
 else
  inside_gateway=\"$(netstat -rn|grep default |grep en0|awk '{print $2}')\"
  sudo echo \"刷新配置成功\";
  sudo route -n delete -net 10.*.*.128;
  sudo route -n delete -net 10;
  sudo route -n delete -net 30;
  sudo route -n add -net 10.*.*.128 $inside_gateway;
  sudo route -n add -net 10 $inside_gateway;
  sudo route -n add -net 30 $inside_gateway
 fi
fi" with administrator privileges

這里只是用 Apple Script 來提供一個圖形界面來要求用戶先輸入管理員密碼听绳,才允許他繼續(xù)執(zhí)行腳本。腳本使用了 Apple Script异赫,故開機啟動項的 plist 的文件也要做相應(yīng)的變化:

<key>ProgramArguments</key>
<array>
    <string>osascript</string>
    <string>/Users/xxxx/work/Tools/xxxx.scpt</string>
</array>

關(guān)于 Apple Script 的內(nèi)容將在下一節(jié)詳細(xì)介紹椅挣,這里我們先思考一個問題:設(shè)置開機執(zhí)行后,就能解決上面說的痛點了嗎塔拳?

事實上并不能解決所有問題鼠证,比如說,開機的時候外置網(wǎng)卡沒有插上靠抑,那么自動執(zhí)行的腳本就會配置失敗量九,這時就又回到最初的場景,需要我們?nèi)フ业竭@個腳本文件颂碧,然后通過終端執(zhí)行荠列。那么我們可以怎么去優(yōu)化這個流程呢?我們帶著這個問題载城,繼續(xù)后面的內(nèi)容肌似,然后來再回來解決它。

集思廣益

在給團隊成員分享的過程中诉瓦,隊友們提出 sudo 可以明文設(shè)置管理員密碼川队,不需要每次運行時手動輸入,命令格式如下:

echo password | sudo -S xxxxxxxxx

需要注意的是睬澡,明文保存密碼存在泄露的風(fēng)險固额,建議使用這種方式前先評估風(fēng)險。

Apple Script

Apple Script 是什么猴贰?

AppleScript 是 Apple 創(chuàng)建的腳本語言对雪,用于自動執(zhí)行 Macintosh 操作系統(tǒng)及其許多應(yīng)用程序操作的語言∶兹疲可以用來控制運行于 macOS 上的程序瑟捣,以及 macOS 本身的部分內(nèi)容馋艺。你可以創(chuàng)建腳本來自動執(zhí)行重復(fù)性任務(wù),或組合多個可編寫腳本的應(yīng)用程序的功能來創(chuàng)建復(fù)雜的工作流程迈套。

我們使用 AppleScript 創(chuàng)建備忘錄捐祠、管理網(wǎng)絡(luò)、處理圖像桑李、備份文件等等踱蛀,AppleScript 是功能非常強大的自動化工具,它內(nèi)置于 macOS 系統(tǒng)中贵白,通過 腳本編輯器 應(yīng)用來編寫和運行率拒,任何用戶都可以免費使用它。

腳本編輯器

macOS 中默認(rèn)已經(jīng)提供編寫 AppleScript 的工具:腳本編輯器禁荒,我們可以通過應(yīng)用程序中找到并啟動它猬膨。

01.png

我們第一個 AppleScript 腳本

我們打開腳本編輯器并選擇新建文稿,輸入以下內(nèi)容:

tell application "Finder" to open the startup disk

點擊運行后呛伴,系統(tǒng)會在桌面打開一個新的Finder窗口勃痴,顯示啟動盤的內(nèi)容,這里我們已經(jīng)完成了第一個 AppleScript 腳本热康。

再舉個栗子沛申,通過 AppleScript 打開或者關(guān)閉 Xcode:

tell application "Xcode"
    activate
    --quit
end tell

從上面腳本可以看出,AppleScript 和自然語言非常接近姐军,編寫起來十分簡單铁材,但至于如何去學(xué)習(xí) AppleScript 的語法,這里不會多做講解庶弃,有興趣的同學(xué)可以通過官方文檔學(xué)習(xí)衫贬。

如何學(xué)習(xí) AppleScript

巧用文檔

03.png

Dash,程序員神器之一歇攻,強烈推薦一波固惯。

我們在學(xué)習(xí)一門新的編程語言時,當(dāng)在使用某個 API 遇到問題時缴守,最靠譜的解決方法不是 Google葬毫,而是先看下它的文檔 。我們可以通過 Dash 下載 AppleScript 文檔屡穗,遇到問題時贴捡,我們可以快速查閱,并且 AppleScript 的文檔并不多村砂,空閑時可以通讀一次(估計2-3小時)烂斋,逐步加深對 AppleScript 的了解。

讀懂 AppleScript 詞典

04.png

實踐出真知

匯報郵件提醒&自動生成

下面我們直接開始實操,來實現(xiàn)一個自動提醒發(fā)送重點項目進(jìn)度的工具汛骂,除了提醒功能外罕模,該工具還會自動幫你創(chuàng)建郵件模塊,包括收件人帘瞭、主題淑掌、內(nèi)容模板等,我們來看實現(xiàn)腳本:

on callback()
    tell (current date) to get (its year as integer) & "-" & (its month as integer) & "-" & day
    set dataText to the result as text
    set mailTitle to "-重點項目進(jìn)度" as text
    set mailTitle to dataText & mailTitle
    tell application "Microsoft Outlook"
        set newMessage to make new outgoing message with properties {subject:mailTitle, content:"Dear xx:<br/>以下是我的重點項目進(jìn)度情況蝶念,詳細(xì)請查看附件:<br/><br/><br/>Best Regards"}
        make new recipient at newMessage with properties {email address:{name:"xxx", address:"xxxx@pingan.com.cn"}}
        #make new cc recipient at newMessage with properties {email address:{name:"Name", address:"test@example.com"}}
        
        open newMessage
    end tell
end callback

display dialog "又到周一了抛腕,趕緊發(fā)重點項目進(jìn)度" buttons {"現(xiàn)在發(fā)", "一會發(fā)"} default button 1
if the button returned of the result is "現(xiàn)在發(fā)" then
    callback()
end if

這里我們通過 AppleScript 訪問 Microsoft Outlook 并自動生成郵件模板,以上腳本只給郵件內(nèi)容填充了模塊媒殉,但實際上還可以實現(xiàn)自動把你的重點項目進(jìn)度excel統(tǒng)計表附件進(jìn)來担敌,再進(jìn)一步的話,可以直接通過 AppleScript 讀取 excel 的內(nèi)容廷蓉,然后填充到郵件內(nèi)容中柄错,只要你在完成重點項目內(nèi)容后,及時更新 excel 統(tǒng)計表中的內(nèi)容苦酱,那么到每周一發(fā)重點項目的時候,你只需要一個命令就可以自動完成匯報郵件给猾。

我們完成了自動生成郵件模板的功能后疫萤,還需提供自動提醒的功能,關(guān)于自動提醒功能敢伸,我們可以使用 mac 的啟動服務(wù)來實現(xiàn)扯饶,和自動配置雙網(wǎng)上的方式一模一樣,我們創(chuàng)建相應(yīng)的 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>
    <key>Label</key>
    <string>com.dengyonghao.viproject</string>
    <key>ProgramArguments</key>
    <array>
        <string>osascript</string>
        <string>/Users/dengyonghao/work/Tools/viproject.scpt</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>1</integer>
        <key>Minute</key>
        <integer>30</integer>
        <key>Hour</key>
        <integer>10</integer>
    </dict>
</dict>
</plist>

需要注意的是這里多了 StartCalendarInterval 這個 key池颈,這個 key 是用來控制你腳本的執(zhí)行周期或者時間的尾序,這里設(shè)置為每周一上午 10:30 時就會自動執(zhí)行腳本。

AppleScript 的內(nèi)容就簡單介紹到這里躯砰,總之 AppleScript 非常強大每币,具體怎么使用,建議空閑時共同探討一下琢歇。

推薦閱讀

  1. Mac Automation Scripting Guide

Automator

Automator 是什么兰怠?

02.png

Automator 是蘋果公司為 macOS 系統(tǒng)開發(fā)的一款軟件,只要通過點擊拖拽鼠標(biāo)等操作就可以將一系列動作組合成一個工作流程李茫,從而幫助你自動的(可重復(fù)的)完成一些復(fù)雜的工作揭保。Automator 實際上是一些列動作組合在一個工作流文檔里,然后按順序去執(zhí)行這些動作魄宏,與我們上面所以說的腳本非常類似秸侣,但 Automator 可以橫跨多個程序進(jìn)行,并提供圖形界面進(jìn)行操作,用戶操作起來非常方便味榛。

腳本轉(zhuǎn)應(yīng)用

關(guān)于 Automator椭坚,我們可以通過實現(xiàn)腳本轉(zhuǎn)應(yīng)用的例子進(jìn)行了解,首先我們打開 macOS 自帶的 Automator励负,選新建文稿-->應(yīng)用程序-->實用工具-->運行xxx腳本藕溅,然后把你的腳本填寫進(jìn)去,然后保存生成一個應(yīng)用继榆。生成的應(yīng)用默認(rèn)是 Automator 的圖標(biāo)巾表,如果你想去改變圖標(biāo),則可以右擊應(yīng)用—>顯示包內(nèi)容-->Contents-->Resources略吨,然后把 AutomatorApplet.icns 替換成你想要的圖標(biāo)就可以了集币。

我們可以把常用的腳本生成應(yīng)用,放到常用的位置翠忠,雙擊一下就能執(zhí)行鞠苟,這樣也是挺爽歪歪的,但是這并不是我想要的秽之,我想在任意的地方法都可以快速執(zhí)行当娱,所以這里就引入了 Alfred 這個工具了。

推薦閱讀

關(guān)于 Automator 網(wǎng)上有不少教程考榨,想進(jìn)一步了解的同學(xué)跨细,推薦閱讀:Automator 簡單介紹及入門玩法 | Matrix 精選

Alfred & WorkFlows

Alfred 是什么?可能只能說是神器河质,不吹不黑冀惭,但這里我是不會講如何去使用 Alfred 的,沒有用過的小伙伴自行百度掀鹅。

Workflow 又是什么梗呢散休,Workflow 工作流的意思,它表示把多個事件聯(lián)合在一起乐尊,形成一個連貫的動作戚丸。

自我學(xué)習(xí)

這里省略成千上萬的字,需要你自行去學(xué)習(xí) Alfred 的使用科吭,或許它 --> Google 可以幫你

問題回顧

講到這里昏滴,我們可以思考下文章開始配置雙網(wǎng)卡的那個問題,估計大家都會有更好的方法了对人。

我們可以把配置雙網(wǎng)卡的 AppleScript 寫成 Alfred 的一個 workflows谣殊。比如我設(shè)置了 Alfred 的快捷打開鍵為 double com,雙網(wǎng)上配置 workflows 的 keyword 為 doublenet牺弄,這樣的話姻几,我可以在電腦的任意界面輸入:double com + doublenet + 回車,即可完成雙網(wǎng)卡的配置。

一鍋亂燉

上面介紹了一堆的工具蛇捌,看到這里抚恒,可能還是一臉懵逼,現(xiàn)在我們來通過實操络拌,來把它們一鍋燉了俭驮。

Goto iTerm

作為一名程序員,從 Finder 目錄跳轉(zhuǎn)到 iTerm 的場景非常多春贸,大多數(shù)時候我們都是通過拖動目錄到 iTerm混萝,然后 cd 進(jìn)去,效率非常低萍恕,通過學(xué)習(xí)上面的內(nèi)容逸嘀,我們可以通過 AppleScript + Hotkey 快速在 iTerm 中打開當(dāng)前 Finder 的目錄。

首先我們可以通過 AppleScript 獲取當(dāng)前 Finder 窗口的目錄:

tell application "Finder"
    set pathFile to selection as text
    set pathFile to get POSIX path of pathFile
    --防止目錄存在空格跳轉(zhuǎn)不了
    set pathFile to quoted form of pathFile
end tell

然后通過 iTerm 提供的 AppleScript API 跳轉(zhuǎn)到指定目錄:

ell application "Finder"
    set pathFile to selection as text
    set pathFile to get POSIX path of pathFile
    --防止目錄存在空格跳轉(zhuǎn)不了
    set pathFile to quoted form of pathFile
    set pathFile to "cd " & pathFile
    --set the clipboard to pathFile
    tell application "iTerm"
        create window with default profile
        tell current session of current window
            write text pathFile
        end tell
    end tell
end tell

我們完成腳本后允粤,則可以通過 Alfred 配置一個 Hotkey崭倘,用來快速執(zhí)行該腳本:

05.png

我這里面配置的 Hotkey 是 com + T,所以我只要按下 com + T类垫,則會自動打開 pwd 在當(dāng)前 Finder 窗口的目錄下的 iTerm司光。

速記大法

每次開周會時,在一周回顧環(huán)節(jié)中悉患,總是拼命回顧這周我做了那些事情飘庄,特別是分享亮點和不足的時候,就各種詞窮购撼。這里介紹一個非常有效的方法,就是每天記一記谴仙,周會不糾結(jié)迂求。其實這個方法大家都知道,只是大家都懶得記晃跺,或者是沒有找到一個好的工具揩局,我曾經(jīng)用印象筆記記錄過一段時間,但用了一段時間后掀虎,發(fā)現(xiàn)每當(dāng)腦子突然靈光一閃凌盯,有好的 idea 并想記錄下來時,然而印象筆記并沒有打開烹玉,接著自己又懶得打開來記錄了驰怎。為了避免再次發(fā)生這種事情,我通過 notes + applescript + alfred 來實現(xiàn)一個速記事情工作流:

on alfred_script(q)
    tell application "Notes"
        tell account "iCloud"
            tell (current date) to get (its year as integer) & "-" & (its month as integer) & "-" & day
            set dataText to the result as text
            set mailTitle to dataText & "-速記"
            make new note at folder "PANote" with properties {name:mailTitle, body:q}
        end tell
    end tell
end alfred_script

這段 applescript 的意思是把 alfred 獲取到內(nèi)容二打,保存到 PANote 文件下∠丶桑現(xiàn)在我們實現(xiàn)了快速記錄的功能后,我們還需要快速來查找,我們也是通過 applescript + alfred 來實現(xiàn):

use framework "Foundation"

property NSRegularExpressionSearch : a reference to 1024
property NSString : a reference to current application's NSString
property NSJSONSerialization : a reference to current application's NSJSONSerialization
property NSUTF8StringEncoding : a reference to current application's NSUTF8StringEncoding

on run argv
    set output to {}
    tell application "Notes"
        set folderNames to name of folders in default account
        repeat with folderIndex from 1 to number of folders in default account
            set folderName to item folderIndex of folderNames
            if folderName is "PANote" then
                set currentFolder to (a reference to item folderIndex of folders in default account)
                set noteIDs to id of notes of currentFolder
                set noteNames to name of notes of currentFolder
                set noteBodies to body of notes of currentFolder
                repeat with i from 1 to count of noteIDs
                    set noteBody to (NSString's stringWithString:(item i of noteBodies))
                    set noteBody to (noteBody's stringByReplacingOccurrencesOfString:"<[^>]*>|
" withString:" " options:NSRegularExpressionSearch range:{0, noteBody's |length|()})
                    set noteBody to (noteBody's stringByReplacingOccurrencesOfString:"^ +| +$| +(?= )|" withString:"" options:NSRegularExpressionSearch range:{0, noteBody's |length|()}) as text
                    set match to (item i of noteNames) & " " & folderName & " " & noteBody
                    if length of noteBody is less than 100 then
                        set subtitle to noteBody
                    else
                        set subtitle to text 1 thru 100 of noteBody
                    end if
                    set subtitle to folderName & "  |  " & subtitle
                    set end of output to {title:(item i of noteNames), arg:(item i of noteIDs), subtitle:subtitle, match:match, uid:(item i of noteNames)}
                end repeat
            end if
        end repeat
    end tell
    
    set output to {|items|:output}
    set output to NSJSONSerialization's dataWithJSONObject:output options:0 |error|:(missing value)
    set output to (NSString's alloc()'s initWithData:output encoding:NSUTF8StringEncoding) as text
    return output
end run

這里的代碼看起來非常多症杏,其實原理非常簡單装获,首先遍歷 default account 下的所有文件夾,然后找到 PANote 這個文件夾厉颤,把查找到的內(nèi)容格式化后傳給 output穴豫,alfred 會幫我們把 output 的內(nèi)容以列表形式展示出來。當(dāng)我們選中展示中的內(nèi)容時逼友,我們還需要在 Notes 里面打開相應(yīng)的內(nèi)容精肃,故我們再實現(xiàn)一個打開 Notes 的腳本:

on alfred_script(q)
    tell application "Notes"
        show note id q
    end tell
end alfred_script

需要注意的是,這個方法 id 參數(shù)是從上一段代碼中的:

output to {title:xxxx, arg:xxxx, subtitle:xxxx, match:xxxx, uid:xxxx}

arg 里面獲取的翁逞,這個是 alfred 定義的格式肋杖,我們無須關(guān)心他是如何實現(xiàn)的,只要按照 alfred 的規(guī)范來傳參就可以了挖函。

自動拉代碼并編譯

每天早上我到公司的時候状植,首先是去洗杯打水,然后拉代碼編譯怨喘,接著等待漫長的編譯時間津畸,日復(fù)一日,風(fēng)雨無阻~~但在某個發(fā)呆的瞬間必怜,突然有一個想法肉拓,為啥不讓系統(tǒng)在我到公司前把代碼編譯好呢,我到公司的時候就可以直接工作梳庆,不用等待漫長的編譯過程了暖途。

有了這種想法,就要動手去做膏执,我們把任務(wù)一步步地拆分驻售,首先是拉代碼,在拉代碼前更米,我們需要先檢查倉庫是否干凈欺栗,然后默默寫下以下腳本:

checkGitWorkspaceClean() {
    echo "Action - checkGitWorkspaceClean"

    if [ $# -lt 1 ]; then
        echo "One param is required - the check dir.";
        exit 1;
    fi

    if [ ! -d $1 ]; then
        echo "The dir does not exist - $1";
        exit 1;
    fi

    currentDir=`pwd`
    cd $1

    result=`git status -s`
    if [ -n "$result" ]; then
        echo "The git workspace is not clean - $1"
        exit 1
    fi

    cd $currentDir
}

這里通過 git status -s 命令來判斷當(dāng)前倉庫是否是可拉取代碼狀態(tài),如果不可拉取就直接退出征峦。

接著下一步是拉取當(dāng)前所有分支的最新代碼迟几,我們需要獲取分支名并拉取該分支的最新代碼:

pullLatestCode() {
    echo "Action - pullLatestCode"

    if [ $# -lt 1 ]; then
        echo "One param is required - the check dir.";
        exit 1;
    fi

    if [ ! -d $1 ]; then
        echo "The dir does not exist - $1";
        exit 1;
    fi

    currentDir=`pwd`
    cd $1

    currentBranch=`git branch | grep "*"`
    currentBranch=${currentBranch/* /}

    `git pull git pull --rebase origin ${currentBranch}`

    cd $currentDir
}

有沒有覺得這些代碼很熟悉,其實在 shell 那節(jié)都有介紹過的栏笆,這里只是把上面說的內(nèi)容應(yīng)用到實際的場景中而已类腮。

拉取完成代碼后,我們就可以通過 xcodebuild 編譯代碼蛉加,xcodebuild 參數(shù)可以參考 apple 官方幫助文檔存哲,這里你默認(rèn)使用模擬器進(jìn)行編譯:

buildProject() {
    echo "Action - pullLatestCode"

    if [ $# -lt 1 ]; then
        echo "One param is required - the check dir.";
        exit 1;
    fi

    if [ ! -d $1 ]; then
        echo "The dir does not exist - $1";
        exit 1;
    fi

    currentDir=`pwd`
    cd $1

    xcodebuild -workspace ${PARS_PROJECT_NAME}.xcworkspace -scheme ${PARS_PROJECT_NAME} -sdk iphonesimulator build

    cd $currentDir
}

這樣我們整個拉取和編譯流程都可以通過代碼來實現(xiàn)了因宇,但是在編譯代碼前,應(yīng)該先檢查下倉庫是否有沖突祟偷,如果有沖突就不開始編譯察滑,所以正確的流程是:

checkGitWorkspaceClean $PARS_PROJECT_DIR
pullLatestCode $PARS_PROJECT_DIR
checkGitWorkspaceClean $PARS_PROJECT_DIR
buildProject $PARS_PROJECT_DIR

當(dāng)不能正常完成編譯時,可以通過 AppleScript 顯示一些可視化的提示修肠,比如彈窗之類的贺辰,這一些優(yōu)化依據(jù)個人習(xí)慣添加就可以,不過多講解嵌施。

如果你覺得在終端編譯不夠直觀饲化,無法直接看到編譯進(jìn)度,我們則可以通過 AppleScript 來優(yōu)化代碼編譯流程,直接調(diào)用 Xcode 來編譯或者運行代碼:

tell application "Xcode"
    open "/Users/xxxxx/xxxx/xxxxx/xxxxx.xcworkspace"
    set workspaceDocument to workspace document "xxxxx.xcworkspace"
    repeat 120 times
        if loaded of workspaceDocument is true then
            exit repeat
        end if
        delay 1
    end repeat
    if loaded of workspaceDocument is false then
        error "Xcode workspace did not finish loading within timeout."
    end if
    set actionResult to run workspaceDocument
    repeat
        if completed of actionResult is true then
            exit repeat
        end if
        delay 1
    end repeat
end tell

到這,已經(jīng)把最關(guān)鍵的拉取和編譯代碼的功能講完膊升,至于如何定時執(zhí)行咱揍,在上文已經(jīng)詳細(xì)介紹過并思,這里不重復(fù)講解。但是定時任務(wù)存在一個不太方便的問題,就是當(dāng)你電腦關(guān)機或者休眠時,這個定時任務(wù)就不會啟動族奢。設(shè)置電腦一直待機不休眠也不太好,畢竟公家財產(chǎn)也是要愛護的丹鸿,比較折中的方法是把這個腳本寫成 alfred 的 workflows越走,我們到公司時,可以先花 1-2 秒時間來執(zhí)行這個 workflows靠欢,然后再去洗杯打水吃早餐之類的廊敌,等你把亂七八糟的事情搞定了,代碼也快編譯好了门怪。

集思廣益

在給團隊成員分享的過程中庭敦,隊友們就自動拉代碼并編譯時機方面,提出了更好的方案:每天晚上12點(大家都下班的時候)時執(zhí)行腳本薪缆,執(zhí)行完成后通過腳本讓電腦休眠,從而避免電腦長時間待機伞广。

總結(jié)

本文簡單分享如何通過工具拣帽,來處理日常工作中遇到的一些煩瑣的事情 ,通過使用腳本等方式來實現(xiàn)自動化嚼锄,從而提升個人的工作效率减拭。這里僅提供一個思路和一些例子,至于如何發(fā)揮区丑,就得看你自己如何去使用這些工具了拧粪,總之修陡,工具是越用越合手的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末可霎,一起剝皮案震驚了整個濱河市魄鸦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌癣朗,老刑警劉巖拾因,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旷余,居然都是意外死亡绢记,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門正卧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢熄,“玉大人,你說我怎么就攤上這事炉旷∏┛祝” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵砾跃,是天一觀的道長骏啰。 經(jīng)常有香客問我,道長抽高,這世上最難降的妖魔是什么判耕? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮翘骂,結(jié)果婚禮上壁熄,老公的妹妹穿的比我還像新娘。我一直安慰自己碳竟,他們只是感情好草丧,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莹桅,像睡著了一般昌执。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诈泼,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天懂拾,我揣著相機與錄音,去河邊找鬼铐达。 笑死岖赋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓮孙。 我是一名探鬼主播唐断,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼选脊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脸甘?” 一聲冷哼從身側(cè)響起恳啥,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斤程,沒想到半個月后角寸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡忿墅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年扁藕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚脐。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿柑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棍弄,到底是詐尸還是另有隱情望薄,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布呼畸,位于F島的核電站痕支,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛮原。R本人自食惡果不足惜卧须,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儒陨。 院中可真熱鬧花嘶,春花似錦、人聲如沸蹦漠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笛园。三九已至隘击,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間研铆,已是汗流浹背埋同。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚜印,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓留量,卻偏偏與公主長得像窄赋,于是被迫代替她去往敵國和親哟冬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容