2013年12月5日

HTML5 <video>标签在不同浏览器中的表现

<video>是HTML5新增的一个标签,它使得用户可以在浏览器中,不借助任何第三方插件就可以播放服务器上的视频。同时,与<video>类似地,<audio>标签也可以在浏览器中直接播放音频。

2013年11月3日

使用i-jetty架设服务器及部署程序中的若干问题

由于索尼悄悄地在我的PS+会员到期后自动帮我续费,因此觉得不把《重力眩晕》白金了真是白白浪费一个月的会员费。1号深夜终于拿到了白金。随后而来的问题是:在我校恶劣的网络条件下,如何快速地向朋友们得瑟。

2013年11月1日

其来有自的音乐库(6)

今天暂且算是闲下来,填填坑。最近各种结课,各种写论文和看文献,真是令人烦躁。

2013年10月20日

WHITE ALBUM -綴られる冬の想い出- Original Soundtrack CUE文件

在网上下载了 WHITE ALBUM -綴られる冬の想い出- Original Soundtrack 这张专辑(flac),但却没有CUE。发现很多人都在求这个CUE,澄空的链接失效了,KFC上有人搞出来个,结果却没有共享。今天花了1个小时写了个生成CUE的小程序,把这张专辑的CUE生成出来了。

2013年10月13日

其来有自的音乐库(5)

导师一出差我就各种嗨,居然接连两天写博。那么今天继续我的大坑。

2013年10月12日

Smack 开发笔记(1)

上个月接到一个任务——开发一个XMPP客户端,准确地说来,是用XMPP协议实现在两台计算机之间互发消息。我建议用Java,因为我知道大Java不管什么东西,总有5个以上的开源解决方案。于是选了Openfire作服务器,Smack 3.3来开发客户端。
国庆参考了几篇博客文章[1][2][3],写了个控制台下的客户端,可以实现简单地收发消息。
综合这几篇文章,为了实现一个XMPP客户端的消息收发功能,我封装了一个Client.java类,其成员变量及方法如下(省略了具体实现代码,后面会详细说明):

2013年10月4日

Android差在哪儿?

前几天手机突然变砖,趁着这几天的假期,反反复复刷了3次。因此而带来的数次重装App、同步联系人等着实把我折腾得够呛。我也用过iOS,这里我尝试列举一些Android的缺点。

  1. 缺少一个官方的管理软件。

    苹果有iTunes,可以方便地管理iOS设备、媒体文件、App。但Google却始终不愿意推出一个官方的、类似iTunes的同步软件,哪怕没有媒体文件管理功能。没有原生地支持,搞得每个第三方同步软件争先恐后地往手机上装自家的连接软件。通常这些连接App又申请了相当数量且与个人隐私密切相关的权限(例如读取联系人、读取短信、电话记录等),Google都身陷棱镜门,这些国内公司又有几个敢拍胸脯保证自己绝不窃取用户隐私?

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提供一些通用协议工具来简化这项工作,它能让你更快、更轻松地构建自己的协议。

WAVE文件结构与《女仆咖啡帕露菲Re-Order》BGM提取

前几天在PSP上把《帕露菲》所有线都通了,以前玩过的《青空下的约定》也是GIGA做的。不得不说这个公司做GalGame是相当的厚道:可以无限制回溯上一选择肢,每个选择肢上都标注的有该事件的主要人物,一直选某一个角色的事件,就能走到该角色的结局。这个方法在攻略《青空》时百试不爽,不过《帕露菲》就不太行得通了。不过《帕露菲》也提供了更详细的选择肢提示:每个事件不仅有主要参与任务头像,还有该事件对结局的影响,例如:由飞TRUE NORMAL END;明日香日常事件。GIGA并不打算把玩家引入选择肢的迷宫在里面鬼打墙,而是让玩家把精力集中到品味剧本、音乐上来。从这个角度来看,GIGA算得上是业界良心,比那《恋爱蜡笔》不知高到哪里去了。

2013年3月14日

SuperSocket的研究(6) —— 用IRequestInfo,IReceiveFilter等实现自己的通信协议

为什么使用自己的通信协议?

通信协议用来将接收到的二进制数据转换成你的应用能够理解的请求。SuperSocket提供了一个内置的通信协议“命令行协议”,它规定每个请求必须以回车换行符“\r\n”结束。
但是一些应用可能因为各种不同的原因而无法使用“命令行协议”。针对这种情况,你需要用如下的工具来实现自己的通信协议:
  • RequestInfo
  • ReceiveFilter
  • ReceiveFilterFactory
  • AppServer
  • AppSession

2013年3月13日

SuperSocket的研究(5)—— 内置的命令行协议

什么是协议

什么是协议?很多人也许会回答“TCP”或“UDP”。但构建一个网络应用仅靠TCP或者UDP是不够的。TCP和UDP都是传输层协议。如果你仅仅定义了传输层协议,是远不能满足让两个终端用户在网络上通信的。你需要定义你的应用层的协议以转换你接收到的二进制数据,使之成为你的应用能理解的请求。

2013年3月12日

其来有自的音乐库(3)

  1. ARMS - I''s Pure Original Sound Track

    《I''s》是桂正和的漫画作品,当年与鸟山明齐名。我对这部漫画的评价是:它真实地反映了青春期少年的正常心理活动,就像发生在你的身边,甚至发生在你自己身上。除了主人公的损友有点夸张外,不太符合现实,一贵作为主人公,是典型的“时刻YY女神又不敢贸然行动的闷骚少年”。我敢说只要你是一个正常、健康的人,并且正常地经历过青春期的萌动,你一定能对号入座,会在男女主人公身上找到自己的影子。而张OST是我在看了动漫后搜集来的,年代久远,专辑封面分辨率不高。推荐的曲子嘛,首先是主题曲、也是动漫和游戏的OP——《二人のI''s~i will follow~》;然后是《VIVRE》、《LE BONHEUR》、《LE LOCOMOTION》等BGM及其变奏版。貌似这些都是法语,曲名就意义不明了。

SuperSocket的研究(4)—— SuperSocket的基本配置

一个完整的配置文件示例

<?xml version="1.0"?>
<configuration>
<configSections>
        <section name="superSocket"
                 type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine" />
    </configSections>
    <appSettings>
        <add key="ServiceName" value="SupperSocketService" />
    </appSettings>
    <superSocket>
        <servers>
            <server name="TelnetServerA"
                    serverTypeName="TelnetServer"
                    ip="Any"
                    port="2020">
            </server>
            <server name="TelnetServerB"
                    serverTypeName="TelnetServer"
                    ip="Any"
                    port="2021">
            </server>
        </servers>
        <serverTypes>
            <add name="TelnetServer"
                 type="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetServer, SuperSocket.QuickStart.TelnetServer_StartByConfig"/>
        </serverTypes>
    </superSocket>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
    </startup>
</configuration>

2013年3月9日

SuperSocket的研究(3)—— 通过配置启动SuperSocket

为什么使用配置来启动

  1. 拒绝硬编码(写死代码)
  2. SuperSocket提供多种有用的配置选项
  3. 充分利用SuperSocket的工具

如何通过带引导程序的配置启动服务器

SuperSocket配置结点使用.NET默认的配置技术,下面是一个为SuperSocket设计的配置结点:
<configsections>
    <section name="superSocket" type="SuperSocket.SocketEngine.Configuration.SocketServiceConfig, SuperSocket.SocketEngine" />
</configsections>
服务器实例配置
<supersocket>
    <servers>
      <server ip="Any" name="TelnetServer" port="2020" 
          serverType="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetServer, 
          SuperSocket.QuickStart.TelnetServer_StartByConfig">
      </server>
    </servers>
</supersocket>

SuperSocket的研究(2)—— 实现自己的AppServer和AppSession

什么是AppSession和AppServer

AppSession代表一个逻辑Socket连接,基于连接的操作都应该在这个类中来定义。我们可以使用AppSession向顶层的客户端发送数据,从连接接收数据或者是关闭一个连接。
AppServer是Socket服务器的实例,它坚挺着所有客户端的连接,管理所有顶层客户端的连接。理想状况下,我们可以从AppServer中找到任意一个Session。应用级的操作和逻辑应该在这里定义。

2013年3月6日

SuperSocket的研究(1)—— Telnet实例

前几天终于把开题报告写好了,这玩意儿着实令人厌烦。你不写吧,交不了差。但写了又没多大用处,无非是抄点前人的老话、套话——你还得小心别抄袭了,不过总算是完成了。我要做的是基于WebSocekt的一个监控系统,JAVA已经有不少像Tomcat、JBoss等服务器级的支持,而.NET这边却很少。IIS8支持WebSocket,但需要WIN8,我懒得折腾系统,就找了一个开源的WebSocekt Server的实现:WebSocket4Net,是SuperWebSocket为了方便.NET程序员进行WebSocket开发而衍生的一个版本。而SuperWebSocket又是基于SuperSocket

2013年2月25日

托托莉的炼金工房 True End达成

放寒假前多玩Alpha组发布了托托莉的炼金工房汉化版。在学校里下好了游戏,回家后便传到PS3里开撸。在PS3游戏汉化难度大的环境下,能有汉化组来开坑是一件很不容易的事。玩了之后发现,这个游戏的汉化质量十分不错。从选择的字体(比较遗憾的是没有选用更原版相同/相近的字体,但汉化版的字体也十分清晰漂亮),剧情虽然是“寻找真心人”型,但多样化的结局还是让我感到耳目一新。之前接连玩了X之轨迹系列,但结局游戏已经让我感到厌倦了。游戏的奖杯数量适中,我打算PS3上的首个白金就给这个游戏了。目前完成了3个(算上一周目的Bad End)结局,由于人物Flag卡得不是很好,需要读取一个时间较早的存档来完成后面的结局。

2013年2月23日

其来有自的音乐库(1)

这个系列我很早就像写了,一直没有找到合适的地方发。我的iTunes音乐库中一共有220张专辑,其中部分专辑并不是所有歌曲都有收藏。我很少在百度、QQ、虾米这样的在线音乐平台上,随机放、泛泛而听,我仍然坚持把音乐放到自己的硬盘。而我所收藏的所有专辑都有其之所以被收藏的原因。我担心也许有一天我会忘了我为什么会保存这里面某张CD,于是我打算把每张专辑的收藏之由来都记录在此,同时也记录下每张专辑里我所喜爱的歌(乐)曲。

说“担心某天可能会忘记”并不是我夸张或是矫情,我在贴吧看到有人讨论“你买PSP是为了哪款游戏”的时候发现竟然一下子想不起来是为了哪个游戏了,还好回忆了好一阵子才记起来是因为去中关村陪别人买笔记本时那店家正在玩战神,还是输出到电视上玩的。

2013年2月5日

对几种类型的游戏之看法

我很爱玩游戏,虽然捉迷藏、瞎子摸猫儿等这样的原生态的游戏,小时候也喜欢过,不过我这里说的游戏是在各种游戏主机(家用机、掌机、PC、手机(暂把手机也列为一种游戏主机吧))上运行的游戏。最早在小霸王上玩超级玛丽、影子传说、魂斗罗什么的一玩就是一个下午。现在早已没那么痴迷了,再说,身体也吃不消,年纪轻轻就颈椎病、腰椎间盘突出,不敢久坐。我一般在学校主要玩PSP,偶尔玩玩PC上的游戏,比如COD以及当下比较热门且对机器配置要求不太高的。放假回家主要战PS3,PSP和PC就玩得少些了。由于我没有任系的主机,游戏也仅限于FC和GBA,所以本文在这任系产品方面会片面些。

2013年1月30日

MAC地址冲突对路由器的影响


我使用了2个无线路由器,使wifi信号能覆盖家中所有房间。客厅里有一个,作为主路由,负责PPOE拨号和DHCP,我房间里有一个,通过网线与主路由相连(房间里有从墙上引出的网线,实际上相当于从主路由的LAN口引出的线)。去年国庆回家时还能正常使用,但寒假回来时发现我房间里的路由器不能用了,客厅里的主路由倒还正常。我通过网线直接连接笔记本和路由器,居然都无法登陆管理后台(我早已经把IP地址改为192.168.1.2)。我初步判断是路由器坏了,准备第二天去买一个新的。但第二天买来新的路由器配置好后笔记本总是出问题,上不了网。表现为连接上无线后,1分钟之内就会掉线,系统显示“受限制的连接”,无法访问Internet。尝试ping网关或者房间里的路由器,刚连上的时候还能ping通,1分钟之后全部丢包甚至无法访问主机。而是用有线连接的方式却一切正常。

在GoDaddy上购买域名、主机以及退款

之前我在GoDaddy上买过域名和主机,一天之后又退款不玩了。购买和建站花了我一下午加一晚上的时间,这其中有些注意事项是我在别的网站上所看的教程中没有提到的,我把它们记录下来,以备查阅。

2013年1月29日

开始


正如我前一篇文章所说,我为了确定最终在哪儿建立博客先后试用过国内外的一些博客产品,并列举了它们的一些不足。而前一篇文章是我在自己独立博客上写的,这一篇才算是正式在Blogger上安家。上一篇文章说到了离开QQ空间、人人网以及三大门户网站的博客的原因,而最终放弃了建独立博客而使用BSP的产品而且还是墙外的,原因何在?

2013年1月26日

又一个Blogger博客


建立自己的独立博客这个想法产生于今天上午11点过。中午我大致搜索了一下域名和主机的相关信息,睡了一个午觉来考虑是否购买域名和主机,然后下午4点过开始注册相关账号,购买域名和主机。到了晚上配置主机、数据库并上传WordPress。
我又为什么在这个普遍唱衰博客(尤其各博客提供商)的时候建立自己的个人博客呢?