[phpBB3] BBCode [url] Tag 支援中文網址

在 phpBB2 的時候就有發現這問題了,當時並沒有想去解決這問題,然而至今到了 phpBB3,依然出現這問題,不過我想這是因為中文網址的盛行,以及像 Wiki 之類都會有中文標籤,例如:一分鐘教室-userChrome.css,解決方法可以透過 urlencode 函式來處理掉網址編碼問題,在 phpBB 處理文章儲存,會先經過 bbcode 的處理,將 標籤,會經過 get_preg_expression(‘url’) 這函式的驗證,看 url 是否合法,當然如果網址列有中文就不可能通過,所以必須在網址驗證之前,把網址編碼過,通過驗證之後再把網址解碼,這樣就沒問題了,底下為安裝步驟 打開 includes/message_parser.php 找尋
function validate_url($var1, $var2)
前面加入
/**
*  url encode
*
* @param string $string http url
*/

function encode_url($string)
{
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
    return str_replace($entities, $replacements, urlencode($string));
}
找尋 validate_url 函式
$url = ($var1) ? $var1 : $var2;
後面加入
// encode url 
$url = $this->encode_url($url);
找尋
return ($var1) ? '='.$this->bbcode_specialchars($url).':'.$this->bbcode_uid.'' . $var2 . '[/url:' . $this->bbcode_uid . ']' : ':'.$this->bbcode_uid.'' . $this->bbcode_specialchars($url) . '[/url:' . $this->bbcode_uid . ']';
取代
return ($var1) ? '='.$this->bbcode_specialchars($url).':'.$this->bbcode_uid.'' . $var2 . '[/url:' . $this->bbcode_uid . ']' : ':'.$this->bbcode_uid.'' . urldecode($this->bbcode_specialchars($url)) . '[/url:' . $this->bbcode_uid . ']';
測試結果,請參考此網址:Re: 討論區判斷含中文鏈結的 bug

[FreeBSD] update apache -> 2.2.15, PHP -> 5.3.2, and MySQL downgrade to 5.1.9

昨天升級了 FreeBSD 的 Apache, PHP, and MySQL,遇到很多地雷阿,最多的就是 PHP 的部份,因為本來自己使用 5.2.11 版本,但是在 commit port 的時候發生去裝 5.3.2 版本,所以就直接砍掉全部重練,先是遇到 MySQL 問題,原先在 database/mysql60-server 已經被 FreeBSD 移除,任何關於 mysql60 的相關 port 都被 remove 掉了,只好 downgrade 到 mysql 5.1.48 版本,移除同時順手把 apache PHP 相關都拿掉了。

移除 apache mysql php 相關 ports

-rf 依序找尋相關 Mysql ports 移除
pkg_deinstall -rf mysql60-server
接下來安裝 MySQL 5.1.48 Server and Client,可以找到在 databases/mysql51-server and databases/mysql51-client,直接安裝即可
cd /usr/ports/databases/mysql51-server && make install
安裝 Apache 2.2.15
cd /usr/ports/www/apache22 && make WITH_MPM=worker install
安裝 PHP 5.3.2,FreeBSD 把 5.2.X 跟 5.3.X 分開不同資料夾 lang/php5, lang/php52,extension 也是分成兩個,所以要安裝 5.2 版本也是可以的
cd /usr/ports/lang/php5 && make install
cd /usr/ports/lang/php5-extensions/ && make install
以上安裝好,就是苦難的開始,首先 MySQL 從原本的 6.0.9 降到 5.1.48,造成所有資料庫無法讀取,也沒辦法正確啟動 MySQL,馬上噴出底下問題:
090205 11:14:24 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql /usr/local/libexec/mysqld: Unknown collation ‘#46’ in table ‘plugin’ definition 090205 11:14:24 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it. 090205 11:14:24 InnoDB: Started; log sequence number 0 46429 090205 11:14:24 [ERROR] Fatal error: Can’t open and lock privilege tables: Unknown collation ‘#46’ in table ‘host’ definition
為啥會出現紅色那段字,就是因為字元集不同,MySQL 6 有支援 utf8mb4,但是 5.1.48 版本沒有,所以才會造成無法啟動,解決方法呢?就是把 /var/db/mysql/mysql 砍掉,在重新啟動就可以了,當然您的資料庫也是無法使用,再去其他電腦裝上 MySQL 6.0.9 之後,把 /var/db/mysql/ 底下的資料庫 Copy 過去一份,利用 mysqldump 把全部資料庫 dump 下來,再 restore 回去原來的系統,大致上就可以了。 對於把 PHP 升級到 5.3 的時候,心裡就在想會遇到很多雷,果然是如此,很多 opensource 都尚未支援到 php 5.3,也因此很多函數都無法支援,ereg_ 系列都必須換成 preg_register_globals 的移除,也不能使用 HTTP_GET or HTTP_POST,把 register_long_arrays 拿掉,參考: http://php.net/manual/en/ini.core.phpCodeIgniter V 1.7.2 開始支援 PHP 5.3.0 版本,這樣大致上所有專案都可以順利啟動,底下是在 WordPress 遇到的問題:
Warning: strtotime() [function.strtotime]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Helsinki’ for ‘EEST/3.0/DST’ instead in /path/to/my/www/wp-includes/functions.php on line 35
這在 WordPress 官網也是有提出此問題,解決方式有兩種,一種是在 wp-config.php 加上 date_default_timezone_set(‘UTC‘); 或者是 date_default_timezone_set(‘Asia/Taipei‘);,另一種是修改 php.ini,修改
; Defines the default timezone used by the date functions
date.timezone = Asia/Taipei
這樣大致上修補完成,其他程式的修改這裡就不補充了,底下是 PHP 網站所支援的 time zone,可以參考看看其他時區 Reference: Php 5.3.0 & WP 2.8 (It is not safe to rely on the system’s timezone) Description of core php.ini directives 現在寫 PHP6-compatible 的一些技巧 List of Supported Timezones

[Linux Kernel] 撰寫簡單 Hello, World module (part 1).

來筆記如何在 Kernel 撰寫 hello world! module,在 Ubuntu Kernel 2.6.31-14 環境下撰寫,其實不難啦,首先先進入 Kernel 目錄,請在 /usr/src 底下看自己的系統版本,或者是利用 uname -r 來知道 Kernel 版本,底下是在 Ubuntu Kernel 2.6.31-14 Kernel 實做:

進入 Kernel 目錄

#
# cd Kernel directory
#
cd /usr/src/linux-headers-2.6.31-14-generic-pae

建立 hello 目錄

#
# mkdir directory
#
mkdir hello

建立 Makfile 以及 hello.c

hello.c:
#include  /* pr_info 所需 include 檔案*/
#include 
#include  /* 所有 module 需要檔案*/
#include 

MODULE_DESCRIPTION("Hello World !!");
MODULE_AUTHOR("Bo-Yi Wu ");
MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
    pr_info("Hello, world\n");
    pr_info("The process is \"%s\" (pid %i)\n", current->comm, current->pid);
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye\n");
}

module_init(hello_init);
module_exit(hello_exit);
Makefile:
#
# Makefile by appleboy 
#
obj-m       += hello.o
KVERSION := $(shell uname -r)

all:
    $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

clean:
    $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
之後只要切換到 hello 目錄,直接打 make 就可以產生出 hello.ko 檔案,直接載入 hello.ko 方式:
insmod ./hello.ko
移除 hello.ko
rmmod ./hello.ko
之後到 /var/log/message 底下就可以看到訊息: Kernel Hello World

WordPress 3.0 Release “Thelonious”

WordPress 在6月17日 Release 3.0 版本名稱:Thelonious,官方部落格 WordPress 3.0 “Thelonious”,使用者可以在這裡下載,或者是利用後台方式升級,這次更新了 1,217 bug 修正以及功能增加,可以看底下官方網站影片: 大家可以參考 3.0 版本更詳細介紹,以及 long list of issues in Trac。感謝 218 位 contributors 為 3.0 的貢獻,目前官方也繼續開始邁向 3.1 的開發。

[phpBB3 外掛] 根據使用者文章數目限制簽名檔顯示

前一篇提到:『[教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”』,本篇會將其做成後台,方便管理者可以從後台管理,這次加上一個新功能:『限制使用者顯示簽名檔』,根據使用者文章數量來決定是否顯示簽名檔,可以避免想要來打廣告的新註冊使用者,限制文章數量是一種方式,但是也不是最好的方式,phpBB3 本身可以在後台限制是否顯示使用者簽名檔,不過我想各大站長都會開放此功能,好讓使用者可以放個人網站或者是部落格,底下是外掛安裝方式:

安裝

打開 includes/acp/acp_board.php 找尋
#
# Find
#
'max_sig_img_height' => array('lang' => 'MAX_SIG_IMG_HEIGHT',        'validate' => 'int:0',  'type' =>    'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
後面加上
#
# after add
#
'max_sig_post_count_limit' => array('lang' => 'MAX_SIG_POSTS_LIMIT',   'validate' => 'int:0',  'type' =>    'text:5:4', 'explain' => true),
打開 viewtopic.php 找尋
#
# Find
#
if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
取代
#
# Replace
#
if (($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs') && $row['user_posts'] >=                               $config['max_sig_post_count_limit']) || (isset($user->data['session_admin']) && $user->data['session_admin']))

中文化

打開 language/zh_cmn_hant/acp/board.php 找尋
#
# Find
#
'MAX_SIG_URLS_EXPLAIN' => '會員簽名檔中允許的最多連結數量。設定為 0,表示沒有限制。',
後面加上
#
# after add
#
'MAX_SIG_POSTS_LIMIT' => '簽名檔顯示與否',
'MAX_SIG_POSTS_LIMIT_EXPLAIN' => '會員文章數量超過多少才會顯示。設定為 0,表示沒有限制。',
請先參考 [教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”,在依照底下安裝改成後台

安裝

打開 includes/acp/acp_board.php 找尋
#
# Find
#
'allow_sig_links' => array('lang' => 'ALLOW_SIG_LINKS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
後面加上
#
# after add
#
'allow_sig_nofollow' => array('lang' => 'ALLOW_SIG_NOFOLLOW', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
打開 viewtopic.php 找尋
#
# Find
#
$bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield'], true);
取代
#
# Replace
#
$check = ($config['allow_sig_nofollow']) ? true : false;
$bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield'], $check);

中文化

打開 language/zh_cmn_hant/acp/board.php 找尋
#
# Find
#
'ALLOW_SIG_SMILIES' => '允許在會員簽名檔中使用表情符號',
後面加上
#
# after add
#
'ALLOW_SIG_NOFOLLOW' => '增加會員簽名檔中網址連結設定 rel="nofollow"',
展示圖: phpBB3_02 phpBB3_01 phpBB3_03

[教學] phpBB3 使用者簽名檔 url 連結加上 rel=”nofollow”

基於 Moztw 討論區 有大陸使用者註冊之後,在簽名檔加入一些廣告連結,為了降低 Google Page Rank,所以我們必須指示搜尋引擎「不要前往此網頁上的連結」或是「不要前往此連結」,可以參考 關於 rel=”nofollow”phpBB3 編輯三個檔案就可以了,此修改不影響文章內容,只有針對簽名檔作用,底下是 patch 程式碼,可以參考看看 includes/bbcode.php
--- phpBB3/includes/bbcode.php  2010-03-06 04:37:23.000000000 +0800
+++ www/includes/bbcode.php     2010-06-10 20:58:02.000000000 +0800
@@ -2,7 +2,8 @@
 /**
 *
 * @package phpBB3
-* @version $Id$
+* @version $Id: bbcode.php 9461 2009-04-17 15:23:17Z acydburn $
+* @log 2010-06-10 appleboy $
 * @copyright (c) 2005 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
@@ -48,7 +49,7 @@
        /**
        * Second pass bbcodes
        */
-       function bbcode_second_pass(&$message, $bbcode_uid = '', $bbcode_bitfield = false)
+       function bbcode_second_pass(&$message, $bbcode_uid = '', $bbcode_bitfield = false, $bbcode_is_sig = false)
        {
                if ($bbcode_uid)
                {
@@ -110,6 +111,13 @@
                                                }

                                                $message = preg_replace($preg['search'], $preg['replace'], $message);
+
+                                               /*
+                                                * 2010.06.10 add search nofollow module by appleboy
+                                                */
+                                               $replace = ($bbcode_is_sig === true) ? 'rel="external nofollow"' : '';
+                                               $message = preg_replace("/\{NOFOLLOW\}/i", $replace, $message);
+
                                                $preg = array('search' => array(), 'replace' => array());
                                        }
                                }
styles/Moztw-2009-1.0.6/template/bbcode.html
--- phpBB3/styles/subsilver2/template/bbcode.html       2010-03-06 04:37:24.000000000 +0800
+++ www/styles/Moztw-2009-1.0.6/template/bbcode.html    2010-06-10 17:20:32.000000000 +0800
@@ -52,7 +52,7 @@

 {L_IMAGE}

-{DESCRIPTION}
+{DESCRIPTION}

 {DESCRIPTION}
www/viewtopic.php
--- phpBB3/viewtopic.php        2010-03-06 04:37:23.000000000 +0800
+++ www/viewtopic.php   2010-06-10 20:27:06.000000000 +0800
@@ -1342,7 +1278,8 @@

                if ($user_cache[$poster_id]['sig_bbcode_bitfield'])
                {
-                       $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$pos
ter_id]['sig_bbcode_bitfield']);
+                       // 2010.06.10 add search nofollow module by appleboy
+                       $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$pos
ter_id]['sig_bbcode_bitfield'], true);
                }

                $user_cache[$poster_id]['sig'] = bbcode_nl2br($user_cache[$poster_id]['sig']);

[PHP] 好用 Debug PHP 工具 FirePHP for FireFox on CodeIgniter

FirePHP
之前介紹過 javascript FireFox Debug 工具 FireBug (Using firebug for firefox 除錯 javascript),今天來介紹 PHP 除錯工具 FirePHP,它可以輸出 PHP 資料到 FireBug console 介面,方便解決 PHP 相關問題,而不會去影響線上網站的畫面,安裝方式非常簡單,請先安裝 FireFox addon for FirePHP,重新啟動 FireFox 這樣就安裝成功了,接下來就是 include FirePHP Library 檔案,就可以正常使用了。另外還會介紹如何安裝到 CodeIgniter PHP Framework Firebug: https://addons.mozilla.org/en-US/firefox/addon/1843 FirePHP: https://addons.mozilla.org/en-US/firefox/addon/6149 底下先看畫面:
$array = array("a" => "1", "b" => "2");
$firephp->info($array, "info");
$firephp->warn($array, "warn");
$firephp->error($array, "error");
FirePHP

Install FirePHP 安裝

Ref : http://www.firephp.org/HQ/Install.htm 在 Zend Framework 已經有開發完成,可以參考:FirePHP and Zend Framework 1.6 下載檔案:Download FirePHPCore library version 0.3.1

unzip FirePHP (解壓縮)

您會發現 FirePHPCore 底下有四個檔案,其中 fb.php && FirePHP.class.php 給 PHP 5 用的,另外兩個 fb.php4 && FirePHP.class.php4 則是給 PHP 4 專屬,本文只會以 PHP 5 當作範例。

include FirePHP file

新增一個 index.php 檔案,在最上面寫入:
require_once('FirePHPCore/FirePHP.class.php');

Start output buffering

假設您在 php.ini 有設定 output_buffering 為 on,就可以省略此步驟
ob_start();

測試完整檔案

10, 'j'=>20);
$firephp = FirePHP::getInstance(true); 
$firephp->log($var, 'WARN');
?>
FirePHP 預設是啟動的,如果您要將此關閉,可以使用底下程式碼將其關閉:
  /**
   * Enable and disable logging to Firebug
   * 
   * @param boolean $Enabled TRUE to enable, FALSE to disable
   * @return void
   */
$firephp->setEnabled(false);
也可以自訂選項: maxObjectDepth 顯示 object 資料深度 maxArrayDepth 顯示 array 資料深度 useNativeJsonEncode 設定為 false 就是代表使用 FirePHPCore 內建 JSON encoder 來取代 PHP 內建 json_encode()。 includeLineNumbers 顯示檔案名稱以及行號資訊
// Defaults:
$options = array('maxObjectDepth' => 10,
                 'maxArrayDepth' => 20,
                 'useNativeJsonEncode' => true,
                 'includeLineNumbers' => true);

 

Install FirePHP on CodeIgniter

1. move fb.php and FirePHP.class.php into system/application/libraries directory. 2. rename FirePHP.class.php to Firephp.php, and fb.php to Fb.php. 3. edit Firephp.php file.
#
# Find  
#
Fb.php file

#
# Find  
#
config/autoload.php file

#
# Find
#
$autoload['libraries'] = array();
#
# Replace
#
$autoload['libraries'] = array("firephp", "fb");

How to use it?

function index()
{
  $a = "test";
  $array = array("a" => "1", "b" => "2");		
  //$this->firephp->log($a, 'ERROR');
  //$this->firephp->log($a, 'ERROR');    
  $this->fb->setEnabled(true);    
  $this->fb->info($array, "info");
  $this->fb->warn($array, "warn");
  $this->fb->error($array, "error");
  $this->fb->group('Test Group');
  $this->fb->log('Hello World');
  $this->fb->groupEnd();
}