转自http://panweizeng.com/python-urllib2-socks-proxy.html

python2.5中的urllib2支持http代理,不支持socks代理。假如代码库或者编码时使用了urllib2,同时又要使用socks,就需要第三方的库来实现。幸运的是,已经有人造好了轮子。

SocksiPy是一个socks module。它提供了一个类socket的接口,支持socks4、socks5和http proxy。下载后在代码中引用socks.py即可,也可以写个setup.py文件安装到python的site-packages目录中。
使用时,将下面的代码放在调用urllib2的代码之前即可:

1
2
3
4
5
6
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 8080)
socket.socket = socks.socksocket
import urllib2
print urllib2.urlopen('http://panweizeng.com').read()

如果是自己写的程序,也可以尝试使用pycurl这个库。ubuntu使用sudo apt-get install python-pycurl python-pycurl-dbg安装。
示例代码

1
2
3
4
5
6
7
import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://panweizeng.com')
c.setopt(pycurl.PROXY, '127.0.0.1')
c.setopt(pycurl.PROXYPORT, 8080)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()

如果在程序外部使用socks,推荐使用tsocks。ubuntu中直接使用sudo apt-get install tsocks安装。安装完毕以后需要修改/etc/tsocks.conf。
配置样例如下

1
2
3
4
5
6
# 默认代理服务器
server = 127.0.0.1
# 代理服务器类型
server_type = 5
# 代理服务器端口
server_port = 8080

使用时,在命令行输入tsocks 程序名即可。例如ubuntu下的epiphany浏览器没有代理设置,如果想使用socks代理,输入tsocks epiphany-browser即可(注意先关闭其他的epiphany实例)。

制作deb包 七月 1st, 2011

如何制作Deb包和相应的软件仓库,其实这个很简单。这里推荐使用dpkg来进行deb包的创建、编辑和制作。

首先了解一下deb包的文件结构:

deb 软件包里面的结构:它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)。在DEBIAN目录中起码具有control文件,其次还可能具有postinst(postinstallation)、 postrm(postremove)、preinst(preinstallation)、prerm(preremove)、copyright (版权)、changlog (修订记录)和conffiles等。

control: 这个文件主要描述软件包的名称(Package),版本(Version)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。同时为了能将软件包进行充分的管理,可能还具有以下字段:

Section: 这个字段申明软件的类别,常见的有`utils’, `net’, `mail’, `text’, `x11′ 等;

Priority: 这个字段申明软件对于系统的重要程度,如`required’, `standard’, `optional’, `extra’ 等;

Essential: 这个字段申明是否是系统最基本的软件包(选项为yes/no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载(除非进行强制性的卸载)

Architecture:申明软件包结构,如基于`i386′, ‘amd64’,`m68k’, `sparc’, `alpha’, `powerpc’ 等;

Source: 软件包的源代码名称;

Depends: 软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开;

Pre-Depends: 软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求;

Recommends: 这个字段表明推荐的安装的其他软件包和库文件;

Suggests: 建议安装的其他软件包和库文件。


对于control,这里有一个完整的例子:

Package: bioinfoserv-arb
Version: 2007_14_08
Section: BioInfoServ
Priority: optional
Depends: bioinfoserv-base-directories (>= 1.0-1), xviewg (>= 3.2p1.4), xfig (>= 1:3), libstdc++2.10-glibc2.2
Suggests: fig2ps
Architecture: i386
Installed-Size: 26104
Maintainer: Mingwei Liu <lmingwei@gmail.com>
Provides: bioinfoserv-arb
Description: The ARB software is a graphically oriented package comprising various tools for sequence database handling and data analysis.If you want to print your graphs you probably need to install the suggested fig2ps package.

preinst: 这个文件是软件安装前所要进行的工作,工作执行会依据其中脚本进行;
postinst: 这个文件包含了软件在进行正常目录文件拷贝到系统后,所需要执行的配置工作。
prerm: 软件卸载前需要执行的脚本
postrm: 软件卸载后需要执行的脚本现在来看看如何修订一个已有的deb包软件

=================================================================
debian制作DEB包(在root权限下),打包位置随意。
#建立要打包软件文件夹,如
mkdir Cydia
cd   Cydia

#依据程序的安装路径建立文件夹,并将相应程序添加到文件夹。如
mkdir Applications
mkdir var/mobile/Documents (游戏类需要这个目录,其他也有可能需要)
mkdir *** (要依据程序要求来添加)

#建立DEBIAN文件夹
mkdir DEBIAN


#在DEBIAN目录下创建一个control文件,并加入相关内容。
touch DEBIAN/control(也可以直接使用vi DEBIAN/control编辑保存)
#编辑control
vi DEBIAN/control

#相关内容(注意结尾必须空一行):
Package: soft (程序名称)
Version: 1.0.1 (版本)
Section: utils (程序类别)
Architecture: iphoneos-arm   (程序格式
Installed-Size: 512   (大小)
Maintainer: your <your_email@gmail.com>   (打包人和联系方式)
Description: soft package (程序说明)
                                       (此处必须空一行再结束)
注:此文件也可以先在电脑上编辑(使用文本编辑就可以,完成后去掉.txt),再传到打包目录里。

#在DEBIAN里还可以根据需要设置脚本文件
preinst
在Deb包文件解包之前,将会运行该脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。

postinst
该脚本的主要任务是完成安装包时的配置工作。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。

prerm
该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。

postrm
该脚本负责修改软件包链接或文件关联,或删除由它创建的文件。

#postinst 如:
#!/bin/sh
if [ "$1" = "configure" ]; then
/Applications/MobileLog.app/MobileLog -install
/bin/launchctl load -wF /System/Library/LaunchDaemons/com.iXtension.MobileLogDaemon.plist 
fi

#prerm 如:
#!/bin/sh
if [[ $1 == remove ]]; then
/Applications/MobileLog.app/MobileLog -uninstall
/bin/launchctl unload -wF /System/Library/LaunchDaemons/com.iXtension.MobileLogDaemon.plist 
fi

#如果DEBIAN目录中含有postinst 、prerm等执行文件
chmod -R 755 DEBIAN

#退出打包软件文件夹,生成DEB
dpkg-deb --build Cydia
=====================================================================
有时候安装自己打包的deb包时报如下错误:
Selecting previously deselected package initrd-deb.
(Reading database ... 71153 files and directories currently installed.)
Unpacking initrd-deb (from initrd-vstools_1.0_amd64.deb) ...
dpkg: error processing initrd-vstools_1.0_amd64.deb (--install):
trying to overwrite `/boot/initrd-vstools.img', which is also in package initrd-deb-2
dpkg-deb: subprocess paste killed by signal (Broken pipe)
Errors were encountered while processing:
initrd-vstools_1.0_amd64.deb
主要意思是说,已经有一个deb已经安装了相同的文件,所以默认退出安装,只要把原来安装的文件给卸载掉,再次进行安装就可以了。

下面为实践内容:

所有的目录以及文件:

mydeb

|----DEBIAN

       |-------control
               |-------postinst

       |-------postrm

|----boot

       |----- initrd-vstools.img

在任意目录下创建如上所示的目录以及文件
# mkdir   -p /root/mydeb                          # 在该目录下存放生成deb包的文件以及目录
# mkdir -p /root/mydeb/DEBIAN           #目录名必须大写
# mkdir -p /root/mydeb/boot                   # 将文件安装到/boot目录下
# touch /root/mydeb/DEBIAN/control    # 必须要有该文件
# touch /root/mydeb/DEBIAN/postinst # 软件安装完后,执行该Shell脚本
# touch /root/mydeb/DEBIAN/postrm    # 软件卸载后,执行该Shell脚本
# touch /root/mydeb/boot/initrd-vstools.img    # 所谓的“软件”程序,这里就只是一个空文件


control文件内容:
Package: my-deb   (软件名称,中间不能有空格)
Version: 1                  (软件版本)
Section: utils            (软件类别)
Priority: optional        (软件对于系统的重要程度)
Architecture: amd64   (软件所支持的平台架构)
Maintainer: xxxxxx <
xxxxxxxx@xxxx.xx> (打包人和联系方式)
Description: my first deb (对软件所的描述)

postinst文件内容( 软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限:chmod +x postinst):
#!/bin/sh
echo "my deb" > /root/mydeb.log

postrm文件内容( 软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限:chmod +x postrm):
#!/bin/sh
rm -rf /root/mydeb.log

给mydeb目录打包:
# dpkg -b   mydeb   mydeb-1.deb      # 第一个参数为将要打包的目录名,
                                                            # 第二个参数为生成包的名称。

安装deb包:
# dpkg -i   mydeb-1.deb      # 将initrd-vstools.img复制到/boot目录下后,执行postinst,
                                            # postinst脚本在/root目录下生成一个含有"my deb"字符的mydeb.log文件

卸载deb包:
# dpkg -r   my-deb      # 这里要卸载的包名为control文件Package字段所定义的 my-deb 。
                                    # 将/boot目录下initrd-vstools.img删除后,执行posrm,
                                    # postrm脚本将/root目录下的mydeb.log文件删除

查看deb包是否安装:
# dpkg -s   my-deb      # 这里要卸载的包名为control文件Package字段所定义的 my-deb

查看deb包文件内容:

# dpkg   -c   mydeb-1.deb

查看当前目录某个deb包的信息:
# dpkg --info mydeb-1.deb

解压deb包中所要安装的文件
# dpkg -x   mydeb-1.deb   mydeb-1    # 第一个参数为所要解压的deb包,这里为 mydeb-1.deb
                                                             # 第二个参数为将deb包解压到指定的目录,这里为 mydeb-1

解压deb包中DEBIAN目录下的文件(至少包含control文件)
# dpkg -e   mydeb-1.deb   mydeb-1/DEBIAN    # 第一个参数为所要解压的deb包,
                                                                           # 这里为 mydeb-1.deb
                                                                          # 第二个参数为将deb包解压到指定的目录,
                                                                           # 这里为 mydeb-1/DEBIAN

Posted in Linux | Comments(1)»
奋起宣言

每日至少抽一刻钟,解答邮件列表中初学者的问题,
每周至少抽两小时,整理新学知识将体验发表/分享出去,通过Blog/Wiki/MaiList/个人网站……
每旬至少抽四个小时, 来翻译自个儿喜爱的自由软件的文档,
每月至少抽八小时, 快乐的编程,推进自个儿的项目,
每年至少参加一次, 自由软件的活动,传播自由软件思想,发展一名“自由人”……

只要我们每个人都坚持下去……
10年!就足以改变中国软件的整体风貌!

八荣八耻

以动手实践为荣 , 以只看不练为耻;
以打印日志为荣 , 以单步跟踪为耻;
以空格缩进为荣 , 以制表缩进为耻;
以单元测试为荣 , 以人工测试为耻;

以模块复用为荣 , 以复制粘贴为耻;
以多态应用为荣 , 以分支判断为耻;
以Pythonic为荣 , 以冗余拖沓为耻;
以总结分享为荣 , 以跪求其解为耻;


本地下载慢的时候我常常登录服务器使用wget下载,有时候会遇到下载的内容需要网站登录才能下载的情况,这时候就有点卡壳了,不过还是可以使用wget下载的,只需要多操作一步。
第一步,先获得登录小甜饼cookies。

wget --keep-session-cookies --save-cookies cookies.txt --post-data "username=username&password=password" "http://example.com/login"

第二步,使用获得的甜饼请求需要下载的资源。

wget --load-cookies=cookies.txt "http://example.com/?download_id=314"
–post-data 参数将网站登录信息POST到网站的登录入口,具体参数可以通过抓包工具查看到。
用服务器来下载,速度真是爽歪歪~
Posted in Linux | Comments(0)»

连连看 五月 30th, 2011


基本功能实现仅用160行。


Python语言: Codee#19874
#! /usr/bin/env python
#coding=utf-8
import sys
import os
import random
import clutter
from clutter import keysyms

......我是省略号......

if __name__ == '__main__':
        main()

正则表达式笔记 五月 30th, 2011

特殊字符
. ^ $ * + ? { }[ ] \ | ( )
.任意字符
^起始位置
$结束位置
*重复0次或任意次
+重复1次或以上
?重复1次或不重复
{}具体重复次数,{4} {1,5}
[]限制范围 [abcd] [0-9a-zA-Z]
\转义符
|或
()分组           (...) 分组以截取内容到1,2,3  (?P<name>...)分组截取数据到name  (?:...)分组但不截取数据,也可与重复字符结合  
\name 与已定义name组内容相同的字符段
\1    与已定义的第一组内容相同的字符段
>>>p = re.compile(r'(\b\w+)\s+\1')
>>> p.search('Paris in the the spring').group()
'the the'
分组序号由分组左括号位置由左向右 从1起始


\d  匹配任何十进制数;它相当于类 [0-9]。
\D  匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类  [ \t\n\r\f\v]。
\S  匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w  匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W  匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。



import re
p = re.compile(r'(?P<name>[0-9]*)')  #创建正则表达式
s=p.match('waijf23982fjijqaffffffffffff')   #进行匹配,若不匹配则s=None
s.group() 返回 RE 匹配的子串   s.group('name') 返回截取的'name'组内容,若未定义组名,则为1,2,3。。。
s.groups() 返回说有组内容



正则表达式有3方面用途
1,判断对象是否匹配,可由s!=None来判断
2,采集数据,由分组结构完成
3,修改内容,由sub等实现

split() 将字符串在 RE 匹配的地方分片并生成一个列表,
sub() 找到 RE 匹配的所有子串,并将其用一个不同的字符串替换
subn() 与 sub() 相同,但返回新的字符串和替换次数 

p2因为分组了,会将分组内容也返回回来
>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')
['This', 'is', 'a', 'test', '']
>>> p2.split('This... is a test.')
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']





>>> p = re.compile( '(blue|white|red)')
>>> p.sub( 'colour', 'blue socks and red shoes')
'colour socks and colour shoes'
>>> p.sub( 'colour', 'blue socks and red shoes', count=1)
'colour socks and red shoes'



>>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)                  #重点
>>> p.sub(r'subsection{\1}','section{First} section{second}')
'subsection{First} subsection{second}'


在下面的例子里,替换函数将十进制翻译成十六进制: 
>>> def hexrepl( match ):
...     "Return the hex string for a decimal number"
...     value = int( match.group() )
...     return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'


!!!!!!注!!!!!!!!
p.match 与 p.search是不同的,
前者要正则表达式匹配整个字符串,后者是正则表达式包含在字符串里边
另外p.findall能够将字符串中所有匹配正则表达式的部分取出放到list中

挑战PYTHON 五月 30th, 2011

挑战PYTHON第一关 

提示信息:

g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.

解析:

很明显是将每个字母ord加2,当然'y'和'z'还要减26. 处理完后提示信息为

"i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url."

知识点:

>>>s=string.maketrans('abcdefghijklmnopqrstuvwxyz','cdefghijklmnopqrstuvwxyzab') #生成一个替换规则s

>>>#trans = string.maketrans(string.ascii_lowercase, string.ascii_lowercase[2:] + string.ascii_lowercase[0:2])

>>>u='map'

>>>u.translate(s)#将u按替换规则s替换相关字母。

'ocr'

下一关入口

挑战PYTHON第二关 
提示信息:
recognize the characters. maybe they are in the book, 
but MAYBE they are in the page source.
解析:

find rare characters in the mess below:


%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+$&[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*
@##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$]#{*+^((@^@}$[**$&^{$!@#$%)!@(&
+^!{%_$&@^!}$_${)$_#)!({@!)(^}!*^&!$%_&&}&_#&@{)]{+)%*{&*%*&@%$+]!*__(#!*){%&@++
!_)^$&&%#+)}!@!)&^}**#!_$([$!$}#*^}$+&#[{*{}{((#$]{[$[$$()_#}!@}^@_&%^*!){*^^_$^
]@}#%[%!^[^_})+@&}{@*!(@$%$^)}[_!}(*}#}#___}!](@_{{(*#%!%%+*)^+#%}$+_]#}%!**#!^_
)@)$%%^{_%!@(&{!}$_$[)*!^&{}*#{!)@})!*{^&[&$#@)*@#@_@^_#*!@_#})+[^&!@*}^){%%{&#@
@{%(&{+(#^{@{)%_$[+}]$]^{^#(*}%)@$@}(#{_&]#%#]{_*({(])$%[!}#@@&_)([*]}$}&${^}@(%
............

每行都80个字符,共计122行。看不到字母 一堆字符有怎么下手呢。可谁说么有字母呢,搜索了一下 还真有字母包含在里边。Bingo!!!
让我想起“茫茫人海,我一眼就找到了你”:
人猪
知识点:
>>>a='''%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+$&[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*.........'''
>>>b=''
>>>for i in a:
...    if (ord('a')<=ord(i)<=ord('z')) or (ord('A')<=ord(i)<=ord('Z')):
...        b+=i
...
>>>print b
equality
下一关入口

挑战PYTHON第三关 

提示信息:
One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.


解析:
提示我们小蜡烛左右分别有3个大蜡烛 , 英文中蜡烛和字母是同词多义。即表示目标便是 左右分别有三个大写字母的那个小写字母。
同样从网页源代码中获取字符串上千行
kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT
MUKLECKdCthezSYBpIElRnZugFAxDRtQPpyeCBgBfaRVvvguRXLvkAdLOeCKxsDUvBBCwdpMMWmuELeG
...................
标题为 re 即告诉我们可以使用正则表达式来轻松处理这个问题

知识点:
正则表达式模块re

>>>a="""
kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJIHEmbT
MUKLECKdCthezSYBpIElRnZugFAxDRtQPpyeCBgBfaRVvvguRXLvkAdLOeCKxsDUvBBCwdpMMWmuELeG
................
"""
>>> p=re.compile(r'[a-z][A-Z]{3}([a-z]{1})[A-Z]{3}[a-z]')
>>> p.findall(a)
['l', 'i', 'n', 'k', 'e', 'd', 'l', 'i', 's', 't']
>>> j=p.findall(a)
>>> ''.join(j)
'linkedlist'
下一关入口需要吧‘html’改为'php' 即这里


挑战PYTHON第四关 

提示信息:
urllib may help. DON'T TRY ALL NOTHINGS, since it will neverend. 400 times is more than enough
解析:
这个没什么好说的 使用urllib循环即可。不过要小心里边有个要除以2的,需要自己盯着
下一关入口
挑战PYTHON第五关 

提示:
<peakhell src="banner.p"/>  
peak hell sounds familiar ?
解析:
peakhell sounds as pickle. 
知识点:


下一关入口
挑战PYTHON第六关 

提示信息:
<!-- <-- zip --> 转换URL为zip文件






Posted in python | Comments(0)»

壹之和 五月 26th, 2011

群里有人贴出这个题目,但没人理,可能是觉得比较麻烦。我觉得挺有意思的

这道题目的大意用python公式表示: 某整数为abcde,求''.join([str(i) for i in range(abcde+1)]).count('1')的值。

比如13,比从0至13中包含1的数字有1,10,11,12,13.其中包含‘1’共计6个。


我解这道题的思路便是 假设 该数为abcde 5位整数,分为5次计算,每次只计算所有整数的某一位(如b)上‘1’的总数,循环5次即可。核心算法即为怎么算所有整数b位上‘1’的总数了。


Python语言: 壹之和
#!/usr/bin/env python
#coding=utf-8
abcde=999999999999999999
def gwei(i,x=abcde):
    if i==len(str(x)):return 0
    a=list(str(x))
    a.reverse()
    return int(a[i])
u=0
for i in range(len(str(abcde))):
    m1999=2*(10**i)-1
    m999=10**i-1
    bcde=abcde%(10**(i+1))
    a=abcde/(10**(i+1))
    s=a*(m1999-m999)+min(bcde,m1999)-m999
    u+=s
print u

Posted in python | Comments(0)»
在ubuntu中可以通过tsocks为任何程序设置代理。
1、首先你要有一个socks5代理,且定义为:127.0.0.1:7070吧;
2、sudo apt-get install tsocks 
3、sudo gedit /etc/tsocks.conf 
local = 192.168.1.100/255.255.255.0 #local表示本地的网络,也就是不使用socks代理的网络 
server = 127.0.0.1 #socks服务器的IP
server_type = 5 #socks服务版本 
server_port = 7070 #socks服务使用的端口 
4、然后就可以 tsocks ping twitter.com
Posted in Linux | Comments(0)»

一次谷歌面试趣题 五月 8th, 2011

奋斗BLOG上有一则面试题,题目是这样的:

假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有?

比如,如果是下面两个字符串:

String 1: ABCDEFGHLMNOPQRS

String 2: DCGSRQPOM

答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:

String 1: ABCDEFGHLMNOPQRS

String 2: DCGSRQPOZ

答案是false,因为第二个字符串里的Z字母不在第一个字符串里。

blog中的解法可以到这里去学习,看到这个题目的时候其实我是想到另外一个解法,相信效率会比较高。

#!/usr/bin/env python
#coding=utf-8
def s(i):

    b=0
    for a in i:
            b=b|(1<<(ord(a)-ord('A')))
    return b
    
str1='ABCDEFGHLMNOPQRS'
str2='DCGSRQPOM'
bin1=s(str1)
bin2=s(str2)

print bin1
print bin1|bin2
print 'bin1|bin2:\t',bin(bin1|bin2)
print 'bin1^(bin|bin2):',bin(bin1^(bin1|bin2))

if bin1==bin1|bin2:
    print u'符合'
else:
    print u'不符合'

字符串转换为数字,每个字母通过移位转换为相应二进制数字,每个字母占据各自的二进制位。

如‘A’转换为‘0b1','B'转换为‘0b10','C'转换为'0b100'

这样通过或的算法 就可以检查str1有没有变化,如果有变化,还可以通过异或将有变化的二进制为揪出来,找到那个str1中不包含的字母。

str1='ABCDEFGHLMNOPQRS'

str2='DCGSRQPOM'


str1='ABCDEFGHLMNOPQRS'

str2='DCGSRQPOZ'




Posted in python | Comments(0)»

     今天进入gnome-shell 始终无法正常显示,只显示光秃秃的桌面。top显示ubuntuone的同步程序占用CPU时间100%,鉴于ubuntuone目前仍无法正常使用 遂进入TTY将其卸载。

     而后通过kill -9 -1返回登录界面 选择gnome-shell之前问题仍未解决。top显示无异常程序。

     再次返回登录界面,选择KDE桌面进入,升级系统。注销后进入gnome-shell仍未果。

     想到应该直接查看gnome-shell提示什么错误信息。登录选择recovery桌面,命令行输入gnome-shell --replace启动gnome-shell,果然提示出错 libmozjs.so 导入出错。

     注销 进入KDE,查看libmozjs库 将其卸载后重新安装,查看安装文件 未发现libmozjs.so文件,貌似发现问题所在。进入/usr/lib 发现果然只有libmozjs185.so.1.0.0  于是创建连接文件。sudo ln -s libmozjs185.so.1.0.0 libmozjs.so 

     注销进入GNOME-SHELL桌面 问题解决。


协议书 四月 17th, 2011

                    协议书
    甲方:
    乙方:
    甲乙双方就五一期间约会事宜在友好磋商的前提下,自愿签订本协议书。本协议纲要为甲方请求乙方于五月假期到甲方归属地与甲方交流心得,沟通思想。双方本着增进感情并在遵守国家相关政策和法规的基础上,遵照以下条款:
1.甲方成为约会对象的基本条件:
    1.1 甲方须为具备完全民事权利能力和民事行为能力的个人,能够承担民事责任。
    1.2 甲方须了解乙方感情及身体状况、熟悉乙方性格,与乙方有长期共同生活经历。
    1.3 甲方须具备生活上照顾乙方、并具备对乙方精神方面起到积极影响的能力。
    
2.甲方的权利和义务
    2.1 甲方须向乙方提真诚的约会申请、约会时间、约会地点,须向乙方补偿由本次约会造成的必要交通消费。
    2.2 甲方须保证其在约会期间的行为完全遵守中国相关法律、法规、行政规章制度的规定。包括但不限于《未成年人保护法》、《妇女儿童保护法》、《消费者权益保护法》以及《野生动物保护法》,务必做好约会期间对乙方的保护工作。如因甲方违反上述规定的行为给乙方带来任何损失,甲方应承担所有法律责任并赔偿给乙方造成的损失。
    2.3 约会初期和结束时甲方须做好接送工作,不可以将乙方弄丢。
    2.4 约会期间甲方须尽量满足乙方的生活需求,零食饮料保证足量供应。并应提前准备文化娱乐内容,避免无聊。
    2.5 对于甲方与乙方之间的纠纷、争议、损失、侵权、违约责任等,双方应友好协商解决,避免暴力出现。
    
3.乙方的权利和义务
    3.1 乙方须在五月份之内赶到甲方指定地点,并保证不少于5天的约会时间。
    3.2 乙方应提前购买车票,杜绝因交通问题导致无法约会的情况。
    3.3 乙方须对甲方友好善意,保持宽松的交流氛围。
    3.4 乙方在出发前三天通知甲方做好接待工作。

4.违约责任
    4.1 甲方如违反国家相关政策法规,乙方有权中止合同,并由甲方承担相应责任。
    4.2 乙方如违反国家相关政策法规,甲方有权中止合同,并由乙方承担相应责任。
    4.3 约会期间发生乙方权益受到侵害,须由甲方在未来共同生活中包揽打扫卫生和电器维护的工作。相反甲方权益收到侵害时,须由乙方在未来的共同生活中包揽洗衣做饭的工作。
    4.4 甲方未完成接送任务,须由甲方在未来共同生活中包揽洗碗的工作。
    4.5 乙方无法在五月份內达到指定位置,则由乙方在未来的共同生活中包揽所有家务。
    
5.免责条件
    5.1 因国家政策法规调整、自然灾害等不可抗力或意外事件而影响甲乙双方正常的服务和感情支持时,双方互不承担责任。
    
6.合同附件
    6.1 甲方向乙方提交约会申请:
    
    亲爱的老婆,我请您于2011年5月份来我家约会吧。
    
7. 附则
  7.1 本协议同时得到甲乙双方的完全理解和认同,并替代此前的所有协议,不论是口头的还是书面的。在打印或填写过程中,未经乙方书面同意,甲方不得随意更改本合同中的任何条款。本协议经双方签字盖章生效后,任何更改均需双方协商一致并以书面形式确认。
  7.2 一方变更通知、通讯地址或其它联系方式,应自变更之日起三日内,将变更后的地址、联系方式通知另一方,否则变更方应对此造成的一切后果承担责任。
  7.3 本协议的理解与解释应依据协议目的和文本原义进行,本协议的标题仅是为了阅读方便而设,不应影响本协议的解释。
  7.4 本合同由双方代表签字盖章后生效,合同期限一年。合同期满若双方均无异议,则本合同继续有效;若续约期内乙方制定出新的合同条款,则双方另签新合同。
  7.5本协议一式二份,双方各执一份,经签字、盖章后生效,二份协议具有同等效力。  
  
甲 方:
邮政编码:
联 系 人:
联系电话:
电子邮件:

代表签字:_________________
签约时间:______年_____月_____日

乙    方:_________________
邮政编码:_________________
联 系 人:_________________
联系电话:_________________
电子邮件:_________________

代表签字:_________________
签约时间:______年_____月_____日
Posted in 生活 | Comments(0)»

apt-get多线程 四月 5th, 2011

         新立得对于软件包的下载速度实在不敢恭维,upgrade时总是感觉时间好漫长。apt-get的工作原理很简单,第一步 刷新源索引,对比列出需要升级的软件包;第二步 下载可升级软件包至/var/cache/apt/archives目录;第三步 安装最耗费时间的阶段为第二步,需要提速。该下载过程,使用单线程下载,所以我们完全可以自行使用多线程下载,节约时间。首先需要获取第一步得到的需要升级的软件包信息。apt-get的参数--print-uris将提供包名称,文件名,文件大小,文件MD5,文件URI。使用多线程下载软件包,并进行MD5检查。将所有需更新程序下载完毕后,调用upgrade安装软件包。目前支持 install upgrade dist-upgrade。
第一种方法 apt-getfast
    获取下载列表,按顺序对每个deb文件采用多线程分段下载的方法,调用多线程下载函数paxel(作者 volans)这个方法的效果并不是很好,下载kdm以及其依赖的软件包花费523秒钟。
第二种方法 apt-getfast2
   获取下载列表中的文件大小排序,将当前最大的10个(可设置)文件 分别放入10个线程中单独下载(对于每个deb文件 使用单线程下载)这种方法效果显著,下载kdm以及其依赖的软件包花费312秒,几乎是满带宽下载。但是不知到为什么随机排序下载反倒为289秒,实属巧合,-_-!。
    码字的时候还有段小插曲,列表对象的属性中有个sort()函数,是排序用的;而另一个函数reverse()则是倒序的。我错误地以为他俩是一对,一个从小到大,一个从大到小。而实际情况是,reverse()只是将所有元素反过来somelist[::-1]的意思。
第三种方法 apt-getfast3(未完成)
   第三种方法是前两中方法的结合,将稍加智能。获取列表 按大小排序,将最大的10个分别放入10个线程中,如果文件大小超过列表size之和的1/20将对该deb采用多线程分段下载,如果没有特别大的文件将不采用分段下载(对单个deb文件来讲即采用单线程)。这样可以避免apt-getfast2中容易出现的某个超大文件自始至终一直在下载,其他线程关闭后仍未下载完毕。

IMG_20110215_214435.jpg 三月 29th, 2011

用以纪念那一次相遇
ddddocoddddddddddxxxxxxxkO00000Okxxxxxxxddddddddddddo:';ccc:,,,,,,,''';::::::cccccccclllll
xddddocoddddddxxxxxxxxxkkOXWWWWX0kkxxxxxxxxdddddddddo;,:llc:,,,,,,,,,,;:::::ccccccccllllll
xxddddolodddoddddddxxxxxkOXWWMMWKOkkkkkxxxxxxdddddddl,:llllc,,,,,,,,,,:::::ccccccclllllllo
ddddddddlldddodxxxxxxxxkkkkOkWWX0OkkXWWXOxxxxddddoooc;coool:,,,,,,,,,;:::::ccccccllllllooo
ooooooooolcoddoddxxxxxxxkkkkxWKOOOkkO0KKOxxoc:;;,'',,;clooxc,,,,,,,,,;::::::cccccllllloooo
oooooollllcclooooooddddddxxxkKkkkkkkkkkdc:,'''........,;:lXc;,,,,,,,,;;;;;::::::cccclllloo
oooooooollclooooooooooodddddxkdxxxxxxd:,'................';,,,,,,,,,;;;:::::::::::ccccccll
Oxddooooolclooooooooodddddddkxddddddo,'.....................',,,,,,,;:::::::::ccccccllllll
kxxxddddooloddddddddddddddddkddddddo;'.......................',,,,,,::::::cccccclllloooddd
Okkkkxxxddoxxxxdxxxxxxxxxxxdkxkxddd:''........................,,,,,;::ccccccclllloooddxxkk
OO0OOkkkkddkkkkkkxdolcccclooxOKKOxo'.........................',,,,,;:cccccclllloooddxxkkOO
00000OOOkdkOkkkx:............,cdkko..........................',,,,,:cccccllllloooddxxkkO00
00000000OxOkkxl'................,ld'......'''................,,,,,;cccccllllooooddxxkkO00K
00000000Oddlc,....................',.......''...............',,,;,:ccclllllooooddxxkkOO00K
0000OO00xc:,........................'......'''..'''''.......,,,,,;cccllllloooodddxxkkO000k
0000O0OOl;'...............................'''''''''''.....';;;;;;;ccllllloooodddxxkkOO0Olc
OOOOOOOx:'.....................................''''''''...,;;;;;;:clllllloooodddxxkkOO0kc:
OOOOOOxl;.......................................''''','..',,;;;;;ccllllloooodddxxxkkOO0d:;
OOOOkko:'....................''''''.............'''''',,,,,,;;;;;clllllloooodddxxxkkOOOl:;
OOOkkxo;''......................'''....'.............',;,,,,;;;;:cllllloooodddxxxkkkOOk:;:
OOOkkxo.'...............................c,...........',;,',,;;;;clllllloooodddxxxkkkOOd:;c
kkkkkxc.,...............................;ko;.........'''',;;;;;;cllllllooooddddxxkkkOOl:,c
kkkkxd:,'.............        .......,:oxdc;...........''',;;;;:lllllllooodddddxxkkkOkc;;l
kkkkxdl,,...........                 ...,;,'...............'',,;:cllllooooddddxxxkkkOd:,;;
xxxxdl;;;........                 . ......................''''',,,:lllooooddddxxxkkkkl:';;
xdxdcc:c;........               .........................''''''',,,:loooooddddxxxkkkkc:;;,
xxxolc:,'.......         . .   ..........''..............''''',,'',:loooooddddxxxxkkdlcccc
xxddl;::'......       ....................''............'''...''',,,coooooddddxxxkkkolllll
dddoccl;........       ..................''''...........'''..''',,,,:ooooodddddxxxkkddoooo
ddddlc;.....  ..     ............ .....'''''''..........'''..''',,,,;oooooddddxxxxxkkkOOOO
dddol:'...   ..  ..................... ...''''...........''..'''',,,;oooooddddxxxxkkkkOOOO
ddoollc...   ..   ...............'''.'.....'.............''..''''',,:oooooddddxxxxkkkkOOOO
ooolllc'...  .  .. ......................''''............'...''''',,cooooddddddxxxxkkOOOOO
oolcc;'.....      .................''......''................''''',;lllloooddddxxxxxkkOOOO
lllccc:';c...............................'..''...............'''',,:cccccccllloodddxxxkkOO
llcclc,cll,.'................................'...............'''',,:cccccclllllooooooodddd
lc:lcc:cclc'.................................''...............'''',:cccccllllloooooooddddd
cc:cccccclc;'.................................'''..............'''';cccclllllooooooddddddd
c::cccccccccc:'...............................'..'..............''';:cccllloooooddddddddxx
:;:ccccccccccc;..................................................'',:cclllooodddddddddxxxx
:;:::cccccllod:......................   ..........................',,:cllodddxxxxxdddxxkO0
;;::::cllllodd,......................   .......................''.''.,:lldOO000OOkkxddx00K
,;::::okOOOkxl'......................  ............................'..;o,'d0KXXXXXNXKk0KOO
,;::::dkkkOOO;....................... ....................................:k0KKXXXXXXX0KKO
';;::::lxkOOo'......................  ................................ ...,dk00KKXXXXXKOk0
';;;;;;;;:lo,....................... ...............................    ..;dxkO00KKXXXK0oo
';;;;;;;;;,'....................... .....................   ....... ......cdxxkkOO00KKKKxo
';:::;;;;,'.......................  ....................         . ..;lddlclooooddxkO00Kd'
:::::;;;,'........................  .....................           .;coxkkkkkxxxxxxxxkkx.
;;;;;;;,.........................   ....................           ...,:cdxxkkdxxkkkkkxkxc
.................................  ...................             ....';cldxxxxdolcdooood
..... ..........................     .....                          .....,;:ldc......;,,,,
...    .........................                                    ......';:clc..........
.        ......................                                      .......,::cllc:;;:cl:
           ....................                                       .......';;:cc;:c:;,:
             .................                          ...            ........,;;:c::::;;
                 ...........                             ...            .........;;;:llllc
                                                          ...            .........';,;:lll
                                                            .              .........,,,;:c
                                                           ...             ..........',',;

Posted in 生活 | Comments(0)»

ubuntu 11.04 安装 gnome3 三月 27th, 2011

ubuntu11.04使用了unity而非gnome。正值gnome3蠢蠢欲动,我的ubuntu也跃跃欲试,其实是我啦。

可以安装gnome3-team为我们build的gnome-shell,网址为https://launchpad.net/~gnome3-team/+archive/gnome3

本地安装建议通过如下命令:

$ sudo add-apt-repository ppa:gnome3-team/gnome3
$ sudo apt-get update
$ sudo apt-get install gnome-shell
$ sudo apt-get dist-upgrade

一定要dist-upgrade哦,不然你会发现没有桌面背景,还不止呢 主题都是经典出题还不能更改呢。

Posted in Linux | Comments(0)»

环境 Ubuntu 11.04 / Python 2.7 / Emacs 2.3.2

1. 安装python-mode.el

apt-get install python-mode

2. 字节编译,在emacs中输入命令:
    C-x C-f /usr/share/emacs/site-lisp/python-mode/python-mode.el

    M-x byte-compile-file 

    选择当前默认目录,(如需权限,请使用sudo打开emacs

3. 确保python-mode.el在加载路径中,测试方法:
    M-x locate-library 

    Locate library: python-mode

    Library is file /usr/share/emacs23/site-lisp/python-mode/python-mode.elc

   如果没有,加入下面一行到的.emacs文件中:
    (setq load-path (cons "/dir/of/python-mode/" load-path))

4. 文件关联,自动将py后缀的文件和pyhton-mod关联,在.emacs文件中添加:
    (setq auto-mode-alist (cons '(".py$" . python-mode) auto-mode-alist))
    (setq interpreter-mode-alist (cons '("python" . python-mode) interpreter-mode-alist))

5. 自动加载,将 python-mode 和文件 python-mode.elc关联,在.emacs文件中添加:
    (autoload 'python-mode "python-mode" "Python editing mode." t)

6. 语法加亮,在.emacs文件中添加:
    ;;; add these lines if you like color-based syntax highlighting
    (global-font-lock-mode t)
    (setq font-lock-maximum-decoration t)



apt-getfast 三月 17th, 2011

Python语言: apt-getfast.py
#!/usr/bin/env python
#coding=utf-8
#filename=apt-getfast.py

importos
importsys

ifos.getuid()!=0:
    os.system('gksu python %s'%' '.join(sys.argv))
    exit()

importmd5
importtime
importurllib
fromthreadingimportThread


local_proxies={'http':'http://131.139.58.200:8080'}
classAxelPython(Thread,urllib.FancyURLopener):
    '''Multi-thread downloading class.

        run() is a vitural method of Thread.
    '''
    def__init__(self,threadname,url,filename,ranges=0,proxies={}):
        Thread.__init__(self,name=threadname)
        urllib.FancyURLopener.__init__(self,proxies)
        self.name=threadname
        self.url=url
        self.filename=filename
        self.ranges=ranges
        self.downloaded=0

    defrun(self):
        '''vertual function in Thread'''
        try:
            self.downloaded=os.path.getsize( self.filename )
        exceptOSError:
            #print 'never downloaded'
            self.downloaded=0

        # rebuild start poind
        self.startpoint=self.ranges[0]+self.downloaded
       
        # This part is completed
        ifself.startpoint>=self.ranges[1]:
            #print 'Part %s has been downloaded over.' % self.filename
            return
       
        self.oneTimeSize=16384#16kByte/time
        #print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])

        self.addheader("Range","bytes=%d-%d"% (self.startpoint,self.ranges[1]))
           
        self.urlhandle=self.open( self.url )

       
        data=self.urlhandle.read( self.oneTimeSize )
        whiledata:
            filehandle=open( self.filename,'ab+' )
            filehandle.write( data )
            filehandle.close()

            self.downloaded+=len( data )
            #print "%s" % (self.name)
            #progress = u'\r...'

            data=self.urlhandle.read( self.oneTimeSize )
       
defGetUrlFileSize(url,proxies={}):
    urlHandler=urllib.urlopen( url,proxies=proxies )
    headers=urlHandler.info().headers
    length=0
    forheaderinheaders:
        ifheader.find('Length') !=-1:
            length=header.split(':')[-1].strip()
            length=int(length)
    returnlength

defSpliteBlocks(totalsize,blocknumber):
    blocksize=totalsize/blocknumber
    ranges=[]
    foriinrange(0,blocknumber-1):
        ranges.append((i*blocksize,i*blocksize+blocksize-1))
    ranges.append(( blocksize*(blocknumber-1),totalsize-1 ))

    returnranges
defislive(tasks):
    fortaskintasks:
        iftask.isAlive():
            returnTrue
    returnFalse

defpaxel(url,output,blocks=6,proxies=local_proxies):
    ''' paxel
    '''
    size=GetUrlFileSize( url,proxies )
    ranges=SpliteBlocks( size,blocks )

    threadname=["thread_%d"%iforiinrange(0,blocks) ]
    filename=["tmpfile_%d"%i