星期二, 9月 30, 2008

Webkit通過Acid3了

話說Chrome剛出來,鳥毅就測過Acid3,Chrome得79分,而Safari 3.1.2是76分、Firefox 3.1是86~88分。IE7很抱歉,完全看不到分數;至於IE8,我沒裝 裝了IE8 beta 2仍然是21分後fail。

今天在老地方冰果室看到Webkit已經拿到100分完全通過,於是下載最新的Webkit Nightly Build,果然是100分呀!

看來Firefox 3.1和IE8壓力很大,必須以通過Acid3為目標,否則就遜了。

星期五, 9月 26, 2008

Linux環境設定Opera中文字型

在Ubuntu上Opera的中文字型依然不怎麼樣,雖然在進階設定裏指定使用LiHei Pro,網頁仍然使用預設字型。參考Opera的中文字型設定 ,在 /usr/share/opera/ini/font.ini[matches]的區塊加入
family:LiHei*=excellent
,終於可以用儷黑體顯示。

P.S. Opera的Linux版怎麼感覺比Firefox差很多?在我這台PC上Opera 9.52跑起來的速度遠比不上裝了十幾個套件的Firefox 3.0.3呀!

星期一, 9月 22, 2008

OLEDB比ODBC快呀!

看了李維回覆RURU有關ODBC, OLEDB, ADO和dbExpress的問題,想起VB超人告訴過我OLEDB比較快,因為ODBC多了一層呼叫。

雖然李維很強(是高手中的高手呀),但他對微軟資料庫的歷史似乎不是完全正確,記得微軟最早提出RDO,後來才有ADO的出現,而ADO裏再分OLEDB與ODBC。

以前有別人測過,但以讀取為主。(請看

所以在下敝人小弟我,用VB6寫了一個很破的測試程式,為避免cache,就只寫不讀取,完全避開Server的Cache機制,不然比較晚讀取的連線一定比較快呀!

測試方法簡述如下:兩個程式架構完全相同,對同一個DB寫入十萬次,執行前先truncate table。

兩次測試結果相同:OLEDB花了1分16秒,ODBC花了1分21秒。

結論:其他Database不敢說,但在MS SQLServer的情況下,OLEDB比ODBC快!

Update:一樣的程式,原測試環境在Win2000 VM,剛才心血來潮在Vista 64上執行,居然差不多。微軟在不同OS上可能有許多不同的tuning與cache;所以對於這種非程式技巧的效能,還是別研究了:P

原始碼:
Private Sub OleDBTest()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Dim before As Date
Dim after As Date
Dim duration As Date
Dim connstr As String
connstr = "Provider=SQLOLEDB;" & _
"Data Source=MySQLServer;" & _
"Initial Catalog=TestDB;" & _
"User ID=sa;" & _
"Password=sa;"
before = DateTime.Now
Set conn = New ADODB.Connection
conn.Open (connstr)
Dim i As Long
For i = 1 To 100000
sql = "INSERT INTO TestTable Values('" & CStr(i) & "')"
conn.Execute (sql)
Next i
after = DateTime.Now

conn.Close
Set conn = Nothing
duration = after - before
Label1.Caption = ""
Label1.Caption = "before:" & CStr(before) & _
vbCrLf & _
"after:" & CStr(after) & _
vbCrLf & _
"duration:" & CStr(duration)
End Sub

Private Sub ODBCTest()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Dim before As Date
Dim after As Date
Dim duration As Date
Dim connstr As String

connstr = "Driver={SQL Server};" & _
"Server=MySQLServer;" & _
"Database=TestDB;" & _
"UID=sa;" & _
"PWD=sa;"

before = DateTime.Now
Set conn = New ADODB.Connection
conn.Open (connstr)
Dim i As Long
For i = 1 To 100000
sql = "INSERT INTO TestTable Values('" & CStr(i) & "')"
conn.Execute (sql)
Next i
after = DateTime.Now

conn.Close
Set conn = Nothing
duration = after - before
Label1.Caption = ""
Label1.Caption = "before:" & CStr(before) & _
vbCrLf & _
"after:" & CStr(after) & _
vbCrLf & _
"duration:" & CStr(duration)
End Sub


最後Update:VB超人最近接某個案子剛好在Oracle 11g轉檔,他表示Oracle odbc 插入一萬筆要51秒,而OleDB只要14秒,用Oracle donet client 只要八秒,在XP下作業。請看VB超人提供的測試結果圖:(測試案例稍有不同)

在Chrome裝flash player

由於鳥毅喜歡嘗鮮,裝了Flash Player 10,結果Uninstall Flash Player 9後再裝Flash Player 10 plugin,Chrome就不能顯示Flash。

後來找到方便的安裝方法:把%windir%System32\Macromed\Flash 底下的flashplayer.xpt與NPSWF32.dll複製到%USERPROFILE%\Local Settings\Application Data\Google\Chrome\Application\Plugins,再重開Chrome即可。

星期四, 9月 18, 2008

自製Vista PE 開機光碟

有看在下的Buboo/Twitter就知道,今天早上試RamDisk Plus時不幸把Vista 64搞爛,系統還原等了一個小時都沒跑完,只好強行重開機,但重開機後就開不進去。
原本只要把C:\Windows\System32\Drivers\SscRdBus.sys砍了就沒事,但是安全模式也進不去,只好拿XP PE光碟修復。

但是大家都知道(?)Vista的chkdsk功能比較強,而且Vista的NTFS版本也比較新(?),做Vista PE比較好吧!
於是鳥毅照著簡介 Windows PE上好人賴榮樞的介紹,做出Vista 與 Vista 64的PE光碟。

如果要出好人任務時,可能做片VistaPE會比較適合XD 有興趣的宅男可以研究研究...

星期三, 9月 17, 2008

多回報ClamAV

今天收到一封來自ClamAV的信:
Dear ClamAV user,

The following submissions have been processed and published:
- 4210487 Trojan.Magania-5465
- 4210405 Trojan.Magania-5423
- 4210415 Trojan.Spy-51753

See http://cvdpedia.clamav.net/daily/8269

--
Best regards,
The ClamAV team
事情是這樣,上個月陸續收到朋友Yahoo帳號寄來的木馬,4個zip檔案中ClamAV只掃到一個,NOD32原本掃到兩個,後來掃到三個,Sophas全都掃得到。經過鳥毅回報,經過半個多月終於加到ClamAV的病毒資料庫,現在全都掃得到!

雖然不一定會加進病毒資料庫,但有空仍要盡可能回報,台灣和國外的木馬畢竟不太相同,多回報多保佑呀...

星期二, 9月 16, 2008

VirtualBox支持64bit guest OS了!

VirtualBox在Sun的加持下,最近推出支援64 bit guest OS的2.0版(很快地,已經是2.0.2)。

VirtualBox 2.0版還支援微軟的vhd格式,所以鳥毅就不用像以前那樣一直重灌VM,頂多再做一個vdi用G4L/TrueImage/Ghost把硬碟抄過去。

雖然鳥毅在公司的Vista 64上裝64 bit guest OS失敗,回家再用Ubuntu 64 host試試....(忽然有種感覺,Sun還真是常做善事的公司,千萬不要倒了呀...)

Update:回家試Ubuntu 64仍然不行,上網搜尋似乎也沒看到成功案例呀Orz

今日連結:追求神乎其技的程式設計之道

最近頹廢太久,今天才發現高人vgod要去MIT攻讀博士學位,他臨走前寫了幾篇神文,特此記錄之,以便日後查閱拜讀。(算一算vgod的年紀,應該和jserv老大是台中一中前後屆吧?果然是名校呀!)

追求神乎其技的程式設計之道(一)
追求神乎其技的程式設計之道(二)
追求神乎其技的程式設計之道(三)
追求神乎其技的程式設計之道(四)
追求神乎其技的程式設計之道(五)
追求神乎其技的程式設計之道(六)

星期三, 9月 10, 2008

在Windows可以連到127.0.0.1但連不到localhost

在Windows上若可以連到127.0.0.1但連不到localhost,通常我們會先檢查 %windir%\System32\etc\hosts 裏有沒有
127.0.0.1 localhost
這行對應,但是今天鳥毅遇到設定都沒錯,連Windows防火牆都關了,防毒也關閉,但仍然不能連。

後來想了又想,把NOD32的web access protection取消,一切恢復正常。

這件事告訴我們:防毒軟體說它disable protection,不見得真的關閉所有的功能...

星期一, 9月 08, 2008

讓IE會提示使用者可以開啟/儲存Word檔

很奇怪,在Word 2000以後,IE預設都會提示使用者要開啟或儲存word檔。這個資訊相當難找,其實微軟有出Office 文件開啟確認工具,但是在網域內設定當然得靠修改機碼才方便。

最後終於找到,在HKEY_CLASSES_ROOT\Word.Document.8的EditFlags設成REG_BINARY的4個byte的0即可。(份文件似乎有點錯誤,上面寫dword,但鳥毅手上的電腦內機碼都是binary,懶得去試設成dword效果是否相同了)

以下存成confirmdoc.reg匯入即可:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Word.Document.8]
"EditFlags"=hex:00,00,00,00

駭客中繼站阻絕設定

VB超人接了某個政府機關的案子,有台主機代管在敝公司。日前很不幸地又收到資安管理通知,這次是要求做駭客中繼站阻絕設定,設定方法如下:
DNS設定步驟
  1. 建立內部DNS(如:192.168.0.2),並且要求所有內部電腦必須透過本DNS方可查詢。
  2. 新增一組Domain(如:blogdns.com) ,令此網域之查詢均指向一組虛設IP(如:1.1.1.1)。不論查詢 *. blogdns.com等,均回覆前述虛設IP。
  3. 於防火牆設定一組阻擋該虛設IP的規則(如:reject all dst ip=1.1.1.1)。
  4. 重複步驟2至3,將所附之DN設定完畢。
敝公司的DNS就是小弟在管理,因為合約關係,我不得不幫VB超人搞定這個需求。目前有348個host,若一一設定不累死我?

首先簡化問題,不管是不是同個domain,把每個host都放在一個zone總可以吧?結果一定相同。因此,就寫個簡單的script將host列表轉成dns file;由於使用Windows DNS,所以可以把dns file放在%windir%\system32\dns,再利用registry匯入即可。
Windows DNS Server的機碼在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server\Zones]底下。
#!/usr/bin/env python
# coding: utf-8

def WriteDNSFile(list, adserver):
for domain in list:
domain = domain.strip();
f=open(domain+'.dns', 'w+');
f.write(";\n; Database file "+domain+".dns for "+domain+" zone.\n");
f.write("; Zone version: 1\n;\n\n");
f.write("@\tIN SOA "+adserver+". hostmaster."+adserver+". (\n");
f.write("\t\t1\t; serial number\n");
f.write("\t\t900\t; refresh\n");
f.write("\t\t600\t; retry\n");
f.write("\t\t86400\t; expire\n");
f.write("\t\t3600\t) ; default TTL\n");
f.write(";\n; Zone NS records\n;\n\n");
f.write("@\t\tNS\tyouradserver.corp.\n\n");
f.write(";\n; Zone records\n;\n\n");
f.write("@\t\t A\t1.1.1.1\n\n");
f.close();

def WriteDNSRegFile(list):
f=open("dns.reg", "w+");
f.write("Windows Registry Editor Version 5.00\n\n");
for domain in list:
domain = domain.strip();
f.write("[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\DNS Server\\Zones\\"+domain+"]\n");
f.write('"Type"=dword:00000001\n');
f.write('"SecureSecondaries"=dword:00000003\n');
f.write('"NotifyLevel"=dword:00000002\n');
f.write('"DatabaseFile"="'+domain+'.dns"\n');
f.write('"NoRefreshInterval"=dword:000000a8\n');
f.write('"RefreshInterval"=dword:000000a8\n');
f.write('"Aging"=dword:00000000\n\n');
f.close();

#主程式
adserver="youradserver.corp" #AD及DNS Server, 這裏是youradserver.corp
hostListFile = ur"歷次中繼站列表匯整檔.txt";
f=open(hostListFile, 'r');
list = f.readlines();
f.close();
WriteDNSRegFile(list);
WriteDNSFile(list, adserver);

本程式提供給有此需求的朋友,版權沒有,盡管盜貼。

星期五, 9月 05, 2008

將所需組件包在一個exe裏

Blogger終於修好了,因此從今天開始再寫技術文章。

美麗的MIS小姐發現MIS先生安裝在使用者端的程式只有一支exe檔,而且其中還有Crystal Reports XI的Runtime。由於種種原因,她問鳥毅這是怎麼做的。

鳥毅只知道Java的Jar檔是zip,所以很容易把多個jar壓成一個;傳統C/C++可以用static link;遇到.Net就沒轍了,連忙請教google。

原來得靠ILMerge這個工具,ILMerge下載點

用指令比較麻煩,可以下載Gilma 這個UI介面,也不用記住一堆東西。


ILMerge不是萬靈丹,也是有點問題,別忘了看ILMerge.doc裏的第4點Troubleshooting。

Update:感謝Kuon的告知,DILMerge在.Net 1.1/2.0均可使用,不像ILMerge只能在.Net 2.0用,而且DILMerge還有提供Delphi的Pascal原始碼。(我猜用free pascal應該編不過吧...)

Blogger修好了

不知道是哪位老大向Blogger反應或是Blogger自己發現,今天早上發現鳥毅的Blog居然修好了!(不知詳情的朋友請看部落格慘劇

Blogger捅這麼大的婁子,就說不可能全世界只有鳥毅一個人這麼幸運,難怪樂透沒中呀...

星期三, 9月 03, 2008

神奇的Chrome

昨天同事才和我討論Chrome防當機控制到底是不是多個process,今天看到,果然是真的呀!而且速度超快,比Safari快不少,不知道有沒有超越Opera?(感覺上是有啦)