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

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

在国内 docker build 的正确姿势

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

filebeat 源码分析

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

用 Python 拓展 GDB(四)

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

用 Python 拓展 GDB(三)

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

用 Python 拓展 GDB(二)

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

用 Python 拓展 GDB(一)

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

GDB 自动化操作的技术

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

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

2016-05-11
阅读 8 分钟
9.8k
做毕设的时候,我曾经遇到一个多线程的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.2k
相信各位读者肯定体验过持续集成(CI)吧。持续集成通常用来确保当前代码库的质量,反映软件开发的进度。有了持续集成后,程序员们提交代码也会变得更加小心谨慎。应该没有人乐意让组里其他同事不停地见到自己的分支上CI失败的邮件吧(笑)?

sudo or gosu

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

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

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

开源项目徽章集锦

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

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

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

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

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

关于Python Magic Method的若干脑洞

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

git merge是怎样判定冲突的?

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

浅谈jmockit中mock机制的实现

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

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

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

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

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

从 pthread 转换到 std::thread

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

玩转Bash变量

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

find -exec 与 find | xargs 的差别

2015-01-06
阅读 3 分钟
10.1k
返回的结果是,整个家目录的总大小,而不是预期的每个文件的大小。之后换用了find -maxdepth 1 -exec du -sh {} \;就能得出每个文件的大小。

gtest快速上手

2014-12-31
阅读 5 分钟
17.6k
因为最近在写的一些C++代码,需要给它写单元测试,所以就得去找一个C++的测试框架。正好之前实验室的同学有推荐过gtest,所以就不纠结了,直接去gtest的项目主页看。

MongoDB, no SQL injection?

2014-12-16
阅读 3 分钟
5.9k
有人的地方就有江湖,有DB的地方就有injection。SQL数据库如此,No SQL数据库亦是如此。考虑到No SQL数据库用的不是SQL,这里使用SQL injection是否有点不太恰当?不过总不能说是No SQL injection吧XD。

关于网站加速的35条法则(来自Yahoo)

2014-11-16
阅读 6 分钟
4.2k
原文见此:[链接] 注意,不是翻译,只是谈谈本人的读后感。 另外注意,该文比较旧,大概是2010年的产物,所以里面会有些跟不上时代的内容。 1. 减少HTTP请求 一个典型的http请求报文大概是这样的: {代码...} 虽然也就几行文字,但是考虑到http协议里,对同一个域名同时发出的请求是受限的[1],如果请求太多,说不定它们...

C/C++ - 压榨结构体的空间

2014-11-02
阅读 3 分钟
3.9k
先给几个数据: {代码...} 好,那么问题来了, {代码...} 输出的结果是多少? 这个问题对于写过C/C++的人来说,有点侮辱智商……好吧,不逗你玩了,直接进入正题。 输出的结果肯定不会是29(2 * 4 + 1 + 3 * 4 + 8)啦。都是Data structure alignment惹的祸。 Data structure alignment是个复杂的概念,简单来说,就是因为CP...