<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>我的技术生活-王炜 &#187; UNIX</title> <atom:link href="http://aaronw.me/cache/unix/feed" rel="self" type="application/rss+xml" /><link>http://aaronw.me</link> <description>只为成功找方法，不为失败找借口</description> <lastBuildDate>Fri, 28 Oct 2011 07:14:11 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.2.1</generator> <item><title>我是如何向老婆解释MapReduce的？</title><link>http://aaronw.me/static/922.html</link> <comments>http://aaronw.me/static/922.html#comments</comments> <pubDate>Fri, 28 Oct 2011 07:14:11 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[mapreduce]]></category> <category><![CDATA[mdb]]></category> <category><![CDATA[mongodb]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=922</guid> <description><![CDATA[这两天一直在研究mongodb,他是支持mapreduce!我不是研发出身，所以对这方面比较的白痴，看到这片博文觉得很有意思，就转了！ 昨天，我在Xebia印度办公室发表了一个关于MapReduce的演说。演说进行得很顺利，听众们都能够理解MapReduce的概念（根据他们的反馈）。我成功地向技术听众们（主要是Java程序员，一些Flex程序员和少数的测试员）解释了MapReduce的概念，这让我感到兴奋。在所有辛勤的工作之后，我们在Xebia印度办公室享用了丰盛的晚餐，然后我径直回了家。 回家后，我的妻子（Supriya）问道：“你的会开得怎么样？”我说还不错。 接着她又问我会议是的内容是什么(她不是从事软件或编程领域的工作的)。我告诉她说MapReduce。“Mapduce，那是什么玩意儿？”她问道： “跟地形图有关吗？”我说不，不是的，它和地形图一点关系也没有。“那么，它到底是什么玩意儿？”妻子问道。 “唔…让我们去Dominos(披萨连锁)吧，我会在餐桌上跟你好好解释。” 妻子说：“好的。” 然后我们就去了披萨店。 我们在Domions点餐之后，柜台的小伙子告诉我们说披萨需要15分钟才能准备好。于是，我问妻子：“你真的想要弄懂什么是MapReduce？” 她很坚定的回答说“是的”。 因此我问道： 我： 你是如何准备洋葱辣椒酱的？（以下并非准确食谱，请勿在家尝试） 妻子： 我会取一个洋葱，把它切碎，然后拌入盐和水，最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。 妻子： 但这和MapReduce有什么关系？ 我： 你等一下。让我来编一个完整的情节，这样你肯定可以在15分钟内弄懂MapReduce. 妻子： 好吧。 我：现在，假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢？ 妻子： 我会取薄荷叶一撮，洋葱一个，番茄一个，辣椒一根，大蒜一根，切碎后加入适量的盐和水，再放入混合研磨机里研磨，这样你就可以得到一瓶混合辣椒酱了。 我： 没错，让我们把MapReduce的概念应用到食谱上。Map和Reduce其实是两种操作，我来给你详细讲解下。 Map（映射）: 把洋葱、番茄、辣椒和大蒜切碎，是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱，Map就会把洋葱切碎。 同样的，你把辣椒，大蒜和番茄一一地拿给Map，你也会得到各种碎块。 所以，当你在切像洋葱这样的蔬菜时，你执行就是一个Map操作。 Map操作适用于每一种蔬菜，它会相应地生产出一种或多种碎块，在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况，你只要把坏洋葱丢了就行了。所以，如果出现坏洋葱了，Map操作就会过滤掉坏洋葱而不会生产出任何的坏洋葱块。 Reduce（化简）:在这一阶段，你将各种蔬菜碎都放入研磨机里进行研磨，你就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱，你得研磨所有的原料。因此，研磨机通常将map操作的蔬菜碎聚集在了一起。 妻子： 所以，这就是MapReduce? 我： 你可以说是，也可以说不是。 其实这只是MapReduce的一部分，MapReduce的强大在于分布式计算。 妻子： 分布式计算？ 那是什么？请给我解释下吧。 我： 没问题。 我： 假设你参加了一个辣椒酱比赛并且你的食谱赢得了最佳辣椒酱奖。得奖之后，辣椒酱食谱大受欢迎，于是你想要开始出售自制品牌的辣椒酱。假设你每天需要生产10000瓶辣椒酱，你会怎么办呢？ 妻子： 我会找一个能为我大量提供原料的供应商。 我：是的..就是那样的。那你能否独自完成制作呢？也就是说，独自将原料都切碎？ 仅仅一部研磨机又是否能满足需要？而且现在，我们还需要供应不同种类的辣椒酱，像洋葱辣椒酱、青椒辣椒酱、番茄辣椒酱等等。 妻子： 当然不能了，我会雇佣更多的工人来切蔬菜。我还需要更多的研磨机，这样我就可以更快地生产辣椒酱了。 我：没错，所以现在你就不得不分配工作了，你将需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜，而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断的从袋子里拿出蔬菜来，并且每次只对一种蔬菜进行处理，也就是将它们切碎，直到袋子空了为止。 这样，当所有的工人都切完以后，工作台（每个人工作的地方）上就有了洋葱块、番茄块、和蒜蓉等等。 妻子：但是我怎么会制造出不同种类的番茄酱呢？ 我：现在你会看到MapReduce遗漏的阶段&#8212;搅拌阶段。MapReduce将所有输出的蔬菜碎都搅拌在了一起，这些蔬菜碎都是在以key为基础的 map操作下产生的。搅拌将自动完成，你可以假设key是一种原料的名字，就像洋葱一样。 [...]]]></description> <content:encoded><![CDATA[<p>这两天一直在研究mongodb,他是支持mapreduce!我不是研发出身，所以对这方面比较的白痴，看到这片博文觉得很有意思，就转了！</p><p>昨天，我在Xebia印度办公室发表了一个关于MapReduce的演说。演说进行得很顺利，听众们都能够理解MapReduce的概念（根据他们的反馈）。我成功地向技术听众们（主要是Java程序员，一些Flex程序员和少数的测试员）解释了MapReduce的概念，这让我感到兴奋。在所有辛勤的工作之后，我们在Xebia印度办公室享用了丰盛的晚餐，然后我径直回了家。</p><p>回家后，我的妻子（Supriya）问道：“你的会开得怎么样？”我说还不错。 接着她又问我会议是的内容是什么(她不是从事软件或编程领域的工作的)。我告诉她说MapReduce。“Mapduce，那是什么玩意儿？”她问道： “跟地形图有关吗？”我说不，不是的，它和地形图一点关系也没有。“那么，它到底是什么玩意儿？”妻子问道。 “唔…让我们去Dominos(披萨连锁)吧，我会在餐桌上跟你好好解释。” 妻子说：“好的。” 然后我们就去了披萨店。<br
/> <img
class="alignnone" title="mapreduce" src="/pic/mapreduce.png" alt="mapreduce" width="354" height="360" /><br
/> <span
id="more-922"></span><br
/> 我们在Domions点餐之后，柜台的小伙子告诉我们说披萨需要15分钟才能准备好。于是，我问妻子：“你真的想要弄懂什么是MapReduce？” 她很坚定的回答说“是的”。 因此我问道：</p><p>我： 你是如何准备洋葱辣椒酱的？（以下并非准确食谱，请勿在家尝试）</p><p>妻子： 我会取一个洋葱，把它切碎，然后拌入盐和水，最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。</p><p>妻子： 但这和MapReduce有什么关系？</p><p>我： 你等一下。让我来编一个完整的情节，这样你肯定可以在15分钟内弄懂MapReduce.</p><p>妻子： 好吧。</p><p>我：现在，假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢？</p><p>妻子： 我会取薄荷叶一撮，洋葱一个，番茄一个，辣椒一根，大蒜一根，切碎后加入适量的盐和水，再放入混合研磨机里研磨，这样你就可以得到一瓶混合辣椒酱了。</p><p>我： 没错，让我们把MapReduce的概念应用到食谱上。Map和Reduce其实是两种操作，我来给你详细讲解下。</p><p>Map（映射）: 把洋葱、番茄、辣椒和大蒜切碎，是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱，Map就会把洋葱切碎。 同样的，你把辣椒，大蒜和番茄一一地拿给Map，你也会得到各种碎块。 所以，当你在切像洋葱这样的蔬菜时，你执行就是一个Map操作。 Map操作适用于每一种蔬菜，它会相应地生产出一种或多种碎块，在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况，你只要把坏洋葱丢了就行了。所以，如果出现坏洋葱了，Map操作就会过滤掉坏洋葱而不会生产出任何的坏洋葱块。</p><p>Reduce（化简）:在这一阶段，你将各种蔬菜碎都放入研磨机里进行研磨，你就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱，你得研磨所有的原料。因此，研磨机通常将map操作的蔬菜碎聚集在了一起。</p><p>妻子： 所以，这就是MapReduce?</p><p>我： 你可以说是，也可以说不是。 其实这只是MapReduce的一部分，MapReduce的强大在于分布式计算。</p><p>妻子： 分布式计算？ 那是什么？请给我解释下吧。</p><p>我： 没问题。</p><p>我： 假设你参加了一个辣椒酱比赛并且你的食谱赢得了最佳辣椒酱奖。得奖之后，辣椒酱食谱大受欢迎，于是你想要开始出售自制品牌的辣椒酱。假设你每天需要生产10000瓶辣椒酱，你会怎么办呢？</p><p>妻子： 我会找一个能为我大量提供原料的供应商。</p><p>我：是的..就是那样的。那你能否独自完成制作呢？也就是说，独自将原料都切碎？ 仅仅一部研磨机又是否能满足需要？而且现在，我们还需要供应不同种类的辣椒酱，像洋葱辣椒酱、青椒辣椒酱、番茄辣椒酱等等。</p><p>妻子： 当然不能了，我会雇佣更多的工人来切蔬菜。我还需要更多的研磨机，这样我就可以更快地生产辣椒酱了。</p><p>我：没错，所以现在你就不得不分配工作了，你将需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜，而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断的从袋子里拿出蔬菜来，并且每次只对一种蔬菜进行处理，也就是将它们切碎，直到袋子空了为止。</p><p>这样，当所有的工人都切完以后，工作台（每个人工作的地方）上就有了洋葱块、番茄块、和蒜蓉等等。</p><p>妻子：但是我怎么会制造出不同种类的番茄酱呢？</p><p>我：现在你会看到MapReduce遗漏的阶段&#8212;搅拌阶段。MapReduce将所有输出的蔬菜碎都搅拌在了一起，这些蔬菜碎都是在以key为基础的 map操作下产生的。搅拌将自动完成，你可以假设key是一种原料的名字，就像洋葱一样。 所以全部的洋葱keys都会搅拌在一起，并转移到研磨洋葱的研磨器里。这样，你就能得到洋葱辣椒酱了。同样地，所有的番茄也会被转移到标记着番茄的研磨器里，并制造出番茄辣椒酱。</p><p>披萨终于做好了，她点点头说她已经弄懂什么是MapReduce了。我只希望下次她听到MapReduce时，能更好的理解我到底在做些什么。</p><p>编注：下面这段话是网上其他人用最简短的语言解释MapReduce：</p><p>We want to count all the books in the library. You count up shelf #1, I count up shelf #2. That&#8217;s map. The more people we get, the faster it goes.<br
/> 我们要数图书馆中的所有书。你数1号书架，我数2号书架。这就是“Map”。我们人越多，数书就更快。</p><p>Now we get together and add our individual counts. That&#8217;s reduce.<br
/> 现在我们到一起，把所有人的统计数加在一起。这就是“Reduce”。</p><p>文章转自：http://www.jobbole.com/entry.php/1321</p> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/922.html/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>[原创]Centos5.4搭建 mppe 128位加密的PPtpd VPN</title><link>http://aaronw.me/static/912.html</link> <comments>http://aaronw.me/static/912.html#comments</comments> <pubDate>Sun, 23 Oct 2011 22:00:18 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[pptpd]]></category> <category><![CDATA[vpn]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=912</guid> <description><![CDATA[公司要在外地建IDC,需要搭建一个VPN，便于日常维护，大多数公司都使用openVPN，但是在我的映像中windows上使用openVPN需要用一个客户端软件，为了简单化客户端，我选择了PPtpd-vpn.网上参看了一些VPN的搭建方法，都是残缺不全的，还是自己写一下吧！用的上，就看看吧！说明一下，斜体为执行的命令 1、环境说明 uname -a Linux DataCenter 2.6.18-164.el5xen #1 SMP Thu Sep 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux cat /etc/redhat-release CentOS release 5.4 (Final) 2、软件安装 rpm -ivh http://aaronw.me/soft/pptpd-1.3.4-1.rhel5.1.x86_64.rpm #安装下载的软件 rpm -qa ppp ppp-2.4.4-2.el5 #确认服务器是否按装ppp modprobe ppp-compress-18 &#38;&#38; echo ok ok #确定内核是否支持mppe,如果显示ok，内核已经具备了mppe支持。如果不支持,需要编译内核或安装dkms软件包,dkms是一个新的软件，能让你在不编译内核的基础上，外挂一些内核的模块。kernel_ppp_mppe就是mppe支持的内核模块了。 rpm -ivh http://aaronw.me/soft/dkms-2.0.10-1.noarch.rpm rpm -ivh http://aaronw.me/soft/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm strings /usr/sbin/pppd &#124;grep -i mppe &#124; wc [...]]]></description> <content:encoded><![CDATA[<p>公司要在外地建IDC,需要搭建一个VPN，便于日常维护，大多数公司都使用openVPN，但是在我的映像中windows上使用openVPN需要用一个客户端软件，为了简单化客户端，我选择了PPtpd-vpn.网上参看了一些VPN的搭建方法，都是残缺不全的，还是自己写一下吧！用的上，就看看吧！说明一下，<span
style="color: #ff6600;">斜体为执行的命令</span></p><p>1、环境说明</p><p><I>uname -a</I><br
/> Linux DataCenter 2.6.18-164.el5xen #1 SMP Thu Sep 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux</p><p><I>cat /etc/redhat-release</I><br
/> CentOS release 5.4 (Final)</p><p>2、软件安装<br
/> <I>rpm -ivh http://aaronw.me/soft/pptpd-1.3.4-1.rhel5.1.x86_64.rpm</I><br
/> #安装下载的软件</p><p><I>rpm -qa ppp</I><br
/> ppp-2.4.4-2.el5<br
/> #确认服务器是否按装ppp</p><p><I>modprobe ppp-compress-18 &amp;&amp; echo ok</I><br
/> ok<br
/> #确定内核是否支持mppe,如果显示ok，内核已经具备了mppe支持。如果不支持,需要编译内核或安装dkms软件包,dkms是一个新的软件，能让你在不编译内核的基础上，外挂一些内核的模块。kernel_ppp_mppe就是mppe支持的内核模块了。<br
/> <span
id="more-912"></span><br
/> <I>rpm -ivh http://aaronw.me/soft/dkms-2.0.10-1.noarch.rpm</I><br
/> <I> rpm -ivh http://aaronw.me/soft/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm</I><br
/> <I> strings /usr/sbin/pppd |grep -i mppe | wc -l</I><br
/> 42<br
/> #如果以上命令输出为“0”则表示不支持；输出为“30”或更大的数字就表示支持。</p><p>3、配置文件</p><p><I>vi /etc/ppp/chap-secrets</I><br
/> # Secrets for authentication using CHAP<br
/> # client server secret IP addresses<br
/> test  pptpd  1234  *<br
/> #配置pptp-vpn的用户,用户名是test,密码是1234</p><p><I>cd /etc/ppp</I><br
/> <I>mv options.pptpd optionspptpd</I> #备份原始文件<br
/> <I>vi options.pptpd</I> #创建新的配置文件<br
/> name pptpd #pptpd vpn的名字,和/etc/ppp/chap-secrets里的server要一样<br
/> refuse-pap #拒绝pap身份验证模式<br
/> refuse-chap #拒绝chap身份验证模式<br
/> refuse-mschap #拒绝mschap身份验证模式<br
/> require-mschap-v2 #要求在端点进行连接握手时需要使用微软的 mschap-v2 进行自身验证。<br
/> require-mppe-128 #要求mppe的128位加密<br
/> proxyarp #建立 ARP 代理键值<br
/> lock #锁定客户端 PTY 设备文件。<br
/> nobsdcomp #禁用 BSD 压缩模式<br
/> novj<br
/> Novjccomp #禁用 Van Jacobson 压缩模式<br
/> nologfd #禁止将错误信息记录到标准错误输出设备<br
/> ms-dns 208.67.222.222<br
/> ms-dns 208.67.220.220<br
/> #ppp 为 Windows 客户端提供 DNS 服务器 IP 地址，第一个 ms-dns 为 DNS Master，第二个为 DNS Slave.<br
/> <I>vi /etc/pptpd.conf</I><br
/> option /etc/ppp/options.pptpd<br
/> logwtmp<br
/> localip 192.168.1.1 #服务器端IP<br
/> remoteip 192.168.1.11-15 #客户端可以获得的IP的范围</p><p><I>/etc/sysctl.conf</I><br
/> net.ipv4.ip_forward = 1<br
/> <I>sysctl -p</I> #开启路由转发</p><p>4、启停服务<br
/> <I>Chkconfig &#8211;level 35 pptpd on</I> #配置为随系统启动<br
/> <I>Service pptpd start</I> #启动pptpd服务<br
/> <I>Server pptpd stop</I> #停止pptpd服务<br
/> <I>netstat -ntpl |grep 1723</I><br
/> tcp    0      0 0.0.0.0:1723  0.0.0.0:*          LISTEN      2553/pptpd</p><p>5、客户端配置(以windows7为例)</p><p>打开网络和共享中心<br
/> <img
class="alignnone" title="网络和共享中心" src="/pic/vpn1.jpg" alt="" width="282" height="429" /><br
/> 添加新网络<br
/> <img
class="alignnone" title="添加新网络" src="/pic/vpn2.jpg" alt="pptpd vpn" width="447" height="210" /><br
/> 连接到工作区<br
/> <img
class="alignnone" title="连接到工作区" src="/pic/vpn3.jpg" alt="pptpd vpn" width="269" height="162" /><br
/> 建立新的网络连接<br
/> <img
class="alignnone" title="建立新的网络连接" src="/pic/vpn4.jpg" alt="pptpd vpn" width="217" height="132" /><br
/> 使用internet连接VPN<br
/> <img
class="alignnone" title="使用internet连接VPN" src="/pic/vpn5.jpg" alt="pptpd vpn" width="404" height="175" /><br
/> 输入VPN服务器的地址,并给该连接起个名<br
/> <img
class="alignnone" title="输入VPN服务器的地址,并给该连接起个名" src="/pic/vpn6.jpg" alt="pptpd vpn" width="625" height="485" /><br
/> 输入用户名和密码,其他选项可以忽略了!然后保存该连接<br
/> <img
class="alignnone" title="输入用户名和密码,其他选项可以忽略了!然后保存该连接" src="/pic/vpn7.jpg" alt="pptpd vpn" width="401" height="125" /><br
/> 点击连接的属性配置安全选项<br
/> <img
class="alignnone" title="点击连接的属性配置安全选项" src="/pic/vpn8.jpg" alt="pptpd vpn" width="376" height="446" /><br
/> 连接后,注意红线位置<br
/> <img
class="alignnone" title="连接后,注意红线位置" src="/pic/vpn9.jpg" alt="pptpd vpn" width="377" height="429" /></p> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/912.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>SSL certificate problem</title><link>http://aaronw.me/static/902.html</link> <comments>http://aaronw.me/static/902.html#comments</comments> <pubDate>Wed, 19 Oct 2011 07:30:23 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[gridfs]]></category> <category><![CDATA[mongodb]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=902</guid> <description><![CDATA[最近开始赶潮流，弄起mongoDB了，用它存储文本信息，前端用nginx做代理需要安装nginx-gridFS模块，但是在我下载该模块的时候发生了这样的问题!操作代码如下： [root@aaronw nginx-gridfs]# git clone https://github.com/mdirolf/nginx-gridfs.git Cloning into nginx-gridfs&#8230; error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/mdirolf/nginx-gridfs.git/info/refs fatal: HTTP request failed 后来以为是防火墙的问题，但是我把防火墙停了还是不行，最终还是放狗找到的！在一个英文网站，有人提到了这样一句话： [root@aaronw nginx-gridfs]# export GIT_SSL_NO_VERIFY=true ,然后再执行上面的操作就可以了！]]></description> <content:encoded><![CDATA[<p>最近开始赶潮流，弄起mongoDB了，用它存储文本信息，前端用nginx做代理需要安装nginx-gridFS模块，但是在我下载该模块的时候发生了这样的问题!操作代码如下：<div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">[root@aaronw nginx-gridfs]#  git clone https://github.com/mdirolf/nginx-gridfs.git<br
/> Cloning into nginx-gridfs&#8230;<br
/> error: SSL certificate problem, verify that the CA cert is OK. Details:<br
/> error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://github.com/mdirolf/nginx-gridfs.git/info/refs</p><p>fatal: HTTP request failed</p></div><p>后来以为是防火墙的问题，但是我把防火墙停了还是不行，最终还是放狗找到的！在一个英文网站，有人提到了这样一句话：<div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">[root@aaronw nginx-gridfs]# export GIT_SSL_NO_VERIFY=true</div><p>,然后再执行上面的操作就可以了！</p> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/902.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>python版子网掩码转换</title><link>http://aaronw.me/static/884.html</link> <comments>http://aaronw.me/static/884.html#comments</comments> <pubDate>Tue, 27 Sep 2011 04:44:54 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[python]]></category> <category><![CDATA[子网掩码]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=884</guid> <description><![CDATA[子网掩码有两种格式，一种是 IPv4 地址式的：255.255.255.0 ，另一种是十进制整数的：24 今天突然想起来，以前做的子网转换的bash的脚本不能用了，正好现在在学python，看看python是怎么实现的！还是请教google大哥吧！放出google后，得到这样一个结果，原文地址：子网掩码格式转换： # coding:utf-8 def exchange_mask(mask): “”" 转换子网掩码格式 “”" # 计算二进制字符串中 &#8217;1&#8242; 的个数 &#160;&#160;&#160;&#160;count_bit = lambda bin_str: len([i for i in bin_str if i=='1']) # 分割字符串格式的子网掩码为四段列表 &#160;&#160;&#160;&#160;mask_splited = mask.split(&#8216;.&#8217;) # 转换各段子网掩码为二进制, 计算十进制 &#160;&#160;&#160;&#160;mask_count = [count_bit(bin(int(i))) for i in mask_splited] &#160;&#160;&#160;&#160;return sum(mask_count) if __name__ == &#8216;__main__&#8217;: &#160;&#160;&#160;&#160;print exchange_mask(&#8217;255.255.0.0&#8242;) 该程序运行后提示bin没有定义，随后对代码进行修改，改后代码就可以正常工作了！这也算是比较简洁的了，代码如下： #!/usr/bin/env python # coding:utf-8 [...]]]></description> <content:encoded><![CDATA[<p>子网掩码有两种格式，一种是 IPv4 地址式的：255.255.255.0 ，另一种是十进制整数的：24<br
/> 今天突然想起来，以前做的子网转换的bash的脚本不能用了，正好现在在学python，看看python是怎么实现的！还是请教google大哥吧！放出google后，得到这样一个结果，原文地址：<span
class="Apple-style-span" style="font-size: 12px; font-weight: bold;"><a
href="http://www.oschina.net/code/snippet_74928_4369">子网掩码格式转换</a></span>：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;"><p># coding:utf-8</p><p>def exchange_mask(mask):<br
/> “”"<br
/> 转换子网掩码格式<br
/> “”"<br
/> # 计算二进制字符串中 &#8217;1&#8242; 的个数<br
/> &nbsp;&nbsp;&nbsp;&nbsp;count_bit = lambda bin_str: len([i for i in bin_str if i=='1'])<br
/> # 分割字符串格式的子网掩码为四段列表<br
/> &nbsp;&nbsp;&nbsp;&nbsp;mask_splited = mask.split(&#8216;.&#8217;)<br
/> # 转换各段子网掩码为二进制, 计算十进制<br
/> &nbsp;&nbsp;&nbsp;&nbsp;mask_count = [count_bit(bin(int(i))) for i in mask_splited]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;return sum(mask_count)</p><p>if __name__ == &#8216;__main__&#8217;:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;print exchange_mask(&#8217;255.255.0.0&#8242;)</p></div><p>该程序运行后提示bin没有定义，随后对代码进行修改，改后代码就可以正常工作了！这也算是比较简洁的了，代码如下：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">#!/usr/bin/env python<br
/> # coding:utf-8<br
/> def exchange_mask(mask):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;bin = lambda n : (n &gt; 0) and (bin(n / 2) + str(n % 2)) or ”<br
/> &nbsp;&nbsp;&nbsp;&nbsp;count_bit = lambda bin_str: len([i for i in bin_str if i=='1'])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;mask_splited = mask.split(&#8216;.&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;mask_count = [count_bit(bin((int(i)))) for i in mask_splited]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;return sum(mask_count)<br
/> if __name__ == &#8216;__main__&#8217;:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;print exchange_mask(&#8217;255.255.0.0&#8242;)</div> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/884.html/feed</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>备份散列文件的python脚本(二)</title><link>http://aaronw.me/static/842.html</link> <comments>http://aaronw.me/static/842.html#comments</comments> <pubDate>Wed, 06 Apr 2011 06:53:41 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[python]]></category> <category><![CDATA[散列]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=842</guid> <description><![CDATA[这个是在备份散列文件的python脚本上进行修改的，加入了多线程，也实现了多种输入方法。废话不多说了！直接上代码，欢迎拍砖！ #!/usr/local/python/bin/python #encoding=utf-8 #description:backup&#160;the&#160;publish&#160;book&#160;resource&#160; #author&#160;Aaron&#160;wang import&#160;datetime,os,sys import&#160;MySQLdb import&#160;threading from&#160;sys&#160;import&#160;argv reload(sys) sys.setdefaultencoding(&#8216;utf-8&#8242;) mylock&#160;=&#160;threading.RLock() list=[] def&#160;get_id_mysql(): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;global&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn=MySQLdb.connect(host=”192.168.1.239&#8243;,user=”taduandroid”,passwd=”diordna”,db=”tdonline”,charset=”utf8&#8243;) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cursor=conn.cursor() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;#print&#160;”begin&#160;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&#160;%H:%M:%S”) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cursor.execute(“select&#160;id&#160;from&#160;books&#160;b&#160;where&#160;b.status=&#8217;published&#8217;&#160;limit&#160;10&#8243;) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;n=cursor.fetchall() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;#print&#160;”query&#160;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&#160;%H:%M:%S”) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;i&#160;in&#160;n: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;list.append(str(i[0])) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;#print&#160;”create&#160;list&#160;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&#160;%H:%M:%S”) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;#print&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;finally: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cursor.close() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn.close() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;except&#160;Exception,e: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;print&#160;&#8217;database&#160;error:&#8217;,e &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;1 def&#160;get_id_file(filename): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;global&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;nfile=open(filename,&#8217;r').read() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;list=nfile.split() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;i&#160;in&#160;list: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int(i) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;print&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;except: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;print&#160;&#8217;file&#160;error:there&#160;is&#160;no&#160;id&#160;in&#160;the&#160;file&#160;”&#8216;+filename+&#8217;”&#8216; def&#160;get_id_custom(fromid,endid): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;global&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;i&#160;in&#160;xrange(fromid,endid): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;list.append(i) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;print&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;list &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; def&#160;bpsql(id): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;conn=MySQLdb.connect(host=”192.168.1.239&#8243;,user=”taduandroid”,passwd=”diordna”,db=”tdonline”,charset=”utf8&#8243;) [...]]]></description> <content:encoded><![CDATA[<p>这个是在<a
title="备份散列文件的python脚本" href="http://aaronw.me/static/834.html" target="_blank">备份散列文件的python脚本</a>上进行修改的，加入了多线程，也实现了多种输入方法。废话不多说了！直接上代码，欢迎拍砖！</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">#!/usr/local/python/bin/python<br
/> #encoding=utf-8<br
/> #description:backup&nbsp;the&nbsp;publish&nbsp;book&nbsp;resource&nbsp;<br
/> #author&nbsp;Aaron&nbsp;wang<br
/> import&nbsp;datetime,os,sys<br
/> import&nbsp;MySQLdb<br
/> import&nbsp;threading<br
/> from&nbsp;sys&nbsp;import&nbsp;argv<br
/> reload(sys)<br
/> sys.setdefaultencoding(&#8216;utf-8&#8242;)<br
/> mylock&nbsp;=&nbsp;threading.RLock()<br
/> list=[]<br
/> def&nbsp;get_id_mysql():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn=MySQLdb.connect(host=”192.168.1.239&#8243;,user=”taduandroid”,passwd=”diordna”,db=”tdonline”,charset=”utf8&#8243;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<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;cursor=conn.cursor()<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;#print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<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;cursor.execute(“select&nbsp;id&nbsp;from&nbsp;books&nbsp;b&nbsp;where&nbsp;b.status=&#8217;published&#8217;&nbsp;limit&nbsp;10&#8243;)<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;n=cursor.fetchall()<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;#print&nbsp;”query&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<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;for&nbsp;i&nbsp;in&nbsp;n:<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;list.append(str(i[0]))<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;#print&nbsp;”create&nbsp;list&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<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;#print&nbsp;list<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;return&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally:<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;cursor.close()<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;conn.close()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception,e:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&#8217;database&nbsp;error:&#8217;,e<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1</p><p>def&nbsp;get_id_file(filename):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfile=open(filename,&#8217;r').read()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list=nfile.split()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;list:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int(i)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&#8217;file&nbsp;error:there&nbsp;is&nbsp;no&nbsp;id&nbsp;in&nbsp;the&nbsp;file&nbsp;”&#8216;+filename+&#8217;”&#8216;</p><p>def&nbsp;get_id_custom(fromid,endid):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(fromid,endid):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.append(i)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br
/> def&nbsp;bpsql(id):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn=MySQLdb.connect(host=”192.168.1.239&#8243;,user=”taduandroid”,passwd=”diordna”,db=”tdonline”,charset=”utf8&#8243;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor=conn.cursor()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.execute(“select&nbsp;a.book_id,a.id,a.original_part_file,a.part_file&nbsp;from&nbsp;book_parts&nbsp;a&nbsp;where&nbsp;a.book_id=”+str(id)+”;”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n=cursor.fetchall()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print&nbsp;id<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print&nbsp;”query&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.close()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception,e:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&#8217;database&nbsp;error:&#8217;,e<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1</p><p>def&nbsp;download(ds,dd,dbport):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=1<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;type&nbsp;==&nbsp;0:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;row&nbsp;in&nbsp;dbport:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dname=os.popen(&#8216;dirname&#8217;+”&nbsp;”+row[2]).readlines()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;mkdir&nbsp;-p&nbsp;&#8217;+dd+”/”+ds+dname[0])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;cp&#8217;+”&nbsp;”+ds+”/”+str(row[2])+”&nbsp;”+dd+ds+str(row[2]))<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;cp&#8217;+”&nbsp;”+ds+”/”+str(row[3])+”&nbsp;”+dd+ds+str(row[3]))<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logfile=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;row&nbsp;in&nbsp;dbport:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row2=str(row[2]).split(&#8216;/&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row3=str(row[3]).split(&#8216;/&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f1=str(row[0])+”+”+str(row[1])+”+”+str(row2[4])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f2=str(row[0])+”+”+str(row[1])+”+”+str(row3[4])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#dname=os.popen(&#8216;dirname&#8217;+”&nbsp;”+row[2]).readlines()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#fname1=os.popen(&#8216;basename&#8217;+”&nbsp;”+row[2]).readlines()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#fname2=os.popen(&#8216;basename&#8217;+”&nbsp;”+row[3]).readlines()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#os.popen(&#8216;mkdir&nbsp;-p&#8217;+”&nbsp;”+argv[2]+argv[1]+”/”+dname[0])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#os.popen(&#8216;touch&#8217;+”&nbsp;”+argv[2]+argv[1]+”/”+row[2])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#os.popen(&#8216;touch&#8217;+”&nbsp;”+argv[2]+argv[1]+”/”+row[3])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;mkdir&nbsp;-p&nbsp;&#8217;+dd+”/”+str(row[0]))<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;cp&#8217;+”&nbsp;”+ds+”/”+str(row[2])+”&nbsp;”+dd+”/”+str(row[0])+”/”+f1)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logfile.append(ds+”/”+str(row[2])+&#8217;\n&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;cp&#8217;+”&nbsp;”+ds+”/”+str(row[3])+”&nbsp;”+dd+”/”+str(row[0])+”/”+f2)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logfile.append(ds+”/”+str(row[3])+&#8217;\n&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;os.path.exists(dd+”/”+str(row[0])+”/file.log”):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f=open(dd+”/”+str(row[0])+”/file.log”,&#8217;w')<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.writelines(logfile)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.close<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f=file(dd+”/”+str(row[0])+”/file.log”,&#8217;w')<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.writelines(logfile)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.close<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logfile=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception,e:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&#8217;parameter&nbsp;error:&#8217;,e</p><p>class&nbsp;mythread(threading.Thread):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;list<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,name,myts,mytd):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threading.Thread.__init__(self)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.t_name&nbsp;=&nbsp;name<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ts&nbsp;=&nbsp;myts<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.td&nbsp;=&nbsp;mytd</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;run(self):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;True:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&#8217;Threadname:%s&#8217;&nbsp;%&nbsp;&nbsp;(self.t_name)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;list:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mylock.acquire()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowid=list[0]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del&nbsp;list[0]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mylock.release()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=bpsql(rowid)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;a&nbsp;!=&nbsp;1:<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;download(self.ts,self.td,a)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”end&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print&nbsp;”download&nbsp;file&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)</p><p>def&nbsp;main(ms,md,mf,mx,mn,mt):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;mt&nbsp;==&nbsp;”a”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#print&nbsp;”a”<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_id_file(mf)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(int(mn)):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi&nbsp;=&nbsp;mythread(i,ms,md)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi.start()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;mt&nbsp;==&nbsp;”b”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”b”<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_id_file(mf)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(int(n)):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi&nbsp;=&nbsp;mythread(i,ms,md)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi.start()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;mt&nbsp;==&nbsp;”c”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”c”<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_id_mysql()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(int(mn)):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi&nbsp;=&nbsp;mythread(i,ms,md)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi.start()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;mt&nbsp;==&nbsp;”d”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”d”<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_id_mysql()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(int(mn)):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi&nbsp;=&nbsp;mythread(i,ms,md)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi.start()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;mt&nbsp;==&nbsp;”e”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”e”<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_id_custom(int(mf),int(mx))<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”begin&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;xrange(int(mn)):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi&nbsp;=&nbsp;mythread(i,ms,md)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadi.start()<br
/> def&nbsp;tar():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;today=datetime.date.today().strftime(&#8216;%Y%m%d&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;cd&#8217;+”&nbsp;”+argv[2]+&#8217;&nbsp;&#038;&#038;&#8217;+”&nbsp;”+&#8217;tar&nbsp;czf&nbsp;books&#8217;+today+&#8217;.tgz&nbsp;.&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”create&nbsp;tar&nbsp;file&nbsp;time:”+datetime.datetime.now().strftime(“%Y-%m-%d&nbsp;%H:%M:%S”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#os.popen(books&#8217;+today+&#8217;.tgz&#8217;)</p><p>def&nbsp;usage():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;”"”Usage:&nbsp;tdtools&nbsp;[OPTION]&#8230;<br
/> -s=PATH			source&nbsp;dir&nbsp;path.&nbsp;like:&nbsp;/ty/media</p><p> -d=PATH			destination&nbsp;dir&nbsp;path.&nbsp;like:&nbsp;/ty/backup</p><p> -fid=id_num		the&nbsp;first&nbsp;id.&nbsp;like:&nbsp;1</p><p> -eid=id_num		the&nbsp;end&nbsp;id.&nbsp;like:&nbsp;100</p><p> -file=FILEPATH		get&nbsp;the&nbsp;id&nbsp;from&nbsp;a&nbsp;txt.&nbsp;like:/tmp/book_id.txt</p><p> -t=num			start&nbsp;&nbsp;the&nbsp;number&nbsp;of&nbsp;thread.&nbsp;default:2</p><p>Report&nbsp;bugs&nbsp;to&nbsp;<wv.hello[at]gmail.com>.”wv.hello[at]gmail.com”<br
/> def&nbsp;param(s,d,f,x,n):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps=str(s).split(“=”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pd=str(d).split(“=”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pf=str(f).split(“=”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;px=str(x).split(“=”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pn=str(n).split(“=”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ps[0][1:]&nbsp;==&nbsp;”s”&nbsp;and&nbsp;pd[0][1:]&nbsp;==&nbsp;”d”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;pf[0][1:]&nbsp;==&nbsp;”file”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;int(px[1])&nbsp;!=&nbsp;0:<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;pn[1]=px[1]<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;#print&nbsp;ps[1],pd[1],pf[1],px[1],pn[1],”a”<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;main(ps[1],pd[1],pf[1],px[1],pn[1],”a”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;&nbsp;pf[0][1:]&nbsp;==&nbsp;”file”:<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;print&nbsp;ps[1],pd[1],pf[1],px[1],pn[1],”b”<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;main(ps[1],pd[1],pf[1],px[1],pn[1],”b”)<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;#get_id_file(pf[1])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<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;usage()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;pf[0][1:]&nbsp;==&nbsp;”t”:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;px[0][1:]&nbsp;==&nbsp;”x”:<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;pn[1]=pf[1]<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;print&nbsp;ps[1],pd[1],pf[1],px[1],pn[1],”c”<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;main(ps[1],pd[1],pf[1],px[1],pn[1],”c”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<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;usage()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;pf[0][1:]&nbsp;==&nbsp;”a”:<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;print&nbsp;ps[1],pd[1],pf[1],px[1],pn[1],”d”<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;main(ps[1],pd[1],pf[1],px[1],pn[1],”d”)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<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;if&nbsp;px[0][1:]&nbsp;==&nbsp;”eid”:<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;px[1]=int(px[1])+1<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;print&nbsp;ps[1],pd[1],pf[1],px[1],pn[1],”e”<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;main(ps[1],pd[1],pf[1],px[1],pn[1],”e”)<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;#get_id_custom(int(pf[1]),int(px[1]))<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;else:<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;usage()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage()</p><p>if&nbsp;__name__==&#8217;__main__&#8217;:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;len(argv)&nbsp;==3:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param(argv[1],argv[2],&#8217;-a=0&#8242;,&#8217;-x=0&#8242;,&#8217;-t=2&#8242;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;len(argv)&nbsp;==4:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param(argv[1],argv[2],argv[3],&#8217;-x=0&#8242;,&#8217;-t=2&#8242;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;len(argv)&nbsp;==5:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param(argv[1],argv[2],argv[3],argv[4],&#8217;-t=2&#8242;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;len(argv)&nbsp;==6:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param(argv[1],argv[2],argv[3],argv[4],argv[5])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage()</p></div> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/842.html/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>备份散列文件的python脚本</title><link>http://aaronw.me/static/834.html</link> <comments>http://aaronw.me/static/834.html#comments</comments> <pubDate>Thu, 24 Mar 2011 09:53:32 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[code]]></category> <category><![CDATA[python]]></category> <category><![CDATA[散列]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=834</guid> <description><![CDATA[昨天在机房煎熬了一天，今天一大早来公司，老大说昨天晚上线上项目出了点问题，正巧这个项目又是我在维护。听到这句话，我心里就“咯咚”一下，接着老大又说已经恢复好了，汗~@￥#%@￥！。然后老大给我布置了一个任务，让我写个脚本从数据库里查出发布状态的文档路径，并备份，要求备份的目录要保持原有的目录结构。说话就开始干！python学的不怎么样，搞了半天才弄出来，现在贴在这里，请朋友们拍砖吧！脚本带有备份打包功能，代码如下： #!/usr/local/python/bin/python #encoding=utf-8 #description:backup the publish book resource #author Aaron wang import datetime,os from sys import argv import MySQLdb def download(): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mydb=MySQLdb.connect(host=”192.168.1.1&#8243;,user=”root”,passwd=”root”,db=”online”,charset=”utf8&#8243;) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cursor=mydb.cursor() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cursor.execute(“select a.part_file,a.original_part_file from book_parts a,books b where a.id=b.id and b.status=&#8217;published&#8217; “) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;n=cursor.fetchall()&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for i in n: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;a=[] &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;a.append(argv[1]+”/”+i[0]) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;a.append(argv[1]+”/”+i[1]) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for row in a: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fname=os.popen(&#8216;basename&#8217;+” “+row).readlines() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dname=os.popen(&#8216;dirname&#8217;+” “+row).readlines() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;os.popen(&#8216;mkdir -p&#8217;+” “+argv[2]+”/”+dname[0]) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;os.popen(&#8216;cp&#8217;+” “+row+” [...]]]></description> <content:encoded><![CDATA[<p>昨天在机房煎熬了一天，今天一大早来公司，老大说昨天晚上线上项目出了点问题，正巧这个项目又是我在维护。听到这句话，我心里就“咯咚”一下，接着老大又说已经恢复好了，汗~@￥#%@￥！。然后老大给我布置了一个任务，让我写个脚本从数据库里查出发布状态的文档路径，并备份，要求备份的目录要保持原有的目录结构。说话就开始干！python学的不怎么样，搞了半天才弄出来，现在贴在这里，请朋友们拍砖吧！脚本带有备份打包功能，代码如下：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">#!/usr/local/python/bin/python<br
/> #encoding=utf-8<br
/> #description:backup the publish book resource<br
/> #author Aaron wang<br
/> import datetime,os<br
/> from sys import argv<br
/> import MySQLdb<br
/> def download():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mydb=MySQLdb.connect(host=”192.168.1.1&#8243;,user=”root”,passwd=”root”,db=”online”,charset=”utf8&#8243;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor=mydb.cursor()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.execute(“select a.part_file,a.original_part_file from book_parts a,books b where a.id=b.id and b.status=&#8217;published&#8217; “)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n=cursor.fetchall()&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i in n:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.append(argv[1]+”/”+i[0])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.append(argv[1]+”/”+i[1])<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for row in a:<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;fname=os.popen(&#8216;basename&#8217;+” “+row).readlines()<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;dname=os.popen(&#8216;dirname&#8217;+” “+row).readlines()<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;os.popen(&#8216;mkdir -p&#8217;+” “+argv[2]+”/”+dname[0])<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;os.popen(&#8216;cp&#8217;+” “+row+” “+argv[2]+”/”+row)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row=[]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.close()<br
/> def tar():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;today=datetime.date.today().strftime(&#8216;%Y%m%d&#8217;)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.popen(&#8216;cd&#8217;+” “+argv[2]+&#8217; &amp;&amp;&#8217;+” “+&#8217;tar czf books&#8217;+today+&#8217;.tgz .&#8217;)<br
/> def usage():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print “error:the parameter is empty!\nuasge:python ttools.py source destination\nexample:python ttools.py /ty/media /tmp”<br
/> if __name__==&#8217;__main__&#8217;:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(argv) !=3:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;download()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar()</p></div> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/834.html/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>在bash里进行数学运算</title><link>http://aaronw.me/static/795.html</link> <comments>http://aaronw.me/static/795.html#comments</comments> <pubDate>Fri, 11 Feb 2011 08:40:59 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[shell]]></category> <category><![CDATA[计算]]></category> <guid
isPermaLink="false">http://aaronw.me/?p=795</guid> <description><![CDATA[在bash里进行使用运算表达式的方式很多，也很简单，看例子即可： 把65的平方赋值给index变量 ((index=65*65)) let index=65*65 index=`expr  65 \* 65` 对index进行递增 ((index++)) let index++ 第一个例子里，用到了三种不同的方法，效果是一样的。需要注意的是第三种方法。该方法结合了expr命令和执行操作符`。expr的作用是对后面的运算表达式计算，然后把结果输出，而`用来获得输出，返回给index。在expr后的表达式里，各个部分必须用空格分开，一些特殊字符，例如乘号*必须在前面加个反斜杠转义。 用expr不能直接进行对变量的自增操作，所以在第二个例子里，我没有用到expr这种方式。 let和(())的作用基本一样，唯一的不同是，let后面的运算表达式各个部分不能有空格隔离开，这个和expr正好相反。而(())里面的运算表达式，空格是无关紧要的，存在与否都不会对运算有影响。 bash里的算术表达式有如下操作符： - + 减，加 ! ~ 逻辑否，反位操作 * / % 乘，除，取模 + - addition, subtraction &#60;&#60; &#62;&#62; left and right bitwise shifts &#60;= &#62;= &#60; &#62; comparison == != equality and inequality &#38; bitwise AND ^ bitwise exclusive OR [...]]]></description> <content:encoded><![CDATA[<div
id="_mcePaste">在bash里进行使用运算表达式的方式很多，也很简单，看例子即可：</div><div
id="_mcePaste">把65的平方赋值给index变量</div><div
id="_mcePaste">((index=65*65))</div><div
id="_mcePaste">let index=65*65</div><div
id="_mcePaste">index=`expr  65 \* 65`</div><div
id="_mcePaste">对index进行递增</div><div
id="_mcePaste">((index++))</div><div
id="_mcePaste">let index++</div><div
id="_mcePaste">第一个例子里，用到了三种不同的方法，效果是一样的。需要注意的是第三种方法。该方法结合了expr命令和执行操作符`。expr的作用是对后面的运算表达式计算，然后把结果输出，而`用来获得输出，返回给index。在expr后的表达式里，各个部分必须用空格分开，一些特殊字符，例如乘号*必须在前面加个反斜杠转义。</div><div
id="_mcePaste">用expr不能直接进行对变量的自增操作，所以在第二个例子里，我没有用到expr这种方式。</div><div
id="_mcePaste">let和(())的作用基本一样，唯一的不同是，let后面的运算表达式各个部分不能有空格隔离开，这个和expr正好相反。而(())里面的运算表达式，空格是无关紧要的，存在与否都不会对运算有影响。</div><div
id="_mcePaste">bash里的算术表达式有如下操作符：</div><p><span
id="more-795"></span></p><div
id="_mcePaste">- +</div><div
id="_mcePaste">减，加</div><div
id="_mcePaste">! ~</div><div
id="_mcePaste">逻辑否，反位操作</div><div
id="_mcePaste">* / %</div><div
id="_mcePaste">乘，除，取模</div><div
id="_mcePaste">+ -</div><div
id="_mcePaste">addition, subtraction</div><div
id="_mcePaste">&lt;&lt; &gt;&gt;</div><div
id="_mcePaste">left and right bitwise shifts</div><div
id="_mcePaste">&lt;= &gt;= &lt; &gt;</div><div
id="_mcePaste">comparison</div><div
id="_mcePaste">== !=</div><div
id="_mcePaste">equality and inequality</div><div
id="_mcePaste">&amp;</div><div
id="_mcePaste">bitwise AND</div><div
id="_mcePaste">^</div><div
id="_mcePaste">bitwise exclusive OR</div><div
id="_mcePaste">|</div><div
id="_mcePaste">位操作或</div><div
id="_mcePaste">&amp;&amp;</div><div
id="_mcePaste">逻辑与</div><div
id="_mcePaste">||</div><div
id="_mcePaste">逻辑或</div><div
id="_mcePaste">= *= /= %= += -= &lt;&lt;= &gt;&gt;= &amp;= ^= |=</div><div
id="_mcePaste">赋值</div><p>在bash里进行使用运算表达式的方式很多，也很简单，看例子即可：把65的平方赋值给index变量((index=65*65))let index=65*65index=`expr  65 \* 65`对index进行递增((index++))let index++</p><p>第一个例子里，用到了三种不同的方法，效果是一样的。需要注意的是第三种方法。该方法结合了expr命令和执行操作符`。expr的作用是对后面的运算表达式计算，然后把结果输出，而`用来获得输出，返回给index。在expr后的表达式里，各个部分必须用空格分开，一些特殊字符，例如乘号*必须在前面加个反斜杠转义。<br
/> 用expr不能直接进行对变量的自增操作，所以在第二个例子里，我没有用到expr这种方式。<br
/> let和(())的作用基本一样，唯一的不同是，let后面的运算表达式各个部分不能有空格隔离开，这个和expr正好相反。而(())里面的运算表达式，空格是无关紧要的，存在与否都不会对运算有影响。<br
/> bash里的算术表达式有如下操作符：<br
/> - +    减，加<br
/> ! ~    逻辑否，反位操作<br
/> * / %    乘，除，取模<br
/> + -    addition, subtraction<br
/> &lt;&lt; &gt;&gt;    left and right bitwise shifts<br
/> &lt;= &gt;= &lt; &gt;    comparison<br
/> == !=    equality and inequality<br
/> &amp;    bitwise AND<br
/> ^    bitwise exclusive OR<br
/> |    位操作或<br
/> &amp;&amp;    逻辑与<br
/> ||    逻辑或<br
/> = *= /= %= += -= &lt;&lt;= &gt;&gt;= &amp;= ^= |=   赋值</p><p>文件比较运算符</p><p>-e filename<span
style="white-space: pre;"> </span>如果 filename 存在，则为真<span
style="white-space: pre;"> </span>[ -e /var/log/syslog ]</p><p>-d filename<span
style="white-space: pre;"> </span>如果 filename 为目录，则为真<span
style="white-space: pre;"> </span>[ -d /tmp/mydir ]</p><p>-f filename<span
style="white-space: pre;"> </span>如果 filename 为常规文件，则为真<span
style="white-space: pre;"> </span>[ -f /usr/bin/grep ]</p><p>-L filename<span
style="white-space: pre;"> </span>如果 filename 为符号链接，则为真<span
style="white-space: pre;"> </span>[ -L /usr/bin/grep ]</p><p>-r filename<span
style="white-space: pre;"> </span>如果 filename 可读，则为真<span
style="white-space: pre;"> </span>[ -r /var/log/syslog ]</p><p>-w filename<span
style="white-space: pre;"> </span>如果 filename 可写，则为真<span
style="white-space: pre;"> </span>[ -w /var/mytmp.txt ]</p><p>-x filename<span
style="white-space: pre;"> </span>如果 filename 可执行，则为真<span
style="white-space: pre;"> </span>[ -L /usr/bin/grep ]</p><p>filename1 -nt filename2<span
style="white-space: pre;"> </span>如果 filename1 比 filename2 新，则为真<span
style="white-space: pre;"> </span>[ /tmp/install/etc/services -nt /etc/services ]</p><p>filename1 -ot filename2<span
style="white-space: pre;"> </span>如果 filename1 比 filename2 旧，则为真<span
style="white-space: pre;"> </span>[ /boot/bzImage -ot arch/i386/boot/bzImage ]</p><p>字符串比较运算符 （请注意引号的使用，这是防止空格扰乱代码的好方法）</p><p>-z string<span
style="white-space: pre;"> </span>如果 string 长度为零，则为真<span
style="white-space: pre;"> </span>[ -z "$myvar" ]</p><p>-n string<span
style="white-space: pre;"> </span>如果 string 长度非零，则为真<span
style="white-space: pre;"> </span>[ -n "$myvar" ]</p><p>string1 = string2<span
style="white-space: pre;"> </span>如果 string1 与 string2 相同，则为真<span
style="white-space: pre;"> </span>[ "$myvar" = "one two three" ]</p><p>string1 != string2<span
style="white-space: pre;"> </span>如果 string1 与 string2 不同，则为真<span
style="white-space: pre;"> </span>[ "$myvar" != "one two three" ]</p><p>算术比较运算符</p><p>num1 -eq num2<span
style="white-space: pre;"> </span>等于<span
style="white-space: pre;"> </span>[ 3 -eq $mynum ]</p><p>num1 -ne num2<span
style="white-space: pre;"> </span>不等于<span
style="white-space: pre;"> </span>[ 3 -ne $mynum ]</p><p>num1 -lt num2<span
style="white-space: pre;"> </span>小于<span
style="white-space: pre;"> </span>[ 3 -lt $mynum ]</p><p>num1 -le num2<span
style="white-space: pre;"> </span>小于或等于<span
style="white-space: pre;"> </span>[ 3 -le $mynum ]</p><p>num1 -gt num2<span
style="white-space: pre;"> </span>大于<span
style="white-space: pre;"> </span>[ 3 -gt $mynum ]</p><p>num1 -ge num2<span
style="white-space: pre;"> </span>大于或等于<span
style="white-space: pre;"> </span>[ 3 -ge $mynum ]</p><p>转载地址：http://www.surfchen.org/wiki.php/在bash里进行数学运算</p> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/795.html/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>一个shell写的urldecode代码</title><link>http://aaronw.me/static/779.html</link> <comments>http://aaronw.me/static/779.html#comments</comments> <pubDate>Fri, 03 Dec 2010 06:17:37 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[awk]]></category> <category><![CDATA[decode]]></category> <category><![CDATA[shell]]></category> <guid
isPermaLink="false">http://www.aaronw.me/?p=779</guid> <description><![CDATA[一个同事来找我，说如何把url的代码做decode，我也没有搞过！google了一下，有人写的很多，但是把代码copy后总是有语法错误。下面是我调试后的原代码，copy就能用！自己也留个记忆吧！ 这是第一种方法：(标点符号会漏掉) #!/bin/sh awk &#8216; BEGIN { hextab=”0123456789ABCDEF” for ( i=1; i&#60;=255; ++i ) ord [i] = sprintf(“%c”,i); } { decoded = “” for ( i=1; i&#60;=length ($0); ++i ) { c = substr ($0, i, 1) if ( c ~ /[a-zA-Z0-9.-]/ ) { decoded = decoded c             # [...]]]></description> <content:encoded><![CDATA[<p>一个同事来找我，说如何把url的代码做decode，我也没有搞过！google了一下，有人写的很多，但是把代码copy后总是有语法错误。下面是我调试后的原代码，copy就能用！自己也留个记忆吧！<br
/> 这是第一种方法：(标点符号会漏掉)</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;"><div
id="_mcePaste">#!/bin/sh</div><div
id="_mcePaste">awk &#8216;</div><div
id="_mcePaste">BEGIN {</div><div
id="_mcePaste">hextab=”0123456789ABCDEF”</div><div
id="_mcePaste">for ( i=1; i&lt;=255; ++i ) ord [i] = sprintf(“%c”,i);</div><div
id="_mcePaste">}</div><div
id="_mcePaste">{</div><div
id="_mcePaste">decoded = “”</div><div
id="_mcePaste">for ( i=1; i&lt;=length ($0); ++i ) {</div><div
id="_mcePaste">c = substr ($0, i, 1)</div><div
id="_mcePaste">if ( c ~ /[a-zA-Z0-9.-]/ ) {</div><div
id="_mcePaste">decoded = decoded c             # safe character</div><div
id="_mcePaste">} else if ( c == ” ” ) {</div><div
id="_mcePaste">decoded = decoded “+”   # special handling</div><div
id="_mcePaste">} else if ( c == “%” ) {</div><div
id="_mcePaste">hi= substr($0,i+1,1);</div><div
id="_mcePaste">low=substr($0,i+2,1);</div><div
id="_mcePaste">i++;i++</div><div
id="_mcePaste">decoded = decoded ord[(index(hextab,hi)-1)*16+index(hextab,low)-1]</div><div
id="_mcePaste">}</div><div
id="_mcePaste">}</div><div
id="_mcePaste">}</div><div
id="_mcePaste">END {print decoded}</div><div
id="_mcePaste">&#8216;</div></div><p>这是第二种方法：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;"><div
id="_mcePaste"><div
id="_mcePaste">#/bin/sh</div><div
id="_mcePaste">awk &#8216;BEGIN {</div><div
id="_mcePaste">for(i=0;i&lt;10;i++)</div><div
id="_mcePaste">hex[i]=i;</div><div
id="_mcePaste">hex["A"]=hex["a"]=10;</div><div
id="_mcePaste">hex["B"]=hex["b"]=11;</div><div
id="_mcePaste">hex["C"]=hex["c"]=12;</div><div
id="_mcePaste">hex["D"]=hex["d"]=13;</div><div
id="_mcePaste">hex["E"]=hex["e"]=14;</div><div
id="_mcePaste">hex["F"]=hex["f"]=15;</div><div
id="_mcePaste">}</div><div
id="_mcePaste">{</div><div
id="_mcePaste">gsub(/\+/,” “);</div><div
id="_mcePaste">i=$0;</div><div
id="_mcePaste">while(match(i,/%../)){</div><div
id="_mcePaste">if(RSTART&gt;1);</div><div
id="_mcePaste">printf”%s”,substr(i,1,RSTART-1);</div><div
id="_mcePaste">printf”%c”,hex[substr(i,RSTART+1,1)]*16+hex[substr(i,RSTART+2,1)];</div><div
id="_mcePaste">i=substr(i,RSTART+RLENGTH);</div><div
id="_mcePaste">}</div><div
id="_mcePaste">print i;</div><div
id="_mcePaste">}&#8217;</div></div></div> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/779.html/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>uwsgi纯C的web服务器</title><link>http://aaronw.me/static/749.html</link> <comments>http://aaronw.me/static/749.html#comments</comments> <pubDate>Fri, 26 Nov 2010 02:42:52 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[python]]></category> <category><![CDATA[uwsgi]]></category> <guid
isPermaLink="false">http://www.aaronw.me/?p=749</guid> <description><![CDATA[uwsgi 是一个使用标准wsgi的python web server,下面是安装方法： wget http://projects.unbit.it/downloads/uwsgi-0.9.6.5.tar.gz tar zvxf uwsgi-0.9.6.5.tar.gz cd uwsgi-0.9.6.5 make -f Makefile.Py25 cp uwsgi /usr/sbin/uwsgi cp nginx/uwsgi_params /etc/nginx/ 注意：nginx.0.8以后的版本已经内置uwsgi_params uwsgi.xml是uwsgi的配置文档，线上内容如下： &#60;uwsgi&#62; &#60;socket&#62;0.0.0.0:8000&#60;/socket&#62; &#60;listen&#62;204800&#60;/listen&#62; &#60;processes&#62;32&#60;/processes&#62; &#60;max-requests&#62;2048000&#60;/max-requests&#62; &#60;buffer-size&#62;8192&#60;/buffer-size&#62; &#60;module&#62;django_wsgi&#60;/module&#62; &#60;profiler&#62;true&#60;/profiler&#62; &#60;enable-threads&#62;true&#60;/enable-threads&#62; &#60;limit-as&#62;256&#60;/limit-as&#62; &#60;async&#62;10&#60;/async&#62; &#60;disable-logging/&#62; &#60;daemonize&#62;/home/tadu/uwsgi.log&#60;/daemonize&#62; &#60;/uwsgi&#62; 启动方式是这样的： uwsgi -x uwsgi.xml django_wsgi是用来定位你自己的配置文件，如果没有可以不用，有的话是这样用的： import os import django.core.handlers.wsgi os.environ['DJANGO_SETTINGS_MODULE'] = &#8216;配置文件名&#8217; application = django.core.handlers.wsgi.WSGIHandler() 目前在已经用于生产环境，每台800W pv，服务器整体负载不高！]]></description> <content:encoded><![CDATA[<p>uwsgi 是一个使用标准wsgi的python web server,下面是安装方法：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">wget http://projects.unbit.it/downloads/uwsgi-0.9.6.5.tar.gz<br
/> tar zvxf uwsgi-0.9.6.5.tar.gz<br
/> cd uwsgi-0.9.6.5<br
/> make -f Makefile.Py25<br
/> cp uwsgi /usr/sbin/uwsgi<br
/> cp nginx/uwsgi_params /etc/nginx/</div><p>注意：nginx.0.8以后的版本已经内置uwsgi_params</p><p>uwsgi.xml是uwsgi的配置文档，线上内容如下：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;"><div
id="_mcePaste">&lt;uwsgi&gt;</div><div
id="_mcePaste">&lt;socket&gt;0.0.0.0:8000&lt;/socket&gt;</div><div
id="_mcePaste">&lt;listen&gt;204800&lt;/listen&gt;</div><div
id="_mcePaste">&lt;processes&gt;32&lt;/processes&gt;</div><div
id="_mcePaste">&lt;max-requests&gt;2048000&lt;/max-requests&gt;</div><div
id="_mcePaste">&lt;buffer-size&gt;8192&lt;/buffer-size&gt;</div><div
id="_mcePaste">&lt;module&gt;django_wsgi&lt;/module&gt;</div><div
id="_mcePaste">&lt;profiler&gt;true&lt;/profiler&gt;</div><div
id="_mcePaste">&lt;enable-threads&gt;true&lt;/enable-threads&gt;</div><div
id="_mcePaste">&lt;limit-as&gt;256&lt;/limit-as&gt;</div><div
id="_mcePaste">&lt;async&gt;10&lt;/async&gt;</div><div
id="_mcePaste">&lt;disable-logging/&gt;</div><div
id="_mcePaste">&lt;daemonize&gt;/home/tadu/uwsgi.log&lt;/daemonize&gt;</div><div
id="_mcePaste">&lt;/uwsgi&gt;</div></div><p>启动方式是这样的：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">uwsgi -x uwsgi.xml</div><p>django_wsgi是用来定位你自己的配置文件，如果没有可以不用，有的话是这样用的：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">import os<br
/> import django.core.handlers.wsgi<br
/> os.environ['DJANGO_SETTINGS_MODULE'] = &#8216;配置文件名&#8217;<br
/> application = django.core.handlers.wsgi.WSGIHandler()</div><p>目前在已经用于生产环境，每台800W pv，服务器整体负载不高！</p> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/749.html/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>[原创]如何判断Unix/Linux load的值是否过高</title><link>http://aaronw.me/static/733.html</link> <comments>http://aaronw.me/static/733.html#comments</comments> <pubDate>Mon, 15 Nov 2010 08:13:04 +0000</pubDate> <dc:creator>Aaron.wang</dc:creator> <category><![CDATA[UNIX]]></category> <category><![CDATA[load avergae]]></category> <category><![CDATA[负载高]]></category> <guid
isPermaLink="false">http://www.aaronw.cn/?p=733</guid> <description><![CDATA[接触过和使用过unix或linux的朋友，都知道如何查看Unix/Linux load的值，这边我也重复一下查看load的方法： [root@aaronw ~]# uptime 13:33:37 up 7 days, 1:52, 1 user, load average: 4.15, 2.00, 3.14 [root@aaronw ~]# w 13:35:35 up 1 days, 1:54, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 192.168.2.2 13:33 0.00s 0.02s 0.00s w load average 后面三个值代表系统在1分钟、5分钟和15分钟的负载情况，都知道数字越高表示系统负载越大，第一直觉就是这个系统不行了。load average 是0的时候都认为他很低，10的时候就觉得高，20就不用讲了！但是除了这两种极端的情况之外，那什么时候是这两个值的临界点？当别人问起我这个问题的时候，我也不知道如何回答，在我大脑里就根本就没有考虑过。困扰了我很久，我觉得要搞明白他！ 先从linux的kernel的源码开始吧！在linux 2.6.36版本中有这样一段代码： [...]]]></description> <content:encoded><![CDATA[<p>接触过和使用过unix或linux的朋友，都知道如何查看Unix/Linux load的值，这边我也重复一下查看load的方法：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">[root@aaronw ~]# uptime<br
/> 13:33:37 up 7 days,  1:52,  1 user,  load average: 4.15, 2.00, 3.14</div><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">[root@aaronw ~]# w<br
/> 13:35:35 up 1 days,  1:54,  1 user,  load average: 0.00, 0.00, 0.00<br
/> USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT<br
/> root     pts/1    192.168.2.2    13:33    0.00s  0.02s  0.00s w</div><p>load average 后面三个值代表系统在1分钟、5分钟和15分钟的负载情况，都知道数字越高表示系统负载越大，第一直觉就是这个系统不行了。load average 是0的时候都认为他很低，10的时候就觉得高，20就不用讲了！但是除了这两种极端的情况之外，那什么时候是这两个值的临界点？当别人问起我这个问题的时候，我也不知道如何回答，在我大脑里就根本就没有考虑过。困扰了我很久，我觉得要搞明白他！</p><p>先从linux的kernel的源码开始吧！在linux 2.6.36版本中有这样一段<a
href="http://lxr.linux.no/linux+v2.6.36/arch/powerpc/platforms/cell/spufs/sched.c#L990" target="_blank">代码</a>：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/**<br
/> * spu_calc_load &#8211; update the avenrun load estimates.<br
/> *<br
/> * No locking against reading these values from userspace, as for<br
/> * the CPU loadavg code.<br
/> */<br
/> static void spu_calc_load(void)<br
/> {<br
/> unsigned long active_tasks; /* fixed-point */</p><p>active_tasks = count_active_contexts() * FIXED_1;<br
/> CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);<br
/> CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);<br
/> CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);<br
/> }</p></div><p><a
href="http://lxr.linux.no/linux+v2.6.36/include/linux/sched.h#L130" target="_blank">CALC_LOAD</a>是这样定义：</p><div
style="border: 1px dashed #000000; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">#define LOAD_FREQ       (5*HZ+1)        /* 5 sec intervals */<br
/> #define EXP_1           1884            /* 1/exp(5sec/1min) as fixed-point */<br
/> #define EXP_5           2014            /* 1/exp(5sec/5min) */<br
/> #define EXP_15          2037            /* 1/exp(5sec/15min) */#define CALC_LOAD(load,exp,n) \<br
/> load *= exp; \<br
/> load += n*(FIXED_1-exp); \<br
/> load &gt;&gt;= FSHIFT;</div><p>从这里我们能看到取负载值的最小周期5秒，根据代码中定义我们知道</p><p>什么是load？</p><p>load的就是一定时间内计算机有多少个active_tasks，也就是说是计算机的任务执行队列的长度，cpu计算的队列。</p><p>load多少是正常？</p><p>既然load是cpu计算的队列，那就应该和cpu个处理方式和cpu的个数有关系。所以我个人认为应该按系统识别的cpu个数来确定load的临界值，系统识别为8个cpu，那么load为8就是临界点，高与8就属于over load了。</p><p>什么叫系统识别cpu个数？</p><p>我是这样认为的，这里涉及到cpu物理个数和超线程技术的问题。个人认为4个物理cpu和2个双核是不能够等同的，当然这是物理层面的事了！在系统里识别的都是4个CPU.所以应该要以系统识别的为准。毕竟是系统去支配他的使用。</p><p>CPU高不等同于load高</p><p>在Unix/Linux可能经常会遇到cpu的使用率为100%，但是load却不高！这是为什么呢？因为几乎所有的任务和会和CPU进行交互，但是由于各个设备的使用频率不同，造成了不能同步进行的问题。比如说，当对硬盘进行读写的时候，出现IO的等待时候，事实上cpu已经被切换到别的进程上了。该任务就处于等待状态，当这样的任务过多，导致队列长度过大，这样就体现到负载过大了，但实际是此时cpu被分配去干执行别的任务或空闲，因此CPU高不等同于load高，load高也不能于cpu高。</p> ]]></content:encoded> <wfw:commentRss>http://aaronw.me/static/733.html/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss>
