2014 年终总结

好快,今天已然又是这一年的最后一天,回首这一年还是感觉收获颇丰。

年初的前两个月还在懵懵懂懂地学 PHP 框架,虽然对网站有一些理解,但需求稍微复杂一点就有心无力了。这段时间过得比较蛋疼,期间学了些设计模式、还有一些前端框架的使用,有个二手市场的项目做了一半烂掉了。
四月份的时候参加了一个学校的网络新媒体班,如果顺利结业的话貌似是有一个辅修证书,然后有一大堆学分。本来是怕挂科太多毕不了业,打算去混学分来着,后来因为的确太费时间,上了两个月课放弃了。
五月份的时候由黄埔学长带我去百度校园极客大赛打了个酱油,这是我第一次去北京,之前甚至没有出过省。在北京逛了一圈,感觉北京的公共交通还是很发达的,地铁线路比武汉多得多,而且没有武汉挤。再别的也没啥特别的了,好像城市一大就会变得千篇一律。

因为之前暑假、寒假在家过得很不愉快,老是被嫌弃。家里人也无法理解我在做的事情,矛盾冲突不断,所以决定暑假的时候无论如何都不能在家待了。也可以说是一种逃离。
等到四五月份的时候我就在找暑期工作了,先给好几个武汉的公司投了简历,有的没有明确答复、有的直接拒绝、有的杳无音信,这时才感觉自己还是太弱。幸运的是后来在 V2EX 发帖找到了一份番茄土豆的实习,不过却不是 PHP 。

我是进入公司以后才开始学 Node.js 的,老板说相信我能很快学会。。。然后给了我一个新项目的后端让我负责,现在想想他们还是胆子很大啊。之前我用 PHP 都没写过这么完整的项目,而且 Node.js 也是初学,很多地方都不清楚。我已经记不清我自己是怎么一点一点梳理需求,然后一点一点搞定的了。期间踩过很多坑,代码重构过无数遍,进度慢得一塌糊涂,好在他们没有给我太多时间上的压力。
这边的生活比较惬意,我们在昆山的一个小别墅里面办公,人不多所以也没有打卡什么的,时间安排很自由。那时候我一般中午十二点左右起床吃饭,然后晚上十二点睡觉。别的时候写代码或者开黑打 LOL ,或者跟妹子去上海和苏州玩、看电影(小区里就有电影院!)。他们有 PS4 ,配一个大液晶显示屏,玩起来效果很好,不过我太会操作所以玩得也很少。
等到大三开学课也越来越少,所以实习到现在也还在继续。

跟他们厮混了一段时间,他们的一些思想和行为也在影响我,我现在说话的感觉越来越像我们老板了。。。而且因为现在有了工资,我的消费观念也发生了一些改变。我认识到我的时间是有价值的,能花费很少的钱就能搞定的事就不要浪费太多时间。导致的结果就是花钱越来越大手大脚了。。。
下半年换掉了之前的小米手机,换成了 iPhone 5c 。现在用了几个月还是很满意的,应用质量比较高,也都流氓不起来。这样我就少了很多时间在折腾手机本身上了,以前每隔几天就要刷个机不然没法用。
还把笔记本换成了 MacBook Air ,做工不错,屏幕效果也比我之前的电脑好,键盘和触摸板也很好用。现在开始晚上拉闸限电,它续航时间挺长,熄灯以后亮度调低一点可以撑到第二天来电。而且少了很多时间在折腾黑苹果上了,之前笔记本 WIFI 后来老是坏实在太烦。

我对我们学校的微信还是有很深的感情的,毕竟我之前在上面花了很多时间。也怕以后没人接手被荒废了,所以这学期我在大学生网络中心里面建了个编程小组,收了几个大一的小徒弟来教 Node.js ,花了一些时间不过进度还是很慢,前几天才又拉了 @jamlee 加入进来。
现在还在对微信接口用 Node.js 做重构,做了一些性能上的优化,前端框架也换了,支持了自定义菜单,预计期末之前这个版本能上线。明年应该还会继续完善。

现在跟妹子的感情越来越好了,么么哒~

理解 Node.js 异步编程

事件队列

JavaScript 是单线程设计,任务的调度方式就是队列。即在运行过程中只有一个线程在运行,也就是说每次只能执行一个任务。当调用 setTimeout 这种异步函数的时候,会将控制权交给通信线程,其中的回调不会立即执行。而当调用赋值等同步语句的时候,会立即执行。JavaScript 虚拟机会轮询这个队列,执行合适的事件。

这样做有什么好处呢?

不用新开线程,减轻系统开销,再多的并发也只是加长了事件队列,也不会令执行混乱。

异步IO

一般同步执行的的 Web 程序中操作 IO 的函数总是执行时间最长的,当网络和存储技术不发生大的革新的情况下,异步IO 是一个提升响应速度的好办法。

同步IO 就是在执行 IO 操作的时候线程阻塞,不继续向下执行,而是一直等待这个 IO 操作的返回。 而当 JavaScript 虚拟机调用了异步IO函数以后,不会等待函数的返回,而是继续执行下一个事件。

那什么怎么知道异步函数执行完了呢?

IO 操作是另外的通信线程来实现的,通信线程操作结束后会将执行原始回调函数的引用加入到 JavaScript 事件队列中,JavaScript 虚拟机因为一直在轮询这个事件队列,会发现这个事件并完成后续的处理。对于 Node.js 应用而言,它是部分多线程,即非阻塞IO 为多线程,但是 IO 结果的处理还是单线程执行。

所以 Node.js 的执行过程能保证非常的迅速。

回调函数

回调函数也是一个函数,只不过它的调用方式跟普通的函数不一样,它是由事件驱动的。比如完成个某个IO 操作以后执行回调,那么这个回调这是由完成事件来触发的。

人脑最自然的思考方式是顺序执行,非常适合写同步代码。而异步理解起来会比较绕,你需要将下一个执行的事件封装成一个回调函数,然后当一个参数传递给异步函数。异步函数在完成它自己的操作以后再执行这个回调函数,而这个回调函数里面又可能有其他异步函数,里面也有回调函数,所以整个执行过程看起来会比较像一个金字塔。

比较合理的做法是将不同的回调封装成函数,在异步函数里面只做调用,这样代码的结构会清晰很多。但有时候还是会造成一些混乱,所以也有 Qasync 这些来填坑的库。

解决 elementory os 频繁卡死

真是被折腾死了,要看解决办法请直接跳到结尾。。

年前的时候eos就是这样频繁卡死,tty调不出来,鼠标界面卡住不动。自己又找不到啥原因,最后干脆卸载了eos,转战其他发行版。期间因为不知道u盘有问题,换了N个发行版装了几十遍都失败的过程不表( = = ),最后在精子大大的指导下才换了个u盘搞定了。

可是习惯了eos的桌面以后用其他的都不怎么习惯,都没有eos的漂亮/流畅(卡死不算 = = )。特别是eos可以自己设置桌面热区,比如我的鼠标滑到右上角预览所有窗口/右下角最小化当前窗口/左下角切换工作区,一系列操作都特别炫酷。

好吧好吧所以呢,我最后还是重装了elementory os。前一段时间在家里用起来都没啥大问题,最近eos又开始抽风了,又是动不动卡死,完全不能忍啊。有时候在听歌,有时候在刷网页,然后突然卡死就只能长按电源键强制重启了。

昨天在v2ex看到有人说chrome占用内存的问题,我才检查我的chromium内存。然后我发现这货特别占资源啊,cpu经常50%+,内存也是几百兆。最后我决定对它下手了。

我先禁用chromium了大部分扩展,只留了两个(SwitchySharp和any.do)。本以为事情会有好转。嗯,我果然太天真了,问题依旧,而且cpu和内存也没降多少。

好吧我承认这娃没救了,转战firefox。使用习惯不同,ui不习惯(虽然我套了一个fxchrome的皮),书签导入麻烦,没有满意的扩展。好吧好吧,谁让我没办法,一一忍了,然后内存和cpu占用也降下来了。

嗯,你一定猜到结局了。我果然太天真了,过了一会又卡死了。。。。。。。。。wocao%7c$^389q&*dj

怒删firefox,然后在网上找其他解决办法。比如

基本上确定是内核的问题了,eos是基于ubuntu12.04的,内核版本为3.2,不支持hd4000的核心显卡,升级下内核版本就好了。

所以只需要一句命令就好了:

sudo apt-get install linux-generic-lts-raring

现在已经正常使用一整天了,依旧用chromium。。。