星期一, 9月 29, 2008

奇怪的課程

最近公司安排了一個奇怪的課程.

上完了以後覺得根本就像是直銷大會一樣...一直洗腦.

姑且不論是不是一門洗腦課, 如果真的能實踐課程教其實也是一門好事.

就以哪門課所教的為目標努力實行吧!!!

星期一, 8月 25, 2008

很奇怪的一個禮拜

這禮拜的實在很~!@#$%^&*()_+

莫名奇妙的就在公司渡過兩個夜晚.

假日也莫名奇妙的出現在公司.

還被嫌做不好...真無言.

雖然也和上級反應過, 但, 為了種種的理由...我想我也只能對主管發發牢騷...然後還是承受下來吧.

但, 在開會的過程中, 情緒和情緒化的字眼發洩過後, 自己坐下冷靜反省, 自己也確實有做錯的地方.

可是, 最近的工作模式好像在幾個月前也曾出現過, 當時的狀況實在很糟糕. 現在又有同樣的感覺.

不過, 還是把自己的心情收拾整理一下, 把自己的事做好.

其他的事就交給該負起責任的人吧.

星期二, 8月 19, 2008

最近在工作上遇到了...

最近在工作上接觸到了許多新東西,像是MAC controller & PHY chip, NC-SI, SPI Flash.

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的認識也僅止於此.

GnuCash, http://www.gnucash.org/

星期五, 8月 01, 2008

java.awt.Toolkit.getLockingKeyState on Linux

最近終於突破一個SUN JVM在Linux下的限制. 雖然只是一件小事. 就是在Linux X Window的環境下取得鍵盤Caps Lock, Num Lock, Scroll Lock目前的狀態. 看起來很簡單的小事, 可是卻花了我很久的時間才知道要怎麼做.

首先講在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 Device Driver, 主要都是寫Character 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

問: 怎麼讓一個java.awt.Component的子類別(e.g., javax.swing.JPanel)能抓到KeyEvent.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

Java2D真是奇怪的東西...沒想到RGB mask居然對效能影響這麼大.
原本, A這組mask需要200ms才能完成redraw...沒想到換成B mask只需要30ms...這實在太奇妙了.
也許有時間再來post一篇研究一下為什麼差這麼多.

星期日, 4月 13, 2008

最近在空閒的時候...

買雷斯林傳奇1也一段時間了, 一直到最近才有時間看, 雖然每次時間都很短. 先來抱怨一下...幾乎每一章都有錯別字...多 到 離 譜! ! ! 但是, 的確很好看, 每一章的開頭都有書中一名角色的一句話...印象最深刻的是:

我一定要做到。
這是我生命中唯一有意義的事情,唯一有意義的一刻。
我是為此而生,如果失敗,
那我就會在這一刻死亡。

雷斯林‧馬哲理

這段話看起來就像是電影、戲劇、漫畫、動畫中才會出現的對白,我想現實生活中是不會有人這樣講話的吧!?有人跟我說,龍槍系列中最好看的就是龍槍傳奇2。看完,龍槍編年史3,龍槍傳奇2,靈魂之戰4之後,我深有同感,但我說不出原因。但在看了雷斯林傳奇以後(儘管我現在還沒看完)我知道為什麼了。因為,雷斯林這令人茅盾的角色。雖然我看的書不多,但,最近也感覺出東/西方文學的差距了。不成材的我都是看小說,最近也在想是不是應該看些不一樣的書,例如,勵志之類的書。

從某些角度來看,我們是不是能【借鏡】,用雷斯林哪樣的態度看待人生,找到自己生命中有意義的一刻,我很敢說我現在沒有找到。以前看書/電影從來沒有想到這些,就只是單純的在看書/電影而已。但,有危機意識是好的,現在開始找也不嫌晚。

工作也一段時間了,雖然能從工作中得到樂趣,但,工作中也有我【十分】不喜歡的事情,又要小抱怨一下了,接下來這件事目前並沒有發生在我身上但,我在旁邊看著這件事發事,讓我想到這件事有一天也會發生在我身上,Project天經地義就是要meet schedule,沒錯。但,當schedule排得很不合理時,是不是還要強迫自己去meet schedule?我想,現在我會儘力,但以後難講。工作在過去不是我的全部,現在不是,未來也不會是。

還有人與人之間的關係太複雜,我努力試著將他簡單化,即使有人在我面前【睜著眼睛說瞎話,說著自以為高超的謊話】。有五感和腦袋的人,睜開眼睛仔細看,動動腦袋仔細想,誰在說謊是很明顯的。

最近也對自己多了一點認識,我真的是處女座,就像有人曾經這樣說過我一樣。我有潔僻,精神上的潔僻,有些事極難忍受。同時,我也很討厭【等】,例如:有著長長的人龍隊伍在等著吃某家店的東西,我打死不去,除非,不用排隊。我的朋友們,這兩個地雷不要來踩,除非,有把握踩下去以後炸不死(這時候我就會喪失冷靜的想,炸不死再補一顆),不然,千萬不要踩。哈。

1. 雷斯林傳奇(上 )靈魂熔爐雷斯林傳奇(下) 烽火試煉

2. 龍槍傳奇(時空之卷+烽火之卷+試煉之卷)

3. 龍槍編年史(秋暮之巨龍+春曉之巨龍+冬夜之巨龍)

4. 靈魂之戰(落日之巨龍+隕星之巨龍+逝月之巨龍)

星期六, 3月 29, 2008

Java Native Interface - Accessing Array

之前提到JNI在存取陣列時很跛腳, 所以, 這篇就是要記錄JNI怎麼存取陣列. 這邊所指的JNI是指C/C++所寫的source code.

直接切入正題, 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)

附檔: JNIDemo.zip

星期日, 3月 16, 2008

最近在?

最近好像也沒做什麼...就是看一看USB 2.0 spec.然後寫了簡單的USB Keyboard/Mouse的程式. 然後稍微看了Java Native Interface (JNI)的做法, 覺得JNI還滿坡腳的. 能不用還是不要用的好. 當然還有一些是不知道能不能公開的寫在blog上, 所以也就不寫了.

為什麼說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

基本上是想要在User-Mode下實作出Bottom-Halve1的機制. 接下來的描述是想要實作出的機制. 首先產生一個process S (接下來簡稱為S), S提供數個APIs供其它processes透過任一種IPC的機制呼叫. 利用這些APIs, 其它processes可以動態的讓S去執行某些functions, 而這些functions都在於別的processes的space.

例如, 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

北上? 南下? 到底要去哪?

今天開著車在台北有目的地的亂晃, 剛開始開都滿順利的, 都可以走到想走的路, 後來真的是很【亂晃】, 原本要【北上】沒想到, 一時不察, 居然走到【南下】. 還過了一段時間才發現, 就隨便走一個交流道再換走平面道路回家. 虧車上還有GPS...有裝沒有用, 因為我沒在看嘛~~~XD

星期日, 2月 03, 2008

又要過年了!!!

再兩天就要放年假了, 但, 我也相信很多人已經開始放年假了(至少我家樓下的早餐店是如此1). 最近幾天台北開始變冷和下雨, 氣象報告說會持續到除夕. 看來這個年要在溼冷中度過了!!! 過年時, 絕大部份的人都會回所謂的【老家】. 因此, 台北的人就瞬間少了很多. 但, 我則是一貫都留在台北, 也因為這樣過年的時候都很無聊. 所謂的無聊是指排除掉正經事之後就沒事做了. 說到正經事才是頭大, 其中一項工作的due day就是2月23日了, 過年期間不做, 之後大概也做不了吧!!! 而另一項則是屬於long term的工作, 雖說是long term, 但也沒辦法趕上短期的schedule. 換言之, 不好好利用這個年假做些事, 過完年, 我即將身陷地獄.

最近想了很多事, 但絕大部份的事情之間是存在一些依存性的, 比如: 要完成O2前必需先達成O1. 但在做O1之前則又考慮到(甚至比O2)後面的事項O3. 但想到最後則發覺連O1都還沒做, 去想O2和O3做什麼. 真的是想太多了!!! 典型的【不做怎麼知道】和【做事不考慮後果】之間的茅盾. 可是, 我想有些事真的是【不做怎麼知道】(也許不用考慮後果), 有些事做前則是要先考慮到後果. 寫著想著, 自己又在茅盾了, 可惡啊!!!

1. 就在今天早上下樓買早餐時, 鐵門打開後, 在驚赫中發現這事實.

星期四, 1月 31, 2008

坐車坐過頭! 是不想走了嗎?

今天在搭火車往台北火車站的路上, 居然坐過頭, 平常都不注意當下停靠的是哪一站, 都是聽語音. 沒想到! 今天坐的火車居然沒有語音, 才心想奇怪怎麼這麼久還沒有到? 一靠站猛然發覺"萬華"兩個字, 傻眼!!! 馬上下車搭下一班往台北的火車!

上一次這樣坐過頭是五年前的事了吧, 沒想到還會發生一次!!!! 害我多花了30分鐘才到家!!!

星期二, 1月 29, 2008

讀後感: 我是傳奇(小說版)

小說和電影差真多啊!!! 天差地遠!!! 但, 個人覺得還OK啦, 可以把小說和電影視為不同的東西. 最近利用在火車上的時間, 把家裡的書一本接著一本解決掉了.

以下列出相異之處:
  • 疆屍是由細菌造成的, 電影中是治療癌症所造成的副作用.
  • 主角只是一般人, 電影中是一名軍醫.
  • 狗是中期才出現在故事中且過沒多久就死了, 電影中是主角女兒的寵物一開始就出現.
  • 倖存者在小說並不存在, 但感染細菌而沒死的人發現抑制(並不是根治)的方法且開始反擊疆屍和派出間諜試圖要抓住並處死主角, 最後也成功了. 電影中則是找出治療方法但被疆屍圍住最後自爆而死, 而治療方法還是送到了倖存者的手上.
這些相異處其實就讓小說和電影差非常多. 但結尾則是一樣, 主角成為了傳奇. 在小說中疆屍和感染細菌但還沒死的人是不一樣的, 疆屍是指感染細菌並死而復生的人. 兩者不同之處在於思考能力的不同, 相同在於都怕太陽. 小說中對疆屍的細菌有較為深入的交待, 有興趣的人可以看看.

星期一, 1月 28, 2008

老闆娘的一番話與我不算想法的想法

今天絕大多的時間都在training可以說是收獲(穫?)1豐富. 對自己的公司和team也多了一分認識. 但, 也相對的比較累. 可是這都不是重點. 重點是早上和家裡樓下早餐店的老闆娘聊了一下 (因為今天比較早下去買早餐的關係吧), 她說"你還滿幸運的, 一下就找到工作了. 我知道有一個和你差不多時間退伍的, 到現在還沒找到工作, 連找他面試的都沒有". 當下抱著打屁的心態, 所以沒有多想.

在往公司的途中, 不知怎麼想起來這件事, 想一想, 現在有些人是真失業, 有些人是假失業. 其實工作也不是沒有, 就看你想不想做而已. 但, 我相信也是有人很努力的找, 但還是找不到工作. 其實想講的也沒有什麼, 只是希望有些人不要好高騖遠, 也希望身邊的朋友能繼續為了找到工作而努力下去.

1. 我想這種情況用獲或穫都滿適合的, 所以不需要太過於苛求用哪一個字才對.

星期五, 1月 25, 2008

初體驗: 尾牙

今天是公司的尾牙, 因為我是新人所以不能參加抽獎, 這很合理! 但!!! 我可以參加賓果遊戲.

在一個五乘五的矩陣中填入0(或1, 不是很確定)~99之間的值, 然後台上的主持人會抽出號碼, 接下來就和我們一般玩賓果遊戲一樣, 只差在抽出來的號碼, 你所拿到的矩陣裡未必有. 在這樣的情況下, 我滿懷期待的等待賓果時間的到來, 隨著數字一個一個被抽出來, 心情也跟著D O W N下來了(原本還滿H I G H)的, 最後走出餐廳時配著綿綿細雨, 只有兩個字, 淒涼Orz, 不過, 整個過程因為身旁的同事很搞笑, 所以, 雖然賓果沒中, 但, 還是很不錯玩.

星期三, 1月 23, 2008

心情: 笑

話說今天在家吃早餐時, HBO剛好開始播放鍋蓋頭(Jarhead), 大概看了半小時, 不知怎麼的, 這樣邊看邊笑了大概20分鐘. 我記得第一次看時沒有這麼好笑啊, 為什麼這次看會這麼好笑~XD

也許是早上笑的太開心了, 今天一整天心情都不錯. 嗯, 如果真的是這樣的話, 也許可以考慮每天早上看一下周星馳電影的經典片段, 這樣每天心情都會很好.

進公司以來第一次寫程式

昨天(2008/01/22)是進公司以來第一次寫程式(一個lookup function), 在慌張下寫了一個O(N)且不scalable又需要測試function的正確性, 總結一個字, .
因此, 回家以後用C內建的bsearch function重新寫了一個O(LogN)且scalable的look up function, 等回到公司以後再把這個function更新一次.

星期六, 1月 19, 2008

第一個禮拜結束了

這禮拜都在看Intelligent Platform Management Interface (IPMI)的Specification. Intel是參與制定規格的其中一員, 在他的網站上也有IPMI的相關訊息和下載. 哪...什麼是IPMI呢?

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吧!!!

星期三, 1月 09, 2008

關於這個Blog

這個Blog主要是記錄在某間公司工作時所遇到的事情都會記錄在這裡.