-->

網頁

2014/05/06

SVN 查詢舊 branchs 妙法

一些已經 merge 到 production 上的 branch,可能會為了查詢方便而刪除,svn list 出來只有最後一季的 branches:

$ svn list ^/branches/    # on revision 1000
fix7/
fix8/
fix9/

若要尋找舊的 branch,可以透過數「-r」指定 revision,便可列出在當時的目錄結構:

$ svn list -r 500 ^/branches/
fix1/
fix2/
fix3/
fix4/

2014/05/04

不錯的 ping service:Uptime Robot

無意間發現了一個 ping service:UptimeRobot,操作、設定都很簡單,介面的視覺設計也很棒,主機況狀一目了然。





UptimeRobot 可以使用下列方法偵測主機狀況:

  • ping
  • HTTP/HTTPS
  • port
  • keyword

2014/05/02

HTML 超連結特殊字元的 escape

測試 HTML parser 時,某段 HTML 一直被標記有誤,花了不少時間才找到原因。

在 W3 HTML spec 中有註明,「&」符號剛好用來作為 HTML entity 的起始字元,遇到該字元需要 escape。

舉例來說,有個超連結帶有參數:

<a href="search.php?val=keyword&category=3">search</a>

URL 中的「&」符號應該改為「&amp;」:

<a href="search.php?val=keyword&amp;category=3">search</a>

現今瀏覽器都很聰明,會自動辨識並修正人為錯誤,但既然有規範,還是注意一下。



為了找到 W3 HTML spec 中與這個問題有關的章節,實在吃了不少苦頭。後來發現 Firefox addon - Html Validator 可以偵測錯誤,並告知可以參考的 W3 spec 章節:



2014/04/23

瀏覽器與 HTTP Referer 之間的特性

無限期鬼打牆以後,才發現 HTTP Referer 不一定真的代表參考位址。

假設有三個頁面:

  1. form.html:填資料
  2. proccess.php:處理表單內容
  3. showError.php:表單內容有誤時,重新導向到這一頁

一般情況下 process.php 的 referer 會是 form.html、showError.php 的 referer 會是 process.php,但若 proccess.php 跳轉頁面是這樣寫:

if( ERROR ){
   header('Location: showError.php');
}

執行後 HTTP server 的回應會是 HTTP 302 而非 HTTP 200,瀏覽器不會將 302 視為正常的瀏覽行為,所以 proccess.php 不會被列入正式瀏覽記錄,當重新導向到 showError.php 時,Refer 仍然會是最後一個正式的瀏覽記錄,也就是 form.html。

若希望讓 showError.php 可以正確知道是哪一頁連過來的,就得靠其他方法了。

在這裡建議不要使用 HTTP Referer 來做判斷的依據。現有瀏覽器開發工具、外掛都可以讓人任意修改 Referer,也聽說有些防毒軟體會固定將 Referer 從 HTTP request 中刪除,再者,各家瀏覽器送 Referer 的情況也不同 (IE MUST DIE),用 Referer 判斷流程等方法會遇到不少例外情況要處理,別讓自己那麼累。



Reference:
php - HTTP_REFERRER and Location redirect - Stack Overflow

2014/04/01

將資料同步至 AWS S3

有項工作需要將 BTSync 上的資料同步上 AWS S3,並做靜態網頁使用。原本打算用來將 S3 掛載為虛擬磁碟的 s3ql 來用,但 s3ql 寫入的是 block data 而非 file,檔案同步上去要當作 static website 來用不太可能。

後來發現 AWS command line interface 的 s3 有個功能「sync」,會自動偵測要同步的項目。於是可以寫成:

$ aws s3 sync btsync/ s3://target-bucket

以上已可以將有異動的資料上傳到 AWS S3 上,但若 BTSync 若有檔案刪除,S3 上的資料仍會保留。若要刪除的動作也在 S3 重複一次,則要加上「--delete」參數:

$ aws s3 sync btsync/ s3://target-bucket --delete

還差一個步驟。要做 static web hosting,檔案必須讓所有人可以讀取,所以從網頁上操作的話,需要手動「Make Public」。


而 CLI 則是使用 --grants 幫檔案加上權限。參考 AWS ACL 設定,要讓所有人均可讀取,要設定成:

--grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers

如此一來,上傳的檔案會自動設定為公開。

完整的 sync 指令如下:

aws s3 sync btsync/ s3://target-bucket --delete --exclude ".Sync*" --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers

最後定 crontab 自動執行,大功告成。