2013年6月15日

其来有自的音乐库(4)

距离该系列上一篇文章已经过去很久了。功夫网的阻隔是个很大的问题。但我还是尽量坚持更新博文。

  1. CHEMISTRY - regeneration

    CHEMISTRY,中文名称是化学超男子。《战场女武神2》的OP《Our Stroy》收录于这张专辑中。刚下载这张专辑的时候感觉还不错,现在常听的也就只有《Our Story》和《Life goes on ~Side D~》。战场女武神系列游戏都非常棒,一代和三代的难度都比较高。我还专门买了一张一代的游戏光碟用作收藏,这也是我唯一的一张PS3游戏光碟。最近听说一代汉化开坑,甚是高兴。

2013年5月12日

在IIS 7中使用HTTPS连接

做毕设的过程中,希望能使用Https安全连接。在网上查阅了相关资料,发现仅是以调试、测试目的而启用Https连接是相当简单的。
首先,需要解释一下Https,TSL,SSL以及证书的关系。我们知道,HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC 5246中,暂时还没有被广泛的使用。

Date.parse()在Chrome,FireFox,IE中的差异

我翻了好几篇关于Javascript中Date.parse()方法的博文。它们着重讲的是日期格式的问题,需要以Date.parse("MM/dd/yyyy HH:mm:ss")这样的形式方能在3种浏览器中正确运行。最近在做一个需要实时绘图的项目,其时间精确到毫秒,这时Date.parse()在3个浏览器中就有了不同的表现。请看以下代码:

var now=Date.parse("05/12/2013 15:24:27.53");

这行代码在Chrome里可以正确运行时间的毫秒部分也能正确地被转换。但同样的代码到了FF和IE里就报错了。经过排除,确认是这两种浏览器的Date.parse()方法最多支持到秒级。后来我又尝试了"05/12/2013 15:24:27,53","05/12/2013 15:24:27 53","05/12/2013 15:24:27,530","05/12/2013 15:24:27 530"等形式的字符串,均无法正确地在FF和IE中转换。如果要想解决这个问题,只好采取一种很别扭的方法:把字符串从秒处截断,前面的部分在3个浏览器中都可以正确转换。转换完毕后把后一部分再加上。

2013年4月16日

面试总结

昨天我去华北计算技术研究所参加笔试和面试。出发前在网上看了一下这个单位的评价——不太好——因2012年的招聘爆出诸多问题而被称为坑爹“坑爹十五所”。到了之后,人力资源的先拿了一套笔试题让我们做。说实话,笔试很随意,就随便让我们找了两个空的工位,让我们做。

2013年4月4日

ASP.NET 网站维护实例

我3月21日回到学校,就被告知,某个部门的网站坏了。最初是一个Excel导出功能无法正常工作,导出的文件并不是先前期望的那样。由于这并不是本文重点,我就一笔带过——问题在于Excel的DCOM配置,添加了NETSERVICE账户并赋予相应权限后,得以解决。随之而来的问题是:导出的文件没法从服务器上删除。我们又添加了log4net,输出了一些调试信息,发现是最后导出文件结束、关闭Excel进程时出的问题。网站以NETSERVICE这个账户运行,但Excel是以Administrator运行的,在执行Process.Kill()方法时会抛出异常。虽然作者在里面使用了try-catch块来处理异常,但似乎这个异常仍然没被catch到,抛上来,后面删除文件的代码也就没有执行。

即日起停止更新SuperSocket的研究系列文章

最初写这些文章是为了记录在学习SuperSocket 1.5官方文档时遇到的各种问题,多是官方文档中没有阐述清楚的地方,顺带将英文文档翻译成中文。目前已经有人将全部文档翻译完成,我也就不再更新了。如果还有使用上需要注意的问题,我还会再发文。

这里给出SurperSocket 1.5 中文文档(非项目作者翻译)

SuperSocket的作者也开始提供最新的中文文档,见SuperSocket 1.6 中文文档: SuperSocket

2013年3月18日

SuperSocket的研究(10)—— 扩展服务器配置文件

当你用SuperSocket实现自己的socket服务器时,不可避免地要在配置文件中定义一些参数。SuperSocket提供一种简单的方式来存储你配置文件中的参数,然后在AppServer中读取并使用它们。

2013年3月17日

SuperSocket的研究(9)—— 向客户主动端推送数据

使用Session对象向客户端发送数据

我们已经提到过,AppSession表示一个逻辑socket连接,基于连接的各种操作应该被定义在这个类中。AppSession也封装了一些发送数据的方法。你可以是使用AppSession的Send(...)方法来向客户端发送数据。
session.Send(data, 0, data.Length);
//或者
session.Send("Welcome to use SuperSocket!");

2013年3月16日

SuperSocket的研究(8)—— 获取连接的建立和关闭事件

AppSession中的OnSessionStarted()和OnSessionClosed(CloseReason reason)虚方法

你可以覆盖父类中的虚方法,OnSessionStarted()和OnSessionClosed(CloseReason reason)来处理新会话的连接或会话的销毁时的业务操作:
public class TelnetSession : AppSession<TelnetSession>
{
    protected override void OnSessionStarted()
    {
        this.Send("Welcome to SuperSocket Telnet Server");
        //添加你的业务操作
    }

    protected override void OnSessionClosed(CloseReason reason)
    {
        //添加你的业务操作
    }
}

AppServer中的NewSessionConnected和SessionClosed事件

绑定事件:
appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);
appServer.SessionClosed += new SessionHandler<AppSession, CloseReason>(appServer_SessionClosed);
定义事件处理方法
static void appServer_SessionClosed(AppSession session, CloseReason reason)
{
    Console.WriteLine("A session is closed for {0}.", reason);
}

static void appServer_NewSessionConnected(AppSession session)
{
    session.Send("Welcome to SuperSocket Telnet Server");
}

SuperSocket的研究(7)—— 内置的通用格式协议实现工具

在阅读过前面的文档后,你可能会发现用SuperSocket来实现你自己的协议可能并不那么容易。SuperSocket提供一些通用协议工具来简化这项工作,它能让你更快、更轻松地构建自己的协议。