星期三, 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。

星期一, 5月 05, 2008

印象深刻的夢 - 死小孩篇

昨天(2008/05/03)早上做了個夢,如果拍成電影應該可以算是恐怖片一類的,但是起來以後並沒有被嚇到的感覺,只是覺得震驚。

我夢到我媽在開車(一直都是那台香檳色的 Toyota Camery),我坐在後座右邊的位置。總覺得車上還有另外一個人,可是記不清楚了,有可能是我妹,第三個人坐在哪裡也記不清楚了。

我媽開著車子走在一條雙向六線道的路上,路很寬,中間有安全島,有點像高速公路,可是兩邊有四層的房子跟店家,安全島也沒有高速公路那麼高。路上車子很多,前後車距只有約不到一個車身,而且三條線都有車,我媽的車以不慢的車速開在快車道上。

突然間,從右前方的車子前面衝出一個五、六歲穿白色 T-Shirt、深藍色短褲的小男孩(應該是男孩,他留著普通的旁分短髮),我媽就緊急煞車,然後把車撞向安全島。但是還是閃避不及,後輪輾過那個小男孩的頭。

車子停下來以後,我們趕緊下車查看,我叫車上的第三個人打電話報警,我自己則是一邊找那個小男孩在哪裡,一邊叫救護車。只記得那個小男孩從脖子以上都沒有東西,身上的白色 T-Shirt 從領口到胸口沾滿血跡,轎車的後輪也有一道血痕,地上有模糊的血肉,不過車子本身似乎並沒有什麼事。

從右手邊的車縫中,又跑出來一些(兩三個吧!)看似男孩家屬的人出來五子哭墓,並斥責我媽要她負責。不過我媽的立場是,她認為已經做了她該做的事(緊急煞車並且把車撞向安全島),而小孩的家長也沒把小孩看好,讓她跑來快車道,所以家屬要負大部分的責任,所以在兩邊快要打起來的狀況下跟對方理論

不過奇怪的是,本來我媽在開車的時候是現在(五十歲)的樣子,可是在下了車跟對方理論的時候,卻變成我小的時候的媽媽(三十幾歲)的樣子了。而且我覺得我也不是現在的我,而是三、四年前的我。

我在看到小孩衝出來的時候,並沒有什麼太緊張的感覺,只是很平靜的想「耶?怎麼會有小朋友衝出來?」,下車之後要打電話吆喝車上的第三人的時候,也不是因為緊張而大聲吆喝,而是因為緊急所以聲音比平常急。

最後,夢就在我媽跟對方家屬理論、有點生氣的述說自己已經煞車、打方向盤云云後結束了。

星期三, 4月 30, 2008

戰鬥即將結束,抬頭仰望星空~

耗時兩年,做得不怎麼樣的畢業專題 - Chrasis,終於在昨天展完。剩下的只有把程式碼燒進光碟(應該燒成 Blue-ray Disk,充分浪費儲存空間!),跟成果報告書一起塞進圖書館陰暗角落的書櫃中。

$ du chrasis/ -hs
35924 chrasis/

程式碼有 36MB 呢!真是佩服我自己,花了兩年居然只能寫這麼點東西,都不知道在混什麼... = =

不過我在展的時候... 好像都沒有被老師ㄉㄧㄤ到咧?據說別組被ㄉㄧㄤ的很慘...

--- Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 ---

據說有更屌的... 某組別的同學在評分老師(下稱 TeacherQ)質詢的時候,該組的指導老師(下稱 TeacherM,同時也是敝系主任)剛好在旁邊。結果 TeacherQ 問的問題全都是 TeacherM 在回答。哇咧!?這是怎樣?那我找指導老師來顧攤就好了嘛,絕對問不倒的!

還有就是,這次專題展系上每組僅提供一台電腦,而且這台電腦是於 90 年 11 月 22 日以 $50000 採購,使用年限四年的機器。意思是說,這個東西已經過了線性折舊期,可以拿去報銷了。那我如果不小心把它弄壞的話,只要賠 $0 囉?

另外,因為我們的展覽有分兩個梯次,下一組展覽的同學把我們借的設備也拿去用了(奇怪,我們需要三台電腦要自己出兩台,他們只要出一台就好,是怎麼回事?)。可是因為專題需要,我把那台電腦灌成 Ubuntu 了耶!!!

--- Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 ---

還有一件想起來的時候已經來不及的事情... 本來想說要利用專題展的時候偷偷蒐集 stroke data 的,可是展覽結束我居然忘記把他們複製出來 = = 白忙一場了...

Gentoo 下的 DNS 設定(Modular Network)

Gentoo 下,設定網路是那麼容易也那麼的不容易。不經大腦的把 /etc/conf.d/net 砍掉的話,一切就使用美好的預設設定。但是若要更改一點點東西,就很令人 OOXX。

最近想把 dns server 換成 OpenDNS,但是每次 dhcp 跟 ppp 都把我的 resolv.conf 亂改成自己想要的內容(如 192.168.1.1 或 hinet dns),真是令人火大。

好在有 openresolv 這個好東西,裝了以後就沒煩惱了!雖說這個主要是給 vpn 用的...

首先安裝:

# emerge openresolv

然後設定:

# echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' | resolvconf -a $INTERFACE

請把 $INTERFACE 換成您的 interface,如 eth0 或 ppp0:

# echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' | resolvconf -a eth0
# echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' | resolvconf -a ppp0

然後讓他更新:

# resolvconf -u

這麼一來,就可以用 OpenDNS 查 domain name 了!

# host -v palatis.iiiii.info
Trying "palatis.iiiii.info"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55262
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;palatis.iiiii.info. IN A

;; ANSWER SECTION:
palatis.iiiii.info. 28 IN A 220.141.34.251

Received 52 bytes from 208.67.222.222#53 in 157 ms
Trying "palatis.iiiii.info"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14133
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;palatis.iiiii.info. IN AAAA

Received 36 bytes from 208.67.222.222#53 in 156 ms
Trying "palatis.iiiii.info"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16198
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;palatis.iiiii.info. IN MX

Received 36 bytes from 208.67.222.222#53 in 168 ms

星期一, 4月 28, 2008

偶發性思考

好久沒寫 blog 了,再不更新不知道會不會被 Blogger 刪帳號...

專題展正在展,現在稍微比較閒一點。人肚子餓就想找東西吃,吃飽了就想東想西。最近就想到個奇怪的東西...

這個奇怪的... 恩... 姑且稱為產品好了。我想在衣服背後用 e-ink 之類的東西印一個 display,配合 wlan 或其他定位技術,可以用來指向某個特定的位置。例如去參加某活動(COSCUP/OSDC/CWT...?)的時候,通常都要東找西找某個設施,如會場或廁所。於是讓工作人員穿上這樣的衣服,直接有個箭頭指向會場或週邊的重要設施,參加的來賓看到就知道要往哪裡走了。甚至可以配合顯示還有多遠這樣... (謎之聲:幹嘛不放個告示牌就好了?我:唔......)或是可以讓講者攜帶定位裝置,這樣要找某位講者,可以讓大家衣服上的箭頭都指向那個講者。可能還有其他應用,暫時沒想到。不過基本上是電子墨水跟無線網路的 mash-up。

這種衣服還有個好處,可以上網下載花紋... 例如我今天要穿紅色的花紋,就上網下載以後顯示在衣服上。如果我突然想要其他顏色,就去下載些其他圖案,就像換桌布那樣。於是你要開正式會議的時候,就讓它變成什麼都沒有的白襯衫,開完會換個圖案馬上就可以去夜店,多好!像 jserv 這種人(剛好想起前幾個禮拜拜讀他這篇文章,並無冒犯之意...)就得救了!