ES6中Generator函数的设计问题以及co.js的原理


** 本文适合有一定JS经验的开发者阅读 **

从很久以前开始我对于web前端的开发就不报以好感,js可以算是web前端的技术代表。 js自问世以来就伴随着许多设计问题,比如错误的闭包设计,诡异的prototype。 许多的开发者在此付出了很多(没有必要的)精力才把js逐渐推进现代化。

然而ES6还仅仅只能算现代化的开端,其中还有一些在我看来的错误的设计。 其中有一处错误设计就是Generator函数中的yield函数和next函数。 然而这一错误设计却被巧妙利用了起来,并催生了co.js这种大热的函数库。

阅读全文 Read more ->

应用层开发的盲区


如我上篇文章所说,应用层的开发越来越像玩玩具。 种种底层的协议以及抽象让人获得了接近理想化的开发环境,仿佛一切都在鼓掌之中。 然而最近在维护一个已上线的Node项目时遇上了个bug让我对于应用层开发有了点新思考。

Bug

简单的说,那个Node的项目是个答题应用。 主要的use cases之一就是四个字“用户答题”。 这是个奇异的bug,简单的概括是,在上线以来的一年里,有1%的答案数据产生了重复。 一般来说,一个用户的一道题对应一条答案记录,然而有那么一些题目却有两条答案记录。 这些重复的答案记录刚好占总答案量的1%也就是数千条。

最终修复这个bug实际上并不困难,然而在发现bug来龙去脉的过程中却花了不少时间,可谓盲区bug。 有几个原因导致:

阅读全文 Read more ->

软件产业的夕阳?


Zhming

我从很久以前就发现,软件业在自己消灭自己。 今天和好友有了一场简短的聊天,更让我坚定了这个观点。 若要用一种形状来形容软件业,我会用“倒金字塔”来形容。 从软件业的发展史来看,最开始只有很少人有机会能开发软件,也就是那些在卡片上打孔的“先祖程序员”, 就像“倒金字塔”的底部,空间小,容纳不了太多人。 在发展了数十年后,随着技术的发展,通用平台家用PC的普及,开发者的数量大大增加,可供开发的内容也变得五花八门。 先有了各式各样的语言,多种语言用催生各种相应的生态,后来有了互联网,有了各种网站,传统工业开始转向数字化。 在这个阶段,就仿佛很多人住进了“倒金字塔”的中部,而且大家越往上走,发现空间越大。

那么未来是如何的?

在谈未来前,在这里有必要强调一个重要的行业特性,即开发者是倾向于像塔顶走的。 在现实意义上,也就是说开发者更倾向于做应用层的开发,与业务逻辑有更紧密连接。 这种现象一方面是来源于底层开发者培养困难,另一方面也来源于底层技术迅速成熟。 一个简单的例子,现在每个人的设备上都跑着操作系统,然而在这个星球上懂得如何开发一个操作系统的人,估计是屈指可数的。 操作系统的技术,不论是国内国外,都是极少部分人所掌握的技能。 另一个例子就是编译器,虽说世上程序语言各式各样,排除那些host language和解释型语言,像Lua,Clojure,真正的编译型语言并不多。 在这小小的编译语言合集里,有些语言的开发者是同一人,这意味着能掌握核心编译器优化的能力的人,是少之更少。

阅读全文 Read more ->

舒适区与年轻


心里有一只野兽,獠牙毕露,盼望着挑战与收获。 野兽张牙舞爪,脚下却是一片泥沙,越刨越深,越舞越难。 所以一摇尾巴,缩成一团,居于咆哮的泥沙里。

我不是在说我不得志,不过是想表达我的舒适区似乎有扩展的趋势而我却一直没有意识。 我以往健身时一直有一个大概的尺度,精力好的时候以X速度跑X分钟,精力欠缺的时候以Y速度跑Y分钟。 这个尺度本来是为了让我激励自己不浪费精力,但同时又不为了防止自己过度锻炼。 不过后来我发现这个尺度的存在渐渐变的没有意义,因为不论是精力好或者精力不好, 两种方案都只能让我出出汗,并没有最开始健身时气喘吁吁的效果。 对于这个现象,我曾经一直以“自己进步了”这种理由很愉悦的接受了它, 不过最近我忽然意识到这现象只是单纯说明了我的舒适区(comfort zone)扩展了。 事实上健身的属性本身并没有改变–自我提升,只不过是我自己开始满足于这种貌似自我提升的状态了而已。

阅读全文 Read more ->

我的表达与我


Zhming

一直以来,对于这个博客的态度我一直很模糊,一方面我希望这个博客能尽可能保持匿名低调, 另一方面我又希望这个博客能起到门户页的作用,算是一个我存在的证明。

显然这种矛盾的中合体导致了我每次想写博客内容的时候,我都感到被抑制。 写多了呢,觉得尴尬。写少了呢,觉得没意义。 激进了呢,担心朋友反应。种种的担忧(显然还有别的原因)导致这个博客竟然有一年并没有更新。

这种纠结导致我看这博客时的表情就像上图的某种高等生物。 直到某一天(确定不是今天?),我忽然意识到在某种程度上说,我即是我的表达,我为何要担忧我的表达? 这正是这篇小文的主旨即是我的表达与我。

阅读全文 Read more ->

信息的代价与错觉


Zhming

已经在澳洲呆了将近两个月,生活不错,风景甚好,又一次进入了学生的节奏。但虽说是又成为了学生,这次的心态相当不同。曾经的本科生时,无节制得汲取一切信息,仿佛一切信息都是可贵的,现在却有了不同的看法。

经历了在创业阶段的工作后,我对于资源有了更敏锐的看法。所谓资源,即是,能在物质或精神层面上带来有益帮助的事物。所以,信息也是资源。然而,资源除了带来帮助,也会带来一定的负担,或者说是伤害。我将从信息的方面加以阐述。

阅读全文 Read more ->

关于创业与团队


关于背景

前天离开了呆了将近半年的公司,修养身心准备出国的事宜。 这家公司的情况有些特别,这是一家有十年历史的IDC公司,处于转型期中。 转型的方向是往互联网公司发展,目标是制作一个视频渲染的App。 从一家运营销售公司转向互联网公司,其中的困难是可预见的。 可以总结成一下几点:

  • 缺乏核心技术人员
  • 缺乏互联网的运营思路
  • 缺乏先进的管理思路
  • 对工程缺乏有效理解

于是我就在这个时候进入了这家公司,在我进驻之前,我的几位同学已经进入了这家公司工作数月,技术部完全由我与我的同学掌管。 在我进驻之后,现在的产品核心才算是正式开始开发。 总而言之,我们可以算是一个跳过天使投资的创业公司。 在这半年里我们取得了不小的成果,但是也被很多问题租挡住了脚步。 这篇博客是我几个月思考的结果,没有对错,并不想指责什么,一切都只是我的个人体验与总结。

阅读全文 Read more ->

近两个月的部分思考


距离上一次写博客已经过去了两个月,种种原因没能继续写博客。 眨眼就两个月,真是深深理解了工作生活的时间飞逝速度。 之所以感觉时光飞逝,是因为这两个月做的事情在主观上屈指可数但是客观上似乎数量可观:

  • 《逃避自由》和《边城》
  • 若干有价值的电影
  • 尝试了技术测试中的《风暴英雄》
  • 渲染引擎的完善,使用若干种语言做了若干个side-projects。
  • 体验了一把财政不健康的创业状态
  • 曾经做过的外包被黑客攻击
  • DIY申请遇上效率很低的办事处
  • 和妹纸在京城多处游玩 雍和宫 天文馆 若干公园

都是些小事,之所以要写下来,是因为感觉如果不加以点记录,可能有哪一天我真的感叹“时间都去哪啦”。 但其实时间是没有快慢的,《边城》的世界里时间好似很慢,不过也只能铸成一本轻小说。 我的生活琐碎或者风光,无非也就是几个年月。 按照《逃避自由》中的观念,如果没有了爱与创造的渴望,自由就是枷锁和虚度。 不尽赞同,却也无力反驳。 所幸我坚信按照此种观念,我的生活绝对不是虚度。 但不论如何,纵使是虚度,我也希望这个博客能够让我的时光留点痕迹。

这些记录于此。不紧不慢~ 击掌!(  ̄ー ̄)人(^▽^ )

略笨的五子棋AI


继续之前的造轮子计划。本来只是打算做一个简单五子棋的和妹子一起玩,后来发现做个AI也挺有意思。就开始工作了。 本次的五子棋用纯HTML5实现。AI使用了简单的决策树和Alpha-Beta剪枝。 本来想使用ClojureScript作为AI的脚本,但是后来发现ClojureScript的性能差不多只有原生Javascript的1 / 100。 于是放弃,使用了原生的JS。

Demo与Code

Zhming

显示: HTML5 Canvas

显示部件使用了很简单的Canvas去画。关于悬停选框,使用了双层Canvas来实现。不得不说Canvas的性能确实相当不错,比起直接的DOM操作在移动端效果要好太多了。

人工智能:

AI部件实现了一个无状态的AI,付出了性能作为代价增加了开发速度哈。本来是想试试ClojureScript的,结果性能让我跪在地上了。即使是使用了advanced的编译,依然慢的不得了。虽然总有人说clojure好好利用可以很快,但是我认为开发者不应当承担这种无意义的优化成本。 于是我就投奔了JS。本来以为用JS代码会变得很长,结果也就100+行。摊手。。。。

这里人工智能的原理非常简单。核心函数有两个。

  1. chance函数,根据当前棋盘状态和当前玩家推算出一个优势值。其基本原理就是对于不同的串算不同的分数。譬如我方活4子串对应x分,我方半活4子串对应y分,敌方活3子串对应z分。之类的。在分数设计中需要遵循以下几个原则。
    • 分数应该分等级。及 p1, p2, p3...
    • 因为等级存在优先关系,譬如一个活4子比数个活3子要珍贵的多,所以等级关系必须清晰。也就是,p(i) >> p(i-1) 或者说 p(i) > N * p(i-1),上级要远大于下级。
    • 等级必须考虑先后手问题,同样的子数,先手(未下)比后手(已下)优先级要高。
  2. think函数,能够递归的进行决策树推算,并且根据父子兄弟节点的chance来进行剪枝。这个函数的参数是当前棋盘,当前玩家,递归层数,返回值是[当前玩家最大胜率,对应步],其基本逻辑如下:

    (假定当前玩家为A,敌方为B) A 遍历所有步。 针对每一步,都更新棋盘后调用B的think,并传入减1的递归层数。 选取某一步,这一步使B的胜率最小。这一步就是答案。

除去这些之外,还有一些优化的要点:

  • 减少遍历区域,只选择已下位置的相邻位子作为候选。
  • Alpha-Beta剪枝。基本原理很简单:当A进行遍历时,例如遍历位置1得出了B的胜率为c,那么再遍历止位置2时,就告知B的think,如果计算过程中胜率大于c,就剪枝。

总结

最后的结果是,这个AI可以在1秒的时间内递归3层,跟网上看到的一下数据差不多。 跟网上的一些别的AI下过,胜率不差。 跟自己做个AI对战有种奇异的快感有兴趣的童鞋也可以玩一玩哦

用WebGL实现Game of Life


最近有些空闲时间,于是打算开始造轮子计划,正巧在进行GPU加速最近,就写了一些小项目来练手。顺便进行了诸多的GPU加速实验。其中之一就是Game of Life也就是生命游戏,wiki页面在此,就不赘述介绍了。

Demo与Code

使用方法很简单,滚轮缩放,拖动复活cells。纯WebGL,没有任何第三方依赖。

Zhming

阅读全文 Read more ->

FreeType简易教程


最近接触了一下Freetype,投放了产品后对此库略懂了一二。犹豫了一下要不要写个教程,想想也没什么关系。虽然线上已经有不少的Freetype的教程了,但是他们都,太不友好(丑丑丑)了。于是,进入正题

为什么要Freetype?

FreeType是一个字形图glyph image产生工具,整个库的主要功能点集中在以下两点:

  • 解析几乎是所有的字体格式,例如常见的ttf,otf
  • 根据输入的单个Unicode返回该字的glyph也就是字形图。

其不包括或者说支持并不完善的功能有:

  • 颜色。
  • 处理字符串。

所以也就是说Freetype的基本功能就是把字变成图。最后怎么处理文字,还是由开发者来实现。

我要写什么

在这个教程里我会简单的讲一下如何使用该库来实现以下几个功能。

  • 输出字图
  • 渲染一个句子:调整字色,字号,字间距(tracking)
阅读全文 Read more ->

关于Zhming的新博客


Zhming

说起来,这是我第三次制作自己的博客了。第一次用的是Wordpress,第二次用的是纯Restful的Backbone.js + Clojure。第三次最为朴素,使用了简简单单的Jekyll + Disqus。第一次博客是因为好玩,第二次博客是想用潮流技术,第三次是想认真写点内容。我相信技术的转变这也标志着自己心态的变化,能够更清晰的看待事物的本质。也希望自己能坚持维护这个博客啦。

Jekyll制作博客的体验非常棒,尽可能的避免了开发者重新造轮子的现象。花了一两天迅速开发完前端,就可以有一个精简好用的博客了。在评论部分使用了Disqus的插件,简单美观好用并且还安全。

近期的工作主要集中在一个渲染引擎的开发上,希望能加快进度,提炼出来的值得分享的经验会尽量分享的。毕竟从我接触软件业的那天开始我就从开源中受益,总得尽量回馈。Cheers!