本周轮子
以前看过一个小册子 《一天学习一个 npm 轮子,十天后变成轮子哥 》,觉得这种「首先实现一个最 Low 的解决方案,然后慢慢优化,进而推导出最终的源码」的学习思路非常不错,所以我也决定从现在开始,每周都学习造一个 npm 轮子。
当然前期只要专注于那些日常使用、相对简单的 npm 包,毕竟能力有限,太复杂的包就很难可以讲透。
这是本周的轮子:《每周轮子之 only-allow:统一规范团队包管理器》。
本周见闻
程序员应该怎么写博客?
这是在 V2EX 上看到的一个帖子,OP 是之前周刊有提到过的 胡涂说 的博主,在这个帖子中,我收获不少有用的建议,也意外地发现到几个不错的博客。我也想借此机会聊一聊关于这个话题的一些想法,也算是当作我个人写作的总结与反思。
回顾本站的第一篇文章《锐捷无线AP学习笔记 - 入门篇》,写于 2018 年,到现在也就第 4 个年头,相比有些人动不动建站十几年,自然算得上年轻,但我认为我在写博客这件事上有过不少的挣扎与坚持,总结起来一共经历了以下几个阶段,但其实以下阶段并不是层层递进式的,它们有可能会同时进行:
- 记录学习笔记,这个阶段的产出主要是一些较为基础的学习笔记,原创度也较低,属于网上一搜一大把那种,对他人的帮助接近于无,还记得当时把一篇文章分享到技术社区上,被某些暴躁的老哥说我误人子弟,更有甚者直接开怼让我干脆把整本书都抄过来,当时有点气馁,但也承认自己的确是很菜,也曾自我怀疑过是否应该继续往中文社区「倒垃圾」,但最后还是坚持下来了。据我了解很多程序员刚开始写博客都是写这类学习笔记,也有很多人仅仅停留在这个阶段,甚至放弃,实在是太可惜了。
- 资源分享类,写技术文章很难写,有深度的技术文更是难上加上,所以曾有一段时间我特别喜欢写「资源分享」类的文章,譬如《分享一些好用的网站》、《分享一些好用的 Chrome 扩展》,这类文章写起来压根不费多少时间和经历,你只需要把平时经常使用的网站、工具分享一一罗列出来,,就能在社区上收获不少的点赞收藏,这也是为什么 GitHub 上简体中文项目的 Markdown 项目如此之多的原因,但是我后来意识到,写这类文章对我个人能力的提升并没有多大帮助,如果你知道一些非常有用的工具,你确实应该将它分享出去给更多人,这是非常有价值的,但我的建议是千万不要满足于只写这类文章。
- 较有深度的技术文章,随着工作时间的增长,在技术上有了一些的积累,我开始尝试写一些较有深度的技术文章,包括一些经典面试题讲解、源码阅读、某个知识点深入剖析、一些工具类库的踩坑记录等,写这类文章是最痛苦的,因为你会发现在写的过程突然在某个地方你自己也无法讲清楚,说明你并没有理解透彻,于是只能逼迫自己一边查阅文档、一边根据自己的理解用自己的话把它讲透,这过程中的收获自然也是非常大,对其他人的帮助也不小。
- 与技术无关的,人都是有感情的动物,除了技术以来,总需要聊点其他的东西,有可能是生活上的一些感悟,也有可能是你针对某个事情的看法,这类文章,它既有可能会引起读者的共鸣,也有可能会因为与读者的看法不同而遭到反感,且很多时候,自己也不确定这些看法到底是不是正确的,所以会害怕被别人看到自己不成熟的一面,我也曾有过这方面的顾虑,不敢在博客上公开谈论太多与技术无关的事情,但后来发现是我多虑了,因为这类文章,往往最终的读者只有你自己,因为读者看你的文章,他也只会关心对他有帮助的地方,而且即便你当时所记录下来的自己可能是不成熟的,这也是你成长的印记,比如我常常会在迷茫的时候翻看起之前刚踏入职场时写下的《我为什么会成为一名程序员》,告诉自己不要忘了为什么会走上技术这条路,所以不要害怕写技术以外的东西,这些稚嫩的文字很有可能会在多年以后一直激励着你。
可能还有些同学会认为自己文笔不好、词穷,写不了这么多文字,其实也是多虑了,我坦白我的文笔其实很差,不能像别人那样出口成章、行云流水,但其实你只要把意思表达清楚、并且注入你的感情即可,总之多写、坚持写。
一些 tips
QOTD 协议
QOTD 的全程是 Quote of the Day,翻译过来就是「每日报价」,在 RFC 865 中定义,监听的端口是 17,这是一个非常少用到的协议,目前仅剩的公共 QOTD 服务器只有几个:
服务器地址 | TCP 端口 | UDP 端口 |
---|---|---|
djxmmx.net | 17 | 17 |
alpha.mike-r.com | 17 | 17 |
cygnus-x.net | 17 | 17 |
可以用它做什么呢?
比如这里就有一个在 GitHub Action 上利用该协议定时获取 djxmmx.net 服务器上的名人名言,将它更新到 Github Profile 中。
分享文章
Bash Pitfalls: 编程易犯的错误
本文是《Bash Pitfalls》的中文翻译版,介绍了40多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。作者会在每条给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。
Docker 镜像构建的一些技巧
本文分享几个 Docker 镜像构建的一些技巧,可以帮助你提高 Docker 镜像构建的效率,对于老手来说已经是非常基本的事情了,但是对于新手还是很有帮助的。
原文一共举例了 4 个技巧,在此我只详细讲解第一个技巧,其余的麻烦移步原文查看。
- 删除缓存
使用 apt、pip 等包管理器下载包时一般都会产生缓存,以便后续下载时使用,但是在 Docker Image 中,我们不需要这些缓存,所以一般都会在下载后,手动清除缓存:
RUN dnf install -y --setopt=tsflags=nodocs \
httpd vim && \
systemctl enable httpd && \
dnf clean all
要切记千万不要像这样分开写,因为 Dockerfile 里面的每一个 RUN
都会创建一层新的 layer,这样其实是创建了 3 层 layer,前 2 层带来了缓存,第三层删除了缓存:
FROM fedora
RUN dnf install -y mariadb
RUN dnf install -y wordpress
RUN dnf clean all
但其实 Docker 在 v1.13 中引入了 —squash 参数,可以在完成构建后将所有的 layers 压缩成一个 layer,也就是说,最终构建出来的 Docker image 只有一层,所以,如上在多个 RUN
中写 clean 命令,其实也可以。
docker build --squash
- 改动不频繁的内容往前放
- 构建和运行 Image 分离
- 检查构建产物
JavaScript 函数式组合:有什么大不了的?
这是我看到过所有写 JavaScript 函数式组合里面最通俗易懂的一篇文章,作者从头开始一步步地实现 compose、pipe、flow 等方法,并且让对函数式组合了解不多的同学知道,函数式组合的好处在哪?
举个例子,假如我们使用 Array 的方法是这样写的:
const comments = commentStrs
.filter(noNazi)
.slice(0, 10)
.map(emphasize)
.map(itemize)
.join('\n');
而改用函数式组合的方式,则是这样:
const comments = pipe(commentStrs,
filter(noNazi),
take(10),
map(emphasize),
map(itemize),
join('\n'),
);
这样写的好处在哪呢?
首先,我们可以增加任何 Array 原型上没有的自定义方法:
const comments = pipe(commentStrs,
filter(noNazi),
take(10),
map(emphasize),
map(itemize),
join('\n'),
+ chaoticListify,
);
另外,我们可以自由地实现像 map 这些方法,比如用生成器的方式改成它,而无需改变调用它们的方式:
const map = f => function*(iterable) {
for (let x of iterable) yield f(x);
};
const join = s => iterable => [...iterable].join(s);
综上所述,使用函数式组合的方式编写代码可以让我们写出更加简洁、优雅的代码,更重要的是它给我们提供了另一种思考的方式。
中国黑客关系图
本文是新书《沸腾信安志》的一篇预热文章,主要讲述了中国上个世纪末到本世纪初的传奇黑客们的故事,想要了解有哪些著名的黑客,以及他们今何在的同学可以看看。
网络安全行业和武侠江湖是很像的,有门派组织,有江湖名号,有武林大会,有绝计和宝物,而且都是大侠少而恶盗多,甚至连朝廷的管制方式都很相似。
这种氛围里,竟然出了这样一群奇人。
他们在最艰苦的岁月里,只要把道德底线稍微降低一点,就可以衣食无忧,然而他们没有;
他们掌握着最高超的技术,却拿着流量行业一半甚至更低的薪水,只要稍微做点灰产,就能摆脱困境,然而他们没有;
他们忍受着社会的质疑,承担着行业流氓带来的负面,却仍然坚持着自己热爱的技术创新。
直到现在,他们终于等到了自己的时代。
有趣的链接
-
zonemeen/musicn:🎵 一个下载高质量音乐的命令行工具
-
Similarweb:查看并分析任何网站流量,站长必备工具
-
Codeit:手机连接 Git 查看代码的神器 APP
-
Queue:使用 Notion 发布 Twitter 的工具
-
Coverview:生成文章题图的工具