自從由EOS lab畢業後就沒有再看過Linux source code,想當然也不會去逛LXR的網頁,今天心血來潮再度開啟LXR看看被我晾在一邊許久的kernel code[1],沒想到發現令人眼睛為之一亮的新功能[2]!
沒錯,就是左上角用紅色線框起來的PDF icon,按下它之後便會將目前瀏覽的原始碼轉換成產生熱騰騰的pdf檔案。
PS. 我仍然很喜歡右上角那張十分有意思的圖
[1] 最後一次看的版本為2.6.14
[2] 不知道什麼時候加入的,以前大多使用vim + cscope trace code
Search Google
Saturday, May 31, 2008
Linux Cross Reference (LXR) 又進步了
Friday, May 30, 2008
Code::Blocks, a nice IDE
今天再度展開IDE探索之旅,首先發現Eclipse現在已經可以用來開發Android(that's right, this is Google's Android)應用程式[1],稍微玩了一下範例之後深深覺得電腦的記憶體(512MB)實在無法負荷吃Ram怪獸Eclipse。
接著開始搜尋輔助wxWdigets的IDE,赫然發現Code::Blocks的存在(之後簡稱CB),同時發現有個名為wxPack的套件不但早已將wxWidgets的lib都編譯好,還附上支援WYSIWYG的GUI開發工具[2]。花點時間把玩CB之後發現以前替wxWidgets準備開發環境的方式"商當"原始,現在當然連Makefile也不需要準備,輕輕按下Build就大功告成,果然有工具用就怠惰了。如果將範圍侷限在產生native executble[3],CB其實是非常general purpose的IDE,與DevC++比較的話我會大推CB。在CB中新增wxWidgets project後直接點選Build & Run即可看到預設程式碼建構出來的Frame app,原始碼中還會有wxFormBuilder的project file(暫時叫它a.fbp),只是wxFormBuilder的code generator最近又有改版,因此如果用wxPack附的wxFormBuilder開啟a.fbp之後再另行產生原始碼之後在CB中build的時候就會出現錯誤[4]。當我將之前備份的原始碼拿出來比較之後發現新版的原始碼(GUIFrame.h)中省略include wx.h的部份:
#ifdef WX_GCH
#include
#else
#include
#endif
補上之後就可以成功編譯與執行了 :-)
PS. 歷經IDE探索之旅後深深體會站在巨人肩膀上的重要!
[1] http://code.google.com/android/intro/installing.html
[2] wxFormBuilder (http://wxformbuilder.org/)
[3] 簡單的說就是在Windows上副檔名為exe的執行擋,CB當然也有Linux port,只是Linux上的執行檔並無特定的副檔名,因此舉Windows的例子說明
[4] 錯誤訊息為:error: `wxMessageBox' was not declared in this scope
Thursday, May 29, 2008
[佛心來的叮嚀] 十惡不赦的MIS
最近發現不少知名網站資料庫的設計實在是非常爛,不但有sql injection的問題,最誇張的是使用者密碼居然用明碼存!難怪一般MIS的薪水一直起不來,怪誰勒?
請各位親朋好友在申請帳號的時候千萬不要使用相同的帳號密碼(尤其是email的帳密),切記切記!
PS. 強者我朋友三天就拿到超過一萬筆個人資料(含明碼密碼)
Wednesday, May 28, 2008
HEROES觀後感(Vol. 1 & 2)
上個星期因為很單純的念頭(看正妹~)而開始看HEROES。
origin link:http://www.nbc.com/Heroes/images/wallpapers/heroes-downloads-desktop-season2-1-1024x768.jpg
origin link:http://www.nbc.com/Heroes/images/wallpapers/heroes-downloads-desktop-season2-5-1024x768.jpg
第一季一共有23集,兩個高潮分別是save the cheerleader與save the world,這兩個高潮合起來就變成劇中常聽到的台詞"save the cheerleader save the world"。本季的主人翁們因為DNA異於常人,因此在因緣際會下發現自己與眾不同的特殊能力(eg.回復,讀心術,穿越時空,預知,飛行,穿透,隔空移物,學習?[Peter Petrelli的功能],等等),因為大家都才剛發現自己的能力,一方面不會控制,一方面大部分的人都只有一種能力,因此需要互助合作才能拯救世界(eg. Issac[預知] + Hiro[穿越時空] + Claire[回復] + Peter[學習]),而本季的大魔頭其實跟save the world一點關係也沒有,他因為想取得其他超能力者的能力而成為"特別"的人而殺了一堆人,但是命運很巧妙的把他跟要save the world的那一票人扯在一塊,不然還真不知道怎麼解決他(瘋狗老莫定理)。在不過度透露劇情的前提下,結論就是本季的劇情跟氣氛營造的處理得很好(正妹當然也不少)值得推薦。
跟第一季比起來第二季短了許多,只有一半不到的集數(11集),可能是因為好萊塢編劇罷工的原因吧?
本季跟第一季比起來除了長度縮短,quality也差了一點,有些地方的特效背景沒有處理的很好明顯是貼上去的。故事方面為了比面第一季的大好人(Peter)與大魔頭(Sylar)能力太強因此分別讓他們失去記憶與因被注射病毒而失去超能力,直到最後兩人才恢復,這讓故事繼續停留在可控制的範圍內(每個人依舊只有一樣超能力),Sylar雖然失去超能力,但是GY程度卻更甚於第一季,我只能說他演技好與編劇台詞寫得好。本季具有超能力的人如雨後春筍般的冒出來,好像全世界的人都有超能力一樣(其中不乏好傻好天真的人如Maya),偏偏故事又那麼短,因此稍嫌突兀。而且在超能力的處理方面也顯得前後不一致,Peter明明已經吸取Claire回復的能力,為什麼還一定要拿Claire的血液做為病毒的解藥呢(難道只是為了呼應save the cheerleader save the world)?還有,到最後(Episode 11)Peter明明已經恢復記憶,為什麼不直接使用穿透能力進入保險金庫就好還要費好大的力氣用隔空移物把厚厚的門扯開?本季最有趣的地方我認為就是小魔頭(Adam aka. Kensei)最後被Hiro帶到一個他再也逃不出來的地方,至於是哪裡就先賣個關子 :-)
整體而言目前出來兩季的表現都不俗,編劇的功力真的很好,帶著觀眾一步步完成拼圖,看"命運"如何把一堆原本沒有關係的人兜在一塊,慢慢把多個故事線收攏而看到故事的全貌,有百川匯於海的感覺。
最後附上官方提供桌布的網站。
油價上漲 != 補貼小黃
由於產油國疑似哄抬價格加上長期凍漲油價,從今天起油價要一次漲足,此政策一出果然民怨載道,叫得罪兇的不是一般用車民眾,而是運輸業者,因此政府端出補貼運輸業者的牛肉。
我認為對於大眾運輸業者如公車、客運等的補貼是舉雙手贊成,畢竟以原(或漲幅較小的)票價鼓勵民眾多多搭乘大眾交通工具可以減少汽、柴油的使用量,不但能夠省錢還可以愛地球。
相較之下,我就不懂為什麼要補貼小黃?
雖然現在共乘制度慢慢受到重視,但是一次也只能搭載三、四個人(但大部分時候其實還是只有一位乘客),不論對環境或是油耗的影響都很有限。使用者付費是很正常的觀念,與其補貼不如回歸市場機制,價格提高之後搭小黃的人雖然會減少,但再怎麼貴還是會有人搭(例如,報公帳的人,有錢人等)。不能夠因為小黃司機以漲價之後客源減少為訴求的抗議就輕易補貼,這些司機中不乏具有勞動生產力的青壯年人士,為什麼他們一定要選擇開小黃作為主要職業呢(在日本45歲以下的人是不能開計成車的)?要不然就是計程車生態自己該進化,不要像現在一樣沒事在街上繞(燒油),改成電話叫車模式讓乘客事先預約或臨時叫車。
至於那些不求改進的運將或計程車行,政府何必替他們設想得這麼週到呢?是擔心不補貼會引起暴動嗎(軍警是幹嘛用的。。。)?
為什麼要用全民血的汗錢補貼那些明明還有勞動生產力的小黃運將?這樣算圖例特定族群嗎?
Tuesday, May 27, 2008
Interesting screenshot of "HEROES"
Take a closer look at the content and you'll see :-)
Here comes HEROES' site
Monday, May 26, 2008
Still decide to note this down
$ file [file_name]
to get the info of a file
including encoding information
so we can use iconv with the correct input
Thursday, May 22, 2008
Linux kernel中random的用途
昨天在產生PGP key pair的時候終於第一次見到Linux中random的用途:
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++>+++++................<+++++>+++++...............+++++
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 280 more bytes)
Tuesday, May 20, 2008
另一篇假報導之名的廣告
Monday, May 19, 2008
學校還是應該要有專人負責作校刊
今天看了UoA (The University Of Auckland / 奧克蘭大學)本季的校友刊物(Ingenio),今年(2008)為了紀念創校125年特別採用精裝版本發行。本季首先當然要回顧一下學校過去125年的歷史,除了一些數據之外,我覺得最有趣的是原來草創時期的教室是廢棄的法庭&監獄。接下來便討論近年來(以及未來到2012年)學校的一些政策,根據校刊的說法,跟世界其他大學比起來UoA的postgrad/undergrad的比例偏低因此最近正在努力提高這個比例,同時因為政府減少補助,今年學校在招收新生之後可運用的資金將減少$2M NZD (quote: "...due to students who are able to enrol but whom the Government will not fund."),因此校方也努力讓來自弱勢團體的學生跟其他學生有相同的機會接受高等教育。除此之外當然要表揚一下傑出校友,其中不乏有公爵頭銜的人(Sir Ron Carter, knighted in 1998),最讓我感到驚訝的是微軟財務長(Chris Liddell, BE 1927)居然也是出身UoA Engineering school。老人表揚完了,換表揚年輕人,有人是出國比賽擊敗卡麥基美隆(Carnegie Mellon),華頓商管學院(Wharton),及其他赫赫有名的學府贏得於美國洛杉磯舉辦的2008 Champions Trophy Case Competition,有人是得到助學獎學金。話說將近十分之一(3500/38500)的學生瓜分了總數超過$20M NZD的獎學金,當年怎麼不知道有這麼多獎學金好拿?混的程度可見一般!
總之,看完之後覺得校方有在用心經營,而教師與學生也都很爭氣,學校前景一片光明,自己的前景好像也一片大好,充滿了可能性。
第二個念頭是,台灣的大學應該也要好好正視出版校刊這件事情,好好幫學生&校友洗腦一下(說錯了,是打氣),不然就會變成現在大家畢業後只想往園區跑的狀況。。。
Thursday, May 15, 2008
NX server test drive
在8M/1M的連線環境中速度還不錯,比X-Forwarding快多了!
用NX方案開firefox之後開啟router設定port forwarding時畫面更新的速度大約一至二秒
用X-forwarding方案常常需要至少半分鐘更新畫面,有時候signal根本沒有傳到server等了幾分鐘還是同一個畫面。
因此我認為若是在區網環境使用的話效果應該在本機上使用差不多 ^^
感覺上NX是Windows遠端桌面與VNC的合體,因為可以在任何時候繼續之前關閉的連線,也可以像XDMCP一樣每次連線都建立新session,還可以將桌面分享給多個連線,同時分享client端的硬碟與印表機給server,這是一篇來自www.linux.com的介紹。
最後要提醒一下該更新ssh囉,詳情請洽本文開頭的那張圖。
Thursday, May 08, 2008
syntaxhighlighter [設置/使用] 說明
有鑑於最近常在blog中貼code,決定好好研究如何讓source code在blog中看起來更漂亮(當然是跟用iframe的效果相比較)。經過一番google之後覺得使用syntaxhighlighter算是本益比最高的作法。尋找的過程中也發現一篇名為新手達人的blog其中有寫得很好的設定與使用說明,可供我直接在此引用,替我節省不少打字的時間。比較詳細的使用方式,如使用option等,可以在官方的wiki上找到。至於效果則可以從我前幾篇文章中的code snippet中看到(滑鼠滾輪往下捲或直接按PageDown鍵),還蠻不錯的 :-)
測試syntaxhighlighter
語法:pre class="python" name="code"
if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)
還可以縮起來
語法:pre class="python:collapse" name="code"
if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)
也可以設定起始行數
語法:pre class="python:collapse:firstline[3]" name="code"
if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)
為open source community盡棉薄之力 -- pyHook篇
最近嚐試著使用python寫一個keylogger,編寫的過程中使用到UNC放出來的pyHook模組,pyHook提供Windows用戶把一些低階的keyboard & mouse hook功能。當我在try的時候發現除了ALT以外的每個按鍵都可以被正常擷取,唯有ALT鍵每按兩次就會跳出一個runtime warning,訊息如下:
C:\work\code\code_python\svn\nws\keylogger>python keylogger.py
Lmenu
C:\Python25\lib\site-packages\pyHook\HookManager.py:353: RuntimeWarning: tp_comp
are didn't return -1 or -2 for exception
func = self.keyboard_funcs.get(msg)
Traceback (most recent call last):
File "C:\Python25\lib\site-packages\pyHook\HookManager.py", line 353, in Keybo
ardSwitch
func = self.keyboard_funcs.get(msg)
TypeError: an integer is required
Lmenu
Traceback (most recent call last):
File "C:\Python25\lib\site-packages\pyHook\HookManager.py", line 353, in Keybo
ardSwitch
func = self.keyboard_funcs.get(msg)
TypeError: an integer is required
當我trace進HookManager.py之後發現一件相當有趣的問題,那就是msg本身就已經是integer類別,不知道為何還會產生上面的警告訊息,於是我乾脆一不做二不休,將code由
func = self.keyboard_funcs.get(msg)
改為(ALT鍵屬於WM_SYSKEYDOWN)
if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)
沒想到問題就這麼迎刃而解!
C:\work\code\code_python\svn\nws\keylogger>python keylogger.py
Lmenu
Lmenu
Rmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
隨後已寫信給作者反應此問題,如此也算是替open source community盡了點心力。
pyHook & py2exe
使用py2exe build 利用pyHook攔截key stroke或mouse click的app時,setup.py中的bundle_files要設成"3"之後所產生出來的exe執行檔才會具有正常的攔截功能。
至於為什麼將bundle_files設定成2或1就不會work,我也不知道@@
Tuesday, May 06, 2008
xubuntu桌面美化備忘錄 -- nvidia driver & xserver-xgl
今天嘗試著將compiz fusion裝起來的時候發現在啟動compiz --replace時總是會跳出一行錯誤訊息:
Xgl: not present
原本也不以為意,因為compiz還是正常執行下去,唯一不正常的地方是每個windows的title bar都不見了,而原本的terminal現在也變成白色方塊。想想可能是那行錯誤訊息造成的,於是便裝了xserver-xgl套件,沒想到xserver-xgl一旦裝好之後每當我選擇"NVIDIA X Servier Settings"時就會得到我目前並沒有執行Nvidia driver的警告訊息,想當然我也沒辦法調整螢幕設定,而記憶體使用率也比之前高了一些,進top檢查之後發現光是Xgl就使用大約8%(約40MB)的記憶體來處理原本屬於顯示卡該處理的東西,雖然比網友聲稱的70MB少,但是多少也造成系統負擔,尤其是我現在只有不到512MB的記憶體。
將xserver-xgl移除之後nvidia driver的運作果然恢復正常,接下來便是好好處理title bar消失以及空白terminal的問題。
Thursday, May 01, 2008
Creating Windows service with Python and py2exe
最近在玩的py2exe不但能夠將.py檔轉成.exe執行檔還可以製作出Windows service。以下是參考Essien Ita Essien's Blog修改而來的.py檔,名為HelloService.py(檔名很重要!):
import win32serviceutil
import win32service
import time
class HelloService(win32serviceutil.ServiceFramework):
_svc_name_ = 'HelloService'
_svc_display_name_ = 'HelloService does nothing'
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.isAlive = True
self.log = open('c:\\\\log.txt', 'w')
def SvcDoRun(self):
import servicemanager
log = self.log
while self.isAlive == 1:
servicemanager.LogInfoMsg("HelloService is alive and well")
log.write("HelloService is alive and well\n")
time.sleep(10)
servicemanager.LogInfoMsg("HelloService stopped")
log.write("HelloService stopped\n")
log.close()
def SvcStop(self):
import servicemanager
log = self.log
servicemanager.LogInfoMsg("HelloService received stop signal")
log.write("HelloService received stop signal\n")
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.isAlive = False
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(HelloService)
HelloService.py中的每個member function name,以及_svc_name_ & _svc_display_name_都不能改(為win32serviceutil.ServiceFramework中的需要被override的function),這支service做的事情就是在Windows事件紀錄簿與C磁碟的log.txt中輸入文字訊息而已。
接下來要寫的是setup.py:
from distutils.core import setup
##import sys
import win32service
import win32serviceutil
import time
import py2exe
##sys.argv.append('py2exe')
setup(
version="1.00.00",
description="hello service",
name="hello service",
options={'py2exe': {'bundle_files': 2,
'optimize': 2,
'compressed': 1}},
service=["HelloService"],
zipfile=None
)
與之前介紹的setup.py不同之處為原本寫windows/console的地方改成service。此外原本寫entry point的檔案名之處改成寫module name(也就是檔名去掉附檔名-->HelloService),但是又有tutorial說service後面要寫的是_svc_name_的內容,為了保險起見我們幫檔名(去掉附檔名)與_svc_name_取相同的名字。接下來執行python setup.py py2exe便可在dist目錄中取得.exe格式的windows service執行檔了。
將service安裝為自動啟動:
HelloService.exe -auto -install
(也可以使用windows內建sc指令)
啟動service:
sc start HelloService
停止service:
sc stop HelloService
移除service:
HelloService.exe -remove
(也可以使用windows內建sc指令)