講個秘訣:加快 git pull 和 git push 速度

SSH 有個功能是可以沿用已經存在的 host 連線,如果再連一次就會比較快。首先編輯 ~/.ssh/config 加上:


ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r

接著讓我們一直掛著 GitHub 的 SSH 連線……


ssh -N [email protected]

讓我們實驗看看效果如何:

使用前:


> time git pull

real	0m3.117s
user	0m0.055s
sys	0m0.045s

使用後:


> time git pull

real	0m0.765s
user	0m0.037s
sys	0m0.042s

嗯,效果非常好。

出處:GitHub hack: speed up git push and git pull

Systems Operations on AWS 課

這禮拜去參加 Systems Operations on AWS 課程,上課的範圍其實跟上次的 Architecting on AWS 很接近,重點跟細節程度有些差異,操作 Labs 更多有九個,而且不少是用 CLI 操作而非 Management Console。上課也比較注重操作細節,連投影片字也比較多… XD

第一天教 VPC 跟 EC2,Lab1 是操作設定 Public Subsnet+Private Subnet+IGW+NAT,不像上次的課用 Wizard 設定,這次需要一個一個設定進行操作。 Lab2 練習用 AWS command line (CLI) 開 ec2 機器。

第二天教 EBS, Tagging, Monitoring, Backup 等等。Lab3 用 CLI 操作 EBS Snapshot、EBS Prewarn、合併兩個 EBS 成更大的 Logical Volumn。Lab4 用 CLI 操作 Tagging。Lab5 設定 Custom Metric 到 CloudWatch,並設定 Custom Alerm (這可以用來搭配 Auto scaling)、練習整合 Auto scaling 和 3-party Monitoring 工具(當新增或移除機器時,會通知 Monitoring server)。Lab6 則是資料庫的 Backup&Restore,使用 EBS Snapshot 和 RDS 不同方式練習。這裡它特別強調 Consistent snapshots 的概念,需要 pause write 和 flush to disk 並鎖住 DB 才作 Snapshot。Lab 7 是一個用 CLI 抓 RDS 重設密碼事件的小練習。

這一天最大的收穫應該是了解 CloudWatch 可以做 Custom Metric,以來它可以用來搭配 Auto Scaling 使用,以及如何整合 3-party monitoring 工具。

第三天教 Log 管理(因應 Auto Scaling,所以 Logs 有集中管理的需求)、Auto Scaling 跟 Cost 管理。Lab 8 練習設定 Logrotate 把 logs 傳到 s3,以及在 Auto Scaling 的情況下,記得關機前傳 log。Lab 9 練習建立一個 Auto Scaling 環境,也是一樣有一個做好的 PHP 會模擬操 CPU,然後就 scaling 自動開機器。這個練習跟上次上課的很像。最後還有一個不是 Lab 的練習是分析一個 Cost 成本 Excel 表。

對了,我會建議上課記得帶個平板 iPad,他的講義有 App 可以離線閱讀。這樣 Lab 操作時就可以邊看邊操作。

Architecting on AWS 課

這禮拜去上了三天的 Architecting on AWSTraining 課。查了一下這課在美國要收 USD $1,800,不知道為什麼台灣這麼好是免費的,佛心。

講師是個印度人,英文口音一開始有點不太習慣,不過反正跟著投影片教材走,理解上不會有太大的困難。教材是要來上課現場才會開放讓你下載的,算是這課的精華所在吧。教材投影片包含了詳細的註解補充很不錯,Lab 教材則有一步一步的操作說明,照著作就可以完成練習。

第一天: 上架構原則跟安全知識,Lab 1 練習開 VPC 網路

第二天: 介紹 IAM,Lab 2 練習設定 IAM。接著介紹 Route 53, ELB, CloudFront, CloudWatch, Elastic Beantalk 跟 CloudFormation。介紹 Auto scaling 的觀念跟 Pattern、如何 bootstrapping ec2 instances、Storage scaling (EBS,S3…etc) 的策略跟使用情境。最後是 Lab 3 設定一個 Auto scaling 架構出來,它給了一個簡單的 web app 可以操CPU,然後自動開 EC2 instances 擴充上去。挺有意思。下課前分組討論一個模擬架構是跨 regions 的文件分享系統。

第三天: 介紹 Application services: SQS, SNS, SWF, SES, CloudSearch 等等、Cost 概念以及 HA(high availability) 跟 Disaster Recovery(DR) 概念跟策略,最後教如何說服老闆改用 Cloud 架構、如何寫搬家計畫等等。Lab 4 則是利用 SQS 跟 Auto scaling 設定一個 Batch Processing Cluster,它給了一個簡單的圖片處理 script 當作 worker instances,然後當 SQS 等待的訊息過多時,會自動開 ec2 instance 擴充上去,處理完的圖片丟上 S3,也是一個很有趣的練習。

內容雖然免不了有基本 AWS 功能介紹,不過有教一些架構策略跟 Lab 練習算是不錯的收穫。VPC 跟 auto scaling 我之前都是知道但沒實際操作過,這次跟著教材練習很快就完成了 :)

我還報名了兩週後的 Systems Operations on AWS 課,到時再來比較看看。

BTW,午餐是 Buffet 自助餐還不錯。

RubyConf Taiwan 2014 售票開始

今年的 RubyConf Taiwan 日期是 4/25-26,地點在陽明大學,目前已經開放報名啦!!

本屆 RubyConf Taiwan 的邀請講者有:Rails Girls 社群創辦人 Linda Liukas 和 Terence Lee,她們將一同上台分享Rails Girls社群創辦經驗;Ruby 之父松本行弘先生與 Ruby 核心開發者笹田耕一先生是第二次在 RubyConf Taiwan 進行演講,展現他們對 Ruby 社群在台灣發展盛況的贊許與支持;還有 JRuby 的主要開發者 Charles Nutter;另外,以良葛格之名廣為人知的 Java 及 Python 語言的教育專家林信良先生也將發表主題演講;更有來自國內外的諸多程式好手分享心得與發現。本屆會議的內容精采可期,不容錯過。

摘錄自新聞稿

如何在本地端取出和送出 Github 的 Pull Requests

最近意識到 Github 上的 pull requests 其實也是 branches 參照,所以你也可以根據 pull request 編號在本地端直接取出。對於常用 pull request 功能來作 code review 的團隊來說,是蠻方便的小技巧。

首先編輯專案下的 .git/config,加上 fetch = +refs/pull/*/head:refs/remotes/origin/pr/* 這一行,例如:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = [email protected]:ihower/sandbox.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

接著打 git fetch origin 就會抓下來這些 remote branches:

From github.com:eduvo/keybridge
 * [new ref]         refs/pull/1/head -> origin/pr/1
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/3/head -> origin/pr/3

接著用 checkout 取出,例如 git checkout pr/3 即可。

喜歡的話,也可以設成 git 全域設定,直接套用所有專案:

git config --global --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/origin/pr/*"

參考資料: Checkout Pull Requests Locally

本地端送 Pull request

舉一反三,那要怎麼在本地端送 Github 的 Pull Request? 參考 HSATAC 的這篇:用 Commandline 發 Github Pull Request

首先安裝 github 的 hub 工具:

brew install hub # 或
gem install hub

編輯 ~/.bash_profile

# https://gist.github.com/hSATAC/5591270#file-gistfile1-sh
# Usage: pr (pull request current branch into develop)
# Usage 2: pr stable (pull request current branch into stable)
# Notice: replace "team" with your github team account.
 
function pr() {
    base=$1;
    if [ "$1" == "" ]; then
        base="develop"
    fi
    hub pull-request -b team:"$base" -h team:`git rev-parse --abbrev-ref HEAD`;
}

程式設計不像建築工程,而是園藝維護

Update: Real Software Engineering by Glenn Vanderburg 這場演講也值得一看

前一陣子念「笑談軟體工程:敏捷開發法的逆襲」這本書,其中有幾篇文章的說法和比喻常被引用,所以我按圖索驥,也把原文章拿出來念一念,包括:

1. What Is Software Design? by Jack W. Reeves

「原始碼就是設計」「 Source code is the design」,避免花費太多時間在分析設計上,原始碼本身就是是軟體設計的產生,而 compile, link 等才是軟體的生產活動。因此,寫程式是「設計」的活動,而不是「生產」的活動,因此傳統設計文件的重要性就大大降低了。

程式設計不是 “building software”,而是 “designing software”。

2. Is Design Dead? by Martin Fowler

軟體系統的設計是演進來的,不能一步到位,而是要藉由憑繁與使用者互動得到的回饋來修改系統設計。

3. Programming is Gardening, not Engineering

與其把程式設計比喻成蓋房子,實際上更像是園藝。

4. Orthogonality and the DRY Principle

所有程式設計活動其實都是維護,因為絕大部分的時間都在改code,寫一點改一點。即使是新專案,也很快需要回頭作修改。

後兩篇是 A Conversation with Andy Hunt and Dave Thomas 訪談。Andy Hunt 和 Dave Thomas 是 The Pragmatic Programmer 這本經典的作者,他們後來共同創辦了 Pragmatic Bookshelf 這家出版社。其他五篇訪談也值得一看,都是關於軟體開發的真知灼見: