Terminal find a program runing on a port

查詢哪些程式跑在某一個 port

sudo lsof -i :80 # checks port 80

git remove remote branch

一般來說想要刪除遠端的 branch 直接使用:

git push REMOTE_NAME BRANCH_NAME
sample: git push origin dev

但是可能你無意中把 branch 名稱與 tag 名稱設定相同,當你想要刪除時 git 會給你錯誤訊息:
error: dst refspec BRANCH_NAME matches more than one
error: failed to push some refs to 'https://github.com/IskenHuang/xxxxxxxxxxxxx.git'

這時候如果你還是想要刪除遠端的 branch 請改下指令:
git push REMOTE_NAME :refs/heads/BRANCH_NAME
sample: git push origin :refs/heads/dev

相關連結
Deleting remote branches

sailsjs router regex

相信很多人都有在 sailsjs 的 config/router.js 中看到下面這段,這問題就是當 controller 與 static directory 衝突時 router 該如何處理,官方其實在下面這段有寫出解決方案,但實際使用上沒辦法正常運作。

// What about the ever-popular "vanity URLs" aka URL slugs?
// (you remember doing this with `mod_rewrite` in PHP)
//
// This is where you want to set up root-relative dynamic routes like:
// http://yourwebsite.com/twinkletoezz993
//
// You still want to allow requests through to the static assets,
// So we need to set up this route to allow URLs through that have a trailing ".":
// (e.g. your javascript, CSS, and image files)
'get /*(^.*)': 'UserController.profile'

如果想要達到相同的效果可以使用另一個方式如下:
'get /[^.?]+?': 'UserController.profile'

但這時可能會遇上另一個問題,原本 sailsjs 的 router 設計為 :controller/:action,所以如果是想要把所有 '/XXXXXXXXX' 都對應到 UserController 的 action,就沒辦法在 controller 的 req 拿到 req.param('action') 取得要對應的 action,因此可以將上方這段修改為:
'get /:action([^.?]+?)': 'UserController.profile'

修改完後只要是連到 '/XXXXXXXXX' 都會被指向 UserController 的 profile action,而 UserController.profile 的 req.param('action') 就會是 XXXXXXXXX 的名稱,如果是連到 '/logo.png' 等連結會被指向 static directory,這邊也建議如果要使用這種方式請把 profile 改為 index,由 index 來做處理,畢竟 profile 這字這樣使用不太恰當。


如果是想要只開放幾個特殊狀況才進行上面這段可以修改為:
'get /:action(profile|page)': 'UserController.profile'

這樣修改後會發現只有 '/profile', '/page' 會指向 UserController 的 profile,而 req.param('action') 也會拿到 profile/ page,其他的如果沒有 static file 就會被導到 404。


-------- update 2013-11-11 -------
其實這段 regex 跟原本的寫出來會略有不同,真正原因是 sails 會對這段 regex 作些調整:
如果你寫 /:action(*) 會被 sails 轉譯為「^\/(?:( YOUR_REGEX ))\/?$」,而「*」會被改為「.*」也就是所有字元都可以,這部份目前看起來是直接將轉譯後的 regex 對應到 expressjs 的 router。
-------- update 2013-11-11 -------


相關連結
sailsjs document - router

search code in git commit history

常常寫到一半看到過去的一段 code,內心的 OS 不禁嘶吼「WTF 怎麼會這樣寫」,這時候就只好回去找是哪一次 commit,但問題來了,每個 file commit 數量這麼多要怎樣找?還好 git 有提供查詢的功能(淚奔~~~)

如果只是要查詢專案目前的 source 可以使用下面這行,REGEX 就是你想查詢的條件,當然還有很多參數可以帶(請參考:http://git-scm.com/docs/git-grep)

git grep REGEX

如果是要收尋整個專案所有過去的 commit 可以使用下面這行,SEARCH_STRING 就是想要搜尋的字串,FILE_PATH 檔案的路徑,如果是想要搜尋整個專案可以使用「.」,詳細參數可參考:http://git-scm.com/docs/git-log
git log -S SEARCH_STRING FILE_PATH

相關連結
http://git-scm.com/

facebook page feeds

由於看到一些 feed 內容還不錯,但是每次從 RSS reader 看完後再手動儲存下來有點累(我習慣儲存在 google form),雖然每次作一次這種複製貼上的過程中可以再多看一眼,但久了還是會累(已經蒐集了700多筆後...)

Facebook 的 page 有提供 rss feed 給其他網站使用,其提供的型態有三種 AOTM, RSS2.0, JSON,使用方式如下:

JSON https://www.facebook.com/feeds/page.php?format=json&id=246748395427671

ATOM https://www.facebook.com/feeds/page.php?format=atom10&id=246748395427671

RSS https://www.facebook.com/feeds/page.php?format=rss20&id=246748395427671


最後面所帶的 id 就是 pageId,如果不知道 pageId 可以到下方連結查詢,只要把 url 中的 'AppStore' 至換成你的 page 名稱
https://developers.facebook.com/tools/explorer/?method=GET&path=AppStore%2Ffeed

查詢結果會顯示 pageId 如下圖


以上已經完成了一大步,順利取得 Feed 來源,接來來就是快快樂樂使用 Google Apps Script 自動儲存到 google form 中 :)

相關連結
facebook developer
Google Apps Script

SlideNote new feature transition and themes

SlideNote 過去只有一個樣板,我認為字型就像是投影片的靈魂,沒有好的字型看起來就是有點缺陷,所以新增了 8 個字型與配色,以及 7 種過場動畫。

Screenshot


字型、配色:Default, Beige, Moon, Night, Serif, Simple, Sky, Solarized


Transition:Cube, Page, Concave, Linear, Fade, None


相關連結
SlideNote

http response \ufeff

前幾天遇上從 server api 拿到的 response 會在第一個字元收到 \ufeff,jquery 的 ajax 會直接 fail,但直接看 response 會發現 status code 一樣是200,json 的內容也是正常,但 ajax 就是會變成 fail。

目前查詢到的資料來看,這是 utf8(BOM) 的問題, IDE 的編碼在儲存時如果編碼為 BOM 會在第一個字元插入\ufeff,而\ufeff這字元是個特殊的空白字元,一般的 IDE 會自動把這濾掉,所以你將 response 貼上 IDE 想要檢查問題出在哪一般也看不到,建議使用 vim 來看,會清楚的看到這字元,或者 chrome 的 inspect 也會發現如下圖的紅點:


其實這問題看起來真的跟使用的語言無關,似乎與 IDE 關係比較大,從 google 搜尋看起來就是跟網路相關的語言都容易碰上(如下圖)


Nodejs 的 V8 會自動將這字元濾掉,除非你連續寫了兩個\ufeff,不然不會發生,其他語言可能就要注意一下,在發生這問題請不要懷疑自己寫的 code,應該先去查 IDE 的編碼,而這問題也不會是前端的問題,由 server side 處理更為恰當。