幕后故事:交互视频播放器的技术发展历史

今天想简单讲点幕后故事,一个简单的交互视频背后那些复杂的技术迭代历程,以及现在它究竟以什么样的方式运作。这篇文章会分成两部分,史学的部分和如今的技术架构介绍。

这篇文章会着重笔墨在发现问题、和解决问题的过程,以及我们是如何通过架构设计的方式来重新组织业务需求,并作出合理抽象的,对我个人来讲这是一段生命历程的记录;对各位读者来讲,我也希望它能起到一些启发性的作用。

纪念住了两年的出租屋

因为五月末要搬去上海(Actually 苏州昆山),要和这个住了两年的小屋子告别了,虽然说出租屋只有十一平但是生活还是一直在认真过,所以写点文字记录一下我和这个空间共处的两年时光。整个房间发生巨大变化是从去年双十一开始的,从那时起我陆续购买了各式各样的智能家电和收纳工具,也在 NAS 上搭了一整套的智能家居配套的管理工具,我开始思考自己应该如何和这个空间共处,如何让这个空间给我带来更多的安全感和亲切感。

在这篇文章中,我会介绍一些让我自豪的室内布置,也会详细的介绍每一个智能家居的配置方式,希望能给你带来一些启发。

料理包:一种现代青年的饮食方式

(aka 没有家人的可怜虫如何一个人省钱的吃好饭)

警告:本文内有致死量返利链接,你要是觉得烦可以直接去京东上搜,这样我就拿不到提成了 _(:3 」∠ )_。

从春节开始尝试了各式各样的速食品,从方便米饭到料理包,希望找到一个经济方便方式解决吃饭的问题,同时又不像若饭或者 Soylent 那么 Drama。在 Telegram 频道上聊了这件事情,群友们表示这东西的产业链都挺成熟的了,外面很多馆子和外卖都是料理包放进热水里煮一煮然后上桌的,成本低的令人发指。那么为什么不直接买料理包吃呢,没有中间商赚差价还省的等着外卖,想吃立刻就吃,并没有什么明显的坏处。

于是乎耗时好几个月的试吃活动就这样开始了 (ノ>ω<)ノ。

用恶心的类型魔法构建类型安全的 Custom Event

TypeScript 的类型系统和 JavaScript 的事件系统似乎有点相性不合,具体点讲,如果你想在里面加一些自定义的类型标注就必须的直接改 EventTarget (或者 EventEmitter)的类型定义,再或者用类似 event.detail as SomeType 的方式构建一种很微妙的「类型安全」氛围。

这两种方法都是我不喜欢的,前者会对类型系统造成污染,个人更加喜欢把「做同一件事情的代码放在一起」,但是按照前者的思路,类型定义和真正的 Event Listener 会「身首异处」,看起来非常可怜,而且,比如你在模块 A 中没有用到模块 B 声明的类型定义,但是它的 EventTarget 还是会带着模块 B 的类型定义,看起来就很脏,有一种全局变量满天飞的味道。而第二种做法则完全没有没有做到真正的类型安全,如果你 as 错了,那一切都没得聊了。

前些日子花了点心思研究了一下这种东西究竟要怎么写,最后选择了一种把我自己恶心到了的方法,可以做到大面上干净清爽但是内部恶臭得要死。

2020 阅读记录

2020 年是我执行阅读计划的第一年,执行这项计划的目的很简单,为了让我的 Podcast 有内容、让我下班之后也能做点正事不至于脑子僵掉、让我贫乏的词汇能够扩充一些不至于写出来的文章自己都看不下去。

选书的思路也很简单,常听的那几个 Podcast 主播推荐的书、Readmoo 上了畅销榜的书、想准备什么 Podcast 主题的时候去淘的书。除了一些贵到离谱的之外,看的书里面大部分都是正版,全为支持这个日薄西山的出版业。拜各个厂商自立山头整出来一大堆阅读平台所赐,我今年成了一个不折不扣的 DRM 拆弹专家,常见平台的去 DRM 方法全部了然于胸,甚至给 Readmoo 单独写了一个 DRM Removal 工具(然而并不开源也不提供下载,仅作私用)。

DRM 和盗版是两股螺旋向上的力量,共同蚕食着作者的利益和读者的阅读体验,将出版行业的未来带向了一片无人愿意踏入的疆土。

以上仅仅是一点个人的观察,说不上对不对。

2020 新番鉴赏

2020 年是非常不平凡的一年,疫情夺走了相当多的希望和机会,我们经历了太多的磨难和痛苦。但好在还有一些东西能够给人以慰藉,让生活在夹缝中的「年轻人」们能有一丝喘息和幻想。尽管整个番剧领域受到了很严重的影响,但在 2020 年仍旧有很多优秀的番剧出现在观众的眼前,我在观赏这些作品时会随手留下一些心得和评价,恰逢年末(2020年12月40日)将这些文字作以整理,当作年终总结的一部分,与各位读者分享。

先前我录过一集 Podcast 来聊 2020 年的新番,如果你不喜欢看文字,听播客也行。录制时秋番还没上,所以后面的新剧没有设计,如果有时间的话后面我会考虑补录一集(咕)。

三年之后,从一个失败者的视角再谈一些和考研有关的建议

大概三年之前,我从东北某个名不经传的地方二本考到了北京正态大学,考完复试当天我就回了学校,下火车的时候已经是后半夜,我打了个计程车回到宿舍,第一件事情就是把这段时间考研的所有经历都整理成了文章,发在了博客和知乎上。这是我「从文」以来写出的第一个爆款系列文章,也是唯一一个。尽管这系列文章的浏览量和互动率远没有我司出产的节目数据漂亮,但它们的确是帮助了一些人。

2020 年我从北京正常大学毕业,这期间陆陆续续有很多朋友来找我询问和升学有关的各种问题,在与这些人的交谈中,我发现了一些很有趣的现象,说不上好或坏,只觉新鲜或者独特。恰逢中秋连假有闲,觉得可以把一些支离破碎的想法整理一下,写成文章,以供有类似困惑的朋友阅读,希望能够给你提供一些帮助。

简单易懂的统计学入门:自下而上(二)

上次我们简要的介绍了统计学与实验设计当中的一些基本概念,以及频率学派假设检验体系的基本思路。这一篇文章我们将对这一思路进行更加深入的探讨(不过没有深到让你发慌,请淡定 (´・ω・)つ旦)。

让我们先用一点时间回顾一下上一篇文章提到的一些内容。之前我们遇到了这样的一个问题:王二麻和金三胖各找到了 20 名「程序员」,测量了他们的 BMI,得到了 2.91 和 22.03。一个样本比北京市人均 BMI 高,另一个则比平均 BMI 低。那么问题来了,样本均值和总体均值究竟差多少我们才能说这两个样本真的有差异?从样本分布的角度来看,影响我们判断的因素有两个:平均值本身字和样本数据的异质性。

平均值本身很好理解,在我们的研究设计中,样本和总体(20名「程序员」的 BMI 和全北京市居民的 BMI)的差异就通过平均值来体现,因此我们一定期待二者在均值上有所差异。而通过方差来反映的异质性告诉我们在这个测量系统当中的噪音有多大。如果噪音很大的话,说明我们随便进行一次容量为 20 的抽样,得到的样本均值可能具有很大的不确定性,因此你抽到的这个样本究竟能不能说明问题就很值得商榷了。

正态分布很好的描述了这一情况,对于同一个总体(比如全北京的人口),设定一个固定的样本容量(比如 N=20),进行无数次抽样并计算均值之后,会得到的均值的分布情况。总体均值的真值位于分布的中央,而总体的方差究竟有多大反应在分布的胖瘦上。

一种将 Readmoo 电子书导出到其他阅读器的思路

今年年初的时候就开始在各个平台买书回来看,电子书购买平台嘛,估计各位也都知道大概是什么德行。每家都会有自己的 移动癌批批和桌面客户端,每家的癌批批和客户端都难用的要死。

在前文我也提到了,敝人因为注意力低于大众水平故极不擅长阅读,因此买回来的电子书都要借助高亮工具和 TTS 系统辅助 阅读。恰巧主流阅读平台的 TTS 功能都糟糕的不行。因此我智能发扬电子共产主义,通过一些可爱的技术手段处理一下这些 平台的电子书并且导入到通用的阅读器来完成阅读。

目前大多数主流平台都有现成的方案了但是 Readmoo 好像没有,所以花了几天研究了一下。目前已经成功实现了文件格式 转换功能,故写一篇文章介绍一下解决这个问题的具体思路。

注意: 本文是一篇加密文章,仅面向我的朋友们开放,如果你误打误撞点进来的话我只能说抱歉了。 _(:3 」∠ )_

面向成年人的阅读习惯培养指南

上周有人发来信息问我如何培养阅读能力,恰好我从今年开始也在尝试重新把读书的习惯捡起来,所以就做了一期节目,花四十分钟讲了讲和阅读习惯有关的话题。

在这次讨论中,向各位介绍了一种我近半年以来在执行的月底习惯培养计划。这一计划参考了《游戏改变世界》一书当中提到的游戏化方法,希望能够给各位带来一些启发。

此文章是当时节目的文字版,供不喜欢渣音质的朋友阅读,希望你能喜欢。