星期四, 11月 26, 2009

rtc-davinci-evm for dm6446 on linux-davinci.git

中文版

從 2.6.27-davinci1 開始,由於引進了新的 i2c framework,導致 dm6446evm 上許多走 msp430 的週邊都不能用了,例如 rtc-davinci-evm 與 IR receiver 等等。到今天 2.6.32 都快 release 了,還是沒有人把 driver port 過去...

沒辦法,公司產品需要,所以咧... 只好自己動手啦!(這也是 Open Source 社群最有趣的地方!)

悲慘的是,寫好 driver、測試成功以後,居然 linux-davinci 的 mailing-list 不給我寄 @@ 所以只好先放在公司的 git repository 上啦。不過這個網址只是暫時的,也許過一陣子會改...

English Version

Start from 2.6.27-davinci1, linux introduced the new i2c framework, which causes many peripherals of the msp430 chip on dm6446evm stop working, such as rtc-davinci-evm and the IR receiver. As for today, although the 2.6.32 is about to get released, but the driver is still stays unusable...

Too bad, my company just uses dm6446 in our product, which I just have to port them by my own! (Which is the major fun for an Open Source community!)

But what bothers me is that, after I successfully wrote the driver, and verified it's working great, I cannot submit it on the linux-davinci mailing-list due to some unknown error (used to be able to send a mail there...) @@ so i just have to put the files on my company's local git server. However this is a temporary domain name, it may or may not be changed later, anyway.

星期三, 9月 16, 2009

Calm down, please. My heart!

If sorry is all you gonna say, I've heard enough.

Yes, like you can never do nothing for me.
Damn me.
Yes, like you just never willing to do nothing for me.
Damn me, once again.

You'll never have no idea how much you ruined my life.
You'll never have no idea how much you messed up my mind.

How can you be so mean?
How can you be so selfish?
How can you be so fucked up?
Why are you bothering my heart whenever I finally got some calm and peace?
Why can't you just tell me that you don't even wanna give a shit about me at all?

Why do I still love you so damn much?

星期一, 8月 31, 2009

救災順利!成功救活四名專題做不出來的學弟!

我大學時代的專題老師,今年叫學弟們做 ARM Linux + RFID 相關的專題,主要是用來管理冰箱裡面的東西的保存期限的。

可是呢,這群學弟...

「ARM 是什麼?可以吃嗎?」
「Linux 我們不太會耶!」
「RFID Reader 只有 Windows driver (還是 VB.Net 寫的) 耶,可以拿去 Linux 上編嗎?」

所以,不知道他們從哪裡找到我,突然來問我要怎麼辦。

我想說,既然是以前的專題老師,要是這組學弟做不出來或做的不好,他也很丟臉... 而且順便也想看看 RFID 在 Linux 上到底會不會動,所以就決定下去台中一趟幫他們看看。

不看還好,一看之下才發現,他們使用的 ARM 是 s3c2410 配上一套有夠舊的 Linux(kernel 是 2.4.x......),可是使用的 SUMMIT U-Reader 在我的機器上倒是抓的到也有 driver,只是沒有 user-space tool 去 access 它而已。所以我乾脆就叫他們說,先在 PC Linux 上做,然後把移植到 arm 上當成一個「願景」。盡量使用嵌入式系統上容易找到的軟體(如 boa),如果真的要移植的話也比較方便。

SUMMIT U-Reader 其實是一個 pc210x 的 USB-to-RS232 晶片,加上他們自己家的 HF 讀卡模組(使用 RS232 介面,Windows 的 VB.Net 程式也是使用 Serial subsystem 去 access)。既然如此,事情就簡單啦!我只要弄個 serial 程式去操作它就可以了!

我目前幫他們寫到可以抓到卡號,讀取以及寫入 RFID Block 就要靠他們自己了。以下是 example code(BSD License!):

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

#include <iostream>

#define TTYDEVICE "/dev/ttyUSB0"
#define BAUD  B19200

int open_port(void)
{
 int fd = open(TTYDEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
 if (fd == -1)
 {
  perror("open_port: Unable to open " TTYDEVICE);
  return fd;
 }
 fcntl(fd, F_SETFL, 0);

 // port settings
 struct termios options;
 tcgetattr(fd, &options);
 cfsetispeed(&options, BAUD);
 cfsetospeed(&options, BAUD);
 options.c_cflag  |= (CLOCAL | CREAD);
 options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);
 options.c_oflag  &= ~OPOST;
 options.c_iflag  |= (INPCK | ISTRIP) & ~(IXON | IXOFF | IXANY);
 options.c_cc[VMIN] = 0;
 options.c_cc[VTIME] = 10;
 tcsetattr(fd, TCSANOW, &options);

 // clear I/O buffer
 tcflush(fd, TCIOFLUSH);

 return fd;
}

int main()
{
 // get the file descriptor from open_port()
 int fd = open_port();

 // I/O buffer, let it be the 'I' command initially
 char buf[256] = { 0x1b, 'I', '\r', 0 };

 int n;

 // write() the 'I' command
 if ((n = write(fd, buf, 3)) < 3)
  std::cerr << "write() of 3 bytes failed!\n";
 else
 {
  std::cout << "write() " << n << " bytes: ";
  for (int i = 0;i < n;++i)
  {
   std::cout << "0x";
   std::cout.width(2);
   std::cout.fill('0');
   std::cout << std::hex << static_cast<int>(buf[i]) << ' ';
  }
  std::cout << std::endl;
 }

 // read the result  n = read(fd, buf, 255);
 if (n < 0)
  fputs("read() failed!\n", stderr);
 else
 {
  std::cout << "read() " << n << " bytes: ";
  for (int i = 0;i < n;++i)
  {
   std::cout << "0x";
   std::cout.width(2);
   std::cout.fill('0');
   std::cout << std::hex << static_cast<int>(buf[i]) << ' ';
  }
  std::cout << std::endl;
 }

 close(fd);

 return 0;
}

星期一, 3月 30, 2009

Bug wranglers know this bug by heart now

之前更新 gcc-4.3.3-r1 之後,編 mplayer 會吐 ICE 出來。今天 emerge world -ua 的時候看到 gcc-4.3.3-r2,在裝之前想說看一下 ChangeLog 有沒有修好這個 bug:

27 Mar 2009; Peter Alfredsen -gcc-4.3.3-r1.ebuild, +gcc-4.3.3-r2.ebuild: Revbump with broken patch disabled to stop duplicates of bug 262567 from flowing in. Bug wranglers know this bug by heart now.

這個 #262567 file 的就是這個 bug。點進去看一下... 挖咧!二十幾個 duplicates = = 難怪 Bug wranglers 會 know this bug by heart 了 XD~

底下是一段 Quote:

At last, rev-bumped.

Btw, maybe all those duplicates are not the user's inability to search, but their ability to tell you "please *always* rev-bump fixes that are not build-related to the package itself" :P

- Nikos Chantziaras

星期四, 3月 26, 2009

言論自由

阿克頓勳爵曾經說過:「我不喜歡你的言論,但我誓死保護你的言論自由。」

若查證「郭冠英」就是「范蘭欽」屬實,那麼他的確該下台,因為他違反公務人員應行政中立的基本規範。但是「范蘭欽」發表的文章倒是沒有任何問題,那是言論自由。雖然美國有針對種族歧視言論的法律,但是很抱歉中華民國剛好沒有... 所以他也沒犯法。

我不懂的是這些新聞媒體幹嘛拿「高級的外省人」做文章,這也沒什麼大不了。很多產品不是也會在包裝上寫「高級蜜餞」或「高級水果禮盒」嗎?那這些廠商是不是也通通要上新聞接受批判一下?況且他只有說「我是高級的外省人」而已,不知道這些媒體是從哪裡得來「台灣人是低級」的結論。你說「這是部好看的電影」或「這是本內容豐富的書」的時候,也不表示其他的電影不好看、其他的書沒內容啊...

另外,蔡英文同學,言論自由是憲法保障的,不是你說有就有,你說沒有就沒有的好嗎?

星期五, 2月 13, 2009

宅心禪機

台灣知名宗教團體法鼓山創辦人聖嚴法師,於台北時間中華民國 98 年(西元 2009 年)2 月 9 日因病圓寂。

雖然我本身並沒有宗教信仰,雖然我沒有參加過法鼓山辦的活動,雖然我也沒上過「你可以不必自殺網」(唔,偶爾想自殺的時候應該去逛逛...),不過衝著這幅字還是得悼念一下:

「面對宅、接受宅、處理宅、放下宅」- 法鼓山 聖嚴法師

誰能告訴我為什麼上聖下嚴大法師要把「」寫成「」呢?我搜遍 Google 也找不到一個地方寫兩個字形可以相通的...

星期三, 2月 04, 2009

New Weapon - HP Pavilion dv5-1003ax

最近,我終於受不了了那台四年前買的 NB。是的,我還是很喜歡它 - 它輕巧、方便攜帶、沒有惱人的鏡面螢幕、可以跑 Composite Desktop、效能也不差(至少是我可以接受的速度)。可是它的 512MB DDR-333 * 2 漸漸地不敷使用,開始吃起 swap;螢幕右下角有約 7 個 pixel 的亮塊;硬碟 SMART 也跟我說有一堆 bad block reallocated、電池的使用時間也只剩不到五分鐘...

所以,我很苦惱。這台機器我很願意多用兩年,但是 firefox 多開幾個分頁(嗯... 30~50 個 XD~)就一直 thrashing 是沒辦法接受的事,硬碟開始有壞軌也總是讓人心慌慌(雖然跑 dd if=/dev/zero of=/dev/sda 叫 SMART 修好了),電池只剩五分鐘根本帶不出門(走到門口就沒電了嘛 Orz...)。如果想繼續用下去,就非得換掉這幾個東西:

  • RAM 升級到 DDR-333 1GB * 2 ~= $2500
  • 2.5' PATA HDD or SSD ~= $2000 or $5000
  • 電池也得買新的 ~= $2500
可是這麼一來,價錢等於 1/3 ~ 1/2 台新筆電了,可是... 我還是繼續在用舊電腦,實際感覺得出來有差別的可能只有不會那麼 thrashing = = 所以我一直在這三個念頭上打轉:
  1. 不升級不夠用...
  2. 不想花錢升級統統都舊規格 (DDR-333、IDE PATA) 的東西...
  3. 買新的又有點浪費,畢竟舊的升級尚且堪用...

於是我就問我老爸,請他出個意見,看我應該怎麼辦才好。結果我親愛的老爸很豪邁的說:「哎唷,你那台機器也是三年多四年前買的,不要傷腦筋了。媽咪店裡也剛好需要一台機器,你就換台機器,這台給她吧!」

唔... 既然這麼說,那還是換一台好了,把舊電腦換個硬碟給我媽(我後來把 Windows Vista 的授權貼紙都撕起來貼過去了... 開門做生意別留下把柄才是。)。我比較了市面主流的 CPU 跟 GPU,最後決定挑 AMD PUMA 平台的機器,主要是這幾個原因:

  • 之前 nVidia GPU 有設計瑕疵,焊接的表面會因為鄰接材質膨脹係數不同,熱脹冷縮太多次有機會脫焊,造成硬體故障。雖然 nVidia 宣稱已經修改了設計,但是誰知道晶片裡面是怎樣的呢?所以不考慮 nVidia GPU。
  • Intel CPU 雖然耗電量較低,但是與 AMD 相比同時脈下速度較慢,價錢也較貴。什麼?你說買 2 開頭的?別鬧了,至少也要買 5 或 8 開頭的好嗎,2 開頭實在太舊了啦!雖然 8 開頭的價錢可以壓到三萬,但是都是搭配 Intel GMA,所以還是算了。而不考慮 nVidia GPU 的話,就統統剩下 Intel GMA,不會搭配 ATi 的卡了...
  • AMD CPU 雖然比較耗電,但是他的優點就是便宜肉大塊... 搭配 ATi 顯示卡,效能比 Intel 好多了... ATi 顯示卡的 linux 支援也越來越好,且頻頻對社群釋出善意。之前還放出 r500/r600 的 open source driver(不過... 嗯... 話說 intel driver 一直都是 open source 的 ="=)。
  • 4GB 的 RAM!常常編東西的人,thrashing 的話就等到死。反正現在 RAM 這麼便宜,就插到滿吧!但得注意別買到打不開 memory remapping 的機器(例如我媽那台,插 4GB 用 3GB 還蠻囧的)。
  • 雖然我老爸好像還蠻有錢的,但是也別浪費... 預算放在 NTD $25,000。

本來看上的是 MSI PX210,但是如果配上 ZM-80 要 $29,000,超出預算太多。HP tx2506 似乎也不錯,但是要 $28,000,也是超出預算,而且顯示卡只有 Radeon HD 3200。

最後挑來挑去,買了 HP dv5 1003ax,$25,200 帶回家。詳細的規格如下:

  • CPU:AMD Turion X2 Ultra Dual-Core Mobile ZM-82 @ 2200Mhz
  • RAM:Transcend DDR2-800 2GB x 2
  • GPU:ATI Radeon HD 3450 with GDDR2 256MB
  • HDD:TOSHIBA MK3252GSX - sATA2 320GB 8MB buffer
  • DVD:LightScribe SuperMulti DVD+/-/RW with Double Layer support
  • Display:15.4' 1280x800
  • 其他不重要的週邊:
    • Vermico WebCam
    • SD/MMC/MS/XD Card Reader
    • Fingerprint Reader
    • HDMI、eSATA、Firewire、遙控器
  • Battery:6 cell
  • Weight:2.83 KG
  • 不得不買的 Windows Vista Home Premium(沒 Activate 過,序號貼紙被我撕給原本那台了)

安裝 Linux 的時候遇到一些問題,能解的都解決了,剩下指紋辨識器沒 driver... 安裝時遇到的問題與解決方法紀錄在 Gentoo Wiki,主要是 kernel module 設定,沒有太多 Gentoo specific 的東西。其他 distro 應該有很多用的上的地方才是。

星期五, 1月 02, 2009

Hackintosh, Psystar, and Apple

林檎公司在 2006 年的時候,逐漸將小麥們都改成 Intel 平台。如此一來,以往 x86 上的作業系統統統可以拿去小麥上面跑,程式本身不需要作任何修改,只需要多加一個用 EFI 模擬 BIOS 的 bootloader 就好了。

如此一來,就有很多人想說,既然硬體大部分都相同,我是不是可以把 Mac OS X 裝到一般的 PC 上咧?結果是可以的,只要透過很小的修改,就可以把 Mac OS X 裝到你自己去光華商場拼(血拼、拼湊)來的電腦上。

後來又有一家公司做了個叫 EFi-X 出來,把這個東西插在主機板的 USB 擴充埠上,就可以直接啟動官方的 OS X Kernel。更有 Psystar 公司,就直接在 online store 販售預裝 Mac OS X 的桌上型電腦。

但是「將 Mac OS X 裝在非林檎神發售的硬體上」這件事情,本身是違反 Mac OS X 的 EULA 的,所以於是就鬧上了法院

一件事情合不合理,只要先把這件事情抽象化,將邏輯提煉出來以後,再帶入其他對應的實體即可。以這次的例子來說,讓我們這樣代換一下:

某罐頭廠商在販售自家鮪魚罐頭的時候,附上了一份 EULA,裡面寫著「請勿將本罐頭以非本罐頭廠商出售的食譜作成菜餚」以及「若開啟此罐頭,表示接受本授權協議。」芸芸。可是某個歐巴桑自己在做菜的時候用到這個罐頭,又不是罐頭廠商出的食譜的指定菜單。於是,這家罐頭廠商有權力告他,因為他違反本罐頭的 EULA。如果罐頭廠商勝訴,這位歐巴桑以後都不能用這個罐頭做菜以外,還可能必須賠錢給罐頭廠商。

另外,又有一家食譜出版社,因為覺得這個罐頭還不錯,所以針對這個罐頭設計了一系列的菜單,並且販售食譜。於是罐頭公司可以告這家出版社,因為罐頭公司誘使使用者將罐頭使用在自家提供的菜單以外,侵犯了罐頭公司的利益。

如果作個代換...

  • 「罐頭公司」改成「Apple 公司」
  • 「鮪魚罐頭」改成「Mac OS X 作業系統」
  • 「食譜」改成「硬體」
  • 「製作成菜餚」改成「安裝作業系統」
  • 「食譜出版社」改成「Phystar」

恩... 無限上綱。

星期三, 11月 26, 2008

Chrasis 白工開發紀錄

拿起荒廢超過半年的 Chrasis,想藉由更換核心演算法來改進辨識率。

本來想以筆劃的角度向量來比對,寫下去之後發現要比對的資料哭爸多,跑起來跟烏龜一樣。

所以我這個週末做的事情有一半是白做了 = =

目前想到的辦法是使用 2-pass 的 matching,先由一個正確率低但是速度快的演算法來作 1st-pass,再丟給這隻烏龜作 2nd-pass。

星期二, 10月 21, 2008

VirtualBox 與 tuntap interface

從純 User 的角度來看,比起 VMWareVirtualBox 的好處是,不必載入一堆有的沒有的核心模組(只有一個 vboxdrv),而且少了一堆 init script。付出的代價是... 某些方面的設定多了一些,不過這些設定並不複雜,只是麻煩些罷了。

如果您也跟我一樣不想讓 VirtualBox 用內部的 NAT,而是透過 Host Interface 直接上網,可以這麼作。首先假設網路拓樸長這樣:

  1. 增加一個 bridge 介面
    這個根據系統,會有不同的設定。在 Gentoo(baselayout-2)下,請安裝 usermode-utilities 與 bridge-utils,並修改 /etc/conf.d/net 這個檔案:
    config_eth0="null" # eth0 設為 null,並且把其他跟 eth0 有關的設定都拿掉
    bridge_br0="eth0" # 讓 bridge 由 eth0 組成
    config_br0=( "192.168.1.254/24" ) # 改成您的 IP
    #config_br0=( "dhcp" ) # 如果您要讓這台機器走 dhcp
    brctl_br0=(
        "setfd 0"
        "sethello 0"
        "stp off"
    )
    routes_br0=( 'default via 192.168.1.1' ) # 如果用 dhcp,請註解掉。
    fallback_br0=( "apipa" ) # 可有可無...

    ...

    link_ppp0="br0" # 如果有 adsl 撥接,請改成透過 br0。

    ...
  2. 增加相應的 init script
    $ sudo ln -s /etc/init.d/net.{lo,br0}
  3. 修改 /etc/sudoers
    加入以下這行:
    %vboxusers ALL=(ALL) NOPASSWD: /usr/bin/VBoxAddIF, /usr/bin/VBoxDeleteIF
  4. 加入一個 helper script
    放在哪裡都可以。為了讓所有的 User 都可以用,我放在 /usr/bin/VBoxIFManager.sh,別忘了 chmod +x 喔!
    #!/bin/bash

    IF="${1}"
    ACTION="${2}"
    BRIDGE="br0"

    case "${ACTION}" in
    up)
        sudo VBoxAddIF "${IF}" "${LOGNAME}" "${BRIDGE}" > /dev/null 2>&1
        ;;
    down)
        sudo VBoxDeleteIF "${IF}" > /dev/null 2>&1
        ;;
    esac

    echo "${IF}"
  5. VirtualBox 內的設定
    在 Virtual Machine Settings 裡的 Networking 下...
    • Attached to 選 Host Interface
    • Interface name 留空白
    • Setup Application 填入「/path/to/VBoxIFManager.sh vbox0 up」
    • Terminate Application 填入「/path/to/VBoxIFManager.sh vbox0 down」
    其中 vbox0 可以改成任意字串,如 winxp、fbsd、palatis_is_very_handsome 之類的。

星期五, 8月 29, 2008

這就是為什麼越重要的組織越不能用 Microsoft Windows!

電腦病毒無孔不入 國際太空站也無法倖免

28 Aug 2008

NASA 的科學家今天忙得焦頭爛額,因為國際太空站上一台筆記型電腦被病毒入侵。基於安全的顧慮,NASA拒絕透露入侵太空站的病毒來歷及路徑。不過一個專門報導太空新知和新聞的網站透露,那個撈過界、上了太空的病毒,可能是透過磁碟,入侵太空站的電腦。它是視窗系統大約一年前出現的一隻病毒,設計者的目的是要盜取線上遊戲的資訊,那些被鎖定的線上遊戲有一部份只有中文版,包括征途、煌易及洛汗。

在被病毒入侵之後,國際太空站上的電腦,已經裝了新的防毒軟體。

不是反微軟,而是他潛在的危險性比其他作業系統高太多了。不管是漏洞的數量、修理的速度、病毒的量... 等,都比其他系統來的糟糕。

不知道 NASA 有沒有順手把那台電腦升級成 Windows Vista?

星期三, 8月 20, 2008

不值錢的硬碟、不值錢的記憶體、難喬的滑鼠

我媽是幫人家作美容的,所以時常需要儲存大量的膚質檢測的照片、化妝過程的影片、資料、與一些課程的錄音。可想而之,這些都是動輒數百 MB、甚至數 GB 大傢伙。而她那台 120GB 硬碟的 ASUS A8Je(這台機器又大又重又沒有比較快,在我看來一無可取,還有一些哩哩叩叩的問題,不過那些又是另一個故事了!)根本放不下這麼多東西。

再來就是我妹的 Acer TravelMate3000,有點古早的機器,只有 512MB 的 RAM。配上一顆 4200rpm 的 60G 硬碟,跑起來跟烏龜有的拼。玩 ANNO 1503 都氣喘吁吁,所以決定幫她升級個 RAM。

總之呢,就殺去光華買了以下東西...

  • Maxtor Basic 1TB:本來打算隨便挑個最便宜的 500GB 的,但是找來找去都要三千台票上下。後來看到這個只要 $4990,繞來繞去還是決定買這個。個人覺得相當划算!一開始老闆報 $4990 給我們的時候還猶豫要不要買,後來回去的時候老闆剛好離開,店員因為單子上印的是 $5390 不敢賣。老闆回來以後才知道說本來今天要調整售價,但是代理商說明天才調整,但是單子已經印了,所以今天還是 $4990。我就開玩笑的說「哇!明天就漲價了,那趕快多買一顆!」結果老闆跟店員都急忙說「要用再買啦!不要急著買。」阻止我買。哈!
  • Transcend So-DIMM DDR2-667 2GB x 2:JetRam 的,一條 999。這兩條換給我媽,把我媽的一條舊 1G 加上新買 1G 給我妹。
  • Transcend So-DIMM DDR2-667 1GB:也是 JetRam 的,一條 550。配上我媽換下來的 1G,湊成 2G 給我妹。
  • Logitech V470:順便買給自己的藍牙鼠~ $1180 新台票。

硬碟拿回家當然是先 benchmark 一下。用 h2benchw 跑了 read test,速度很神奇的從頭到尾都在 34.5 ~ 35.5 MB/s 之間晃盪,看來這顆硬碟的速度超過 USB 的極限,沒辦法更快了... 跑完以後我就懶得跑 write test 了,因為 1TB/35MBps = 460min,我懶得再等他跑一遍 = =

RAM 的部份,A8Je 這個爛東西,BIOS 不支援 memory remapping(已經更新到最新版了),所以只能讀到 2944MB。是的,意思是說有 500 元的 RAM 沒有用到。但是至少雙通道沒問題,就將就用吧!該死的 A8Je。

剩下 1GB x 2 就塞給我妹電腦(什麼?你問我幹嘛不按槓下來?其實我也很想啊~可是我的是 DDR 不能插 QQ)。可是根據我妹的證詞指出,升級 RAM 以後機器變熱了!?奇怪,難道 1GB 模組比 256MB 模組熱嗎?

藍牙滑鼠很不錯,羅技新的雷射光學鼠,在什麼鬼地方用都感應的到。只是 BlueZ 3.36 的 Service Framework 怪怪的,bluez-gnome 也怪怪的,所以加起來就有時候連的上有時候連不上。如果您使用 bluez-gnome 或 kdebluetooth 卻沒有辦法連上藍牙鼠,又試過一般步驟(`hcitool cc <bdaddr>' 一類的)也不會動,可以試試以下的步驟...

先用以下的 python script 試試看...

import dbus
bus = dbus.SystemBus()

# service activation
bmgr = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
bus_id = bmgr.ActivateService('input')
imgr = dbus.Interface(bus.get_object(bus_id, '/org/bluez/input'), 'org.bluez.input.Manager')

# devices
devices = imgr.ListDevices()
for path in devices:
    idev = dbus.Interface(bus.get_object(bus_id, path), 'org.bluez.input.Device')
    if idev.IsConnected():
        print 'Path: ' + path + ' [connected]'
    else:
        print 'Path: ' + path + ' [not connected]'
    print ' bdaddr: ' + idev.GetAddress()
    print ' Name: ' + idev.GetName() + ' [' + str(idev.GetVendorId()) + ':' + str(idev.GetProductId()) + ']'
    # try connect unconnected devices
    if not idev.IsConnected():
        print 'trying to connect...'
        idev.Connect()

如果還是不行,再跑這個 python script,別忘了把 "XX:XX:XX:XX:XX:XX" 換成您的 bdaddr:

import dbus
bus = dbus.SystemBus()

# service activation
bmgr = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
bus_id = bmgr.ActivateService('input')
imgr = dbus.Interface(bus.get_object(bus_id, '/org/bluez/input'), 'org.bluez.input.Manager')

# create and connect to device
path = imgr.CreateDevice('XX:XX:XX:XX:XX:XX')
idev = dbus.Interface(bus.get_object(bus_id, path), 'org.bluez.input.Device')
idev.Connect()

如果還是不行...... 就沒轍啦!把 /etc/init.d/dbus 跟 /etc/init.d/bluetooth 都 restart 一次再試試看!

星期六, 8月 09, 2008

壓榨您的記憶體 - CompCache

您可能沒有辦法在 1 公升的茶壺裡裝下 1.5 公升的水,但是現在您有機會在 1GB 的記憶體裡面塞進 1.5GB 的資料!與 Windows VistaReadyBoost 不同,LinuxCompCache 試圖在不須外加任何硬體下,把更多資料塞進記憶體裡面。

與許多先進的作業系統一樣,Linux 以分頁(page)來管理記憶體。Linux 的分頁大致上可分為:

  1. 核心分頁(kernel pages):核心分頁永遠不會被放到虛擬記憶體中,不管是不是在拉屎,反正總是在實體記憶體中佔一個茅坑。某些 Unix 系統可以把核心分頁放到虛擬記憶體,但是 Linux 的開發者們覺得這太囉唆了,會大幅增加 VMM 的複雜度,所以沒有這麼做。
  2. 程式內容(program texts):程式內容就是一個程式實際會被執行的東西,例如 /bin/bash 或 /lib/libc.so.6 裡面的東西。這些是唯讀的資料,亦即,這些資料從被載入到卸除之間,內容都不會改變。呃,您不會希望 ls 執行到一半突然變成 rm 吧 @@ 想當然 kernel developers 不可能讓這種事情發生!
  3. 檔案分頁(file-backed pages):這種分頁也是從某個實際的檔案讀進來,但是它們的內容並不是唯讀的。如果在記憶體中的內容改變了的話,則必須找機會寫回檔案裡面。
  4. 匿名分頁(anonymous pages):由於這些分頁沒有對應到實際的檔案,所以被叫做「匿名」的分頁,stack 跟 heap 就是屬於這種類型。如果您的程式使用 malloc() 或 new,那麼配置的記憶體就屬於這種。
  5. 快取分頁(cached page):Linux 並沒有專門的 disk cache,取而代之 Linux 會將最近用到的磁碟資料放在快取分頁(cached page)中。Linux 通常不會直接讀寫磁碟,而是先在記憶體中操作,再找機會沖(flush)回磁碟中。
  6. 未使用記憶體池(free pool):目前沒有被使用,裡面沒什麼重要資料的記憶體。這種記憶體可以直接分配給需要的程式。

如果某個記憶體分頁中的資料與磁碟上的一樣,我們叫這種分頁乾淨的分頁(clean pages),即使挪作他用也不必擔心等下找不回來,再從磁碟上讀取就好了。但是如果分頁中的資料跟磁碟上的不一樣,就是髒的分頁(dirty pages)。髒分頁要變成乾淨的分頁很簡單,把資料寫進磁碟就好了,這個動作被稱為「收回(eviction)」。

回到主題,在程式配置記憶體的時候,核心會先嘗試在 free pool 中找看看有沒有合適的空間。若 free pool 中剩下的記憶體太少,核心就必須釋放一些 clean page 出來。如果沒有 clean page,則必須找一些 dirty page,把它們弄乾淨,再釋放回 free pool 中。file-backed pages 即使是 dirty 的,在寫回磁碟變成 clean 以後就可以直接釋放。但是 anonymous pages 就沒那麼好運,因為在定義中,anonymous pages 就是不屬於實際檔案的記憶體。這些記憶體,想當然就會被寫進置換記憶體(swap memory)中。由於寫回 swap memory 比寫進檔案輕鬆(不必穿越整個 VFS 系統、更新 mtime、atime 一類的雜事),所以釋放的順序通常是:

  1. clean anonymous pages:直接釋放
  2. clean file-backed pages:直接釋放
  3. dirty anonymous pages:寫回磁碟後釋放
  4. dirty file-backed pages:寫回磁碟後釋放

由於磁碟跟記憶體的速度簡直是烏龜比火箭,當您需要使用大於電腦實體記憶體的儲存空間的時候,就會發生 thrashing。亦即,核心好不容易把資料 A 寫進硬碟,騰出空間給資料 B,但是您馬上又要使用資料 A,只好又把資料 B 寫進硬碟,讀取資料 A,可是過一會兒又要用到資料 B... 於是硬碟怒吼、滑鼠呆滯、機殼好像瘋了一樣隨硬碟起舞...

CompCache 就是解救這個狀況的救星!它的基本概念很簡單,擠不出多餘空間的時候,把 dirty 的 anonymous pages 壓縮起來 swap 回 ram,再把節省下來的空間分配給需要的程式使用。在大部分的電腦配置下,即使壓縮、解壓縮再怎麼慢,通常也比磁碟存取快的多。

此圖直接從 CompCache 官網偷來...

如果您知道如何編譯核心,那麼安裝 CompCache 並不困難。首先,您必須有一套支援 CompCache 的核心(例如 zen-sources 2.6.25+),然後打開 CONFIG_BLK_DEV_COMPCACHE 即可,我是編譯成模組(m)。使用新的核心開機,然後執行 # modprobe compcache
# swapon -p 9999 /dev/ramzswap0
即可。CompCache 預設會將佔用的記憶體上限設為實體記憶體的 25%,如果要調整,可以在 modprobe 的時候指定 compcache_size_kbytes 參數,例如 modprobe compcache compcache_size_kbytes=524288 即使用 512MB 作為上限。

我的機器上的實測,這台機器目前是 A-Data DDR SDRam 512MB 兩條。

// 寫入 ram(事實上是寫入 tmpfs,速度很接近直接記憶體讀取)
# dd if=/dev/zero of=/dev/shm/bigfile bs=32768 count=16384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 1.18726 s, 452 MB/s
// 再把它讀出來
# dd if=/dev/shm/bigfile of=/dev/null bs=32768 count=16384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 0.452667 s, 1.2 GB/s
// 寫入 compcache
# dd if=/dev/zero of=/dev/ramzswap0 bs=32768 count=15384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 2.53538 s, 212 MB/s
// 從 compcache 讀取
# dd if=/dev/ramzswap0 of=/dev/null bs=32768 count=15384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 2.82894 s, 190 MB/s
// 寫入硬碟的 swap 分區
# dd if=/dev/zero of=/dev/sda1
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 22.4473 s, 23.9 MB/s
// 從硬碟 swap 分區讀取
# dd if=/dev/sda1 of=/dev/null
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 21.3317 s, 25.2 MB/s

由此可見,在我的機器上,直接存取記憶體最高有 1.2GB/s,但是硬碟卻只有 25 MB/s。使用 CompCache 則有 200MB/s 以上的速度,記憶體的 1/6、但是硬碟的 8 倍。

星期二, 7月 22, 2008

印象深刻的夢 - 要不要丟掉一個?

一開始是像美食節目那樣,跑去一家專門賣生魚片的餐廳吃東西(生魚片餐廳當然吃生魚片)。那個廚師切切切,準備準備準備很久,終於要上菜。他先拿了一塊魚,切的好小好小... 每個魚片大概只有指甲蓋那麼大... 放在一個很和風的小碟子裡。再配上非常超級多的芥末,大概有一整碗牛丼那麼大,再灑上一些醬油... 吃的時候把魚生拿去沾醬,掉進去就整個找不到了... = = 一邊吃還要一邊聽廚師濠洨說為什麼要把魚生切這麼小,是為了方便品嚐,能吃到魚的鮮美芸芸,整個就是吃得很不過癮...

接著就說要去一家極簡風的生魚片餐廳,而且店長從山下引入山泉水,可以一邊聽水聲一邊吃飯,要坐火車去,結果就跑上火車。火車坐一坐就有像是料理東西軍在介紹日本各地有名的店那樣,旁邊有人指著窗外說「就是那家!在那裡!在那裡!」,可是經過我們要去的店以後,火車快飛火車快飛穿過高山飛過小溪~,等了好久才到下一站...

下火車要坐回來的時候,就變成搭乘公車。車上的人不少,都是穿掉嘎戴斗笠的老頭子跟包頭巾老太婆,大部分的人都拿著大包小包的東西,不知道為什麼我媽跟我妹也跑出來跟我一起搭(而且也拿著大包小包)。因為剛才實在是過了好久,所以我一邊搭一邊抱怨「為什麼我們要來這種鳥不拉屎的深山吃生魚片?」。終於快要下車的時候,我們一按下車鈴,整車的人都站起來...... 全車都要下是怎樣!?可是沒辦法,站起來拿東西準備下車。耶?前面椅子上掛著的包包,好像是我媽咪不小心留下來的耶?「媽咪!媽咪!這兩包東西是我們的嗎?」叫了兩三次,我媽都不理我,我就想說算了,走去前面準備下車。可是我親愛的妹妹怎麼不見了呢?原來她聽到我的聲音,跑去拿那兩包東西。我們三個終於下車以後,我媽就罵我妹「你怎麼那麼慢?大家都在等你下車。」沒想到我妹居然說...

「我在想這兩包東西那一包比較不重要,是不是要把它們丟掉一包。」XD~

星期一, 6月 30, 2008

是央圖太混還是工程師太混?

今天的新聞「上網查央圖藏書 網頁落伍」

其中

  • 向央圖資訊室人員詢問,對方建議她改用 IE 6.0 以下或其他瀏覽器
  • 館藏書目查詢系統及資料庫龐大,更新期間必須兼顧圖書館內部作業,也不能影響讀者權益,3月份起,每週一閉館日執行升級計畫,3個月僅佔12個工作天
讓我覺得很扯...

  1. 首先,開發網頁服務卻綁定瀏覽器是很不道德的做法。就好像規定某條路只有福特的車可以走,裕隆不能走一樣。
  2. 我相信館藏書目查詢系統及資料庫龐大,但是更新期間必須兼顧圖書館內部作業是很奇怪的事情。看他最後寫「已經要求系統廠商加快腳步」,表示這項工程應該是外包的。既然是外包的,那就是開發商在別的地方把程式寫好,到時候直接丟上來就可以上線使用。而且... 把目前輸出的 html 轉換成標準的格式(html5+css3!?),讓 ie7/ff3 可以正常顯示,有工程浩大到要花三個月,並且要下線三天來升級嗎?
  3. 若只是改改 html 而已,應該跟後端資料庫大小沒有關係。如果是寫新的系統的話,資料庫的大小應該也不會影響到開發時程吧... 這感覺很像「因為我家電視比較大,所以看電影要花比較久的時間。」

3 CPUs (7 cores), 11GB of RAM, 900GB of Storage, Shitty GPU...

最近心情不是很好,主要的原因是大學要延畢... 為了振奮精神,決定添購新的電腦設備。嗯?你說「為什麼心情不好要買新電腦」嗎?哎唷,就像有人心情不好去飆車,有的人去大吃大喝,添購新電腦應該是不傷身體(嗯... 傷荷包 XD~)、健康、又可以刺激經濟發展的方法... 再說,目前桌機也舊的該換了,不但效能已經不敷使用,耗電量也較高,每瓦效能就更難看了...

前桌機:

    • CPU:AMD AthlonXP (Barton) 2600+ @ 1933Mhz
    • Ram:DDR-333 256MB x 1、DDR-400 512MB x 1(total 768MB)
    • MB:Gigabyte 7VT600P-RZ
    • GPU:GeForce 7300GT 256MB
    • Storage:Seagate Barracuda 7200.10 320GB x 2
    • PWS:EQUAL ISO-400D (300W)
    • OS:Gentoo Linux 2007.0
    • CPU:AMD AthlonXP 1800+ @ 1150Mhz(因為板子不支援 133Mhz 的 FSB,只好跑 100Mhz)
    • Ram:256MB PC-133 SDRam x 3
    • MB:Gigabyte GA-7ZX
    • GPU:GeForce FX 5200 128MB
    • Storage:Seagate Barracuda 7200.8 200GB
    • NIC:Realtek RTL8139B
    • PWS:Delta GPS-300AB-100E (300W)
    • OS:Ubuntu 8.04

比較快的那台桌機,編譯 glibc 要花一個多小時,根據 AthlonXP 的 TDP 68.3w 來計算,68.3w * 1.25hr = 85.375w-hr,如果 glibc 改版個 12 次,我就要排放 0.638kg 的 CO2,而這些還不包括 MB、RAM 等週邊消耗的電。

比較慢的那台機器雖然比較少編譯東西,但是設備老舊到我不知道該拿他來幹什麼(因為幹什麼都慢...),所以除了偶爾玩玩 Chromium BSU、開 Firefox 上上網以外,大部分時間只是浪費能源...

而且兩台都是超過五年的機器,當時的設備比較不注重能源管理,所以都沒有省電功能,搞得我不開冷氣電費還要兩千多塊...

今桌機:

    • CPU:AMD Phenom X4 9550 @ 1.1Ghz ~ 2.2Ghz
    • Ram:Transcend DDR2-800 2GB x 4
    • MB:ASUS M3A
    • GPU:GeForce 8500GT 256MB
    • Storage:Seagate Barracuda 7200.10 320GB x 2(原來的)
    • PWS:Seasonic SS-380GB (380W)
    • OS:Gentoo Linux 2007.0
    • CPU:AMD Athlon64 X2 4600+ @ 1.0Ghz ~ 2.4Ghz
    • Ram:Transcend DDR2-800 1GB x 2
    • MB:Gigabyte GA-M56S-S3
    • GPU:GeForce 8400GS 512MB
    • Storage:Seagate Barracuda 7200.10 320GB x 2(用舊的)
    • PWS:EQUAL ISO-400D (300W)(用舊的)
    • OS:Hack1nt0sh(預定)

Phenom 的 TDP 有 89w,Idle 時的 power consumption 約 21w,但是現在 glibc 十四分鐘可以編完,換算起來是 89w x 0.25hr + 21w x 1.0hr = 43.25w-hr,大約省了一半左右的碳,而 DDR2 也比 DDR 省約 50% 的電,新 Power 也號稱有 85% 以上的能源轉換效率。

而且換了新電腦,現在從開機到進入圖形介面,大約只要 30~40 秒,若再配合一些加速開機的 tuning,應該可以降低到 20 秒以內。這讓我想要再弄一台更省電的機器養動物,最好是插個像手機充電器那樣的變壓器就可以跑,桌機不用時就可以關機了。

再加上筆電(後來被我升級成 1GB RAM)的話,共有...

  • 三顆 CPU
  • 七個運算核心
  • 11GB 的記憶體
  • 980GB 的硬碟空間
  • 不怎麼樣的顯示卡兩張(不過 GDDR2 加一加也有 768MB = =)

話說 GeForce 8400GS 這張卡跑起 3D 真的不怎麼樣... 如果預算充足,多花個 500~1000 買到 8600GT,Quake4 engine 可以多跑 4 倍的 FPS。8400GS:8500GT:8600GT 效能約 1:2:4,但是價格是 1:1.3:1.9。

星期四, 6月 19, 2008

NVRM: pmd not present for addr %x

如果您使用 nVidia 的顯示卡與官方驅動程式,dmesg 中又一直出現這個訊息的話,表示您忘記載入 cpufreq 驅動程式了。可是... 為什麼明明就是顯示卡的 module,可是卻使用 cpufreq 的東西咧?

真是令人不解!

無論如何,只要載入 cpufreq 的 module,dmesg 中就不會再一直出這個訊息了。

// 我的是 powernow-k8,請自己改成適當的 driver:
# modprobe powernow-k8

星期一, 5月 12, 2008

怠惰的程式員設計的 php template engine

想要從敝系畢業的話,必須先考過系上的程式能力檢定。雖然他有提供練習用伺服器,但是用起來很囉唆,要裝一堆軟體、設定 IP 等等有的沒的。

為了讓拙荊方便練習,上學期中我就抽空寫了個功能目標類似的小網站給她,還有其他程檢沒過的同學們玩。不過... 到最後來玩的都是過的,沒過的都懶得玩 = =

Anyway,這門零學分不上課的必修課可是系上唯一有開暑修的課,意思是說這些沒過的傢伙暑假又得再考一次。於是我想把上學期寫的這個東西拿出來整理一下,看看有沒有可以改進的地方...

想進化的第一個門檻就是,之前寫的時候時間有點趕,整個程式以 procedural 為主,完全沒有考慮到安全性、擴充性、與維護等等議題。首先把 Program 與 Presentation 分開,就需要用到一個 template engine。但是 php 的 template engine 都是 Smarty 一類的大傢伙,我實在不想也懶得把他抓進來放到我這只有兩三個檔案的小專案裡面。於是,這個東西就誕生了!

<?php
// 設定 Template 檔案所在目錄
define('_STUPIDITY_TEMPLATE_DIR_', '/home/username/public_html/project_name/stupidity');

class Stupidity
{
    function assign($key, $value)
    {
        $this->_assigned[$key] = $value;
    }

    function get($key)
    {
        return $this->_assigned[$key];
    }

    function say($key)
    {
        echo $this->_assigned[$key];
    }

    function render()
    {
        global $stupidity;
        include_once(_STUPIDITY_TEMPLATE_DIR_ . '/' .
            $this->template_filename);
    }
}

$stupidity = new Stupidity();

?>

用起來也很簡單,在程式的部份先 include stupidity.php,設定 template filename,assign 資料以後,再 render 就行了:

====== index.php ======
<?php
include('stupidity.php');
$stupidity->template_filename = 'index.stupid';
$stupidity->assign('author', 'Palatis');
$stupidity->render();
?>

====== stupidity/index.stupid ======
<html>
  <head>
    <title>I N D E X</title>
  </head>
  <body>
    <h1>I N D E X</h1>
    <p>Copyright 2008 by <?php $stupidity->say('author'); ?>.>/p<
  </body>
</html>

BSD License!不過我沒有對它作過任何測試,如果爆掉的話就... 好自為之喔!

BTW... 這個檢定系統 Google 會想買嗎?XD~

[Palatis 告訴你] 什麼是 DoS、DDoS 攻擊?

DoS 是 Denial of Service 的縮寫,翻譯成中文就是「阻斷服務攻擊」。這個種類的攻擊,應該大部分的未成年人都遭受過:

你半夜偷偷上網,結果老媽進來把電源拔掉。
應該是最常發生也最常見的 DoS。

至於 DDoS 則是 Distributed Denial of Service,即「分散式阻斷服務攻擊」:

你半夜偷偷上網,結果老爸老媽姑姑嬸嬸叔叔伯伯一起進來,一個抓住你的手、一個抓你腳、一個擋住你眼睛、一個拔掉你電源線、一個拔掉網路線。
這樣就是 DDoS。