星期四, 5月 18, 2017

BOM break iconv

BOM, byte-order mark 是用來標示 Unicode 檔案的記號。例如我們常用的 UTF-8 文字檔,前三碼應該會是 EF BB BF,在 Linux / Mac Terminal 可以這麼看:
  • xxd fileName | head -n 1
這種檔案要交給 iconv 轉碼會遇到問題,例如:
  • iconv -f utf8 -t big5 fileName > fileName.big5
  • iconv: fileName:1:0: cannot convert
所以要先去頭三碼:
  • mv fileName fileName.bom
  • tail -c +4 fileName.bom > fileName
再轉碼就可以了。但有時候是需要反過來,為轉碼結果補 BOM,可以這麼做:
  • echo -ne '\xEF\xBB\xBF' > fileName.utf8
  • iconv -f big5 -t utf8 fileName.big5 >> fileName.utf8
[2017/06/02]
在中文版 Windows 要一次將許多 Big5 編碼的文字檔轉成 UTF-8 編碼,可參考這篇以 Powershell 解答的作法。

星期三, 5月 17, 2017

Web site time check

有些網路訂票、報名之類的頁面,往往秒殺,所以事先了解對方有沒有依網路校準時間相對重要。在 Linux 或 Mac 上可藉由以下指令探測對方的時鐘:
  • while sleep 1; do curl -sI http://... | grep Date; done

星期六, 5月 13, 2017

Visual Studio Team Services + Jenkins

除了 BitBucket 以外,Visual Studio Team Services 似乎也能成為雲端免費版控服務的提供者,平時用 Visual Studio 編輯程式,持續整合時用 Jenkins 往 VSTS 取程式下來。但一開始試得不那麼順利,原來是有許多秘辛:
  • VSTS 預設使用名為 Personal Access Tokens 的認證機制,不能與 Jenkins GIT_ASKPASS 相通,但若搭配 GitHub 上一個叫 Git-Credential-Manager-for-Windows 的用戶端軟體,在安裝時它會順道帶一個版本合適的 Git for Windows,省去許多麻煩。
  • 在某部電腦上若已用 Microsoft Account 連過 VSTS 並有版控存取權,也裝了上述的 GCM for Windows,就可透過命令列 git ls-remote -h https://yourVSTSAccount.visualstudio.com/DefaultCollection/_git/yourProject 測通。這時由於是透過 Personal Access Tokens 認證的,所以不需輸入帳密。
  • 即然不輸入帳密就能連有點不踏實,可以系統管理員身分下指令「git config --system --unset credential.helper」關閉,之後每次存取 VSTS 就要輸入帳密,而且輸入正確也沒用。
  • 會慌嗎?沒事的,同樣以系統管理員身分下指令「git config --system credential.helper manager」,一切又恢復不需帳密即可存取的原樣。
  • 此時可到 VSTS 網頁介面,右上角登入者的頭像下拉選單,Security -> Alternate authentication credentials -> Enable,輸入密碼兩次並儲存,未來即可在不依賴 credential.helper 的情況下存取 VSTS。
  • 回到 Jenkins,GIT_ASKPASS 的條件之一就是沒有 credential.helper,所以就通了。

星期五, 5月 12, 2017

Minimum and vulnerability-free .NET web project


為了驗證 Checkmarx 掃出的資安弱點與解法,需要這樣的 .NET 基礎專案當底:
  1. Solution 方案內僅有一個 Web Application 專案。
  2. 專案內僅有 Web.config,沒有其他任何網頁、樣式、前後端程式。
  3. Web.config 僅有如附圖的必要內容。
  4. 若以上條件皆符合,Visual Studio 能通過建置,且 Checkmarx 掃描沒有任何資安弱點。

星期五, 5月 05, 2017

Jenkins Node @ CentOS 6.7 can't fetch git via GIT_ASKPASS

最近忙著將 Jenkins 的工作分散到幾個 Node 上,其中一個要去 Git 抓原始碼總是卡在 git fetch 401,但若在 Terminal 下 git fetch ... https://user@githost... 又都沒問題?
我想錯誤應是來自於 Jenkins 的 Git Plugin,從 log 來反推它的決策過程:
  • > git --version
  • using GIT_ASKPASS to set credentials
  • > git fetch ...
以上是指出 Git Plugin 下了 git --version 命令取得結果之後,決定用 GIT_ASKPASS 這種比較新的做法來傳遞帳密,但我的 git --version 是 1.7.1,其實並不支援 GIT_ASKPASS(有個說法是 1.7.1.1 才開始),參考這篇到 WANDisco's CentOS repository 裝上新版 git 立刻就解決了。