網頁

Visual Studio 2010穩定度不佳

一個全新的產品,讓人期待,也讓人受傷。由Visual Studio 2008改使用Visual Studio 2010已已經一段時間,整體而言,使用Visual Studio 2010開發是開心的,但近來常常寫Code寫到一半,Visual Studio 2010就會發現Crash,只是簡單打幾行程式就會Crash,然後自動重新啟動,這樣的感覺很不好,重點是剛才所打的Code有時還會不見了。



只能等Service Pack 1出來時,可否大大改進穩定度問題。想念Visual Studio 2008,用了許久也沒有Crash過!

我的物件導向學習史

我最早接觸的是Dos裡的Basic,在那個時代是個有個「黑白畫面」就讓人興奮的事了,一開始學程式都是叫你寫九九乘法表、排出各種圖型的星星(*)…等,到後來Windows 95與OS/2大戰,第一次接觸到Visual Basic 6…好多有趣的歷史,但今天我想聊聊一些程式方面的東西。

1. Copy & Paste

在我剛學程式時,最常使用的方法,就是將會重覆使用的程式片斷,Copy然後Paste,最是簡單也是最有效率的方法,但時間一久,就會發現問題!如果這段程式需要修改,那你必須將有所有使用此段程式的檔案找出來,然後全部修改,當時我最常用的工具是UltraEdit,它在多檔案搜尋及取代實在好用,不過這實在不是個好方法。

2. 副程式

後來學到了副程式,我們將上述程式獨立出來,使用Sub或Function來撰寫,然後整個在一個檔案裡,需要的程式在引用使用即可,當程式需要修改時,我們也只需要修改此檔案裡的Sub或Function即可,引用使用的程式都不必修改,馬上套用修改後的Sub或Function,終於有比較像樣的架構出現。

3. 模組

後來我們發現,這個副程式檔案裡有些副程式實在好用,想要給其他開發系統也能使用,所以就有人開始將類似的副程式整理集合起來,分門別類,儲存在檔案裡,這就是模組(Module)的概念。在使用Visual Basic 6時代,網路上開始出現很多免費的模組,也有很多公司在賣模組,也就是我自可以買現成人家寫好的模組在Visual Basic 6來使用,來加速程式的開發。

4. 類別

模組真的是一大突破,在Visual Basic 6使用起來真的很高興,但模組還是有些問題,而且Visual Basic 6一直被罵,說Visual Basic 6根本不是物件導向的程式設計語言。什麼是物件導向?記得第一次上物件導向的課,是使用C++,聽的一個頭兩個大,而且就算你想要學物件導向,世面上清一色都是C及Java的教材,Visual Basic…根本沒有。到了多年之後,VB進步到VB.NET,在VB.NET中才終於引進了「OOP」的關念。在VB.NET我才開始關接觸到OOP。

看一看,我的學習史與程式進步史兩者還差得不遠,不過現在可以說是軟體爆炸的時代,推陳出新的速度快的不行,要好好加油才是。

參考:
Module與Class的差別??

駭客級測試工具--hping

今天來為大家介紹一個駭客級的測試工具「hping」。

聽到「駭客」不知道各位有沒有很高興,其實在資訊領域很利害的電腦高手我們稱為「駭客, Hacker」,但這些高手中有些人走上歧途,把這些可能是高深也可能不是高深的技術,使用在不正當的用途上,我們稱之「怪客, Cracker」。

就像正邪大戰一般,我們當然希望邪不能勝正,但在邪惡的一方發動攻擊之前,正義的一方是否能先做好充足的防禦,是重要的關鍵。那我要如何知道是否有良好的防禦工程呢?請東邪、西毒先來攻打一番嗎?當然不是!通常我們會先自我測試一番,如果連自我測試通無法通過,那還談什麼防禦,你說是不是。

如果你有一點網路基礎,那你一定使用過Windows系統下的ping指令,例如「開始 --> 執行 --> 鍵入:cmd --> 會跳出一個黑色命令視窗 --> 輸入:ping 168.95.1.1」這是一個在測試網路狀態的指令。或是當你電腦的網路不通時,是否有人就會說,你有沒有ping ping看?而Windows內建的ping真的是太陽春了,只合適簡單測試網路是否正常連線。

但我們需要的是一個能「模擬攻擊」的測試工具,而hping正是一個在Unix/Linux下的測試用的攻擊工具(也有Windows版本,我們下一部份會談),在開始介紹前,記得一件事,網路上的每一個工具,是毒也是藥,就如我介紹這個hping工具,你可以拿它來當駭客,也可以拿它來當怪客。

hping安裝


目前hping有hping2、hping3及hping.win32三個版本,Linux我們介紹hping3,hping.win32我們下一部份介紹。

實作Linux系統:CentOS 5

# tar zxvf hping3-20051105.tar.gz
# cd hping3-20051105
# cat INSTALL (請詳細觀看)
# ./configure
# make
# make install

下面是一些常用的方法

hping www.abc.net.tw -1 -i u100000 -a 100.100.100.100
每秒送10個(-i u10000)ICMP(-1)封包到www.abc.net.tw 偽造來源IP(-a)為100.100.100.100

註:-1為數字非英文

hping www.abc.net.tw –i u1000000 –a 100.100.100.100 –s 22222 –p 44444
每秒送1個(-i u1000000)TCP(default)封包到www.abc.net.tw的port 44444,偽造來源IP(-a)100.100.100.100使用的port為22222




測試1: SYN Flooding(每秒10個封包)
hping 目標主機IP –i u100000 –S –a 偽造來源IP

測試2 :偽造IP的ICMP封包(每秒10個封包)
hping 目標主機IP –i u100000 –1 –a 偽造來源IP
註:-1為數字非英文

測試3:不正常TCP Flag組合封包(每秒10個封包)
(a)SYN+FIN
hping 目標主機IP –i u100000 –S –F –a 偽造來源IP
(b)X’mas
hping 目標主機IP –i u100000 –F –S –R –P –A –U –a 偽造來源IP

測試4:偽造IP的UDP封包
hping目標主機IP –i u100000 –2 –a 偽造來源IP

測試5:偽造IP內含CodeRed封包
hping 目標主機IP –i u100000 –d [封包datasize] –E [filename] –a [偽造來源IP]

如果參數使用方面有任何問題,請參考man hping或是線上hping man page。最後,希望「你」的系統可以平安通過「你」的測試。

透過資料庫上傳下載檔案

在ASP時候,寫個上傳檔案都很麻煩,因為ASP本身沒有支援上傳的物件,必須使用第三方物件來進行上傳功能的實作,到了ASP.NET上傳實在很簡單,拉個FileUpload物件,寫簡單的幾行程式,馬上可以有上傳功能。

有了上傳,那下載呢?

下載就很笨,通常是網頁帶「Link」的方式,例如:「http://localhost/files/KKBruce.zip」這樣的方式來讓人下載。好一點的架個FTP,但還是寫個管理Link資料庫及程式,例如:「http://localhost/files/download.asp?id=1」取出「ftp://localhost/files/bruce/blog.zip」來讓使用者下載。久而久之,檔案一多還是不好管理,又要管檔案,又要管理Link!

所以想就使用「資料庫」來管理,這裡指的資料庫不是那種管理「路徑」的Table,而且將檔案整個存到Table裡,需要時再取出來使用,以下我們就來實作上傳檔案至資料庫,由資料庫取出檔案下載兩部份。

****** Object:  Table [dbo].[Files]    Script Date: 08/26/2010 17:12:17 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Files](
 [uid] [int] IDENTITY(1,1) NOT NULL,
 [Name] [nvarchar](50) NOT NULL,
 [Body] [varbinary](max) NOT NULL,
 [Size] [decimal](18, 0) NOT NULL,
 [SaveDateTime] [datetime] NOT NULL,
 [LastUseDateTime] [datetime] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

我們先建一個資料表,裡面最重要的是「Body」,Body就是要儲存檔案的地方,而一般網路資料或書籍資料都是使用「Image資料類型」,但查看MSDN後發現,如果你是使用SQL Server 2005以後的版本,請改使用請改用 nvarchar(max)、varchar(max) 和 varbinary(max)

在未來的 Microsoft SQL Server 版本中,將移除 ntext、text 和 image 等資料類型。請避免在新的開發工作中使用這些資料類型,並規劃修改目前在使用這些資料類型的應用程式。請改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

以上是要注意的地方。

接下來我們來實作上傳檔案到資料庫,然後再從資料庫下載檔案。

新增Default.aspx在UI部份:

<div>
        <asp:FileUpload ID="FU" runat="server" />
     
        <asp:Button ID="SaveFile" runat="server" Text="上傳" />
        <br />
        <br />
        編號:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
 <asp:Button ID="DownFile" runat="server" Text="下載" />
    </div>

我們針對SaveFile及DownFile來撰寫程式碼:

SaveFile事件:
Protected Sub SaveFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SaveFile.Click
        ' 先確認有選擇檔案
        If Not FU.HasFile Then
            Response.Write("沒有上傳的檔案!")
            Response.End()
        End If

        ' 檔案存進資料庫都是「二進位」,所以使用Byte
        ' buf陣列依檔案大小來建立
        ' 陣列由0開始,所以減1
        Dim buf(Me.FU.PostedFile.ContentLength - 1) As Byte
        Me.FU.PostedFile.InputStream.Read(buf, 0, Me.FU.PostedFile.ContentLength)

        Dim conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("SCS").ConnectionString)

        ' 將參考及欄位對應起來
        Dim cmd As New SqlCommand("INSERT INTO Files(Name,Body,Size,SaveDateTime) VALUES (@filename,@body,@size, @sdt);", conn)
        cmd.Parameters.AddWithValue("@filename", FU.PostedFile.FileName)
        ' 將二進位檔放入資料庫中
        cmd.Parameters.AddWithValue("@body", buf)
        cmd.Parameters.AddWithValue("@size", FU.PostedFile.ContentLength.ToString)
        cmd.Parameters.AddWithValue("@sdt", Now)

        Try
            Dim rs As Integer
            conn.Open()
            rs = cmd.ExecuteNonQuery
            Response.Write("新增成功")
        Catch ex As Exception
            Response.Write(ex)
        Finally
            cmd.Cancel()
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

DownFile事件:
Protected Sub DownFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DownFile.Click
        ' 由輸入
        Dim id As Integer

        If String.IsNullOrEmpty(Me.TextBox1.Text) Then
            Response.Write("請輸入下載ID編號")
            Response.End()
        Else
            id = Me.TextBox1.Text
        End If

        Dim conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("SCS").ConnectionString)
        Dim cmd As New SqlCommand("Select * from Files Where uid = @id", conn)
        cmd.Parameters.AddWithValue("@id", id)

        Dim dr As SqlDataReader

        Try
            conn.Open()
            dr = cmd.ExecuteReader
            ' 將資料取出,輸出
            If dr.Read Then
                Response.ClearHeaders()
                Response.Clear()
                Response.Expires = 0
                Response.Buffer = True

                ' Getxxx效能較佳
                Dim Name As String = dr.GetString(1)
                ' 進行AddHeader設定
                Response.AddHeader("Accept-Language", "zh-tw")
                ' 設定輸出檔案及類型
                Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & Name & Chr(34))
                Response.ContentType = "Application/octet-stream"
                ' 進行「二進位」輸出,使用BinaryWrite方法
                Response.BinaryWrite(dr("Body"))
                ' 將緩衝輸出
                Response.Flush()
                Response.Close()
                ' 請參考討論,不要使用Response.End()
                ' http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20100824142739D3F.html
                'Response.End()
            End If
            Response.End()
        Catch ex As Exception
            Response.Write(ex)
        Finally
            cmd.Cancel()
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

其實不難:
  1. 將檔案轉為Byte,然後存進資料庫的二進位欄位;
  2. 取出資料,進行二進位輸出。
不管是Excel、Word、MP3、Text、ZIP…反正只要是檔案都可以上傳及下載。以上還有很多可以改進的地方,例如統計的部份,或使用其他方式(Session…)來取得下載檔案。

參考:

Visual Studio 2010 新發現(7)--反白顯示

反白顯示
當我們點選某個關鍵字時,Visual Studio 2010會馬上幫我們「反白顯示」所有相同的物件,例如上圖的ds,這樣可以很清楚的知道,我的ds物件用在什麼地方。

另外我們還可以使用組合鍵:「Ctrl + Shift + 上或下鍵」來移至上一個或下一個反白顯示的物件。

Visual Studio 2010 新發現(6)--方塊選取

在做教育訓練才發現VS2010新發現,Blog還少了幾篇。

方塊選取

我第一次學到這個功能是在Linux的Vi(Vim)編輯器裡,正常我們在Windows的工具裡(記事本、Office…),或使用像Visual Studio這樣的開發工具,都少不了「選取」,但有時我們必須選取的是「列」或「方塊」的資料時,怎麼辦?

這時候我們就可以使用「Alt + Mouse右鍵」:

方塊選取
接下來不管是複製、貼上都沒有問題。但如果我想使用鍵盤可不可以?沒有問題,只要使用「Shift + Alt + 上下右左鍵」,就可以移動出你想要的方塊區。

別外這個方塊選取在「多行相同位置要新增刪除相同資料」時特別好用:

多行新增、刪除
 使用「Shift + Alt + 下」畫出區塊,然後按「'」把程式註解,或是按任何鍵新增資料,如果你在方塊內新增資料,那會有替代的效果。

最後,如果畫的方塊很長(上下、右左),一直接「上下、右左」也不是辦法,那你也可以使用組合鍵:
  1. Shift + Alt + 上或下或右或左
  2. 然後放開
  3. Shift + Home或End或PageUp或PageDown
你可以試著在第三步不放開Shift,然後按一下Home、End、PageUp、PageDown,看一下效果。

String類別與Strings類別

String類別
將文字表示為一系列的 Unicode 字元。
命名空間: System
組件: mscorlib (在 mscorlib.dll 中)

Strings類別
Strings 模組包含用來執行字串作業的程序。
命名空間: Microsoft.VisualBasic
組件: Microsoft.VisualBasic (在 microsoft.visualbasic.dll 中)

「文字」是網頁的核心,早晚你都會需要「處理文字」的,而不是只是把資料庫的資料取出,然後Binding到控制項後就沒事了。最常見的需求就是「處理使用者輸入的資料」,那你就不能不了解String類別及Strings類別。這兩個類別只差了最後面的"s"。

String類別

String類別很像VBScript(ASP)的字串處理函數,裡面提供了很多字串處理函數,處理完最終是要「表現在網頁上」。例如我們常用的String.Format來進行文字排版。

Strings類別

Strings類別也是進行字串處理,但這個處理不是以「表現在網頁上」為主要目的,主要是在處理「字串」本身上面。例如:Strings.StrConv()就提供了一個簡易的文字轉換功能,像簡體轉繁體、繁體轉簡體…等。

Me關鍵字與Visual Studio 2010 Pascal式選取控制項

Me關鍵字是個好物,我們先參考MSDN的說明:
  1. 提供參考特定的類別 (Class) 執行個體 (Instance) 或程式碼目前正在執行之結構的方法。
  2. Me 關鍵字提供的參考方式,可以參考目前執行的程式碼所在之特定類別或結構的執行個體。Me 的行為就像參考目前執行個體的物件變數或結構變數。在將關於目前執行中的類別或結構執行個體的資訊傳給其他類別、結構或模組的程序時,Me 特別好用。
看不懂,那來實作比較快,我們新增一個網頁default.aspx,然後將所有「工具箱」裡「標準」控制項全部拉到畫面上,我們進到程式碼Page_Load中,在不使用Me關鍵字時,我想要找到BulletedList1這個控制項:

未使用Me關鍵字
你可以發現,IntelliSense很好心的幫你把「有的沒的」「相關、不相關」通通全部抓出來給你,這時你可以發現「數大是美」在這裡不是好事,如果希望可精確的找到你想要的控制項,就可以使用Me鍵關鍵:

使用Me關鍵字
人客呀,你看看!使用了Me關鍵字之後,我才打了一個b,就差不多要找到我要的控制項了,這個Me關鍵字確實可以加速及簡化我們的工作,由其是在有大量控制項的頁面上,這個Me關鍵字的優點就更加突出。

其實Me關鍵字代表Web From物件本身,所以當你使用Me時,IntelliSense只會找出與Web From有的物件。

別外在Visual Studio 2010中也增強了程式碼選擇的功能,在.NET Framework之中類別都是採用Pascal命名法,你可以輸入每個英文字字首,例如輸入DT,Visual Sudio會自動列出DataTable、DateTime等。

使用英文字字首
所以我們還可以結合Me關鍵字及Visual Studio 2010的加強式選擇的功能:

Me加字首選取
如果你自訂的ID名稱也是使用Pascal命名法,那一樣可以使用上述方式來使用,例如tbxUserName,當你輸入Me.UN即可找到你要的控制項。

參考:

不要使用Attributes屬性來輸出指令碼

ASP.NET中一些JavaScript的使用技巧

我在上述這一篇有提到一個Attributes的屬性,利用它來動態插入Javascript,今天在寫Code時發現,我輸出來Javascript不會動,如果發現使用Attributes輸出的Javascript的「'」或「"」符號,會被編碼成為「&#39;」及「&quot;」,結果就是Javascript不會動,細查MSDN後才了解,原來已經不能使用這個屬性來輸出指令碼了。

WebControl..::.Attributes 屬性

中間的注意事項:
不能使用 Attributes 集合將用戶端指令碼加入至 WebControl 執行個體。若要加入用戶端指令碼,請使用 Page 控制項上的 ClientScript 屬性。

結構(Structure)關鍵字

當我們程式有類似「資料結構」的內容時,可以使用Structure這個關鍵字來幫我們建立一個資料結構。Structure與Class很類似,我們先來看MSDN解譯:

Structure 陳述式定義可自訂的複合 (Compositing) 實值型別。
...
結構支援許多和類別相同的功能。例如,結構可以具有屬性和程序、可以實作介面,也可以具有參數型建構函式。但是,結構與繼承 (Inheritance)、宣告和使用方式等區域中的類別之間有明顯的差異。而且,類別是參考型別 (Reference Type),而結構是實值型別 (Value Type)。
...
結構支援許多和類別相同的功能。例如,結構可以具有屬性和程序、可以實作介面,也可以具有參數型建構函式。但是,結構與繼承 (Inheritance)、宣告和使用方式等區域中的類別之間有明顯的差異。而且,類別是參考型別 (Reference Type),而結構是實值型別 (Value Type)。
...
結構預設值為 Friend (Visual Basic) 存取。
 如果你對Friend不是很了解,可以參考這篇討論「Public與Friend的差異」。我們使用MSDN上的範例來改寫:

先在畫面上放兩個Textbox,一個輸入薪資,一個輸入獎金比例,在放一個按鈕來計算獎金:

<div>
        新資:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        倍數:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="計算獎金" />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label">
    </div>

在後置程式碼中,我們先定義Structure,然後在click事件中撰寫處理程式:

Partial Class _Default
    Inherits System.Web.UI.Page

    Public Structure Employee
        Dim Name As String          '姓名
        Dim EmpNumber As String     '員工編號
        Dim Salary As Double        '薪資
        Dim Bonus As Double         '獎金

        Friend Sub CalcBonus(ByVal Rate As Single)
            '獎金計算
            Bonus = Salary * Rate
        End Sub
    End Structure

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Bruce As Employee

        Bruce.Name = "金剛"
        Bruce.EmpNumber = "s2877001"
        Bruce.Salary = Me.TextBox1.Text
        Bruce.CalcBonus(Me.TextBox2.Text)

        Me.Label1.Text = String.Format("您好{0}<br/>員工編號:{1}<br/>薪資:{2}元<br/>獎金:{3}元<br/>共領:{4}元", Bruce.Name, Bruce.EmpNumber, Bruce.Salary, Bruce.Bonus, Bruce.Salary + Bruce.Bonus)
    End Sub
End Class

你查看一下Dim Bruce As Employee,Employee是Structure而不是ClassBruce是_Default.Employee型別,想成Structure的型別。

當我們不需要使用到Class那怎那強大又複雜的功能時,就可以考慮使用Structure,另一個好處是使用Structure的幫我們整理相關的資料細節,讓我們的程式看起來更有結構性。如果以上程式不使用Structure的話寫法如下:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Name As String          '姓名
        Name = "金剛"
        Dim EmpNumber As String     '員工編號
        EmpNumber = "s2877001"
        Dim Salary As Double        '薪資
        Salary = Me.TextBox1.Text
        Dim Bonus As Double         '獎金
        Bonus = Salary * Me.TextBox2.Text

        Me.Label1.Text = String.Format("您好{0}<br/>員工編號:{1}<br/>薪資:{2}元<br/>獎金:{3}元<br/>共領:{4}元", Name, EmpNumber, Salary, Bonus, Salary + Bonus)
    End Sub

如這時需要在計算一個女金剛的資料,那你就必須再重覆的Dim ...,而且第二次還不能使用相同名稱,但如果使用Structure我只需要「Dim Sherry As Employee」完成了整個資料結構,所有的屬性、函數…都一樣,使用起來輕鬆又方便。一個好用的技巧,介紹給大家。

透過網頁存取Registry

Microsoft.Win32命名空間提供兩種類型的類別,一種是處理作業系統引發事件的類別,一種是管理系統登錄的類別。原本我以為這個類別只能使用在WinForm,結果我錯了,它也能使用在WebForm上。

Imports Microsoft.Win32

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        For Each names As String In Registry.CurrentUser.GetSubKeyNames
            Response.Write(names & "<br />")
        Next
    End Sub
End Class

我們先看我電腦上的Registry:

Registry值

再來看看執行結果:
Microsoft.Win32取得Registry值
根據MSDN上的說明是可以「存取」Registry的值,我沒試「存」的這一段,如果你需要「存」值進去Registry,請千萬小心,如果出錯,那可能就要走上「重灌」的命運,切記切記。

大話設計模式 for Visual Basic授權

http://www.cnblogs.com/cj723/archive/2009/03/12/1409359.html

伍迷授權

之前網友有問我,除了VB物件導向還會不會寫些相關文章,後來還因為VB物件導向的文章,讓我認識了AllenKuo這位高手,後來AllenKou又問了我一次,會不會再寫些東西,Design Patterns可以說是物件導向進版應用,Design Patterns也可以是物件導向的方法論,還是與我寫Visual Basic物件導向的初衷一樣,Visual Basic在Design Patterns的資料很少,而這本「大話設計模式」寫的很不錯,用說故事的方式寫出這些苦澀的理論,這本書寫的很好,但它是用C#。

我自己是邊寫邊測試邊學習Design Patterns其中的優點,在轉換C# to VB,過程好玩,不過你問我看得看C#嗎?哈,我看不懂,所以我特地去問作者,可否把我轉成VB且可執行的程式放到部落格來,經作者同意,我會慢慢把程式放上來,當成各位Visual Basic學習者進入Design Patterns的入門。

不過我在學習Design Patterns時,個人感覺最難的是「怎麼用」,看書好像都很簡單,實際上,可能連「工廠」都蓋不出來!@_@

SQL Server 2008 R2遠端連線Error 26

近來租用了Hicloud服務,當架設了SQL Server後很奇怪,一直無法從達端連線,我還把自己的筆記看了一次,確定設定沒有什麼問題,但會一直出現一個錯誤26:

標題: 連接到伺服器
------------------------------

無法連接到 cloud???\master。

------------------------------
其他資訊:

建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及 SQL Server 是否設定為允許遠端連線。 (provider: SQL 網路介面, error: 26 - 搜尋指定的伺服器/執行個體時發生錯誤) (Microsoft SQL Server, 錯誤: -1)

如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=-1&LinkId=20476

最後還是被我「猜中」解決這個問題。

解決辦法:請在「伺服器名稱」最後加上「,1433」。很奇怪吧,明明預設Port就是1433,還是必須加上這個設定,真怪。

在Windows Server 2008 R2安裝SQL Server 2008 R2

Windows Server 2003與Windows Server 2008(R2)差異差常的大,連設定個防火牆都有點嚇到,不過我要在Server 2008 R2上面安裝SQL Server 2008 R2,不給我安裝,安裝SQL Server 2008 R2有三大必要條件:

步驟 1:下載並安裝 Microsoft .Net Framework 3.5 SP1
步驟 2:下載並安裝 Windows Installer 4.5
步驟 3:下載並安裝 Windows PowerShell 1.0

第一個在Server 2008 R2已經內建;第二個在Server 2008 R2無法安裝,應該也是內建;PowerShell 1.0,也是內建。應該是可以安就才對,還好有網路上願意分享的大大們,請參考:

在 Windows Server 2008 R2 版本上設定基礎環境,準備作為安裝 SQL Server 2008 R2 版本之用

就是它了,設定一下就可以安裝SQL Server 2008 R2了。

HiCloud Cloud computing Survey(雲端運算服務評估)

最近在規劃公司伺服器方面的事務,但一直有個問題,上層一直說硬體太貴了,價錢太高了,我聽了直搖頭,一台伺服器假設20萬好了,軟體就要硬體的2~3倍,也不知道上層那根經不對了,我打了二個多月的Email,事情還沒有解決,後來又發生了一些事,到了想離開的地步。

話說回來,反正就是「一次性」的費用太高, 只好找替代性方案,VPS、主機租賃…但評估的結果都不理想。

主機租賃:
  • 費用便宜
  • 主機規格不理想
以那不理想的主機規格,加上不便宜的價錢,實不是不考慮。

VPS:
  • VPS方案規格SoSo
  • 限制多
使用VPS想要好一點的規格,那價錢也是不便宜,在來也常常看到網友抱怨被主機商停權之類,所以也怕怕。

那有沒有好一點的解決方案,終於發現好服務「HiCloud CaaS服務」在經過一連串詢問後,終於決定申請試用,而且Hinet的專案經理來跟我收件時還說,全新竹還沒有申請過這個服務,我想當白老鼠吧。

會選擇hicloud:
  • 費用可接受
  • 限制少
以最低經濟型每天90元,一個月2700元,以它的規格與價格算可以接受,而且它是日租式,也就是用幾天就算幾天的錢,難用的話隨時可以停用。限制少是指,它就是給你一台虛擬機,在這台虛擬機上你可以任意安裝軟體,不像VPS就限制多多。


hicloud網站上的資訊太少,以下是我詢問的一些FAQ內容,整理給大家參考:

  1. 你們提供的Windows 2008 R2 是什麼版本,標準版 或 企業版?
    A:標準版。
  2. 未來有考慮提供其他版本?
    A:未來規劃提供客戶自行安裝OS的服務。
  3. 那是否有規劃開發含其他的軟體的解決租賃方案?
    A:我們以提供OS為主。
  4. 頻寬計費的 1GB 15元部份,1GB 是指上下載總合,還是單指上載或下載而言?
    A:上下載總合。
  5. 頻寬共享 50Mbps,對稱或非對稱?
    A:對稱
  6. 網頁上有寫可保證頻寬,請報價?
    A:依需求報價。(不便宜,很貴)
  7. 擴充方面,各項資源的擴充費用如何計算?
    A:以經濟型、進階型、專業型三者來轉換升級。最高等級就是專業型。
  8. 擴充方面,從網頁介紹來看,好像儲存空間「卡死了」,請問儲存空間是否也能擴充,能的話費用如何計算?
    A:可加掛D:,容量依需求報價。(價錢還可以)
  9. 防火牆服務,是必須透過你們進行設定,還是我們會有UI可以自行設定?
    A:防火牆目前由我們提供設定。
  10. 之前有問你們客服人員,如果我們要安裝軟體,客服說請我們上傳到主機後安裝,而且你們是以頻寬計費的,這不是好辦法,請問可以到主機端進行安裝所需的軟體?
    A:只能使用上傳方式。
 另外有一篇「hicloud效能測試」的文章可以參考看看。我們主要是提供Service給台灣客戶,所以沒差,應該會很快才對。^_^

HiCloud主機規格
HiCloud主機規格

元件類別(類別庫範本,Class Library)

我們先參考一下MSDN的元件類別說明:
類別和元件都是可重複使用的程式碼單位。若要撰寫元件,您必須先從類別開始。當類別符合元件互動的標準時,類別就變成為元件。這個標準是透過 IComponent 介面所提供。任何實作 IComponent 介面的類別就是元件。

我們在「VB 物件導向」介紹Class(類別)相關觀念,但這些*.vb/*.cs的Class檔案都會存放於App_Code資料夾之下,在ASP.NET裡還有另一個Bin資料夾,但Bin資料夾裡是存放*.dll檔案。
  • App_Code
    存放Class原始碼,且會自動在執行階段編譯
  • Bin
    存放編譯好的組件(*.dll)
但當App_Code裡的*.vb/*.cs類別檔需要給其他專案使用時,怎麼辦?複製過去嗎?那不就又走上副程式的回頭路,又失去OOP的精神!更好的辦法就是把這些Class編譯成Component,也就DLL檔案,然後只要拿到需要的專案參考一下,馬上可以使用,而且還兼具程式碼保護的功能。

元件類別必須獨立設定在「類別庫」專案中;

新增類別庫專案
一開始是一個空白的Class檔,我們可以加上Namespace,然後修改Class名稱:

Namespace KK
    Public Class Bruce

    End Class
End Namespace

在來我們就可以像一般設計Class的方式來撰寫程式碼,我們來設計一個加法:
Namespace KK
    Public Class Bruce
        Public Function add(ByVal i As Integer, ByVal j As Integer) As String
            Dim total As Integer = i + j
            Return total.ToString()
        End Function

        Public Function add(ByVal i As Double, ByVal j As Double) As String
            Dim total As Double = i + j
            Return total.ToString()
        End Function
    End Class
End Namespace

這個Class有兩個加法,一個處理整數,一個處理浮點數,完成設計後,我們選譯類別庫專案,按下右鍵「建置」。

建置元件
建置完成訊息:
------ 已開始建置: 專案: ClassLibrary1, 組態: Debug Any CPU ------
  ClassLibrary1 -> F:\WebDevelop\Study\StudyTest\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll
========== 組建: 1 成功或最新狀態、0 失敗、0 略過 ==========

這樣我們就編譯好我們的元件檔,我們開一個「新網站」,在專案按右鍵然後「加入參考」;

加入參考
然後查看Bin目錄

Bin的*.dll
開啟一個新網頁:

' 必須先Imports Nanespace
Imports ClassLibrary1.KK

Partial Class Classtext
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' 宣告物件
        Dim a As New Bruce
        ' 使用Integer
        ' return 4
        Response.Write(a.add(1, 3) & "<br/>")
        '使用Double
        ' return 4.4
        Response.Write(a.add(1.1, 3.3) & "<br/>"")
    End Sub
End Class

透過類別專案的設計,我們可以把原先的*.vb/*.cs類別檔編輯為*.dll檔,這樣方便我們發布共用的元件。另外,除了自己手動Coding類別外,我們也可以使用「類別圖表」的方式來設計類別,在類別專案裡新增一個類別圖表:

新增類別圖表
然後從工具箱裡的「類別設計工具」拉出你需要的工具:

設計
圖型化介面可以減少我們的工作量,而且可以清楚看出每個Class之間關係,這是很棒的一件事,但一些客製化的程式,我們還是必須寫程式,可以從上圖有一個「檢視程式碼」(倒算第三個)來進程Class程式介面。

我們透過類別庫專案來幫我們把Class編譯為組件檔(*.dll),所有人都使用同一份DLL檔,而非使用*.vb/*. cs的檔案方式。

W3C Unicorn Translation被接受了

高興,我翻譯的內容被W3C接受了,留個記錄。

翻譯W3C繁體中文

目前繁體中文的進度已經100%,但還是接受建議,如果各位有更好的建議,還是可以提供。

參考:
W3C整合驗證器(W3C's Unified Validator)

ASP.NET + CKEditor + CKFinder 整合教學

其實CKSource Docs網站上的文件寫的很清楚,但怕忘記,所以做個記錄。

  • CKEditor:3.3.2 (備份下載點)
    授權分兩種,商業用途要付費。
    CKEditor主要用途在「編輯」文件上,讓你可以更快速、更靈活的來進行編輯工作。
  • CKFinder:2.0 (備份下載點)
    目前提供的為「測試版」,在使用時會不斷顯示「這是Demo版本…」的訊息,不過功能不受影響,可以完整使用。

    CKFinder主要用途在「檔案管理」,你可以透過CKFinder直接上傳檔案到伺服器上,然後進行管理,而且CKFinder可以與CKEditor進行整合,也就是在CKEditor就可以進行上傳檔案及其他CKFinder的功能。

    目前CKFinder有分多個應用版本,因為我們以ASP.NET為主,所以請下載for asp.net的程式檔。
目前CKEditor及CKFinder的版本更新速度不算慢,如果你是用不同版本在實作,還是請參考原廠的說明為主。

以下分三個部份
  1. ASP.NET + CKEditor實作
  2. ASP.NET + CKFinder實作
  3. 整合CKEditor與CKFinder

ASP.NET + CKEditor教學實作

如果你還在使用舊版本FCKeditor,最好更新上來使用新版的CKEditor,因為FCKeditor本身設計及設定上有漏洞,例如x坤的這條新聞,所以良心建議,當你使用此類的Open Source時,要時時注意更新訊息,訂個RSS也好,當有更新時看一下是為什麼更新,如果是因為安全性問題而做的更新,那最好順便更新一下,等到出事就來不及。

  1. 下載CKEditor原始檔,我下載的是3.3.2版,解壓縮,然後將ckeditor目錄複製或拉進Vistual Studio專案根目錄裡;(裡面有兩個目錄_samples、_source,學習可以留著看,正式上線就不要留了)
  2. 在*.aspx裡引用ckeditor.js指令碼,例如:
    <script src="ckeditor/ckeditor.js" type="text/javascript" >  </script>
    
  3. 放入一個Textbox控制項,有幾個重點:
    ID:ckdata
    TextMode:MultiLine
    Rows:10
    Columns:80
    ClientIDMode:Static (.NET Framework 4)
  4. 在控制項下方撰寫Javascript指令碼
    <script type="text/javascript">
            CKEDITOR.replace('<%= ckdata.ClientID %>', {skin : 'kama'}); 
    </script>
    

    這裡主要是把Textbox的ID帶給CKEditor來使用,CKEditor才知道要把那一個Textbox變成「編輯區」。而最後{...}裡是主要細項設定的地方,可以用來改變CKEditor,例如skin是用來改變外觀,其他細部設定,請參考CKEditor 3.x - Developers Guide中Configuration一節。

    另外,請務必把此段Javascript放到Textbox控制項的下方,如果放在head裡,會沒有效果。

IntelliSense
在撰寫Javascript的過程,IntelliSense會自己提示相關方法等,就甘心啦

最後完成的程式碼為:

<div>
        <asp:TextBox ID="ckdata" runat="server" TextMode="MultiLine" Rows="10" 
            Columns="80" ClientIDMode="Static"></asp:TextBox>
            <script type="text/javascript" >
                CKEDITOR.replace('<%= ckdata.ClientID %>', {skin: 'kama'});
            </script>
    </div>

然後執行網頁:

CKEditor介面

接下來,我們在畫面上放一個Button控制項及Lable控制項,我們要把Textbox的值取出來。
<div>
        <asp:TextBox ID="ckdata" runat="server" TextMode="MultiLine" Rows="10" 
            Columns="80" ClientIDMode="Static"></asp:TextBox>
            <script type="text/javascript" >
                CKEDITOR.replace('<%= ckdata.ClientID %>', {skin: 'kama'});
            </script>

        <asp:Button ID="SendData" runat="server" Text="Button" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>

  '後置程式碼
    Protected Sub SendData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendData.Click
        Me.Label1.Text = Me.ckdata.Text
    End Sub

執行後,隨便輸入一些文字,然後送出!!!

錯誤訊息
ASP.NET本身不許包含有html標籤的資料內容,必須取消驗證,在錯誤訊息裡有提供解決辦法。在.NET Framework 4.0裡需要兩個步驟:
  1. 在開頭宣告裡加上屬性validateRequest="false";
  2. 在web.config裡新增httpRuntime標籤

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DemoCKEditor.aspx.vb" Inherits="DemoCKEditor" ValidateRequest="false" %>

'web.confg
    <system.web>
        <compilation debug="false" strict="false" explicit="true" targetFramework="4.0" />
        <httpRuntime requestValidationMode ="2.0"/>
    </system.web>

在.NET Framwork 3.5 SP1之前,只需要步驟1即可。

再為Button加上一些保護:

  '後置程式碼
    Protected Sub SendData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendData.Click
        Me.Label1.Text = HttpUtility.HtmlEncode(Me.ckdata.Text)
    End Sub

非常建議所有只要是「人工輸入」的內容都使用HttpUtility.HtmlEncode方法加以保護。

取得Textbox控制項的值
基本上到這裡就已經差不多了,其他的細節就都必須由第二個參數{…}去調整。最後來看一張圖:

影像屬性
在最後面CKEditor與CKFinder整合裡你可以看到Link、Image、Flash就可以直接進行檔案上傳及管理動作,目前還沒有。

ASP.NET + CKFinder教學實作

  1. 下載CKFinder原始檔,我下載的是2.0版(28.05.2010),解壓縮,然後將ckfinder目錄複製或拉進Vistual Studio專案ckeditor目錄之下;(裡面有兩個目錄_samples、_source,學習可以留著看,正式上線就不要留了)下載CKFinder原始檔。
  2. 在ASP.NET專案之下新增一個目錄,用來上載之用。我們在根目鍵之下新增一個「uploads」目錄。CKFinder預設使用"/ckfinder/userfiles/"目錄。
  3. 檢查上載目錄權限,必須有寫入的權限。給IUSR_<ServerName>角色寫入的權限。
  4. 編輯...檔案。 

加入CKFinder目錄之下

然後在Bin目錄之下「加入參考」,將「CKFinder\bin\CKFinder.dll」加入。

加入CKFinder.dll參考

編輯config.ascx檔:

認證:有通過認證才能使用。
public override bool CheckAuthentication()
 {
  // WARNING : DO NOT simply return "true". By doing so, you are allowing
  // "anyone" to upload and list the files in your server. You must implement
  // some kind of session validation here. Even something very simple as...
  //
  //  return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );
  //
  // ... where Session[ "IsAuthorized" ] is set to "true" as soon as the
  // user logs on your system.

  //return false;
        return true;
 }
作者苦口婆心請大家不要設為「true;」,請大家注意,測試時還沒關係,正式上線一定一定要設為false

主要設定:
public override void SetConfig()
 {
  // Paste your license name and key here. If left blank, CKFinder will
  // be fully functional, in Demo Mode.
  LicenseName = "";
  LicenseKey = "";

  // The base URL used to reach files in CKFinder through the browser.
  //BaseUrl = "/ckfinder/userfiles/";
            BaseUrl = "http://localhost:49559/DemoEditor/uploads/";

  // The phisical directory in the server where the file will end up. If
  // blank, CKFinder attempts to resolve BaseUrl.
            BaseDir = "F:/WebDevelop/Study/StudyTest/DemoEditor/uploads/";

  // Optional: enable extra plugins (remember to copy .dll files first).
  Plugins = new string[] {
   // "CKFinder.Plugins.FileEditor, CKFinder_FileEditor",
   // "CKFinder.Plugins.ImageResize, CKFinder_ImageResize"
  };
  // Settings for extra plugins.
  PluginSettings = new Hashtable();
  PluginSettings.Add("ImageResize_smallThumb", "90x90" );
  PluginSettings.Add("ImageResize_mediumThumb", "120x120" );
  PluginSettings.Add("ImageResize_largeThumb", "180x180" );

  // Thumbnail settings.
  // "Url" is used to reach the thumbnails with the browser, while "Dir"
  // points to the physical location of the thumbnail files in the server.
  Thumbnails.Url = BaseUrl + "_thumbs/";
  if ( BaseDir != "" ) {
   Thumbnails.Dir = BaseDir + "_thumbs/";
  }
  Thumbnails.Enabled = true;
  Thumbnails.DirectAccess = false;
  Thumbnails.MaxWidth = 100;
  Thumbnails.MaxHeight = 100;
  Thumbnails.Quality = 80;

  // Set the maximum size of uploaded images. If an uploaded image is
  // larger, it gets scaled down proportionally. Set to 0 to disable this
  // feature.
  Images.MaxWidth = 1600;
  Images.MaxHeight = 1200;
  Images.Quality = 80;

  // Indicates that the file size (MaxSize) for images must be checked only
  // after scaling them. Otherwise, it is checked right after uploading.
  CheckSizeAfterScaling = true;

  // Due to security issues with Apache modules, it is recommended to leave the
  // following setting enabled. It can be safely disabled on IIS.
  ForceSingleExtension = true;

  // For security, HTML is allowed in the first Kb of data for files having the
  // following extensions only.
  HtmlExtensions = new string[] { "html", "htm", "xml", "js" };

  // Folders to not display in CKFinder, no matter their location. No
  // paths are accepted, only the folder name.
  // The * and ? wildcards are accepted.
  HideFolders = new string[] { ".svn", "CVS" };

  // Files to not display in CKFinder, no matter their location. No
  // paths are accepted, only the file name, including extension.
  // The * and ? wildcards are accepted.
  HideFiles = new string[] { ".*" };

  // Perform additional checks for image files.
  SecureImageUploads = true;

  // The session variable name that CKFinder must use to retrieve the
  // "role" of the current user. The "role" is optional and can be used
  // in the "AccessControl" settings (bellow in this file).
  RoleSessionVar = "CKFinder_UserRole";

  // ACL (Access Control) settings. Used to restrict access or features
  // to specific folders.
  // Several "AccessControl.Add()" calls can be made, which return a
  // single ACL setting object to be configured. All properties settings
  // are optional in that object.
  // Subfolders inherit their default settings from their parents' definitions.
  //
  // - The "Role" property accepts the special "*" value, which means
  //   "everybody".
  // - The "ResourceType" attribute accepts the special value "*", which
  //   means "all resource types".
  AccessControl acl = AccessControl.Add();
  acl.Role = "*";
  acl.ResourceType = "*";
  acl.Folder = "/";

  acl.FolderView = true;
  acl.FolderCreate = true;
  acl.FolderRename = true;
  acl.FolderDelete = true;

  acl.FileView = true;
  acl.FileUpload = true;
  acl.FileRename = true;
  acl.FileDelete = true;

  // Resource Type settings.
  // A resource type is nothing more than a way to group files under
  // different paths, each one having different configuration settings.
  // Each resource type name must be unique.
  // When loading CKFinder, the "type" querystring parameter can be used
  // to display a specific type only. If "type" is omitted in the URL,
  // the "DefaultResourceTypes" settings is used (may contain the
  // resource type names separated by a comma). If left empty, all types
  // are loaded.

  DefaultResourceTypes = "";

  ResourceType type;

  type = ResourceType.Add( "Files" );
  type.Url = BaseUrl + "files/";
  type.Dir = BaseDir == "" ? "" : BaseDir + "files/";
  type.MaxSize = 0;
  type.AllowedExtensions = new string[] { "7z", "aiff", "asf", "avi", "bmp", "csv", "doc", "docx", "fla", "flv", "gif", "gz", "gzip", "jpeg", "jpg", "mid", "mov", "mp3", "mp4", "mpc", "mpeg", "mpg", "ods", "odt", "pdf", "png", "ppt", "pptx", "pxd", "qt", "ram", "rar", "rm", "rmi", "rmvb", "rtf", "sdc", "sitd", "swf", "sxc", "sxw", "tar", "tgz", "tif", "tiff", "txt", "vsd", "wav", "wma", "wmv", "xls", "xlsx", "zip" };
  type.DeniedExtensions = new string[] { };

  type = ResourceType.Add( "Images" );
  type.Url = BaseUrl + "images/";
  type.Dir = BaseDir == "" ? "" : BaseDir + "images/";
  type.MaxSize = 0;
  type.AllowedExtensions = new string[] { "bmp", "gif", "jpeg", "jpg", "png" };
  type.DeniedExtensions = new string[] { };

  type = ResourceType.Add( "Flash" );
  type.Url = BaseUrl + "flash/";
  type.Dir = BaseDir == "" ? "" : BaseDir + "flash/";
  type.MaxSize = 0;
  type.AllowedExtensions = new string[] { "swf", "flv" };
  type.DeniedExtensions = new string[] { };
 }

重要的有:
LicenseName = "";
LicenseKey = "";
這兩項是正式購買後可以取消提示訊息。

BaseUrl = "/ckfinder/userfiles/";
BaseDir = ""

我一開始使用預設值,但一直出現一個「110 : 不明錯誤」,後來查看文件後,最好的方式是:
BaseUrl使用完整網域路徑;
BaseDir使用完整實體路徑;

type.*
用來新增上載目錄、目錄路徑、類型、大小限制、副檔名限制…如果你需要有新的分類目錄,就從這裡下手,複製一份type.*的Code,修改為你需要的設定即可。預設有Files、Images、Flash三項,當你上載第一個檔案後,會在你設定上載目錄新增對應的子目錄。

執行測試檔「ckeditor\ckfinder\_samples\aspx\standalone.aspx」
CKFinder
按上傳檔案可以上傳檔案,在上傳好的檔案按左鍵,會出現管理選單。

那我要在一般*.aspx裡使用CKFinder呢?也很簡單:
  1. 先註冊CKFinder
  2. 使用CKFinder控制項

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" nherits="_Default" %>
<%@ Register Assembly="CKFinder" Namespace="CKFinder" TagPrefix="CKFinder" %>
' ... 略 ...
    <div>
        <CKFinder:FileBrowser ID="FileBrowser1" BasePath="ckeditor/ckfinder/" Width="800" runat="server">
        </CKFinder:FileBrowser>
    </div>

注意:
在使用CKFinder時,所特別注意「路徑」問題,請搞清楚「絕對路徑」與「相對路徑」,絕大部出錯都是路徑有問題,例如在不同資料夾裡</CKFinder:FileBrowser ...>裡的BasePath路徑就會不一樣。

整合CKEditor與CKFinder教學實作


要整合CKEditor與CKFinder也很簡單,原始的JavaScript裡增加以下參數即可。

啟用CKFinder
CKEDITOR.replace( '<%= ckdata.ClientID %>',
 {
 //注意路徑是否正確 
  //如果你的*.aspx在根目錄,那路徑應該是「ckeditor/ckfinder/...」
  filebrowserBrowseUrl : '/ckfinder/ckfinder.html',
  filebrowserImageBrowseUrl : '/ckfinder/ckfinder.html?type=Images',
  filebrowserFlashBrowseUrl : '/ckfinder/ckfinder.html?type=Flash',
  filebrowserUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Files',
  filebrowserImageUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Images',
  filebrowserFlashUploadUrl : '/ckfinder/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash'
 } 
 );

CKEditor中的CKFinder功能
不管是CKEditor或CKFinder都提供很好的解決方案,讓我們可以快速產生功能強大編輯區、上下載管理功能。不過其中還有許多細節,建議細讀原廠的文件,把不必要的功能關閉,例如限制副檔名…來減少不必要的風險。

參考:
CKSource Docs

下載CKEditor與CKFinder範例檔

W3C整合驗證器(W3C's Unified Validator)

上篇在驗證新竹縣未來政府時發現了一個W3C提出的新服務,稱做「Unicorn - W3C's Unified Validator」我自己翻譯為「W3C整合驗證器」,此服務提供「單一窗口,完整服務」的觀念,以前我們要分別到各個Validation個進行驗證,但現在只要此地服務,一次全部幫你搞定。

目前此驗證工具提供:
  • Markup validator:驗證(X)HTML的標籤是否符合標準
  • CSS validator:驗證CSS1,2,2.1,3是否符合標準
  • MobileOk checker:驗證對行動裝置的友好善度
  • Feed validator:驗證Atom或RSS的文法
另外還有個重點,目前此一服務需要各位「網友」的幫忙,你可以幫忙「翻譯」這個新功能的介面文字:

選擇要翻訪的文件
 選擇「繁體中文」,東西不多,我進去看的時候已經完成97%了,我自己也有「翻」了一份(3%),但還是希望大家幫忙,提供更好的建議。

如果你希望能造福其他人,而且是幫W3C的忙,可以算上一筆大功德!

無傷大雅的時間

看到別人的錯誤,自己就要小心,不要犯同樣的錯。

110年8年12日
 好神喔,我活在台灣那怎久,也還沒活到民國110年,這是不是未來政府。

另外好奇看了一下原始碼,做了Markup Validation:

Hsinchu Web Page Validation
真的不知道最下方那兩個AA怎麼拿到的。

另外未來政府公告說:「2010/8/21 19:30」有一場「明華園 -- 白蛇傳」的演出,有興趣的人可以去參加。

ASP.NET Web網站部署(2) -- InstallShield Limited Edition

在Visual Studio 2010新增一種部署方式「InstallShield Limited Edition」,我們先看MSDN的介紹(部署的新功能):

InstallShield 2010 限量版自 Visual Studio 2010 起,您可以使用免費的 InstallShield 2010 限量版 (其可以取代 Visual Studio 安裝和部署專案範本中的功能) 來部署應用程式。如果您需要對部署方式進行更進階的自訂,可以升級至 InstallShield 完整版。

不過因為InstallShield 2010(簡稱IS)不是微軟體產品,所以MSDN上資訊有限,但InstallShield使用起來不會太複雜,也是不錯的選擇。

要使用IS必須先下載軟體安裝後必可以在Visual Studio 2010新增IS專案。

  1. 先到IS Limited Edition專頁
  2. 輸入必要資料,Email必須正確,序號會寄送到Email
  3. 下載安裝IS,重新啟動VS 2010
我本身下載了二次,第二次是提示我有更新,由此可知,雖然是限量版但還是有在維護更新,可以放心使用。

 開啟前一次專案,然後「加入」「新增專案」選擇「InstallShield LE」專案;

新增IS LE專案
IS專案
接下來就簡單了,你依畫面最下方的「Application Information」、「Installation Requirements」…一個一個設定,最後就完成了。另外在方案總管中如果你有看一個「鎖」的就是需要付費升級才能使用的功能。

選擇Application Information:

應用程式資訊
選擇Installation Requirements:
設定必要條件
 
選擇Installtion Architechture:

安裝架構
此為付費版本功能。

選擇Application Files:

輸出專案
選擇「內容檔」
選擇Application Shortcuts:
是否需要建立Web應用程式捷徑列,我們是網站,所以不需要。

選擇Application Registry:
是否要對機碼(Registry)做異動。我們不需要。

選擇Installation Interview:

細部設定
這是主要設定是否顯示「版權宣告」,是否需要輸入「使用者名稱、公司名稱」,是否可以「改變安裝路徑」等。

這樣就差不多設定好了,你可以直接點選IS專案,按「建置」就可以產生安裝檔。不過IS 2010還提供其他更進階的功能。

選擇方案總管:IS專案:1:General Information:

一般設定
例如我們可以在這裡選擇安裝操作過程的語言、公司名稱、支援資訊…。

選擇方案總管:IS專案:2:Files:
可以把其他檔案也加入安裝檔之中。

選擇方案總管:IS專案:2:Redistributables:
更細部設定「必要條件」。

選擇方案總管:IS專案:3:Internet Information Services:(重點)
我們可以直接針對IIS來設定。

新增Web網站
設定此網站細節
接下來我們就可以建置此安裝部署檔:

------ 已開始建置: 專案: ISSetup, 組態: DVD-5 ------
Created release folders
AdminExecuteSequence table successfully built
AdminUISequence table successfully built
AdvtExecuteSequence table successfully built
AdvtUISequence table successfully built
InstallExecuteSequence table successfully built
InstallUISequence table successfully built
Directory table successfully built
Feature table successfully built
FeatureComponents table successfully built
Component table successfully built
Loading File table
Building File table
File table successfully built
Building MsiFileHash table
MsiFileHash table successfully built
Class table successfully built
Extension table successfully built
ActionText table successfully built
AppSearch table successfully built
CCPSearch table successfully built
Condition table successfully built
AppId table successfully built
Started signing B109.tmp ...
Property table successfully built
Binary table successfully built
CompLocator table successfully built
ControlCondition table successfully built
ControlEvent table successfully built
CreateFolder table successfully built
CustomAction table successfully built
Error table successfully built
DrLocator table successfully built
DuplicateFile table successfully built
Environment table successfully built
EventMapping table successfully built
Font table successfully built
IniFile table successfully built
IniLocator table successfully built
ProgId table successfully built
ISIISItem table successfully built
ISIISProperty table successfully built
ISSelfReg table successfully built
LaunchCondition table successfully built
MIME table successfully built
MoveFile table successfully built
MsiAssembly table successfully built
MsiAssemblyName table successfully built
MsiDigitalCertificate table successfully built
MsiDigitalSignature table successfully built
MsiPackageCertificate table successfully built
MsiPatchCertificate table successfully built
MsiShortcutProperty table successfully built
PatchPackage table successfully built
PublishComponent table successfully built
Registry table successfully built
RegLocator table successfully built
RemoveFile table successfully built
RemoveIniFile table successfully built
RemoveRegistry table successfully built
ReserveCost table successfully built
SelfReg table successfully built
Shortcut table successfully built
Signature table successfully built
TextStyle table successfully built
TypeLib table successfully built
UIText table successfully built
Upgrade table successfully built
Verb table successfully built
_Validation table successfully built
Searching project for extract-at-build components...
Validating Custom Action sequencing
Embedding manifest SetupExe.Invoker.manifest into setup.exe
Dialog AdminChangeFolder for language 中文 (繁體,台灣): 中文(繁體) built
Dialog AdminNetworkLocation for language 中文 (繁體,台灣): 中文(繁體) built
Dialog AdminWelcome for language 中文 (繁體,台灣): 中文(繁體) built
Dialog CancelSetup for language 中文 (繁體,台灣): 中文(繁體) built
Dialog CustomSetup for language 中文 (繁體,台灣): 中文(繁體) built
Dialog CustomSetupTips for language 中文 (繁體,台灣): 中文(繁體) built
Dialog CustomerInformation for language 中文 (繁體,台灣): 中文(繁體) built
Dialog DatabaseFolder for language 中文 (繁體,台灣): 中文(繁體) built
Dialog DestinationFolder for language 中文 (繁體,台灣): 中文(繁體) built
Dialog DiskSpaceRequirements for language 中文 (繁體,台灣): 中文(繁體) built
Dialog FilesInUse for language 中文 (繁體,台灣): 中文(繁體) built
Dialog InstallChangeFolder for language 中文 (繁體,台灣): 中文(繁體) built
Dialog InstallWelcome for language 中文 (繁體,台灣): 中文(繁體) built
Dialog LicenseAgreement for language 中文 (繁體,台灣): 中文(繁體) built
Dialog MaintenanceType for language 中文 (繁體,台灣): 中文(繁體) built
Dialog MaintenanceWelcome for language 中文 (繁體,台灣): 中文(繁體) built
Dialog MsiRMFilesInUse for language 中文 (繁體,台灣): 中文(繁體) built
Dialog OutOfSpace for language 中文 (繁體,台灣): 中文(繁體) built
Dialog PatchWelcome for language 中文 (繁體,台灣): 中文(繁體) built
Dialog ReadmeInformation for language 中文 (繁體,台灣): 中文(繁體) built
Dialog ReadyToInstall for language 中文 (繁體,台灣): 中文(繁體) built
Dialog ReadyToRemove for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupCompleteError for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupCompleteSuccess for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupError for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupInitialization for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupInterrupted for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupProgress for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupResume for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SetupType for language 中文 (繁體,台灣): 中文(繁體) built
Dialog SplashBitmap for language 中文 (繁體,台灣): 中文(繁體) built
Resolving strings...
Language 中文 (繁體,台灣): 中文(繁體) built
Files built
Media table successfully built
Setup.exe created
Automatic update notification disabled
Express\DVD-5 - 0 error(s), 0 warning(s)
Log file has been created:

========== 建置: 1 成功、0 失敗、0 最新、0 略過 ==========

總結


在Visual Studio 2010裡已經包含相當多元的安裝及部署方式,每一種都有其優點,有些簡單好用,有些功能強大,利用以上介紹這些方法,你可以在不同環境選擇不同的方式,例如,我現在管理台灣及大陸兩地的網站,台灣網站在公司自己的機房裡,機房離我不到十公尺,那使用專案部署可就大材小用,內網速度快,用xcopy寫個批次檔可能是最快的方式。只要合適都是好方法,用對武器最重要。

ASP.NET Web網站部署(2) -- Visual Studio Installer

上一篇裡的「發行網站」已經算是很不錯的部署方式,在安全性上也能有不錯的保護,但發行網站編譯後還是一堆檔案,我們還是必須要自行「上傳」「複製」。但在Visual Studio 2010裡提供了兩種方式來把這一堆檔案變成一個「安裝檔」,不管是自行上傳安裝,還是要交給客戶都非常合適。

Visual Studio Installer安裝和部署方式


新增一個專案「ASP.NET Web應用程式」,然後選擇「檔案 加入 新增專案 Web 安裝專案」

加入新增專案

新增Web 安裝專案

加入「ASP.NET Web應用程式」至「Web 安裝專案」中:

專案輸出

選擇專案
在你的方案總管中可能有多個Web專案,你必須指定那一個專案的內容要放入「安裝檔」之中,然後就可以開始建置的動作,建置之前,我們可以先調整「Web 安裝專案」屬性:

屬性修改
基本上屬性內容都很簡單,像公司名稱…請自行參考「Windows Installer 部署屬性」。別外,我們在方案總管的WebSetup按左鍵按屬性

專案輸出屬性
必要條件
這個必須條件就是重點了,你可以在這裡設定在使用安裝檔時系統必要的環境,安裝檔會進行必要條件的確認,如果確認通過才能順利安裝。

最後進行建置安裝檔的動作:

建置Web安裝專案
要求儲存專案檔
訊息
注意輸出的路徑,然後到此路徑之下就可以找到兩個安裝檔Setup.exe及WebSetup.msi。

安裝驗證序號

在使用「Visual Studio Installer安裝和部署」的方式時有一個很棒的功能,就是可以在用戶安裝時要求輸入序號,而序號驗證連一行程式都不用寫,有沒有很棒!我們來為安裝檔加上序號驗證功能:

使用者介面編輯器
加入對話方塊
在你想要驗證的地方按左鍵,然後選擇「加入對話方塊」,然後選擇「客戶資訊」,

客戶訊息
調整順序
調整一下到合適的順序,我是放到「歡迎」的後面。

客戶資訊屬性

SerialNumberTemplate引用MSDN:
指定在目標電腦上安裝時,用於驗證 [客戶資訊] 對話方塊上產品序號輸入的範本。
SerialNumberTemplate 屬性會決定文字方塊在對話方塊中顯示的方式,以及是否只驗證產品序號的格式,或者根據 Windows Installer 的演算法驗證。

例如,將 SerialNumberTemplate 屬性設定為 "<### - %%%%>" 會建立兩個文字方塊,中間以空格圍住的破折號分開。驗證第一個方塊 (###) 只需驗證使用者有輸入三個數字。第二個方塊 (%%%%) 會利用演算法驗證,將數字相加後除以 7。

如果餘為數 0,則驗證成功,否則驗證失敗。
可編輯字元會在 [客戶資訊] 對話方塊中顯示為文字方塊裡的預留位置,其他的任何字元則會顯示為文字方塊之間的標籤。

字元意義
#需要一個不會包含在驗證演算法中的數字。
%需要一個會包含在驗證演算法中的數字。
?需要一個不會包含在驗證演算法中的英數字元。
^需要大寫或小寫字元。數字在這裡無效。
<對話方塊中,在這個字元左邊的任何字元都不可見。
>對話方塊中,在這個字元右邊的任何字元都不可見。使用 < 字元時,需要一個結束字元。
其他任何字元都會當成常值常數處理。

ShowSerialNumber屬性必需改為「True」。

這樣我們就能利用上述字元來組合出我們的規則,只有符合我們規則序號才能安裝,這樣有沒有很專業的感覺。

參考資料:Windows Installer 部署