<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>裁纸刀下 &#187; ASP</title>
	<atom:link href="http://ofcss.com/tags/asp/feed" rel="self" type="application/rss+xml" />
	<link>http://ofcss.com</link>
	<description>独立 自由 诚信 宽容 责任 平常心</description>
	<lastBuildDate>Fri, 20 Apr 2012 04:08:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Oblog检测搜索引擎的一个问题</title>
		<link>http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html</link>
		<comments>http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html#comments</comments>
		<pubDate>Fri, 19 Sep 2008 03:10:26 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[OBLOG]]></category>
		<category><![CDATA[博客]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=293</guid>
		<description><![CDATA[Oblog采用简称判断搜索引擎。当访问者的计算机名中包含了和某个搜索引起相同的简称就会被当成搜索引擎处理。]]></description>
			<content:encoded><![CDATA[<p>　　今天上班的时候，有一个用户反映博客登陆不了了。</p>
<p>　　因为最近做了整合方面的改动，我第一反应是难道这方面有问题？可是自己测试什么问题都不存在。后来用户抓图来看，是登陆表单的位置一片空白。</p>
<p>　　于是远程协助帮她处理。一般情况下，有人正常有人不正常都会是缓存的问题或者浏览器设置的问题。所以我首先做的也就是这两件事。可是处理之后问题依旧。在用户电脑上打开网页源代码，发现登陆表单是个JS脚本。代码输出正常的。该JS路径在我的电脑上访问就一切正常，而在用户的电脑上则访问不到。测试的时候进一步发现，用户的电脑上似乎只能访问我们博客系统的html静态文件，所以asp文件都返回404错误。<span id="more-293"></span></p>
<p>　　这种问题以前确实没有遇到。只遇到过静态文件可以访问动态脚本不能访问的，那都是IIS的问题，服务器端的问题。于是要从代码下手了。</p>
<p>　　打开login.asp（登陆脚本就是由它输出的），源代码头部首先就看到ChkSpider这个函数。我知道这是检测搜索引擎的，如果发现客户端是搜索引擎，直接截断输出。难道是这个有问题？，首先把这行代码注释了，刷新页面，登陆窗口正常显示了。</p>
<p>　　后来用户又在访问User_Index.asp的时候遇到同样的问题，看来改具体文件不是办法了，打开Class_Sys.asp文件，找到ChkSpider这个函数，进入函数后直接让它Exit Function。再测，问题全都没了。</p>
<p>　　这个问题一般情况下很难遇到，但是实际上几率并不算特别小，只要用户计算机名称包含了google、sohu、sina、soso、baidu、yahoo等字符串（不用严格等同于Spider的名称，只要包含相关字符串），就会被当作是Spider来处理。</p>
<p>　　看来Oblog的这个检测逻辑需要改进一下了。要么，对常用Spider的名称做精确匹配，要么，就换一种方式来检测吧。这个本身并没有问题的代码，跟千奇百怪的计算机名称撞车的可能性还是很大的。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2005-11-24 -- <a href="http://ofcss.com/2005/11/24/goole-map-creator-for-my-blog.html" title="为我的blog写的Google地图生成器">为我的blog写的Google地图生成器</a></li><li>2005-11-18 -- <a href="http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html" title="用ASP为blog程序编写Trackback功能">用ASP为blog程序编写Trackback功能</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-06-14 -- <a href="http://ofcss.com/2008/06/14/june-15-start-use-new-domain.html" title="615：新域名正式启用">615：新域名正式启用</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-04-14 -- <a href="http://ofcss.com/2008/04/14/pjblog-guestbook-plus.html" title="PJBlog自带留言簿增强版改进">PJBlog自带留言簿增强版改进</a></li><li>2005-11-23 -- <a href="http://ofcss.com/2005/11/23/compare-interge-with-string-in-asp.html" title="ASP中的数字和字符比较">ASP中的数字和字符比较</a></li><li>2005-11-14 -- <a href="http://ofcss.com/2005/11/14/build-my-blog-again.html" title="重新做我的blog了">重新做我的blog了</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>动易SW中的一个严重但不影响使用的bug（二）</title>
		<link>http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html</link>
		<comments>http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html#comments</comments>
		<pubDate>Sun, 22 Jun 2008 18:24:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[动易]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=282</guid>
		<description><![CDATA[　　上次分析出来了Bug的问题所在，是因为selectSingleNode(strNodeName)不能取到要取的元素，但是为什么这么大的Bug没有出现500错误呢？否则的话，这么大的一个bug不要说是来到用户手上，在开发人员手里就已经被发现了。 　　这次继续分析这个Bug。在新版本的API_Function.asp这个文件中，selectSingleNode这个函数一共用到了5次，有两次是在SendPost函数里，在很早的版本里那两个地方就用的是selectSingleNode，因为那里传递的参数用的是“//status”和“//message”，是正确的XPath，因此不用考虑那里了。此外的三处，代码如下： '************************************************** '函数名：getNodeText '作 用：获取XML文件中指定节点的文本 '参 数：strNodeName ----节点名称 '返回值：解析出来的文本值， '************************************************** Function getNodeText(strNodeName) If IsNull(strNodeName) Or IsEmpty(strNodeName) Or strNodeName = "" Then Exit Function If IsNode(strNodeName) Then getNodeText = sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text Else getNodeText = "" End If End Function '************************************************** '函数名：setNodeText '作 用：设置XML文件中指定节点的文本 '参 数：strNodeName ----节点名称 '　　　　strNodeText ----要设置的文本 '返回值：0 = 设置成功; 否则返回Err.Description '************************************************** Function setNodeText(strNodeName, strNodeText) [...]]]></description>
			<content:encoded><![CDATA[<p>　　<a href="http://blog.oophome.net/?id=279" target="_blank">上次</a>分析出来了Bug的问题所在，是因为selectSingleNode(strNodeName)不能取到要取的元素，但是为什么这么大的Bug没有出现500错误呢？否则的话，这么大的一个bug不要说是来到用户手上，在开发人员手里就已经被发现了。</p>
<p>　　这次继续分析这个Bug。在新版本的API_Function.asp这个文件中，selectSingleNode这个函数一共用到了5次，有两次是在SendPost函数里，在很早的版本里那两个地方就用的是selectSingleNode，因为那里传递的参数用的是“//status”和“//message”，是正确的XPath，因此不用考虑那里了。此外的三处，代码如下：<span id="more-282"></span></p>
<pre lang="ASP">'**************************************************
'函数名：getNodeText
'作  用：获取XML文件中指定节点的文本
'参  数：strNodeName   ----节点名称
'返回值：解析出来的文本值，
'**************************************************
Function getNodeText(strNodeName)
    If IsNull(strNodeName) Or IsEmpty(strNodeName) Or strNodeName = "" Then Exit Function
    If IsNode(strNodeName) Then
        getNodeText = sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text
    Else
        getNodeText = ""
    End If
End Function  

'**************************************************
'函数名：setNodeText
'作  用：设置XML文件中指定节点的文本
'参  数：strNodeName   ----节点名称
'　　　　strNodeText   ----要设置的文本
'返回值：0 = 设置成功; 否则返回Err.Description
'**************************************************
Function setNodeText(strNodeName, strNodeText)
    If IsNull(strNodeText) Or IsEmpty(strNodeText) Or strNodeText = "" Then Exit Function
    If IsNull(strNodeName) Or IsEmpty(strNodeName) Or strNodeName = "" Then Exit Function
    If IsNode(strNodeName) Then sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text = strNodeText
End Function  

'**************************************************
'函数名：IsNode
'作  用：检查一个Node是否存在且文本不为空
'参  数：strNodeName   ----节点名称
'返回值：True or False
'**************************************************
Function IsNode(strNodeName)
    IsNode = False
    If strNodeName = "" Then Exit Function
    If sMyXmlDoc.documentElement.selectSingleNode(strNodeName) Is Nothing Then
        IsNode = False
    Else
        IsNode = True
    End If
End Function</pre>
<p>　　我们来看，为什么设置message的值不会成功并且不报错呢？原因就在于setNodeText这个函数的最后一句：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text = strNodeText  </span></span></li>
</ol>
</div>
<p>　　IsNode这个函数，从函数的注释（还好这个没改）可以看出，作用是“检测一个元素是否存在<span style="color: #ff0000;">且文本不为空</span>”，这个函数本来的作用是用于检查传递的数据包中的“自定义元素”和“扩展元素”的，因为各个接口对标准的支持程度不同，因此在获取数据的时候，有的元素可能只是穿了空值过来，那我们就没有必要对该元素进行处理了，所以要用IsNode来检查一下。但是在setNodeText这个函数里没有调用过IsNode检查。就算调用了，按照以前的方式，一定会取到“message”元素的默认值，从而返回True。</p>
<p>　　在新版本中，由于采用了selectSingleNode来取“message”已经取不到了，自然，IsNode这个函数在检查到message的时候，必然返回空值，因为 sMyXmlDoc.documentElement.selectSingleNode Is Nothing这个判断为真了，所以会返回False。于是，sMyXmlDoc.documentElement.selectSingleNode(“message”).Text 这个语句就不会执行，也就不会引发500错误了。</p>
<p>　　做个假设，如果在修改了取元素的方式之后，没有给setNodeText和getNodeText加上IsNode判断，则必然引发500错误。或者，没有修改过IsNode这个函数，则仍然会返回True，然后引发500错误。正好是加上了判断，于是所有对message元素的值的读写都被忽略了，默认值“操作已成功”就这样被原封不动地回发给所有请求，而响应包中的用户数据元素也一样。</p>
<p>　　下面是纠正bug的代码：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;************************************************** </span><span>  </span></span></li>
<li><span class="comment">&#8216;函数名：getNodeText </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;作  用：获取XML文件中指定节点的文本 </span><span>  </span></li>
<li><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：解析出来的文本值， </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> getNodeText(strNodeName)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span>  </span></li>
<li><span>        getNodeText = sMyXmlDoc.documentElement.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0)</span>.Text   </span></li>
<li class="alt"><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li><span>        getNodeText = </span><span class="string">“”</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;函数名：setNodeText </span><span>  </span></li>
<li><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) </span><span class="keyword">Or</span><span> strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.documentElement.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0)</span>.Text = strNodeText   </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;函数名：IsNode </span><span>  </span></li>
<li><span class="comment">&#8216;作  用：检查一个Node是否存在且文本不为空 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li><span class="comment">&#8216;返回值：True or False </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li><span class="keyword">Function</span><span> IsNode(strNodeName)   </span></li>
<li class="alt"><span>    IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> sMyXmlDoc.documentElement.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0)</span> </span><span class="keyword">Is</span><span> </span><span class="keyword">Nothing</span><span style="background-color: #ffff00"> Or IsEmpty(sMyXmlDoc.documentElement.getElementByTagName(strNodeName).Item(0).Text) </span><span class="keyword">Then</span><span>  </span></li>
<li><span>        IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li><span>        IsNode = </span><span class="keyword">True</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
</ol>
</div>
<p>第二种改法：用selectSingleNode的方法，代码如下</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;************************************************** </span><span>  </span></span></li>
<li><span class="comment">&#8216;函数名：getNodeText </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;作  用：获取XML文件中指定节点的文本 </span><span>  </span></li>
<li><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：解析出来的文本值， </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> getNodeText(strNodeName)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span>  </span></li>
<li><span>        getNodeText = sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName).Text   </span></li>
<li class="alt"><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li><span>        getNodeText = </span><span class="string">“”</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;函数名：setNodeText </span><span>  </span></li>
<li><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) </span><span class="keyword">Or</span><span> strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName).Text = strNodeText   </span></li>
<li class="alt"><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>  </span></li>
<li class="alt"><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li><span class="comment">&#8216;函数名：IsNode </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;作  用：检查一个Node是否存在且文本不为空 </span><span>  </span></li>
<li><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：True or False </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> IsNode(strNodeName)   </span></li>
<li><span>    IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName) </span><span class="keyword">Is</span><span> </span><span class="keyword">Nothing</span><span> </span><span class="keyword">Or</span><span> IsEmpty(sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName).Text) </span><span class="keyword">Then</span><span>  </span></li>
<li class="alt"><span>        IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li class="alt"><span>        IsNode = </span><span class="keyword">True</span><span>  </span></li>
<li><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li class="alt"><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
</ol>
</div>
<p>　　这样就能充分利用selectSingleNode的简洁了，但是还要注意哦，由于新版本的createXmlDom不再是自动生成支持的最高版本的xmldom对象，而是生成默认版本（系统默认版本一般都是3.0以下），而低于4.0的版本中，selectSingleNode对XPath的支持是有问题的，不支持带函数的XPath，所以还要小心！</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2007-01-30 -- <a href="http://ofcss.com/2007/01/30/new-thinking-about-application-intergration.html" title="整合开发的新思路">整合开发的新思路</a></li><li>2006-04-12 -- <a href="http://ofcss.com/2006/04/12/innerhtml-can-not-be-excuted.html" title="用JavaScript动态输出的JS脚本不能执行">用JavaScript动态输出的JS脚本不能执行</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li><li>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-05 -- <a href="http://ofcss.com/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>动易SW中的一个严重但不影响使用的bug(一)</title>
		<link>http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html</link>
		<comments>http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html#comments</comments>
		<pubDate>Wed, 18 Jun 2008 12:20:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[动易]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=279</guid>
		<description><![CDATA[BUG描述：整个动易API接口的响应功能，除了操作状态码正常，其它部分完全失效，不会返回错误提示，也不会返回用户信息。 BUG重现：在启用了整合的站点，直接访问/API/API_Response.asp，将会看到&#60;status&#62;1&#60;/status&#62;（表示请求不正确或者操作失败），以及&#60;message&#62;操作已成功完成&#60;/message&#62;（操作成功返回的默认值）。就表示该BUG存在。 BUG影响：大部分情况下，各个应用程序并不会向动易请求用户信息，因此除了在登陆失败、注册失败等失败操作会提示用户“操作已成功”的假象以外，暂时不会造成其它影响。 　　动易SW里有这样一个问题，只有启用了整合接口并且曾经在整合的其它系统中遇到过错误提示的朋友才会发现： 　　每当整合出现问题或者是登陆、注册等一系列操作出错的时候，我们知道以前是返回错误的具体提示，包括服务器缺乏相关组件，或者接口配置错误，或者用户信息错误等，都会有不同的提示。到了SW里，这些操作同样也会返回错误，不会让你操作成功。但是错误的提示是什么呢？全部都是“操作已成功完成”，这个搞笑的问题出在哪里呢？ 　　以前设计API的时候，考虑到最常见的情况是用户注册、登陆、注销这些日常操作，而这些操作里又是成功的居多，所以我在用于返回信息的Response.xml模板里，设置了默认返回状态为0（表示成功），默认返回信息为“操作已成功完成”。这就是这个bug的缘起了。 　　那么，以前老的版本反而没有这个问题，为什么新版本里出现这个问题呢？第一反应：当出现错误的时候，没有修改message，也就是错误提示信息。好，我们打开API_Response.asp检查一下，发现当操作错误的时候，代码是这样的： If FoundErr Then sPE_Items(conStatus, 1) = "1" sPE_Items(conMessage, 1) = ErrMsg prepareXML (False) WriteXml Else sPE_Items(conStatus, 1) = "0" prepareXML (False) WriteXml End If 　　我用黄色背景标记的这行，翻译过来就是“设置提示信息的内容为ErrMsg（具体的错误信息）”，说明不是没有修改，于是我们继续往下查，sPE_Items这是一个API使用的全局数组，二维的，sPE_Items(a, b)，a代表xml里的不同元素，b为0标识我们要访问的是元素名称，1标识我们要访问的是元素里的内容；而conMessage是一个常数，实际上它等于4。在全局数组里sPE_Items(4, 1)代表的就是xml中message这个元素的内容。 　　接下来是prepareXML(False)这个函数。这个函数的作用是加载xml模板，然后用数组里的内容去替换默认值。经检查，在prepareXML这个函数里，当返回出错信息的时候的代码如下： ASP/Visual Basic代码 If intIndex &#60;&#62; conAction And intIndex &#60;&#62; conSyskey And intIndex &#60;&#62; conUsername Then setNodeText sPE_Items(intIndex,0),sPE_Items(intIndex,1) End If 　　这里不会有什么问题，看来问题就出在setNodeText这个函数上了。新版本中的这个函数是： [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>BUG描述：整个动易API接口的响应功能，除了操作状态码正常，其它部分完全失效，不会返回错误提示，也不会返回用户信息。</p>
<p>BUG重现：在启用了整合的站点，直接访问/API/API_Response.asp，将会看到<span style="color: #339966;">&lt;status&gt;<span style="color: #ff0000;">1</span>&lt;/status&gt;</span>（表示请求不正确或者操作失败），以及<span style="color: #339966;">&lt;message&gt;<span style="color: #ff0000;">操作已成功完成</span>&lt;/message&gt;</span>（操作成功返回的默认值）。就表示该BUG存在。</p>
<p>BUG影响：大部分情况下，各个应用程序并不会向动易请求用户信息，因此除了在登陆失败、注册失败等失败操作会提示用户“操作已成功”的假象以外，暂时不会造成其它影响。</p></blockquote>
<p><span id="more-279"></span><br />
　　动易SW里有这样一个问题，只有启用了整合接口并且曾经在整合的其它系统中遇到过错误提示的朋友才会发现：</p>
<p>　　每当整合出现问题或者是登陆、注册等一系列操作出错的时候，我们知道以前是返回错误的具体提示，包括服务器缺乏相关组件，或者接口配置错误，或者用户信息错误等，都会有不同的提示。到了SW里，这些操作同样也会返回错误，不会让你操作成功。但是错误的提示是什么呢？全部都是“操作已成功完成”，这个搞笑的问题出在哪里呢？</p>
<p>　　以前设计API的时候，考虑到最常见的情况是用户注册、登陆、注销这些日常操作，而这些操作里又是成功的居多，所以我在用于返回信息的Response.xml模板里，设置了默认返回状态为0（表示成功），默认返回信息为“操作已成功完成”。这就是这个bug的缘起了。</p>
<p>　　那么，以前老的版本反而没有这个问题，为什么新版本里出现这个问题呢？第一反应：当出现错误的时候，没有修改message，也就是错误提示信息。好，我们打开API_Response.asp检查一下，发现当操作错误的时候，代码是这样的：</p>
<pre lang="ASP">If FoundErr Then
    sPE_Items(conStatus, 1) = "1"
    sPE_Items(conMessage, 1) = ErrMsg
    prepareXML (False)
    WriteXml
Else
    sPE_Items(conStatus, 1) = "0"
    prepareXML (False)
    WriteXml
End If</pre>
<p>　　我用黄色背景标记的这行，翻译过来就是“设置提示信息的内容为ErrMsg（具体的错误信息）”，说明不是没有修改，于是我们继续往下查，sPE_Items这是一个API使用的全局数组，二维的，sPE_Items(a, b)，a代表xml里的不同元素，b为0标识我们要访问的是元素名称，1标识我们要访问的是元素里的内容；而conMessage是一个常数，实际上它等于4。在全局数组里sPE_Items(4, 1)代表的就是xml中message这个元素的内容。</p>
<p>　　接下来是prepareXML(False)这个函数。这个函数的作用是加载xml模板，然后用数组里的内容去替换默认值。经检查，在prepareXML这个函数里，当返回出错信息的时候的代码如下：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="keyword">If</span><span> intIndex &lt;&gt; conAction </span><span class="keyword">And</span><span> intIndex &lt;&gt; conSyskey </span><span class="keyword">And</span><span> intIndex &lt;&gt; conUsername </span><span class="keyword">Then</span><span>  </span></span></li>
<li><span>    setNodeText sPE_Items(intIndex,0),sPE_Items(intIndex,1)  </span></li>
<li class="alt"><span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></span></li>
</ol>
</div>
<p>　　这里不会有什么问题，看来问题就出在setNodeText这个函数上了。新版本中的这个函数是：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;函数名：setNodeText</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)  </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) or strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
<li><span>    <span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) or strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.<span style="background-color: #ffff00">selectSingleNode(strNodeName).text</span> = strNodeText  </span></span></li>
<li><span><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
</ol>
</div>
<p>　　以前的版本中代码是：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;函数名：setNodeText</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)  </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) or strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
<li><span>    <span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) or strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>   </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0).text</span> = strNodeText  </span></span></li>
<li><span><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
</ol>
</div>
<p>　　区别就在于，新版本用selectSingleNode这个方法获取节点，以前版本中我用getElementsByTagName().Item(0)这个方法来获取节点。两个方法都是返回xml文档树中的一个元素对象。新版本的代码简洁，直接从树中读取一个元素，而我的方法是读取文档树中所有标签为strNodeName（本例中指的是message）的元素列表，然后取第一个。</p>
<p>　　我排错的时候看到这里就已经明白问题所在了。因为当初我第一次写到这里的时候就犯过新版中这个错误。selectSingleNode这个方法的参数类型是XPath，而getElementsByTagName这个方法的参数类型是string。我们这里给的“message”，不是一个XPath，如果在我们的文档中用XPath来标识这个元素，正确的应该是“/root/body/message”，但是由于sMyXmlDoc这个对象取得是xml文档树的根元素，也就是root，所以其实也可以用“/body/message”来访问到。文档中只有一个message元素，因此也可以用“//message”来访问。不管用哪一种都行，但是用“message”是不对的。</p>
<p>　　所以这里给xml中所有body的子元素赋值都会失败。这就是问题所在了。</p>
<p>　　同理可知，在新版本的接口中，如果是整合的程序向动易发送请求，那么不管什么请求，返回的xml包中，都只有两个有效数据，一个是告诉对方响应者是动易系统，另一个就是告诉对方操作状态是成功还是失败。至于错误的具体提示，只有默认值，而其它的数据，比如检索用户信息，返回的则全部是空值。还好目前的整合中基本上不会用到这些元素，所以也就成了一个“严重”但不影响使用的bug了。关于这个bug为什么没有引发500错误以及如何修正，<a href="http://blog.oophome.net/article.asp?id=282" target="_blank">下次</a>我再继续说。</p>
<p>　　除此之外，动易的新版本接口还增加了一个新元素（sex），可以理解为符合接口规范的自定义元素，但是这个元素表示的是用户性别。这是在标准中定义的必备扩展元素，元素名称是gendar（英文单词意思是性别）。等于放弃了对标准元素gendar的支持，增加了一个自定义元素sex。</p>
<p>　　不知道三方是否在这个新增元素上做过沟通取得了共识。如果没有的话，那么这里又是一个新bug，就是通用注册的时候，其它程序将不能通知动易记录用户的性别，动易也没法通知其它用户。</p>
<p>　　我第一次看到这个新增元素的时候百思不得其解。如果是gendar命名不恰当，要改的话，那应该会发公告通知PDO接口规范更新到1.1或者2.0，新增sex元素，gendar元素状态变为“不推荐”，这是w3c在xhtml规范里喜欢用的方式。先不推荐但是还兼容，让你有时间慢慢改，以后时机恰当再取消。</p>
<p>　　但是我奇怪的是gendar无论从语意上讲还是从哪方面讲，都不算是命名不规范的元素啊，甚至是比sex更规范的元素。sex只不过是在部分web应用里习惯的用法而已。其英文单词意思是“性”，而不是“性别”。</p>
<p>　　莫非做这个修改的技术员在修改接口的时候不看接口规范？不得而知了。但是对于selectSingleNode不能根据元素名称选择元素这个问题，的确是不应该犯的。</p>
<p>　　发现我写的代码被更改并不是因为我写错了，本来应该是高兴的吧，但是我却高兴不起来。我依然是动易的忠实FANS，我希望它更好。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2007-01-30 -- <a href="http://ofcss.com/2007/01/30/new-thinking-about-application-intergration.html" title="整合开发的新思路">整合开发的新思路</a></li><li>2006-04-12 -- <a href="http://ofcss.com/2006/04/12/innerhtml-can-not-be-excuted.html" title="用JavaScript动态输出的JS脚本不能执行">用JavaScript动态输出的JS脚本不能执行</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li><li>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-05 -- <a href="http://ofcss.com/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在ASP中实现UNIX时间戳</title>
		<link>http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html</link>
		<comments>http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html#comments</comments>
		<pubDate>Wed, 04 Jun 2008 06:55:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=272</guid>
		<description><![CDATA[　　在康盛创想发布UC以后，我曾经尝试为其编写ASP把版本的客户端类库，过程中发现了几个问题，首当其冲的当然是服务器端不支持非php平台的接口，这个问题直接导致了我选择另起炉灶开发自己的通用用户中心。 　　但是在研究UC的过程中却也有一些细小的收获。这篇文章说说PHP中的时间戳。在PHP中，时间函数time()获得的不是我们在ASP中的事件函数Now()所返回的“2008-06-04 21:19:41”这样的形式，而是“1123495443”这样的形式。这个记录的是所表示的时间与1970年1月1日午夜零点之间的事件差，单位为秒，不考虑闰年等因素。 　　如果要编写UC的ASP客户端，这个问题是必然要面对的，实际上即使不为UC编写客户端，这个特性引入ASP还是有不少好处的。下面是具体的实现办法： ASP/Visual Basic代码 &#8216;参数：strTime:要转换的时间；intTimeZone：该时间对应的时区 &#8216;返回值：strTime相对于1970年1月1日午夜0点经过的秒数 &#8216;示例：ToUnixTime(“2008-5-23 10:51:0&#8243;, +8)，返回值为1211511060 Function ToUnixTime(strTime, intTimeZone) If IsEmpty(strTime) or Not IsDate(strTime) Then strTime = Now If IsEmpty(intTimeZone) or Not isNumeric(intTimeZone) Then intTimeZone = 0 ToUnixTime = DateAdd(“h”,-intTimeZone,strTime) ToUnixTime = DateDiff(“s”,“1970-1-1 0:0:0&#8243;, ToUnixTime) End Function &#8216;把UNIX时间戳转换为标准时间 &#8216;参数：intTime:要转换的UNIX时间戳；intTimeZone：该时间戳对应的时区 &#8216;返回值：intTime所代表的标准时间 &#8216;示例：FromUnixTime(“1211511060&#8243;, +8)，返回值2008-5-23 10:51:0 Function FromUnixTime(intTime, intTimeZone) If IsEmpty(intTime) Or Not [...]]]></description>
			<content:encoded><![CDATA[<p>　　在康盛创想发布UC以后，我曾经尝试为其编写ASP把版本的客户端类库，过程中发现了几个问题，首当其冲的当然是服务器端不支持非php平台的接口，这个问题直接导致了我选择另起炉灶开发自己的通用用户中心。</p>
<p>　　但是在研究UC的过程中却也有一些细小的收获。这篇文章说说PHP中的时间戳。在PHP中，时间函数time()获得的不是我们在ASP中的事件函数Now()所返回的“2008-06-04 21:19:41”这样的形式，而是“1123495443”这样的形式。这个记录的是所表示的时间与1970年1月1日午夜零点之间的事件差，单位为秒，不考虑闰年等因素。<span id="more-272"></span></p>
<p>　　如果要编写UC的ASP客户端，这个问题是必然要面对的，实际上即使不为UC编写客户端，这个特性引入ASP还是有不少好处的。下面是具体的实现办法：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;参数：strTime:要转换的时间；intTimeZone：该时间对应的时区     </span><span>  </span></span></li>
<li><span class="comment">&#8216;返回值：strTime相对于1970年1月1日午夜0点经过的秒数     </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;示例：ToUnixTime(“2008-5-23 10:51:0&#8243;, +8)，返回值为1211511060     </span><span>  </span></li>
<li><span class="keyword">Function</span><span> ToUnixTime(strTime, intTimeZone)       </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsEmpty(strTime) or </span><span class="keyword">Not</span><span> IsDate(strTime) </span><span class="keyword">Then</span><span> strTime = Now       </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsEmpty(intTimeZone) or </span><span class="keyword">Not</span><span> isNumeric(intTimeZone) </span><span class="keyword">Then</span><span> intTimeZone = 0       </span></li>
<li class="alt"><span>    ToUnixTime = DateAdd(</span><span class="string">“h”</span><span>,-intTimeZone,strTime)       </span></li>
<li><span>    ToUnixTime = DateDiff(</span><span class="string">“s”</span><span>,</span><span class="string">“1970-1-1 0:0:0&#8243;</span><span>, ToUnixTime)       </span></li>
<li class="alt"><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>      </span></li>
<li><span>      </span></li>
<li class="alt"><span class="comment">&#8216;把UNIX时间戳转换为标准时间     </span><span>  </span></li>
<li><span class="comment">&#8216;参数：intTime:要转换的UNIX时间戳；intTimeZone：该时间戳对应的时区     </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：intTime所代表的标准时间     </span><span>  </span></li>
<li><span class="comment">&#8216;示例：FromUnixTime(“1211511060&#8243;, +8)，返回值2008-5-23 10:51:0     </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> FromUnixTime(intTime, intTimeZone)       </span></li>
<li><span>    </span><span class="keyword">If</span><span> </span><span>IsEmpty(intTime) </span><span class="keyword">Or</span><span> </span><span class="keyword">Not</span><span> IsNumeric(intTime) </span><span class="keyword">Then</span><span>      </span></li>
<li class="alt"><span>        FromUnixTime = Now()       </span></li>
<li><span>        </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>      </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>      </span></li>
<li><span>    </span><span class="keyword">If</span><span> </span><span>IsEmpty(intTime) </span><span class="keyword">Or</span><span> </span><span class="keyword">Not</span><span> IsNumeric(intTimeZone) </span><span class="keyword">Then</span><span> intTimeZone = 0       </span></li>
<li class="alt"><span>    FromUnixTime = DateAdd(</span><span class="string">“s”</span><span>, intTime, </span><span class="string">“1970-1-1 0:0:0&#8243;</span><span>)       </span></li>
<li><span>    FromUnixTime = DateAdd(</span><span class="string">“h”</span><span>, intTimeZone, FromUnixTime)       </span></li>
<li class="alt"><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
</ol>
</div>
<p> 　　这两个函数分别用于标准时间转Unix时间戳和Unix时间戳转标准时间。用法在函数前面的注释里写得很清楚了。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2009-07-05 -- <a href="http://ofcss.com/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-01 -- <a href="http://ofcss.com/2009/07/01/asp-net-mvc-best-practices-part-2.html" title="ASP.NET MVC 最佳实践（二）">ASP.NET MVC 最佳实践（二）</a></li><li>2009-06-28 -- <a href="http://ofcss.com/2009/06/28/asp-net-mvc-best-practices-part-1.html" title="ASP.NET MVC 最佳实践（一）">ASP.NET MVC 最佳实践（一）</a></li><li>2009-06-08 -- <a href="http://ofcss.com/2009/06/08/using-fastcgi-to-host-php-applications-on-iis-7x.html" title="在 IIS 7.x 中用 FastCGI 运行 PHP">在 IIS 7.x 中用 FastCGI 运行 PHP</a></li><li>2008-09-19 -- <a href="http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html" title="Oblog检测搜索引擎的一个问题">Oblog检测搜索引擎的一个问题</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>给UCenter的拥蹩们泼点冷水</title>
		<link>http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html</link>
		<comments>http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html#comments</comments>
		<pubDate>Fri, 23 May 2008 03:32:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[指手划脚]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[动易]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=270</guid>
		<description><![CDATA[康盛创想“七剑合璧”围绕着UCenter同时发布，不仅为站长同时提供了建立各种类型网站的全套解决方案，而且还充分实现了多系统之间的用户数据完美整合，并且解决了跨域条件下单点登录等问题。让很多开发人员都眼前为之一亮。 在康盛创想的论坛上能看到有不少JSP程序、ASP.NET程序员都在咨询或者说抱怨官方的开发文档和示例太难看懂，完全是基于PHP的，如果不把PHP搞懂，很难实现在其它开发平台下的接口开发。而官方的回答只是“以后考虑”。 动易SF 1.1的发布公告中也指出基于UCenter的接口已经列入开发计划中。令广大动易站长欢欣鼓舞。 但是，我却不得不在这里给众多开发人员和站长们泼一盆冷水&#38;mdash;&#38;mdash;基于目前的UCenter，是没办法开发其它平台的接口的。原因很简单，UCenter服务器端默认了客户端的接口路径为“应用URL” + “api/uc.php”，而且这个是不能在配置文件或者后台修改的。 也就是说，不管你在什么平台下，是什么开发语言，你的接口必须为uc.php。那么，只有一个解决方法，就是在你的服务器上映射.php的后缀到你的程序语言的解析器，让.php也变成asp文件或者.net页面的后缀。那你的站点就不可能再同时支持php和asp，或者php和jsp，或者php和asp.net。而如果你是虚拟主机用户，你需要做的事情更多。 我们可以通过简单的方法修改UCenter，使之支持各平台语言的接口（要修改的文件只有4个左右），但是如此一来，等于是第三方开发人员或者说二次开发人员需要对服务器端进行修改，那已经不像是一个“通用平台”的问题了。 其次，在跨平台的信息传递中，UCenter大量使用的是Get/Post方式发送URLEncode编码的数据，而不是在所有平台所有编码语言下都有良好支持的xml格式。这样开发人员不得不继续花费大量时间来处理编码问题。 还有，UCenter由于采用PHP开发，大量使用了PHP的特性的东西，比如UNIX时间戳，比如键值对的数组，而在其它语言平台中，对这些东西的支持是各有不同的。虽然能够处理，但是却非常麻烦。 UCenter目前给我们带来一个最大的启发，就是一个中心，多套应用的模式，以及采用P3P来实现跨域Cookie处理的思路。 我相信，随着UCenter的出现解决了一系列跨站整合中的问题后，完善的跨站用户中心应该会很快出现。而UCenter如果不在下一版本中做大规模的改变，它是不太可能成为最终的通用整合中心的。至少这么久以来，我们可以看到康盛自己的.NET论坛都还没能支持这个UCenter，就能说明一些问题。 相关日志2008-06-22 -- 动易SW中的一个严重但不影响使用的bug（二）2008-06-18 -- 动易SW中的一个严重但不影响使用的bug(一)2008-06-04 -- 在ASP中实现UNIX时间戳2009-07-05 -- PHP 5.3.0 发布2008-06-22 -- 静态页面生成的思考2007-01-30 -- 整合开发的新思路2006-04-12 -- 用JavaScript动态输出的JS脚本不能执行2009-07-08 -- ASP.NET MVC 最佳实践（四）2009-07-07 -- ASP.NET MVC 最佳实践（三）2009-07-01 -- ASP.NET MVC 最佳实践（二）]]></description>
			<content:encoded><![CDATA[<p>康盛创想“七剑合璧”围绕着UCenter同时发布，不仅为站长同时提供了建立各种类型网站的全套解决方案，而且还充分实现了多系统之间的用户数据完美整合，并且解决了跨域条件下单点登录等问题。让很多开发人员都眼前为之一亮。</p>
<p>在康盛创想的论坛上能看到有不少JSP程序、ASP.NET程序员都在咨询或者说抱怨官方的开发文档和示例太难看懂，完全是基于PHP的，如果不把PHP搞懂，很难实现在其它开发平台下的接口开发。而官方的回答只是“以后考虑”。</p>
<p><span id="more-270"></span></p>
<p>动易SF 1.1的发布公告中也指出基于UCenter的接口已经列入开发计划中。令广大动易站长欢欣鼓舞。</p>
<p>但是，我却不得不在这里给众多开发人员和站长们泼一盆冷水&amp;mdash;&amp;mdash;基于目前的UCenter，是没办法开发其它平台的接口的。原因很简单，UCenter服务器端默认了客户端的接口路径为“应用URL” + “api/uc.php”，而且这个是不能在配置文件或者后台修改的。</p>
<p>也就是说，不管你在什么平台下，是什么开发语言，你的接口必须为uc.php。那么，只有一个解决方法，就是在你的服务器上映射.php的后缀到你的程序语言的解析器，让.php也变成asp文件或者.net页面的后缀。那你的站点就不可能再同时支持php和asp，或者php和jsp，或者php和asp.net。而如果你是虚拟主机用户，你需要做的事情更多。</p>
<p>我们可以通过简单的方法修改UCenter，使之支持各平台语言的接口（要修改的文件只有4个左右），但是如此一来，等于是第三方开发人员或者说二次开发人员需要对服务器端进行修改，那已经不像是一个“通用平台”的问题了。</p>
<p>其次，在跨平台的信息传递中，UCenter大量使用的是Get/Post方式发送URLEncode编码的数据，而不是在所有平台所有编码语言下都有良好支持的xml格式。这样开发人员不得不继续花费大量时间来处理编码问题。</p>
<p>还有，UCenter由于采用PHP开发，大量使用了PHP的特性的东西，比如UNIX时间戳，比如键值对的数组，而在其它语言平台中，对这些东西的支持是各有不同的。虽然能够处理，但是却非常麻烦。</p>
<p>UCenter目前给我们带来一个最大的启发，就是一个中心，多套应用的模式，以及采用P3P来实现跨域Cookie处理的思路。</p>
<p>我相信，随着UCenter的出现解决了一系列跨站整合中的问题后，完善的跨站用户中心应该会很快出现。而UCenter如果不在下一版本中做大规模的改变，它是不太可能成为最终的通用整合中心的。至少这么久以来，我们可以看到康盛自己的.NET论坛都还没能支持这个UCenter，就能说明一些问题。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2009-07-05 -- <a href="http://ofcss.com/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li><li>2007-01-30 -- <a href="http://ofcss.com/2007/01/30/new-thinking-about-application-intergration.html" title="整合开发的新思路">整合开发的新思路</a></li><li>2006-04-12 -- <a href="http://ofcss.com/2006/04/12/innerhtml-can-not-be-excuted.html" title="用JavaScript动态输出的JS脚本不能执行">用JavaScript动态输出的JS脚本不能执行</a></li><li>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-01 -- <a href="http://ofcss.com/2009/07/01/asp-net-mvc-best-practices-part-2.html" title="ASP.NET MVC 最佳实践（二）">ASP.NET MVC 最佳实践（二）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PJBlog自带留言簿增强版改进</title>
		<link>http://ofcss.com/2008/04/14/pjblog-guestbook-plus.html</link>
		<comments>http://ofcss.com/2008/04/14/pjblog-guestbook-plus.html#comments</comments>
		<pubDate>Mon, 14 Apr 2008 23:10:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[PJBlog]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=261</guid>
		<description><![CDATA[PJBlog自带的留言簿功能上比较弱，所以大多数人用的应该是基于仲夏夜修改的增强版或者是其后锐风再度增强的2.3beta版（我原来一直用的是1.5Final，后来下载锐风版以后经过文件对比发现改变似乎不大，仅仅是把可以开关的验证码选项改成了不可关闭——关闭就一直出错不能留言）。 不过这两个版本在垃圾广告过滤上并没有特别的改进，有两处判断应该是非法操作不能留言但是仅仅是提示非法操作而没有终止留言函数执行。 我在这个基础上增加了这两处的终止执行留言函数，再加入了官方版本的高级过滤支持。此外顺便把IP显示改成了实际地址显示（用最新的纯真数据库，调用纯真网站的数据），如果需要看真实IP，可以把鼠标指到留言人的昵称上即可。 具体效果可见本站留言簿。（注：本站验证码不含在此版本中，因为验证码样式是修改的Pjblog文件而不是留言插件） 点击下载此文件 相关日志2008-09-19 -- Oblog检测搜索引擎的一个问题2008-06-22 -- 动易SW中的一个严重但不影响使用的bug（二）2008-06-18 -- 动易SW中的一个严重但不影响使用的bug(一)2008-06-04 -- 在ASP中实现UNIX时间戳2008-05-23 -- 给UCenter的拥蹩们泼点冷水2005-11-24 -- 为我的blog写的Google地图生成器2005-11-23 -- ASP中的数字和字符比较2005-11-18 -- 用ASP为blog程序编写Trackback功能]]></description>
			<content:encoded><![CDATA[<p>PJBlog自带的留言簿功能上比较弱，所以大多数人用的应该是基于仲夏夜修改的增强版或者是其后锐风再度增强的2.3beta版（我原来一直用的是1.5Final，后来下载锐风版以后经过文件对比发现改变似乎不大，仅仅是把可以开关的验证码选项改成了不可关闭——关闭就一直出错不能留言）。<span id="more-261"></span></p>
<p>不过这两个版本在垃圾广告过滤上并没有特别的改进，有两处判断应该是非法操作不能留言但是仅仅是提示非法操作而没有终止留言函数执行。</p>
<p>我在这个基础上增加了这两处的终止执行留言函数，再加入了官方版本的高级过滤支持。此外顺便把IP显示改成了实际地址显示（用最新的纯真数据库，调用纯真网站的数据），如果需要看真实IP，可以把鼠标指到留言人的昵称上即可。</p>
<p>具体效果可见本站留言簿。（注：本站验证码不含在此版本中，因为验证码样式是修改的Pjblog文件而不是留言插件）</p>
<p><a href="http://www.wukangrui.net/attachments/month_0804/52008415141026.rar">点击下载此文件</a></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-09-19 -- <a href="http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html" title="Oblog检测搜索引擎的一个问题">Oblog检测搜索引擎的一个问题</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2005-11-24 -- <a href="http://ofcss.com/2005/11/24/goole-map-creator-for-my-blog.html" title="为我的blog写的Google地图生成器">为我的blog写的Google地图生成器</a></li><li>2005-11-23 -- <a href="http://ofcss.com/2005/11/23/compare-interge-with-string-in-asp.html" title="ASP中的数字和字符比较">ASP中的数字和字符比较</a></li><li>2005-11-18 -- <a href="http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html" title="用ASP为blog程序编写Trackback功能">用ASP为blog程序编写Trackback功能</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/04/14/pjblog-guestbook-plus.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>为我的blog写的Google地图生成器</title>
		<link>http://ofcss.com/2005/11/24/goole-map-creator-for-my-blog.html</link>
		<comments>http://ofcss.com/2005/11/24/goole-map-creator-for-my-blog.html#comments</comments>
		<pubDate>Thu, 24 Nov 2005 07:26:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[博客]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=21</guid>
		<description><![CDATA[　　好长时间没用ASP开发了，今天用Div+CSS重构学校的官方网站，做得头晕，回到家突然想起来给自己的blog做一个google的站点地图生成程序，就动手了。 &#160;　　这个东西很简单，google地图是规范的XML文件，只要按照Google说明的格式把网址都列出来就可以了。因为我的blog重新做以后内容还少，Google说一个地图文件可以容纳50000个索引，按照每天新增一篇日至计算的话，还要100多年以后我的地图才会超出标准，所以我就没有打算做地图索引，直接用一个文件做地图了。 &#160;　　这个小程序大约花了一个小时写完的，中间还跟朋友聊天，吃宵夜了 &#160;　　生成的地图包括blog分类和每篇blog的地址，这里需要注意的是PJblog支持生成asp文件的方式来保存blog，所以提交给Google的最好是固定地址，也就是不是article.asp?id=xxx这样的，而是default.asp?id=xxx这样的。 &#160;　　我给分类地址都做了更新频率和重要性的标记，分类的地址设定为每日更新（因为我是每天写一篇日志），重要性设置为1，非blog分类的其它模块设置重要性为0.5，而blog就只提供地址。 &#160;　　因为是针对自己的站点写的，所以我没有对这个程序做太多完善，够我用就行了。如果有用PJblog的朋友感兴趣的话，可以下载附件的txt文件，那个就是完整源代码。 &#160;　　点击下载此文件 相关日志2008-09-19 -- Oblog检测搜索引擎的一个问题2005-11-18 -- 用ASP为blog程序编写Trackback功能2009-05-23 -- windows 7 x64 上的Google Chrome2009-04-05 -- 使用Google AjaxLib API托管的js库2008-06-22 -- 动易SW中的一个严重但不影响使用的bug（二）2008-06-18 -- 动易SW中的一个严重但不影响使用的bug(一)2008-06-14 -- 615：新域名正式启用2008-06-04 -- 在ASP中实现UNIX时间戳2008-05-23 -- 给UCenter的拥蹩们泼点冷水2008-04-14 -- PJBlog自带留言簿增强版改进]]></description>
			<content:encoded><![CDATA[<p>　　好长时间没用ASP开发了，今天用Div+CSS重构学校的官方网站，做得头晕，回到家突然想起来给自己的blog做一个google的站点地图生成程序，就动手了。</p>
<p>&nbsp;　　这个东西很简单，google地图是规范的XML文件，只要按照Google说明的格式把网址都列出来就可以了。因为我的blog重新做以后内容还少，Google说一个地图文件可以容纳50000个索引，按照每天新增一篇日至计算的话，还要100多年以后我的地图才会超出标准，所以我就没有打算做地图索引，直接用一个文件做地图了。<span id="more-21"></span></p>
<p>&nbsp;　　这个小程序大约花了一个小时写完的，中间还跟朋友聊天，吃宵夜了</p>
<p>&nbsp;　　生成的地图包括blog分类和每篇blog的地址，这里需要注意的是PJblog支持生成asp文件的方式来保存blog，所以提交给Google的最好是固定地址，也就是不是article.asp?id=xxx这样的，而是default.asp?id=xxx这样的。</p>
<p>&nbsp;　　我给分类地址都做了更新频率和重要性的标记，分类的地址设定为每日更新（因为我是每天写一篇日志），重要性设置为1，非blog分类的其它模块设置重要性为0.5，而blog就只提供地址。</p>
<p>&nbsp;　　因为是针对自己的站点写的，所以我没有对这个程序做太多完善，够我用就行了。如果有用PJblog的朋友感兴趣的话，可以下载附件的txt文件，那个就是完整源代码。</p>
<p>&nbsp;　　<a target="_blank" href="attachments/month_0511/920051124232551.txt">点击下载此文件</a></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-09-19 -- <a href="http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html" title="Oblog检测搜索引擎的一个问题">Oblog检测搜索引擎的一个问题</a></li><li>2005-11-18 -- <a href="http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html" title="用ASP为blog程序编写Trackback功能">用ASP为blog程序编写Trackback功能</a></li><li>2009-05-23 -- <a href="http://ofcss.com/2009/05/23/google-chrome-in-windows7-x64.html" title="windows 7 x64 上的Google Chrome">windows 7 x64 上的Google Chrome</a></li><li>2009-04-05 -- <a href="http://ofcss.com/2009/04/05/use-google-ajaxlib-api.html" title="使用Google AjaxLib API托管的js库">使用Google AjaxLib API托管的js库</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-06-14 -- <a href="http://ofcss.com/2008/06/14/june-15-start-use-new-domain.html" title="615：新域名正式启用">615：新域名正式启用</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-04-14 -- <a href="http://ofcss.com/2008/04/14/pjblog-guestbook-plus.html" title="PJBlog自带留言簿增强版改进">PJBlog自带留言簿增强版改进</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2005/11/24/goole-map-creator-for-my-blog.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP中的数字和字符比较</title>
		<link>http://ofcss.com/2005/11/23/compare-interge-with-string-in-asp.html</link>
		<comments>http://ofcss.com/2005/11/23/compare-interge-with-string-in-asp.html#comments</comments>
		<pubDate>Wed, 23 Nov 2005 06:48:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=20</guid>
		<description><![CDATA[昨晚和老迷聊天聊到很晚，说到一个把字符串转换为数字进行比较的问题。老迷说他喜欢保持字符串本身的类型，进行字符串的匹配比较，而不喜欢把字符串强制转换为数字进行比较。 一开始我不太明白这到底有什么区别，比如 a = "1" If a = 1 Then 'Something End If 和 a = "1" If a = "1" Then 'Something End If  在VB中，变量的数据类型默认是Variant，在必要的时候自动转换，例如上例第一种，由于表达式右边是数字，因此系统会自动将字符串变量a转换为数字类型，然后进行数字的比较。而第二种则没有转换类型这个过程。 这个从代码上看没有任何区别的比较过程，在执行时却差着一个步骤。这就是老迷关于他为什么更愿意保持字符串变量的字符串类型来进行比较的原因。 最简单的运用就是用户登录时，比如有个是否保存cookies的选项。通常是用下拉选择或者单选按钮，表单数据经过ASP程序读取之后，Request.Form(“cookies”)的值默认情况下是字符串类型的。我们往往是把它当成数字来用，有时候我们还习惯用 a = Cint(Request.Form(“cookies”))的方式在读取时进行转换，也或者不做转换，直接用 If a = 1 来判断。 实际上不管用哪种方法，都离不开一个转换的过程，而且为了避免 Cint 函数出错，我们往往还需要在前面增加一个IsNumeric的验证，这样一来，多出来的就不只是一个步骤了。 而如果我们直接把Request.Form(“cookies”)作为字符串考虑，我们只需要一行代码即可： If Request.Form("cookies") &#60;&#62; "" and a = "1" Then 就同时完成了数据有效性验证和比较。 这个很小的细节，在实际编程中用到的地方非常多，每个地方都多两个步骤，那的确在性能上就是比较低大的浪费了。 相关日志2005-11-18 -- 用ASP为blog程序编写Trackback功能2009-04-13 -- [...]]]></description>
			<content:encoded><![CDATA[<p>昨晚和老迷聊天聊到很晚，说到一个把字符串转换为数字进行比较的问题。老迷说他喜欢保持字符串本身的类型，进行字符串的匹配比较，而不喜欢把字符串强制转换为数字进行比较。</p>
<p>一开始我不太明白这到底有什么区别，比如</p>
<pre class="code">a = <span style="color: #a31515;">"1"
</span><span style="color: blue;">If </span>a = <span style="color: #a31515;">1 </span><span style="color: blue;">Then
     </span><span style="color: green;">'Something
</span><span style="color: blue;">End If</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>和</p>
<pre class="code">a = <span style="color: #a31515;">"1"
</span><span style="color: blue;">If </span>a = <span style="color: #a31515;">"1" </span><span style="color: blue;">Then
     </span><span style="color: green;">'Something
</span><span style="color: blue;">End If</span>
<span id="more-20"></span></pre>
<p> 在VB中，变量的数据类型默认是Variant，在必要的时候自动转换，例如上例第一种，由于表达式右边是数字，因此系统会自动将字符串变量a转换为数字类型，然后进行数字的比较。而第二种则没有转换类型这个过程。</p>
<p>这个从代码上看没有任何区别的比较过程，在执行时却差着一个步骤。这就是老迷关于他为什么更愿意保持字符串变量的字符串类型来进行比较的原因。</p>
<p>最简单的运用就是用户登录时，比如有个是否保存cookies的选项。通常是用下拉选择或者单选按钮，表单数据经过ASP程序读取之后，Request.Form(“cookies”)的值默认情况下是字符串类型的。我们往往是把它当成数字来用，有时候我们还习惯用 a = Cint(Request.Form(“cookies”))的方式在读取时进行转换，也或者不做转换，直接用 If a = 1 来判断。</p>
<p>实际上不管用哪种方法，都离不开一个转换的过程，而且为了避免 Cint 函数出错，我们往往还需要在前面增加一个IsNumeric的验证，这样一来，多出来的就不只是一个步骤了。</p>
<p>而如果我们直接把Request.Form(“cookies”)作为字符串考虑，我们只需要一行代码即可：</p>
<pre class="code"><span style="color: blue;">If </span>Request.Form(<span style="color: #a31515;">"cookies"</span>) &lt;&gt; <span style="color: #a31515;">"" </span><span style="color: blue;">and </span>a = <span style="color: #a31515;">"1" </span><span style="color: blue;">Then</span></pre>
<p>就同时完成了数据有效性验证和比较。</p>
<p>这个很小的细节，在实际编程中用到的地方非常多，每个地方都多两个步骤，那的确在性能上就是比较低大的浪费了。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2005-11-18 -- <a href="http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html" title="用ASP为blog程序编写Trackback功能">用ASP为blog程序编写Trackback功能</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2009-04-05 -- <a href="http://ofcss.com/2009/04/05/use-google-ajaxlib-api.html" title="使用Google AjaxLib API托管的js库">使用Google AjaxLib API托管的js库</a></li><li>2008-09-19 -- <a href="http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html" title="Oblog检测搜索引擎的一个问题">Oblog检测搜索引擎的一个问题</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-04-14 -- <a href="http://ofcss.com/2008/04/14/pjblog-guestbook-plus.html" title="PJBlog自带留言簿增强版改进">PJBlog自带留言簿增强版改进</a></li><li>2006-04-16 -- <a href="http://ofcss.com/2006/04/16/special-use-of-css.html" title="CSS居然可以这样用">CSS居然可以这样用</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2005/11/23/compare-interge-with-string-in-asp.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用ASP为blog程序编写Trackback功能</title>
		<link>http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html</link>
		<comments>http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html#comments</comments>
		<pubDate>Fri, 18 Nov 2005 12:56:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[博客]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=16</guid>
		<description><![CDATA[　　作为所谓的Blog三大特征之一的Trackback Ping，在网络上并没有一个真正的规范，它实际上最早是在Moveable发明并开始运用的一种技术，与另外两项被广泛认为是Blog最主要特征的RSS和Permalink相比，RSS本质上是是一种遵循W3C RDF规范的XML格式，Permalink是一种非常通用的静态地址技术，而Trackback Ping目前为止仅仅是在blog程序中得到运用，除了Moveable的一份技术规范文档外，也没有什么权威的标准，尤其在国内，众多blog程序有的支持有的不支持，有的有限支持，甚至还有因标准不一致而不能互相通信的(参见《blog is dead(blog已死)》)。 &#160;　　但是作为开发人员，我们不需要去讨论或者争论Trackback是不是死了、它会不会带来恶意Spam这些问题，就像垃圾邮件的存在，并不影响电子邮件的技术进步和使用一样。对于开发人员来讲，既然Trackback被认为是Blog的三大技术之一，而且blog程序的用户有这种需求，那我们在开发blog的时候，就应该包含这项技术。而且，我们应该尽可能地使我们开发的技术符合标准，或者规范，至少让它发挥作用。 &#160;　　Trackback Ping是由Moveable Type发明的规范，那么在没有更权威的标准之前，我们使用这项技术，当然应该以他们的规范为准，这里是他们的Trackback技术规范文档：http://www.movabletype.org/docs/mttrackback.html。 &#160;　　Trackback的完整实现至少包含两个方面，其一：客户端发送Trackback Ping；其二：服务器端接收和处理Trackback Ping，并向客户端返回处理结果。然后，根据需要我们可以考虑在客户端接收或者不接收，处理或者不处理返回的信息。下面是具体的代码： '#函数名：Trackback '#作 用：向指定的URL发送Trackback Ping，并根据服务器端返回的信息，提示用户处理情况。 '#参 数： '#RemoteURL = 目标URL，也即所引用的blog所提供的引用地址 '#MyBlogURL = 我的Blog的URL '#MyBlogName = 我的blog站点名称 '#MyBlogTitle = 当前这篇blog的标题 '#MyBlogExcerpt = 当前这篇blog的摘要 '#返回结果：字符串，以&#8220;&#124;&#8221;分隔，第一部分为数字，0表示成功，1表示有错；第二部分是具体信息。 Function Trackback(RemoteURL,MyBlogURL,MyBlogName,MyBlogTitle,MyBlogExcerpt) Dim objXMLHttp,objXML,intStat,strMessage,strPostInfo '对参数进行必要的处理，比如URLEncode之类 MyBlogURL = Server.URLEncode(MyBlogURL) MyBlogName = Server.URLEncode(MyBlogName) MyBlogTitle = Server.URLEncode(MyBlogTitle) MyBlogExcerpt = Server.URLEncode(MyBlogExcerpt) '构造要发送的请求内容 strPostInfo = [...]]]></description>
			<content:encoded><![CDATA[<p>　　作为所谓的Blog三大特征之一的Trackback Ping，在网络上并没有一个真正的规范，它实际上最早是在Moveable发明并开始运用的一种技术，与另外两项被广泛认为是Blog最主要特征的RSS和Permalink相比，RSS本质上是是一种遵循W3C RDF规范的XML格式，Permalink是一种非常通用的静态地址技术，而Trackback Ping目前为止仅仅是在blog程序中得到运用，除了Moveable的一份技术规范文档外，也没有什么权威的标准，尤其在国内，众多blog程序有的支持有的不支持，有的有限支持，甚至还有因标准不一致而不能互相通信的(参见<a target="_blank" href="http://blog.igooi.com/archive/2005/10/28/6716.aspx">《blog is dead(blog已死)》</a>)。<span id="more-16"></span></p>
<p>&nbsp;　　但是作为开发人员，我们不需要去讨论或者争论Trackback是不是死了、它会不会带来恶意Spam这些问题，就像垃圾邮件的存在，并不影响电子邮件的技术进步和使用一样。对于开发人员来讲，既然Trackback被认为是Blog的三大技术之一，而且blog程序的用户有这种需求，那我们在开发blog的时候，就应该包含这项技术。而且，我们应该尽可能地使我们开发的技术符合标准，或者规范，至少让它发挥作用。</p>
<p>&nbsp;　　Trackback Ping是由Moveable Type发明的规范，那么在没有更权威的标准之前，我们使用这项技术，当然应该以他们的规范为准，这里是他们的Trackback技术规范文档：<a href="http://www.movabletype.org/docs/mttrackback.html">http://www.movabletype.org/docs/mttrackback.html</a>。</p>
<p>&nbsp;　　Trackback的完整实现至少包含两个方面，其一：客户端发送Trackback Ping；其二：服务器端接收和处理Trackback Ping，并向客户端返回处理结果。然后，根据需要我们可以考虑在客户端接收或者不接收，处理或者不处理返回的信息。下面是具体的代码：</p>
<pre class="code"><span style="color: green">'#函数名：Trackback
'#作 用：向指定的URL发送Trackback Ping，并根据服务器端返回的信息，提示用户处理情况。
'#参 数：
'#RemoteURL = 目标URL，也即所引用的blog所提供的引用地址
'#MyBlogURL = 我的Blog的URL
'#MyBlogName = 我的blog站点名称
'#MyBlogTitle = 当前这篇blog的标题
'#MyBlogExcerpt = 当前这篇blog的摘要
'#返回结果：字符串，以&ldquo;|&rdquo;分隔，第一部分为数字，0表示成功，1表示有错；第二部分是具体信息。 

</span><span style="color: blue">Function </span>Trackback(RemoteURL,MyBlogURL,MyBlogName,MyBlogTitle,MyBlogExcerpt)
    <span style="color: blue">Dim </span>objXMLHttp,objXML,intStat,strMessage,strPostInfo
    <span style="color: green">'对参数进行必要的处理，比如URLEncode之类
    </span>MyBlogURL = Server.URLEncode(MyBlogURL)
    MyBlogName = Server.URLEncode(MyBlogName)
    MyBlogTitle = Server.URLEncode(MyBlogTitle)
    MyBlogExcerpt = Server.URLEncode(MyBlogExcerpt)
    <span style="color: green">'构造要发送的请求内容
    </span>strPostInfo = <span style="color: #a31515">&quot;title=&quot; </span>&amp; MyBlogTitle
    strPostInfo = strPostInfo &amp; <span style="color: #a31515">&quot;&amp;url=&quot; </span>&amp; MyBlogURL
    strPostInfo = strPostInfo &amp; <span style="color: #a31515">&quot;&amp;excerpt=&quot; </span>&amp; MyBlogExcerpt
    strPostInfo = strPostInfo &amp; <span style="color: #a31515">&quot;&amp;blog_name=&quot; </span>&amp; MyBlogName
    <span style="color: green">'创建对象
    </span><span style="color: blue">Set </span>objXMLHttp = Server.CreateObject(<span style="color: #a31515">&quot;MSXML2.ServerXMLHTTP&quot;</span>)
    <span style="color: blue">Set </span>objXML = Server.CreateObject(<span style="color: #a31515">&quot;Microsoft.XMLDOM&quot;</span>)
    <span style="color: green">'以post方式打开XMLHTTP对象
    </span>objXMLHttp.Open <span style="color: #a31515">&quot;POST&quot;</span>, RemoteURL, <span style="color: blue">false
    </span><span style="color: green">'发送请求内容，判断发送情况，并进行处理
    </span><span style="color: blue">On Error Resume Next
    </span>objXMLHttp.Send strPostInfo
    <span style="color: blue">If </span>Err.Number &lt;&gt; 0 <span style="color: blue">Then
        </span>Trackback = <span style="color: #a31515">&quot;1|TrackBack错误：无法连接服务器&quot;
    </span><span style="color: blue">Else
        If </span>(objXMLHttp.readyState &lt;&gt; 4) <span style="color: blue">or </span>(objXMLHttp.Status &lt;&gt; 200) <span style="color: blue">Then
            </span>objXMLHttp.Abort Trackback = <span style="color: #a31515">&quot;1|Trackback超时&quot;
        </span><span style="color: blue">Else
            </span>objXML.async = <span style="color: blue">false
            </span>objXML.load(objXMLHttp.responseXML)
            <span style="color: blue">If </span>objXML.parseError.errorCode &lt;&gt; 0 <span style="color: blue">Then
                </span>Trackback = <span style="color: #a31515">&quot;1|TrackBack响应解析错误&quot;
            </span><span style="color: blue">Else
                If </span>objXML.getElementsByTagName(<span style="color: #a31515">&quot;error&quot;</span>)(0).Text=<span style="color: #a31515">&quot;0&quot; </span><span style="color: blue">Then
                    </span>Trackback = <span style="color: #a31515">&quot;0|Trackback成功&quot;
                </span><span style="color: blue">Else
                    </span>Trackback = <span style="color: #a31515">&quot;1|Trackback错误：&quot;</span>&amp;objXML.getElementsByTagName(<span style="color: #a31515">&quot;message&quot;</span>)(0).Text
                <span style="color: blue">End If
            End If
        End If
    End If
    </span><span style="color: green">'释放对象
    </span><span style="color: blue">Set </span>objXMLHTTP = <span style="color: blue">Nothing
    Set </span>objDom = <span style="color: blue">Nothing
End Function</span></pre>
<pre class="code"><span style="color: green">'#过程名：DealRequest
'#作 用：接收和处理客户端发来的Trackback Ping
'#参 数：无
</span><span style="color: blue">Sub </span>DealRequest()
    <span style="color: blue">Dim </span>blog_id,tbTitle,tbName,tbURL,tbExcerpt,stat 

    <span style="color: green">'从所请求的URL中提取所引用的blogID，以便从数据库中检索对应的blog
    '这个参数根据你所写的blog程序提供的Trackback地址形式而定
    '这里我们假设这个参数为&ldquo;id&rdquo; 

    </span>blog_id = Request.QueryString(<span style="color: #a31515">&quot;id&quot;</span>) 

    <span style="color: green">'读取出客户端传来的请求中的每个部分
    '注意，这里没有对以Get方式提交的请求作出处理
    '因为2003年以后根据技术规范已经不再接受Get方式的请求
    '如果希望增强兼容性，可以加上对Get方式的请求的处理 

    </span>tbTitle = Request.Form(<span style="color: #a31515">&quot;title&quot;</span>)
    tbName = Request.Form(<span style="color: #a31515">&quot;blog_name&quot;</span>)
    tbURL = Request.Form(<span style="color: #a31515">&quot;url&quot;</span>)
    tbExcerpt = Request.Form(<span style="color: #a31515">&quot;excerpt&quot;</span>) 

    <span style="color: green">'检索数据库中id为blog_id的blog数据和url为tbURL的Trackback记录
    '如果blog不存在，或者Trackback记录已存在，向客户端返回相应的出错说明
    '我们这里调用一个进程tbResponseXML来完成这项工作
    '调用时，以参数stat=0[1,2]分别表示成功、日志不存在和记录已存在 

    </span>tbResponseXML(stat,<span style="color: #a31515">&quot;utf-8&quot;</span>) 

    <span style="color: green">'如果是成功，还应当做好更新TrackBack记录和相关blog引用数的工作
</span><span style="color: blue">End Sub</span></pre>
<pre class="code"><span style="color: green">'#过程名：tbResponseXML
'#作 用：接收和处理客户端发来的Trackback Ping
'#参 数：
'#stat：错误代码，0=成功；1=日志不存在；2=Trackback记录已存在
'#strCharset：要返回的XML的编码 

</span><span style="color: blue">Sub </span>tbResponseXML(stat,strCharset)
    Response.ContentType = <span style="color: #a31515">&quot;text/xml&quot;
    </span>Response.Charset = strCharset
    Response.Write <span style="color: #a31515">&quot;&lt;?xml version=&quot;&quot;1.0&quot; </span>encoding=<span style="color: #a31515">&quot;&quot;&quot; &amp; strCharset &amp; &quot;&quot;&quot;</span>?&gt;&quot;
    Response.Write <span style="color: #a31515">&quot;&lt;error&gt;&quot; </span>&amp; stat &amp; <span style="color: #a31515">&quot;&lt;/error&gt;&quot;
    </span><span style="color: blue">If </span>stat = 1 <span style="color: blue">Then
        </span>Response.Write <span style="color: #a31515">&quot;&lt;message&gt;The blog you're trackbacking isn't exist!&lt;/message&gt;&quot;
    </span><span style="color: blue">ElseIf </span>stat = 2 <span style="color: blue">Then
        </span>Response.Write <span style="color: #a31515">&quot;&lt;message&gt;You can not Trackback a blog twice from the same URL.&lt;/message&gt;&quot;
    </span><span style="color: blue">End If
End Sub</span></pre>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-09-19 -- <a href="http://ofcss.com/2008/09/19/bug-about-search-engine-of-oblog.html" title="Oblog检测搜索引擎的一个问题">Oblog检测搜索引擎的一个问题</a></li><li>2005-11-24 -- <a href="http://ofcss.com/2005/11/24/goole-map-creator-for-my-blog.html" title="为我的blog写的Google地图生成器">为我的blog写的Google地图生成器</a></li><li>2005-11-23 -- <a href="http://ofcss.com/2005/11/23/compare-interge-with-string-in-asp.html" title="ASP中的数字和字符比较">ASP中的数字和字符比较</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2009-04-05 -- <a href="http://ofcss.com/2009/04/05/use-google-ajaxlib-api.html" title="使用Google AjaxLib API托管的js库">使用Google AjaxLib API托管的js库</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-06-14 -- <a href="http://ofcss.com/2008/06/14/june-15-start-use-new-domain.html" title="615：新域名正式启用">615：新域名正式启用</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2005/11/18/add-trackback-to-pjblog.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

