2011/05/08

"爆醬"花

From Evernote:

"爆醬"花

滿出來了。
2011-04-20+13.17.46

全Linux生活:第7天(2) - EUDC.TTE

From Evernote:

全Linux生活:第7天(2) - EUDC.TTE

這其實不是我日常生活會遇到的問題,而是工作上的需要,只是剛好也是跟非Windows環境(AIX&Linux)有關的議題。最近我們正在進行的一個提案,需要在AIX與Linux環境下進行"難字"列印,其實說穿了就是所謂的"使用者造字"。目前常見的是使用滿天星公司的字霸系統,我沒去研究字霸有沒有AIX或Linux版,可是這個客戶的字霸是Windows版,我們以前的系統雖然Server端是AIX系統,但至少客戶端都還是Windows,因此難字的顯示與列印全交給Windows與字霸就好了。但這次這個提案的作法從頭到尾都沒有Windows,這時候如果列印資料中有難字該如何列印呢?

我們稍微研究了一下字霸的作法發現一件事,那就是其實字霸採用的是標準Windows使用者造字的模式,也就是它會在Windows掛一個EUDC.TTE的字型檔在系統中:

     [HKEY_CURRENT_USER\EUDC\950]
     "SystemDefaultEUDCFont"="C:\\WINDOWS\\EUDC.tte"

只是這副檔名有點怪,*.TTE是什麼鬼?這個檔其實是個標準的truetype字型檔,如果把副檔名TTE改成TTF,可以發現Windows是認得這個檔的,檔案點兩下甚至可以開得起來。

所以接下來要做的事就比較簡單了。我們只要把這個檔讀出來,把我們要的字畫出來問題就解決了。講到這裡,我只能說Java真是佛心來的!針對Truetype的處理Java早就內建了,我們只要用就好了,以下是大致的用法:

    private Font eudc;
    private Font eudc24;
    public boolean reloadEudcFont() {
      try {
        File eudcFile = new File(eudcFontPath);
          if (eudcFile.exists()) {
            eudc = Font.createFont(Font.TRUETYPE_FONT, eudcFile);
            eudc24 = eudc.deriveFont(Font.PLAIN, 24);
            return true;
        }
        eudc = null;
        eudc24 = null;
      } catch (Throwable t) {
        t.printStackTrace();
      }
      return false;
    }

接下來,要抓某個難字的bitmap大致可以這樣做:

    public int[] grepUdcImage(int width, int height, char c) {
      try {
        int w = width;
        int h = height;
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics g = image.getGraphics();
        if (regularFont.canDisplay(c))
          g.setFont(regularFont);
        else
          g.setFont(eudc24);
        g.setColor(Color.WHITE);
        g.drawString("" + c, 0, h - 5);
        int[] pixels = new int[w * h];
        PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, pixels, 0, w);
        try {
          pg.grabPixels();
        } catch (InterruptedException e) {
          logger.error("Interrupted waiting for pixels!");
        }
        if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
          logger.error("Image fetch aborted or errored!");
        }
        return pixels;
      } catch (Throwable t) {
        t.printStackTrace();
      }
      return null;
    }

要注意一點,這個TTE檔內部的編碼是Unicode,所以要找出我們要的難字,你必須知道那個字的Unicode。因為我們沒有MS950(BIG5)跟Unicode的對照表(這部份其實是字霸另一個主要功能),所以只要先有人幫我們把該轉的碼先轉好,到我們這邊的處理就沒有問題了,關於這點,倒是不用擔心,因為我們要列印的字,在使用者鍵入難字的時候早就把難字轉成Unicode了,畢竟目前使用者日常操作的電腦百分之兩百一定是Windows,如果萬一真的不是Windows,比方說是手機或iPad(或Android),反正它也打不出難字,所以也不用擔心。

全Linux生活:第7天 - Bluetooth & bluez

From Evernote:

全Linux生活:第7天 - Bluetooth & bluez

藍牙滑鼠終於可以用了!其實第2天的時候就已經把藍牙滑鼠與電腦配對,只是當時配對時沒有弄好,導致清單雖然可以看到滑鼠,但是不能使用,最慘的是想移除也移除不了,不知哪裡出了錯?後來因為太忙就先放著不管了。今天想說應該要來處理一下這個問題了。於是用dpkg看了一下ubuntu的到底是使用什麼藍牙套件:
     $ dpkg --get-selections|grep blue
     bluez                        install
     bluez-alsa                   install
     bluez-cups                   install
     bluez-gstreamer              install
     gnome-bluetooth              install
     libbluetooth3                install
     libgnome-bluetooth8          install
     pulseaudio-module-bluetooth  install
看起來應該是bluez,接下來看看有什麼線索可以下手:
     $ dpkg -L bluez|grep /bin/
     /usr/bin/bluetooth-agent
     /usr/bin/bluez-simple-agent
     /usr/bin/bluez-simple-service
     /usr/bin/bluez-test-adapter
     /usr/bin/bluez-test-audio
     /usr/bin/bluez-test-device
     /usr/bin/bluez-test-discovery
     /usr/bin/bluez-test-input
     /usr/bin/bluez-test-manager
     /usr/bin/bluez-test-network
     /usr/bin/bluez-test-serial
     /usr/bin/bluez-test-service
     /usr/bin/bluez-test-telephony
     /usr/bin/ciptool
     /usr/bin/dfutool
     /usr/bin/hcitool
     /usr/bin/l2ping
     /usr/bin/l2test
     /usr/bin/rctest
     /usr/bin/rfcomm
     /usr/bin/sdptool
在經過一陣亂猜跟亂試的過程後,發現hcitool這個東西比較有搞頭,看一下它有哪些參數可以用:
     $ hcitool --help
     hcitool - HCI Tool ver 4.91
     Usage:
         hcitool [options] <command> [command parameters]
     Options:
         --help    Display help
         -i dev    HCI device
     Commands:
         dev     Display local devices
         inq     Inquire remote devices
         scan    Scan for remote devices
         name    Get name from remote device
         info    Get information from remote device
         spinq    Start periodic inquiry
         epinq    Exit periodic inquiry
         cmd     Submit arbitrary HCI commands
         con     Display active connections
         cc      Create connection to remote device
         dc      Disconnect from remote device
         sr      Switch master/slave role
         cpt     Change connection packet type
         rssi    Display connection RSSI
         lq      Display link quality
         tpl     Display transmit power level
         afh     Display AFH channel map
         lp      Set/display link policy settings
         lst     Set/display link supervision timeout
         auth    Request authentication
         enc     Set connection encryption
         key     Change connection link key
         clkoff    Read clock offset
         clock    Read local or remote clock
         lescan    Start LE scan
         lewladd    Add device to LE White List
         lewlrm    Remove device from LE White List
         lewlsz    Read size of LE White List
         lewlclr    Clear LE White list
         lecc    Create a LE Connection
         ledc    Disconnect a LE Connection
         lecup    LE Connection Update
    
     For more information on the usage of each command use:
         hcitool <command> --help
又經過一陣亂試之後,發現以下結論:
     掃描藍牙裝置可以用:
     $ hcitool scan
     Scanning ...
         00:07:61:FC:C2:B9    Logitech Bluetooth Mouse M555b
     取得藍牙裝置名稱:
     $ hcitool name 00:07:61:FC:C2:B9
     Logitech Bluetooth Mouse M555b
     取得藍牙裝置資訊:
     $ sudo hcitool info 00:07:61:FC:C2:B9
     [sudo] password for rudy:
     Requesting information ...
         BD Address:  00:07:61:FC:C2:B9
         Device Name: Logitech Bluetooth Mouse M555b
         LMP Version: 2.0 (0x3) LMP Subversion: 0x229
         Manufacturer: Broadcom Corporation (15)
         Features: 0xbc 0x02 0x04 0x38 0x08 0x00 0x00 0x00
             <encryption> <slot offset> <timing accuracy> <role switch>
             <sniff mode> <RSSI> <power control> <enhanced iscan>
             <interlaced iscan> <interlaced pscan> <AFH cap. slave>

     裝置配對:
     $ bluez-simple-agent hci0 00:07:61:FC:C2:B9
     設定信任關係:
     $ bluez-test-device trusted 00:07:61:FC:C2:B9 yes
     連線藍牙滑鼠:
     $ bluez-test-input connect 00:07:61:FC:C2:B9

這樣就ok了!以上步驟跟直接使用gnome-bluetooth的GUI介面設定結果相同,且設定結果也會反應在GUI介面上,看起來gnome-bluetooth內部也是使用bluez套件作為底層的指令。



2011/05/03

小確幸

原來這就是"小確幸"!


Roof

我們都太忙了,忙到忘了到屋頂看風景。


全Linux生活: 第3天 - Alt+PrintScreen

From Evernote:

全Linux生活: 第3天

第3天,好啦其實是第2天拖過12點了。補充一點,免得以後忘了,因為剛剛要抓執行畫面的圖,遇到了一個小問題,Windows下的Alt+PrintScreen可以用嗎?答案是......當然不行囉,又不是第一天用Linux,頭殼壞掉才會覺得Alt+PrintScreen會很順利的可以用。

後來發現,其實也不是不能用啦,只是要調整一下就好,再說單按PrintScreen是可以用的。Linux其實有支援PrintScreen與Alt+PrintScreen,只是Alt+PrintScreen跟另一個Linux Kernel的Magic SysReq Key衝突,請看 Wikipedia: Magic SysReq Key。只要將Kernel參數:kernel.sysreq設為0就ok了:

     $ sudo sysctl -w kernel.sysreq=0

不過這樣下次開機後又回恢復成1,所以想永久改變可以加一行到/etc/sysctl.conf裡面:

     kernel.sysreq=0

所以以後按了Alt-PrintScreen之後就會出現:

Alt+PrintScreen畫面

PS:後來發現好像是只有Ubuntu 10.10以後才有這問題,請看: ALT+PrtSc not recognised: breaks built-in screenshot function

全Linux生活: 第2天 - Evernote & nevernote

From Evernote:

全Linux生活: 第2天 - Evernote & nevernote

Evernote是我常用的記事軟體, 會用它其實沒什麼原因, 因為它有Android版, 雖然不是什麽殺手級的軟體, 手機跟電腦隨時都可以看到相同的東西, 對我來說還蠻方便的。

進入第二天想說來看一下Linux下是否可使用. 果然, 毫無意外的, 它真的沒有Linux版!真搞不懂, 它用了一堆Linux下常見的Libraries, 不過都是Windows版, 結果自己卻沒有Linux原生的版本。

Evernote Web版, 其實做得還不錯, 跟Windows版"幾乎"相同, 甚至有點更好的感覺. 不過Web版有一個所有Web版的軟體共通的缺點:沒網路就變成廢物了。像我常去的客戶那兒, 是在地下室, 收訊經常差到一個不行, 這時候Web版就沒鳥用了。

於是開始動Evernote+WINE的腦筋。剛開始以為很順利,結果程式跑起來說少了riched20.dbg,應該是我的riched20安裝時沒有包含除錯資訊的riched20.dbg檔. 唉,年紀大了,有點懶得在解下去,改天有力氣再說吧。但在找解法的同時,(這軟體的名字實在夠GY)有看到另一個比較簡單的解法,抓nevernote來用(os: 這軟體的名字實在夠GY)!

Nevernote是Java寫的,這也害我在裝得過程小卡了一下,因為之前很少用Debian系列的Linux,Ubuntu的apt-get還不錯,但nevernote只有獨立的deb package,apt repository裡找不到,只好撩下去看了一下dpkg怎麽用,還好跟rpm差不多,所以就很爽快地給它dpkg -i nevernote-xxxxxx.deb下去......沒錯,如果這樣就成功就真見鬼了。羚羊咧,又是相依性問題,這問題跟rpm -ivh一樣,果然兄弟兩都是同一個爸媽生的。其實我是可直接用--ignore-depends或--force-xxx硬幹下去,因為它只是需要有JRE環境,我也裝了最新的Orcale JDK,path跟JAVA_HOME也都ok,可是良心告訴我不能在第二天就幹種事,所以我執行apt-get -f install來修復相依性問題並安裝了default-jre與openjdk-6,最後再dpkg -i nevernote-xxx.deb下去就ok了。

看圖:
執行畫面:nevernote

雖然畫面沒有Windows版或Web版漂亮,但用起來還算ok,至於WINE+Evernote就有時間再說了,nevernote真是佛心來的(忍不住還是os: 這名字真是夠GY的)!

2010/11/05

王家驥校長的六十六場演講|華府現場|編輯部落格|中時部落格|中時電子報

From Evernote:

王家驥校長的六十六場演講|華府現場|編輯部落格|中時部落格|中時電子報

Clipped from: http://blog.chinatimes.com/liu99/archive/2010/11/05/558018.html

王家驥校長的六十六場演講 (前高雄中學校長王家驥在二零一零年十一月一日過世。他生於一九零六年,享壽一百零四歲。這篇文章是紀念這位出色的教育家)

民國六十一年六月底左右,高雄中學考完期末考,開始放暑假。忽然學校通知,某日某時,全班在校長室旁的會議室集合,聽退休在即的王家驥校長講話。

 學生對於校長講話,興趣不大。尤其是雄中的校風,學生愛來不來,不當回事。那天剛巧碰到大雷雨,不過依然有人坐了四十分鐘火車,有人轉搭兩趟公車,專程到學校聽「最後一課」。近四十年後,有人說,那是一生印象最深刻的「聽訓」之一。

 幾乎每位同學都是第一次踏進這間會議室。坐定後,校長進來,班長正要喊口令,校長客氣的說,不必不必,大家請坐,今天是請大家來聊聊,不必拘泥。

 他一開口就說,他一口「台灣國語」(按,他是福建仙遊人),大家聽著可能費力,他有點不好意思,不過考慮再三,以後機會不多,所以還是請同學勉為其難。

 那天他講話時間不長,有幾件事令當天在場者至令記憶猶新。他說,他擔任校長廿四年,很多建築都在他任內完成。可是同學盡管看,沒有一棟建築題有他的名字,「一棟都沒有」。

 這是事實。雄中有很多在當時尚屬先進的設施,例如工藝教室、實驗大樓、健身房、游泳池、植物園、活動中心等,可是沒有一處看得到「某年某月,某某人題」之類的銘誌。

 王校長又說,他「從來沒有巡堂」,以示尊重老師。聽到這兒,很多同學想起,的確,幾年下來,好像只有一次看到校長到出現在教室附近,是因為某老師家中有急事,電話打到校長室,所以校長特來轉告。

 他還說到一件事。他知道有的同學為美術、音樂課所苦,但是他認為不能只重升學,所以各種課程都不能偏廢,所以雄中專門蓋了美術教室、音樂教室,還修建了籃、排、足、田徑場,在當時是少有的教學正常化。

 他又說道,「為什麼不把大家集合起來,一次訓話,省時省力?」原來是要讓大家了解這不是訓話,而是和同學談談自己的一些原則,同時也「盡量讓大家都有講話的機會」。當時全校一共六十六班,也就是說,這番話,他要講六十六遍。

 他愈說,同學愈想起他的特點。記得有一天,升旗典禮上,校長講話,可能多講了幾分鐘。講畢,高三同學帶頭鼓掌,高二、高一跟進。主任教官立刻上台,很不高興的訓斥道:「校長訓話,不是專題演講,鼓什麼掌?以後這種訓話,不准鼓掌!」立刻聽到台下一陣更熱烈的掌聲。而且不待高三帶頭,全場一致。只見老師個個笑彎了腰。

 那時每逢蔣公誕辰,和所有機關一樣,雄中也布置壽堂。不過是否前去行禮,從無強制規定。有一回,簽名簿上竟然出現「蔣經國」、「王昇」、「陳大慶」(時任台灣省主席,當時雄中是省立)等名字,當然出自調皮的學生之手,王校長也不以為忤。

 雄中學生後來逐漸了解,這就是自由的學風,是雄中學生最引為自豪的精神。所以在雄中,有人因為作弊受處分,卻未聞有人頂撞師長、或與教官公然互摃而受處分。有人經常不參加升降旗典禮,在別處是個大罪狀,在雄中卻從輕發落。難怪當時在校園很流行的「吸收入黨」,在雄中從未形成風氣。

 有一天,校園出現流浪狗,同學動了慈心,就在樓梯間養了下來。有一年四月卅日,幾個同學拿了幾串鞭炮,在校園裡四處燃放,因為這天是希特勒殞命紀念日。當然,免不了被校工追著罵。多年後回想,這是王校長建立的校風。

 王校長退休後,立即搬出校長宿舍,當時還上了媒體,受到極大的讚揚。他退休隔年,大學聯考的國文作文題目是曾國藩的名句:「風俗之厚薄,繫乎一二人心之所向」。有人開玩笑的說,命題教授會不會是王校長的學生?

 在雄中,很多人聽過有關王校長的諸多故事,例如他親手把自己的孩子開除,例如他是白色恐怖的受害人,例如妻子未能來台,他終身未再娶等等。這裡所寫的,是我親耳聽他說的,是我親眼見他做的,證明這位基督徒是言行合一的表率,也就是英文中的「I say what I mean, and I mean what I say」。聖經《提摩太後書》第四章,使徒保羅離世前寫道,「那美好的仗我已經打過了,當跑的路我已經跑盡了,所信的道我已經守住了」,正是王家驥校長的寫照。保羅深信「有公義的冠冕為我存留」,我相信也有一頂為王校長存留。 ##2010,1103

2010/11/02

甲骨文:Google直接複製我們的Java程式碼 | 即時新聞 | iThome online

From Evernote:

甲骨文:Google直接複製我們的Java程式碼 | 即時新聞 | iThome online

Clipped from: http://www.ithome.com.tw/itadm/article.php?c=64211
甲骨文:Google直接複製我們的Java程式碼
文/范眠 2010-10-29

在甲骨文週三所公佈的補充文件中,提供了更詳細的程式碼比對與範例,指出約有三分之一的Android應用程式介面(API)套件是直接取自甲骨文的Java API。

甲骨文(Oracle)週三(10/27)針對控告Google Android侵權一案,提出更詳細的證明文件,指控Google是「直接複製」其Java程式碼。

甲骨文是於今年八月控告Google,指控其Android平台侵犯甲骨文併購昇陽(Sun Microsystems)後所得到的Java相關智慧財產權。

在甲骨文週三所公佈的補充文件中,提供了更詳細的程式碼比對與範例,指出約有三分之一的Android應用程式介面(API)套件是直接取自甲骨文的Java API。

之前,Google曾對甲骨文的控告表示,這是毫無根據的指控,並將捍衛開放原始碼社群的權益。對於此最新進展,Google尚未發表評論。

甲骨文正尋求禁止Google繼續使用侵犯其專利的Android程式碼,並要求損失賠償。(編譯/范眠)