<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_clowwindy的杂草牧场</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/46409/rss</id><updated>2011-12-28T08:12:41Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/46409/rss"/><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/12/28/charge_ipad_in_python.html</id><title type="text">用Python解决iPad在ubuntu上无法充电的问题</title><summary type="text">今天发现ipad在ubuntu上会一直显示Not Charging，搜了一下，发现有人写了一个ipad_charge程序：https://github.com/mkorenkov/ipad_charge/看了一下源码，是通过发一个控制指令实现开始和停止充电的。于是用pyusb（apt-get install python-usb）移植了一下：#!/usr/bin/pythonimport usb.coreimport usb.utilimport usb.backend.libusb10import sys, getoptopts = getopt.getopt(sys.argv[1:],&amp;#</summary><published>2011-12-28T07:57:00Z</published><updated>2011-12-28T07:57:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/12/28/charge_ipad_in_python.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/12/28/charge_ipad_in_python.html"/><content type="html">&lt;p&gt;今天发现ipad在ubuntu上会一直显示Not Charging，搜了一下，发现有人写了一个ipad_charge程序：&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/mkorenkov/ipad_charge/"&gt;https://github.com/mkorenkov/ipad_charge/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;看了一下源码，是通过发一个控制指令实现开始和停止充电的。&lt;/p&gt;&lt;p&gt;于是用pyusb（apt-get install python-usb）移植了一下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;!/usr/bin/python&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; usb.core&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; usb.util&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; usb.backend.libusb10&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; sys, getopt&lt;br /&gt;&lt;br /&gt;opts = getopt.getopt(sys.argv[1:],&lt;span style="color: #800000;"&gt;''&lt;/span&gt;,[&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;off&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;])&lt;br /&gt;off = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;off&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; opts[1]&lt;br /&gt;&lt;br /&gt;VENDOR_APPLE = 0x05ac&lt;br /&gt;PRODUCT_IPAD1 = 0x129a&lt;br /&gt;PRODUCT_IPAD2 = 0x129f&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; find our device&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;dev = usb.core.find(idVendor=VENDOR_APPLE, idProduct=PRODUCT_IPAD1)&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; dev:&lt;br /&gt;    dev = usb.core.find(idVendor=VENDOR_APPLE, idProduct=PRODUCT_IPAD2)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; dev &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; None:&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;raise&lt;/span&gt; ValueError(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Device not found&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;usb.util.claim_interface(dev, 0)&lt;br /&gt;dev.ctrl_transfer(usb.util.CTRL_TYPE_VENDOR|usb.util.CTRL_OUT, 0x40, 0x6400, 0x6400 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; off &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; 0, None, 2000)&lt;br /&gt;usb.util.release_interface(dev, 0)&lt;/div&gt;&lt;p&gt;充电：&lt;/p&gt;&lt;p&gt;python ipad_charge.py&lt;/p&gt;&lt;p&gt;停止充电：&lt;/p&gt;&lt;p&gt;python ipad_charge.py off&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2304923.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/12/28/charge_ipad_in_python.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/11/06/Reader-Sharer-Monkey.html</id><title type="text">Reader Sharer Monkey</title><summary type="text">在上次的回到旧版Google Reader外观中，解决了新版Google Reader的外观问题。这次把keakon的启用分享功能的Chrome插件Reader Sharer移植成了油猴脚本，解决了分享问题。另外显示了被Google隐藏起来的People you follow，可以展开折叠，选择查看具体用户分享的文章。脚本安装地址：旧版样式：http://userscripts.org/scripts/show/117034不修改样式：http://userscripts.org/scripts/show/117189效果：</summary><published>2011-11-06T02:34:00Z</published><updated>2011-11-06T02:34:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/11/06/Reader-Sharer-Monkey.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/11/06/Reader-Sharer-Monkey.html"/><content type="html">&lt;p&gt;在上次的&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0" href="http://www.cnblogs.com/clowwindy/archive/2011/11/02/google-reader-old-style.html"&gt;回到旧版Google Reader外观&lt;/a&gt;中，解决了新版Google Reader的外观问题。&lt;/p&gt;&lt;p&gt;这次把keakon的启用分享功能的Chrome插件&lt;a href="https://chrome.google.com/webstore/detail/gmgmcmhmodidojodfoekpbjnejlhcbpb"&gt;&lt;span class=" navi-item navi-item-last"&gt;Reader Sharer&lt;/span&gt;&lt;/a&gt;移植成了油猴脚本，解决了分享问题。&lt;/p&gt;&lt;p&gt;另外显示了被Google隐藏起来的People you follow，可以展开折叠，选择查看具体用户分享的文章。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;脚本安装地址：&lt;/p&gt;&lt;p&gt;旧版样式：&lt;/p&gt;&lt;p&gt;&lt;a href="http://userscripts.org/scripts/show/117034"&gt;http://userscripts.org/scripts/show/117034&lt;/a&gt;&lt;/p&gt;&lt;p&gt;不修改样式：&lt;/p&gt;&lt;p&gt;&lt;a href="http://userscripts.org/scripts/show/117189"&gt;http://userscripts.org/scripts/show/117189&lt;/a&gt;&lt;/p&gt;&lt;p&gt;效果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42827/2011110610280779.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2237917.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/11/06/Reader-Sharer-Monkey.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/11/02/google-reader-old-style.html</id><title type="text">回到旧版Google Reader外观</title><summary type="text">昨天Google推出了新版的Google Reader。新版修改了界面外观，和Google+整合了起来，去掉了原来的分享和Like功能。我不喜欢新版的这些改动，主要包括：我不想使用Google Plus。无法看好友分享的文章，除非到Google+上看。Google Plus像一个菜市场，Google Reader像一个图书馆，硬把它们整合在一起时不恰当的。少了Note in Reader书签脚本。我一直用这个东西收藏文章。新版界面按钮间距过大，不适合小屏幕（我现在用的笔记本分辨率是1366x768）。对比度太低，看着很吃力。我想Google的设计人员用的都是对比度较高的27寸IPS屏幕吧，没考</summary><published>2011-11-02T07:19:00Z</published><updated>2011-11-02T07:19:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/11/02/google-reader-old-style.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/11/02/google-reader-old-style.html"/><content type="html">&lt;p&gt;昨天Google推出了新版的Google Reader。新版修改了界面外观，和Google+整合了起来，去掉了原来的分享和Like功能。&lt;/p&gt;&lt;p&gt;我不喜欢新版的这些改动，主要包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;我不想使用Google Plus。&lt;/li&gt;&lt;li&gt;无法看好友分享的文章，除非到Google+上看。Google Plus像一个菜市场，Google Reader像一个图书馆，硬把它们整合在一起时不恰当的。&lt;/li&gt;&lt;li&gt;少了Note in Reader书签脚本。我一直用这个东西收藏文章。&lt;/li&gt;&lt;li&gt;新版界面按钮间距过大，不适合小屏幕（我现在用的笔记本分辨率是1366x768）。对比度太低，看着很吃力。我想Google的设计人员用的都是对比度较高的27寸IPS屏幕吧，没考虑显示效果不好的低端小屏幕。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;总之，大多数人的看法跟我一样。大家除了去&lt;a href="http://www.google.com/support/forum/p/reader/browse?hl=en"&gt;官方论坛上反馈&amp;ldquo;bug&amp;rdquo;&lt;/a&gt;之外，也纷纷自己动手解决这个问题。&lt;/p&gt;&lt;p&gt;老K做了一个找回分享功能的Chrome插件&lt;a href="https://chrome.google.com/webstore/detail/gmgmcmhmodidojodfoekpbjnejlhcbpb"&gt;&lt;span class=" navi-item navi-item-last"&gt;Reader Sharer&lt;/span&gt;&lt;/a&gt;，于是我决定做一个把界面变回原来的样子的Stylish样式。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;幸好还有一个旧版的Google Reader页面没关，在对比了许多差异之后，找出了一些不同的样式，再加上一些hack，拼凑出了这个样式表：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;@namespace url(http://www.w3.org/1999/xhtml);&lt;br /&gt;&lt;br /&gt;@-moz-document regexp("https?://www.google.com/reader/.*")   &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;br /&gt;#top-bar {&lt;br /&gt;    height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 40px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#logo &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 27px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; -13px 0 0 11px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#search &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin-left&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 157px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 9px 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#search-input &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #B2B2B2 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 3px 2px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    width&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 200px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#viewer-container &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #EBEFF9 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#viewer-top-controls-container &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin-top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; -12px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.jfk-textinput &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 17px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;#viewer-header-container &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #C2CFF1 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#viewer-header &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #C2CFF1 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 30px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-menu-button .goog-button-base-content &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 7px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-button-base,.jfk-button,.goog-inline-block,.goog-flat-menu-button &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    cursor&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; pointer !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-button-base-content &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 3px 0.461em 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    position&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; relative !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    text-align&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; center !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-button-tight .goog-button-base-content &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1em !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-button-base-inner-box &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #F9F9F9 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 20px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-button-base-outer-box &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-bottom&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #AAAAAA !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #BBBBBB !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;.goog-button-base-inner-box &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #F9F9F9 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-left&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #BBBBBB !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-right&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #AAAAAA !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 -1px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-menu-button:active .goog-button-base-outer-box, .goog-menu-button:active .goog-button-base-inner-box, .goog-combobox-active .goog-button-base-outer-box, .goog-combobox-active .goog-button-base-inner-box, .goog-menu-button.goog-button-base-open .goog-button-base-outer-box, .goog-menu-button.goog-button-base-open .goog-button-base-inner-box &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #F9F9F9 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #888888 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-button-base:hover .goog-button-base-outer-box, .goog-button-base:hover .goog-button-base-inner-box, .goog-button-base:focus .goog-button-base-outer-box, .goog-button-base:focus .goog-button-base-inner-box &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #888888 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.jfk-button-standard.jfk-button-hover, .jfk-button-standard.jfk-button-clear-outline.jfk-button-hover &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #888888 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-flat-menu-button.goog-flat-menu-button-hover &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #888888 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-menu-button:active .goog-button-base-outer-box, .goog-menu-button:active .goog-button-base-inner-box, .goog-combobox-active .goog-button-base-outer-box, .goog-combobox-active .goog-button-base-inner-box, .goog-menu-button.goog-button-base-open .goog-button-base-outer-box, .goog-menu-button.goog-button-base-open .goog-button-base-inner-box &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #777777 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #888888 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.jfk-button-standard&lt;br /&gt;&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #AAAAAA !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #F9F9F9 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.jfk-button &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 20px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 20px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-flat-menu-button &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 20px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #AAAAAA !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-flat-menu-button-dropdown &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 8px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-menu-button .goog-menu-button-dropdown &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 8px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.goog-menu-button .goog-button-base-content &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 4px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;#title-and-status-holder &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0.1ex 0 0.1ex 0.5em !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;#entries &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #C2CFF1 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list .entry .collapsed &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #FFFFFF !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 2px solid #FFFFFF !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    cursor&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; pointer !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    overflow&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; hidden !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    position&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; relative !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    width&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; auto !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;#entries.list .read .collapsed &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; none repeat scroll 0 0 #F3F5FC !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 2px solid #F3F5FC !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list .collapsed .entry-icons &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list .collapsed .entry-secondary,#entries.list .collapsed .entry-main .entry-source-title &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list .collapsed .entry-main .entry-original &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 6px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;#current-entry .entry-container .entry-title a, #current-entry .entry-container a.entry-source-title, #current-entry .entry-container .entry-body a, #current-entry .entry-container a.entry-post-author-name &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #2244BB !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list #current-entry .collapsed &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #6688EE !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list .expanded .collapsed &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-bottom-width&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list #current-entry.expanded &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #6688EE&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-style&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; solid !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-width&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0 2px !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list #current-entry.expanded .collapsed &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #6688EE -moz-use-text-color&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-left&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; medium none !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-right&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; medium none !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list #current-entry.expanded .entry-actions &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-bottom-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #6688EE !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;#entries.list .entry .entry-actions &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background-color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #EBEFF9 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    border-top&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 1px solid #C2CFF1 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #333333 !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;.entry .entry-actions a, .entry .entry-actions .link &lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    color&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; #2244BB !important&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;使用方法和源码放在&lt;a href="https://github.com/clowwindy/google-reader-old-style"&gt;Github&lt;/a&gt;上了。&lt;/p&gt;&lt;p&gt;效果图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42827/2011110215123119.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;使用前：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42827/2011110215121323.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Userscript地址：&lt;/p&gt;&lt;p&gt;&lt;a href="http://userstyles.org/styles/55628/old-styled-google-reader?r=1320216007"&gt;http://userstyles.org/styles/55628/old-styled-google-reader?r=1320216007&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2233107.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/11/02/google-reader-old-style.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/10/31/target-killer.html</id><title type="text">推荐一个Firefox扩展：TargetKiller</title><summary type="text">有很多网站会在链接上加上target=_blank，迫使链接在新窗口中打开，比如新蛋网。这样做的目的是为了让用户开尽可能多的标签页，延长用户的停留时间。对于我这种不喜欢开太多标签页的人来说，这一做法很讨厌。今天见到了一个Firefox扩展：TargetKiller，可以把链接的target干掉。它可以设置移出哪些target（默认是_blank和_new），也可以用正则表达式匹配，不过感觉意义不大。不过这一插件对window.open就无力了。</summary><published>2011-10-31T08:14:00Z</published><updated>2011-10-31T08:14:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/10/31/target-killer.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/10/31/target-killer.html"/><content type="html">&lt;p&gt;有很多网站会在链接上加上target=_blank，迫使链接在新窗口中打开，比如新蛋网。这样做的目的是为了让用户开尽可能多的标签页，延长用户的停留时间。&lt;/p&gt;&lt;p&gt;对于我这种不喜欢开太多标签页的人来说，这一做法很讨厌。今天见到了一个Firefox扩展：&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/targetkiller/"&gt;TargetKiller&lt;/a&gt;，可以把链接的target干掉。它可以设置移出哪些target（默认是_blank和_new），也可以用正则表达式匹配，不过感觉意义不大。不过这一插件对window.open就无力了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/42827/2011103116121520.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2230396.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/10/31/target-killer.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/10/31/2230363.html</id><title type="text">py2exe使用相对路径的当前目录问题</title><summary type="text">今天在用py2exe的时候，发现如果把exe设为随windows自动启动，无法用相对路径加载资源文件。研究了一下之后发现，自启动的程序的当前目录在c:/users/username下，而双击exe运行时当前目录在exe所在目录。查了一下py2exe文档，提到了获取exe路径的办法。所以，我们只需要在第一行代码执行前，cd到exe所在目录，就能保证相对路径没有问题了：os.chdir(os.path.dirname(sys.executable))</summary><published>2011-10-31T07:55:00Z</published><updated>2011-10-31T07:55:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/10/31/2230363.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/10/31/2230363.html"/><content type="html">&lt;p&gt;今天在用py2exe的时候，发现如果把exe设为随windows自动启动，无法用相对路径加载资源文件。&lt;/p&gt;&lt;p&gt;研究了一下之后发现，自启动的程序的当前目录在c:/users/username下，而双击exe运行时当前目录在exe所在目录。&lt;/p&gt;&lt;p&gt;查了一下py2exe文档，提到了&lt;a href="http://www.py2exe.org/index.cgi/WhereAmI"&gt;获取exe路径的办法&lt;/a&gt;。所以，我们只需要在第一行代码执行前，cd到exe所在目录，就能保证相对路径没有问题了：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;os.chdir(os.path.dirname(sys.executable))&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2230363.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/10/31/2230363.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/10/26/2225514.html</id><title type="text">博客园代码缩进失效的问题</title><summary type="text">今天发现博客里的老文章代码缩进全部失效了，所有的代码左边都没有空格。研究了一下发现代码块的源码里没有&lt;pre&gt;标签，全是&lt;div&gt;和&lt;span&gt;。回想起以前有一次在后台调整了很多文章的tag，可能点保存的时候，HTML在线编辑器做了什么多余的事情吧。考虑到把老文章全部改一遍比较麻烦，就打算全局修改一下。首先想到了white-space:pre，可惜会导致Firefox复制不出空格，而IE完全不起作用。接下来就是用js了，在每个没有&lt;pre&gt;子节点的代码块最外层&lt;div&gt;下面插一个&lt;pre&gt;标签：$(".cnblo</summary><published>2011-10-26T09:53:00Z</published><updated>2011-10-26T09:53:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/10/26/2225514.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/10/26/2225514.html"/><content type="html">&lt;p&gt;今天发现博客里的老文章代码缩进全部失效了，所有的代码左边都没有空格。研究了一下发现代码块的源码里没有&amp;lt;pre&amp;gt;标签，全是&amp;lt;div&amp;gt;和&amp;lt;span&amp;gt;。回想起以前有一次在后台调整了很多文章的tag，可能点保存的时候，HTML在线编辑器做了什么多余的事情吧。&lt;/p&gt;&lt;p&gt;考虑到把老文章全部改一遍比较麻烦，就打算全局修改一下。首先想到了white-space:pre，可惜会导致Firefox复制不出空格，而IE完全不起作用。接下来就是用js了，在每个没有&amp;lt;pre&amp;gt;子节点的代码块最外层&amp;lt;div&amp;gt;下面插一个&amp;lt;pre&amp;gt;标签：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;$(".cnblogs_code").each(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;($(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;).find("pre").length==0){&lt;br /&gt;        $(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;).wrapInner('&amp;lt;pre/&amp;gt;');&lt;br /&gt;    }&lt;br /&gt;});&lt;/div&gt;&lt;p&gt;&lt;br /&gt;全局挂上这个脚本，再重新打开老文章，总算恢复正常了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2225514.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/10/26/2225514.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/10/26/compile-python-path.html</id><title type="text">对整个目录编译py生成pyc</title><summary type="text">这几天在做项目打包的时候，因为要保护知识产权，所以将py文件编译成pyc文件再打包。于是研究了一下，编译的方法很简单，用compileall.compile_dir()函数就可以了。首先，将项目拷贝到一个目录（过滤掉.开头的隐藏文件），然后编译，最后删除.py文件。这里有一个问题，就是原来的源码目录下可能已经有pyc了，所以在编译的时候要指定force=1强制编译一下，覆盖掉这些文件。下面是打包脚本：BUILD_PATH = 'build/'PROJECT_PATH = 'src/'import osimport os.pathimport shutilimpo</summary><published>2011-10-26T08:54:00Z</published><updated>2011-10-26T08:54:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/10/26/compile-python-path.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/10/26/compile-python-path.html"/><content type="html">&lt;p&gt;这几天在做项目打包的时候，因为要保护知识产权，所以将py文件编译成pyc文件再打包。&lt;/p&gt;&lt;p&gt;于是研究了一下，编译的方法很简单，用compileall.compile_dir()函数就可以了。&lt;/p&gt;&lt;p&gt;首先，将项目拷贝到一个目录（过滤掉.开头的隐藏文件），然后编译，最后删除.py文件。这里有一个问题，就是原来的源码目录下可能已经有pyc了，所以在编译的时候要指定force=1强制编译一下，覆盖掉这些文件。&lt;/p&gt;&lt;p&gt;下面是打包脚本：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;BUILD_PATH = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;build/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;br /&gt;PROJECT_PATH = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;src/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; os&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; os.path&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; shutil&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; re&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; copy project files&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;copying project files&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; ignore(src,files):&lt;br /&gt;    results = []&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; f &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; files:&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; re.match(r&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\..*&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,f):&lt;br /&gt;            results.append(f)&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; results&lt;br /&gt;&lt;br /&gt;src = PROJECT_PATH&lt;br /&gt;dst = BUILD_PATH&lt;br /&gt;dst_dir = os.path.dirname(dst)&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; os.path.isdir(BUILD_PATH):&lt;br /&gt;    shutil.rmtree(BUILD_PATH)&lt;br /&gt;os.makedirs(BUILD_PATH)&lt;br /&gt;shutil.copytree(src, dst,ignore=ignore)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; compile python source&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;compiling python source&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; compileall&lt;br /&gt;&lt;br /&gt;compileall.compile_dir(BUILD_PATH,quiet=0,force=1)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; fs &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; os.walk(BUILD_PATH):&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; f &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; fs[2]:&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; re.match(r&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.*\.py$&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,f):&lt;br /&gt;            f_f = fs[0]+&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;+f&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;removing &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;+f_f&lt;br /&gt;            os.remove(f_f)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;done&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2225418.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/10/26/compile-python-path.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/10/14/qt_webkit_box_shadow.html</id><title type="text">Qt WebKit的阴影不支持模糊的解决办法</title><summary type="text">在普通的WebKit浏览器上，可以用CSS3轻松的加一个柔和的阴影效果：box-shadow: 3px 3px 3px rgba(0,0,0,0.5);不过在目前版本的Qt Webkit上，由于不支持阴影的模糊算法，阴影会显示的很生硬。由于项目用到QtWeb，不可变更，只能想一个变通的办法。最后想到因为阴影可以加多个，所以我们可以加若干个偏移不同的阴影叠加起来，使它看起来是模糊的：-webkit-box-shadow: 5px 5px 3px rgba(0,0,0,0.1), 4px 4px 3px rgba(0,0,0,0.1), 3px 3px 3px rgba(0,0,0,0.1), 2</summary><published>2011-10-14T07:15:00Z</published><updated>2011-10-14T07:15:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/10/14/qt_webkit_box_shadow.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/10/14/qt_webkit_box_shadow.html"/><content type="html">&lt;p&gt;在普通的WebKit浏览器上，可以用CSS3轻松的加一个柔和的阴影效果：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;box-shadow: 3px 3px 3px rgba(0,0,0,0.5);&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;不过在目前版本的Qt Webkit上，由于不支持阴影的模糊算法，阴影会显示的很生硬。由于项目用到QtWeb，不可变更，只能想一个变通的办法。&lt;/p&gt;&lt;p&gt;最后想到因为阴影可以加多个，所以我们可以加若干个偏移不同的阴影叠加起来，使它看起来是模糊的：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;-webkit-box-shadow: 5px 5px 3px rgba(0,0,0,0.1), 4px 4px 3px rgba(0,0,0,0.1), 3px 3px 3px rgba(0,0,0,0.1), 2px 2px 3px rgba(0,0,0,0.1), 1px 1px 3px rgba(0,0,0,0.1);&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;那么内发光的效果怎么做呢？来一圈就可以了：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;    -webkit-box-shadow:inset -1px 0 4px 0 rgba(68,148,238,0.2),inset 0 -1px 4px 0 rgba(68,148,238,0.2),inset 1px 0 4px 0 rgba(68,148,238,0.2),0 1px 4px 0 rgba(68,148,238,0.2),inset 0 0 4px 0 rgba(68,148,238,0.2),inset -2px 0 4px 0 rgba(68,148,238,0.2),inset 0 -2px 4px 0 rgba(68,148,238,0.2),inset 2px 0 4px 0 rgba(68,148,238,0.2),inset 0 2px 4px 0 rgba(68,148,238,0.2);&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2212259.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/10/14/qt_webkit_box_shadow.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/09/27/MySQL-convert-from-MyISAM-to-InnoDB.html</id><title type="text">MySQL快速从MyISAM迁移到InnoDB</title><summary type="text">mysql -u [USER_NAME] -p -e "select TABLE_NAME from information_schema.tables where table_schema='DATABASE_NAME' and engine='MyISAM';" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;" &gt; alter_table.sqlperl -p -i -e 's/(search_[a-z_]+</summary><published>2011-09-27T01:46:00Z</published><updated>2011-09-27T01:46:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/09/27/MySQL-convert-from-MyISAM-to-InnoDB.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/09/27/MySQL-convert-from-MyISAM-to-InnoDB.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;mysql -u [USER_NAME] -p -e &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select TABLE_NAME from information_schema.tables where table_schema='DATABASE_NAME' and engine='MyISAM';&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; | tail -n +&lt;span style="color: #800080;"&gt;2&lt;/span&gt; | xargs -I &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;{}&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; echo &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ALTER TABLE {} ENGINE=INNODB;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &amp;gt; alter_table.sql&lt;br /&gt;perl -p -i -e &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;s/(search_[a-z_]+ ENGINE=)INNODB/\1MYISAM/g&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; alter_table.sql&lt;br /&gt;mysql -u [USER_NAME] -p [DATABASE_NAME] &amp;lt; alter_table.sql&lt;/div&gt;&lt;p&gt;修改自：&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://highervisibilitywebsites.com/convert-your-mysql-database-myisam-innodb-and-get-ready-drupal-7-same-time"&gt;http://highervisibilitywebsites.com/convert-your-mysql-database-myisam-innodb-and-get-ready-drupal-7-same-time&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2192789.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/09/27/MySQL-convert-from-MyISAM-to-InnoDB.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/clowwindy/archive/2011/09/25/install_memcached.html</id><title type="text">memcached, phpmemcache的编译、安装和Hello world</title><summary type="text">因为项目要用到Memcache，就研究了一下，然后记个流水帐。Memcached是一个开源的分布式内存对象缓存系统。虽然从本质上看用途很宽泛，但它的主要设计目的是通过减轻数据库负载来加速动态网站。它本身作为单独的进程运行，通过TCP和需要存取数据的其它进程（如php、python）通信。以Debian为例，它的安装非常简单：先装上libevent-dev包，然后解压源码，编译安装即可。./configuremake &amp;&amp; make installPHP有两个模块：Memcache和Memcached。他们都是PHP的memcached客户端库，只不过Memcached提供了更多</summary><published>2011-09-25T12:01:00Z</published><updated>2011-09-25T12:01:00Z</updated><author><name>clowwindy</name><uri>http://www.cnblogs.com/clowwindy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/clowwindy/archive/2011/09/25/install_memcached.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/clowwindy/archive/2011/09/25/install_memcached.html"/><content type="html">&lt;p&gt;因为项目要用到Memcache，就研究了一下，然后记个流水帐。&lt;/p&gt;&lt;p&gt;&lt;a href="http://memcached.org/"&gt;Memcached&lt;/a&gt;是一个开源的分布式内存对象缓存系统。虽然从本质上看用途很宽泛，但它的主要设计目的是通过减轻数据库负载来加速动态网站。它本身作为单独的进程运行，通过TCP和需要存取数据的其它进程（如php、python）通信。&lt;/p&gt;&lt;p&gt;以Debian为例，它的安装非常简单：&lt;/p&gt;&lt;p&gt;先装上libevent-dev包，然后解压&lt;a href="http://memcached.googlecode.com/files/memcached-1.4.7.tar.gz"&gt;源码&lt;/a&gt;，编译安装即可。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;./configure&lt;br /&gt;make &amp;amp;&amp;amp; make install&lt;/div&gt;&lt;p&gt;&lt;br /&gt;PHP有两个模块：Memcache和Memcached。他们都是PHP的memcached客户端库，只不过Memcached提供了更多功能。就先看第一个。&lt;/p&gt;&lt;p&gt;首先下载它的&lt;a href="http://pecl.php.net/get/memcache"&gt;源代码&lt;/a&gt;，解压。确保安装了php5-dev，然后在解压后的目录里执行：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;phpize&lt;br /&gt;./configure&lt;br /&gt;make &amp;amp;&amp;amp; make install&lt;/div&gt;&lt;p&gt;&lt;br /&gt;然后再/etc/php/conf.d/里加一个memcache.ini文件，内容就一句extension=memcache.so就可以了。然后重启apache或者挂了php-cgi的进程。&lt;br /&gt;然后启动之前编译的Memcached:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;memcached -u www-data -d&lt;/div&gt;&lt;p&gt;-u是指定memcached的用户，-d是让它作为daemon。&lt;br /&gt;接下来就可以写Hello world了：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;!doctype html&amp;gt;&lt;br /&gt;&amp;lt;meta charset=utf8 /&amp;gt;&lt;br /&gt;result:&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;span style="color: #800080;"&gt;$memcache&lt;/span&gt; = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Memcache();&lt;br /&gt;&lt;span style="color: #800080;"&gt;$memcache&lt;/span&gt;-&amp;gt;connect("127.0.0.1", 11211);&lt;br /&gt;&lt;span style="color: #800080;"&gt;$data&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$memcache&lt;/span&gt;-&amp;gt;get("data");&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;echo $data;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #800080;"&gt;$data&lt;/span&gt; === &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt; || &lt;span style="color: #800080;"&gt;$_GET&lt;/span&gt;["force"]){&lt;br /&gt;  &lt;span style="color: #800080;"&gt;$data&lt;/span&gt; = &lt;span style="color: #800080;"&gt;$_GET&lt;/span&gt;['data'];&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #800080;"&gt;$memcache&lt;/span&gt;-&amp;gt;set("data", &lt;span style="color: #800080;"&gt;$data&lt;/span&gt;, MEMCACHE_COMPRESSED, 10);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;echo&lt;/span&gt; &lt;span style="color: #800080;"&gt;$data&lt;/span&gt;;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;form action="" method="GET"&amp;gt;&lt;br /&gt;&amp;lt;input name="force" type="checkbox" /&amp;gt;Force update &lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;input name="data" /&amp;gt;&lt;br /&gt;&amp;lt;input type=submit /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/div&gt;&lt;p&gt;这里将一个填入文本框的data字符串显示出来，并存入Memcached中，过期时间设为10秒钟。如果Memcached中保存了这个字符串，就将它取出来，否则把用户新输入的字符串存进去。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后测了下性能：&lt;/p&gt;&lt;p&gt;单侧php的性能，php内容为上面的代码把memcache相关内容移除，另外echo换成echo "hello"：&lt;/p&gt;&lt;p&gt;2713.06 [#/sec]&lt;/p&gt;&lt;p&gt;然后测Memcached的get（上面的hello world不加参数）：&lt;/p&gt;&lt;p&gt;1769.21 [#/sec]&lt;/p&gt;&lt;p&gt;Memcached进行get和set（上面的hello world加force=on&amp;amp;data=asdfkjasldfasd980fuwe）：&lt;/p&gt;&lt;p&gt;1751.05 [#/sec]&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;可以看出Memcache因为要建立TCP连接，还是损失了不小的性能，慢在connect。如非缓存确实比读取数据库、处理要省很多时间，否则不应随意使用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/clowwindy/aggbug/2190423.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/clowwindy/archive/2011/09/25/install_memcached.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
