Git
Comments

按照一般 Git branching model 來開發,當團隊人數稍多時,管理 Git branch 會變得有些麻煩。Branch 數量多之外,也很難記得哪些 branches 是已經 merge 進主幹、不再需要可以刪除;或者哪些 branches 沒有 merge 進主幹但已經放棄不用。這時就需要一些自動化的 script 幫助管理。

Read on →
Comments

常在開發或測試階段會有更換 http request host 的需求。 簡單一點的方法就是直接更改 /etc/hosts 檔案。但如果連 port 都需要轉,那就需要其他方式了。

一般在 windows 上是推薦 fiddler 2 這套軟體,非常好用。可以參考 vexed 的文章

不過在其他平台,可以使用 mitmproxy 這套軟體,他是 CUI 介面,操作上沒有 fiddler 那樣直覺,但稍微看一下說明即可上手。

mitmproxy 提供許多 API 讓使用者自訂需求,都使用 Python 來編寫。不過關於 script 的 document 較少,可以參考官方說明有簡單的範例,或者使用 pydoc libmproxy.flow.Request 這樣的指令來查閱,再不然就只能直接看原始碼了。

Read on →
Git
Comments

在 Git 操作的過程中,有些檔案是無法用 git checkout 救回來的。這些稱之為 unreachable files 。例如你 git add 了,但還沒 commit 就 pull ,這時這些檔案會被刪除,但因為沒有 commit 所以無法用 reset 救回。並且在 git reflog 裡面也不會有紀錄。

還好 Git 非常萬能,可以使用 git fsck --cache --unreachable 會列出一堆檔案的 bash ,再使用 git show <hash> 逐一檢視檔案內容即可救回失去的檔案。

Comments

It’s easy to generate a RSA keypair in PHP, just like this:

1
2
3
4
5
6
7
8
9
10
11
<?php
// Create the keypair
$res=openssl_pkey_new();

// Get private key
openssl_pkey_export($res, $privkey);

// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
?>

But when it comes to C, it’s not that simple.

You might want to use RSA_generate_key and then PEM_write_RSAPublicKey, but in fact, the output format of PHP’s openssl_pkey_get_details is not a RSA public key.

If you want to get the same result in C, you have to convert your RSA keypair into EVP keypair.

Read on →
aws, ec2
Comments

如果 hostname 每一台都要自己一一指定相當麻煩,寫了一個小 script 放在開機時執行,抓取 instance-id 後取得 Name tag 再設定成 hostname。

Comments

這個議題類似上一篇 利用 Route 53 設定 Ec2 動態 DNS ,同樣也是要解決主機名稱對應浮動 ip 的問題。

雖然現在用完整域名已經可以對應到 ip ,但是還是有很多時候我們的主機需要知道主機名稱和 ip 的對應。

這個問題大概也是可以用 hosts 或 dns 來解決,不過由於我已經把 yp nis 架設起來,其他機器可以直接吃 nis 伺服器的 hosts 檔案,所以決定用 hosts 這個方式來處理。

概念很簡單,利用 ec2 api sdk 抓取正在運行的主機列表,一一寫入 /etc/hosts 後再重新 make yp 的資料庫。

設個排程每個小時跑一下或開新機器時手動執行一下即可。

script 如下:

Comments

最近在玩 aws ec2 第一個一定會碰到的問題就是 ip 都是動態的,每次開機都不一樣。造成大部分的佈署方式會有問題,一般都是用動態 dns 來解決,原本想自己架 bind 或 djbdns ,但是架好以後還要處理動態 dns 更新的機制,於是把想法動到價格低廉的 route 53 身上,他有完整的 restful api 應該很符合我的需求。

找到這個 script 是利用 http://checkip.dyndns.com 來抓取自己 ip 再更新 route 53 的 A record 。

不過 ec2 的 public dns 有一個特性,從外面解會解到 public ip ,但是從裡面解會解到 private ip ,同一個 availability zone 用 private ip 互連是不多收費的。

如果設 A record 使用 public 連線,就沒有這個優勢了,所以我改用 CNAME 指到 ec2 的 public dns。然後原本取得 ip 的部分也改用 aws 取 meta-data 就可以了。

具體作法,可以開一個 subdomain 例如 ec2.hsatac.net ,然後把這個 subdomain delegate 給我們的 route 53 來解析。在 DNS 的部分新增一筆 NS ec2.hsatac.net 然後 server 設定為 route 53 給的那幾組即可。

Read on →
Comments

最近在玩 kvm,當 guest vm 的 network 環境不確定的時候,可以用 virt-viewer vnc 進去作設定,但總有沒有 X 或不適合使用 GUI 的狀況。這時可以利用 virsh console 這個指令進行連線。不過在 guest vm 要先修改一下設定。

首先修改 guest vm 的 /etc/grub.conf ,把 kernel 那行最後加上 console=tty0 console=ttyS0,1152200

例如:

1
2
3
4
kernel /vmlinuz-2.6.32-220.13.1.el6.centos.plus.x86_64 ro root=/dev/mappp
er/vg_w2vm001-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rr
d_LVM_LV=vg_w2vm001/lv_swap rd_NO_MD quiet rd_LVM_LV=vg_w2vm001/lv_root rhgb craa
shkernel=auto SYSFONT=latarcyrheb-sun16 rd_NO_DM console=tty0 console=ttyS0,1152200

重開 guest vm 之後,在 host 就可以用 virsh console <domain> 直接連到 ssh terminal 啦。

筆記一下在 CentOS 5 上設定 Python 2.6, hg 以及 mercurial-server。

CentOS 套件庫裡面有 hg ,不過版本很舊,而且 mercurial-server 的 hook 部分會需要 python 2.5+ 的特性,而官方套件庫裡的 hg 相依於 python 2.4,因此套件庫裡面的 hg 就不合用了。

安裝 Python 2.6 + hg

  • sudo yum install python26 python26-devel 從 epel 安裝 python 2.6
  • 抓下最新的 hg source wget http://mercurial.selenic.com/release/mercurial-2.1.2.tar.gz 解壓後不要急著 make,先修改一下 Makefile
  • line 9 的 PYTHON 改成 PYTHON=python26 讓他抓 python 2.6
  • doc 的部份應該是缺 docutils 所以會出錯,不需要 doc 直接砍掉:line 33 改為 all: build, line 53 改為 install: install-bin

  • 接著就可以 make all && su -c "make install" && hg version

安裝 mercurial-server

  • 抓下最新 mercurial-server 原始碼解壓
  • 一樣先修改 Makefile, doc 的部份一樣移除: line 53 改為 installfiles: install pythoninstall
  • CentOS 的 useradd 不支援 --system,把 --system 改成 -r。如果 repositories 的 path 想改可以順便修改 --home 的值。
  • 修改完後 sudo make setup-useradd 就安裝好了

設定 mercurial-server

  • 先把自己的 public key 放到 /etc/mercurial-server/keys/root/ 下,接著要改用 hgadmin 這個 repo 來設定
  • check out hgadmin 這個 repo hg clone ssh://hg@localhost/hgadmin
  • /etc/mercurial-server/keysetc/mercurial-server/access.conf 複製過來。
  • add, commit 後 push,以後就可以用這個 repo 來管理使用者和權限了。
  • 原本的 /etc/mercurial-server/access.conf/etc/mercurial-server/keys 就可以刪除了。

Redmine + hg

順便講一下 Redmine 和 hg 搭配,如果設定好後在 repositories 分頁一直 404,看 log 顯示 hg: error during getting info: hg exited with non-zero status: 255 的話,多半是檔案權限問題。

可以修改 redmine/config/environment.rb 打開 config.log_level = :debug 看更詳細的 log

應該可以看到實際執行的 hg 指令,用 redmine user 去執行看看就能抓出問題所在。

Git
Comments

今天在 refactor 公司的 git repository 時,有個需求,是要把原本 A repository 的其中一個目錄抽出來,獨立成 B repository。

原本以為這個需求無法達成,不過做了點研究以後發現是可行的,甚至 B repository 是已存在的 repository 也可以做到!

先說獨立出新的 repository 這個狀況,很簡單,先 git clone 出一個乾淨的 A repository 然後 git remote rm origin 不要 track remote。

接著在 git 根目錄下 git filter-branch --subdirectory-filter <目錄> -- --all 你就會看到這個目錄以外的東西都不見了,而且相關的 commit log 還在。

如果是要獨立出一個新的 repository 做到這邊就可以結束了。

接著講要把檔案和 commit log 匯到已存在的 B repository:接續上一步,用 mkdir <你要的目錄>; mv * <你要的目錄> 把抽出來的檔案都移到你預想要放的目錄 git add .; git commitcd .. 再用 git clone 把 B repository clone 出來,切到 B repository 的目錄,用 add local repository as remote 的方式 git remote add repoA ../<A repo 的目錄> 然後 git pull repoA master 就完成了。

參考:Moving Files from one Git Repository to Another, Preserving History