Discuz!NT在线用户自动归零Bug分析及解决办法

使用Discuz!NT一段时间的,最近发现论坛上面的在线用户频繁归零,以前都没有出现过这样的错误,对服务器进行检查后,确定不是服务器的问题,于是就考虑是不是Discuz!NT的Bug

幸好Discuz!NT是开源的,于是从官网Down源代码下来解读当中的奥秘

在源代码中找到了下面一段:

  /// <summary>
  /// 复位在线表, 如果系统未重启, 仅是应用程序重新启动, 则不会重新创建
  /// </summary>
  /// <returns></returns>
  public static int ResetOnlineList()
  {
   try
   {
    // 取得在线表最后一条记录的tickcount字段 (因为本功能不要求特别精确)
                //int tickcount = DatabaseProvider.GetInstance().GetLastTickCount();
    // 如果距离现在系统运行时间小于10分钟
                if (System.Environment.TickCount < 600000)
                {
                    return InitOnlineList();
                }
    return -1;
   }
   catch
   {
    try
    {
     return InitOnlineList();
    }
    catch
    {
     return -1;
    }
   }

  }

从上面的代码可以看出如果系统运行时间大于10分钟,就算应用程序重新启动, 也不会归零在线用户表的,但Discuz!NT似乎忽略了一点,就是System.Environment.TickCount的值

引用Msdn中的一段话

该属性的值从系统计时器派生,并以 32 位有符号整数的形式存储。因此,如果系统连续运行,TickCount 将在约 24.9 天内从零递增至 Int32.MaxValue,然后跳至 Int32.MinValue(这是一个负数),再在接下来的 24.9 天内递增至零。

也就是说当过了24.9天之后,System.Environment.TickCount的值就为负数,System.Environment.TickCount < 600000的值就为True,在线用户表就会经常被重建归零

知道原理后有什么解决办法呢?

1、最笨的办法重启服务器,这样的话System.Environment.TickCount的值就会归零,你又能用24.9天了

2、如果懂得编程的话就Down源代码下来,把判断逻辑修改为:

if (System.Environment.TickCount < 600000 && System.Environment.TickCount >= 0)

再重新编译DLL,覆盖上去

我这有个已经编译好的文件: Discuz.Forum.rar (86.04 kb)

注:该文件使用2.0的源代码编译的,2.1由于没有公开源代码,所以未能编译,补丁没在2.1试过,使用前注意备份

小记——海南行

来了海南一个星期多了,在弄酒店系统
这里的气候不错,住的地方也很好,五颗星的,就是周边有点冷清
在这里第一次打Golf,感觉这的确是有钱人才能玩得起的奢侈运动,无爱
用的机子配置也不错,E5200+2G+G100,但可能是软件问题用起来没有家里自己的电脑,这样的机子不能用微软送我的天上版可惜了
项目上,系统的上线有点紧,老大几乎每天通宵,仿佛看到以前的我,自从上次大病一场之后我很少这样通宵了,劝一下各位注意休息啊
另:手机没带数据线PP随后补上

GB2312中的汉字编码规则

01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。

另附GB2312编码表: gb2312.TXT (15.55 kb)

VB2008异步调用WebService

下面将通过一个窗体程序和本站提供的Web服务来演示如何用VB2008异步调用WebService

1、首先创建一个WindowsApplication

2、添加一个WebService的引用(本Demo中使用的是http://webservice.lishewen.com.cn/EvalService.asmx

注意在WebService引用的高级选项中勾选(Generate asynchronous operations)

3、设计好窗体

4、相关的代码如下:

Public Class Form1

    Private BeginTime, EndTime As DateTime
    Private TimeBeginToEnd As TimeSpan

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '实例化Web服务
        Dim wb As New LSWEvalService.算神工作室表达式计算服务SoapClient
        '执行完成的委托
        AddHandler wb.EvalCompleted, AddressOf wb_EvalCompleted
        BeginTime = Now
        If Not String.IsNullOrEmpty(TextBox1.Text) Then
            'WebService方法的异步调用
            wb.EvalAsync(TextBox1.Text)
        Else
            MsgBox("请输入表达式")
        End If
    End Sub

    'Eval方法执行完成后触发
    Private Sub wb_EvalCompleted(ByVal sender As Object, ByVal e As LSWEvalService.EvalCompletedEventArgs)
        EndTime = Now
        '计算时间差
        TimeBeginToEnd = EndTime - BeginTime
        Label1.Text = TimeBeginToEnd.TotalSeconds & "秒"
        TextBox2.Text = e.Result
    End Sub

End Class

源代码打包下载: LSWServiceTest.rar (85.87 kb)

手动安装XNA的方法

在Win2008安装XNA的时候遇到错误,老是装不上,于是采用手动安装的办法

1、进入命令行,CD到下载的文件夹,输入xnags31_setup.exe /x,把安装包解压到一个文件夹

2、去到上面的文件夹,找到redists.msi安装

3、按照以下顺序找到对应的文件运行安装

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\XLiveRedist.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Redist\XNA FX Redist\xnafx30_redist.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Redist\XNA FX Redist\xnafx31_redist.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\xnaliveproxy.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\xnags_platform_tools.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\xnags_shared.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\platformer.msi

%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\xnags_documentation.msi

4、如果你安装有Visual C# 2008 Express,就安装%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\xnags_vcsexpress.msi

5、如果你安装有Visual Studio 2008,就安装%ProgramFiles%\Microsoft XNA\XNA Game Studio\v3.1\Setup\xnags_devenv.msi

6、去到第1步中的文件夹,安装arpentry.msi

这样XNA 3.1就手动安装完成了

使用VBS脚本查找IIS元数据库中的所有 MIME 类型

下面的脚本将显示 Microsoft Internet 信息服务 (IIS) 5.0 或 Microsoft Internet 信息服务 (IIS) 6.0 元数据库中的所有 MIME 类型。

' This script lists the MIME types for an IIS Server.
' To use this script, just double-click or execute it from a command line
' by calling cscript.exe

dim mimeMapEntry, allMimeMaps

' Get the mimemap object.
Set mimeMapEntry = GetObject("IIS://localhost/MimeMap")
allMimeMaps = mimeMapEntry.GetEx("MimeMap")

' Display the mappings in the table.
For Each mimeMap In allMimeMaps
    WScript.Echo(mimeMap.MimeType & " (" & mimeMap.Extension + ")")
Next

将脚本另存为 .vbs 文件(例如,DiscoverIISMimeTypes.vbs),然后从命令提示窗口使用以下命令运行它:

cscript DiscoverIISMimeTypes.vbs

谷歌拼音输入法再次升级

此次升级的重点为对词典的更新和对部分排序方法的改进。

对词典的更新主要根据权威字典、词典校对了部分单字和成语的注音,补充了三千余条常用成语。同时,在更好地支持标准拼音方案的基础上,保持了对部分常用读音和民间约定俗成念法的兼容。

在排序方法的改进方面,我们主要改进了单字在候选项目中的排序方法,使常用字的排位更准确;改进了英文模式和笔划输入模式下的候选项目排序方法,使之更符合输入习惯。

另外,针对之前出现的上、下键选字时不能跨页的问题,此次我们对其进行了修正,同时修正的还包括在部分应用程序中存在的兼容性问题。

高校学生可以免费使用微软软件

今天,比尔盖茨在美国斯坦福大学正式宣布了DreamSpark项目,该项目将允许高校学生免费在非商业领域使用微软的开发工具(Visual Studio 2005以及2008的专业版),设计工具(Expression Studio,包括Expression Media, Expression Web,Expression Blend,Expression Encoder以及Expression Design等),数据库(SQL Server开发人员版),系统平台(Windows Server标准版等)以及XNA Game studio等微软的软件产品.

该项目第一批授权国家名单包括比利时,加拿大,中国,芬兰,法国,德国,西班牙,瑞典,英国以及美国.以上地区的高校学生可以在非商业性领域使用以上软件,进行软件开发,设计以及学习,而不需要支付任何费用.

中国的高校学生可以通过中国教育网参与该项目,更多信息请访问微软学生中心(http://www.msuniversity.edu.cn).

好希望自己再回到学生年代呀!

SQL - 如何判断 SQL Server 的版本?

平日有许多朋友会询问有关 SQL Server 使用上的一些问题,笔者的第一步骤便是先了解基本环境的况状,故以往都会请大家使用 SELECT @@VERSION 的指令,执行这个指令会回传一长串的字符串,再依这一长串的字符串来判断 SQL Server 的版本。

笔者建议也可以使用 SERVERPROPERTY 的方法,取出想要的信息,指令如下:

SELECT SERVERPROPERTY('ProductVersion') AS [Product Version]
 ,SERVERPROPERTY('ProductLevel') AS [Product Level]
 ,SERVERPROPERTY('Edition') AS [Edition]

当然在 SERVERPROPERTY 中还有许多值可以取得,详细信息:
http://msdn2.microsoft.com/zh-cn/library/ms174396.aspx