记一次 Nginx 调试
背景
一般来说 Nginx 使用起来挺简单,不出意外的话应该没什么问题,但今天我就出意外了。
我的配置很简单,如下:
123456789server { server_name www.hikariyo.net; root /web/www; index index.html; location / { try_files $uri $uri/ =404; ...
迁移 VPS 到 Vultr
为什么要迁移
趁着中秋节之前总算是把我的 VPS 迁移到了 Vultr,域名也换了一个 .me 结尾的,更有个人网站的感觉,但是一年下来也得多花不少钱,疼死我了。
我以前是全套阿里云,服务器是他的,域名也是从他那里买的。不是说阿里云不好,但是对于我这种小小的个人网站来说,他的价格有点高,没有活动最低配置是七八百。
而且,由于某些众所周知的原因,管得比较严。做很多事情都要去报备,着实比较烦心。
迁移 ...
使用setTimeout模拟setInterval
源码
来自半年后的说明:我把代码转放到 gists 里了,当时代码风格受 Python 影响较大,这里就不再更改了,毕竟大家本地都有自己的格式化工具。
前往Github获取本文源码。
介绍
相信setInterval这个东西大火都比较熟了,这里不做关于它的介绍,而是关于本文是如何实现这一功能。
我们通过一个Set来保存定时器的id,当清除时,就把这个id删掉;当每一次调用时,都会检查一下当前i ...
JS实现只能调用一次的函数
源码
来自半年后的说明:我把代码转放到 gists 里了,当时代码风格受 Python 影响较大,这里就不再更改了,毕竟大家本地都有自己的格式化工具。
前往Github获取本文源码。
目标
我们的想法是一个函数只有第一次调用的时候有效,如下:
1234567function foo() { console.log('Hello world')}fo ...
JS中的WeakMap与WeakSet
介绍
WeakMap与WeakSet都是一种优化使用内存的解决方案。这两个数据结构的引用不会导致这些对象不被回收。上来就说这些有点太枯燥了,还是先聊聊它们能干什么。
WeakSet
集合就是一堆互异的数据,想必这个读者都早就明白了,这里不多说。
相对于正统Set,WeakSet只提供三个方法:add、delete和has。正如前文所说,它们的引用GC是不管的,所以它也不清楚自己到底引用了多少个对象 ...
基于JSON文件的轻量级数据库
仓库
仓库地址:Github仓库
安装
已经发布到npm仓库,可以用npm、yarn、pnpm等等安装:
1npm i json-file-database
介绍
轻量级仓库,其内部实现原理就是把数组包装了一下,使得源数据改变时自动保存。
下面是Github页面上给出的示例代码,这英语也比较简单就不翻译了,毕竟是我写的Chinglish。
12345678910111213141516171819 ...
JS防抖与节流
源码
前往Codepen在线体验。
介绍
防抖和节流是两个JS中的概念,它们被广泛应用于被频繁触发的事件中,如搜索框在输入时会弹出候选列表:如果每次输入都发送一个AJAX请求来获取数据,那么后台就要被刷爆了。所以,这里就引出了本文要介绍的概念。
防抖
在 x 秒内,无论调用多少次这个函数,它只会在最后一次调用的 x 秒后被真正执行。
在参考文章里举了这样一个例子:
一个小孩向妈妈要蛋糕,他的妈妈 ...
JS关于或运算符的问题
背景
这是在AVL树计算高度时遇到的问题。为了方便大家看到问题的本质,这里使用一个单链表复现问题。
我们有一个链表,并且把它的深度储存到了每一个节点里(所谓深度就是它拥有的子节点层数,对于一个链表而言就是它的长度减一)。
复现
先一个个函数来实现一个简单的链表。不直接说的原因是我想让读者带入到当时的场景,思考为什么出现问题,这样才能印象更深刻,同时我在再次回头看这篇文章的时候也能会想起当时的场景。 ...
JS设计模式之备忘录模式
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
——《设计模式:可复用面向对象软件的基础》中文版第212页
这个常常被运用于游戏存档、操作撤销等场景。
示例
这是一个悲催的故事,内容是一个人先涨薪然后通过本文提到的功能恢复了原来的薪水。如下:
1234567891011121314151617181920212223 ...
JS设计模式之策略模式
意图
定义一系列算法, 把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。
——《设计模式:可复用面向对象软件的基础》中文版第234页
由于在JS中,函数是一等公民,所以我们这里直接把函数当作这一个个策略对象即可。
示例
我们的编码目的是,根据一个人的等级把他的薪水乘不同的系数:
如果是A级,就乘4。
如果是B级,就乘3。
如果是C级,就乘2。
不要用 ...