Month: September 2011

Firefox: How To Remove Java Console From Add-ons

Posted by – September 28, 2011

我的電腦裡習慣會裝 Java 的相關套件,包括用來開發的 JDK 和用來執行的 JRE。這些套件會在 Firefox 裡出現一些不請自來的外掛。隨著 Java 更新,這些不請自來的外掛也隨之增加,想刪也刪不掉。

Java Consoles in Firefox More

CodeIgniter: Build RSS Feed

Posted by – September 22, 2011

rss icon最近自己用 CodeIgniter 寫了個小網站,讓網友可以提供一些圖片素材。雖然後台有做了統計和紀錄功能,不過想再加一個訂閱 RSS 的功能,這樣我從 Google Reader 就能知道又有新素材出現。因為新網站是用 CI 寫的,想說就用 CI 寫一個 RSS feed。查了一資料,相關教學都有互抄的感覺,連 bug 都很一致是怎樣?

所以我又做了一些修改,確認每個瀏覽器打開都會認得它是一份 RSS 文件,Google Reader 也能正確讀取。

More

WordPress: Fix Syntax Highlighter MT Vertical Scrollbars in Chrome/Webkit/Opera

Posted by – September 21, 2011

本部落格有裝了一個 WordPress plugin: Syntax Highligter MT,用來顯示程式碼片段,效果很好。不過自從某次更新後,在 Chrome 和 Opera 瀏覽器裡卻會出現垂直的捲軸,這並不影響使用,但是明明沒有多餘的內容要顯示,卻硬生生多了 scrollbar,實在是有礙觀瞻。

More

CodeIgniter: Using PHPMailer to Send Email via GMAIL

Posted by – September 21, 2011

CodeIgniter 內建的 Email Class 對雙位元文字的處理實在很糟,設了 charset 也無法正確寄出 UTF-8 中文信件,從 1.7.1 到 2.0.3 都沒有解決這個問題。同事的處理手法有點囧,是用 iconv 把繁中轉成 GBK 再寄送,但這個方法也不完美,不是每個 Email Client 都能正確無誤地顯示,而且標題也有字數限制。

最近要處理一個電子報系統,再用 CI 那跛腳 Email Class 大概會被客訴到瘋掉。所以還是認命改用老牌的 PHPMailer Library。稍微試一下,發現在 CI 裡使用 PHPMailer 相當無痛,先到官網下載一份 PHPMailer (本文完成時的最新版本是 5.2.0),解壓縮後把整個資料夾丟到 CI\application\libraries\PHPMailer_5.2.0。接著在 libraries 下建立新檔案,就叫 mailer.php 好了。

More

JavaScript: Convert Size In Bytes To Human Readable Format

Posted by – September 15, 2011

在程式中處理檔案的時候,時常碰到的就是檔案大小的顯示。在資料庫裡通常是以 bytes 為單位做紀錄,但是顯示到畫面上,看到 479247294213 bytes 這種天文數字任誰都很難理解它到底有多大。

將天文數字轉換成普通人能夠輕易閱讀的型式很重要,所以 bytes 在畫面上要轉成 MB 或 GB 這類的型式。KB、MB、GB 之間都是 2^10 = 1024 為一個級數,所以轉換原理只要用遞迴一直除以 1024,直到小於 1024 就轉換完了。

以下這個寫法稍微特殊一點,不過原理並沒有差太多,是在找資料的時候看到的,在此留個筆記。

<script>
$(function(){
	$('span').html(bytesToSize(479247294213));
});
function bytesToSize (bytes) {
	var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
	if (bytes == 0) return 'n/a';
	var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
	return ((i == 0)? (bytes / Math.pow(1024, i))
		: (bytes / Math.pow(1024, i)).toFixed(1)) + ' ' + sizes[i];
};
</script>

把剛剛的 479247294213 bytes 代入就會轉換成 446.3 GB,這樣就容易理解多了。

CodeIgniter: Use Ellipsize Helper For Custom Encoding

Posted by – September 9, 2011

CodeIgniter 的 Text Helper 裡有一個 function ellipsize(),用來截斷過長的文字,同時可以指定顯示長度、截斷位置,功能上相當不錯。

殘念的是這支 function 並不支援雙位元文字或其他特殊編碼的文字,拿中文字去切非常容易出現亂碼。所以決定幫這支程式做點小小的修改,讓它可以指定編碼,拿來截斷中文也沒問題。

function ellipsize($codepage = 'UTF-8',
				   $str, $max_length, $position = 1, $ellipsis = '&hellip;')
{
	// Strip tags
	$str = trim(strip_tags($str));

	// Is the string long enough to ellipsize?
	if (mb_strlen($str, $codepage) <= $max_length)
	{
		return $str;
	}

	$beg = mb_substr($str, 0, floor($max_length * $position), $codepage);

	$position = ($position > 1) ? 1 : $position;

	if ($position === 1)
	{
		$end = mb_substr($str, 0,
			-($max_length - mb_strlen($beg, $codepage)), $codepage);
	}
	else
	{
		$end = mb_substr($str,
			-($max_length - mb_strlen($beg, $codepage)), $max_length, $codepage);
	}

	return $beg.$ellipsis.$end;
}

主要的修改是將 substr 與 strlen 換成 mb_substr 與 mb_strlen,然後加上編碼參數,並不是很複雜的修改。不過往後碰到需要截斷過長文字的程式都可以拿這支來用,實性用很高。

CodeIgniter: Display ActiveRecord Generated SQL

Posted by – September 2, 2011

感覺在台灣用 CodeIgniter 開發的公司還不少,CodeIgniter (簡稱 CI) 是以 MVC 為基礎的 PHP framework,輕量以及容易上手是相當吸引人的特色。

CI 的 Database Library 中實作了 ActiveRecord 的功能,雖然它實際上是個 query builder,而不是真正的 ActiveRecord pattern,不過對於開發人員來說還是能有效地完成資料庫的存取動作,並減少自己組合 SQL 的麻煩。

在撰寫存取資料的 Model 時,經常需要查看 query string 來 debug,CI 提供了兩個方法來取得 query builder 產生出來的 query string。

一個是在 query 執行前用

$this->db->_compile_select();

另一個是在 query 執行後用

$this->db->last_query();

雖然不太清楚為什麼要分成執行前執行後,不過至少提供了 debug 的工具。

另外在成功 insert 資料後,也可以用下列方法取回自動增加 (auto increment) 的 id 值。

$this->db->insert_id();

jQuery Validation plugin: How to Use Regex as Rule?

Posted by – September 2, 2011

在網頁程式中,表單的處理一直是很繁瑣的一環,client 端要用 Javascript 先對使用者的輸入進行初步過濾,資料送到了 server 端還是要再過濾一次。「永遠不要信任使用者輸入的資料」是表單程式的準則。

為了網站的安全不可少的 SOP,結果便是程式設計師要為此付出許多時間撰寫過濾程式。為了減緩程式設計師的腦細胞死亡速度,借助第三方程式的功能也是很重要的課題。在網頁前端常會用 jQuery Validation plugin 來對使用者輸入的資料進行前處理,這個套件內建一些基本規則,像是必填 (required)、電子郵件 (email)、網址 (url)、數字 (digits) 等等,但偶爾還是需要自訂特殊規則。

還好 jQuery 這個套件提供開放的接口可以自訂功能,透過簡單的幾行程式就能用正規表達式 (regular expression, regex) 來指定規則。

// 建立名為 'regex' 的自訂規則
$.validator.addMethod("regex", function(value, element, param) {
     // 強制加上 ^ 與 $ 符號限制整串文字都要符合
     return value.match(new RegExp("^" + param + "$"));
});

$("#myForm").validate({
    rules: {// 定義規則
        username : {
            required: true,
            regex   : "[A-Za-z0-9]+" // 寫法請參考 Regex
        },
        onlyUppercase: {
            required: true,
            regex   : "[A-Z]+"
        }
    },
    messages: {// 自定訊息
        username : {
            required: '必填',
            regex   : '只能使用英數字'
        },
        onlyUppercase : {
            required: '必填',
            regex   : '只能使用大寫英文字母'
        }
    }
});

如此一來便能自行撰寫 regex 來設定各種進階規則以及提示文字了,即使是有多組規則也沒問題。

關於正規表達式的使用方法,請參考 石頭閒語: Regular Expression (RegExp) in JavaScript