用恶心的类型魔法构建类型安全的 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 」∠ )_

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

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

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

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

我是螺莉莉

总有一些现实生活中熟识的同龄人会通过各种方式搜到我的博客,这些人看到博客顶上的标题后(天才少女螺莉莉的数据中心)反应都出奇的一致:仿佛看见万年难得一遇的八卦一样,一脸兴奋的跟其他人谈论此事,这些事情时不时又会传回我的耳朵里。

我非常能理解这些人的兴奋之情,毕竟你看,一个自称螺莉莉(或者螺丝糖)、留着长发、身材酷似女性的男性,心里一定住着一个小女孩,恰巧这种人这在现实生活中是很少见的,好不容易遇到了一个稀有种自然要当成谈资。进一步的,很多腐的女脑内就会开始自动展开攻啊受啊之类各种烂桃花剧情,甚至难以安奈心中的兴奋之情与我分享你脑内那些不大符合社会主义核心价值观的画面。虽然一般我都会耐着性子听下去,不过内心当中我是不大喜欢这类话题的,尤其主角是我的情况下。

上周我在直播上聊了这件事情,这周另外写了一份文字版供好奇的人更加深♂入的了解我。

2019 年终总结

哦我亲爱的上帝啊,2019年竟然就这么过去了,仿佛从来没有开始过一样(?)。用一句话来总结这一年的话,可以说这一年是:「另一个和稀烂的数据一起摸爬滚打的一年」。这一年发生的事情还挺多,比如说「放弃读博计划,彻底决定不再做科研了」、「加入了回形针」、「博客大翻修」、「学习了 Rust」、「发现了很多好看的番剧」、「开始追漫画了」、「发现了很喜欢的游戏」之类的。

在 R 中遍历变量生成数据框的最佳实践

在做数据分析的时候循环遍历某一变量,并且生成一个数据框(data.frame)作为报告是一个非常常见的事情,但是究竟怎么写才能让程序跑得比西方记者还快却非常麻烦。众所周知 R 是一个很慢而且语法怪异的语言,用「常规」的思路来写一段 R 脚本,性能可能会非常不理想,而写「性能很好」的脚本,又可能把你的代码变成自带精神污染效果的魔法道具。因此在本文当中我将分享一个用于循环遍历变量生成数据框的编程模板,以期在性能和可读性之间取得平衡。

大方向很简单,把 for loop 禁用掉,尽量使用向量化循环(lapply),同时不使用 sapply;不使用 「Scoping Assignment Operator」(<<-)。