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.