星期六, 2月 21, 2009

惱人的 Caps Lock!

今天看到學長在講HHKB 鍵盤,便上網看了看是怎麼樣子。雖然我沒有很喜歡,看起來好像太小了一點,不過我發現HHKB 的左邊Ctrl 鍵是長在我們正常鍵盤的Caps Lock 的位置,這真是太妙的設計了!老實說Caps Lock 對我來說根本是多餘的一個鍵。

找了一下網路上的教學,若要重新設計可以透過 XKB 或 xmodmap 來修改。XKB 的設置是要在xorg 的設定檔裡面更改,所以要有root 的權限才行,所以這裡我選則用xmodmap 來修改keyboard mapping 以下是我在一個網站找到的設定檔。
remove Lock = Caps_Lock
remove control = Control_L
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L
存成檔案再用 xmodmap [filename] 就可以了!
------------------------

這個例子讓我有衝動想寫一個玩魔獸(爭霸) 用的keymap,把數字鍵改到鍵盤中間應該不錯,有時間再來試吧 :p

星期三, 2月 11, 2009

battlelan for Linux

雖然說Linux 本身不是設計用來玩遊戲的,但是有時候還是想玩一些遊戲。我最常玩的大概就是StarCraft(天阿,好老的遊戲,聽說快出2 了!!) 跟 WarCraft3 吧。但這些戰略遊戲自己玩單機一點也沒挑戰性,也不刺激,所以連線對戰可以說是這些戰略遊戲最重要的部分了。

除了上Battle.Net 以外,有時候我們想用區網連線,Windows 上透過 BattleLan 或是 LanCraft 都可以以 socket redirecting 達到與區網外連線的目的,但Linux 上我好像沒有看到類似的軟體。

那時候為了跟同學連線,上網找了相關的資料,後來看到有人自己寫了BattleLan,雖然是在Windows 上的,可是有了他的程式碼我可以改成在Linux 上用的BattleLan。搭配Qt,我做了我的'FreeLan',執行畫面如下。

目前是可以一次設定多個連線的ip/host,對於host game 很方便,做client 的時候通常只要設定一組就可以了。現在做的還不是很完全,所以暫時大概也不會開放下載,但如果很想要的人可以跟我要:p。

-----另解----------
由於是socket redirecting,理論上使用 iptables 也可以做到這種功能,但是我對iptables 實在不熟,試過幾種設定都不見功效,如果有高人請賜教 :)

不過以上這兩種都需要root的權限才行。

-----又 另解-------
就像Windows 上的 Garena (人稱 GGc),理論上也是可以hook 那些socket 的api (透過LD_PRELOAD, 應該可以) 修改過封包以後再送出,這種方法我還沒試過,不過就算是wine,最後也是調用系統的socket function 才是,所以我想這應該是沒問題的,而且這種方法也不需要root 的權限,應該是最方便的解決方法。

-------------------------------------------------------------------
02/13/09 更新

今天看了一下 wine 的 source, 看來WSASendTo 的地方是用 sendmsg 來實作。於是便寫了一個小 library 用 LD_PRELOAD 替換掉wine 會呼叫的 sendmsg,完全符合我預期的情況,看到War3 送了一堆broadcast 的 packet,redirecting 或修改封包也都不成問題了。想一想,這東西要是在Windows 下寫還真麻煩,不得不讚賞一下 Linux 完美的機制。

執行結果:

trap

今天在找 mplayer 相關的 dev 資訊,無意中翻到 mplayer 附的一些 code,裡面有個 mpconsole 的shell script挺有趣的。 裡面有用到一個指令叫作 `trap'。

找了一下資料,原來 trap 就是有點像 C 裡面的 signal(),可以設定在執行時的signal handler,沒想到 shell 也能做如此的設定,真是大開眼界 :p

使用範例:
http://steve-parker.org/sh/trap.shtml

所有的可以用的signal 在 signal(7) 有列表