今天 comment spam 狂襲,砍到手軟。我不喜歡用 Spam Karma 這類東西,誤判機率蠻大的,重點是其介面又不方便把被誤判的 comment 救回來。另外,為了 web accessibility 考量,AuthImage(trac) 這類機制也不考慮。因此,先裝一個 Did You Pass Math? 試試看效果如何。
Did You Pass Math? 是在發表回應時,要求未登入的使用者,必須回答一個簡單的加法數學題。不像使用圖片的 AuthImage 之流,由於題目是以文字方式呈現,故在 text mode browser 上也可以達到 CAPTHA[1] 的效果。使用 lynx[2] 看的效果如右圖。
目前看來,只有一個問題,就是若不小心答錯了,按上一頁回去時,原本填寫的回應內容,都會遺失。這個還要研究一下 Did You Pass Math? 是怎麼做的,看看可不可以補強。在有結果之前,只好先加點文字說明警告[3]。
CAPTHA: an acronym for "completely automated public Turing test to tell computers and humans apart", trademarked by Carnegie [...]
趁著春節假期的空檔,傍晚努力了一番,把我的 blog 給升級到 wordpress 2.0.1 了。雖然一樣是使用 Subversion 安裝,但為了保險起見,我並沒有直接使用 svn switch 的方式,而是另外 checkout 一份,照著 Wordpress 官方網站的這篇《Upgrading Wordpress》一步一步慢慢升級。我的步驟如下:
備份資料庫:使用前陣子寫的 mysql-dump.sh 備份資料庫。
下載:使用 svn checkout 下載 trunk 版 Wordpress 至 wordpress-trunk 目錄,把 blog 目錄改鍊結到此目錄。
執行升級程式。
將原本的 theme 複製至新目錄。
測試,一切正常。
將原本用的 plug-in,除了 HTMLArea 外,皆複製至新目錄。
測試,一切正常。
為了使用 rich editor 的 dialog 功能,將 tab mix plus 設成 allow all popups[1]。
安裝 editormonkey,發現會找不到 toolbar 設定,經查發現是該 plug-in 的 editormonkey/include.php 檔用了 <? 而非 [...]
我在這篇《Fixing wordpress plugin - recent comments》介紹了怎麼樣修正以便安裝 recent comments 在某些比較新版本的 wordpress 裡。然後網友 1614 留訊息問可不可以解決中文字切一半的問題,所以我就研究了一下,然後就不小心解決了。
首先,先把 PHP 的 multibyte string extension 裝起來,對於 FreeBSD 來說,就是把 converters/php5-mbstring 裝起來即可。如下:
SHELL> cd /usr/ports/converters/php5-mbstring
SHELL> make install
...
基本上,我們將使用 mb_strimwidth() 幫我們切文字,這個函式知道一段字串在 terminal 上會有多「寬」,好比說兩個全形字加三個半形字,會被認知為寬度為 (2*2+3*1)=7,然後依據給定的寬數「切」字串。所以,只要改用 mb_strimwidth() 來作真正的切字串的動作即可。
請修改 recent comments 的 kjgrc_excerpt() 這個函式如下:
function kjgrc_excerpt ($text,$chars_per_comment,$chars_per_word,$tag,$output)
{
$length = strlen(str_replace($tag,"",strip_tags($output)));
[...]
之前換 theme 是因為 Arlo 跟我說,我的 trackback 爛掉了。結果 theme 換好了,還是不能夠 trackback,還好新 theme 的樣式我很滿意,才沒有做白工。只好再翻出國三生長輩的這篇《Wordpress Trackback Auto-Discovery》仔細研究了一下,這才發現,雖然舊 theme 爛到底了什麼也沒做好,但新選的 Beeblebrox theme 一樣也是找不到 trackback_rdf() 的存在,只好乖乖自己改 theme 把 trackback_rdf() 加上去。
可是,這一加,出了問題了。冒出了如下的錯誤訊息:
Warning: strtotime() [function.strtotime]: Called with an empty time parameter. in /WP/wp-includes/template-functions-links.php on line 4
一追之下才發現,這實在是 wordpress 程式寫的不好的緣故啊。trackback_rdf()不加任何參數地輾轉呼叫到 get_permalink(),於是 get_permalink() 只好用 0 這個預設參數值當參數呼叫 get_post() 取得當篇文章的各項資料。這可好了,get_post() 若收到 0,就會去抓 $GLOBALS['post'] 當作要查的文章的 id,而因為此時尚沒有 $GLOBALS['post'] 的存在,因而產生錯誤。
為什麼 $GLOBALS['post'] [...]
總算是找到 recent comments 這個 wordpress 的 plugin 的修法了。原本照著安裝步驟,把檔案 copy 進 plugin 目錄啟動之,但是進入 recent comments 的 options 選單,卻會出現如下的錯誤訊息而無法使用:
Fatal error: Cannot redeclare kjgrc_subpage_gravatar()
還好,最後終於是讓我找到了解法。簡單講應該就是 recent comments 沒有按照 wordpress 新的 add_action() 的方式,讓 wordpress 知道有 recent comments 的 action 可以用。而且用了一個很奇怪的手法,避免 double inclusion 如下:
if ( function_exists("is_plugin_page") && is_plugin_page() ) { kjgrc_options_page(); return;}
而 kjgrc_options_page() 卻是在之後才 define,也因此造成了 [...]
看到 Ronny's BLOG 的這篇《如何不顯示 PHP 的錯誤訊息或警告訊息》,想起自己曾經誤解了 PHP5 長達兩年的愚蠢經歷。:-p
話說當年 PHP5 的語言規格一問世之後,我為之傾倒,這簡直就是直接解決了 PHP 最大的問題「語言功能不足」啊。因此就十分期待 PHP5 的問世。由於我都是用 ports 在管理軟體,因此當 PHP5 BETA 一出現在 ports 裡,我馬上就讓準備取代舊 lady 的新 lady 安裝 PHP5,要慢慢將以前的舊程式,改寫成可以在 PHP5 上跑。可是,想當然爾,這樣子的轉換,當然不可能無痛,有錯誤是必然的。但沒想到,竟然,瀏覽器裡一片空白,一點錯誤或警告訊息都沒有。這是要怎麼 debug 啊?什麼都沒有,猜也猜不到。我還以為,這是因為 PHP5 還是 BETA 版的緣故,因此程式的轉換就一拖拖了快兩年,web 這個龍頭 service 不能移過來,其他 services 也就懶得動,也因此新 lady 這台遠比舊 lady 強大不知多少倍的機器,就充當測試機很久,直到本 blog 問世為止。
原來,一切的問題都在於,我在安裝 PHP5 的時候,為了安全起見,便直接使用 ports 提供的 php.ini-recommended 這個使用比較安全的設定的 php.ini 設定檔。而在這個版本的 php.ini 裡,將 [...]
前陣子我在 blog 上簡單介紹了 Trac Aggregator,因為在工作上總是必須多個專案同時進行,相互依存,又因為當初規劃 repository 的決策,造成搭配 Trac 時,因為 Trac 沒有 multi-project support,而使用起來非常麻煩[1]。所以只好簡單地寫了這個 PHP script 當作個人工作用的 issue portal。
其實說穿了很簡單,Trac 的 report 是藉由讓使用者自行編輯 SQL 指令而產生的。而 Trac 的資料庫就放在 TRAC_ENV 下的 db/trac.db 這個 SQLite 資料檔裡。所以我們只要自己用 PHP 開 SQLite 資料檔,然後把 Trac 裡的 report 的 SQL 指令搬過來,排版 output 一下,簡易版 Trac Aggregator 就完成了。
比較麻煩的,反而是如何呈現跨專案的 ticket list。由於每個專案的 milestone 進度都不會相同,排序的問題就相對地複雜很多。目前我只是簡單地在 script 裡,用 compositional compare function [...]
Trac 是我目前正在用的 issue tracking system,由於整合了 wiki 與 subversion,故幾乎可以拿來當作 project management system 來用了。不過,目前的 Trac 即使是進展到了 1.0 版,也仍然將是 single project 的系統。然而,實際工作上,多個 project 一併進行,設置互有牽扯的情況非常普遍。因此,我寫了一個簡單的 PHP 網頁,剛好可以簡單地當作 multi-project trac portal 來用。
使用前,請先依照 TracMultiProjects 的說明,設定好 multi-project 的環境。然後,修改這個 PHP 網頁最前面的 define(),TRAC_DIR 是指你放那堆 trac environment 的目錄,而 TRAC_USR 則是你登入 trac 用的帳號。最後,把這個網頁放在你覺得最適合的地方即可。
<?php
define('TRAC_DIR', '/trac');
define('TRAC_USR', 'jeffhung');
$tracagg_errors = array();
function tracagg_raise_error($errmsg)
{
array_push($tracagg_errors, $errmsg);
}
function wrap_html_text($text)
{
[...]
PHP 內建的 assertion 功能已經很強了,但有時候,就是差了這麼一點點,因此,也許我們需要自己做自己的 assertion。
自己做 assertion 怎樣做都可以,反正是自己做。只不過,有些東西還是不一定容易取得,好比說,發生 assertion failure 的 file name、line number。這些東西內建的 assert() 會印,但如果我們要自己做 assertion,那我們就得自己來。
在自己的 assertion function 裡面用 __FILE__、__LINE__ 這類 magic constants 也只會印出實做自己的 assertion function 那一處的檔案及行號,無效。幸好,PHP 裡有個和 Perl 內建的 caller() 功能更強一些的 debug_backtrace()。利用這個函式,我們就可以做自己的 assertion function,用法與內建的 assert() 幾乎一致:
function my_assert($expr)
{
eval('$eval_result__=('.$expr.');');
if (!$eval_result__) {
[...]
既然有上一篇個技巧,當然就可以包成網頁,平常當成一個 utility 來用,這樣若是要轉文章到 bbs 上的話,就可以叫這個網頁出來排版,畫面就可以排得漂漂亮亮啦。:-)
呈現出來的效果如:http://www.jeffhung.idv.tw/html2text.php (目前無法使用)。
<?php
// Author: Chien-Chou Hung
// License: BSDL
?><html>
<head>
<title>html2text</title>
</head>
<body>
<form name="f" method="POST">
<b>Convert:</b> <input type="text" name="url" value="<?php
echo (empty($url) ? "http://" : $url);
?>" size="50" maxlength="255">
<input type="submit"><br>
Text browser:
<input type="radio" name="browser" value="links" checked>
[...]