Python

对 Python 异常处理的笔记

简述 Pro Python 这本书里对 Python 异常处理的讨论。 包括异常的捕获、处理,异常链,以及异常处理相关的 else, finally, with 关键字等内容。 最简单的捕获异常的方式 def count_lines(filename): try: return len(open(filename, 'r').readlines()) except: return 0 很少有人在生产环境写这样的代码,它会捕获所有的异常,可能包括你希望处理的,也包括你其实并不想处理的异常,

编程

好好写 Shell 脚本

shell 种类众多,并且语法各异,如果自己又不熟悉任何一种 shell 的话,就会经常感觉语法怪异,而且似乎不够严谨,甚至有时候要边搜边写,这就使得一些脚本成为了一些勉强可用的语句的拼凑,几乎不可维护。即便是一些所谓的“技术大牛”,各种高大上的词都能吹得天花乱坠的,也写不了像样的脚本,这是个蛮尴尬的事情,固然是术业有专攻,但是写个 Linux Shell 脚本,应该算是个基础(其实有可能他们连链表怎么实现都不知道)。这里主要是说最为通用的 bash,以下是几条 bash “代码规范”。 1. 及早退出 脚本的开头,#! 语句之后,加上这几行

编程

Linux 信号处理

使用 sigaction 绑定信号 比较早的时候,使用 signal,现在正在逐渐被抛弃,sigaction 是更好的选择。主要是因为如下原因: signal 在不同系统的行为可能不一致,如果自定义了信号处理函数,进入信号处理函数时,对当前信号的操作可能变为默认,也可能屏蔽该信号。只有设置信号处理方式是 SIG_IGN(忽略)、SIG_DFL(默认)是可移植的。 signal 不能设置在信号处理函数执行过程中屏蔽其他信号 在多线程的进程中 signal 的效果不确定 signal 接口最主要的问题还是不可移植,其实现在 Linux

编程

检测递归 DNS 的后端 IP

我想知道当我请求 114.114.114.114 或者 8.8.8.8,它们的后端都有什么。我在授权 DNS 设置了分线路的记录,请求当地递归却收到了其他线路的结果,我想知道这个当地递归后端是什么。实际上,当我向递归发起请求之后,最终授权 DNS 收到的来自递归 DNS 的请求,是来自什么地址。 我们要找个办法,把递归向授权的请求“引导”到一个容易看到的地方来。 首先给我一个子域名设置一条 NS 记录,这个 NS

编程

SaltStack: First Class

上周花了几天时间学习了 saltstack,感觉是个值得一试的工具。这里记一下学习和使用过程。没有高大上的用法,这些记录也不一定是 saltstack 的最佳实践。saltstack 的官方文档比较完善,可供参考。 初步认识 saltstack 是需要在被管理的机器上装 agent 的,这里叫做 minion。管理中心要安装的是 master。 minion 带着自己的公钥去连接 master,master 接受 minion 的公钥之后,鉴权成功,master 可以对这个 minion 进行管理了。在每一个

编程

Unbound 性能优化

安装完 unbound 之后,如果没有负载大量 DNS 请求的需求,一般没必要对 unbound 进行特殊的优化配置。如果有这个需求,或者仅仅是无聊以及其他什么原因,就需要改下配置文件了。下面的内容基本上是从官方文档里扒出来的。 num-threads 设置为机器的 CPU 核心数 例如有一个 CPU,8个核,设置 num-threads: 8 msg-cache-slabs, rrset-cache-slabs, infra-cache-slabs, key-cache-slabs 设置为跟 num-threads 相近的 2 的 N