XMind軟體台灣代理商

XMind是一套圖型軟體,它能畫心智圖、魚骨圖、組織圖…,我的網站上有許多資料也是使用XMind來制作,除了多國語言,他本身還提供「Online Share」的功能,就是能讓你把制作好的圖上傳到他的網站來進行分享。

而XMind還提供Pro版本,提供一些進階功能,如果你想升級至Pro版本,現在可以直接找台灣的代理商。

XMind in Taiwan

There is a good news for XMind users, fans and lovers from Taiwan. Now, XMind Ltd. has a senior partner in Taiwan, ActsMind 艾思邁. ActsMind can accept all purchase offers from Taiwan, and offer local support.

SQL Server Service Port List

做個記錄:http://msdn.microsoft.com/zh-tw/library/cc646023%28SQL.100%29.aspx

當我們需要遠端開Port讓Client連線時,一般而言,需要在防火牆進行設定,這時候就需要一張SQL Server相關服務埠列表(Port List),最常用的當然是1433 Port。

GridView新增功能圖文篇

補上一篇有圖片的「GridView新增功能」,以Visual Studio 2010來實作。

第一步:準備
  1. 新增專案 →「ASP.NET 空白 Web 應用程式」;

    新增專案
  2. 加入 → 新增項目 → Web Form → 名稱:「Default.aspx」;
  3. 切換至「設計」→ 拉入「GridView 及 SqlDataSource」;

    GridView + SqlDataSource
  4. 設定「SqlDataSource」,重點在sqlDataSource設定裡的「進階」必須產生Insert、Delete、Update等語法

以下範列使用Northwind資料庫中的Customers資料表。
<form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
        <br />
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
            DeleteCommand="DELETE FROM [Customers] WHERE [CustomerID] = @CustomerID" 
            InsertCommand="INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax)" 
            SelectCommand="SELECT * FROM [Customers]" 
            UpdateCommand="UPDATE [Customers] SET [CompanyName] = @CompanyName, [ContactName] = @ContactName, [ContactTitle] = @ContactTitle, [Address] = @Address, [City] = @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, [Phone] = @Phone, [Fax] = @Fax WHERE [CustomerID] = @CustomerID">
            <DeleteParameters>
                <asp:Parameter Name="CustomerID" Type="String" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="CustomerID" Type="String" />
                <asp:Parameter Name="CompanyName" Type="String" />
                <asp:Parameter Name="ContactName" Type="String" />
                <asp:Parameter Name="ContactTitle" Type="String" />
                <asp:Parameter Name="Address" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="Region" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
                <asp:Parameter Name="Phone" Type="String" />
                <asp:Parameter Name="Fax" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="CompanyName" Type="String" />
                <asp:Parameter Name="ContactName" Type="String" />
                <asp:Parameter Name="ContactTitle" Type="String" />
                <asp:Parameter Name="Address" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="Region" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
                <asp:Parameter Name="Phone" Type="String" />
                <asp:Parameter Name="Fax" Type="String" />
                <asp:Parameter Name="CustomerID" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </div> 

第二步:GridView的新增環境

  1. 進入GridView的「編輯樣板」,選擇「EmptyDataTemplate」樣板;
  2. 拉一個DetailsView進去EmptyDataTemplate,資料來源選擇與GridView同一來源(sqlDataSouce);原因上面說了,我們要使用同一資料來源裡的Inster語法;
  3. 設定DetailsView的DefaultMode為「Insert」;

    Insert Mode
  4. 勾選DetailsView的「啟用插入」;

    DetailsView
  5. 進入DetailsView的「編輯欄位」,找「選取的欄位」最下方的「CommandField(中文版是:新增、插入、取消)」,把ShowCancelButton屬性設為「False」;因為在EmptyDataTemplate樣板中DetailsView取消按鈕不會有作用,留下會讓使用者把到「把柄」說:「你的程式有Bug!」

    DetailsView: 編輯欄位
    DetailsView : 取消CancelButton

第三步:GridView的新增觸發

  1. 選擇GridView的「編輯欄位」;
  2. 加入一個「ButtonField」,移動一下位置;設定ButtonField屬性Text:設定為「新增」;
  3. (重點)設定ButtonField屬性CommandName="GridInsert"(名稱請自訂)
GridView : 「新增」按鈕

第四步:讓GridView觸發事件,進入「EmptyDataTemplate樣板」

GridView : RowCommand事件

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
    '中斷GridView與sqlDataSource的「綁定,Binding」中斷
    '讓GridView進入EmptyDataTemplate樣板
    If e.CommandName = "GridInsert" Then
        GridView1.DataSourceID = Nothing
    End If
End Sub

第五步:從EmptyDataTemplate樣板返回GridView

  1. (重點)在DetailsView中進入「編輯欄位」,選擇下方「CommandField(中文版是:新增、插入、取消)」,然後轉換為TemplateField欄位,回到DetailsView中;

    DetailsView : 轉換為樣版
  2. 選擇「編輯樣板」的「InsertItemTemplate」;新增作用在InsertItem樣板;

    DetailsView : 編輯樣板


    DetailsView : InsertItemTemplate
  3. 從「標準」工具中拉一個「Button」控制項(LinkButton或ImageButton也可以)到InsertItemTemplate樣板中;

    DetailsView : Back Link
  4. 設定Button屬性:Text為「Back GridView」;ID為「bntBack」;
  5. (重點)在Button控制項上點兩下,進入後置程式碼;

    Protected Sub bntBack_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.GridView1.DataSourceID = "SqlDataSource1"
    End Sub
    
  6. 結束所有樣板編輯

這樣就完成所有功能。

Demo:
GridView : 新增按鈕

DetailsView : 新增畫面

DetailsView : 新增資料

新增完成後按Back回到GridView

下載後,請自行修改Web.config中的連線字串。

移除Visual Studio 2005與2008

移除2005:http://msdn.microsoft.com/zh-tw/library/ms246604(VS.80).aspx
重點在2.2.2.4節:

2.2.2.4. 手動解除安裝 Visual Studio 2008。


您必須按照下列順序解除安裝 Visual Studio 2008 元件。
開啟 [新增或移除程式] (Windows Server 2003 和 Windows XP) 或 [程式和功能] (Windows Vista 和 Windows Server 2008)。

  1. 移除 [Microsoft SQL Publishing Wizard]。
  2. 移除 [Crystal Reports Basic for Visual Studio 2008]。
  3. 移除 [Visual Studio 2008 版 (x64) Crystal Reports Basic 64 位元執行階段]。 只有在 64 位元的電腦上安裝了 Visual Studio 時,才需要執行這個步驟。
  4. 移除 [Microsoft Windows SDK for Visual Studio 2008 SDK 參考組件和 IntelliSense]。
  5. 移除 [Microsoft Windows SDK for Visual Studio 2008 .NET Framework 工具]。
  6. 移除 [Microsoft Windows SDK for Visual Studio 2008 Win32 工具]。
  7. 移除 [Microsoft Windows SDK for Visual Studio 2008 標頭和程式庫]。
  8. 移除 [Microsoft Windows SDK for Visual Studio 2008 工具]。
  9. 移除 [Microsoft Visual Studio 2008 遠端偵錯工具]。 只有在 64 位元的電腦上安裝了 Visual Studio 時,才需要執行這個步驟。
  10. 移除 [Microsoft SQL Server 2005 Express Edition]。
  11. 移除 [Microsoft SQL Server Native Client]。
  12. 移除 [Microsoft Device Emulator 3.0 版]。
  13. 移除 [Windows Mobile 5.0 SDK R2 for Smartphone]。
  14. 移除 [Windows Mobile 5.0 SDK R2 for Pocket PC]。
  15. 移除 [Microsoft SQL Server Compact 3.5 For Devices]。
  16. 移除 [Microsoft SQL Server Compact 3.5 設計工具]。
  17. 移除 [Microsoft SQL Server Compact 3.5]。
  18. 移除 [Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System Runtime]。
  19. 移除 [Microsoft Visual Studio Tools for the Microsoft Office system (Runtime 3.0 版)]。
  20. 移除 [Microsoft .NET Compact Framework 3.5]。
  21. 移除 [Microsoft .NET Compact Framework 2.0 SP2]。
  22. 移除 [Microsoft Visual Studio]。
  23. 移除 [Microsoft Visual Studio 網路撰寫元件]。
  24. 移除 [Microsoft Document Explorer 2008]。
  25. 移除 [Microsoft Visual Studio 2008 64 位元必要條件]。 只有在 64 位元的電腦上安裝了 Visual Studio 時,才需要執行這個步驟。
為什麼要移除?當然是為了升級至Visual Studio 2010。

牙醫師,您好!

牙齒,是我一生最大的敗筆。

小時候不懂事,不愛刷牙,現在30出頭歲就已經有3分之1 到2分之1的牙是壞的,一生看最多次的醫生是牙醫。所以當小朋友出生後,我一直非常認真的保護及照顧他們的口腔及牙齒。

大 寶貝的牙齒已經長齊了,一直想帶她去塗氟,剛好上週有空所以就帶著大寶貝去找牙醫師。在等待的過程裡,明明是預約4點半,但已經4點快45分了怎麼還沒換 我們,平常我看診時間都很準時,等到小姐叫我去診間時,牙醫師剛處理完前一個小朋友,可能是小朋友不像大人那怎乖,時間比較難掌控。

終 於換我們了,牙醫師先是過來,說了聲對不起,讓我們等那怎久,我回答說沒關係,然後牙醫師很有禮貌的伸出手來,我心想小兒的牙醫師怎麼那麼有禮貌,所以我 會很有禮貌的回應他,伸出手如牙醫師「握手」,牙 醫師先是有點「怔」了一下,然後對我說:「我 是要你手上的病歷!」 媽呀!當下…


牙醫生先是問了一堆問題,做了一 些記錄,然後才開始檢查、塗氟,

簡單記錄寶貝要改進的地方:
  1. 一歲後,不要用奶瓶喝 mike(不要喝配方奶,喝牛奶)。
    用杯子喝。
  2. 不要吃奶嘴。

檢查中大寶貝牙齒有外翻情況,當下最急的是「不要吃奶嘴」,牙醫師說:「奶嘴」是所有項目中最難「戒」的。當下是 有點擔心,不過寶貝就是寶貝,非常不簡單。

晚上睡前的挑戰來了,我們平常在家是不給大寶貝吃奶嘴的,而是睡前才給她 吃,睡著了我們就拔起來。睡前大寶貝對著我們說:「嘴嘴、嘴嘴」「嘴嘴、嘴嘴」,我們摸摸她的牙齒,然後很理性跟她說:「牙醫師說,你牙齒壞了,妳不能吃 嘴嘴了,知不知道,好不好?」結果大寶貝居然回答:「好」,而且真的沒有吵鬧,頂多是在床上躺一躺,然後又爬起來問:「嘴嘴咧?」我們就在回答一次:「牙 醫師說,你牙齒壞了,妳不能吃嘴嘴了,知不知道,好不好?」她就會回答說:「好」然後有點失望的躺回床上。

大寶貝的 寶貝(奶嘴),牙醫師口中最難戒的,我和婆婆都驚訝,她皮很皮,她乖很乖,她一歲八個月,就能有如此的表現,我相信,她未來一定不簡單。

戒奶嘴,一天完成。

MSDN訂閱啟用及下載

如果你不清楚MSDN訂閱及TechNet Plus訂閱的差異,請參考這一篇:「比較 MSDN 與 TechNet Plus 訂閱」,兩者目標不一樣,價格也差很多,So...看清礎。

如果公司有在開發.NET Framework程式,那一定要有Visual Studio這套開發工具,單買實在不夠吸引人,就像很早之前寫ASP網頁時,大概都是買Dreamware一樣,但你能有更好的選擇,就是加一點點錢買「Visual Studio Professional with MSDN」,然後透過大量授權Open Value方案還可以三年分期付款,實在很划算,如果你第二年再續約的話,還會幫你升級更上級的版本,例如,第一年買Professional,第二年續約會升級為Premium。

MSDN訂閱使用上比較麻煩,你必須先到「大量授權服務中心」去建立一個可以設定MSDN訂閱帳號(Email),然後此Mail會收到啟用信,再依啟用信的內容到「MSDN的啟用訂閱」來啟用此Mail帳號,再來就可以登入MSDN訂閱下載了。

ps.. 大量授權服務中心的所有設定都會有「時間差」,也就是說都不是「即時」的,通常設定完都會跟你說要等N個小時。

第一次下載發生一個問題,我要下載Windows Vista及Windows 7時,我選擇語言為:「Chinese - Traditional」,非常奇怪的都找不到資料,只有一個「Windows Automated Installation Kit for xxx」的下載項目,但其他語言都能正常出現所有完整下載項目。

我確定我買的MSDN訂閱可以下載這些項目,最後沒辦法只好去寫信去問(twwpo@microsoft.com),結果得到一個我都沒想到的答案:
感謝您連繫台灣微軟客服中心,敝姓?,很高興能夠為您服務。關於您詢問事項:MSDN下載一事,由於台灣地區語系分為Chinese–Taiwan與Chinese-Traditional語系兩種,請點選語言選項更換語系即可檢視所需軟體清單,若是後續您仍有其他問題,歡迎您再來信或來電洽詢,謝謝您。
看圖吧:


很直覺我們都會選「Chinese-Traditional語系」,也不會去往下拉,誰會去想還有一個:


「Chinese–Taiwan」,Taiwan我喜歡,但正體中文還有分台灣不台灣,真怪。未來如果你有機會使用MSDN訂閱,切記選「Taiwan」哦!不然會像我「找不到、找不到、還是找不到!」

Exchange 2003轉送(Mail Relay)設定有漏洞

話說昨天發現公司Exchange Server不正常,連入一看~媽呀,怎麼SMTP有一堆連線!而且每秒都有數筆到數十筆數SMTP連線,而且"佇列"中有一堆發不出去信,而且查了佇列中的信件,我非常確定都是"廣告信"、"色情信"之類。


Exchange SMTP Session

呀!怎麼會這樣,我們的Mail Server被當成轉寄跳板。但查Log看起來都是正常連線,連線IP是內網的IP,所以我們在Exchange中轉送(mail Relay)限制設定不會擋下此IP的轉送。但非常怪奇的是這個內網IP是我們的Gateway Router,Router也會中毒發垃圾信嗎?不"太"可能!

內網有人中毒嗎?公司所有電腦都有安裝防毒軟體,但不無可能,我緊急發出通知,中斷所有Client網路,只留下Exchange與Router的線路,原本想一台一台找是那一台Bingo了,結果"嚇一跳",Exchange的SMTP還在發信,Server中毒嗎?被入侵嗎?直覺是不太可能,Service Pack我都有乖乖上,而且有防火牆保護,防毒軟體也正常運作,沒有任何中毒訊息,實在看不出有任何異狀!!!


我一直在想那個連線IP的問題。看著看著想出了原因。各位先參考這篇「如何開啟 Exchange 的轉送設定(Mail Relay)」最後第五點的圖片,你會發現它是設定整個網段,而Exchange 2003的資料也是這樣教,那當然我們就這樣設,而且"多年"來也沒出事。

今日不出事,不代表明天就沒事。

原因很簡單:Spamer → Router → Mail Relay Server

這些Spamer會一直Scan網路上所有的Mail Server,然後找「替死鬼」,也就是Mail Relay有問題的Mail Server,然後透過這些Mail Server來幫忙來寄送垃圾信,人家反查時就會查出「人是你殺」(台)這種戲情!

從Router Forward進來的封包會帶「Router內網的IP」,而Router的內網IP也含在整個網段裡,所以Exchange Server認為是正常的要求就幫你轉寄了。Spamer成功達到目的,而我也成為受害者。

最後修改SMTP 轉送設定:


SMTP轉送設定(12)

SMTP轉送設定(2)

SMTP轉送設定(3)

IP的設定是讓你方便,但你最好改使用以上的設定,一個一個加入,只給必要的IP轉送的權限。如果一個一個加入對你來說有管理上的麻煩,那最好把「不考慮上述清單…」取消勾選,只讓通過權限認證的使用者才可以轉送。

Visual Basic -- 區域型別推斷

區域型別推斷(Local Type Inference)


區域型別推斷是讓你在宣告區域變數時,可以不必使用As宣告其明確型別的一種語法。

程式一:區域型別推斷
Dim Name = "KKBruce"
Dim Height = 173
Dim Friends = New String() {"Mary", "Kelly", "Cindy"}

在Dim之後沒有As Type的宣告,Visual Basic的Compiler會透過後面的或運算式(Expression)來判斷型別,例如"KKBruce"這個值很明顯是"字串(String)型別",所以Name變數的型別就會是"String"。所以這樣判斷的動作我們稱「區域型別推斷(Local Type Inference)」。

隱含型別(Implicitly Type)

程式一裡的Dim Name與Dim Height稱它「隱含型別區域變數」,因為從宣告程式碼本身是看不出型別,而必須經過"區域型別推斷"的動作後才能判定型別,所以稱"隱含"不是沒有型別

程式一裡的Dim Friends稱它「隱含型別陣列」,單從Dim Friends是無法判定,因為後面的值是「數值陣列」,經過"區域型別推斷"後,Dim Friends就會成為「數值陣列」型別。

匿名型別(AnonyMous Type)

匿名型別會與隱含型別一起使用。

程式二:匿名型別
'Dim person為隱含型別
'New With {...}為匿名型別
Dim person = New With {.Name = "KKBruce", .Height = 173}
Response.Write(person.Name) '結果為KKBruce
Response.Write(person.GetType())

你會發現New With本身沒有"型別(Type)"所以稱「匿名型別」。別外可以發現此person物件,裡面包含了String型別和Integer型別(它到底是String還是Integer?),這在以前是做不到的。而person到底是什麼型別?我們可以從person.GetType()得知,Visual Basic會在Compiler時給它一個「VB$AnonymousType_0`2[System.String,System.Int32]」的匿名型別,此匿名型別裡有String及Int32兩個複合型別。


實例

以上不論是區域型別推斷、隱含型別、匿名型別,有很大一部份都是為了LINQ及.NET Framework 4所準備,但在一般情況下,也是可以使用。

程式三:隱含型別取得所有網頁上控制項
'c是隱含型別
For Each c In Me.Form.Controls
    If TypeOf c Is TextBox Then
        ' Do Some thing ...
    End If
Next

原始的c應該是「c As Control」(或是使用c As Object),但這裡使用了隱含型別來替代,透過這個For Each方法,可以取得目前網頁上所有控制項,然後再進行應用。