wordpress2.8 release了

真是好消息, wordpress 2.8 release 了, 請參考: http://wordpress.org/development/2009/06/wordpress-28/ , 不過, 回到 http://mu.wordpress.com/ 時, 發現 mu 版本並未一併更新, 通常應該會遲一點, 不過可以先看看官方 blog 中的 wordpress 2.8 介紹, 先了解一下新增的功能.

屆時有 wordpress for mu 2.8 release 時, 再來進行升級更新, 不過其實目前的 wordpress for mu 我已經覺得很好用也很方便了, 期待它的新版本更新, 能修掉一些 bug 並強化更多功能.

查詢分割資料表的資料存放位置

由於資料量龐大, 為能改善效能, SQL Server 2005 增加了 Partition Table 功能將 table 依 partition function 來做分塊”橫切”的方式存放, 以將常用資料及不常用資料(如歷史訂單資料), 做實體的存放位置劃分, 讓它實際上是同一個表, 但在存放上是在不同的 filegroup 上, 如此一來, 便能有效將資料表做分塊(分區橫切)管理, 若是 partition function 切割有效的話, 對於查詢應用及備份應用應該會有非常大的幫助.

接下來, 我們需要了解的是實作完成後的 partition table 內, 各分區的資料存放筆數狀況, 可以利用兩個系統表來操作取得, 分別為:

  1. sys.partitions : (http://msdn.microsoft.com/zh-tw/library/ms175012.aspx)
  2. sys.dm_db_partition_stats: (http://msdn.microsoft.com/zh-tw/library/ms187737.aspx)

若是要取得某 table 名為 tblTest 這個 table 在各 partition table 中的存放筆數, 可以利用這個查詢:

[SQL]

SELECT ps.partition_number
,ps.row_count, ps.index_id
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.partitions p
ON ps.partition_id = p.partition_id
AND p.[object_id] = OBJECT_ID(‘tblUsers’)

[/SQL]

這樣取得的結果, 一般若非 partition table, 會得到一筆資料, 例如:

d1

其中三個欄位說明如下:

  • partition_number: 指對應的資料分割編號(以1為基礎), 把他想成存放的分區代碼
  • row_count: 這個就是資料筆數
  • index_id: 這個很重要, 0為堆積, 1為clustered, 2以上為non-clustered

若是有無切分 partition table , 但又有多個 index 的 table 會得到如下結果:

d2

其中, 就是 1為clustered, 而9, 11, 12為 non-clustered 的資料.

再來就是看有切 partition table 的結果:

d3

這個案例來自於這篇文章: [SQL Server]如何將現有table調整為partition table (http://bbs.diary.tw/viewtopic.php?f=13&t=464)

其中, 可以清楚地看到 index_id 為0的, 是 partition_number 為1, 2, 3的資料存放筆數狀況, 而 index_id為2的是後來利用增加 primary key non-clustered index 的方式加入的索引, 得到總筆數的一個 index 存放狀況.

簡而言之, 資料存放的方式為 parititon1 放了 2筆, partitiona2放了 3筆, partition3放了4筆資料, 這樣的查詢結果對於要查目前的 partition table內存放資料的對應 parition 狀況應該就有很清楚的結果呈現了.

更新WPMU版本至2.7.1

這個網站原來是用 2.3.3 的版本, 但是因為版本到 2.7 之後的後台介面有長足的改善, 所以進行更新.

不過困難在於要由 1.3.3 (2.3.3) 更新到 1.5.1, 然後再升到 2.6 再升到 2.7.1, 真的很麻煩, 於是利用匯出匯入的方式, 重新安裝好 WPMU 2.7.1 之後, 再進行匯入完成.

陸續補上了 theme 及 pluglin 就完成了. 真的介面改善不少哦, 功能似乎也更強大了

SQL Server如何新增article到publication

在使用 Replication 時, 若是使用 Transaction 的方式, 若有要新增 article 到 publication 時, 其實很容易.

基本上就只要在原來的 publication 的 property 裡的 articles, 多加上需要 replication 出來的article, 完成後, 他不會自動進行後續, 接下來的動作就是做 snapshot 就行了, 這裡比較討厭的是若是原來的publication資料多, 而加入的 article資料少, 其實很不划算, 不過做完 snapshot 後, replication 機制會開始將該新發行的article schema傳給 subscriber, 讓 subscriber 將沒有的資料寫入, 這樣就完成了.

其實只會做新的部分, 不過因為還是要一個 schema及起始資料, 所以還是得做一個 snapshot 是比較吃資源的地方, 和 alter table的狀況又不太一樣了. 不過操作上還是很直覺也很方便!

參考SQL Server 2005 help 資料: http://msdn.microsoft.com/en-us/library/ms152493(SQL.90).aspx

其中比較重要的是這段:

After adding an article to a publication, you must create a new snapshot for the publication (and all partitions if it is a merge publication with parameterized filters). The Distribution Agent or Merge Agent then copies the schema and data for the new article to the Subscriber (it does not reinitialize the entire publication).

也就是說, 新增完了之後, 要做一次 snapshopt, 不過 agent 會將新的 article 送到 subscriber, 而不會整個 reinitialize!

SQL Server Replication下的異動資料表

若是SQL Server已設定完成Replication的Article時, 進行資料表異動, 其實會透過 DDL 傳送的方式, 將異動的指令也透過複寫的方式送出, 並進行同步. 可以參考相關文章: http://www.replicationanswers.com/AlterSchema2005.asp

不過若是異動的欄位是 Primary Key時, 將會觸發 exception, 發出如下的訊息:

Msg 4929, Level 16, State 1, Line 2
Cannot alter the table ‘tbltest’ because it is being published for replication.

如此一來便無法使用這種 ddl 傳遞的方式將 Replicated Table 的異動送出. 若是要執行這樣的異動需求, 得先解除掉發行及訂閱此 table, 才能進行調整, 調整完成後才能再重新設定回發行及訂閱, 接下來再做 snap shot 進行遞送出去.

如何讓IIS只佔用指定IP

在 IIS 中的站台設定, 可以明確地指定單一站台的 IP及 PORT, 不過無論如何設定, 預設 IIS 就會在發起 SERVICE 時, 佔用 0.0.0.0 這個 IP (也就是全部的 IP), 若是希望 IIS 不要佔用這個 IP (也就是希望能和其他佔用 80 PORT 的 SERVICE, 如 APACHE 共同使用同一台主機的狀況下), 可以利用 Support Tools 內的 httpcfg 工具來進行操作, 詳細步驟如下:

1. Click Start, and then click Run.
2. Type cmd, and then click OK to open a command prompt.
3. Type the following, where xxx.xxx.x.x is the IP address you want to add:

httpcfg set iplisten -i xxx.xxx.x.x
When this succeeds, Httpcfg returns the following:
HttpSetServiceConfiguration completed with 0To view additional status codes, see the Httpcfg help.

4. After the IP address is added, use the following command to list it:

httpcfg query iplisten
Httpcfg returns the following:
IP :xxx.xxx.x.x

5. From the command prompt, stop the HTTP service and its dependent services. To do this, type the following string at the command prompt:

net stop http /y

6. From the command prompt, restart the HTTP service and it dependent services. To do this, type the following string at the command prompt:

net start w3svc
Note When you start w3svc, all services that were stopped when HTTP was stopped will start.

進行指定 IP 的操作後, 之後 IIS 就只會佔用指定的 IP, 而不會佔用全部的預設 IP 0.0.0.0 囉! 請參考微軟 KB 資料: http://support.microsoft.com/kb/813368

SQL Server釋放記憶體方式

若是 SQL Server 2005有突發性的記憶體不足的問題, 可能是一個 bug, 可以參考: http://support.microsoft.com/kb/912439 , 也有可能是記憶體配置的問題, 不過無論如何, 很有可能造成系統的重大負擔而其他服務或 terminal service無法工作, 有個比較快速的解決方式是先清除 server 內的記憶體快取的部分, 可以使用以下幾個指令來處理:

  1. DBCC FREESYSTEMCACHE : 可以參考: http://msdn.microsoft.com/en-us/library/ms178529.aspx
  2. DBCC FREESESSIONCACHE: 可以參考: http://msdn.microsoft.com/en-us/library/ms187781.aspx
  3. DBCC FREEPROCCACHE: 可以參考: http://msdn.microsoft.com/en-us/library/ms174283.aspx

這樣可以快速地爭取到一些 SQL Server釋放出來的記憶體, 並登入 SQL Server 主機進行操作或 reboot, 以降低對系統的傷害.

通常會發生這樣的狀況, 有些是因為記憶配置的問題, 也有 svchost.exe 在網路上使用過量的記憶體等狀況, 但無論如何, 能先爭取登入主機並進行一些急救處理, 以整理或釐清問題所在是相當重要的.

ps. 若要都用預設釋放的指令如下:

DBCC FREESYSTEMCACHE(‘ALL’)
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE WITH NO_INFOMSGS

可以很快地救急.

真是不錯的SyntaxHighlighter-Plus

之前一直在找可以在 wordpress mu 版本下可用的 syntax highlighter, 試了許多都沒辦法很順利的使用, 到昨天找到了一個算可以用的版本, SyntaxHighlighter-Plus (連結). 怎麼說算可以用呢? 主要是因為他的目錄命名會和 wordpress mu內的urlrewrite 會有一些衝突, 因為他的目錄也有用到 “files” 這個關鍵字, 解決方式很簡單, 就是將 syntaxhighlighter-plus目錄內的 files 目錄改名, 並配合調整一下即可, 我將原來的 source 改了一下, 放到這裡來方便 wordpress mu 的用戶來安裝! SyntaxHighlighter-Plus for wordpress mu

使用方式原作者的說明很詳細了, 就是解壓安裝至 plugins 目錄後, 到後台啟用, 再於撰寫文章時, 切換至 “code”模式下(主要是避免 < > 角括號(小於, 大於符號會被 wordpress 編輯器改寫為 < 及 >), 使用[sourcecode language=’xxx’]程式碼[/sourcecode]的方式將程式碼包住就可以達到語法高亮的效果, 範例如下:

[php]// default display_errors value is on
ini_set(‘display_errors’, Off);
$display_errors = ini_get(‘display_errors’);
echo “display_errors=$display_errors
“;
echo “1/0
“;
$a = 1/0; // nothing happened.
ini_restore(‘display_errors’);
echo “1/0
“;
$a = 1/0;
[/php]
要特別注意的是即使第一次使用了 “code” 編輯模式存檔, 再編輯時, wordpress 編輯器仍會再做 > < 的轉碼, 這個是很討厭的一個麻煩問題.

這套程式一樣基於 dp.SyntaxHighlighter 的程式碼開發, 看了一下 for wordpress 的這個版本, plugin 的作者很貼心的設計了多組參數來簡化輸入, 如下:
* `〔source language=’css’〕code here〔/source〕`
* `〔code language=’css’〕code here〔/code〕`
* `〔sourcecode lang=’css’〕code here〔/sourcecode〕`
* `〔source lang=’css’〕code here〔/source〕`
* `〔code lang=’css’〕code here〔/code〕`
* `〔sourcecode=’css’〕code here〔/sourcecode〕`
* `〔source=’css’〕code here〔/source〕`
* `〔code=’css’〕code here〔/code〕`
* `〔lang=’css’〕code here〔/lang〕`
* `〔css〕code here〔/css〕` (or any of the supported language)
(為避免衝碼, 已經上面的半型方括號改為全形的)

另外還有他會針對該文章內使用的 sourcecode language的不同來進行 dp.SyntanHighlighter 的 js 載入, 例如只有 php 程式碼, 他就只載入 shBrushPhp.js , 當然 shCore.js 是一定都會載入的啦, 這樣的好處就可以節省了一些引入的 javascript 的 js 檔, 也相對比較快. 給各位參考!

找個counter來用用

找一個可以統計文章的 counter 來用用, 有找到一篇文章介紹: Views counter for WordPress, 於是就進行安裝, 由於目前系統環境是在 php 4的關係, 所以使用了原作者建議的 vc.0.07版本使用.

該 plugin會在系統內建立一個table, 用來存放記錄, 內容為文章 id, 訪問者 ip, 以及該 ip 的訪問次數 views, table 內容如下:

table.png

所以文章會依設定狀況顯示出被多少訪客(visitors, viewers)訪問多少次(view times)的資訊. 習慣研究 plugin 寫法的我, 當然先看看該 plugin內容一下, 結果發現有個可以改善的地方, 就是 function get_stats($id) 這個 function, 原來的寫法是查詢兩次, 分別查出訪問次數及訪客數, 而其中訪問次數是查詢出來後再用迴圈做加總, 這個真的不是很理想的方式, 而第二個查詢則是用較正常的 count(*) 方式(aggregation function)來取得訪客數, 其實要改善的主要是第一個先用 sum(views) 改為aggregation function, 把加總的工作改由 db 運算, 再來就是兩個查詢都是用 aggregation function 的話, 可以再合併起來查詢, 更能節省資源, 於是就由原來的:

“SELECT views FROM ” . $table_prefix . “views_counter WHERE (id=’$id’)” + for-loop 取得 $cnt

“SELECT COUNT(*) FROM ” . $table_prefix . “views_counter WHERE (id=’$id’)” 取得 $viewers

改為

“SELECT sum(views),COUNT(*) FROM ” . $table_prefix . “views_counter WHERE (id=’$id’)” 同時取得兩個值.

一次取得兩個值, 並利用 wordpress 的 $wpdb->get_row 配合 ARRAY_N (取得值陣列)的參數調整直接 return 回去即可大幅改善效能. 這個部分我想再通知原作者調整, 讓該插件的效能更好, 取得作者同意後我再將更新的插件連結提供出來.

另外由於 wordpress 本身的設計良好, 所以這個插件在我目前使用的 wordpress mu 也都能順利正常地工作無誤, 若是有使用 wordpress mu的朋友可以放心使用.

[2007/10/1 1:07]
將 cryonyx 放在 google repo 的連結放上來: http://code.google.com/p/views-counter/
並新增版本 vc0.071: http://views-counter.googlecode.com/files/vc.0.071.zip

RSS2才有pubDate啦

由於習慣用手機訂閱rss閱讀blog文章, 但一直覺得 wordpress怪怪的, 怎麼會沒有 pubDate 這個屬性, 因為在訂閱 wordpress 的 rss 時, 在手機上顯示的文章日期總是 0-0 0:00, 於是今天觀察一下的確是沒有這個屬性的, http://tim.diary.tw/rss 試看看, 每個 item 內就只有 title, description, link 三個屬性, 當然不能怪手機的 rss reader 沒有取得文章發表時間囉.

查了一下資料: http://codex.wordpress.org/Customizing_Feeds 發現原來 wordpress 提供了多種 rss 的格式, 一共有: RSS2.0, RSS0.92, RDF, Atom 多種格式, 使用方式就直接用 http://tim.diary.tw/rss2, http://tim.diary.tw/rss, http://tim.diary.tw/rdf, http://tim.diary.tw/atom 這樣就可以了, 然而在 http://tim.diary.tw/ 頁面上就有提供了

<link rel=”alternate” type=”application/rss+xml” title=”Another My Program RSS Feed” href=”http://tim.diary.tw/feed/” /> 

這個 link 了, 所以其實是我用 rss 的關係才造成沒有 pubDate 屬性啦, 真的是誤會一場啦. 趕快把手機上的訂閱連結更一下囉, 果然就有正常的發表時間功能了.

另外上面提供的 http://codex.wordpress.org/Customizing_Feeds 有許多可以自製的 rss 設定及方式, 是相當實用的一篇技術文章, 若是有要自訂特殊格式的需求, 應該很容易調整的!