<?xml version="1.0" encoding="GB2312"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en"> 
<title><![CDATA[apoo]]></title>
<link rel="alternate" type="text/html" href="http://apoo.bokee.com/index.html" /> 
<modified>2012-02-20T00:44:05Z</modified> 
<tagline type="text/html" mode="escaped"><![CDATA[<div align="center"><iframe src="inc/blogtop.htm" name="topframe" border="0" frameborder="0" height="85" width="295" scrolling="no"></iframe></div>]]></tagline> 
<generator url="http://www.blogdriver.com/" version="2.0">BlogDriver</generator> 
<copyright>Copyright (c) 2004, APOO</copyright> 

<entry> 
<title><![CDATA[信使类软件那么多，702T能用的没几个]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7031008.html" />  
<issued>2012-02-20T00:44:02Z</issued> 
<created>2012-02-20T00:44:02Z</created> 
<modified>2012-02-20T00:44:02Z</modified>
<id>tag:apoo.blogchina.com,2012://7031008</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>感想和评论</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
<span class="bold"></span>现在兴起了一种通过网络发送信息，从而节省短信费用的软
件，那就是信使类软件。通常信使类软件可以把普通短信、彩信和自己的网络信息混合在同一个界面里，自动根据在线情况选择发送方式。当然，这种软件只有真正
的智能手机才有，比如Symbian和Android。iOS和WP7是没有的——它们没开放信息API，所以软件只能处理自己的网络信息，不能和普通短
信、彩信混合在一起。（iOS还有一个原因——它有自己的iMessage是这个信使功能。为了搞死第三方，嘿嘿。iOS上实用的软件基本没有，都是些游
戏啊美化图片啊之类的玩具，也是因为API开放太少）<br /><div id="message194724817" class="t_msgfont">
<br />
最初是在用S60v3的时候由于“来电通”内存占用太大，不得不找一款替代品，所以发现了“友录通讯录”。一用就被它准确的查找和超低的内存占用吸引了。
同时，发现它有一个“友录信使”功能，这是我头一次在手机上用到此类产品。之后升级了702T，也顺理成章装了“友录通讯录”。上周突然发现其实还有很多
很多竞争者，例如企鹅的“QQ通讯录”里有Q信功能，还有盛大的“有你短信”和北京个信的“个信”等。<br />
<br />
“QQ通讯录”的特点是和QQ的通讯录整合，如果你从来没用过手机，可以从电脑上的“QQ通讯录”里导入数据。“QQ通讯录”和“友录通讯录”还都有电脑
端管理同步到服务器的联系人的功能。“有你短信”提供节日祝福短信和模板。“个信”则具有恐怖的全平台客户端，以及从电脑端直接操纵手机客户端发送短信的
功能（“个信”在iPhone上分越狱版和普通版）。我还在Android上测试了“有你短信”，发现它在自己界面收发信息的时候，同时还会把信息的简化
版放到手机本身的收发信息箱里。虽然说不上为什么但是我挺喜欢这个设计。“个信”就没有这个功能。“友录通讯录”(Android)比较奇葩，如果你给一
个人发了信息，那么你会在手机本身的信息功能里看到这个对话。但是，打开对话，里面是空的。<br />
<br />
不过，本帖我真正想说的是，这几个软件里，只有“友录通讯录”能正常运行在702T上。之前我只用过这一个，一直没觉得它难能可贵。知道我试了“QQ通讯录”、“有你短信”和“个信”发现他们全都在702T上表现得一塌糊涂的时候，才深深体会到了“友录”用心细致的地方。向大家推荐一下，确实在702T上
能正常运行的软件不多，大家不妨给这个新生的小创业团体一点鼓励，用一用他们的产品。“友录通讯录”可以备份/恢复电话本、短信，也可以混合普通短信和友
录信息（当然，iPhone版不支持备份/恢复短信，也不支持混合信息），而且还可以多个电话号码进行捆绑，共用一份通讯录信息、一份日历信息，满足用户
在不同手机之间同步的需求（当然友录信使的历史记录、短信的备份还是按号码分开的）。虽然网页端友录信使没有“个信”那么逆天能操纵手机，但是给其它在线
的友信用户发友信还是可以的。再考虑到友录通讯录一直在拨号盘预测的准确度上超高，总体来讲，还是一个非常值得推荐的装机必备软件。<br />
<br />
最后，插入一个编外选手——微信。这个软件只能发送网络信息，不能和手机短信混合。也不是用手机号识别用户，而是用微信号。严格来说，这是和QQ一样的一
个即时通讯软件，而非手机信使软件。但是它属于难得在702T上能界面正常的软件之一，所以顺道推荐一下这款中国最强的ONS 
Seeker。（BTW：貌似这款产品很多东西就是为了便利ONS设计的——摇一摇、查看附近的人、漂流瓶……所以我觉得这软件一点都不上流，我自己是不
用的，嗯）</div>


]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[Windows的两个buggy API函数]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7030325.html" />  
<issued>2012-02-11T03:37:58Z</issued> 
<created>2012-02-11T03:37:58Z</created> 
<modified>2012-02-11T03:37:58Z</modified>
<id>tag:apoo.blogchina.com,2012://7030325</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>经验和资料</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
<p>I was looking for APIs that could get &amp;quot;Language for Non-Unicode 
programs&amp;quot; setting of Regional and Language Settings of Control Panel, 
when I found these these two API functions. However, they behave quite 
buggy. I wonder if the developers of Windows had ever noticed this, or 
maybe they had noticed, but were too late to change it.</p>
<p>But hey, it is never too late to refine your documents, right? The 
explanations are still very simple and vague. It looks that the one who 
wrote the documents just assumed that the functions should work as their
 names. Unfortunately, they do not.</p>
<p>Anyway, let's review these two buggy API functions.</p>
<p>1. GetUserDefaultLangID()</p>
<p>At first glance, I thought it would return the &amp;quot;Language for 
Non-Unicode programs&amp;quot; setting for the current user. The document at <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd318134%28v=vs.85%29.aspx">http://msdn.microsoft.com/en-us/library/windows/desktop/dd318134(v=vs.85).aspx</a>
 also says that it &amp;quot;returns the language identifier for the current user
 locale&amp;quot;. I think it is not that easy to write so ambiguous a document 
as there is obviously not enough details for &amp;quot;current user locale&amp;quot;. So I
 have to try it out by myself.</p>
<p>However, what this function actually returns is the Format settings 
(date, time, currency, etc.) of current user in Regional and Language 
Options in Control Panel. Anyone could try it out without any 
difficulty, since changing the format settings does not require a system
 restart. At first, when I saw that the return value is, as expected, 
&amp;quot;Chinese (PRC)&amp;quot;, I thought it works. But when later I changed my 
&amp;quot;Language for Non-Unicode programs&amp;quot; setting to Japanese, I found it 
remained unchanged. On the other hand, GetSystemDefaultLangID() returned
 &amp;quot;Japanese&amp;quot; to my surprise!</p>
<p>To make sure what the function actually returns, I looked for any 
possible items that are currently &amp;quot;Chinese (PRC)&amp;quot; in Control Panel and 
the first thing I found was &amp;quot;Format Setting&amp;quot;. I changed it to &amp;quot;Italian 
(Switzerland)&amp;quot; and the return value of GetUserDefaultLangID() changed 
accordingly. Now I am very sure about what the function actually 
returns.</p>
<p>I hope Microsoft could change their document of 
GetUserDefaultLangID() and tell the programmers that it &amp;quot;returns the 
format setting of date, time, currency and etc. of current user&amp;quot;, which has nothing to do with &amp;quot;default&amp;quot;.<br /></p>
<p>2. GetSystemDefaultLangID()</p>
<p>As I mentioned above, the function GetSystemDefaultLangID() returns 
what I expected, the&amp;quot;Language for Non-Unicode programs&amp;quot; setting. 
However, its document is also written as bad as the former function. The
 document at <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd318120%28v=vs.85%29.aspx">http://msdn.microsoft.com/en-us/library/windows/desktop/dd318120(v=vs.85).aspx</a> says that it &amp;quot;returns the language identifier for the system locale&amp;quot;. As meaningless as ever.</p><p>Actually
 it returns the&amp;quot;Language for Non-Unicode programs&amp;quot; setting for the 
current user. There seems to be no simple way getting the &amp;quot;Language for 
Non-Unicode programs&amp;quot; for the default user, which I thought what System 
means. Probably reading registry is a possible way to solve the problem,
 but I think I could stop here. After all, I found that the setting of 
the default user is not that useful for me.</p><p>Same as above, I hope 
Microsoft could change their document of GetSystemDefaultLangID()  and 
tell the programmers that it &amp;quot;returns the language setting for 
non-Unicode programs of current user&amp;quot;, which has nothing to do with &amp;quot;system&amp;quot;.</p>


]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[Python的控制台输出语句print的一个bug]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7028948.html" />  
<issued>2012-01-19T11:52:44Z</issued> 
<created>2012-01-19T11:52:44Z</created> 
<modified>2012-01-19T11:52:44Z</modified>
<id>tag:apoo.blogchina.com,2012://7028948</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>经验和资料</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
<p>Python 的 print 语句有一个很奇怪的 bug。它的功能是向控制台输出字符，这本身不是问题。但是 Python 内部是支持 
Unicode 字符串的，而 Unicode 字符串在用 print 输出时 print 要进行一次从 Unicode 到 ANSI/MBCS 
编码的编码，编码后才会以 8-bit 流输出结果。</p><p>编码就编码吧，这也是很正常的。对于控制台程序来说，输出可能被重定向到文本文件。如
果不指定编码，重定向时就不知道以何种 8-bit 字节流写入文本文件，所以，输出到控制台的东西理论上也应该是经过编码的 8-bit 
流。综上所述，确实有必要进行一次 WCHAR 到 char 的转码。</p><p>但是问题在于，Python 的 print 
语句在转码时，居然用的是 strict 规则。即，待输出字符串若含有当前代码页之外的字符，就会在转码过程中出现不可转码的文字，从而抛出 
exception。print 语句又不处理这个 exception，导致一个平平常常 print 语句竟然会引起 Python 
程序的异常！这简直是不可思议。</p><hr style="width: 100%; height: 2px;" /><p>比如说你写了这么一段代码：</p><p>a = u'测试啊'<br />print a</p><p>然后把控制台切到某个不包含这些汉字的编码页例如 437，输入chcp 
437。然后再运行这段程序，就会看到异常。实际上直接输出到控制台的是另外一种 UnicodeEncodeError 异常，因为控制台设置了代码
页，Python 会试图转码到那个代码页。而更典型的（使开发者发现问题的）异常通常是把输出重定向到文件时，看到的下面这个更典型的异常：</p><p>UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0-2: ordinal not in range(128)</p><p>注意，控制台直接输出有异常，重定向输出也会有异常。这两种异常在系统内部具体过程不同，但原理都是一样的。就是 python 遇到了它认为不能把 
Unicode 字符编码成 8-bit 流的情况。区别在于，输出到控制台时，python 会试图按照控制台设置的代码页去编码，而重定向时干脆就按
ASCII 
编码，那自然是只有128以内的字符才能显示出来。由此可以看出，输出到控制台时产生的异常更隐蔽，因为绝大部分程序员都是在一种编码下编码+
开发的，很少有考虑到这方面的情况。在一种编码下开发，写进代码的字符串，以及从文本读出来的字符串，通常也能在这个编码下在控制台输出，从而把问题的发
现推迟到了用户（使用了不同代码页）阶段，或是推迟到了重定向输出的时候（因为重定向默认用 ASCII 编码，字符集最小）。知道了原因，会觉得错误可以理解。<br /></p><p>说句题外话，令我最不能理解的是，一个好好的 print 语句，输出字符串也不是 zero-terminated，不存在烫烫烫烫过了越到不可访问内存崩溃了的结果，竟然会导致程序异常！首先别跟我说让程序员去控制print 
里字符串的内容，这有的时候程序根本控制不了。比如，读出一个文件并显示内容的时候。也别跟我说去 try-except，连 print 
都失败了你叫程序员情何以堪啊？看来只能想想办法自己解决这个问题了。</p><p>首先要说明的是，既然事关控制台，要做
8-bit 流的输入输出，就没有完美的解决方案。我个人的建议是，在Windows下，一切字符串操作，都应该尽可能使用 WCHAR 
及相关函数。遇到需要
跨平台和网络传输的情况，再使用UTC-8编码的char字符串。在与古老的 ANSI/MBCS 程序交互时，在严格限制的情况下使用该种编码的 
char 字符串。尽管并没有完美的解决方案，在实际情况中，Windows 下 Python 程序也许应该可以有更好的表现。<br /></p><hr style="width: 100%; height: 2px;" /><p>解决方案一、最简单解决重定向异常的方法是：</p><p>import sys<br />reload(sys)<br />sys.setdefaultencoding(&amp;quot;utf-8&amp;quot;)</p><p>然后再输出就可以了。直接调sys.setdefaultencoding()这个函数是不行的，必须要reload一次。具体原因可以参见<a href="http://docs.python.org/library/sys.html">http://docs.python.org/library/sys.html</a>，我就没有深入研究了。</p>
<p>这个不会影响控制台直接输出，只会影响重定向，所以最好是写 utf-8 反正连 Windows 的记事本都可以打开 UTF-8 
的文本。当然这么做也有不足，就是如果某一个程序，调用了你写的 Python 
程序，把输出重定向到它的窗口里，这时这个程序很可能是按系统默认编码去解码的，用户就看到一片乱码了。这个没什么好办法，要么外围程序做好点可以设置控
制台解码，要么你就只能获取一下当前控制台编码设置（不知道 Python 里有没有好方法，我可以用 Windows API 
做到），当然这样的话就无法防止异常了……<br /></p>
<hr style="width: 100%; height: 2px;" /><p>解决方案二、用 print a.encode(&amp;quot;gbk&amp;quot;, &amp;quot;replace&amp;quot;) 取代 print a：</p><p>对控制台来说，由于输出的是字节流，所以具体显示成什么字符，取决于控制台的代码页设置。输出重定向也是一样，取决于你打开文件的方式。如果打开文件发现乱码了，那你要说：一定是我打开的方式不对！<br /></p><p>这个方案好处在于可以让程序完全像使用了 Windows ANSI 函数的程序那样工作。输入、输出全都是按某个特定编码来做的，仿佛程序内部固化的字符串就是按某个特定编码写的。不过，程序里有几千个 print 就得换几千次就不说了，万一你换漏了，又要出悲剧。</p><p>当
然，既然完全像一个 Windows ANSI 程序的行为，那么不可避免的问题就是乱码。假设你所有字符串都按 GBK 
在输入输出时编码了，那如果用户设置的控制台代码页根本就不是 GBK 呢？又乱码了不是……而且既然我输入输出都是 GBK，干嘛程序内部还要用 
Unicode 呢？大概就只是为了防止内部处理时即出现异常吧。<br /></p><p>最关键的是这实在不是一个程序员的作风。就没有自动化一点的方案吗？</p><hr style="width: 100%; height: 2px;" /><p>解决方案三、更改 sys.stdout 的编码：</p><p>既然问题出在 sys.stdout 的编码往往不能满足字符集需求上，为什么不直接更改它的编码呢？<a href="http://www.doughellmann.com/PyMOTW/codecs/">http://www.doughellmann.com/PyMOTW/codecs/</a> 提供了一种方案：</p><p>import sys, codecs<br />sys.stdout = codecs.getwriter('utf-8')(sys.stdout)</p><p>这
个方案的好处就是它同时影响控制台直接输出和重定向输出，比方案一强，已经达到了方案二的水平。不过它面临一个方案二没有而方案一还有的问题，就是如果设
置的不是 &amp;quot;utf-8&amp;quot;，那么就有可能出 UnicodeEncodeError。如果设置的是 &amp;quot;utf-8&amp;quot;，那就要面临配套设施不完善而看到的乱码问题。<br /></p><p>最要命的是，其实你是根本无法在控制台设置成 cp65001 的情况下让程序正常运行的！这是方案二也会同样遇到的问题。假设我们设置了 utf-8，要想在控制台正常阅读输出结果，那也就要把控制台用 chcp 
65001 设置成 UTF-8。但是，设置之后，python 会以为当前代码页叫 &amp;quot;cp65001&amp;quot;，不认，会出这个错误：</p><p>LookupError: unknown encoding: cp65001</p><p>呃，好吧，这也是有办法可以解决的，出自 <a href="http://stackoverflow.com/questions/878972/windows-cmd-encoding-change-causes-python-crash">http://stackoverflow.com/questions/878972/windows-cmd-encoding-change-causes-python-crash</a>：</p><p>import codecs<br />codecs.register(lambda name: name == 'cp65001' and codecs.lookup('utf-8') or None)</p><p>这样 Python 就认 &amp;quot;cp65001&amp;quot; 这个东西就是 &amp;quot;utf-8&amp;quot; 的别名了。这样，你就可以在控制台 chcp 
65001 然后看到输出字符了。不过遗憾的是，这只是理论上的。实际上如果你 print 
a 的时候第一个字符不是纯 ASCII 的，即 Unicode 码在 128 以上，根本无法正常显示。我们不妨把前面学到的知识都拼起来，写一段代码，期望它能正常工作吧：</p><p>#coding=utf-8<br />a = u'测试啊'<br /><br />import sys<br />reload(sys)<br />sys.setdefaultencoding(&amp;quot;utf-8&amp;quot;)<br /><br />import codecs<br />codecs.register(lambda name: name == 'cp65001' and codecs.lookup('utf-8') or None)<br /><br />print a.encode(&amp;quot;utf-8&amp;quot;, &amp;quot;replace&amp;quot;)</p><p>实际上运行结果是：</p><p>???试啊Traceback (most recent call last):<br />&amp;#160; File &amp;quot;C:\Python25\Test1.py&amp;quot;, line 11, in <br />&amp;#160;&amp;#160;&amp;#160; print a.encode(&amp;quot;utf-8&amp;quot;, &amp;quot;replace&amp;quot;)<br />IOError: [Errno 2] No such file or directory<br /></p><p>这
莫名其妙的 IOError 是怎么回事？而且字符串第一个字符也无法正常显示，会变成若干个“?”。该字符在 UTF-8 
中是几个字节，就有几个“?”字符。我&amp;#8482;想破了脑袋也想不出 Python 是怎么写出这样的 bug 来的！注意，不是说第一个字符是纯 ASCII
 就可以了，只是那样做的话输出来的异常信息是可以看，但是异常还是有的。如果是用 sys.stdout = codecs.getwriter() 
法直接 print a 的话，出现的错误是：</p><p>???试啊Traceback (most recent call last):<br />&amp;#160; File &amp;quot;C:\Python25\Test1.py&amp;quot;, line 13, in <br />&amp;#160;&amp;#160;&amp;#160; print a<br />&amp;#160; File &amp;quot;C:\Python25\lib\codecs.py&amp;quot;, line 304, in write<br />&amp;#160;&amp;#160;&amp;#160; self.stream.write(data)<br />IOError: [Errno 0] Error<br /></p><p>所以实际上是根本没法用的。我测试的版本是 Python 2.5.2，不知道后续版本是否有改进。</p><p>而且还有一个问题是如果你 chcp 65001 之后，打过一些汉字或者用 type 显示过文件，就会发现怎么光标的位置都不对啊！换行也不对啊喂后面怎么好多东西超出去了看不到啊！</p><p>没
错恭喜你遇到了最头疼的问题！在 cp65001 
下，并不像那些中国、日本、韩国的代码页下面那样区分全角和半角，所有的字符在计算光标的时候都占同样的宽度，但是字体渲染仍然正常。也就是说，如果（假
设一行设置的是 80 个字符）你在一行里写了 80 个汉字，那么前 40 个渲染的时候就已经把整行占满了，可是没有自动换行，自动换行要到 80 
列才有，所以后 40 个汉字就看不见了。</p><p>坑爹呀。</p><p>遗憾的是这还根本没有解决办法。要想让全角字符正确地占两个半角字符的宽度，就只能用一些支持这个特性的代码页，比如 cp936，就是 GBK。当然，这样就不能显示全部 Unicode 字符了，万一有用户输入了这个，就只能被替换成 ? 或者其它什么东西了。</p><p>所以说，只要还跟该死的 char 字节流打交道，跟 stdout 打交道，就没法有一个完美方案。<br /></p><hr style="width: 100%; height: 2px;" /><p>解决方案四、彻底不使用stdout：</p><p>这
堆乱七八糟的事情从根本上来说是因为控制台的 stdout 只能接受 8-bit 字节流，也就是 
char，所以才有了这么多有的没的编码问题。如果能够让 python 在用 print 的时候底层使用一个接受 WCHAR 
的函数来做事，也许事情就有很大转机。</p><p>事实上，还是在 <a href="http://stackoverflow.com/questions/5109970/linux-python-encoding-a-unicode-string-for-print">http://stackoverflow.com/questions/5109970/linux-python-encoding-a-unicode-string-for-print</a> 就有一篇终极解决方案。它用接受 WCHAR 的 Windows API 做控制台输出，而同时把重定向交由原有方式处理，在兼顾重定向的情况下，实现了控制台下最完美的输出方案。</p>
<p>首先请看代码：</p>
<p>import sys<br />
if sys.platform == &amp;quot;win32&amp;quot;:<br />
&amp;#160;&amp;#160;&amp;#160; import codecs<br />
&amp;#160;&amp;#160;&amp;#160; from ctypes import WINFUNCTYPE, windll, POINTER, byref, c_int<br />
&amp;#160;&amp;#160;&amp;#160; from ctypes.wintypes import BOOL, HANDLE, DWORD, LPWSTR, LPCWSTR, LPVOID<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; original_stderr = sys.stderr<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; # If any exception occurs in this code, we'll probably try to print it on stderr,<br />
&amp;#160;&amp;#160;&amp;#160; # which makes for frustrating debugging if stderr is directed to our wrapper.<br />
&amp;#160;&amp;#160;&amp;#160; # So be paranoid about catching errors and reporting them to original_stderr,<br />
&amp;#160;&amp;#160;&amp;#160; # so that we can at least see them.<br />
&amp;#160;&amp;#160;&amp;#160; def _complain(message):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; print &amp;gt;&amp;gt;original_stderr, isinstance(message, str) and message or repr(message)<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; # Work around .<br />
&amp;#160;&amp;#160;&amp;#160; codecs.register(lambda name: name == 'cp65001' and codecs.lookup('utf-8') or None)<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; # Make Unicode console output work independently of the current code page.<br />
&amp;#160;&amp;#160;&amp;#160; # This also fixes .<br />
&amp;#160;&amp;#160;&amp;#160; # Credit to Michael Kaplan <br />
&amp;#160;&amp;#160;&amp;#160; # and TZΩTZIOY<br />
&amp;#160;&amp;#160;&amp;#160; # .<br />
&amp;#160;&amp;#160;&amp;#160; try:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # HANDLE WINAPI GetStdHandle(DWORD nStdHandle);<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # returns INVALID_HANDLE_VALUE, NULL, or a valid handle<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # DWORD WINAPI GetFileType(DWORD hFile);<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # BOOL WINAPI GetConsoleMode(HANDLE hConsole, LPDWORD lpMode);<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetStdHandle = WINFUNCTYPE(HANDLE, DWORD)((&amp;quot;GetStdHandle&amp;quot;, windll.kernel32))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; STD_OUTPUT_HANDLE = DWORD(-11)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; STD_ERROR_HANDLE&amp;#160; = DWORD(-12)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetFileType = WINFUNCTYPE(DWORD, DWORD)((&amp;quot;GetFileType&amp;quot;, windll.kernel32))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FILE_TYPE_CHAR&amp;#160;&amp;#160; = 0x0002<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FILE_TYPE_REMOTE = 0x8000<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetConsoleMode = WINFUNCTYPE(BOOL, HANDLE, POINTER(DWORD)) \<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((&amp;quot;GetConsoleMode&amp;quot;, windll.kernel32))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; INVALID_HANDLE_VALUE = DWORD(-1).value<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def not_a_console(handle):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if handle == INVALID_HANDLE_VALUE or handle is None:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return True<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return ((GetFileType(handle) &amp;amp; ~FILE_TYPE_REMOTE) != FILE_TYPE_CHAR<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; or GetConsoleMode(handle, byref(DWORD())) == 0)<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; old_stdout_fileno = None<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; old_stderr_fileno = None<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if hasattr(sys.stdout, 'fileno'):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; old_stdout_fileno = sys.stdout.fileno()<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if hasattr(sys.stderr, 'fileno'):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; old_stderr_fileno = sys.stderr.fileno()<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; STDOUT_FILENO = 1<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; STDERR_FILENO = 2<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; real_stdout = (old_stdout_fileno == STDOUT_FILENO)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; real_stderr = (old_stderr_fileno == STDERR_FILENO)<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if real_stdout:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; hStdout = GetStdHandle(STD_OUTPUT_HANDLE)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if not_a_console(hStdout):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; real_stdout = False<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if real_stderr:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; hStderr = GetStdHandle(STD_ERROR_HANDLE)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if not_a_console(hStderr):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; real_stderr = False<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if real_stdout or real_stderr:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # BOOL WINAPI WriteConsoleW(HANDLE hOutput, LPWSTR lpBuffer, DWORD nChars,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; LPDWORD lpCharsWritten, LPVOID lpReserved);<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteConsoleW = WINFUNCTYPE(BOOL, HANDLE, LPWSTR, DWORD, POINTER(DWORD), \<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; LPVOID)((&amp;quot;WriteConsoleW&amp;quot;, windll.kernel32))<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class UnicodeOutput:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def __init__(self, hConsole, stream, fileno, name):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self._hConsole = hConsole<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self._stream = stream<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self._fileno = fileno<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.closed = False<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.softspace = False<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.mode = 'w'<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.encoding = 'utf-8'<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.name = name<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.flush()<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def isatty(self):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return False<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def close(self):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # don't really close the handle, that would only cause problems<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.closed = True<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def fileno(self):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return self._fileno<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def flush(self):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if self._hConsole is None:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self._stream.flush()<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; except Exception, e:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _complain(&amp;quot;%s.flush: %r from %r&amp;quot;<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; % (self.name, e, self._stream))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; raise<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def write(self, text):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if self._hConsole is None:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if isinstance(text, unicode):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text = text.encode('utf-8')<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self._stream.write(text)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if not isinstance(text, unicode):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text = str(text).decode('utf-8')<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; remaining = len(text)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while remaining &amp;gt; 0:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; n = DWORD(0)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # There is a shorter-than-documented limitation on the<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # length of the string passed to WriteConsoleW (see<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # .<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; retval = WriteConsoleW(self._hConsole, text,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; min(remaining, 10000),<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; byref(n), None)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if retval == 0 or n.value == 0:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; raise IOError(&amp;quot;WriteConsoleW returned %r, n.value = %r&amp;quot;<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; % (retval, n.value))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; remaining -= n.value<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if remaining == 0: break<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; text = text[n.value:]<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; except Exception, e:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _complain(&amp;quot;%s.write: %r&amp;quot; % (self.name, e))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; raise<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; def writelines(self, lines):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for line in lines:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; self.write(line)<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; except Exception, e:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _complain(&amp;quot;%s.writelines: %r&amp;quot; % (self.name, e))<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; raise<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if real_stdout:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sys.stdout = UnicodeOutput(hStdout, None, STDOUT_FILENO,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; '&amp;lt;Unicode console stdout&amp;gt;')<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sys.stdout = UnicodeOutput(None, sys.stdout, old_stdout_fileno,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; '&amp;lt;Unicode redirected stdout&amp;gt;')<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if real_stderr:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sys.stderr = UnicodeOutput(hStderr, None, STDERR_FILENO,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; '&amp;lt;Unicode console stderr&amp;gt;')<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sys.stderr = UnicodeOutput(None, sys.stderr, old_stderr_fileno,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; '&amp;lt;Unicode redirected stderr&amp;gt;')<br />
&amp;#160;&amp;#160;&amp;#160; except Exception, e:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _complain(&amp;quot;exception %r while fixing up sys.stdout and sys.stderr&amp;quot; % (e,))<br />
  <br />
  <br />
&amp;#160;&amp;#160;&amp;#160; # While we're at it, let's unmangle the command-line arguments:<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; # This works around .<br />
&amp;#160;&amp;#160;&amp;#160; GetCommandLineW = WINFUNCTYPE(LPWSTR)((&amp;quot;GetCommandLineW&amp;quot;, windll.kernel32))<br />
&amp;#160;&amp;#160;&amp;#160; CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int)) \<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((&amp;quot;CommandLineToArgvW&amp;quot;, windll.shell32))<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; argc = c_int(0)<br />
&amp;#160;&amp;#160;&amp;#160; argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc))<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; argv = [argv_unicode[i].encode('utf-8') for i in xrange(0, argc.value)]<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; if not hasattr(sys, 'frozen'):<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # If this is an executable produced by py2exe or bbfreeze, then it will<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # have been invoked directly. Otherwise, unicode_argv[0] is the Python<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # interpreter, so skip that.<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argv = argv[1:]<br />
  <br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # Also skip option arguments to the Python interpreter.<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while len(argv) &amp;gt; 0:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; arg = argv[0]<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if not arg.startswith(u&amp;quot;-&amp;quot;) or arg == u&amp;quot;-&amp;quot;:<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argv = argv[1:]<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if arg == u'-m':<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # sys.argv[0] should really be the absolute path of the module source,<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; # but never mind<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if arg == u'-c':<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; argv[0] = u'-c'<br />
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break<br />
  <br />
&amp;#160;&amp;#160;&amp;#160; # if you like:<br />
&amp;#160;&amp;#160;&amp;#160; sys.argv = argv</p>
<p>简单来说这段代码做了这么几个事：</p>
<p>1、如果输出到控制台，改用 WriteConsoleW()。<br />
2、如果输出被重定向，用 utf-8 编码输出。<br />
3、用 GetCommandLineW() 和 CommandLineToArgvW() 获取命令行参数，在最后一行取代 sys.argv 传入的参数。</p>
<p>这个是我目前能找到的最完美的解决方案了。在控制台下也能不出错，在重定向的时候也可以按 UTF-8 去编码成 char 字节流。唯一的问题是 Python 2.5.2 里似乎没有 LPVOID。我用 c_void_p 取代 LPVOID，似乎是可行的。<br />
</p><p>当然，它仍然有前述不可避免的问题。例如在非原生支持汉字的代码页（简936繁950日932韩949）下，光标和换行的位置会出问题。如
果对汉字显示有很高的要求，不妨调用 Windows API 设置一下控制台的代码页。此外，输出重定向到外围程序时，如果外围程序不能设置按 
UTF-8 
解码，就会看到乱码的问题也依然存在。这些问题，就留待读者自行解决吧。</p><hr style="width: 100%; height: 2px;" /><p>最后，特别说明一下以上问题都是 Windows 平台限定的。Linux 下问题没有这么显著（现在的Linux发行版本多数都设置了默认代码页为 
UTF-8），而且就算用户代码页不是 UTF-8，也没有 Windows 下 WriteConsoleW 这么淫霸的函数，所以洗洗睡吧。</p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[[转载+评论]NSIS插件编写入门]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7028786.html" />  
<issued>2012-01-16T11:52:57Z</issued> 
<created>2012-01-16T11:52:57Z</created> 
<modified>2012-01-16T11:52:57Z</modified>
<id>tag:apoo.blogchina.com,2012://7028786</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>经验和资料</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
<p>原文：<a href="http://clseto.mysinablog.com/index.php?op=ViewArticle&amp;articleId=1910084">http://clseto.mysinablog.com/index.php?op=ViewArticle&amp;amp;articleId=1910084</a></p><hr style="width: 100%; height: 2px;" /><br /><p>Many&amp;#160;schools taught programming but very few of them taught deploying
 software.&amp;#160;You may&amp;#160;be so concentrated while programming your great 
software and&amp;#160;haven't felt the difficulties of deploying it to others' 
computer. If you really want to deploy your software to general public, I
 would like to tell you: try to spend several days (or even&amp;#160;weeks) to 
write and test the installer of your great software.</p><p>Very often, 
your software requires some prerequisites to run and your installer will
 try to check it, download some required components and do some post 
configurations. There are quite a bunch of logics behind and the 
installer&amp;#160;is a completely distinct project from your original program !</p><p>I
 had spent several days to study NSIS. Why choose NSIS ? It is popular 
and free of charge. However, it only targets Microsoft Windows platform.
 You may feel annoying at first about NSIS: &amp;quot;Oh ... my God ! I just want
 to deploy a few files. I don't want to learn a new language to do such 
stupid stuff.&amp;quot; Yes, that's right. If your program has only one exe, 
that's a waste of time to do so. But if your installer really need some 
checking like those previously stated, you will find that NSIS is worth 
to learn.</p><p>Here to mind you one important thing: The NSIS you can download from <a href="http://nsis.sourceforge.net/Main_Page">http://nsis.sourceforge.net/Main_Page</a>&amp;#160;is an ANSI version. There's another Unicode version at <a href="http://www.scratchpaper.com/">http://www.scratchpaper.com/</a>&amp;#160;(but the installer made by this Unicode version can't be run on Windows 9X).</p><p>There
 are already many tutorials on how to write an NSIS installer so I don't
 want to repeat. Here, I would like to talk about writing a plugin to 
extend the functionalities of an installer ....</p><p>Actually, there's already an example&amp;#160;plugin at &amp;quot;<font face="courier new,courier">C:Program Files\NSIS\Unicode\Examples\Plugin</font>&amp;quot; (depends on where you install NSIS), you can take a look at it.</p><p><font size="4">Background knowledge</font>&amp;#160;</p><p>NSIS
 plugin is nothing but a DLL exporting&amp;#160;one or&amp;#160;several C functions (one 
function one functionality) and which has this kind of prototype:</p><p><font face="courier new,courier">__declspec(dllexport) void mypluginfunc(HWND hWndParent, </font><font face="courier new,courier">int string_size,&amp;#160;TCHAR *variables, stack_t **stacktop,&amp;#160;extra_parameters *extra);</font></p><p>It
 uses normal C function calling convention and has no return value. No 
return value ! So, how to communicate with the script ? Use the stack 
(not the OS process level stack but a stack maintained internally by the
 NSIS virtual machine) or those predefined global variables ($0, $1, 
..., $9,&amp;#160;$R0, $R1, ..., $R9. NSIS calls them registers). Also, all 
parameters on the stack are in string format. To pass an integer,&amp;#160;a 
conversion is needed. Inefficient ? Yes, it is but we are not writing a 
real-time 3D shooting game.</p><p>What's that pointer pointed to by &amp;quot;<font face="courier new,courier">extra</font>&amp;quot; above ? I don't know either. This testing plugin won't make use of it. Try to find it out yourself.</p><p><font size="4">Plugin&amp;#160;step by step</font></p><p>(1)&amp;#160;</p><p>I
 usually use Visual studio to write C programs. So launch a new dll 
project which exports some symbols. Before writing any code, first 
change the Runtime library: Project -&amp;gt; Properties -&amp;gt; C/C++ -&amp;gt; 
Code Generation -&amp;gt; Runtime library. For debug mode, choose &amp;quot;<font face="courier new,courier" color="#ff6600">Multi-threaded Debug (/MTd)</font>&amp;quot; whereas release mode, choose &amp;quot;<font face="courier new,courier" color="#ff6600">Multi-threaded (/MT)</font>&amp;quot;. If not doing so, you will need to deploy the C runtime together with your installer.</p><p>(2)</p><p>Copy the following files from &amp;quot;<font face="courier new,courier">C:\Program Files\NSIS\Unicode\Examples\Plugin</font>&amp;quot; and include them to your working project:</p><p><font face="arial black,avant garde">api.h, nsis_tchar.h, pluginapi.h, pluginapi.lib</font></p><p>They
 are the necessary header and object files. Set your project to link 
with &amp;quot;pluginapi.lib&amp;quot;. The functions inside pluginapi.lib are declared in
 pluginapi.h.</p><p>(3)</p><p>Try to write our testing&amp;#160;plugin C function like this:</p><p><font face="courier new,courier">extern &amp;quot;C&amp;quot; {</font></p><p><font face="courier new,courier">// This is an example of an exported function.<br />MYPLUGIN_API void mypluginfunc(HWND hWndParent, int string_size, <br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TCHAR *variables, stack_t **stacktop,<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; extra_parameters *extra)<br />{<br />&amp;#160;&amp;#160;&amp;#160; EXDLL_INIT();</font></p><p><font face="courier new,courier">&amp;#160;&amp;#160;&amp;#160; WCHAR szComponent[256];<br />&amp;#160;&amp;#160;&amp;#160; popstring(szComponent);</font></p><p><font face="courier new,courier">&amp;#160;&amp;#160;&amp;#160; int len = (int)wcslen(szComponent);</font></p><p><font face="courier new,courier">&amp;#160;&amp;#160;&amp;#160; // make a little change to input parameter<br />&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; len; ++i)<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; szComponent[i] += 1;</font></p><p><font face="courier new,courier">&amp;#160;&amp;#160;&amp;#160; // push back on the stack<br />&amp;#160;&amp;#160;&amp;#160; pushstring(szComponent);<br />}</font></p><p><font face="courier new,courier">}</font></p><p>Remeber&amp;#160;to
 wrap the function by 'extern &amp;quot;C&amp;quot;', otherwise, VC &amp;quot;thinks&amp;quot; it is a C++ 
function (since it is inside a cpp file) and hence function name 
decoration may result.</p><p>In the function, first insert the macro &amp;quot;EXDLL_INIT()&amp;quot;, which sets up the stack and other parameters.</p><p>The
 rest of the function is just to pop the string passed in, change it a 
little bit and push back on the stack so that caller can get the 
modified string.</p><p>(4)</p><p>Compile the DLL (debug or release version). Then copy the DLL to NSIS plugin directory: &amp;quot;<font face="courier new,courier">C:\Program Files\NSIS\Unicode\Plugins</font>&amp;quot;</p><p>(5)</p><p>Lastly, write a testing NSIS script to test this plugin:</p><p><font face="courier new,courier">OutFile &amp;quot;helloworld.exe&amp;quot;</font></p><p><font face="courier new,courier"># default section<br />Section</font></p><p><font face="courier new,courier">&amp;#160;&amp;#160; MessageBox MB_OK &amp;quot;Hello world ! Yes...&amp;quot;<br />&amp;#160;&amp;#160; <font color="#ff9900">myplugin::mypluginfunc &amp;quot;FDFDqqq</font><font color="#ff9900">我們&amp;quot;</font><br />&amp;#160;&amp;#160; Pop $0<br />&amp;#160;&amp;#160; MessageBox MB_OK &amp;quot;ret = $0&amp;quot;</font></p><p><font face="courier new,courier">SectionEnd</font></p><p>Save the script as &amp;quot;hello.nsi&amp;quot; and compile&amp;#160;it with &amp;quot;<font face="courier new,courier">C:\Program Files\NSIS\Unicode\makensis&amp;quot; hello.nsi</font>&amp;quot;.</p><p>(6)</p><p>Try
 to run the resulting &amp;quot;helloworld.exe&amp;quot;. Since it is a Unicode version, 
you can pass non-English string to the plugin and see the modified 
string (2 chinese characters as above). But to mind you that you have to
 save the script in Unicode format (i.e. from notepad -&amp;gt; save as 
-&amp;gt; Encoding -&amp;gt; Unicode).</p><p>A screenshot to display the modified string (the 2nd MessageBox above):</p><p><img hspace="5" border="0" vspace="5" alt="Picture" src="http://clseto.mysinablog.com/resserver.php?blogId=37327&amp;resource=2197750-nsis_test_script.png" /></p><p>Source of the above example:&amp;#160;<a href="http://clseto.mysinablog.com/resserver.php?blogId=37327&amp;resource=2197742-mynsisplugin.zip">2197742-mynsisplugin.zip</a></p><p>Enjoy!</p><hr style="width: 100%; height: 2px;" /><p>我的补充：</p><p>1、你从NSIS网站上也能下载到NSIS Plugin Example。但是那个for是NSIS ANSI的。如果要开发for NSIS Unicode的，得从NSIS Unicode的安装目录拿东西。</p><p>2、函数的传入参数string_size既不是你从NSIS传入参数的字符串的个数，也不是字符串的长度。而是NSIS编译时的一个常量的值。这个值在NSIS ANSI版里固定为1024，在NSIS Unicode版里上升到8196。参见<a href="http://www.scratchpaper.com/home/faq">http://www.scratchpaper.com/home/faq</a>，“Where's the large string version of the Unicode NSIS?”。</p><p>3、传入参数是在程序里用popstring(LPTSTR)获取的。如果你是用popstring、pushstring等函数，且在函数参数处用TCHAR来修饰variables，则编译出来的dll文件只能用于ANSI或Unicode二者其一。也许通过强制使用PopStringA和PushStringA可以让一个dll适应ANSI和Unicode，但是我没试过。参见pluginapi.h。</p><p>4、传入参数在程序里popstring的时候是从左到右获得的。例如传入参数是pluginName::functionName &amp;quot;123&amp;quot; &amp;quot;456&amp;quot;，第一次popstring会得到123，第二次456。</p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[诺基亚702T + 北京神州行cmwap无限流量卡]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7025116.html" />  
<issued>2011-12-03T18:45:19Z</issued> 
<created>2011-12-03T18:45:19Z</created> 
<modified>2011-12-03T18:45:19Z</modified>
<id>tag:apoo.blogchina.com,2011://7025116</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>经验和资料</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[<p>把北神无限卡放进702T<br />
开机<br />
出现3.5G标志（当然是刷过open固件的）<br />
上网<br />
虽然还是只能上cmwap（当然也可以上MM-Nokia商店专用接入点cmcc cmmm）<br />
不过速度已经轻松飙到了170KB/s<br />
下个QQ几秒钟<br />
太爽了！</p>
<p>不过不知道3G模式下上网会不会另外收钱<br />
晚上看看话费变化<br />
没问题的话北神流量卡就值大钱了<br />
15元/月<br />
全国漫游<br />
3G无限流量上网<br />
orz</p>

]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[小悦悦事件之我见]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7022122.html" />  
<issued>2011-10-26T01:43:06Z</issued> 
<created>2011-10-26T01:43:06Z</created> 
<modified>2011-10-26T01:43:06Z</modified>
<id>tag:apoo.blogchina.com,2011://7022122</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>感想和评论</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
刚才看了一篇文章，题目《小悦悦事件的44个疑点, 某些无良媒体用鲜血制造的“新闻”》，觉得作者分析得挺在理的。有些感触，不吐不快。<br /><br />我记得我刚到美国那会儿，也是哪个非洲国家，在万恶的美帝的煽动下，国内搞了革命。那时候有些人在转发一个视频，说是非洲的某独裁者多么多么可恨，竟然枪杀了这么可爱的一个女孩。我就点进视频进去看了一下。不看不知道，看了才发现美国民众的智商，确实没有下限。<br /><br />视频明显是一个手机拍摄的，有摇晃，看来看去。画面的远处是示威的人群，而摄影者远离人群。突然，画面里走进一个年轻女生，手机就跟着她拍。拍摄者远离示威人群，显然女生也是远离示威人群的，而且看都没有看那边一眼。也许是怕惹麻烦，所以躲着走吧。可是，就在她走过镜头前的时候，突然仰面朝天倒在地上。一发从远处射来的子弹，准确地穿过了她的心脏。少女倒在地上，鲜血从口中不断涌出，身上的伤口也染红了胸前的衣服。她的眼睛还睁着，仿佛还在纳闷自己为什么会被击中。<br /><br />我也很纳闷。明明示威者就在视频的远方，而女孩是从画面一侧走到另一侧的。不论是示威者打向远方的子弹，还是政府军还击的子弹，都应该是平行于摄像机视角方向的，不应该从侧面打穿这个女孩。我能得出的唯一结论，就是这是无良的西方媒体，为了给背后的西方势力造势，煽动非洲小国闹革命，而打的一出舆论战。你看到的一切，都是一向标榜公正无私的西方媒体，为了他们一向标榜民主自由的主子，而安排的一场好戏。除了那个女生。<br /><br />也许她不相信西方人会带来美好的生活，这样起码她还用自己的声明验证了西方帝国主义列强的虚伪。如果她像我们国家的一些民逗、带路党一样相信西方势力的介入是会给自己带来美丽新生活的，那她就真的是一个悲剧了。可能她至死都没有搞明白，自己怎么就成了西方势力侵略祖国过程中的一枚炮灰。不过，这并不是她的错。这样的编排就像是一场无差别杀人游戏，导演这出戏的人，只需要一个年轻、漂亮，容易激发观众同情心的姑娘走过自己的镜头前，杀死毫无防备的她，一出好戏就拍完了。经过那里的任何人，都可能成为枪下的冤魂。<br /><br />至于后来这个非洲小国的革命进行得怎么样了，我是没有关注。非洲国家名字都不好记，过了几天也就忘了。不过看看利比亚就知道。据说法国总统几年前还赞扬卡扎菲把利比亚带向了繁荣富强，让利比亚人民过上了好日子。结果没几年，法国倒戈一击，带头轰炸利比亚。每当看到国际社会上这些外国政客翻云覆雨的丑恶嘴脸，我都十分庆幸毛主席当年让全国人民勒紧裤腰带也要搞出核武器来。吃几年苦搞出来了，以后再怎么发展，都不怕外国势力打压，人民真正能有个盼头。要是一开始就让人民过上悠闲安逸的日子，那肯定是稍微发展一点，世界老大就要来阻止你了。这就像高考前拼命备考一样，苦一时，安逸一世。<br /><br />别跟我说美国不打法国不打英国是因为英法联军是民主国家，根本原因是两点：一、英法不跟美国拧着干，美国说啥就是啥；二、欧洲的经济再怎么干也干不过美国了，不然就是不听话。现在有可能超越美国的国家就中国一个，为什么？硬实力上能抗衡，经济上才有可能发展。经济基础决定上层建筑，那又是什么决定经济基础呢？是军事实力。没有军事实力，守不住财，当然也就别想发财。发一点人家都会来抢的。<br /><br />咱还是说回小悦悦这个事件。我觉得，这个事儿之所以蹊跷，还跟它发生的时机有关系。最近想必关心实事的人也听说了，一帮民知民逗正因为一个盲人的事儿而跟政府对着干呢。如果你说中央政府想在这个时候制造一点社会事件转移视线，确实是太可能了。就搞新闻的那帮唯恐天下不乱的人，什么时候这么好心出来表扬好人好事了？在我印象里弘扬正气那一贯是CCTV干的事儿，各种小报，尤其是南方XX报，最喜欢挑社会阴暗面报道。让人觉得过不下去了，思想阴暗了，这报社还要自命不凡，说我是大胆揭露歪门邪道。我说你揭露可以，但不光要惩恶，还要扬善。最近某些媒体老拿医患纠纷说事儿，这就是心里烂到根儿上了。这个是后话，暂且不表。<br /><br />所以我就想，要是有什么组织，能让全国媒体这么一根筋地赞扬真善美，那可能还真是中央政府有这个本事了。所以很可能是中央想转移视线，找了广东的媒体，让他们搞一个大事件出来。不仅要轰动，还要能引发大讨论。最好是能让美分党和五毛党对掐的，最好是能让共产党和社会主义躺着也中枪的，这样最能把自己择出去。结果媒体一听，很高兴（或者“很无奈”，按某些媒体人一贯的说法），就出去找啊找，终于找到了原文中提到的这么一对夫妇。可能真的是生了个女儿不想要，想再生个儿子。三方面一拍即合，才有了今天你们看到的这出戏。<br /><br />当然，还是得说在造假这种事儿上我们国人比老美聪明多了。起码车是从路上开过来的，没有从店铺里冲出来。这比射在非洲少女胸口的那一枪要真实得多。可是还是有很多很多的问题，能被原文作者这样细心的人挑出来。毕竟，老百姓没有影帝的本事。至于那位拾荒大妈，我觉得真不是演员。可能她只是被算准了，在那一天那一时刻会在这条路上经过。可能也没计算得这么精确，说不定不管是谁，从那里路过了，只要不是演员，就会去扶一把，救一把，让这出没有胜利者的戏走向封镜。<br /><br />但不管怎么说，这样的手段都太罪恶了。我觉得中央的本意是好的，只是媒体无良，造了这么没下限的事儿出来。最后诚挚地祝愿天下无良的新闻人全家死光光，永世不得超生。


]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[Windows XP 原版(SP0)和SP1无法安装nVidia新驱动的解决方案]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7021912.html" />  
<issued>2011-10-21T17:06:37Z</issued> 
<created>2011-10-21T17:06:37Z</created> 
<modified>2011-10-21T17:06:37Z</modified>
<id>tag:apoo.blogchina.com,2011://7021912</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>经验和资料</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[先装DX9就可以了。因为原版系统和SP1没有DX9，驱动找不到d3d9.dll，就会安装失败。

]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[[转载]Windows 7下ThinkPad T500 指纹识别软件故障的解决]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7014942.html" />  
<issued>2011-08-01T07:47:34Z</issued> 
<created>2011-08-01T07:47:34Z</created> 
<modified>2011-08-01T07:47:34Z</modified>
<id>tag:apoo.blogchina.com,2011://7014942</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>经验和资料</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
<p>来自：http://hi.baidu.com/zt37/blog/item/634e20a41d54b7fc9052eee3.html</p><hr style="width: 100%; height: 2px;" /><p>年前换了t500从oem的vista折腾到win7 旗舰版颇费周章。结果。升级后蛮高科技的指纹识别功能over了。</p>
<p>每次开机注册都说“无法与传感器通讯”</p>
<p><span><br />
<span><img border="0" class="blogimg" src="http://apoo.bokee.com/inc/t500-fingerprint-software-1.jpg" /></span></span></p>
<p><span><span>虽然装驱动的时候有些古怪。但用thinkvantage toolbox检查设备显示正常</span></span></p>
<p><span><span><span><img border="0" class="blogimg" src="http://apoo.bokee.com/inc/t500-fingerprint-software-2.jpg" /></span></span></span></p>
<p><span><span><span>心生疑惑。看网上搜到的消息都说和驱动有关。还有说跟BIOS设置有关的。但是上面的检查结果说明bios设置并没有关掉指纹设备，驱动也应该是可用的。（ps：驱动是从联想官网下的win7指纹驱动，且用联想的驱动自动检查工具检查说明系统不需要更新驱动）</span></span></span></p>
<p><span><span><span>因此对网上下驱动调bios的说法不再信服。转而认为是软件问题。</span></span></span></p>
<p><span><span><span>在联想官方已经收录的问题说明文档中也看到在以前升级vista系统后也出现过类似无法识别现象。估计是老毛病又犯了。</span></span></span></p>
<p><span><span><span>按此思路在查询了一下反映无法连通指纹设备的软件编号如下</span></span></span></p>
<p><span><span><span><span><img border="0" class="blogimg" src="http://apoo.bokee.com/inc/t500-fingerprint-software-3.jpg" /></span></span></span></span></p>
<p><span><span><span><span>3.3058</span></span></span></span></p>
<p><span><span><span><span>从联想支持中心搜了一下。貌似最新版已经到了5.9版本。下了装上看看</span></span></span></span></p>
<p><span><span><span><span><span><img border="0" class="blogimg" src="http://apoo.bokee.com/inc/t500-fingerprint-software-4.jpg" /></span></span></span></span></span></p>
<p><span><span><span><span><span>版本升级了了，软件名也从“lenovo指纹”升级成了“thinkvantage指纹软件”</span></span></span></span></span></p>
<p><span><span><span><span><span>安装重启。指纹注册ok了。看来毛病是出在指纹软件上。不是bios问题。也不是驱动问题。<br />
</span><br />
</span></span></span></span><span><span><span>lenovo的中文支持网站上没有找到相关的软件更新，这个软件是从他英文网页上搜出来的</span></span></span></p>
<span><span><span><a href="http://www-307.ibm.com/pc/support/site.wss/document.do?sitestyle=lenovo&amp;lndocid=MIGR-73583">http://www-307.ibm.com/pc/support/site.wss/document.do?sitestyle=lenovo&amp;amp;lndocid=MIGR-73583</a></span></span></span><hr style="width: 100%; height: 2px;" />APOO评论：我也是升级到Win7之后发现指纹识别不能用了。唯一的区别在于，我装的是T500页面上推荐给Win7用的3.3.2.43版本，依然不行。曾经用过一个1.x的版本是能用的，但是后来用Lenovo Software Update升级之后找不到这个旧版本了，也只好作罢。看来也许是联想的网站更新不力，没有把最新的指纹识别软件放到T500的页面里；也许ThinkVantage是更老的软件，比Lenovo指纹软件1.x还老，所以能用。嗨，谁知道呢……<br /><br />没下的抓紧去下吧，没准什么时候IBM的网站就要撤掉Think系列相关的页面了。据说是8月31号。<br />
]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[[转载]一个冷笑话]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/7002378.html" />  
<issued>2011-04-04T02:44:02Z</issued> 
<created>2011-04-04T02:44:02Z</created> 
<modified>2011-04-04T02:44:02Z</modified>
<id>tag:apoo.blogchina.com,2011://7002378</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>感想和评论</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[
<p>转载自：<a href="http://blog.renren.com/blog/5588/719802216">http://blog.renren.com/blog/5588/719802216</a></p><hr style="width: 100%; height: 2px;" /><p>话说，从前有一个特别、特别大的花园，花园里种着特别多的花花草草，还有些飞鸟鱼虫。人家都说，这所花园是王国里最漂亮的花园，够资格进入这个花园里的，都是最漂亮的花花草草和最轻捷的飞鸟鱼虫。</p><p>有一只小甲虫，它本来没资格进入这个花园。要进这个花园，一小时内得飞600多圈，它比规定的圈数少飞了60圈。但是花园的管理员瞧了瞧，觉得它飞的姿势挺特别，就把它招了进来。</p><p>大家听说小甲虫会用特别的姿势飞行，还飞到了王国最漂亮的花园里，都非常关注小甲虫。小甲虫进了花园以后，就在后头插了一根针，冒充蜜蜂。</p><p>这个假蜜蜂左边飞飞，右边飞飞，觉得这个花园实在是名不副实，就对着里头的花草鱼虫冷嘲热讽。</p><p>有几只金龟子想来看看它，它撅起说：</p><p>——哎呀，人家都说这花园里的金龟子颜色特别漂亮，是整个王国里最聪明最有魅力的金龟婿，可瞧瞧你们，都一脸呆样啊！</p><p>有一片向日葵一直跟着太阳转，它鄙视的飞过去说：</p><p>——哟，谁付给你们钱啦，你们就天天对着太阳点头哈腰？有人给你们天天上五毛钱的化肥吧？</p><p>几条鱼称赞着这花园里的清澈池水，它不屑地从鼻孔里哼出一声，说：</p><p>——最早最早刚有这花园的时候，这里的环境可比现在好多啦！当时的四大园丁更是顶呱呱！现在都是些什么玩意儿！</p><p>这只甲虫扮的假蜜蜂把自己的刺朝这边竖竖，朝那边撅撅。有的花草鱼虫觉得它说的挺有道理，也有的花草鱼虫对它的话嗤之以鼻。还有很多花园外头的人，经常翘着脚尖朝墙里看这只假蜜蜂，觉得它是勇敢的批判英雄。</p><p>等到这只假蜜蜂进入花园的第三年，这个花园正要开始自己一百年的庆典。假蜜蜂嗡嗡嗡嗡，唱了一首新歌，讲这个花园的坏话，说这里到处都是缺点：金龟子呆滞，向日葵腹黑，池鱼目光短浅。自己在这里住了三年，还是觉得这里是个烂到不行的花园。</p><p>有一个人实在忍不住了，就对它说：</p><p>“既然你这么讨厌这里，为什么还不离开呢？”</p><p>这只甲虫大叫道：</p><p>&amp;#160;</p><p>&amp;#160;</p><p>&amp;#160;</p><p>&amp;#160;</p><p>&amp;#160;</p><p>&amp;#160;</p><p><span style="font-weight: bold;">“怎么可能离开！我离开这个园子，还能装Bee吗？！”</span></p>

]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[通过Mail for Exchange在S60v3上使用Google Sync简直就是垃圾]]></title> 
<link rel="alternate" type="text/html" href="http://apoo.blogchina.com/6999442.html" />  
<issued>2011-03-14T02:20:49Z</issued> 
<created>2011-03-14T02:20:49Z</created> 
<modified>2011-03-14T02:20:49Z</modified>
<id>tag:apoo.blogchina.com,2011://6999442</id>
<author> 
<name>APOO</name> 
<url>http://apoo.blogchina.com/index.html</url> 
<email>apoo@sina.com</email> 
</author> 
<dc:subject>感想和评论</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://apoo.blogchina.com/"> 
<![CDATA[只支持日历和联系人就不说了，支持程度也是糟糕得一塌糊涂。日历里所有的“纪念日”全都变成“会议”了，联系人的项目保存到Google里的也缺了很多，
如果再同步回手机，哼哼，等着丢数据吧！而且第一次运行还会提示“您的帐号没有与当前设置同步的权限。请与您的管理员联系。”这样的错误信息。在Google日历里随便建个项目就可以修正此bug。当然这个新建的项目会被带到手机里……<br />

<br />

试了一下诺基亚官方的Ovi Contacts同步。虽然网页版界面只有英文，不过还是好用很多的。数据都是完整地保存到服务器上的不会丢东西。但是如果你设置了多个同名字段，顺序可能会变化，而诺基亚现在又不能同步自定义字段名称，所以这点比较头疼。<br />]]> 
</content> 
</entry>
 

</feed>
