Removing jQuery from GitHub.com frontend
本文介绍了 GitHub 如何将 jQuery 的依赖一点一点去掉。
- 以前:jQuery 在 2007 年的时候几乎是标配,就算不主动用,很多库也依赖它。
- 近些年: jQuery 的特性很多都融进了现代 JS 语言和浏览器中。
- 取代的原因是 jQuery 的写法不太能传达出代码的原始意图,也很容易默默吞掉错误。
- 取代品:直接用 JS:https://developer.mozilla.org/en-US/docs/Web/JavaScript
- 如何取代:
- 仓库埋 metric 进去,可以查看 jQuery usage
- lint 把有诸如
$.ajax
之类的新代码直接标为构建失败 - 有依赖库的,保持接口稳定的同时,替换掉实现,使用 JS 原生的特性 …
Py-Spy - A sampling profiler for Python programs
Py-Spy 这个工具是个 Python Profiler,它可以在不重启 Python 程序的前提下得到耗时函数及其调用时间,并将其以 top-like 的形式展示出来。
它的特色是:低 overhead,用 Rust 写的核心部分,不需要侵入 Python 进程。无侵入这个特性也是它有别于标准库甚至其他 profiler 的好特性。你不需要修改任何一行项目代码就能用它。pyflame 倒是可以,不过尚不支持 Python 3.7 及非 Linux 的 OS。
工作原理:通过读取进程内存:
- linux: process_vm_readv
- osx: vm_read
- windows: ReadProcessMemory
在内存中,全局变量 PyInterpreterState 可以拿到解释器运行着的所有线程,再遍历每个线程拿到 PyFrameObject 中的调用栈。
read moreTypescript at Google
本文介绍了 Typescript 逐渐在 Google 产品线被使用的现状。Google 在 JS 很早期的时候就在探索如何编写大型前端程序,并归纳出 Closure 这个框架。时过境迁,这套框架可能目前也就 Google 在用,或者某些用了的公司还需要找 ex-googler 来维护。Closure 本质是一个静态类型的 JS 方言,问题主要在于常年使用估计埋了不少臭虫进去。现代 JS 产出了 UMD, AMD, CommonJS,ES6 甚至也有自己的模块系统,npm,webpack 也逐渐推广开。作者所在的组就在尝试将这些东西引入现有代码仓库。迁移也是慢慢地迁移,而不是从头写一遍。现在好些个 Google Products 都已经有慢慢用上了 TypeScript 了。
read moreAirbnb 架构概览
本文介绍了 Airbnb 的架构,我们可以看到 Airbnb 是 AWS 的重度用户,使用了 EC2, RDS, S3, CloudWatch, EMR(已废弃,目前用的是 Hive+Airflow 的解决方案)。负载均衡使用 Charon。服务发现用 SmarkStack - 可以监听 ZooKeeper 的数据,自动更新到 HAProxy。后端的前台用 Rails,后台服务用 Java 系的框架 Dropwizard。服务治理将用户请求上下文塞入 RPC 请求中,监控服务的 p95_latency, p99_latency。
可以看到 Airbnb 的架构是从最简单的 Rails MVC 一点一点添砖加瓦搞出来的。
read morePandas 10 分钟入门
本文是 pandas 的 10min 入门帖子。
- 新建 Series 对象:
pd.Series(given_list)
, 如果值为空,用np.nan
。 - 新建 DataFrame 对象:
pd.DataFrame(given_numpy_array, index=index, columns=given_list)
。稍微复杂一些,第一个参数是 numpy 矩阵,index 是 pandas Index 实例,columns 是列的名字。 - dict 新建 DataFrame 对象:
pd.DataFrame({"a": 1., "B": pd_series, ...})
- 查看每一列的类型:
df.dtypes …
How the Go runtime implements maps efficiently
本文介绍了 Go 语言如何实现 Map 的泛型,并对比了 C++ STL 和 Java 的实现。
- HashMap: 一种查询时间复杂度近乎 O(1), 最差为 O(N) 的数据结构,需提供 hash function。O(N) 估计也真是运气背到家了,所有 Key 都哈希碰撞。
- hash function 一定是一个产出固定长度数据的函数
- C++ STL
std::unordered_map
在编译时就把类型模板编好了,所以编译时就知道每个 map 的 key 类型。 - Java
java.util.Hashmap
要对原子类型做 boxing。由于所有 java …
Latency Heat Maps
响应时间(response time),也叫延迟(latency),这个指标有很多模式隐藏其中。这篇文章通过 disk I/O latency 介绍了 latency heat map 这种查看性能问题的图表。
iostat -xz 1
可以查看 Linux 的平均 latency,我们可以定时采样,画出柱状图(histogram),x 轴是时间,y 轴是 N ms 的 latency。
柱状图可能会由于采样频率不同导致给出不一致的结论,解决办法是使用多种采样频率。如果不改进,那你要看好几张柱状图才能得到结论,有了 heatmap 你就可以把使用不同频率采样得到的结果压在一幅图里面。
heatmap 本质上是一张三维图表,x y 轴表示两个维度(一般其中一个是时间,另外一个是采样频率),颜色深浅表示第三个维度 …
read moreNetflix 使用 Papermill 的实践
本文介绍了 Netflix 如何使用 Papermill 管理 .ipynb.
Jupyter Notebook 本质上就是一个 JSON 文档,并自带了简易的接口可以运行它自己。它真正运行的地方是 jupyter-kernels。ipynb 的缺点是常常变化,cell output 跟代码不完全一一对应,不好测试,没有可以配置运行上下文的设施,以及你需要运行一个 Notebook server。
Papermill 的出现改进了很多这些问题。Papermill 做的事情是: 接受一个 ipynb path 和一些参数,然后运行出来一个 output ipynb,所有东西都在这个 output ipynb 里面。伪代码如下:
import papermill as pm
pm.execute_notebook(
'path/to/input …