Monthly Archives: October 2010

PIL图像处理

1 转换图片格式

>>> import Image
>>> im = Image.open( "sample01.jpg" )
>>> im.save( "fileout.png" )

很聪明的根据后缀名来判断要转换的格式,如果想要保存成和后缀名不同的格式的话:

>>> im.save( "fileout.png", "JPEG" )

这样就忽略的后缀名的格式

2 获取图片大小

>>> import Image
>>> im = Image.open( "sample01.jpg" )
>>> print im.format, im.size, im.mode
JPEG (2288, 1712) RGB

3 批量更改格式

#!/usr/bin/env python

from glob import glob
from os.path import splitext
import Image

jpglist = glob( "python_imaging_pix/*.[jJ][pP][gG]" )

for jpg in jpglist:
    im = Image.open(jpg)
    png = splitext(jpg)[0]+".png"
    im.save(png)
    print png

4 改变图片的品质度

im.save( "quality100.jpg", quality=100 )

5 制作微缩图

>>> im = Image.open( "sample01.jpg" )
>>> print im.size
(2288, 1712)
>>> width = 400
>>> ratio = float(width)/im.size[0]
>>> height = int(im.size[1]*ratio)
>>> nim = im.resize( (width, height), Image.BILINEAR )
>>> print nim.size
(400, 299)
>>> nim.save( "resized.jpg" )

参考:http://tech.seety.org/python/python_imaging.html

Hypy-全文搜索引擎

Hypy 是一个为 Python 应用程序编写的全文搜索引擎,

db = HDatabase()
db.open('casket', 'w')
# create a document object
doc = HDocument(uri=u'http://estraier.gov/example.txt')
# create a search condition object
cond = HCondition(u'lull*')
# get the result of search
result = db.search(cond)
# iterate the result
for doc in result:

[Python]根据相对路径计算绝对路径

例如在抓取过程中,根据网页的绝对地址,链接中有个相对地址,如果才能找到链接的绝对地址?

from urlparse import urljoin
url1 = "http://www.cwi.nl/%7Eguido/Python.html"
url2 = "./FAQ.html"
urljoin(url1,url2)

'http://www.cwi.nl/%7Eguido/FAQ.html'

还有很多不错的URL function在python中。

在读取的过程中经常发现字符串中有换行符或者tab符号,删除比较麻烦,有个很简单的办法

>>> s='''   as asdas \r\nasda'''
>>> s
'   as asdas \r\nasda'
>>> print ''.join(s.split())
asasdasasda

WordPress XML-RPC Python

wordpressLibrary是个Python利用Wordpress XML-RPC协议发布post的lib,使用很方便并且还能发布media,类似图片之类wordpress支持的格式都可以发布。

code:

import wordpresslib
url = 'http://www.mysite.com/wordpress/xmlrpc.php'
wp = wordpresslib.WordPressClient(url, 'username', 'password')
wp.selectBlog(0)
post = wordpresslib.WordPressPost()
post.title = 'Post title'
post.description = 'Post content'
idPost = wp.newPost(post, True)

但是我下载以后,输入正确的url和用户名以及密码后,报错:

raise TypeError, "cannot marshal None unless allow_none is enabled"

后来在wordpresslib.py中第129行稍微改动:

self._server = xmlrpclib.ServerProxy(self.url,allow_none=True)

添加“,allow_none=True”即可。

Python中小tips

有这样一个字符串:z=”3″;m=”4″;k=”2″;l=”9″;d=”0″;b=”5″;i=”7″;w=”6″;r=”8″;c=”1″ 在程序中需要把一部分文本中的字母替换成对应的数字。

首先把字符串中的双引号删除:

str.replace('''"''',"")

'z=3;m=4;k=2;l=9;d=0;b=5;i=7;w=6;r=8;c=1'

str.split(";")

['z=3', 'm=4', 'k=2', 'l=9', 'd=0', 'b=5', 'i=7', 'w=6', 'r=8', 'c=1']

str = dict(k.split("=") for k in str)

{'c': '1', 'b': '5', 'd': '0', 'i': '7', 'k': '2', 'm': '4', 'l': '9', 'r': '8', 'w': '6', 'z': '3'}

一行命令的话:

str = dict(k.split('''=''') for k in str.replace('''"''','''''').split(''';'''))

OK 一个对应完备的dict已经出来了。

SMTP服务关于“身份验证”的问题

营业部每个人办公室都有两台电脑,分别用来上互联网-看看行情,聊聊QQ;另一台电脑用来上公司OA-登录OA系统,各种业务平台和FTP服务。公司的mail服务器在内网上有个ip地址,很多同事都用XP自带的OE express来收发邮件,但是貌似只能收发公司内部同事之间互相传递的邮件或者其他例如163邮箱发到你邮箱里面的邮件,但是没法用OE往163发邮件。

今天发现原来原来是OE的问题,OE在创建邮件账户的时候竟然默认没有在smtp服务中选择“需要身份认证”,所以在OE发邮件的时候,smtp服务器发现如果是发给自己的邮件就同意发送,但是应用没有身份验证,所以要是发给别的邮箱的时候就拒绝发送了。Foxmail在创建mail账号的时候默认是选取了smtp“要求身份验证”的,并且默认的选项也是和pop3服务同一个用户名和密码。

dd命令测试VPS IO性能

首先在一台机房的Dell SC440服务器上运行dd测试系统IO:

[root@web ~]# dd if=/dev/zero of=/root/zerofile bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 0.660996 seconds, 406 MB/s

然后再Garman online的VPS上测试:

[root@vps_server1 ~]# dd if=/dev/zero of=/root/zerofile bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 0.448851 seconds, 598 MB/s

看来VPS上的IO还马马虎虎,也就是比老440快了一些而已。用

cat /proc/cpuinfo

查看的话,也是Xeon CPU。

再看一下2Host的vps性能如何:

[root@2host ~]# dd if=/dev/zero of=/root/zerofile bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 1.00655 seconds, 267 MB/s

算了,认倒霉吧,贪便宜买了这个$4的XEN VPS。

SK独立服务DD命令测试:

[root@***]# dd if=/dev/zero of=/root/zerofile bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 0.261223 seconds, 1.0 GB/s

PS:/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。

购买2host.com的XEN VPS

最近前前后后买过好几个国外的VPS,大多都是不超过$5的OpenVZ VPS,由于OpenVZ的缺陷无法编译内核,所以没法安装pptp服务作为vpn服务器。2Host.com有个XEN vps才买$2.97(需要一次性付清2年的费用,单月支付需要$4.49),具体配置如下:

A-Class XEN Super Promotion 2010! -
- 128MB RAM (Guaranteed!)
- 256MB SWAP (Guaranteed!)
- 5,000MB HDD RAID10 (Guaranteed!)
- 10,000GB Traffic (Guaranteed!)
- 1IP Address
- VPS Management Panel
- 24/7 Instant Setup!

链接
不过网络情况不是太好,晚上ping的话竟然有丢包。安装了pptp vpn服务器后即使连上了pptp,上网的速度非常慢,几乎没法用,看来的确便宜没好货。不建议购买2Host的XEN VPS。

但是默认的内核不支持tun,也就没法安装pptpd,这是运行iptables时的报错信息:

iptables v1.3.5: can't initialize iptables table `nat': iptables who? (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

需要自己手动更新vps的内核,后来到vps的manage页面,在reinstall选项里面有提示:TUN/TAP does NOT work on 32BIT, you need 64BIT CentOS for TUN/TAP. 重新安装了64位的内核,ok。

既然已经支持了,就开始安装pptp服务

1. 首先安装pptp和必须的iptables

yum install -y ppp iptables

rpm -ivh http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm (32位系统)

rpm -ivh http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm (64位系统)

我的vps的内核是64位的,所以使用下面的版本。

2. 更改配置文件

#vim /etc/pptpd.conf

localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

#vim /etc/ppp/options.pptpd
ms-dns 8.8.8.8
ms-dns 8.8.4.4

3. 添加vpn账号

#vim /etc/ppp/chap-secrets

按照文件中的顺序,依次输入
用户名 pptp 密码 *

4. 更改sysctl

#vim /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.tcp_syncookies = 1

#sysctl -p

5. iptables转发规则

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE(这是XEN VPS用的)

#/etc/init.d/iptables save
#/etc/init.d/iptables restart
#/etc/init.d/pptpd restart

6. 设定开机

#chkconfig pptpd on
#chkconfig iptables on