使用 Travis 自动发布 GitHub Releases

查看原文

本文介绍了如何在 Travis 任务中配置将构建好的文件发布到 GitHub Releases 中。

你可以:

$ travis setup releases

或者直接在 .travis.yaml 中配置:

deploy:
  provider: releases
  api_key: "${GH_TOKEN}"
  file:
    - file1
    - file2
  skip_cleanup: true
  on:
    tags: true

为了安全起见,可以在任务的配置中添加 environ variable GH_TOKEN,使其不会被暴露。

read more

论文阅读 - ORM 反模式

查看原文

这篇论文通过分析 12 款 ORM 软件的很多修复性能问题的 BUGS / ISSUES,得出了 9 种造成低性能的反模式。测试方法很简单,灌大量数据,看性能。半数是 ORM 内部 API 没调用对,比如 Ruby 中把 any? 替换成 empty? 可以更快,添加了不必要的 LIMIT 1,一些计算可以不用再 DBMS 中做,一些不适合在应用中做。一些问题是产生了不必要的 Queries,或者没做 Batch,或者 Batch 了太多数据,或者索引没搞对。问题都是出在细枝末节的地方,但林林总总加起来,会导致很客观的性能提升。

read more

libuv basics

查看原文

libuv 的基本原理是维护一个持续运行的事件循环,当收到 I/O 通知的时候,运行与该 I/O 有关的回调函数。对于网络 I/O 由于有跨平台的的 aio 接口,所以可以直接在事件循环内调度。对于文件 I/O, 没有跨平台的 I/O 接口,所以替代方案是起一个线程池,将 I/O 操作提到另外的线程去执行,保证 I/O 操作不会影响当前线程(这需要额外分配 cpu 资源用于线程切换)。

事件循环的限制是:

  • 回调函数如果包含 Blocking I/O 那么整个事件循环都会被堵塞
  • CPU 密集运算不适合放在事件循环进程里运行,否则也会影响事件调度。

libuv 中的几个重要概念:

  • request: 代表一个只会执行一个回调的任务 …
read more

源码阅读 - picol - 一个 500line 的 TCL Script 解释器

查看原文

这是 Redis 的作者 antirez 在无聊的时候写的一个健脑锻炼 - 写了一个大约 500 行左右的解释器,可以运行 TCL 脚本代码。代码看起来很优雅,没有用什么奇奇怪怪的技术,实打实地用好了字符串解析,内存分配这些技巧。

  • main: 根据参数进入 REPL 模式或者执行脚本
  • picolInitInterp: 初始化解释器,解释器的数据结构是栈帧的链表和TCL语言内部函数的链表。
  • picolRegisterCoreCommands: 将用 C 实现的函数注册为 TCL 语言的内部函数 - 体现了 SICP 中介绍的语言抽象
  • picolEval: 解释执行 TCL 字符串形式的代码。
  • picolGetToken: 将 TCL 字符串形式的代码变为有语法意义的 Token。

从实现上看,Picol 简化了解释器实现,省略掉了 OPCODE 的编译,直接将 token 用于解释执行 …

read more

Protothread 的一种实现 - zserge-pt

查看原文

zserge/pt 使用不到两百行实现了 protothread。其核心接口:

  • pt_init
  • pt_begin
  • pt_end
  • pt_wait

对 Dr. Dunkels 的原始实现有一些改进:多加了 pt_loop, pt_sys 以及赠送了一整个 queue 的实现。

尝试用 Protothread 实现了一个很小的 Actor Model,见代码 gist, 使用体验还挺不错。

read more

Protothreads - lightweight stackless threads

查看原文

本文介绍了 Protothread 这种无栈线程的小众实现,由于不需要线程或者多进程就能实现多任务协程,它被用于 Arduino / 感应器这种嵌入式设备中。每个 PT 仅占用两个 bytes 大小,理论上你可以创建比 Actor 模型还多两个数量级的并发任务出来。由于仅仅是几个 C 的宏,它极具迁移性,甚至可以在无 OS 的环境运行。它的核心实现就下面几行代码:

struct pt { unsigned short lc; };
#define PT_THREAD(name_args)  char name_args
#define PT_BEGIN(pt)          switch(pt->lc) { case 0:
#define PT_WAIT_UNTIL(pt, c)  pt->lc = __LINE__; case …
read more

theBeamBook - The Erlang Runtime System

查看原文

本文是一本尚未完工的书,讲了 Erlang 底层是如何实现它的调度和解释器的。

  • Erlang 的最底层是 ERTS, 它掌管进程调度(Erlang 自己重写了整个专属于自己运行时的进程,有别于系统进程)
  • BEAM 是 Erlang 的虚拟机,用来执行指令。
  • Process 的本质是大约几百个 bytes 的数据结构,包含了进程控制的一些字段(PCB) 外加 Stack, Heap, Mailbox.
  • Mailbox 的本质是一个无锁消息队列。
  • Scheduling 的策略是抢占式调度,任一时刻 CPU 只执行一个进程,时间片花完了就推后去执行别的进程。它的内部维护了两个队列,一个专门维护被 receive message 堵塞的进程,另外一个维护可执行的进程。
read more

如何使用 Wireshark

查看原文

Julia Evans 的新文章,讲怎么做网络数据包的诊断分析。

  • 这个工具可以图形化查看网络数据包。如果生产环境上诊断不方便,用 tcpdump 下来到 local 来查。

原文是在 debian-based distros 上使用 sudo apt install wireshark。我尝试了下,在 macOS 上可以用 brew install wireshark 得到命令行工具,使用 brew cask install wireshar 获得图形界面工具。

打开 tcpdump 的数据包中, 可以看到 ACK, SYN 等 TCP 包具体发来发去的那些 packet。

举个例子,connection reset 是个常见的问题。我们可以查这个序列,如果 …

read more

程序员日常使用的 Bash Tricks

查看原文

本文介绍了 Bash 使用的不少小窍门。

  • 设定 export CDPATH=~/works:~/code:~/playground, 不论在哪里都能快速用 cd dir 这样的语法跳到那个目录去。
  • 使用 !! 运行上一条命令。
$ py.test tests
$ !!
  • 使用 !* 扩展前一条命令的参数到本命令
$ touch filea fileb filec
$ chmod 777 !*
  • ctrl+r 从历史里面去找
  • shopt -s cdspell 可以自动纠正错误的 cd 路径
  • 使用 cd - 在两个路径之间来回切换
  • 用 bind -p 查看 bash 内置的快捷键

衍生思考:很不错的总结,我再补几个我常用的:

  • 上条命令有 typo …
read more

Pulumi - 一个 serverless 平台

查看原文

本文介绍了一个全新的 serverless 平台 - Pulumi。缘起是 serverless 程序中要去维护很多 json / yaml 配置,管理 etcd 集群,配置网络。Kubernetes 做掉了很多事情,不过维护起来是个大问题,因为是个很大的系统。这个新系统有个 NoYAML 的愿景。这个平台想要做多语言和多云平台支持。

非要说的话,这个应用像是代码版的 Terraform 加上了 Serverless 的使用体验,满独树一帜的。它企图为应用程序封装尽可能多的云平台的概念,让你开箱即用。

read more

« Page 17 / 54 »