星期一, 9月 29, 2008
星期一, 8月 25, 2008
很奇怪的一個禮拜
莫名奇妙的就在公司渡過兩個夜晚.
假日也莫名奇妙的出現在公司.
還被嫌做不好...真無言.
雖然也和上級反應過, 但, 為了種種的理由...我想我也只能對主管發發牢騷...然後還是承受下來吧.
但, 在開會的過程中, 情緒和情緒化的字眼發洩過後, 自己坐下冷靜反省, 自己也確實有做錯的地方.
可是, 最近的工作模式好像在幾個月前也曾出現過, 當時的狀況實在很糟糕. 現在又有同樣的感覺.
不過, 還是把自己的心情收拾整理一下, 把自己的事做好.
其他的事就交給該負起責任的人吧.
星期二, 8月 19, 2008
最近在工作上遇到了...
Media Independent Interface(MII)是一種標準的介面用來將MAC controller和PHY chip連接在一起. [1]和[2]介紹了幾個MII的變種. 即然是標準的介面, 當然就有一些規範, 但最近遇到的PHY chips好像並沒有完全遵守規範在做. 使得driver在透過MII取得PHY chip status時, 必需針對使用的PHY chip做些調整, 真麻煩.
NC-SI[3]則沒有摸哪麼多, 只是知道在搞什麼鬼而已. 從功能面來講, 它可以用來設定MAC controller將特定MAC address的frame forward到特定的目的地, 當然也要MAC controller支援這種功能才行. 而這功能稱之為Sideband.
至於SPI Flash則是老掉牙了, 一句話帶過, 就是透過SPI存取Flash.
這些東西雖然簡單, 但是, 要讓driver能徹底發揮硬體特性的同時source code又俱有延展性和可讀性, 可真是需要一番功夫啊.
[1] Media Independent Interface
[2] MII (Media Independent Interface 介质无关接口)
[3] Network Controller Sideband Interface (NC-SI) Specification
星期日, 8月 17, 2008
Free Accounting Software | GnuCash
不過,事實上,也是因為我的需要也就是記記帳,所以對GnuCash的認識也僅止於此.
GnuCash, http://www.gnucash.org/
星期五, 8月 01, 2008
java.awt.Toolkit.getLockingKeyState on Linux
首先講在MS Windows下的做法, 很簡單, 利用java.awt.Toolkit就可以簡單的做到.
public class KeyLockDemo {
public static void main(String[] args) {
java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit();
System.out.println("Caps Lock is " + (tk.getLockingKeyState(java.awt.event.KeyEvent.VK_CAPS_LOCK) ? "on" : "off"));
System.out.println("Num Lock is " + (tk.getLockingKeyState(java.awt.event.KeyEvent.VK_NUM_LOCK) ? "on" : "off"));
System.out.println("Scroll Lock is " + (tk.getLockingKeyState(java.awt.event.KeyEvent.VK_SCROLL_LOCK) ? "on" : "off"));
}
}
非常簡單...
但同樣的code在Linux下卻不行用, 因為SUN JVM在Linux下的java.awt.Toolkit沒有實作getLockingKeyState這個method, 因此會丟出UnsupportedOperationException.
哪怎麼辦呢? 其中一條路是利用JNI (我也只知道這條路).
首先引用我在網路上找到的資料, 在[1]中提到三個方法可以"控制小鍵盤及鍵盤燈狀態".
第一個方法是利用ioctl的方式存取stdin以獲得狀態, 最理想的方法, 但僅能在console的模式下使用, 即進入X Window後就不能用了.
第二個方法我個人沒試過, 但它是利用X11的函式庫實作.
第三個方法則是利用ioperm的方式直接操作鍵盤燈, 但仍無法取得locks目前的狀態. 附帶一提, 這個方法其實是下Keyboard Command達成控制LED的, 可以參考[2].
咦? 這樣不就又沒解了嗎? 是的, 所以, 我現在要講的是怎麼修改第一個方法使得在X Window下也能取得locks的狀態.
首先, 第一種方法是利用stdin這個file descriptor[3]來實作. 但在X Window下, stdin似乎被別的input device取代了, 所以對stdin做ioctl也無法取得狀態. 所以, 我們要自己open在console mode下的stdin (i.e., /dev/tty0 or /dev/tty1). Source code如下:
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/kd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define NUMLOCK 0x02
#define CAPS 0X04
#define SCROLL 0X01
int main(int argc,char **argv) {
int fd = 0;
unsigned char leds = 0;
fd = open("/dev/tty1", O_RDONLY);
ioctl(fd, KDGETLED, &leds);
printf("Caps Lock is %s\n", (leds & CAPS ? "on" : "off"));
printf("Num Lock is %s\n", (leds & NUMLOCK ? "on" : "off"));
printf("Scroll Lock is %s\n", (leds & SCROLL ? "on" : "off"));
}
方法有了, 剩下就是自己在Java裡面寫個JNI method呼叫C的function把狀態取回來吧!!!
[1] 控制小鍵盤及鍵盤燈狀態, http://blog.csdn.net/cceczjxy/archive/2008/06/25/2584796.aspx
[2] Keyboard scancodes, http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html
[3] File descriptor, http://en.wikipedia.org/wiki/File_descriptor
星期一, 5月 12, 2008
Linux Driver
簡單來講, 把握以下要點就可以寫出一支屬於你自己的Linux Driver了.
- init_module和clean_module: 這兩個functions, 用C++的角度來看, init_module是constructor, 而clean_module則是de-constructor.
- file_operation: 簡單講, 其實就只是function pointer的對映而已. 你必需分別寫出當open, release, read, write, ioctl時, 你的driver要怎麼處理.
說的比做的簡單, 沒錯, 就這麼簡單, 就可以編譯出你自己的driver然後insmod到Linux裡. 但, 事實上, 即使是最簡單的Character Driver也牽扯到很多事情. 隨便舉例, blocking or non-blocking, mutex (或類似的機制)使用的時機. user-mode和kernel-mode資料的交換(i.e., copy_from_user or copy_to_user), 更進階的mmap.
寫出來正常運作只代表do the right thing, 要怎麼do the thing right才是一門大學問啊!!!
星期六, 5月 03, 2008
讓你的JPanel能取得VK_TAB
答: 以實例來說,
JPanel panel = new JPanel();
panel.addKeyListener(your_keylistener);
panel.setFocusTraversalKeysEnabled(false);
但, 這問題還沒完全解決, 如VK_PRINTSCREEN還是抓不到, VK_WINDOWS即使Java Application抓到了, 卻無法阻止(e.g., consum())這個event到OS...
still looking for solution...
星期一, 4月 21, 2008
Bits Ordering is Matter
原本, A這組mask需要200ms才能完成redraw...沒想到換成B mask只需要30ms...這實在太奇妙了.
也許有時間再來post一篇研究一下為什麼差這麼多.
星期日, 4月 13, 2008
最近在空閒的時候...
我一定要做到。
這是我生命中唯一有意義的事情,唯一有意義的一刻。
我是為此而生,如果失敗,
那我就會在這一刻死亡。
這段話看起來就像是電影、戲劇、漫畫、動畫中才會出現的對白,我想現實生活中是不會有人這樣講話的吧!?有人跟我說,龍槍系列中最好看的就是龍槍傳奇2。看完,龍槍編年史3,龍槍傳奇2,靈魂之戰4之後,我深有同感,但我說不出原因。但在看了雷斯林傳奇以後(儘管我現在還沒看完)我知道為什麼了。因為,雷斯林這令人茅盾的角色。雖然我看的書不多,但,最近也感覺出東/西方文學的差距了。不成材的我都是看小說,最近也在想是不是應該看些不一樣的書,例如,勵志之類的書。
從某些角度來看,我們是不是能【借鏡】,用雷斯林哪樣的態度看待人生,找到自己生命中有意義的一刻,我很敢說我現在沒有找到。以前看書/電影從來沒有想到這些,就只是單純的在看書/電影而已。但,有危機意識是好的,現在開始找也不嫌晚。
工作也一段時間了,雖然能從工作中得到樂趣,但,工作中也有我【十分】不喜歡的事情,又要小抱怨一下了,接下來這件事目前並沒有發生在我身上但,我在旁邊看著這件事發事,讓我想到這件事有一天也會發生在我身上,Project天經地義就是要meet schedule,沒錯。但,當schedule排得很不合理時,是不是還要強迫自己去meet schedule?我想,現在我會儘力,但以後難講。工作在過去不是我的全部,現在不是,未來也不會是。
還有人與人之間的關係太複雜,我努力試著將他簡單化,即使有人在我面前【睜著眼睛說瞎話,說著自以為高超的謊話】。有五感和腦袋的人,睜開眼睛仔細看,動動腦袋仔細想,誰在說謊是很明顯的。
最近也對自己多了一點認識,我真的是處女座,就像有人曾經這樣說過我一樣。我有潔僻,精神上的潔僻,有些事極難忍受。同時,我也很討厭【等】,例如:有著長長的人龍隊伍在等著吃某家店的東西,我打死不去,除非,不用排隊。我的朋友們,這兩個地雷不要來踩,除非,有把握踩下去以後炸不死(這時候我就會喪失冷靜的想,炸不死再補一顆),不然,千萬不要踩。哈。
1. 雷斯林傳奇(上 )靈魂熔爐 和 雷斯林傳奇(下) 烽火試煉
星期六, 3月 29, 2008
Java Native Interface - Accessing Array
直接切入正題, JNI要怎麼存取從Java傳遞過來的陣列? 以byte為例, 在Java端某個class MyCls有這樣一個method,
private native void passByteArray(byte byteArray[]);
然後在MyCls的某個method裡面
byte buffer[] = new byte[1024 * 1024 * 4]; // 4Mb的陣列
passByteArray(buffer);
然後在JNI是這樣存取陣列的
jsize len = (*jenv)->GetArrayLength(jenv, byteArray);
jbyte *buffer = (*jenv)->GetByteArrayElements(jenv, byteArray, NULL);
// do something
(*jenv)->ReleaseByteArrayElements(jenv, byteArray, buffer, JNI_COMMIT);
跛腳的地方在如果要讓JNI修改的值反映回Java裡的話Get和Release這兩個動作少不了...整個慢慢慢掉...因為Get回傳的指標是指到另一塊一樣大小的記憶體空間副本而不是原本的哪一塊空間, 所以想當然, Release則是把Get回傳的空間再覆寫回去, 順便把空間free掉.
不過, 事實上有另兩種做法...一種用另一組Get和Release函式...另一種是利用java.nio.ByteBuffer
另一組Get和Release函式的寫法如下(用剛才的例子重寫一次):
jsize len = (*jenv)->GetArrayLength(jenv, byteArray);
jbyte *buffer = (*jenv)->GetPrimitiveArrayCritical(jenv, byteArray, NULL);
// do something
(*jenv)->ReleasePrimitiveArrayCritical(jenv, byteArray, buffer, JNI_COMMIT);
為什麼這比較快呢? 因為Critical的Get會儘量, 但不是一定, 回傳原本哪一塊記憶體空間的位置, 所以修改即使不Release還是會反映回Java. 但, 要怎麼知道回傳的是否為另一份copy呢? 答案是利用最後一個引數其型態為*jboolean. 再修改範例一次,
jboolean isCopy = JNI_FALSE;
jsize len = (*jenv)->GetArrayLength(jenv, byteArray);
jbyte *buffer = (*jenv)->GetPrimitiveArrayCritical(jenv, byteArray, &isCopy);
// do something
if (JNI_TRUE == isCopy)
(*jenv)->ReleasePrimitiveArrayCritical(jenv, byteArray, buffer, JNI_COMMIT);
但根據Java Performance Tuning, Second Edition一書表示, 只要Get就要Release不管是不是取得原本的記憶體空間...無言...不過, 根據我自己寫程式測試結果, Critical的函式還是比較快...但有一個很恐怖的限制, 就是在Critical的Get和Release之間, 因為Java Garbage Collection的關係, 行程不能變成BLOCK狀態...不然...
最後是java.nio.ByteBuffer, 事實上只是利用ByteBuffer.allocateDirect(size)配置記憶體, 然後在JNI的存取是這樣寫的,
jbyte *directBuffer = (*jenv)->GetDirectBufferAddress(jenv, byteBuffer);
jlong directBufferLength = (*jenv)->GetDirectBufferCapacity(jenv, byteBuffer);
// do something
嗯, 這樣就可以了...但, 在Java端就沒辦法把ByteBuffer轉成byte[]存取, 因為一些限制, 不過這倒還OK...這做法可以讓Java和JNI共享一塊記憶體空間, 即然共享就要處理同步問題...
打了一堆, 沒CODE沒真相...最後是附檔包含java source code和c/c++ source code...這檔案是我用來測試效能的....很意外, CRITICAL GET/RELEASE最好..., 快在assignment operation時, TIME(CRITICAL GET的空間) < TIME(java.nio.ByteBuffer)
星期日, 3月 16, 2008
最近在?
為什麼說JNI坡腳? 其實只為了一個理由, 我想在Java或Native Code其中一邊配置出一塊記憶體, 然後供Java和Native Code共同使用. 我如果在Java裡配置憶體空間A並傳遞到Native Code, 在Native Code則很可能必需先產生一份一樣大的記憶體空間B, 然後對這個空間做修改的動作, 最後將B覆寫回A. 這樣做完全失去共享記憶體空間的目的.
下一次寫一篇來介紹JNI吧.
星期二, 2月 19, 2008
工作一個月又幾天以來的感想
今天解了一個bug, 中間靠許多人的幫助, 但, 總算跨出第一步了. 同時間再撰寫一個TestingTool要把測試自動化. 努力把所學的都用出來吧!!!
星期一, 2月 18, 2008
Inter-process Callback
例如, Process A告訴S: "有一個function存在於我(也就是Process A)的位址0x1024上, 請執行他.". 然後這時S就開始執行並告訴Process A執行結果. 這裡其實還有一些問題, 簡單的, function的prototype, 討厭一點的, function內變數的位址, 但我們先忽略這些問題. 單純的只是想做到上述的例子. 為了實作出這個機制, 過去幾天找了許多資料. Shared Memory, Memory Mapped I/O和Signal.
在Shared Memory的想法是, 我能不能把function內編譯完的machine code抓出來並寫到一塊shared memory裡面並附予這區塊被執行的屬性. 但試了許久, 抓出machine code了, 也寫到shared memory了, 但就是沒辦行執行起來, 我想也許是我忽略了什麼細節, 這個想法停頓在這裡了.
Memory Mapped I/O則是簡單的把其它processes的可執行檔利用mmap函式把整個file當成是自己space的一剖份, 並利用其它processes提供的function pointer所指的位址並搭配offset去找出function在自己的space的何處並執行. 這個想法目前還沒驗證過, 但可想而知會是一個挺麻煩的方法. 也許有時間時再試試看.
最後是Signal, 看到Signal我想大家都應該知道了, 其實就是processes間互丟signal很簡單的一個方法. 但, 並沒辦法提到最一開始所提到的機制. 所以....嗯...當作是複習一下吧!
其實還有想到很多方法, 但, 使終擺脫不了multi-programming所帶來的束縛. 但, 我如果這麼簡單就做出Inter-process Callback, 代表別人也能, 代表整個作業系統其實是曝露在危險中的. 這樣想想, 自己作不出來某種程度而言也算正常的, 畢竟我也才作了數天而已.
最後, 還是利用Thread或fork的方式做, 但利用Thread去做其實是很危險的, 因為如果 host process在等待自己產生的thread執行完, 而host process在等待則意味著thread可能無法執行, 就這樣形成了dead lock. 所以還是利用fork做比較保險. 但, 值得嗎?
1. 這裡有簡單的解釋http://www.linux-tutorial.info/modules.php?name=MContent&pageid=263
星期一, 2月 11, 2008
整個溼冷的年假結束了
星期四, 2月 07, 2008
北上? 南下? 到底要去哪?
星期日, 2月 03, 2008
又要過年了!!!
最近想了很多事, 但絕大部份的事情之間是存在一些依存性的, 比如: 要完成O2前必需先達成O1. 但在做O1之前則又考慮到(甚至比O2)後面的事項O3. 但想到最後則發覺連O1都還沒做, 去想O2和O3做什麼. 真的是想太多了!!! 典型的【不做怎麼知道】和【做事不考慮後果】之間的茅盾. 可是, 我想有些事真的是【不做怎麼知道】(也許不用考慮後果), 有些事做前則是要先考慮到後果. 寫著想著, 自己又在茅盾了, 可惡啊!!!
1. 就在今天早上下樓買早餐時, 鐵門打開後, 在驚赫中發現這事實.
星期四, 1月 31, 2008
坐車坐過頭! 是不想走了嗎?
上一次這樣坐過頭是五年前的事了吧, 沒想到還會發生一次!!!! 害我多花了30分鐘才到家!!!
星期二, 1月 29, 2008
讀後感: 我是傳奇(小說版)
以下列出相異之處:
- 疆屍是由細菌造成的, 電影中是治療癌症所造成的副作用.
- 主角只是一般人, 電影中是一名軍醫.
- 狗是中期才出現在故事中且過沒多久就死了, 電影中是主角女兒的寵物一開始就出現.
- 倖存者在小說並不存在, 但感染細菌而沒死的人發現抑制(並不是根治)的方法且開始反擊疆屍和派出間諜試圖要抓住並處死主角, 最後也成功了. 電影中則是找出治療方法但被疆屍圍住最後自爆而死, 而治療方法還是送到了倖存者的手上.
星期一, 1月 28, 2008
老闆娘的一番話與我不算想法的想法
在往公司的途中, 不知怎麼想起來這件事, 想一想, 現在有些人是真失業, 有些人是假失業. 其實工作也不是沒有, 就看你想不想做而已. 但, 我相信也是有人很努力的找, 但還是找不到工作. 其實想講的也沒有什麼, 只是希望有些人不要好高騖遠, 也希望身邊的朋友能繼續為了找到工作而努力下去.
1. 我想這種情況用獲或穫都滿適合的, 所以不需要太過於苛求用哪一個字才對.
星期五, 1月 25, 2008
初體驗: 尾牙
在一個五乘五的矩陣中填入0(或1, 不是很確定)~99之間的值, 然後台上的主持人會抽出號碼, 接下來就和我們一般玩賓果遊戲一樣, 只差在抽出來的號碼, 你所拿到的矩陣裡未必有. 在這樣的情況下, 我滿懷期待的等待賓果時間的到來, 隨著數字一個一個被抽出來, 心情也跟著D O W N下來了(原本還滿H I G H)的, 最後走出餐廳時配著綿綿細雨, 只有兩個字, 淒涼Orz, 不過, 整個過程因為身旁的同事很搞笑, 所以, 雖然賓果沒中, 但, 還是很不錯玩.
星期三, 1月 23, 2008
心情: 笑
也許是早上笑的太開心了, 今天一整天心情都不錯. 嗯, 如果真的是這樣的話, 也許可以考慮每天早上看一下周星馳電影的經典片段, 這樣每天心情都會很好.
進公司以來第一次寫程式
因此, 回家以後用C內建的bsearch function重新寫了一個O(LogN)且scalable的look up function, 等回到公司以後再把這個function更新一次.
星期六, 1月 19, 2008
第一個禮拜結束了
The IPMI specifications define standardized, abstracted interfaces to the platform management subsystem.1
想寫些什麼來大概的介紹IPMI, 但是, 在Intel的網站上就有漂漂亮亮又會動的PPTs且又說明的不錯,也有死死板板的Specifications白紙黑字的躺在哪,更重要的是...我懶...所以就不介紹了. 第一週結束.
1. Intelligent Platform Management Interface Specification Second Generation
星期二, 1月 15, 2008
報到的第一天
一帶到位置上首先是整理一下空間和把電腦擺放至定位. 然後, 主管帶著我認識整個部門的人, 說實話, 一下子塞進這麼多人名真的是滿混亂的. 不過,感覺同事都很好相處. 可能也是因為年齡都很相近吧.
下午, 把一台PC先灌到堪用的狀態(查資料, 上上網之類的), 同時, 同事大概說明了一下開發時所用的軟硬體, 過了一段時間後, 然後主管就丟了一本spec給我也幫我安排了未來四週進度. 接下來一直到下班前, 我都在看哪本spec.
因為對硬體不熟, 所以spec提到和硬體有關的名詞都得搞清楚才行, 使得進度有點慢. 總之, 今天就先搞清楚I2C和SMBus吧!!!