重新设计 Redux
这篇文章回答了三个问题:是否真的需要库管理状态,Redux 为什么会流行,以及如何改进状态管理。
- 前端开发的核心就是如何管理状态。在 React 中,状态就有组件内部状态,子组件从父组件获得的状态,以及树中的组件订阅 Root Provider 提供的状态。状态都放在 view 里面倒是方便,但是问题在于如果设计变了,整个程序就要重写。那么最合适的做法可能就是把状态都放在 root component 里面。如果在将 State 移出 view lib,那么就是 Redux 这种路数了(它通过 provider/consumer pattern 在 Redux 和 Tree 之间同步状态)。
- ^ Redux 的核心数据结构其实可以用
global.state = {}
来表示。 - Redux 为 ^ 这个数据结构附加的功能是绑定了一套工具函数的流水线 …
Syslog 简介
系统日志要处理的类型有各种各样,例如 ftp 来了新连接,kernel 发现硬盘坏了,DNS 服务器报告统计信息等等。大部分消息就地转储,以后来了问题用来追查。如果是很紧急的消息,可以通过设定立即通知系统管理员。大部分 Unix 操作系统提供了 syslog,它的 daemon 程序叫 syslogd,相关的配置存储在 /etc/syslog.conf
,监听 Unix sock name 是 /dev/log
。除了可以记录本地的日志,它也可以通过 UDP 接受来自其它主机的消息,或者 kernel 直接把消息暂存在 kernel message ring 中,待 syslogd 进程起了以后发过去。一条 syslog 消息的两个最重要的信息:facility …
如何集成测试 microservices
本文讲的是 A Sane Approach Pre-Production & In Production。真是的超级长的一篇,看完了原文觉得要吐血。作者认为正确的方法不是写成千上万的本地测试,也不是把几十种服务拉到本地来跑,而是应该 1) instrument services 2) understand operational semantic of services。
Testing in production 需要的手段有 A/B testing,特性开关,Canary,分布式追踪,监控等等。作者认为写一百个测试也挡不住一个坏掉的地方会把整个服务搞挂掉。与其在上面搞得心累,不如把 unhealthy 也看成一种 healthy,让程序尽可能地能扛 failure。真的要搞挂了,用类似 Canary 这种手段以最快的速度回滚,只让最小的用户受到影响。
read moreTerminal v/s tty v/s console v/s shell 的区别
这篇 stackexchange 问答回答了 terminal, tty, console, shell 这些名词的区别。简单来说,terminal 是文本输入输出的环境,tty 是 terminal 的行话,shell 是命令行解释器,console 是 terminal 的物理实体。当然,从词源上讲,terminal 是电线的终端,shell 是龟壳,tty 是个奇怪的缩写,console 是一种控制台或者仪表盘。
这些名词会让人觉得混淆的地方在于,他们都和我们操纵电脑的装置有关系。tty 之所以有这种缩写,是因为早期 Unix 是通过一种叫 teletypewriter 的远程打印装置输入命令。至于现在,这个名词还保留在系统里,不过已经只是作为 /dev/tty
这样的设备文件还存在着。与之相关联的,是被我们称为 pseudo-tty …
Bytecode - 一款 Python 字节码编译工具
bytecode 是一款 Python (3.4+) 的字节码编译工具,它可以让你写 bytecode,进而通过 exec(bytecode.to_code())
执行它。
衍生思考:感觉比较有用的场景是写 DSL。用一个语法解析工具解析自定义的语法规则,然后将切分好的 Token 映射成 Bytecode,进而让 Python 解释器执行它。以下的小例子可以用于进制转换,分别展示了运行结果及其源代码。当然,只是为了验证下可行性,要想写出 Robust 的 DSL 代码,还需要很多细节上的考虑。
运行结果:
$ ./simple-pipe '15 | bin'
0b1111
$ ./simple-pipe '15 | oct'
0o17
$ ./simple-pipe '15 | hex'
0xf
源代码:
1 … |
Postmortem: CA 信任链没安装造成的一次大型悲剧
本文介绍了一个团队关于一台 Linux Server 完全无法响应用户请求,但是 CPU / IO 负载等等指标又好的不能再好的 Case。事情简单说来是这样子的:他们使用了 Let's Encrypt 证书,他们的服务器上没有安装 SSL 证书的整个 chain,导致每来一个用户请求,服务器就需要向外部发送 HTTP 请求获取 ca chain;很不巧,防火墙还把这种请求给墙了,所以就会看到长达两分钟的 timeout。从这份 postmortem 里面,我们可以学到很多知识点:
- 使用 strace 可以看到具体进程发生的系统调用。如果想看到哪里卡了,用 strace 一查 syscall 的调用序列就知道。
- 在一次 SSL handshake 中,如果服务器没有安装 entire certificate chain …
Daemon 是通过两次 fork 产生的
Unix 上创建 Daemon 进程的常规手段是两次 Fork,根本目的是为了同 Controlling Terminal 分离开。
以 Sander Marechal 的这段代码 为例,初始进程进行第一次 fork,然后 setcwd('/'); setsid(); umask(0)
,接着进行第二次 fork,然后关闭 stdin, stdout, stderr,最后将进程 ID 写入到 pidfile。
- Daemon 一般以 root 身份运行,所以 cwd=/, umask=000
- 一次 fork 后的子进程 setsid,变成了一个无 tty 关联的 session leader …
Curl cheat sheet
这篇是 Curl 的作者写的 Curl Cheat Sheet。里面包含了几个 Curl 最常用的十几个命令选项。
-v
: 详细模式,一般用于 debug-s
: Silent, 把还有多久下载完这个信息去掉,一般用在自动化的脚本中-d "str" -d @file
指定参数-u user:auth
设定用户名与密码-x host:port
设定代理- `-H "name: value" 设定 header
-L
302 的时候跟着跳转,否则只会得到 302 结果--compressed
拿到压缩的响应-k
省略掉 ssl certificate 的验证,一般用在自签名证书上 …
压缩 Docker 镜像大小的一些技巧
本文介绍了一些减小 Docker Image 大小的技巧。更小的镜像,部署可以更快。镜像变大很大一个原因是每添加一个 RUN/ COPY / ADD 到 Dockerfile 中,构建后就会增加新的一个 Layer。这些层存储着前后版本之间的信息。在之前 Docker 特性还不够多的时候,唯一的办法是压缩到仅剩一个 RUN,在 RUN 中的命令用 &&
来拼接运行。现在,最适合这个场景的技巧叫 multi-stage build。通过多次写 FROM,可以将基于上一次的 BASE Image 构建出来的东西,复制到下一次 BASE Image 去,复制的过程中会合并成仅剩一个 Layer。举例:
FROM node:8 as build
WORKDIR /app …
CSS Var 简介
CSS Custom Properties,也叫 CSS Variables,是浏览器内建的功能,等价于 LESS / SASS 提供的变量功能。目前已有超过 77% 的浏览器支持这一特性。简单来说,它使用 --name: #fff
声明变量,使用 var(name)
获取值,在 JavaScript 中可以用 getComputedStyle(document.querySelector(el)).getPropertyValue('--name')
获取值。
可以使用 :root 声明全局 CSS Var,也可以将 --xyz: 10px
这种值写在任意一个 css 选择器里。Var 可以被复写,从而完成浏览器适配。:
:root { --default …