编程

A collection of 16 posts

Python

对 Python 异常处理的笔记

简述 Pro Python 这本书里对 Python 异常处理的讨论。 包括异常的捕获、处理,异常链,以及异常处理相关的 else, finally, with 关键字等内容。 最简单的捕获异常的方式 def count_lines(filename): try: return len(open(filename, 'r').readlines()) except: return 0 很少有人在生产环境写这样的代码,它会捕获所有的异常,可能包括你希望处理的,也包括你其实并不想处理的异常,都会走到 except 下的代码块里,执行了 return 0 这行代码。多数情况下,这可能不是我们想要的结果。 好的做法是明确写出自己希望要捕获、要处理的异常类型。

  • Noodles
    Noodles
编程

好好写 Shell 脚本

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

  • Noodles
    Noodles
编程

利用 git 分支的开发流程

这篇 2010 年的文章 A successful Git branching model 讲了一个比较合适的使用 git 进行版本控制的流程。主要是有两个主要分支:master 和 develop 分支,和其他辅助分支:feature 分支、release 分支、hotfix 分支。 主要分支 每个 repo 包含两个永远都不删除的分支 master 生产环境的版本 develop 待发布的最新开发代码分支 develop 分支不会进行很大的功能、特性方面的开发。当 develop 分支稳定,准备发布了,把它(经过 release 辅助分支)合并到 master

  • Noodles
    Noodles
编程

Linux 信号处理

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

  • Noodles
    Noodles
编程

Vim 寄存器

Vim 的 d(delete), y(yank), p(put) 这几个命令,可以近似地对应操作系统剪贴板的剪切、复制、粘贴操作。Vim 的“剪贴板”比操作系统的剪贴板要强大,在 Vim 中不叫“剪贴板”,而叫做“寄存器(register)”。Vim 有不止一个寄存器用于复制/粘贴操作,下面是一些常见用法和专用寄存器的作用。 在普通模式使用 :register 查看当前有哪些寄存器。使用 "{register}(双引号+寄存器名称)来指定使用哪一个寄存器。 默认(无名)寄存器 常用的 dd, yy 删除或者复制一行,

  • Noodles
    Noodles
编程

检测递归 DNS 的后端 IP

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

  • Noodles
    Noodles
编程

SaltStack: There and back again

First Class 之后,master 可以管理 minion 了,这里记下一些用法,从“低端”用法,到不那么“低端”的用法。除非特殊说明,执行命令和编辑文件都是在 master 上进行的。 saltstack 有很多的可执行模块(execution modules),比如下面要提到的 file, cmd, state, cp 等等,这里是 saltstack 所有的可执行模块列表。这些模块一般是这样用的 salt '*' module_name.module_function args... '*' 表示所有 minion,

  • Noodles
    Noodles
编程

SaltStack: First Class

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

  • Noodles
    Noodles
编程

老年 ubuntu 专用源

前两天我见证了一个事实,现在还有 Ubuntu 11.04 (Natty Narwhal 敏捷的独角鲸) 坚强地活着。11.04 不是 LTS (长期支持) 版本,官方早就不再支持。 图片来自 Ubuntu Wiki 这些不再被官方支持的版本,进行 apt-get update 会有很多 404 出现,可能一个很普通的包,比如 openssh-server 都无法直接从源里安装。 好在 Ubuntu 还是很有良心的,还有对这些老年版本的源,免去了下载源码自己编译(而且还有各种依赖包得源码)安装的麻烦。 这里是具体的升级方案 https://help.ubuntu.com/community/EOLUpgrades

  • Noodles
    Noodles
TCP

HTTP 和 TCP 的 KEEP ALIVE

先把结论放这:TCP 的 keepalive 和 HTTP 请求和响应的包头里的 keepalive 不是一回事。 TCP 的 keepalive 是用来检查 TCP 连接的对方是否还“活着”,Linux 有三个参数跟 keepalive 有关。 tcp_keepalive_time 一个连接闲了一定时间,就发 keepalive 的消息,这个时间长度是由 tcp_keepalive_time 来指定。 tcp_keepalive_probes 指定发送多少个 keepalive 探测包。如果对方回了 keepalive 探测包,说明对方还在,就继续保持这个连接。 tcp_

  • Noodles
    Noodles
TCP

对 Linux TCP 的若干疑点和误会

整理了一下 Linux 的 TCP 相关的几个疑点和对以往错误认识的纠正。主要是系统出现大量 TIME_WAIT 和 SYN 请求的一些问题,以及一些 TCP 内核参数的意义。 提到的参数(选项)大都在 /proc/sys/net/ipv4/,如果需要永久生效,希望做到重启也不变,可以修改 /etc/sysctl.conf 里 net.ipv4.tcp_*。 1. 关于 TIME_WAIT 按照网络上很多文章的说法,当 Linux 服务器上出现大量 TIME_WAIT 状态时,可以通过对 TCP

  • Noodles
    Noodles
编程

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 次方,数字设置越大,程序中锁的竞争会越少,但是会产生更多的内存碎片 例如上面 num-threads: 8, 这几个 *-cache-slabs 也设置为 8

  • Noodles
    Noodles