未知


现在的人对于未知有深刻和发自本能的恐惧,生老病死婚嫁都被称为人生大事我想多半也是因为这些行为本质上都是将未知推向参与者。大家惧怕死亡、逃避婚姻、推迟生育,恐怕一方面也是因为未知。

阅读全文 Read more ->

米津玄师与鬼才


我一直很喜欢听米津玄师的歌,最近超喜欢他的新歌《Kick Back》。愚钝如我,还是能听出这新歌丰富的层次,有创意的混音,因此最近空耳许久,大脑仿佛在说“这是什么东西?前所未见!好听!”。

我想鬼才这个词被用在他身上真是再适合不过了🧎🏿🧎🏿🧎🏿。Chainsaw Man 能用这个曲子来当 OP 真是门当户对。

(本文由 Forestry 编辑完成。即使固执如我也是晓得用 Vim 来打中文是多么不愉悦的事情。)

Free Guy 很好看


Free Guy 很好看,虽然豆瓣评分并不高,但是在我来看算是今年最好看的电影了,我个人认为比 Ready Player One 好看。

Zhming

要问为什么,我觉得 Free Guy 直击了我的游戏哲学,就是快乐、浪漫以及想象力。并没有对逆乌托邦的抨击,也没有过度强调阶级矛盾,到最后的结局也是无关世俗的。

我从小生在于一个周围的人对电子游戏不理解的世界里,父母反感,老师反感(虽然他们都很喜欢麻将),女票反感,很多朋友也迫于形势没有真正体验过游戏的快乐。这种事情总是让以前的我很困惑甚至有点罪恶感,我玩游戏,难道就是虚无缥缈毫无意义的事情吗?

直到几年前我才能正视这件事,就如同 Free Guy 中所说,虽然游戏的服务器一关一切都毫无意义,但玩的那一刻是真实的,快乐是真实的,之后留下的记忆也是真实的。人的记忆系统就是充满讽刺意味,开了一整天的会议可能啥都留不住,但是游戏中的某个瞬间却可能铭记一辈子。

也是基于此,我才会喜欢玩给我带来最大快乐的游戏,尽管他们未必是最受欢迎的。我喜欢疯癫幽默的 Team Fortress 2,我喜欢能从雪上上一跃而下与龙齐飞的塞尔达传说荒野之息,我喜欢游戏规则莫名其妙五花八门的风暴英雄,也喜欢视觉效果很酷的 Beat Saber。

这些喜悦确实与世俗无干,甚至是反世俗的,也是因此我已经有若干年没有玩游戏了(想到此我就觉得羞愧)。但这不妨碍我欣赏对游戏的爱,Free Guy 就是这样,一切的终点就是为了天马行空,图个乐子,或者是传达一份情书。

总而言之,赞!

对 Monorepo 的肤浅理解


在很长时间里,我对 monorepo 的理解一直很肤浅,我以为,把所有的代码都放在一个 CVS 的 Repo 里就叫 Monorepo 了。 好处是更容易分享代码,执行规范,合作部署,降低交流成本等等。 坏处无非是,CI 有更多的 overhead (需要用 Bazel 类的工具来智能构建),commit conflict 的可能性上升,非主流的组织结构等。

建立于在肤浅的理解之上,我每次一到有选择的时候我就会高呼 Monorepo。直到近日我忽然反思了一个问题:“我的理解的前提是什么?”,才发现了我自己潜意识里的定下前提可能会让我做出错误的决定。

阅读全文 Read more ->

徒劳有功


认可徒劳有功,就是认可存在自洽。

阅读全文 Read more ->

为什么我们应该写信?


我们生活在一个前所未有互联的世界,每天接纳的信息就像是海水灌入一个碗。 很残酷的,新潮的,冷漠的,温暖的,消极的,鼓舞的信息源源不断。 闭上眼一天,打开自己的RSS Feed就会看到数不尽的趣闻。 在知乎微博上随口回答的破文字,每日也能有数百阅读,想必我也为一些人的信息流做了点贡献。 打开手机不要10秒就可以让朋友的手机上出现自己的推送。 若是古人看到我们,不得感叹? 总体来说我觉得我们是幸运的,相比于住在山洞里吸风饮露,还是信息过剩为好。

然而,我最近认为,我们应该写信,写邮件,好好写。

阅读全文 Read more ->

为什么我喜欢Yorushika


我粉了Yorushika,这是一个来自日本的两人音乐创作组合,一人唱(Suis),一人创作(N-buna)。 我一直自恃冷漠挑剔,但没什么特别的理由,就是很喜欢Yorushika,以至于打算写一篇博客来纪念这份情感。

Zhming

诚然,我在音乐和美术上没有天赋,虽然中学期间学习过吉他和架子鼓,也有过一些表演的机会, 但我每次和身边的人相比,我就难以否认我在艺术上就是个蠢蛋。 所以也许我在这儿写的东西会让人发笑,但那又怎样?博客是我的,爱写啥写啥。

与Yorushika歌相遇纯属偶然(推荐算法)。 那些音乐经过了我愚钝的大脑后,我感受到了创作者难以抵挡的才华和饱满细腻的情感。 我想,哪怕是我,大概也可以做一点主观的臆断。

阅读全文 Read more ->

为何Rust并不适合服务端开发


上个月我开启了一个新项目,抱着实验的心态用起了Rust,因为:

  • 社区里有很多人号称Rust is ready for web。
  • Rust连续若干年蝉联Stackoverflow上最受使用者欢迎的语言。

这篇小文总结了我最近对Rust的体验。 注:本文的评论仅对Rust 2020有效。

阅读全文 Read more ->

白话OAuth2,OIDC和SSO


OIDC(OpenID Connect)的标准已经完成许久,然而普及的程度一直很低。 我觉得主要的普及障碍之一就是缺少足够的科普教程,最佳实践。 如此复杂的协议,如果没有一个直观的介绍,容易让人失去兴趣。 这个小文章就是想用一个杜撰的故事来给读者一个对于OAuth2和OIDC的直观体验。 但愿有所帮助。

—–

从前,小A做了一个网站A,用户可以在网站上买菜,用户很开心,小明也很开心。 后来,小B做了一个网站B,目标是整合用户在所有买菜的网站上的购物记录。 于是小B找到小A说:能不能把让我获取你的全部用户购买记录呀?

阅读全文 Read more ->

共识生成


不论用多么深沉的音乐来当背景,大部分人类个体的生命活动在历史上都是无足轻重的。 然而我们每个人都有理想愿望,喜怒哀乐悲欢离合。 近距离来看,每个人生都在发生轰隆的巨响。 所以这世界一定是千人千面,意味着虽然source of truth只有一个,如果把每个人的认知输出在硬盘上,想必每个人都会有若干TB的独特内容。

如何才能在这种去中心化的状况下产生有组织的协作和交流呢?我以为这个问题是管理/政治/教育的核心,其实际上就是在问: 如何让若干独立的个体对同一件事物产生相似的看法 - 即所谓的共情/共识?

阅读全文 Read more ->

正反馈


我以为人类的行为是被正反馈驱动的。用简单的语言来说,就是没有好处,就没有主观能动性。

这种论调听起来仿佛是逆乌托邦的温床,因为如果生活水平已经达到了一个高度,正反馈就变成最稀缺的资源,那么人必然堕落。 例如,如果薪水远高出了个人的需求,涨薪获得不了正反馈,因此努力工作无法获得正反馈,甚至可能使其他的创造性行为也失去正反馈。 毕竟世上太多事情是靠金钱来衡量,博客的流量,项目的影响力等等。 但讽刺的是,另一方面人类又必须依赖种种“徒劳无功”的行为来维持生计。 于是这种矛盾很容易导致一些无奈而现实的现象,比如近几年流行的“诗与远方”的概念,Instagram上无止尽的对旅行的向往,阿片类的药物成瘾,以及近日大火的动物森友会。 我对这些行为的驱动力一概称为“正反馈快餐”。

阅读全文 Read more ->

我们与老鼠的生育观


最近看到一篇文章谈及一项出名的实验,实验内容是把老鼠放在一个食物饮水资源无限,空间有限的地方,并观察种群发展。 简而言之就是结果老鼠的种群生育率呈抛物线,种群在两年后彻底消失了。 在实验中有很多很有意思的现象,包括种群中出现性别障碍的老鼠,或者雌鼠因为争夺生存空间而放弃育儿。 但其中有一种现象引起了我的注意,在实验中期,有一些处于优势地位(即指拥有领地)的雄鼠失去了繁殖和社交的意愿,他们每日只顾吃喝和梳理毛发,因此为一些人称为“漂亮鼠”。 “漂亮鼠”相比于周围老鼠最明显的特征就是自私和孤立。

这不免让我想到现实生活,作为一名第一世界国家居民,我们是不是所谓的“漂亮鼠”呢?

阅读全文 Read more ->

前端组件化的挑战与解决思路


自浏览器问世以来,前端的开发就一直是一个困难的问题。 一部分原因在于早些年的JS被设计为类似Lua一样的精简脚本语言,另一部分原因在于Web是一个极其开放的平台。 几年前阻挡前端发展的主要问题是没有模块化的方案,也没有组件化的方案。 近年来模块化问题被RequireJS,CommonJS,Webpack解决了。 组件化问题也有了诸多方案,例如ReactJS,AngularJS,VueJS。 看似已经全面迈入现代化? 实则不然,组件化之后的前端工程仍然面临着许多挑战,这些挑战也催生了很多新的方案。

本文以探讨为主,将讲解从Jquery时代到React/Redux时代的组件化的演变和挑战。

阅读全文 Read more ->

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!