Feeds:
文章
留言

Archive for 九月 13th, 2005

如何建立一個含有事件的物件

這是我第一個寫含有事件的物件程式,參考MSDN資料…

    using System;
    using System.ComponentModel;

    public class DemoEventArgs : EventArgs { 
        private readonly string msg;
        public DemoEventArgs(string msg){
            this.msg = msg;
        }

        public string Message{
            get{
                return this.msg;
            }
        }
    }

    // 宣告委託的介面
    public delegate void DemoEventHandler(DemoEventArgs e);

    public class CDemo {
        // 宣告這個事件,才可以使用 d.Demo += new DemoEventHandler( t.onDemo );
        public event DemoEventHandler Demo;

        public CDemo() {}
        public void action(){
            // 丟出事件
            OnDemo(new DemoEventArgs("demo action"));
        }   
        // 也可以利用繼承來處理該事件  
        protected virtual void OnDemo(DemoEventArgs e) {
   
        if (Demo != null)
{           
   


                Demo(e); // 事件委託

            }

        }
    }

    // 測試用類別
    public class CTest{
        public static void Main (string[] args){
            CTest t = new CTest();
            CDemo d = new CDemo();
            d.Demo += new DemoEventHandler( t.onDemo );
            d.action();
        }

        // 事件處理函式
        public void onDemo(DemoEventArgs e){
            Console.WriteLine(e.Message );
        }
    }

Read Full Post »

讀取中文檔案

為了寫一個工作上的小工具,讓自己工作更為輕鬆些,選了C#作為開發工具,為何選C#?沒有什麼理由,只是因為好玩^^
寫程式的時候需要讀取檔案的內容,發現 StreanReader 類別可以使用,於是寫了簡單的測試碼,如下

            StreamReader sw = new StreamReader(@"c:ff3temp.txt");
            Console.WriteLine( sw.ReadToEnd() );

結果發現,讀出來的中文資料居然是亂碼,如下圖

後來查了資料才知道,StreamReader 的建構子的其中一個版本可以指定編碼格式,預設如果沒有指定編碼是採用
ASCII,所以讀取出來的資料呈現亂碼。那應該指定什麼資料格式呢?因為,我只是寫給自己用,寫資料格式相當的單純,所以,就以系統的編碼來讀取檔案內
容,所以將上述程式改寫成如下:
            StreamReader sw = new StreamReader(@"c:ff3temp.txt", Encoding.Default  );
            Console.WriteLine( sw.ReadToEnd() );

執行結果如下:

Read Full Post »

改變 firefox 的暫存路徑

公司的電腦實在不是很快,每次要用瀏覽器找尋資料都要很久,剛好家裡用了一套 RamDisk 軟體,在瀏覽網頁時的效能確實提升不少,於是公司裡面也來設定一下,看能否提升一下…雖然公司電腦的記憶體也不多,不過娜個30~40MB的記憶體來當作快取應該還撐得住。firefox 的設定網頁暫存路徑的方法

 

  • 網址列輸入 about:config
  • 滑鼠右鍵選單, 新增字串值 browser.cache.disk.parent_directory
  • 輸入想要改變的資料夾位置 例如 S:cache_of_firefox (路徑不需包含雙引號)
  • 重新開啟 firefox, 在 S:cache_of_firefox 會自動新增 cache 子目錄
  • (選擇性執行)複製原始cache檔 C:Documents and Settings帳號名稱Application DataMozillaFirefoxProfilesdefault.xxxCache 至新的暫存目錄 (注意xxx是隨機產生的字串)
  •  

    IE 的設定… 我想你應該知道

      Read Full Post »

      關於 MySQL 的查詢快取

      關於 MySQL 的查詢快取

      參考資料:MySQL 使用手冊: "6.9 MySQL Query Cache"

      優點:對於不常變動的資料進行大量查詢,可以得到相當好的效能提昇
      一些注意事項:
      1. 因為查詢命令與快取的命令比對是採用位元比對(byte for byte),所以大小寫被視為不同字元,所以,
      SELECT * FROM TABLE

      Select * from table
      會被視為不同的查詢,且被分別被快取。

      所以,統一將查詢命令寫成大寫或小寫,使查詢機制獲得最佳的發揮

      2. 使用不同資料庫的,使用不同協定版本的,或使用不同的預設字串的查詢將被認為是不同的查詢,並將分別被快取。

      3. 快取中對於 SELECT CALC_ROWS … 和 SELECT FOUND_ROWS() … 的查詢沒有作用,因為找到的行的數目也是被儲存在快取裡的

      4. 如果查詢結果被從查詢快取中傳回,那麼狀態變數 Com_select 將不會被增加,但是 Qcache_hits 卻會增加

      5. 如果一個資料表發生的改變 (INSERT, UPDATE, DELETE, TRUNCATE, ALTER 或 DROP TABLE|DATABASE),那麼這個資料表的全部咼取會被清空

      6. InnoDB 資料表如果進行交易,則在一個 COMMIT 被完成時,快取資料將被清空。

      7. 如果 SELECT 查詢中包含下面的函數,該查詢將無法被快取
       a. 使用者自訂函數
       b. CONNECTION_ID 
       c. FOUND_ROWS 
       d. GET_LOCK 
       e. RELEASE_LOCK 
       f. LOAD_FILE 
       g. MASTER_POS_WAIT 
       h. NOW 
       i. SYSDATE 
       j. CURRENT_TIMESTAMP 
       k. CURDATE 
       l. CURRENT_DATE 
       m. CURTIME 
       n. CURRENT_TIME 
       o. DATABASE 
       p. ENCRYPT (只有一個參數調用) 
       q. LAST_INSERT_ID 
       r. RAND 
       s. UNIX_TIMESTAMP (無參數調用) 
       t. USER 
       u. BENCHMARK 

      8. 如果一個查詢包含使用者變數,參照 MySQL 系統資料庫,或下列之一的格式,該查詢亦不可以被快取。
       a. SELECT … IN SHARE MODE
       b. SELECT … INTO OUTFILE …
       c. SELECT … INTO DUMPFILE …
       d. SELECT * FROM AUTOINCREMENT_FIELD IS NULL (檢索最後一個插入 ID – ODBC 語句)

      9. 一個查詢不使用任何資料表,或使用暫存用的資料表,或使用者對任何相關資料表表有一個列權限,那麼查詢將不會被快取

      10. 在一個查詢從查詢快取中讀取前,MySQL 將檢查使用者對所有相關的資料庫和資料表是否有 SELECT 權限。如果不是這種情況,快取的結果將不能被使用。

       

      Read Full Post »

      最佳化 SQL 程式碼

      今天休息時看了一下"SQL程式設計徹底研究",裡面提到一些SQL的最佳化設計方式,
      以後工作時可能會用到,因此將已經看過的部分整理如下

      1. 盡量避免透過簡單的搜尋參數當作連結條件()
      slow:
      SELECT * FROM A, B WHERE A.town = B.town AND B.town = ‘taipei’;

      fast:
      SELECT * FROM A, B WHERE A.town = ‘taipei’ AND B.town = ‘taipei’;

      說明:
      因為一般資料庫產品都會先進行過濾在進行連結,較快的方法是先將要連結的表格最小化。

      2. 進行一連串的 AND 限制條件的時候,將最嚴格的條件放在最前面

      說明:
      因為後續的 AND 條件可以在較小的集合中進行資料過濾

      3. 將數量較少的表格放在 FROM 最後面,並將該表格的運算放在 WHERE 最前面

      說明:
      因為可以使系統強制使用特定的索引

      4. 將不等式 <> 改用 > or < 來完成
      slow;
      SELECT * FROM A WHERE f <> ‘aaa’

      fast;
      SELECT * FROM A WHERE f > ‘aaa’ OR f < ‘aaa’

      說明:
      因為大多數的最佳化器都會假設<>會過濾掉許多資料,所以大多數的最佳化器都會用循序的方式掃描<>執行後的資料集
      因此,改成 > OR < 可以強迫系統使用索引。但是這個並不是所有的資料庫產品皆如此,可能需要查閱一下產品的手冊

      5. 避免使用 IS NOT NULL,改用 >= "欄位最小值"

      說明:
      不同實作品儲存NULL值的方法各不相同,但幾乎所有的實作產品都不會將NULL值跟他們的欄位儲存在同一個實體儲存區域內
      所以,SQL引擎必須進行額外的搜尋動作才能找出NULL值。

      範例:假如有一個宣告為 CHAR(3) 的欄位可以存放NULL
      slow:
      SELECT * FROM A WHERE f IS NOT NULL

      fast:(避免不必要的讀取)
      SELECT * FROM A WHERE f >= ‘aaa’

      6. 使用索引取得 COUNT()值
      說明:
      索引本身已經紀錄資料列的數量,部分聰明的 SQL 最佳化器會自動使用索引欄位求值

      範例:
      slow;
      SELECT COUNT(*) FROM A

      fast: id 為資料表 A 的 primary key
      SELECT COUNT(id) FROM A

       

      Read Full Post »