2010年12月26日 星期日

FileSystemWatcher and network device in C#

在C#中,對於檔案的監聽,提供了一個好用的API,即是FileSystemWatcher。他的語法也非常簡單,使用方法如下。

FileSystemWatcher watch = new FileSystemWatcher();
watch.Path = @"c:\";
watch.Changed += new FileSystemEventHandler(myFileWatchEvent);
watch.EnableRaisingEvents = true;

然後再寫一個myFileWatchEvent做目錄下檔案有變動時的對應事件。

private void AppFileWatchEvent(object sender, FileSystemEventArgs e) {
    FileInfo fi = new FileInfo(e.FullPath);
    if (fi.Name.CompareTo("test.txt") == 0) {
        //file change
    }
}

這樣一來,當目錄下的test.txt有任何更動時,就會觸發事件。

然而,FileSystemWatcher有個致命的缺點就是,他無法在網路磁碟機下正常運作。如果檔案在網路磁碟機下,由自己對檔案作改動,FileSystemWatcher是可以偵測到的。但如果是被其他人改動,除非我對該目錄手動作一個refresh動作,不然FileSystemWatcher是一點反應也沒有的。

這時候就要用老方法去監看檔案改變了。這裡是用定期看檔案日期有沒有做改變。

DateTime lastModifyTime = DateTime.MinValue;

private void DoFileChange(){
    FileInfo fw = new FileInfo(@"C:\test.txt");
    if (fw.Exists) {
        if(lastModifyTime == DateTime.MinValue){
            lastModifyTime = File.GetLastWriteTime(fw.FullName);
        }

        DateTime currentModifyTime = File.GetLastWriteTime(fw.FullName);

        if (lastModifyTime < currentModifyTime) {
            //File change   
        }
        lastModifyTime = currentModifyTime;
    }
}

然後用個while迴圈包起來。

private void DoFileChangeLoop(){
    while (true) {
        DoFileChange();
        Thread.Sleep(1000);
    }
}

當然,你必須將DoFileChangeLoop放在thread裡面。

實際執行下來,耗費的系統資源還蠻少的,在可以接受的範圍之內。

GUI Thread on C#

在C#中,一般情況下,控制GUI元件時,必須要用main thread去控制。然而我們常常將運算丟至一個新的thread中,然後在運算時更新GUI的狀態。這時例外就會警告你不能這樣做。MSDN提供了delegate解法去做,但我覺得麻煩,也不夠直覺。後來參考了這裡,是使用SynchronizationContext,發現還挺好用的。使用方如下。

首先在GUI class範疇下宣告SynchronizationContext。

public partial class A:Form{
    SynchronizationContext mainSynchronizationContext;
}

接著在constructor上面,將SynchronizationContext做指定。這樣SynchronizationContext就可以抓得到現在的執行緒。

public partial class A:Form{
    public A(){
        mainSynchronizationContext = SynchronizationContext.Current;
    }
}

然後寫一個方法,負責執行GUI更新動作。label1在這裡是一個Lebel類別

public void InvokeGUI(string str) {
    mainSynchronizationContext.Post
        (
        new SendOrPostCallback
            (
            (obj)
            =>
            {
               label1.Text=(String)obj;
               
            }
            )
            ,
            str
       );
}

其中mainSynchronizationContext.Post,是非同步處理,指的是不會等待GUI就進行下一步驟。如果使用mainSynchronizationContext.Send的話,則是進行同步處理。當GUI真正動作完成才會做返回動作。script則是傳入的引數。

然後在你的thread運算時呼叫這個function,便不會拋出例外訊息了。

參考資料:
[1] (筆記) 跨執行緒存取控制項 (WPF、WinForm 通用)
[2] 深入线程,实现自定义的SynchronizationContext

第[2]有詳細說明SynchronizationContext的原理,推薦可以看看。

2010年12月19日 星期日

[PS3] God of war 3

ACT類型。

這款遊戲真是超爽快的。在畫面,音樂,系統流暢度都是無可挑剔的。場面也相當大,非常震撼。整部遊戲玩起來既像在看電影吧。謎題來說也是不難。難度的選擇上,簡單也是輕鬆就可以過了。

我在玩的時候,最常死的地方就是跳了。常常跳錯地方,不然就是想看看寶箱是不是藏在懸崖下面而跳下去。反正跳失敗重生點都是在非常近的地方,多試幾次也沒關係。

遊戲路線基本上是不能回頭的,有時發現走另一條路才能拿到寶箱,結果發現走不回去了。寶箱升級道具沒全拿也沒關係,最簡單模式幾乎不損什麼寫的。

真得很推薦這款遊戲。

God_of_War_3_GOW3Cover

2010年11月15日 星期一

Windows server configuration

因為工作需要會用到windows server做設定。系統中很多選項位置都跟XP不一樣,光是新增個帳號就搞死我了。

後來找到http://120.105.184.250/peiyuli/network-1/ 這邊有豐富的windows server 設定教學可以解決我的問題。

C# WebBrowser refresh problem

If I claim a WebBrowser object and try to add the content by the following statement:

webBrowser1.DocumentText += "new content<p>";

If we use this statement continuously in a function, like this

public void update{
    webBrowser1.DocumentText += "new content 1<p>";
    webBrowser1.DocumentText += "new content 2<p>";
}

You will see in the frame, only new content 2 show in the webBrowser1. People say the webBrowser does not refresh to screen so that only last edit would be display. (please see this C# 2.0 WebBrowser control - bug in DocumentText?http://geekswithblogs.net/paulwhitblog/archive/2005/12/12/62961.aspx)

The way to solve it is use Write to flush the content

webBrowser1.Document.Write("new content 1");

enjoy it.

2010年10月31日 星期日

[360] Enslaved – Odyssey to the west

第三人稱動作類型。

最早的時候在LIVE上有玩過試玩版。那時候的感覺是走攀爬路線+動作。攀爬路線有點無腦,會發光自動提醒,然後配合方向鍵+跳。方向鍵就有點隨便按就可以幫你跳,所以有時爬到一半不知道往哪裡去,就隨便按啦。格鬥就配合揍人+閃躲就可以輕易解決了。在正式版上其實也沒有差多少,整個過程算是簡單。敵人就是機器人啦,打擊的感覺還蠻爽快的。

故事主體就是唐三藏冒險,只不過只有師父跟孫悟空而已。後來有豬八戒,但是可惜不能操作,而且八戒後來也…。最後結局挺令人意外的,蠻有matrix的感覺,女主角以自己的憤怒把整個系統關掉了。我也不知道這樣是好還是不好,看來已經把故事說死了。

這是一款玩下去就停不下來的遊戲。

Enslaved_X360_BoxFront_FINALboxart_160w

[360] Vanquish

TPS類型。

這遊戲實在是太太太太爽快了。類似戰爭機器的操作,但是加入了高速滑行、慢動作等特殊要素,讓戰鬥進行得非常快。戰場的背景營造也很不錯,相當熱鬧。隊友NPC也很忙,是有在認真打敵人。有時候我走了慢點,結果敵人都被射死了@@。

說點缺點的話…場景的貼圖好像變化不大,遊戲時間也較同類型短些。雖然遊戲的本意是希望我們繼續挑戰更高難度,但我希望有體驗到爽就好了。GOD HAND模式很虐待自已呀!

片尾是Cast是射擊遊戲,還算挺有創意。

vanquish_360_box

[360] Mafia II

看起來像是GTA類型,其實不是。

地圖就一個城市大小,所有的事件都是在裡面發生的,然後是以章節來進行的。因此不會有一邊繞城市一邊找任務的情形。全部總共有15章,前面的章節打起來速度很快,到最後章節要花多點時間打。以全部來看,這款遊戲在GTA類型裡面算短的了。

遊戲重點在說故事,在動作上就沒有佔那麼重的比重。通常就是劇情…走路…劇情,這樣的模式,然後再穿插一些槍戰。重複久了有點小無聊。還有就是警車不知道為什麼莫名的多。

結局還蠻感意外的,主角還是不小心背叛了最好的朋友。但是朋友的結局…大概只有第三集才知道吧!

MAFIA_II_360_FoB-719x1024

硬碟倒地不起

中午的時候,筆電硬碟忽然死亡,完全無法來得及備份。

仔細想一想,裡面比較重要的資料是研究所時期的一些報告,一些自己做的作品.自己產出的量雖然沒有很多,可是都是算一種回憶吧!後來我把硬碟亂敲一番,好像變得更糟了。從原本的咖拉咖拉到不會轉了。

現在比較在乎的是我的OneNote筆記本找不到之前備份的了.這樣我的一些列表就沒有不見嚕,只能從0開始了。

真得要開始雲端儲存了@@。

2010年10月12日 星期二

The PragmaticBookshelf

最近看到這網站的摘要文章,講述關於軟體撰寫時的注意事項。我覺得還蠻有幫助的,將我看到的內容做簡單的描述

1. Software Entropy
程式碼也有破窗理論。不良的程式碼將造成不良的示範,後來的人看到也會照抄模仿一番。趁早培養了解正確的寫作方式。

2. Programming by Coincidence
可以正確運作的程式碼,要確定裡面運作細節,不要認為運作正常是理所當然的事,也許這一切都是偶然造成的結果。哪天其他程式碼修正了這個可以造成偶然正確的錯誤就慘了。建議不要怕麻煩,多了解程式碼周圍運作的可靠性。

3. Evil Wizards
Wizard是指可以幫你自動產生整個骨架的程式碼,像是MFC的UI等等。使用wizard並不是不好,但是至少要知道它生產了什麼程式碼給你。這樣未來要作重構修改時才能掌握,順便也避免了落於coincidence的情形。

4. How to Balance Resources
很簡單,記得釋放你借過的資源。裡面有個觀點很有趣,"記住,你知道我們不相信任何人,即使是我們自己也不相信"。意思是指對於一段存在的code,不管是不是自己寫的,要驗證跑過才算正確。

2010年9月28日 星期二

[碎碎] 快一年

工作到現在也快一年嚕,我只能說時間過得很快。

現在關於工作的話題都圍繞在責任制上。大家都不想要加班。

現今的工作,雖然沒有任何分紅,屬於死薪水,但是我覺得難度不高,過得還算開心。下班時間跟同業比是算比較早的,也沒有什麼壓力可言。

雖然一開始的時候,大家都在談論薪水的多寡,或是投資理財的生活經。老實說,我不是挺高的薪水曾經讓我一度很洩氣,但是這一年我自己做了很多自己想做的事,我很慶幸我的興趣還是一直可以維持下去。我也找到了自己的方向,真得過得很開心。跟退伍之前的我比,我有了金錢可以買想要的東西,同時我也有時間可以享受我買的東西。

何謂高薪,在我心裡的想法是,薪水除以總時數較為高者為高薪,而不是低微的時薪因為長時間工作累積而成的高薪。

人生除了工作以外,應該還要有正常的活動。如果去除工作和金錢,而沒有話題可以聊,那未免也太悲哀了。

下一個目標是,要實行創造性的興趣,而不是像現在一直屬於消耗性的興趣,一直接受外在而沒有思考再內化。

:P

2010年9月13日 星期一

JavaScript Object-Oriented Programming

網址:http://articles.sitepoint.com/article/oriented-programming-1

Javascript雖然長得很零散,但其實可以利用這個語言的一些特殊特性,讓他聚集起來,將變數和方法包裝成物件來使用。看完之後覺得還蠻取巧的。在工作上目前還沒有需要這麼大費周章把它包裝起來,但值得參考。

順便幹繳一句,javascript真他媽的難debug。

Common Weakness Enumeration

image

網址:http://cwe.mitre.org/index.html

這個網站介紹我們撰寫程式時需要注意的事項,避免遭到不必要的攻擊。像是最普通的資料溢位的避免,或是避免洩漏內部資訊等等。語言方面並不限定,除此之外還有範例說明,可以清楚知道事情是怎麼發生的。

2010 CWE/SANS Top 25 Most Dangerous Software Errors 這個主題很實用,看了功力會增加一點喔!

2010年8月23日 星期一

Return value trap

Linux系統程式設計下,一些系統呼叫可能因為我們錯誤地認為回傳資訊而造成錯誤。

下面是一個判斷是不是該繼續接收資料的例子。

if (!((byteRead = recv(sock, buffer, bufsize, 0))))break;

在這個判斷式中存在一個陷阱,在發生recv錯誤的時候,如Connection Reset by Peer,recv會回傳-1,但是不足以跳出這個迴圈。會造成的錯誤是,byteRead會拿-1來進行運算,造成錯誤結果。

下面是比較正確的寫法,或是偵測perror()來得知是否現在是錯誤。

if (!((byteRead = recv(sock, buffer, bufsize, 0)) > 0))break;

2010年8月19日 星期四

Key passphrase in wireless

在wireless中,想要高強度加密但是又怕忘記密碼的話,可以使用key passphrase。只需要短短好記的key passphrase,就可以產生長度夠長的高強度密碼。其他使用者想要連上此AP,也可以藉由一些工具預先根據已知的key passpharase還原出密碼。當然分享器要有支援key passphrase才行。

以下有幾個網站提供key passphrase計算出wep,wpa密碼功能。

WPA key calculation
http://www.xs4all.nl/~rjoris/wpapsk.html

WEP key passphrase generator
http://www.netpoint.com/wep.htm

IE使用WPA key calculation做計算,會出現"如果繼續執行,您的電腦將變成沒有反應..."的廢話,按否就可以繼續下去了。這是因為statement的數目超過IE認為安全的上限。

最後是wireshark提供的,但計算速度比較慢。
http://www.wireshark.org/tools/wpa-psk.html

2010年8月1日 星期日

未來的未來

上班也一段時間了,也能掌握了步調。

與學生的不同的是,下班與週末都是自己的時間,並且都沒有受到需要回家念書的束縛。可以說想要做什麼就可以做什麼。

我看有些人下班之後就直喊無聊、無聊。好像想要工作壓死自己一樣。我覺得自己應該建立起一套過生活的方法。想想平常自己有什麼沒有達成,什麼娛樂沒有做到,想要學什麼而沒有學到。自己可以趁這段時間好好累積。並不是說就業就是學習的墳墓,人生還有很多需要去研究的。

但是,以上所講的,都是自己獨自內化的一個過程。有些人可能就耐不住性子。休閒就是要跟許多人一起進行的呀!於是開始找人吃飯,不然就聊天,想找人陪。

這種感覺我知道,因為有時候我也會陷入這種現象,但我盡量避免長久處在這樣的狀態,因為我知道,這樣的休閒帶給自己的成長很有限。我很貪心在內化自己。

那麼來談談自己的休閒。其實又可以分成創造性休閒跟消耗性休閒。消耗性就簡單多了,吸收別人的成果,像是聽音樂、看電影這類的。創造性就是像寫文章、畫畫屬於無中生有的東西。創造總是困難與孤獨的,如果一直都在消耗,我覺得會讓自己變得沒有想法而已。

其實,未來的未來要訂定一個明確的目標,知道自己該做什麼。我想,能夠活在自己的時間,想做什麼就做什麼,是一件幸福的事。

2010年7月15日 星期四

linux主機空間搬家

近來因為有新人要來,所以必須空出電腦。原本閒置的電腦都被我們拿來當build code server啦。因此必須要把目錄全部搬到新主機上。

Project中有些是自動產生的link目錄。為避免搬過去失效,所以都預先執行make clean清掉,一方面所佔體積也會比較小一點。

接著上傳方式就有很多種了。我在這裡採用rsync:

rsync -rv -e ssh /home/mark/ mark@10.10.10.10:/home/mark

這樣就可以自動同步到10.10.10.10主機上了。其它方式還有SCP這樣的指令可以用

參考資料:
[1] Recursive SFTP Put

2010年7月14日 星期三

Five pitfalls of Linux sockets programming

http://www.ibm.com/developerworks/linux/library/l-sockpit/

這篇文章是IBM上的devleperWork發表的。主要敘述作linux socket programming所會遇到可能忽略的陷阱。我覺得寫得還算蠻不錯的,就做一下筆記。

Pitfall 1.Ignoring return status
socket programming中做有關IO的動作,都會有牽扯到return status,包含了執行狀態的變化,不單單只有成功與失敗兩種而已。我們在寫程式時有時貪圖一時方便,只檢查有需要的狀態,更甚者完全不檢查。這些行為都不太好。

Pitfall 2. Peer socket closure
這段大概講的是要把正確的行為放在正確的區塊中。像他所舉的範例close(sock);放在status==0,其實可以表示已經讀完了跟對方結束兩種狀態。我想,像我們在寫程式有很多case需要作close之類的動作,應該要注意要放在哪邊才能確定close一次,而不會造成多次close的崩潰或是沒有close的memory leak。

Pitfall 3. Address in use error (EADDRINUSE)
進行Socket連接時,使用SO_REUSEADDR屬性,方便當斷線時進入TIME_WAIT狀態時,位址還可以讓其他人使用。

Pitfall 4. Sending structured data
socket可以傳遞binary的資料,理當來說也可以傳遞結構性資料。但是要注意的是雙方的協定是否正確,像是big-endian和little-endian的問題,以免資料還原時無法讀取。我們可以使用現有的協定,像是RPC這類的傳遞資料。

Pitfall 5. Framing assumptions in TCP
注意雙方的buffer大小,應該要同步,以免作多餘的寫入或傳送的動作。

2010年7月8日 星期四

AF_UNIX本地端通訊

在Linux socket programming中,兩個程序作溝通有時會利用同一個port作client-server方式使用。但有時候我們不希望這些port會被外面的人連進來。除了利用防火牆去檔該port,還可以利用本地端通訊來達成。

本地端通訊可以顯而易見的是,有些程序會在檔案系統上利用xxx.sock這類檔案作溝通。在程式上本來指定server listen port的地方改成本地位址。

Linux Socket學習(三)以及 本地通信實例(AF_UNIX) 舉了詳盡的client和server的範例程式。可以參考看看。

2010年7月7日 星期三

XMLHTTPRequest POST

Using POST method in XMLHTTPRequest(Ajax)這篇文章講解了如何利用XMLHTTPRequest來做POST動作。

一開始的範例是使用GET方式送出訊息。可以看到送出的位址其實是url加上參數結合的。決定GET的方法是在.open()裡面決定的。onreadystatechange負責處理接收的事件。GET

var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("GET", url+"?"+params, true);
http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
                alert(http.responseText);
        }
}
http.send(null);

接著的範例就是POST的範例。由於params必須改到HTTP的內文作發送,所以很明顯看到的是http.send送出了想要發送的參數。另外這個範例也補上了http需要用到的header。

var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
                alert(http.responseText);
        }
}
http.send(params);

這篇文章剩下部份還有舉出AJAX包裝好的方法。有興趣可以去看一下。

2010年7月5日 星期一

[PC] Vaio P GMA 500 xp硬解

網路上可以找到很多。一種方法式安裝PowerDVD,另一種是安裝內含PowerDVD codec的pure codec包。我是採用後者,搭配kmplayer和potplayer。

主要方法可以參考【转】 【转帖】高清视频相关知识和 KMPlayer 硬解码(DXVA)设置這篇文章。

主要步驟就是取消內建解碼。加入外部解碼(Cl264dec.ax、Clvsd.ax、Clvc1dec.ax),建議用手動選檔方式加入,我的狀況是會自動搜尋找不到H.264需要的解碼。接著開啟解碼器的DxVA硬體加速功能。最後改變撥放器的渲染效果(VMR7/9)。

渲染效果若選跟vista/win 7一樣的EVR,就會馬上藍屏重開機。VMR7和9可以多嘗試幾個,看哪個效果比較好。

播放時按下tab叫出解碼狀態,看到有dxva作輸出,就是有用到硬體解碼了。

其他參考資料http://www.evolife.cn/?p=42387

2010年6月22日 星期二

MeeGo

image

本來想趁機用VirtualBox跑一下MeeGo,結果發現進入開機選單按下Enter就當了。找了一下後發現PAE/NX要開啟。

image

但是進去後說我CPU不支援呀,好像只支援Intel家族的。只好暫時先放棄嚕。

2010年5月24日 星期一

Moving in input box with javascript

image

我們想在網頁上藉由一系列按鍵在表單上移動,就像上圖所示,下面的素材可以幫助我們完成所需要的功能

Tab Key Emulation
模擬使用者按下tab按鍵,指定在表單內哪些元件移動。

INPUT FIELDS: Cursor Position Control Example
取得游標停留在字元哪個位置。

Setting Cursor Position in a Textbox or TextArea with Javascript
設定游標停留在字元哪個位置。

鍵盤事件:基本測試
取得鍵盤按鍵的key code。

2010年5月20日 星期四

Get interface ip in linux kernel

在userspace的ioctl是不能使用的。在這邊以取得"br0"為範例。

struct net_device *br0_dev;
struct in_device *br0_in_dev;

br0_dev = dev_get_by_name(&init_net,"br0");
br0_in_dev = in_dev_get(br0_dev);

printk(KERN_INFO br0 ip:"NIPQUAD_FMT"\n" ,NIPQUAD(br0_in_dev->ifa_list->ifa_address));

NIPQUAD的話要參考前一篇ip轉換為字串的說明。

參考資料:
[1] 利用net_device取本机ip地址+网络设备的IP地址结构

2010年5月19日 星期三

Print ip string in kernel

平常我們在linux下撰寫app的時候,可以使用inet_ntoa()之類的語法來將32bit的binary轉換成可讀的ip字串。但是在kernel環境下,沒有inet_ntoa之類的方法可以利用,但是我們可以利用簡單的形式作一下轉換。

這個範例利用define減少撰寫程式碼,當然你可以把它包成function。

addr是32bits類型,例如__be32。

先定義addr取哪些變數出來。

#define NIPQUAD(addr) \
        ((unsigned char *)&addr)[0], \
        ((unsigned char *)&addr)[1], \
        ((unsigned char *)&addr)[2], \
        ((unsigned char *)&addr)[3]

定義印出的ip格式。

#define NIPQUAD_FMT "%u.%u.%u.%u".

最後印出ip至console上。

printk("my address is " NIPQUAD_FMT "\n", NIPQUAD(ic_myaddr));

參考資料:
[1] Re: Is there any function similar to inet_ntoa() in Kernel or NetFilter

2010年5月7日 星期五

javascript檢查數字

這邊想要做的是用javascript檢查來源字串是否是數字,最常用的是isNaN()作為檢查。但是isNaN()對於空字串是無法檢測出來的。JavaScript 空白を0として合計金額を計算這篇文章說到了可以利用"!"這個運算符號檢查出空字串。

但是呢,我發現空白字串,例如"   "這樣子是無法被"!"檢測出來的。轉個彎來說,要解決的個問題,可以利用trim()這個方法消除空白字串成為空字串,然後再利用"!"檢查出來就OK了。

[2010.5.17 updated]

trim()在IE系列中並不支援。請使用下列語法來達到trim()的效果。

if (!('trim' in String.prototype)) {  
    String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); };   
}

參考自Internet Explorer 6: No String.trim() support

2010年3月14日 星期日

[360] Ghostbusters

TPS類型。

這遊戲要幹嘛?!當然是抓鬼呀~透過跟影集裡面一樣的設備,跟著隊友一起去抓鬼。對於其他物品家具,當然就瘋狂破壞。簡而言之。這款可以歸類為發洩的遊戲。

也許這畫面不是很優,但是遊戲性真得很不錯,聽到那主題音樂,簡直是熱血沸騰。我認為不是fan的也可以嘗試看看。

聽說Wii版本可以兩人一起過關,但是360版似乎不行。

連我都想找原作來看看了。

ghostbusters-the-video-game-xbox-360-box

[360] The Saboteur

TPS類型。

這遊戲是很典型的GTA類型。時代設定在納粹正風光時。裏面主角只是個小毛頭,攀爬能力卻是很強,另外還有什麼車都能輕鬆開走的技能。進行的方式也是很自由,接接任務,或是有很多小任務可以玩。

畫面就真得是很特別了,獨特的黑白,再加上重點部位著同一單色的手法感覺很不錯,整個肅殺氣氛也很有到位。想在當初GTA裡面,警察什麼的我都沒再怕,但是在這裡,可能受到歷史的影響吧,也不太敢愛亂來,哈。

劇情也挺不錯的,最後的大反攻真得是很爽,有著不得不破關的衝動。

saboteur_pack360tyrf

2010年2月25日 星期四

c raw socket in linux

在linux下利用c來偽造封包,並不是表面上拿到原始碼就可以執行那麼簡單。

要達到這個目的,linux提供了raw socket方式。使用者需要自己定義ip header的內容。如果要進一步偽造更上層的tcp與udp封包,就需要自己定義tcp header或是udp header。mac層無法使用raw socket偽造。

tenouk網站中有詳盡的linux socket programming可以參考,當然也包括了raw socket部分。需要注意的是,在tcp與udp的raw socket範例,它們採用了自己定義的ip header以及tcp header與udp header。而裡面的structure,在ubuntu 9.11上測試是錯誤的,必須要自己參考系統的ip.h及tcp.h與udp.h。IP Header Data Structure這篇文章有說到關於不同系統,它的header上其實是有差異的。當然為了節省麻煩與跨平台可攜,還是建議採用系統的header比較方便。cprogrammming有一篇是關於使用系統header的討論。

編譯過後,執行需要root權限才能送出封包。而在destination上要注意的是,如果該host不存在,通常系統會先發出arp封包詢問。如果詢問無結果,由於系統無法填入mac位址,就不能送出。而source則無此限制。

參考資料:
[1] A brief programming tutorial in C for raw sockets
[2] Advanced TCP/IP - THE RAW SOCKET PROGRAM EXAMPLES
[3] SOCKET PART 10 - MORE TCP & UDP CLIENT & SERVER PROGRAM EXAMPLES
[4] Linux raw socket programming- cprogramming.com

2010年2月19日 星期五

[PSP] Assassin’s Creed- Bloodlines

ACT類型。

這款遊戲是跟隨著刺客教條2一起出的。但老實說,我並沒有玩過一代或是二代。整個遊戲的畫面在PSP上來說算是很不錯的,利用了很多光影的效果來彌補場景。建築物也是隨意爬行,很有自由度。在任務上也標示了地圖指標,也不怕會迷路。

或許也是太自由的關係,動作上可能考慮有太多可能性,反而有時候會卡住或是不好操作。任務上就一直暗殺,護送等等,變化也沒有很多樣。頭目戰當然不可能用暗殺的,都是直接開打。

我打起來就像是三國無雙一樣,哈。

IGN Trailer連結

201002201547_001

[360] Army of Two: The 40th Day

TPS類型。

這片射擊遊戲其實期待了很久呢!實際遊玩結果我也覺得很滿意。畫面比前一代提升了很多,而且讀取速度也變快了。開始玩之後就停不下來了。

助手的AI還算不錯,在簡單模是下不會隨便被射死。槍的話我則是從頭到尾都用同一把槍。要升級槍實在太花錢了,這代的商店設計簡直就是要你玩第二輪。但是呢,整體耐玩性不高,破完一輪就可以準備要收工了。

裡面的中文很好笑,根本是老外看不懂亂寫。建議要做在華人場景的,中文標示語還是要得先研究一下。

army_of_two_the_40th_day_frontcover_large_qM5F6j7hwwyfbAD

[360] Prototype

ACT類型。

這遊戲的特點就是可以感染路人,並變成他的模樣。整個遊戲就在像GTA一樣的方式下進行。行動上也沒有限制,想要攀岩走壁都可以達成。以初次接觸到這類型的感覺來說,是很爽快的。

一開始的序章中,主角真得很強,就像是技能點滿一樣,但是隨著故事開始倒敘之後,又要重最爛的開始了。雖然有四種能力,但是我實際上用到也只有兩種而已。在高速的戰鬥下,遊戲沒有做好自動鎖定人的機制,變成常常跑得很快,卻啥人的抓不到。

進行到最後,老實說有點boring呢。重複性有點高了點。

Prototype-Xbox-360-Cover

2010年2月9日 星期二

Post form data by javascript

在html上,有時候我們是自己用javascript定義GET字串作發送的,像是test?a=1&b=2這樣子的形式。然後再利用eval作法送出去,作法像下面的樣子。

var code=”location=test?a=1&b=2”;
eval(code);

後來基於某種原因,希望改成用POST方式傳送。在不改變原有form的前提下,有人說可以利用xmlHttpRequest方式傳送,但我認為這方式只能在背景執行,對於一些像真正submit的form需要換頁而言並不適用。後來我有找到利用javascript即時建立一個隱藏form的方式傳送,我認為這是最好的解法。改寫了一些適合我的程式碼。

<script language=javascript>

var para="a=1&b=2";

function submitFrm(){
  para_array = para.split('&');
  var postForm = document.createElement("form");
  postForm.setAttribute("method", "post");
  postForm.setAttribute("action", "test");
  var i=0;
  for(i=0;i<para_array.length;i++){
    hash_array=para_array[i].split('=');
    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("name", hash_array[0]);
    hiddenField.setAttribute("value", hash_array[1]);;
    hiddenField.setAttribute("type", "hidden");
    postForm.appendChild(hiddenField);
  }
  document.body.appendChild(postForm);
  postForm.submit();
}

</script>

參考資料:
[1] Javascript Post on Form Submit open a new window

c-faq

這c-faq是原文翻譯過來了,雖然辭不達意,但是我覺得有很多值得一看的,包括了許多在c中很靈異的狀況,或是較好的寫法,都可以在這裡獲得答案。有興趣可以再看原文版。

網址:http://twpug.net/docs/ccfaq/node1.html

順便附上裡面提到的C語言新手十誡(The Ten Commandments for Newbie C Programmers)。這篇文章有附上範例,比直接啃原文好多了。

2010年2月1日 星期一

Massive javascript data type

javascript由於型態之間較為鬆散,型態轉換可以利用自動來完成。這樣好像不錯的樣子,但對我而言是個大災難。

型態命名好像都隨意的樣子,但若經過運算的話,常常會得到意想不到的結果。在這裡建議對於每一個變數都要確實掌握型態,初始化或是轉換也要明確使用函式進行轉換,否則單憑想著"反正瀏覽器會幫我轉換",到時候debug就等著一行一行看了。

JavaScript的資料型態及變數記載了一些自動轉換的規則,可以用來參考。數字、字串的判斷,可以由JavaScript中isNaN函数就可以獲得了。

如果有更好的IDE就好了。

2010年1月31日 星期日

[360] Mini Ninja

ACT類型。

講到忍者,大家都會想到忍外吧!而這款,雖然也是跟忍外一樣的第三人視角,但不像忍外這麼變態。這是一款適合放鬆的遊戲。

清新的卡通場景,好聽的音樂,我實在很愛那黃昏時的那整個橙色景色。不需要比多邊形的多寡,我認為這遊戲贏在整個美術的設計。遊戲一點也不難,打boss也有親切的提示。沒有複雜的招式,也沒有複雜按鍵,就照著一般玩法就可以了。

有人說,這遊戲當作一般retail販售好像太貴了點,但是放在Arcade上又好像太大了點。我姑且可以稱他為小品遊戲的大作。

很高興可以玩到這麼有趣的遊戲。

jaquette-mini-ninjas-xbox-360-cover-avant-g

[360] Fracture

TPS類型。

這遊戲選定了一個特色,那就是射擊的時候,可以把地形作隆起或凹下的作用。這樣一來就有很多特色可以玩啦,像是把某些地隆起可以到達跳不到的地方,有些地方被埋住了可以藉由凹下的作用,到達原本無法進入的地方。

來說說感覺好了,我覺得這遊戲跟Time shift很像,不是指遊戲的進行方式,是感覺。一開始很新鮮,接下來就很boring。漫長的關卡之旅,好像有點重複的場景,似乎沒什麼變化的人事物。要不是已經投資時間在上面,不然的話,我給這遊戲分數不高。

最後的魔王真得很難纏,還是靠 bug打贏的。既然就已經在上班,就選easy來犒賞自己,不要自找麻煩打normal以上。(音game除外)

Fracture 360

2010年1月28日 星期四

strtok trap

strtok是C語言上常常用來切割字串的方法。典型用法大概就長得像下面一樣。

char *token = strtok(str, del);
str為來源字串,del為想要用來做分割的字元。

看到了這樣的寫法,或許就會以為,那麼str就只是單純的傳進去而不做任何改變吧?!這是錯的想法!strtok會將傳進去的字串做完分割並回傳第一個token,但也同時str也會變得跟token一模一樣。看了Microsoft實做的strtok原始碼,就可以知道他怎麼做了。

所以下次要使用的時候,若str有想要再利用的需要,請先把str先複製一份做保存吧。

參考資料:
[1] [C/C++] string使用strtok的問題
[2] (筆記) 如何使用strtok()? (C/C++) (C)

2010年1月21日 星期四

Capture wireless packet using wireshark

想要擷取無線網路的封包,不必使用任何特殊軟體和硬體,只要簡單的wireshark就可以辦到了。但是也不是說什麼都不必調整就可以使用。在Capture->Options中,把Capture packets in promiscuous mode取消勾選就可以了。

image

參考資料:
[1] wireshark在无线网络下的使用

setTimeout and XMLHttpRequest not work in IE

在利用javascript製作互動式網頁時,常會利用XMLHttoRequest去詢問伺服器,並且使用SetTimeout去重複詢問。Pattern應該會長得像下面這樣。其中xmlHttp是XMLHttoRequest物件。

function startValidate() {
   xmlHttp.open("GET", url, true);
   xmlHttp.onreadystatechange = handleStateChange;
   xmlHttp.send(null);
}

function handleStateChange() {
   …
   setTimeout('startValidate()', 2000);
   …
}

然而在IE中,這樣的程式碼卻會無法正常運作。經過trace後,發現執行完一輪後,第二輪有送出request,但是無法跳到handleStateChange。setTimeout運作是沒有問題的。這樣的寫法在Firefox和Chrome中沒有問題。

google說有好幾種方法可以解。

第一種說明因為IE認為request沒有變化,所以不進行重整,建議網址上可以加上random參數。但這種方法並沒有辦法解決。

第二種說明onreadystatechange被IE銷毀,所以沒有辦法呼叫。建議xmlHttp物件重新new一次。就像下面這樣。

function startValidate() {
   xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
   xmlHttp.open("GET", url, true);
   xmlHttp.onreadystatechange = handleStateChange;
   xmlHttp.send(null);
}

或者是,有個非常tricky的解法,就是onreadystatechange在send送出後再進行連結的動作,因此程式碼會長得像下面這樣。

function startValidate() {
   xmlHttp.open("GET", url, true);
   xmlHttp.send(null);
   xmlHttp.onreadystatechange = handleStateChange;
}

參考資料:
[1] 关于XMLHTTP 4.0以下版本的onreadystatechange只触发一次的问题。
[2] SetTimeout not working in IE7

2010年1月20日 星期三

Use service with Eclipse in OSGi

現在最常開發OSGi的環境是Eclipse,很多廠商都對OSGi推出pluging套件供整合開發。不同的廠商有提供特殊功能的services,但是都不是屬於標準之內。

要使用這些service不外乎要在bundle內部的manifest寫入import-package動作。但是在IDE眼中,這些import-package雖然寫了,但是我要compile時仍然沒有這些jar可供參考呀!所以會可能發生無法編譯的情形。

我原本是使用Eclipse EE進行開發,但是遇到這種情形,Export出來的bundle都是不合格式,只要一引用外部service就會發生。下圖就是一個非法格式bundle。不應該有.setting、bin和src目錄存在。
image

然後我就浪費了許多時間在Eclipse EE身上。後來改用Eclipse 3.4.1版本,然後再搭配一些方法,就可以順利做出可用的bundle了。

在進行之前,請先確定至少有想要引用service的bundle。這裡以prosyst的putil為範例。

首先就是先下載3.4.1版本的Eclipse,不需要做任何多餘套件的安裝。先建立一個新專案。進入該專案的Manifest,在MANIFEST.MF內填入你要import的package,通常就是你的service interface類別。要得到切確路徑,除了可以看API,還可以從該framework內以指令查到。
image

接著為了要讓IDE知道該import的package哪裡可以找到,因此要為他加入eclipse所屬的framework中。之前在EE環境中測試過若把bundle放進去eclipse的/plugin目錄中,那麼不會被eclipse讀到,也許要某種產生的plugin才可以。所以要手動建立。

在左邊package視窗,在專案上按右鍵選Import。
image

選擇Plug-ins and Fragments。接著下一步選擇你的.jar bundle,便可以加入了。
image

你可以看到左邊package視窗多了一個專案。
image

接著設定你自己專案的lib,這樣一來compiler可以得知目前import的class的狀態,如語法偵錯等等。在你專案上按下右鍵選properties。在Labraries頁面上加入你的bundle。
image

剩餘就是你coding的工作了,使用方法就像網路上隨處可以找到的說明。

這樣一來你就可以正確的Export你的bundle了。要注意的是,上述動作在Eclipse EE環境下皆會失敗。

2010年1月17日 星期日

[360] Rock Band: The Beatles

MUSIC類型。

遊戲方式就是很典型的Rock Band進行方式,所有歌曲都是Beatles的。我覺得這遊戲的賣點在於裡面的美術都是精心設計過的,巧妙的和Beatles結合在一起,而不只是單純的把Beatles的歌放進來而已。

難度來說偏向簡單,我在其他都是打Hard,在這款遊戲我可以用最難的Expert全破。當下有種變強的感覺。歌曲是採用年代進行,每個年代有個主題。越後面的歌才感覺越難,會不會和作曲日益複雜有關?

無論是不是fans,這是不能錯過的系列。

thebeatlesrockbandxbox360cover

[360] James Cameron’s Avatar The Game

TPS類型。

這就是最近最火紅的Avatar阿!可惜我找不帶人陪我去看。

若在網路上搜尋關於Avatar的遊戲,很有可能會找到以前的”最後的空氣大師",他也叫Avatar。

Avatar裡面在初期會因為劇情而要選擇成為Navi或是人類。遊戲很貼心有地圖可以看,並標示需要前往的地點。Navi的專長就是近戰,揮一刀人類就掛了,拿了槍反而比較弱。人類最強的就是槍械,若是搭乘機器人載具就超強的。每次出任務就A一台機器人就覺得很作弊。

很用心的是,Navi和人類的地圖完全不同,除了最後一張。這實在是太有誠意了。劇情當然也是不同。難度也不會太難,場景也很漂亮。要說缺點的話,就是讀取有點久,裝到硬碟也是只有快一點點而已。

James.Camerons.Avatar.the.Game.XBOX360-STRANGE_coverImage

[360] SpongeBob: Truth of Square

ACT類型。

說起海綿寶寶,就會想到一個有點智障的卡通。在遊戲中也是有點智障,配音很好笑。裡面過關的條件也是非常簡單,打打敵人,收集一下錢幣,然後就過關了。

比較困難的BOSS戰,遊戲都沒有提示弱點在哪裡,所以找不到卡關的話,所幸PSP版內容也是完全相同,可以上網找youtube來解謎。

遊戲中有幾個地方真得會令人惱羞,跳耀的距離意外的抓不準,讓我一度以為我手殘了。重生存檔點也有點奇怪,當打到存檔點前一步瘋狂死亡真得很想摔手把。

整體來說打擊感還蠻夠的,有爽快感。

jaquette-bob-l-eponge-truth-or-square-xbox-360-cover-avant-g

[360] Brutal Legend

算是...戰略+動作類型吧!

這遊戲最大賣點就是由搖滾教室的主角來扮演遊戲中的角色。如果光看gameplay圖片的話,會以為是一般的動作遊戲。其實不然,遊戲的類型很多變化。有化身為動作類型去砍殺魔王,也有護送的任務,還有,像戰略型式去生產小乒,指揮,並親身投下戰場。遊戲廣大的無縫讀取在加上搖滾樂,其實是挺熱血的。

故事還挺芭樂的。整體遊戲來說,我個人沒有很喜歡戰略型式。況且有些特殊打法或是載具特殊用法也都沒說清楚,害我卡關很久。這對我而言,不是我的菜。如果遊戲進行方式可以更單純一點,或許會比較好一點。

裡面的支線任務還挺多的,有愛的話可以玩玩看呀!我還是聽聽搖滾樂就好。

jaquette-brutal-legend-xbox-360-cover-avant-g

2010年1月6日 星期三

Connection reset in servlet when upload

OSGi的環境中,在實做HttpServlet的時候,因為板子配備很低,在接受upload大檔案時一直發生Connection reset的問題。利用Wireshark查看,發現預定送出的錯誤訊息有送出,但是client上傳似乎被強制中斷。

猜測與uploading強制中斷有關,後來利用了等待上傳數據完全傳輸完畢再進行其他動作,才避免了這樣的情形發生。

解法如下:

在doPost的方法中,假設HttpServletRequest變數為request。

接著在方法的一開始,就進行忽略上傳數據動作到結尾。

ServletInputStream input=request.getInputStream();
input.skip(request.getContentLength());
input.close();

這樣一來就能確保client端上傳完畢。或許有想過skip這行不要可以嗎?答案是不行的。好像任意停掉client端就會導致connection reset。那如果我不小心上傳了G級檔案豈不是要等很久嗎?網路上Krzysztof Osiecki網友說"

That's the way HTTP works. When sending data to server you are forming request, and after successfully recieving your data server responds.

The solution is to use flash or applet to upload files, that way you can force client side not to send too much data to server.

就認命吧!

參考資料:
[1] Large file upload does not stop after FileUploadLimitExceededException

彩色shell prompt

玩ssh玩久了,總是會想耍酷一下。最常用的花招就是讓自己的命令列變成彩色的。網路上有很多文件可以教學。有些甚至很誇張,讓命令提示字元變成一副ASCII畫。

以前都沒好好紀錄,現在又重新做了一遍功課。要達到這種方式的方法有兩種,第一種是彩色碼方式,有點像BBS的語法。我製作了我想要的語法,如下。

export PS1="\e[1;37m[\e[1;36m\u\e[1;37m@\e[1;35m\h \e[1;33m\W\e[1;37m]\$ \e[m"

把這行打進去就可以了。可是你會發現,彩色碼好像怪怪的,在fedora的bash下,好像換行不太正常。似乎與PS1的長度有關。後來就改試第二種,tput方式。

export PS1="\[$(tput setaf 7)\][\[$(tput setaf 6)\]\u\[$(tput setaf 7)\]@\[$(tput setaf 5)\]\h \[$(tput setaf 3)\]\W\[$(tput setaf 7)\]]\$ \[$(tput sgr0)\]"

這樣一來就變正常了。如果想要登入時就這樣顯示,那就把它寫進家目錄下的.bashrc檔案裡頭就可以了。

下圖是完成圖。
image

需要更多控制語法,請至Bash Shell PS1: 10 Examples to Make Your Linux Prompt like Angelina Jolie參考。

關鍵字:linux, shell prompt, color, bash.