# Thursday, April 14, 2005

小马又有话说了:“上个月忙于工作一直没时间翻译。从愚人节那天才又重新开始翻译。原来在家里是用Windows下的Word排的版,现在在办公室改用Linux系统了,所以用OpenOffice把原来翻译的前三章重新排了版,重新排版的过程中,感觉OpenOffice其实也挺好用的,至少对这个排版我感觉比用 Windows下的Word还要方便。而且输出PDF文档比Word要方便的多。下面是刚刚翻译完的《Bindows用户手册》前五章,前三章在重新排版的过程中已经校对过2遍了,应该没有什么大错误,后面两章刚刚翻译完(我也只是在工作之余才进行翻译,而且中间还病了一场,所以真正用来翻译的时间并不多),还没有校对,可能又不少错误,如果各位有时间看的话,希望能把错误之处指出来,我可以在后面翻译的过程中进行改正。”
《Bindows用户手册》前五章中文翻译预览版下载: http://bindows.coolcode.cn/BindowsManual.pdf (已经失效)

posted on Thursday, April 14, 2005 10:17:44 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Tuesday, April 12, 2005
引自http://www.2solo.net/blog/showlog.asp?cat_id=27&log_id=494的一篇关于在Asp中如何实现ZT条型码的例子。有一定的学习和参考价值,在此推荐给大家。
posted on Tuesday, April 12, 2005 11:16:56 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Tuesday, April 05, 2005
Reflector是一款强大的反编译工具.使用它你可以方便的查看一些组件的源代码.它的强大之处不仅在此, 它本身还提供了一个添加插件的框架, 使得它的功能可以很容易的得到扩展, 基于此已经有围绕它的插件开发出来.目前就包括将反编译的源代码直接导出文件, 查看源代码的统计信息等等很有用的插件.
posted on Tuesday, April 05, 2005 11:31:26 AM (China Standard Time, UTC+08:00)  #    Comments [0]
Cω是微软研究院对下一代语言的探索。它扩展了C#的功能,更好的支持数据访问(SQL和XML)和并发控制。 Cω的希望能方便的开发出更加可靠且维护性更好的软件,其中一个重要的概念就是"尽早的发现错误"。 在下面的一个数据库查询的例子中将很好的体现出这一点。
posted on Tuesday, April 05, 2005 11:24:39 AM (China Standard Time, UTC+08:00)  #    Comments [0]
# Monday, April 04, 2005
asp爱好者们经常喜欢从网上下载免费代码,但是却经常遇到一个问题:代码被加密了!!我们知道这些代码是可以解密的,网上有很多解密工具:) 。本文提供了利用asp技术来批量解码被加密的asp文件的例程,希望能对大家有所帮助。
posted on Monday, April 04, 2005 4:58:26 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Monday, March 28, 2005

早期就一直关注着DasBlog,这款Asp.net+XML的Blog系统。因为它拥有着其他众多Blog所没有的特性。
去年(2004年)使用DasBlog的时候,发现了问题,并发现了很多不适合或者不满足中国人的东西,所以开始学着宝玉研究DOTNET Forum一样来研究Dasblog的系统构架和代码,做Dasblog系统的本土化改进。希望能在不久的未来出来一款适合中国人使用的DasBlog来。

让我们一起努力吧!!!

posted on Monday, March 28, 2005 1:22:22 PM (China Standard Time, UTC+08:00)  #    Comments [2]
# Saturday, March 26, 2005
Snippet Compiler、Regulator、CodeSmith、NUnit、FxCop、.NET Reflector、NDoc、NAnt、两个转换工具
posted on Saturday, March 26, 2005 11:30:40 AM (China Standard Time, UTC+08:00)  #    Comments [0]
# Wednesday, March 23, 2005
posted on Wednesday, March 23, 2005 5:12:10 PM (China Standard Time, UTC+08:00)  #    Comments [2]
一个程序详细研究DataReader,同时显示Command用法; 功能:演示DataReader的各项操作; 说明:如果需要文字说明请查看我的BLOG里面关于ado.net的文章; 作者:雪冬寒; BOLG:http://blog.csdn.net/bineon
posted on Wednesday, March 23, 2005 5:08:34 PM (China Standard Time, UTC+08:00)  #    Comments [0]
中国电话号码验证
匹配形式如:0511-4405222 或者021-87888822 或者 021-44055520-555 或者 (0511)4405222
正则表达式 "((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*"

中国邮政编码验证
匹配形式如:215421
正则表达式 "d{6}"

电子邮件验证
匹配形式如:justali@justdn.com
正则表达式 "w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*"

身份证验证
匹配形式如:15位或者18位身份证
正则表达式 "d{18}|d{15}"

常用数字验证
正则表达式 
"d{n}" n为规定长度
"d{n,m}" n到m的长度范围

非法字符验证
匹配非法字符如:< > & / ' | 
正则表达式 [^<>&/|'\]+

日期验证
匹配形式如:20030718,030718
范围:1900--2099
正则表达式((((19){1}|(20){1})d{2})|d{2})[01]{1}d{1}[0-3]{1}d{1}
posted on Wednesday, March 23, 2005 5:04:12 PM (China Standard Time, UTC+08:00)  #    Comments [3]
JS里做小数的乘法运算时会出现浮点错误,比如说结果是251.89999999999998 而不是251.9 这个问题想必有很多人为之头痛。那么如何解决呢?在此给出解决办法。
posted on Wednesday, March 23, 2005 5:01:16 PM (China Standard Time, UTC+08:00)  #    Comments [1]
在系统开发时我们经常需要对数据进行加密,本文用C#描述了.net中的加密技术,以下就是是使用了不同的加密方法加密/解密字符串:DES HMACSHA1 SHA1 RC2 MD5 等,待续 ……
posted on Wednesday, March 23, 2005 4:50:09 PM (China Standard Time, UTC+08:00)  #    Comments [0]
DotNet专业词汇英中对照表,从微软MSDN的文档中转载过来的。希望能对各位DOTNET技术人员有用:)
posted on Wednesday, March 23, 2005 4:47:37 PM (China Standard Time, UTC+08:00)  #    Comments [3]
本文集合了很多精彩的C#入门代码集,包含了常用的C#功能例程。希望对DotNet技术新手或爱好者有所帮助和启示。
posted on Wednesday, March 23, 2005 4:44:26 PM (China Standard Time, UTC+08:00)  #    Comments [1]
这个媒体播放工具软件,是站长早期的一个还不是很成型的小作。
在济南大学和其他个别院校有不少用户。
软件包含两部分:Flash播放器和普通媒体播放器。
优点:系统资源消耗少,纠错能力较强。
点击下载
posted on Wednesday, March 23, 2005 4:42:37 PM (China Standard Time, UTC+08:00)  #    Comments [0]
站长在济南上大学的时候与同学一起设计开发的一个五子棋游戏:GoBang。
这个游戏我们按照开源协议将源代码公开。
任何个人和集体都可以参与修改,但是请保留本游戏的源码版权。
点击下载
(内含:设计文档、帮助、开源协议等)
posted on Wednesday, March 23, 2005 4:41:34 PM (China Standard Time, UTC+08:00)  #    Comments [0]
早就写好的,本不想放出来,毕竟用L-Blog的人很多,但如果被人恶意利用那就天下大乱了,所以....
本文只写出了漏洞的存在,并没有写具体如何操作入侵,希望Loveyuki看了赶紧修补。

涉及版本:
^^^^^^
L-Blog官方所有版本(进入后台漏洞只存在于L-Blog 1.06 (SE) Final和L-Blog 1.08 (SE) Final)

危害:
^^^^
普通会员可以发表、修改、删除日志,可以直接进入后台管理。怕怕 。

描述:
^^^^
L-Blog是一款由Loveyuki开发的源代码开放的Asp Blog,由于其用户验证采用Cookies方式,而又没对其进行严格校验,进而威胁整个Blog或服务器安全。

具体:
^^^^
很简单的Cookies欺骗,我想就不用我说了吧,至于如何进入后台,也很简单,’ or ‘1’=’1,很经典也很古老的漏洞,想不到Loveyuki会犯这样的低级错误!

解决方案:
^^^^^^
个人觉得可以加入数据库的校验,也可以采用Session,如果不会修改那就等Loveyuki出补丁了。


后记:希望大家不要做任何违法的事情,本站不负任何法律责任。
(此漏洞本站已修补,请不要再试,谢谢合作!)

                                                                                  
                                                                   By sfzhi
                                                                   2004.10
posted on Wednesday, March 23, 2005 4:38:36 PM (China Standard Time, UTC+08:00)  #    Comments [0]
最近做公司内的一个小项目,需要做一个多选项目的删除功能,于是写以下JS脚本例子来实现,其实也是经常用到的比较基础的东西,高手就不用看了。


程序代码:
<script language="javascript">
<!--

function CA(frm)
{
var trk=0;
for (var i=0;i<frm.elements.length;i++)
{
var e=frm.elements[i];
if ((e.name != 'allbox') && (e.type=='checkbox') && (e.name != '不想被选中的checkbox的名称'))
{
trk++;
e.checked=frm.allbox.checked;
frm.del.disabled = frm.allbox.checked?false:true;//全选对删除按钮的disabled属性的影响
}
}
}

function CCA(frm,CB)
{
var TB=TO=0;
for (var i=0;i<frm.elements.length;i++)
{
var e=frm.elements[i];
if ((e.name != 'allbox') && (e.type=='checkbox') && (e.name != '不想被选中的checkbox的名称'))
{
TB++;
if (e.checked)
TO++;
}
}
frm.allbox.checked=(TO==TB)?true:false;

if (0==TO)//全部未选中和选中一些时对删除按钮的disabled属性的影响
{
frm.del.disabled = true;
}
else
{
frm.del.disabled = false;
}
}

-->
</script>


调用方法:
全选的名称定为allbox,onclick事件执行CA(this.form);
选择项的checbox的onclick事件执行CCA(this.form,this);
posted on Wednesday, March 23, 2005 4:36:38 PM (China Standard Time, UTC+08:00)  #    Comments [0]
近日被一个问题给疑惑:如何向一个数据库表内插入一个数据,然后获得插入后的产生的主键值,并将该值和其他参数写入另一个表,因为一直使用mysql, access等不含存储过程的数据库,所以百死不得其解,终于从日本朋友那里得到了使用存储过程实现解决办法,其实看看也挺简单的。 都怪自己学艺不精。


程序代码:
CREATE procedure develop.insert_base_grid(@b_i int, @e_c int,@p_c varchar(192),@g_cint,@g_n int)
as
    -- 変数宣言

DECLARE @parent INT -- 親レコードのID 保存
DECLARE @error INT -- エラー値 保存
-- トランザクション開始
BEGIN TRANSACTION
    -- 親レコードの挿入

    INSERT INTO develop.syuko_base ( bills_id, employee_cd, prmss_comments,prmss_update, prmss_registdate )
    SELECT @b_i AS チラシID, @e_c AS 出稿MDCD, @p_c AS コメント, getDate()AS 更新日, getDate() AS 登録日;
    SET @error = @@ERROR
    IF @ERROR <> 0 GOTO EXIST_ERR
    -- 親レコードのID の値を保存
    SET @parent = SCOPE_IDENTITY()

    -- 子レコードの挿入
    INSERT INTO develop.gridinfo ( prmss_id, grid_cd, grid_num)
    SELECT @parent AS 出稿CD, @g_c AS グリッドCD, @g_n AS グリッド数;
    SET @error = @@ERROR
    IF @ERROR <> 0 GOTO EXIST_ERR

    -- トランザクションのコミット
    COMMIT TRANSACTION
    GOTO EXIST

-- エラー処理
EXIST_ERR:
    ROLLBACK TRANSACTION
    PRINT @error
    GOTO EXIST

-- 終了処理
EXIST:
GO
posted on Wednesday, March 23, 2005 4:34:11 PM (China Standard Time, UTC+08:00)  #    Comments [0]
程序代码:
IMGPath="icon_lblog.gif"

Set PP=New ImgWHInfo  
W = PP.imgW(Server.Mappath(IMGPath))  
H = PP.imgH(Server.Mappath(IMGPath)) 
Set pp=Nothing 
 
Response.Write("<img src='"&IMGPath&"' border=0><br>宽:"&W&";高:"&H)

类代码:
<%Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP
    Dim ASO
    Private Sub Class_Initialize
        Set ASO=Server.CreateObject("ADODB.Stream")
        ASO.Mode=3
        ASO.Type=1
        ASO.Open
    End Sub
    Private Sub Class_Terminate
        Err.Clear
        Set ASO=Nothing
    End Sub

    Private Function Bin2Str(Bin)
        Dim I, Str
        For I=1 To LenB(Bin)
            clow=MidB(Bin,I,1)
            If ASCB(clow)<128 Then
                Str = Str & Chr(ASCB(clow))
            Else
                I=I+1
                If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
            End If
        Next
        Bin2Str = Str
    End Function
      
    Private Function Num2Str(Num,Base,Lens)
        Dim Ret
        Ret = ""
        While(Num>=Base)
            Ret = (Num Mod Base) & Ret
            Num = (Num - Num Mod Base)/Base
        Wend
        Num2Str = Right(String(Lens,"0") & Num & Ret,Lens)
    End Function
      
    Private Function Str2Num(Str,Base)
        Dim Ret,I
        Ret = 0
        For I=1 To Len(Str)
            Ret = Ret *base + Cint(Mid(Str,I,1))
        Next
        Str2Num=Ret
    End Function
      
    Private Function BinVal(Bin)
        Dim Ret,I
        Ret = 0
        For I = LenB(Bin) To 1 Step -1
            Ret = Ret *256 + AscB(MidB(Bin,I,1))
        Next
        BinVal=Ret
    End Function
      
    Private Function BinVal2(Bin)
        Dim Ret,I
        Ret = 0
        For I = 1 To LenB(Bin)
            Ret = Ret *256 + AscB(MidB(Bin,I,1))
        Next
        BinVal2=Ret
    End Function
      
    Private Function GetImageSize(filespec)
        Dim bFlag
        Dim Ret(3)
        ASO.LoadFromFile(filespec)
        bFlag=ASO.Read(3)
        Select Case Hex(binVal(bFlag))
        Case "4E5089":
            ASO.Read(15)
            ret(0)="PNG"
            ret(1)=BinVal2(ASO.Read(2))
            ASO.Read(2)
            ret(2)=BinVal2(ASO.Read(2))
        Case "464947":
            ASO.read(3)
            ret(0)="gif"
            ret(1)=BinVal(ASO.Read(2))
            ret(2)=BinVal(ASO.Read(2))
        Case "535746":
            ASO.read(5)
            binData=ASO.Read(1)
            sConv=Num2Str(ascb(binData),2 ,8)
            nBits=Str2Num(left(sConv,5),2)
            sConv=mid(sConv,6)
            While(len(sConv)<nBits*4)
                binData=ASO.Read(1)
                sConv=sConv&Num2Str(AscB(binData),2 ,8)
            Wend
            ret(0)="SWF"
            ret(1)=Int(Abs(Str2Num(Mid(sConv,1*nBits+1,nBits),2)-Str2Num(Mid(sConv,0*nBits+1,nBits),2))/20)
            ret(2)=Int(Abs(Str2Num(Mid(sConv,3*nBits+1,nBits),2)-Str2Num(Mid(sConv,2*nBits+1,nBits),2))/20)
        Case "FFD8FF":
            Do  
            Do: p1=binVal(ASO.Read(1)): Loop While p1=255 And Not ASO.EOS
            If p1>191 And p1<196 Then Exit Do Else ASO.read(binval2(ASO.Read(2))-2)
            Do:p1=binVal(ASO.Read(1)):Loop While p1<255 And Not ASO.EOS
            Loop While True
            ASO.Read(3)
            ret(0)="JPG"
            ret(2)=binval2(ASO.Read(2))
            ret(1)=binval2(ASO.Read(2))
        Case Else:
            If left(Bin2Str(bFlag),2)="BM" Then
                ASO.Read(15)
                ret(0)="BMP"
                ret(1)=binval(ASO.Read(4))
                ret(2)=binval(ASO.Read(4))
            Else
                    ret(0)=""
            End If
        End Select
        ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &""""
        getimagesize=ret
    End Function
      
    Public Function imgW(IMGPath)
        Dim FSO,IMGFile,FileExt,Arr
        Set FSO = Server.CreateObject("Scripting.FileSystemObject")
        If (FSO.FileExists(IMGPath)) Then
            Set IMGFile = FSO.GetFile(IMGPath)
            FileExt=FSO.GetExtensionName(IMGPath)
            Select Case FileExt
                Case "gif","bmp","jpg","png":
                Arr=GetImageSize(IMGFile.Path)
                imgW = Arr(1)
            End Select
            Set IMGFile=Nothing
        Else
            imgW = 0
        End If    
        Set FSO=Nothing
    End Function
    
    Public Function imgH(IMGPath)
        Dim FSO,IMGFile,FileExt,Arr
        Set FSO = server.CreateObject("Scripting.FileSystemObject")
        If (FSO.FileExists(IMGPath)) Then
            Set IMGFile = FSO.GetFile(IMGPath)
            FileExt=FSO.GetExtensionName(IMGPath)
            Select Case FileExt
                Case "gif","bmp","jpg","png":
                Arr=getImageSize(IMGFile.Path)
                imgH = Arr(2)
            End Select
            Set IMGFile=Nothing
        Else
            imgH = 0
        End If    
        Set FSO=Nothing
    End Function
End Class
%>
posted on Wednesday, March 23, 2005 4:32:47 PM (China Standard Time, UTC+08:00)  #    Comments [0]
刚学C#写的一个小程序,来列举本地的进程,两种模式:
1.列举出进程的starttime和title。
2.列举出进程的执行文件完全路径。
编译环境:Windows 2003+Microsoft.NET Framework v1.1.4322
附上源码:

程序代码:

//List all processes on local system(two modes) 

//Kill the specified process 

//By sfzhi at 24/Sep/2004 

using System; 
using System.Diagnostics; 
using System.Management; 
public class PK 

    public static void Main(string[] args) 
    { 
       if(args.Length != 1) 
       { 
        help(); 
       } 
       else 
       { 
        switch(args[0]) 
        { 
         case "/t"
          psst(); 
         break
         case "/p"
          psph(); 
         break
         default
          kill(args[0]); 
         break
        } 
       } 
    } 
    //Show the Usage 

    private static void help() 
    { 
     Console.WriteLine("Local System Process Lister and Killer V1.0 (2004-9-25 C#) "); 
     Console.WriteLine("Code by sfzhi msn:idazhi@hotmail.com"); 
     Console.WriteLine(); 
     Console.WriteLine("Usage:    pk    "); 
     Console.WriteLine("Options:  /t         - Show the starttime and title of all processes"); 
     Console.WriteLine("          /p         - Show the path to executable file of all processes"); 
     Console.WriteLine("          PID/Name   - Kill the specified process"); 
    } 
    //Show the starttime and title of all processes 

    private static void psst() 
    { 
        Process[] procList = Process.GetProcesses(); 
        Console.WriteLine("{0,-6}{1,-12}{2,-22}{3}","PID","Process","StartTime","Title"); 
        for (int i=0;i<procList.Length-1;i++)         
        {         
            string strProcName = procList[i].ProcessName; 
            int iProcID = procList[i].Id; 
            DateTime dProcStTime = procList[i].StartTime; 
            string strProcTitle = procList[i].MainWindowTitle; 
            Console.WriteLine("{0,-6}{1,-12}{2,-22}{3}",iProcID,strProcName,dProcStTime,strProcTitle); 
        } 
    } 
    //Show the path to executable file of all processes 

    private static void psph() 
    { 
        Process[] p = Process.GetProcesses(); 
         ManagementObjectSearcher searcher; 
        ManagementObjectCollection collection;     
        searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Process"); 
        collection = searcher.Get(); 
        Console.WriteLine("{0,-5}{1,-16}{2}","PID","ProcName","ProcessPath"); 
        foreach (ManagementObject service in collection) 
        { 
         Console.WriteLine("{0,-5}{1,-16}{2}",service["ProcessID"],service["Name"],service["ExecutablePath"]); 
        } 
     } 
     //Terminate the specified process 

     private static void kill(string idname) 
       { 
           Process[] all = Process.GetProcesses(); 
           foreach(Process p in all) 
           { 
             if(p.Id.ToString() == idname || p.ProcessName == idname) 
             { 
                  p.Kill(); 
                  p.Close(); 
                  Console.WriteLine("Process {0} was terminated successfully",idname); 
              } 
           } 
       } 
posted on Wednesday, March 23, 2005 4:30:53 PM (China Standard Time, UTC+08:00)  #    Comments [0]
    以DropDownList控件为例讲一下asp.net的数据绑定技术,适合初手阅读,高手免读。

System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(); 
sqlconn.ConnectionString = "workstation id=localhost;packet size=4096;user  
id=sa;data source=db1;persist security info=False;initial catalog=DB"
;  
sqlconn.Open(); 
System.Data.SqlClient.SqlDataAdapter sqldar = new System.Data.SqlClient.SqlDataAdapter("select UserName from forums_Users",sqlconn);  
sqldar.SelectCommand.CommandType = CommandType.Text;  
System.Data.DataSet DataSet1= new System.Data.DataSet();  
sqldar.Fill(DataSet1,"Users");  
DropDownList1.DataSource = DataSet1.Tables["Users"].DefaultView;  
DropDownList1.DataTextField="UsersName";  
DropDownList1.DataBind();  
sqlconn.Close(); 

第一行是创建一个sql连接对象sqlconn;
第二行是给新建的sql连接对象sqlconn的连接字符串赋予正确的值;
第三行是让sql连接对象sqlconn打开,连接sql数据库;
第四行是创建一个sql适配器对象sqldar,并同时让其使用sqlconn对象执行一条sql查询语句;
第五行是设置sqldar对象的命令类型为文本型;
第六行是创建一个数据集对象DataSet1;
第七行是将sqldar执行的结果填充到DataSet1中,并将命名为Users;
第八行是将DropDownList的数据源设置为DataSet1的Users,并使用默认的查看模式;
第九行是设置DropDownList空间的显示项对应的字段名UsersName;
第十行是执行DropDownList的数据绑定方法;
第十一行是关闭sqlconn对象。

*** 这段代码就是实现了DropDownList的选择项为Users表中的UsersName,只是一个简单的示范,通常在使用过长中会更细致甚至更麻烦一些,但是基本的思想是一样的:创建你需要的数据源,让指定的server端web控件与你的数据源绑定,指定显示项和显示项对应的value
posted on Wednesday, March 23, 2005 4:28:48 PM (China Standard Time, UTC+08:00)  #    Comments [0]
    新手在进行asp.net应用或者webservice应用开发的时候,往往忽略Web.config这个配置文件。下面我来说一下这个文件的一个使用问题。

    我们知道在web上的应用系统开发的时候,会经常要进行数据库连接,通常新手会把数据库连接字符串在程序里直接写,这样造成了开发的系统在后期的维护和移植过程中出现很麻烦的事情:花很多的时间修改程序中的所有数据库连接字符串。而asp.net是需要编译的,所以会比php、asp、jsp更麻烦。但是.net是为了让程序员更方便的做开发的,而不是更麻烦。那么我们如何让这件事情变得简单呢?那就是在Web.config文件的平凡而伟大的作用。
    我们知道默认的Web.config文件的头部结构如下:  

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web> 

    在这个xml格式的Web.config里没有我们可以利用的东西,但是我们如果添加一个应用配置标签,那么情况就不同了。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ConnectionString" value="……"/>
</appSettings>
<system.web> 

    这里的……就是你要在程序中经常使用的连接字符串了,当然你也可以更多添加其他名称的应用配置信息,只需要一行<add key="其他名称" value="其他值"/>就可以了。那么这个值如何调用呢?下面给出一个C#描述的调用方法:

conn = new System.Data.SqlClient.SqlConnection(); 
conn.ConnectionString = System.Configuration.ConfigurationSettings.AppSettings.Get("ConnectionString"); 


(结束)
posted on Wednesday, March 23, 2005 4:20:27 PM (China Standard Time, UTC+08:00)  #    Comments [0]