Nov 20

幾天前,跟 Solaris 叔叔 談到 MySQL 的 ENUM,回家後上網找了些資料,剛好找出了一些使用 MySQL 時,與效能有關的 tips。

稍微整理過後,放在這裡:

  • 善用 EXPLAIN SELECT 分析 SQL statement,以下列舉狀態解讀:
    EQ_REF 一對一比對
    REF 一對多比對
    RANGE 特定範圍的資料會被傳回
    INDEX 使用 INDEX 裡的資料
    ALL 對整個 TABLE 作掃瞄(最差)
  • 善用 INDEX,以這個 SQL statement 為例:
    SELECT `col_a`
    FROM `table_a` LEFT JOIN `table_b`
    ON `table_a`.`col_b` = `table_b`.`col_c`
    WHERE `col_d` = ....;
    
    -- SELECT 的欄位不需 INDEX,ex: `col_a`。
    -- JOIN 的欄位需要 INDEX,ex: `table_a`.`col_b` 與 `table_b`.`col_c`。
    -- WHERE 的欄位需要 INDEX,ex: `col_d`。
    
  • 儘量使用固定大小的欄位,MyISAM 搜尋固定大小欄位比較快;也就是說,能用 CHAR 就別用 VARCHAR。
  • 儘量將欄位指定為 NOT NULL。
  • ENUM 格式的欄位,資料處理速度很快(實測結果在這)。
  • 不要取不需要的資料,下面這種語法就是不好的例子:
    SELECT * ...
  • 把 BLOB 與 TEXT 拆開,減少 MySQL 開啟單一大檔(table 資料檔案過大)的機會。
  • JOIN 用的欄位資料格式最好是相同的,以免 MySQL 作 FULL TABLE SCAN。
  • 使用 LIKE 時,避免把 % 放在字串開頭,以免 INDEX 利用率不佳。
    -- 下列這種語法無法利用 INDEX
    SELECT ... WHERE `col` LIKE '%string%';
    
    -- 下列這種語法會利用 INDEX
    SELECT ... WHERE `col` LIKE 'string%';
  • 注意 WHERE 子句內的運算式。
    -- 下列這種語法會使用 INDEX,速度快。
    SELECT ... WHERE `col` < 100 / 10;
    
    -- 下列這種語法會導致 FULL TABLE SCAN,速度慢。
    SELECT ... WHERE `col` * 10 < 100;

Technorati Tags: , , , , , , , , , ,

Tags: , , , , , , , , , ,
(Visited 84 times)
Oct 11

這是我的第一個 C# Windows Form 程式。

執行畫面:
puttyBackup

使用方法:

  1. 點選 Browse 按鈕,選擇並輸入 reg 檔存放位置與檔名。
  2. 點選 Backup 按鈕就能將 putty 的登錄檔輸出。

下載:

Technorati Tags: , , , ,

Tags: , , , ,
(Visited 749 times)
Oct 08

最近在玩 C#,寫個小軟體。
不過,我發現我產生出來的 exe 檔就是很醜,看起來的感覺就好像是病毒檔... :oops:
用 MSDN 跟上網搜尋,solution 也不算好找,所以寫這篇順便幫自己紀錄一下。

Windows Form 有兩種圖示可以設定:

  • Form 的圖示:只要在 Form 的屬性中,更改 Icon 屬性的 Value 就好,設定的圖示會顯示在執行的視窗的左上角。
  • Application 的圖示:在 Visual Studio 2008 中,最上方工具列的 專案 -> [專案名稱]屬性,開啟的分頁中的 應用程式 有個 圖示與資訊清單 項目。在此便可設定軟體圖示。

By the way,我覺得目前寫這個小軟體應該還算實用,寫完後再丟上來~ 8)

Technorati Tags: , ,

Tags: , ,
(Visited 857 times)
Sep 27

以下是在 PTT 的 PHP 板看到某篇文章後的心得,以及小小的經驗分享。

Smarty 稍有經驗的人,應該都知道樣板內可使用 {include} 這個 tag 來嵌入其他 template file。
然而,因為 Smarty 內的變數都是全域變數,所以我對這個 tag 的看法是「能不用,就不用」。

用常見的網站論壇系統舉個簡單的例子:

  • A 設計師負責開發顯示 HTML header 的 template,使用了 $title 變數作為 page title,ex:
    <html><head><title>$title</title></head>
  • B 設計師負責開發顯示論壇文章內容的 template,恰巧也使用了 $title 作為文章標題。

若 B 設計師在其 template file 中使用了 {include} 來嵌入 A 設計師的 template file,就可能會產生預期之外的顯示結果。

當然,若是開發團隊已事先溝通好各項變數的命名,就不會有這種情況。
但為了減少此類風險,降低 debug 的難度,我們會選擇使用這種方式:

  • 在系統全域共用的函式檔案中增加負責顯示 HTML header 的 function,例如 function page_header($title) { ...} ,並在 function 中 assign 變數,引入 A 設計師開發的 template file。
  • 在論壇文章內容顯示的程式檔中,呼叫 page_header($title),再 assign 文章標題的變數,引入 B 設計師開發的 template file。

當然,若嵌入的 template file 內沒有任何變數,就不須考量以上的狀況,開發/設計人員可以大膽地隨意使用。 8)

Technorati Tags: , ,

Tags: , ,
(Visited 1077 times)
Sep 09

昨晚,有個學長透過 MSN 問我有無簡單好用的 PHP 圖形驗證碼,又讓我想到 reCAPTCHA
上一次使用時,reCAPTCHA 僅提供顏色變更;如今,reCAPTCHA 已經開始支援多國語言了。

剛才稍微玩了一下,寫了這個簡單的網頁
reCAPTCHA 的多國語言化相關資訊可以參考 這裡,而我使用的中文化程式碼片段為:

<script type="text/javascript">
	var RecaptchaOptions = {
		custom_translations : {
			visual_challenge : "取得圖形驗證碼",
			audio_challenge : "取得音效驗證碼",
			refresh_btn : "重新整理圖形",
			instructions_visual : "輸入兩個英文單字:",
			instructions_audio : "輸入您聽到的聲音:",
			help_btn : "獲得協助",
			play_again : "重新播放音效",
			cant_hear_this : "將音效下載為 MP3",
			incorrect_try_again : "錯誤! 請再試一次"
		}
	};
</script>

Technorati Tags: , , , ,

Tags: , , , ,
(Visited 1520 times)
Sep 04

以往我撰寫 PHP 的兩個工具是 vimjEditvim 比較常用)。
當時會選 jEdit 是因為 jEdit 提供了 FTP 遠端存取的功能,更改或新增的程式檔可以自動上傳到遠端主機。
昨天在 PTT 的 PHP 板看到有人提到 Aptana Studio,今天想到就抓來玩看看。

令我驚豔的是,Aptana Studio 也提供了遠端存取的功能,包括 FTP、FTPS、SFTP,以及各種版本控制系統。
不過,試了一下之後,發現它沒有辦法自動讓更改或新增的程式檔上傳到遠端主機,只能儲存後,再手動作 upload。
在網路上搜尋解決方法後,我卻發現工具列上的 Scripts -> Synchronize -> Upload Current File On Save 是壞掉的。 =_=|||

在即將放棄使用 Aptana Studio 時,我發現了 這個討論串,而且也順利解決自動上傳的問題。
討論串的內容有點亂,所以把解法整理在這邊,順便幫自己留個備份(以免以後又要找解法):

  1. Aptana Studio 安裝的資料夾找出 upload_current_file_on_save.js 這個檔案,並編輯它。
  2. 在 header 的部份補上這兩行:
    Listener: commandService().addExecutionListener(this);
    Key: M1+S

    補完之後的 header 大概像這樣:

    /* Listener: commandService().addExecutionListener(this);
     * Currently an example script (disabled)> Copy as your own script, and modify
     * the Listener command as shown below
     *
     * Menu: Synchronize > Upload Current File On Save
     * Key: M1+S
     * Kudos: Ingo Muschenetz
     * License: EPL 1.0
     * DOM: http://localhost/com.aptana.ide.syncing.doms
     * DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript
     */
  3. 在檔案最後面補上這段:
    function main() {
       sync.uploadCurrentEditor();
    }
  4. 存檔並重新執行 Aptana Studio

之後只要按下 Ctrl + s 儲存檔案,該檔案就會自動上傳到遠端主機囉。 :evil:

Technorati Tags:

Tags:
(Visited 1519 times)
May 29

幾個小時前,PTTDatabase 板 又有人問到 MySQL 的 "SELECT ... LIMIT m,n" 相關問題。
其實,在大多數的網頁系統中,"SELECT ... LIMIT m,n" 應該是一定要用的語法,尤其是在使用者驗證時。

簡單舉例,MySQL 的 "SELECT ..." 語法運作可說是拿著籃子去裝東西,若以 LIMIT 語法限制籃子裝東西的數量,MySQL 會在籃子裝滿後就停止動作,並傳回結果。
在網頁系統中,因為使用者帳號都是獨立的,所以,進行使用者登入驗證時,只需要抓出一筆資料來進行比對。

因此,在網頁系統中,我時常用這種語法來進行使用者登入的驗證:

SELECT `使用者身份` FROM `users` WHERE `username`='使用者名稱' AND `password`='雜湊後的密碼' LIMIT 1;

如果找不到資料,代表使用者的帳號/密碼錯誤。
而直接把密碼加入 WHERE 子句,不挑出來用程式比對則是為了杜絕 SQL Injection 導致的密碼外洩。

另外,這樣作也不錯:

SELECT `使用者身份` FROM `users` WHERE `username`='使用者名稱' AND `password`=PASSWORD( '雜湊前或雜湊後的密碼' ) LIMIT 1;

:cool:

Technorati Tags: ,

Tags: ,
(Visited 2804 times)
May 27

前陣子覺得手上這台 laptop 效能不好,用了一些軟體檢查了一下,發現硬碟效能頗低。
於是,買了一顆 WD3200BEVE 來換。

剛才心血來潮,用轉換線把舊的那顆 ST98832A 跟新的 WD3200BEVE 裝到 desktop 做測試。

  • ST98832A:
    ST98832A
  • WD3200BEVE:
    WD3200BEVE

平平都是 PATA、5400 rpm 的 2.5" HDD,WD3200BEVE 還蠻凶悍的嘛~ :neutral:

Technorati Tags:

Tags:
(Visited 3012 times)
Mar 08

Magic Process 是我用了好一段時間,也覺得蠻好用的軟體。
跟 Windows 內建的工作管理員比較起來,Magic Process 可以讓我們知道目前執行的程式,其程式檔案位於何處,類似這樣:
Magic Process
簡而言之,透過 Magic Process 可以檢查執行中程式是否為木馬或病毒(因為程式所在路徑不同)。

然而,最近發現我的 Firefox 瘋狂地佔用 CPU 資源,Magic Process 似乎不夠用,所以在網路上找了一些資料來查原因。

Microsoft TechNetProcess Explorer 也可以顯示出目前執行中的程式所在路徑。
Process Explorer
而且,Process Explorer 的 process properties 可以顯示出執行中的程式的各個 thread 詳細資料。
類似 Firefox 瘋狂地佔用 CPU 資源這種問題,使用Process Explorer 更容易找出原因。
Process Explorer-process properties

Technorati Tags: ,

Tags: ,
(Visited 4689 times)
Sep 03

除了已知的效能差異(以前用 Ubench 測過的,gaod 長輩也貢獻了一些資訊,都 紀錄在這)、預設支援的記憶體容量之外,這兩天又找出另外一項。

某台機器跑 FreeBSD i386 platform,搭配 PAESMP
根據以往的經驗,這種記憶體容量超過 4G 的機器,我會選 amd64 platform。
(至少經手過的幾台機器到現在都很健康...)

近來這台機器的 MySQL daemon process 時常會掛掉...
追蹤 error log 之後,發現這種錯誤訊息:

Out of memory (Needed 16391 bytes)

我把錯誤訊息丟上 Google 後,才發現 FreeBSD i386 platform 版本,其預設之單 process 記憶體容量限制為 512 MB,而 MySQL daemon process 使用超過 512 MB 後就會噴出上述的錯誤訊息,接著就是嗝屁... (!!)

我沒碰過這種瓶頸,似乎是 amd64 platform 沒有這種限制。
i386 platform 遭遇到這種瓶頸的解法是在 /boot/loader.conf 裡面丟進類似這三行:

kern.maxdsiz="2G"
kern.dfldsiz="2G"
kern.maxssiz="256M"

(拉高單 process 的記憶體容量限制,變為 2G)
然後 reboot,準備驗收成果...

Technorati Tags: , , ,

Tags: , , ,
(Visited 6825 times)