網頁

不讀書的快樂童年--英文,我一輩子最錯誤的決定

  國小六年,人生最快的日子,尤其是最後兩年帶我們的秋妃導師,可能是剛畢業加上新手,我們是她所帶的第一屆學生,所以對我們用盡全力,而我們也與她建 立深厚的感情。六年級畢業那天,我們最後要離開校園前,全班同學大家在教室哭成一團,因為大家好愛這個老師,好捨不得離開她,她的努力我們班上的同學都知 道,其中還有一些人成為他的乾兒子。

  我還記得我畢業時,她在我的成績單上只有題上一個字:「頑」,在當時這個字已經超出了國小的範 圍,我根本就不知道這個字的意思,頑?而老師好像知道我的心事,還解釋這個字的意思。我已經忘了她怎麼解釋,但我永遠記得我是個「頑」,到高中畢業前,我 還是一直過著頑的生活,雖然有點荒廢學業,但日子我自認為還算精彩。

  畢業後的幾年,國中、高中,尤其是高中,雖然同學們都已經分東西,讀高中、讀高職…,但其本上大家都還是在宜蘭,所以很好連絡,我們在大家還沒到外地前固定教師節都會回去拜訪老師,而且那幾年的聚餐可以說是很快樂的。

   教師節(於每年9月28日,此日亦為中國古代教育先驅孔子的誕辰),原意應該是表達這一年來對老師的幸勞,讓我們表達一些敬意。還記得,每年教師節我們 都會去吃大餐,而且都是我們平常吃不起的大餐,記象中有一次是吃「鬥牛士」,重點是每次都不是我們「付錢」,想想,如果20個人,每人500 元,20*500=10000元,這個數目前十幾年前是很大一筆錢,但我們心愛的秋妃老師對我們從不吝嗇。而我們也常半開玩笑的說:「教師節原來老師要孝 順學生。」、「老師妳還希望我們明年來找妳嗎?」雖然畢業多年,也多年沒與這位令我們懷念的老師連絡,但我依然想念的這位好老師。

  說了怎麼多,跟「英文」有什麼關係?

  有,有非常大的關係,關係就是:「一個好老師與一個壞老師的故事」,好老師我說完了,接下來說壞老師,其實接下來的這位老師一點都不壞,只是個剛畢業又沒教學經驗的的菜鳥老師,使用了她認為很好的方法,但確讓我後悔一輩子。

   話說,升上國中後,第一次接觸到物理、化學、英文…的科目,那時候認為為什麼全世界最難的項目要全部集中到國中來讀,看著一堆看都看不懂的化學符號,聽 都聽的不懂的Good Morning, Mr Lin.,但我還是很認真想辦法的學。化學,我真的認為老師教得很隨便,老師還會在課室上有意無意的提示,如果想學好化學就要到他開的補習班去,因為我不 想也沒興趣搞懂化學這門課,當然是沒有去。英文,跟國小的國語一樣,老師用飛快的速度將英標教完,我只記得a、e、i、o、u,這五個是母音,其他根本不 記得,而我只好用最笨的方法,使用注音符號來代替英標,而這就是我的發音及拼音,雖然不行,但英文考起試來成績也不會太差。

  到了一年 級下學期,我們來了位剛畢業的新女英文老師。這位老師,本來是沒怎麼樣,而就在期中考時,印象中我英文考了九十幾分,結果這位年輕的女英文老師在發考試卷 時說:考九十分以上和不及格的都要打手心,當然全班聽到當然覺得這位老師是否腦袋有問題,不過他的理由很好笑,她說,這次的考試內容很簡單,考九十幾份的 這幾位同學很不小心,錯了不應該錯的地方,我相信這些內容如果你們用心檢查,應該是不會錯的,這次是讓各位記得以後要小心檢查。

  那是個「體罰」的時代,父母親希望老師打的越重越好,自己不乖、作業不寫,雖然被打過不少次,不過都沒有這一次那怎生氣,考好也被打,考不好也被打,是怎樣?而且這位求好心切的老師,對這幾位九十幾分的同學還打得特別大力,真的是讓我生氣,所以我下了一個這輩子最錯誤的決定:我不在讀英文、English。

  從那之後,不管是什麼考,大考、小考、段考、期中考、期末考…管他什麼考,反正英文就永遠是我最後一本看的,或是…就不看了。當然英文的成績一落千丈,可以這樣說,到高三我想讀書之前,我的英文層度應該還停留在abcdefghijlkmnopqrstuvwxyz,還好,26個字我還背的出來,每個「單字」我都認識,但組合起來的單字除了Good Morning、Good bye、I love you大概就沒有。

  現在長大了,想想小時候想法真的是「幼稚」,就這樣就放棄了自己應該要學習事物,就像常聽到的:「讀書是為了自己。」「為自己」這句話我到了17、18歲終於想通了,但有些東西已經失去,想去追求是要付出很大的代價。算算,從國中開始到高中畢業,前後我已經差了人家六年的程度,而且在沒有基礎的前提下要學好英文真的不容易。買書自修,我自認沒有資質,買過「基礎」、「速成」、「一定」、「不必背」、「最強」…各系列的進修書,我真的認為那些說自己是自修學好英文的作者是天才。

  多年後,我經營傳銷事業時認識了一群大學生,其中有一個女生小莉,她功課都是班上前五名,但就是英文不行,但他短期記憶超強,可以靠考前把考試內容中可以背的死背起來,我很好奇的問她,憑她的記憶力應該不可能討厭背單字這種對她來說「簡單」的事,以她的記憶力來學習英文應該是相當輕鬆的事,原因讓我心有戚戚,原因跟我一樣,她討厭那位英文老師。

  「師者:傳道,授業,解惑也。」不過還好,在我求學的階段裡,好老師多過不好的老師,面對當時的決定,現在只能嘆嘆氣,如果說這輩子到終老問我有沒有後悔的事,這絕對是我其中一件。我恨自己當時的笨。

Client/Server的個人電腦

  科技在進步,但我看不到好處。有時我認真的在想,所有科技技術的進步只是為了「利潤」,就這樣,沒了。沒有利潤一切免談,也就是「商業化」,如果有一種科技能讓你變成「超人」或是最近的電影「鋼鐵人」,但全世界只有一套,這樣的技術是沒有前景的,縱然它是高高高科技。

  目前電腦的世界又回到了x86與大型主機的世界了,怎麼說?

  目前電腦CPU已經進步到多核心(Multi-Core),而且技術成熟,以目前電腦標準配備都是雙核系列,如果你有多一點money,那四核系列也不是問題。但我真的很好奇,一般User除了打3D電玩時,那個CPU的效能什麼時候會是在100%?目前作業系統(Vista)沒有來個2GB RAM來跑,根本就是自尋死路,就我看到,加到4GB RAM也沒了不起,但我還是那句話,那個RAM什麼時候的使用率才會到100%?

  好啦,我不用那怎高的效能,所以廠商搞一個UMPC…之類,然後想出一個很棒的訴求:百美元的電腦。一台小小Monitor、小小KeyBoard的NoteBook出現了,本意是要給那些買不起電腦的人可以有另一個選擇,但實事好像也不是這樣。

  不過,我在想,個人電腦(Personal Computer, PC)已經到進步到不輸早期超級電腦的層度了,那是否可以來個回到早期Terminal的時代,每個人家中只要一台這種高檔一點的主機,然後每個人需要使用的人只要有無線Monitor+無線KeyBoard+無線Mouse(或是一個Touch Monitor),然連進主機就可以使用所有的軟硬體。

  以目前的技術,我想這樣的夢想應該是不難實現,而且也不是沒有這樣的技術,但我想說的是,這樣的內容如果能夠實現在「一般家庭」那就太完美了。印象中好象是Sum還是IBM有提出「行動辦公室」這樣的概念,但我想的是類似早期大型主機時代,所有的Client都要Terminal到Server進行作業,所有的動作都是在Server完成,Client只是顯示結果。這很像Unix-Like中XWindow裡的XServer-XClient的運作,但我也沒看到有人把這樣能力發揮到百分百。

  我的想法中,這樣的做法不但好處多多,也合乎目前最火熱的「節能減炭」的觀念。使用少數的PC為主,週邊只要是可以連線的設備,就可以連入作業,這樣不是很棒嗎!

無廢話SQL語法--SQL資料定義語言簡介

  在我們學完SELECT語法、INSERT語法、UPDATE語法、DELETE語法、函數…之後,其實它們有一個正式的名稱叫「資料操作語言(Data Manipulation Language, DML)」,簡言之,重點在「操作」兩個字,也就是說不管是SELECT、INSERT、UPDATE、DELETE就是注重資料表或資料欄位裡的資料操作。如果你有用心操作過之前的每一個例子,那你應該很清楚它們為什麼被歸類在「操作」這一項目中。

  但我們在產生這些資料庫(Data Base)、資料表(Table)、資料欄位(Field)之前,它們又是怎麼產生的呢?想想我們剛開始介紹時,我請大家安裝北風資料庫時,只是打開一個*.sql的檔案,然後按一下「F5」就完成了整個資料庫、資料表、資料欄位及欄位內的資料,都在瞬間完成,這是怎麼辨到的?這時候必須依賴SQL語法中另一種語言的幫忙,我們稱它為「資料定義語言(Data Definition Language, DLL)」,一樣,重點在「定義」兩個字,它要定義這些資料在資料庫中代表的義意。資料定義語言用來建立、改變或刪除一個資料庫物件。它只會影響資料庫物件的「結構」,不會加入、更新或刪除其中的資料。

  [CREATE | ALTER | DROP] DATABASE
  [CREATE | ALTER | DROP] TABLE
  [CREATE | ALTER | DROP] VIEW
  [CREATE | ALTER | DROP] PROCEDURE
  [CREATE | ALTER | DROP] TRIGGER
  [CREATE | ALTER | DROP] FUNCTION
  [CREATE | ALTER | DROP] INDEX

  資料定義語言的功能分為三大類,一、新增(CREATE);二、修改(ALTER);三、刪除(DROP),後面是你要作用的物件,例如你要新增一個名稱資料庫:CREATE DATABASE。

  而「操作語言」與「定義語言」的使用時機與人員各有不同,我做了以下的歸納:
  1. User <--> Interface <--> DML <--> Data Base
      使用者透過程式開發人員所撰寫的應用程式介面(Interface),然後透過DML語言來與資料庫做查詢、新增、更新、刪除資料等動作。

      例如,我們在一網站註冊會員資料,你是透過註冊網頁(Interface)來填寫資料,然後按一下「送出」,而送出就是將你的資料與DML做結合,然後送到資料庫中去執行,然後產生成功或失敗的結果,然後再反應回來一個訊息給你。

  2. Manager <--> Interface <--> DML, DDL <--> Data Base
      資料庫管理者當然也可以使用DML來進行資料相關的操作,但其實更重要的可以使用DDL來對資料庫進行結構新增、修改、刪除等動作,以進行資料庫管理及最佳化的工作。

      接上例:管理者除了可以管理註冊會員資料外,事前還要先規劃好這些資料的內容,例如:要事先定義會員註冊資料表的欄位要有那些?各個欄位的資料型別為那些?各個欄位的長度是多少?那些是必填,那些是允許空白可不填寫?那些是主鍵?那些是外來鍵?有沒有限制條件?要不要做資料庫正規化?…(很多看不懂,沒關係後面會慢慢介紹)

      也就是說,DDL的對象是「整個資料庫」規劃及異動,而DML是針對「資料庫中某個資料表」來作用。我之前有提過MySQL的管理軟體phpMyAdmin,如果你沒玩過,我建議花一點點時間玩一下,你會發現它可以把所有資料庫的管理工作完完全全的「網頁化」了,而這個phpMyAdmin就是那個管理者的Interface,我們使用的SSMSE也是。
  所以你會發現,一個好的資料庫系統管理者(Data Base Administrator, DBA)不只要學習DML,而DDL更是少不了的功夫,接下來我們一步一步介紹。

註:如果你在Windows系統下要架設PHP與MySQL環境,我建議可以使用WampServer這一套軟體,安裝、設定、使用都相當方便。

註:資料庫正規化不是DDL的一部份,但資料庫正規化後的結果就是DDL所要執行的內容,這後面會解釋。

無廢話SQL語法--3.第一大將SELECT(1)

第一大將SELECT

  為什麼SELECT是SQL語法的第一大將?SELECT的中文有「選擇、精選、上等、挑剔的」,使用在資料庫中可以這樣解釋,我們要對資料庫選擇些什麼?我們要對資料庫精選出什麼?我們要對資料庫挑剔些什麼?我們要對資料庫選出上上之選的什麼?也就是說你想從資料庫裡得到的資訊都必須經過細心思考,由SELECT來決定,或許我這樣說,如果你搞通了SELECT,你已經完成了學習SQL語法百分之九十以上的精髓,這可是一點都不誇張。

資料庫的架構

  我們以SSE中我們新增範例的Northwind來簡介一下資料庫的架構:



  每個資料庫軟體中(如SSE)可以有多個以上的資料庫同時運作,可圖中有有四個系統資料庫及兩個我們新增的資料庫同時運作服務中,每個資料庫都有一個獨立資料庫檔案,資料庫檔案可以存放在不同的磁碟位置中,例如SSE預設資料庫檔案是存放在「C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data」路徑之中,而我們在進行各種資料庫動作時,第一件事就是要指定資料庫,也就是說,當你透過資料庫管理軟體(SSMSE或ADO.NET)來與資料庫軟體溝通時,你要先跟它說,我以下的SQL語法是針對那一個資料庫來進行動作。

  我們整理一下:

  資料庫軟體:也就是資料庫本身的軟體,如SQL Server、MySQL、Oracle…。

  資料庫檔案:一個資料庫軟體內可以同時有「多個」資料庫同時運作,而每個資料庫都會對應到一個實體檔案,實體檔案存放這個資料庫內所有的資料,SSE對應的資料庫實體檔案檔名為「*.MDF」,例如Northwind.MDF,而實體檔案存放的位置,你可以使用系統預設,也可以自行決定。

  資料庫:存取資料庫檔案的一個名稱,簡單的說,就是我們要存取*.MDF時的名稱,通常就是*.MDF的主檔名,如Northwind.MDF,那資料庫名稱為:Northwind。

  我們在回到「物件總管」的圖片,你會發現在Northwind資料庫中還有其他的成員,每一個資料庫中最少會有兩個基本的資料成員,一個是「資料表(或資料表格, Table)」和「資料欄位(或資料行, Field)」。

  資料表:你就想像成跟我們一般的表格一樣,每個表格必須有個名稱,一個資料庫中可以有多個資料表,所以為了辨別出你要對資料庫中的那個資料表做存入或取出動作,在資料庫中必須給每個資料表一個獨一無二的名稱。(SSE支援中文資料表名稱。)

  資料欄位:一個資料表中,可以有多個資料欄位,每個資料欄位就是拿來存放資料的地方,你在建立資料欄位時必須定義這個資料欄位要存放什麼樣類型的資料。

  例如物件總管圖片中,Products就是資料表名稱,而其中資料欄位有:ProductID、ProductName、…。

  換成我們習慣看的表格,很像Excel的表格,就是這樣:

Products
ProductIDProductName
1SQL Server
2MySQL
3Oracle
[表1]


  第一筆資料是ProductID為1,ProductName為SQL Server,了解了以上資料庫相關架構後,我們就可以進入SELECT語法介紹。

SELECT語法基本格式


  SELECT 欄位名稱
  FROM 資料表名稱
  WHERE 條件

  就那怎簡單三行,這三行就是SELECT語法精華中的精華。

  SELECT 欄位名稱:
  SELECT就是決定你是要你要取出資料欄位有那些?一個資料表中有許多的欄位,但不一定要全部取出,你可以取出你需要的部份欄位即可。

  FROM 資料表名稱:
  望文生義,就是說你要從那個資料表中取出你需要的資料,資料表可以有1個以上來結合取出。

  WHERE 條件
  如果你要取出資料表中全部的資料,那就不必下WHERE,但如果只是要需取資料表中其中符合特定條件的資料,那就要使用WHERE來下過濾條件。

  以表1為例,我想要找出所產品編號(ProductID)為1的資料:

  SELECT *
  FROM Products
  WHERE ProductID = 1

註:「*」代表全部的欄位。
  如果我們使用白話來說就是:我要從資料表Products中取出全部的欄位,但我只要ProductID為1的那一筆資料就好。

  沒問題的話,接下來我們要使用實例來說明SELECT語法。
註:在SQL語法中我們對資料庫的基本動作有四個,SELECT是取出資料,INSERT是新增資料,UPDATE是更新資料,DELETE是刪除資料,而SELECT只是單純從資料庫中取出我們所需的資料,不會對資料庫中的資料做「異動」的動作,而所謂的「異動」簡單的說,就是會對資料庫中的資料產生改變,所以「新增、更新、刪除」這三種動作都是屬於異動型的語法。這在之後會介紹。

註:使用SQL相關語法時,規定是使用大寫英文字母,但為了我們在撰寫程式(如ASP.NET、PHP…)時的方便,使用大寫或小寫英文字母是無所謂。例:select、Select、update、Update…都可以。

註:基本上在撰寫程式時的SQL語法都單獨一行,例如:「 SELECT * FROM Products WHERE ProductID = 1」,有時sql語法太長(你後面就會看到),我們會使用類似在實例中的排版來增加程式的可讀性,這時你要注意程式的斷行連接字元(有程式語言要加連接字元,有些不用)。像是在ASP.NET要在程式最後使用「_」(底線)來連接下一行程式碼,類似下面的技巧:


  sqltxt = "SELECT * _
      FROM Products _
      WHERE ProductID = 1"


這樣就可以解決SQL語法太長而造成可讀性低的問題,這很重要,有些「大型」系統中一個SELECT語法可能就有幾百行,如果你不一行一行排好,幾百行擠成一堆,你看的懂,那我只能說:高手!

無廢話SQL語法--2.簡介資料庫管理工具

  我在前一篇環境準備有提到一張圖:

前端(ASP.NET) <--> SQL語法 <--> 後端(RDBMS)

  如果只是靠前端這些程式語言,然後透過SQL語法來對後端的RDBMS來做管理的動作,是非常不切實際且沒有效率。實作上是先使用一個管理工具來對RDBMS來進行架構上的管理的工作,再使用前端程式語言來進行新增、刪除、更新等動作。

  你想想,我們前一篇匯入的例子,如果你是使用前端程式語言來進行匯入,那要寫多少行的程式,但透過管理工具,一個「F5」解決。還有,在後端(RDBMS),基本上如果沒有這些管理工具,你是看得到摸不到,它只是一個單純在背景運作的資料庫軟體。所以上面的圖再修改成:

前端程式語言 <--> SQL語法 <--> 後端RDBMS <--> SQL語法 <--> 資料庫管理工具
                 
  前端:任何可以透過SQL語法與RDBMS溝通的程式語言。
  資料庫管理工具:直接對RDBMS管理的工作,好處是圖形化工具,使用起來簡單易懂,SSE的管理工具是SSMSE,MySQL的管理工具是phpMyAdmin…等。當然也有Command-Line模式(命令模式),如果你功力深厚也無不可。

  一般來說,每一家的RDBMS都會有專屬的管理工具,各位可以自行參考。

SSMSE簡介

連接到資料庫
  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> SQL Server Management Studio Express --> 出現:「連接到伺服器」
SSMSE_Connection_Login.png  重要的是「驗證」選項,有「Windows驗證」或「SQL Server驗證」,詳細的差異請參考「ASP.NET And SQL Server 2005 Express遠端連線的方法」,在本機選擇其中一種然後按「連接」。

新增查詢工作區

  驗證通過後,就會與資料庫連接上,然後在最左邊的:物件總管--> 資料庫 --> Norhtwind --> 按滑鼠右鍵 --> 選擇:「新增查詢」
SSMSE_新增查詢.png  然後右邊會出現一個空白畫面,會自動命名為:「SQLQuery1.sql」,新增第二個查詢就命名為「SQLQuery2.sql」,那就是我們練習所有例子的工作區。

測試查詢

  點選空白工作區,然後鍵入:SELECT * FROM Categories,然後可以按上方有個「SSMSE_執行按鍵.png」或是直接按快速鍵「F5」,再下方就會出現查詢的結果視窗。

  另外還有個小技術,如果你未來在輸入SQL語法時,那些Table、欄位懶的一個字一個字的鍵入,你可以展開資料庫中的資料表 --> 點開你要使用的資料表(例如dbo.Categories) --> 資料行,然後不管是Table或資料行,都可以直接使用滑鼠拉選到右邊的工作區中,工具會自動帶入表格名稱或欄位名稱,省時又方便。

  如果到這裡沒有什麼問題,那怎我們在就正式進入SQL語法的世界,介紹SQL語法的第一大將:SELECT。

男人就是要光頭

  為了落實我自己所提出的光頭節能理論,2008/8/9日,我終於在我老婆大人的首肯下,完成我的夢想:光頭!

kkbruce_光頭  願天下有情人,終成光頭。

男人一生所追求的幸福

  2008/8/18 AM 11:25,這個六、日公司有點事,所以都在加班,我已經超過30幾個小時沒闔眼,對我這個老人家,體力實在有點吃不消,但還是要跟各位談談這位讓我鐘愛一生的人。

  其實昨晚她是被我趕回家的,她想我陪也想陪我,因為她有身孕不能太勞累,而且今天她還要上班,要早點上床休息。其實我回到家她已經在上班了,但當我回到家時才知道,我這小可愛還準備了一份禮物給我…害我又無法入眠!

Sherry的信書  男人一生所追求不就是這簡單的幸福嗎!

  老婆,Me too。

踢爆--建設公司的黑心廣告

  這年頭流行「踢爆」,我本身是不喜歡那些影響人家私生活的踢爆,不過如果是揭發「黑心」、「不良」、「壞人壞事」…我本身到是不反對。不知什麼時候開始,心裡開始有一點正義感,想對社會進一點心力,希望能對反應一些不合理的事,這就是我想在Blog反應的事。

  以下的事是發生在我上班必經之路上,本來這事是不會引起我注意的,只是我有隻心愛的狗狗,我和婆婆每天都會帶到牠到處走走,有一天走著走著發現了這樣的黑心事件。

  地點:新竹市水源街、新竹市公道五路

  在新竹市水源街與公道五路有一家愛賣(主角不是愛賣),這裡算是一個車水馬龍的地段,而就在幾週前的一天,我到這裡散步時發現有幾台應該是報廢的小貨車,因為玻璃都已經破碎、座位都已經損壞,但上面的廣告還是新的。但引起我注意的是它被張貼了好幾張黃色公告單,而且它是停放在付費停車格之內。一台沒有車牌的車停在付費停車格之內,想也知道,停車格的開單員當然拿它沒辨法!

  但時間一天一天過去,我發現,這些車不止一台,是有許多台,而且這些車上的廣告都是同一家建設公司的廣告文案,而且今天我又發現,那些黃色公告單有人會去把它「撕」下來…我不知道用意為何?

  用這樣的方式在打廣告,遊走在法律邊緣的方法,實在是我所不認同的,以下是今天2008/8/17早上我帶狗狗去散步所照的照片,就我個人而言,這家建設公司的任何建案我將永遠不會考慮,因為他們這樣做生意的心態…有問題。有問題的建設公司蓋出來的房子…會不會有問題?

  水源街:

  

  公道五路:




  踢爆還是交給專家,以上資訊我會轉寄給Apple咬一口,希望能有個好結果。

  台灣蘋果日報總部
  爆料投訴
  電話專線:0809-012-555 傳真專線:0809-013-666 電子郵件:news@appledaily.com.tw

  台灣壹週刊
  爆料投訴
  投訴專線:(02)6601-9119 傳真:(02)6601-9042 爆料投訴信箱:119@nextmedia.com.tw

無廢話SQL語法--1. 環境準備

前言

  不管你是使用什麼類型的資料庫軟體,MySQL、SQL Server、DB2、Oracel、Sybase、Teradata、PostgreSQL…基本上它都只是一個在後端Standby(待命的)的資料庫軟體,它會在那裡癡癡的等著你,你必須與他溝通,不論你的前端是使用什麼程式語言,VB、C、C++、C#、Ruby、Java、PHP、JSP、Javascript…,只要是需要與資料庫來做存取,都必須使用資料庫的共通語言來和它溝通,那它才會幫你做事,成為你的好幫手,而這個資料庫的共通語言就是:SQL語法。目前SQL語法的國際標準為:SQL/99,除了一些各家資料庫軟體特別的語法、函數外,基本上所有的資料庫軟體都支援SQL語法,所以你想進入資料庫的世界,那SQL語法就是基本功夫,就是你的內功,你的根基。

  以我為例子,我在開發*.aspx的網站時的關係圖如下:

前端(ASP.NET) <--> SQL語法 <--> 後端(RDBMS)

  我們的例子將會在SQL Server 2005 Express中進行,如果你的電腦中沒有這些套件,請先下載 1. Microsoft .NET Framework 2.0、2. Microsoft .NET Framework 2.0語言套件、3. SQL Server 2005 Express、4. Microsoft SQL Server Management Studio Express,下載後請依順序安裝到電腦中,這些軟體及工具都是免費的。(註:SQL Server 2005 Express簡稱:SSE;Microsoft SQL Server Management Studio Express,簡稱:SSMSE。)
  • SQL Server 2005 Express最低要求是.NET Framework 2.0,目前.NET Framework在2008年8月已經更新到.NET Framework 3.5 Service Pack 1,因為我們這裡不是要寫.NET Framework程式,我們只是要架設一個測試環境,專注在SQL語法,所以只需要安裝2.0即可。
  • 你也可以直接下載.NET Framework 3.5 Service Pack 1來安裝,它會把所有2.0、3.0、3.5環境架設起來,不會有任何影響。
  環境準備好了,你還必須再下載一個範例資料庫,Northwind(北風資料庫),SSE資料庫不包含範例資料庫,下載後安裝時會直接把範例資料庫安裝到「C:\SQL Server 2000 Sample Databases」目錄,我們所有的例子都會以這個資料庫中的資料為例子來實作。

  如果你已經安裝好所有軟體及工具,那我們就來做第一件事,匯入Northwind資料庫及pubs資料庫到SSE。步驟相當的簡單:
  1. 進入「C:\SQL Server 2000 Sample Databases」目錄
  2. 點擊「instnwnd.sql」檔案,進入SSMSE畫面,按下「執行」或「F5」。
  3. 點擊「instpubs.sql」檔案,進入SSMSE畫面,按下「執行」或「F5」。
  4. 匯入完成後,就可以進入「新增/移除程式」將「Microsoft SQL Server 2000 Sample Databases Scripts」移除。
  這樣就準備好了我們所有的實作環境,簡單吧,下一篇我們先簡介SSE的管理工具:SSMSE,再進入SQL語法。
註:RDBMS:Relational database management system,關連式資料庫管理系統。


#2008/8/17:更新至.NET Framework 3.5 Service Pack 1環境。

Bandwidthd:簡單、好用又強大,各別IP流量統計

  你是否有過這樣的困擾或經驗,幸幸苦苦的架好了一個強大的MRTG,終於可以好好的看看網路流量的情況了,但是看到 的是 一個「總體」的流量。正當高興時,有人在你的網路中「嘿嘿嘿」或是下載P2P或是一個可憐又無知的小朋友電腦中毒了。這時,終於看到MRTG美麗的圖形, 上上下下,左左右右。但你就是找不出來,是「誰」?誰在創造這些美麗的圖形,是「誰」?是「誰」?

  終於,天邊出現一道光,人們跟著說:「就是那道光,Bandwidthd」。(小說看太多了@.@~)

   Bandwidthd 是一套以圖形化、網頁化的方式,顯示你的 TCP/IP 網段中的使用狀況。Bandwidthd 圖形化是以網段中「各自獨立的 IP」為對象,它可以不同的色彩來顯示 HTTP, TCP, UDP, ICMP, VPN 以及 P2P 協定的流量。可以讓網管人員更了解使用者使用網路的情況。和 MRTG 不同的是,bandwidthd 統計是各別的 IP 用量,而不像 MRTG 是顯示某一網路介面的總量,對於網管人員而言,Bandwidthd 可說是一項好用的利器。而且在官方網站上有提供這樣的一個數據:My entire ISP (2000-3000 IP addresses across 4 states) is graphed on a Celeron 450 every 10 minutes。意思是說,使用賽陽450的CPU,可以在10分鐘掃完2000-3000 IP。也就是說,我們可以拿比較舊的電腦來做這個統計工作,而不用擔心效能問題。並且,他也提供和資料庫整合的功能,實在是太棒。最最最重要的是,他的架 設,超簡單。等不及了,我們快來動手吧!
  • 實作系統:CentOS 4.5 Server, 核心版本:2.6.9-55.EL
  • 實作配備:PⅡ Celeron 450 + 256 RAM ( 剛好可以證明:「這是真的。」跟隨者:「真的~~~」 )
  目前最新版本為 2.0.1 (2007/5/23),而且他還有提供Windows版本,真的是太棒了。
  先以 root 登入:
  在安裝之前,我們先看看 README / INSTALL.Unix ,發現有些東西必須先確認一下,你必須確認有安裝以下函式庫:
  檢查一下:
  • rpm -qa | grep libpcap
      找出:libpcap-0.8.3-10.RHEL4
  • rpm -qa | grep libpng
      找出:libpng-1.2.7-3.el4
  • rpm -qa | grep libgd
  你會發現,最後一個 libgd 會是空白的,沒關係,這跟等一下的錯誤有關哦!如果沒有安裝的話,建議使用 yum 來安裝。
  • yum -y install libpcap*
  • yum -y install libpng*
  • yum -y install libgd* (不會安裝任何套件,裝孝為嗎?請往下看,大人。)
  建議把第二個 libpng 執行一下,因為我發現有另一個 libpng10 的套件,而且我未安裝 libpng10 套件時,會出現以下錯誤訊息:
  • configure: error: Bandwidthd requires but cannot libpng
很明顯的,它是使用 libpng10 而不是使用系統內建的 libpng,然後開始安裝吧:
  • ./configure && make install
不過在configure時一直出現以下的錯誤:
  • configure: error: Bandwidthd requires but cannot find libgd
  找又找不到(rpm),安裝也沒有東西(yum),是怎樣!!! (集氣完快成了{..ooOO}!) 到網站看看有沒有什麼資訊( 網站上說:The GD library has moved to http://www.libgd.org/ ), 發現套件名稱都是以 gd 為開頭,那試試 yum search gd,果然找到一堆套件,還好我試了第一次就OK了,不然可能要發功放氣一下才行了!(本來在另一台主機測試時,是直接使用 yum install gd* ,馬上就OK了,但想想有需要安裝那怎多東西嗎?所以就再找一台來試,結果在 CentOS4.4/4.5 情況都一樣,在非常Luck的情況下,試了第一個套件就成功,還好還好,汗~~~)
  • yum install gd-devel <-- 兇手就是他,看我的元氣彈!!!
  再重新configure一次
  • ./configure && make install
  成功了,沒有錯誤訊息了。 安裝完成後,它會將 bandwidthd 安裝至 /usr/local/bandwidthd 下,接下來就是 bandwidthd 超級簡單的設定,請編輯:
  • vi /usr/local/bandwidthd/etc/bandwidthd.conf
  在第 10, 11, 12 行,把這三行註解(#):
  • # subnet 10.0.0.0 255.0.0.0
  • # subnet 192.168.0.0/16
  • # subnet 172.16.0.0/12
   最後加上一行自己網域的設定:
  • subnet 192.168.1.0/24
 一個Intranet, Class C, 指定你要統計的subnet,全部的設定就只有一行,超簡單吧!存檔之後,便可準備執行。執行bandwidthd:
  • cd /usr/local/bandwidthd
  • ./bandwidthd
  然後我們只要在 web 主目錄建立一個Link即可:
  • cd /var/www/html
  • ln -s /usr/local/bandwidthd/htdocs bw ( 目錄名稱自己決定 )
  接著您需要等個幾分鐘,便可用 http://IP/bw or http://domain/bw 看到網路中各主機的頻寬使用情況!
注意一
再來因為這個程式是使用 C 語言所寫,所以你的系統必須要有 gcc 和相關的套件,如果你在 configure 時會出現:
  make: cc: Command not found
  或是
  configure: error: no acceptable cc found in $PATH
那怎請先把 gcc 安裝起來。我的 CentOS4.4 剛裝完時,還真的沒有 gcc ,產生了第二個錯誤訊息:
  yum -y install gcc*
或是把 gcc 升級到最新版本:
  yum -y update gcc*
應該就可以解決 configure 時的問題了。

注意二
以下是 bandwidthd 的 README 中倒數第二段,有一段話:

By default, Bandwidthd now runs in promiscuous mode. This means it can be used to monitor traffic not routing through it's host. Just make sure that the host and the actual router are on the same hub (Not switch) and everything will be ok.
注意那個粗體字,所以,請把 Bandwidthd 的主機與你的骨幹用hub連接,應該就會有所有的流量了。或者,如果你的nat或router是自己架的Linux,那就直接裝在 nat / router 主機上也行。
Windows 安裝 Bandwidthd
  Bandwidthd 在 Windows 的安裝,更簡單100倍。我們快來看看!
  1. 先把檔案下載回來:http://nchc.dl.sourceforge.net/sourceforge/bandwidthd/bandwidthd-2.0.1-binary-windows.zip
  2. 解 壓縮後,會產生一個 bandwidthd 的目錄,移到你要放 program 的地方(一般是放到 \program file\ 之下)。然後先看一下 README.txt 和 INSTALL.Windows.txt 有一件事要確認,你是否有安裝 Winpcap 這個軟體,如果沒有的話,請先下載:http://www.winpcap.org/ ,最新版是 winpcap 4.0。
  3. 然後,修改 bandwidthd/etc/bandwidthd.conf ,將你要統計的 subnet 設定上去,存檔。
  4. 點擊 "Install Service.bat" 這支程式,把 bandwidthd 安裝到 Windows系統服務中。
  5. 「開始」--> 「我的電腦」 --> 滑鼠按右鍵 --> 「管理」 --> 「服務及應用程式」 --> 「服務」 --> 「 bandwidthd 」
  如果要停止 bandwidthd.exe 必須使用 「 Windows 工作管理員 」來直接停用四個 bandwidthd.exe。另外要注意,是否有 cygrunsrv.exe 這支程式,有的話一併Kill。 如果要把 bandwidthd 從「服務」中移除,請先把所有 bandwidthd 工作停止,然後點擊 "UnInstall Service.bat" 這支程式就可以了。
  要看統計的結果,進入 bandwidthd\htdocs 點擊 index.html 就可以看到美美統計圖形了。可以開始抓……山豬了。

本文PDF下載:



註:本文寫於2007/7/25

無廢話SQL語法--4.第一大將SELECT(2)

SELECT基礎語法

  請直接進入SSMSE管理工具的Northwind的SQLQuery查詢。然後將實例中的語法使用「複製/貼上」的方法,然後在工具中按「F5」執行,看其結果。以下為簡省畫面,除特別結果,不再截圖,請自行測試。

  複習:

  SELECT 欄位名稱
  FROM 資料表名稱
  WHERE 條件

  實例一:取得Products資料表中所有產品的明細資料

  SELECT *
  FROM Products

  在欄位方面我們使用星號「*」時,代表我要取出FROM資料表中所有的欄位,不過在實際進行程式設計時很少用到這個方式,因為這個方法會對程式效率產生影響,所以建議盡量能指定明確且你所需要的欄位名稱。這個SELECT語法中沒有使用到WHERE條件,沒有條件就是代表「我要取出全部資料」。

  實例二:從Products資料表取出ProductName(產品名稱)及UnitPrice(單價)

  SELECT ProductName,UnitPrice
  FROM Products

  指定明確欄位名稱。

  實例三:從Products資料表取出ProductID,ProductName,UnitsOnOrder,UnitsInStock,UnitPrice(欄位順序要一樣)

  SELECT ProductID,ProductName,UnitsOnOrder,UnitsInStock,UnitPrice
  FROM Products

  取出欄位的顯示安排是可以依照你的規劃來設計,而寫出明確欄位名稱及順序的好處是可以增加語法的可讀性,你可以知道取出了什麼資料,另外可以排除一些不必要錯誤,例如,如果你在欄位名稱使用「*」,但如果有人變更了資料表的欄位結構,你將很難查出錯誤。原則就是:你需要什麼那就取出什麼。

  實例四:從Products資料表取出商品單價(UnitPrice)大於50元的ProductName,UnitPrice

  SELECT ProductName,UnitPrice
  FROM Products
  WHERE UnitPrice > 50

  WHERE是一種「過濾」的動作,絕大部份的情況下,我們很少要取出資料表中全部的資料,而是要資料表中「特定」的資料,而WHERE就是在幫我們過濾不必要的資料,找出我們需要的資料。WHERE後的條件可以使用數值的比較運算子,常用的運算子有:> 大於、< 小於、>= 大於等於、<= 小於等於、= 等於、<>、!= 不等於(SQL Server支援這兩種不等於的語法),還可以使用邏輯運算子來結合多個條件(AND、OR),例如將上述的WHERE修改為:「WHERE (UnitPrice > 50) AND (UnitPrice <> 50) OR (UnitsInStock > 50)

  實例六:從Employees資料表取出City(城市)是在London(倫敦)同事的FirstName

  SELECT FirstName
  FROM Employees
  WHERE City = 'London'

  這個實例要說明的是當比較的資料型態為「字串」時,字串必須使用「'」到「'」單引號符號之間,而不是我們常在撰寫程式時使用的「"」雙引號符號,請小心注意,你可以移除「'」或是換上「"」測試看看。而這個「'」也就是SQL語法常被SQL Injection攻擊的起點,所以如果在撰寫動態網頁程式時,一定要非常小心處理這個「'」,有關「SQL Injection攻擊」我們有機會再聊聊。

  實例七:從Products資料表取出產品名稱中有含有「Anton」的ProductName,UnitPrice

  SELECT ProductName,UnitPrice
  FROM Products
  WHERE ProductName LIKE '%Anton%'

  LIKE是一種「模糊搜尋」,它必須使用如百分號(%)或底線(_)合作使用。%代表0個或以上的任意字元。_則是只能有1個字元。另外注意,LIKE在搜尋是不會分字母大小寫,當然中文不會有大小寫的問題。所以'%Anton%'表示Anton之前與之後有任意幾個字元都符合條件。例如:

  LIKE 'ANTON%' :以ANTON開頭的字串將符合條件。
  LIKE '%anton%'  :含有anton字串將符合條件。
  LIKE '%Anton'  :以Anton結束的字串將符合條件。
  LIKE 'C___'  :(C後面是三個底線)表示以C開頭且只含三個字元將符合條件。

  如果你只知道要找一個'kkbruce'字串,但不知道在那一個欄位,尤其是在程式設計時常會進行多個欄位的模糊搜尋,只要使用OR來連接LIKE條件即可,例如:Field1 LIKE '%kkbruce%' OR Field2 LILE '%kkbruce%' OR Field3 LIKE '%kkbruce%' …,將資料表中所有的資料欄位全部用OR起來,那就可以查詢全部欄位。

  LIKE在資料查詢的條件設定時是很重要的使用方式,我們在深入一點點。想想,如果我們要查詢百分比'%'符號時,那要如何下這個LIKE語法?LIKE '%%%'嗎?如果我們要查詢底線'_'時,是下LIKE '%_%'嗎?

  如果單從「字面上」來看,這樣寫法是沒有錯,但SQL Server會將「%」解釋為「0個或以上的任意字元」,「_」底線解釋為「只能有1個字元」,這不是我們要的結果。這時我們就要借助ESCAPE關鍵字的幫助,ESCAPE原意是「逃脫」,也可是我們可以指定一個「跳脫」的符號,當我們在LIKE使用中使用跳脫符號時,跳脫符號後的符號將以原意來解釋。我們用實例來說明:

  LIKE '%\%%' ESCAPE '\'
  LIKE '%\_%' ESCAPE '\'

  先指定'\'為跳脫符號,然後在LIKE中使用\%來代示\後面的%要使用原意(百分比)來解釋,第二個一樣,將\後面的_使用底線來解釋,這樣了解嗎。

  SQL Server中LIKE會使用到的萬用符號:

  %:任何含有零或多個字元的字串。
  _:任何單一字元。
  []:在指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單一字元。
  [^]:不在指定範圍 ([^a-f]) 或集合 ([^abcdef]) 中的任何單一字元。

  最後在介紹一個SQL Server的CHARINDEX()的函數,它的語法是:

  CHARINDEX('要尋找之字元', [欄位名稱] )

  如果CHARINDEX找到你要的字元,會傳回一個大於零的值,沒有就傳回值零,所以上面的例子也可以改寫成:「WHERE CHARINDEX('%', ProductName) > 0」,一樣,可以使用OR來連接多個欄位的查詢,而且CHARINDEX()效率比LIKE還好,LIKE很重要,請好好了解。還有不了解,請查詢SQL Server線上叢書。
  
註:CHARINDEX()會傳回字串在資料欄位中的位置,所以當欄位內容有資料時,傳回的值就會大於零。
註:CHARINDEX()不屬於SQL語法,是SQL Server的函數。

  實例八:從Orders資料表取出1996年8月份(OrderDate )的訂單資料

  SELECT *
  FROM Orders
  WHERE OrderDate >= '1996/8/1' AND OrderDate <= '1996/8/31'

  日期的比較運算和數值一樣,另外還有一種用法是使用「BETWEEN~AND~」,本例中的WHERE可以寫成:   WHERE OrderDate BETWEEN '1996/8/1' AND '1996/8/31'   不過資料庫軟體在執行時還是會自動轉換為>=、<=的運算方式。
(NOT)IN的使用方法

  實例九:從Products資料表取出CategoryID(類別編號)為1,2,3的ProductName

  SELECT ProductName
  FROM Products
  WHERE CategoryID IN (1,2,3)

  IN括弧內的值為「其中任一個值符合」即可,而IN也可以轉換成OR的運算式,例如:

  WHERE CategoryID =1 OR CategoryID =2 OR CategoryID =3

  那我們使用OR就好了,為什要使用IN呢?那是因為OR這種運算式你只能使用在「清楚、明確」知道「個數」的地方,如我知道要取出1,2,3時使用,但如果我根本不知道會取出多少個值,那就要使用IN了,這我們後面會交代。

  我們也可以令IN的條件相反,也就是除了1,2,3其他的資料我都要,那就可以使用「NOT IN」,那WHERE敘述如下:

  WHERE CategoryID NOT IN (1,2,3)

  而OR敘述:

  WHERE NOT (CategoryID =1 OR CategoryID =2 OR CategoryID =3)

  NOT就是將整個結果相反的意思,原本成立變不成立,不成立變成立,這樣了解嗎!

NULL的概念(IS使用)

  實例十:從Suppliers資料表取出沒有HomePage(網頁)的CompanyName(公司名稱),也就是HomePage內容為NULL的公司。

  SELECT CompanyName
  FROM Suppliers
  WHERE HomePage = NULL

  如果你已經執行了,嗯,怎麼會是錯誤的?在SQL當中NULL代表一種「未定」或「不明」的狀態,而你不能拿「未定、不明」的值來比較(=、<、>、…)運算,當然也不使用NULL = NULL的比較,因為「未定不會等於未定」,這時我們必須使用IS這個比較運算子:

  WHERE HomePage IS NULL

  也就是明確的跟WHERE說,我要的是(IS)NULL這個值。IS也可以使用NOT,來使整個結果相反:

  WHERE HomePage IS NOT NULL

  IS NOT(不是),就是請找出其他不是NULL的資料。

結合資料表(INNER JOIN)及別名(Alias)

SQL Server 2008 Express規格...小小失望

  2008/8/6(三),MS發布SQL Server 2008正式版。中文版預計要9月才會正式發行。從SQL Server 2005到SQL Server 2008,MS花了三年多了時間來改版,SQL Server 2008這個版本主要是以SQL Server 2005來進行功能加強及提升。

  不過我比較關心還是在「免費」這部份的SQL Server 2008 Express版本,SQL Server 2008 Express除了功能上同步提升外,其實我比較關心的「規格」方面,2008 Express與2005 Express還是一樣沒有改變,這點讓我有點小小的…失望。

  SQL Server 2008相關資訊:http://www.microsoft.com/taiwan/sql2008/default.aspx
  規格:http://www.microsoft.com/sqlserver/2008/en/us/compare-specialized.aspx
  詳細規格:http://download.microsoft.com/download/e/8/8/e8859616-e95d-41fe-9f81-ff88388d772b/SQLServer%202008CompareComapctExpress.pdf
  • Max 1 CPU/Server
  • 1 GB RAM usage
  • 4 GB DB size
  如果這個規格能夠Double,我相信絕對是使用者與MS雙贏的情況。我理想的規格:
  • Max 1~2 CPU/Server
  • 2 GB RAM usage
  • 4~8 GB DB size
  以目前多核心的CPU來說,CPU到不是問題,所以就算只使用1顆多核心CPU來運作,應該也可以跑的相當順暢。但RAM如果可以再開放大一點,對整體在使用Express效能會是影響很大一部份。當然免費我們不能要求太多,我想像中2GB RAM usage在Express版本算是理想狀況。而DB size是直接影響能存放的資料量。但這點跟2005 Express版本一樣,是「單一資料庫檔案」的限制,還是有辨法突破。不過如果能多多益善,那是最好。

  當然,免費的使用者(我)都是貪得無厭,除了規格上的小小失望(尤其是RAM),其他功能上的提升還是值得我們贊許及嘉獎。

ASP.NET And SQL Server 2005 Express遠端連線的方法

前言

  SQL Server 2005 Express版本(以上簡稱SSE),雖然是SQL Server 2005精簡版本,不過如果你的資料庫的使用需求簡單,且資料產生的量也不大,它是一個不錯的資料庫軟體,可以列入考慮。可能你會說,我可以直接使用MySQL之類資料庫軟體,嗯嗯,這也是一種不錯的方向,其實這都不是重點,重點是:「黑貓,白貓,會爬老鼠的就是好貓。」能解決你的問題就是好資料庫軟體,管它是使用Excel、Access、MySQL、Oracle、SQL Server…。當然,這隻黑貓、白貓其中還有需多要考慮的重點:效能、維護、資源、工具、文件、支援、服務…等多個面向考慮,最後選擇一個最符合你需求的資料庫軟體即可。

  我先說說我為何選擇SSE來做為我的資料庫,
  1. 因為它是免費。(與MySQL…相同)
  2. 我使用是Windows平台。
  3. 我使用的程式語言為Visual Basic。
  4. 我寫的是ASP.NET(*.aspx)網頁。
  5. 容易與開發工具整合與管理。

  除了第一點是比較沒有說服力之外,還有一點,因為是精簡版的關係,所以當然會有一些進階版本的功能是你無法使用的,但基本上MySQL是沒有這些限制的。但我在開發*.aspx時,使用SQL Server是非常方便的,Microsoft提供的工具(Visual Studio…)可以很方便與SQL Server做整合、管理…等等的工作。

SSE的限制
  • CPU數目:1
  • 記憶體上限:1 GB
  • 64位元支援:Windows on Windows (WOW)
  • 資料庫大小:4 GB

  SQL Server 2005各版本的差異,可以參考這裡
  其中比較要注意的是「資料庫大小」這一個項目,Express版本的4 GB限制是指「單一個DataBase檔案」,如我們常當成範例的Northwind(北風資料庫),在Express版本中的資料庫大小會有4 GB的限制,所以你可以多開幾個資料庫檔案來運用而避開這項限制。

  限制歸限制,但MS還是提供了一些額外的Express工具讓使用者來擴充SSE的功能,包括:
  1. Microsoft SQL Server 2005 Express Edition with Advanced Services Service Pack 2
  2. Microsoft SQL Server 2005 Express Edition Toolkit Service Pack 2
  3. Microsoft SQL Server Management Studio Express Service Pack 2 (SSMSE)
  • Advanced Services
    包含SSMSE、支援全文檢索目錄(FullTextSearch)、支援經由報表服務(Report Service)來檢視報表。
  • Toolkit Service
    提供了額外的工具與資源來管理SQL Server 2005 Express版本,它也支援經由報表服務建立報表,包含工具:
    • Connectivity Components
    • Business Intelligence Development Studio
    • Software Development Kit
    • Management Studio Express
  • SQL Server Management Studio
    這個工具是用來管理SQL Server 2005 Express版本的資料庫。
  目前SQL Server 2008已經快要發行了,有興趣的可到微軟網站查看資訊。

註:如果你的網站只是存放「文字型資料」,基本上4 GB應該可以讓你使用一段很久的時間,我前陣子看一篇「數位之牆的十一年浩劫」的文章,當然,這篇文章讓我們從事資訊工作的人有所警惕,其中提到,一個經營11年的網站備份出來的資料檔大小不過40MB左右,而我所服務的公司,經營一個討論區約有1萬1千篇文章,資料檔大小也才13.5MB左右。如果再利用我上述提到的「多開幾個資料庫檔案」的技巧,這個SSE版本的資料庫,應該是相當實用。
實作環境

  我只有一台主機,所以我使用VMWare來架設第二台主機,當成DataBase Server。

  Host1
  • OS:Windows XP Professional SP3
  • Name:Bruce
  • IP:192.168.254.100/24
  • 這台XP主機主要是模擬成Server,主要是架設成.NET Framework 3.5的環境加上SSMSE,模擬連線到遠端SQL主機。

  Host2
  • OS:VMWare Server ConSole 1.0.6 for Windows XP Professional XP3
  • Name:VMBruce
  • IP:192.168.254.103/24
  • 主要安裝SSE,當成DataBase Server,我還會教大家做簡單的防火牆設定,以防SQL 1433 port的攻擊。
事前準備
  1. .NET Framework 3.5環境
    Microsoft .NET Framework 3.5Microsoft .NET Framework 3.5 語言套件,下載後安裝在主機Bruce。

    • 2008年08月已更新到3.5 Service Pack 1,可以直接下載後安就,Microsoft .NET Framework 3.5 Service pack 1
    • 如果電腦是第一次安裝.NET Framework,直接下載3.5 sp1套件安裝,它會幫你把2.0、3.0、3.5全部安裝起來。

  2. SQL Server 2005 Express資料庫軟體
    Microsoft SQL Server 2005 Express Edition Service Pack 2
    ,下載後安裝在主機VMBruce。

    註:如果你如我一樣有在開發*.aspx或其他.NET程式,那你也可以到 Visual Studio 2008 Express Editions,在畫面中選擇你需要的語言工具(例如最下方:Offline Install-->Chinese (Traditional)-->Download),即可下載ISO檔,然後使用DVD燒出來後安裝Visual Studio 2008 Express工具,會自動安裝以上1、2所有軟體。


  3. SSE管理工具(SSMSE,資料庫管理工具)
    Microsoft SQL Server Management Studio Express Service Pack 2
    ,下載後安裝在主機Bruce、VMBruce。注意,VMBruce安裝SSMSE前,最少要先行安裝.NET Framework 2.0相關套件。

  4. SQL Server 2005 線上叢書
    SQL Server 2005 線上叢書 (2007 年 9 月)
    ,這是完整的一本技術手冊,你在坊間買書,可能查不到的資料這裡面都有,如果你有心想了解及發揮SQL Server的實力,這一定要下載安裝來看。關於SQL Server,有問題,有不了解,或是在看書,做實例不清楚…反正先查它就對了。
關係圖

Bruce (Web Server, SSMSE)  <------>  VMBruce (SSE, SSMSE)

  VMBruce這台主機就是單純的一台DataBase Server,我們在VMBruce必須先使用SSMSE工具先做本機連接測試,然後做一些設定的修改,讓VMBruce這台主機開放遠端連線的權限。在來透過Bruce主機的SSMSE工具來實作遠端連線到VMBruce的資料庫來進行管理的工作。再進一步透過Bruce主機寫一個*.aspx的ADO.NET程式透過網頁來進行遠端的資料庫連接及存取的動作。

  如果你看買過很多動態網頁程式教學的書籍(我就是!@.@),你會發現所有的書籍都只會教你在本機架設一個網站,不管是IIS+ASP、IIS+ASP.NET、IIS+PHP、Apache+PHP+MySQL…,最後你只會在本機寫程式,做管理,然後再上傳到一台Web與DataBase在同一台Server上,但實務上會建議把Web的主機與Database的主機是分開在不同主機及網路上,這樣的架構可以很彈性的架設出一個較大型的網路應用服務(當然這還是跟需求有關:效能、錢錢、使用情況…)。

服務名稱及驗證模式

  在開始前最後一件事,要提醒大家「服務名稱」及「驗證模式」這件事。你可以在同一部電腦中安裝多次的SQL Server引擎,而每次安裝稱為一個執行個體(instance),每個執行個體都有一個名稱來辨別,如果你是使用Visual Studio Express相關工具安裝SSE,那預設資料庫執行個體的名稱為「SQLEXPRESS」(你在執行工具或撰寫程式時,大小寫都可以)而且驗證模式預設為「Windows驗證模式」,且只充許本機的連線,如果要充許遠端連線還需要額外的設定。如果你是獨立安裝SSE,則系統在安裝時會讓你選擇驗證模式,你可以選擇「Mixed Mode, 混合模式」會比較有彈性,如此便能讓別的主機來連線或管理。

  在連線到資料庫時,在SSMSE的「伺服器名稱」或ADO.NET的「Data Source」你會發現格式為:「主機名稱\資料庫服務名稱」,例如:「VMBruce\SQLExpress」,如果是在同一台電腦主機,則主機名稱可用「.」來代替,例:「.\SQLExpress」,如果是使用遠端連線則主機名稱則使用IP Address來代替,例:「192.168.254.103\SQLExpress」。

  • Windows驗證模式
    Windows驗證接受使用者在登入Windows時獲得驗證,然後再傳送安全性憑證給SSE。而使用者的帳號和密碼只保留在Windows中。當ASP.NET使用Windows驗證時,連接字串不會提供帳號及密碼,只提供使用Windows驗證的指示。適合本機連接使用。

  • SQL驗證模式
    SQL驗證使用儲存在SQL Server中的資料來做使用者驗證。在連接時需提供「使用者名稱」及「密碼」來進行驗證。適合遠端連線使用。

  • 混合模式
    可以自行選擇使用Windows驗證或SQL驗證。
  記得,驗證連接的工作不是使用者,最常使用驗證工作的是ASP.NET等應用程式,User <-- *.aspx --> ADO.NET --> Database,這樣的流程看的懂嗎?驗證的工作作用在ADO.NET那一段,它會與DataBbase驗證溝通以取得存取的權限,如果是本機連線可選擇Windows驗證模式,如果是遠端連線就選擇SQL驗證模式。

獨立安裝SSE

  如果你是獨立安裝SQL Server 2005 Express資料庫,在安裝時有幾點要注意的地方。
  • SSE_執行個體.png「具名執行個體」的地方可以修改成任何你想要的名稱,其實這個執行個體名稱我是建議可以修改,如果有莫名的人要求連接時除了IP Address外,他也要完全猜對這個執行個體名稱,才有辨法連接,可以提升一些安全層級,我們測試上就使用預設SQLExpress即可,如果是正式對外的伺服器,還是修改一下的好。
  • SSE_帳戶服務_啟動SQLBrowser.png在下方有兩項安裝完成時要啟動的服務,預設只有SQL Server,如果你要開放遠端連接那請再勾選「SQL Browser」選項。(也可事後需要時再啟動)
  • SSE_驗證模式.png驗證模式,如上所述,只有本機連線就使用Windows驗證,如果開放遠端連線,那就選擇混合模式;在設定為混合模式時強制要設定sa的密碼,而且必須是「強密碼」。(也可事後需要時再修改驗證模式)
  如果是使用Visual Studio 2008 Express來安裝,就是一切採用預設值,如果有需求事後在使用SSMSE等工具來修改即可。

遠端連線一:使用SSMSE連接

  這裡我們預設你使用VS2008安裝起來的環境,我們先從測試本機連線,然後修改設定讓SSE開放遠端連線的權限。(這裡為了測試方便,先關閉VMWare中XP的防火牆)

  先到VMBruce這台主機:
  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> SQL Server Management Studio Express --> 出現「連接到伺服器」,「伺服器名稱」因為我們是本機連接,所以預設值是「.\SQLEXPRESS」,「驗證」因為我們還沒修改設定,所以只能以「Windows驗證」來連接,按下「連接」來連接到本機執行個體名稱為SQLEXPRESS的資料庫。
  • SSMSE_Connection_連接到伺服器如果畫面上沒有出現錯誤訊息,而且可以看到以下畫面,那就代表本機連接成功。
  • SSMSE_連接成功再來我們要修改設定讓SSE可以支援遠端連線,點選最上層有綠色三角形的地方 --> 右鍵 --> 屬性 --> 安全性 --> 選擇「SQL Server 及 Windows 驗證模式」。
  • SSMSE_SQL Server及windows設定驗證模式確認sa的相關設定:由最上層 .\SQLEXPRESS --> 安全性 --> 登入 --> sa --> 右鍵 --> 屬性 --> 一般:請一定一定要設定一個「強壯的密碼」
      --> 狀態 --> 登入:請選擇「已停用」,表示這個sa使用者不能由遠端登入。sa使用者的圖形會多一個紅色向下的箭頭。

  • 建立一個可遠端連線的使用者:在sa上層的「登入」點選 --> 右鍵 --> 點擊「新增登入」。
    1、我們建立一個「kkbruce」的使用者,選擇「SQL Server驗證」,密碼是「12345」,注意,我們是為了測試方便去除下方的「強制執行密碼原則」,正常情況下最少請保留這個勾選。
    2、「伺服器角色」請在加勾選「sysadmin」。
    3、「使用者對應」是選擇這個使用者登入後可使用的資料庫。
    4、「狀態」請確認「連接到Database Engine的權限:授於」與「登入:已啟用」。最後按下「確定」新增完成。可先離開本機SSMSE管理工具。
SSMSE_建立遠端連線使用者
  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> 組態工具 --> SQL Server介面區組態
  • SS2005_SQL Server介面區組態點擊下方「服務和連接的介區組態」
    1、SQLEXPRESS --> Data Engine --> 服務 --> 服務狀態:正在執行。(基本上如果你有做任何修改設定的動作,請來這裡按下方的「停止」再按「啟動」,讓SSE可以重新讀取新的設定。也可在「組態管理員」中設定,下一節介紹。)
    2、SQLEXPRESS --> Data Engine --> 遠端連接 --> 請選擇「本機和遠端連接:只使用TCP/IP」。
    3、SQL Server Browser --> 服務 --> 預設是「停止」,請點擊「啟動」。
    設定完成,可離開SQL Server介面區組態。

  • 開始 --> 所有程式 --> Microsoft SQL Server 2005 --> 組態工具 --> SQL Server 組態管理員,你可以在組態管理員中直接對相關服務進行「重新啟動」等相關動作。
  • SS2005_組態管理員接下來我們要設定最重要的TCP/IP
  • SS2005_網路組態_TCP/IP請先確認「SQL Server 網路組態 --> SQLEXPRESS通訊協定 --> 右方的「TCP/IP:已啟用」然後在TCP/IP上按右鍵 --> 內容 --> 選擇「IP位址」,重點在那個「IPALL」的選項中,請先刪除「TCP動態通訊埠」中的值,然後在「TCP通訊埠」中鍵入:「1433」。
  • 完成後,回到「SQL Server 2005 服務」中「重新啟動」兩項服務。
  設定完VMBruce後,我們回到Bruce這台主機,打開SSMSE,然後鍵入相關資訊:

Local_SSMSE_輸入遠端連線資訊  按下「連接」:

Local_SSMSE_連接成功  是否有看到原本主機名稱的地方現在出現的是「遠端主機IP Address」,代表遠端連接成功。

遠端連線二:使用ASP.NET For ADO.NET連接
  
  在Bruce這台主機執行以下步驟:
  • 開啟Visual Web Developer 2008 Express開發工具
  • 檔案 --> 新網站 --> ASP.NET網站 --> 檔案系統 --> D:\WebSite1\ (路徑可自訂)--> 確定
  • 在點選右方的「資料庫總管」--> 資料連接 --> 右鍵 --> 加入資料連接
  • VWD_Select_DataSource_Microsoft SQL Server選擇「Microsoft SQL Server」,按「繼續」後,鍵入相關資訊;
  • VWD_加入連接_輸入遠端連接資訊鍵入後,1、記得勾選「儲存我的密碼」。2、可先按下方的「測試連接」,如沒問題,再選擇「選取或輸入資料庫名稱」,點選一下,系統會自己幫你代出可連接得資料庫名稱。最後按下確定,完成連接。
  接下來的*.aspx實作就換你接手了,基本的connectionString會像這樣:
connectionString="Data Source=192.168.254.103\SQLEXPRESS;Initial Catalog=Northwind;User ID=kkbruce;Password=12345"
  基本上這個connectionString是不安全的,因為這個字串內的資料是完全明碼的存在於Web.conf或*.aspx之中,應該在本機測試完成後,上傳到實際運作的伺服器後實行"加密"的步驟。不過"加密"離遠端連線主題太遠了,有空再聊。

防止1433 port攻擊

  我們使用MS內建Windows 防火牆(Windows Firewall/Internet Connection Sharing (ICS))來防止SQL Server 1433 port的攻擊。為什麼會有1433 Port的攻擊呢?在早期的SQL Server中有一個不需密碼的使用者"sa",而這個使用者又偏偏在SQL Server有極大的權利,可以呼風喚雨,而我們這些SQL Server安裝後設定的預設服務Port就是1433,而駭客們就是使用"人性=懶=惰性"的漏洞,許多的資料庫系統安裝人員很習慣性的「下一步」「下一步」,而建立了許多的「預設型」SQL Server,駭客們就先Scan你的網路是否有開啟1433 port,有的話,接著他會試著使用sa這個使用者來連接,因為不用密碼,然後就BingGo!或是你有設定密碼,駭客們也是可以慢慢猜,讓你防不勝防。所以灌好SQL Server的第一步就是幫sa這個使用者設定一個「非常強壯密碼」來進行保護的第一步。

  不管你是使用硬體或軟體的防火牆,基本的方向是一樣的,因為SQL Server不是讓使用者來存取的,而是讓ASP.NET等應用程式來存取,ASP.NET等應用程式的主機是少數,所以我們這台SQL Server應該限制只讓特定主機來存取1433 port,其他一律設定為拒絕(Deny)動作。

  步驟一:切換到VMBruce主機

  開始 --> 控制台 --> Windows 防火牆 --> 確定「開啟」 --> 選擇「例外」

Windows-Firewall-例外設定

  --> 點選「新增程式」 --> 尋找程式「C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe」

Windows-Firewall-例外設定-加入sqlservr.exe
  --> 變更領域 --> 自訂清單

Windows-Firewall-例外設定-變更領域  在自訂清單內加入開放連接的主機IP Address(簡言之就是這個IP Address是你所信任的),例如輸入:192.168.254.100,限制只有這一個來源IP Address可以與sqlservr.exe連線。

  步驟二:

  重覆以上步驟,加入程式「C:\Program Files\Microsoft SQL Server\90\Shared\sqlbrowser.exe」到防火牆的例外清單中。
註:程式路徑可能需要依你安裝的路徑做修改。
  兩個簡單的步驟就可以將SQL 1433 port攻擊的傷害減到最低,當然針對SQL的攻擊還有很多,例如針對SQL語言的攻擊,是"SQL語言"不是"SQL Server",防1433 port攻擊只是確保資料庫系統的安全之一,但不保障透過其他而來的各種攻擊。例如:SQL injection,SQL隱碼攻擊 Or 跨網站指令碼, Cross-site scripting,通常簡稱為XSS…等等的攻擊。好的系統維護人員,必須時時注意,處處小心,讓系統保持在安全、穩定的狀況下。

總結

  雖然標題是談「遠端連線」的方法,但也談了很多基礎的東西,知道的就當成複習,不知道的就當成基礎篇看一看,當你是使用本機連接時,設定簡單,保護也簡單,但當你開放遠端連接時,設定的步驟就麻煩很多,而且還要考慮到網路安全方面,但遠端連接也立刻讓你的ASP.NET等應用程式的應用彈性大大提升。有一利必有一弊,掌握基本原則,不需要的服務絕不開,開了就要做好萬全的保護。

  最後再提醒大家,如果你想好好提升SQL Server方面的實力,那「SQL Server 2005 線上叢書」一定好好利用,如果本文中有任何看不清楚、不了解、不明白,先打開這本線上叢書,好好查詢了解,一定會有你要的答案。

最後感謝你看完"LoLo長"(閩南語)的本文,送給各位一份本文完整的PDF:



#2008/8/17:更新「.NET Framework 3.5環境」到Service Pack 1環境。

這算是資訊安全的漏洞嗎?

  我有一位同事小洋,小洋與老婆相識十年,結婚十年,在進入十週年結婚紀念日前,他想把過去的點點滴滴收集的起來,他慢慢整理,寫在他自己的部落格,準備當成禮物送給老婆,而他的Blog是使用MSN帳號所申請的。

  而在一場聚會中,他因有事晚到,而同事聊著聊著就聊到"爸爸"這個話題,因為今年公司很旺,今年公司總共會出生1位男丁,3位千金,其中一位就是我。而突然有一位同事小元說,他認為小洋真的是一位好爸爸,好老公。我們有一半的人就用半疑惑眼神看著這位同事,原因是這位是新同事來公司沒幾個月,他怎麼會對小洋如此了解。

  我們好奇的問:你怎麼知道?小元說:我有看他的Blog。什麼Blog?我們和小洋在一起工作3年多,怎麼不知道有他有Blog,而你怎麼知道?這時有其他幾位同事也說,他們都會去看小洋寫給老婆內容的Blog,哇!!!

  這是怎麼回事,有精彩、噁心、肉麻的內容,幾位同事分享著Blog的內容…主角出現了,我們當然全部投以閃亮亮的眼神,當我們問他Blog的事情時,小洋突然一臉茫然說:你們怎麼知道???你們怎麼看得到???看著他一臉不知所措,我們大家"笑"的更大聲了。

  原因揭曉,原因就是如果你是使用MSN帳號在MSN開的Blog,如果你有更新Blog的內容,MSN會很好心的幫你提醒你MSN Messenger上的好友們說你的Blog有更新內容,雖然我使用MSN有一段不算短的時間,但我怎麼不知道有這種功能?

  原來他提醒的方式是我們原本的小綠人旁會多一個象小星星或小花的記號,如果有那個記號就是這個人的Blog有更新。原來如此。我的這位同事,用光速的速度回公司,快點查明設定,重新設定。

  第二天,MSN的抬頭:羞死人了!

msn_blog_update.PNG
  這個事件提醒了我們,電腦不會當駭客,網路不會當駭客,資訊安全的一切都是出在"人"身上,這個事件是MSN的錯嗎?絕對不是。如果各位未來有在MSN的Blog上看到一些怪怪的內容,記得基於"道義"也好,"友情"也好,問一下這位你MSN上的仁兄,是不是沒把設定搞清楚。

不讀書的快樂童年-暑假及憶童玩

  小時候,第一次上學是上幼稚園,還記得那時的我每天都非常的快樂,因為幼稚園的的生活就是玩、吃點心、玩、吃點心,而且在幼稚園裡有好多好多的小朋友可以一起玩。不過這段快樂的時間只有過了一學期我就沒在去了,我還記得原因,家裡說沒錢讓我去上課,等國小再去就好,就這樣等到我進入國小。

  其實,國小前的回憶能記得的真的不多,只有零星一些片段。但國小的印象就多了許多,像國小時記得老師注音教的好快,好像小朋友都已經在"幼稚園"學過似的,造成我後來國語成績一片紅海,在六年當中最快樂的日子當然就是學校的寒暑假。

  可能是鄉下的關係,小時候的暑假可是不會無聊,也是為什麼會想寫這篇"暑假"的原因是:

  1、在我新竹宿舍旁鄰居有一位小朋友,他今年要升國小六年級了,從搬來認識他到現在也已經有三年的時間,每一次暑假時他出現在我們房間的時間就大大增加,也不是不歡迎他,而是我們下班回到家後實在也沒什麼力氣在跟他聊東聊西,而且如果每天你下班回到家就有一個人馬上衝到你房間,那種「有朋自遠方來」的感覺都沒了。當然就會問問他為什麼不去找同學、朋友呀之類的話,回答是第一:不想找,第二:在家裡好無聊…聽了都快@.@!

  2、也是暑假,我哥有兩個國中的小朋友,暑假也是一直在喊無聊,在家如果不是上網打Online Game,不然就是上IM(MSN或Yahoo)跟朋友聊天,再不然就是看電視。沒啦!一個暑假就這樣的過了。

  如果過了十年、二十年都不知道他們是否可以像我一樣,在最珍貴的童年可以有一段不錯又快樂的童年回憶,而不是只是補習班、才藝班、Online Game、IM、電視,這些有什麼是「值得回憶」或「值得成為你的回憶」?

  河--游泳、魚、蝦、烏龜…

  如果你問我喜歡小時候那個沒建設的農村還是現有重建過的農村,我一定回答:「小時候的農村。」沒建設代表沒破壞,回想小時候環境,可以說原始但我認為是現代人所追求的天堂。

  小時候,家裡附近有許多條河,有大河、小河,而這些河流就是我們這群小鬼頭在暑假很重要的娛樂來源。就像童歌裡唱的:「我家門前有小河,後面有山坡…」,大河是我們消暑最重要的來源,我們整群小鬼常常跑到上游的大河游泳,這河的水量很大,下游灌溉都是由它來分支流出,撲通跳下去,是看不到人的,從河的上面段跳下去,從下面段爬上來,在水中隨意飄浮,跳水的姿勢千奇百怪,以我們的年紀來說,可是不會輸奧運的跳水。

  最好笑的,因為暑假其實也是農忙時,常常有小朋友的爸媽跑來這裡"抓人",我們常常就光溜溜躲在河邊的草叢,或是直接就跳進水裡躲起來,不過非常幸運的是,我們在這條河玩了那怎久從來沒發生過任何意外。

  小時候的河是充滿生命力的,而這生命力也為我們帶來許多美好的回憶。我們整群小鬼也是會常常跑到附近的河裡"冒險",冒險就是到河裡去抓東西,為什麼說是東西呢?因為能抓的東西實在太多,大肚魚、吳郭魚、土蝨、螃蟹、蝦、烏龜、鱉、蝌蚪…不管是用抓的、用釣的,那種河裡生態是現在那種死氣沉沉的河川所無法比擬。

  蟲、蟲

  當我們在小河中冒險時翻著石頭,常常可以看到蜻蜓的幼蟲。黃昏時,一大堆蜻蜓在空中飛翔。榕樹下的日子,蟬、獨角仙、剪刀蟲(正確名稱是「鍬形蟲」,小時候我不知道),還有竹筍蟲。這竹筍蟲一定要跟各位好好介紹一下,他可是一道人間美味,竹筍蟲顧名思義就是吃竹筍的蟲,小時候農村家家戶戶多少都會被竹林包圍起來,而鄉間小道上也是一片一片的竹林,有竹林當然就會長竹筍,有竹筍就會有竹筍蟲,而當我們抓到竹筍蟲會用打火機或番仔火把竹筍蟲烤熟,一口咬下,嗯~回味呀!

  還有,小時候記得在暑假時,每天晚上到處都是螢火蟲,尤其是在田裡或小河邊,一大片,真的是隨便抓抓都是算堆的,然後放到玻璃罐子裡,看著這神奇尾部會發光的生物。

  不能想像,當我們建設環境、破壞環境後,現在的小朋友居然要拿著千元大鈔去買一隻獨角仙回來養,螢火蟲要到特定的旅遊地點才能看到。如果我小孩長大,我跟他們說我小時候的生活環境他們會不會說:「爸爸你少唬人了!爸爸你說謊!爸爸你騙人!」

  榕樹下

  小時候家裡的附近環境是圍著一間廟建設起來的,廟前有一顆大榕樹,這顆大榕樹可是夏日小朋友們不可缺少的,它的大枝大節所生長出來的樹葉,為我們撐起一支大陽傘,在它樹蔭底下吹著風,不只涼快,更是我們遊戲進行的地方。

  大榕樹的枝節粗大,所以我們常樹上樹下爬來爬去,在剛爬上去有一根橫的枝節,在這枝節的地方有一個自然產生的凸出形狀,這凸出的形狀很自然形成一張臉的模樣,兩個眼睛、鼻子、嘴巴,我一直都認為這是顆神樹,有神明住在裡面,所以在樹枝上才會有那樣的形狀。

  在大榕樹下可是我們村裡這些小鬼頭的聚集地,不管是下課後、暑假、寒假,假日…基本上這裡就是我們的遊戲天堂,沒有干擾,盡情遊戲,所有的遊戲內容只有少數是需要花費「新台幣」,笑聲免費、快樂免費,當然帶給我的回憶也是免費。回憶這些童玩,許多已經只剩印象、名稱,玩法已經記不得了,不過還是值得一提,其中有些遊戲我歸納在「小偷」:

  • 捉迷藏
  • 鴻國大地
      這是一種比大小的遊戲,小朋友會分成兩組人馬,兩組人馬會用數字設定每個人大小,1最大,大的可以抓小的,最小可以抓最大的,有點像象棋規則,然後你要想辦法去猜出每個人大小,其中犧牲是少不了的,你知道了對方的號碼後,會用最快最大的聲音跟隊友通知,可能你抓到人,也可能被抓。然後你就要想辦法去抓數字比你小的人,當然,對方也是一樣。除了抓人之外,你也可以營救隊友,你只要有辦法在不被抓到的情況下,到達敵人的地盤上去Touch到隊友即可,是一個好玩又有趣的遊戲。
  • 跳格子、跳房子
  • 陀螺
  • 毽子
      這裡的毽子不可以花錢買的毽子,小時候沒有什麼飲料這種東西,家裡最好飲料是一種農會玻璃瓶米漿和豆漿,尤其是夏天,家裡一次叫都會叫好幾箱,而這種玻璃瓶米漿豆漿的蓋子跟玻璃啤酒或玻璃可樂一樣,就是我們拿來做毽子的材料。我們將蓋子打平,然後在中鐵釘打個洞,然後用塑膠繩穿過後打結,就可以拿來當毽子玩。
  • 竹蜻蜓
  • 飛盤
  • 尪阿標紙牌
      這個紙牌的玩法可是不輸撲克牌,可以使用上面的「車、馬、炮…」文字來玩,這種是類似象棋,還有一種是兩個人各拿出一半的紙牌,將紙牌疊在一起,然後會使用比較「粗」的紙牌來打那疊紙牌,其中第一個把最下面那一張打出來的人就可以贏得所有紙版。…還有一些不記得的玩法了,我想,這應該可以算是現在遊戲王紙牌遊的祖先了吧。
  • 橡皮筋
      這個玩法第一種跟紙牌很象,也是雙方各出一半的橡皮筋,然後疊起來,然後雙方每個人輪流射一次,將橡皮筋射出多少,就可以得到多少,如果你射的那條王陷在那疊橡皮筋中,那你那條王也算那一疊的其中一員,你就必須再拿一條出來射,誰射的多,誰就可以得到較多的橡皮筋。
      還有一種是跳高遊戲。小時候我們會把贏來的橡皮筋拿來做一條長長的像跳繩的橡皮筋,這條橡皮筋會拿來玩跳高。由兩個人個拿一邊,由雙腳踩到地上開始,讓人跳過去,然後慢慢升高,膝蓋、腰、腋下、肩膀、耳、頭頂,最後也是最難的是兩個人都將雙手高高舉直,記得規定上是到肩膀以上才可以碰到繩子。
  • 玻璃彈珠
  • 丟米包
  • 跳人馬
  • 123木頭人

  小偷

  之所以說這個遊戲的會歸類在「小偷」,實在是因為以現在社會的眼光,如果這些事件爆發(就是被抓到),一定可以上新聞、上頭條,然後就有一大堆人在罵:「我們的教育出了什麼問題?」不過我自己做過這種行為,我了解這種小朋友「小小偷心態」。小時候的我們,沒有任何壞意,只是一個不懂事的小朋友在做一件不應該做的事。只是單純的好玩,單純的童心。

  農村有一個好處,就是玩樂的地點非常的多樣,田野間、小河中、河堤旁、大樹上、大樹下、同學甲、乙、丙…的家裡,而且鄉間的農作物是非常多樣,記得,小時候會去偷挖地瓜、偷摘桃子、番石榴(芭樂),還有一次去蘭陽溪上遊,去偷抱西瓜。

  但我要說明一下,小朋友的我們通常是在現場偷摘一些吃吃,不會像現在是真的大偷,什麼是大偷?舉個例子,我家住宜蘭三星,而你一定聽過「宜蘭三星蔥」,三星蔥出了名後,如果在蔥價高漲時,就常有有小偷半夜開著卡車到蔥園,花可能不到幾個小時的時間,將蔥園一掃而空,將這些農民幸苦的成果,偷光光。真的是罪應萬死的人,雖然我家沒被偷過,但是這種人我也是非常恨他。

  紅白機

  任天堂的紅白機,它的地位應該不會少於現在Online Game,或是 Wii,但我很高興也很後悔,高興的是它讓我有超級瑪麗、沙羅曼蛇、魂鬥羅、勇者鬥惡龍、1943、三國誌…無數個回憶,只要你努力,「破關」決不是問題;但現在的我也很後悔,後悔一個「迷」字,為了它我不知道花了多少的時間,多少的精力,找出了三國誌裡可無限升級的「落鳳坡」,魂鬥羅裡升級30條生命的「上上、下下、左左、右右、BABA」,當你發現了一個全世界都不知道的特殊按鍵組合,那種成就感,沒錯,是很高,但玩這種遊戲機到一種「迷」時,回想過去真的是…荒廢人生。

  看到我身邊家族裡小學、國中、高中的小朋友,看到他們一個一個沉迷於線上遊戲,家族的長輩有時會請我用「大哥哥」的角色,請我們念念這些小朋友,但我真的不知道要如何開導他們,我小時候一個Game了不起玩幾個月,破關,除非有新遊戲,不然大概不會沉的那怎嚴重,但現在的Online Game是沒有破關這種東西,為了練功、為了等級,練到都沉到深海去,怎麼撈?現在的我或許要感謝小時候的那段經驗,老實說,現在的我對那種「不能破關」的遊戲跟本就一點興趣都沒有,只是花越來越久的時間在打同一隻怪,升那一等級,好無聊。或是換個心理學角度來說,可能是我小時候玩任天堂的"量",讓我的需求非常的滿足,所以長大成人後,不會產生這種沉迷遊戲的偏差。

  麥芽糖

  這個麥芽糖可是得來不易,小時候會有一個伯伯(台語發音),每週固定一個時間會來收破銅爛鐵,而我們小朋友可以拿破銅爛鐵去跟他換全世界最棒的零嘴:麥芽糖。我們會利用時間去到處去撿、收集、去跟人家要,然後收集起來,等到那一天的到來。他會騎著古早式腳踏車,這種腳踏車前面有個燈,前輪會有個發電設備(多先進的發明呀),後座會放著一個白色的鐵箱子,而當我們看到他打開箱子,拿出竹筷往裡面一插,轉一圈,吃著麥芽糖的心情我到現在都還能感受到。

  說到這腳踏車,也是有回憶,小時候很想學騎腳踏車,但因為這種古早式的腳踏車中間有一根鐵條,而我們都太小隻了,跨不過去,只好把一支腳由這鐵條中間的洞的穿過去,然後你就會看到一個小朋友「斜」著身體踩著腳踏車,而且還可以飛快的前進。還有,小時候好玩,不知道騎太快是無法轉彎的,有一次在過彎時,就整個人飛到河裡,頭破血流的回家。到現在我媽都還記得這件事。(其實我媽每次提起這件事時,我都裝忘記,其實我是記得的,只是不想承認。)

  註:古早式腳踏車可參考圖片:http://ifo.tainan.gov.tw/File/Publish/20077101641731.JPG

  爆米花

  如果你如我的年紀相當,你一定聽過這首歌:

爆米花

嗶嗶啵啵嗶啵啵 嗶嗶啵啵嗶啵啵
爆米花 爆米花 一顆玉米一朵花
兩顆玉米兩朵花 很多玉米很多花
有一顆玉米不開花 問一問它 
為什麼你呀不開花
嗶嗶啵啵嗶啵啵 嗶嗶啵啵嗶啵啵
爆米花 爆米花 一顆玉米一朵花
兩顆玉米兩朵花 很多玉米很多花
我們心裡也開花 美麗的花 
快樂的開心花
  如果你想聽原音的話,拜搜尋引擎及科技所賜,找一下關鍵字「爆米花 歌」就可以來段回憶。

  場景在大榕樹下,記得一樣是每週有個固定時間,一位伯伯(台語發音)會騎著改裝的機車,載著一根好像「火箭炮」的東西來爆米花,那時候的爆米花的材料很簡單,就是我們每戶人家準備一杓米(小時候都是使用像吃完的鳳梨罐頭之類容器來量米),伯伯會準備一塊板子,然後你就會看到大家會依來的先後順序將米排好,然後伯伯開始要爆米花。

  伯伯拿起米往那火箭炮裡倒進去,然後會問你要不要加花生,當然加花生是要加錢的。倒進去後他會把火箭炮口蓋起來,然後放到火上面燒,而火箭炮會在上面一直轉,等一會兒,也是小朋友們又愛又怕事,伯伯準備要開炮了,他拿著工具在那炮口,炮口前會有一個鐵網,伯伯喊著:來哦,來哦,來哦…「蹦」的一聲,一陣白煙後,鐵網裡一顆一顆飽滿白花花米粒就出現在鐵網裡,然後再經過麥芽糖加工,就成了繼麥芽糖之後,人間第二美味的零嘴。

  在我們的時候,麥芽糖有無比重要的地位,麥芽糖(麥芽糖餅乾也是一絕)就已經是我們最棒的零嘴了,或許是愛吃糖又不愛刷牙,才沒幾歲,牙齒就已經壞光光,為了保護剩下的牙齒,現在三餐飯後一定馬上刷牙,和任天堂時代一樣,當初的快樂,也是現在的後悔。

  最後我們來唱一首歌《抓泥鰍》,一樣如果你和我的年紀相當,一定會唱:
侯德健 詞/曲

池塘的水滿了,雨也停了!
田邊的溪泥地到處是泥鰍,天天我等著你
等著你抓泥鰍,大哥哥好不好咱們去抓泥鰍!
小牛的哥哥帶他去抓泥鰍,大哥哥好不好咱們去抓泥鰍!
小牛的哥哥帶他去抓泥鰍,大哥哥好不好咱們去抓泥鰍!
大哥哥好不好咱們去抓泥鰍?
  以上很多都是下課後學校不教的事,或許我談的這些已經是「回憶」,現在的世界已經失去太多東西,古人說:「前人種樹,後人乘涼。」但我們在進步的同時也許要好好想想:「我們失去了什麼?我們留下了什麼?」願我們都能給孩子有一個快樂的童年回憶。

  或許我的抬頭應該改成:不讀書、愛吃糖、沒牙齒的快樂童年,笑~^.^