网络寻租

Programmer, Gamer, Hacker

买了新的笔记本

| Comments

我计划购买笔记本电脑已经有很长一段时间了。最近终于赶着苹果最近的发布会,入手了新出来的rmbp MD212,花费了我一万多一点。买来后花费了一段时间的安装和掌握,感觉还是非常顺手的。

我为什么要买笔记本电脑

我现在已经有了一台比较强力的开发用PC,系统装的是ubuntu,但是我还是要购买一台比较好的笔记本,主要原因是我有移动办公的需求。

首先,我需要能够自由切换站立工作和坐着工作,这是为了我健康的考虑。台式机调整起来很繁琐,笔记本只需要两个高度不同的台面。

Coding Everywhere是我一直想做的事情,比如在躺椅上面coding,比如在咖啡馆,图书馆等参合coding,换一个环境能够带来更多的灵感和乐趣。

我还是会有一些必须进行的移动办公需求,比如我要参加hobby project day,hackthon之类的活动等等。

考虑的几个要点

既然我有实际的需求,那么选择什么类型的笔记本,基本上可以根据这些需求来确定一下。

笔记本必须要能够提供舒适的开发体验。我现在有的一个华硕的eeePC小本实在不堪使用。

笔记本要足够轻便,这样我才能很方便地拿着到处走。

笔记本要大小适宜,太小了不方便coding,太大了又太重。

考虑到现在苹果产品因为量产足够,性价比已经非常高了,以及我是个开发者,需要体验苹果的优秀设计,还有就是苹果在笔记本领域的口碑,我选择苹果笔记本

选择rmbp MD212的理由

既然确定了要点,那么下面就是具体选型的问题了。

考虑到retina屏幕是下一个阶段发展方向,以及retina屏幕技术已经足够成熟,我还是尽量选择这样的屏幕。考虑到价格因素,我从最便宜的MD212开始看起。

i5已经能够满足开发需求,现在CPU频率基本到一个极限了,在这方面的改进程度不大,我还是选择比较通用的CPU型号。 对于我来说,13寸显示访问还是够的,尤其是retina屏幕,细节都看得很清楚。 虽然SSD 128G有点少,但是根据以往的经验,128G对于我来说,勉强还能够用。 至于内存8G,对于普通的开发加上一台虚拟机来说完全够用了。

为什么这个时间点

型号选定了,然后是具体出手的时间。根据我的观察,苹果的产品价格在新的发布会之后一段时间内,还是很稳定的。MD212又刚刚出来,我觉得现在是入手的好时机。

后记

经过这几天的实际使用,感觉上手飞快,没有什么需要适应的地方,整体上很舒服。OSX操作系统是基于BSD的,从linux切换过来基本只需要熟悉目录结构。安装开发环境消耗了不少时间,主要是homebrew,rails,emacs,最好都整好了。然后就是感觉台式机买的有点亏,完全可以直接入mbp,但是时间点的话不对,也没有办法。

rmbp MC212报价在我购买了之后又跌了200元,算是小亏,这个时间点其实很难把握,既然买了东西,沉没成本不是成本,以后就不要关注这个价格了。

Postfix架构初探

| Comments

image

最近几天我们的服务器没有办法收到邮件了, 为了解决这个问题, 我必须弄清楚现在服务器邮件系统的架构, 然后找到到底问题出在哪里。 我们服务器是采用postfix的, 当初配置的时候不是我, 也没有留下配置文件。 弄清楚状况以及解决问题花费了我比较多的时间, 在这里整理一下具体的信息, 下次再遇到问题的时候可以回来看看。 根据我的个人经验, 对于用到的一个技术, 如果没有研究透彻以及留下对应的文档, 以后一定会后悔。 所以在下面稍微整理一下, 没有兴趣就跳过吧。

什么是postfix

简单地说, postfix就是一个邮件服务器, 它用来处理邮件收发的一些工作。 postfix控制了无数小的模块, 而自己可以说是一个路由器的角色。

image

但是postfix内部细看的话又非常复杂, 文章开始的那个图片就是一个模块化的流程图。这里面有几篇文章可以看看的:

如何配置

我发现linode的ubuntu的配置文档 很不错,采用mysql作为数据库,存储域名,邮件用户,邮件用户别名信息,然后用dovecot来作为用户和外界通讯的服务器, 按照这个配置,可以搭建好一个可用的邮件系统。

邮件流程

为了弄清楚具体做了什么, 以便遇到问题的时候可以快速定位, 需要关注几点:

邮件是如何从外面发送进来, 被客户端接收的

外面的服务器会通过smtp发送邮件到postfix,postfix服务器会接收邮件,经过一系列的处理过程,最后保存到本地的邮件目录存放地里面。 按照上面的设置,会保存在/var/mail/%domain/%username目录中。

邮件是如何通过客户端, 发送给其他邮件的。

通过devocot pop/imap服务器, 客户端发送对应的请求, 然后转存到本地mail地址, 然后postfix做发送处理。

postfix也提供一个命令行的工具sendmail来在本地发送邮件

如何验证用户

dovecot设置文件里面具体设置如何做验证, 是否支持纯文本密码(非常不安全), 是否支持ssl, 采用什么方式来验证等等。

具体的邮件本地缓存位置,配置文件和进程。

  • 邮件本地存储的目录, 见postfix配置参数virtual_mailbox_base
  • postfix配置目录在/etc/postfix
  • dovecot配置目录/etc/dovecot
  • 里面的配置文件会设置日志目录。 如果没有写的话, 可以去看 /var/log/mail.log
  • postfix master进程 /usr/lib/postfix/master, 它会跑一些其他worker进程干活, 可以看用户是postfix的进程们。
  • dovecot进程 /usr/sbin/dovecot, 用户验证进程 dovecot-auth, 还有以dovecot为用户的一些pop/imap服务器。

更进一步的需求

前面做的事情只是比较基本的部分,如果要成为一个可靠的生产环境,还是需要一些其他的事情:

很多时候, 还是购买现成的服务比较好, 自己做的话成本太高了, 也做不到专业。

2012-10-26问题整理

本次发生邮件系统不能用的根本原因没有找到, 主要发现postfix, dovecot进程没有起来。 花费了2个晚上的时间, 终于把问题解决了, 具体的挫折路线:

  • 不是很懂postfix, 看文档
  • pop服务器不知道是什么, 最后看postfix设置才知道是dovecot
  • 跑起来后发现没有起来pop, 安装dovecot-pop3d
  • 用gmail来获取邮件一直不成功, 后来发现google pop3方式ssl可能会去验证服务器ssl有效性, 需要服务器注册合法ssl(需要花钱), 所以只能用plain的方式, 需要改 dovecot 设置支持plain。

2013-12-08问题整理

因为服务器更换,需要重新装一遍邮件系统,前一次安装的日志没有留下来, 于是我采用ubuntu的教程,结果耗费了一个星期都没有安装成功,几乎要崩溃了。 后来找到现在用的安装教程,也是一路磕磕碰碰遇到很多问题。总结一下经验:

  • 一定一定要跟着教程走,不要自己想当然随便改,不然死都不知道怎么死的。
  • 走长路,每一步都要验证这一步走得正确。
  • 出现问题看log,好的日志会引导你走向正确的方向。

回头看看, 走了不少弯路, 但是整理一下发现, 其实整个系统也并不是那么复杂。

尝试站着工作

| Comments

大多数人每天上班的时候, 基本都是坐在座位上面, 面对电脑工作。 久坐, 往往会带来一些腰部和颈部的疾病, 我在最近的几个月里面, 尝试了站立工作。 上面就是我的工作台设置。 就是把一个高度合适的座位放到台面上来而已。 我能够找到刚好配起来的家具, 如果你找不到的话, 可以看这个解决方案

尝试下来发现一些东西:

  • 站立工作会更消耗精力一些, 很多时候不太容易集中精神。 毕竟站立不能像坐着的时候那样放松。
  • 颈部和腰部完全没有不适的感觉。 但是可能是我键盘高度位置有问题, 手腕部位还是会有疼痛。
  • 站立给膝盖造成了很大的压力, 有不适。 以及长期站立容易造成小腿静脉曲张, 我现在是隔段时间坐下抬高小腿休息一会。

现在我还是在用台式机, 如果我买了笔记本的话, 我可以很方便地在站立和坐着两种工作方式之间切换。 个人建议大家可以尝试一段时间站立工作, 对工作环境进行调节是提升工作舒适度以及工作效率的好办法。

尝试哈萨克斯坦时间

| Comments

我一直认为, 尝试新事物, 是一个具有完全行为能力的人应该具有的习惯。 不管是接触新的东西, 或者是对自己现有生活的调整, 不仅可以给生活增加调剂, 也是对现有生活的优化, 有的时候, 因此获得更多的机会, 或者获得一个新的角度来重新审视自己的生活。

我现在在全职做GuruDigger, 每天工作时间是由自己控制的, 因此我拥有尝试多种作息时间的自由。 这周开始的时候, 我决定尝试一下哈萨克斯坦时间, 简单地说, 就是把每天的时间轴往后延迟5个小时左右, 每天12点起来吃早饭, 5点吃中午饭, 晚上10点吃晚饭, 4点休息, 尝试一段时间看看怎么样。

今天是这周的结束, 经过这一周的尝试, 我最后还是决定放弃这样的作息方式。

我选择哈萨克斯坦时间的考虑, 是观察一些朋友以及一些名人的生活习惯得来的。 4点钟睡觉, 相当于把上午的时间移植到了深夜。 在深夜的时候, 周边的干扰显得比较少, 可以获得大段时间, 更集中精神去做事情。 不过生活习惯因人而异, 对于我来说效果不是很好。

我现在的工作环境是民宅, 工作的时候, 人其实也只有两个, 在白天, 也不会有什么干扰(如果从窗户外面射进来的阳光也算干扰的话), 深夜工作的好处我在白天也能获得。 因为机会成本的存在, 好处就打了一个很大的折扣。

深夜其实是一天的最后时刻, 人的精力是一天中最少的, 我感觉自己的精神还是比较难集中起来, 做复杂的事情有比较大的困难。 切换作息之后, 还有一些我没有考虑到的问题出现了。 首先是吃饭问题。 11点的时候, 可以选择的吃饭场所变得很有限, 甚至我经常吃的全家盒饭也基本上卖完了。 虽然我对食物不挑剔, 但是找不到传统中餐还是让我很困扰。 晚上做事情, 如果只是一个人的话还比较好说, 但是和别人同住的话, 就会给其他人带来困扰。 这方面的因素也要考虑进来。

综合上面的一些考虑, 我觉得哈萨克斯坦时间不适合我。 不过, 下次我可以尝试吉里巴斯时间(UTC+12)?

English Matters

| Comments

This is the first time I’m blogging in English here, And from now on, I will keep on doing it regularly.

Why Blogging?

I’m blogging for good reason. As a blogger, I’m not elegant or productive, or even continuous, I had drop blogging for quite a long time; Hopefully I struggle to bring all things together again. Blogging is not easy as it starts, it needs patience, persistence, continuous self-improvement. And it worth that, I told you reasons.

Blogging is a process to help you organize thoughts. Things are not as clear as you think it is, before you write it down.

Blogging is practice of writing, there is no need to emphasize the importance of writing.

Blogging is a good communication, small talks are good, but too small for serious discussion, and hard to summon all things up.

Blogging is self advertising. There is no better way to know a person’s mind than seeing things written by him, and writing itself can reflect lots of great attributes.

Why English Blogging?

And there comes another question: Why I start English blogging? here are some reasons:

English is THE universal language, practice it, is a good investment.

The people using English is better than The people using Chinese (statistically).

The thinking process is very different between English and Chinese. It brings me an opportunity of switching.

Conclusion

According to the reason I list above and the condition I’m currently in, English blogging is profitable. Maybe it is also a good option for you.

FTL游戏评测

| Comments

很早以前, 我就是一个电脑游戏玩家了, 初中时期的魔兽一代, 毁灭公爵, 赤壁; 到高中的博得之门, 星际, 半条命, 再到大学的魔兽争霸, 无冬之夜; 新的游戏, 符合我的喜好, 再加上能够在我的PC上面跑起来, 我都会拿来玩一遍。 游戏给我开启了无数想象的门, 沉迷在多种多样的游戏世界里面, 我度过了人生的前半阶段。

工作之后, 玩游戏成为了一种奢侈, 投入在上面的时间和精力机会成本很大, 于是乎我不再去玩一些比如辐射3之类的大游戏, 转移到独立游戏(Inide Game)阵营中去了。 和大游戏比起来, 独立游戏制作成本小, 无法再奢侈地在图像特效等细节上面烧钱, 这样的局限带来的就是游戏会专注在交互, 创新上面, 带来和传统游戏不一样的体验。 加上购买花费少, 容量不大下载方便等游戏, 我选择成为一个独立游戏迷, 经常去尝试各种新的游戏。

FTL就是其中的一个。 它是位于上海的两个外国人开发的游戏, 在kickstarter上面募款阶段就吸引了不少眼球。 购买费用是10美元, 并不低, 反复抉择之后, 我还是出了这个价钱。

这款游戏, 介绍说是 spaceship simulation roguelike-like,
我稍微解释一下roguelike, 目标一般是玩家为了消灭一个大Boss, 进入到一个随机的地下城中, 不同房间会遇到不同的敌人和事件, 最后要么死亡要么通关。 这类游戏好玩的地方在于, 随机的关卡, 丰富的游戏玩法, 以及只有一次生命的刺激感。 它已经有几十年的历史, 直到现在还是很有生命力。 经常会有许多新的这类游戏出现。 但是由于游戏采用ACSII的界面, 采用非直觉的操作, 需要掌握的复杂规则和游戏世界背景(这个算是卖点!), 普通玩家往往望而却步, 但是一旦喜欢上, 可能成为一辈子的爱好。

Roguelike游戏画面:

image

回到FTL。 实际的游戏方式混合了策略和即时, 玩法解释起来比较麻烦, 因为没有什么同类的模式。 可以去看官方网站上面的视频介绍, 或者下面的一个walkthrough:

实际的游戏画面:

大地图:

FTL和传统的roguelike游戏相比, 内容上面完全改变了, 但是roguelike的核心精神得到了保留。 游戏的过程中, 一旦失败, 存档就不复存在, 没有拯救的机会, 飞船有限的燃料, 随时间推进的敌方进攻, 让游戏保证了持续的紧张感。 玩家需要在游戏过程中通过各种选择来build自己的飞船, 而选择本身是有限和随机的, 每次游戏都会完全不同。 战斗过程中是即时制加上随时暂停, 刺激又不至于手忙脚乱。

总体来说, 这款游戏没有明显的瑕疵, 通关一次需要3个小时左右, 并且可以采用不同玩法多次重复通关, 算是值回售价。 不过游戏内容上面还是增加更多的东西, 比如更多的装备, 更多的随机事件; 一些内容的提示, 比如船员信息上面做的不够好; 通关之后有点意犹未尽, 消灭一个Boss作为普通游戏来说还好, 但是对于骨灰玩家来说还需要更多的挑战。

我觉得roguelike有点像是人生, 各种人不同的初始条件, 有限的时间, 随机的事件和无数的抉择, 多样的玩法。 不过游戏中会有一个大Boss需要干掉, 会有happy ending/bad ending, 但是人生没有, 一直进行下去, 直到人生的终点。

Coffeescript

| Comments

image

什么是coffeescript?

我们知道javascript是一门有历史的语言, 在被创造出来的时候, 它只是浏览器的一个附属物, 没有预期能够那么流行, 拥有一些的设计缺陷, 缺少很多现代语言必须的特性。 为了弥补这些的缺陷, 我们有jQuery, 各种js的库, javascript语言本身也非常灵活, 开发者可以做很多扩展。

但是库的方式并不能解决所有的问题, 我们还需要更重的解决方案。 coffeescript是能够编译成javascript的一门小的语言, 它的目的是为了能够让大家以更好的方式来写javascript。

简单的说, 就是你采用coffeescript的写法:

1
2
3
4
5
6
7
8
9
# Assignment:
number   = 42
opposite = true

# Conditions:
number = -42 if opposite

# Functions:
square = (x) -> x * x

coffeescript的工具帮助把上面的代码编译成js:

1
2
3
4
5
6
7
8
9
10
11
12
13
var number, opposite, square;

number = 42;

opposite = true;

if (opposite) {
  number = -42;
}

square = function(x) {
  return x * x;
};

具体的语法还是去看官方网站, 这里我就不多说了。

优点和缺点

它解决的问题主要是: – javascript语言本身是模仿java的语法, 带有很多冗余, coffeescript借鉴了其他一些现代语言的语法, 让代码变得更简洁清晰。 – javascript本身有设计缺陷, 比如全局变量的问题, coffeescript自动把变量变成局部, 减少开发错误。 – javascript本身缺少一些重要的特性, 比如类机制, cofeescript提供这样的机制。

写完coffeescript, 可以通过它提供的一个工具, 转换成javascript, 而转换出来的javascript和coffeescript基本上是一一对应的, 语法也很简单, 会javascript的人看懂不难。

总体上面来说, 使用coffeescript带来的好处是: 增加生产力, 减少代码缺陷, 增加代码的可读性, 付出的代价是需要建立一整套的编译机制, 以及开发者需要熟悉coffeescript这门语言, 以及项目必须依赖coffeescript。

结论

针对coffeescript的使用, 赞同和反对者都有, 具体的意见:

赞同者的意见比较好理解。 因为coffeescript带来的好处很多(上面列出来的), 付出的代价也没有多少。 甚至哪天你不想用了, 也可以直接把它丢掉, 编译出来的javascript也是可以继续维护的。

反对者的意见基本上是从项目的角度来考虑, 一个是写javascript不只是程序员, 可能是设计师, 需要让所有人都学会coffeescript, 而这个是有成本的。 还有就是项目代码一致性, 原先javascript的项目, 如果加上了coffeescript的代码, 就会比较混乱。 以及有人并不喜欢coffeescript里面的一些实现, 比如类机制。

我个人倾向使用cofeescript, 现在我基本不直接写javascript了。 反对的意见我觉得对于普通的开发者来说不重要, 而它的优点是如此地显著, 以至于我会推荐所有的javascript开发者去使用它。

Coffeescript的类机制

| Comments

coffeescript是一门编译到javascript的子语言, 它采用了类似ruby/python的语法,增加了类支持,以及规避了javascript语言里面一堆的设计缺陷。 本文主要分析一下coffeescript是如何实现类机制的。

示例代码

首先我们给出一个coffeescript的示例代码,我们会分析这部分代码的编译结果,弄懂它是如何实现类的功能的。

1
2
3
4
5
6
7
8
9
10
11
12
class People
    constructor: (@name)->
    hello: -> "hello, I'm #{@name}."

class Programmer extends People
    constructor: -> super
    hello: ->
        result = super()
        result += " I like programming."

p = new Programmer('halida')
console.log p.hello()

上面的coffeescript代码中,People实现了hello方法,Programmer继承了People,并且重载了hello方法。

这里是生成的全部javascript代码,我们会一部分一部分地分析它到底做了什么事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var People, Programmer, p,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

People = (function() {

  function People(name) {
    this.name = name;
  }

  People.prototype.hello = function() {
    return "hello, I'm " + this.name + ".";
  };

  return People;

})();

Programmer = (function(_super) {

  __extends(Programmer, _super);

  function Programmer() {
    Programmer.__super__.constructor.apply(this, arguments);
  }

  Programmer.prototype.hello = function() {
    var result;
    result = Programmer.__super__.hello.call(this);
    return result += " I like programming.";
  };

  return Programmer;

})(People);

p = new Programmer('halida');

console.log(p.hello());

类定义

我们首先弄清楚coffeescript的类是如何实现的。下面是Programmer的定义:

1
2
3
4
5
6
7
8
9
10
11
12
Programmer = (function(_super) {

  __extends(Programmer, _super);

  function Programmer() {
    Programmer.__super__.constructor.apply(this, arguments);
  }

  ...

  return Programmer;
})(People);

如上面代码所示,Programmer其实就是一个闭包函数,在闭包里面生成了一个Programmer构造函数, 这样就可以通过p = new Programmer('halida');来创建一个Programmer对象。

对于对象方法hello的创建,是在闭包里面给prototype赋值的方式来实现, coffeescript里面可以用super这个关键词来继承父类里面同样名称的方法:

1
2
3
4
5
Programmer.prototype.hello = function() {
  var result;
  result = Programmer.__super__.hello.call(this);
  return result += " I like programming.";
};

然后是Programmer的构造函数,类似于ruby语言里面的initialize:

1
2
3
function Programmer() {
  Programmer.__super__.constructor.apply(this, arguments);
}

Programmer.__super__是父类的构造函数(后面在讲__extends会提到是如何生成它的), 直接获取父类的构造函数constructor(这个是coffeescript缓存的, 下面会讲), 传给它本函数的参数arguments,然后在this这个环境里面执行它。

Programmer.hello里面,也采用了同样的方式来继承父类的方法:

1
result = Programmer.__super__.hello.call(this);

里面call(this)是为了把当前环境切换到当前对象中去。

这样我们大致知道了类定义部分的代码到底发生了什么, 不过我们还是不清楚类继承是如何实现的, 魔法发生在__extends(Programmer, _super);里面。

类继承的实现

首先看一下__extends的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) {
    for (var key in parent) {
        if (__hasProp.call(parent, key))
            child[key] = parent[key];
    }
    function ctor() {
        this.constructor = child;
    }
    ctor.prototype = parent.prototype;
    child.prototype = new ctor();
    child.__super__ = parent.prototype; return child;
};

我们来实际执行__extends(Programmer, _super);,看看到底发生了什么, 在这里面,_super对应的值是父类People。

首先是第一个循环:

1
2
3
4
for (var key in parent) {
    if (__hasProp.call(parent, key))
        child[key] = parent[key];
}

__hasProp.call(parent, key)是用来判断key是否是parent本身定义的属性。 这段代码是循环People里面所有的属性, 如果是People本身定义的, 就赋值到child里面去, 它的目的是继承父类的类方法和属性。 如果People.CLASS_NAME = "People";, 那么结果就是Programmer.CLASS_NAME = People";, 这样通过拷贝的方式,子类继承了父类的所有类方法。

然后是难懂的部分了, 如何继承父类的对象方法呢?

首先给child生成一个prototype对象构造函数,在里面还会缓存child的构造函数constructor, 这样child的child就可以通过调用它来执行父类的方法(实现了上面类定义部分的调用父类对象方法):

1
2
3
function ctor() {
    this.constructor = child;
}

最顶层的父类People里面没有定义constructor, 是因为js里面返回函数的对象构造函数,它本身的prototype里面就有constructor, console里面执行:People.prototype.constructor,返回的是:

1
2
3
function People(name) {
    this.name = name;
}

简单地说,child的prototype对象的prototype就是父类的prototype, 这样,子类对象找一个方法的时候,如果在它自己的prototype,也就是ctor里面找不到对应的方法, 就会在ctor的prototype里面寻找这个方法,然后就可以从父类里面找到了。 这就是为什么要用new ctor()来创建一个prototype对象, 这样才能形成一个prototype调用链:

1
2
ctor.prototype = parent.prototype;
child.prototype = new ctor();

以及上面提到的, __super__缓存了父类的prototype。

1
child.__super__ = parent.prototype;

这部分概念比较难懂,你可以把上面的部分多看几遍,好好思考一下,或者继续往下看,一次实际的调用是如何做的。

走一遍

上面是对代码本身的分析,要弄懂,我们还需要模拟执行一下,理清思路。

我们创建一个对象:p = new Programmer('halida');

如果需要找Programmer里面定义的方法, 我们假设是coding吧, 那么调用的过程是:

  • 执行p.coding()
  • 在p对象里面找是否有coding。
  • 在p的prototypenew ctor();里面找是否有coding。定义Programmer的时候,添加的方法(比如上面示例代码的hello)都是塞到它里面去的。
  • 在prototype的prototype:Programmer的prototype里面找是否有coding。

这个是对象方法的执行,还有类方法的执行,相对比较简单。例如Programmer.CLASS_NAME

  • 在对象的prototype里面寻找CLASS_NAME。
  • 在Programmer里面找是否有CLASS_NAME。

继承父类的时候,会拷贝出所有的父类方法,在子类定义的时候,如果定义了类方法,就会覆盖掉父类的类方法。

Hujs活动整理和总结2

| Comments

第二天

第二天的演讲:

James Halliday, 87年的, browserling 的作者, 讲了一下是怎么用node来搭建browserling的架构的。 browserling提供了很多不同浏览器版本的虚拟机, 用来给网站设计者, 查看不同浏览版本下面的网站显示效果。 这个项目非常有用, 而他肢体语言给人的感觉, 和我以前遇到的一些年轻的技术天才也很类似。

下面是node-webkit的当前开发和维护者小型笨蛋/赵成, 现在他在Intel专职做这个项目。 基本上是把node整合到webkit里面, 让js能够通过node的API访问本地资源, 然后提供一个打包的工具, 做成客户端。 现在用到它的一些项目是把html5的游戏本地化。 我觉得, 优势是跨平台发布应用程序, 以后有这样的需求可以考虑用它。 当然如果是复杂UI客户端, 我觉得还是用有很多强大控件的Qt比较好。

然后是JEFFSU介绍的如何用node.js来做服务器监控平台系统的。 算是一个nodejs的实际应用案例。 因为用到了长连接broadcast之类的东西。

然后是来自网易的谢骋超/圈圈套圈圈讲的NODE.JS游戏服务器开发, 他们team应该是做一个原型验证, 看看nodejs是否适合在游戏服务器开发上面应用。 这个应该算是node做的比较大的项目了吧, 效果也很不错, 能够支持同一个场景上千玩家同时在线。 看来以后会兴起一波用nodejs架设游戏服务器的潮流了。

然后进入下午场。下午场的几个主题, 我没有认真听, 内容上面也没有什么好说的了。 在白天场结束后, 需要统计最后一天hackthon参加的人数。 尽管有Glenn在台上拼命激励大家来参加, 结果实际来参加的人还是比较少。 我感觉, 如果是国外开发者的话, 基本上都是全部参加的。 国内没有流行这样的文化, 不过我觉得会越来越好的, 只是时间问题。

还有一个晚上的party活动, 在factual他们的公司场地里面进行。

晚上party

晚上的party, 有准备给我们小食, BBQ, 和啤酒, 然后就是大家随意聊天。 我感觉非常好, 和来自github的一位员工, 应该是vmg吧, 交换了关于中国程序员为什么不乐于分享的一些看法, 问了James他怎么把url贴到浏览器地址栏里面的, 以及和各位做技术的人聊各种各样技术人感兴趣的事情。

hackthon

最后一天是全天的hackthon, 我本来想参加, 结果有其他事情, 只能过来看看就走了。 也没有什么好多说的, 和其他hackthon也差不多。

总结

这几天我觉得自己的收获有以下几点:

  • 对nodejs在业界的使用有了一定的了解, 看起来已经有很多人在用它了, 也有很多部署到生产环境的例子。
  • 了解了nodejs的特性和适用场景, 以后在长连接, 高吞吐性能的领域, 它将是我的第一选择。
  • 认识了不少做node的人和公司。
  • 在party上面和外国的开发者用英语交流, 增加了我对于英语口语使用的信心。
  • 体验了国际水平的活动组织, 演讲技巧, 主持技巧。 可以作为素材借鉴。

总之, 对于我来说, 参加这几天的会议是非常值得的。

Hujs活动整理和总结1

| Comments

我当了一回250

前段时间, 我在网络上面听说有一个关于nodejs的活动在上海举行, 进入到他们的官方网站: http://www.hujs.org/%EF%BC%8C 时间在9/14-9/16号, 组织形式是, 前两天会议, 最后一天hackson。 我看了价格, 200元预售, 249正式。 我看到这个活动的时候, 价格已经是249了。

nodejs我已经听说过了很久, 也略微尝试过, 不过没有深入接触。 这次的活动我是有小小兴趣的, 但是考虑到票价以及3天的时间参与, 我还是放弃了。 但是事情发生转机是在咨询了几个朋友之后。 一位朋友说千万不要错过, 而另外一位朋友许久没有见过, 本来就要联系, 也要去参加这次活动。 我终于下定决心当这个250(票价是250-1)了。 这个决定, 从整个活动结束之后看起来, 是非常值得的。 具体待我把整个活动整理一下后慢慢道来。

第一天

会场是在创智天地, 9点开始比较早。 我赶到江湾体育场, 领一群不认识路的人到会场, 坐下。 场地是KIC 7号楼的一楼会议厅。

在来之前, 我查过活动的组织方, 看起来是2个做nodejs的老外, 聊到在上海举办这样的活动, 然后兴趣十足, 就做起来了。 因此, 他们邀请到了很多来自国外的演讲者, 这是我觉得这次活动的亮点。 会场开始, 这两名老外就开始做自我介绍, 以及开场白(上面那张图片就是了)。

然后下面是第一天的演讲:

第一个演讲就是组织者之一的Troy, 他讲的主要还是本次活动的缘起, 以及组织的经过。 没有什么可以说的。

第二个演讲有了调整。 本来第二天的Steve, knockout.js的作者, 因为第二天要回伦敦看刚刚出生的小孩, 就改成了今天。 内容是knockout的介绍, 以及微软那个云平台Azure。 演讲的内容非常熟练, knockout和Azure的使用一步步说过来, 是讲师的素质了。 讲的非常清楚, 过程非常的顺, 我想从这点可以学习一下。 估计这样的演讲他都进行了不知道多少次了。

第三个演讲是盛大的程劭非/寒冬WINTER, 讲的是ECMAScript5, 我觉得这些东西都是可以网上找到文档, 以及加入的东西也没有什么我不熟悉的就没有多听。

中间有一个coffee break, 时间非常的短暂。

下面是袁峰, 中国node社区的人都熟悉的, fawave的作者。 介绍了在nodejs开发上面遇到的几个bug以及调试过程。 说话很幽默。 debug过程还是很有借鉴意义的。

下面一个是来自Github的Vicent Marti, 来自西班牙, 因为签证问题没有办法过来, 就做了一个介绍视频给我们, 远程skype做其他解说。 讲的是github的hubot, 基本上就是一个聊天室机器人, 只是这个机器人可以做各种有意思的扩展功能。

然后是中午饭了。 饭量比较少让我诟病, 赶到外面去又买了点蛋糕垫肚子。

下午第一场比较有料, Tim Caswell把js移植成lua, 讲了很多深技术的东西, 加上我午后犯困就昏睡过去了, 不过如果有对应需求, 这个东西是非常非常酷的。

再后面是老赵的wind.js, 解决的是我很感兴趣的一个问题, 如何把js里面反人类思维的callback转变成顺序的写法。 我提了问题, 关于我认为这样的功能应该整合到js语言本身里面去, 以及什么时候会这样做。 他说已经有这样的讨论了, 可能要等过些年。 他的库就是打这样的一个时差。 看起来我以后在未来如果有类似的需求, 可以用这个库。

下面是seajs的作者王保平, 我基本上又是昏睡。。。没有听到什么。

panel discussion, 里面有说道大家对coffeescript的看法, 有人喜欢有人讨厌, 喜欢的理由不必说, 用过的人都知道。 讨厌的人有几个理由, 主要还是在协作上面。 不是所有人都认同coffee的类实现方法的, 以及如果一个项目是纯js(比如node), 提交coffee是会破坏代码一致性的。 还有就是很多非程序员和非资深程序员也写js(比如设计师), 如果用coffee的话有一个熟悉成本, 也不一定能够让大家接受, jeffsu就因此实现了一个js的超集mochiscript

然后是今天的最后一段时间。 CHARLIE ROBBINS的演讲我想不起来讲什么了。。。 16岁的node开发者小问的演讲我也没有认真听。

王达心, 黄友昆基本上介绍的是node在工作上面的应用, 设计和架构, 我听下来的感觉就是, nodejs在长连接的状况下性能非常好, 以前C10K不再成为瓶颈, 以及nodejs本身性能很足, 加上js的学习成本低, 可以用来作为后端高性能吞吐的解决方案。CPU密集的话, 还是要上C++/go。 我觉得可以用它来在一些场景下写一些后端服务了, 等有空的时候尝试一下。

然后今天一天就结束了。 上面是演讲的部分。 在演讲的穿插过程中, 我认识了一些人, 聊了聊, 不过感觉收获也不大, 社交而已吧。

晚上本来还有一个party, 我有点累就没有去了。

第二天的活动总结在这里