-
django开发小记
-
[python]路由表脚本生成程序
-
python linux administrator学习小结
看《Python Linux Administrator》这本书时,我并不是按照从头到尾的方式读的,而是看了一遍目录,选择性地读了部分章节。以下是我选择的章节: GUI 有GUI肯定更直观一些,特别是在一些报表展示上。书中提到主要是三种方式,基于pygtk/wxPython的桌面程序,基于cursers的CLI方式和基于django的web方式。个人觉得web方式综合下面比较好一些,而且django并不比想象中要难。我也把django作为定期学习的一个候选。 network unix/linux下网络相关命令很多,python也有很多针对网络的库。书中介绍了从底层socket,到上层httplib/ftplib/paramiko(sftp),urllib/urllib2,xmlprclib/Pyro和强大的twisted。针对不同协议场景用不同的库,前提是你要了解足够多的网络库。 operaton system 通用的有platform,可以用来判断操作系统。接下来都是一些指定系统下的库,比如mac的dscl/asr,windows的zenoss,还有libvert, libvirt, cobbler, virt-factory, func等。这块和系统相关,个人认为要根据实际环境选择性的学习。 package manager 较多篇幅介绍了easy_install。同时提到了buildout, virtualenv, epm。个人对virutalenv有点兴趣,因为可以多版本python共存。 demo 一些使用python管理系统的实例。和之前介绍内容可能有交集。个人感兴趣的是python查询dns,还有python管理ldap等。 data 主要是操作文件。比如常用的os模块,还有glob,shutil,filecmp。用于产生摘要的hashlib等。更多的在python标准库文档中。
-
python标准库学习笔记3
以下内容来自这里的学习。 类型判断 理论上动态语言不建议判断类型,不过python还是有提供判断的方法。 import types type(1) == types.IntType isinstance(1, int) 第一种是使用types模块,第二种是使用内建的isinstance方法。 decimal 因为Java有BigInteger和BigDecimal,所以不会陌生。 import decimal decimal.getcontext().prec = 7 # set precision to 7, default is 28 decimal.Decimal(1) # create from int decimal.Decimal(‘3.14’) # create from string decimal.Decimal(1) / decimal.Decimal(7) 默认decimal精度为28,可以通过getcontext()修改配置。带小数的建议使用字符串创建,否则你用decimal.Decimal(3.14)试试看。 分数 就是那种几分之几的分数。 import fractions fractions.Fraction(16, -10) # – 8/5 fractions.Fraction(decimal.Decimal(‘1.1’)) # 11/10 fractions.gcd(60, 56) #…
-
zero sum subsequence problem solution 1
题目是这样的,给定一个整数序列,比如[1, 2, -1, 8, -9],要求找出一个子序列,其所有数字的和为0,比如子序列[2, -1, 8, -9],并输出子序列在主序列中的位置,比如[2, -1, 8, 9]在主序列[1, 2, -1, 8, -9]中的位置为[1, 4]。 以下是我想到的一个方法,暂时不清楚怎么计算这个的时间复杂度。原理是这样的,对于序列[1, 2, -1, 8, -9],设置一个和序列。初始为[0, 0, 0, 0, 0],长度和输入序列一致。 顺序读取输入序列,第一次遇到1,尝试在和序列的[0, 0]区别内增加1,结果为[1, 0, 0, 0, 0]。为什么这么做呢,这样,输入序列区间[0, 0]的和就计算出来了。 第二次遇到2, 尝试在和序列[0, 1]区间内增加2,结果为[3, 2, 0, 0, 0],这样,输入序列区间[0, 1], [1, 1]的和就计算出来了。没有发现0和序列。 接下来依此类推,发现[1, 4]区间的和为0,输出为(1, 4)。代码如下(python): #!/usr/bin/env python import sys def find_zero_sum_seq(seq): sums = [0] *…
-
[fabric]多种策略的工程同步
继续接上篇。 理论上来说,rsync是最好的工程同步方式。只是和fabric自身的ssh登录没有整合,现在我找到了一个简单的解决方法。同时我也准备了其他两种方法:打包上传和远程svn update,这样加上不同步总共有四个部署策略。 解决rsync依赖主机名和密码的方法很简单:因为rsync是在本地运行,只要在rsync之前执行一个简单的远程命令就能获得主机名和密码。代码如下: remote_srcdir = ‘source’ run(‘hostname’) # simple workaround for host prompt local(‘sshpass -p %s rsync -pthrvz –delete –exclude=.git –exclude=*fabfile* –exclude=target . %s:%s’ % (env.password, env.host_string, remote_srcdir)) 这里写死是密码登录了,理论还有证书登录,暂时不考虑。 打包上传的方式,改造自upload_project import tempfile, os remote_srcdir = ‘source’ _, archive_path = tempfile.mkstemp() _, archive_name = os.path.split(archive_path) try: local(‘tar -cz –exclude-vcs –exclude=*fabfile* –exclude=target -f %s .’ %…
-
rsync与fabric
接上篇。 最近学习rsync,突然想到自己之前使用fabric上传工程时与其用tar上传再解压缩还不如用rsync增量传输,后者可以更快。查了下fabric的文档,发现有提供几个方法: fabric.contrib.project.rsync_project(*args, **kwargs) fabric.contrib.project.upload_project(local_dir=None, remote_dir=”) 第一个就是使用rsync,第二个其实和我之前的方法一样采用压缩包传输的。rsync_project个人认为实际上就是local(“rsync xxx”)的模板,参数并不是很全。 但是使用了之后我还是考虑使用第二个方法upload_project,原因是rsync和fabric的ssh登录是分离的:rsync_project需要我重新输入一次密码,不输入的话就需要退化成local加上sshpass。再考虑到一开始可能没有输入密码,代码可能会变成这样: rsync_cmd = ‘rsync –exclude=.git –exclude=*fabfile* -pthrvz . -e ssh %s:source’ % env.host_string if env.password: local(‘sshpass -p %s %s’ % (env.password, rsync_cmd)) else: local(rsync_cmd) 如果不想输入两次密码的话,就必须在代码上或者命令行上写上密码,不是很安全。考虑再三,还是使用fabric提供的upload_project,虽然压缩可能慢一点。
-
尝试用fabric部署应用
-
pexpect和非UTF-8编码的ssh
-
python tip 2