一个有趣的自述文件

下面是Linux Gnome桌面中的一个打印机属性管理工具的自述文件(README File)的全文,它可能比程序本身更令人感兴趣:

gnome-cups-manager
------------------
Once upon a time there was a printer who lived in the woods.  He was a
lonely printer, because nobody knew how to configure him.  He hoped
and hoped for someone to play with.
One day, the wind passed by the printer's cottage.  "Whoosh," said the
wind.  The printer became excited.  Maybe the wind would be his
friend!  
"Will you be my friend?" the printer asked.
"Whoosh," said the wind.
"What does that mean?" asked the printer.
"Whoosh," said the wind, and with that it was gone.
The printer was confused.  He spent the rest of the day thinking and
jamming paper (for that is what little printers do when they are
confused).
The next day a storm came.  The rain came pouring down, darkening the
morning sky and destroying the printer's garden.  The little printer
was upset.  "Why are you being so mean to me?" he asked.
"Pitter Patter, Pitter Patter," said the rain.
"Will you be my friend?" the printer asked shyly.
"Pitter Patter, Pitter Patter," said the rain, and then it left and
the sun came out.
The printer was sad.  He spent the rest of the day inside, sobbing and
blinking lights cryptically (for that is what little printers do when
they are sad).
Then one day, a little girl stumbled into the printer's clearing in
the woods.  The printer looked at this curious sight.  He didn't know
what to think.  
The little girl looked up at him.  "Will you be my friend?" she asked.
"Yes," said the printer.
"What is your name?" asked the little girl.
"HP 4100TN", replied the printer.
"My name is gnome-cups-manager" said the little girl.
The printer was happy.  He spent the rest of the day playing games and
printing documents, for that is what little printers do when they are
happy.

或者这里很多人都不会e文Tongue out
这里给出它的译文

很久很久以前,有一个打印机居住森林里。它很孤独,因为没人知道如何配置它。它希望有人能和它一起玩。
一天,风吹过打印机的小屋,“呼,呼”。打印机开始兴奋起来,也许风可成为它的朋友。
“你愿意做我的朋友吗?”打印机问。
“呼,呼”,风回答。
“什么意思”,打印机问。
“呼,呼”,风回答,它消失了。
打印机搞糊涂了,它把这天剩余的时间都花在思考上,打印纸被卡住了(小小打印机迷糊时就会这么做)。 第二天,一场暴风雨来临。大雨倾盆而下,使早晨的天空变暗,还破坏了打印机的花园。小小打印机很苦恼。“为什么这样对我?”它问。
“噼里啪啦,噼里啪啦,”雨回答。
“你将做我的朋友?”打印机害羞的问道。
“噼里啪啦,噼里啪啦,”雨回答。然后它离开了,太阳露出了脸。
打印机很悲伤,这天剩余的时间它都呆在里面,哭泣,悄悄的打着光信号(小小打印机悲伤时就会这么做)。

又有一天,一个小女孩无意闯入了打印机的领地。打印机看着这种奇特的情景,不知道怎么办。
“你愿意做我的朋友吗?”小女孩问。
“愿意,”打印机回答。
“你叫什么名字?”小女孩问。
“HP 4100TN”,打印机回答。
“我的名字叫gnome-cups-manager”,小女孩说。
打印机很快乐,剩下的时间它在玩和打印文档。小小打印机开心时就会如此。

编译和运行Singularity操作系统

Singularity是微软研究院(Microsoft Research)的一项创新的操作系统研究项目,它几乎完全使用C#语言编写,通过开发新的技术和工具来监督和验证应用程序的执行,以达到一个更加稳固和可靠的软件平台。Singularity已在CodePlex上发布了它全部的源代码和构建工具,本文介绍了如何配置和构建Singularity,以及使用Virtual PC运行它。

前提:

1.       SingularityCodePlex站点下载源码和工具包,或者在本地下载

2.       下载和安装.NET Framework本地下载.NET Framework 3.5

3.       下载和安装Virtual PC,这可以在DreamSpark软件资源中下载得到

4.       因为源代码数量很大,所以需要保障源代码所在的分区有1.5GB以上的空间,为保证虚拟机的正常运行,你需要有512MB以上的空闲内存。

OK,准备完毕,开始配置环境吧!

解压缩Singularity的文件到一个新的文件夹,比如E:\Projects\Singulatrity

运行命令行cmd.exe(如果是Vista用户,则需要使用Administrator权限),转到Singularity的根目录,依次运行

configure.cmdbase\setenv.cmd

下一步便是执行编译源码的脚本:在当前目录(Singularity\base)执行msb Distro\Tiny.proj,此时MSBuild工具将调用Tiny.proj文件中的构建脚本,编译过程大约需要十多分钟。

使用Virtual PC运行Singularity是通过PXE来启动的,所以主机(Host)需要配置一个Loopback的网络,步骤如下:

1.       进入控制面板->添加新硬件

2.       点击下一步,选择“是”,点击下一步

3.       选择“添加新新硬件”,点击下一步

4.       选择“从列表中手动选择”,点击下一步

5.       在硬件类型中选择“网络适配器”,制造商选择“Microsoft”,在网络适配器列表中选择“Microsoft Loopback adapter

6.       点击下一步,直到完成

7.       在“网络连接”中选择刚才新添加的连接,右键点击“属性“,双击TCP/IP,更改IP地址为10.99.99.1,子网掩码为255.255.255.0,点击确定:

8.       在此网络连接对话框中选择高级,进入防火墙设置,点击“添加端口”,添加UDP端口67以及UDP端口69,点击确定。

必须的配置都已完成,最后需要复制Singularity生成的虚拟机文件并使用它的boottest脚本运行Virtual PC并载入Singularity系统:

Singularity 操作系统在虚拟机中运行的画面:

中华人民共和国居民身份证编号规则

(1)前1、2位数字表示:所在省份的代码;
(2)第3、4位数字表示:所在城市的代码;
(3)第5、6位数字表示:所在区县的代码;
(4)第7~14位数字表示:出生年、月、日;
(5)第15、16位数字表示:所在地的派出所的代码;
(6)第17位数字表示性别:奇数表示男性,偶数表示女性;
(7)第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。

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试过,使用前注意备份

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)

小记——海南行

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

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就手动安装完成了