rpdb:q程PDB调试工具Q是对pdb的扩展?nbsp;
在pdb基础上,做了功能加强Q主要特性如下:
1. 兼容pdb一切语法和使用习惯
2. 增加了远E调试功能, 允许你客L通过telnetq接到指定调试端口,q行q程调试
3. 增加了rq/rquit命oQ支持安全退出模式,避免默认的quik会导致pythonE序异常退出的情况
4. 允许多次调试
5. 增加suspend模式Q在启动时强制或者非强制q入断点
rpdb扩展了pdbQ让pdb支持q程调试功能?br />
使用了rpdb的python脚本在远E启动,本地通过telnet方式q接上rpdb提供的调试端口,接下来的操作和本地完全一致?/blockquote>使用说明
- 下蝲
wget https://stonelab.googlecode.com/files/rpdb-0.1.0.tar.gz
有两个文Ӟrpdb.pyQ扩展pdb的类库; example.py 演示E序- 安装
rpdb.py拯到PYTHONPATH卛_Q或者直接拷贝rpdb.py上内容到你的python脚本卛_Q程序非常小巧,30+代码行)- 演示
pdb = Rpdb() # cM于pdb=Pdb()
pdb = Rpdb(8787) # 指定q程调试端口?/span>
pdb.set_trace() #讄断点如example.py中程序:#!/usr/bin/python本地l端输入Q?telnet xxx.xxx.xxx.xxx 8787
from rpdb import Rpdb
from random import randint
from time import sleep
def add(i, j):
r = i + j
return r
def main():
pdb = Rpdb()
# pdb = Rpdb(9999) # debug port:9999
pdb.set_trace()
while True:
i = randint(1,10)
j = randint(1,10)
r = add(i, j)
print r
sleep(1)
if __name__ == '__main__':
main()telnet 127.0.0.1 8787操作和pdb完全一致?/blockquote>
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
> /Users/stone/Tmp/baidu/rpdb/example.py(15)main()
-> while True:
(Pdb) l
10
11 def main():
12 pdb = Rpdb()
13 # pdb = Rpdb(9999) # debug port:9999
14 pdb.set_trace()
15 -> while True:
16 i = randint(1,10)
17 j = randint(1,10)
18 r = add(i, j)
19 print r
20 sleep(1)
(Pdb) n
> /Users/stone/Tmp/baidu/rpdb/example.py(16)main()
-> i = randint(1,10)
(Pdb) b 19
Breakpoint 1 at /Users/stone/Tmp/baidu/rpdb/example.py:19
(Pdb) c
> /Users/stone/Tmp/baidu/rpdb/example.py(19)main()
-> print r
(Pdb) p r
11
(Pdb) q
Connection closed by foreign host.PDB常用命o
命o 介绍 h(elp) command? 输入h或者help 列出pdb支持的所有命令, h command? 介绍指定命o w(here) 列出当前调试所在行Q一般会使用 l(ist) l(ist) [first[, last]] 列出源代码信?/td> s(tep) q入函数?/td> n(ext) 执行下一行代?/td> c(ont(inue)) l箋Q直到遇C一个断?/td> r(eturn) 执行到函Cl束那行 b(reak) 讄断点Q可以是代码行号Q方法名Q?q可以加q入条g tbreak 讄临时断点Q进入一ơ后Q自动消?/td> cl(ear) 取消断点 disable 让断点失?/td> enable 让断点生?/td> ignore 忽略断点n?/td> condition l断Ҏ加条ӞW合条g的才q入断点 j(ump) lineno x指定?/td> a(rgs) 打印函数体参C?/td> p expression 打印变量 pp expression 同上Q打印得漂亮一?/td> ! statement 执行代码Q非常有用,可用来修改变量?/td> q(uit) 退试(pdb的quit很黄很暴力)
BaiduMp3Q基于命令行下的癑ֺMP3歌曲扚w下蝲工具?br />
主要支持功能Q?/p>
Usage: baidump3.py [options]
Options:
-h, --help show this help message and exit
-m MODE, --mode=MODE specifies the command mode
[list|download|multidownload]
-o OUTPUT, --output=OUTPUT
specifies the output dir for download
-p PAGE, --page=PAGE specifies the list page
-k KEY, --key=KEY specifies the mp3 keyworld
-f FROMPAGE, --from=FROMPAGE
specifies the from page for multidownload
-t TOPAGE, --to=TOPAGE
specifies the end page for multidownload
通过-m list指定为搜索模?-k参数指定搜烦关键词,-p关键词指定分页面号Q默认一|C?0条数据?br />
比如Q?/baidump3.py -m list -k 70?-p 2
效果Q?pre style="font-size: 12px; padding: 0.5em; overflow: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; background-color: #eeeeee;">./baidump3.py -m list -k 70?/span> -p 2
Total: 1000 Page:2
1007797 刘若?/span> 为爱痴狂
2067170 姜育?/span> 别让我一个h?/span>
209442 彭佳?/span> 相见恨晚
2121730 杨钰?毛宁 心雨
216206 许美?/span> 蔓g
226444 陈淑?/span> ?/span>
253833 张学?/span> U意?/span>
274172 张学?/span> 三天两夜
580824 孟庭?/span> 伤了你的心的我伤?/span>
582858 莫文?/span> 电台情歌
650924 姜育?/span> 其实我真的很在乎
7274415 满文?/span> 我需要你
7277793 林志?/span> 单n情歌
7280177 林志?/span> Mh
7302437 李寿?/span> 张三的歌
844889 陈淑?/span> 光飞舞
1039139 王菲 Ҏ受伤的女?/span>
1243712 |大?/span> 恋曲1980
2076242 李宗?/span> 我是一只小鸟
2121739 杨钰?/span> 轻轻的告诉你
通过-m download指定Z载模?-k参数指定下蝲歌曲ID?-o参数指定下蝲路径Q默认ؓ当前目录?br />
比如Q?/baidump3.py -m download -k 1007797 -o ~/Tmp/
效果Q?pre style="font-size: 12px; padding: 0.5em; overflow: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; background-color: #eeeeee;">Downloading >>> 为爱痴狂.mp3
通过-m multidownload指定为批量下载模?-k参数指定歌曲关键词, -o参数指定下蝲路径Q默认位为当前目录)Q?-f参数指定下蝲开始页面(默认为第一)Q?-t参数指定下蝲l束面Q默认ؓ搜烦到的最后一)
比如Q?/baidump3.py -m multidownload -k 70?-o ~/Tmp/baidu -f 2 -t 3
效果Q?pre style="font-size: 12px; padding: 0.5em; overflow: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; background-color: #eeeeee;"> MultiDownloading Page 2
Downloading >>> 为爱痴狂.mp3
Downloading >>> 别让我一个h?mp3
Downloading >>> 相见恨晚.mp3
Downloading >>> y冮z?mp3
Downloading >>> 蔓g.mp3
Downloading >>> ?mp3
Downloading >>> U意?mp3
Downloading >>> 三天两夜.mp3
Downloading >>> 伤了你的心的我伤?mp3
Downloading >>> 电台情歌.mp3
Downloading >>> 其实我真的很在乎.mp3
Downloading >>> 鎴戦渶瑕L.mp3
Downloading >>> 单n情歌.mp3
Downloading >>> Mh.mp3
Downloading >>> 张三的歌.mp3
Downloading >>> 光飞舞.mp3
Downloading >>> Ҏ受伤的女?mp3
Downloading Fail.
Downloading >>> 我是一只小鸟.mp3
Downloading >>> 轻轻的告诉你.mp3
MultiDownloading Page 3
Downloading >>> 孟婆?mp3
Downloading >>> 情书.mp3
Downloading >>> 榄?mp3
Downloading >>> 选择.mp3
Downloading >>> l束不是我要的结?mp3
Downloading >>> 鍛抽?mp3
Downloading >>> 来生~?mp3
Downloading >>> 相思风雨中.mp3
Downloading >>> 你我的爱只能擦肩而过.mp3
Downloading >>> 忘情?mp3
Downloading >>> 爱如潮水.mp3
Downloading >>> 特别的爱l特别的?mp3
Downloading >>> 千千阙歌.mp3
Downloading >>> 涛声依旧.mp3
Downloading >>> Hotel California.mp3
Downloading >>> Roll Away The Stone.mp3
Downloading >>> Peace Train.mp3
Downloading >>> Have You Never Been Mellow.mp3
Downloading >>> Hot Stuff.mp3
Downloading >>> Rock The Boat.mp3备注Q?有小概率会出Cؕ码,以及小概率出现下蝲p|?/blockquote>
CPU | 700 MHzQ?ARM1176JZF-S |
GPUQ显卡) | Broadcom VideoCore? IVQOpenGL ES 2.0Q?1080p30 h.264/MPEG-4 AVC high-profile decoder |
MEMQ内存) | 512M |
分L?/td> | 1080P |
输出接口 | 1*SD?2*USB?1*音频?1*HDMI?1*|卡 |
寸 | 85.6 x 53.98 x 17mm Q一张信用卡大小Q?/td> |
h | $35 |
好吧Q一hȝ下Raspberry Pi的优势吧
Omxplayer
play | 播放Q可以指定播攑ֈ表中M一个资?/td> |
pause | 暂停播放 |
resume | 恢复播放 |
stop | 停止播放 |
lseek | 快退Q?快退30U, 参数为True的话Q快退10分钟 |
rseek | 快进Q?快进30U,参数为True的话Q快q?0分钟 |
prev | 播放上一?/td> |
next | 播放下一?/td> |
set_playlist | 讄播放列表 |
add_playitem | d多媒体资源到播放列表? 参数?('url', 'name') 资源地址Q?资源昄?/td> |
del_playitem | 清空播放列表 |
sort_playitem | 播放列表排序 |
set_dev | 讄输出讑֤Q?hdmi接口 或?本地音频接口 |
set_loop | 讄播放模式Q顺序,循环 |
get_info | 获取播放器信息,如播攄态等 |
LocalFile?
get_mediapath | 获得多媒体文件根目录路径 |
list | 获取一个目录下的所有资?/td> |
list_all | 递归获取一个目录下的所有资?/td> |
Config
load | 获取raspctl.cnf中的配置信息 |
save | 更新raspctl.cnf中的配置信息 |
MediaUrl?
get_urls | 获取|站url对应的真实视屏url地址信息Q?fmt=high 获取高清视屏地址 |
class Foo:
@classmethod
def hello(cls, arg1, arg2):
return {msg: 'Hello Ajax[%s %s]' % (arg1, arg2)}
Ajax服务地址为:http://xxx.xxx.xxx.xxx:8000/api?data={"name":"Foo.hello", "args":["stone2083", "connie2083"]} 服务信息为:
{
status: "Success",
message: "Success",
api: {
args: [ ],
name: "Foo.hello"
},
result: {
msg: "Hello Ajax[stone2083 connie2083]"
}
}
youku --> 插g名字
__init__.py --> 插gE序
index.html --> 插g模板 【可选择?/span>
init.py 内容为:
from rasplib import Plugin
urls = (
'/', 'Index',
)
# 必须创徏plugin实例Q参数分别ؓ插g名,作者名Q版本号Q?支持功能的urls
#其中Qplugin中包含RaspCTLcd的所有方法,可直接调?/span>
plugin = Plugin('youku','stone2083', '0.1', urls)
#web.py写法Q插件规范ƈ不引入新的学习成本?/span>
class Index:
def GET(self):
return 'youku-NotSupported.' #可以直接输出
#return plugin.render.index() #可以渲染某个模板信息
#创徏caU钥
openssl genrsa -out ca.key
#创徏证书h文gQ?span class="Apple-style-span" style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">Certificate Secure RequestQ?br />openssl req -new -key ca.key -out ca.csr
openssl genrsa -out server.key
#创徏服务器证?br />
openssl ca -in server.csr -cert ca.crt -keyfile ca.key -out server.crt
PFX证书转换
#pfx格式证书导出成pem格式证书
openssl pkcs12 -in jinli.pfx -nodes -out jinli.pem
#导出U钥
openssl rsa -in jinli.pem -out jinli.key
#导出证书Q公?br />
openssl x509 -in jinli.pem -out jinli.crt
HTTPSConnection不理解的地方
服务?/td> | q发数量 | TPS | q_响应旉 |
Tomcat6 + JDK6 | 50 | 6519.29 | 7.67MS |
CherryPy + Webpy | 25 | 1328.56 | 18.82MS |
CherryPy + Webpy | 30 | Fail | Fail |
Lighttpd + Flup(FCGI) + Webpy | 25 | 1535.98 | 16.28MS |
Lighttpd + Flup(FCGI) + Webpy | 50 | 1546.11 | 32.339MS |
好处Q?/span>
1. 一个项目、小需求,需要绑定的HostsQ只需要一?/span>Hosts信息卛_。不必每个用戯行管理各自电脑的Hosts。达C人配|,多h使用的目?/span>
2. l定?/span>HostsQ支持通配W。方便类似旺铺域名的需求,只需要配|一个带通配W的域名卛_
3. 要在不同目Q小需求切换不同的HostsӞ只需要轻M点,方便
4. 要想使用代理服务器,只需要本?/span>DNS讄一下即可,方便
5. 本机Hosts配置优先
如何使用Q?/span>Q以10.20.131.207环境介绍Q?/span>备注Q公司内部环境,外部无法讉KQ如果需要,误行搭?/span>
1. 登陆DNS后台理面URLQ?/span>http://10.20.131.207:8000/Q点?/span>Add
2. d一个项目的Hosts信息Q点L?/span>
3. ?/span>Hosts信息面Q点?/span>assignQ绑定自q?/span>IP和某?/span>Hosts的关?/span>
4. IP List面上,昄了不?/span>IP?/span>Hosts兌的信?/span>
5. 本机电脑的DNS服务器设|成DNS代理服务器即可(10.20.131.207Q?/span>-- 只需要一ơ操作即可,以后一直能?/span>
左图?/span>windows配置Q右图ؓlinux配置
此时Q你讉K域名Q如果在2011tp hosts中,则直接返?/span>Hosts中的IP;反之Q则q回真实IP?br />
如何启动服务
1. 启动DNS代理服务器服?br />1.1 cd dns/dns
1.2 vi settings.py 修改配置信息
1.3 python -u main.py
2. 启动DNS BackOffice服务
2.1 cd dns/config
2.2 vi settings.py 修改配置信息
2.3 python -u manage.py runserver
软g下蝲Q?a title="DNS Proxy Server" href="/Files/stone2083/python/dns.zip">DNS Proxy Server
============================================================================================
Z满“邪恶”的h们能更方便的使用q个软gQ貌似邪恶的人特别看重这个Y仉配W的功能Q具体邪恶在哪里Q我不具体描qCQ给?a title="链接">链接Q,我特意写了一个standalone的版本:
1. 去除无用的backoffice功能
2. 去除通过事g机制reload hosts文g的功?br />3. 去除复杂的settings配置文gQ改用简单的命o行方?br />4. Ҏ为windows用户制作了一个exe文gQ可以直接?br />
linux用户使用ҎQ?br />python standalone.py -s xxx.xxx.xxx.xxx (上dns地址)
python standalone.py -s xxx.xxx.xxx.xxx -f /etc/hosts2 (指定hosts文gQ默认是/etc/hosts)
windows用户使用ҎQ进入distQexe发布目录Q?br />dns.exe -s xxx.xxx.xxx.xxx (上dns地址)
dns.exe -s xxx.xxx.xxx.xxx -f d:/hosts Q指定hosts文gQ默认是c:/windows/system32/drivers/etc/hostsQ?br />
对于不放心用exe的客h_可以q入dns目录Q通过py2exe工具自行发布成exe软gQ方法如?br />python setup.py py2exe
standalone版本下蝲
前言
此文摘自2011q??3日邮件分享,为《Hostsl定新思\之HTTP代理》箋?/span>
电视有箋?/span>,电媄也有l集,Hostsl定思\同样有箋?/span>.
我们先用一句话来回下,上集中关?/span>Hostsl定的思\:
原理:利用Http代理的方?/span>,分散在各个客户端的Hosts
优点:集中理
~点:一?/span>Http代理服务?/span>,只能l定一l?/span>Hosts信息
(详细内容,误之前的邮?/span>)
在当时描q方案邮件的时?/span>,也意识到了方案存在的不,所以一?wbr>在思考改q方?/span>(详见之前邮g中最后一?/span>—改进Ҏ思\).
l过一D|间的思?/span>,改进Ҏ有了大概的雏?/span>: 之前的HTTP代理Ҏ 替换?/span> DNS代理Ҏ
俗话说得?/span>:有图有真?/span>.先脓上一张架构图,之后再用文字慢慢?wbr>?/span>
架构中核心组件是:DNS BackOffice服务?/span> ?/span>DNS代理服务?/span>
DNS BackOffice服务器的作用?/span>:
1. 开?/span>/试理员通过BackOffice服务l护各自目的绑
2. 开?/span>/试人员通过BackOffice服务,告知需要哪个项?wbr>的绑定信?/span>,BackOffice服务之持久?/span>
DNS代理服务器的作用?/span>:
1. 拦截Domain Name的解?/span>.通过来源IP判断需要绑定的Hosts信息,?wbr>q?/span>File/DB得到对应?/span>IP,通过DNS协议q回 (图中 U色实线 ?/span> 黑色实线)
2. 如果不在l定之列,则请求上U?/span>DNS服务?/span>,q回?/span>Respon
此方案的优势:
1. 本地Hostsl定优先.
只要本地Hosts有绑?/span>IP,则不会请?/span>DNS代理服务?/span>.?wbr>h本地Hosts文g.能满个性化需?/span>.
2. DNS代理服务器支持多U绑定方?/span>,如通配W?/span>,正则{?/span>
对于目前旺铺,完全可以使用通配W?/span>,?/span> *.cn.alibaba.com,化配|工作量
3. 操作?/span>
只要?/span>DNS服务器设|成DNS代理服务?/span>IP卛_ (附录中有详细说明)
4. 有效利用现有成果
目前试同学已经集中l护?/span>Hostsl定信息,只要部vDNS
5. DNS代理服务器代码轻量小?/span>,易于修改扩展
目前一共只?/span>212行代?/span>,其中DNS协议部分130?/span>,DNS
附录
I. 客户端如何设|?/span>DNS服务?/span>
Windows用户,见图:
Linux用户,见图:
修改 /etc/resolv.conf文g卛_
前言
现状
qx开?试,功能预演阶段,Z能够正常讉K应用,需要做H
用一张图,来描qC目前我们的方?
如果站在面向对象~程的角?来思考这张图,我们会发?
1. 利用客户端本地Hostsl定来实?q且客户端数量不可控—?wbr>用客L解决需?但客Ll护不在可控范围?/p>
2. Hostsl定是非怸E_?#8212;需求易?/p>
q样的设?q反?#8221;装变化”的设计原?故一旦有变动,l护
新方案思\
按照”装变化”的设计原?我们应该把”域名l定”q个易变
看上?我们会发?DNS的职责就是做域名解析?q且DNS
于是W一反应,我们可以使用内部域名解析服务器来l定q些域名.
但是问题又来?DNS来做试环境域名解析,太重量?同一
既然DNS上做文章不可?又需要统一理的地?那么我们只能
同样,我们利用一张图,来描qC整体架构.
与上囄?此图多了一?#8221;代理服务?#8221;的概?即Hostsl?wbr>定动作在此概念上完成.
程如下:
1. 客户端浏览器讄代理服务?所有请求发送到代理服务器上
2. 代理服务器检查本地Hostsl定,如绑定则直接解析,反之q入
3. 代理服务器通过内部域名服务器解析域?/p>
4. 代理服务器发送请求到试服务器上,q且响应内容返回给客户?/p>
具体试性实施方案如?在XX目q程中有成功案例)
1. 利用squid搭徏代理服务?nbsp;(代理地址: 10.20.131.207:3128)
备注:
Squid配置介绍见附录I
2. 览器配|代?/p>
全局代理: 代理服务器上,直接填写 10.20.131.207 3128
局部代? 通过pac实现,选择”使用自动配置脚本”,脚本格式内容如下:
备注:
Pac脚本详细介绍见附录II
Z防止配|工作带lPD,销售等,我们可以使用配置好的l色
推荐一?GreenBrowser: http://www.morequick.com/indexen.htm
IE具体配置,见下?
Firefox同样支持代理和pac脚本
Chrome需要安装proxy switchy插g来支?
改进Ҏ思\
上述的方案中,有两个比较大的缺?/p>
1. 代理服务器没有多实例概念
代理服务器通过hostsl定.hosts是全局性的,意味着一
2. Ҏ化需求不能满?/p>
l定全在代理服务器上做了,客户端本C性化需求无法支?/p>
所?我理想中整体架构是这L,见图:
1. 优先查看本地hosts文g
2. 代理服务器支持多实例部v,不同实例有不同的hostsl定配置
目前具体实现Ҏ,q在构思中.Ƣ迎大家提供实现Ҏ思\.
附录I
Squid权威指南(中文?: http://home.arcor.de/pangj/
附录II
Pac介绍: http://en.wikipedia.org/wiki/
Pac函数介绍: http://findproxyforurl.com/