Puppet使用笔记

本文主要介绍使用 puppet 过程中遇到的问题和解决方法。

同步文件

先介绍一下基本环境,master 和 client 所在机器都是 Ubuntu Server 12.04,使用 puppetlab 官方源安装,参考 Using the Puppet Labs Package Repositories,puppet的版本:

1
2
$ puppet --version
3.5.0-rc3

下边介绍同步文件遇到的一个小问题。首先服务端已经对客户端完成了验证,现在需要从服务端向客户端同步文件。创建一个类,然后添加 init.pp 文件

Read on →

Making Ebooks of Pro Git

Pro Git 是一本用来学习 git 使用很不错的书,从 progit 这个开源项目可以获得这本书的全部内容,下边介绍在 Ubuntu Server 12.04 环境下制作电子书的过程。

安装依赖

1. ruby, rubygems

参考 Ruby-China 的 wiki

2. rdiscount

markdown 使用的模板,通过 rubygems 安装

1
$ gem install rdiscount

3. calibre

calibre 是一款开源的电子书管理软件,生成 epub 或 mobi 格式需要安装。

1
$ sudo apt-get install calibre
Read on →

APScheduler 源码阅读笔记

概述

APScheduler 是由 python 实现的一个轻量级任务调度器,它可以按照一定间隔(IntervalTrigger)、指定时间(2.1中的SimpleTrigger/3.0中的DateTrigger)或者以类似 cron(CronTrigger) 的形式触发待执行任务(即调用函数或者调用 python 的 callable 对象)。现在 pypi 上的稳定版是 APScheduler 2.1.1,3.0 版本在 class Scheduler 中移除了针对不同 trigger 的 add_trigger_job() 接口,统一为 add_job(),但是底层实现变化不大。我主要看了 2.1.1 的代码。代码很简洁,加起来一共2049行。

模块组织

  • Scheduler 调度器的核心部分,负责对 job 的管理和调度,用户使用添加/移除任务,启动调度器都通过 Scheduler 提供的接口完成。

  • Job 封装了需要调度的任务,每一个 Job 实例是在 Scheduler 添加 job 时被初始化,具体的初始化参数决定了调度被触发的形式(3类不同的trigger)。

  • Trigger 包含 SimpleTrigger,IntervalTrigger和 CronTrigger 三个类。Trigger 的作用就是计算下一次触发任务的时间。

  • JobStore 抽象基类,针对任务存储的介质有多个实现,包括基于内存(RAMJobStore)、使用shelve的简单持久化存储(ShelveJobStore)、使用数据库存储(RedisJobStore,MongoDBJobStore)等。如果不指定参数默认使用 RAMJobStore,使用持久化的 JobStore 的目的是在 Scheduler 重启之后能够恢复原有的任务调度。

底层实现

从分析 Scheduler 类入手,首先看项目中自带的example:

Read on →

Xenserver 使用小结

手头四台服务器,准备搭建一个小的云平台,了解了几种不同的方案,包括Vmware Esxi,Xen,OpenStack 等。先把各种方法都试一试,然后确定一个具体实施。之前有使用过 Vmware ESXi,虽说 ESXi 可以免费使用,但是 Vmware 浓厚的商业气息让我有种道不同不相为谋的感觉。XenServer 最近有开源,于是昨天花了一个下午尝试了一下。

安装 XenServer 和 XenCenter

首先去官网下载 XenServer 的镜像文件,我下载了 6.2.0 版本。XenServer 本身其实就是一个 Linux 操作系统,于是服务器直接通过启动 bios 引导安装 XenServer,安装过程中配置好 root 的密码以及网络信息,这样就可以通过管理工具管理 XenServer 了。

使用的管理工具是 Windows 版的,貌似有 Linux 版本的OpenXenCenter,我没有试验。进入 XenCenter,服务器是四网卡,现在接了0,2号网卡。2号网卡连接外网,配有有一个 166.111.xx.yy的 ip。0号网卡接内部网络,ip 设为 192.168.10.254。配置如下图:

Read on →

使用Tornado进行异步编程

翻译自:Asynchronous programming with Tornado

对于初学者来说异步编程很令人迷惑,因此我觉得有必要介绍一些有用的基本概念来帮助初学者避免一些常见的陷阱。如果希望理解通用的异步编程模型,可以查看以下这些网络资源,Introduction to Asynchronous ProgrammingTwisted Introduction。在这篇文章中我将会着眼于如何使用 Tornado 进行异步编程。

来自Tornado主页的一段话:

FriendFeed’s web server is a relatively simple, non-blocking web server written in Python. The FriendFeed application is written using a web framework that looks a bit like web.py or Google’s webapp, but with additional tools and optimizations to take advantage of the non-blocking web server and tools. Tornado is an open source version of this web server and some of the tools we use most often at FriendFeed. The framework is distinct from most mainstream web server frameworks (and certainly most Python frameworks) because it is non-blocking and reasonably fast. Because it is non-blocking and uses epoll or kqueue, it can handle thousands of simultaneous standing connections, which means the framework is ideal for real-time web services. We built the web server specifically to handle FriendFeed’s real-time features every active user of FriendFeed maintains an open connection to the FriendFeed servers. (For more information on scaling servers to support thousands of clients, see The C10K problem.)

对于初学者首先需要认清的是自己是否真的需要异步操作。异步编程比同步编程复杂得多,因此有人说:异步编程是不适合人类大脑的。

Read on →

线段合并求最长线段

原始题目来自于雅虎北研黑客日初赛试题,大概的描述是“在一维空间有n条线段,将每两条具有交集的线段(如[a,b],[c,d],b>a,d>c)合并为一条线段,合并后的线段为 [min(a,c),max(b,d)]”,求经过合并操作后最长的线段长度。

在acm timus找到一道几乎一样的题目 timus 1019 。用线段树求解这两道题十分简单,例如 ural(Timus) 1019 Line Painting 中的解法。

我答题的时候没有使用线段树,而是通过一个有序列表记录实际线段的起止坐标,对于题目1019,将画白线对应于加入线段,画黑线对应于擦除线段。那么每次画线的起止点分别有4种情况:起点在线段上;起点在线段外;终点在线段上;终点在线段外。根据情况修改有序列表记录的坐标值,有序列表中 [i,i+1](i=0,2,4…)始终表示不相交的线段。最后遍历有序列表即可得到最长的线段。

Read on →