Deep C - Programming is hard

查看原文

这个 Slide 讲述了很多关于 C 的值得深度学习的点。很多程序员写出的代码并不好,为什么呢?因为大部分程序员对他们使用的编程语言并没有足够深入的了解。他们可能知道怎么工作的,但不知道为什么要那么做。举例来说,一个简单的 print hello world 的程序,你可以知道它怎么编译出来,但你也可以深入挖掘下去编译的流程,不同编译器的行为等等。

read more

Linux Primitives

查看原文

这份 Presentation 文档在 High Level 纵览了 Linux 的诸多概念,很推荐阅读。

  • Linux 就是一个 GNU user space,而程序则是和 GNU libc 与其它用户态的 libraries 交互的东西。当然,还有很多种 libc 的实现,我们可以选择一种 libc 的实现放在容器里面。
  • 容器 本身不是内核的概念,它只是一组进程,有相同的 namespaces / cgroups 等等。
  • 进程 & 线程在内核中有相同的数据结构 task, 这货有千余个字段,大约 1k, 一般比较经常用到的是 user, pid, tgid 等字段。
  • 至于用户和组,内核才不关心谁的名字是什么,说到底就是几个数字:ruid …
read more

The joy of max

查看原文

这篇文章给出了最近的一次 Linux 内核的 max() 宏的实现,我们可以看到它和我们在 C 语言教材上入门的实现有多大的区别。

read more

Bit - 一款管理 copy-paste 代码的工具

查看原文

除了使用 npm 管理代码依赖,事实上程序员们也复制粘贴代码到仓库里,Bit 就是这么一款管理这种代码的工具。

  • 使用 Bit 你不需要把组件从代码库中剥离出来,写一大堆 publish metadata,然后上传到包管理中心。
  • 你要做的事情是 bit add src/your-components/*; bit export username.scopename
  • 其它代码库想用这块代码
    • 仍然可以用 npm install;
    • 或者使用 import padLeft from '@bit/bit.examples.string.left-pad' 这样的方法导入;
    • 或者直接运行 bit import username.scopename ,参考 Importing Components

衍生思考:这门语言雄心很大,想成为通用的工具。目前这个工具只能支持 js …

read more

分布式系统的特性 - Resilience

查看原文

本文介绍了分布式系统的特性之一:Resilience。

  • 有必要搞清楚 Fault v/s Failure 的区别:Fault 指的是系统错误,例如说存储层速度慢,内存泄漏,线程堵塞,依赖错误,错误数据等等;而 Failure 则是系统完全无法正常工作了,例如豆瓣开小差。Fault 可能会导致 Failure;Failure 会使系统的 uptime & availability 降低。一般而言,Failure 可能会导致向客户赔钱什么的(违反了 SLA)。
  • 使系统 Resilience 有几个很困难的基本点:网络层是不可靠的,依赖总可能会失效,用户行为无法预测。但是基于一些原则,Resilience 是可以做到的。
  • 少写代码!
  • 在客户端配置 timeout,可以防止雪崩。一般 timeout 值可以设置成依赖的 99 …
read more

Adaptive Concurrency Limits @ Netflix

查看原文

本文是 Netflix 工程师团队产出的关于如何配置服务负载的博客,他们的产出是一个 Java 库 concurrent-limits。保障服务稳定的手段有:断路器,并发控制,Chaos 测试等等,本文关注自适应的并发控制(adaptive concurrency limits)。查看代码库

  • 理论储备:并发是在某个时间点系统能同时处理请求的能力,根据 Little's Law, 平均服务时间乘以平均服务调用率可以得到并发量。如果超量,要么进入队列等待,要么被拒绝访问。一个系统如果不设限制,这个队列将会不断增长直到所有请求都开始超时直到系统内存溢出到崩溃。这个系统的超时甚至可能引发整个系统的层叠崩溃(雪崩)。问题的核心在于这个限制该设置多少。
  • Netflix 的做法是自动调整,limit = 在性能开始降级时的系统承受的并发量(inflight request,即 concurrency + queue)。如果手动调,一段时间内可能比较合理,但现实容易变。他们的预设目标是:无需人工干预,不需要询问别的服务,不需要对系统其它组件有了解,能根据系统流量适配变更 …
read more

Warehouse: All New PyPI is now in beta

查看原文

这则公告宣布了从 2018年4月起,所有 Python Package Index 将会由 pypi.org 中进行 Beta 测试(终于!)。

  • 在此之前,我们使用的是 pypi.python.org。在古代,Python 界还没有 Web 框架的时候这个网站就上线了,经过了 N 年,现在我们有了新的代码库 pypa/warehouse,使用 docker 进行开发,部署在云上。
  • 值得注意的变更:
    • 不再推荐 setup.py upload, 而使用 twine 上传代码包。
    • macOS/OS X users 需将 pip 升级到 9 …
read more

Python Enum

查看原文

Python Enum:

  • 最标准的做法是 Python 大于 3.4 使用标准库中的 enum 库;低于 3.4 安装 enum34 或 aenum 库,使用方法基本等同 PEP435 的描述。
  • 如果不使用额外的库,可以通过 def enum(**enums): return type('Enum', (), enums) 编写快捷的 enum 生成函数。
  • ^ 稍加修改即可获得自动生成 enum 值的功能。
  • 再简单地做法是 a, b, c = range(3)
read more

LISP1-interpreter

查看原文

LISP1-interpreter 只需要简单的 9 个基本元素就能构建出来。McCarthy 的 S 表达式和谓词有 5 个:

  • atom 需要这个是因为 car 和 cdr 都是应用于列表,而你不可能将 car 应用于单一元素来获取信息。
  • eq 用于测试元素的相等性。
  • car 返回 cons cell 的第一个。
  • cdr 返回 cons cell 的第二个。
  • cons 创建一个新的 cons cell,cell 有两个元素。

而要想运行 s 表达式,我们还需要 4 个元素:

  • quote 用于表示一个表达式,而非求值
  • cond 用于条件分支
  • lambda …
read more

« Page 28 / 54 »