小說是迷人的

有幸在2010/9/13日去聽了一場李家同教授的演講,演講的題目很輕鬆:我喜愛的書和與電影。

聽了之後有些心得,李家同教授說談的書是小說,我自己看的小說不多,以前喜歡看日本幕府系列,像是織田信長、武田信玄、上杉謙信…,還有的我們自己中國古代的故事,像是水滸傳、三國誌…,在高中時還喜歡一位「高陽」作者系列的書,不過金庸、古龍之類,我倒是沒看過。

李家同教授所談所講都是外國作品居多,不管是小說或是電影,他點破了一個很重要的點,外國這是作品都是「想像力」無窮,東方作者的作品都是比較寫實,我想除了西遊記、聊齊這些神鬼之類比較有加入想像力,其他都是依歷史來改寫。但反觀外國作品,無中生有且精彩絕倫有不少,「魔戒」(我只有看電影)不過就是個戒子,一個戒子就可以寫出這怎精彩的作品,像哈利波特也是充滿想像力。

李家同教授講話很直,或許是身份的關係,講的在直你也不會生氣,一笑置之。

後來我細想之,我發現我身邊朋友或認識的一些「聰明人」都很喜歡看這類小說,而且也是這種外國充滿故事性、想像力的小說,我想是否可能是他們習慣受這種想像力的攻擊,所以腦袋比別人靈活,想法比別人看得更開?

李家同教授都說新竹是全台灣最無聊的地方(大家笑的很開心),因為都在賣命工作,我跟我自己說,好吧,我要移出一點時間來進入小說的世界,現在小孩還小,看電影根本不可能,我家裡還有去年抽獎得到的電影票,看看小說還行,這是我的決定。

中秋節時,去婆婆大哥家裡烤肉,無意間看到桌上有一本「暮光之城」的小說,這本也是當紅炸子雞,看了幾頁剛好大哥出現,就跟他聊了一下李家同教授演講的事及想看小說的事,大哥就說你等等,然後進去房間拿一套書出來,一套五本,書名是「波西.傑克森」,大哥說他是先看電影覺得很不錯,然後知道電影是小說改編,所以就接著去買小說來看,而且電影與小說差異很大,所以大哥說這等於看了六集,這套先借給我看。

呼!第一集「神火之賊」看完了,只要不用照顧小孩的時間,通通在看小說,這感覺還不錯,故事連續性不錯,先感謝婆婆讓我可以偷閒一下。看時的感覺是:這一頁看完不翻下一頁會很痛苦,會希望能一次就把書看完。

最後我從李家同教授那裡有抄到一些書單及電影清單,他說基本上都他的書《我最愛的40本書》《李伯伯最愛的48個電影故事》裡面。

我最愛的40本書:
甲:世界文學
一、真相只有一個
1.《一個都不留》阿嘉莎.克莉絲蒂
2.《白馬酒館》阿嘉莎.克莉絲蒂
3.《三口棺材》約翰.狄克森.卡爾
4.《Y的悲劇》艾勒里.昆恩
二、科幻預見未來
5.《科學怪人》瑪麗.雪萊
6.《隱形人》H.G.威爾斯
7.《化身博士》史蒂文生
8.《美麗新世界》阿道斯.赫胥黎
9.《華氏四五一度》雷.布萊貝利
三、時代交響曲
10.《基度山恩仇記》大仲馬
11.《雙城記》狄更斯
四、海洋冒險傳奇
12.《白鯨記》梅爾維爾
13.《海狼》傑克.倫敦
14.《老人與海》海明威
五、底層的吶喊
15.《悲慘世界》雨果
16.《憤怒的葡萄》約翰.史坦貝克
17.《人鼠之間》約翰.史坦貝克
18.《大地》賽珍珠
19.《推銷員之死》亞瑟.密勒
六、政治的荒謬
20.《動物農莊》喬治.歐威爾
21.《一九八四》喬治.歐威爾
七、夢與希望
22.《小氣財神》狄更斯
23.《人為什麼而活》托爾斯泰
24.《大地之歌》吉米.哈利
八、毀滅與死亡
25.《西線無戰事》雷馬克
26.《蒼蠅王》威廉.高汀
九、生命的信仰與力量
27.《高爾基短篇傑作選》高爾基
28.《權力與榮耀》葛蘭姆.葛林
29.《深河》遠藤周作
30.《瘋子.教授.大字典》賽門.溫契斯特
31.《最後14堂星期二的課》米奇.艾爾邦
乙:華文創作
十、古典章回話英雄
32.《水滸傳》施耐庵
33.《三國演義》羅貫中
十一、遙遠卻真實的故事
34.《城南舊事》林海音
35.《兒子的大玩偶》黃春明
36.《臺北人》白先勇
37.《棋王.樹王.孩子王》鍾阿城
十二、文化大旅行
38.《山居筆記》余秋雨
十三、從科學中思考人文
39.《電學之父-法拉第的故事》張文亮
十四、詩中有禪意
40.《十三朵白菊花》周夢蝶

5/40,《基度山恩仇記》、《老人與海》、《水滸傳》、《三國演義》、《山居筆記》,這40本裡我看過4本,山居筆記…我高中班導師說等有點年紀在看感覺會不一樣,所以這本書我從高中就買來放,到現在還沒有看,應該會利用一些時間看完它。

別外網友整理的Link我覺得不錯,如果你想買上面的書來看,點進去就能知道能不能購買。

李伯伯最愛的48個電影故事:
輯1 生命中的希望與失望
《單車失竊記》∕維多里奧.狄西嘉
《美麗待續》∕萊斯哈爾.史卓姆
《美麗人生》∕羅貝多.貝尼尼
《蝴蝶夢》∕阿爾弗雷德.希區考克
輯2 經典的文學鉅作,百看不厭
《戰爭與和平》∕金.維多
《齊瓦哥醫生》∕大衛.連
《亂世佳人》∕維克托.弗萊明
《白鯨記》∕約翰.休斯頓
輯3 唯有藝術是恆久遠
《紅色小提琴》∕法朗索.吉哈德
《珍妮的畫像》∕威廉.迪亞特爾
《狂想曲》∕查爾斯.維多
《一曲相思未了情》∕查爾斯.維多、喬治.丘克
輯4 撼動人心的傳記電影
《阿拉伯的勞倫斯》∕大衛.連
《居禮夫人》∕馬文.李洛
《威爾第之曲和淚》∕拉斐爾.馬塔拉佐
輯5 戰爭下的荒謬、毀滅與死亡
《海濱》∕史坦利.克雷默
《浩劫後》∕尼古拉斯.梅耶
《奇幻核子戰》∕薛尼.盧梅
《蒼蠅王》∕哈瑞.胡克
輯6 永遠的美麗回憶
《羅馬假期》∕威廉.惠勒
《翠翠》∕嚴俊
《北非諜影》∕麥考.寇帝斯
《似曾相識》∕吉諾.史瓦克
輯7 真相終究會大白
《東方快車謀殺案》∕薛尼.盧梅
《電話謀殺案》∕阿爾弗雷德.希區考克
《意亂情迷》∕阿爾弗雷德.希區考克
《後窗》∕阿爾弗雷德.希區考克
《偵探》∕約瑟夫L.曼凱維茲
《斷頭谷》∕提姆.波頓
輯8 大時代的史詩巨人
《末代皇帝》∕柏納多.貝托魯奇
《良相佐國》∕弗雷德.金尼曼
輯9 人性的光輝與美麗
《原野百合花》∕拉爾夫.納爾遜
《芭比的盛宴》∕卡柏爾.亞瑟
輯10 司法的正義與真理
《十二怒漢》∕薛尼.盧梅
《費城》∕強納森.德米
輯11 家的呼喚與親情
《那山那人那狗》∕霍建起
《鹿苑長春》∕克萊倫斯.布朗
《中央車站》∕華特.薩勒斯
輯12 永不放棄的奮鬥精神
《一個都不能少》∕張藝謀
《極地長征》∕法蘭克.馬歇爾
《孤雛淚》∕卡洛.李德
輯13 跨越障礙的忘年之交
《心靈訪客》∕葛斯.范桑
《天涯一孤雛》∕彼德.柯林森
輯14 誘惑當前的考驗與掙扎
《破綻》∕葛瑞格利.霍布里
《瘋狂世界》∕史坦利.克雷默
《大紅燈籠高高掛》∕張藝謀
輯15 世界冒險傳奇
《環遊世界八十天》∕麥可.安德森
《波特萊爾的冒險》∕布萊德.希伯林

如果你看過李家同教授的書,你會發現裡面有這些小說與電影的影子在裡面,歡迎來到小說的世界!

為什麼你建議我用正版軟體

好友要買電腦,本來是請我幫忙組裝,但我建議他買品牌電腦,在一些與他的討論及建議後,他突然問我一句:「為什麼你建議我用正版軟體?」

我回他說:「有80%以上,我都找得到替代性軟體,而且這些軟體絕大多數還是免費的。」能使用免費又正版的軟體,為何不用,為何要去用盜版的呢?

善用科技的力量--MP5

我覺得這個時代最棒的就是科技。

我的大女兒好學。
她小時候白天是保母帶,真正相處的時間只有晚上的一些些時間,每天晚上我都會利用散步的時間教她一些東西,慢慢的發現她的學習能力很強、非常強、超級強,一些時間過後,我就快被吸乾了。

我慢慢改用數位的方式,我將一些平常放給她聽的CD轉為*.mp3檔,然後存在手機裡,散步時就放給她聽,跟她一起學習,但手機當成播放器,還是很不方便?

在車用方面,我們有很大的一段時間很在車上,在車上用手機播放又很怪,好好的音響不用,用手機?另一面,我的車是六片CD的音響,有支援AUX,所以可以外接播放器,有用過iPod mini 4G,是買車時送的,用沒二年電池就壞了,賴的去修,也不想花錢去修!但我又不想一直換CD片,所以又興起了買MP3 Player的思頭!

在Survey的過程,不斷被這些廠商給搞的「貪念大起」,看看MP3、又有一種東西稱「MP4」就看看吧,看看MP4,怎麼又有一種稱「MP5」,看完之後根本就不想買MP3 Player,誰想買MP3、MP4那種爛東西(我心已獻給魔鬼),日思夜想我的MP5!

MP5有幾大元素組成

  • 數位影片播放*
  • 數位音樂播放*
  • 數位錄音筆*
  • 數位電視
  • 數位相機
  • FM收音機
  • 圖片瀏覽(或仿電子相簿)*
  • 電子書 *
  • 可擴充TF Card*
*為主要規格

我綜合起來就是去除手機功能的影音播放器,多工一體,規格差異都是影片解析度、Monitor的大小、功能多少,像是數位電視、數位相機、FM收音機就在較少機種上才有,但在影片解析度是目前MP5的重點。

另一個重點是「電子書」,電子書吵的很紅,但當我看到MP5電子書的內容是…快笑掉大牙…*.txt,是的「純文字檔」,在一個Monitor上看純文字檔叫作「電子書」,害我還很高興的心想:「什麼,買台MP5就有電子書的功能了!!!」,而且還不是全部都支援Unicode編碼。(註:只有一家可以看PDF,還不是100%可以看!)

這個*.txt電子書,各位看看就好,怎麼不內建個opera瀏覽器,最少透過HTML還能圖文並茂,都已經什麼時候了,還*.txt。

我到賣場看,目前MP5能見的產品不多,網路上選擇很多,許多都規格開的很好,而且價格便宜,後來才知道這些都是白牌機,難怪會規格開的很高又便宜,後來考慮了許久,還是以品牌的MP5為主,白牌還是少碰為妙。


我考慮的型號


我最後選擇兩家:人因與Garmma。

Garmma
Garmma G70:無數位電視、數位相機,其他該有的都有。
Garmma G80:觸控Monitor,不過缺貨中。

人因:
DeeJay 703:無數位電視、數位相機、FM收音機,但重點是支援PDF。
DeeJay 903:無數位電視、數位相機、FM收音機,但重點是支援PDF。

費用:
G70  $3000
G80  $3500
DJ 703 $4000
DJ 903 $5000

因為網路的照片都很美,我想看看實體,所以去了趟順發、Nova、燦坤,不過在去賣場了解實機過程,了解了一件很重要的事,就是這些MP5的電池都是綁死在設備中,好聽是專用電池,難聽就是還要再賺一手,無法像手機一樣的方便更換,沒電就是沒電,只有充了電它才是一台MP5,跟我之前那台iPod mini一樣,這讓我很傷心,讓我心中的小惡魔被殺了不少,這方便各位要有心理準備。

購買機種

最後,我會購買那種機種?我還不知道!G80性價比不錯,但買不到;DJ903 7"+PDF很吸引我,但高貴又貴;所以最後應該會是G70與DJ 703二選一也不一定,等等看會不會有開箱文,搞不好最後還是買台MP3 Player!@_@

ps..我有寫信去人因問換電池的費用,看它會不會回我,再列入考慮。
ps..我想我會在順發購買,因為他有推出「加一些費用」,可以延長1~3年的保固,但不包含「電池」,電池是耗材,全新也才保固三個月!但如果我加長3年連原廠1年,就有4年的保固,這讓我很心動。

[註]
Q:自己想買東西,與「善用科技」有什麼關係,跟你「女兒」有什麼關係?
A:標題已打,我懶的改。我怎麼知道最後打出來是這個樣子!

MSDN文件庫排版大亂

這是最近的事,使用MSDN文件庫,有時文件庫「首頁」還正常,進到下層就整個排版大亂,後來試了好久,只有選擇「輕量型」及「ScriptFree」能正常顯示,只要使用「傳統」就會排版大亂!

我使用了IE8,FF3.6,G6都一樣,所以很認真懷疑是MSDN本身的問題。

kkbruce部落格上面巡覽URL被Blocked


怎麼了,我最近跟「封鎖」特別有緣,連部落格都出事,但也奇怪,它只封鎖了上方那個有登入的URL,內容還是可以正常瀏覽。我關閉了防毒,使用了IE、FF、G三家瀏覽器,全都一樣的,還好我有留後門,還是可以進來,只是搞不清楚「它」為什麼被封鎖!

TrendMicro之誤判事件

公司越大,責任越大,因為我們相信你越大。

今天從早上約10點多,防毒系統開始出現一堆怪怪的錯誤訊息, 防毒擋下了一些可疑程式,但用力一看,怎麼是防毒自己擋自己!再來的工作慢慢的越來越不正常,連開個IE也擋,這是在學「Macfee誤刪事件」嗎?

雖然不是誤刪那麼嚴重,但還是很不舒服!以下是部分Log:

1285034573;2;8;1;010;;0;C:\Program Files\Trend Micro\BM\TMBMSRV.exe
1285034575;2;4;0;F0FFEE0C-9DAE-4AD1-9EEE-0BA8AA654231;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\TSC Status\VirusCount
1285037746;2;1;0;006;;0;C:\Program Files\Internet Explorer\iexplore.exe
1285038229;2;4;0;B18EECA6-4400-4DB6-9E0C-BD6ECE523FBD;;1;HKLM\SOFTWARE\TrendMicro\NSC\TmProxy\WhiteList\UseWhiteList
1285038229;2;4;0;B18EECA6-4400-4DB6-9E0C-BD6ECE523FBD;;1;HKLM\SOFTWARE\TrendMicro\NSC\TmProxy\WhiteList\Option
1285038257;2;4;0;007;;1;HKLM\SYSTEM\CurrentControlSet\Services\TmFilter\CurrentPatternName
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_globally_disabled
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_server_in_setting
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_server_out_setting
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_addr_cnt
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_addr0
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_plcy0
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_priv0
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_addr1
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_plcy1
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_priv1
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_addr2
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_plcy2
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\PFW\info_priv2
1285038260;2;4;0;F78F3AE0-3FBE-45D5-AF76-E16B4D80C7DD;;1;HKLM\SOFTWARE\TrendMicro\PC-cillinNTCorp\CurrentVersion\AoS\AoSNum
難到TrendMicro不搞防毒了,換成搞製毒,自己封鎖自己,好笑+搖頭!先卸載防毒,再看看有什麼新聞吧!

HP DL360 G5 NC373i Driver

上週末一台HP DL360 G5伺服器斷線,這種情況不是第一次,但是請人機房到本機查看,系統運作是正常,基本上都是做「重開」動作就能回到正常。但這一次更怪,斷線後數十分鐘後又自動連線了,怪怪!

要不就是「硬體」有問題,要不就是「軟體」有問題,伺服器等級硬體花費甚大,所以當然先從軟體下手,到HP原廠網站下載,我們NIC是「NC373i Multifunction Gigabit Server Adapter」,一般是下載最新版,然後安裝或更新,目前最新版本是「5.2.22.0」,沒裝沒事,裝沒整個NIC連運作都有問題,上週五(9/17)與同事搞了一天,實在沒辦法,怎麼裝都不work!最後沒辦法,只好先買一張USB網卡,先裝上讓伺服器能運作再說。

今天上班第一件事,當然是處理這個問題,經過不過重覆測試終於測試出來,它必須「有順序」的升級,首須先安裝「4.6.16.0」版本,然後才能升級「5.2.22.0」版本。

這部份我覺得提供者處理的不是很好,如果在升級部份有以上的情況必須應該在網頁上特別註明,害我們花了好多時間,所有人都覺得奇怪,怎麼連原廠下載的Driver安裝都出問題!讓我對HP的觀感減了許多分。

繼承Inherit、介面Interface的使用時機及建議

類別繼承Inherit建議

類別階層就是抽象類別及實作類別所建構出來的Class Tree:
  • 類別階層由上至下的定義應該是由廣義進入狹義;
    例如:動物Animal --> 貓Cat、狗Dog…!
  • 宣告型別時最好保留彈性;
    例如:薪水,現在的薪水應該只有整數,但為了保險起見,使用浮點數型別也不無不可!
  • 審慎設定成員的存取層級;
    例如:姓名、郵件給所有類別存取,就設定Public,但薪資應該是要保密,就設定Private,獎金計算可能在不同部門的類別有不同的計算方式,可就設定為Protected。

繼承Inherit使用時機

  • 衍生類別應該隸屬於父類別的一種,而不是有關聯;
  • 重複架構的程式碼不斷出現,使用繼承可以提高程式的重複使用性;
  • 繼承建議在六層之內,以免程式太複雜;

介面Interface使用時機

  • 如果兩個類別之間只存在著某些關係
  • 需要將宣告與實作分開;
    使用Inherit,我們修改父類別的程式碼,可能導致衍生類別的程式碼錯誤;相反的,Interface在宣告成員沒有改變之下,我們可以任意改變各個成員的實作,而不會互相影響。
  • 需要多重繼承時;
    一個類別只能Inherit一個父類別,但一個類別可以繼承多個Interface。
  • 特別情況;
    例如:結構不能類承自類別,但可以實作介面。

大話設計Visual Basic範例--Appendix A訓練實習生--物件導向基礎

我個人很喜歡「大話設計」這本書,因為讀起來不會無聊,另外一本是「深入淺出設計模式」,大話設計這本書以小說方式來說很硬的話題,深入淺出設計模式這一本是圖多有趣,也是不錯的參考書,深入淺出設計模式這本書已經有人將程式碼轉成Visual Basic版本,你可以到CodePlex下載

我覺得這些作者最厲害的地方是,要用很簡單很簡單的例子,來說明很複雜很複雜的內容,所以我覺得看起來很爽,雖然看完了還不知道會不會用,但就設計模式本身能有更深一層的了解,又不會看了就怕,看了就想睡,失眠的夜(就是現在)還可以拿出來看一看。

進入設計模式之前,物件導向的基礎非常重要,沒有物件導向的基礎千萬不要看設計模式相關的書,那與你無關,看了也只有傷腦、傷神、傷心、外加傷身體,所以我先從最後面附A的程式碼先轉為Visual Basic。

每一個範例都為專案,例如「A.2 類別與實體」依照程式修改、重構的步驟,我新增了A2-1、A2-2、A2-3三個專案,你可以參考專案內的相關檔案,需要注意的地方,我在加上了註解,你可從註解加上書本來了解。

你可以從CodePlex下載到附A所有章節Visual Basic的範例程式碼檔

在範例中第A14節,委派及事件,在C#及Visual Basic語法及處理上,差異比較大些,這部份找時間,我在補上來,如果附A對你來說沒什麼問題,那差不多就可以開始學習物件導向的設計模式。

Coderun -- 免費雲端ASP.NET(C#),JavaScript,PHP的IDE

剛剛看到一個好物:Coderun

它是一個線上跨平台開發工具,你能使用它來開發C#/.NET (3.5)、PHP (5.1)、JavaScript(jQuery…)、HTML、CSS。. C#支援ASP.NET, WCF, Silverlight 、WPF 灠覽器應用程式。資料庫支援SQL Server 2005、Amazon SimpleDB。

在開發時,Coderun還支援語法自動完成、錯誤提示…等等功能;還可以直接線上測試。CodeRun是個強大雲端開發工具,但目前只有還沒有支援我最愛的Visual Basic。

如果你是學習C#、PHP,或是寫Javascript之類Framework,又不想花錢買DW、VS,目前Coderun還是免費,是個不錯的選擇,它免安裝,只要使用Browser馬上可以使用,不過它運作速度不是太快,不過和它的功能相比,我認為可以接受。

另外在首頁-->Online Code Search,有一些人家寫好的測試專案,可以參考及學習人家的程式碼,裡面有一些很不錯的作品,也建議大家看看。

一個很棒的雲端產品(雲端是Cdoerun自己說的)。

InstallShield 2010/2011教學資訊

在Visual Studio 2010中加入了InstallShield的支援,如果你有下載及註冊,InstallShield後續也提供一些資訊,例如21天試用版本的InstallShield 2011 Premier,後來我還收到台灣代理商的信,信裡面提供了一段教學網址,我看了一下覺得不錯,分享給大家,如果你對InstallShield有興趣,這段教學是不錯的入門。


InstallShield 2010入門教學

註:我們公司一些國外軟體,都是跟他們買的。

我的免費上網安全防護

家裡不像公司,能省則省,同事問我相關問題,記錄分享我的免費上網安全防護。
  1. 免費
  2. 上網
  3. 安全

免費防毒 -- Avast

我的組合很簡單,一是免費的防毒軟體,我習慣使用Avast,可以保護基本病毒,但現在絕大部分的功擊都來自網路,而且又是以「網站」來的攻擊最多,已經不是以「檔案」型的病毒來攻擊,但絕大多數免費版防毒軟體,在網站攻擊防護功能都是列為收費,所以我們必須要加強這一段。


上網 -- Firefox or Chrome

由IE改使用Firefox或Google Chrome。IE為市佔率第一,被攻擊機率也是第一,小眾有小眾的好處,除了測試必要,我已經很少很少很少開IE了。

安全

由於免費防毒不能幫我們防護上網或網站的安全,所以我們還是加強這一段,我選擇使用WOT, 它可以幫你過濾你所要連線的網址是否安全,不安全的網址,它會幫你檔下來,而且WOT提供了絕大多數主流瀏覽器的支援,所以使用Firefox+WOT、Chrome+WOT…是不錯的組合。

以上由防毒、減少被攻擊、網址過濾三個方向來加強我的上網安全性。當然,如果經費夠還是買一套付費版的最快。

集合與泛型對應

整理一下集合型別對應的泛型型別:

集合型別對應泛型型別

集合型別泛型型別
ArrayListList(Of T)
QueueQueue(Of T)
StackStack(Of T)
HashtableDictionary(Of TKey, TValue)
SortedListSortedList(Of T)
ListDictionaryDictionary(Of TKey, TValue)
HybridDictionaryDictionary(Of TKey, TValue)
OrderedDictionaryDictionary(Of TKey, TValue)
NameValueCollectionDictionary(Of TKey, TValue)
DictionaryEntryKeyValuePair(Of T)
StringCollectionList(Of T)
StringDictionaryDictionary(Of TKey, TValue)
N/ALinkedList(Of T)

基本上是能使用泛型型別就盡量使用泛型型別,我覺得使用集合或泛型比較難的是,什麼時候要使用那一個集合或那一個泛型,這可能就需要實務與經驗。

集合

集合型別說明
ArrayList使用大小會視需要動態增加的陣列,實作 IList 介面。
Queue表示物件的先進先出 (FIFO) 集合。
Stack表示簡單之物件的後進先出 (Last-In First-Out,LIFO) 非泛型集合。
Hashtable表示根據索引鍵的雜湊程式碼組織而成的索引鍵/值組集合。
SortedList表示索引鍵/值組配對的集合,這個集合按索引鍵排序,而且可以按索引鍵和索引存取。
ListDictionary使用單向連結串列 (Singly-Linked List) 實作 IDictionary。建議的集合通常會包含 10 個以下的項目。
HybridDictionary若為小型集合,則使用 ListDictionary 實作 IDictionary,在它成為大型集合時,切換為 Hashtable。
OrderedDictionary表示可依索引鍵或索引存取的索引鍵/值組集合。
NameValueCollection表示相關 String 索引鍵和 String 值的集合,而這些可以利用索引鍵或索引來存取。
DictionaryEntry定義可設定或擷取的字典索引鍵/值組配對。
StringCollection表示字串的集合。
StringDictionary使用強型別索引鍵和值,將雜湊資料表實作為字串,而非物件。

泛型

泛型型別說明
List(Of T)表示可以依照索引存取的強型別物件清單。提供搜尋、排序和管理清單的方法。
Queue(Of T)Queue(Of T)
Stack(Of T)表示相同任意型別之執行個體的可變大小的後進先出 (Last-In First-Out,LIFO) 集合。
Dictionary(Of TKey, TValue)表示索引鍵和值的集合。
SortedDictionary(Of TKey, TValue)表示根據索引鍵,所排序的索引鍵/值組集合。
SortedList(Of TKey, TValue)表示根據關聯的 IComparer<(Of <(T>)>) 實作,依索引鍵所排序的索引鍵/值組集合。
KeyValuePair(Of TKey,TValue)定義可設定或擷取的索引鍵/值組。
LinkedList(Of T)表示雙向連結串列 (Doubly-Linked List)。

集合與泛型之日常生活範例

突然靈光一閃,有通的感覺。

剛接觸「泛型」時,實在看不懂、聽不通,但接擉時間久一些,才慢慢了解「泛型」原來如此。一般在談到泛型之前都會先談集合,談完集合在談泛型。使用一樣的過程,我想用一些生活中的範例來舉例,讓大家更了解什麼是泛型。

我們生活上有很多「集合」名詞,例如:「人」、「鳥」、「動物」、「植物」、「昆蟲」、「魚」…等,以英文來解釋集合名詞:「一群相似也相關的個體結合而成的集合體,稱為集合名詞。」

例如:

  • 「人」有:男人、女人、白種人、黃種人、黑人、大人、小孩、老人…這些都都稱為「人」,所以人是一個集合名詞。
  • 「鳥」:依網路查詢的結果,全世界鳥的種類有9000多種,但我們可以通稱這9000多種的鳥類為「鳥」,什麼鳥?不知道!但我知道它是鳥。
所以程式上的集合也是用這樣的觀念來進行。

假設有一天我們要開一間溫泉旅館,但溫泉分男湯、女湯,這時候你就不能用集合的觀念來操作,不能說你是人,所以要進去女湯,也一樣不能說妳是人,所以要進去男湯,這時候就必須以更明確分類,來分類這個集合。只有男人的集合,可以進去男湯,女人的集合,可以進去女湯,男人可以是大人、老人、小孩、白種人、黃種人、黑人…只要是男人;女人同義。

用這樣的思考來想泛型,應該就能想通了,我可以這樣使用泛型:

Dim man As New ArrayList(Of SuperMan)()

我希望這個泛型集合不只是男人,而且是「男人中的男人」。

或是我們這樣說:

  • 集合:較無限制。
  • 泛型:有限制性。
「人」的集合,管你什麼人,活的、死的…通通可以包進來。但如果我經營「葬儀社」,很明顯,我要的集合只有一種,有呼吸的我都不要,沒呼吸的我都想要,這時候就是泛型出馬,把沒呼吸通通包進來,而不是「人」我都想要,泛型就可以解決我的問題。

泛型型別效率測試

在接觸物件(Object)觀念後,都會談到boxing及unboxing的動作,以Visual Basic來說,就是像使用CType()來轉換型別的動作,而且大多數都會談到boxing及unboxing會影響效能,所以都會建議盡量使用「泛型型別」。

不過經過以下測試後,效率應該不能說是使用泛型型別的理由!理由應該是「安全型別」,就像我們常看到的舉例:ArrayList及ArrayList(Of T)、IList或IList(Of T),也就是說ArrayList、IList是個什麼型別都可以包含進去的陣列。假設我程式是在做數值運算,但你放了一個「Hello World!」ArrayList、IList是接受的,這稱「不安全型別」。

而ArrayList(Of T)與IList(Of T)就不同,在宣告時可以指定任意型別給ArrayList(Of T)與IList(Of T),也就是那個T,例如:ArrayList(Of Integer)、IList(Of String),這樣宣告之後,當你在使用時,Visual Studio會自動幫你除錯,不用等到建置之後再來除錯,例如你在ArrayList放了一個「Hello World!」的字串,但ArrayList的宣告只能放Integer,所以或Visual Studio都能很明確找出問題!

泛型型別 V.S 非泛型型別


以下使用主控台應用程式測試:
  1. 新增「主控台應用程式」
  2. 新增一個類別,使用Object來進行處理
  3. 新增一個類別,使用泛型來進行處理
  4. 在主控台應用程式撰寫測試程式碼

測試環境

軟體:
  • XP SP3
  • Visual Studio 2008
  • .Net Framework 2 (3.5 SP1)
硬體:
  • CPU:賽揚 2.0
  • RAM:2 GB
ps:我的家中的硬體算舊且效能平平,都測不出有很大的差異,如果硬體新一點,我看差異更小。

類別Obj(使用Object)

Public Class Obj
    Public _v1 As Object
    Public _v2 As Object
    Public Sub New(ByVal v1 As Object, ByVal v2 As Object)
        _v1 = v1
        _v2 = v2
    End Sub
End Class

類別Gen(使用泛型)

Module Module1

    Sub Main()
        Dim i As Integer = 0
        Dim v1 As String
        Dim v2 As String

        ' st:Star Time
        Dim st As DateTime = Now
        ' boxing、unboxing1百萬次,兩個數變共2百萬次
        For i = 0 To 1000000
            Dim oa As New Obj(1, 2)
            v1 = CType(oa._v1, String)
            v2 = CType(oa._v2, String)
        Next
        'et:End Time
        Dim et As DateTime = Now

        Console.WriteLine("Obj1:{0}", (et - st).ToString)


        st = Now
        ' 泛型型別1百萬次,兩個數變共2百萬次
        For i = 0 To 1000000
            Dim ga As New Gen(Of String, String)("1", "2")
            v1 = ga._v1
            v2 = ga._v2
        Next
        et = Now

        Console.WriteLine("Gen1:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 2000000
            Dim oa As New Obj(1, 2)
            v1 = CType(oa._v1, String)
            v2 = CType(oa._v2, String)
        Next
        et = Now

        Console.WriteLine("Obj2:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 2000000
            Dim ga As New Gen(Of String, String)("1", "2")
            v1 = ga._v1
            v2 = ga._v2
        Next
        et = Now

        Console.WriteLine("Gen2:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 3000000
            Dim oa As New Obj(1, 2)
            v1 = CType(oa._v1, String)
            v2 = CType(oa._v2, String)
        Next
        et = Now

        Console.WriteLine("Obj3:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 3000000
            Dim ga As New Gen(Of String, String)("1", "2")
            v1 = ga._v1
            v2 = ga._v2
        Next
        et = Now

        Console.WriteLine("Gen3:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 4000000
            Dim oa As New Obj(1, 2)
            v1 = CType(oa._v1, String)
            v2 = CType(oa._v2, String)
        Next
        et = Now

        Console.WriteLine("Obj4:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 4000000
            Dim ga As New Gen(Of String, String)("1", "2!")
            v1 = ga._v1
            v2 = ga._v2
        Next
        et = Now

        Console.WriteLine("Gen4:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 5000000
            Dim oa As New Obj(1, 2)
            v1 = CType(oa._v1, String)
            v2 = CType(oa._v2, String)
        Next
        et = Now

        Console.WriteLine("Obj5:{0}", (et - st).ToString)

        st = Now
        For i = 0 To 5000000
            Dim ga As New Gen(Of String, String)("1", "2!")
            v1 = ga._v1
            v2 = ga._v2
        Next
        et = Now

        Console.WriteLine("Gen5:{0}", (et - st).ToString)
    End Sub

End Module

測試數據


Obj1:00:00:01.7968750
Gen1:00:00:00.1562500
Obj2:00:00:03.7343750
Gen2:00:00:00.2812500
Obj3:00:00:05.5000000
Gen3:00:00:00.4218750
Obj4:00:00:07.2968750
Gen4:00:00:00.5468750
Obj5:00:00:09.1093750
Gen5:00:00:00.6875000

我們以最後那個5百萬次的測試來看,中間有兩個變數,所以共進行了一千萬次,很明顯的,泛型型別的效率比需boxing、unboxing的效率快很多倍,但也看的出來.Net Framework在型別處理上是「非常快速」。

結論


我想很少有一支程式必須進行一千萬次的boxing與unboxing,平常的影響連可能連0.1秒都不到。數據證明一切,泛型能提供的率效是高於一般非泛型的多倍,但此差距只有在非常大量(千萬次以上)才明顯,但泛型能帶來型別安全才是我們主要考量因素。

將陣列指示項放在變數上,不要放在型別上之討論

在前一篇「MSDN的範例程式碼不見了」談到了一個小主題是「將陣列指示項放在變數上,不要放在型別」算是解了我一個Visual Basic上的疑問。但今天在寫一段程式碼時出現問題,讓我把這個「陣列指示項」完全搞清楚了。

' 宣告a是一個String陣列
Dim a As String()
' 宣告b是一個String陣列
Dim b() As String

以上是兩種宣告陣列的方法,在Visual Basic正式的用法是下方「變數b()」,「將陣列指示項放在變數上」方法。

ArrayList

但在寫一段程式碼時:
'Dim coll As New ArrayList()
Dim coll() As New ArrayList

很直覺的把第一行的程式碼改為第二行,但改了第二行後,程式都還沒執行Visual Studio就已經提示有問題:

修改陣列指示項
奇怪,MSDN的建議馬上破功,到底是怎麼回事?在反覆查資料及思考後,終於看到關鍵點了「ArrayList 建構函式」:

ArrayList() 建構函式
原來ArrayList()不是陣列,而是Sub New()無參數建構式,也就是說原始第一行「Dim coll As New ArrayList()」建立一個型別ArrayList的coll的Instance並初始化,那個最後的()不是陣列的意思,而是初始化。

再舉個例子,我們常用的System.Data.SqlClient中,常使用的SqlCommand類別也有一個無參數建構式:

' SqlConnection() 無參數建構式
' SqlConnection() 無參數建構式
Dim conn As New SqlConnection()
conn.ConnectionString = "..."

' SqlCommand() 無參數建構式
Dim cmd As New SqlCommand()
cmd.Connection = conn
)

我們不一定要一開始就使用帶參數建構式,也能先使用無參數的建構式,後面再來設定各參數或屬性。我們在設定無參數建構式時,不一定要在最後面使用(),但使用()是比較嚴僅的方法,例如使用ToString,你可以直接使用ToString不加(),但使用ToString()是比較好的方法,因為看到()就知道這是個方法。這是一個不錯的經驗,讓我完全了解「()」在不同地方的用法,這部份在MSDN上完全沒有討論哦。

在IIS 7.x上使用ASP + Access資料庫

環境:Windows Server 2008 R2 + IIS 7.x + Access

為了測試hicloud的穩定度,把一個ASP+Access的網站放到hicloud,不過在OS及IIS上有很多必須小心的地方,不然第一個ASP跑不起來,第二個ASP+Access也跑不起來。

ODBC


你不能使用「系統管理工具」裡的ODBC,因為那是64位元版本,雖然你在「工作管理員」看到的是「odbcad32.exe」。
  1. 在64位元作業系統裡,所有32位元版本的程式,最後面都會加上「odbcad32.exe *32」,最後面那個「*.32」才是說這個是32位元程式。
  2. 在「系統管理工具」裡的ODBC是找不到MDB,只有SQL Server。
  3. 找「C:\Windows\SysWOW64」裡「odbcad32.exe」才是32位元版本的ODBC,才有辦法與Access連接。
ps:「C:\Windows\SysWOW64」裡是作業系統相關程式32位元版本集散地。

角色


IIS角色必須包含「ASP」。

站台


在ASP站台中設定「ASP」,
啟用上層路徑:True;

應用程式集區


在ASP的「應用程式集區」「進階設定」「(一般)」
啟用32位元應用程式:True

「寫入」權限


在這裡注意兩個地方的寫入權限:
  1. IIS暫存目錄
    設定「IIS_IUSRS群組」有寫入權限。
  2. Access目錄
    資料庫所在目錄,設定「IUSRS帳戶」有寫入權限。
總之,上了Windows Server 2008後,設定上麻煩許多。

參考:

    MSDN的範例程式碼不見了

    Visual Basic 編碼慣例

    好文一篇,推!

    最近覺得奇怪,自從MSDN改版後,總是有些怪怪的現象,例如TreeView改的很奇怪,但還好找到了設定,修改為「傳統式」後,就回覆原來的樣子。

    但還是一直有個疑問?

    最近有些未翻譯的文章,都會出現右邊是英文、左邊是中文排版,但內容看了一下都是出現「如下例範列…」之類的文字後,就「空白」一片,想說是否還沒寫好,因為我看設定是顯示所有Code的:

    All Code

    本來是想整理這篇文章,結果發現我「複製、貼上」時出現了「程式碼」,程式碼怎麼被「隱藏」起來了,找了許久終於找到了顯示程式碼的設定:

    語言篩選
    選擇你要的語言就會出現程式碼了,此這改版真的是抱怨多於誇獎。不過還是怪怪的,程式碼裡多了一堆<span>的Tags!真是…傻眼!

    文章中有幾項建議:
    • 善加利用區域變數的型別推斷
      請參考我的介紹:區域型別推斷
      也就是說Visual Basic很推薦使用區域型別推斷。
      但我個人認為,在必要時才使用比較好,在使用區域型別推斷會有一定的效率折扣,它還是多一道判斷型別的手續,而且在程式可讀性也不好,而且如果全使用區域型別推斷,我認為會多了一個除錯上的麻煩,如果正是型別造成的錯誤,你怎麼除錯?

    • 將陣列指示項放在變數上,不要放在型別上。
      Dim Names() as String 或 Dim Names as String(),這兩種用法我都常看到,查MSDN也查不出這兩種用法有什麼差異,我猜又是雙語的人材(VB,C#),由C#轉VB時把這樣的語法給帶進來使用,因為C#是使用「int[] array1 = new int[] { 1, 3, 5, 7, 9 };」它們是把陣列指示項放在型別上的(int[ ]的那個[ ]),雖然都可以正常運作,但有個依據總是好的,以後看到有人在Visual Basic用型別宣告陣列,就把這篇Mail給他看,然後付上一句「依MSDN上的建議…」^_^。
    • 優先使用 IsNot 關鍵字,而非 Not...Is Nothing。
    • 在執行比較時,若要略過不必要的程式碼以避免例外狀況並提升效能,請使用 AndAlso 代替 And 並使用 OrElse 代替 Or。
      這個東西很多人還不知道,而且也少有書會談這個,這是個好東西,可以讓我們在比較運算時加速我們的程式效率。
      例如:

      And:兩個都True才True,不管如何And都會等到所有結果出來才給最後結果;
      AndAlso:X AndAlso Y AndAlso Z,只要X為False,就得到結果為False,不用等Y/Z;
      Or:任一為True則True;但還是會等到所有結果出來才給最後結果;
      OrElse:X OrElse Y OrElse Z OrElse,只要X為True,就得到結果為True,不用等Y/Z;
     這篇文章還有很多很好的建議,Visual Basic的使用者細讀之。