2010年6月21日星期一

升級WordPress 3.0注意事項

剛剛完成WordPress升級至3.0,其實3.0版沒有太多新驚喜,盡量保持原有結構的簡潔,這亦都是WordPress的優點。
搭建Menu的新功能要Theme支援,剛巧我的未支援,所以試不出有什麼特別。

不過升級3.0有兩樣事要注意:

1. wp-config.php變更
直至2.92版,很多人升級應該都是保留原有wp-config.php,但3.0版比舊版多了幾個authentication keys。
舊版本:
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');

3.0版本:
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',  'put your unique phrase here');
define('NONCE_KEY',  'put your unique phrase here');
define('AUTH_SALT',  'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');

雖然你忽略這些Keys都可以運作正常,不過這些亂數產生的keys和安全性有關,大家可以經由WordPress.org secret-key service取得這些authentication unique keys.

2. 升級時出現Error message:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2964967 bytes) in /home/content/.../html/wp-includes/http.php on line 1363

這錯誤可能會出現在Share hosting上,如果hosting把php.ini中的memory_limit設定少於32M,就有可能會發生,因為WP3.0要求PHP不少於32MB memory。
解決方法最簡單就是升級前,打開wp-config.php,加上這句:
define('WP_MEMORY_LIMIT', '256M' );

如果還解決不到,就試試使用這個Plugin - Memory Bump
http://wordpress.org/extend/plugins/memory-bump/

2010年6月11日星期五

ASP.NET 4.0的ClientIDMode="Static"未必是最好

ASP.NET 4.0新增的ClientIDMode是一項重大的更新,不知這是什麼的話,可以在這裡看看
預設ClientIDMode是Inherit 不過我想大多數人都會把焦點放在ClientIDMode="Static"。

由於預設是Inherit,ClientIDMode會以預設的AutoID去制定Controls ID,或者有人會直接在Page Detective把ClientIDMode設定為"Static"供ClientIDMode去Inherit。
<%@Page ClientIDMode="Static"%>

那就不用每個WebControl都設定一次,但問題就來了,部份Third Party的WebControls未必能可以在Static ID下運作,特別是需要ClientScript做CallBack的,可能會找不到Render HTML後的ID。
目前至少AjaxControltoolKit中的AsyncFileUpload已經要設定ClientIDMode="AutoID"才能正確運作。

而值得看看的是Predictable Mode,Predictable 主要是給Data Control使用,例如Repeater,DataList這些會重複Generate HTML Element的WebControls。
因為當你制定ItemTemplate時,你不可能期望每一項Item中的Controls ID都相同,同樣亦不合理,例如Repeater:
<tr>
<td>
<span id="mySpan">Row1</span>
</td>
</tr>
<tr>
<td>
<span id="mySpan">Row2</span>
</td>
</tr>

所以"Predictable"的出現就是給你設定ClientIDRowSuffix property,自行制定。其實我會建議在DataControl中ItemTemplate或EditTemplate下,所有Web Control都加上ClientIDMode為AutoID或者Predictable,即使設成AutoID感覺上很多餘,但基於有override的可能性,都是加上好一點。

或者ASP.NET老手已經深明這些道理,但剛學ASP.NET的話,亦無需要太追求簡短的ID,這類型ID,"ctl00_ContentPlaceHolder1_HideProductImage",我們都習慣了。

2010年6月10日星期四

Windows 7 安裝廣東輸入法

我輸入中文除了用速成之外,還有用廣東輸入法以輔助,近10年都是這樣,缺一都不可,速成雖然可以應付大部份中文,但有時總會有一些字,你懂得讀,但忘記怎樣寫,這就是為什麼我一直都還使用廣東輸入法了。
多年前買了這個輸入法 - 廣東話輸入法2002,真的不錯。

不過在Windows 7 / Vista 環境下,安裝方法有所不同。
首先建議Right Click安裝程式,以WinXP相容模式起動,安裝後,你還需要一個叫uniime.dll的東西才可以使用。
下載後,把uniime.dll放在
"C:\Windows\System32\" 系統目錄內,如果是64Bit Windows的話,就放在"C:\Windows\SystemWOW64\"
然後照正常新增輸入法即可。

廣東話輸入法2002 Download
uniime.dll Download

Windows Vista / 7 / Server 2008 不能安裝SQL Server 2008 R2解決方法

今天剛安裝好Windows 7後,去Windows Update完全更新後,就下載SQL Server 2008,我的版本是Express R2 64Bit中文版本,但安裝時出現程式錯誤,而且是強行關閉那種,我執行安裝程式的System Configuration Checker,發現出現一個錯誤 : PerfMonCounterNotCorruptedCheck

中文版Error Message :
檢查現有的效能計數器登錄區是否一致。效能計數器登錄區已損毀。若要繼續,您必須修復效能計數器登錄區。如需詳細資訊,請參閱 http://support.microsoft.com/kb/300956。

英文版Error Message :
Checks if existing performance counter registry hive is consistent. The performance counter registry hive is corrupted. To continue, you must repair the performance counter registry hive. For more information, see http://support.microsoft.com/kb/300956.

我唯有試試32Bit版本,結果依然,再試之前原先在Vista上使用的非R2英文版本,竟然錯誤都一樣。



於是我就去http://support.microsoft.com/kb/300956看看,老實說,MS提供的解決方法極度複雜。
我唯有上Google Search "PerfMonCounterNotCorruptedCheck",果然有很多人都有同樣問題,亦有很多不同的建議,但我試過了都不行。
甚至很多人說在[執行]以下的會成功,我都不行。
lodctr /R:PerfStringBackup.INI 

綜合不同受害者的結論,花了幾個小時去研究,最後發現這是Windows語言版本問題,所以為什麼依據別人的方法都不能解決問題。

首先大家要知道我的OS是Windows 7 Ultimate 64Bit 香港中文版 (請注意"香港中文版"了,這是關鍵!)
而問題成因的效能計數器登錄區是藏在registry中的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Perflib\

細看之下,裡面只有[009]和[0404]兩個項目,而大家大概都知道這是LCID,"009"代表英文,"0404"代表台灣中文,那香港中文的"0C04"呢?
假如SQL Server安裝程式會檢查我的OS語系的話,應該大概就是因為這樣沒有"0C04"而錯誤吧?
那我新建一個"0C04"項目,直接由"0404"人手Copy&Paste過"0C04"再重新開機。



再次試試安裝中文版,依然都是一樣,但試英文版64Bit時,竟然可以完成安裝,而且用了兩天都沒有問題。
所以解決方法很明顯就是新建一個自己Windows語系的LCID。
雖然中文版未解決,但我亦覺得用英文版本都沒有所謂。

這是一個十分奇怪的Bugs,當我上網找答案時,連台灣中文的用家都說有這問題,甚至日文,英文,德文的用家都有出現,全部都有一個共同點就是使用Windows Vista / 7 / 2008 Server,顯然這是一個Vista核心在特定情況才出現的Bugs。
但我的Windows 7是Clean Install,只是上了Windows Update的Patch,Windows 7是由MSDN Subscription下載的,所以我個人幾乎肯定香港中文用戶90%會中招。

2010-11-29更新
發現台灣網友同樣出現這個問題,他們都有提供自家的解決方法。
大家可以去參考一下:
安裝MS SQL Server時發生 效能計數器登錄區一致性的錯誤
Win7上安裝SQL2008 效能計數器登錄區一致性的錯誤解決辦法

2010年6月5日星期六

TinyMCE File & Image Browser for ASP.NET

雖然Ajax Control ToolKit已經有HTMLEditor,但這個HTML Editor是由obout開發,並減去很多功能。

而且AjaxControlToolkit一直存在效能問題,同一頁面使用超過兩個以上的Controls就會出現Lag的情況,最明顯是出現有動畫的Control上,如Accordion,CollapsiblePanel等等。HTML Editor問題更甚,我在一個頁面中,放置4個Editor,頁面載入時間由1秒增加至6,7秒,使用IE8 Developer Tool的Profiler觀察,Editor載入時間嚇人,所以都是使用TinyMCE好了,而且TinyMCE已經有jQuery版本,更加要支持一下。

言歸正傳,TinyMCE官方的MCFileManagerMCImageManager都是付費的。所以很多人已經寫了免費的代替Plugin,不過可惜都是PHP版本較多。

剛剛就找到這個ASP.NET版本,而且是OpenSource的,可以Upload / DeleteFile, Insert Url等等,一般使用已經足夠。
netImageBrowser
http://www.ilyax.com/imagebrowser/
netFileBrowser
http://www.ilyax.com/filebrowser/

2010年6月3日星期四

終於收到TechNet Plus和MSDN Subscription通知



若果要說做Microsoft的MVP有什麼好處,我相信除了可以比一舨人快得知微軟內部消息之外,最大權益就是TechNet Plus和MSDN Subscription,或者普通用家可能會很陌生,讓我介紹一下。

TechNet Plus SubscriptionMSDN Subscription其實是一種軟體授權模式。
兩者的共通點都是可讓用家優先下載使用新版和舊版的軟件,而且並不是試用型式,是有正式產品序號的。有效期限為期一年,在這一年內,Subscription包含的軟件都可合法使用。
過期後,若不續期,你依然可以繼續使用,但不能再次取得新的產品序號,以一些有經驗的用家所說,其實Subscription的序號是專屬的,並不會過期,只要保存序號就可以用下去,當然這是未經小弟証實的,不過可以理解的是,網上流傳的什麼完全版ISO,什麼"神Key",就是由一些違反授權的用家放出,當然這類"神Key"很快便會失效,因為Subscription不是大量授權,是以Single User計算的。

在軟件上,TechNet Plus SubscriptionMSDN Subscription都共同擁有以下授權:
  • Windows XP至Windows 7
  • Windows Server 2003至2008
  • Office 2007至2010

分別在於MSDN的有Visual Studio,而TechNet的就會有如ISA Server,BizTalk Server這類選擇。

當然亦因為這樣,價格不菲,MSDN的就要USD$11,899,TechNet的就USD$349。為什麼TechNet的便宜很多,我估計最大原因是Subscription License是不能用在商業環境下。原意都只是想給開發管理人員有一個"較完美"的測試環境,但TechNet的產品,遍遍就大部份只能在商業環境下才用得上場,我想價格便宜都算是一種利誘,等你以"正式版型式去試用"吧。
詳細看看這個比較表就知道為什麼了

所以其實微軟對我這類支持者,還算不錯了吧。 :hehe:
我的Windows 7, Visual Studio 2010, Office 2010都是靠它。


了解TechNet Plus Subscription
了解MSDN Subscription

jQuery Ajax配WebService的以外選擇 - Ashx

jQuery用Post方式去呼叫Web Service是最常見的運作方式,不過jQuery除了.post(),還有.get() / .load() / .getScript().getJSON()都是常用的方法。

有點不同的是,後四者一般使用上都是想直接取得字串資料居多,甚至只是單單True或False。(可參考jQuery的Demo)
故然若以最低成本為大前題,使用WebService就不太恰當。
甚至有時候會用Javascript for...loop 去循環callback的話,低成本,快速的程序更為重要。
所以我們便需要用上Ashx。

Ashx只是Extension名,而Ashx正式名稱是Generic handler。
或者可能會問,為什麼不用aspx的response.write去做?
其實的確用response.write是可以做到同一效果,但*.ashx和*.aspx有少少不同:
  1. ashx可以return binary file,例如Image,Zip etc...
  2. ashx並不需要經過aspx的Page Cycle,例如Page_Init , Page_Load etc...
  3. ashx可以在web.config設定http request的處理方式

特別是第二,三點,所以以速度來說,ashx是比aspx更快,更省CPU資源。

以下是ashx示範,是由MSSQL取得 Image Field 並呈現在瀏覽器上,如果文字處理就更簡單,Visual Studio的ashx文件,預設的就是Hello World示範。

<%@ WebHandler Language="VB" Class="ShowStudentImage" %>

Imports System
Imports System.IO
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web

Public Class ShowStudentImage : Implements IHttpHandler
Dim StudentID As String = ""
Private Property SID() As String
Get
Return StudentID
End Get
Set(ByVal value As String)
StudentID = value
End Set
End Property

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
If context.Request.QueryString("StudentID") IsNot Nothing Then
SID = context.Request.QueryString("StudentID")
Else
Throw New ArgumentException("No parameter specified")
End If

context.Response.ContentType = "image/jpeg"
Dim strm As Stream = ShowEmpImage(SID)
Dim buffer As Byte() = New Byte(4095) {}
Try
Dim byteSeq As Integer = strm.Read(buffer, 0, 4096)
While byteSeq > 0
context.Response.OutputStream.Write(buffer, 0, byteSeq)
byteSeq = strm.Read(buffer, 0, 4096)
End While
Catch
context.Response.ContentType = "image/gif"
context.Response.WriteFile("images/Transparent.gif")
End Try
End Sub

Public Function ShowEmpImage(ByVal StudentID As String) As Stream
Dim connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ClientsConnectionString").ConnectionString)
connection.Open()
Dim sql As String = "SELECT Photo FROM Student WHERE StudentID = @SID"
Dim cmd As New SqlCommand(sql, connection)
cmd.CommandType = CommandType.Text
cmd.Parameters.AddWithValue("@SID", Integer.Parse(StudentID))
Dim img As Object = cmd.ExecuteScalar()
Try
Return New MemoryStream(DirectCast(img, Byte()))
Catch
Return Nothing
Finally
connection.Close()
End Try
End Function

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class

2010年6月2日星期三

JQuery UI Tabs size問題

今天用jQueryUI的Tabs出現一個問題,就是Tabs size非常大。

最奇怪的是,我引用官方的Demo code都出現這情況,難道連官方的都出錯?

查明後,原因是Tabs的font size是由.ui-helper-reset去控制,而.ui-helper-reset的font-size是100%,所以如果你的Tabs並沒有放置在其他已Define font-size的Container (例如Div),那就會出現這個問題。
所以解決方法是把Tabs的<div id="tabs">...</div>放在一個container中,問題就得以解決。

正確HTML Code如下
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link type="text/css" href="css/redmond/jquery-ui-1.8.1.custom.css" rel="stylesheet" />
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.1.custom.min.js"></script>
<title></title>
<script type="text/javascript">
$(function() {
$("#tabs").tabs();
});
</script>
</head>
<body>
<div id="container" style="font-size:12px">  <!-- important -->
<div id="tabs">
<ul>
<li><a href="#tabs-1">First</a></li>
<li><a href="#tabs-2">Second</a></li>
<li><a href="#tabs-3">Third</a></li>
</ul>
<div id="tabs-1">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
<div id="tabs-2">
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet
ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum
bibendum.</div>
<div id="tabs-3">
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi
urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor
ullamcorper augue.</div>
</div>
</div>
</body>
</html>

Microsoft Visual Studio 2010 簡體中文/繁體中文版推出了


自從VS2010推出以來,都很想知道何時推出中文版,最後得知會在5月尾至6月中推出,這兩星期不斷每天上MSDN看看,果然今天6月2日見到選擇言語版本的ComboBox寬度比之前長,因為已經有Chinese (Simplified) 和 Chinese (Traditional)了。
終於可以趁機連同Windows 7 一起安裝.

Microsoft Visual Studio 2010 Ultimate Trial - ISO 簡體中文/繁體中文版
Microsoft Visual Studio 2010 Premium Trial - ISO 簡體中文/繁體中文版
Microsoft Visual Studio 2010 Professional Trial - ISO 簡體中文/繁體中文版
Microsoft Visual Studio 2010 Express 簡體中文/繁體中文版