使用 Google 提供的網站內容安全檢查服務

Google 從 2006 年開始在 Google Search 的結果中標示出有安全疑慮的網站,而且最近我也得知 Google 有提供一個「安全瀏覽」的查詢服務,只要透過 Google Safe Browsing API 提供網址就可以讓使用者查詢該網站被 Google 檢測過的結果與相關摘要,目前這個機制也有被整合進 Firefox 與 Google Desktop Search 當中。

如果要從瀏覽器直接查詢特定網址的安全狀況,只要輸入以下網址即可查詢:

http://www.google.com/safebrowsing/diagnostic?site=網站網址

例如說如果你要測試 http://www.yam.com 網址是否是安全的,就可以輸入以下網址:

http://www.google.com/safebrowsing/diagnostic?site=http://www.yam.com

而結果大概是這樣:

Google Safe Browsing Diagnostic Result

該網頁會告訴你該網址是否為安全的網頁,還有 Google 拜訪此站時的分析結果,如果是危險網頁的話,頁面只會顯示出網頁中惡意軟體所放置的網站位址,但卻不會說出該網站的哪一頁有這些惡意程式碼,例如:

Google Safe Browsing Diagnostic Result for subspicious

雖然資訊不是很完整且我懷疑檢測的精準度可能也不夠,不過如果有檢測出問題的話,我想應該已經是很嚴重了,那這些網站還是最好不要去比較安全。

經我個人測試過發現,目前好像只有比較知名的網站才會有資料,大部分的中、小型網站都是尚未經過 Google 掃瞄過的,不過我還是建議各位可以把自己的網站網址打上去試試看,搞不好有意外的發現(希望是好的發現)。

相關連結

  

此文章由 will 發表於 2008/5/31 下午 04:39:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Web | Security

標籤: , ,

收藏:

推薦好用工具:Data Dictionary Creator

今天要介紹的工具是 Data Dictionary Creator (DDC),是一個簡單又實用的工具,他可以幫你的 SQL Server 中的資料庫每一個表格、欄位做註解,註解寫完之後是直接儲存在 SQL Server 中的「擴充屬性」中,然後可以直接輸出完整的資料庫結構說明文件(包括 Word, Excel, Xml, Html, T-SQL 等),如果覺得不夠還可以自己擴充,因為這軟體是在 CodePlex 上的一個開放原始碼專案。

Data Dictionary Creator 

大家應該都知道在設計 SQL Server 資料表的時候每個欄位都有個屬性叫做「描述」,可以說明該欄位是做什麼用的:

image

這個欄位的值其實是儲存在該欄位的「擴充屬性」裡,其屬性名稱是 MS_Description

這個欄位的值其實是儲存在該欄位的「擴充屬性」裡,其屬性名稱是 MS_Description

我曾經在之前也寫過一篇SQL Server Management Studio 表格設計技巧,建議各位可以去看看。

而 Data Dictionary Creator 就是靠著擴充屬性的自訂,將所有可註解的訊息全部紀錄在資料庫中,除了預設的 Description 欄位外,你還可以自訂其他的擴充屬性,讓你在 Document Database 頁籤的畫面中輸入。

例如說:你可以在 Advanced Settings 的 Document Additional Properties 輸入「UI 輸入說明」

在 Advanced Settings 的 Document Additional Properties 輸入「UI 輸入說明」

之後再進入 Document Database 頁籤就會馬上看到「UI 輸入說明」的欄位:

再進入 Document Database 頁籤就會馬上看到「UI 輸入說明」的欄位

最後再到 Export Documentation 就可以輸出文件:

到 Export Documentation 就可以輸出文件

之後你再選取你要輸出的格式即可:

選取你要輸出的格式

這樣你就可以立即獲得一份完整的資料庫表格欄位說明文件了,而且不用再維護「離線的文件」,任何資料庫欄位有變更,只要用這軟體編輯一下就可以匯出新的文件了,且最新資訊永遠留在資料庫中,真的是個很理想的文件撰寫模式。

除此之外,還可以將之前匯出的 XML 檔案手動編輯之後重新匯入資料庫,直接覆蓋掉現有資料庫中的擴充屬性。

可以將之前匯出的 XML 檔案手動編輯之後重新匯入資料庫,直接覆蓋掉現有資料庫中的擴充屬性

  

此文章由 will 發表於 2008/5/30 下午 07:05:17

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: SQL Server | 介紹好用工具

標籤:

收藏:

推薦:Microsoft Visual Studio International Pack 1.0 版

Microsoft Visual Studio International Pack 是一套國產的類別庫喔,是由台灣微軟的工程師所開發的,主要是幫助 .NET 程式開發人員建立全球化的應用程式,其中包括許多功能,其中有一套我們很可能會用到的「繁簡轉換」功能,也就是「中文繁簡轉換類別庫」。

在你下載回 vsintlpack1.zip 檔案並解壓縮後,會有個 CHTCHSConv.msi 安裝檔,這個就是「中文繁簡轉換類別庫及 Add-In 工具」,安裝好之後相關檔案會放在以下目錄(好長的目錄名稱啊):

C:\Program Files\Microsoft Visual Studio International Pack\Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool

你只要將該目錄中的 ChineseConverter.dll 組件複製到你網站的 Bin 目錄下就能用了,要使用之前必須先引用其命名空間:

using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;

其中只有一個 ChineseConverter 靜態類別與一個 ChineseConversionDirection 列舉(enum),使用方式很簡單,如果要將繁體字轉成簡體字可參考以下程式碼:

string TWS = "領導有策略";
string CHS = ChineseConverter.Convert(TWS, ChineseConversionDirection.TraditionalToSimplified);

如果要將簡體字轉成繁體字可參考以下程式碼:

string CHS = "领导有策略";
string TWS = ChineseConverter.Convert(CHS, ChineseConversionDirection.SimplifiedToTraditional);

夠簡單吧!

除了單純的「字對字」轉譯之外,如果使用者電腦有安裝 Microsoft Office 2007 的話(使用這個組件的主機),他還會利用 Office 2007 內建的一些「詞彙轉譯」功能,發現雖然文件說有安裝 Microsoft Office 2007 可以讓中文繁簡體轉換出來的品質更好,不過我測試了一下發現其實沒差,不知道品質好在哪裡?不過不失為一個好用的工具啦! ^_^

  

此文章由 will 發表於 2008/5/29 下午 08:20:24

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | C# | Office | Visual Studio

標籤: , , ,

收藏:

ASP.NET 設定 Login 控制項中的按鈕為頁面預設的按鈕

我們有一個網站,裡面有個「登入頁」,頁面中使用的是 ASP.NET 的 Login 控制項,做為管理者登入之用,但是在我的 MasterPage 中有一個「電子報訂閱」的功能,讓使用輸入 Email 後按下旁邊的按鈕後會進行訂閱動作。

不過當我進入登入頁面的時候,在 Login 控制項輸入完帳號、密碼按下鍵盤的 Enter 鍵卻會觸發「訂閱電子報」的按鈕事件,導致出現 RequiredFieldValidator 提示訊息,使用者原本預期要做「登入」動作的,但頁面卻提示你「請輸入您的 E-mail 信箱」,真是莫名其妙。

我們都知道要在頁面中按下鍵盤的 Enter 鍵可以在頁面的 form 標籤設定 DefaultButton 屬性指定當頁面按下 Enter 時預設觸發的 Button 是哪一個,但僅限於設定在 Button 控制項中,因為 DefaultButton 屬性是不可以設定在 Login 控制項上的!

要將頁面的 DefaultButton 設定在 Login 控制項中的「登入」按鈕裡,就必須要寫程式在 Code Behind 中透過 Login1.FindControl 把 Login 控制項中的登入按鈕給找出來,然後再指定到頁面的 Form 物件的 DefaultButton 屬性裡即可,如下程式碼:

Button LoginButton = (Button)Login1.FindControl("LoginButton"); 

Page.Form.DefaultButton = LoginButton.UniqueID;
  

此文章由 will 發表於 2008/5/28 下午 10:53:25

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET

標籤:

收藏:

C# 3.0 初始設定 Hashtable 的方式

C# 3.0 有個特性叫做「物件和集合初始設定式」(Object and Collection Initializers),一般的用法是:

Customer c1 = new Customer
    {
        Name = "Will Huang", 
        Age = 30
    };

不過今天在寫 Code 的時候因為寫到 Hashtable 時卡住了,突然忘記要怎麼寫 Hashtable 的初始值的方式,上網查了一下寫法,原來很簡單,用大括弧框起每一筆即可。

Hashtable GenderMapping = new Hashtable()
    {
        {"男", true},
        {"女", false}
    }; 

相關連結

  

此文章由 will 發表於 2008/5/27 下午 11:59:01

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | C#

標籤: , ,

收藏:

安全的刪除 Exchange 的交易記錄檔

昨天試著用 WinDirStat 分析一下我公司伺服器的目錄大小分佈,結果才發現久未管裡的 Exchange Server 2003 的 C:\Program Files\Exchsrvr\MDBDATA 目錄佔用了我硬碟 66.6 GB,且是一堆 E000*.log 的檔案,每個檔案 5MB 大小,這是 Exchange 的交易紀錄檔,我因為從未注意過這些檔案,所以也從未刪除過,累積了幾年才會變這麼多。

我從微軟技術社群討論區得知幾種方式安全的移除方法,在此做個筆記:

  1. 使用 NTBackup 執行 Exchange Database 的標準備份
  2. 啟用 Exchange 的循環記錄檔後,重新啟用 MSExchangeIS 服務
    net stop MSExchangeIS
    net start MSExchangeIS
  3. 手動移除已 Commited 的 Log file
    這部分可以參考 微軟技術支援服務 網站的 How to remove Exchange Server transaction log files 文章 ( 如何移除 Exchange Server 交易記錄檔 )
  

此文章由 will 發表於 2008/5/26 下午 11:35:59

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 系統管理

標籤: ,

收藏:

介紹好用工具:WinDirStat

你會不會覺得電腦用一段時間之後突然有一天硬碟就不夠用了,但卻不知到到底是哪個目錄佔用我最多磁碟空間,想查又覺得目錄超級多的,實在不知從何處著手。這時你就需要用 WinDirStat 幫你分析一下電腦各目錄與檔案的大小了。

到底有多酷呢,一圖解千文,如下:

介紹好用工具:WinDirStat

WinDirStat 有三種檢視模式:

  1. 目錄檔案清單(如圖示左上角):就如同你檔案總管的檔案列表,但會多好幾個大小統計的欄位。
  2. 檔案類型清單(如圖示右上角):列出硬碟裡各種檔案類型的大小統計。
  3. 圖例檢視模式(如圖示下方):用圖形表示你電腦中的目錄與檔案大小,且點選底下的方塊後左上角的目錄瀏覽視窗還會直接選中該目錄或檔案,讓你知道這塊圖形是代表哪一個目錄或檔案。

我覺得最方便的就是 WinDirStat 可以提供我一個概要性的資訊,讓我知道哪些目錄或檔案佔用我過多的磁碟空間,知道以後就可以進一步判斷是否將改目錄刪除或備份到其他磁碟機。

相關連結

  

此文章由 will 發表於 2008/5/25 下午 08:22:30

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 介紹好用工具

標籤:

收藏:

解決 LINQ to SQL 資料庫更新衝突的情形

我前陣子遇到一個偶發的錯誤狀況,就是我在我某個頁面中需要計算文件下載的次數,因此需要每次進入頁面時都要讓該筆資料的 num 欄位的值自動加 1,也就是每次都要更新資料庫,但是每過幾天就有可能收到幾個 System.Data.Linq.ChangeConflictException 例外狀況,錯誤訊息如下:

中文版

System.Data.Linq.ChangeConflictException: 資料列找不到,或者已變更。
英文版
System.Data.Linq.ChangeConflictException: Row not found or changed.

這原因就出在當我用 LINQ to SQL 將資料取出之後,一直到寫回資料庫的過程中,資料庫中的該筆資料發生了變更,而導致衝突狀況,我的程式碼如下:

MyTable m = (from p in db.MyTable
             where p.ID.CompareTo(id) == 0
             select p).FirstOrDefault();
if (m != null)
{
    m.num = m.num + 1;
    db.SubmitChanges();
}

雖然這段程式從取出之後就立即將更新的值送回資料庫更新,不過當網站流量大的時候這種資料更新的衝突現象似乎無法避免,我這幾天研究出 3 種可能的解決方案:

第一種:直接對資料庫下 SQL 指令(不使用 LINQ 的標準更新方式)

db.ExecuteCommand("UPDATE [dbo].[MyTable] SET num=num+1 WHERE ID = @p0", m.ID);

這應該是最簡單直覺的作法了,也不會有衝突的狀況發生,如果你只是要做簡單的「計數器」功能,建議用這一招就好了,否則請看第二種方法。

第二種:使用 LINQ to SQL 變更衝突的處理方法

在 MSDN 的 HOW TO:管理變更衝突 (LINQ to SQL) 文章有列出一些關於此主題的說明,建議要寫 LINQ to SQL 的開發人員務必熟讀此章節。

除了以上這些文章外,應該也要看看 開放式並行存取概觀 (LINQ to SQL),如果覺得中文看不懂也可以看看英文版的 Optimistic Concurrency Overview (LINQ to SQL),因為我在看文章時有些翻譯說實在還看不太習慣。

底下是解決衝突問題的範例程式(參考  ObjectChangeConflict.Resolve 方法 (RefreshMode) 說明)

try
{
    db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
}
catch (System.Data.Linq.ChangeConflictException ex)
{
    foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)
    {
        // *********************************************
        // 底下三個範例是 3 選 1 喔,不要三行都寫在一起!
        // **********************************************

        // 採用資料庫的查詢出來的值,目前物件的值將會被資料庫最新查到的複寫
        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
        
        // 採用目前物件中的值,並更新資料庫中的版本
        occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
        
        // 僅更新此物件中變更的欄位,僅將變更的欄位寫入資料庫(或稱為合併更新)
        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
    }

    // 注意:解決完衝突之後要記得重新再 SubmitChanges() 一次,否則一樣不會更新資料庫
    db.SubmitChanges();
}

我在驗證變更衝突的測試程式的完整原始碼如下:

db = new NEXCOMDataContext();

MyTable m = (from p in db.MyTable
             where p.ID.CompareTo(MyTableID) == 0
             select p).FirstOrDefault();

if (m != null)
{
    // 刻意引發變更衝突
    db.ExecuteCommand(@"UPDATE [dbo].[MyTable] SET num = num - 1 WHERE ID={0}", MyTableID);

    m.num = m.num + 1;

    try
    {
        db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
    }
    catch (System.Data.Linq.ChangeConflictException ex)
    {
        Response.Write(String.Format("<xmp>ChangeConflictException = {0}</xmp>", ex.Message));
        
        foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)
        {
            // 採用目前物件中的值,並更新資料庫中的版本
            //occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);

            // 採用資料庫的查詢出來的值,目前物件的值將會被資料庫最新查到的複寫
            //occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
           
            // 僅更新此物件中變更的欄位,僅將變更的欄位寫入資料庫(合併)
            occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
        }
        // 注意:解決完衝突之後要記得重新再 SubmitChanges() 一次,否則一樣不會更新資料庫
        db.SubmitChanges();
    }
}

Response.End();

變更衝突是開發資料庫應用經常會發生的問題,觀念務必要清楚明瞭,下次遇到問題的時候才能快速反應出最正確的解決方案。

第三種:採用封「閉式並行存取控制(Pessimistic Concurrency Control)」,或也有人稱為「悲觀同步存取控制」

只要在 LINQ to SQL Designer 中將特定的欄位的 UpdateCheck 屬性設定為 Never,就可以避免在更新資料時發生變更衝突。只不過當衝突發生的時候,資料庫中新的值可能會被目前物件的值給蓋過去,數字會有點不精確就是了。

    在 LINQ to SQL Designer 中將特定的欄位的 UpdateCheck 屬性設定為 Never

相關連結

  

此文章由 will 發表於 2008/5/24 下午 06:52:05

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | C# | LINQ

標籤: , ,

收藏:

介紹好用工具:Bloglines 與 SharpReader

我每天吸收新知的主要來源都是透過 RSS 訂閱而來的,我剛算了一下,我目前共訂閱了將近 350 個 RSS,如此龐大的量真的很不容易管理,所以我採用了兩個 RSS 管理工具幫我管理這些 RSS 訂閱,一個是線上版的 Bloglines,一個是單機版的 SharpReader

線上版的 Bloglines

我會採用線上版的 Bloglines 最主要的目的就是他可以幫我把大量的 RSS 文章儲存在線上,只要我訂閱的 RSS 有新文章它都會自動收集到我的帳號裡,若平時太忙沒時間看等下次進入之後所有文章都會留著,等假日再慢慢看。除此之外,在 Bloglines 裡還可以自訂「資料夾」,幫自己分類各種不同的訂閱,而且看過的文章還可以自己選擇「標記」起來,讓自己滿意的文章「永遠」的儲存在 Bloglines 裡,且還有提供搜尋的功能,這儼然就是一個龐大的個人知識庫。

我個人每天使用電腦的時間已經很長了,對於頻繁的使用滑鼠讓我的手腕產生了一些負擔,所以我一向習慣使用鍵盤快速鍵(Hotkeys)幫我操作各式的軟體或網站介面,當然包括 Bloglines 也不例外,不過 Bloglines 的快速鍵是我無意間發現的,有一次在看文章的時候想說 Bloglines 不知道是否可以用 vi 的指令移動,結果真的可以耶!按下 j 會跳到下一筆,按下 k 會跳到下一筆,都測試成功後開始上網尋找 Bloglines 的快速鍵,不過奇怪的卻是 Bloglines 並沒有官方公佈的快速鍵說明網頁,雖然在其他部落格有看到一些人分享一些自己發現的快速鍵,但我自己又自己亂試又多試出了好幾個,在瀏覽文章的過程中有了這些快速鍵真的如虎添翼,以下是我整理出的快速鍵清單:

  • j - 移動到下一篇文章
  • k - 移動到上一篇文章
  • n - 將文章標記(Pin),讓文章不會在下次進來看時消失
  • A - 將所有文章設定為「已閱讀」(要按下大寫的 A 喔)
  • s - 移動到下一個 RSS 訂閱
  • f - 移動到下一個資料夾
  • r - 重新整理左邊的訂閱清單

不過缺點就是他的中文版的翻譯實在是太爛了,所以我還是一律用英文版來操作。

單機版的 SharpReader

SharpReader 對我而言最大的目的就是「即時性」,當我在工作的時候可以收到一些我比較注意的一些 RSS 訊息,例如我管理的主機我會把監控的一些訊息透過 RSS 傳出,並用 SharpReader 訂閱,每 15 分鐘 Refresh 一次訂閱的部落格。或我會訂閱一些重點討論區文章,例如微軟技術社群討論區ASP.NET Forums 中的幾個有興趣的討論區等。

在軟體功能方面比 Bloglines 強的地方就是可以在看文章的過程中直接 Show 出討論串的所有回覆文章,對看文章還蠻方便的,且在看文章的時候按下 Enter 就會在 SharpReader 中直接開啟網頁,要直接回覆文章或繼續瀏覽都可以。

不可免俗的一樣有快速鍵可以分享,以下是一些我常用的快速鍵:

  • 按下 Tab 與 Shift + Tab 可以在左側 RSS 訂閱清單與右邊文章列表切換,但是在文章列表的地方按下 Tab 會跳入文章內容區,可惜跳進去之後就無法用鍵盤跳出來了。
  • 在文章列表區:
    • 按下 Enter 鍵會直接開啟該篇文章的網頁在文章內容區
    • 按下 Ctrl + S 會另開瀏覽器視窗顯示該文章的網頁
    • 按下 Ctrl + L 會「鎖定」該文章,若你按下 Del 鍵刪除時會多提示你是否要將該文章刪除
  

此文章由 will 發表於 2008/5/23 下午 11:44:31

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 介紹好用工具

標籤: ,

收藏:

設計 LINQ to SQL Class 的注意事項 (2)

延續之前寫的設計 LINQ to SQL Class 的注意事項,最近又有一些小心得可以分享。

  1. 避免從 Server Explorer 拖曳 Table 進 LINQ to SQL Designer 時在 Web.config 中多產生一組新的 ConnectionString

    我們常會從 Server Explorer 直接拖曳表格進 LINQ to SQL Designer,尤其是新增表格的時候,第一次用的時候他其實會自動幫我們建立一筆 ConnectionString 到 web.config 中,預設的名稱是 "資料庫名稱ConnectionString"。

    從 Server Explorer 拖曳 Table 進 LINQ to SQL Designer  

    不過如果你如果日後有將該 ConnectionString 改變了之後,下次再從 Server Explorer 拖曳 Table 進 LINQ to SQL Designer 時,Web.config 就會又多新增一筆 ConnectionString!

    要解決這個問題的方法就是重新設定 Server Explorer 中的連線,且 Server Explorer 中的連線的所有參數設定必須跟你在 Web.config 中的設定完全一模一樣才行,包括 Data Source, Initial Catalog, User ID, Password 或其他相關參數都要一樣才行。

    重新設定的步驟如下:

    刪除現有的連線 

    新增連線 
     
    設定連線參數必須跟你在 Web.config 中的設定完全一模一樣才行

    設定完成之後下次再拖曳表格進 LINQ to SQL Designer 時就不會再莫名其妙的新增連線參數了!
  2. 之前提及的「在設計 LINQ to SQL Class 的時候,有預設資料的欄位要特別設定 Auto Generated Value 為 True,否則會新增失敗」可以改由 DBML 的 Partial Class 解決。

    我在 SQL 2000 的 Uniqueidentifier 欄位在 LINQ to SQL 的問題 有提到這個技巧,就是在 OnCreated() 事件中加入一些原本要設定預設值(Default Value)的欄位,這樣你就不用每次重新拖曳表格時又要全部手動修改一次 Auto Generated Value 為 True 了,算是一勞用逸的方法。
  

此文章由 will 發表於 2008/5/22 下午 11:56:13

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: LINQ | Visual Studio

標籤: , ,

收藏: