Pages

2012-02-17

10分鐘得到Dropbox的免費5GB空間

官方福利說明:
Dropbox正在準備推出相機照片及影音的同步新功能,為了回饋測試的用戶,只
要透過論壇裏的Beta新版上傳5GB的照片/影音,即可得到5GB空間,即使刪去
那些檔案,得到的空間亦會保留。
image
 

文件教學目標:
依正常的程序,你得準備隨身碟內5GB的相片或影片,經過漫長的上傳等待,
才能得到此福利。此檔透過一些捷徑方法,可以讓你簡單地在10分鐘內就得到
官方福利,避開了漫長的上傳等待。

教學文件下載:(PDF, 1.54MB)
Dropbox

2012-02-09

快速大檔產生器

有時候我們需要臨時產生一個大檔來作某用途的應用,例如測網速或磁碟Quota測試,這個工具可以讓你極快速產生一個指定Size的檔案,例如下圖5GB的檔案的產生,只需要約85 miliseconds時間(不到0.1秒)。
image

工具下載 (2012/02/09 Updated, 9.52KB)
DropBox
***免安裝,需要.NET Framework 4.0以上版本。***

2012-01-31

智邦PP一元簡訊API呼叫

台灣市面上的一元簡訊服務,大部分採各自會員網頁介面,很少有提供程式API讓用戶自行撰寫程式發送簡訊。終於在智邦PP一元簡訊消費平台上,終於有提供簡易API方式給用戶:
http://pp.url.com.tw/option/api
image

智邦API是使用HTTP POST方式傳入,回傳時使用PHP陣列,使用C#還是可以輕易完成整個API的呼叫。網上關於如何實作POST多參數資料的傳遞範例碼很多,為了方便使用,我將它包成一個Helper物件:
 image

回傳的文字訊息,則可依照官方網頁的API說明作字串擷取判斷。透過這樣API方式,您可以自己打造符合手機Screen Size的網頁或開發APP來傳送一元簡訊。
 image
最後,小抱怨一下台灣簡訊價格相較大陸,實在太貴啦~ 以電信數據及3G資料量的比例原則,公道自在人心。

2012-01-11

跳過蘋果動新聞嵌入廣告

蘋果動新聞是蠻有趣的新聞報導方式,雖然它的內容有誘導及想像之處,但一切就端視閱聽人自己心中的一把尺。片頭常有很煩人的廣告,而且至少得等到播一半才能Skip略過,是屬於比較暴力式推銷方式。

為了跳過這樣煩人的置入式廣告,有網友分析出它是利用Cookie來記錄是否已播放過廣告,可以在IE「網際選項/隱私權/網站」裏把此網站的Cookie禁用,有效防止AD播放。但一些非IE的瀏覽器(如Maxthon)因為有自己專屬的Cookie控制,因此得利用Javascript來控制Cookie.

先分析動新聞網頁源碼:
image

由上圖源碼得知,只要obj.newstate=’COMPLETED’,嵌入式廣告就會消失。所以只要在網址列上輸入特定的Javascript來覆蓋這段函式,就可以達到此目的。

javascript: changeADState({newstate: 'COMPLETED'}); changeADState(); history.go(0); void(0);
其程式意思在於先設定該newstate Cookie變數為"COMPLETED”狀態,再呼叫執行它使之儲存,再重新載入該頁!你可以把這段程式碼Bookmark起來,遇到廣告播放時按一下就行了。

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 ***