2017 -> 2018

上一年差不多在这时也写了这么一个年终总结,今年也写一个吧。

HTTP 协议中的 URL

URL 概念

全称 Uniform Resource Locator (统一资源定位符),是一种 URI (Uniform Resource Identifier, 统一资源标识符)

URL 作用

主要用于网络资源的定位。换句话说,当你想告诉 Alice 你的服务器上有一个有趣的文件想要分享时,你就可以告诉这个文件对应的 URL。那么 Alice 就可以根据这个 URL 找到你要分享的文件。而目前 URL 更通俗的被称为网址。

拓扑排序 / topological sort

问题描述: 提供一些以数字为 id 的任务(task),这些任务存在如下图所示的依赖关系:

其中, 1 -> 3 表示任务 3 必须在任务 1 完成之后才能够开始。如上图中,任务 3 必须在任务 1 和任务 4 之后。而任务 4 又必须在任务 2 之后。

而要求就是, 提供一个序列,要求按照这个序列能够顺利完成所有任务。这里假设每个时刻只能处理一个任务,而且一旦开始处理某个任务,那么你不能中止或切换到其它任务。这个答案可能不唯一。在上图中,一个可能的答案就是 [1, 2, 4, 3, 5, 7, 6]

思考为什么要用工厂模式

以 JavaScript 为例子发表一下我对工厂模式 (Factory Pattern) 的看法

为什么不直接 new 呢? 我自己写代码直接 new 自己写的类不就好了么?

这里不得不提一下设计模式的意义。设计模式并不是凭空捏造的,而是长期开发所形成的经验之谈,当然这些经验自然是成功的,被认可的经验,否则设计模式就不会被那么多人认可和推崇了。

简单谈谈 Node.js 对 ESM 的几种支持方案

简单谈谈目前 (2017 年 10 月), Node.js 对 ESM (ES6 Module) 的支持情况,并且发表一点自己的看法。

主流的方案

  1. 在文件开头添加 "use module"; 或类似字段
  2. 新的文件后缀名,如 .mjs
  3. 通过源代码内容自动区分
  4. package.json 指明采用 ESM 的文件

借助 Proxy 实现一个 DefaultDict

这里的 DefaultDict 指的是类似于 Python 中的 defaultdict 的一种类。其基本特点就是当某个属性不存在于该对象中时,该对象会自动为这个属性创建一个默认值。这个默认值是由用户在创建 DefaultDict 时指定的。

举个例子,现在需要一个对象,如果某个属性不在这个对象时,在为这个属性赋值为 0.

node-thunkify 的实现及源码阅读

最近看了些项目的源码,其中就包括 thunkify。虽然 thunkify 代码简单,很快就读完了,不过看看项目的测试文件和提交历史,也还是能看出很多事物的。这次阅读的代码是当前最新版本,commit 编号 0bd83e

功能陈述

将一个函数转换为一个为 Thunk 函数,这个函数被调用后会返回一个以回调函数为参数的函数。可以参考 Thunk 函数

杭州白马湖漫展一行

作为一名在杭州读书的学生,其实从大一开始,我就一直想去这个展会了。第一次和第二次“太乖”,遇上了点学院的事,听了辅导员和学生会的建议,给他们做苦力去了。第三次正忙于升学考试,故自愿放弃了那次机会。但今年,我在杭州,又没有理由不去,所以还是去了。之所以选择这个日子(4月28日),主要还是因为听说“山下智博”也会来展,想去见见,所以选择了今天。

ACG

一周面试小结

背景及摘要

3 月 15 日,浙大玉泉校区举办了一场招聘会,近几百家单位参加。虽然我不是浙大本校生,但是外校学生若携带学生证件也是可以进入的。我总共带了 12 份简历前往,并全部投出。我的目标岗位为 Web 前端开发,但也对 Python / Node.js 后端有意向。目前我已进行了 3 次面试,分别是 数聚科技, 谷神星, 企朋 (点击可查看拉钩网上的信息)。我想在这篇文章里分享一下我这几次的面试过程,谈谈我的一些想法,希望对大家有帮助。

Python 对函数默认参数的处理

Python 对函数默认参数的处理

一个以可变对象为默认参数的函数:

1
2
3
4
5
6
7
8
9
10
11
class A:
def __init__(self):
self.x = 1
print('created')

def f(a = A()):
a.x += 1
print(a.x)
# output: created
f() # output: 2
f() # output: 3

从结果可以看出,Python 在解析时便已经创建好了默认参数 a 的值。函数 f 在调用时采用了同一个对象,而不是每次调用时重新创建新的对象。这一点与 C++ 的处理方式不同。

初看 CPython

什么是 CPython

简单的说, CPython 是 Python 解释器的一个实现。换句话说,Python 解释器是由 C 写的,然后由 GCC 之类的编译器编译而成的可执行文件。除了 CPython,还有 PyPy(用 Python 实现的 Python 解释器),Skulpt(用 JavaScript 实现的 Python 解释器) 等等。如果你不知道你用的是哪一个,那么你一定用的就是 CPython。因为 CPython 是 Python 官方的解释器实现,其它均属于第三方实现。

从源码到运行

对于从 Python 源码到解释器执行它们的这个过程,我把它分为两大步 —— 编译(Compiling) 与 解释(Interpreting)。