ASP.NET MVC3 - TempData的Session消失問題

網友一篇「 MVC 3上,Session消失的問題與解決辦法」引起我的興趣,我留言要了些基本的Code,以下是我驗證程式碼,結論是,Session並不會消失,怪怪!

Step 1. 新增Controller及Action
以下程式碼為驗證使用,沒有進行任何安全過濾,請不要使用。

Imports System.IO 

Namespace UpDownFileFromDBMvc
    Public Class FileUploadAndSessionTestController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /FileUploadAndSessionTest/Upload

        Function Upload()
            Return View()
        End Function

        
        Function Upload(upfile As HttpPostedFileBase )
            If upfile  IsNot Nothing andalso upfile.ContentLength > 0 Then
                Dim savePath As String = Path.Combine(Server.MapPath("~/Files/"), upfile.FileName)
                upfile.SaveAs(savePath)
                TempData("FileName") = upfile.FileName 
            End If

            Return RedirectToAction("FileInfo")
        End Function

        Function FileInfo()
            ViewBag.FileName = TempData("FileName")
            Return View()
        End Function

    End Class
End Namespace

以上參考該網友提供程式碼,我所撰寫的VB程式碼。

Step 2. 新增Upload與FileInfo的View

Upload.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Upload
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Upload</h2>
<%Using Html.BeginForm("Upload", "FileUploadAndSessionTest", FormMethod.Post, New With {.enctype = "multipart/form-data"})%>
    <%: Html.ValidationSummary(True)%>
    File:<input id="upfile" name="upfile" type="file" value="" />
    <br />
    <input type="submit" value="Upload" />
<%End Using%>
</asp:Content>

FileInfo.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
FileInfo
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>FileInfo</h2>
Upload File Nale: <%: ViewBag.FileName %>
</asp:Content>

以下為執行結果圖。

Upload File then Pass file name
圖一:Upload File then Pass file name(點擊看大圖)
程式唯一不同處只有路徑我有先使用Path.Combine處理過,不知道是不是這個原因。

重構 - List of Sound Bites(原音重現)

以下節錄《重構-改善即有的設計》一書最後一篇的重點清單,此章我認為是《重構-改善即有的設計》此書中最重要的一章,它提出讓程式裡不應該有的壞味道。
p.7
When you find you have to add a feature to a program, and the program’s code is no structured in a convenient way to add the feature, first refactor the program to make it easy to add the feature, then add the feature.
如果你發現自己需要為或式添加一個特性,而程式碼結構使你無法很方便地那麼做,那就先重構那個程式,使特性的添加比較容易進行,然後再添加特性。
p.8
Before you start refactoring, check that you have a solid suite of tests. These must be self-checking.
重構前,先檢查自己是否有一套可靠的測試機制。這些測試必須有自我檢驗能力。
p.13
Refactoring changes the programs in small steps. If you make a mistake, it is easy to find the bug.
重構技術係以微小的步伐修改程式。如果你犯下錯誤,很容易便可發現它。
p.15
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
任何一個傻瓜都能寫出電腦可以理解的程式碼。唯有寫出人類容易理解的程式碼,才是優秀的程式員。
p.53
Refactoring (noun): a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior of the software.
重構 (名詞):對軟體內部結樣的一種調整,目的是在不改變「軟體之可察行為」前提下,提高其可理解性,降低其修改成本。
p.54
Refactor (verb): to restructure software by applying a series of refactorings without changing the observable behavior of the software.
重構 (重詞):使用一系列重構準則(手法),在不改變「軟體之可察行為」前提下,調整其結構。
p.58
Three strikes and you refactor.
事不過三,三則重構。
p.65
Don’t publish interfaces prematurely. Modify your code ownership policies to smooth refactoring.
不要過早發佈介面。請修改你的程式碼擁有權政策,使重構更順暢。
p.88
When you feel the need to write a comment, first try to refactor the code so that any comment becomes superfluous.
當你感覺需要撰寫註釋,請先嘗試重構,試著讓所有註釋都變得多餘。
p.90
Make sure all tests are fully automatic and that they check their own results.
確保所有測試都完全自動化,讓它們檢查自己的測試結果。
p.90
A suite of tests is a powerful bug detector that decapitates the time it takes to find bugs.
一整組測試就是一個強大的臭蟲偵測器,能夠大大縮減搜尋臭蟲所需的時間。
p.94
Run your tests frequently. Localize tests whenever you compile – every test at least every day.
頻繁地執行測試。每次編譯請把測試也考慮進去 – 每天至少執行每個測試一次。
p.97
When you get a bug report, start by writing a unit test that exposes the bug.
每檔你接獲臭蟲提報,請先撰寫一個單元測試來揭發這隻臭蟲。
p.98
It is better to write and run incomplete tests than not to run complete tests.
編寫未臻完善的測試並實際執行,好過對完美測試的無盡等待。
p.99
Think of the boundary conditions under which things might go wrong and concentrate your tests there.
考慮可能出錯的邊界條件,把測試火力集中在那兒。
p.100
Don’t forget to test the exceptions are raised when things are expected to go wrong.
當事情被大家認為應該會出錯時,別忘了檢查彼時是否有異常被如期拋出。
p.101
Don’t let the fear that testing can’t catch all bugs stop you from writing the tests that will catch most bugs.
不要因為「測試無法捕捉所有臭蟲」,就不撰寫測試碼,因為測試的確可以捕捉到大多數臭蟲。
我個人是對p.88這一條有些意見。但事後想想,他的意思應該是讓程式自我解釋,不過這有很大的難度。相反的,在一些教科書或實作上,我們希望註解是越清楚越好。

小孩帶金剛 - 什麼是寵愛與溺愛?

上週,小女因病住院一週。幾次住院的日子裡,可以碰到各式各樣的照顧者,父母、祖父母、舅舅、姑媽…其中以父母與祖父母最多。

在院照顧的日子多了,碰過許多讓人…搖頭的照顧者,例如,有一次碰到一位國中小女生與祖母,這位小女生把病房當自己家,帶著一個Radio來病房聽音樂,這沒什麼關係,不過晚上九點…十點…十一點…她們還在聽,而且還在和祖母聊天。越晚越靜時,一點點小聲音就顯的很大聲,我們可以忍受(或說習慣)孩子不舒服所產生聲音,但音樂加聊天聲,實在讓人無法休息。更好笑的話,隔天下午約兩、三點時,這對祖孫可能是前一天聊太晚累了,想要休息,這位小女生還用不小的音量說:「聊天的聲音好吵哦,我都沒辦法睡午覺。」

重點是這位長輩,從頭到尾都是和孫女同一陣線,讓人直搖頭。

不過,這次住院碰到Particular Case,讓我深刻了解寵愛與溺愛,算是另類「小孩帶金剛」的教育。

Tool - Longman Dictionary of Contemporary English, 5th Edition In Windows 7 No Voice

如果你的Longman Dictionary of Contemporary English, 5th Edition (2009) 在Windows 7中無法播放聲音,試試以下解決方案。

Step by Step 1:控制台 → 聲音 → 喇叭 → 右鍵 → 設定喇叭 → 立體聲

如果你的硬體規格是比較新的,可能音效支援可能有「立體聲」、「四聲道」、「5.1環場音效」、「7.1環場音效」,Longman Dictionary of Contemporary English, 5th Edition (2009)只能在立體聲下播放。

Step by Step 2:控制台 → 聲音 → 喇叭 → 右鍵 → 內容 → 等級 → CD音訊 → 不能靜音

Windows 7 CD音訊設定
圖一:CD音訊設定

金剛帶小孩 - 是誰殺了孩子的想像力?

當了爸爸後,會很注意孩子的變化,這些變化有好有壞,有些可避免,有些無法避免。

有孩子的家裡,通常玩具一堆,大玩具、小玩具、滿地整床的玩具,不過在我們家我買的玩具不多,通常是玩到壞了,玩到支離破碎。大寶貝,媽媽教的好,玩具通常是老二玩壞比較多,原因也簡單,因為她才一歲多,正是破壞力超強的年紀,給她破壞王的稱呼絕不過分。

最近,買了一個電話玩具,之前的電話玩具玩壞了,每次看著大寶、二寶拿著電話在對空氣聊天,我都覺的好可愛,現在的玩具都聲光效果很好,按1會說One,按2會說Two,按有馬圖案按鍵會有馬叫聲然後說horse,不然就是Do,Ri,Me,唱歌根本小事。

真理越辯越明嗎?

就我讀過的書,目前只有兩位很會很會"討論"的人,他們不只會問,而且還會說。

  • 會問,能抽絲剝繭,一層一層慢慢進入核心(Core)。
  • 會說,能提出事證,證明或反證明你論點中的盲點(Blind)。
一位是東方代表孔子,一位是西方代表蘇格拉底。他們其實只說不寫,也就是他們本身並無任何著作,所有的著作都是由弟子或後人所幫忙記錄留下來的。

為什麼會想提這兩位,因為每當台灣選舉時間一到,就罵聲四起,好像平常的弊案都不是弊案,選舉時的弊案才是弊案。我先說明,這不是政治文,我不想討論政治。

金剛事件簿 - Some Plurk Fun Talk About Anti-Spam

以下對話來自我Plurk上的一些對話,基本上是"練瘋話"(台),不過覺得有趣,留下來當記念。

  1. 亂擋一通 (from KKBruce)
  2. Anti-Spam filter good (from KKBruce)
  3. Server Crash (email server根本就葛了 from Bill)
  4. Nobody Nobody want you (沒人寄信 from No.18)
  5. 你撥的電話無回應 (網路斷了 from Bruce)
  6. 沒交錢,台電不爽 (機房停電 from Bill)
  7. 找不到Server, 110處理 (server被拆了 from No.18)
  8. 我要成為火影 (一切都是幻覺 from 只能選擇放手)
  9. 我是蛤蜊肉(台) (瞎了,把拉圾郵件當成正常郵了 from No.18)
  10. 馬克,靠!凸!(公司倒閉 from Bruce)

Focus - 買車交車及保養時,應該注意什麼?

朋友在大陸要買車,問我交車和保養時要注意什麼,以下是我個人一些心得。

二內一外

二內,車內與引擎室。

車內,通常比較不會有問題。
引擎室,所有的"油"都有檢查,一般的三油一水、五油一水。

一外,車外的烤漆是否有問題。新車應該一點點"瑕疵"都不應該有。

試著發動引擎,聽聽聲音,通常新車的聲音都很不錯。所有的門,試著開關,都不該有"異音"(久了或許有)。

檢查完,簽個名,車就是你的了,他們就不負責了!^_^

油耗

我的Focus開了十多萬了,油耗嗎…看你是市區為主,還是高速為主。

Focus板金較重,相對安全性高,經常走走停停,油耗就高。

以市區為主,經常起步,油耗相對較高。
以高速公路為主,油耗我覺得好。

最重要的是,你是否"經常大腳",每一台也耗油。如果真的在意油耗,也可考慮柴油引擎,算是另一種省油方式。

保養

每5000公里進廠保養一次,基本上,"耗材類"不算(輪胎、電池、來令片、皮帶 <-- 這四個最常碰到),到沒有什麼大問題。

不要太相信"保養廠"的技師,這是多年保養下來的經驗,我車子因為前三年在保固內,所以都在Ford原廠保養,也習慣了,我有朋友也是在外開保養廠,後來,只要原廠跟我說"什麼東西有點小問題,建議更換",我都會先去找我這位朋友看一下,5-7成,我朋友都是XD原廠,後來,我習慣,有問題,請原廠技師"帶我去看",一方面看他是否在虎爛,一方面請技師解釋一下,這個零件有什麼影響,不影響安全性的問題,我是都不太理他。

大概就這樣。

金剛事件簿 - Why I Deleted Facebook Account

初戀呀!初戀!

一開始申請 facebook 只是好玩,申請了也只是放在那裡,動也沒動過,但我覺得 facebook 厲害的地方在於,讓不動人最後也會去使用它

在使用 facebook 初期,會一段時間的「友情爆發期」,也就是短短一些時間,讓你加入大量的「朋友」,這裡的朋友是指「認識的」、「失連的」、「有關係的」,而不是亂加一通式加入朋友。當你在facebook加入的朋友越來越多,你會發現,它對你的「人際網路」比你還清楚

以我為例,在加入facebook約半年多後,有一天,有一位女性友人申請加入我為好友,通常個人資料不多或照片無法分辨的,我都會留言請問對方是誰?再決定要不要加入,結果讓我大為吃驚,她是我國中的初戀情人。國中畢業後,我們就沒有再碰過任何一次面。能在facebook上相遇,讓我很高興,她已經是二個"大"孩子的媽。還記得當天晚上,馬上跟婆婆報告這個消息,婆婆問我說有什麼感覺?其實,心情很平和,都已經是近二十年前的事了,只是覺得能碰到一個久未見面的朋友,心情還不錯。

但,我覺的我是個怪人。有一天,我覺的不對勁,心裡有個聲音跟我說,你應該要刪除 facebook 了,這個聲音在我心裡有幾個月之久,我思我想,最後我同意了這個聲音,進行刪除facebook帳戶的動作。刪除 facebook 帳戶,對於 facebook 一般用戶可能還不是件容易的事。你在帳號設定裡,只能做「停用」的動作,你完全找不到任何刪除 facebook 帳戶的設定,我停用、又啟用,進入 facebook 的說明裡,打上中文的「刪除」關鍵字,還是找不到,打上了英文「Delete」關鍵字,才找到一個申請刪除帳號的連結,而且刪除後還有14天的後悔期,14天後才會將你的資料刪除。

刪除 facebook 帳戶很多天之後(我沒有特別留意和計算),我終於接到第一通電話,更讓我相信,刪除facebook帳戶是很正確的事。感謝老妹。

理由一:浪費太多時間

facebook 能成為網路世界裡的另一強權,不是沒有理由,需要有大量的使用者,大量的瀏覽量,大量的訊息。另一重點是,新使用者加舊使用者的不斷回流使用。只要開啟瀏覽器,Mouse就會自動的去點擊facebook連結,然後把最近的訊息快速的瀏覽一片,不管現在有多重要的事、多重要的工作…都一樣。

我也發現,如果你能上網的環境越方便,你越是離不開這種模式。有不少次,我帶著寶貝們去公園遊戲區玩,可以發現,許多家長都忙著「看手機」,都忙著「分享照片」,不停「刷」著手指,眼光停留在小孩子的身上都不超過5秒。

每個人的時間很固定,你花在A的時間越多,做B的時間就越少。

理由二:上癮,不是一件好事

網路上癮,可能和「打Game上癮」一樣慘。過與不及都不是一件好事,這我們都知道,讀書是一件好事,但只知道讀書、考試,那叫書呆子。網路資源豐富,如果能掌控、利用它,那是非常棒的一件事,但只拿來上傳照片、傳影片、打卡、打Game…那應該是宅嗎。

又如上面的例子,透過平板、手機等設備,我們可以說做到了「anytime, anywhere, you can do anything」地步,do anything不是do facebook,除了facebook,我們應該還有更多重要的事要做。我又發現,越來越多孩子,出門只坐在旁邊玩手機、平板,而不活動。出了門,還迷在網路上,小孩迷,大人癮,真慘

理由三:太多虛假的人際

80/20法則,大家都應該了解。在facebook中,我發現80/20法則一樣適用,有80%人,從邀請我加入,或我邀請他加入,從頭到尾到我刪除facebook帳戶那一天,我們從沒聊過天!除了平常有在連絡的朋友不談,在facebook上數百位的朋友,全部只有一個人打過電話給我。那是99/1法則嗎?

我認真想過,facebook要我們盡量留下一堆個人資料,那堆個人資料有幾個人會去關心,還是只有facebook會去關心,因為你留的越多,facebook就能分析的越透徹。朋友發生好事或壞事,我們當然會留個言,表達關心,不過那不是我想要的,這和第五點有關。假設你生病住院了,你是希望看到一堆留言說:加油!還是希望接到一通電話,問候你病情如何?還是希望看到這個人出現在你面前,看看你,和你聊聊天?
  1. 留言
  2. 電話
  3. 見面
如果能選擇,電話與見面,是我能接受的答案。但有了facebook,大部份人都選擇留言,只留言的關心,好虛哦!

理由四:理所當然…嗎?

facebook已經變成一個訊息交換中心,這造成一個問題,好像訊息只要有發佈到facebook,理所當然有facebook帳號的人都應該接收到此訊息…是這樣嗎?

理由五:「文字」是一個不簡單藝術

現在是一個文字能力低下的時代,尤其是以電腦代替文字書信,文字書信是指「手寫」的文字書信。不管是和我同年紀、或年紀比較小,用我妹當例子好了,我妹打注音輸入法,我打嘸蝦米輸入法,嘸蝦米輸入法你一定要知道那個字,才有辦法打出來,注音輸入法只要有「音」就能打出來,注音好是好,但不知為什麼現在的人都偷懶成習慣,打錯字不算,打注音都懶得選字,也不管整句組合出來是什麼妖魔鬼怪,看不懂,是因為我年紀老,跟不上潮流。

公司也是,明明就坐在方圓0.5公尺、1公尺、1.5公尺之內,不想站起來走也可以撥個內線,但大家都是選擇使用IM來溝通,明明用講的,不到30秒、1分鐘就能解決一件事,但使用了IM後,絕對花超過3~5倍時間。對於遠方的友人,IM的確是個好工具,但對於位在同一Office的同事們,使用IM是非常沒有生產力的事。

facebook讓人與人能在網路上連結起來,而且能活絡起來,這點是非常不簡單。全世界有多少家公司想做這樣的事,失敗者不計其數,也不能說成功者只有facebook一家,但目前為止,以"全球性"來看,facebook真的是最成功的。

以上是我個人膚淺的理由,在按下刪除鍵之前,我認真想了很多,有些已經忘的差不多了。我妹打電話問我說,你的facebook帳號怎麼不見了,我回說:「我希望有事,妳能直接打電話給我,而不是透過facebook留言。最少,我還能聽到妳的聲音,詐騙集團才騙不到我。」刪除facebook已經是很久的事,除了我妹的那通電話,沒有任何朋友在意我是否還活在facebook的世界裡,原因很簡單,在刪除facebook帳戶之後,從來沒有任何一個人問我關於facebook的事。

So,或許我覺得上facebook已經是種壓力,離開之後我覺得輕鬆很多。

金剛事件簿 - 偷偷摸摸之壹電視網樂通機上盒

停用有線電視與網路

將家中的有線電視與有線電視網路停用。原因主要有:
  1. Cable TV與Cable Net必須一起申請,你能單獨申請Cable TV,無法單獨申請Cable Net。
  2. 每個月Cable TV與Cable Net的費用 1100 ~ 1400 元,這筆費用,我可以每個月拿來投資小朋友新教材,不管買CD、VCD、DVD、書、玩具…都覺得比給孩子看電視來的好。
  3. Cable TV的兒童節目,重播、重播、再重播,我都快要會背稿子了。
  4. 我們看TV與使用Net時間太少,反而都是小朋友在看TV。就算有看,也是吃飯看個半小時的新聞。
  5. 想改走純Internet方案。
純Internet方案,有很多選擇,例如,拿一台NB接電視,然後用PPS,想看什麼播什麼。或是,現在有很多「網路影院」的產品、無線電視台、MOD…,我也有例入考慮。雲呀雲,希望有朵彩虹雲可以用。

簡單說,就是我們家沒有電視的需求,只有網路需求,例如,我們家中的 070 網路電話(節費盒),順便說一下,我在 12/1 日合約到期日,把那不更新軟體 070 軟體網路電話給停用了。我想要只透過網路解決家中的影、音之類的需求。剛好和同事聊天,聊著聊著,同事說,我們的代理商是壹電視網樂通的代理,他手邊剛好有代理商送來的機子(讓我們玩),沒有多久就拿著一台來給我帶回家玩。

壹電視網樂通機上盒試玩心得

  • 除了看節目與影片時,其他什麼都慢。
  • 穩定度…不好。
我拿到時的軟體版本是 247,現在為 251,整個選單的過程就是慢,開機慢,上下慢、左右慢,進出慢,更軟體體也慢,簡言之,就是操作時反應很慢,其他當你開始看節目台(含HD)或電影台時,是OK的。穩定度是指,會當機,一週內有三次,對於我的選擇進入無反應情況,畫面就停在某選單上,通常插拔電後就能回復正常

對於免費的東西,實在不要要求太多,最少看節目與影片時,沒有出過什麼狀況。對於我們只想看看新聞而言,「免費+新聞」,它是能符合我們家的需求。它現在也推出月付 58 元,看電影只要 1 元的方案,實在很有吸引力,但會不會繼續使用,請接下去看。

為什麼說壹電視網樂通機上盒偷偷摸摸


可能是平常工作內容與網路相關,所以對網路動作比較敏感。

試用的前一週,特地花了時間與寶貝們看電影,「心動時刻」、「搶救旭山動物園」都是不錯的日本片,但發現很奇怪的的一件事,為什麼我們看完片子,按下 Power off 後,我的Hub燈號閃的飛快。因為Cable Net的設備只有一個孔,我必須接一台Hub出來才能分接其他070、PC、NB、Wireless…等。看著1, 3孔的燈號閃的飛快,感覺不對勁!(1 是 Cable Net, 3 是壹電視網樂通機上盒)

幾次測試之後,我終於知道原因,原來網通樂在我們按 Power off 後,會偷偷放「廣告」,而且只有聲音沒有畫面。你按 Power off,然後電視不要關,等個約10來秒(看網路速度),你就能聽到廣告的聲音,而且時間還不短。這點讓我很不爽。這就像我們把電腦關機後,還有人用我們的電腦在做其他事一樣,而且是用我們的頻寬在營利他自己,這跟木馬的行為有何不同?

試用是試用,我還是有簽一張正式的簽收單,印象中我沒有看到有如此條約,我又從頭到尾看到二次,我很確定沒有這種行為的條約。我不知道這種行為是否合法,我有發文去問NCC,看NCC回覆吧!

NCC針對網樂通之行為回覆

敬啟者:
  您好!您於12月3日反映「網樂通於關機後仍播放廣告聲音」電子郵件,說明如下:

   網路內容包羅萬象,其所涉各項問題與實體社會一樣,係由各目的事業主管機關依權責處理;本會對於網路內容之管理,係依據本會組織法第3條第5款規定,推動及宣導我國網站內容分級制度。另依100年11月11日立法院三讀通過之兒童及少年福利與權益保障法,賦予本會召集各目的事業主管機關委託民間團體成立內容防護機構等任務,並以「促進業者自律」等更周延的防護機制,保護兒少上網安全。

  壹電視新聞臺雖取得衛星廣播電視節目供應者經營許可,然其經營之網樂通仍屬網路內容,並非以衛星廣播電視法及電視節目分級處理辦法規範;惟為尊重陳情人權益,本會已將您的意見函轉業者請其注意改善。謝謝您的來函,敬祝

闔家平安。                    

 

              國家通訊傳播委員會 敬啟

滿不滿意?

Servey - Mail Server | (4) 自建Exchange郵件伺服器

Exchange 2010建置討論

我們直接進入結論。建置Exchange 2010所花費的軟硬體成本最高,依架構不同,所需費用不同。如以HA為前提,基本上一定破百萬。

AD1 <----> AD2
Ex1 <----> Ex2

如果採購四台實體機:

  • Windows Server 2008 R2 * 4
  • Exchange 2010 * 2
  • CAL * ?


如果採購二台虛擬機:

  • Windows Server 2008 R2 Enterprise * 2
  • Exchange 2010 * 2
  • CAL * ?


Enterprse版本有送四套虛擬機的作業系統授權,但價格也是四倍。
虛擬機因多台OS在上運作,所以通常備份、系統移轉…通常要考慮更完整。

不過,Exchange架構上可以分段來導入,即:

階段一:
AD1, Ex1

階段二:
AD1 <----> AD2
Ex1 <----> Ex2

也就是分兩階段導入,以完成整個HA架構,當然你還可以加AD3, Ex3 … 無限制。

從以上討論來看,架設Exchange郵件伺服器規模可大可小,但通常軟體都比硬體貴。這方面,與你的SA好好討論。

Tool - Longman Dictionary of Contemporary English 5th Edition - 朗文當代英英辭典第5版使用心得筆記

為何要買英英字典?

之前透過Plurk看到暗大貼的一篇文章「你不可不知的字典知識」,讓我決定購買我的第一本英英字典,我選擇英英字典是因為,英漢字典或漢英字典在現在網路通訊發達的年代,要取得免費英漢字典或漢英字典資源,相當簡單,例如,Yahoo迷你筆…之類的產品很多,不管是Online字典或需安裝軟體的字典,不過,我個人是用在查單字居多。不過如果想進一步了解「英文」,我想一本好的英英字典還是有必要性。

我舉個例子,我要查單字"go"。

Yahoo!奇摩迷你筆-查詢單字go

go

vi.
1. 去; 離去
When did she go? 她什麼時候離開的?
2. 行走; 旅行; 移動[Q]
We went by train. 我們搭火車去。
3. 做(事); 從事(活動)[+v-ing]
They have gone boating. 他們划船去了。
4. 變為, 成為[L]
The milk went sour. 牛奶變質了。
5. 處於...的狀態[L]
He went hungry. 他餓著肚子。
6. 衰退; 受損; 磨損
His eyesight is going. 他的視力正在衰退。
7. 開始; 開動
All the preparations have been completed, so we are ready to go. 一切準備就緒, 我們隨時可以開始行動。
8. (機器等)運轉
This clock does not go. 這鐘不走了。
9. 通到; 延及; 至[W][Q]
The valley goes from west to east. 山谷由西往東延伸。
10. 相配[W]
This paint doesn't go. 這漆的顏色不合適。
11. 【數】(除)得整數商[W]
Three into two won't go. 三除二得不到整數商。
12. 被放置; 容得下[W][Q]
This luggage won't go in the car. 車子放不下這行李。
13. 售出; 歸給[(+for/to)]
The car went for $3, 000. 這車子賣了三千美元。
14. (與must, can, have to 連用)被去掉; 被放棄; 被辭退
This paragraph must go. 這段得刪去。
15. (消息等)被傳遞, 流傳[W][+that]
The story goes that the Prime Minister will resign. 據傳首相將要辭職。
16. 被接受; 被准許; 有效[W]
What I say goes. 我說到做到。
17. 進行; 結果[Q]
Everything is going well. 一切順利。
18. 發出聲響; (鐘)報時
There goes the bell! 鐘響了!
19. 完結; 死
Now both of her parents are gone. 現在她的父母親都已去世了。
vt.
1. 拿...打賭[(+on)]
I'll go five dollars on that. 我願為此賭五美元。
2. 【口】(常用於否定句)忍耐
I really can't go him any more. 我真的再也不能容忍他了。
n.
1. 【口】輪到的機會[C]
Now it's your go. 現在輪到你了。
2. 【口】嘗試[C][(+at)]
Let me have another go at it. 讓我再試它一次。
3. 【口】精力; 精神[U]
The man is full of go; he often stays up late. 那人精力充沛; 他常熬夜。
4. 【口】意外的事態[S]
5. 去; 進行[U]
6. 【口】時髦東西[the S]
vi.去; 離去; 移動; 前進

LDOCE5 (Longman Dictionary of Contemporary English 5th Edition)

go 1   S1   W1  verb  ( past tense  went  / went /,  past participle  gone ,  third person singular  goes)
1 move/travel
  a) [ intransitive always + adverb/preposition ]  ( also   been )   to travel or move to a place that is away from where you are or where you live  →  come :
There’s nothing more we can do here. Let’s  go home .
Have you ever been to  (= have you ever travelled to )  Japan?
I  have been to  (= have travelled to )  Germany several times.
Where are you going?
We’re going to Canada in the summer.
Dinah went into the kitchen.
She went over and put her arm around him.
I’m going round to her house to find out what’s wrong.
I’ll just go up   (= go upstairs )  and ask him what he wants.
  b) [ intransitive and transitive ]   to move or travel in a particular way or for a particular distance :
It took us over an hour to go ten miles.
The car was going much too fast.
We went a different way from usual that day.
go by bus/train/car etc
It’ll be quicker to go by train.
  c) go and do something  ( also   go do something   American English )  [ not in past tenses ]   to move to a particular place in order to do something :
Go wash your hands.
I went and spoke to the manager.
在朗文當代英英辭典第5版(Longman Dictionary of Contemporary English 5 Edition)裡單字Go有49條解析,而且英英辭典的好處是,你能更正確了解此單字原始用意,例如,go = 旅行,如果用英漢字典來看,實在不懂,為什麼travel就travel和go有何關係?但讀一下英英字典解釋,就了解為什麼英漢字典裡go會有旅行的意義。

我考慮許久,而且還跑了書局去查看「實體書」,最後終於決定買下「Longman Dictionary of Contemporary English 5th Edition」這本英英字典。

Servey - Mail Server | (3) 硬體郵件伺服器

前言

硬體郵件伺服器,產品之多,令我有點嚇到。是利潤高嗎?是進入門檻低嗎?我猜,應該有很大一部分都是改Linux,再加上一些自有技術而來。下列的資料,就我比較了解的,我們推薦碩碕、PowerMail、Openfind這三家的產品,如果你時間很多,可以打電話請廠商送個"測試機"來給你玩玩,最終選一個符合你需求的去使用。

硬體郵件伺服器解決方案

硬體郵件伺服器解決方案
廠商 授權 型號 價格 網址
碩碕 人數 BOX 120 不方便打出來 http://www.box-sol.com.tw/
碩碕 人數 BOX 200 不方便打出來
PowerMail 人數 PowerMail 30000 不方便打出來 http://www.infobox.com.tw/
Openfind 人數+模組 M2K6100 DL 200000 (50U估價)(依人數+模組會有不同) http://www.openfind.com.tw/taiwan/products/mail2000/appliance.html
新軟 None MLS-1000 88000 http://www.nusoft.com.tw/tw/product_info/mls/mls.shtml
新軟 None MLS-1500 176400
新軟 None MLS-2000 264600
新軟 None MLS-3000 None
新軟 None MLS-5000 None
友旺 None MS1200 60000 http://www.aboway.com.tw/product_detail.php?id=154
友旺 None MS2200 120000
眾至 人數 MS-1000 50000 http://www.sharetech.com.tw/product-mailserver.htm
眾至 人數 MS-6025 65000
眾至 人數 MS-6125 80000
眾至 人數 MS-6226 140000
眾至 人數 MS-6325 266000
SonicWall None Email Security(ES) None 台灣無經銷
QNAP None WMS-2208R 48000 查無此產品網址
QNAP None WMS-24000 76000 查無此產品網址
Applus None M3-A350 None http://www.applus.com.tw/

以上,如果要和AD帳號整合,需自行建置AD Server。

結論

說明一下,我為什麼推薦碩碕、PowerMail、Openfind這三家的產品。

碩碕,因為我目前的同事之一是碩碕的業務,有他的幫忙,讓我可以非常了解碩碕的產品。另一原因是,他們產品線算是完整,從前端的Spam到後端的歸檔等,你可以依需求彈性擴充。很多都是把一堆功能整合進一台Server裡就拿出來賣了,就這一點,我們也可以買其他家,但未來就擴充性而言,碩碕是比較好的選擇。

PowerMail設備在網路上口碑不錯,他們強項除了Mail之外,還是快速的回復能力,這對於一般小公司是個不錯的功能,不是每個公司都是機房、空調…讓伺服器可以在很"舒服"環境工作。不舒服的環境下,設備的穩定度或許不好,但他們在系統回復的設計,可以讓你在最短時間讓Mail Server回復正常。

Openfind硬體與Mail 2000軟體是一組,Mail 2000內建許多模組,你可以依需求購買授權即可使用。有別區其他Linux-based,Mail 2000在技術上是自有,與碩碕與一樣,Openfind的產品線完整,當你未來有其他需求,他們也能提供比較好的整合服務。

Tool - IntoDNS報告內容全攻略筆記

DNS Server架設需求討論

之前提過一次「選一個安全的DNS伺服器」,不過那是別人架設好的DNS Server,一般而言,如果我們只架Web Server、Mail Server服務,那我們最少在網路上須提供二筆最基本的「記錄,Record」,一個是 A Record、一個是 MX Record

例如,

www.kkbruce.net  A  64.233.183.121
mail.kkbruce.net  A  64.233.183.121
           MX  10 mail.kkbruce.net

DNS 相關知識,不是今天的主題,我不深入討論。

我們在申請Domain時,Domain服務供應商都會有 DNS 代管服務,而且會提供我們一個基礎或進階DNS管理的功能,有些 Domain 服務供應商提的 DNS 功能很全面,有些很入門。如果你 Domain 是在台灣申請,絕大部份所提供的 DNS 管理功能都很入門,有些更只有少少幾筆數的A記錄和MX記錄。

當個人或公司,剛好對外只提供Web或Mail服務時,簡單的幾筆的A記錄與MX記錄,確實是足夠用,代管省成本、省頻寬、省硬體…,且這些 Domain 供應商的DNS伺服器都很穩定。通常不夠用時,我們就必須自己架設DNS Server來提供解析服務。這裡先說明,因為Domain轉換供應商有一定的限制與條件,並不是想轉換就可以立即轉換,如果你符合轉換件條,當然可以轉換到DNS管理功能較全面的供應商,不過,通常是「當務之急」,所以我說「必須自己架設」。

DNS Server是整個網路的基礎,沒有它整個網路就是廢物。架好了,並不代表設定沒問題。DNS本身有一堆的RFC文件,一般人也不太可能為了架一台DNS Server去讀那些RFC文件,我們必須能很快速找出設定問題。早期,或是你年紀大一點,大概都是使用dnsstuff.com所提供的測試服務,不過後來dnsstuff轉換經營方式,我就很少使用dnsstuff了。後來,又在網路上找到了另一個intoDNS提供DNS測試服務。

intoDNS測試的好處是「快」,一般我們修改 DNS 後,還必須等到上層的DNS Server(例如,ISP的DNS Server)快取時間結束,重新抓取我們DNS Server裡Record內容後,"使用者"或"我們"才能知道修改結果正確與否。但使用intoDNS測試我們的DNS設定時,通常你修改完DNS,intoDNS通常就能抓取最新的結果,這可以省下我們許多時間。(不過還是會受上層DNS Server快取的影響)

有一點要注意,intoDNS只能針對「第一層」的Domain進行測試,即「kkbruce.net」是OK,但像「ns1.kkbruce.net」第二層Domain,intoDNS就不進行測試。

intoDNS Report正體中文解釋


以下就我申請的 kkbruce.net 網域名稱進行測試,http://www.intodns.com/kkbruce.net所提供的報告內容,簡單進行說明。(基本上,只要不出現紅色驚嘆號,就是OK)

Servey - Mail Server | (2) 純軟體郵件伺服器

前言

放在線上,好是好,但有些「上層」就是不放心,還是希望把資料放在自己公司,但類似Microsoft Exchange的架構,成本又高。那有沒有便宜的郵件伺服器?答案是有的。你可以使用純軟體郵件伺服器。

純軟體郵件伺服器第一名,我想應該是 Unix-Like ( Linux ) 裡的 SendMail 或 PostMail,不過在下面列表中我先不列入考慮,原因是,一般人或沒有專門資訊人員的公司,想簡易的把 SendMail 或 PostMail 架設起來,而且做到一個好的管理,不是一件容易的事。反之,在有專門資訊人員的幫忙下,Linux + SendMail,能一次解決二個問題,一是作業系統,二是Mail Server軟體,而且Linux本身就強調不用太高的硬體,即可發揮出很好的執行效率。

純軟體郵件伺服器解決方案

純軟體郵件伺服器解決方案
廠商 產品 網址 價格(NTD)
雷電 RaidenMaild http://www.raidenmaild.com/tw/ 4520
EVO MailServer https://www.evo-mailserver.com.tw/ 4520
Openfind Mail2000 http://www.openfind.com/taiwan/products/mail2000/info.html None
i-Freelancer Rainbow http://i-freelancer.net/Rainbow/MailServer.htm 26800

雷電 - RaidenMaild

老牌,好用,方便與Active Directory帳號整合。就以前與客服溝通的經驗,服務很不錯。

EVO - MailServer

這套,我單純看規格,我覺得規格很不錯,只是還不能與Active Directory帳號整合。我有寫信去問,他們正在努力中,相信不久的將來,就能整合AD功能。

Openfind - Mail2000

Openfind的Mail2000軟體與硬體一起賣,在硬體郵件伺服器在來討論。

i-Freelancer - Rainbow

功能規格,也是完整。但軟體價格算是較高的一套。

結論

論口碑、性價比,雷電是第一選擇,一次採購永久升級,客服也不錯。EVO是少數支援了IMAP的軟體,等AD功能在整合進來,就很有競爭力了。Openfind的Mail 2000軟體是最貴的,這個"最貴"是與表軟體比較,它每個模組都切的很清楚,即每個模組都要買授權,東加西加,金額就一直上去了。最後那一套,規格OK,但網路上我找不到什麼評價。

雷電、EVO、i-Freelancer都是架設在Windows之上,架設這些伺服器前,Windows與主機的錢還是要花。

Survey - Mail Server | (1) 線上郵件伺服器

Google Apps for Business | Gmail 企業版

以純線上服務而言,Google應該是打片天下無敵手
資料參考網址:http://www.google.com/apps/intl/zh-TW/business/gmail.html

Gmail解決方案費用
帳號數 Gmail (USD) 費用預估(NTD)
1 5 USD/月 150 NTD/月
50 250 USD/月 7500 NTD/月
50 3000 USD/年 90000 NTD/年

Office 365

它的優缺點,我在前一篇「Survey - Office 356 Survey | Office 356 評估」有討論。

Office 365解決方案費用
帳號數 Office 365(USD) 費用預估(NTD)
1 10 USD/月/E1 300 NTD/月/E1
50 500 USD/月/E1 15000 NTD/月/E1
50 6000 USD/年/E1 180000 NTD/年/E1
50 1200 USD/月/E3 36000 NTD/月/E3
50 14400 USD/年/E3 432000 NTD/年/E3

Openfind MailCloud

Openfind 是我們台灣本土的老品牌,在Email領域經營許久。Mail 2000產品可以買斷,也就是實體機,這在另一份Survey文章硬體郵件伺服器會談到,也可以租賃,早期的Mail 2000,現在升級稱MailCloud。

MailCloud解決方案費用
帳號數 Office 365(USD) 費用預估(NTD)
50 None 38999 NTD/年

其他費用可以參考官網 MailCloud Price

線上郵件伺服器評估心得

Office 365最貴,但如果把Office及其他服務計算進去,也未必最貴,選擇Office 365,需求面很重要,因為它不單單只個一個Mail,Office 365是一個整合解決方案。

Google 企業版,合適習慣全線上使用者。除Gmail之外,Google文件也是強項之一,唯一注意只有公司對外的網路頻寬、穩定度。Google 企業版是個非常標準的雲端產品,在外連線使用非常方便,而且不論是否跨國與否,基本而言,都能快速連線使用。

MailCloud以年費來看,MailCloud是最便宜。但基本空間大小每人 2GB,嗯,看你怎麼用,如果是全線上作業,太小了些,如會使用POP3或IMAP來把信收下來,那是還好。MailCloud很專注在Mail這件事情上,所以MailCloud不像Google企業版或Office 365是整合解決方案,就單單只Mail的功能。

總結而論:
  • Office 365,適合與Office或公司內的Exchange混合使用、配合。
  • Google企業版,適合全部線上使用者,功能完整,只要你能上網就能使用。(當然透過IMAP也能與Outlook之類軟體配合使用。)
  • MailCloud,專業的 Email 平台,可快速解決任何 Email 問題,除 MailCloud 之外,還有歸檔、備份、稽核、備援、監控…等。

ASP.NET MVC - HTML Editor | HTML編輯器 與 DatePicker | 日期選擇器

HTML Editor and DatePicker 總結

在開發網頁的過程式,除了前端 UI 之外,與使用者的互動,不外乎是「表單( Form )」(註1),一個好的表單設計,能讓你的網站加分。前面所談的使用者,包含一般前端網頁瀏覽使用者,與後台管理者,但對於表單的需求,他們兩者可都是一樣,希望更簡單、更方便、更好用。

註1:現在網頁外掛程式很多,可以直接在網頁上與使用者互動,已經不一定是透過表單,但就比例上而言,還是以表單為主,其他方式為輔。

以上六篇,討論在 ASP.NET MVC 中兩個關於表單的重點,HTML Editor ( HTML編輯器) 與 DatePicker (日期選擇器),這兩個算是在表單中很重要,也很常使用的功能。

HTML Editor(HTML編輯器) 介紹:

DatePicker(日期選擇器) 介紹:
每一套都有自己的優點,經過介紹之後,你可以選擇一套合適你自己的來使用。

例如說,我希望HTML Editor可以"簡單"、"小"、"快",那我會推薦使用 CLEditor。希望功能強大,TinyMCE 與 CKEditor 都不錯。希望免費又強大,那就是 TinyMCE 了。DatePicker 也是一樣的道理。

另外偷偷跟你說,實作部分,除非像 TinyMCE 直接跟你說 for MVC,不然,同理可證,你也可以拿去在 ASP.NET 上使用,也就是說,後面的六篇文章,有五篇可以在 ASP.NET 上使用,減一篇 ASP.NET + CKEditor + CKFinder 很早以前就介紹過了,所以有四篇新內容是與 ASP.NET 通用,爽吧!

HTML Editor and DatePicker 實作環境

  • Visual Studio 2010
  • ASP.NET MVC 3
以上是我的實作環境。基本上,就算使用 Visual Studio 11 + ASP.NET MVC 4,或比較舊的 Visual Studio 2008 + ASP.NET MVC 2 也沒關係,因為不管是 HTML Editor(HTML編輯器) 或 DatePicker(日期選擇器) 都與 Script 關係比較大,我是建議最少還是 Visual Studio 2010 + ASP.NET MVC 3會比較好,因為有些必須使用到 NuGet,在 Visual Studio 2008 下就有些問題了。

ASP.NET MVC HTML Editor and DatePicker 範例程式專案




檔案大小 5,218 KB (7z),解壓縮密碼:KKBruce。

HiCloud CaaS 雲端服務與管理介紹

前言

有時,理論是比較簡單,實作反而是困難。HiCloud CaaS這個服務我是一開始推出就使用,我個人是很支持國貨的,雖然有人會拿HiCloud CaaS與國外相似服務比較,但我覺得沒有意義!從國家、文化、市場規模、成本、技術能力、基礎建設…沒有一樣可以是「等號」,不是等號的東西怎麼比,拿 iPhone vs HTC vs ... 沒意義,了不起比比規格,因為規格可以用「大於、小於、等於」來比。

回理論與實作問題上。在HiCloud CaaS剛推出時,它們在Run!PC刊一篇文章,注意日期是2010/6/8日,我馬上寫信去問,什麼時間可以用,他們心虛的回答:應該是年底!過了一年,什麼東西都還沒看到,雖然等了很久,在2011/9月底,通知會員可以登入使用。

HiCloud CaaS 雲端服務與管理介紹

這一個「HiCloud CaaS 雲端服務與管理」是一個線上平台,你能透過它去申請異動查詢整個HiCloud Caas服務

圖一:HiCloud CaaS User Portal 首頁(點擊看大圖)
主畫面主要有功能列、新申請服務,查詢現有申裝情況、操作手冊等,我們按「虛擬主機申請」,

圖二:虛擬主機申請(一) 契約條款
圖三:虛擬主機申請(二) 選擇產品
目前除了日租,還有小時租,以小時為單位,每日最高收取日租費用,一般是超過4小時。臨時、短時間的要測試主機,還真是不錯選擇。申請過後,約15分鐘內就會開好虛擬機,可以使用。

圖四:虛擬主機相關訊息與開關機
這讓我很清楚目前整個虛擬主機的情況,還可以線上直接關機、重開機,很方便。

圖五、防火牆申請與設定
之前,我們要設定防火牆,必須打電話給機房端,由機房端設定,我們在測試是否正確,不過。現在,可以直接線上設定,實在方便許多,而且就算設錯了,趕快登入 User Portal 修改規則即可,不用電話來電話去。

圖六:負載平衡申請與設定
如果你提供的服務流量很大,除了選擇申請更高階虛擬主機外,負載平衡服務也是可以考慮,例如,租用二台以上基礎型雲端伺服器,加上一個負載平衡服務,也是個很不錯的選擇。尤其是HiCloud CaaS的租用方案都不合你胃口時。另一個考慮點,外面一台負載平衡伺服器都幾十萬上下,以日租金來看,成本效益算不錯。

圖七:儲存空間申請與設定
剛開始,反正什麼服務都要寫申請書,不然就是要打電話,現在真的方便很多。而且選擇也多了些,我們之前只能外掛100GB HDD,而且只能一顆,現在可以外掛2顆HDD,而且最大為 100GB * 20 = 2000 GB = 2 TB * 2顆 = 4 TB。一般而言,這樣的空間應該很夠用了。

圖八:HiCloud CaaS 加值服務申請
Cloud監控服務,應該就是Run!PC那篇文章所指的CPU、RAM的即時狀況,可參考http://hicloud.hinet.net/userportal.html網頁。

上網包xxxGB,我看不懂,寫信去問,沒人理我!@_@

HiCloud CaaS使用心得

從一開始的申請使用,到目前已經超過一年的時間,我喜歡HiCloud Caas的彈性,彈性是指,反正租你用,你只要不犯法,他們都不管你。但它們的CPU和RAM分配上,一直是固定方案,然後從一開始3個方案選擇,到現在有8個方案選擇,但未能像其他功能,可以讓我們隨選增減CPU或RAM,我反應過數次,可能是技術上有難處,但希望理論與實作都能看到,這樣就更進於完美。

Tool - Microsoft Exchange Server Best Practices Analyzer 工具

Microsoft Exchange Server Best Practices Analyzer 工具

Exchange Server Best Practices Analyzer 會以程式設計的方式,來從像是 Active Directory、登錄、Metabase 及效能監視器等資料儲存機制收集設定及數值。一旦收集完成,則會將一組全面的「最佳作法」規則套用至拓撲上。 執行此工具的系統管理員將會收到詳細資料報告,其中列出可對環境作出的建議,以達到更高效能、延展性及存留時間。
如果你有在管理 Exchange Server,那一定要使用這一套工具。他會去Scan你的Exchange Server,然找後出有問題的地方,還會直接給"建議"及"參考資料"。讓我們在管理、維護、效能…有很大的幫助。

記錄一下下載位置。

ASP.NET MVC - DatePicker 日期選擇器 | (3) JSCal2

JSCal2 簡介

這一套 JSCal 已經出道很久了,我第一次在 ASP 程式的 Calendar 就是使用 JSCal 版,還不是 JSCal2,不過後來轉為付費版本且免費資源越來越多的情況下,就換其他選擇了。但今天我們還是選擇介紹它,因為我想透過 JSCal2 介紹一個 ASP.NET MVC 裡的功能,這個功能常讓人家誤解。

先把 Model、Controller \ Action、View 建立起來。

Model:BlogPostJSCal2.vb

Imports System.ComponentModel.DataAnnotations

''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostJSCal2
    ' 標題
    Public Property Title() As String
    ' 發佈日期
    <DataType(DataType.Date)>
    Public Property PostedOn() As DateTime
    ' 標籤
    Public Property Tags() As String
    ' 內容
    Public Property Content() As String
End Class

Controller \ Action:BlogPostJSCal2Controller.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostJSCal2Controller
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostJSCal2/Create

        Function Create() As ActionResult
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostMy97) As ActionResult
            ViewBag.HtmlContent = model.Content
            Return View(model)
        End Function

    End Class
End Namespace

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostJSCal2)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : DatePicker (使用 JSCal2) 日期選擇器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>DatePicker (使用 JSCal2) 日期選擇器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>JSCal2 DatePicker</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>

</asp:Content>

讓我們來使用 JSCal2 吧。

Windows - Windows Server 2008 R2修改DNS記錄更新時間

發現Windows Server 2008 R2裡DNS服務中,預設更新時間設定不是很符合RFC規定,例如:

Windows Server 2008 R2 DNS服務相關預設時間
圖一:Windows Server 2008 R2 DNS服務相關預設時間
原DNS預設時間

Refresh:15 min
Retry:10 min
Expire:1 day
Default TTL:1 hr

以上預設值,可能是以"Intranet"的DNS為目標,我沒有深入查詢。因為我是要放在"Internet"上,所以我修改建議值為:

Refresh:12 hr
Retry:2 hr
Expire:28 days
Default TTL:1 day

換算單位為秒:

Refresh:43200
Retry:7200
Expire:2419200
Default TTL:86400

以上只是個記筆。

ASP.NET MVC - DatePicker 日期選擇器 | (2) My97DatePicker

My97DatePicker


這一套 My97DatePicker 是由對岸所發展,是一套約 60 KB 的 JavaScript,可以說,把 DatePicker 功能發展到非常「高級」的境界,而不是你所想像,跳出一個日曆,讓你選選點點。

首先,一樣,我們先準備我們的 Model、Controller \ Action、View。

Model:BlogPostMy97.vb

Imports System.ComponentModel.DataAnnotations
''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostMy97
    ' 標題
    Public Property Title() As String
    ' 發佈日期
    <DataType(DataType.Date)>
    Public Property PostedOn() As DateTime
    ' 標籤
    Public Property Tags() As String
    ' 內容
    Public Property Content() As String
End Class

Controller \ Action:BlogPostMy97Controller.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostMy97Controller
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostMy97/Create

        Function Create() As ActionResult
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostMy97) As ActionResult
            ViewBag.HtmlContent = model.Content
            Return View(model)
        End Function

    End Class
End Namespace

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostMy97)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : DatePicker (使用My97 Datepicker) 日期選擇器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>DatePicker (使用My97 Datepicker) 日期選擇器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>My97 Datepicker</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<div>
    <%: Html.ActionLink("回首頁", "Index", "Home") %>
</div>

</asp:Content>

準備好,我們就開始來使用 My97 Datepicker 吧。

ASP.NET MVC - 凡走過,必留下痕跡之Log記錄

Log記錄 - 前言

我們之前已經寫過數篇討論檔案上傳下載的文章,如「檔案上傳下載筆記」,不過還有加強的空間,例如今天的主題「Log記錄」。

Log問題,在以前,可大可小,例如,我們寫網頁,可以什麼都不做,IIS還是會幫我們留一些記錄,我們還可以使用超強大Log流量分析軟體 AWStats來分析產出美美的報表。

但今日,個人資料處理法已經快要正式立法完成,我們必須讓走過我們的系統的使用者都留下Log記錄,以防日後舉證之需要。但不經整理的IIS Log記錄,法官應該是不可能接受,一是太大,二是太亂。類似 AWStats 的Log流量分析軟體,整理後的資訊,對於法律實際上效用有限,所以我們必須除了IIS Log記錄外,最好還能提供整個使用者的Log記錄。

Log記錄的方式

要留下Log記錄,基本方向可以有:
  1. System Log記錄
  2. File Log記錄
  3. Database Log記錄
  4. Log Server
System Log記錄指的是像IIS Log記錄就是System Log記錄。或撰寫程式碼,向Windows本身的事件檢視器來發送Log記錄。

File Log記錄指的是透過 System.IO 寫一支程式,將你要的Log記錄到一個純文字檔,例如, FileLogs.txt,因為程式自己寫,你能控制什麼是你要,什麼是你不要,與System Log記錄相比,可以免除太大、太亂的問題。檔案太大還是有可能,這部分可能要寫程式自動處理,或是手動處理。

Database Log記錄,即將Log記錄直接記錄在Database之中,與System Log記錄與File Log記錄相較,Database本來就是儲存與管理資料所在地,而且與撰寫發送Windows Log記錄事件檢視器程式碼和File Log記錄程式碼來看,資料庫 Log記錄程式碼簡單多了。。

Log Server一般而言,是當伺服器群成長到一定數量,會架一台專門處理Log記錄的硬體伺服器,例如,Linux平台的Syslog,Windows下的Kiwi Syslog Server來架設,或是買專門機架硬體式Log Server,來統一收集、分析、管理這些Server Log記錄。

真是可大可小。

以下,我會使用 ASP.NET MVC來實作一個Database Log記錄範例。

ASP.NET MVC - DatePicker 日期選擇器 | (1) jQuery UI : DatePicker

jQuery UI : DatePicker

表單第四篇,我們來終於來到日期選擇器(DataPicker)。

在表單上最容易產生的錯誤就是「輸入錯誤」,例如,我們網站裡的客戶註冊資料,明明就已經設計電子郵件必須輸入兩次,而且兩次必須完全相同才能通過驗證,還是會有客戶發 Mail 來說:「對不起,我 Email 輸入錯誤,請幫我修正資料。」一整個 Orz!

所以能「勾勾、選選」是最好的選擇,最少能減低這類的「輸入錯誤」。其中「日期」的輸入通常都是很重要,註冊日期、購買日期、出貨日期、銷售日期、保固日期、發佈日期、LogOn-LogOut日期…等。

前面介紹的 HTML 編輯器,是美化你輸入的資料。有時"日期"就重要性而言,會比內容更為重要。我們希望減少日期的輸入錯誤,但一個字一個字打,日期的錯誤率就硬是比Email這類資料還高。

所以就出現「用選的」這類需求。就有人開發出 DatePicker,讓使用者可以很方便,用選的,幾年幾月幾日,一整個就是爽。不管是 UI、Usability … DatePicker 與 HTML Editor 都是加分部分。

前面準備一樣,Model、Controller \ Action、View。

Model:BlogPostjQueryUI.vb

Imports System.ComponentModel.DataAnnotations

''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostjQueryUI
    ' 標題
    Public Property Title() As String
    ' 發佈日期
    <DataType(DataType.Date)>
    Public Property PostedOn() As DateTime
    ' 標籤
    Public Property Tags() As String
    ' 內容
    Public Property Content() As String
End Class

Controller \ Action:BlogPostjQueryUIController.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostjQueryUIController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostjQueryUI/Create

        Function Create() As ActionResult
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostjQueryUI) As ActionResult
            ViewBag.HtmlContent = model.Content
            Return View(model)
        End Function

    End Class
End Namespace

建置,用強型別新增View。

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostjQueryUI)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : DatePicker (使用jQuery UI) 日期選擇器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>DatePicker (使用jQuery UI) 日期選擇器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>jQuery UI 日期選擇器測試</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<div>
    <%: Html.ActionLink("回首頁", "Index", "Home") %>
</div>

</asp:Content>

日期選擇器( DatePicker ) 第一個我們來介紹最簡易入門的 jQuery UI。

ASP.NET MVC - HTML 編輯器 | (3) CKEditor + CKFinder

CKEditor + CKFinder

最後一個 HTML 編輯器,我要介紹王牌 CKEditor

可能是因為版權的關係,我不清楚。目前沒有人把 CKEditor 整合到 NuGet 上。我們必須做一些事,才能在 ASP.NET MVC 上整合 CKEditor。

先下載 CKEditor 3.6.2

這裡請注意,請下載第一個 CKEditor Source 版本即可,不要下載 for xxx 版本,例如,CKEditor for ASP.NET 版本。

解壓縮後,把 ckeditor 目錄整個複製到專案的根目錄之下。

CKEditor 目錄位置
圖一:CKEditor 目錄位置
然後先一樣準備我們的 Model、Controller / Action 、View。

Model:BlogPostCKEditor.vb

''' <summary>
''' Blog 發表文章類別
''' </summary>
Public Class BlogPostCKEditor
    ' 標題
    Public Property Title() As String 
    ' 發佈日期
    Public Property PostedOn() As DateTime 
    ' 標籤
    Public Property Tags() As String 
    ' 內容
    
    Public Property Content() As String 
End Class

Controller / Action :BlogPostCKEditorController.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostCKEditorController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostCKEditor/Create

        Function Create() As ActionResult 
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostCKEditor) As ActionResult
            ' 在充許 HTML 的欄位,切記必須使用 AntiXSS 4.0 過濾
            ViewBag.HtmlContent = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(model.Content)
            Return View(model)
        End Function

    End Class
End Namespace

先「建置」,用「強型別」產生 View。

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostCKEditor)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : CKEditor HTML編輯器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>CKEditor HTML編輯器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>CKEditor HTML編輯器測試</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.TextAreaFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<p>
    發表內容(顯示HTML標籤):<%: ViewBag.HtmlContent %>
</p>
<p>
    發表內容(顯示HTML效果):<%= Html.Raw(ViewBag.HtmlContent) %>
</p>
<div>
    <%: Html.ActionLink("回首頁", "Index","Home") %>
</div>

</asp:Content>

注意,要把 Content 欄位的 EditorFor() 修改為 TextAreaFor(),接下來我們就來 ASP.NET MVC 裡使用 CKEditor 與 CKFinder 吧!

ASP.NET MVC - Visual Baisc QRCode擴充方法

以下範例程式修改於阿源哥哥「使用ASP.NET MVC 3產生二維條碼」一文,除將原文之C# Code轉換為Visual Basic Code,還進行
  • alt屬性定義為必填
  • 更完整的註解說明
以產生更符合 SEO 的 HTML img 標籤。相關說明都寫在程式註解中,就不在多做解釋。

QRCodeExtension.vb - Visual Baisc QRCode擴充方法


Imports System.Runtime.CompilerServices
Imports System.ComponentModel

Public Module QRCodeExtension

    ''' <summary>
    ''' 透過 Google 提供的 chart 服務,產生對應的 img QRCode標籤。
    ''' </summary>
    ''' <param name="helper">擴充方法</param>
    ''' <param name="data">要產生QRCode的字串</param>
    ''' <param name="alt">QRCode說明文字</param>
    ''' <param name="size">大小(px),預設 80px*80px</param>
    ''' <param name="margin">留白(px),預設 4px</param>
    ''' <param name="errorCorrectionLevel">回復等級,預設 L</param>
    ''' <param name="htmlAttributes">其他html屬性,預設 Nothing</param>
    ''' <returns>回傳 img 標籤</returns>
    <Extension()>
    Public Function QRCode(helper As HtmlHelper,
                           data As String,
                           alt As String,
                           Optional size As Integer = 80,
                           Optional margin As Integer = 4,
                           Optional errorCorrectionLevel As QRCodeErrorCorrectionLevel = QRCodeErrorCorrectionLevel.Low,
                           Optional htmlAttributes As Object = Nothing) As MvcHtmlString

        ' 錯誤處理
        If String.IsNullOrEmpty(data) Then
            Throw New ArgumentNullException("data", "不得空白.")
        End If

        If size < 1 Then
            Throw New ArgumentOutOfRangeException("size", size, "必須大於零.")
        End If

        If margin < 0 Then
            Throw New ArgumentOutOfRangeException("margin", margin, "必須大於或等於零.")
        End If

        If Not [Enum].IsDefined(GetType(QRCodeErrorCorrectionLevel), errorCorrectionLevel) Then
            ' 需 Imports System.ComponentModel 才會有 InvalidEnumArgumentException
            Throw New InvalidEnumArgumentException("errorCorrectionLevel",
                                                   CType(errorCorrectionLevel, Integer),
                                                   GetType(QRCodeErrorCorrectionLevel)
                                                   )
        End If

        ' 使用 google 的 chart 服務
        ' 參數參考:http://code.google.com/intl/zh-TW/apis/chart/infographics/docs/qr_codes.html
        Dim url As String = String.Format(
                                "http://chart.apis.google.com/chart?cht=qr&chld={2}|{3}&chs={0}x{0}&chl={1}",
                                size,
                                HttpUtility.UrlEncode(data),
                                errorCorrectionLevel.ToString()(0),
                                margin)

        ' 產生img Tag
        Dim tag As New TagBuilder("img")

        tag.MergeAttribute("src", url)
        tag.MergeAttribute("alt", alt)
        tag.MergeAttribute("title", alt)

        ' width, height 兩個屬性,可加可不加,不影響產出 QRCode 結果。
        tag.MergeAttribute("width", size.ToString())
        tag.MergeAttribute("height", size.ToString())

        If htmlAttributes IsNot Nothing Then
            tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
        End If

        Return New MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing))
    End Function

End Module

''' <summary>
''' 回復等級列舉。
''' 參考:http://code.google.com/intl/zh-TW/apis/chart/infographics/docs/qr_codes.html 說明文件。
''' </summary>
Public Enum QRCodeErrorCorrectionLevel
    ''' <summary>
    ''' 從 7% 的錯誤資料中回復.
    ''' </summary>
    Low
    ''' <summary>
    ''' 從 15% 的錯誤資料中回復.
    ''' </summary>
    Medium
    ''' <summary>
    ''' 從 25% 的錯誤資料中回復.
    ''' </summary>
    QuiteGood
    ''' <summary>
    ''' 從 30% 的錯誤資料中回復.
    ''' </summary>
    High
End Enum

在要使用的 View 之中引用擴充方法 Namespace,即可使用。我們以 Home/Index 為例:

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="Mvc3QRCode.QRCodeExtension" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    首頁
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%: ViewData("Message") %></h2>
    <p>
    預設 80*80, margin = 4<br />
    <%: Html.QRCode("http://kkbruce.blogspot.com", "KKBruce部落格網址") %>
    </p>
    <p>
    修改為 150*150, margin = 1<br />
    <%: Html.QRCode("http://kkbruce.blogspot.com", "KKBruce部落格網址", size := 150, margin := 1) %>
    </p>
</asp:Content>

建置,Ctrl+F5,執行網頁。

Visual Basic - QRCode Extension 執行圖
圖一:Visual Basic - QRCode Extension 執行圖
有前人種樹真好。^_^

ASP.NET MVC - HTML 編輯器 | (2) CLEditor

CLEditor HTML 編輯器

第二個我們來介紹 CLEditor HTML 編輯器。

前面準備步驟與前一篇差不多,在同一專案下,先準備 Model 、Controller\Action、View,而且內容 90%以上相同。

Model:BlogPostCLEditor.vb

''' <summary>
''' Blog 發表文章類別
''' </summary>
Public Class BlogPostCLEditor
    ' 標題
    Public Property Title() As String 
    ' 發佈日期
    Public Property PostedOn() As DateTime 
    ' 標籤
    Public Property Tags() As String 
    ' 內容
    <AllowHtml()>
    Public Property Content() As String 
End Class

我們先設定Content() 的屬性 <AllowHtml()>。

Controller \ Action:BlogPostCLEditorController.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostCLEditorController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostCLEditor/Create

        Function Create() As ActionResult 
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostCLEditor) As ActionResult
            ' 在充許 HTML 的欄位,切記必須使用 AntiXSS 4.0 過濾
            ViewBag.HtmlContent = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(model.Content)
            Return View(model)
        End Function

    End Class
End Namespace

先「建置」,以強型別來新增View。

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostCLEditor)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : CLEditor HTML編輯器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>CLEditor HTML編輯器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>CLEditor HTML編輯器測試</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<p>
    發表內容(顯示HTML效果):<%: ViewBag.HtmlContent %>
</p>
<p>
    發表內容(顯示HTML效果):<%= Html.Raw(ViewBag.HtmlContent) %>
</p>
<div>
    <%: Html.ActionLink("回首頁", "Index", "Home") %>
</div>

</asp:Content>

接下來我們就可以來安裝及設定 CLEditor HTML 編輯器。

ASP.NET MVC - HTML 編輯器 | (1) TinyMCE

TinyMCE HTML 編輯器

第一個 HTML 編輯器,我們介紹 TinyMCE HTML 編輯器。

Step 1. 開一個全新 ASP.NET MVC 3 專案

檔案 → 新增專案 → Visual Basic → Web → ASP.NET MVC 3 Web 應用程式 → 名稱:「Mvc3HTMLEditorAndDatePicker」→ 網際網路應用程式 → 檢視引擎:「ASPX」。

未來六個範例,都會在此專案內增加進來。

Step 2. 準備一個 Model:BlogPostTinyMCE.vb

''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostTinyMCE
    ' 標題
    Public Property Title() As String 
    ' 發佈日期
    Public Property PostedOn() As DateTime 
    ' 標籤
    Public Property Tags() As String 
    ' 內容
    Public Property Content() As String 
End Class

以上內容很簡單,未來幾個範例,也會使用以上架構 Model 架構來進行。

Step 3. 建立一個 Controller:BlogPostTinyMCEController.vb

在「加入控制器」裡的「Scaffold 選項」→ 「範本」→ 選擇「空白控制器」。然後寫一個 Create() 的 Action 方法。

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostTinyMCEController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostTinyMCE/Create

        Function Create() As ActionResult
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostTinyMCE) As ActionResult
            Return View(model)
        End Function

    End Class
End Namespace

重點在第二個 <HttpPost(), ActionName("Create")> 方法中,參數要接收 BlogPostTinyMCE類別。然後新增我們 Create 的 View。

Step 4. 新增 Create Action 的 View

先建置專案 → Create → 加入檢視 → 勾選「建立強型別檢視」 → 選擇「 BlogPostTinyMCE」 → Scaffold 樣板:「Create」→ 完成。

完成後,我們簡單修改此 View。

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostTinyMCE)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : TinyMCE HTML編輯器
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>TinyMCE HTML編輯器</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>TinyMCE HTML編輯器</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<p>
    發表內容(顯示HTML標籤):<%: ViewBag.HtmlContent %>
</p>
<p>
    發表內容(顯示HTML效果):<%= Html.Raw(ViewBag.HtmlContent) %>
</p>
<div>
    <%: Html.ActionLink("回首頁", "Index","Home") %>
</div>

</asp:Content>

我們希望把含編輯後含HTML與實際HTML效果顯示出來,所以我們再最後加上幾行程式。我們把專案按「Ctrl + F5」執行起來,然後輸入「http://localhost:6944/BlogPostTinyMCE/Create」(記得改成你的 Port)的 Controller / Action。

預設表單
圖一:預設表單(點擊看大圖)
我們可以輸入資料,但都是純文字。

文字輸入
圖二:文字輸入
到目前為止,與一般表單沒有什麼不同。現在讓我們為此表單的 Content 加上 TinyMCE HTML編輯器吧。

Visual Studio - 提升Web與CSS開發的流暢度

Visual Studio 2010 與 Usability

老實說,從學習 .NET Framework 2.0 + ASP.NET 2.0 開炲,一直覺得 Visual Studio 2008 是一套很棒的開發工具。到了後來,升級使用了 Visual Studio 2010 之後,更覺得來到了一個不一樣的世界。Microsoft 應該有感覺到我們「程式開發人員」的辛苦,在 Visual Studio 2010 開發工具中有把「Usability」考慮進去。

雖然 Usability 是網頁開發的一個名詞,但其實所有與使用者有互動的內容,都應考慮 Usability,只是考慮多或少。像 Apple 的產品,使用起來只有一個字形容「順」!但,人家背後花了多少的心思在 Usability 之上,才能有今天成功?

回主題,Visual Studio 2010 與 Usability。

Visual Studio 2010 新發現系列文章中,我提到過「擴充組件庫」及介紹了幾套當時使用起來感覺很不錯的擴充組件。在「KKBruce的軟體清單」中,也重新整理過。

今天要來介紹一套讓你在開發Web和CSS更流暢、更省時間、更人性的擴充組件。

ASP.NET MVC - 即時整合與壓縮網站輸出的CSS及JavaScript檔案

讓網頁有高效率

不知道你有沒有為了
  • SEO
  • 安全性
  • 加速網頁載入
種種的理由,去進行過任何的CSS與JavaScript檔案壓縮的行為。在 YSlow 這套測試網頁執行率效軟體的首頁中,提供一篇「Web Performance Best Practices and Rules」文章,此篇文章針對網頁效率提供了 23 個非常棒建議(註1)
  1. 減少發出HTTP請求 (Minimize HTTP Requests)
  2. 使用內容分散式網路 (Use a Content Delivery Network (CDN))
  3. 避免空白的 src 或 href (Avoid empty src or href)
  4. 增加過期或Cache-Control標頭(add an Expires or a Cache-Control Header)
  5. 使用Gzip 組件(Gzip Components)
  6. 樣式表(CSS檔案)放在最頂端(Put StyleSheets at the Top)
  7. 腳本(JavaScript檔案)放在最底端(Put Scripts at the Bottom)
  8. 避免 CSS 表達式(Avoid CSS Expressions)
  9. 將 JavaScript 與 CSS 放在外部檔案(Make JavaScript and CSS External)
  10. 減少 DNS 查詢(Reduce DNS Lookups)
  11. 壓縮 JavaScript 與 CSS(Minify JavaScript and CSS)
  12. 避免重導向(Avoid Redirects)
  13. 刪除重複的腳本(JavaScript檔案)(Remove Duplicate Scripts)
  14. 設置 ETags(Configure ETags)
  15. 讓AJAX能快取(Make AJAX Cacheable)
  16. 在AJAX請求中使用 GET 方法(Use GET for AJAX Requests)
  17. 減少DOM元素數量(Reduce the Number of DOM Elements)
  18. 不要有HTTP 404錯誤(No 404s)
  19. 減少 Cookie 大小(Reduce Cookie Size)
  20. 為組件使用 Cookie-free 網域(Use Cookie-free Domains for Components)
  21. 避免過濾器(Avoid Filters)
  22. 不要在HTML裡使用縮放圖片(Do Not Scale Images in HTML)
  23. 讓favicon.ico圖小且能快取(Make favicon.ico Small and Cacheable)

註1:在查詢相關說明資料時發現,Web Performance Best Practices and Rules 文章內不只有 23 個建議,列在 YSlow 上的 23 個建議,應該重點中的重點了。有些看標題就能了解內容,有些則相反,必須去讀內容能才了解,例如,第 20 點的Cookie-free?非常建議花一些時間全部完整看完。如果你對網頁執行效率或是想改善你的網站/網頁,由此為出發點,絕對是個非常好的開始。另外,這篇 Web Performance Best Practices and Rules 文章和另一本 2007 出版的 High Performance Web Sites: Essential Knowledge for Front-End Engineers (中文:網頁加速的14條黃金法則)重複性很高,內容差不多,原因也很簡單,此書作者是曾任雅虎CPO(Chief Performance Officer),所以 Web Performance Best Practices and Rules 應該是此書的重點整理版本,作者還提供一個測試那 14 條規則的網站http://stevesouders.com/hpws/rules.php,也非常值的一玩。還有,Will保哥也針對 High Performance Web Sites 這本書提供了非常棒的經驗分享「加速前端網頁效能的14條規則」推薦非讀不可。

第2點 CDN 部分,一般網站如果不是成長到一定規模,是不太可能去使用,不過就 Scripts 部分,到是可以使用免費的 CDN 服務。可以參考我的「Microsoft Ajax content delivery network (CDN)」、「Microsoft ajax CDN Domain改名為aspnetcdn」、「jquery-1.4.4-vsdoc.js會讓jQuery無法運作」這幾篇。

借上面的項目,我想要討論的就是第11點「壓縮 JavaScript 與 CSS(Minify JavaScript and CSS)」。其實第9點「將 JavaScript 與 CSS 放在外部檔案(Make JavaScript and CSS External)」可以和第11點一起討論。

當網站開發到一定層度,我們會開始切割CSS檔案及JavaScript檔案以方便管理。

CSS檔案分割範例
例如,原本單一的CSS檔案,我們分割為 reset.css、layout.css、header.css、main.css、footer.css、ie6.css,依每個網站需求規劃而定。


JavaScript檔案分割範例
例如,原本單一的JavaScript檔案,我們分割為ajax.js、cookie.js、dom.js、forms.js、tables.js、validate.js、windows.js、ie6hack.js、ie7.js、ieall.js,依每個網站需求規劃而定。


也就是第9點所討論的內容。我認為,切割最重要的是「縮小問題點。例如,validate.js,是我常新增、修改、使用的一支 JavaScript,當使用者反應說"驗證"方便有問題時,我馬上知道要去找那一支程式查詢及修改,例如有一次使用者反應,為什麼程式在 Firefox 之下都不會有任何提示,而只有 IE 有?查詢之下,我使用到 IE 專用語法,結果所有 Firefox 都可以在不驗證情況下送出表單,嚇死我了。

網站上線之後

好了,通常那是上線開發之時,那上線之後呢?先看一個討論串「抄很大、抄不用錢」,線上之前。建議進行第11點「壓縮 JavaScript 與 CSS(Minify JavaScript and CSS)」,這方面的線上工具很多,然後進行上線動作。

回到討論串,因為那些 JavaScript 沒有經過壓縮,都是明碼,要了解及看懂內容對有功力的人,不是太難。以 JavaScript 而言,壓縮過程會順便重新編碼過,讓人看懂不容易。如果你辛苦寫了 JavaScript 或 jQuery 的程式碼,不想很容易讓人家複製使用,那請執行壓縮這一步驟。

你可以試著去看 jquery-version.js 與 jquery-version.min.js,兩個 JavaScript 檔案的內容。就會了解我說的意思。

但切割及壓縮CSS與JavaScript檔案容易造成一個問題:「管理不易。」

你可以很方便針對「專案」進行版本控制,但針對大量切割的CSS檔案與JavaScript檔案進行版本控制不太容易。另一重點是,我每次只對針對CSS或JavaScript檔案進行了修改,就必須「重新製作壓縮後的CSS與JavaScript檔案」,然後上傳、覆寫原有的CSS與JavaScript檔案。

或許你能學 jQuery,分為未壓縮 jquery-version.js 與壓縮 jquery-version.min.js,也是不錯,不過那一個 min 很好猜,有心人大概只要把 min 去除,就可以得到未壓縮的原始碼。

這方面我有二個想法:
  1. 讓未壓縮與壓縮檔案命名之間無關聯性,但這又造成「管理更加不易」。
  2. 讓未壓縮與壓縮檔案放在不同目錄之中,且那著目錄命名差異大或無關聯性。但還是一樣,易造成「管理更加不易」。

第二點,例如,jsUnZip與jsZip兩個目錄,關聯性及命名差異不大,也是很好猜。但如果改為kkbruceUUUjs(UUU代表unzip)與kkbruceZjs(Z代表zip)目錄,你只要不要在上線網頁引用kkbruceUUUjs目錄裡的 JavaScript 檔案,我想就很難猜得到。

還是麻煩呀,有沒有更好的辦法?

有,不然我前面廢話連篇做什麼?

Survey - Office 356 Survey | Office 356 評估

Office 365 重點整理

以下為網路及去微軟聽課後的整理內容。
  1. Taiwan 的 Office 365 約 11月發佈,明年才會開始銷售。
  2. 不支援 Outlook 2003,簡單說就要Upgrade Office。不過如果是租用E3方案(預設方案,未特別說明E1,E2是否也有),可安裝使用就最新版本Office Professional Plus。
  3. 不支援 CDO 元件。如果是專統ASP程式,這方面會有問題。
  4. 費用分為 K方案與 E方案。K 方案為 25人以下個人及小企業使用;E 方案為 25 人以上中大企業使用。
入口網頁:portal.microsoftonline.com
E方案費用:http://www.microsoft.com/zh-hk/office365/enterprise-solutions/enterprise-plans.aspx,此為香港費用,台灣未上市,可以拿來試算一下。

Office 365 E方案說明

簡單說明 E1, E2, E3差異:
  • E1:完整 Exchage Online 功能。(10 USD)
  • E2:E1 + Office Web Apps (線上協同作業)。(16 USD)
  • E3:E2 + Exchange 無限封存。(24 USD)
E3是目前主推。

Office 365產品試用

輸入 http://www.microsoft.com/office365,會自動導向所在區域的 Office 365。
  • 選擇「專業人員和小型企業的Office 365」即K方案。
  • 選擇「中型企業和企業的 Office 365」即E方案。

Office 365架構

基本以是否已有 AD Server 與 Exchange Server 來區分。
  • 無AD Server,無 Exchange Server
  • 有AD Server,無 Exchange Server
  • 有AD Server,有 Exchange Server
就講師而言,Office 365非常合適當「混合雲」,Office 365能與我們企業內部的 AD Server配合的非常完美(還需要架一台 ADFS Server),透過ADFS去進行Office 365與AD Server的認證,讓使用者不論在外部或內部,使用起來都沒有差異感。

Office 365的Office Professional Plus

不會再有版本號,會隨時更新為最新版(要安裝一支更新程式),目前而言就是 Office 2010,每一個 Office 365 帳號可以安裝 Office Prefessional Plus 到 5 台設備。每 30天驗證一次帳號有效性。

Office 365 評估心得

對於個人及小企業的K方案而言,費用是很便宜,但每一使用者空間只有 500 MB,讓我有點…不知道應該如何說。租用Gmail為 5 USD/月,但能有 25 GB空間,Office 365雖然提供除 Exchange Online其他附加功能,例如,SharePoine Online、Office Web Apps,但以現行環境而言,500 MB實在是小氣。

回過頭來說,根本不用考慮K方案,如果你是考慮使用K方案,那我會直接建議去使用 Gmail企業服務。但如果你有考慮E方案,功能性而言,非常不錯,不論是 Online 的功能,或與 Office 2007/ Office 2010 / Office Professional Plus 的配合都相當的好。

另一問題會是在,Office 365 功能與價格與Gmail來比,是否有競爭力?我的評估,價錢是沒有,功能就因人而異。如果單純只以Email這件事來看:

Office 365 E1:10 USD/月
Gmail 企業服務:5 USD/月

最便宜的E1方案價格是 Gmail 的兩倍,除非有很特別的理由,例如,要與現有的 Exchange 整合應用;需要使用到 SharePoint Server、Lync Server 等功能。

但換個角度來談,Office Professional Plus是個加分點,我們企業在買Office、升級Office、續SA,可以說每年也是花費不少,或許你把那多出來的 5 USD/月的錢當成Office的租金,或許會好受些!

Tools - 出現藍色當機畫面,怎麼辦?

在早期 Windows 時代 ( Windows 95 / 08 / Me ),藍色當機畫面是很常見的,到了 Windows XP 好一些,到了 Windows Vista 及 Windows 7 又向上提升。不過,人生難別有意外,出現問題時,我們總是希望能知道原因,都常原因找得出來,問題就解決了一大半。

在 Windows 之中,預設當機資訊會存放在 %SystemRoot%\MEMORY.DMP 之中。

Windows 啟動及修復
圖一:Windows 啟動及修復
你可以把 %SystemRoot% 複製到檔案總管裡,按下 Enter,如果你有當機過,而且又是藍色當機畫面,那你可以在此目鍵下按幾次 m ,即可找到那個傾印檔案 MEMORY.DMP。

Memory.dmp 傾印檔案
圖二:Memory.dmp 傾印檔案
問題是,這個傾印檔案又不是給我們一般人看的,沒關係,我就教各位如何找出問題。

jQuery - Multi-Version jQuery Cheat Sheet for PDF and iPad

jQuery 改版太快的困擾

家有一表,如有一寶。
如同我們每天都在查 MSDN 一樣,腦中要記的指令、參數、語法、條件…實在太多,所以手邊不管有個電子檔的速查表或印出來的紙本速查表,對於工作有實質上的幫助。

進步的太快,實在也是一種「困擾」,翻開我手邊的 jQuery 速查表,有 gscottolson.com/weblog 版本 jQuery 1.2 Cheat Sheet v1.0 (此網站已經改版);impulseStudios.ca 的 jQuery 1.4 Cheat Sheet;還有二張彩色 A3 全開 jQuery 1.3 Cheat Sheet。

我想,使用 jQuery 是很爽的事,但做 jQuery 速查表的人,應該很辛苦,先讓我說聲 Thank you。bugs 修正當然是越快越好,但其他 jQuery 新功能進化速度之快,也算少見。但每次改版就要上網找一次「jQuery 1.x Cheat Sheet」,又好像有點呆呆的。

今天來介紹一個新發現的好網站,它直接提供 jQuery 所有版本速查表。連我沒看過的 jQuery 1.0  ~ 1.6 都有。而且相當容易使用。

Tool - 電腦不斷重開機(reboot),怎麼辦?

假設你有一台舊電腦,會說舊電腦是因為新電腦碰到「不斷重開機」的機會不大。一般而言,我會分為兩步驟,一是作業系統(OS)是否有問題?二是硬體(HardWare)是否有問題?

Is OS / Software problem?


computer 不斷 reboot 之前先確認:
  1. 電腦是否有安裝「防毒軟體」?
    最少有基本保護,可以排除大部分病毒所為。
  2. 是否有上什麼奇怪的網站?
    防不勝防的一部分,就算有防毒軟體,還是會中獎,很大一部都是透過惡意網址而來
  3. 是否有安裝任何「新」軟硬體?
    Driver 的相容性,沒有寫好的 Driver 容易造成系統當機。例如,你如果買 WD 之類的 HDD ,都可以到原廠網站下載 Acronis True Image WD Edition 的軟體,有免費可以使用,當然是不錯,不過我被這一套軟體害過幾次,裡面有一支 *.sys (名稱記不太起來) 裡造成 Windows 7 系統不穩定,而不斷出現藍白畫面。
  4. 是否已經數次當機?
    即在這之前,是否有過當機記錄,而且已經當機數次了?每次的當機,除非你有使用 Raid 5 之類技術來保護你的作業系統,不然,每次的當機多少會對電腦造成一些傷害,就像內傷一樣,短時間或許不影響,但長時間下來,或許已經要作業系統造成不可回復的傷害。
先確認電腦在不斷 reboot 之前,是沒有「異動過」。

小孩帶金剛 - 撕書

今天,大女兒晚上不知怎麼了,可能是學著小女兒,好玩的一個人在撕著我新買給她的故事書。

這頁少一角,那頁少一磈,還很高興的說:「我要修理它。」

當然,我和婆婆都氣壞了。

婆婆說之以理,她似懂非懂。

我,平常可能會"動手"好好"修理(她)",但我忍了下來,我很無奈說了幾句後,就說:「處罰是這週妳都不要碰我的書。」

「妳不愛我的書…」
「它們都是爸爸與媽媽很辛苦工作賺錢,才能買書給妳看…」


接著,我去把書收一收。

晚些,我拿著 Type 來東黏黏西補補,進行著大女兒那口中「修理書」的工作。突然,腦中出現一些畫面,想著,等她長大結婚,我要拿這本故事書上台,一句一句念著故事內容給她聽,念完後,我會跟她說:「感謝妳,當年把這本書撕的破破爛爛,在修理它時,讓我領悟一個很重要的人生道理。」

人生,有人比喻就是像一本書,一開始空白,從出生開始,開始一筆一字開始寫下妳的故事。有人寫的好,寫的精彩;有人寫的壞,寫的沒人願意多看一眼。

寫書、寫日記、寫日誌、寫Blog … 有種東西叫「回復」或是「立可白」可以去消除刪除一些內容。 但我們人的故事是連續且不可中斷的,很多事很無法回復,也沒有立可白可以使用。

就像這本故事書一樣,故事書內容還是一模一模,但妳撕書所造成的傷害是一輩子的,不管我用全世界最好 Type 來黏也是一樣。

書可以重買,但人生連一秒都無法重新來過。

在我們的一輩子之中,會碰到很多「情事」,親情、感情、愛情、友情…每一段可好可壞,或許「時間」可以當個立可白的角色,不過那個代價很大,通常都是一比十、一比二十、一比三十…,那個十、二十、三十的單位是「」。

有些事的嚴重性就好比撕書這行為一樣,當妳決定要撕下去時,那是一輩子想回復也回復不了。

故事依然是故事,內容一點也不會改變。黏黏補補的頁面,那絕不會是精彩、彩色人生的一部分,或許稱為「污點」一點也不為過。

這是妳在三歲時,帶給我的人生領悟,今天,爸爸把故事書及這個道理,都拿來送給妳,當結婚禮物。

希望妳一輩子都記得,去保護好妳的自己和妳所愛的人的故事書。

JavaScript - 重新介紹JavaScript重點筆記

這是Mozilla Firefox Developer Center上一篇「重新介紹JavaScript」文章,文章內容精簡,但提出了非常多「實用」的觀念,像我們用了一輩子(很多年啦,但我相信,再怎麼改版這些基本的內容還是不會改變)的for迴圈,還有很多小秘密,讓我們可以寫出「更有效率」的程式,其中還有許多小建議是我們平常的書藉、教科書所看不到的,例如,有沒有聽過「絕對等於」、「絕對不等於」。

小小一篇,又讓我對JavaScript更進一步了解。

重點整理

  • JavaScript 沒有所謂的整數。
  • parseInt()函式有個選擇性的第二個參數(在此建議你一定要指定),用以指定進位數,parseInt("010")會得到8,parseInt("010", 10)才會得到10。
  • 布林 (boolean) 型態:false、0、空字串 ("")、NaN、null、以及 undefined 都會成為 false
  • 雙等號運算子(等於)會進行型態強制轉換,假如比較的資料型態不一樣,有時結果會相當有趣:1 == true會得true。要避免型態強制轉換,要用三等號運算子(絕對等於):1 === true會得false。還有一個!== (絕對不等於)運算子
  • 別忘了--陣列的 length 就是最高索引數加一。
  • for (var i = 0; i < a.length; i++) {a[i]},這樣不是很有效率,因為每迴圈一次就會查詢一次 length 屬性。(但所有JavaScript的教科書都這樣教!)
  • 比較好的寫法:for (var i = 0, len = a.length; i < len; i++) {a[i]},初始化時宣告兩個變數,把length屬性值存放到變數中。
  • 更棒的寫法:for (var i = 0, item; item = a[i]; i++) {處理item},for 迴圈中間指定變數值的部分會被測試是否為「真的」(truthy)--如果成功了,迴圈便會繼續。由於 i 每次都會加一,陣列內的每個項目會被照順序指定到變數 item。當偵測到「假的」(falsy) 項目時(如 undefined)迴圈便會停止。注意--這個小技巧只該用在你確定不會含有「假的」值的陣列(比如說一陣列的物件或 DOM 節點)。假如你在可能含有 0 的數字資料或可能含有空字串的字串資料上做迴圈,最好還是用 i, j 的方式。