wxPython写了个计算器,练习wxPython界面布局,功能很强大,支持无限数位的运算,呵呵:-)
wxPython写界面挺顺手的,另外推荐一个不错的wxPython的教程:
http://www.zetcode.com/wxpython
问题:
执行命令前暂时回home目录,执行后跳回来
解法:
1.
-
(cd ~; ls; )
使用子shell的方式去执行命令;
把这行
gs.AddMany( [b_cls,b_bck,t_blank,b_close,b_7,b_8,b_9,b_div,b_4,b_5,b_6,b_mul,b_1,b_2,b_3,b_minus,b_0,b_dot,b_equal,b_plus, ])
进行替换,每一个元素替换为类似(b_cls,0,EXPAND)这样
解法1.
-
sed 's/[b|t]_[^,]*,/(&0,EXPAND)/g'
如果使用
-
's/[b|t]_.*?,/(&0,EXPAND)/g'
则不能得出正确的结果,因为sed不支持.*?这样的非贪婪匹配;解法中使用[^,]避免了贪婪匹配。
再看一正则表达式str="uid=100(guest) gid=100(others) groups=10(users),11(floppy)"
输出guest:echo $str|sed 's/[^(]*(\([^)]*\)).*/\1/'
输出各括号里的:echo $str | awk -F'[()]' '{print $2" "$4" "$6" "$8}'
BTW:最近在使用delicious时发现添加在Opera工具栏中的“Bookmark on Delicious”挺方便:
,看了下这个工具栏按钮的属性,发现其实就是一段JS代码,就修改了一下做了个google当前网站的小工具:
-
javascript:(function(){s=window.location.href.split("//")[1].split("/")[0];f='http://www.google.com/search?hf=en&newwindow=1&q=+'+encodeURIComponent('site://'+s);a=function(){if(!window.open(f,'deliciousuiv5','location=yes,links=no,scrollbars=no,toolbar=no'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})()
百度搜藏有不少问题,其中一个就是不能导出。
因为电脑丢了以前浏览器里的书签都没了,不过在百度测试搜藏的时候我用自己浏览器里的书签试过,刚好里面还有旧一点的书签,今天突然想起这事打算把把书签导出来,没想到竟然没有这个功能,今天没什么事就自己写了个工具,可以导出百度的搜藏,只需要手动确定用户名,程序里可以指定导出时使用的标签,因为没有登录,所以需要先把你所有的书签设置为公开:
-
[cocobear@cocobear cang]$ cat cang.py
-
[cocobear@cocobear cang]$ cat cang.py
-
#!/usr/bin/env python
-
#encoding=utf-8
-
#Using GPL v2
-
#Author: cocobear.cn@gmail.com
-
-
import urllib2,urllib,cookielib,httplib
-
import sys,re
-
import gzip,StringIO
-
-
user = "cocobear_cn" #user whose bookmarks you want get
-
tag = "from cang2html" #tag that you want to mark
-
id = 0
-
def cang2html(name,url,description):
-
global user
-
file_name = user+".html"
-
f = open(file_name,"a")
-
f.write("\t<dt><a HREF=\""+url+"\">"+name+"</a>\n")
-
if description:
-
f.write("\t<dd>"+description+"</dd>\n")
-
f.close()
-
-
def cang2adr(name,url,description):
-
global user,id
-
file_name = user+".adr"
-
f = open(file_name,"a")
-
f.write("#URL\n")
-
f.write("\tID="+str(id)+"\n")
-
f.write("NAME="+name+"\n\t"+"URL="+url+"\n")
-
if description:
-
f.write("\tDESCRIPTION="+description+"\n")
-
f.close()
-
id+=1
-
-
def process_data(data):
-
-
result = re.findall("((?:http|ftp|https|file)://.*)\" target.*lnk\d+\">(.+?).*dc\d+\">(.*?)",data)
-
#print len(result)
-
for url,name,description in result:
-
#print name,url,description
-
cang2html(name,url,description)
-
cang2adr(name,url,description)
-
-
def get_data(user,opener,page):
-
url = "http://cang.baidu.com/"+user+"/page/"+str(page)
-
gziped_data = opener.open(url).read()
-
gziped_stream = StringIO.StringIO(gziped_data)
-
data = gzip.GzipFile(fileobj=gziped_stream).read()
-
return data.decode('gbk').encode('utf-8')
-
-
-
def init():
-
httplib.HTTPConnection.debuglevel = 1
-
cookie = cookielib.CookieJar()
-
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
-
-
exheaders = [("User-Agent","Opera/9.27 (X11; Linux x86_64; U; en)"),("Connection","Keep-Alive"),("Referer","http://cang.baidu.com"),("Accept","text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1"),("Accept-Charset","iso-8859-1, utf-8, utf-16, *;q=0.1"),("Cookie2","$Version=1"),("Accept-Encoding","deflate, gzip, x-gzip, identity, *;q=0"),]
-
-
opener.addheaders = exheaders
-
urllib2.install_opener(opener)
-
return opener
-
-
-
def create_adr_file(name):
-
global tag,id
-
-
f = open(name,"w")
-
f.write("""Opera Hotlist version 2.0
-
Options: encoding = utf8, version=3
-
""")
-
f.write("#FOLDER\n")
-
f.write("\tID="+str(id)+"\n")
-
id+=1
-
f.write("\tNAME="+tag+"\n")
-
f.close()
-
-
def create_html_file(name):
-
global tag
-
-
f = open(name,"w")
-
f.write("""<!DOCTYPE NETSCAPE-Bookmark-file-1>
-
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
-
<!--This is an automatically generated file.
-
It will be read and overwritten.
-
Code write by cocobear with Python
-
Edit the file carefully!-->
-
<title>Generated by cang2html</title>
-
""")
-
f.write("<h1>"+tag+"</h1>\n")
-
f.write("<dl><p>\n")
-
f.close()
-
-
def end_html_file(name):
-
-
f = open(name,"a")
-
f.write("</p></dl><p>\n")
-
f.close()
-
-
def main(argv=None):
-
global user,tag
-
-
opener=init()
-
data = get_data(user,opener,1)
-
match = re.search("(共(\d+)条)",data)
-
if match:
-
total = int(match.group(1))
-
else:
-
print "User has no bookmars!"
-
return 1
-
print "Total %d bookmarks" % total
-
print "Start getting ......"
-
-
create_html_file(user+".html")
-
create_adr_file(user+".adr")
-
-
process_data(data)
-
if total % 10 != 0:
-
for i in range(1,10):
-
if (total+i) % 10 == 0:
-
total+=i
-
total/=10
-
-
for i in range(2,total+1):
-
data = get_data(user,opener,i)
-
#print "process %d" % i
-
process_data(data)
-
-
end_html_file(user+".html")
-
#end_adr_file(user+".adr")
-
-
print "Success!\nLook %s.html for your bookmarks" % user
-
print "Success!\nLook %s.adr for your bookmarks" % user
-
-
-
if __name__ == "__main__":
-
sys.exit(main())
该程序可以把百度搜藏导出为Opera使用的adr格式书签,以及html格式的书签,可以方便导入Opera浏览器,以及delicious(de.licio.us)等网上书签。
代码下载
?: 运算符表示“查找子模式的匹配字符串,但不包括反向引用中的匹配结果”
.*是贪婪匹配
.*?非贪婪匹配
改了info域名后网站以前里很多页面里有cocobear.cn,连一些图片也显示不出来,今天就处理了一下:
把网站里一些文件做替换,先备份一下:
grep cocobear.cn ./cocobear.info/ -R -l --binary-files=without-match|xargs -i cp --parents {} bk/
然后全部替换:
grep cocobear.cn ./cocobear.info/ -R -l --binary-files=without-match | xargs sed -i 's/cocobear\.cn[^@]/cocobear\.info/g'
剩下就是数据库里的内容了,主要是wp_posts表中的post_content字段,还有guid字段,还有wp_comments中的comment_author_url,wp_postmeta中的meta_value;
操作的命令是:
mysql> update wp_posts set post_content=replace(post_content,"http://www.cocobear.cn","http://cocobear.info");
当然在进行数据库操作时一定要记得先备份一下:
mysqldump -h mysql.1g50.cn -u cocobear -p cocobear > 0808151.sql
使用 mysqldump -h mysql.1g50.cn -u cocobear -p cocobear < 0808151.sql恢复似乎不太好,还是进mysql里使用source ~/0808151.sql进行恢复。
名称 : crontab
使用权限 : 所有使用者
使用方式 :
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
参数 :
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
例子 :
#每天早上7点执行一次 /bin/ls :
0 7 * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"
注意 :
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可
例子2 :
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
范例
$crontab -l 列出用户目前的crontab.
来自:http://h1yn.itpub.net/post/2084/222108
很多时候我们会遇到类似这样的字符串“%E5%8F%AF%E5%8F%AF%E7%86%8A”,如果你稍有经验就应该知道这是URL编码的汉字.
URL编码的产生是因为在URL只有少量的字符可以被使用:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
这里有一篇介绍URL编码的文章。
为了方便把“%E5%8F%AF%E5%8F%AF%E7%86%8A”这样的字符串转换为我们可读字符串,我写了这个小工具;同时可以做反向的转换。例如把"可可熊"转换为“%E5%8F%AF%E5%8F%AF%E7%86%8A”。
做个示例,使用该程序在命令行下获取“\”的URL编码:
[cocobear@cocobear sn]$ ./url2read.py -r ""'\'""
GBK:
%5C
UTF8:
%5C
注意这里由于存在shell的解释,需要这样把“\”围起来。
这个脚本可以很好的在Linux与Windows下使用,贴代码:
-
#!/usr/bin/env python
-
#coding: utf-8
-
#author: cocobear
-
#version: 0.1
-
-
import urllib
-
import sys,getopt,re
-
__doc__ = """Usage:
-
./url2read.py -h
-
./url2read.py -r ftp://cocobear.info/中国
-
./url2read.py http://cocobear.info/%E4%B8%AD%E5%9B%BD
-
"""
-
-
def url2read(s):
-
-
s = urllib.unquote(s)
-
try:
-
s = s.decode('utf-8')
-
except UnicodeDecodeError:
-
s = s.decode('gbk')
-
finally:
-
print s.encode(sys.stdin.encoding)
-
-
-
def read2url(s):
-
head = ''
-
g = re.search('^(http|ftp://)(.*)',s)
-
if g:
-
head = g.group(1)
-
s = g.group(2)
-
gbk = urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
-
-
utf8 = urllib.quote(s.decode(sys.stdin.encoding).encode('utf-8'))
-
if gbk == utf8:
-
print head+gbk
-
return 0
-
else:
-
print "UTF8:\n"+head+utf8
-
print "GBK:\n"+head+gbk
-
return 0
-
-
def main(argv=None):
-
f = False
-
if len(sys.argv) <2:
-
print __doc__
-
return 1
-
try:
-
opts,args = getopt.getopt(sys.argv[1:],"h,r",["help","reverse"])
-
except getopt.error,msg:
-
print msg
-
print __doc__
-
return 1
-
for o,a in opts:
-
if o in ("-h","--help"):
-
print __doc__
-
return 0
-
if o in ("-r","--reverse"):
-
f = True
-
for arg in args:
-
if f:
-
return read2url(arg)
-
else:
-
return url2read(arg)
-
-
-
if __name__ == "__main__":
-
sys.exit(main())
在网页里查话费很麻烦,又要输入验证码,好多时候还会出现:“为了更好保护您的手机信息需再登录验证”,查个余额也要点好多下,就写了这个小工具,因为要识别验证码所以就有了前面那篇文章,其实难度也就在前面了,剩下的用Python来做很是方便;
代码就不贴了,使用一个配置文件sn.conf来保存用户名,密码;
顺便把这个python脚本在Windows下打包了一下,使用py2exe,还挺方便,就是生成的文件有点大,3M多,py2exe使用起来还是很方便,写个setup.py就行了:
-
from distutils.core import setup
-
import py2exe
-
import sys
-
-
includes = ["encodings", "encodings.*"]
-
if len(sys.argv) == 1:
-
sys.argv.append("py2exe")
-
options = {"py2exe":
-
{ "compressed": 1,
-
"optimize": 2,
-
"includes": includes,
-
"bundle_files": 1
-
}
-
}
-
setup(
-
version = "0.1.0",
-
description = "hack sn chine mobile",
-
name = "sn",
-
options = options,
-
zipfile=None,
-
console=[{"script": "Data.py","script": "Pic_Reg.py","script": "sn.py", "icon_resources": [(1, "sn.ico")] }],
-
-
)
用命令python setup.py就可以生成一个独立的exe文件。
代码
BWT:还以为电脑丢了以前写的那个mario代码也没了,不过发现俺以前已经传到我的网站里了,是个打包好的Windows版:
不过还是有不少东西丢了,包括写的一些代码。
Heartbeat是http://linux-ha.org中HA项目的核心,HA是(High Availability)的缩写;简单来说就是为了提供高可靠的应用服务,例如拿两来机子来做HA,提供WEB服务,一台机子为主服务器平时提供WEB服务,HA就是保证在主服务器出现故障(例如掉电)的时候另一台机子可以立刻接手继续提供WEB服务,从而使用户觉得服务未曾中断;实际应用中可能使用更多的机子组成集群。
Heartbeat可以使用串口或者以太网来实现对主机的监测,这里使用的是以太网,在两台机器上分别配双网卡,用一根双绞线把两台机器连接在一起,另外两个网卡连到路由;配置是:
f801(主机名;使用这台作为主服务器):
eth0: 192.168.1.110
eth1: 10.0.0.1
f802:
eth1: 192.168.1.111
eth2: 10.0.0.2
网络配置好后测试无误后再检查两台机器上的WEB服务是否可以正常使用;一切都正常后使用yum安装Heartbeat:
yum install heartbeat
安装好heartbeat后开始配置,三个主要配置文件都在: /usr/share/doc/heartbeat-2.1.3/下面,需要我们手工修改后拷贝到/etc/ha.d/中(两台服务器使用的脚本基本一样)。
编辑authkeys文件,下面的配置使用了sha1作为认证方式(这里需要注意的是该文件的权限必须被设置为600):
auth 2
#1 crc
2 sha1 HI!
#3 md5 Hello!
编辑ha.cf,注释下掉以下内容:
keepalive 1 ##设定心跳(监测)时间时间为1秒
warntime 10 ##设定警告时间
deadtime 30 ##设定确定主机宕机时间
initdead 120 ##第一宕机时间
ucast eth1 10.0.0.2 ##使用eht1做心跳监测 也就是连接两PC的网卡
udpport 694 ##使用udp端口694 进行心跳监测
node f801 ##节点1,必须要与 uname -n得到的结果一致。
node f802 ##节点2
第二台服务器由于网卡是eth(192.*)1,eth2(10.*),所以相应的配置文件中ucast 需要使用eth2。
编辑haresources,添加以下内容:
f801 192.168.1.118 httpd
表示主服务器使用192.168.1.118作为WEB服务的IP,f801为主服务器。
配置好后在主服务器上启动Heartbeat:
service heartbeat start
出错的话一般是配置文件的问题,根据提示修改就可以了;Heartbeat会自动根据haresource配置文件启动相应的服务程序。
然后在另一个台器上启动Heartbeat;
完成后可以使用tcpdump来测试两台机器间的心跳:
[root@f801 ~]# tcpdump -i eth0 -p udp port 694
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:43:46.431448 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 219
11:43:46.433968 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 216
11:43:47.431456 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 216
11:43:48.432516 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 216
如果这里出问题的话很有可能是防火墙的问题,或者是配置文件里ucast里的设置,需要仔细检查。
最后就可以做测试,关闭主服务器,根据配置文件里的响应时间(),服务器f802会接管主服务器的任务。
参考文章:
http://www.bitscn.com/linux/network_manage/200805/140501_3.html
http://www.xxlinux.com/linux/article/network/app/20070329/8009.html
以前写过一个刷校内网的人气的工具,Java的(以后再也不行Java程序了),里面用到了验证码识别,那段代码不是我自己写的:-) 校内的验证是完全单色没有任何干挠的验证码,识别起来比较容易,不过从那段代码中可以看到基本的验证码识别方式。这几天在写一个程序的时候需要识别验证码,因为程序是Python写的自然打算用Python进行验证码的识别。
以前没用Python处理过图像,不太了解PIL(Python Image Library)的用法,这几天看了看PIL,发现它太强大了,简直和ImageMagic,PS可以相比了。(这里有PIL不错的文档)
由于上面的验证码是24位的jpeg图像,并且包含了噪点,所以我们要做的就是去噪和去色,我拿PS找了张验证码试了试,使用PS滤镜中的去噪效果还行,但是没有在PIL找到去噪的函数,后来发现中值过滤后可以去掉大部分的噪点,而且PIL里有现成的函数,接下来我试着直接把图像转换为单色,结果发现还是会有不过的噪点留了下来,因为中值过滤时把不少噪点淡化了,但转换为音色时这些噪点又被强化显示了,于是在中值过滤后对图像亮度进行加强处理,然后再转换为单色,这样验证码图片就变得比较容易识别了:


上面这些处理使用Python才几行:
-
im = Image.open(image_name)
-
im = im.filter(ImageFilter.MedianFilter())
-
enhancer = ImageEnhance.Contrast(im)
-
im = enhancer.enhance(2)
-
im = im.convert('1')
-
im.show()
接下来就是提取这些数字的字模,使用shell脚本下载100幅图片,抽出三张图片获取字模:
-
#!/usr/bin/env python
-
#encoding=utf-8
-
-
import Image,ImageEnhance,ImageFilter
-
import sys
-
-
image_name = "./images/81.jpeg"
-
im = Image.open(image_name)
-
im = im.filter(ImageFilter.MedianFilter())
-
enhancer = ImageEnhance.Contrast(im)
-
im = enhancer.enhance(2)
-
im = im.convert('1')
-
#im.show()
-
#all by pixel
-
s = 12 #start postion of first number
-
w = 10 #width of each number
-
h = 15 #end postion from top
-
t = 2 #start postion of top
-
-
im_new = []
-
#split four numbers in the picture
-
for i in range(4):
-
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
-
im_new.append(im1)
-
-
f = file("data.txt","a")
-
for k in range(4):
-
l = []
-
#im_new[k].show()
-
for i in range(13):
-
for j in range(10):
-
if (im_new[k].getpixel((j,i)) == 255):
-
l.append(0)
-
&nb
