2015年8月19日 星期三

2015年8月7日 星期五

Jenkins CI build verison

目前的 project 是會去讀某個特定檔案裡的字串來當作 installer 的版號
而且剛好 build 環境有裝 perl

所以要用 Jenkins 的 build 版號來取代那個特定的檔案就變得超容易

set /a BUILD_VER=%BUILD_NUMBER%+2140
perl -pi.bak -e 's/2140/%BUILD_VER%/g' src\path\to\version.h

  • -p processes, then prints <> line by line
  • -i activates in-place editing. Files are backed up using the .bak extension

2015年7月30日 星期四

wxWidget with Visual Studio

wxWidgets Compile Option:

    UNICODE=1 SHARED=1 VENDOR=xxx MONOLITHIC=1

Visual Studio x64/Release Project Properties:

C/C++ > General > Additional Include Directories:
    "C:\wxWidgets-2.9.4\lib\vc_x64_dll\mswu";
    "C:\wxWidgets-2.9.4\include";

C/C++ > Preprocessor > Preprocessor Definitions:
    WXUSINGDLL; _UNICODE

Linker > General > Additional Library Directories:
    "C:\wxWidgets-2.9.4\lib\vc_x64_dll"

Linker > Input > Additional Dependencies:
    "wxmsw29u.lib"

Hints:

    Include path 記得要設定到對的path, 因為 setup.h 在很多個目錄都可能會出現,在我的環境裡我要使用的是 "C:\wxWidgets-2.9.4\lib\vc_x64_dll\mswu\wx\setup.h",如果設錯的會,compiler 會抱怨找不到 wxbase294.lib ... 但這個檔案應該是錯誤的,他真的不存在,選到正確的 path 後就不會該 error  了
 
    如果沒有設定正確的 Additional Dependencies 會出現 unresolved external symbol 如下的 compile error....

error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl wxString::~wxString(void)" (__imp_??1wxString@@QEAA@XZ) referenced in function "public: void * __cdecl wxString::`vector deleting destructor'(unsigned int)" (??_EwxString@@QEAAPEAXI@Z)


2015年7月4日 星期六

windows 7 瘦身

為什麼喜歡用 OSX ? 我想有一半以上的原因是因為它的字體吧!
雖然 windows 的瀏覽器可以用微軟正黑體或者 Google Noto Fonts
但我還是很不習慣 windows 系統預設過於纖細且不平衡的字體....
以前勤奮的時候還會用 GDI++ or MacFonts 去渲染系統的字型
但是 OSX 一裝好就都不用再做其他調整真的讓我很開心...

但有時候還是得要用 windows
例如公司專案的 Microsoft Visual Studio...選者 vSphere Client
在 Parallels 裡面用 Garena 打 LoL...etc...

Windows VM 要怎麼瘦身呢?
  • 關閉系統還原點
  • 關閉 Hibernation: powercfg /h off
  • 討人厭的 winsxs: 清理磁碟空間的時候,點選清理系統檔案  (KB52386)
  • 刪除%systemroot%/software distrobution/download 裡面的暫存檔

不過這樣我的 winsxs 還是有將近 10G... 我想還是要等 windows 10 出來後,看能不能讓 windows 不要再越用越肥大了...

或說我把用了一年的 Mavericks 升級到 Yosemite 瞬間多了 30多G 的可用空間出來...
OSX 真的是太強大了....


Ref: Disk Cleanup Wizard addon lets users delete outdated Windows updates on Windows 7 SP1 or Windows Server 2008 R2 SP1

Dell U2415 Power Save Mode

換下舊的 VK266H 把 U2415 接上 HDMI port 做雙螢幕輸出,
螢幕卻總是顯示 Power Save Mode.
原本以為是 HDMI 線不合,後來再搜尋了一下文章
發現 Dell 的客服有教一些特別的步驟

1. 關閉螢幕電源
2. 拔除螢幕上所有的線材
3. 按電源鍵 8 秒
4. 接回 HDMI 線
5. 接回電源線

登登~ 螢幕就正常了~
讓我覺得有趣的是步驟 3,
沒電源的狀況下還是要按著觸控感應的電源鍵 8 秒?
另外步驟 4 和 5 也和我平常習慣的順序不一樣...

Ref: U2415 goes into Power Save Mode?

2015年5月17日 星期日

Interoperability between Rust and Ruby

PHP 之父 Rasmus Lerdorf 說,一開始他發明 PHP 是為了在 HTML 裡面提供可以呼叫 C 的接口,
但是偏偏沒有人在乎這個功能,引起其他人注意的反而是其他的功能 XD
這次在 ModernWeb 2015 也聽到 Rust 這個名詞被帶過了兩三次,
雖然沒有人真正介紹他,可是卻引起了我的興趣....

Rust 是 Mozilla 所推廣的新 system level programming language,
他也完成過了自舉,用 Rust 寫的 compiler 去 compile Rust source code.
Ruby 裡面也可以呼叫使用 Rust export 出來的 dll
看到這,感覺好像是當初 PHP 和 HTML 的故事阿!

Rust會有搞頭嗎? Google 所推廣的 Go lang 似乎比較容易找到相關的消息,
但是找資料的過程看到一個論點是說,
一個新的語言有沒有未來,要看團隊和背後的公司自己是不是有大量和實際的使用,
以免變成有好的構思卻因為曲高和寡,而無法持續獲得社群力量支持...

Google 推的 AngularJSReact 相較是不是也是一樣的故事?
有好多新的東西可以學習,可是選擇卻也變得很困難.

還是繼續打好C的基礎,把 Rust 和 React 當成零食閱讀吧!

Microsoft Advanced Threat Analytics

Microsoft Advanced Threat Analytics 公開預覽現已推出!
看起來是一個分析 AD 網路封包並且做行為分析的 solution...

一個內建官方知識的 endpoint sensor?
果然官方自己跳下來做的都比較 imba .... XD

2015年5月12日 星期二

Export DLL Symbols

終於可以開始 debug DLL project 了!

之前根據 Debugging DLL Projects 的設定,
設定好 debug property 的 caller 並且在 DLL project 裡面設定中斷點,
但是 caller 一被叫起來後,馬上就 exit code 1,
並沒有 hit 到在我在 DLL project 裡設定的中斷點.

原本以為可能是我設定的中斷點不是 entry point ,程式提早結束所以沒有 hit 到.
想一想拿 sample code build 出來的 DLL 去測試,發現 entry point 是對的,
DLL debug 的中斷點在 sample code project 裡面也可以正常的 hit 並且停止.

想了很久後再看一次 caller 的文件,發現可以提高 caller 的 debug level ,
所以可以驗證我的另一個猜測,看是不是我指定的 DLL 其實並沒有被載入?
結果 debug log 顯示, DLL 應該是有被正確載入.
但是為什麼 caller log 會一直顯示載入 entry point function 失敗呢?

突然想到,我的 DLL 真的有 export 該 function 嗎?
Dependency Walker 去分析我的 DLL ,
發現 x86 build 確實有 export function,但是 x64 build 卻是空白的?
這時候我開始想說,難道是 build configuration 有問題?
但是 x86 build 的 DLL caller 也是無法正確載入啊?
那先不管 x64 build 好了,感覺 x86 build 比較有機會突破阻礙.

那再來比較 x86 build export 的 function 和 sample code 的有什麼不一樣
仔細一看,原來是 function name 被 mangling 處理過,多了 "_" prefix.
設定好 DLL project 的 def 檔重 build 後, caller 果然可以載入成功並且 hit 中斷點.
而神奇的 x64 DLL export function 是空白的現象也恢復正常了!

原來要 build 一個 DLL 有這麼多眉角要注意,學到這些東西很開心 :)


2015年5月11日 星期一

build fail: machine type 'x64' conflicts with target machine type 'X86'

在 Visual Studio 裡面 compile 一個原本只有 win32 configuration 的 project.
當新增一個 x64 configuration 並且 Re-build 的時候,
在 linking stage 出現:
machine type 'x64' conflicts with target machine type 'X86'
理論上 Visual Studio 會自動幫你複製並且轉換相關的 Win32 > x64 的設定,
例如:VC++ Directories, Library Path 等等...
依照 stackoverflow 上最佳答案建議的四點一一檢查後,也沒有發現異常.

後來終於發現是在新增 x64 configuration 的時候,additional option 並不會被自動轉換.
所以如果原本 win32 的 additional option 有覆蓋掉其它 option 的設定時,
在新增 x64 configuration 的時候,該 option 也會被複製過來.
而剛好如果該 option 是像 Machine:I386 這種時,悲劇就會發生了....

分析原因是,舊版的 Visual Studio project 可能會有些 option 要用 additional option 來設定.
而新版的則是變成 內建property ,內建的 property Visual Studio 有辦法去做一些自動化的轉換
像是前面提到的 VC++ Directories 等等

而這個答案是在 stackoverflow 同一個問題的第二高分的答案
偏偏我是不小心喵到後 linker > advanced 最後的 link command 時,
才瞄到最底下的 additional option .....lol...

不過也好像慢慢的熟悉 Visual Studio 的操作邏輯了....


debug DLL project in visual studio

當你在Visual Studio 裡的 win32 DLL project 開發一個讓別人呼叫的 DLL Adaptor
要怎麼 debug 呢?
因為我們沒有呼叫端程式的原始碼以及 symbol file
唯一有的只有 DLL project source code.

我們只要修改這個 project 的 debugging property,
讓他在我們點下DEBUG的時候去觸發呼叫端的程式,
這樣子當呼叫端使用到 dll 時,
我們就可以藉由在 visual studio 裡設定的中斷點來 dubug 了!

Reference:
MSDN: Debugging DLL Projects


2015年3月9日 星期一

Angular 2

Angular 2 似乎不錯的樣子?
ECMAScript 6 的 class 和 Angular 2 語法的大改版
感覺似乎直覺多了...

從 Server Side 的 PHP Framework + jQuery 換成 Angular 2 的純 Frontend
可以真正擺脫後端做一套, 前端又要做半套
然後又難以測試的問題嗎?

或許 Angular 2 是一個值得投資時間關注的新方式?


Angular 2 Preparation - Part 1 - Code Structure Comparison

Free New Angular 2 Preparation Course

An Angular2 Todo App: First look at App Development in Angular2

https://angular.io

2015年1月30日 星期五

MySQL CONVERT_TZ return NULL

在 local dev 環境想要 reproduce 一個 bug 的時候,
卻發現在我的環境 MySQL store procedure 的行為和 production 機器上的不一樣

原本以為是 store procedure 的邏輯有問題
最後發現原來是 CONVERT_TZ() 搞的鬼...

因為我的 local dev 環境是自己從零開始 setup 的
沒想到 CONVERT_TZ 這個 MySQL 內建的 function 需要一些 initial data
不然只要丟給他轉換的日期時間都會回傳 NULL....

解決方法就是
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
這樣就會把 zoneinfo 轉成 CONVERT_TZ 所需要的資料
我的 local dev 環境的行為就恢復正常啦~



Reference:
http://stackoverflow.com/questions/14454304/convert-tz-returns-null

2015年1月26日 星期一

Nexus 5 鏡頭蓋破裂更換

N5 的相機鏡頭因為設計上是突出背殼
而我很喜歡裸機的感覺,也沒有使用保護的手機殼
所以不知不覺中,鏡頭蓋就裂掉了

剛開始裂掉也還好,感覺拍照沒有影響
但是後來又掉進馬桶以後
拍出來的照片就臭臭的(?
不對,是霧霧的.
可能是因為會慢慢有髒東西從裂縫跑進去...

雖然說我之前被淘寶詐騙了一次
天兵賣家寄錯地方卻不退錢
天貓店小二介入後說要退我錢卻遲遲沒有下文...
但是上網找了一下 N5 的零件,
果然強國的淘寶什麼都有,什麼都不奇怪.
於是我只好放下羞恥心
再去淘寶消費了.... 因為零件真的很便宜啊...被坑就認了....

N5 鏡頭蓋破掉的話,有在賣的零件組合有
鏡頭蓋
鏡頭蓋含鏡頭框
背板

因為我覺得要把破掉的鏡頭蓋從鏡框拿出來有點麻煩
所以就買了鏡頭蓋含鏡頭框
幸運的是,我的猜測是對的!
含鏡頭框的組合只要多幾十元
但是鏡頭片是裝好的~所以我不用再從舊的拆下來,

要更換背板上的鏡頭片
所需要的道具只有
塑膠拆機片 + 小十字螺絲起子

N5的背殼是用幾個卡榫扣住而已而已,
背板則是有六個小螺絲起子鎖住,轉開後
背板的左右兩側有稍微扣住,選一邊壓開後,就可以把背板拆下來.

鏡頭框則是卡在背板的洞上,
所以稍微彎折一下背板,就可以把鏡頭框整個推出來.

最後的結論是,要方便的話,
只要買鏡頭框+鏡頭蓋的組合就好了~

如果想挑戰手藝,則可以只買鏡頭片
背板應該是不需要買 (還是說有人覺得拆鏡頭框也是一種麻煩?)
我一次買兩組...因為想說可能過一陣子又會破了吧...哈哈..








2015年1月13日 星期二

AWS CloudWatch Estimated Charge Alarm


如果有在用 AWS, 建議可以在 CloudWatch 裡面依照 usage estimation 設定 Alarm.

目前可以根據 EC2 usage, s3 usage, data transfer usage 設定 Alarm 通知.

例如你平常每個月差不多只會有 1000GB 的 data transfer 費用約 USD 89,
那你可以設一個 Alarm 當 data transfer 費用超過USD 100的時候發一封 mail 通知你.

或者是你的 AWS account 每個月 budget 或者平均費用是 USD 100,
那你也可以設定一個 Alarm 在超過你預計的費用時發一封通知信.

沒有設定 Alarm 的話,你可能在收到帳單時才發現在 AWS 上花的錢超過你的預估
反之收到 Alarm 通知,可以讓你即早發現帳戶內的異常行為和非預期的費用

CloudWatch 的 Alarm 計費是 0.1 per alarm per month
我們最近上了一堂 USD 6000 元的課... 就是被 Data Transfer 的費用陰了...

當然一定還有其他的方法可以避免你在 AWS 上花冤枉錢
但是花幾分鐘設定 Alarm 我覺得 CP 值很大....

See Also: Monitor estimated charge with AWS CloudWatch