2 月 2 2010
1 月 9 2010
Gallery 的 RSS module 問題:Undefined index: sfPhotosRecursiveLimit in ….
有安裝 Gallery 2 作為相簿系統的人可能跟我一樣,會在 Apache 的 error log 裡面看到一大串如下的 log:
PHP Notice: Undefined index: sfPhotosRecursiveLimit in [Gallery目錄]/modules/rss/SimpleRender.inc on line 78
追了一下程式,發現是變數沒處理好。
於是,我修改了 modules/rss/SimpleRender.inc,加了以下這段程式碼處理變數:
if ( !isset($params['sfPhotosRecursiveLimit']) ) { $params['sfPhotosRecursiveLimit'] = $params['sfPhotosRecurseLimit']; }
修改過後的某個片段長這樣:
$params['feedDate'] = $params['sfDate']; if ( !isset($params['sfPhotosRecursiveLimit']) ) { $params['sfPhotosRecursiveLimit'] = $params['sfPhotosRecurseLimit']; } /* apply defaults */
跟我一樣,覺得那些 log 很礙眼的,就參考一下吧。
我把 patch 一併貼到官方論壇了(Problem fix for RSS module),不知道會不會被採用就是了。
1 月 8 2010
FreeBSD-SA-10:02.ntpd
昨天,FreeBSD 官方發布了三個 Security Advisories:
根據 Advisories 內容,我原本打算透過以下的步驟作 patch:
- cd /usr/src && make update
- cd /usr/src/lib/bind && make obj && make depend && make && make install
- cd /usr/src/usr.sbin/named && make obj && make depend && make && make install
- cd /usr/src/usr.sbin/ntp/ntpd && make obj && make depend && make && make install
- cd /usr/src && make kernel
- [REBOOT]
但是,進行到第 4 個步驟(FreeBSD-SA-10:02.ntpd 的編譯階段),就出現了如下的 message:
make: don’t know how to make /usr/obj/usr/src/usr.sbin/ntp/ntpd/../libparse/libparse.a. Stop
找了一些討論後,我在這個討論串裡看到好幾種作法。
幾經嘗試,我最終在 FreeBSD 8.0-RELEASE-p1 amd64 用以下這個作法順利編譯成功:
- cd /usr/src/usr.sbin/ntp
- rm -rf /usr/obj/*
- make obj && make depend && make && make install
有相同問題(狀況)的人可以參考看看。
1 月 7 2010
[Javascript] 從 array 裡隨機挑出不重複的值
Javascript 提供了 For … In … ,我用的還蠻高興的(雖然我很少撰寫 Javascript)。
今天遇到某種特殊需求,我才發現這個迴圈語法並非萬能。
從 array 裡隨機挑出不重複的值有兩種情況,一種很單純,For … In … 迴圈可以處理的很好:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; var x; while(fruits.length > 0) { var r = Math.floor( Math.random() * fruits.length ); var n = fruits[r]; document.write("Choosen[" + r + "]: " + n + "<br />"); document.write("Array: " + fruits + "<br />"); for(x in fruits) { if (fruits[x] == n) { fruits.splice(x, 1); } } }
若是 array 裡面已經存在重複的值,而且 array 的資料的來源不方便控制(例如是 HTML 裡面的 li 物件),For … In … 這種方便的迴圈語法就必須放棄,改用傳統的 for 迴圈:
var fruits = [ "Banana", "Banana", "Orange", "Orange", "Banana", "Apple", "Apple", "Orange", "Mango" ]; var i=0; while(fruits.length > 0) { var r = Math.floor( Math.random() * fruits.length ); var n = fruits[r]; document.write("Choosen[" + r + "]: " + n + "<br />"); document.write("Array: " + fruits + "<br />"); for(i=0; i<fruits.length; i++) { if (fruits[i] == n) { fruits.splice(i, 1); i--; } } }
1 月 4 2010
[C#] 取得 wav 檔案格式
前陣子,在工作上剛好需要對 wav 檔案格式進行判定,可是 NAudio 製作出來的格式用來作判斷又有錯誤,所以土法煉鋼寫了一個小 class:
using System; using System.Collections.Generic; using System.Text; using System.IO; class WavInfo { private String _Error; public String Error { get { return this._Error; } } private Boolean _PCM; public Boolean PCM { get { return this._PCM; } } private uint _Channel; public uint Channel { get { return this._Channel; } } private uint _SampleRate; public uint SampleRate { get { return this._SampleRate; } } private uint _BitsPerSample; public uint BitsPerSample { get { return this._BitsPerSample; } } private uint _ByteRate; public uint ByteRate { get { return this._ByteRate; } } private uint _BlockAlign; public uint BlockAlign { get { return this._BlockAlign; } } public WavInfo(String FileName) { try { FileStream FS = File.OpenRead(@FileName); Byte[] ReadTmp = new Byte[36]; FS.Read(ReadTmp, 0, 36); FS.Close(); if (BitConverter.ToUInt16(ReadTmp, 20) == 1) { this._PCM = true; } this._Channel = BitConverter.ToUInt16(ReadTmp, 22); this._SampleRate = BitConverter.ToUInt32(ReadTmp, 24); this._BitsPerSample = BitConverter.ToUInt16(ReadTmp, 34); this._ByteRate = this._Channel * this._SampleRate * this._BitsPerSample / 8; this._BlockAlign = this._Channel * this._BitsPerSample / 8; this._Error = String.Empty; } catch (Exception e) { this._Error = e.ToString(); } } }
- 檢查 Error 是否為空字串,就知道是否成功取得 wav 檔案資訊。
- 檢查 PCM 是否為 true,就知道該檔案是不是 PCM 格式的 wav 檔。
- wav 檔播放的時間會等於 ByteRate。
12 月 10 2009
輕鬆設定 PHP 的專案變數
我們在開發 PHP 專案時,時常會把一些常用變數放在某個 PHP 檔案,接著用 require()、require_once()、incluce()、include_once() 等函式將之引入。
若系統目錄很複雜,就會在很多檔案裡面看到類似這樣的語法:
require_once('../../Config.php');
然而,當這種系統必須變動目錄結構與檔案所在目錄時,開發人員就得額外多花些時間來更改上述之程式碼。
其實,PHP 的設定檔中,有個很少被注意到的變數,就是 auto_prepend_file 。
假設目前有個 PHP 專案,專案根目錄之系統絕對路徑為 /var/www/html/Project,
共用設定檔為 /var/www/html/Project/Config.php 。
我們可以在 /var/www/html/Project 下建立 .htaccess 檔案,內容如下:
php_value auto_prepend_file “/var/www/html/Project/Config.php”
而 /var/www/html/Project 目錄下所有的檔案,以及所有子目錄中的檔案都會自行引入 /var/www/html/Project/Config.php 。
PS. 由於 auto_prepend_file 的設定是透過 require() 來實作,使用這種方法要特別注意以下兩點:
- 一旦設定了 auto_prepend_file ,該檔案就必須要存在,否則就會有 error ,導致該目錄下的所有 PHP 檔案無法正常執行。
- include_path 會影響 auto_prepend_file。
11 月 20 2009
一些增進 MySQL 效能的 tips
幾天前,跟 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;
10 月 11 2009
[小軟體] 備份 putty 的設定 – puttyBackup
這是我的第一個 C# Windows Form 程式。
使用方法:
- 點選 Browse 按鈕,選擇並輸入 reg 檔存放位置與檔名。
- 點選 Backup 按鈕就能將 putty 的登錄檔輸出。
3 月 2 2010
[筆記] 最近製作/修改 FreeBSD ports 的一些心得
在 1 月底,我開始使用 FreeBSD Port Tools 來製作/修改 FreeBSD ports。
因為太好用了,使得我在一個月左右時間內,整整送了 10 個 FreeBSD PR(我知道這種量不值一提,但對我來說,這是目前為止的尖峰值)。
對 FreeBSD ports 有興趣的人,請先詳讀一下這個討論串。
針對 FreeBSD Port Tools 的使用,大概要注意的是:
至於 FreeBSD ports 的部份,大概要注意這些:
由於我還算是新手小嫩咖,目前只能提供以上的心得(順便留個筆記)… orz
By Joe Horn • FreeBSD 0 • Tags: FreeBSD, ports, porttools