本館粉絲專頁

使用者:台灣阿成/我的工作日誌/2005/12

分享此網頁到Facebook
分享此網頁到Plurk
分享此網頁到百度搜藏
分享此網頁到Twitter
分享此網頁到Del.icio.us
最近作者:台灣阿成 2006年1月3日 (星期二)08:58
台灣棒球維基館
跳轉到: 導覽搜尋

目次

[編輯] 12/5修改用戶列表程式

問題:原用戶列表程式依名稱排序,想要依用戶註冊順序(即ID)排序。

  • 將 SpecialListuser.php 複製成 SpecialListuserbyid.php。
  • 再修改 SpecialListuserbyid.php。
  • 本來這樣:
class ListUsersPage extends QueryPage {
...	
	function getName() {
		return "Listusers";
...	
	function getSQL() {
		return "SELECT ur_rights as type, $userspace as namespace, user_name as title, " .
			"user_name as value FROM $user LEFT JOIN $user_rights ON user_id = ur_user";
	}
...
	function formatResult( $skin, $result ) {
...
		if( '' != $result->type) {
			$name .= ' (' .
			$skin->makeLink( wfMsgForContent( 'administrators' ), $result->type) .
			')';
		}
...

/**
 * constructor
 */
function wfSpecialListusers() {
...
	$slu = new ListUsersPage();
...

  • 改成這樣:
class ListUsersbyidPage extends QueryPage {
...	
	function getName() {
		return "Listusersbyid";
...	
	function getSQL() {
		return "SELECT ur_rights as type, $userspace as namespace, user_name as title, " .
			"user_id as value FROM $user LEFT JOIN $user_rights ON user_id = ur_user";
	}
...

	function formatResult( $skin, $result ) {
...
		if( '' != $result->type) {
			$name .= ' (id=' . $result->value . '; ' .
			$skin->makeLink( wfMsgForContent( 'administrators' ), $result->type) .
			')';
		} else {
			$name .= ' (id=' . $result->value . ')' ;
		}
...


/**
 * constructor
 */
function wfSpecialListusersbyid() {
...
	$slu = new ListUsersbyidPage();
...

  • 再修改 SpecialPage.php
 $wgSpecialPages = array(
 //...
 //加這一行
	'Listusersbyid'         => new SpecialPage( 'Listusersbyid' ),
 //...
'listusers'		=> 'User list',
'listusersbyid'		=> 'User list, sorted by UserID',   <-- 加這一行
'listadmins'	=> 'Admins list',
  • 然後進特殊頁面/系統介面,把這行訊息改成中文即可。

[編輯] 12/6撰寫程式轉換Log檔格式

  • 花了一整天時間,寫了幾支程式來將Log檔格式轉換成一致(見:檢索記錄檔)。這樣就可以很容易的匯入EXCEL進行檢索記錄的統計分析了。
  • 心得:眼睛開始老花了,看程式碼看到有點頭昏眼花。

[編輯] 12/8 RecentchangesA程式

  • Recentchanges程式可用來檢視「X天內」或「某時間點之後」的更改;
  • 改寫成RecentchangesA:可以檢視「X天前」或「某個時間點之前」的更改。
  • 目前能Work,但介面未完善。另發現Recentchanges最多只紀錄2千多筆。

[編輯] 12/9整理Log檔

把serchLog檔略做整理:

  • logs/utf-8_old資料夾:
    • 紀錄格式還未統一前的原始Log檔放在這裡面(searchLogxxxxxx.txt,以UTF-8編碼)。
  • logs/big5_new_excel資料夾:
    • 為了匯入Excel進行統計分析,先把UTF-8編碼的Log檔轉存成Big5編碼格式放進這裡面(searchLogxxxxxx.txt),再以PHP程式轉換成統一的記錄格式(searchLogxxxxxx_new.txt),然後匯入Excel準備作進一步分析(searchLog.xls)。
  • logs資料夾:
    • 轉換成統一紀錄格式後的Log檔(searchLogxxxxxx_new.txt),從Big5轉存成UTF-8編碼(searchLogxxxxxx.txt)取代原來的檔案,存放在這裡。另外,也改寫程式將記錄檔的路徑指到此處。

[編輯] 12/10使用者記錄檔

  • 在index.php中加入記錄user actions的程式:
// to record the user actions
global $wgIP;
$fp = fopen("logs/actionLog" . date("Ymd") . ".txt","a");
$date = date("Y-m-d,H:i:s");
if ( isset( $_SESSION['wsUserName'] ) ) {
	$sUser = "User" . "," . $_SESSION['wsUserName'];
} else {
	$sUser = "IP" . "," . $wgIP;
}
$outputstring = $date. "," . $title . "," . $action . "," . $sUser . "\n";
fwrite($fp, $outputstring);
fclose($fp);
//
  • 因資料量很大,所以先採用一日一檔方式,如果還是很大,將來可考慮採用一小時一檔來儲存。
  • 測試:約凌晨1點至早上11點半。
  • 結果:檔案果然很大!!才測試半天就將近1.5MB,先把Link拿掉,以免被點選,誤認為當機。
  • 問題:因程式放在index.php中,所以只要有人點閱就會紀錄。但從記錄下的資料來看,似乎有些使用者會被重複紀錄,需再Debug。

[編輯] 12/11 完成actionLog程式

  • 修改程式使其能依日期、時間自動產生資料夾和檔案:每日一個資料夾,每小時一個檔,存在searchLogYYYYMMDDHH.txt檔案中,其中YYYYMMDDHH分別為年、月、日、時。
  • 程式中加入判斷若$title為"-"或"",或$action為"raw"(暫時不知此action何用?),則不予紀錄。
  • 修改完成的程式碼(在index.php中):
...
// to record the user actions
	global $wgIP;
	$path = "logs/actionLogs/" . date("Ymd");
	$filename = "/actionLog" . date("YmdH") . ".txt";
	if(!is_dir ($path)) {
		mkdir($path);
	}
	$fp = fopen($path . $filename,"a");
	$date = date("Y-m-d,H:i:s");
	if ( isset( $_SESSION['wsUserName'] ) ) {
		$sUser = "User" . "," . $_SESSION['wsUserName'];
	}
	else {
		$sUser = "IP" . "," . $wgIP;
	}

	$outputstring = $date. "," . $sUser . "," . $action . "," . $title . "\n";
	if ($title != "" and $title != "-" and $action != "raw") {fwrite($fp, $outputstring);}
	fclose($fp);
...

[編輯] 12/12 修改searchLog程式

  • 在searchLog中記錄找到的資料數:
    • -1:表示使用者找到百分之百符合的頁面,且直接進入閱讀;
    • 0:表示使用者沒有找到任何符合的頁面;
    • >0:表示使用者找到標題或內容符合的頁面,不過僅記錄顯示的第一頁清單數量。

待解決問題:

  • 12月份的searchLog檔有兩種格式混雜,要人工調整一下。
  • 這一兩天註冊的使用者,若用中文帳號會亂碼。(資料庫內另一個名稱欄位也亂碼了)
  • 在寫梅花旗時發現NDAPNews有兩篇新聞未拆:1222312255
  • NDAPNews的新聞日期、新聞來源拿到上面。

[編輯] 12/23 紀錄頁面Counter完成

  • 為使actionLog檔能紀錄「頁面瀏覽次數」,更改 index.php 中的紀錄程式如下。
  • 結果:2005-12-23,00:57:12,User,台灣阿成,view,首頁,645762
// to record the user actions to actionLog files
// begin
	global $wgIP;
	$path = "logs/actionLogs/" . date("Ymd");
	$filename = "/actionLog" . date("YmdH") . ".txt";
	if(!is_dir ($path)) {
		mkdir($path);
	}
	$fp = fopen($path . $filename,"a");
	$date = date("Y-m-d,H:i:s");
	if ( isset( $_SESSION['wsUserName'] ) ) {
		$sUser = "User" . "," . $_SESSION['wsUserName'];
	}
	else {
		$sUser = "IP" . "," . $wgIP;
	}

// 加這兩行:
	$count = $wgArticle->getCount();
	if ( !$count ) { $count = "Null"; }

// 改這一行:
	$outputstring = $date. "," . $sUser . "," . $action . "," . $title . "," . $count . "\n";
	if ($title != "" and $title != "-" and $action != "raw") {fwrite($fp, $outputstring);}
	fclose($fp);
// end

[編輯] 12/28 顯示貢獻者

  • 修改 Credits.php, DefaultSetting.php 和 Article.php 三支程式,使得每個頁面最下方,可以顯示出最近N位貢獻者(目前設定為3位)。此外,還改了系統介面訊息lastmodifiedby 和 othercontribs。
  • DefaultSetting.php:
$wgMaxCredits = 3;
  • Credits.php
function showCreditsPage($article) {
...
		$s = getCredits($article, $wgMaxCredits, $wgShowCreditsIfMax);
...

function getCredits($article, $cnt, $showIfMax) {

...
		$s .= ' ' . getContributorCredits($article, $cnt - 1, $showIfMax);
...

function getAuthorCredits($article) {
...
//			$author_credit = wfMsg('siteuser', creditLink($user_name));
			$author_credit = creditLink($user_name);
...

function getContributorCredits($article, $cnt, $showIfMax) {
...

//        $user = wfMsg('siteusers', $user);
    }
...
  • Articles.php:
function getContributors($limit=0, $offset = 0) {
...
/*
		$sql = "SELECT old_user, old_user_text, user_real_name, MAX(old_timestamp) as timestamp
			FROM $oldTable  LEFT JOIN  $userTable  ON old_user = user_id
			WHERE old_namespace = $user
			AND old_title =  $encDBkey
			AND old_user != $user
			GROUP BY old_user, old_user_text, user_real_name
			ORDER BY timestamp DESC";
*/

$sql = "SELECT old_user, old_user_text, user_real_name, MAX(old_timestamp) as timestamp FROM old LEFT JOIN user ON old_user = user_id
WHERE old_namespace = 0 AND old_title =  " . $encDBkey . " AND old_user != " . $user . " 
GROUP BY old_user, old_user_text, user_real_name
ORDER BY timestamp DESC";

...
  • lastmodifiedby 由「This page was last modified $1 by $2.」 --> 改成「近期作者:$2」
  • othercontribs 由「Based on work by $1.」 --> 改成 「,$1 <br>」
  • 結果:(以首頁為例)
    • 修改前:This page was last modified 08:40 2005年12月29日by幻象兩千Based on work by yarachen, 台灣阿成 和 others
    • 修改後:近期作者:幻象兩千, yarachen, 台灣阿成 和 others