來吧!Ubuntu 8.10!
星期一, 10月 20, 2008
星期五, 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 Vista 的 ReadyBoost 不同,Linux 的 CompCache 試圖在不須外加任何硬體下,把更多資料塞進記憶體裡面。
與許多先進的作業系統一樣,Linux 以分頁(page)來管理記憶體。Linux 的分頁大致上可分為:
- 核心分頁(kernel pages):核心分頁永遠不會被放到虛擬記憶體中,不管是不是在拉屎,反正總是在實體記憶體中佔一個茅坑。某些 Unix 系統可以把核心分頁放到虛擬記憶體,但是 Linux 的開發者們覺得這太囉唆了,會大幅增加 VMM 的複雜度,所以沒有這麼做。
- 程式內容(program texts):程式內容就是一個程式實際會被執行的東西,例如 /bin/bash 或 /lib/libc.so.6 裡面的東西。這些是唯讀的資料,亦即,這些資料從被載入到卸除之間,內容都不會改變。呃,您不會希望 ls 執行到一半突然變成 rm 吧 @@ 想當然 kernel developers 不可能讓這種事情發生!
- 檔案分頁(file-backed pages):這種分頁也是從某個實際的檔案讀進來,但是它們的內容並不是唯讀的。如果在記憶體中的內容改變了的話,則必須找機會寫回檔案裡面。
- 匿名分頁(anonymous pages):由於這些分頁沒有對應到實際的檔案,所以被叫做「匿名」的分頁,stack 跟 heap 就是屬於這種類型。如果您的程式使用 malloc() 或 new,那麼配置的記憶體就屬於這種。
- 快取分頁(cached page):Linux 並沒有專門的 disk cache,取而代之 Linux 會將最近用到的磁碟資料放在快取分頁(cached page)中。Linux 通常不會直接讀寫磁碟,而是先在記憶體中操作,再找機會沖(flush)回磁碟中。
- 未使用記憶體池(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 一類的雜事),所以釋放的順序通常是:
- clean anonymous pages:直接釋放
- clean file-backed pages:直接釋放
- dirty anonymous pages:寫回磁碟後釋放
- dirty file-backed pages:寫回磁碟後釋放
由於磁碟跟記憶體的速度簡直是烏龜比火箭,當您需要使用大於電腦實體記憶體的儲存空間的時候,就會發生 thrashing。亦即,核心好不容易把資料 A 寫進硬碟,騰出空間給資料 B,但是您馬上又要使用資料 A,只好又把資料 B 寫進硬碟,讀取資料 A,可是過一會兒又要用到資料 B... 於是硬碟怒吼、滑鼠呆滯、機殼好像瘋了一樣隨硬碟起舞...
CompCache 就是解救這個狀況的救星!它的基本概念很簡單,擠不出多餘空間的時候,把 dirty 的 anonymous pages 壓縮起來 swap 回 ram,再把節省下來的空間分配給需要的程式使用。在大部分的電腦配置下,即使壓縮、解壓縮再怎麼慢,通常也比磁碟存取快的多。
如果您知道如何編譯核心,那麼安裝 CompCache 並不困難。首先,您必須有一套支援 CompCache 的核心(例如 zen-sources 2.6.25+),然後打開 CONFIG_BLK_DEV_COMPCACHE 即可,我是編譯成模組(m)。使用新的核心開機,然後執行
# modprobe compcache 即可。CompCache 預設會將佔用的記憶體上限設為實體記憶體的 25%,如果要調整,可以在 modprobe 的時候指定 compcache_size_kbytes 參數,例如 modprobe compcache compcache_size_kbytes=524288 即使用 512MB 作為上限。
# swapon -p 9999 /dev/ramzswap0
在我的機器上的實測,這台機器目前是 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個工作天
- 首先,開發網頁服務卻綁定瀏覽器是很不道德的做法。就好像規定某條路只有福特的車可以走,裕隆不能走一樣。
- 我相信館藏書目查詢系統及資料庫龐大,但是更新期間必須兼顧圖書館內部作業是很奇怪的事情。看他最後寫「已經要求系統廠商加快腳步」,表示這項工程應該是外包的。既然是外包的,那就是開發商在別的地方把程式寫好,到時候直接丟上來就可以上線使用。而且... 把目前輸出的 html 轉換成標準的格式(html5+css3!?),讓 ie7/ff3 可以正常顯示,有工程浩大到要花三個月,並且要下線三天來升級嗎?
- 若只是改改 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 這種人(剛好想起前幾個禮拜拜讀他這篇文章,並無冒犯之意...)就得救了!
星期四, 6月 07, 2007
Chrasis 0.1.0 alpha!
嗯... 廣告文 XD~
這兩天把散落一地的 code 整理了一下,作成了可以放到 /usr/lib 底下的 library。又另外拼湊了一個 Trainer 出來,看起來比較「動感(interactive)」一點,可以 online 告訴你辨識率(這樣感覺比較像有在辨識)。
想玩玩看嗎?請見 Chrasis 首頁!
星期一, 6月 04, 2007
星期五, 6月 01, 2007
星期二, 5月 08, 2007
讓 Firefox 開快點 - 關掉啟動時的自動更新
即使我已經無所不用其極的想辦法讓程式載入的速度快點,但是碰上 Firefox 這頭怪獸,把他從磁碟裡拖到螢幕上裡還是得花個兩三秒。
後來,我發現 Firefox 會嘗試在啟動的時候(程式已經啟動、但是視窗跳出之前)更新附加元件與搜尋引擎。這麼一來,若有更新,可以不必在你已經開了一堆視窗以後,跳個對話方塊出來要求你重新啟動 Firefox。
但是,由於網路的 latency,檢查更新的速度快則半秒,慢則一兩秒,可以說在我 Firefox 的啟動過程中,佔掉了 20~50% 的等待時間。於是,我決定將它關掉,並安裝另一個 extension 來檢查更新。(反正又不是一天到晚有更新檔要裝,但是我可是一天到晚都會關閉、開啟 Firefox 啊!)
怎麼關呢?請至「編輯 => 偏好設定 => 進階 => 更新」下,將「自動檢查是否有更新」下的所有東西(應該有三個,分別是「Firefox」、「以安裝的附加元件」、「搜尋引擎」)取消選取。如下圖所示:
可是這樣 Firefox 不就不會幫我更新這些東西了嗎?沒關係,讓我們裝上「Update Notifier」來負責這件苦差事:
- 首先按下「Install Now」來安裝
- 可憐的你必須重開 Firefox 了!
- 重開以後,右上角會多出一個小圖示,請你點他一下
- 按一下「選項」進入設定頁面
- 於「一般」頁面,將「當 Firefox 啟動時,檢查有無更新檔可用。」取消選取
- 在「通知」頁面,將「設定 Firefox 多久檢查一次更新。」選取,並依照您雞皮的程度設定每次檢查的間隔時間。
- 按下「確定」!
這麼一來,每次啟動 Firefox 至少又可以快個 0.5 秒啦!
星期六, 5月 05, 2007
美勞課考卷發了!
美勞嵌入式系統期中考時,有類似這樣的題組:
# ls -al
Total 20
drwxr-xr-x 2 tblanku users 4096 May 5 02:20 .
drwxr-xr-x 9 root root 4096 Mar 24 08:26 ..
-rw-r--r-- 1 tblanku users 127 Mar 4 07:32 .bash_logout
-rw-r--r-- 1 tblanku users 193 Mar 4 07:32 .bash_profile
-rw-r--r-- 1 tblanku users 551 Mar 4 07:32 .bashrc
-rw-r--r-- 1 root root 0 May 5 02:20 somefile
-rw-r--r-- 1 root root 213 May 5 02:20 other file請問 tblanku 可否刪除 somefile 這個檔案?
我當然是寫「是,因為刪除檔案是看目錄權限。」可是,老師在檢討考卷的時候居然說:「因為 somefile 的擁有者是 root,tblanku 只有讀取的權限,所以不能刪除。」所以就被改錯了 XD~
這種 well-known 的 gotcha 也會掉進去!? @@ 而且,他果然出了「不能使用空格」這種題目...
Linux 的檔案系統並沒有硬性規定檔名使用的編碼(或是,哪些字元可用、哪些不可用),而是把這部份的決定留給了使用者。除了「/」這個目錄分隔符號以外,其他字元都可以拿來當檔名。
還有一些被說得很好笑的答案:
Q: 如果要把「install.sh」更名為「setup.sh」,要下什麼指令?
A: mv {install,setup}.sh
結果被批「沒有人會這樣用」...
還有一題...
Q: 雖然圖形介面簡單好用,為什麼在開發嵌入式系統的時候需要使用指令模式?
A: 因為你不會用!還是有很多圖形介面的工具可以輔助嵌入式系統開發的。Open Source, Open Mind!
結果上課的時候被說「有人跟我嗆聲,說是因為我不會用」XD~
嗯... 我想你還是繼續放 NTT DoCoMo 的宣傳影片好了...
星期三, 5月 02, 2007
題意 XD
前幾天(May 1, 2007)系上舉辦程式設計比賽,出了四道題目。其中一題大概是這樣的(題目卷收回去了,所以只能列出大概...):
今天有一由英文字母與括號組成的字串 S,可以對他們作 HEAD 與 TAIL 兩種操作,行為是這樣:若 S=a(bc),則 HEAD(S)=a、TAIL(S)=bc,若 S=(bc) 則 HEAD(S)=NULL、TAIL(S)=bc,若 S=a,則 HEAD(S)=NULL。
範例輸入:
a(b(cd)))
TAIL
HEAD範例輸出:
b
恩... 不要問我為什麼出這麼簡單的題目,因為我也不知道 = = 總之,看到這個題目,我想到類似以下的表格:
S HEAD TAIL a(bc) a bc (bc) NULL bc a NULL(題目這樣說嘛!) a(猜的)
於是,寫出程式碼以後,驗證失敗... 花了些時間修改以後,最後還是錯誤。
比賽結束後,就去問監考老師,看能不能取得測試資料,順便問他我們到底錯在哪。當時他看了看題目以後,說「喔,應該是題目錯了,如果沒有這行(S=a HEAD(S)=NULL)就對了。」
那... 廢話嘛 = = 哪有「題目錯了,我們也就跟著錯了」這種事,當然要想辦法補救(至少要能讓人家覺得這是場公平的比賽)。可是當時老師跟助教就一付息事寧人的態度,對我們說「不然你是想要我怎樣?向全校公開道歉嗎?」實在很無言。就這樣,我們當天在系辦吵了兩個多小時。
後來,老師、助教、我們自己又調備份資料出來看,才終於弄懂到底錯在哪。原來題目跟測試資料都沒問題,是我們誤解了題意。如果 S=a(bc) 是 general case,括號前面的是 HEAD、裡面的是 TAIL。而 S=(bc) 是只有 TAIL 時的 special case, HEAD 是 NULL、TAIL 是括號中剩下的東西。而 S=a 是只有 HEAD 的 special case,不但 TAIL=NULL、連 HEAD 也一併變成 NULL 了。
嗯,好吧!的確是自己會錯題意,既然這樣就沒話說了。雖然我好像也測過 S=a HEAD=NULL TAIL=NULL 這種組合... 可能是其他部份的程式碼有問題吧!
後來我問我的隊友「我是不是很龜毛?」,他說「是,我當時就想叫你算了」。我告訴他的理由是,「因為這是比賽,我不願意在不明不白的狀況下贏過別人,也不能不明不白讓別人贏過我」。他後來也就理解了,也陪我跟老師囉唆了兩天 XD~
不過題外話... 有另外一題大概是這樣:
小明走在海邊檢石頭,每次只能撿比目前石頭重,而且不能往回走。而且為了避免一下子拿太重手臂負荷不了,所以只能拿比現在重十公斤以內的石頭。例如目前拿的石頭是 5kg,那麼下一次只能換成 6~15kg 的石頭。請問怎樣的拿法,可以達到最多交換次數?
範例輸入:
3 2 21 60 4 6 8 70 44 7 5 10 33 9 11範例輸出:
6
2 4 6 8 10 11(我沒有實際算,這裡的答案是隨便唬嚨的...)
我一看到這個題目,就跟隊友說「這個可能有兩組最佳解吧?」,於是他就問老師「如果有兩組以上最佳解怎麼辦?」結果老師跟助教很肯定的跟我說「測試資料只有一組最佳解。」
很好,跑出來他的一些測試資料裡會有兩到三組最佳解 = = 嗯... 驗證失敗 XD~
搞成這樣我也不知道該說什麼,不過老師最後還是給我們對,但是時間就不知道該怎麼算了...




