鳥毅退伍後,找的第一間公司是負責銀行端末系統的公司,有點類似獨孤木以前做的,但規模比較小。當時年少無知,以為企業內部的程式都應該長得像那樣,分層控制流程,也就是N-Tier設計。
由於有位朋友待在國內某間頗具規模的入口網站,當時向鳥毅招手,半年後鳥毅就投身到portal混了年餘,與N-Tier說拜拜,致力於高流量下還能動的web開發(因為寫得爛,能動就不錯了)。此時最大的好處,就是身邊的同事都是高手(我最爛),而且熟FreeBSD/Linux的人很多,不像現在有問題都找不到人問。
由於coding程度太差,又不耐操,後來受不了跑到目前的公司當個小網管。這間公司都用微軟的Solution,所以當然傾向於用Visual Studio拖拉。微軟的IDE特點就是快,不但跑起來快,開發時程還真是短;用VS2005/2008配合SQLServer,拉一拉一個MIS程式就做出來,這是以前沒接觸過FoxPro/PowerBuilder的鳥毅未知的世界。
此時問題就來了:一間100人以上的公司,不可能只有一個MIS寫程式。每個人寫程式都直接存取Database對嗎?其實這間傳產公司的IT主管也不是IT出身,在鳥毅來之前連套Database都沒有,後來才買套SQLServer 2000供MIS使用。到美麗的MIS小姐加入本公司後,她和原先MIS先生的風格迥異,兩個人的code也沒有共用(原因別問我),而且都是直接存取Database,造成兩個人的程式功能大幅重複,而且時常為了資料交換而有爭執。Client/Server更大的問題在這,不過這不在討論之列。
要問我是誰的錯嗎?嗯....是微軟的錯:P VisualStudio一開始的設計就是Quick & Dirty,到現在Enterprise Library的架構都一直在變,也沒有類似JavaEE的Solution(應該沒有吧...我不熟:P,只有找到這);所以造成MIS必須自己設計N-Tier的架構。(這一段是寫給MIS看的,微軟別怪我)
微軟的N-Tier似乎和LINQ畫上等號(這),雖然在下不怎麼認同,但至少是個好的開始。現在又多了ASP.Net MVC,不知未來如何?
總之,若你是公司的IT主管,請注意元件的共用與源碼的共用,N-Tier是建構在Business Logic上而不是資料流上,不要用Database去思考程式。
唉,我這個小小網管似乎想太多了,優秀的年輕同事聽到交大把email外包給gmail就想到長官一定會擔心被人說太閒,不懂長官的心,難怪我會黑呀!
星期一, 十月 06, 2008
星期四, 十月 02, 2008
FreeBSD 6.X升級到7.0的錯誤訊息
有一台電腦從FreeBSD 6.X升級到7.0,結果每次登入登出都會出現:
解決方法:
login: in openpam_dispatch(): pam_nologin.so: no pam_sm_authenticate()查了以後發現是/etc/pam.d裏的檔案不會因為mergemaster或make installworld更新。
解決方法:
#cd /usr/src/etc/pam.d
#make install
星期二, 九月 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為目標,否則就遜了。
今天在老地方冰果室看到Webkit已經拿到100分完全通過,於是下載最新的Webkit Nightly Build,果然是100分呀!
看來Firefox 3.1和IE8壓力很大,必須以通過Acid3為目標,否則就遜了。
星期五, 九月 26, 2008
Linux環境設定Opera中文字型
在Ubuntu上Opera的中文字型依然不怎麼樣,雖然在進階設定裏指定使用LiHei Pro,網頁仍然使用預設字型。參考Opera的中文字型設定 ,在 /usr/share/opera/ini/font.ini 裏[matches]的區塊加入
P.S. Opera的Linux版怎麼感覺比Firefox差很多?在我這台PC上Opera 9.52跑起來的速度遠比不上裝了十幾個套件的Firefox 3.0.3呀!
family:LiHei*=excellent,終於可以用儷黑體顯示。
P.S. Opera的Linux版怎麼感覺比Firefox差很多?在我這台PC上Opera 9.52跑起來的速度遠比不上裝了十幾個套件的Firefox 3.0.3呀!
星期一, 九月 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
原始碼:
最後Update:VB超人最近接某個案子剛好在Oracle 11g轉檔,他表示Oracle odbc 插入一萬筆要51秒,而OleDB只要14秒,用Oracle donet client 只要八秒,在XP下作業。請看VB超人提供的測試結果圖:(測試案例稍有不同)
雖然李維很強(是高手中的高手呀),但他對微軟資料庫的歷史似乎不是完全正確,記得微軟最早提出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超人提供的測試結果圖:(測試案例稍有不同)
標籤:
Database,
Programming
在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即可。
後來找到方便的安裝方法:把%windir%System32\Macromed\Flash 底下的flashplayer.xpt與NPSWF32.dll複製到%USERPROFILE%\Local Settings\Application Data\Google\Chrome\Application\Plugins,再重開Chrome即可。
星期四, 九月 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 有興趣的宅男可以研究研究...
原本只要把C:\Windows\System32\Drivers\SscRdBus.sys砍了就沒事,但是安全模式也進不去,只好拿XP PE光碟修復。
但是大家都知道(?)Vista的chkdsk功能比較強,而且Vista的NTFS版本也比較新(?),做Vista PE比較好吧!
於是鳥毅照著簡介 Windows PE上好人賴榮樞的介紹,做出Vista 與 Vista 64的PE光碟。
如果要出好人任務時,可能做片VistaPE會比較適合XD 有興趣的宅男可以研究研究...
星期三, 九月 17, 2008
多回報ClamAV
今天收到一封來自ClamAV的信:
雖然不一定會加進病毒資料庫,但有空仍要盡可能回報,台灣和國外的木馬畢竟不太相同,多回報多保佑呀...
Dear ClamAV user,事情是這樣,上個月陸續收到朋友Yahoo帳號寄來的木馬,4個zip檔案中ClamAV只掃到一個,NOD32原本掃到兩個,後來掃到三個,Sophas全都掃得到。經過鳥毅回報,經過半個多月終於加到ClamAV的病毒資料庫,現在全都掃得到!
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
雖然不一定會加進病毒資料庫,但有空仍要盡可能回報,台灣和國外的木馬畢竟不太相同,多回報多保佑呀...
星期二, 九月 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
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老大是台中一中前後屆吧?果然是名校呀!)
追求神乎其技的程式設計之道(一)
追求神乎其技的程式設計之道(二)
追求神乎其技的程式設計之道(三)
追求神乎其技的程式設計之道(四)
追求神乎其技的程式設計之道(五)
追求神乎其技的程式設計之道(六)
追求神乎其技的程式設計之道(一)
追求神乎其技的程式設計之道(二)
追求神乎其技的程式設計之道(三)
追求神乎其技的程式設計之道(四)
追求神乎其技的程式設計之道(五)
追求神乎其技的程式設計之道(六)
標籤:
Programming
星期三, 九月 10, 2008
在Windows可以連到127.0.0.1但連不到localhost
在Windows上若可以連到127.0.0.1但連不到localhost,通常我們會先檢查 %windir%\System32\etc\hosts 裏有沒有
後來想了又想,把NOD32的web access protection取消,一切恢復正常。
這件事告訴我們:防毒軟體說它disable protection,不見得真的關閉所有的功能...
127.0.0.1 localhost這行對應,但是今天鳥毅遇到設定都沒錯,連Windows防火牆都關了,防毒也關閉,但仍然不能連。
後來想了又想,把NOD32的web access protection取消,一切恢復正常。
這件事告訴我們:防毒軟體說它disable protection,不見得真的關閉所有的功能...
星期一, 九月 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匯入即可:
最後終於找到這,在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超人接了某個政府機關的案子,有台主機代管在敝公司。日前很不幸地又收到資安管理通知,這次是要求做駭客中繼站阻絕設定,設定方法如下:
首先簡化問題,不管是不是同個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]底下。
本程式提供給有此需求的朋友,版權沒有,盡管盜貼。
DNS設定步驟敝公司的DNS就是小弟在管理,因為合約關係,我不得不幫VB超人搞定這個需求。目前有348個host,若一一設定不累死我?
- 建立內部DNS(如:192.168.0.2),並且要求所有內部電腦必須透過本DNS方可查詢。
- 新增一組Domain(如:blogdns.com) ,令此網域之查詢均指向一組虛設IP(如:1.1.1.1)。不論查詢 *. blogdns.com等,均回覆前述虛設IP。
- 於防火牆設定一組阻擋該虛設IP的規則(如:reject all dst ip=1.1.1.1)。
- 重複步驟2至3,將所附之DN設定完畢。
首先簡化問題,不管是不是同個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]底下。
# 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);
本程式提供給有此需求的朋友,版權沒有,盡管盜貼。
星期五, 九月 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應該編不過吧...)
美麗的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應該編不過吧...)
標籤:
Programming
Blogger修好了
星期三, 九月 03, 2008
星期二, 八月 26, 2008
無責任美食(六)[又見莎莎公主]
星期五, 八月 22, 2008
勿隨意轉貼
鳥毅今天收到同事轉寄就醬的同事這篇,搜尋後赫然發現一堆轉貼,完全沒註明出處,而且google還排在前面(就醬小姐,請別難過)。
雖然很多好的轉寄文章,出處都沉沒於網海之中,但此例是轉貼前連搜都沒搜。事實上,就醬小姐有標明:
請尊重別人的著作,勿隨意轉貼、轉寄。(鳥毅轉寄Q大的好文時,都有注明出處...)
雖然很多好的轉寄文章,出處都沉沒於網海之中,但此例是轉貼前連搜都沒搜。事實上,就醬小姐有標明:
本站圖文版權皆屬『就醬的營養午餐』所有。未經授權,請勿轉載、節錄、引用或其他足以侵害本站權利之行為。
2008/05/12 成立
請尊重別人的著作,勿隨意轉貼、轉寄。(鳥毅轉寄Q大的好文時,都有注明出處...)
星期三, 八月 20, 2008
求救啟事 (已解決)
本站公告
雖然最近沒什麼時間也沒心情寫程式,不過我會將所有空閒時間用於Blogger Data API或是我利用Blogger Backup將整個Blog備份並轉移系統完成為止,將不再寫有營養的內容。
Update:已經先將舊文備份為atom xml格式,但仍有50篇左右亂碼,接下去就是要寫程式轉成MT格式匯到其他系統。
Update:已經先將舊文備份為atom xml格式,但仍有50篇左右亂碼,接下去就是要寫程式轉成MT格式匯到其他系統。
訂閱:
文章 (Atom)




