<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ftofficer&#124;张聪的blog &#187; hacking</title>
	<atom:link href="http://blog.ftofficer.com/tag/hacking/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ftofficer.com</link>
	<description>A Newbie on the Way</description>
	<lastBuildDate>Sun, 12 Dec 2010 14:35:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<cloud domain='blog.ftofficer.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>Firefox 当中HTML控件无法正常显示</title>
		<link>http://blog.ftofficer.com/2008/10/firefox-%e5%bd%93%e4%b8%adhtml%e6%8e%a7%e4%bb%b6%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e6%98%be%e7%a4%ba/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2008/10/firefox-%e5%bd%93%e4%b8%adhtml%e6%8e%a7%e4%bb%b6%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e6%98%be%e7%a4%ba/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 11:38:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9975</guid>
		<description><![CDATA[今天照常上网的时候，突然发现自己的Google主页上面的所有按钮上面的文字都消失了，所有的单选按钮也都消失了。变成了这样： 这个问题最后得以解决，解决方案如下：首先，在地址栏输入about:config，然后找到nglayout.debug.enable_xbl_forms这个配置项，如果它是true的话，把它改成false。重新启动Firefox即可。 ======我是无聊的分割线====== 如果你的兴趣仅限于解决这个问题，下面的查错过程请无视。 这当然是非常不爽的一件事情，于是我开始回忆在上次显示尚且完好之后我做了什么操作，但是实在想不起来上次完好是什么时候的事情了——我上网一般都是在Google Reader上面徘徊，而Google Reader上面确实没有什么显眼的HTML标准控件可以让我发现这个问题。 于是没有办法，只好开始手动排错。在重新启动Firefox，重新启动Windows，用IE访问Google主页三步之后，基本可以排除系统原因或者Google的网页本身的原因。接下来看看是不是插件的问题，那么就先从“安全模式”开始看看问题是否能够解决。于是打开Firefox在开始菜单当中的安全模式，然后把“禁用所有扩展”打勾，重新访问Google，问题依旧，因此也不是插件的问题。那么是Firefox本身程序的问题么？为了考察这个，我新建一个Profile：在命令行中输入&#60;path_to_firefox&#62;\firefox.exe -P，注意P需要大写，然后再弹出对话框当中选择新建配置文件之类，完成之后用这个新的配置文件启动，然后访问Google，没有问题。因此看起来问题仍然在Profile本身。 Profile当中既然不是插件的问题，那么很可能就是首选项的问题了。我们知道在每个Profile目录下面有一个prefs.js的文件，是Firefox在当前情况下的所有的首选项的值，也就是在about:config里面看到的东西。最简单的就是比较两个Profile当中的prefs.js文件。在经过了大约半个小时，尝试过数十个不同的首选项之后，发现了nglayout.debug.enable_xbl_forms这个罪魁祸首。 然后用这个key的名字来搜索，发现其实这个是从Mozilla 1.3就开始有的问题，最早可以追溯到2002年12月： XBL-based form controls are broken and unusable in 1.3 and trunk builds. (bug 185612) If HTML form controls are not appearing and functioning on HTML pages, check &#8216;prefs.js&#8217; for the line &#8216;user_pref(&#34;nglayout.debug.enable_xbl_forms&#34;, true);&#8217;. NOTE: this will only affect you if you had previously [...]]]></description>
			<content:encoded><![CDATA[<p>今天照常上网的时候，突然发现自己的Google主页上面的所有按钮上面的文字都消失了，所有的单选按钮也都消失了。<br />变成了这样：</p>
<p><img src="http://byfiles.storage.live.com/y1p-iWOwpWiZXVIg-jAyd40JbY2-MWjgmBV7HQkaerQUxNyxV4EPe3oRKv0xOjhfArb" alt="Firefox Render HTML Control Bug" /></p>
<p>这个问题最后得以解决，解决方案如下：<br />首先，在地址栏输入about:config，然后找到nglayout.debug.enable_xbl_forms这个配置项，如果它是true的话，把它改成false。重新启动Firefox即可。</p>
<p>======我是无聊的分割线======</p>
<p>如果你的兴趣仅限于解决这个问题，下面的查错过程请无视。</p>
<p>这当然是非常不爽的一件事情，于是我开始回忆在上次显示尚且完好之后我做了什么操作，但是实在想不起来上次完好是什么时候的事情了——我上网一般都是在Google Reader上面徘徊，而Google Reader上面确实没有什么显眼的HTML标准控件可以让我发现这个问题。</p>
<p>于是没有办法，只好开始手动排错。在重新启动Firefox，重新启动Windows，用IE访问Google主页三步之后，基本可以排除系统原因或者Google的网页本身的原因。接下来看看是不是插件的问题，那么就先从“安全模式”开始看看问题是否能够解决。于是打开Firefox在开始菜单当中的安全模式，然后把“禁用所有扩展”打勾，重新访问Google，问题依旧，因此也不是插件的问题。那么是Firefox本身程序的问题么？为了考察这个，我新建一个Profile：在命令行中输入&lt;path_to_firefox&gt;\firefox.exe -P，注意P需要大写，然后再弹出对话框当中选择新建配置文件之类，完成之后用这个新的配置文件启动，然后访问Google，没有问题。因此看起来问题仍然在Profile本身。</p>
<p>Profile当中既然不是插件的问题，那么很可能就是首选项的问题了。我们知道在每个Profile目录下面有一个prefs.js的文件，是Firefox在当前情况下的所有的首选项的值，也就是在about:config里面看到的东西。最简单的就是比较两个Profile当中的prefs.js文件。在经过了大约半个小时，尝试过数十个不同的首选项之后，发现了nglayout.debug.enable_xbl_forms这个罪魁祸首。</p>
<p>然后用这个key的名字来搜索，发现其实这个是<a target="_blank" href="http://www.mozilla.org/releases/mozilla1.3/">从Mozilla 1.3就开始有的问题</a>，最早可以追溯到2002年12月：
<div style="margin-left:40px">XBL-based form controls are broken and<br />
unusable in 1.3 and trunk builds.<br />
(bug <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=185612">185612</a>)<br />
If HTML form controls are not appearing and functioning on HTML pages,<br />
check &#8216;prefs.js&#8217; for the line &#8216;user_pref(&quot;nglayout.debug.enable_xbl_forms&quot;, true);&#8217;.<br />
NOTE: this will only affect you if you had previously set this preference<br />
in the &#8216;Debug&#8217; panel in a previous build of mozilla. Casual users should<br />
never change any of these settings.<br />
</div>
<p>这个至今未关的Bug (<a href="http://bugzilla.mozilla.org/show_bug.cgi?id=185612">185612</a>)就是在讨论我遇到的这个问题。</p>
<p>事情还没有结束。</p>
<p>在我没有修改这个键值的情况下，是谁动了我的Firefox键值？</p>
<p>在仔细回顾了这个问题之前一天我所做的事情之后，发现嫌疑最大的是插件 <a target="_blank" href="https://addons.mozilla.org/addon/7979">XPCOMViewer</a> 版本0.9a。在新建的Profile上面尝试，发现一旦打开XPCOMViewer的主窗口，这个键立即就被改变成了true。也许是作者为了绕过某个难解的bug吧。之后查阅<a target="_blank" href="http://xpcomviewer.mozdev.org/">XPCOMViewer网站</a>，发现作者公布的<a target="_blank" href="http://www.ondrejd.com/download/xpcomviewer-1.0a1.xpi">最新开发版1.0a</a>当中已经修复了这个问题，也许我应该给作者发一封信告诉他应该更新一下Mozilla网站上面的版本了。</p>
<p>最后要澄清一下，虽然0.9a有这样的问题，但是作为一个仍然在sandbox当中的项目，这个扩展已经做得相当的好用。根据<a target="_blank" href="http://www.ondrejd.com/?p=9">作者最近的一篇文章</a>当中所说，1.0a版本支持一个非常cool的特性：直接将一个XPCOM组件导出成为Javascript/C++/Python的代码。对于有意在Firefox平台上面做点事情的朋友，这个扩展值得推荐。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2008/06/%e8%af%b4%e8%b5%b7%e6%9d%a5%e4%b8%ba%e4%bb%80%e4%b9%88mozilla%e8%a6%81%e5%af%84t%e6%81%a4/" rel="bookmark" title="2008年06月22日">说起来为什么Mozilla要寄T恤</a></li>
<li><a href="http://blog.ftofficer.com/2008/03/t-shirt-from-mozilla/" rel="bookmark" title="2008年03月1日">T-shirt from Mozilla</a></li>
<li><a href="http://blog.ftofficer.com/2007/12/tabimswitch-%e5%bc%80%e5%a7%8b%e6%94%af%e6%8c%81-firefox-3-0-beta-%e8%af%b7%e6%89%8b%e5%8a%a8%e4%b8%8b%e8%bd%bd%e6%9b%b4%e6%96%b0/" rel="bookmark" title="2007年12月23日">TabIMSwitch 开始支持 Firefox 3.0 Beta &#8211; 请手动下载更新</a></li>
<li><a href="http://blog.ftofficer.com/2007/07/firefox%e8%87%aa%e5%8a%a8%e5%88%87%e6%8d%a2%e8%be%93%e5%85%a5%e6%b3%95%e7%9a%84%e6%8f%92%e4%bb%b6-tabimswitch-1-0%e5%bc%80%e5%a7%8balpha/" rel="bookmark" title="2007年07月28日">Firefox自动切换输入法的插件 TabIMSwitch 1.0开始Alpha</a></li>
<li><a href="http://blog.ftofficer.com/2008/09/%e8%af%b4%e8%af%b4google%e7%9a%84%e5%bc%80%e6%ba%90%e6%b5%8f%e8%a7%88%e5%99%a8google-chrome/" rel="bookmark" title="2008年09月2日">说说Google的开源浏览器Google Chrome</a></li>
</ul>
<p><!-- Similar Posts took 14.217 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2008/10/firefox-%e5%bd%93%e4%b8%adhtml%e6%8e%a7%e4%bb%b6%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e6%98%be%e7%a4%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用google.cn做proxy访问Google的服务</title>
		<link>http://blog.ftofficer.com/2008/09/%e7%94%a8google-cn%e5%81%9aproxy%e8%ae%bf%e9%97%aegoogle%e7%9a%84%e6%9c%8d%e5%8a%a1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2008/09/%e7%94%a8google-cn%e5%81%9aproxy%e8%ae%bf%e9%97%aegoogle%e7%9a%84%e6%9c%8d%e5%8a%a1/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 16:00:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9973</guid>
		<description><![CDATA[最近玩Google App Engine，发现随着闹运会的结束，这个东西也重新不可访问了。今天偶然在SMTH的Python版上看到的。非常实用的一个方法，原始作者不可考，于是整理一下写在这里。 简单的说，Google的所有服务都是可以通过一个相同的服务器访问到，Google根据请求的URL当中的域名来决定应该定向到哪个服务。www.google.cn一样可以访问到所有的服务，例如App Engine。但是因为DNS服务器的原因，appengine.google.com会被定向到Google美国的服务器，不会去连接www.google.cn。但是事实上，如果我们能够向www.google.cn发送一个HTTP请求，其中的URL是指向appengine.google.com的，服务器一样能够帮我们中转请求，并把结果会传给我们。 要达到这个目的有两个方法，一个是修改hosts，让appengine.google.com和*.appspot.com指向到www.google.cn的IP地址。这个有两个劣势，一个是www.google.cn其实有很多个地址做负载均衡，一旦加上了hosts条目，就失去了负载均衡的好处；另一个劣势是hosts文件不支持*.appspot.com这种语法，所以只能把自己知道的appspot上的应用统统添加。 另一个方法则相对好一点，就是把www.google.cn:80设置成访问appengine.google.com的代理服务器。这种方法很好用，但是需要写PAC文件（Proxy Auto-Config，代理服务器自动配置文件）。所幸这个文件语法相当简单，因此可以直接写下面一段： function FindProxyForURL(url, host) {    if (shExpMatch(host,&#34;*.appspot.com&#34;)) {        return &#34;PROXY www.google.cn:80&#34;;    }    if (shExpMatch(host,&#34;appengine.google.com&#34;)) {        return &#34;PROXY www.google.cn:80&#34;;    }    return &#34;DIRECT&#34;;} 然后保存成一个proxy.pac文件。在浏览器的配置当中，把“自动浏览器配置脚本”的配置项指到这里即可。 你也许会喜欢： 从电子书分发网络书仓网说说电子书阅读 一些智力题 [翻译] [RabbitMQ+Python入门经典] 兔子和兔子窝 WordPress]]></description>
			<content:encoded><![CDATA[<p>最近玩Google App Engine，发现随着闹运会的结束，这个东西也重新不可访问了。今天偶然在<a target="_blank" href="http://www.newsmth.org/">SMTH</a>的Python版上<a target="_blank" href="http://www.newsmth.net/bbscon.php?bid=284&amp;id=47355">看到的</a>。非常实用的一个方法，原始作者不可考，于是整理一下写在这里。</p>
<p>简单的说，Google的所有服务都是可以通过一个相同的服务器访问到，Google根据请求的URL当中的域名来决定应该定向到哪个服务。www.google.cn一样可以访问到所有的服务，例如App Engine。但是因为DNS服务器的原因，appengine.google.com会被定向到Google美国的服务器，不会去连接www.google.cn。但是事实上，如果我们能够向www.google.cn发送一个HTTP请求，其中的URL是指向appengine.google.com的，服务器一样能够帮我们中转请求，并把结果会传给我们。</p>
<p>要达到这个目的有两个方法，一个是修改hosts，让appengine.google.com和*.appspot.com指向到www.google.cn的IP地址。这个有两个劣势，一个是www.google.cn其实有很多个地址做负载均衡，一旦加上了hosts条目，就失去了负载均衡的好处；另一个劣势是hosts文件不支持*.appspot.com这种语法，所以只能把自己知道的appspot上的应用统统添加。</p>
<p>另一个方法则相对好一点，就是把www.google.cn:80设置成访问appengine.google.com的代理服务器。这种方法很好用，但是需要写PAC文件（<a target="_blank" href="http://en.wikipedia.org/wiki/Proxy_auto-config">Proxy Auto-Config</a>，代理服务器自动配置文件）。所幸这个文件语法相当简单，因此可以直接写下面一段：</p>
<p>function FindProxyForURL(url, host) {<br />    if (shExpMatch(host,&quot;*.appspot.com&quot;)) {<br />        return &quot;PROXY www.google.cn:80&quot;;<br />    }<br />    if (shExpMatch(host,&quot;appengine.google.com&quot;)) {<br />        return &quot;PROXY www.google.cn:80&quot;;<br />    }<br />    return &quot;DIRECT&quot;;<br />}</p>
<p>然后保存成一个proxy.pac文件。在浏览器的配置当中，把“自动浏览器配置脚本”的配置项指到这里即可。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2009/11/ebook-distribution-network-shuchang/" rel="bookmark" title="2009年11月19日">从电子书分发网络书仓网说说电子书阅读</a></li>
<li><a href="http://blog.ftofficer.com/2007/10/%e4%b8%80%e4%ba%9b%e6%99%ba%e5%8a%9b%e9%a2%98/" rel="bookmark" title="2007年10月6日">一些智力题</a></li>
<li><a href="http://blog.ftofficer.com/2010/03/translation-rabbitmq-python-rabbits-and-warrens/" rel="bookmark" title="2010年03月14日">[翻译] [RabbitMQ+Python入门经典] 兔子和兔子窝</a></li>
<li><a href="http://blog.ftofficer.com/2009/08/wordpress-283-remote-admin-reset-password-vul/" rel="bookmark" title="2009年08月12日">WordPress <= 2.8.3 管理员密码远程重置漏洞（及绕过方案）</a></li>
<li><a href="http://blog.ftofficer.com/2009/12/python-multiprocessing-2-object-sharing-across-process/" rel="bookmark" title="2009年12月7日">Python multiprocessing 使用手记[2] – 跨进程对象共享</a></li>
</ul>
<p><!-- Similar Posts took 25.492 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2008/09/%e7%94%a8google-cn%e5%81%9aproxy%e8%ae%bf%e9%97%aegoogle%e7%9a%84%e6%9c%8d%e5%8a%a1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>如何修改翰林V3的固件</title>
		<link>http://blog.ftofficer.com/2008/05/%e5%a6%82%e4%bd%95%e4%bf%ae%e6%94%b9%e7%bf%b0%e6%9e%97v3%e7%9a%84%e5%9b%ba%e4%bb%b6/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2008/05/%e5%a6%82%e4%bd%95%e4%bf%ae%e6%94%b9%e7%bf%b0%e6%9e%97v3%e7%9a%84%e5%9b%ba%e4%bb%b6/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 18:27:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[eink设备]]></category>
		<category><![CDATA[ebookreader]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[hanlin-v3]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9956</guid>
		<description><![CDATA[首先说明什么是翰林V3：这是一款使用E-ink的电子书阅读设备。如果你不知道这个东西是什么，那么本文剩下的部分可以不用看了。 本来这个主题是要写如何修改翰林V3的显示字体，因为宋体显示中文还可以，但是英文简直是惨不忍睹。结果花了不少的功夫把宋体焕成了雅黑之后，今天早上去论坛看看，却发现翰林很适时地推出了一款新的固件，可以自由选择书籍显示的字体。详细的介绍也有人贴了出来。所以就把标题改成了“如何修改翰林V3的固件”。因为我所作的工作也就是修改了一下固件而已。 首先需要声明：修改固件存在风险，请务必先备份阅读器上的重要数据，并且准备好官方固件，准备吃后悔药。同时修改的固件可能会导致阅读器无法开机甚至无法恢复，请自行担负其风险，本人对此不负责。 OK，现在开始正题。 首先你需要一些工具。必需的第一个东西是Linux操作系统，我使用Debian，因此下面的介绍均以Debian为例。在你的Linux上面请保证有下列的程序或者包：hg (Mercurial Distributed SCM) 或 git (Fast Version Control System)gccddmtd-tools (for mkfs.jffs2)mkcramfs 在Debian上可以执行下列的一串命令来确保它们都在：$su#apt-get install mercurial#apt-get install git-core#apt-get install gcc-4.1#apt-get install mtd-tools#apt-get install mkcramfs 然后你需要一个项目的源代码，OpenInkpot。目前可以通过hg或者git获得，但是hg不久就会停止。获取方式主页上面有。目前可以用这个命令：$ hg clone http://hg.openinkpot.org/trunk openinkpot-trunk 获取到代码之后，不需要编译整个项目，否则你需要花掉几十个小时外加十多GB的磁盘。你所需要的只是进入到目录utils/mkv3update当中，执行$ CC=gcc make即可获得一个mkv3update的程序。这个程序将用来生成我们修改过的翰林v3固件。 把这个mkv3update程序，连同utils/mkv3update/scripts目录下面的firmeware_unpack.sh文件一同拷贝到某个地方。 下一步的工作就是找到你要修改的原始固件。通常就是V3update.bin文件，把它也拷贝到上面两个程序所在的目录。 将下面的代码写入一个脚本程序，例如patch-v3-update： &#8211;脚本开始&#8211; #! /bin/bash if [ ! -e V3update.bin ]; then    echo No Hanlin firmware \(V3update.bin\) present.fi if [...]]]></description>
			<content:encoded><![CDATA[<p>首先说明什么是翰林V3：这是一款使用E-ink的电子书阅读设备。<br />如果你不知道这个东西是什么，那么本文剩下的部分可以不用看了。</p>
<p>本来这个主题是要写如何修改翰林V3的显示字体，因为宋体显示中文还可以，但是英文简直是惨不忍睹。结果花了不少的功夫把宋体焕成了雅黑之后，今天早上去论坛看看，却发现翰林很适时地推出了一款<a target="_blank" href="http://www.jinke.com.cn/Compagesql/English/service/update.asp">新的固件</a>，可以自由选择书籍显示的字体。<a target="_blank" href="http://bbs.baizhan.com.cn/thread-67128-1-1.html">详细的介绍</a>也有人贴了出来。所以就把标题改成了“如何修改翰林V3的固件”。因为我所作的工作也就是修改了一下固件而已。</p>
<p>首先需要声明：修改固件存在风险，请务必先备份阅读器上的重要数据，并且准备好官方固件，准备吃后悔药。同时修改的固件可能会导致阅读器无法开机甚至无法恢复，请自行担负其风险，本人对此不负责。</p>
<p>OK，现在开始正题。</p>
<p>首先你需要一些工具。必需的第一个东西是Linux操作系统，我使用Debian，因此下面的介绍均以Debian为例。<br />在你的Linux上面请保证有下列的程序或者包：<br /><a target="_blank" href="http://www.selenic.com/mercurial/wiki/">hg</a> (Mercurial Distributed SCM) 或 <a target="_blank" href="http://git.or.cz/">git</a> (Fast Version Control System)<br />gcc<br />dd<br />mtd-tools (for mkfs.jffs2)<br />mkcramfs</p>
<p>在Debian上可以执行下列的一串命令来确保它们都在：<br />$su<br />#apt-get install mercurial<br />#apt-get install git-core<br />#apt-get install gcc-4.1<br />#apt-get install mtd-tools<br />#apt-get install mkcramfs</p>
<p>然后你需要一个项目的源代码，<a target="_blank" href="http://openinkpot.org">OpenInkpot</a>。目前可以通过hg或者git获得，但是hg不久就会停止。获取方式<a target="_blank" href="http://www.openinkpot.org/wiki/DevelopmentInformation">主页</a>上面有。目前可以用这个命令：<br />$ hg clone http://hg.openinkpot.org/trunk openinkpot-trunk</p>
<p>获取到代码之后，不需要编译整个项目，否则你需要花掉几十个小时外加十多GB的磁盘。你所需要的只是进入到目录utils/mkv3update当中，执行<br />$ CC=gcc make<br />即可获得一个mkv3update的程序。这个程序将用来生成我们修改过的翰林v3固件。</p>
<p>把这个mkv3update程序，连同utils/mkv3update/scripts目录下面的firmeware_unpack.sh文件一同拷贝到某个地方。</p>
<p>下一步的工作就是找到你要修改的原始固件。通常就是V3update.bin文件，把它也拷贝到上面两个程序所在的目录。</p>
<p>将下面的代码写入一个脚本程序，例如patch-v3-update：</p>
<p>&#8211;脚本开始&#8211;</p>
<p><span style="font-family:Courier New">#! /bin/bash</p>
<p>if [ ! -e V3update.bin ]; then<br />    echo No Hanlin firmware \(V3update.bin\) present.<br />fi</p>
<p>if [ -e V3update.bin.patch ]; then<br />    rm V3update.bin.patch<br />fi</p>
<p>if [ -d tmp ]; then<br />    umount tmp/root_fs<br />    rm -r tmp<br />fi</p>
<p>mkdir tmp<br />mkdir tmp/root_fs<br />mkdir tmp/root_fs_patch<br /># mkdir tmp/ro_fs</p>
<p>. ./firmware_unpack.sh V3update.bin tmp</p>
<p>mount -o loop tmp/root.fs tmp/root_fs<br />cp -a tmp/root_fs/* tmp/root_fs_patch</p>
<p><span style="color:rgb(255, 0, 0)">if [ -e ./do-patch-rootfs ]; then</span><br style="color:rgb(255, 0, 0)" /><span style="color:rgb(255, 0, 0)">    . ./do-patch-rootfs</span><br style="color:rgb(255, 0, 0)" /><span style="color:rgb(255, 0, 0)">else</span><br style="color:rgb(255, 0, 0)" /><span style="color:rgb(255, 0, 0)">    echo You do not have do-patch-rootfs script.</span><br style="color:rgb(255, 0, 0)" /><span style="color:rgb(255, 0, 0)">fi</span></p>
<p>mkcramfs tmp/root_fs_patch/ tmp/root.fs.patch</p>
<p>./mkv3update &#8211;write-hanlin=V3update.bin.patch tmp/zImage tmp/ro.fs tmp/root.fs.patch tmp/logo tmp/jffs2.fs<br /></span><br />&#8211;脚本结束&#8211;</p>
<p>注意脚本当中标红色的部分。将这部分作为分界线，脚本的前面部分就做了众多的解开V3update.bin，并且将其中内容解到一个tmp/root_fs_patch的目录当中的工作，你可以把这部分单独拷贝出来执行。执行之后，到tmp/root_fs_patch/root/下面看看，这就是翰林V3当中的文件系统结构。在这个目录当中，你可以随意修改其中的内容，当然包括tmp/root_fs_patch/root/fonts/truetype当中的字体文件。</p>
<p>修改完毕之后，即可执行红色部分之后的命令，这些命令把修改过的文件打包生成一个新的文件文件，称为V3update.bin.patch。只要将其拷贝到SD卡的根目录，然后重命名为V3update.bin，即可按照翰林V3正常的固件省级方式进行升级。</p>
<p>经过我的实验，只要将其中的simsun.ttc/simsun.ttf文件一起删除，然后用msyh.ttf拷贝到其中，重命名为simsun.ttf，再建立软链接simsun.ttc指向它，即可实现书架和默认的chm，txt，wol文件都使用雅黑字体了。</p>
<p>如果你想将工作自动化，直接在patch-v3-update脚本的相同目录下面写一个do-patch-rootfs的脚本，就可以自动由该脚本调用了。</p>
<p>自己做了一个翰林V3的一经替换了雅黑字体的固件，基于翰林最近的2008-04-25版本，目前用起来还没有任何的问题。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2009/12/liboi-initialized/" rel="bookmark" title="2009年12月23日">liboi &#8211; 管理基于OpenInkpot的电子书设备的支持库</a></li>
<li><a href="http://blog.ftofficer.com/2009/08/twitter-weekly-updates-for-2009-08-09-2/" rel="bookmark" title="2009年08月9日">Twitter Weekly Updates for 2009-08-09</a></li>
<li><a href="http://blog.ftofficer.com/2007/07/effective-debug-logging-part-3/" rel="bookmark" title="2007年07月23日">Effective Debug Logging (part 3)</a></li>
<li><a href="http://blog.ftofficer.com/projects/" rel="bookmark" title="2009年07月19日">我的项目</a></li>
<li><a href="http://blog.ftofficer.com/projects/openinkpot/" rel="bookmark" title="2009年11月22日">OpenInkpot</a></li>
</ul>
<p><!-- Similar Posts took 12.817 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2008/05/%e5%a6%82%e4%bd%95%e4%bf%ae%e6%94%b9%e7%bf%b0%e6%9e%97v3%e7%9a%84%e5%9b%ba%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>修正VeryCD在启用AdBlock Plus的情况下的版面混乱问题的脚本</title>
		<link>http://blog.ftofficer.com/2008/03/%e4%bf%ae%e6%ad%a3verycd%e5%9c%a8%e5%90%af%e7%94%a8adblock-plus%e7%9a%84%e6%83%85%e5%86%b5%e4%b8%8b%e7%9a%84%e7%89%88%e9%9d%a2%e6%b7%b7%e4%b9%b1%e9%97%ae%e9%a2%98%e7%9a%84%e8%84%9a%e6%9c%ac/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2008/03/%e4%bf%ae%e6%ad%a3verycd%e5%9c%a8%e5%90%af%e7%94%a8adblock-plus%e7%9a%84%e6%83%85%e5%86%b5%e4%b8%8b%e7%9a%84%e7%89%88%e9%9d%a2%e6%b7%b7%e4%b9%b1%e9%97%ae%e9%a2%98%e7%9a%84%e8%84%9a%e6%9c%ac/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 15:51:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[我的作品]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[verycd]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9945</guid>
		<description><![CDATA[VeryCD是个不错的网站，除了在每个页面上面出现的flash广告（见下图）。当然我也知道VeryCD维持生存基本上要靠广告，但是经常搞死我浏览器的flash广告，我是不得已把它过滤掉的。 Firefox对于广告的解决方案当然是AdBlock Plus。这个插件可以按照通配符或者正则表达式来封锁广告。如果你不懂通配符或者正则表达式，直接用鼠标点点基本上也是可以解决问题的。通过在其中添加一条规则封锁 http://222.37.134.*/*.htm*，顺利达到了封锁VeryCD上面的flash广告的目的。 但是随之而来的问题是，因为过滤掉了一个iframe，整个页面布局就有了一些问题，资源详细信息因为布局的缘故无法显示（见下图）。 为了能够让它显示出来，只好另外再打一层补丁。这次用Greasemonkey，让它在加载VeryCD页面的时候在原本显示广告的地方显示另外一个东西来占个位置，自然就能够让详细信息部分显示了。 在这里显示什么呢？看了几个VeryCD页面之后，发现大多数的页面上面在简介部分都有至少一幅图片。按理说把第一副图片按比例缩小放在其中应该可以吧。最后结果见下图： 最后贴Greasemonkey脚本的代码。请将其拷贝到记事本保存为“所有文件”，文件名选择.user.js结束。保存后拖动到Firefox（事先需要安装了Greasemonkey），确定即可安装。 == 代码开始，请不要拷贝这一行 ==// ==UserScript==// @name           Re-format VeryCD item detail// @namespace      http://ftofficer.spaces.live.com// @description    Re-format VeryCD item detail// @include        http://www.verycd.com/topics/*// ==/UserScript==function findFirstImg() {  var paras = document.getElementsByTagName(&#8216;p&#8217;);  for (var i=0; i&#60;paras.length; ++i) {    var p = paras[i];    if ( p.getAttribute(&#8216;class&#8217;) == &#8216;inner_content&#8217;) {      var imgs = p.getElementsByTagName(&#8216;img&#8217;);      if ( [...]]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://www.verycd.com"> VeryCD</a>是个不错的网站，除了在每个页面上面出现的flash广告（见下图）。当然我也知道VeryCD维持生存基本上要靠广告，但是经常搞死我浏览器的flash广告，我是不得已把它过滤掉的。<br /><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW-T8EgSmug3F2wPq7X0NqhrRLUx00IVBM94SSZl_nkZkYQApleBuaycBxhsLPwyQug" /></p>
<p>Firefox对于广告的解决方案当然是<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/1865">AdBlock Plus</a>。这个插件可以按照通配符或者正则表达式来封锁广告。如果你不懂通配符或者正则表达式，直接用鼠标点点基本上也是可以解决问题的。通过在其中添加一条规则封锁 http://222.37.134.*/*.htm*，顺利达到了封锁VeryCD上面的flash广告的目的。</p>
<p>但是随之而来的问题是，因为过滤掉了一个iframe，整个页面布局就有了一些问题，资源详细信息因为布局的缘故无法显示（见下图）。<br /><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW8l8l4c_9Gh40AsLPJAlONTCdnZrk3A87WXkPCxJaboI0b67ex6_vS2bd_gibSF0lg" /></p>
<p>为了能够让它显示出来，只好另外再打一层补丁。这次用<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a>，让它在加载VeryCD页面的时候在原本显示广告的地方显示另外一个东西来占个位置，自然就能够让详细信息部分显示了。</p>
<p>在这里显示什么呢？看了几个VeryCD页面之后，发现大多数的页面上面在简介部分都有至少一幅图片。按理说把第一副图片按比例缩小放在其中应该可以吧。最后结果见下图：<br /><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW_Uy2nw-cPgPeD_rvvF7McgY0tKEO9ncTJM9cgtw1aITu7n-EVAegtInHbZ0DEeGBM" /></p>
<p>最后贴Greasemonkey脚本的代码。请将其拷贝到记事本保存为“所有文件”，文件名选择.user.js结束。保存后拖动到Firefox（事先需要安装了Greasemonkey），确定即可安装。</p>
<p>== 代码开始，请不要拷贝这一行 ==<br /><font size="2"><span style="font-family:Courier New">// ==UserScript==</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @name           Re-format VeryCD item detail</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @namespace      http://ftofficer.spaces.live.com</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @description    Re-format VeryCD item detail</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @include        http://www.verycd.com/topics/*</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// ==/UserScript==</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">function findFirstImg() {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  var paras = document.getElementsByTagName(&#8216;p&#8217;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  for (var i=0; i&lt;paras.length; ++i) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    var p = paras[i];</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    if ( p.getAttribute(&#8216;class&#8217;) == &#8216;inner_content&#8217;) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      var imgs = p.getElementsByTagName(&#8216;img&#8217;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      if ( imgs &amp;&amp; imgs.length &gt; 0 ) </span><br style="font-family:Courier New" /><span style="font-family:Courier New">        return imgs[0];</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  </span><br style="font-family:Courier New" /><span style="font-family:Courier New">  return null;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">}</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">function getScale(imgWidth, imgHeight, divWidth, divHeight) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  var wScale = divWidth * 1. / imgWidth;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  var hScale = divHeight * 1. / imgHeight;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  </span><br style="font-family:Courier New" /><span style="font-family:Courier New">  if ( wScale &gt; 1. &amp;&amp; hScale &gt; 1. ) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    return 1.;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  </span><br style="font-family:Courier New" /><span style="font-family:Courier New">  return wScale &lt; hScale ? wScale : hScale;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">}</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">function fixupVeryCDDetailPage() {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  var moreInfo = document.getElementById(&#8216;moreInfo&#8217;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  if ( moreInfo ) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    var frame = document.createElement(&#8216;div&#8217;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    frame.setAttribute(&#8216;class&#8217;, &#8216;Banner1&#8242;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    frame.width = 300;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    frame.height = 250;</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">    firstImg = findFirstImg();</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    if ( firstImg ) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      var img = document.createElement(&#8216;img&#8217;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      img.src = firstImg.src;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      var imgScale = getScale(img.width, img.height, frame.width, frame.height);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      img.width = Math.floor(img.width * imgScale);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      img.height = Math.floor(img.height * imgScale);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      frame.appendChild(img);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    </span><br style="font-family:Courier New" /><span style="font-family:Courier New">    if ( moreInfo.parentNode ) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      moreInfo.parentNode.insertBefore(frame, moreInfo);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">}</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">fixupVeryCDDetailPage();</span></font><br />== 代码结束，请不要拷贝这一行 ==</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2007/11/%e8%a7%a3%e5%86%b3%e5%9c%a8firefox%e4%b8%8b%e9%9d%a2live-space%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%8c%89%e9%92%ae%e8%a2%ab%e7%a6%81%e7%94%a8%e7%9a%84%e9%97%ae%e9%a2%98/" rel="bookmark" title="2007年11月7日">解决在Firefox下面Live Space“发布日志”按钮被禁用的问题</a></li>
<li><a href="http://blog.ftofficer.com/2009/08/wordpress-283-remote-admin-reset-password-vul/" rel="bookmark" title="2009年08月12日">WordPress <= 2.8.3 管理员密码远程重置漏洞（及绕过方案）</a></li>
<li><a href="http://blog.ftofficer.com/2008/01/live-space%e7%9a%84%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%81%a2%e5%a4%8d%e6%ad%a3%e5%b8%b8%e4%ba%86/" rel="bookmark" title="2008年01月27日">Live Space的“发布日志”恢复正常了</a></li>
<li><a href="http://blog.ftofficer.com/2007/09/think-different/" rel="bookmark" title="2007年09月18日">Think Different</a></li>
<li><a href="http://blog.ftofficer.com/2007/10/%e4%b8%80%e4%ba%9b%e6%99%ba%e5%8a%9b%e9%a2%98/" rel="bookmark" title="2007年10月6日">一些智力题</a></li>
</ul>
<p><!-- Similar Posts took 9.093 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2008/03/%e4%bf%ae%e6%ad%a3verycd%e5%9c%a8%e5%90%af%e7%94%a8adblock-plus%e7%9a%84%e6%83%85%e5%86%b5%e4%b8%8b%e7%9a%84%e7%89%88%e9%9d%a2%e6%b7%b7%e4%b9%b1%e9%97%ae%e9%a2%98%e7%9a%84%e8%84%9a%e6%9c%ac/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Live Space的“发布日志”恢复正常了</title>
		<link>http://blog.ftofficer.com/2008/01/live-space%e7%9a%84%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%81%a2%e5%a4%8d%e6%ad%a3%e5%b8%b8%e4%ba%86/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2008/01/live-space%e7%9a%84%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%81%a2%e5%a4%8d%e6%ad%a3%e5%b8%b8%e4%ba%86/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 11:19:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[我的作品]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[livespace]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9931</guid>
		<description><![CDATA[今天打开Space准备写blog，却发现“发布日志”按钮仍然是灰掉的，看看Greasemonkey的脚本状态已经启用了，难道M$会ws到连我这个第三方开发者都不放过？接下来就是分析一下看看有什么变动，然后更新一下脚本。但是看来看去文档的结构都没有变化，Greasemonkey脚本的运行也很正常。 无意之中在标题当中填了几个字符，竟然发现“发布日志”按钮启用了！然后把Greasemonkey的用户脚本设置成禁用，刷新页面，输入标题，“发布日志”和“保存为草稿”立即启用了。 原来我误解了M$，其实是M$做了点工作恢复了Space的bug，看来我的Greasemonkey脚本可以退休了。 不过暂时还是保留在那里吧，不知道哪天会再次出现问题。 你也许会喜欢： CALL指令有多少种写法 这个十一 解决在Firefox下面Live Space“发布日志”按钮被禁用的问题 又一部偷懒的片子~ liboi &#8211; 管理基于OpenInkpot的电子书设备的支持库]]></description>
			<content:encoded><![CDATA[<p>今天打开Space准备写blog，却发现“发布日志”按钮仍然是灰掉的，看看Greasemonkey的脚本状态已经启用了，难道M$会ws到连我这个第三方开发者都不放过？接下来就是分析一下看看有什么变动，然后更新一下脚本。但是看来看去文档的结构都没有变化，Greasemonkey脚本的运行也很正常。</p>
<p>无意之中在标题当中填了几个字符，竟然发现“发布日志”按钮启用了！然后把Greasemonkey的用户脚本设置成禁用，刷新页面，输入标题，“发布日志”和“保存为草稿”立即启用了。</p>
<p>原来我误解了M$，其实是M$做了点工作恢复了Space的bug，看来我的Greasemonkey脚本可以退休了。</p>
<p>不过暂时还是保留在那里吧，不知道哪天会再次出现问题。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2010/04/n-forms-of-call-instructions/" rel="bookmark" title="2010年04月4日">CALL指令有多少种写法</a></li>
<li><a href="http://blog.ftofficer.com/2007/10/%e8%bf%99%e4%b8%aa%e5%8d%81%e4%b8%80/" rel="bookmark" title="2007年10月7日">这个十一</a></li>
<li><a href="http://blog.ftofficer.com/2007/11/%e8%a7%a3%e5%86%b3%e5%9c%a8firefox%e4%b8%8b%e9%9d%a2live-space%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%8c%89%e9%92%ae%e8%a2%ab%e7%a6%81%e7%94%a8%e7%9a%84%e9%97%ae%e9%a2%98/" rel="bookmark" title="2007年11月7日">解决在Firefox下面Live Space“发布日志”按钮被禁用的问题</a></li>
<li><a href="http://blog.ftofficer.com/2007/05/%e5%8f%88%e4%b8%80%e9%83%a8%e5%81%b7%e6%87%92%e7%9a%84%e7%89%87%e5%ad%90/" rel="bookmark" title="2007年05月13日">又一部偷懒的片子~</a></li>
<li><a href="http://blog.ftofficer.com/2009/12/liboi-initialized/" rel="bookmark" title="2009年12月23日">liboi &#8211; 管理基于OpenInkpot的电子书设备的支持库</a></li>
</ul>
<p><!-- Similar Posts took 10.800 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2008/01/live-space%e7%9a%84%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%81%a2%e5%a4%8d%e6%ad%a3%e5%b8%b8%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>搞定了Spam Comments的自动探测和删除</title>
		<link>http://blog.ftofficer.com/2008/01/%e6%90%9e%e5%ae%9a%e4%ba%86spam-comments%e7%9a%84%e8%87%aa%e5%8a%a8%e6%8e%a2%e6%b5%8b%e5%92%8c%e5%88%a0%e9%99%a4/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2008/01/%e6%90%9e%e5%ae%9a%e4%ba%86spam-comments%e7%9a%84%e8%87%aa%e5%8a%a8%e6%8e%a2%e6%b5%8b%e5%92%8c%e5%88%a0%e9%99%a4/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 17:15:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[spamment]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9930</guid>
		<description><![CDATA[最近工作比较忙，所以只能下了班搞搞这个东西。今天终于搞定了，然后看着数十个Spam Comment瞬间搞定还是很有成就感的。 这个问题的关键在两个问题上：第一，如何得到一个Spam Comment的列表；第二，如何删除它们。 先考虑第二个问题。其实不管Space的代码多复杂，最后对Blog的操作还是要经过HTTP传输的。截获HTTP传输数据的方案有很多，我用的是TamperData这个Firefox扩展。简单的找两个Comments删除一下，发现对应的HTTP请求是这样的： POST http://ftofficer.spaces.live.com/parts/blog/script/BlogService.fpp?cnmn=Microsoft.Spaces.Web.Parts.BlogPart.FireAnt.BlogService.delete_items&#38;ptid=0&#38;a=&#38;au=undefined HTTP/1.1Host: ftofficer.spaces.live.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5Accept-Language: zh-cn,zh;q=0.7,en-us;q=0.3Accept-Encoding: gzip,deflateAccept-Charset: UTF-8,*Connection: closeContent-Type: application/x-www-form-urlencodedX-FPP-Command: 0sc: [...]Referer: [...]Content-Length: 117Cookie: [....]Pragma: no-cacheCache-Control: no-cache cn=Microsoft.Spaces.Web.Parts.BlogPart.FireAnt.BlogService&#38;mn=delete_items&#38;d=[{1,%22cns!423B72634E2F6B7E!611%22}]&#38;v2 其中最重要的东西就是红色标记的部分，前面Cookie是作为你已经登录到Live Space的证据；后面的一串字符串就是要删除的Comment的ID。所以我们需要的工作就是获取到这个ID，然后使用HTTP重放就可以了。最后我直接偷懒用了NetCat，写了一个Request的模板，用Perl替换一下其中的ID，用NC连上Live Space然后重放就是了。方法就是这样，如果要做成软件可能还比较麻烦一点，看看有空再搞，最近实在太忙。 然后回到第一个问题，我们需要获取到所有的Spam Comments的列表，这个问题不可避免的就要把Space爬一遍，枚举当中所有的Comments的内容，并一一判断。如果符合某种条件，就将其ID记录下来。不过要从头分析Space的页面结构并且枚举出ID和内容也是个很好大的工程，不如找找有没有现成的方案。经过一番Google，找到了Live Space Mover这个项目。这个项目当中包括了枚举Live Space当中所有的Comments的功能，功能不错。但是不足的是只能获取到的是Comments的内容，发送者这些信息，不包括对我来说最重要的ID，不过这不是什么大问题，Python的脚本在哪里放着，代码改改就行了。这段代码改过之后，花10分钟把Blog爬了一遍，成功生成列表，然后拿perl解析一下，调用一下nc，搞定。 方案是有了，有空整理一下，做一个点点鼠标就能搞定的东西，或者一个命令行搞定的东西。 再说再说，忙得很。有没有人自愿报名实践一下的？ 你也许会喜欢： Herb Sutter Gave up Live Space due to Comment Spams blog迁移通告 [...]]]></description>
			<content:encoded><![CDATA[<p>最近工作比较忙，所以只能下了班搞搞这个东西。今天终于搞定了，然后看着数十个Spam Comment瞬间搞定还是很有成就感的。</p>
<p>这个问题的关键在两个问题上：第一，如何得到一个Spam Comment的列表；第二，如何删除它们。</p>
<p>先考虑第二个问题。其实不管Space的代码多复杂，最后对Blog的操作还是要经过HTTP传输的。截获HTTP传输数据的方案有很多，我用的是<a target="_blank" href="http://addons.mozilla.org/firefox/addon/966">TamperData</a>这个Firefox扩展。简单的找两个Comments删除一下，发现对应的HTTP请求是这样的：
<pre>POST http://ftofficer.spaces.live.com/parts/blog/script/BlogService.fpp?cnmn=Microsoft.Spaces.Web.Parts.BlogPart.FireAnt.BlogService.delete_items&amp;ptid=0&amp;a=&amp;au=undefined HTTP/1.1Host: ftofficer.spaces.live.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5Accept-Language: zh-cn,zh;q=0.7,en-us;q=0.3Accept-Encoding: gzip,deflateAccept-Charset: UTF-8,*Connection: closeContent-Type: application/x-www-form-urlencodedX-FPP-Command: 0sc: [...]Referer: [...]Content-Length: 117<span style="color:rgb(255, 0, 0)">Cookie: [....]</span><br style="color:rgb(255, 0, 0)" />Pragma: no-cacheCache-Control: no-cache

cn=Microsoft.Spaces.Web.Parts.BlogPart.FireAnt.BlogService&amp;mn=delete_items&amp;d=[{1,%22<span style="color:rgb(255, 0, 0)">cns!423B72634E2F6B7E!611</span>%22}]&amp;v2</pre>
<p>其中最重要的东西就是红色标记的部分，前面Cookie是作为你已经登录到Live Space的证据；后面的一串字符串就是要删除的Comment的ID。所以我们需要的工作就是获取到这个ID，然后使用HTTP重放就可以了。最后我直接偷懒用了NetCat，写了一个Request的模板，用Perl替换一下其中的ID，用NC连上Live Space然后重放就是了。方法就是这样，如果要做成软件可能还比较麻烦一点，看看有空再搞，最近实在太忙。</p>
<p>然后回到第一个问题，我们需要获取到所有的Spam Comments的列表，这个问题不可避免的就要把Space爬一遍，枚举当中所有的Comments的内容，并一一判断。如果符合某种条件，就将其ID记录下来。不过要从头分析Space的页面结构并且枚举出ID和内容也是个很好大的工程，不如找找有没有现成的方案。经过一番Google，找到了<a target="_blank" href="http://blog.broom9.com/?page_id=519">Live Space Mover</a>这个项目。这个项目当中包括了枚举Live Space当中所有的Comments的功能，功能不错。但是不足的是只能获取到的是Comments的内容，发送者这些信息，不包括对我来说最重要的ID，不过这不是什么大问题，Python的脚本在哪里放着，代码改改就行了。这段代码改过之后，花10分钟把Blog爬了一遍，成功生成列表，然后拿perl解析一下，调用一下nc，搞定。</p>
<p>方案是有了，有空整理一下，做一个点点鼠标就能搞定的东西，或者一个命令行搞定的东西。</p>
<p>再说再说，忙得很。有没有人自愿报名实践一下的？</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2008/04/herb-sutter-gave-up-live-space-due-to-comment-spams/" rel="bookmark" title="2008年04月7日">Herb Sutter Gave up Live Space due to Comment Spams</a></li>
<li><a href="http://blog.ftofficer.com/2007/05/blog%e8%bf%81%e7%a7%bb%e9%80%9a%e5%91%8a/" rel="bookmark" title="2007年05月9日">blog迁移通告</a></li>
<li><a href="http://blog.ftofficer.com/2007/11/%e8%a7%a3%e5%86%b3%e5%9c%a8firefox%e4%b8%8b%e9%9d%a2live-space%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%8c%89%e9%92%ae%e8%a2%ab%e7%a6%81%e7%94%a8%e7%9a%84%e9%97%ae%e9%a2%98/" rel="bookmark" title="2007年11月7日">解决在Firefox下面Live Space“发布日志”按钮被禁用的问题</a></li>
<li><a href="http://blog.ftofficer.com/2008/02/%e8%bf%98%e8%ae%b0%e5%be%97blog-comment-spam%e4%b9%88%ef%bc%9f/" rel="bookmark" title="2008年02月24日">还记得Blog Comment Spam么？</a></li>
<li><a href="http://blog.ftofficer.com/2008/01/blog%e5%86%8d%e6%ac%a1%e8%a2%abspam/" rel="bookmark" title="2008年01月22日">Blog再次被Spam</a></li>
</ul>
<p><!-- Similar Posts took 7.098 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2008/01/%e6%90%9e%e5%ae%9a%e4%ba%86spam-comments%e7%9a%84%e8%87%aa%e5%8a%a8%e6%8e%a2%e6%b5%8b%e5%92%8c%e5%88%a0%e9%99%a4/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>解决在Firefox下面Live Space“发布日志”按钮被禁用的问题</title>
		<link>http://blog.ftofficer.com/2007/11/%e8%a7%a3%e5%86%b3%e5%9c%a8firefox%e4%b8%8b%e9%9d%a2live-space%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%8c%89%e9%92%ae%e8%a2%ab%e7%a6%81%e7%94%a8%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2007/11/%e8%a7%a3%e5%86%b3%e5%9c%a8firefox%e4%b8%8b%e9%9d%a2live-space%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%8c%89%e9%92%ae%e8%a2%ab%e7%a6%81%e7%94%a8%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 18:13:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[我的作品]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[livespace]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9907</guid>
		<description><![CDATA[也许你发现了上面的帖子。这个帖子是我在进行测试，看看能不能启用Live Space的“发布日志”按钮。事实上是成功了，特将其分享给大家。 首先，你需要安装Firefox扩展 greasemonkey。这个扩展可以使你在加载一个页面的时候执行一段你自己的Javascript程序。 安装之后，将下面的程序拷贝到一个文本文件，并把扩展名改成 .user.js。（务必是.user.js，否则greasemonkey无法自动安装之）。 ===脚本开始，拷贝时请不要包含这一行===// ==UserScript==// @name           Enable Live Space Post Button// @namespace      http://ftofficer.spaces.live.com// @description    Enable Live Space Post Button// @include        http://*.spaces.live.com/*// ==/UserScript==function LiveSpace_enableButton(id) {  var button = document.getElementById(id);  if ( button ) {    var cls = button.getAttribute(&#34;class&#34;);    var clsNameEnd = cls.indexOf(&#34;spDisabled&#34;);    if ( clsNameEnd != -1 ) {      clsNameEnd&#8211;;   // skip &#34; [...]]]></description>
			<content:encoded><![CDATA[<p>也许你发现了上面的帖子。<br />这个帖子是我在进行测试，看看能不能启用Live Space的“发布日志”按钮。<br />事实上是成功了，特将其分享给大家。</p>
<p>首先，你需要安装Firefox扩展 <a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/748">greasemonkey</a>。这个扩展可以使你在加载一个页面的时候执行一段你自己的Javascript程序。</p>
<p>安装之后，将下面的程序拷贝到一个文本文件，并把扩展名改成 .user.js。（务必是.user.js，否则greasemonkey无法自动安装之）。</p>
<p>===脚本开始，拷贝时请不要包含这一行===<br /><span style="font-family:Courier New">// ==UserScript==</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @name           Enable Live Space Post Button</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @namespace      http://ftofficer.spaces.live.com</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @description    Enable Live Space Post Button</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// @include        http://*.spaces.live.com/*</span><br style="font-family:Courier New" /><span style="font-family:Courier New">// ==/UserScript==</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">function LiveSpace_enableButton(id) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  var button = document.getElementById(id);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  if ( button ) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    var cls = button.getAttribute(&quot;class&quot;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    var clsNameEnd = cls.indexOf(&quot;spDisabled&quot;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    if ( clsNameEnd != -1 ) {</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      clsNameEnd&#8211;;   // skip &quot; &quot; before spDisabled</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      var newCls = cls.substring(0, clsNameEnd);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      </span><br style="font-family:Courier New" /><span style="font-family:Courier New">      button.setAttribute(&quot;class&quot;, newCls);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      button.setAttribute(&quot;mi:state&quot;, &quot;enabled&quot;);</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">      var aNode = document.createElement(&quot;a&quot;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      aNode.id = id;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">      aNode.href = &quot;#&quot;;</span><br style="font-family:Courier New" /><span style="font-family:Courier New">    }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">  }</span><br style="font-family:Courier New" /><span style="font-family:Courier New">}</span><br style="font-family:Courier New" /><br style="font-family:Courier New" /><span style="font-family:Courier New">LiveSpace_enableButton(&quot;actionToolbarBlogPost&quot;);</span><br style="font-family:Courier New" /><span style="font-family:Courier New">LiveSpace_enableButton(&quot;actionToolbarSave&quot;);</span></p>
<p>===脚本结束，拷贝时请不要包含这一行===</p>
<p>然后将这个js文件拖放到Firefox窗口中，greasemonkey会弹出对话框询问是否安装，选择是，即可完成安装。</p>
<p>然后，去Live Space的“添加日志”当中看看吧。</p>
<p>如果看到“发布日志”和“保存为草稿”仍然没有启用的话，请看看greasemonkey当中配置的网直通配符是不是和你的网址一致，自己改改看看。在不行可以在这里回复。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2008/03/%e4%bf%ae%e6%ad%a3verycd%e5%9c%a8%e5%90%af%e7%94%a8adblock-plus%e7%9a%84%e6%83%85%e5%86%b5%e4%b8%8b%e7%9a%84%e7%89%88%e9%9d%a2%e6%b7%b7%e4%b9%b1%e9%97%ae%e9%a2%98%e7%9a%84%e8%84%9a%e6%9c%ac/" rel="bookmark" title="2008年03月2日">修正VeryCD在启用AdBlock Plus的情况下的版面混乱问题的脚本</a></li>
<li><a href="http://blog.ftofficer.com/2008/01/%e6%90%9e%e5%ae%9a%e4%ba%86spam-comments%e7%9a%84%e8%87%aa%e5%8a%a8%e6%8e%a2%e6%b5%8b%e5%92%8c%e5%88%a0%e9%99%a4/" rel="bookmark" title="2008年01月25日">搞定了Spam Comments的自动探测和删除</a></li>
<li><a href="http://blog.ftofficer.com/2008/04/herb-sutter-gave-up-live-space-due-to-comment-spams/" rel="bookmark" title="2008年04月7日">Herb Sutter Gave up Live Space due to Comment Spams</a></li>
<li><a href="http://blog.ftofficer.com/2007/05/blog%e8%bf%81%e7%a7%bb%e9%80%9a%e5%91%8a/" rel="bookmark" title="2007年05月9日">blog迁移通告</a></li>
<li><a href="http://blog.ftofficer.com/2008/01/live-space%e7%9a%84%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%81%a2%e5%a4%8d%e6%ad%a3%e5%b8%b8%e4%ba%86/" rel="bookmark" title="2008年01月27日">Live Space的“发布日志”恢复正常了</a></li>
</ul>
<p><!-- Similar Posts took 7.997 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2007/11/%e8%a7%a3%e5%86%b3%e5%9c%a8firefox%e4%b8%8b%e9%9d%a2live-space%e2%80%9c%e5%8f%91%e5%b8%83%e6%97%a5%e5%bf%97%e2%80%9d%e6%8c%89%e9%92%ae%e8%a2%ab%e7%a6%81%e7%94%a8%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>测试</title>
		<link>http://blog.ftofficer.com/2007/11/%e6%b5%8b%e8%af%95/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2007/11/%e6%b5%8b%e8%af%95/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 17:26:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[我的作品]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[livespace]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9906</guid>
		<description><![CDATA[测试看看是不是“发布日志”已经启用了。 你也许会喜欢： 没有类似的文章]]></description>
			<content:encoded><![CDATA[<p>测试看看是不是“发布日志”已经启用了。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">没有类似的文章
</ul>
<p><!-- Similar Posts took 2.041 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2007/11/%e6%b5%8b%e8%af%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>都是Intel无线网卡驱动惹得祸</title>
		<link>http://blog.ftofficer.com/2007/10/%e9%83%bd%e6%98%afintel%e6%97%a0%e7%ba%bf%e7%bd%91%e5%8d%a1%e9%a9%b1%e5%8a%a8%e6%83%b9%e5%be%97%e7%a5%b8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://blog.ftofficer.com/2007/10/%e9%83%bd%e6%98%afintel%e6%97%a0%e7%ba%bf%e7%bd%91%e5%8d%a1%e9%a9%b1%e5%8a%a8%e6%83%b9%e5%be%97%e7%a5%b8/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 16:18:00 +0000</pubDate>
		<dc:creator>Zhang Cong</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://blog.ftofficer.com/?p=9903</guid>
		<description><![CDATA[连续一段时间在公司使用无线网络上网，一直非常不爽的就是其不稳定——非常不稳定，时断时续。后来仔细研究之后发现，每次经过十几分钟，无线网卡的指示灯就灭掉了，紧接着就是无线网络断掉。过了几秒钟，无线网卡指示灯重新亮起，然后无线网络重新连接——就这样，无限网络不断的通断。 既然已经发现了问题的症结，接下来就是看看为什么会造成这种情况。我的无线网卡是ipw2200 (Intel PRO/Wireless 2200BG)，应该是非常常见和通用的一款无线网卡，至少在Linux下面一直以来驱动不成问题。但是看了一下驱动程序里面的选项，发现驱动程序的时间比较久远了，所以首先还是来更新一下驱动程序吧。 于是到Google上搜索，顺利的找到了Intel的驱动官方站点。从上面的列表当中看，有两个版本的驱动程序可供选择：11.1.1.11/9.0.4.36 版本的Driver Only包，和11.1.1.0 版本的Network Connection Software。我一直觉得硬件这个东西还是有个硬件厂商提供的软件来协助管理比较好，于是没有多想，就把两个都下载了下来。之后运行安装Network Connection Software，安装过程当中笔记本的喇叭（喇叭，不是音箱）突然连续响了N声，直觉告诉我有点问题，但是也没多考虑，安装完毕之后就重新启动了。 不想重新启动之后，先是登录界面上面输入账户密码之后，登录界面好像死掉了一样，等待了大约两分钟才启动到桌面，而且登录进去之后也马上发现不对劲：任务栏上面的快速启动无法显示。虽然之前也出现过类似的问题，但是都是把快速启动删除然后再重新添加就好了。但这次直接报错：无法添加工具栏。 当然我知道，任务栏当中的图标是一组快捷方式，存放在C:\Documents and Settings\&#60;Your User Name&#62;\Application Data\Internet Exploerer\Quick Lunch下面。于是转过去找，竟然发现Application Data下面根本没有Internet Explorer的目录！再试图打开FireFox，竟然直接跳出首次运行的配置导入向导——一切迹象都表明：Application Data目录失踪了！ 幸好我知道sysinternal有一个工具叫做Junction，用来建立目录软链接。所谓的目录软链接好像快捷方式一样，可以让你从一个位置指向另一个位置。但是目录软链接对于上面的应用程序是透明的，只要软链接已经建立好了，比如把C:\test重定向到D:\test，在应用程序看来这两个目录就是完全一样的了，对于C:\test下面的文件访问，也都会被操作系统直接重定向到D:\test下面的相应文件。 幸好我知道这个东西，而且是之前就知道。当年当我发现你根本无法阻止很多程序往我狭窄的C盘上写文件的时候，我就不得不想办法把尽可能多的东西迁移到别的盘上去。最早被我看上的就是Documents and Settings下面的目录：无数的程序把配置文件放在这里（也应该放在这里）。所以我就用软链接把C:\Documents and Settings\&#60;My user name&#62;\Application Data目录重定向到了另一个磁盘分区上，顺便一起被重定向的还有几个同级的目录。这种解决方案的一个坏处就是，如果某个软件作了什么不该做的事情，删掉这个软链接如同删掉一个空目录一样简单：一个RemoveDirectory的系统API调用足以。 那么是不是谁把这个软链接给删掉了呢？用资源管理器是没有办法区分的，但是用命令提示符可以。所以我立即用命令行转到这个目录去看，果然， Application Data已经变成了&#60;DIR&#62;，而不是软链接(&#60;JUNCTION&#62;)了（可惜这里忘记截图留下现场了）。 那么实际的目录内容呢？我立即转到软链接指向的目录观察，万幸的事情：所有的配置文件都还在。 接下来的事情就很简单了，换用另外一个账户登录，使用命令提示符移动到C:\Documents and Settings\&#60;my user name&#62;下面，删除原来的Application Data目录，然后执行junction &#34;Application Data&#34; &#34;E:\path\to\Application Data&#34;，建立了一个新的目录软链接。 重新用自己的账户登录，所有的配置文件都回来了，打开FireFox看到布满插件的状态栏，放心许多。 回顾一下我之前作过的事情，只能让我相信，确实是Intel的安装程序把这个目录删掉了：计算机喇叭的响声也许就是因为有程序发现自己的 Application Data目录被删掉了。而当时在做的事情，就是在安装Intel的应用程序而已。 一个问题已经解决了，但是还有另外一个问题：登录仍然非常的慢，为什么呢？ 你看到的登录界面其实是叫做WinLogon的进程所显示的。而这个WinLogon当中是可以加入许多的自定义模块的。但是这些模块分布在各处，查找起来非常不便。幸运的是sysinternal仍然有一个工具替我们做了这些事情：Autoruns。这个工具运行之后，会有一个WinLogon标签页，当中显示了所有WinLogon注册的组件。请注意图中用红线圈出的部分，这些就是Intel安插在 WinLogon当中的。而登录的时候，WinLogon使用GINA [...]]]></description>
			<content:encoded><![CDATA[<p>连续一段时间在公司使用无线网络上网，一直非常不爽的就是其不稳定——非常不稳定，时断时续。后来仔细研究之后发现，每次经过十几分钟，无线网卡的指示灯就灭掉了，紧接着就是无线网络断掉。过了几秒钟，无线网卡指示灯重新亮起，然后无线网络重新连接——就这样，无限网络不断的通断。</p>
<p>既然已经发现了问题的症结，接下来就是看看为什么会造成这种情况。我的无线网卡是ipw2200 (Intel PRO/Wireless 2200BG)，应该是非常常见和通用的一款无线网卡，至少在Linux下面一直以来驱动不成问题。但是看了一下驱动程序里面的选项，发现驱动程序的时间比较久远了，所以首先还是来更新一下驱动程序吧。</p>
<p><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW8QfiLvcbe4kosgKwDK_XIlxb3V2-Gt2tD7yC0GNPF92frFbmwPN4cMDktuY-zj3rM" /></p>
<p>于是到Google上搜索，顺利的找到了Intel的<a href="http://downloadcenter.intel.com/filter_results.aspx?strTypes=all&amp;ProductID=1637&amp;OSFullName=Windows*+XP+Professional&amp;lang=eng&amp;strOSs=44&amp;submit=Go!">驱动官方站点</a>。从上面的列表当中看，有两个版本的驱动程序可供选择：<a href="http://downloadcenter.intel.com/Detail_Desc.aspx?agr=N&amp;ProductID=1637&amp;DwnldID=13000&amp;strOSs=44&amp;OSFullName=Windows* XP Professional&amp;lang=eng">11.1.1.11/9.0.4.36 版本的Driver Only包</a>，和<a href="http://downloadcenter.intel.com/Detail_Desc.aspx?agr=N&amp;ProductID=1637&amp;DwnldID=13002&amp;strOSs=44&amp;OSFullName=Windows* XP Professional&amp;lang=eng">11.1.1.0 版本的Network Connection Software</a>。我一直觉得硬件这个东西还是有个硬件厂商提供的软件来协助管理比较好，于是没有多想，就把两个都下载了下来。之后运行安装Network Connection Software，安装过程当中笔记本的喇叭（喇叭，不是音箱）突然连续响了N声，直觉告诉我有点问题，但是也没多考虑，安装完毕之后就重新启动了。</p>
<p>不想重新启动之后，<font face="Arial,helvetica" size="2"></font>先是登录界面上面输入账户密码之后，登录界面好像死掉了一样，等待了大约两分钟才启动到桌面，而且登录进去之后也马上发现不对劲：任务栏上面的快速启动无法显示。虽然之前也出现过类似的问题，但是都是把快速启动删除然后再重新添加就好了。但这次直接报错：无法添加工具栏。</p>
<p>当然我知道，任务栏当中的图标是一组快捷方式，存放在C:\Documents and Settings\&lt;Your User Name&gt;\Application Data\Internet Exploerer\Quick Lunch下面。于是转过去找，竟然发现Application Data下面根本没有Internet Explorer的目录！再试图打开FireFox，竟然直接跳出首次运行的配置导入向导——一切迹象都表明：Application Data目录失踪了！</p>
<p>幸好我知道sysinternal有一个工具叫做<a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx">Junction</a>，用来建立目录软链接。所谓的目录软链接好像快捷方式一样，可以让你从一个位置指向另一个位置。但是目录软链接对于上面的应用程序是透明的，只要软链接已经建立好了，比如把C:\test重定向到D:\test，在应用程序看来这两个目录就是完全一样的了，对于C:\test下面的文件访问，也都会被操作系统直接重定向到D:\test下面的相应文件。</p>
<p>幸好我知道这个东西，而且是之前就知道。当年当我发现你根本无法阻止很多程序往我狭窄的C盘上写文件的时候，我就不得不想办法把尽可能多的东西迁移到别的盘上去。最早被我看上的就是Documents and Settings下面的目录：无数的程序把配置文件放在这里（也应该放在这里）。所以我就用软链接把C:\Documents and Settings\&lt;My user name&gt;\Application Data目录重定向到了另一个磁盘分区上，顺便一起被重定向的还有几个同级的目录。这种解决方案的一个坏处就是，如果某个软件作了什么不该做的事情，删掉这个软链接如同删掉一个空目录一样简单：一个RemoveDirectory的系统API调用足以。</p>
<p>那么是不是谁把这个软链接给删掉了呢？用资源管理器是没有办法区分的，但是用命令提示符可以。所以我立即用命令行转到这个目录去看，果然， Application Data已经变成了&lt;DIR&gt;，而不是软链接(&lt;JUNCTION&gt;)了（可惜这里忘记截图留下现场了）。</p>
<p>那么实际的目录内容呢？我立即转到软链接指向的目录观察，万幸的事情：所有的配置文件都还在。</p>
<p><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW-KnT8dEvEhYdlgPUs5O-4UAInTBaWTrKJ4RMS0-AVmhrBMNo8QmQ75N2t8qwupfSI" /></p>
<p>接下来的事情就很简单了，换用另外一个账户登录，使用命令提示符移动到C:\Documents and Settings\&lt;my user name&gt;下面，删除原来的Application Data目录，然后执行junction &quot;Application Data&quot; &quot;E:\path\to\Application Data&quot;，建立了一个新的目录软链接。</p>
<p><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW9cSmxOVEfkeUbEo9F7dPah85z3DN2SgrXJfMuDJmBSxPhy4R1ZT7ktPZHBSP9KI0o" /></p>
<p>重新用自己的账户登录，所有的配置文件都回来了，打开FireFox看到布满插件的状态栏，放心许多。</p>
<p>回顾一下我之前作过的事情，只能让我相信，确实是Intel的安装程序把这个目录删掉了：计算机喇叭的响声也许就是因为有程序发现自己的 Application Data目录被删掉了。而当时在做的事情，就是在安装Intel的应用程序而已。</p>
<p>一个问题已经解决了，但是还有另外一个问题：登录仍然非常的慢，为什么呢？</p>
<p>你看到的登录界面其实是叫做WinLogon的进程所显示的。而这个WinLogon当中是可以加入许多的自定义模块的。但是这些模块分布在各处，查找起来非常不便。幸运的是sysinternal仍然有一个工具替我们做了这些事情：<a href="http://www.microsoft.com/technet/sysinternals/SystemInformation/Autoruns.mspx">Autoruns</a>。这个工具运行之后，会有一个WinLogon标签页，当中显示了所有WinLogon注册的组件。请注意图中用红线圈出的部分，这些就是Intel安插在 WinLogon当中的。而登录的时候，WinLogon使用GINA DLL来进行身份认证。从图中显然可以看出，Intel的无线网卡程序使用它自己的GINA DLL替换掉了Windows自己的GINA DLL。</p>
<p>那么Windows自己的GINA DLL是什么呢？我们在system32目录下面运行dir *GINA.DLL，得到一个列表，如图中右下角所示。从名字上面看，msgina.dll应该就是微软的GINA DLL了。所以在IWPDGINA上面双击，Autoruns自动打开注册表编辑器，并定位到该注册表项。将它改成msgina.dll。然后把剩下的两个和Intel相关的项目前面的勾去掉。之后重启系统，输入密码之后，登录立即完成，并且很快的看到桌面，一切恢复正常。</p>
<p><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW-c8iZpVUWW6FDDmQ4wpTvHt_nbJjUYL_F9Q-jE1zszD1J9QyTeVBH9VNTti_TAsbg" /></p>
<p>而这个时候回头看看我最初想要做的事情：我的无线网卡的驱动正确更新了：</p>
<p><img src="http://byfiles.storage.live.com/y1ptQI9A-glMW--nyezTY5ngclnHah3OGfVmO6hi7p4oVTZ1XkMrkY8N5jMUEyA-3x38rPTdjZ45UM" /></p>
<p>更新之后的无线网卡驱动确实提高了电源管理的能力：在我写这篇文章的整个1个小时当中，无线网络没有再断。</p>
<p>但是，仅仅是一个无线网卡，为什么要去修改GINA，而且是这么敏感的组件：我的登录用户名和密码与无线网络有关系么？而且，为什么会毁掉我的 Application Data目录？如果不是我之前知道一点Windows<br />
东西，也许只能重装系统了，于是两年多的用户习惯，首选配置，甚至邮件都可能丢失。</p>
<p>而我，本来只是为了更新一下驱动程序罢了。</p>
<p><strong>你也许会喜欢：</strong>
<ul class="similar-posts">
<li><a href="http://blog.ftofficer.com/2007/08/firefox-myths/" rel="bookmark" title="2007年08月1日">FireFox Myths</a></li>
<li><a href="http://blog.ftofficer.com/2009/12/python-multiprocessing-3-about-queue/" rel="bookmark" title="2009年12月13日">Python multiprocessing 使用手记[3] – 关于Queue</a></li>
<li><a href="http://blog.ftofficer.com/2008/03/t-shirt-from-mozilla/" rel="bookmark" title="2008年03月1日">T-shirt from Mozilla</a></li>
<li><a href="http://blog.ftofficer.com/2008/01/%e6%90%9e%e5%ae%9a%e4%ba%86spam-comments%e7%9a%84%e8%87%aa%e5%8a%a8%e6%8e%a2%e6%b5%8b%e5%92%8c%e5%88%a0%e9%99%a4/" rel="bookmark" title="2008年01月25日">搞定了Spam Comments的自动探测和删除</a></li>
<li><a href="http://blog.ftofficer.com/2008/10/firefox-%e5%bd%93%e4%b8%adhtml%e6%8e%a7%e4%bb%b6%e6%97%a0%e6%b3%95%e6%ad%a3%e5%b8%b8%e6%98%be%e7%a4%ba/" rel="bookmark" title="2008年10月3日">Firefox 当中HTML控件无法正常显示</a></li>
</ul>
<p><!-- Similar Posts took 9.941 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ftofficer.com/2007/10/%e9%83%bd%e6%98%afintel%e6%97%a0%e7%ba%bf%e7%bd%91%e5%8d%a1%e9%a9%b1%e5%8a%a8%e6%83%b9%e5%be%97%e7%a5%b8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

