Pages

2011-12-31

使用RAR作日期壓縮備份

RAR一直是我最喜歡的壓縮程式,儘管它是商業軟件,但是我實測過壓縮具有千萬個圖片的目錄(總和Size > 2GB),免費的7-Zip崩潰了,但RAR依舊硬梆梆。加上中國大陸網絡也偏好使用RAR壓縮,所以還是選擇使用了它。

通常,我會用RAR來幫我作備份資料上的壓縮工作,主要是集成一個單檔好管理。我不會很注意要壓得多小,因為解壓縮時相對的時間更多,現在磁碟空間那麼便宜,時間成本比磁碟成本昂貴的多。我喜歡壓縮成檔名+日期的格式,如:Test_20120101.rar
image

上圖是修改WinRAR的預設壓縮行為,其檔名就會後綴一個”_YYYYMMDD” 的日期。若想要使用Console版的Rar.exe程式來自動排程壓縮,其推薦的壓縮語法如下(可以結合*.bat批次檔來實作更佳):
"C:\Program Files\WinRAR\Rar.exe" a Test.rar -n@RarIncList.txt -ag_YYYYMMDD
它會把RarIncList.txt中所示的檔案壓縮成「Test_20120101.rar」,日後我們只需要改變list檔就好。
image

Rar.exe /? 說明文件如下:
a             Add files to archive
ag[format]    Generate archive name using the current date
n@<list>      Include files listed in specified list file

2011-11-05

自己畫Cell Container

當有個UI程式畫面需要開發如下圖:
image

一般作法是尋求DataGrid或一些具有窗格的控制項來作基底,每個格子Cell可能有特殊的功能及顯示
我的作法會儘量以既有Container控件項為基礎,透過User Control自訂控件及Table物件結構來描述這個UI的對映資料
畢竟User對這個UI的操作,必須儲存下來做一些運算。

以下是我的VS2010專案架構,我總是喜歡透過目錄階層把程式的架構作分類呈現:
image

即透過讀取xml檔將資料載入MenuData等物件結構裏,依這些資料結構的描述將窗格畫出來
為了達到Reuse及模組化的標準,我包成User Control自訂控項,最後就顯示成所需要的畫面。

查看原始碼,每個*.cs都很短且簡略,但它們能有張力地呈現Rich UI及功能封裝,
與「程式打字員」總是一大雜鍋地從頭寫到尾的傳統寫程序方式,
這種比較能獲得工作的喜悅感。

PS. 很多時候沒有適合的UI控件來滿足特殊Grid的要求,也懶得去找各家商業UI控件,就自己動手畫格子。
在最下面舖一張黑色Panel,裏頭每個格子都是Button,再設定每個Button的Margin屬性,就產生格線效果!
看起來好像UI雜工很多,其實也沒想像中複雜…

2011-10-28

手機簡訊Proxy代發伺服器

一般而言,我們用手機發簡訊(大陸慣用語為「短信」),大陸的簡訊費用為台灣的1/4,平均約為每則0.5元台幣,所以大陸的短信聯絡方式極為發達,尤其在旅遊業上,異地直接電話聯絡因為各省有口音溝通不易,短信是重要的通知媒介。尤其三大電信公司還有大量的短信包,平均價格更可低到每則0.25元台幣。

中國移動門號有提供稱為「飛信」的網上服務來發短信,讓人們不用因手機不好打字而痛苦,但它不能跨電信公司門號使用。為了消耗每個月用不完的短信包,我決定寫一個網路代理媒介,來讓朋友藉由我的手機發免費短信。

系統架構圖:
image 
電腦之所以能透過手機發短信,就是靠到手機內建的COM埠,我們稱為「GSM Modem」介面,它有一定的通訊協定。大陸有人純做GSM Modem的嵌入式硬體(大陸稱為短信貓),就比較方便聯結,否則得視手機廠商是否提供GSM Modem驅動程式,讓電腦能夠與手機溝通。

我是使用Sony Eicsson K750i這隻手機,它沒有x64平台驅動程式,因此它得活在VMware虛擬系統下,加上家裏網路也沒有固定IP,勢必我得在中間成立一個手機Proxy伺服器,來讓兩端沒固定IP的端點通訊。為了能突破重重防火牆及家庭NAT,選擇使用TCP Server來控制。另一端GSM Modem並不限定只有一台,可以很多手機一起加入分享行列。
 image

如此一來,User端只需要執行Client程式,連上該Proxy主機,即可發短信:
image 
紅1: 因為大陸短信費用低廉考量,先綁住大陸門號,當然它傳至台灣門號也行的,只是費用高昂。
紅2: 訊息內容的顯示手機號碼,一律是我的GSM手機,我是辦廣州聯通的新勢力短信套餐,9塊RMB每月免費150則短信包。
紅3: 所謂訊息是指文字內容+簽名檔,因為是代發,得考慮到簽名檔。
紅4: 主機端有發送密碼,必須輸入正確的密碼才能發訊。
紅5: 每月手機短信包數量有限,因此也設定一個總Quota控制。

有了中間媒介的Proxy伺服器,每個人若能加入一起分享自己的GSM手機連結,就能形成一個龐大而免費的短信資源網,反正自己每個月用不完也是白白損失,何不貢獻出來?只是現實問題是每個人的手機不容易驅動連接至電腦,加上台灣的短信費太昂貴讓人沒有想像空間,因此目前只掛上我一人的GSM手機端點,物盡其用每月的短信包。

2011-10-24

TCP/IP Server的實作議題

在.NET下如何建立TCP Server,基本的概念如以下文章程式碼:
Building a TCP/IP server using C# | Martijn's C# Programming Blog
http://www.dijksterhuis.org/building-a-tcpip-server-using-c/

文章中提到建立TCP Server的三種程式版本,Version1是使用內建的TcpListener及TcpClient類別
它們是高階包裝物件,雖然使用簡單,但本質還是使用底下的Socket類別在實作。
微軟為何謙虛稱其為「TcpListener」而非「TcpServer」,等你實作多人連線時就會發現,
事情絕不是想像中般簡單。

網路程式大部分工作就是在Read()/Write()封包,為了提高效能,Version2就是使用純Socket類別作範例
為了減少等待及多執行緒管理,Version3提供非同步方式來處理Client的連入及資料傳送工作。

要真正實作一個名副其實的TcpServer,文章中的程式內容還不足以擔任此重責,
TCP Server最大的技術門檻不在於Socket資料傳送,而是在處理多連線的非常規中斷
例如Server端或Client端的網路Cable突然出了問題(ex.斷電),或者是基於流程必須強制中斷
身為TcpServer得去捕捉這樣千奇百怪的例外錯誤。

鑽研至底層Socket控制,又有區分Graceful及Linger等斷線的方式,各有不同的效果。
完成Session管理後,傳輸指令的Command封包資料格式也需要兩造定義
(此部分可參考此Packet封包結構與解析文章)

資料接收完成後,倘若是大量的視訊資料,UI可能會來不及消耗這些資料封包,也必須實作緩衝Buffering及快取Cache技術
這些都是實作TcpServer的實務技術課題,新的WCF架構被創造的動機,即是用來解決及簡化這些連線問題。
但WCF目前無法相容異質平台,其大量傳輸的效能也可能備受質疑 (出了很多Metadata資訊)

我以多年的Socket實作經驗,實作了一個技術還堪用的TcpServer類別:
image

配合Packet封包結構協助類別PacketFrame,提供較高質量的安全網絡傳輸行為。

Packet封包結構與解析

兩年前寫的封包資料驗證文章主要應用在網路封包或RS232資料,後來從事嵌入式與單晶片程式工作,發現TI德州儀器的ZigBee通訊資料結構也差不多如此,只不過為了快速辨別封包類型,把Data欄位的前兩個bytes拉出來作為CMD0, CMD1兩個欄位.

SOF

LEN0長度

LEN1長度

CMD0

CMD1

DATA資料

FCS檢查碼

長度

1

1

1

1

1

N

1

SOF (Start of Frame)就是每個封包Packet的起始辨別字元,TI的資料長度只有1個byte,我將其擴充為2bytes。
FCS (Frame Check Sequence)即是針對LEN0至DATA這部分的陣列作xor運算之值。

網路Socket傳輸,這樣的格式也是一個很不錯的bytes陣列包裝方式,透過PacketFrame這樣的Helper Class,可以快速得到這樣的資料結構。
image 
我們可以快速建立一個符合結構的pkt[] array, 而其封包有效的資料長度即為pktLen值.
為什麼這函式不直接傳回新陣列呢? 因為重複使用buffer位址來存寫資料,可大大增加效能。

建立該結構的陣列,並沒有什麼困難,比較有門檻的是如何在陸續進來的封包緩衝區(Buffer)裏,解析(Parsing)出一個個完整的Packet結構。
image

為單一封包準備一個足夠大的Packet Buffer及SOF辨識字元,透過Parse(queue, startIndex, length)函式即可觸發事件。
事件參數為:
image
以上的Event Arguments資訊,就足夠判斷進來的封包資料所為何事了!

2011-10-16

SqliteCrypt資料庫加解密工具

SQLite是一個輕量化的檔案資料庫,它支援對稱式加密方式,官方DLL使用Windows API來實作RC4加密法
也有一些管理工具使用AES加密法。你可以下載SQLite的源碼修改加解密方式,不過通常不會這樣生事!
為了簡化SQLite加解密的過程,我寫了一個Console程式,可以利用程式佈署時作資料庫自動化加密工作。
image
當你為一個db加密時,你在開啟db時必須輸入密碼,否則會得到一個被加密的錯誤提示:
image
此程式除了作加解密工具外,也實現執行一個SQL Script File的功能,用來做相關SQL指令的操作。

軟體下載 (411KB, 2014/02/28更新)
http://pan.baidu.com/s/1gdp9gPX

*** 軟體綠色免安裝,系統需支援.NET 4.0 ***

2011-10-08

HTML Converter 編碼轉換工具

本人原創的小工具,將所貼的文字轉換成HTML編碼或URL編碼方式。
它被實作的動機是有時候要在網頁上貼些網址代碼,卻和線上編輯器衝突,因此需要轉成HTML可接受的編碼。

軟件擷圖:
image

軟件下載(2011.10.08更新, 6KB):
MegaUpload | EverBox 

*** 軟件免安裝,系統需支援.NET 4.0 ***

將Web頁面內大圖過濾專頁顯現

喜歡在網頁看美圖的人可有福了,只要把以下代碼放在網頁的url欄裡,就能過濾圖片size大於300x300的圖片,
你也可以把這jscript加入「我的最愛」裡。

javascript:var html='';for(var i=0;i<document.images.length;i++){var img=document.images[i];if(img.width>200 && img.height>300){html+='<img src='+img.src+' /><br/>';}};document.write(html);


所有大圖片會單頁顯示,你就可顯過一些下載工具,批次把圖片全下載到硬碟裡收藏。

2011-10-07

從源碼方式安裝Mono 2.10.5

原以為mono專案計劃隨著Novell被併購而中止沒想到原開發人成立Xamarin公司全力開發iOS及Android套件外還繼續維護原mono專案程式碼,真是佛心來也。

雖然mono發展因重心轉移不會像過去那麼快,但至少將就用還行,透過源碼安裝方式很方便
尤其自行編譯需要解決程式相依性,可使用以下的文章直接執行其安裝script即可:
Install Mono 2.10.5 on Ubuntu Using Bash Script
image 

Xamarin所研發的mono for Android也已經釋出正式版了,連iOS上也有相對的商業應用。
感覺mono還能實實在在地存活一段時間,用來解決非windows的.NET方案,依然是最佳選擇。

Ubuntu 10.04 LTS 套件更新Source List

Ubuntu系統預設的套件更新來源都是美國官方主機,為了加快存取宜設為台灣的伺服器位置
網上很多常見的網路主機,無奈也會隨著時間過去而相繼仆倒,
目前以下的位置是2011/10/07日測試可正常存取的來源。

編輯原檔:
# vi /etc/apt/sources.list

替代成以下內容:

# deb cdrom:[Ubuntu 10.04 LTS _Lucid Lynx_ - Release i386 (20100429)]/ lucid main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://free.nchc.org.tw/ubuntu/ lucid main restricted
deb-src http://free.nchc.org.tw/ubuntu/ lucid main restricted

deb http://free.nchc.org.tw/ubuntu/ lucid-updates main restricted
deb-src http://free.nchc.org.tw/ubuntu/ lucid-updates main restricted

deb http://free.nchc.org.tw/ubuntu/ lucid universe
deb-src http://free.nchc.org.tw/ubuntu/ lucid universe

deb http://free.nchc.org.tw/ubuntu/ lucid-updates universe
deb-src http://free.nchc.org.tw/ubuntu/ lucid-updates universe

deb http://free.nchc.org.tw/ubuntu/ lucid multiverse
deb-src http://free.nchc.org.tw/ubuntu/ lucid multiverse

deb http://free.nchc.org.tw/ubuntu/ lucid-updates multiverse
deb-src http://free.nchc.org.tw/ubuntu/ lucid-updates multiverse


套用新的來源位置

# apt-get update

2011-09-29

Skype通話記錄Duration Reader

假如您有在使用Skype包月制方案,或許每至月底會想檢視一下自己的通話記錄
大部分限時數的方案會顯示你的通話時間,
但以「全球通/世界通」這樣Unlimited方案,就不會顯示你的通話總時間。

Skype有提供通話記錄(Call History)可供查詢:
image 

此記錄可以匯出為*.csv檔,裏頭內容為:
image

為了更加方便條列這些CSV檔,我寫了一隻Reader程式來讀取並計算使用通數及通話總時間。
image

程式下載: (148KB, 2011.09.29更新)
EverBox | MegaUpload

解開rar壓縮包直接執行,免安裝,系統需有.NET 4.0支援。

2011-09-04

解決Maxthon3瀏覽器無法登入FB (開啟Cookie)錯誤

有一次登入Facebook時,即使打對登入密碼,仍出現:「需要開啟Cookie」的錯誤
搜尋了google,大抵是教怎麼清除IE的暫存檔及Cookie重開即可
但Maxthon3依然出現需開啟Cooke錯誤。

Maxthon3雖然以IE為核心,但之間的關聯如何我卻不知
選項裏也找不到Cookie相關的控制表單,這問題一直懸而不決。
有一天我發現Maxthon3的程式儲存位置,發現有Cookie目錄:
C:\Users\XXX\AppData\Roaming\Maxthon3\Users\YYY\Cookie\Cookie.dat
XXX = Windows登入用戶名
YYY = Maxthon3帳戶

直覺是這Cookie檔出了錯亂,刪除了這檔再重開Maxthon3
就可以順利登入Facebook了。

2011-05-30

購買大陸促銷Skype儲值一次就上手

網路電話雖然通話品質不保證(尤其講愈久話質愈差),但通常前2分鐘還行,用來通知聯絡用途還行。
目前Skype的Skypeout儲值點數每通電話需要接通費1.6台幣,加上1分鐘約0.7台幣的成本還行
但是每通若沒講滿3分鐘以上,也是不合算的(常常通話品質差就會斷,credit像流水般花掉)。

很可惜打台灣手機都是挺昂貴的,雖然比一般手機便宜,但網路通訊品質終究沒那麼好,
完全倚賴網路電話的人,終究會用到吐血。懂得去調配自己的需求,才是合邏輯的作法。

那麼就得選用包月方案,這兒有PChome代理的Skype包月Go方案:
http://skype.pchome.com.tw/skypetwweb/unlimited/product.html

我們以最貴的方案「全球GO」來分析:
image

一個月一萬分鐘450元台幣,一般人估計用不到。然而,若到大陸淘寶網去儲值,只需要1/3的成本。
他們是使用Skype大代理商的名義取得很優厚的折扣率,再幫客人訂閱各種方式,尤其大陸更會有促銷買2送一方式
平均下來大陸「全球GO」只需要160元台幣,相當是PChome Skype的1/3成本而己。

你可以在大陸淘寶網找到skype代理商的促銷方案,例如: (其他的人我沒交易過)
http://shijietong.taobao.com/

當你要購買時,你可線上使用聊天室詢問賣家,不過通常線上人員很忙,回答客戶的講話方式也不夠周全體貼
不過達到目的比較重要,過程溝通的不明白,就算了吧! (這也是為何我要寫這心得文的動機)

以下是我個人交易流程心得,僅供大家參考:
1. 選好適合自己的Skype通話促銷方案。(請自己先看文,線上人員很忙沒時間幫你比較)
2. 使用聊天室跟賣家事先溝通,例如方案的穩定度及是否目前能充值?
(因為要看大代理商的quota存量,賣家不會因為沒貨就先停用文章,而是都利用支付寶線上退款,懶得這樣就直接線上先問有貨否?)
image
3. 使用「支付寶」付款,並提供賣家你的skype帳號/密碼,並登出你的skype帳號(可事先更換掉自己原先的密碼)。
4. 賣家會進行設定,通常就是會加你的帳號為代理商優惠的群組,並由賣家匯入可購買你要的方案金額,再用折扣價買到方案訂閱。
例如買「全球GO」(大陸稱為世界通)三個月,Skype帳號內容為:
image
5. 上圖步驟1時,系統會寄發email通知你認可是否要加入該邀請名單,記住不要登入或改變你的貨幣款式
因為賣家正在儲值買方案,中途登入會造成他被登出。而中途改變貨幣,會造成卖家已匯入金額的匯差損失。
6. 你陸續會收到操作上面步驟的email通知,也請不要心急登入查看。等到賣家通知你完成,或者隔了一段時間再登入。
我遇到的賣家是蠻口直心快型的,他不會善盡事前告知等SOP標準作業流程,導致交易過程中都發生一些誤會。
記住,完成目標最重要,過程的坎坷自己吞下肚吧! (這時候才知道台灣真是服務品質好的地方呀)
7. 查看Skype訂閱資訊:
image

若你想要與他人合理使用Skype方案,記得遵守Skype政策,基本上就這三點:
1. 不要同時登入帳號 ==> 後果: 迫使另一人登出或中斷通話。
2. 一天內不要打給超過50個不同的號碼 => 後果: 被視為共用。
3. 一天內不能打超過6小時 => 後果: 不曉得系統會不會提醒,但通常不會超過6小時啦。

我覺得「合理使用」分享給有限人數共同使用(事先約好或email通知),還算合理啦!
總之,不要違反skype的公平使用策略就行,否則後果自負(就是帳號訂閱被禁用了)。