﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-stone2083-随笔分类-python</title><link>http://www.blogjava.net/stone2083/category/42431.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 30 Mar 2018 15:06:00 GMT</lastBuildDate><pubDate>Fri, 30 Mar 2018 15:06:00 GMT</pubDate><ttl>60</ttl><item><title>将图片转成HTML格式--原理&amp;代码</title><link>http://www.blogjava.net/stone2083/archive/2013/12/20/407809.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Fri, 20 Dec 2013 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/12/20/407809.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/407809.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/12/20/407809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/407809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/407809.html</trackback:ping><description><![CDATA[之前的文章，因为贴了效果图，导致无法编辑。<br />
<div>@see http://www.blogjava.net/stone2083/archive/2013/12/20/407807.html</div>
<br />
<h1>
原理</h1>
使用table,tr/td作为一个像素点，画点。<br />
<img src="http://www.blogjava.net/images/blogjava_net/stone2083/misc/img2html.png" width="800" height="250" alt="" /><br />
<br />
<br />
<h1>
代码</h1>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">import</span>&nbsp;sys,&nbsp;optparse,&nbsp;Image<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;TABLE=<span style="color: #800000; ">'</span><span style="color: #800000; ">&lt;table&nbsp;id="image"&nbsp;border="0"&nbsp;cellpadding="0"&nbsp;cellspacing="0"&gt;%s&lt;/table&gt;</span><span style="color: #800000; ">'</span><br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;TR=<span style="color: #800000; ">'</span><span style="color: #800000; ">&lt;tr&gt;%s&lt;/tr&gt;</span><span style="color: #800000; ">'</span><br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;TD=<span style="color: #800000; ">'</span><span style="color: #800000; ">&lt;td&nbsp;width="1px;"&nbsp;height="1px;"&nbsp;bgcolor="%s"/&gt;</span><span style="color: #800000; ">'</span><br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;rgb2hex(rgb):<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">#{:02x}{:02x}{:02x}</span><span style="color: #800000; ">'</span>.format(rgb[0],rgb[1],rgb[2])<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;get_image(name,&nbsp;thumbnail=1):<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(thumbnail&nbsp;&gt;=&nbsp;1&nbsp;<span style="color: #0000FF; ">or</span>&nbsp;thumbnail&nbsp;&lt;=&nbsp;0):&nbsp;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Image.open(name)<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>:<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;Image.open(name)<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;img.resize((int(img.size[0]&nbsp;*&nbsp;thumbnail),int(img.size[1]&nbsp;*&nbsp;thumbnail)))<br />
<span style="color: #008080; ">17</span>&nbsp;<br />
<span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;convert(img):<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trs&nbsp;=&nbsp;[]<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;height&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;xrange(img.size[1]):<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tds&nbsp;=&nbsp;[]<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;width&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;xrange(img.size[0]):<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tds.append(TD&nbsp;%&nbsp;rgb2hex(img.getpixel((width,&nbsp;height))))<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trs.append(TR&nbsp;%&nbsp;(<span style="color: #800000; ">''</span>.join(tds)))<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;TABLE&nbsp;%&nbsp;(<span style="color: #800000; ">''</span>.join(trs),)<br />
<span style="color: #008080; ">26</span>&nbsp;<br />
<span style="color: #008080; ">27</span>&nbsp;parser&nbsp;=&nbsp;optparse.OptionParser(<span style="color: #800000; ">'</span><span style="color: #800000; ">Usage:&nbsp;%prog&nbsp;[options]&nbsp;image</span><span style="color: #800000; ">'</span>)<br />
<span style="color: #008080; ">28</span>&nbsp;parser.add_option(<span style="color: #800000; ">'</span><span style="color: #800000; ">-c</span><span style="color: #800000; ">'</span>,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">--compress</span><span style="color: #800000; ">'</span>,&nbsp;dest=<span style="color: #800000; ">'</span><span style="color: #800000; ">thumbnail</span><span style="color: #800000; ">'</span>,&nbsp;default=<span style="color: #800000; ">'</span><span style="color: #800000; ">1</span><span style="color: #800000; ">'</span>,&nbsp;metavar=<span style="color: #800000; ">'</span><span style="color: #800000; ">float</span><span style="color: #800000; ">'</span>,&nbsp;help=<span style="color: #800000; ">'</span><span style="color: #800000; ">specify&nbsp;the&nbsp;compress&nbsp;value&nbsp;(0,&nbsp;1)</span><span style="color: #800000; ">'</span>)<br />
<span style="color: #008080; ">29</span>&nbsp;parser.add_option(<span style="color: #800000; ">'</span><span style="color: #800000; ">-o</span><span style="color: #800000; ">'</span>,&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">--out</span><span style="color: #800000; ">'</span>,&nbsp;dest=<span style="color: #800000; ">'</span><span style="color: #800000; ">out</span><span style="color: #800000; ">'</span>,&nbsp;default=<span style="color: #800000; ">'</span><span style="color: #800000; ">out.html</span><span style="color: #800000; ">'</span>,&nbsp;help=<span style="color: #800000; ">'</span><span style="color: #800000; ">specify&nbsp;the&nbsp;output&nbsp;file</span><span style="color: #800000; ">'</span>)<br />
<span style="color: #008080; ">30</span>&nbsp;opts,&nbsp;args&nbsp;=&nbsp;parser.parse_args()<br />
<span style="color: #008080; ">31</span>&nbsp;<br />
<span style="color: #008080; ">32</span>&nbsp;<span style="color: #0000FF; ">if</span>(len(args)&nbsp;!=&nbsp;1):&nbsp;<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parser.print_help()<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(-1)<br />
<span style="color: #008080; ">35</span>&nbsp;<br />
<span style="color: #008080; ">36</span>&nbsp;html&nbsp;=&nbsp;open(opts.out,<span style="color: #800000; ">'</span><span style="color: #800000; ">w</span><span style="color: #800000; ">'</span>)<br />
<span style="color: #008080; ">37</span>&nbsp;html.write(convert(get_image(args[0],&nbsp;float(opts.thumbnail))))<br />
<span style="color: #008080; ">38</span>&nbsp;html.close()</div>
<br /><h3>下载地址&nbsp;</h3>https://code.google.com/p/stonelab/downloads/detail?name=img2html.py#makechanges<img src ="http://www.blogjava.net/stone2083/aggbug/407809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-12-20 14:28 <a href="http://www.blogjava.net/stone2083/archive/2013/12/20/407809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将图片转成HTML格式－－用HTML画图</title><link>http://www.blogjava.net/stone2083/archive/2013/12/20/407807.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Fri, 20 Dec 2013 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/12/20/407807.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/407807.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/12/20/407807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/407807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/407807.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 介绍img2html，将图片转成HTML格式。用HTML来画图。效果原始图片转成HTML后的效果（压缩1倍后的效果--主意：请查看html源码，这边没有src图片属性，全是通过html代码渲染）                                                               ...&nbsp;&nbsp;<a href='http://www.blogjava.net/stone2083/archive/2013/12/20/407807.html'>阅读全文</a><img src ="http://www.blogjava.net/stone2083/aggbug/407807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-12-20 14:18 <a href="http://www.blogjava.net/stone2083/archive/2013/12/20/407807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pystack--python stack trace--让python打印线程栈信息</title><link>http://www.blogjava.net/stone2083/archive/2013/08/19/403028.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 19 Aug 2013 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/08/19/403028.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/403028.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/08/19/403028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/403028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/403028.html</trackback:ping><description><![CDATA[pystack: python stack trace. 类似java中的jstack功能.<br />
使用方式:<br />
1. https://pypi.python.org/pypi/pdbx/0.3.0 下载, 或者直接通过easyinstall安装<br />
2. python scripts中, import pdbx; pdbx.enable_pystack(); 开启pystack功能<br />
3. kill -30 pid , 就可以打印stack信息了.&nbsp;<br />
如:<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->"CP&nbsp;Server&nbsp;Thread-10"&nbsp;tid=4564467712<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-9"&nbsp;tid=4560261120<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-1"&nbsp;tid=4526608384<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-7"&nbsp;tid=4551847936<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-4"&nbsp;tid=4539228160<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-2"&nbsp;tid=4530814976<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"MainThread"&nbsp;tid=140735286018432<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;app.run()(raspctl.py:173)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;wsgi.runwsgi(self.wsgifunc(*middleware))(application.py:313)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;httpserver.runsimple(func,&nbsp;validip(listget(sys.argv,&nbsp;1,&nbsp;'')))(wsgi.py:54)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;server.start()(httpserver.py:157)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.tick()(__init__.py:1765)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;s,&nbsp;addr&nbsp;=&nbsp;self.socket.accept()(__init__.py:1800)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sock,&nbsp;addr&nbsp;=&nbsp;self._sock.accept()(socket.py:202)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;pystack()(pdbx.py:181)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;filename,&nbsp;lineno,&nbsp;_,&nbsp;line&nbsp;in&nbsp;traceback.extract_stack(stack):(pdbx.py:169)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-5"&nbsp;tid=4543434752<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-8"&nbsp;tid=4556054528<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-3"&nbsp;tid=4535021568<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)<br />
<br />
"CP&nbsp;Server&nbsp;Thread-6"&nbsp;tid=4547641344<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.__bootstrap_inner()(threading.py:525)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.run()(threading.py:552)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;conn&nbsp;=&nbsp;self.server.requests.get()(__init__.py:1367)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;self.not_empty.wait()(Queue.py:168)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;waiter.acquire()(threading.py:244)</div>
<br />
<br />
核心代码:<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;pystack</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">def</span>&nbsp;pystack():<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;tid,&nbsp;stack&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;sys._current_frames().items():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;_get_thread(tid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.append(<span style="color: #800000; ">'</span><span style="color: #800000; ">"%s"&nbsp;tid=%d</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;(t.name,&nbsp;tid))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;filename,&nbsp;lineno,&nbsp;_,&nbsp;line&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;traceback.extract_stack(stack):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.append(<span style="color: #800000; ">'</span><span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;%s(%s:%d)</span><span style="color: #800000; ">'</span>&nbsp;%&nbsp;(line,&nbsp;filename[filename.rfind(<span style="color: #800000; ">'</span><span style="color: #800000; ">/</span><span style="color: #800000; ">'</span>)&nbsp;+&nbsp;1:],&nbsp;lineno))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">\r\n</span><span style="color: #800000; ">'</span>.join(info)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">''</span><br />
<br />
<span style="color: #0000FF; ">def</span>&nbsp;_get_thread(tid):<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;t&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;threading.enumerate():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;t.ident&nbsp;==&nbsp;tid:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;t<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;None<br />
<br />
<span style="color: #0000FF; ">def</span>&nbsp;_pystack(sig,&nbsp;frame):<br />
&nbsp;&nbsp;&nbsp;&nbsp;pystack()<br />
<br />
<span style="color: #0000FF; ">def</span>&nbsp;enable_pystack():<br />
&nbsp;&nbsp;&nbsp;&nbsp;signal.signal(signal.SIGUSR1,&nbsp;_pystack)</div><br />有需要的朋友,赶紧拿走吧.<img src ="http://www.blogjava.net/stone2083/aggbug/403028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-08-19 13:15 <a href="http://www.blogjava.net/stone2083/archive/2013/08/19/403028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rpdb更名为pdbx并发布到pypi</title><link>http://www.blogjava.net/stone2083/archive/2013/03/23/396903.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Sat, 23 Mar 2013 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/03/23/396903.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/396903.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/03/23/396903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/396903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/396903.html</trackback:ping><description><![CDATA[<div>rpdb更名为pdbx，发布到pypi<br /><div><a href="https://pypi.python.org/pypi/pdbx">https://pypi.python.org/pypi/pdbx</a><br /><div><a href="https://code.google.com/p/stonelab/wiki/pdbx">https://code.google.com/p/stonelab/wiki/pdbx</a></div></div></div><img src ="http://www.blogjava.net/stone2083/aggbug/396903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-03-23 16:11 <a href="http://www.blogjava.net/stone2083/archive/2013/03/23/396903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RPDB V0.2.0 Release (值得推广)</title><link>http://www.blogjava.net/stone2083/archive/2013/03/22/396862.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Fri, 22 Mar 2013 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/03/22/396862.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/396862.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/03/22/396862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/396862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/396862.html</trackback:ping><description><![CDATA[<h1><span style="color: red;">软件已更新，最新请查看：</span><span style="font-size: 14px; color: red;">https://code.google.com/p/stonelab/wiki/pdbx</span></h1><br />原文：https://code.google.com/p/stonelab/wiki/RemotePDB<br />
<br />
<h1>软件介绍<br />
</h1>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px;">rpdb:远程PDB调试工具，是对pdb的扩展。&nbsp;<br />
<br />
在pdb基础上，做了功能加强，主要特性如下：<br />
<br />
1. 兼容pdb一切语法和使用习惯&nbsp;<br />
<br />
2. 增加了远程调试功能， 允许你客户端通过telnet连接到指定调试端口，进行远程调试&nbsp;<br />
<br />
3. 增加了rq/rquit命令，支持安全退出模式，避免默认的quik会导致python程序异常退出的情况&nbsp;<br />
<br />
4. 允许多次调试&nbsp;<br />
<br />
5. 增加suspend模式，在启动时强制或者非强制进入断点&nbsp;</p><img src ="http://www.blogjava.net/stone2083/aggbug/396862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-03-22 17:23 <a href="http://www.blogjava.net/stone2083/archive/2013/03/22/396862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RPDB-让PDB（Python调试工具）支持远程调试功能</title><link>http://www.blogjava.net/stone2083/archive/2013/03/21/396812.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Thu, 21 Mar 2013 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/03/21/396812.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/396812.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/03/21/396812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/396812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/396812.html</trackback:ping><description><![CDATA[<div id="wikicontent"><div id="wikimaincol" style="vertical-align: top; padding: 5px 25px 10px 10px; background-color: #ffffff; min-width: 64em; border: 1px solid #cccccc;"><h1><span style="color: red;">软件已更新，最新请查看：</span><span style="font-size: 14px; color: red;">https://code.google.com/p/stonelab/wiki/pdbx</span><br /><br />软件介绍</h1><blockquote style="margin: 20px; max-width: 60em;">rpdb扩展了pdb，让pdb支持远程调试功能。<br /><br />使用了rpdb的python脚本在远程启动，本地通过telnet方式连接上rpdb提供的调试端口，接下来的操作和本地完全一致。</blockquote><h1><a name="使用说明"></a>使用说明</h1><ul style="padding-left: 25px; max-width: 62em;"><li style="margin-bottom: 0.3em;">下载</li><blockquote style="margin: 20px; max-width: 60em;">wget&nbsp;<a href="https://stonelab.googlecode.com/files/rpdb-0.1.0.tar.gz" rel="nofollow" style="color: #0000cc;">https://stonelab.googlecode.com/files/rpdb-0.1.0.tar.gz</a>&nbsp;<br /><br />有两个文件：rpdb.py：扩展pdb的类库； example.py 演示程序</blockquote><li style="margin-bottom: 0.3em;">安装</li><blockquote style="margin: 20px; max-width: 60em;">将rpdb.py拷贝到PYTHONPATH即可，或者直接拷贝rpdb.py上内容到你的python脚本即可（程序非常小巧，30+代码行）</blockquote><li style="margin-bottom: 0.3em;">演示</li><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;">pdb <span style="color: #666600;">=</span> <span style="color: #660066;">Rpdb</span><span style="color: #666600;">()</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #880000;"># 类似于pdb=Pdb()</span><br />pdb <span style="color: #666600;">=</span> <span style="color: #660066;">Rpdb</span><span style="color: #666600;">(</span><span style="color: #006666;">8787</span><span style="color: #666600;">)</span> <span style="color: #880000;"># 指定远程调试端口号</span><br />pdb<span style="color: #666600;">.</span>set_trace<span style="color: #666600;">()</span> <span style="color: #880000;">#设置断点</span></pre><blockquote style="margin: 20px; max-width: 60em;">如example.py中程序：<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;"><span style="color: #880000;">#!/usr/bin/python</span><span style="color: #000000;"><br /><br /></span><span style="color: #000088;">from</span><span style="color: #000000;"> rpdb </span><span style="color: #000088;">import</span> <span style="color: #660066;">Rpdb</span><span style="color: #000000;"><br /></span><span style="color: #000088;">from</span><span style="color: #000000;"> random </span><span style="color: #000088;">import</span><span style="color: #000000;"> randint<br /></span><span style="color: #000088;">from</span><span style="color: #000000;"> time </span><span style="color: #000088;">import</span><span style="color: #000000;"> sleep<br /><br /></span><span style="color: #000088;">def</span><span style="color: #000000;"> add</span><span style="color: #666600;">(</span><span style="color: #000000;">i</span><span style="color: #666600;">,</span><span style="color: #000000;"> j</span><span style="color: #666600;">):</span><span style="color: #000000;"><br />&nbsp; &nbsp; r </span><span style="color: #666600;">=</span><span style="color: #000000;"> i </span><span style="color: #666600;">+</span><span style="color: #000000;"> j<br />&nbsp; &nbsp; </span><span style="color: #000088;">return</span><span style="color: #000000;"> r<br /><br /></span><span style="color: #000088;">def</span><span style="color: #000000;"> main</span><span style="color: #666600;">():</span><span style="color: #000000;"><br />&nbsp; &nbsp; pdb </span><span style="color: #666600;">=</span> <span style="color: #660066;">Rpdb</span><span style="color: #666600;">()</span><span style="color: #000000;"><br />&nbsp; &nbsp; </span><span style="color: #880000;"># pdb = Rpdb(9999) # debug port:9999</span><span style="color: #000000;"><br />&nbsp; &nbsp; pdb</span><span style="color: #666600;">.</span><span style="color: #000000;">set_trace</span><span style="color: #666600;">()</span><span style="color: #000000;"><br />&nbsp; &nbsp; </span><span style="color: #000088;">while</span> <span style="color: #000088;">True</span><span style="color: #666600;">:</span><span style="color: #000000;"><br />&nbsp; &nbsp; &nbsp; &nbsp; i </span><span style="color: #666600;">=</span><span style="color: #000000;"> randint</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">,</span><span style="color: #006666;">10</span><span style="color: #666600;">)</span><span style="color: #000000;"><br />&nbsp; &nbsp; &nbsp; &nbsp; j </span><span style="color: #666600;">=</span><span style="color: #000000;"> randint</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">,</span><span style="color: #006666;">10</span><span style="color: #666600;">)</span><span style="color: #000000;"><br />&nbsp; &nbsp; &nbsp; &nbsp; r </span><span style="color: #666600;">=</span><span style="color: #000000;"> add</span><span style="color: #666600;">(</span><span style="color: #000000;">i</span><span style="color: #666600;">,</span><span style="color: #000000;"> j</span><span style="color: #666600;">)</span><span style="color: #000000;"><br />&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #000088;">print</span><span style="color: #000000;"> r<br />&nbsp; &nbsp; &nbsp; &nbsp; sleep</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">)</span><span style="color: #000000;"><br /><br /></span><span style="color: #000088;">if</span><span style="color: #000000;"> __name__ </span><span style="color: #666600;">==</span> <span style="color: #008800;">'__main__'</span><span style="color: #666600;">:</span><span style="color: #000000;"><br />&nbsp; &nbsp; main</span><span style="color: #666600;">()</span></pre>本地终端输入： telnet xxx.xxx.xxx.xxx 8787<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;"><span style="color: #000000;">telnet </span><span style="color: #006666;">127.0</span><span style="color: #666600;">.</span><span style="color: #006666;">0.1</span> <span style="color: #006666;">8787</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Trying</span> <span style="color: #006666;">127.0</span><span style="color: #666600;">.</span><span style="color: #006666;">0.1</span><span style="color: #666600;">...</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Connected</span><span style="color: #000000;"> to localhost</span><span style="color: #666600;">.</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Escape</span><span style="color: #000000;"> character </span><span style="color: #000088;">is</span> <span style="color: #008800;">'^]'</span><span style="color: #666600;">.</span><span style="color: #000000;"><br /></span><span style="color: #666600;">&gt;</span> <span style="color: #008800;">/Users/</span><span style="color: #000000;">stone</span><span style="color: #666600;">/</span><span style="color: #660066;">Tmp</span><span style="color: #666600;">/</span><span style="color: #000000;">baidu</span><span style="color: #666600;">/</span><span style="color: #000000;">rpdb</span><span style="color: #666600;">/</span><span style="color: #000000;">example</span><span style="color: #666600;">.</span><span style="color: #000000;">py</span><span style="color: #666600;">(</span><span style="color: #006666;">15</span><span style="color: #666600;">)</span><span style="color: #000000;">main</span><span style="color: #666600;">()</span><span style="color: #000000;"><br /></span><span style="color: #666600;">-&gt;</span> <span style="color: #000088;">while</span> <span style="color: #000088;">True</span><span style="color: #666600;">:</span><span style="color: #000000;"><br /></span><span style="color: #666600;">(</span><span style="color: #660066;">Pdb</span><span style="color: #666600;">)</span><span style="color: #000000;"> l <br />&nbsp;</span><span style="color: #006666;">10</span><span style="color: #000000;"> &nbsp; &nbsp; <br />&nbsp;</span><span style="color: #006666;">11</span><span style="color: #000000;"> &nbsp; &nbsp; </span><span style="color: #000088;">def</span><span style="color: #000000;"> main</span><span style="color: #666600;">():</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">12</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; pdb </span><span style="color: #666600;">=</span> <span style="color: #660066;">Rpdb</span><span style="color: #666600;">()</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">13</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #880000;"># pdb = Rpdb(9999) # debug port:9999</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">14</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; pdb</span><span style="color: #666600;">.</span><span style="color: #000000;">set_trace</span><span style="color: #666600;">()</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">15</span>&nbsp;<span style="color: #666600;">-&gt;</span><span style="color: #000000;"> &nbsp; &nbsp; </span><span style="color: #000088;">while</span> <span style="color: #000088;">True</span><span style="color: #666600;">:</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">16</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i </span><span style="color: #666600;">=</span><span style="color: #000000;"> randint</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">,</span><span style="color: #006666;">10</span><span style="color: #666600;">)</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">17</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j </span><span style="color: #666600;">=</span><span style="color: #000000;"> randint</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">,</span><span style="color: #006666;">10</span><span style="color: #666600;">)</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">18</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r </span><span style="color: #666600;">=</span><span style="color: #000000;"> add</span><span style="color: #666600;">(</span><span style="color: #000000;">i</span><span style="color: #666600;">,</span><span style="color: #000000;"> j</span><span style="color: #666600;">)</span><span style="color: #000000;"><br />&nbsp;</span><span style="color: #006666;">19</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #000088;">print</span><span style="color: #000000;"> r<br />&nbsp;</span><span style="color: #006666;">20</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">)</span><span style="color: #000000;"><br /></span><span style="color: #666600;">(</span><span style="color: #660066;">Pdb</span><span style="color: #666600;">)</span><span style="color: #000000;"> n<br /></span><span style="color: #666600;">&gt;</span> <span style="color: #008800;">/Users/</span><span style="color: #000000;">stone</span><span style="color: #666600;">/</span><span style="color: #660066;">Tmp</span><span style="color: #666600;">/</span><span style="color: #000000;">baidu</span><span style="color: #666600;">/</span><span style="color: #000000;">rpdb</span><span style="color: #666600;">/</span><span style="color: #000000;">example</span><span style="color: #666600;">.</span><span style="color: #000000;">py</span><span style="color: #666600;">(</span><span style="color: #006666;">16</span><span style="color: #666600;">)</span><span style="color: #000000;">main</span><span style="color: #666600;">()</span><span style="color: #000000;"><br /></span><span style="color: #666600;">-&gt;</span><span style="color: #000000;"> i </span><span style="color: #666600;">=</span><span style="color: #000000;"> randint</span><span style="color: #666600;">(</span><span style="color: #006666;">1</span><span style="color: #666600;">,</span><span style="color: #006666;">10</span><span style="color: #666600;">)</span><span style="color: #000000;"><br /></span><span style="color: #666600;">(</span><span style="color: #660066;">Pdb</span><span style="color: #666600;">)</span><span style="color: #000000;"> b </span><span style="color: #006666;">19</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Breakpoint</span> <span style="color: #006666;">1</span><span style="color: #000000;"> at </span><span style="color: #666600;">/</span><span style="color: #660066;">Users</span><span style="color: #666600;">/</span><span style="color: #000000;">stone</span><span style="color: #666600;">/</span><span style="color: #660066;">Tmp</span><span style="color: #666600;">/</span><span style="color: #000000;">baidu</span><span style="color: #666600;">/</span><span style="color: #000000;">rpdb</span><span style="color: #666600;">/</span><span style="color: #000000;">example</span><span style="color: #666600;">.</span><span style="color: #000000;">py</span><span style="color: #666600;">:</span><span style="color: #006666;">19</span><span style="color: #000000;"><br /></span><span style="color: #666600;">(</span><span style="color: #660066;">Pdb</span><span style="color: #666600;">)</span><span style="color: #000000;"> c<br /></span><span style="color: #666600;">&gt;</span> <span style="color: #008800;">/Users/</span><span style="color: #000000;">stone</span><span style="color: #666600;">/</span><span style="color: #660066;">Tmp</span><span style="color: #666600;">/</span><span style="color: #000000;">baidu</span><span style="color: #666600;">/</span><span style="color: #000000;">rpdb</span><span style="color: #666600;">/</span><span style="color: #000000;">example</span><span style="color: #666600;">.</span><span style="color: #000000;">py</span><span style="color: #666600;">(</span><span style="color: #006666;">19</span><span style="color: #666600;">)</span><span style="color: #000000;">main</span><span style="color: #666600;">()</span><span style="color: #000000;"><br /></span><span style="color: #666600;">-&gt;</span> <span style="color: #000088;">print</span><span style="color: #000000;"> r<br /></span><span style="color: #666600;">(</span><span style="color: #660066;">Pdb</span><span style="color: #666600;">)</span><span style="color: #000000;"> p r<br /></span><span style="color: #006666;">11</span><span style="color: #000000;"><br /></span><span style="color: #666600;">(</span><span style="color: #660066;">Pdb</span><span style="color: #666600;">)</span><span style="color: #000000;"> q<br /></span><span style="color: #660066;">Connection</span><span style="color: #000000;"> closed </span><span style="color: #000088;">by</span><span style="color: #000000;"> foreign host</span><span style="color: #666600;">.</span></pre>操作和pdb完全一致。</blockquote></ul><h1><a name="PDB常用命令"></a>PDB常用命令</h1><p style="line-height: 1.25em; max-width: 64em;"></p><table style="border-spacing: 0px; border-style: solid; border-color: #cccccc;"><tbody><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">命令</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">介绍</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">h(elp) command<a href="https://code.google.com/p/stonelab/w/edit/command" style="color: #0000cc;">?</a></td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">输入h或者help 列出pdb支持的所有命令， h command<a href="https://code.google.com/p/stonelab/w/edit/command" style="color: #0000cc;">?</a>&nbsp;介绍指定命令</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">w(here)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">列出当前调试所在行，一般会使用 l(ist)</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">l(ist) [first[, last]]</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">列出源代码信息</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">s(tep)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">进入函数体</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">n(ext)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">执行下一行代码</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">c(ont(inue))</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">继续，直到遇到下一个断点</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">r(eturn)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">执行到函数体结束那行</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">b(reak)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">设置断点，可以是代码行号，方法名， 还可以加进入条件</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">tbreak</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">设置临时断点，进入一次后，自动消失</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">cl(ear)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">取消断点</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">disable</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">让断点失效</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">enable</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">让断点生效</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">ignore</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">忽略断点n次</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">condition</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">给断点添加条件，符合条件的才进入断点</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">j(ump) lineno</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">跳掉指定行</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">a(rgs)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">打印函数体参数信息</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">p expression</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">打印变量</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">pp expression</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">同上，打印得漂亮一些</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">! statement</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">执行代码，非常有用，可用来修改变量值</td></tr><tr><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">q(uit)</td><td style="font-size: 13px; border-style: solid; border-color: #cccccc; padding: 5px;">退出调试（pdb的quit很黄很暴力）</td></tr></tbody></table><p style="line-height: 1.25em; max-width: 64em;"></p></div></div><img src ="http://www.blogjava.net/stone2083/aggbug/396812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-03-21 16:19 <a href="http://www.blogjava.net/stone2083/archive/2013/03/21/396812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分享几个小工具--推荐给Linux的用户</title><link>http://www.blogjava.net/stone2083/archive/2013/03/19/396660.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Tue, 19 Mar 2013 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/03/19/396660.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/396660.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/03/19/396660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/396660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/396660.html</trackback:ping><description><![CDATA[<div>自己写的几个小工具，分享给需要的人：<br /><br />https://code.google.com/p/stonelab/wiki/BaiduMp3<br />百度MP3批量下载工具<br /><br /><div>https://code.google.com/p/stonelab/wiki/FileConvertor<br />文件编码转换工具<br /><br /><div>https://code.google.com/p/stonelab/wiki/MyZip<br />扩展zip命令，支持文件名编码<br /><br /><div>https://code.google.com/p/stonelab/wiki/Translate<br />命令行下的翻译软件<br /><br /><div>https://code.google.com/p/stonelab/wiki/HostsX<br />扩展Hosts，别名DnsProxy，DNS代理服务</div></div></div></div></div><img src ="http://www.blogjava.net/stone2083/aggbug/396660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-03-19 15:12 <a href="http://www.blogjava.net/stone2083/archive/2013/03/19/396660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BaiduMp3--基于命令行的百度MP3批量下载工具</title><link>http://www.blogjava.net/stone2083/archive/2013/03/19/396645.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Tue, 19 Mar 2013 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/03/19/396645.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/396645.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/03/19/396645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/396645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/396645.html</trackback:ping><description><![CDATA[原文：https://code.google.com/p/stonelab/wiki/BaiduMp3<br /><br /><h1><a name="软件介绍"></a>软件介绍</h1><p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px;"><a href="https://code.google.com/p/stonelab/wiki/BaiduMp3" style="color: #0000cc;">BaiduMp3</a>，基于命令行下的百度MP3歌曲批量下载工具。<br /><br />主要支持功能：</p><ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal;"><li style="margin-bottom: 0.3em;">搜索 根据关键词搜索匹配的歌曲</li><li style="margin-bottom: 0.3em;">下载 根据搜索出来的歌曲ID，下载到本地指定目录</li><li style="margin-bottom: 0.3em;">批量下载 根据关键词，批量下载匹配的歌曲，到本地指定目录</li></ul><p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px;"></p><h1><a name="软件使用"></a>软件使用</h1><ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal;"><li style="margin-bottom: 0.3em;">下载</li><ol style="padding-left: 25px; max-width: 62em;"><li style="margin-bottom: 0.3em;">wget&nbsp;<a href="https://stonelab.googlecode.com/files/baidump3-0.9.0.py" rel="nofollow" style="color: #0000cc;">https://stonelab.googlecode.com/files/baidump3-0.9.0.py</a></li><li style="margin-bottom: 0.3em;">mv baidump3-0.9.0.py baidump3.py</li><li style="margin-bottom: 0.3em;">chmod +x ./baidump3.py</li></ol></ul><p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px;"></p><ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal;"><li style="margin-bottom: 0.3em;">命令参数介绍</li><p style="line-height: 1.25em; max-width: 64em;"></p><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;"><span style="color: #660066;">Usage</span><span style="color: #666600;">:</span> baidump3<span style="color: #666600;">.</span>py <span style="color: #666600;">[</span>options<span style="color: #666600;">]</span><br /><br /><span style="color: #660066;">Options</span><span style="color: #666600;">:</span><br />&nbsp; <span style="color: #666600;">-</span>h<span style="color: #666600;">,</span> <span style="color: #666600;">--</span>help &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;show <span style="color: #000088;">this</span> help message <span style="color: #000088;">and</span> <span style="color: #000088;">exit</span><br />&nbsp; <span style="color: #666600;">-</span>m MODE<span style="color: #666600;">,</span> <span style="color: #666600;">--</span>mode<span style="color: #666600;">=</span>MODE &nbsp;specifies the command mode<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666600;">[</span>list<span style="color: #666600;">|</span>download<span style="color: #666600;">|</span>multidownload<span style="color: #666600;">]</span><br />&nbsp; <span style="color: #666600;">-</span>o OUTPUT<span style="color: #666600;">,</span> <span style="color: #666600;">--</span>output<span style="color: #666600;">=</span>OUTPUT<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; specifies the output dir <span style="color: #000088;">for</span> download<br />&nbsp; <span style="color: #666600;">-</span>p PAGE<span style="color: #666600;">,</span> <span style="color: #666600;">--</span>page<span style="color: #666600;">=</span>PAGE &nbsp;specifies the list page<br />&nbsp; <span style="color: #666600;">-</span>k KEY<span style="color: #666600;">,</span> <span style="color: #666600;">--</span>key<span style="color: #666600;">=</span>KEY &nbsp; &nbsp; specifies the mp3 keyworld<br />&nbsp; <span style="color: #666600;">-</span>f FROMPAGE<span style="color: #666600;">,</span> <span style="color: #666600;">--</span><span style="color: #000088;">from</span><span style="color: #666600;">=</span>FROMPAGE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; specifies the <span style="color: #000088;">from</span> page <span style="color: #000088;">for</span> multidownload<br />&nbsp; <span style="color: #666600;">-</span>t TOPAGE<span style="color: #666600;">,</span> <span style="color: #666600;">--</span>to<span style="color: #666600;">=</span>TOPAGE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; specifies the <span style="color: #000088;">end</span> page <span style="color: #000088;">for</span> multidownload</pre></ul><ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal;"><li style="margin-bottom: 0.3em;">搜索</li><blockquote style="margin: 20px; max-width: 60em;">通过-m list指定为搜索模式 -k参数指定搜索关键词，-p关键词指定分页页面号，默认一页显示20条数据。<br /><br />比如：./baidump3.py -m list -k 70后 -p 2&nbsp;<br /><br />效果：<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;"><span style="color: #666600;">./</span><span style="color: #000000;">baidump3</span><span style="color: #666600;">.</span><span style="color: #000000;">py </span><span style="color: #666600;">-</span><span style="color: #000000;">m list </span><span style="color: #666600;">-</span><span style="color: #000000;">k </span><span style="color: #006666;">70</span><span style="color: #666600;">后</span> <span style="color: #666600;">-</span><span style="color: #000000;">p </span><span style="color: #006666;">2</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Total</span><span style="color: #666600;">:</span> <span style="color: #006666;">1000</span> <span style="color: #660066;">Page</span><span style="color: #666600;">:</span><span style="color: #006666;">2</span><span style="color: #000000;"><br /></span><span style="color: #006666;">1007797</span>&nbsp;<span style="color: #666600;">刘若英</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">为爱痴狂</span><span style="color: #000000;"><br /></span><span style="color: #006666;">2067170</span>&nbsp;<span style="color: #666600;">姜育恒</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">别让我一个人醉</span><span style="color: #000000;"><br /></span><span style="color: #006666;">209442</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">彭佳慧</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">相见恨晚</span><span style="color: #000000;"><br /></span><span style="color: #006666;">2121730</span>&nbsp;<span style="color: #666600;">杨钰莹,毛宁</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #666600;">心雨</span><span style="color: #000000;"><br /></span><span style="color: #006666;">216206</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">许美静</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">蔓延</span><span style="color: #000000;"><br /></span><span style="color: #006666;">226444</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">陈淑桦</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">问</span><span style="color: #000000;"><br /></span><span style="color: #006666;">253833</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">张学友</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">秋意浓</span><span style="color: #000000;"><br /></span><span style="color: #006666;">274172</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">张学友</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">三天两夜</span><span style="color: #000000;"><br /></span><span style="color: #006666;">580824</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">孟庭苇</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">伤了你的心的我伤心</span><span style="color: #000000;"><br /></span><span style="color: #006666;">582858</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">莫文蔚</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">电台情歌</span><span style="color: #000000;"><br /></span><span style="color: #006666;">650924</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">姜育恒</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">其实我真的很在乎</span><span style="color: #000000;"><br /></span><span style="color: #006666;">7274415</span>&nbsp;<span style="color: #666600;">满文军</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">我需要你</span><span style="color: #000000;"><br /></span><span style="color: #006666;">7277793</span>&nbsp;<span style="color: #666600;">林志炫</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">单身情歌</span><span style="color: #000000;"><br /></span><span style="color: #006666;">7280177</span>&nbsp;<span style="color: #666600;">林志炫</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">离人</span><span style="color: #000000;"><br /></span><span style="color: #006666;">7302437</span>&nbsp;<span style="color: #666600;">李寿全</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">张三的歌</span><span style="color: #000000;"><br /></span><span style="color: #006666;">844889</span><span style="color: #000000;"> &nbsp; &nbsp;</span><span style="color: #666600;">陈淑桦</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">流光飞舞</span><span style="color: #000000;"><br /></span><span style="color: #006666;">1039139</span>&nbsp;<span style="color: #666600;">王菲</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #666600;">容易受伤的女人</span><span style="color: #000000;"><br /></span><span style="color: #006666;">1243712</span>&nbsp;<span style="color: #666600;">罗大佑</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">恋曲</span><span style="color: #006666;">1980</span><span style="color: #000000;"><br /></span><span style="color: #006666;">2076242</span>&nbsp;<span style="color: #666600;">李宗盛</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">我是一只小小鸟</span><span style="color: #000000;"><br /></span><span style="color: #006666;">2121739</span>&nbsp;<span style="color: #666600;">杨钰莹</span><span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #666600;">轻轻的告诉你</span></pre></blockquote></ul><ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal;"><li style="margin-bottom: 0.3em;">下载</li><blockquote style="margin: 20px; max-width: 60em;">通过-m download指定为下载模式 -k参数指定下载歌曲ID号 -o参数指定下载路径，默认为当前目录。<br /><br />比如：./baidump3.py -m download -k 1007797 -o ~/Tmp/&nbsp;<br /><br />效果：<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;"><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">为爱痴狂.</span><span style="color: #000000;">mp3</span></pre></blockquote></ul><ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal;"><li style="margin-bottom: 0.3em;">批量下载</li><blockquote style="margin: 20px; max-width: 60em;">通过-m multidownload指定为批量下载模式 -k参数指定歌曲关键词， -o参数指定下载路径（默认位为当前目录）， -f参数指定下载开始页面（默认为第一页）， -t参数指定下载结束页面（默认为搜索到的最后一页）<br /><br />比如：./baidump3.py -m multidownload -k 70后 -o ~/Tmp/baidu -f 2 -t 3&nbsp;<br /><br />效果：<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;">&nbsp;<span style="color: #660066;">MultiDownloading</span> <span style="color: #660066;">Page</span> <span style="color: #006666;">2</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">为爱痴狂.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">别让我一个人醉.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">相见恨晚.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">蹇冮洦.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">蔓延.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">问.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">秋意浓.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">三天两夜.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">伤了你的心的我伤心.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">电台情歌.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">其实我真的很在乎.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">鎴戦渶瑕佷綘.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">单身情歌.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">离人.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">张三的歌.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">流光飞舞.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">容易受伤的女人.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #660066;">Fail</span><span style="color: #666600;">.</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">我是一只小小鸟.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">轻轻的告诉你.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">MultiDownloading</span> <span style="color: #660066;">Page</span> <span style="color: #006666;">3</span><span style="color: #000000;"><br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">孟婆汤.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">情书.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">橄榄树.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">选择.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">结束不是我要的结果.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">鍛抽亾.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">来生缘.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">相思风雨中.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">你我的爱只能擦肩而过.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">忘情水.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">爱如潮水.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">特别的爱给特别的你.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">千千阙歌.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #666600;">涛声依旧.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #660066;">Hotel</span> <span style="color: #660066;">California</span><span style="color: #666600;">.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #660066;">Roll</span> <span style="color: #660066;">Away</span> <span style="color: #660066;">The</span> <span style="color: #660066;">Stone</span><span style="color: #666600;">.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #660066;">Peace</span> <span style="color: #660066;">Train</span><span style="color: #666600;">.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #660066;">Have</span> <span style="color: #660066;">You</span> <span style="color: #660066;">Never</span> <span style="color: #660066;">Been</span> <span style="color: #660066;">Mellow</span><span style="color: #666600;">.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #660066;">Hot</span> <span style="color: #660066;">Stuff</span><span style="color: #666600;">.</span><span style="color: #000000;">mp3<br /></span><span style="color: #660066;">Downloading</span> <span style="color: #666600;">&gt;&gt;&gt;</span> <span style="color: #660066;">Rock</span> <span style="color: #660066;">The</span> <span style="color: #660066;">Boat</span><span style="color: #666600;">.</span><span style="color: #000000;">mp3</span></pre>备注： 有小概率会出现乱码，以及小小概率出现下载失败。</blockquote></ul><img src ="http://www.blogjava.net/stone2083/aggbug/396645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-03-19 11:28 <a href="http://www.blogjava.net/stone2083/archive/2013/03/19/396645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RaspCTL V0.1.0 Released</title><link>http://www.blogjava.net/stone2083/archive/2013/01/16/394311.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Wed, 16 Jan 2013 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2013/01/16/394311.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/394311.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2013/01/16/394311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/394311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/394311.html</trackback:ping><description><![CDATA[<h1 style="margin-top: 0px; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; "><font size="5">转自：https://code.google.com/p/stonelab/wiki/RaspCTL</font><br /><font size="2">COPY过来格式比较乱，将就地看吧。原文直接看googlecode wiki吧 ：）</font><br /><br /><font size="5">什么是RaspCTL</font><br />
<span style="font-size: x-large; font-weight: normal; "><span style="font-size: 13px; line-height: 1.25em; ">RaspCTL是Raspberry Pi和Control字母的组合，表示树莓派控制端。 RaspCTL是一款通过手机终端（泛义上包括手机，平板，电脑等设备）控制</span><a href="http://www.raspberrypi.org/" rel="nofollow" style="font-size: 13px; line-height: 1.25em; color: #0000cc; ">树莓派</a><span style="font-size: 13px; line-height: 1.25em; ">的软件。<br />
</span><span style="font-size: 13px; line-height: 1.25em; ">目前，通过Raspberry&amp;RaspCTL组合，打造成家庭多媒体播放机顶盒，在此场景中，RaspCTL非常类似</span><a href="http://xbmc.org/" rel="nofollow" style="font-size: 13px; line-height: 1.25em; color: #0000cc; ">XBMC</a><span style="font-size: 13px; line-height: 1.25em; ">平台。</span><span style="font-size: 13px; line-height: 1.25em; ">未来，会不断扩展RaspCTL功能，成为控制家庭物联网的设备中心，比如控制摄像头，空调开关等。此乃后话，按下不表。</span></span></h1>
<h1 style="font-size: x-large; margin-top: 0px; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; "><br />为什么选择Raspberry Pi&amp;RaspCTL<br /><span style="font-size: large; ">为什么选择Raspberry Pi</span></h1><h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">
<span style="font-size: 13px; line-height: 1.25em; font-weight: normal;">我们先来看看Raspberry Pi的相关参数：</span></h2>
<table class="wikitable" style="border-spacing: 0px; border-style: solid; border-color: #cccccc; color: #000000; font-family: arial, sans-serif; font-size: 13px; text-align: start; ">
     <tbody>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">CPU</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">700 MHz， ARM1176JZF-S</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">GPU（显卡）</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">Broadcom VideoCore<a href="https://code.google.com/p/stonelab/w/edit/VideoCore" style="color: #0000cc; ">?</a>&nbsp;IV，OpenGL ES 2.0， 1080p30 h.264/MPEG-4 AVC high-profile decoder</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">MEM（内存）</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">512M</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">分辨率</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">1080P</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">输出接口</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">1*SD口 2*USB口 1*音频口 1*HDMI口 1*网卡</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">尺寸</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">85.6 x 53.98 x 17mm （一张信用卡大小）</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">价格</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">$35</td>
         </tr>
     </tbody>
</table>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "></p>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><br />
好吧，一起来总结下Raspberry Pi的优势吧</p>
<ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">小巧：只有一张信用卡大小</li>
     <li style="margin-bottom: 0.3em; ">GPU强悍： 硬解1080P，30帧/S，通俗地将，差不多是iphone4S手机的2倍性能</li>
     <li style="margin-bottom: 0.3em; ">输出接口丰富： 包括2*USB，1*HDMI</li>
     <li style="margin-bottom: 0.3em; ">性价比高：$35<br />
     <br />
     <span style="line-height: 1.25em; ">从这些特性看，Raspberry非常合适充当高清视频播放机顶盒，来替代目前的华数机顶盒（华数官方垄断，费用高，质量差）。 家庭中，只要购置了Raspberry Pi和宽带，高清电影电视，免费看。 ：）</span></li>
</ul>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">为什么选择RaspCTL<br />
<span style="font-size: 13px; line-height: 1.25em; font-weight: normal;">只有一个原因：Raspberry Pi CPU很弱：700MHZ。 同样，我们来看一组数据：</span></h2>
<ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">Raspbian Terminal下 CPU LOAD在0.2左右</li>
     <li style="margin-bottom: 0.3em; ">Raspbian XWindows下， CPU占用率差不多在70%以上</li>
     <li style="margin-bottom: 0.3em; "><a href="http://xbian.org/" rel="nofollow" style="color: #0000cc; ">XBian</a>下，CPU占用率在95%以上<br /><span style="line-height: 1.25em; ">如果，Raspberry Pi CPU能强悍那么一点点，那么XBian一定是首选，我也不会重新创造RaspCTL这个轮子了。只是目前，XBMC在Raspberry Pi（XBian）上的性能太糟糕了。 从数据看，只有在Raspbian Terminal下的性能，才能符合用户的期望，所以作者编写了RaspCTL这个控制端。通过手机终端的界面，来操作Raspbian Terminal，实现多媒体播放的功能。</span></li></ul>
<h1 style="font-size: x-large; margin-top: 0px; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">RaspCTL(V0.1.0)功能特性</h1>
<ol style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">支持视屏，音频播放</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">支持播放，暂停，停止，快进，快退，播放列表，上一首，下一首等</li>
     </ul>
     <li style="margin-bottom: 0.3em; ">支持本地文件查看</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">查看多媒体文件</li>
     </ul>
     <li style="margin-bottom: 0.3em; ">配置系统信息</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">配置多媒体文件根路径等</li>
     </ul>
     <li style="margin-bottom: 0.3em; ">视频网站真实URL分析</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">支持包括优酷，土豆，迅雷，百度等82个网站视频URL分析</li>
     </ul>
     <li style="margin-bottom: 0.3em; ">制定Plugins规范</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">可非常方便开发RaspCTL Pugin</li>
     </ul>
</ol>
<h1 style="font-size: x-large; margin-top: 0px; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">使用者文档</h1>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">如何安装RaspCTL</h2>
<ol style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">下载<a href="http://stonelab.googlecode.com/files/raspctl-0.1.0.tar.gz" rel="nofollow" style="color: #0000cc; ">RaspCTL</a></li>
     <ol style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">下载，解压到指定目录</li>
         <li style="margin-bottom: 0.3em; ">或者直接使用svn地址： svn co&nbsp;<a href="https://stonelab.googlecode.com/svn/tags/raspctl-0.1.0" rel="nofollow" style="color: #0000cc; ">https://stonelab.googlecode.com/svn/tags/raspctl-0.1.0</a>&nbsp;RaspCTL</li>
     </ol>
     <li style="margin-bottom: 0.3em; ">安装RaspCTL</li>
     <ol style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">chmox +x bin/install.sh; bin/install.sh</li>
         <li style="margin-bottom: 0.3em; ">会自动安装RaspCTL依赖的第三方库，主要是python-webpy python-jinja2 python-pexpect依赖</li>
     </ol>
</ol>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">如何使用RaspCTL</h2>
<ol style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">启动RaspCTL服务</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">bin/start.sh</li>
         <li style="margin-bottom: 0.3em; ">启动后，在你手机浏览器上输入：</li>
         <li style="margin-bottom: 0.3em; "><a href="http://xxx.xxx.xxx.xxx:8000/config" rel="nofollow" style="color: #0000cc; ">http://xxx.xxx.xxx.xxx:8000/config</a>&nbsp;配置你树莓派上本地多媒体文件根目录</li>
         <li style="margin-bottom: 0.3em; "><a href="http://xxx.xxx.xxx.xxx:8000/player" rel="nofollow" style="color: #0000cc; ">http://xxx.xxx.xxx.xxx:8000/player</a>&nbsp;进入播放器</li>
         <li style="margin-bottom: 0.3em; ">点击添加，选择本地多媒体文件</li>
         <li style="margin-bottom: 0.3em; ">点击播放，暂停等功能</li>
     </ul>
     <li style="margin-bottom: 0.3em; ">关闭RaspCTL服务</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">bin/shutdown.sh</li>
     </ul>
</ol>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">常见问题</h2>
<ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">Q：如何自启动RaspCTL服务</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">将 bin/start.sh 配置到树莓派的/etc/rc.local exit之前。 同理，你在rc.local中可以启动其他任何服务；</li>
     </ul>
     <li style="margin-bottom: 0.3em; ">Q：如何使用80端口</li>
     <ul style="padding-left: 25px; max-width: 62em; ">
         <li style="margin-bottom: 0.3em; ">debian系统禁用了小于1024的端口，所以RaspCTL只有使用8000端口。可以通过iptable将80端口请求转发到8000端口： iptables -t nat -A PREROUTING -p tcp --dport 81 -j REDIRECT --to-ports 8080</li>
     </ul>
</ul>
<h1 style="font-size: x-large; margin-top: 0px; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">开发者文档</h1>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">类库API<br />
<br />
</h2>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><strong>Omxplayer</strong></p>
<table class="wikitable" style="border-spacing: 0px; border-style: solid; border-color: #cccccc; color: #000000; font-family: arial, sans-serif; font-size: 13px; text-align: start; ">
     <tbody>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">play</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">播放，可以指定播放列表中任一一个资源</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">pause</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">暂停播放</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">resume</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">恢复播放</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">stop</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">停止播放</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">lseek</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">快退， 快退30秒， 参数为True的话，快退10分钟</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">rseek</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">快进， 快进30秒，参数为True的话，快进10分钟</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">prev</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">播放上一首</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">next</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">播放下一首</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">set_playlist</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">设置播放列表</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">add_playitem</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">添加多媒体资源到播放列表中, 参数为 ('url', 'name') 资源地址， 资源显示名</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">del_playitem</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">清空播放列表</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">sort_playitem</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">播放列表排序</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">set_dev</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">设置输出设备， hdmi接口 或者 本地音频接口</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">set_loop</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">设置播放模式：顺序，循环</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">get_info</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">获取播放器信息，如播放状态等</td>
         </tr>
     </tbody>
</table>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "></p>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><strong>LocalFile<a href="https://code.google.com/p/stonelab/w/edit/LocalFile" style="color: #0000cc; ">?</a></strong></p>
<table class="wikitable" style="border-spacing: 0px; border-style: solid; border-color: #cccccc; color: #000000; font-family: arial, sans-serif; font-size: 13px; text-align: start; ">
     <tbody>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">get_mediapath</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">获得多媒体文件根目录路径</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">list</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">获取一个目录下的所有资源</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">list_all</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">递归获取一个目录下的所有资源</td>
         </tr>
     </tbody>
</table>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "></p>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><strong>Config</strong></p>
<table class="wikitable" style="border-spacing: 0px; border-style: solid; border-color: #cccccc; color: #000000; font-family: arial, sans-serif; font-size: 13px; text-align: start; ">
     <tbody>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">load</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">获取raspctl.cnf中的配置信息</td>
         </tr>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">save</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">更新raspctl.cnf中的配置信息</td>
         </tr>
     </tbody>
</table>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "></p>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><strong>MediaUrl<a href="https://code.google.com/p/stonelab/w/edit/MediaUrl" style="color: #0000cc; ">?</a></strong></p>
<table class="wikitable" style="border-spacing: 0px; border-style: solid; border-color: #cccccc; color: #000000; font-family: arial, sans-serif; font-size: 13px; text-align: start; ">
     <tbody>
         <tr>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">get_urls</td>
             <td style="border-style: solid; border-color: #cccccc; padding: 5px; ">获取网站url对应的真实视屏url地址信息， fmt=high 获取高清视屏地址</td>
         </tr>
     </tbody>
</table>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "></p>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">Ajax规范<br />
<br />
<span style="font-weight: normal;"><span style="font-size: 13px; line-height: 1.25em; ">使用Ajax的目的：为了RaspCTL提供的服务可以同时被WAP， Android APP, IOS APP使用，RaspCTL服务均以Ajax形式提供。希望Plugins开发者也遵照这个规约，但不强制。<br />
</span><span style="font-size: 13px; line-height: 1.25em; ">类库中，只要被标志@classmethod的方法，会直接暴露成Ajax服务，如：</span></span></h2>
<pre class="prettyprint" 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; line-height: normal; "><span class="kwd" style="color: #000088; ">class</span><span class="pln"> </span><span class="typ" style="color: #660066; ">Foo</span><span class="pun" style="color: #666600; ">:</span><span class="pln"><br />
&nbsp; &nbsp; </span><span class="lit" style="color: #006666; ">@classmethod</span><span class="pln"><br />
&nbsp; &nbsp; </span><span class="kwd" style="color: #000088; ">def</span><span class="pln"> hello</span><span class="pun" style="color: #666600; ">(</span><span class="pln">cls</span><span class="pun" style="color: #666600; ">,</span><span class="pln"> arg1</span><span class="pun" style="color: #666600; ">,</span><span class="pln"> arg2</span><span class="pun" style="color: #666600; ">):</span><span class="pln"> <br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd" style="color: #000088; ">return</span><span class="pln"> </span><span class="pun" style="color: #666600; ">{</span><span class="pln">msg</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="str" style="color: #008800; ">'Hello Ajax[%s %s]'</span><span class="pln"> </span><span class="pun" style="color: #666600; ">%</span><span class="pln"> </span><span class="pun" style="color: #666600; ">(</span><span class="pln">arg1</span><span class="pun" style="color: #666600; ">,</span><span class="pln"> arg2</span><span class="pun" style="color: #666600; ">)}</span></pre>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><br />
Ajax服务地址为：<tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em; ">http://xxx.xxx.xxx.xxx:8000/api?data={"name":"Foo.hello", "args":["stone2083", "connie2083"]</tt>} 服务信息为：</p>
<pre class="prettyprint" 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; line-height: normal; "><span class="pun" style="color: #666600; ">{</span><span class="pln"><br />
&nbsp; status</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="str" style="color: #008800; ">"Success"</span><span class="pun" style="color: #666600; ">,</span><span class="pln"><br />
&nbsp; message</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="str" style="color: #008800; ">"Success"</span><span class="pun" style="color: #666600; ">,</span><span class="pln"><br />
&nbsp; api</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="pun" style="color: #666600; ">{</span><span class="pln"><br />
&nbsp; &nbsp; args</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="pun" style="color: #666600; ">[</span><span class="pln"> </span><span class="pun" style="color: #666600; ">],</span><span class="pln"><br />
&nbsp; &nbsp; name</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="str" style="color: #008800; ">"Foo.hello"</span><span class="pln"><br />
&nbsp; </span><span class="pun" style="color: #666600; ">},</span><span class="pln"><br />
&nbsp; result</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="pun" style="color: #666600; ">{</span><span class="pln"><br />
&nbsp; &nbsp; msg</span><span class="pun" style="color: #666600; ">:</span><span class="pln"> </span><span class="str" style="color: #008800; ">"Hello Ajax[stone2083 connie2083]"</span><span class="pln"><br />
&nbsp; </span><span class="pun" style="color: #666600; ">}</span><span class="pln"><br />
</span><span class="pun" style="color: #666600; ">}</span></pre>
<h2 style="font-size: large; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">Plugins规范</h2>
<pre class="prettyprint" 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; line-height: normal; "><span class="pln">youku </span><span class="pun" style="color: #666600; ">--&gt;</span><span class="pln"> </span><span class="pun" style="color: #666600; ">插件名字</span><span class="pln"><br />
&nbsp; &nbsp; __init__</span><span class="pun" style="color: #666600; ">.</span><span class="pln">py </span><span class="pun" style="color: #666600; ">--&gt;</span><span class="pln"> </span><span class="pun" style="color: #666600; ">插件程序</span><span class="pln"><br />
&nbsp; &nbsp; index</span><span class="pun" style="color: #666600; ">.</span><span class="pln">html </span><span class="pun" style="color: #666600; ">--&gt;</span><span class="pln"> </span><span class="pun" style="color: #666600; ">插件模板</span><span class="pln"> </span><span class="pun" style="color: #666600; ">【可选择】</span></pre>
<p style="line-height: 1.25em; max-width: 64em; font-family: arial, sans-serif; font-size: 13px; "><em></em>init<em></em>.py 内容为：</p>
<pre class="prettyprint" 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; line-height: normal; "><span class="kwd" style="color: #000088; ">from</span><span class="pln"> rasplib </span><span class="kwd" style="color: #000088; ">import</span><span class="pln"> </span><span class="typ" style="color: #660066; ">Plugin</span><span class="pln"><br />
urls </span><span class="pun" style="color: #666600; ">=</span><span class="pln"> </span><span class="pun" style="color: #666600; ">(</span><span class="pln"><br />
&nbsp; &nbsp; </span><span class="str" style="color: #008800; ">'/'</span><span class="pun" style="color: #666600; ">,</span><span class="pln"> </span><span class="str" style="color: #008800; ">'Index'</span><span class="pun" style="color: #666600; ">,</span><span class="pln"><br />
</span><span class="pun" style="color: #666600; ">)</span><span class="pln"><br />
<br />
</span><span class="com" style="color: #880000; "># 必须创建plugin实例，参数分别为插件名，作者名，版本号， 支持功能的urls</span><span class="pln"><br />
</span><span class="com" style="color: #880000; ">#其中，plugin中包含RaspCTL类库的所有方法，可直接调用</span><span class="pln"><br />
plugin </span><span class="pun" style="color: #666600; ">=</span><span class="pln"> </span><span class="typ" style="color: #660066; ">Plugin</span><span class="pun" style="color: #666600; ">(</span><span class="str" style="color: #008800; ">'youku'</span><span class="pun" style="color: #666600; ">,</span><span class="str" style="color: #008800; ">'stone2083'</span><span class="pun" style="color: #666600; ">,</span><span class="pln"> </span><span class="str" style="color: #008800; ">'0.1'</span><span class="pun" style="color: #666600; ">,</span><span class="pln"> urls</span><span class="pun" style="color: #666600; ">)</span><span class="pln"><br />
<br />
</span><span class="com" style="color: #880000; ">#web.py写法，插件规范并不引入新的学习成本。</span><span class="pln"><br />
</span><span class="kwd" style="color: #000088; ">class</span><span class="pln"> </span><span class="typ" style="color: #660066; ">Index</span><span class="pun" style="color: #666600; ">:</span><span class="pln"><br />
&nbsp; &nbsp; </span><span class="kwd" style="color: #000088; ">def</span><span class="pln"> GET</span><span class="pun" style="color: #666600; ">(</span><span class="kwd" style="color: #000088; ">self</span><span class="pun" style="color: #666600; ">):</span><span class="pln"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd" style="color: #000088; ">return</span><span class="pln"> </span><span class="str" style="color: #008800; ">'youku-NotSupported.'</span><span class="pln"> &nbsp;</span><span class="com" style="color: #880000; ">#可以直接输出</span><span class="pln"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com" style="color: #880000; ">#return plugin.render.index() &nbsp;#可以渲染某个模板信息</span></pre>
<h1 style="font-size: x-large; margin-top: 0px; background-image: none; border: 0px; padding-left: 0px; max-width: 700px; font-family: arial, sans-serif; line-height: normal; ">写在最后</h1>
<ul style="padding-left: 25px; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; line-height: normal; ">
     <li style="margin-bottom: 0.3em; ">RaspCTL作者联系信息：stone2083#yahoo.cn 程序的任何问题可直接联系这个邮箱</li>
     <li style="margin-bottom: 0.3em; ">招募UED设计前端界面 0.1.0前端非常糟糕，急待重构</li>
     <li style="margin-bottom: 0.3em; ">招募Plugin开发者，丰富RaspCTL</li>
     <li style="margin-bottom: 0.3em; ">期待小白鼠适用RaspCTL</li>
</ul><img src ="http://www.blogjava.net/stone2083/aggbug/394311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2013-01-16 16:23 <a href="http://www.blogjava.net/stone2083/archive/2013/01/16/394311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SAE Python 支持web.py (非官方支持)</title><link>http://www.blogjava.net/stone2083/archive/2011/11/24/364738.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Thu, 24 Nov 2011 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/11/24/364738.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/364738.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/11/24/364738.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/364738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/364738.html</trackback:ping><description><![CDATA[感谢limodou，Felinx Lee，获得了一个SAE Python邀请码。<br />
首次倒腾SAE，不熟悉，瞎搞，第一件干的事情，就是尝试如何让SAE支持web.py.<br />
<br /><strong>
1. svn check out</strong><br />
svn co&nbsp;https://svn.sinaapp.com/stone2083 sae<br />
<br /><strong>
2. 创建版本目录</strong><br />
mkdir 1<br />
cd 1/<br />
<br /><strong>
3. copy web.py目录到当前目录</strong><br />
<div>scp -r /usr/share/pyshared/web web<br />
<br /><strong>
4. 编写正常的webpy应用代码</strong><br />
vi webpy.py&nbsp;<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;web<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">urls&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">/</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Home</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Home:<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;GET(self):<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web.header(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Content-Type</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">text/html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Hello&nbsp;Web.py</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">app&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;web.application(urls,&nbsp;globals())<br />
</span></div>
</div><br /><strong>5. 编写index.wsgi<br /></strong>vi index.wsgi<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;sae<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;webpy&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;app<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">application&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sae.create_wsgi_app(app.wsgifunc())</span></div><br /><strong>整体目录结构如下：</strong><br /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/sae.png" width="441" height="166" alt="" /><br /><br />搞定：<br /><div><a href="http://stone2083.sinaapp.com/">http://stone2083.sinaapp.com/</a></div><img src ="http://www.blogjava.net/stone2083/aggbug/364738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-11-24 15:48 <a href="http://www.blogjava.net/stone2083/archive/2011/11/24/364738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSL相关命令随记</title><link>http://www.blogjava.net/stone2083/archive/2011/10/17/361471.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 17 Oct 2011 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/10/17/361471.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/361471.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/10/17/361471.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/361471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/361471.html</trackback:ping><description><![CDATA[<strong>背景</strong><br />之前利用笨重的Java写过内网访问程序（SSL双向认证系统），今天才发现curl等命令对SSL都有良好的支持。<br />故记录相关点滴。<br /><br /><strong>创建CA根证书</strong><br />
<div>
<p>#创建ca私钥<br />
openssl genrsa -out ca.key<br />
#创建证书请求文件（<span class="Apple-style-span" style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">Certificate Secure Request）<br /></span>openssl req -new -key ca.key -out ca.csr</p>
#创建CA根证书<br />
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt<br />
<br />
<strong>创建服务器证书<br />
</strong>#创建服务器私钥<br />
<div style="display: inline !important; ">
<p style="display: inline !important; ">openssl genrsa -out server.key<br />
</p>
</div>
#创建服务器证书请求文件<br />openssl req -new -key server.key -out server.csr<div><p>
#创建服务器证书<br />
openssl ca -in server.csr -cert ca.crt -keyfile ca.key -out server.crt<br />
<br />
<strong>PFX证书转换<br />
</strong>#pfx格式证书导出成pem格式证书<br />
</p>
<div>
<p>openssl pkcs12 -in jinli.pfx -nodes -out jinli.pem<br />
#导出私钥<br />
openssl rsa -in jinli.pem -out jinli.key<br />
#导出证书，公钥<br />
openssl x509 -in jinli.pem -out jinli.crt</p>
</div>
<br />
<strong>curl访问HTTPS命令<br />
</strong>
<div>curl -E jinli.pem:${password} --cacert ca.crt https://www.cn.alibaba-inc.com/</div>
curl --cacert gmail.pem https://mail.google.com/mail<br />
curl --cert jinli.crt --key jinli.key --cacert ca.crt https://www.cn.alibaba-inc.com/<br />
<em>参数解释</em>：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp; &nbsp; --cacert&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">file</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;CA&nbsp;certificate&nbsp;to&nbsp;verify&nbsp;peer&nbsp;against&nbsp;(SSL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;--capath&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">directory</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;CA&nbsp;directory&nbsp;to&nbsp;verify&nbsp;peer&nbsp;against&nbsp;(SSL)<br />
&nbsp;-E/--cert&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cert</span><span style="color: #FF0000; ">[:passwd]</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;Client&nbsp;certificate&nbsp;file&nbsp;and&nbsp;password&nbsp;(SSL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;--cert-type&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">type</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;Certificate&nbsp;file&nbsp;type&nbsp;(DER/PEM/ENG)&nbsp;(SSL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;--key&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">key</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;key&nbsp;file&nbsp;name&nbsp;(SSL/SSH)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--key-type&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">type</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;Private&nbsp;key&nbsp;file&nbsp;type&nbsp;(DER/PEM/ENG)&nbsp;(SSL)</span></div>
<br />
<strong>python访问HTTPS代码</strong><br />
<div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff; ">from</span><span style="color: #000000; ">&nbsp;httplib&nbsp;</span><span style="color: #0000ff; ">import</span><span style="color: #000000; ">&nbsp;HTTPSConnection<br />
<br />
con&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;HTTPSConnection(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">www.cn.alibaba-inc.com</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;cert_file</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">jinli.pem</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />
con.connect()<br />
con.request(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">GET</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">/xxx</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />
res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;con.getresponse()<br />
</span><span style="color: #0000ff; ">print</span><span style="color: #000000; ">&nbsp;res.status<br />
</span><span style="color: #0000ff; ">print</span><span style="color: #000000; ">&nbsp;res.read()<br />
res.close()<br />
con.close()</span></div>
<br />
<strong>python查看证书信息代码<br />
</strong>
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><span style="color: #000000; "><div><span style="color: #0000ff; ">from</span> OpenSSL <span style="color: #0000ff; ">import</span> crypto<br /></div>x509&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;crypto.load_certificate(crypto.FILETYPE_PEM,&nbsp;open(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">cert_file</span><span style="color: #800000; ">'</span><span style="color: #000000; ">).read())<br />
</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">&nbsp;x509.get_issuer()<br />
<br />
pkcs&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;crypto.load_pkcs12(open(pkcs_file).read(),passphrase)<br />
</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">&nbsp;pkcs.get_certificate().get_issuer()</span></div>
<p>&nbsp;</p>
</div>
<p><strong>HTTPSConnection不理解的地方</strong>&nbsp;<br />
</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;wrap_socket(sock,&nbsp;keyfile</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,&nbsp;certfile</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_side</span><span style="color: #000000; ">=</span><span style="color: #000000; ">False,&nbsp;cert_reqs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">CERT_NONE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl_version</span><span style="color: #000000; ">=</span><span style="color: #000000; ">PROTOCOL_SSLv23,&nbsp;ca_certs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do_handshake_on_connect</span><span style="color: #000000; ">=</span><span style="color: #000000; ">True,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;suppress_ragged_eofs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">True,&nbsp;ciphers</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None):<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;SSLSocket(sock,&nbsp;keyfile</span><span style="color: #000000; ">=</span><span style="color: #000000; ">keyfile,&nbsp;certfile</span><span style="color: #000000; ">=</span><span style="color: #000000; ">certfile,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_side</span><span style="color: #000000; ">=</span><span style="color: #000000; ">server_side,&nbsp;cert_reqs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">cert_reqs,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssl_version</span><span style="color: #000000; ">=</span><span style="color: #000000; ">ssl_version,&nbsp;ca_certs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">ca_certs,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do_handshake_on_connect</span><span style="color: #000000; ">=</span><span style="color: #000000; ">do_handshake_on_connect,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;suppress_ragged_eofs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">suppress_ragged_eofs,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ciphers</span><span style="color: #000000; ">=</span><span style="color: #000000; ">ciphers)</span></div>
<p>&nbsp;</p>
</div>
ssl wrap的函数是支持ca_certs参数的，但是HTTPSConnection不支持ca_certs参数<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;HTTPSConnection(HTTPConnection):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">This&nbsp;class&nbsp;allows&nbsp;communication&nbsp;via&nbsp;SSL.</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;HTTPS_PORT<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__init__</span><span style="color: #000000; ">(self,&nbsp;host,&nbsp;port</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,&nbsp;key_file</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,&nbsp;cert_file</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strict</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None,&nbsp;timeout</span><span style="color: #000000; ">=</span><span style="color: #000000; ">socket._GLOBAL_DEFAULT_TIMEOUT,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source_address</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTTPConnection.</span><span style="color: #800080; ">__init__</span><span style="color: #000000; ">(self,&nbsp;host,&nbsp;port,&nbsp;strict,&nbsp;timeout,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source_address)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.key_file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;key_file<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.cert_file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cert_file<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;connect(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Connect&nbsp;to&nbsp;a&nbsp;host&nbsp;on&nbsp;a&nbsp;given&nbsp;(SSL)&nbsp;port.</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket.create_connection((self.host,&nbsp;self.port),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.timeout,&nbsp;self.source_address)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;self._tunnel_host:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sock<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._tunnel()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sock&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ssl.wrap_socket(sock,&nbsp;self.key_file,&nbsp;self.cert_file)</span></div><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stone2083/aggbug/361471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-10-17 20:22 <a href="http://www.blogjava.net/stone2083/archive/2011/10/17/361471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谁说web.py性能差？</title><link>http://www.blogjava.net/stone2083/archive/2011/09/30/359860.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Fri, 30 Sep 2011 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/09/30/359860.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/359860.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/09/30/359860.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/359860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/359860.html</trackback:ping><description><![CDATA[一直在网上听说web.py性能比较差，TPS才几十个。这个道听途说让我一度放弃了web.py。<br />
对比了一圈python web framework后，还是让我对web.py的simple和它的设计理念念念不忘。<br />
<br />
<strong>机器介绍</strong><br />
<div>机型：ThinkPad R400 笔记本<br />
CPU：Intel(R) Core(TM)2 Duo CPU &nbsp; &nbsp; P8700 &nbsp;@ 2.53GHz<br />
Mem： 2G<br />
系统：Ubuntu11.04 32位操作系统<br />
备注：服务器上没有python环境，所以只拿个人电脑做测试。<br />
<br />
<strong>测试内容<br />
</strong>输出当前时间信息<br />
1. &lt;%= new Date() %&gt;<br />
2. time.ctime()<br />
<br />
<strong>对比测试数据</strong><br />
<table border="1" cellspacing="2" cellpadding="2" width="500" bordercolor="" style="font-weight: bold; border-collapse: collapse; ">
     <tbody>
         <tr>
             <td>服务器</td>
             <td>并发数量</td>
             <td>TPS</td>
             <td>平均响应时间</td>
         </tr>
         <tr>
             <td>Tomcat6 + JDK6</td>
             <td>50</td>
             <td>6519.29</td>
             <td>7.67MS</td>
         </tr>
         <tr>
             <td>CherryPy + Webpy</td>
             <td>25</td>
             <td>1328.56</td>
             <td>18.82MS</td>
         </tr>
         <tr>
             <td>CherryPy + Webpy</td>
             <td>30</td>
             <td>Fail</td>
             <td>Fail</td>
         </tr>
         <tr>
             <td>Lighttpd + Flup(FCGI) + Webpy</td>
             <td>25</td>
             <td>1535.98</td>
             <td>16.28MS</td>
         </tr>
         <tr>
             <td>Lighttpd + Flup(FCGI) + Webpy</td>
             <td>50</td>
             <td>1546.11</td>
             <td>32.339MS</td>
         </tr>
     </tbody>
</table>
<br />
<strong>
测试感受</strong><br />
1. webpy自带的CherryPy服务器性能也比传说的强多了，只是难以支撑高并发的请求。也难怪，本来就是一个用于开发的服务器，也不能要求太多；<br />
2. Flup（FCGI）下，TPS达到1500左右，完全能够支撑一般应用的运营要求了；<br />
3. 在专业服务器下，webpy fcgi tps自信能达到4-5k左右。足够了；<br />
4. 和Java相比，确实存在一定差距，但是在开发效率上，远远快于Java；<br />
5. web.py成为我日后web开发首选；<br />
6. 凡事不要道听途说，需要眼见为实。<br /><br />附上测试报告图片：<br /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/tomcat.png" width="100" height="33" alt="" /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/cherry.png" width="100" height="34" alt="" /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/flup_25.png" width="100" height="34" alt="" /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/flup.png" width="100" height="34" alt="" /></div><img src ="http://www.blogjava.net/stone2083/aggbug/359860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-09-30 14:51 <a href="http://www.blogjava.net/stone2083/archive/2011/09/30/359860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DNS代理服务器</title><link>http://www.blogjava.net/stone2083/archive/2011/07/04/353664.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 04 Jul 2011 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/07/04/353664.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/353664.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/07/04/353664.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/353664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/353664.html</trackback:ping><description><![CDATA[背景接上文：<a href="http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html">http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html<br /></a>随笔摘自6月13日邮件分享<br />目前此软件在公司测试环境上运行良好，故分享给大家。<a href="http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html"><br /><br /></a>以下为分享内容：<a href="http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html"><br /><br /></a><div><span style="font-family: Arial, songti, 宋体, sumsun, sans-serif; font-size: 13px; line-height: 13px; "><p id="yui_3_2_0_3_1309782060553110" style="color: #454545; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; "><strong><span style="font-family: 宋体; color: #1f497d; ">好处</span></strong><span style="font-family: 宋体; color: #1f497d; ">：</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">一个项目、小需求，需要绑定的</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">，只需要一份</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">信息即可。不必每个用户自行管理各自电脑的</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">。达到一人配置，多人使用的目的</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">绑定的</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">，支持通配符。方便类似旺铺域名的需求，只需要配置一个带通配符的域名即可</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">要在不同项目，小需求切换不同的</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">时，只需要轻轻一点，方便</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">要想使用代理服务器，只需要本地</span><span style="color: #1f497d; ">DNS</span><span style="font-family: 宋体; color: #1f497d; ">设置一下即可，方便</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">本机</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">配置优先</span></p><p style="color: #454545; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; ">&nbsp;</p><p style="color: #454545; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; "><strong><span style="font-family: 宋体; color: #1f497d; ">如何使用：</span></strong><span style="font-family: 宋体; color: #1f497d; ">（以</span><span style="color: #1f497d; ">10.20.131.207</span><span style="font-family: 宋体; color: #1f497d; ">环境介绍）</span><span style="font-family: 宋体; color: red; ">备注：公司内部环境，外部无法访问，如果需要，请自行搭建</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">登陆</span><span style="color: #1f497d; ">DNS</span><span style="font-family: 宋体; color: #1f497d; ">后台管理页面</span><span style="color: #1f497d; ">URL</span><span style="font-family: 宋体; color: #1f497d; ">：</span><span style="color: #1f497d; "><a rel="nofollow" target="_blank" href="http://10.20.131.207:8000/" style="text-decoration: underline; color: blue; outline-style: none; outline-width: initial; outline-color: initial; "><span style="color: #1f497d; text-decoration: none; ">http://10.20.131.207:8000/</span></a></span><span style="font-family: 宋体; color: #1f497d; ">，点击</span><span style="color: #1f497d; ">Add</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; font-size: 10.5pt; font-family: sans-serif; "><font class="Apple-style-span" color="#1f497d"><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/1.jpg" border="0" alt="" width="331" height="218" /><br /></font></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">添加一个项目的</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">信息，点击添加</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; font-size: 10.5pt; font-family: sans-serif; "><font class="Apple-style-span" color="#1f497d"><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/2.jpg" border="0" alt="" width="292" height="248" /><br /></font></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">在</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">信息页面，点击</span><span style="color: #1f497d; ">assign</span><span style="font-family: 宋体; color: #1f497d; ">，绑定自己电脑</span><span style="color: #1f497d; ">IP</span><span style="font-family: 宋体; color: #1f497d; ">和某个</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">的关联</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; font-size: 10.5pt; font-family: sans-serif; "><font class="Apple-style-span" color="#1f497d"><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/3.jpg" border="0" alt="" width="331" height="211" /><br /></font></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d; ">IP List</span><span style="font-family: 宋体; color: #1f497d; ">页面上，显示了不同</span><span style="color: #1f497d; ">IP</span><span style="font-family: 宋体; color: #1f497d; ">和</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">关联的信息</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; font-size: 10.5pt; font-family: sans-serif; "><font class="Apple-style-span" color="#1f497d"><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/4.jpg" border="0" alt="" width="266" height="231" /><br /></font></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; text-indent: 21pt; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; ">5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: #1f497d; ">将本机电脑的</span><span style="color: #1f497d; ">DNS</span><span style="font-family: 宋体; color: #1f497d; ">服务器设置成</span><span style="color: #1f497d; ">DNS</span><span style="font-family: 宋体; color: #1f497d; ">代理服务器即可（</span><span style="color: #1f497d; ">10.20.131.207</span><span style="font-family: 宋体; color: #1f497d; ">）</span><span style="color: #1f497d; ">--&nbsp;</span><span style="font-family: 宋体; color: #1f497d; ">只需要一次操作即可，以后一直能用</span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; font-size: 10.5pt; font-family: sans-serif; "><span style="color: #1f497d; "><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/5.jpg" border="0" alt="" width="484" height="421" /><img src="http://www.blogjava.net/images/blogjava_net/stone2083/python/6.png" border="0" alt="" width="447" height="155" /></span></p><p style="color: #454545; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0.0001pt; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; text-align: justify; font-size: 10.5pt; font-family: sans-serif; "><span style="font-family: 宋体; color: #1f497d; ">左图为</span><span style="color: #1f497d; ">windows</span><span style="font-family: 宋体; color: #1f497d; ">配置，右图为</span><span style="color: #1f497d; ">linux</span><span style="font-family: 宋体; color: #1f497d; ">配置</span></p><p id="yui_3_2_0_3_1309782060553126" style="color: #454545; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; ">&nbsp;</p><p style="color: #454545; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: block; line-height: normal; "><span style="font-family: 宋体; color: #1f497d; ">此时，你访问域名，如果在</span><span style="color: #1f497d; ">2011tp hosts</span><span style="font-family: 宋体; color: #1f497d; ">中，则直接返回</span><span style="color: #1f497d; ">Hosts</span><span style="font-family: 宋体; color: #1f497d; ">中的</span><span style="color: #1f497d; ">IP;</span><span style="font-family: 宋体; color: #1f497d; ">反之，则返回真实</span><span style="color: #1f497d; ">IP。<br /><br /><br />如何启动服务<br />1. 启动DNS代理服务器服务<br />1.1 cd dns/dns<br />1.2 vi settings.py 修改配置信息<br />1.3 python -u main.py<br /><br />2. 启动DNS BackOffice服务<br />2.1 cd dns/config<br />2.2 vi settings.py 修改配置信息<br />2.3 python -u manage.py runserver<br /><br /><br /></span><span style="color: #1f497d; "><strong>软件下载：<a title="DNS Proxy Server" href="/Files/stone2083/python/dns.zip">DNS Proxy Server</a></strong></span><span style="color: #1f497d; "><br /><br />============================================================================================<br />为了满足&#8220;邪恶&#8221;的人们能更方便的使用这个软件（貌似邪恶的人特别看重这个软件通配符的功能，具体邪恶在哪里，我不具体描述了，给个<a href="http://www.bigsea.tk/personal-computer-to-install-the-dns-proxy-server.html" title="链接"><strong>链接</strong></a>），我特意写了一个standalone的版本：<br />1. 去除无用的backoffice功能<br />2. 去除通过事件机制reload hosts文件的功能<br />3. 去除复杂的settings配置文件，改用简单的命令行方式<br />4. 特意为windows用户制作了一个exe文件，可以直接使用<br /><br />linux用户使用方案：<br />python standalone.py -s xxx.xxx.xxx.xxx (上级dns地址)<br />python standalone.py -s xxx.xxx.xxx.xxx -f /etc/hosts2 (指定hosts文件，默认是/etc/hosts)<br /><br />windows用户使用方案，进入dist（exe发布目录）<br />dns.exe -s xxx.xxx.xxx.xxx (上级dns地址)<br />dns.exe -s xxx.xxx.xxx.xxx -f d:/hosts （指定hosts文件，默认是c:/windows/system32/drivers/etc/hosts）<br /><br />对于不放心使用exe的客户来说，可以进入dns目录，通过py2exe工具自行发布成exe软件，方法如下<br />python setup.py py2exe<br /><br /><a title="standalone版本下载" href="/Files/stone2083/python/standalone.zip"><strong>standalone版本下载</strong></a><br /><br /></span></p></span></div><img src ="http://www.blogjava.net/stone2083/aggbug/353664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-07-04 20:39 <a href="http://www.blogjava.net/stone2083/archive/2011/07/04/353664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩展Python MySQLdb Cursor</title><link>http://www.blogjava.net/stone2083/archive/2011/06/18/352552.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Fri, 17 Jun 2011 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/06/18/352552.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/352552.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/06/18/352552.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/352552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/352552.html</trackback:ping><description><![CDATA[Python shell下操作mysql一直使用MySqldb。<br />
其默认的Cursor Class是使用tuple（元组）作为数据存储对象的，操作非常不便<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cursor.fetchone()<br />
</span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">(p[0],&nbsp;p[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])<br />
</span></div>
如果有十几个字段，光是数数位数，就把我数晕了。<br />
<br />
当然，MySqldb Cursor Class本身就提供了扩展，我们可以切换成DictCurosor作为默认数据存储对象，如<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">MySQLdb.connect(host</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">127.0.0.1</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;user</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">sample</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;passwd</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">123456</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;db</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">sample</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,<strong>&nbsp;</strong></span><strong><span style="color: red; ">cursorclass</span><span style="color: red; ">=</span><span style="color: red; ">DictCursor</span></strong><span style="color: #000000; ">,&nbsp;charset</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">utf8</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008000; ">#</span><span style="color: #008000; "><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000; "><br /></span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cursor.fetchone()<br /></span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">(p[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">id</span><span style="color: #800000; ">'</span><span style="color: #000000; ">],&nbsp;p[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">name</span><span style="color: #800000; ">'</span><span style="color: #000000; ">])</span></div>
字典的方式优于元祖。<br /><br />但是，"[]"这个符号写写比较麻烦，并且我编码风格带有强烈的Java习惯，一直喜欢类似"p.id","p.name"的写法。<br />于是，扩展之<br />1. 扩展Dict类，使其支持"."方式：<br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Dict(dict):<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__getattr__</span><span style="color: #000000; ">(self,&nbsp;key):<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;self[key]<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__setattr__</span><span style="color: #000000; ">(self,&nbsp;key,&nbsp;value):<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self[key]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__delattr__</span><span style="color: #000000; ">(self,&nbsp;key):<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">del</span><span style="color: #000000; ">&nbsp;self[key]</span></div>2. 扩展Curosor，使其取得的数据使用Dict类：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Cursor(CursorStoreResultMixIn,&nbsp;BaseCursor):<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;_fetch_type&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;fetchone(self):<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;Dict(CursorStoreResultMixIn.fetchone(self))<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;fetchmany(self,&nbsp;size</span><span style="color: #000000; ">=</span><span style="color: #000000; ">None):<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(Dict(r)&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;r&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;CursorStoreResultMixIn.fetchmany(self,&nbsp;size))<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;fetchall(self):<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(Dict(r)&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;r&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;CursorStoreResultMixIn.fetchall(self))</span></div><br />这下，就符合我的习惯了：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">MySQLdb.connect(host</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">127.0.0.1</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;user</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">sample</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;passwd</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">123456</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;db</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">sample</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;cursorclass</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Cursor,&nbsp;charset</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">utf8</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">#</span><span style="color: #008000; "><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000; "><br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cursor.fetchone()<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">(p.id,&nbsp;p.name)</span></div><br /><img src ="http://www.blogjava.net/stone2083/aggbug/352552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-06-18 00:41 <a href="http://www.blogjava.net/stone2083/archive/2011/06/18/352552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hosts绑定新思路之DNS代理服务器实现篇</title><link>http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 23 May 2011 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/350875.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/350875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/350875.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 背景详见《Hosts绑定新思路之DNS代理篇》核心内容1. DNS协议解析2. 启动UDP服务，监听53端口3. 根据DB或者文本，进行Hosts解析DNS协议DNS Protocol Overview （推荐）非强详细，但是不怎么看得懂的长篇大论如果没有耐心的同学，可以看看我通过wireshark分析之后制作的两张gif图片。大概能知道DNS协议的...&nbsp;&nbsp;<a href='http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html'>阅读全文</a><img src ="http://www.blogjava.net/stone2083/aggbug/350875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-05-23 21:24 <a href="http://www.blogjava.net/stone2083/archive/2011/05/23/350875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hosts绑定新思路之DNS代理篇</title><link>http://www.blogjava.net/stone2083/archive/2011/05/23/350871.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 23 May 2011 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/05/23/350871.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/350871.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/05/23/350871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/350871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/350871.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: separate; color: #000000; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 14px;"><p style="margin: 0px;"><span style="color: #1f497d;"><strong>前言</strong></span></p><p style="margin: 0px;"><span style="color: #1f497d;">此文摘自2011年5月23日邮件分享，为《Hosts绑定新思路之HTTP代理篇》续集</span></p><p style="margin: 0px;"><br /><span style="color: #1f497d;"></span></p><p style="margin: 0px;"><span style="color: #1f497d;"><br /></span></p><p style="margin: 0px;"><span style="color: #1f497d;">电视有续集</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">电影也有续集</span><span style="color: #1f497d;">,Hosts</span><span style="color: #1f497d;">绑定思路同样有续集</span><span style="color: #1f497d;">.</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: #1f497d;">我们先用一句话来回顾下</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">上集中关于</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">绑定的思路</span><span style="color: #1f497d;">:</span></p><p style="margin: 0px;"><strong><span style="color: #1f497d;">原理</span></strong><span style="color: #1f497d;">:</span><span style="color: #1f497d;">利用</span><span style="color: #1f497d;">Http</span><span style="color: #1f497d;">代理的方式</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">将分散在各个客户端的</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;"><wbr>绑定</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">集中绑定在</span><span style="color: #1f497d;">Http</span><span style="color: #1f497d;">代理服务器上</span></p><p style="margin: 0px;"><strong><span style="color: #1f497d;">优点</span></strong><span style="color: #1f497d;">:</span><span style="color: #1f497d;">集中管理</span></p><p style="margin: 0px;"><strong><span style="color: #1f497d;">缺点</span></strong><span style="color: #1f497d;">:</span><span style="color: #1f497d;">一台</span><span style="color: #1f497d;">Http</span><span style="color: #1f497d;">代理服务器</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">只能绑定一组</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">信息</span></p><p style="margin: 0px;"><span style="color: #1f497d;">(</span><span style="color: #1f497d;">详细内容</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">请见之前的邮件</span><span style="color: #1f497d;">)</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: #1f497d;">在当时描述方案邮件的时候</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">也意识到了方案存在的不足</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">所以一直<wbr>在思考改进方案</span><span style="color: #1f497d;">(</span><span style="color: #1f497d;">详见之前邮件中最后一节</span><span style="color: #1f497d;">&#8212;</span><span style="color: #1f497d;">改进方案思路</span><span style="color: #1f497d;">).</span></p><p style="margin: 0px;"><span style="color: #1f497d;">经过一段时间的思考</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">改进方案有了大概的雏形</span><span style="color: #1f497d;">:&nbsp;</span><strong><span style="color: #1f497d;">将之前的</span><span style="color: #1f497d;">HTTP</span></strong><strong><span style="color: #1f497d;">代理方案</span><span style="color: #1f497d;">&nbsp;</span></strong><strong><span style="color: #1f497d;">替换成</span><span style="color: #1f497d;">&nbsp;DNS</span></strong><strong><span style="color: #1f497d;">代理方案</span></strong></p><p style="margin: 0px;"><strong>&nbsp;</strong></p><p style="margin: 0px;"><span style="color: #1f497d;">俗话说得好</span><span style="color: #1f497d;">:</span><span style="color: #1f497d;">有图有真相</span><span style="color: #1f497d;">.</span><span style="color: #1f497d;">先贴上一张架构图</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">之后再用文字慢慢解<wbr>释</span><span style="color: #1f497d;">&nbsp;</span><span style="font-family: Wingdings; color: #1f497d;"></span></p><p style="margin: 0px;"><span style="color: #1f497d;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h7.png" height="856" width="885" /><br /></span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: #1f497d;">架构中核心组件是</span><span style="color: #1f497d;">:<strong>DNS BackOffice</strong></span><strong><span style="color: #1f497d;">服务器</span><span style="color: #1f497d;">&nbsp;</span></strong><span style="color: #1f497d;">和</span><strong><span style="color: #1f497d;">DNS</span></strong><strong><span style="color: #1f497d;">代理服务器</span></strong></p><p style="margin: 0px;"><span style="color: #1f497d;">DNS BackOffice</span><span style="color: #1f497d;">服务器的作用有</span><span style="color: #1f497d;">:</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">开发</span><span style="color: #1f497d;">/</span><span style="color: #1f497d;">测试管理员通过</span><span style="color: #1f497d;">BackOffice</span><span style="color: #1f497d;">服务维护各自项目的绑<wbr>定信息</span><span style="color: #1f497d;">,BackOffice</span><span style="color: #1f497d;">服务将之持久化</span><span style="color: #1f497d;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (</span><span style="color: #1f497d;">图中</span><span style="color: #1f497d;">&nbsp;</span><span style="color: #1f497d;">蓝色虚线</span><span style="color: #1f497d;">)</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">开发</span><span style="color: #1f497d;">/</span><span style="color: #1f497d;">测试人员通过</span><span style="color: #1f497d;">BackOffice</span><span style="color: #1f497d;">服务</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">告知需要哪个项目<wbr>的绑定信息</span><span style="color: #1f497d;">,BackOffice</span><span style="color: #1f497d;">服务将之持久化</span><span style="color: #1f497d;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<wbr>&nbsp;&nbsp; &nbsp;(</span><span style="color: #1f497d;">图中</span><span style="color: #1f497d;">&nbsp;</span><span style="color: #1f497d;">黑色虚线</span><span style="color: #1f497d;">)</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">代理服务器的作用有</span><span style="color: #1f497d;">:</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">拦截</span><span style="color: #1f497d;">Domain Name</span><span style="color: #1f497d;">的解析</span><span style="color: #1f497d;">.</span><span style="color: #1f497d;">通过来源</span><span style="color: #1f497d;">IP</span><span style="color: #1f497d;">判断需要绑定的</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">信息</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">通<wbr>过</span><span style="color: #1f497d;">File/DB</span><span style="color: #1f497d;">得到对应的</span><span style="color: #1f497d;">IP,</span><span style="color: #1f497d;">通过</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">协议返回</span><span style="color: #1f497d;">&nbsp; (</span><span style="color: #1f497d;">图中</span><span style="color: #1f497d;">&nbsp;</span><span style="color: #1f497d;">红色实线</span><span style="color: #1f497d;">&nbsp;</span><span style="color: #1f497d;">和</span><span style="color: #1f497d;">&nbsp;</span><span style="color: #1f497d;">黑色实线</span><span style="color: #1f497d;">)</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">如果不在绑定之列</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">则请求上级</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">服务器</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">返回其</span><span style="color: #1f497d;">Respon<wbr>se.</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><strong><span style="color: #1f497d;">此方案的优势</span></strong><span style="color: #1f497d;">:</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">本地</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">绑定优先</span><span style="color: #1f497d;">.</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">只要本地</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">有绑定</span><span style="color: #1f497d;">IP,</span><span style="color: #1f497d;">则不会请求</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">代理服务器</span><span style="color: #1f497d;">.</span><span style="color: #1f497d;">只<wbr>请求本地</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">文件</span><span style="color: #1f497d;">.</span><span style="color: #1f497d;">能满足个性化需求</span><span style="color: #1f497d;">.</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">代理服务器支持多种绑定方式</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">如通配符</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">正则等</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">对于目前旺铺</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">完全可以使用通配符</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">如</span><span style="color: #1f497d;">&nbsp;*.<a href="http://cn.alibaba.com/" target="_blank" style="color: #0000cc;">cn.alibaba.com</a>,</span><span style="color: #1f497d;">简化配置工作量</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">3.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">操作简单</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">只要将</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">服务器设置成</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">代理服务器</span><span style="color: #1f497d;">IP</span><span style="color: #1f497d;">即可</span><span style="color: #1f497d;">&nbsp;(</span><span style="color: #1f497d;">附录中有详细说明</span><span style="color: #1f497d;">)</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">4.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">有效利用现有成果</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">目前测试同学已经集中维护了</span><span style="color: #1f497d;">Hosts</span><span style="color: #1f497d;">绑定信息</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">只要部署</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;"><wbr>代理服务器</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">并做简单的集成即可</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">5.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">代理服务器代码轻量小巧</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">易于修改扩展</span></p><p style="margin-left: 18pt;"><span style="color: #1f497d;">目前一共只有</span><span style="color: #1f497d;">212</span><span style="color: #1f497d;">行代码</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">其中</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">协议部分</span><span style="color: #1f497d;">130</span><span style="color: #1f497d;">行</span><span style="color: #1f497d;">,DNS</span><span style="color: #1f497d;"><wbr>代理部分</span><span style="color: #1f497d;">82</span><span style="color: #1f497d;">行</span><span style="color: #1f497d;">.</span></p><p style="margin-left: 18pt;">&nbsp;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><strong><span style="color: #1f497d;">附录</span></strong></p><p style="margin-left: 36pt;"><span style="color: #1f497d;">I.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #1f497d;">客户端如何设置</span><span style="color: #1f497d;">DNS</span><span style="color: #1f497d;">服务器</span></p><p style="margin-left: 36pt;"><span style="color: #1f497d;">Windows</span><span style="color: #1f497d;">用户</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">见图</span><span style="color: #1f497d;">:</span></p><p style="margin-left: 36pt;"><span style="color: #1f497d;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h8.jpg" height="421" width="484" /><br /></span></p><p style="margin-left: 36pt;"><span style="color: #1f497d;">Linux</span><span style="color: #1f497d;">用户</span><span style="color: #1f497d;">,</span><span style="color: #1f497d;">见图</span><span style="color: #1f497d;">:</span></p><p style="margin-left: 36pt;"><span style="color: #1f497d;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h9.png" height="155" width="447" /><br /></span></p><p style="margin-left: 36pt;"><span style="color: #1f497d;">修改</span><span style="color: #1f497d;">&nbsp;/etc/resolv.conf</span><span style="color: #1f497d;">文件即可</span></p></span></span></div><img src ="http://www.blogjava.net/stone2083/aggbug/350871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-05-23 19:42 <a href="http://www.blogjava.net/stone2083/archive/2011/05/23/350871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hosts绑定新思路之HTTP代理篇</title><link>http://www.blogjava.net/stone2083/archive/2011/05/23/350868.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Mon, 23 May 2011 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/05/23/350868.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/350868.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/05/23/350868.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/350868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/350868.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: separate; color: #000000; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 14px;"><p style="margin: 0px;"><strong><span style="font-size: 16pt;">前言</span></strong></p><p style="margin: 0px;"><strong><span style="font-size: 16pt;"><div><span style="border-collapse: separate; color: #000000; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 14px;">此文摘自2011年3月22日邮件分享</span></span></div></span></strong></p><br /><p style="margin: 0px;"><strong><span style="font-size: 16pt;">现状</span></strong></p><p style="margin: 0px;">平时开发,测试,功能预演阶段,为了能够正常访问应用,需要做H<wbr>osts绑定.随着应用数量的不断增多,绑定量也是急剧上升.例<wbr>如最近工作平台三期项目,需要绑定的环境多达44个.一旦有变动<wbr>,需要通知所有人员做本地Hosts的调整,维护成本那是相当地<wbr>大.</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">用一张图,来描述下目前我们的方案:</p><p style="margin: 0px;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h1.jpg" height="382" width="487" /><br /></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">如果站在面向对象编程的角度,来思考这张图,我们会发现.</p><p style="margin-left: 18pt;"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>利用客户端本地Hosts绑定来实现,并且客户端数量不可控&#8212;利<wbr>用客户端解决需求,但客户端维护不在可控范围内</p><p style="margin-left: 18pt;"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>Hosts绑定是非常不稳定的&#8212;需求易变</p><p style="margin-left: 18pt;">&nbsp;</p><p style="margin: 0px;">这样的设计,违反了&#8221;封装变化&#8221;的设计原则,故一旦有变动,维护<wbr>成本非常大.</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><strong><span style="font-size: 16pt;">新方案思路</span></strong></p><p style="margin: 0px;">按照&#8221;封装变化&#8221;的设计原则,我们就应该把&#8221;域名绑定&#8221;这个易变<wbr>需求,进行统一管理.</p><p style="margin: 0px;">看上图,我们会发现,DNS的职责就是做域名解析的,并且DNS<wbr>管理比较可控.</p><p style="margin: 0px;">于是第一反应,我们可以使用内部域名解析服务器来绑定这些域名.</p><p style="margin: 0px;">但是问题又来了,DNS来做测试环境域名解析,太重量级了.同一<wbr>个域名,对应测试服务器IP有多个,绑定哪一个好呢?并且域名对<wbr>应IP不断变化,IT DNS负责人不被我们累死啊?&nbsp;<span style="font-family: Wingdings;"></span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">既然DNS上做文章不可行,又需要统一管理的地方,那么我们只能<wbr>再抽象出一个新的概念来.</p><p style="margin: 0px;">同样,我们利用一张图,来描述下整体架构.</p><p style="margin: 0px;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h2.jpg" /><br /></p><p style="margin: 0px;"><br /></p><p style="margin: 0px;">与上图相对,此图多了一个&#8221;代理服务器&#8221;的概念,即Hosts绑<wbr>定动作在此概念上完成.</p><p style="margin: 0px;">流程如下:</p><p style="margin-left: 18pt;"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>客户端浏览器设置代理服务器,将所有请求发送到代理服务器上</p><p style="margin-left: 18pt;"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>代理服务器检查本地Hosts绑定,如绑定则直接解析,反之进入<wbr>流程3</p><p style="margin-left: 18pt;"><span>3.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>代理服务器通过内部域名服务器解析域名</p><p style="margin-left: 18pt;"><span>4.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>代理服务器发送请求到测试服务器上,并且将响应内容返回给客户端</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">具体尝试性实施方案如下(在XX项目过程中有成功案例)</p><p style="margin-left: 18pt;"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>利用squid搭建代理服务器&nbsp;(代理地址:&nbsp;<a href="http://10.20.131.207:3128/" target="_blank" style="color: #0000cc;">10.20.131.207:3128</a>)</p><p style="margin-left: 18pt;">备注:</p><p style="margin-left: 18pt;">Squid配置介绍见附录I</p><p style="margin-left: 18pt;">&nbsp;</p><p style="margin-left: 18pt;"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>浏览器配置代理</p><p style="margin-left: 18pt;">全局代理:&nbsp;代理服务器上,直接填写&nbsp;10.20.131.207 3128</p><p style="margin-left: 18pt;">局部代理:&nbsp;通过pac实现,选择&#8221;使用自动配置脚本&#8221;,脚本格式内容如下:</p><p style="margin-left: 18pt;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h3.jpg" /><br /></p><p style="margin-left: 18pt;"><br /></p><p style="margin-left: 18pt;">备注:</p><p style="margin-left: 18pt;">Pac脚本详细介绍见附录II</p><p style="margin-left: 18pt;">为了防止将配置工作带给PD,销售等,我们可以使用配置好的绿色<wbr>浏览器提供直接使用.</p><p style="margin-left: 18pt;">推荐一款:GreenBrowser:<a href="http://www.morequick.com/indexen.htm"> http://www.morequick.com/indexen.htm</a></p><p style="margin-left: 18pt;">&nbsp; <br /></p><p style="margin-left: 18pt;">IE具体配置,见下图:</p><p style="margin: 0px 0px 0px 18pt;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h4.jpg" height="410" width="425" /><br /></p><p style="margin: 0px 0px 0px 18pt;"><br /></p><p style="margin: 0px;">Firefox同样支持代理和pac脚本</p><p style="margin: 0px;">Chrome需要安装proxy switchy插件来支持.</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><strong><span style="font-size: 16pt;">改进方案思路</span></strong></p><p style="margin: 0px;">上述的方案中,有两个比较大的缺陷</p><p style="margin-left: 18pt;"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>代理服务器没有多实例概念</p><p style="margin-left: 18pt;">代理服务器通过hosts绑定.hosts是全局性的,意味着一<wbr>台代理服务器只能服务一组需求.而事实上,我们不同的项目需要的<wbr>绑定都是不一样的.</p><p style="margin-left: 18pt;"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>特性化需求不能满足</p><p style="margin-left: 18pt;">绑定全在代理服务器上做了,客户端本地个性化需求无法支持</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">所以,我理想中整体架构是这样的,见图:</p><p style="margin: 0px;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/h5.jpg" height="317" width="554" /><br /></p><p style="margin-left: 18pt;"><span>1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>优先查看本地hosts文件</p><p style="margin-left: 18pt;"><span>2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>代理服务器支持多实例部署,不同实例有不同的hosts绑定配置<wbr>.</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">目前具体实现方案,还在构思中.欢迎大家提供实现方案思路.</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><strong><span style="font-size: 16pt;">附录</span></strong><strong><span style="font-size: 16pt;">I</span></strong></p><p style="margin: 0px;"><strong>Squid</strong><strong>权威指南(</strong><strong>中文版):</strong>&nbsp;<a href="http://home.arcor.de/pangj/squid/chap01.html" target="_blank" style="color: #0000cc;">http://home.arcor.de/pangj/<wbr>squid/chap01.html</a></p><p style="margin: 0px;"><strong><span style="font-size: 16pt;">附录</span></strong><strong><span style="font-size: 16pt;">II</span></strong></p><p style="margin: 0px;">Pac介绍:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://en.wikipedia.org/wiki/Proxy_auto-config" target="_blank" style="color: #0000cc;">http://en.wikipedia.org/wiki/<wbr>Proxy_auto-config</a></p><p style="margin: 0px;">Pac函数介绍: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://findproxyforurl.com/pac_functions_explained.html" target="_blank" style="color: #0000cc;">http://findproxyforurl.com/<wbr>pac_functions_explained.html</a></p><p style="margin: 0px;">&nbsp;</p></span></span></div><img src ="http://www.blogjava.net/stone2083/aggbug/350868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-05-23 19:41 <a href="http://www.blogjava.net/stone2083/archive/2011/05/23/350868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>django框架的几个扩展点</title><link>http://www.blogjava.net/stone2083/archive/2011/04/20/348662.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Wed, 20 Apr 2011 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/04/20/348662.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/348662.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/04/20/348662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/348662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/348662.html</trackback:ping><description><![CDATA[前段时间替朋友做了一个物业管理系统，使用了python+django技术，对django有了一些了解。<br />
作为一个一直来使用java的人来说，初次使用django，真正体会到了简单美学。（一共13个功能，不到500行代码）<br />
此文，主要总结下django框架的一些扩展点:<br />
<strong>MIDDLEWARE_CLASSES<br />
</strong>在request请求之前，或者response请求之后，做拦截，允许自定义逻辑。有些类似J2EE Servlet中的Filter概念。<br />
<strong>TEMPLATE_CONTEXT_PROCESSORS<br />
</strong>进入模板渲染之前，允许放入一组用于模板渲染的Key-Value属性。<br />
<strong>TEMPLATE FILTER<br />
</strong>模板中的管道语法，通过自定义行为，添加用于显示的一些逻辑。<br />
<strong>TEMPLATE TAG<br />
</strong>模板tag，添加一组行为。有些类似Velocity中的ToolSet功能。<br />
模板tag+指定模板，充当页面组件（widgets）功能<br />
<br />
middleware演示<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;django.db&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;connection<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;django.http&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;HttpResponseRedirect<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">拦截response请求之后，打印请求中的所有sql</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SqlLogMiddleware(object):<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;process_response(self,&nbsp;req,&nbsp;res):<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;sql&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;connection.queries:<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;sql<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;res<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">拦截request请求之前，做权限校验</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Auth(object):<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;process_request(self,&nbsp;req):<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;req.path&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">/admin/</span><span style="color: #800000;">'</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;req.user.is_authenticated():<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;HttpResponseRedirect(</span><span style="color: #800000;">'</span><span style="color: #800000;">/admin/</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">18</span>&nbsp;</div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">MIDDLEWARE_CLASSES&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.middleware.common.CommonMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.middleware.SessionMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.auth.middleware.AuthenticationMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">finance.middleware.SqlLogMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">finance.middleware.Auth</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">)</span></div>
<br />
<br />
template context processor演示<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;version(request):<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;{</span><span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">'</span><span style="color: #800000;">Stone.J</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">version</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">'</span><span style="color: #800000;">1.0-beata</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">date</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">'</span><span style="color: #800000;">2011-03-20</span><span style="color: #800000;">'</span><span style="color: #000000;">}</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">TEMPLATE_CONTEXT_PROCESSORS&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.core.context_processors.request</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.core.context_processors.auth</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.core.context_processors.debug</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.core.context_processors.i18n</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">django.core.context_processors.media</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">finance.example.context_processors.version</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">)</span></div>
<br />
template filter演示<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;row(value):<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;value:<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">row1</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">row1</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">row2</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;math_mul(value,&nbsp;num):<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;num<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;math_add(value,&nbsp;num):<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;num<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">register&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;template.Library()&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">register.filter(</span><span style="color: #800000;">'</span><span style="color: #800000;">row</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;row)<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">register.filter(</span><span style="color: #800000;">'</span><span style="color: #800000;">math_add</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;math_add)<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">register.filter(</span><span style="color: #800000;">'</span><span style="color: #800000;">math_mul</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;math_mul)</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">{%&nbsp;load&nbsp;my_filter&nbsp;%}<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">{%&nbsp;for&nbsp;c&nbsp;in&nbsp;page.object_list&nbsp;%}<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="{{&nbsp;forloop.counter|row&nbsp;}}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">{{&nbsp;c.amount&nbsp;|&nbsp;math_add:c.amount2}}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">{{&nbsp;c.amount&nbsp;|&nbsp;math_mul:12}}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">{%&nbsp;endfor&nbsp;%}</span></div>
通过约定的方式，在任意一个app下，建立一个templatetags目录，会自动寻找到。（不过没有命名空间，是一个比较猥琐的事情，容易造成不同app下的冲突）<br />
<br />
template tag演示<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">register&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;template.Library()<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AccountNode(template.Node):<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;name):<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;render(self,&nbsp;context):<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context[self.name]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Account.objects.get()<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">''</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;get_account(parser,&nbsp;token):<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag_name,&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;token.split_contents()<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">except</span><span style="color: #000000;">&nbsp;ValueError:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">raise</span><span style="color: #000000;">&nbsp;template.TemplateSyntaxError,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">%s&nbsp;tag&nbsp;requires&nbsp;argument</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;tag_name<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;AccountNode(name)<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">register.tag(</span><span style="color: #800000;">'</span><span style="color: #800000;">get_account</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;get_account)</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">{%&nbsp;load&nbsp;my_tag&nbsp;%}<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">{%&nbsp;get_account&nbsp;account&nbsp;%}</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;通过tag取到内容赋值给account变量&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">{{&nbsp;account.amount&nbsp;}}</span></div>
<br />
template tag + template file演示<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;django&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;template<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">register&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;template.Library()<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;version(</span>context<span style="color: #000000;">):<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;{</span><span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">'</span><span style="color: #800000;">Stone.J</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">version</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">'</span><span style="color: #800000;">1.0-beata</span><span style="color: #800000;">'</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">date</span><span style="color: #800000;">'</span><span style="color: #000000;">:</span><span style="color: #800000;">'</span><span style="color: #800000;">2011-03-20</span><span style="color: #800000;">'</span><span style="color: #000000;">}<br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">register.inclusion_tag(</span><span style="color: #800000;">'</span><span style="color: #800000;">example/version.html</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;takes_context</span><span style="color: #000000;">=</span><span style="color: #000000;">True)(version)</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;这份内容可以被当成widget复用&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">table</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">{{&nbsp;name&nbsp;}}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">{{&nbsp;version&nbsp;}}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">{{&nbsp;data&nbsp;}}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">table</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">9</span>&nbsp;</div>
tag寻找模式等同于filter。<br />
<img src ="http://www.blogjava.net/stone2083/aggbug/348662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-04-20 22:54 <a href="http://www.blogjava.net/stone2083/archive/2011/04/20/348662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>命令行下翻译工具</title><link>http://www.blogjava.net/stone2083/archive/2011/04/17/348449.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Sun, 17 Apr 2011 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/04/17/348449.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/348449.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/04/17/348449.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/348449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/348449.html</trackback:ping><description><![CDATA[接上文，继续show下我命令行下的工具--翻译脚本<br />
（利用了google 翻译 json api:<span style="color: rgb(128, 0, 0);">http://translate.google.cn/translate_a/t?client=t&amp;text=%s&amp;hl=zh-CN&amp;sl=%s&amp;tl=%s</span>）<br />
<br />
特性：<br />
1. 自动识别中翻英/英翻中<br />
2. 翻译<br />
<br />
涉及技术：<br />
1. python<br />
2. urllib<br />
3. json<br />
4. re<br />
<br />
截图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/tl.png" width="355" height="550" /><br />
<br />
对应代码：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(128, 0, 0);">'''</span><span style="color: rgb(128, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(128, 0, 0);">Created&nbsp;on&nbsp;2010-11-28<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(128, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(128, 0, 0);">@author:&nbsp;stone<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(128, 0, 0);">'''</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;json<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;re<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;sys<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;urllib2<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;types<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">res&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">http://translate.google.cn/translate_a/t?client=t&amp;text=%s&amp;hl=zh-CN&amp;sl=%s&amp;tl=%s</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">agent&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Mozilla&nbsp;/&nbsp;5.0&nbsp;(X11;&nbsp;U;&nbsp;Linux&nbsp;i686;&nbsp;en&nbsp;-&nbsp;US)&nbsp;AppleWebKit&nbsp;/&nbsp;534.7&nbsp;(KHTML,&nbsp;like&nbsp;Gecko)&nbsp;Chrome&nbsp;/&nbsp;7.0.517.44&nbsp;Safari&nbsp;/&nbsp;534.7</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;get_data(text,&nbsp;sl</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">en</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,&nbsp;tl</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">zh-CN</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">):<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;req&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;urllib2.Request(res&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;(urllib2.quote(text),&nbsp;sl,&nbsp;tl))<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;req.add_header(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">user-agent</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,&nbsp;agent)<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;content&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;urllib2.urlopen(req).read()<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;json.loads(to_standard_json(content))<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;show(data):<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">step1</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);">&nbsp;u</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">翻译：\n&nbsp;&nbsp;%s</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;(data[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">][0][0])<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">step2</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;types.ListType&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;type(data[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]):<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);">&nbsp;u</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">\n字典：</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;word&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;data[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]:<br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);">&nbsp;word[0]<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;len(word)&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">:<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;i,&nbsp;w&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;enumerate(word[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]):<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">&nbsp;&nbsp;%s.%s</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;(i&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;w)&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;to_standard_json(json):<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;re.compile(r</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">,([,\]])</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(p.search(json)):<br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p.sub(</span><span style="color: rgb(0, 0, 255);">lambda</span><span style="color: rgb(0, 0, 0);">&nbsp;m:</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">,null%s</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;(m.group(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)),&nbsp;json)<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;json<br />
</span><span style="color: rgb(0, 128, 128);">38</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">39</span>&nbsp;<span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);">&nbsp;contains_cn(text):<br />
</span><span style="color: rgb(0, 128, 128);">40</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;c&nbsp;</span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);">&nbsp;text:<br />
</span><span style="color: rgb(0, 128, 128);">41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;ord(c)&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">127</span><span style="color: rgb(0, 0, 0);">:<br />
</span><span style="color: rgb(0, 128, 128);">42</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;True<br />
</span><span style="color: rgb(0, 128, 128);">43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;False<br />
</span><span style="color: rgb(0, 128, 128);">44</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">45</span>&nbsp;<span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 128);">__name__</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">__main__</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">:<br />
</span><span style="color: rgb(0, 128, 128);">46</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">not</span><span style="color: rgb(0, 0, 0);">&nbsp;len(sys.argv)&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">or</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">not</span><span style="color: rgb(0, 0, 0);">&nbsp;sys.argv[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">].strip():<br />
</span><span style="color: rgb(0, 128, 128);">47</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Useage:translate.py&nbsp;word</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">48</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.exit()<br />
</span><span style="color: rgb(0, 128, 128);">49</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;word&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;sys.argv[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">].strip()<br />
</span><span style="color: rgb(0, 128, 128);">50</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;contains_cn(word):<br />
</span><span style="color: rgb(0, 128, 128);">51</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show(get_data(word,&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">zh-CN</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">en</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">))<br />
</span><span style="color: rgb(0, 128, 128);">52</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">:<br />
</span><span style="color: rgb(0, 128, 128);">53</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show(get_data(word,&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">en</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">zh-CN</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">))</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/stone2083/aggbug/348449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-04-17 19:49 <a href="http://www.blogjava.net/stone2083/archive/2011/04/17/348449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下基于命令行的音乐播放器</title><link>http://www.blogjava.net/stone2083/archive/2011/04/17/348447.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Sun, 17 Apr 2011 11:32:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2011/04/17/348447.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/348447.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2011/04/17/348447.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/348447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/348447.html</trackback:ping><description><![CDATA[按照同事的话说，我是一个十足的命令控。<br />
利用最近项目通宵发布的空闲时间中，写了一个命令行下的音乐播放器，以满足我在linux命令下的需求。<br />
<br />
播放器利用技术：<br />
Python+GST（<a href="http://gstreamer.freedesktop.org/modules/gst-python.html">http://gstreamer.freedesktop.org/modules/gst-python.html</a>）+Console解析<br />
<br />
播放器自持操作：<br />
1. 播放<br />
2. 下一首<br />
3. 上一首<br />
4. 暂停<br />
5. 查看播放列表信息<br />
6. 查看当前播放信息<br />
7. 停止（退出）<br />
<br />
看一张截图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/stone2083/python/mp3.png" width="401" height="501" /><br />
<br />
通过分析meliae dump出来的内存信息，差不做占用2.5M内存，算的上比较小巧了。<br />
<br />
对应代码：（需要安装py-gst，ubuntu下：sudo apt-get install python-gst0.10）<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/env&nbsp;python</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;gst<br />
</span><span style="color: #008080;">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;gobject<br />
</span><span style="color: #008080;">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sys<br />
</span><span style="color: #008080;">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #008000;">#</span><span style="color: #008000;">to&nbsp;avoid&nbsp;eclipse'warning</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000;">eval(</span><span style="color: #800000;">'</span><span style="color: #800000;">gobject.threads_init()</span><span style="color: #800000;">'</span><span style="color: #000000;">)&nbsp;<br />
</span><span style="color: #008080;">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;threading&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Thread<br />
</span><span style="color: #008080;">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;10</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AudioPlayer:<br />
</span><span style="color: #008080;">&nbsp;11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;EVENT_PLAY_NEW&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;advisor):<br />
</span><span style="color: #008080;">&nbsp;15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.main&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gobject.MainLoop()<br />
</span><span style="color: #008080;">&nbsp;16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gst.element_factory_make(</span><span style="color: #800000;">'</span><span style="color: #800000;">playbin</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">player</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.index&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None<br />
</span><span style="color: #008080;">&nbsp;19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.advisor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;advisor<br />
</span><span style="color: #008080;">&nbsp;20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bus&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;self.player.get_bus()<br />
</span><span style="color: #008080;">&nbsp;22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bus.add_signal_watch()<br />
</span><span style="color: #008080;">&nbsp;23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bus.connect(</span><span style="color: #800000;">'</span><span style="color: #800000;">message</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;self.on_message)<br />
</span><span style="color: #008080;">&nbsp;24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread(target</span><span style="color: #000000;">=</span><span style="color: #000000;">self.main.run).start()<br />
</span><span style="color: #008080;">&nbsp;26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;add_list(self&nbsp;,&nbsp;list</span><span style="color: #000000;">=</span><span style="color: #000000;">[]):<br />
</span><span style="color: #008080;">&nbsp;28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;list&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;None:<br />
</span><span style="color: #008080;">&nbsp;29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br />
</span><span style="color: #008080;">&nbsp;30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[(i,&nbsp;l.strip(),&nbsp;l[l.rfind(</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">:])&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i,&nbsp;l)&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;enumerate(list)]<br />
</span><span style="color: #008080;">&nbsp;31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;play(self,&nbsp;index</span><span style="color: #000000;">=</span><span style="color: #000000;">None):<br />
</span><span style="color: #008080;">&nbsp;33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">play&nbsp;specified&nbsp;tracks</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;0&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;index&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;len(self.list):<br />
</span><span style="color: #008080;">&nbsp;35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.index&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;index<br />
</span><span style="color: #008080;">&nbsp;36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.set_state(gst.STATE_NULL)<br />
</span><span style="color: #008080;">&nbsp;37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.set_property(</span><span style="color: #800000;">'</span><span style="color: #800000;">uri</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;self.list[index][</span><span style="color: #000000;">1</span><span style="color: #000000;">])<br />
</span><span style="color: #008080;">&nbsp;38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.set_state(gst.STATE_PLAYING)<br />
</span><span style="color: #008080;">&nbsp;39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.advisor:<br />
</span><span style="color: #008080;">&nbsp;40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.advisor.on_message(AudioPlayer.EVENT_PLAY_NEW,&nbsp;(self.index,&nbsp;self.get_title()))<br />
</span><span style="color: #008080;">&nbsp;41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">resume&nbsp;playing</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;index&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;None:<br />
</span><span style="color: #008080;">&nbsp;43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">&nbsp;44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.set_state(gst.STATE_PLAYING)<br />
</span><span style="color: #008080;">&nbsp;45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;pause(self):<br />
</span><span style="color: #008080;">&nbsp;47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.set_state(gst.STATE_PAUSED)<br />
</span><span style="color: #008080;">&nbsp;48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;stop(self):<br />
</span><span style="color: #008080;">&nbsp;50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.set_state(gst.STATE_NULL)<br />
</span><span style="color: #008080;">&nbsp;51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.main.quit()<br />
</span><span style="color: #008080;">&nbsp;52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;get_title(self):<br />
</span><span style="color: #008080;">&nbsp;54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">or</span><span style="color: #000000;">&nbsp;len(self.list)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;0:<br />
</span><span style="color: #008080;">&nbsp;55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;None<br />
</span><span style="color: #008080;">&nbsp;56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;self.list[self.index][</span><span style="color: #000000;">2</span><span style="color: #000000;">]&nbsp;<br />
</span><span style="color: #008080;">&nbsp;57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;get_previous(self):<br />
</span><span style="color: #008080;">&nbsp;59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">or</span><span style="color: #000000;">&nbsp;len(self.list)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;0:<br />
</span><span style="color: #008080;">&nbsp;60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;0:<br />
</span><span style="color: #008080;">&nbsp;62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;0<br />
</span><span style="color: #008080;">&nbsp;63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;get_next(self):<br />
</span><span style="color: #008080;">&nbsp;66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;len(self.list)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;0:<br />
</span><span style="color: #008080;">&nbsp;67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;len(self.list):<br />
</span><span style="color: #008080;">&nbsp;69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;0<br />
</span><span style="color: #008080;">&nbsp;70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;self.index&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;on_message(self,&nbsp;bus,&nbsp;message):<br />
</span><span style="color: #008080;">&nbsp;73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;message.type<br />
</span><span style="color: #008080;">&nbsp;74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;gst.MESSAGE_ERROR:<br />
</span><span style="color: #008080;">&nbsp;75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.play(self.get_next())<br />
</span><span style="color: #008080;">&nbsp;76</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;gst.MESSAGE_EOS:<br />
</span><span style="color: #008080;">&nbsp;77</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.play(self.get_next())<br />
</span><span style="color: #008080;">&nbsp;78</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;79</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Console:<br />
</span><span style="color: #008080;">&nbsp;80</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;81</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self,&nbsp;list):<br />
</span><span style="color: #008080;">&nbsp;82</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AudioPlayer(self)<br />
</span><span style="color: #008080;">&nbsp;83</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.add_list(list)<br />
</span><span style="color: #008080;">&nbsp;84</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.play(0)<br />
</span><span style="color: #008080;">&nbsp;85</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;86</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread(target</span><span style="color: #000000;">=</span><span style="color: #000000;">self.run).start()<br />
</span><span style="color: #008080;">&nbsp;87</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;88</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;run(self):<br />
</span><span style="color: #008080;">&nbsp;89</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(True):<br />
</span><span style="color: #008080;">&nbsp;90</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.on_cmd(raw_input())<br />
</span><span style="color: #008080;">&nbsp;91</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;92</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;on_cmd(self,&nbsp;cmd):<br />
</span><span style="color: #008080;">&nbsp;93</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;cmd&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;None:<br />
</span><span style="color: #008080;">&nbsp;94</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;95</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">play</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">&nbsp;96</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.play()<br />
</span><span style="color: #008080;">&nbsp;97</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">next</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">&nbsp;98</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.play(self.player.get_next())<br />
</span><span style="color: #008080;">&nbsp;99</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">previous</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">100</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.play(self.player.get_previous())<br />
</span><span style="color: #008080;">101</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">pause</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">102</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.pause()<br />
</span><span style="color: #008080;">103</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">list</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">104</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">=====================================</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">105</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;info&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;self.player.list:<br />
</span><span style="color: #008080;">106</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">%s.&nbsp;%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;(info[0],&nbsp;info[</span><span style="color: #000000;">2</span><span style="color: #000000;">])<br />
</span><span style="color: #008080;">107</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">=====================================</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">108</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">info</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">109</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">=====================================</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">110</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">%s.&nbsp;%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;(self.player.index,&nbsp;self.player.get_title())<br />
</span><span style="color: #008080;">111</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">=====================================</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">112</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">stop</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">113</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.player.stop()<br />
</span><span style="color: #008080;">114</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(0)<br />
</span><span style="color: #008080;">115</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">elif</span><span style="color: #000000;">&nbsp;cmd.startswith(</span><span style="color: #800000;">'</span><span style="color: #800000;">dump</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
</span><span style="color: #008080;">116</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;meliae&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;scanner<br />
</span><span style="color: #008080;">117</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanner.dump_all_objects(</span><span style="color: #800000;">'</span><span style="color: #800000;">./dump.txt</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">118</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">119</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'''</span><span style="color: #800000;">=====================================<br />
</span><span style="color: #008080;">120</span>&nbsp;<span style="color: #800000;">Usage:<br />
</span><span style="color: #008080;">121</span>&nbsp;<span style="color: #800000;">play<br />
</span><span style="color: #008080;">122</span>&nbsp;<span style="color: #800000;">next<br />
</span><span style="color: #008080;">123</span>&nbsp;<span style="color: #800000;">previous<br />
</span><span style="color: #008080;">124</span>&nbsp;<span style="color: #800000;">pause<br />
</span><span style="color: #008080;">125</span>&nbsp;<span style="color: #800000;">list<br />
</span><span style="color: #008080;">126</span>&nbsp;<span style="color: #800000;">info<br />
</span><span style="color: #008080;">127</span>&nbsp;<span style="color: #800000;">stop<br />
</span><span style="color: #008080;">128</span>&nbsp;<span style="color: #800000;">dump<br />
</span><span style="color: #008080;">129</span>&nbsp;<span style="color: #800000;">=====================================</span><span style="color: #800000;">'''</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">130</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">131</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;on_message(self,&nbsp;event,&nbsp;info):<br />
</span><span style="color: #008080;">132</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;event&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;AudioPlayer.EVENT_PLAY_NEW:<br />
</span><span style="color: #008080;">133</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">=====================================</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">134</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">Tracks:&nbsp;%s.%s</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;(info[0],&nbsp;info[</span><span style="color: #000000;">1</span><span style="color: #000000;">])<br />
</span><span style="color: #008080;">135</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">=====================================</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">136</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">137</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">138</span>&nbsp;<span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;len(sys.argv)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">:<br />
</span><span style="color: #008080;">139</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">player.py&nbsp;mp3.list</span><span style="color: #800000;">'</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">140</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">141</span>&nbsp;<span style="color: #000000;">list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[l.strip()&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;l&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;open(sys.argv[</span><span style="color: #000000;">1</span><span style="color: #000000;">]).readlines()&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;l.strip()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">''</span><span style="color: #000000;">]<br />
</span><span style="color: #008080;">142</span>&nbsp;<span style="color: #000000;">Console(list)</span></div>
<br />
<a href="/Files/stone2083/python/player.zip" title="下载">下载</a><br />
<br />
<img src ="http://www.blogjava.net/stone2083/aggbug/348447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2011-04-17 19:32 <a href="http://www.blogjava.net/stone2083/archive/2011/04/17/348447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu下安装Python Imaging Library (PIL)</title><link>http://www.blogjava.net/stone2083/archive/2009/10/27/299946.html</link><dc:creator>stone2083</dc:creator><author>stone2083</author><pubDate>Tue, 27 Oct 2009 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/stone2083/archive/2009/10/27/299946.html</guid><wfw:comment>http://www.blogjava.net/stone2083/comments/299946.html</wfw:comment><comments>http://www.blogjava.net/stone2083/archive/2009/10/27/299946.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stone2083/comments/commentRss/299946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stone2083/services/trackbacks/299946.html</trackback:ping><description><![CDATA[easy_install is not so easy。<br />
这是我最近在学习python的一丝体会，好多lib都无法通过easy_install安装，比如:<a title="Python Imaging Library (PIL)" href="http://www.pythonware.com/products/pil/">Python Imaging Library (PIL)</a><br />
<br />
只能通过手工安装方式安装：<br />
＊download the <a title="pil_1.1.6" href="http://effbot.org/downloads/Imaging-1.1.6.tar.gz">pil_1.1.6</a><br />
＊tar xvf Imaging-1.1.6.tar.gz &amp; chmox +x setup.py<br />
＊python setup.py build<br />
<br />
结果，居然：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;_imagingtk.c&nbsp;-o&nbsp;build/temp.linux-i686-</span><span style="color: #000000;">2.6</span><span style="color: #000000;">/_imagingtk.o<br />
_imagingtk.c:</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">:&nbsp;error:&nbsp;tk.h:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory<br />
_imagingtk.c:</span><span style="color: #000000;">23</span><span style="color: #000000;">:&nbsp;error:&nbsp;expected&nbsp;&#8216;)&#8217;&nbsp;before&nbsp;&#8216;*&#8217;&nbsp;token<br />
_imagingtk.c:</span><span style="color: #000000;">31</span><span style="color: #000000;">:&nbsp;error:&nbsp;expected&nbsp;specifier-qualifier-list&nbsp;before&nbsp;&#8216;Tcl_Interp&#8217;<br />
_imagingtk.c:&nbsp;In&nbsp;function&nbsp;&#8216;_tkinit&#8217;:<br />
_imagingtk.c:</span><span style="color: #000000;">37</span><span style="color: #000000;">:&nbsp;error:&nbsp;&#8216;Tcl_Interp&#8217;&nbsp;undeclared&nbsp;(first&nbsp;use&nbsp;in&nbsp;this&nbsp;function)<br />
_imagingtk.c:</span><span style="color: #000000;">37</span><span style="color: #000000;">:&nbsp;error:&nbsp;(Each&nbsp;undeclared&nbsp;identifier&nbsp;is&nbsp;reported&nbsp;only&nbsp;once<br />
_imagingtk.c:</span><span style="color: #000000;">37</span><span style="color: #000000;">:&nbsp;error:&nbsp;for&nbsp;each&nbsp;function&nbsp;it&nbsp;appears&nbsp;in.)<br />
_imagingtk.c:</span><span style="color: #000000;">37</span><span style="color: #000000;">:&nbsp;error:&nbsp;&#8216;interp&#8217;&nbsp;undeclared&nbsp;(first&nbsp;use&nbsp;in&nbsp;this&nbsp;function)<br />
_imagingtk.c:</span><span style="color: #000000;">45</span><span style="color: #000000;">:&nbsp;error:&nbsp;expected&nbsp;expression&nbsp;before&nbsp;&#8216;)&#8217;&nbsp;token<br />
_imagingtk.c:</span><span style="color: #000000;">51</span><span style="color: #000000;">:&nbsp;error:&nbsp;&#8216;TkappObject&#8217;&nbsp;has&nbsp;no&nbsp;member&nbsp;named&nbsp;&#8216;interp&#8217;<br />
_imagingtk.c:</span><span style="color: #000000;">55</span><span style="color: #000000;">:&nbsp;warning:&nbsp;implicit&nbsp;declaration&nbsp;of&nbsp;function&nbsp;&#8216;TkImaging_Init&#8217;<br />
error:&nbsp;command&nbsp;'gcc'&nbsp;failed&nbsp;with&nbsp;exit&nbsp;status&nbsp;</span><span style="color: #000000;">1</span></div>
<br />
tk.h No such file or directory<br />
<br />
事实上，tk-dev包我已经安装了，查看setup.py代码，发现：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Library&nbsp;pointers.</span><span style="color: #008000;"><br />
#<br />
#</span><span style="color: #008000;">&nbsp;Use&nbsp;None&nbsp;to&nbsp;look&nbsp;for&nbsp;the&nbsp;libraries&nbsp;in&nbsp;well-known&nbsp;library&nbsp;locations.</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;Use&nbsp;a&nbsp;string&nbsp;to&nbsp;specify&nbsp;a&nbsp;single&nbsp;directory,&nbsp;for&nbsp;both&nbsp;the&nbsp;library&nbsp;and</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;the&nbsp;include&nbsp;files.&nbsp;&nbsp;Use&nbsp;a&nbsp;tuple&nbsp;to&nbsp;specify&nbsp;separate&nbsp;directories:</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;(libpath,&nbsp;includepath).&nbsp;&nbsp;Examples:</span><span style="color: #008000;"><br />
#<br />
#</span><span style="color: #008000;">&nbsp;JPEG_ROOT&nbsp;=&nbsp;"/home/libraries/jpeg-6b"</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;TIFF_ROOT&nbsp;=&nbsp;"/opt/tiff/lib",&nbsp;"/opt/tiff/include"</span><span style="color: #008000;"><br />
#<br />
#</span><span style="color: #008000;">&nbsp;If&nbsp;you&nbsp;have&nbsp;"lib"&nbsp;and&nbsp;"include"&nbsp;directories&nbsp;under&nbsp;a&nbsp;common&nbsp;parent,</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;you&nbsp;can&nbsp;use&nbsp;the&nbsp;"libinclude"&nbsp;helper:</span><span style="color: #008000;"><br />
#<br />
#</span><span style="color: #008000;">&nbsp;TIFF_ROOT&nbsp;=&nbsp;libinclude("/opt/tiff")</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
FREETYPE_ROOT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None<br />
JPEG_ROOT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None<br />
TIFF_ROOT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None<br />
ZLIB_ROOT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None<br />
TCL_ROOT&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;None<br />
</span></div>
<br />
将TCL_ROOT = None 修改成：TCL_ROOT = '/usr/include/tk'，即可<br />
<br />
python setup.py build<br />
python setup.py install<br />
<br />
成功 ：）<br />
<br />
<img src ="http://www.blogjava.net/stone2083/aggbug/299946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stone2083/" target="_blank">stone2083</a> 2009-10-27 17:25 <a href="http://www.blogjava.net/stone2083/archive/2009/10/27/299946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>