python wheel 包命名规则和 abi 兼容

2016-11-24
阅读 2 分钟
13.1k
wheel 包的命名格式为 {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl。其中各个 tag 的意义和取值在 PEP425 中有规定:[链接]

谈谈 OpenResty 中的 body_filter_by_lua*

2016-11-15
阅读 3 分钟
14.9k
结论: body_filter_by_lua* 可能在一次请求中调用多次,跟响应数据量无关,取决于响应次数 body_filter_by_lua* 的最后一次调用时,ngx.arg[1] 一般为空字符串 body_filter_by_lua* 也会在 subrequest 之中调用 body_filter_by_lua* 有些时候离不开有 header_filter_by_lua* 辅佐 多次调用的 body_filter_by_lua* 正如 ...

在 OpenResty 中使用正则

2016-10-27
阅读 3 分钟
10.1k
在 OpenResty 中使用正则表达式,社区中推荐的做法是使用ngx.re api。比如匹配一个字符串是否为 http(s) 的链接,可以这么写:

OpenResty单元测试实践

2016-10-15
阅读 4 分钟
10.2k
无测试,不编码。有持续运行的单元测试,是保持项目健康最基本的要求。在多人协作的内部项目中,这一点尤其重要。基于 OpenResty 的项目开发自然不会例外。

你可能不需要使用Nginx Amplify

2016-09-26
阅读 3 分钟
6.1k
对于 Nginx Amplify 不了解的同学,可以搜索一下,在 Nginx 官网上有介绍。简单来说,就是你可以在服务器上安装一个开源的 Python 写的 Agent。这个 Agent 会上传你的 Nginx 实例各种运行时数据到 Nginx.inc 的(闭源)SAAS平台上。通过这个 SAAS 平台,Nginx.inc 可以替你提供诸如配置检查和优化、监控、报警等功能。

编写可靠shell脚本的八个建议

2016-09-13
阅读 3 分钟
18.8k
这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了。

在国内 docker build 的正确姿势

2016-08-02
阅读 2 分钟
22.9k
由于某些原因,在国内构建第三方docker镜像是一件考验耐心的事情。在神奇的国度生活,自然也要用神奇的生活方式。跟解决其他同类问题一样,解决这个问题常用两种方法,一曰换源,二曰代理。

filebeat 源码分析

2016-07-31
阅读 6 分钟
20.9k
beats是知名的ELK日志分析套件的一部分。它的前身是logstash-forwarder,用于收集日志并转发给后端(logstash、elasticsearch、redis、kafka等等)。filebeat是beats项目中的一种beats,负责收集日志文件的新增内容。 虽然标题是《Filebeat源码分析》,不过由于filebeat依赖于公共库 libbeat,本文会花一半的篇幅跟它打...

用 Python 拓展 GDB(四)

2016-06-22
阅读 3 分钟
6k
欢迎来到《用python拓展gdb》的最后一篇。第一篇结尾,我提到了通用语言相对于领域特定语言的一项优势,即在处理数据上更加灵活。其实通用语言还有着另一样优势,领域特定语言只能局限在宿主程序中使用,而通用语言则无此限制。对于通用语言来说,gdb暴露的接口不过是又一个库而已。

用 Python 拓展 GDB(三)

2016-06-18
阅读 3 分钟
6.7k
欢迎来到《用python拓展gdb》的第三篇。上一篇我们谈到了pretty printer,一个需要python支持的特性。这一篇我们谈论另一个需要python支持的特性,convenience function。

用 Python 拓展 GDB(二)

2016-06-16
阅读 4 分钟
8.4k
欢迎来到《用python拓展gdb》的第二篇。在上一篇,我们学习了gdb提供的常用python接口,并用python实现了自定义命令和调试脚本。

用 Python 拓展 GDB(一)

2016-06-14
阅读 5 分钟
27.5k
之前写的《GDB 自动化操作的技术》一文介绍了可在gdb内部使用的DSL(领域特定语言)来自动化gdb的操作。借助该DSL,我们分别实现了一个名为mv的自定义命令,和“对账”用的调试脚本。在末尾,我提到了也可以用python来实现拓展脚本。从本篇开始,我会介绍如何使用python来给gdb编写脚本。由于篇幅所限,该教程会分成四篇,...

GDB 自动化操作的技术

2016-05-28
阅读 5 分钟
18.5k
程序员在调试时往往分成两派,一派用debugger另一派用print。至于本人嘛,是一个“机会主义者”,有时用print,有时却改投debugger阵营。

使用Valgrind和ThreadSanitizer检测多线程错误

2016-05-11
阅读 8 分钟
10.1k
做毕设的时候,我曾经遇到一个多线程的BUG。这个BUG表现得较为诡异,会导致数据随机出错。由于找不出什么规律,一开始我还是挺头疼的。查了半天后我发现,相关的日志有多线程下共享数据访问问题的迹象(即所谓的data race),所以很快确诊是多线程部分代码存在逻辑错误。这个问题的解决办法很简单,就是把相关的代码revi...

Vim替换小技巧(兼浅谈Vim哲学)

2016-04-22
阅读 3 分钟
5.4k
想必用过Vim的人都知道,在Vim里面,以下命令可以替换当前文件的内容: {代码...} 其中range指定替换命令生效的范围。flags指定替换的一些选项,常用的有: c 替换前进行确认 g 如果缺乏该选项,只会替换第一个。一般我们所说的替换是全部替换,即加了g选项的替换。 i 忽略大小写 e 忽略错误 具体细节请:vert help subst...

持续集成的三板斧

2016-03-13
阅读 4 分钟
4.3k
相信各位读者肯定体验过持续集成(CI)吧。持续集成通常用来确保当前代码库的质量,反映软件开发的进度。有了持续集成后,程序员们提交代码也会变得更加小心谨慎。应该没有人乐意让组里其他同事不停地见到自己的分支上CI失败的邮件吧(笑)?

sudo or gosu

2016-03-02
阅读 3 分钟
13.2k
太长不看:如果需要在Dockerfile的ENTRYPONNT中指定运行命令的用户,用gosu代替sudo可以避免某些信号处理上的边界条件。不过这些边界条件比较罕见,就算不用也没多大关系

GitHub Archive分析 - 2015最受瞩目的项目们

2016-02-01
阅读 8 分钟
8.4k
你应该见过不少对GitHub上等等开源项目进行的分析文章。据说国外甚至有人靠分析Github上的项目解决了毕业论文……(要是我的毕业论文也能这么解决就好了XD) 借助于Google Big Query和来自于GitHub Archive的数据归档,对GitHub上的项目进行简单的数据分析并不困难。下文我将试图分析2015年GitHub上被收藏(starred)最多...

开源项目徽章集锦

2016-01-09
阅读 4 分钟
8.9k
五颜六色的徽章一如游园会摊位上的饰件,吸引着人们驻足欣赏。原本平白单调的页面,装扮上这些徽章后,显得丰富多彩,给人留下了更为深刻的印象。没有这些点缀,README可能就只是一张干涩的布告。

也许后端MVC的说法已经过时了

2015-12-28
阅读 4 分钟
15k
呃,标题有点耸人听闻,不过我并不是标题党。考虑到谈论大而虚的东西(比如最好的语言)容易引起争论,所以还请诸君带着看戏而不是庭辩的心态来看待本文。

[译]Linux性能分析的前60000毫秒

2015-12-06
阅读 10 分钟
16.1k
在Netflix我们有一个庞大的EC2 Linux集群,还有非常多的性能分析工具来监控和调查它的性能。其中包括用于云监控的Atlas,用于实例按需分析的Vector。即使这些工具帮助我们解决了大多数问题,我们有时还是得登入Linux实例,运行一些标准的Linux性能工具来解决问题。

关于Python Magic Method的若干脑洞

2015-11-21
阅读 4 分钟
4.8k
有一天闲着无聊的时候,脑子里突然冒出一个Magic Method的有趣用法,可以用__getattr__来实现Python版的method_missing。顺着这个脑洞想下去,我发现Python的Magic Method确实有很多妙用之处。故在此记下几种有趣(也可能有用的)Magic Method技巧,希望可以抛砖引玉,打开诸位读者的脑洞,想出更加奇妙的用法。

git merge是怎样判定冲突的?

2015-11-08
阅读 3 分钟
28.7k
在解决git merge的冲突时,有时我总忍不住吐槽git实在太不智能了,明明仅仅是往代码里面插入几行,没想到合并就失败了,只能手工去一个个确认。真不知道git的合并冲突是怎么判定的。

浅谈jmockit中mock机制的实现

2015-09-07
阅读 3 分钟
12.1k
这个倒没有什么古怪的。估计又是使用了java.reflect.Proxy。这个技巧在很多Java框架中用到,比如Spring AOP对于接口类型的实现,就是通过Proxy来混入拦截器实现的。

跟我一起写shell补全脚本(Zsh篇)

2015-07-16
阅读 6 分钟
16.2k
绝大部分日常使用Linux和OS X的程序员都会选择zsh作为自己的shell环境,毕竟对比于bash,zsh的便利性/可玩性要胜出很多,同时它又能兼容bash大多数的语法。不过相对而言,zsh补全脚本要比bash补全脚本要难写。zsh提供了非常多的补全的API,而且这些API功能有不少重叠的地方,掌握起来并不容易。不像bash,你只需记住三个...

跟我一起写shell补全脚本(Bash篇)

2015-07-07
阅读 6 分钟
12.7k
在上一篇里我们定下了给pandoc写补全脚本的计划: 支持主选项(General options) 支持子选项(Reader options/General writer options) 支持给选项提供参数值来源。比如在敲pandoc -f之后,能够补全FORMAT的内容。 支持主选项 先列出实现了第一阶段目标的程序: {代码...} 运行程序的方式: {代码...} 现在我来解释下...

跟我一起写shell补全脚本(开篇)

2015-07-07
阅读 1 分钟
5k
shell里面补全的影子无处不在,输入命令的时候可以有补全,敲打选项的时候可以有补全,选择文件的时候可以有补全。有些shell甚至支持通过补全来切换版本控制的分支。由于shell里面可以运行的程序千差万别,shell一般不会内置针特定对某个工具的补全功能。与之相对的,shell提供了一些补全用的API,交由用户编写对应的补...

货比三家:C++ 中的 task based 并发

2015-04-24
阅读 3 分钟
11.9k
上一篇文章中讲到, 我打算写一篇文章,聊聊async、packaged_task和promise的区别。所以现在我就来填坑了。 TL;DR async:提供最高层次的抽象。如果你不需要控制线程的运行时机,就选这个。 packaged_task:抽象层次比async低。如果你需要控制线程的运行时机,且线程执行的结果即目标结果时,选这个。 promise:抽象层次...

从 pthread 转换到 std::thread

2015-04-07
阅读 8 分钟
30.1k
以前一直都是用pthread的API写C++的多线程程序。虽然很早之前就听说,从C++11开始,标准库里已经包含了对线程的支持,不过一直没有拿来用,最近刚好有空,借着pthread的经验学习下std::thread的用法。

玩转Bash变量

2015-02-05
阅读 4 分钟
28.8k
PS : 注意本文讨论的是Bash,而不一定是/bin/sh所链接的那个shell。这里出现的所有代码片段,默认在顶上都添加了#!/bin/bash。