<?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/"
	>

<channel>
	<title>topo's corner</title>
	<atom:link href="http://topo.72pines.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://topo.72pines.com</link>
	<description>hmm...</description>
	<pubDate>Fri, 08 May 2009 23:56:01 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>twitter 和 friendfeed 同时下线</title>
		<link>http://topo.72pines.com/2009/05/08/twitter-%e5%92%8c-friendfeed-%e5%90%8c%e6%97%b6%e4%b8%8b%e7%ba%bf/</link>
		<comments>http://topo.72pines.com/2009/05/08/twitter-%e5%92%8c-friendfeed-%e5%90%8c%e6%97%b6%e4%b8%8b%e7%ba%bf/#comments</comments>
		<pubDate>Fri, 08 May 2009 23:53:44 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[生活]]></category>

		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=59</guid>
		<description><![CDATA[5/8/2009 对于依赖非 IM 即时通讯的网上用户来说，是黑色的一天。
twitter 计划在这一天的本地时间（PDT）2:00pm 进行一小时的下线维护。twitter 的服务器一直不很稳定，时常有连不上的问题，遇到这种情况，很多 twitter 用户会使用  friendfeed 来互通消息。
不幸的是，这一天 twitter 并未能在一小时后准时上线，3:oopm 以后，friendfeed 也掉线了，网站完全失去响应。用户在两个即时通讯服务均下线的情况下，体验到了无法获取准确消息的黑暗期。
4:10pm 过后，twitter 用户在连线状况非常糟糕的情况下，终于收到来自了 friendfeed 官方高层的消息，Paul Buchheit (@paultoo)  宣布 friendfeed 下线是因为服务器所在的数据中心停电（“The entire svcolo datacenter lost power. They expect to have it restored in 10min, but it will take at bit to bring up all systems.”）
]]></description>
			<content:encoded><![CDATA[<p>5/8/2009 对于依赖非 IM 即时通讯的网上用户来说，是黑色的一天。</p>
<p><a title="https://twitter.com" href="https://twitter.com" target="_blank">twitter</a> 计划在这一天的本地时间（PDT）2:00pm 进行一小时的下线维护。twitter 的服务器一直不很稳定，时常有连不上的问题，遇到这种情况，很多 twitter 用户会使用  <a title="https://friendfeed.com" href="https://friendfeed.com" target="_blank">friendfeed</a> 来互通消息。</p>
<p>不幸的是，这一天 twitter 并未能在一小时后准时上线，3:oopm 以后，friendfeed 也掉线了，网站完全失去响应。用户在两个即时通讯服务均下线的情况下，体验到了无法获取准确消息的黑暗期。</p>
<p>4:10pm 过后，twitter 用户在连线状况非常糟糕的情况下，终于收到来自了 friendfeed 官方高层的消息，Paul Buchheit (@<a title="Paul Buchheit" href="https://twitter.com/paultoo">paultoo</a>)  宣布 friendfeed 下线是因为服务器所在的数据中心停电（“The entire svcolo datacenter lost power. They expect to have it restored in 10min, but it will take at bit to bring up all systems.”）</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/05/08/twitter-%e5%92%8c-friendfeed-%e5%90%8c%e6%97%b6%e4%b8%8b%e7%ba%bf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>一个技术论坛上技术含量最高的文章</title>
		<link>http://topo.72pines.com/2009/04/03/%e4%b8%80%e4%b8%aa%e6%8a%80%e6%9c%af%e8%ae%ba%e5%9d%9b%e4%b8%8a%e6%8a%80%e6%9c%af%e5%90%ab%e9%87%8f%e6%9c%80%e9%ab%98%e7%9a%84%e6%96%87%e7%ab%a0/</link>
		<comments>http://topo.72pines.com/2009/04/03/%e4%b8%80%e4%b8%aa%e6%8a%80%e6%9c%af%e8%ae%ba%e5%9d%9b%e4%b8%8a%e6%8a%80%e6%9c%af%e5%90%ab%e9%87%8f%e6%9c%80%e9%ab%98%e7%9a%84%e6%96%87%e7%ab%a0/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 00:27:59 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[生活]]></category>

		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=52</guid>
		<description><![CDATA[工作需要为 VMWare Virtual Center 写一些接口模块，而 VMWare 不支持我们使用的编程语言，不得不在网上拼命 Google 碰到的出错信息，搜索结果列出了一个 vmware.cn 网站，我以为是中国 VMWare 的官方技术论坛，就注了册进去看看。
进去以后觉得不太对，网站论坛里面充斥着很多找 VMWare 软件破解或者许可的帖子，想想中国的实际情况也见怪不怪，于是直奔论坛的高级板块 “ VMWARE企业高级应用 ”，去读置顶 FAQ。
置顶 FAQ 是该论坛板块的版主写的，开始部分是到哪里下载软件，如何破解，这也都无可厚非。
但其中一句话引起我的注意：
“我一直都认为这个贴，是论坛最精华，技术含量最高的贴。”
各位看官，说的这个帖子是什么呢？原来是一个名叫“VI3 (ESX3) 破解/授权历史回顾”的帖子，有兴趣的话可以看看：
http://bbs.vmware.cn/thread-10155-1-1.html
这个帖子的技术含量到底有多足我就不评价了，但是这样一个帖子居然是论坛最精华、技术含量最高的帖（而且“一直”说明了这个结论是经过时间考验的），那么这个论坛的技术含量我也就不敢抱太多希望了。
]]></description>
			<content:encoded><![CDATA[<p>工作需要为 VMWare Virtual Center 写一些接口模块，而 VMWare 不支持我们使用的编程语言，不得不在网上拼命 Google 碰到的出错信息，搜索结果列出了一个 vmware.cn 网站，我以为是中国 VMWare 的官方技术论坛，就注了册进去看看。</p>
<p>进去以后觉得不太对，网站论坛里面充斥着很多找 VMWare 软件破解或者许可的帖子，想想中国的实际情况也见怪不怪，于是直奔论坛的高级板块 “ <a href="http://bbs.vmware.cn/forum-8-1.html">VMWARE企业高级应用</a> ”，去读置顶 FAQ。</p>
<p>置顶 FAQ 是该论坛板块的版主写的，开始部分是到哪里下载软件，如何破解，这也都无可厚非。</p>
<p>但其中一句话引起我的注意：</p>
<p><strong><span style="color: #ff0000">“我一直都认为这个贴，是论坛最精华，技术含量最高的贴。”</span></strong></p>
<p>各位看官，说的这个帖子是什么呢？原来是一个名叫“VI3 (ESX3) 破解/授权历史回顾”的帖子，有兴趣的话可以看看：</p>
<p><a href="http://bbs.vmware.cn/thread-10155-1-1.html" target="_self">http://bbs.vmware.cn/thread-10155-1-1.html</a></p>
<p>这个帖子的技术含量到底有多足我就不评价了，但是这样一个帖子居然是论坛最精华、技术含量最高的帖（而且“一直”说明了这个结论是经过时间考验的），那么这个论坛的技术含量我也就不敢抱太多希望了。</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/04/03/%e4%b8%80%e4%b8%aa%e6%8a%80%e6%9c%af%e8%ae%ba%e5%9d%9b%e4%b8%8a%e6%8a%80%e6%9c%af%e5%90%ab%e9%87%8f%e6%9c%80%e9%ab%98%e7%9a%84%e6%96%87%e7%ab%a0/feed/</wfw:commentRss>
		</item>
		<item>
		<title>快速建立 ipv6 安全管道访问 ipv6 网站</title>
		<link>http://topo.72pines.com/2009/03/29/%e5%bf%ab%e9%80%9f%e5%bb%ba%e7%ab%8b-ipv6-%e5%ae%89%e5%85%a8%e7%ae%a1%e9%81%93%e8%ae%bf%e9%97%ae-ipv6-%e7%bd%91%e7%ab%99/</link>
		<comments>http://topo.72pines.com/2009/03/29/%e5%bf%ab%e9%80%9f%e5%bb%ba%e7%ab%8b-ipv6-%e5%ae%89%e5%85%a8%e7%ae%a1%e9%81%93%e8%ae%bf%e9%97%ae-ipv6-%e7%bd%91%e7%ab%99/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 01:08:11 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=47</guid>
		<description><![CDATA[目前有很多网站支持 ipv6 连接，比如
http://ipv6.google.com
但对大部分人来说，这个网址是不能访问的，因为没有设置好 ipv6 。目前 ISP 很少提供 ipv6 连接，用户一般需要使用 ipv6 tunnel broker 来建立管道来访问 ipv6 站点。
在 Linux 下这个工作很简单，以 Debian 为例，安装 miredo 包（包的名字是&#8221;多来咪&#8221;反过来）：
# sudo apt-get install miredo
后输入
# /sbin/ifconfig
看到 teredo 这个虚拟网卡就可以用它访问 ipv6 了：
# ping6 ipv6.google.com
PING ipv6.google.com(2001:4860:b002::68) 56 data bytes
64 bytes from 2001:4860:b002::68: icmp_seq=1 ttl=56 time=874 ms
64 bytes from 2001:4860:b002::68: icmp_seq=2 ttl=56 time=322 ms
现在应该可以访问  http://ipv6.google.com 了，如果成功访问的话，你会看到在 ipv4 下面熟悉的 Google [...]]]></description>
			<content:encoded><![CDATA[<p>目前有很多网站支持 ipv6 连接，比如</p>
<p><a href="http://ipv6.google.com" target="_blank">http://ipv6.google.com</a></p>
<p>但对大部分人来说，这个网址是不能访问的，因为没有设置好 ipv6 。目前 ISP 很少提供 ipv6 连接，用户一般需要使用 <a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FList_of_IPv6_tunnel_brokers&amp;ei=CMPOSYzmM5PsnQeukLDgCQ&amp;usg=AFQjCNFs8wXSQavbjyi6SKBC-LsOuqJs9g&amp;sig2=YYjyk0RyTgCwcPYNFCWjdw" target="_blank">ipv6 tunnel broker</a> 来建立管道来访问 ipv6 站点。</p>
<p>在 Linux 下这个工作很简单，以 Debian 为例，安装 miredo 包（包的名字是&#8221;多来咪&#8221;反过来）：</p>
<p># sudo apt-get install miredo</p>
<p>后输入</p>
<p># /sbin/ifconfig</p>
<p>看到 teredo 这个虚拟网卡就可以用它访问 ipv6 了：</p>
<p># ping6 ipv6.google.com</p>
<p>PING ipv6.google.com(2001:4860:b002::68) 56 data bytes<br />
64 bytes from 2001:4860:b002::68: icmp_seq=1 ttl=56 time=874 ms<br />
64 bytes from 2001:4860:b002::68: icmp_seq=2 ttl=56 time=322 ms<br />
现在应该可以访问  <a href="http://ipv6.google.com" target="_blank">http://ipv6.google.com</a> 了，如果成功访问的话，你会看到在 ipv4 下面熟悉的 Google 搜索界面，但 Google Logo 是动画的。</p>
<p>使用 sixxs.org 提供的 ipv4/ipv6 交换门，可以实现在 ipv4 环境下访问 ipv6 站点，或者在 ipv6 环境下访问 ipv4 站点，方法是：</p>
<p>. ipv4 环境下，在 ipv6 网站后面添加 .ipv4.sixxs.org：</p>
<p>http://ipv6.google.com/   &#8212;&gt;   http://ipv6.google.com.ipv4.sixxs.org/</p>
<p>而在 ipv6 环境下，在 ipv4 网站后面添加 sixxs.org 或者 .ipv6.sixxs.org：</p>
<p>http://wikipedia.org/   &#8212;&gt;   http://wikipedia.org.sixxs.org/</p>
<p>从理论上来说，所有正常使用 80 端口的 ipv4 网站均可以在 ipv6 环境下使用 ipv6交换门来访问。</p>
<p>这台安装并能正确访问 ipv6 的 Linux 机器，可以安装 polipo （支持 ipv6 的代理）后让不支持 ipv6 的 Windows 系统访问 ipv6 站点：</p>
<p># sudo apt-get install polipo</p>
<p># vi /etc/polipo/config</p>
<p>找到 proxyAddress 改成允许 Windows 系统访问即可：</p>
<p>proxyAddress=&#8221;0.0.0.0&#8243;</p>
<p>#sudo /etc/init.d/polipo restart</p>
<p>polipo 的默认端口是 8123，把 Windows 系统的代理改成 LinuxIP:8123 就可以访问 ipv6 站点了。</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/03/29/%e5%bf%ab%e9%80%9f%e5%bb%ba%e7%ab%8b-ipv6-%e5%ae%89%e5%85%a8%e7%ae%a1%e9%81%93%e8%ae%bf%e9%97%ae-ipv6-%e7%bd%91%e7%ab%99/feed/</wfw:commentRss>
		</item>
		<item>
		<title>全部使用 https:// 协议的 TwitterFox</title>
		<link>http://topo.72pines.com/2009/03/19/%e5%85%a8%e9%83%a8%e4%bd%bf%e7%94%a8-https-%e5%8d%8f%e8%ae%ae%e7%9a%84-twitterfox/</link>
		<comments>http://topo.72pines.com/2009/03/19/%e5%85%a8%e9%83%a8%e4%bd%bf%e7%94%a8-https-%e5%8d%8f%e8%ae%ae%e7%9a%84-twitterfox/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 21:49:21 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=42</guid>
		<description><![CDATA[TwitterFox 是个 Firefox 扩展，据作者说，TwitterFox 和 twitter 服务器之间均为加密通讯，但查看 TwitterFox 的源程序，里面仍有几处直接使用  http:// 协议连接 twitter.com，最明显的例子就是，如果你双击 TwitterFox 的状态图标去 twitter.com 官方页面，将会是用  http://twitter.com/home 打开页面，并且该页面下所有 twitter.com 引用页面链接也都是使用 http:// 协议。在 twitter.com 上充满低俗内容的今天，某些数据通讯无疑会让墙不太高兴。
向作者提出过将 http:// 协议全部改成  https:// 协议的建议，但未被采纳（我个人比较奇怪，因为作者似乎很在乎通讯隐私，要不也不会把 TwitterFox 改成强制使用 SSL 收发 tweets，而不是像早期版本那样允许用户自己设置是否使用 SSL）。
下面这个版本是从官方 subversion repository 里面取得最新源代码，修改全部 http:// 协议引用到  https:// 后的编制版本，目前版本为 1.8b1，和官方发布的最新版 1.7.7.1 的区别只是上述修改和版本号：
https://dl.getdropbox.com/u/106561/TwitterFox-lxl-https.xpi
我会定期监察官方 subverion repository 里面的源代码，如果发现更新，也会相应更新这个版本，一直到官方版本完全使用 https:// 协议为止。
如果你还在用不安全的 TwitterFox 官方版进行低俗推发，那么建议你使用这个版本。如果你对这个版本不是很放心，可以下载 xpi 文件后，改名到 zip 文件，然后解开该文件和官方的正式发布版比较一下看看差异，确认没有恶意代码后再安装。
安装之后如果你双击 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://twitterfox.net/" target="_blank">TwitterFox</a> 是个 Firefox 扩展，据作者说，TwitterFox 和 twitter 服务器之间均为加密通讯，但查看 TwitterFox 的源程序，里面仍有几处直接使用  http:// 协议连接 twitter.com，最明显的例子就是，如果你双击 TwitterFox 的状态图标去 twitter.com 官方页面，将会是用  http://twitter.com/home 打开页面，并且该页面下所有 twitter.com 引用页面链接也都是使用 http:// 协议。在 twitter.com 上充满低俗内容的今天，某些数据通讯无疑会让墙不太高兴。</p>
<p>向作者提出过将 http:// 协议全部改成  https:// 协议的建议，但未被采纳（我个人比较奇怪，因为作者似乎很在乎通讯隐私，要不也不会把 TwitterFox 改成强制使用 SSL 收发 tweets，而不是像早期版本那样允许用户自己设置是否使用 SSL）。</p>
<p>下面这个版本是从官方 subversion repository 里面取得最新源代码，修改全部 http:// 协议引用到  https:// 后的编制版本，目前版本为 1.8b1，和官方发布的最新版 1.7.7.1 的区别只是上述修改和版本号：</p>
<p><a href="https://dl.getdropbox.com/u/106561/TwitterFox-lxl-https.xpi">https://dl.getdropbox.com/u/106561/TwitterFox-lxl-https.xpi</a></p>
<p>我会定期监察官方 subverion repository 里面的源代码，如果发现更新，也会相应更新这个版本，一直到官方版本完全使用 https:// 协议为止。</p>
<p>如果你还在用不安全的 TwitterFox 官方版进行低俗推发，那么建议你使用这个版本。如果你对这个版本不是很放心，可以下载 xpi 文件后，改名到 zip 文件，然后解开该文件和官方的正式发布版比较一下看看差异，确认没有恶意代码后再安装。</p>
<p>安装之后如果你双击 TwitterFox 的小图标，应该去 <a href="https://twitter.com/home" target="_blank">https://twitter.com/home</a> ，也就是使用 https:// 协议访问你的个人页面。</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/03/19/%e5%85%a8%e9%83%a8%e4%bd%bf%e7%94%a8-https-%e5%8d%8f%e8%ae%ae%e7%9a%84-twitterfox/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux 命令行下用 Gmail SMTP 发信</title>
		<link>http://topo.72pines.com/2009/02/18/linux-%e5%91%bd%e4%bb%a4%e8%a1%8c%e4%b8%8b%e7%94%a8-gmail-smtp-%e5%8f%91%e4%bf%a1/</link>
		<comments>http://topo.72pines.com/2009/02/18/linux-%e5%91%bd%e4%bb%a4%e8%a1%8c%e4%b8%8b%e7%94%a8-gmail-smtp-%e5%8f%91%e4%bf%a1/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 02:35:32 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[生活]]></category>

		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=38</guid>
		<description><![CDATA[最近没有注意清理硬盘空间，每天半夜的备份把外接硬盘填满了还不知道，由于这个外接硬盘是用 automount 挂载的，平时一般处于卸载状态，所以没有及时发现。由此 Linux 系统命令行发送邮件的需求重新提到日程上来。
几年前安装 Linux 系统时顺手配置 Email Server 很常见，但是近来大家都选择不安装了，因为
1、用家里ISP分配的动态IP运行的 SMTP 服务器发信往往会被别人当作 spam 拒收（因为这种动态IP无法经过域名反查证实是我们自己设定的域名）；
2、现在免费信箱很多，与其自己费心维护还不如直接用 Gmail 提供的 SMTP 服务。
经过比较后，我决定使用 ssmtp 来实现发信，原因是
1、我并不需要收信，只需要发信；
2、ssmtp 比 exim 小很多，比较一下安装包，ssmtp 大约 50KB，exim 大约 1.7MB
选择 Gmail 是因为它提供加密的 SMTP 服务，首先去 Gmail 申请一个帐号(sender@gmail.com)，专门用来发信。
使用 sudo apt-get install ssmtp 安装 ssmtp 后，修改设置文件 /etc/ssmtp/ssmtp.conf，改成
root=sender@gmail.com
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
RewriteDomain=
Hostname=sender@gmail.com
AuthUser=sender@gmail.com
AuthPass=password
FromLineOverride=YES
反查表文件 /etc/ssmtp/revaliases 里面设置
root:sender@gmail.com:smtp.gmail.com:587
这时就可以用 ssmtp 通过 Gmail SMTP 来发信了，假如我们要发一封试验信给 myacct@myemail.com，可以这样写
echo &#8220;This is a test email&#8221; &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>最近没有注意清理硬盘空间，每天半夜的备份把外接硬盘填满了还不知道，由于这个外接硬盘是用 automount 挂载的，平时一般处于卸载状态，所以没有及时发现。由此 Linux 系统命令行发送邮件的需求重新提到日程上来。</p>
<p>几年前安装 Linux 系统时顺手配置 Email Server 很常见，但是近来大家都选择不安装了，因为</p>
<p>1、用家里ISP分配的动态IP运行的 SMTP 服务器发信往往会被别人当作 spam 拒收（因为这种动态IP无法经过域名反查证实是我们自己设定的域名）；</p>
<p>2、现在免费信箱很多，与其自己费心维护还不如直接用 Gmail 提供的 SMTP 服务。</p>
<p>经过比较后，我决定使用 ssmtp 来实现发信，原因是</p>
<p>1、我并不需要收信，只需要发信；</p>
<p>2、ssmtp 比 exim 小很多，比较一下安装包，ssmtp 大约 50KB，exim 大约 1.7MB</p>
<p>选择 Gmail 是因为它提供加密的 SMTP 服务，首先去 Gmail 申请一个帐号(sender@gmail.com)，专门用来发信。</p>
<p>使用 sudo apt-get install ssmtp 安装 ssmtp 后，修改设置文件 /etc/ssmtp/ssmtp.conf，改成</p>
<p>root=sender@gmail.com<br />
mailhub=smtp.gmail.com:587<br />
UseSTARTTLS=YES<br />
RewriteDomain=<br />
Hostname=sender@gmail.com<br />
AuthUser=sender@gmail.com<br />
AuthPass=password<br />
FromLineOverride=YES</p>
<p>反查表文件 /etc/ssmtp/revaliases 里面设置</p>
<p>root:sender@gmail.com:smtp.gmail.com:587</p>
<p>这时就可以用 ssmtp 通过 Gmail SMTP 来发信了，假如我们要发一封试验信给 myacct@myemail.com，可以这样写</p>
<p>echo &#8220;This is a test email&#8221; | mail -s &#8220;test email&#8221; myacct@myemail.com</p>
<p>用脚本可以写出更加复杂的邮件（包括一些命令的执行结果），如</p>
<p>#!/bin/sh</p>
<p>DATESTR=`date +&#8221;%m/%d%Y&#8221;`</p>
<p>(echo -e &#8220;this is current disk usage: \n&#8221;; df -h ; echo -e &#8220;\n\nPlease cleanup if necessary.\n&#8221;) | mail -s &#8220;[my server notification] $DATESTR&#8221; myacct@myemail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/02/18/linux-%e5%91%bd%e4%bb%a4%e8%a1%8c%e4%b8%8b%e7%94%a8-gmail-smtp-%e5%8f%91%e4%bf%a1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>用 KeePass 实现远程控制的自动登录</title>
		<link>http://topo.72pines.com/2009/02/11/%e7%94%a8-keepass-%e5%ae%9e%e7%8e%b0%e8%bf%9c%e7%a8%8b%e6%8e%a7%e5%88%b6%e7%9a%84%e8%87%aa%e5%8a%a8%e7%99%bb%e5%bd%95/</link>
		<comments>http://topo.72pines.com/2009/02/11/%e7%94%a8-keepass-%e5%ae%9e%e7%8e%b0%e8%bf%9c%e7%a8%8b%e6%8e%a7%e5%88%b6%e7%9a%84%e8%87%aa%e5%8a%a8%e7%99%bb%e5%bd%95/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 22:37:29 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[Windows]]></category>

		<category><![CDATA[安全]]></category>

		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=30</guid>
		<description><![CDATA[我经常要登录多个远程系统进行维护，输入用户名和密码是一件很烦的事情，但如果将用户密码保存在远程控制软件中又会造成安全隐患，尤其是如果该远程控制软件是放在 U 盘上的便携版，一旦 U 盘遗失，可能会被别人轻易侵入系统，我的几个 Linux 帐号都有 sudo 权限，被窃取后基本上就等同 root 帐号被攻克了。
比较安全的自动登录可以用 KeePass 配合适当的远程控制软件来实现。
首先远程控制软件必须允许在命令行设定远程登录的信息，如远程系统IP/域名，端口，用户名，密码等等。我最常用的几款都可以：
登录 SSH 服务器使用 putty：putty.exe -ssh $username@$host:$port -pw $password
登录 SFTP 服务器使用 winscp：winscp.exe&#8221; sftp://$username:$password@$host:$port
远程桌面使用 UltraVNC viewer：vncviewer.exe&#8221; $host:$port -password $password
远程桌面使用 TeamViewer：Teamviewer.exe&#8221; -i $ID -P $password
如果想在 U 盘上使用 KeePass 便携版的话，这几款远程控制软件都有便携版或者便携的替代版，如 putty 可以用 kitty 来替代。
这里用 KeePass 1.14 中的 URL field 配合 cmd:// 链接来启上述动远程控制软件，传入登录信息，就可以无需输入用户名/密码自动登录到远程系统上了。由于远程系统的登录信息是由 KeePass 加密保存的，远程软件中可完全不需要保存远程系统的信息（可手动逐一删除目前已经保存的信息），并且设置不要记录登录历史，这样即使把 KeePass + 远程控制软件便携版保存在 [...]]]></description>
			<content:encoded><![CDATA[<p>我经常要登录多个远程系统进行维护，输入用户名和密码是一件很烦的事情，但如果将用户密码保存在远程控制软件中又会造成安全隐患，尤其是如果该远程控制软件是放在 U 盘上的便携版，一旦 U 盘遗失，可能会被别人轻易侵入系统，我的几个 Linux 帐号都有 sudo 权限，被窃取后基本上就等同 root 帐号被攻克了。</p>
<p>比较安全的自动登录可以用 <a href="http://keepass.info/" target="_blank">KeePass</a> 配合适当的远程控制软件来实现。</p>
<p>首先远程控制软件必须允许在命令行设定远程登录的信息，如远程系统IP/域名，端口，用户名，密码等等。我最常用的几款都可以：</p>
<p>登录 SSH 服务器使用 putty：putty.exe -ssh $username@$host:$port -pw $password</p>
<p>登录 SFTP 服务器使用 winscp：winscp.exe&#8221; sftp://$username:$password@$host:$port</p>
<p>远程桌面使用 UltraVNC viewer：vncviewer.exe&#8221; $host:$port -password $password</p>
<p>远程桌面使用 TeamViewer：Teamviewer.exe&#8221; -i $ID -P $password</p>
<p>如果想在 U 盘上使用 KeePass 便携版的话，这几款远程控制软件都有便携版或者便携的替代版，如 putty 可以用 kitty 来替代。</p>
<p>这里用 KeePass 1.14 中的 URL field 配合 cmd:// 链接来启上述动远程控制软件，传入登录信息，就可以无需输入用户名/密码自动登录到远程系统上了。由于远程系统的登录信息是由 KeePass 加密保存的，远程软件中可完全不需要保存远程系统的信息（可手动逐一删除目前已经保存的信息），并且设置不要记录登录历史，这样即使把 KeePass + 远程控制软件便携版保存在 Dropbox 这样的网盘上也可以放心了。</p>
<p>假定我们把远程软件便携版（kitty.exe, winscp.exe, vncviewer.exe, teamviewer.exe）保存在 KeePass 的目录下（和 KeePass.exe 在同一目录），则 URL field 和相应 field 可以这样设置：</p>
<p>kitty 自动登录 URL:</p>
<p>cmd://&#8221;{APPDIR}\kitty.exe&#8221; -ssh {USERNAME} -pw {PASSWORD}</p>
<p>(&#8221;User name&#8221; field: username@host:port, &#8220;Password&#8221; field: password)</p>
<p>winscp 自动登录 URL:</p>
<p>cmd://&#8221;{APPDIR}\winscp.exe&#8221; sftp://{USERNAME}:{PASSWORD}@{TITLE}</p>
<p>(&#8221;Title&#8221; field: host:port, &#8220;User name&#8221; field: username, &#8220;Password&#8221; field: password)</p>
<p>UltraVNC viewer 自动登录 URL:</p>
<p>cmd://&#8221;{APPDIR}\vncviewer.exe&#8221; {USERNAME} -password {PASSWORD}</p>
<p>(&#8221;User name&#8221; field: host:port, &#8220;Password&#8221; field: password)</p>
<p>TeamViewer 自动登录 URL:</p>
<p>cmd://&#8221;{APPDIR}\Teamviewer.exe&#8221; -i &#8220;{USERNAME}&#8221; -P {PASSWORD}</p>
<p>(&#8221;User name&#8221; field: ID, &#8220;Password&#8221; field: password)</p>
<p>这种自动登录目前的局限是：</p>
<p>1、SSH (putty, winscp) 还无法用密钥登录，KeePass 1.14 可考虑用 &#8220;Notes&#8221; field 保存 private key，然后写一个 batch，把 {NOTES} 保存成一个临时文件，用 -i 传给 putty 登录后马上删除；KeePass 2.0 则可以使用 custom field；</p>
<p>2、SSH (putty, winscp) 会记录远程系统的IP或域名及公钥（但这些信息只要用 putty/winscp 连接一次 SSH 服务器就能取得）</p>
<p><strong><br />
</strong></p>
<p><strong><span style="color: #ff0000">编辑：听说 KeePass 2.x 可以保存文件</span><span style="color: #ff0000">附件了，那么，使用密钥登录的问题也就解决了。</span></strong></p>
<p><span style="color: #ff0000"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/02/11/%e7%94%a8-keepass-%e5%ae%9e%e7%8e%b0%e8%bf%9c%e7%a8%8b%e6%8e%a7%e5%88%b6%e7%9a%84%e8%87%aa%e5%8a%a8%e7%99%bb%e5%bd%95/feed/</wfw:commentRss>
		</item>
		<item>
		<title>修改 Firefox 的 Google搜索栏 icon</title>
		<link>http://topo.72pines.com/2009/01/16/%e4%bf%ae%e6%94%b9-firefox-%e7%9a%84-google%e6%90%9c%e7%b4%a2%e6%a0%8f-icon/</link>
		<comments>http://topo.72pines.com/2009/01/16/%e4%bf%ae%e6%94%b9-firefox-%e7%9a%84-google%e6%90%9c%e7%b4%a2%e6%a0%8f-icon/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 21:17:46 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/?p=24</guid>
		<description><![CDATA[Google 最近两次修改自己的 favicon，但是 Firefox 并没有跟进修改 Google 搜索栏中的服务 icon。
Firefox 的搜索设置在其安装目录（默认 c:\program files\mozilla firefox）下的 searchplugins 目录下。Firefox 自带了几个搜索引擎的设置，Google 在 google.xml 中。打开这个文件，会看到一行
&#60;Image width=&#8221;16&#8243; height=&#8221;16&#8243;&#62;data:image/x-icon;base64, &#8230; &#60;/Image&#62;
就是存放 Google 服务 icon 数据的地方。编辑该处，可以换上任何 16&#215;16 的 icon 替换 Google 的默认 G icon。
我个人不喜欢 Google 新换的 favicon，倒是觉得 可能吧 新换的 favicon 很得搜索的真谛，所以就把它偷来作为我的 Google 搜索服务图标  
这是修改后的效果图：


base64 编码可以使用 Linux coreutils 包里的 base64 生成，或者使用这个在线服务。
修改过的 google.xml
==============================
&#60;SearchPlugin xmlns=&#8221;http://www.mozilla.org/2006/browser/search/&#8221;&#62;
&#60;ShortName&#62;Google&#60;/ShortName&#62;
&#60;Description&#62;Google Search&#60;/Description&#62;
&#60;InputEncoding&#62;UTF-8&#60;/InputEncoding&#62;
&#60;Image width=&#8221;16&#8243; [...]]]></description>
			<content:encoded><![CDATA[<p>Google 最近两次修改自己的 favicon，但是 Firefox 并没有跟进修改 Google 搜索栏中的服务 icon。</p>
<p>Firefox 的搜索设置在其安装目录（默认 c:\program files\mozilla firefox）下的 searchplugins 目录下。Firefox 自带了几个搜索引擎的设置，Google 在 google.xml 中。打开这个文件，会看到一行</p>
<p>&lt;Image width=&#8221;16&#8243; height=&#8221;16&#8243;&gt;data:image/x-icon;base64, &#8230; &lt;/Image&gt;</p>
<p>就是存放 Google 服务 icon 数据的地方。编辑该处，可以换上任何 16&#215;16 的 icon 替换 Google 的默认 G icon。</p>
<p>我个人不喜欢 Google 新换的 favicon，倒是觉得 <a href="http://www.kenengba.com" target="_blank">可能吧</a> 新换的 <a href="http://www.kenengba.com/post/562.html" target="_blank">favicon</a> 很得搜索的真谛，所以就把它偷来作为我的 Google 搜索服务图标 <img src='http://topo.72pines.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>这是修改后的效果图：</p>
<p><img class="alignnone size-full wp-image-25" src="http://topo.72pines.com/files/2009/01/kicon1.png" alt="kicon1" width="243" height="66" /></p>
<p><img class="alignnone size-full wp-image-26" src="http://topo.72pines.com/files/2009/01/kicon2.png" alt="kicon2" width="236" height="223" /></p>
<p>base64 编码可以使用 Linux coreutils 包里的 base64 生成，或者使用这个<a href="http://www.motobit.com/util/base64-decoder-encoder.asp" target="_blank">在线服务</a>。</p>
<p>修改过的 google.xml</p>
<p style="text-align: left">==============================</p>
<p style="text-align: left">&lt;SearchPlugin xmlns=&#8221;http://www.mozilla.org/2006/browser/search/&#8221;&gt;<br />
&lt;ShortName&gt;Google&lt;/ShortName&gt;<br />
&lt;Description&gt;Google Search&lt;/Description&gt;<br />
&lt;InputEncoding&gt;UTF-8&lt;/InputEncoding&gt;<br />
&lt;Image width=&#8221;16&#8243; height=&#8221;16&#8243;&gt;data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAACey3r/wd6q/8Heqv/B3qr/wd6q/8Heqv/B3qr/wd6q/8Heqv/B3qr/wd6q/8Heqv/B3qr/wd6q/8Heqv+ey3r/wd6q////////////////////////////////////////////////////////////////////////////wd6q/8Heqv///////////83qzv91xXf/5PPk///////+/v7/9PT8/+Li+f/OzvX/u7vx/6io7f+UlOn/wsLy/8Heqv/B3qr///////////+Oz5D/NKo3/7Hesv/KyvT/jo7o/3Bw4v9aWt7/RUXZ/zAw1f8aGtH/CAjN/1JS3P/B3qr/wd6q////////////9Pr0/8Tmxf/8/fz/5fTl//////////////////////////////////7+/v//////wd6q/8Heqv////////////z8/P/09PT//v7+/9Dr0f+a1Zz/+Pz4/////////////////////////////////8Heqv/B3qr////////////CwsL/AAAA/+Li4v//////1e3W/2W+Z//W7db////////////////////////////B3qr/wd6q////////////2dnZ/wAAAP9WVlb/7u7u///////d8N3/TLRO/5nUmv/7/fv/////////////////wd6q/8Heqv////////////////+ampr/FBQU/w4ODv94eHj/+fn5/+Pz4/9NtFD/Xbtf/93w3f///////////8Heqv/B3qr///////////////////////X19f+QkJD/CQkJ/4SEhP//////6PXp/1S3Vv86rD3/otij//3+/f/B3qr/wd6q//7+/v/+/v7//////////////////////2xsbP9BQUH////////////t9+3/W7pe/zSqN/+r3Kz/wd6q/8Heqv9JSUn/bW1t//////////////////////+Hh4f/MDAw//////////////////T69P+Z1Jv/3fHe/8Heqv/B3qr/SUlJ/1tbW///////////////////////d3d3/zw8PP/////////////////////////////////B3qr/wd6q/4WFhf8NDQ3/jY2N/6mpqf+srKz/kpKS/xQUFP98fHz/////////////////////////////////wd6q/8Heqv/5+fn/goKC/zc3N/8bGxv/GRkZ/y8vL/92dnb/9fX1/////////////////////////////////8Heqv+ey3r/wd6q/8Heqv/B3qr/wd6q/8Heqv/B3qr/wd6q/8Heqv/B3qr/wd6q/8Heqv/B3qr/wd6q/8Heqv+ey3r/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==&lt;/Image&gt;<br />
&lt;Url type=&#8221;application/x-suggestions+json&#8221; method=&#8221;GET&#8221; template=&#8221;http://suggestqueries.google.com/complete/search?output=firefox&amp;amp;client=firefox&amp;amp;hl={moz:locale}&amp;amp;q={searchTerms}&#8221;/&gt;<br />
&lt;Url type=&#8221;text/html&#8221; method=&#8221;GET&#8221; template=&#8221;http://www.google.com/search&#8221;&gt;<br />
&lt;Param name=&#8221;q&#8221; value=&#8221;{searchTerms}&#8221;/&gt;<br />
&lt;Param name=&#8221;ie&#8221; value=&#8221;utf-8&#8243;/&gt;<br />
&lt;Param name=&#8221;oe&#8221; value=&#8221;utf-8&#8243;/&gt;<br />
&lt;Param name=&#8221;aq&#8221; value=&#8221;t&#8221;/&gt;<br />
&lt;!&#8211; Dynamic parameters &#8211;&gt;<br />
&lt;Param name=&#8221;rls&#8221; value=&#8221;{moz:distributionID}:{moz:locale}:{moz:official}&#8221;/&gt;<br />
&lt;MozParam name=&#8221;client&#8221; condition=&#8221;defaultEngine&#8221; trueValue=&#8221;firefox-a&#8221; falseValue=&#8221;firefox&#8221;/&gt;<br />
&lt;/Url&gt;<br />
&lt;SearchForm&gt;http://www.google.com/firefox&lt;/SearchForm&gt;<br />
&lt;/SearchPlugin&gt;<br />
==============================</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2009/01/16/%e4%bf%ae%e6%94%b9-firefox-%e7%9a%84-google%e6%90%9c%e7%b4%a2%e6%a0%8f-icon/feed/</wfw:commentRss>
		</item>
		<item>
		<title>把 delicious 改造成 blinklist</title>
		<link>http://topo.72pines.com/2008/12/09/%e6%8a%8a-delicious-%e6%94%b9%e9%80%a0%e6%88%90-blinklist/</link>
		<comments>http://topo.72pines.com/2008/12/09/%e6%8a%8a-delicious-%e6%94%b9%e9%80%a0%e6%88%90-blinklist/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 22:21:45 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/2008/12/09/%e6%8a%8a-delicious-%e6%94%b9%e9%80%a0%e6%88%90-blinklist/</guid>
		<description><![CDATA[blinklist 的升级令人失望，决定用 Greasemonkey 把 delicious 改进一下，让它至少看上去和旧版的 blinklist 有些相像。
改造之处：
1、点击 delicious 显示的书签时让它在新的 tab 里面显示；
2、显示书签网站的缩略图和 favicon。
Yamamaya 的脚本已经完成了2，我就在此基础上增加了1。
脚本代码如下：
// ==UserScript==
// @name         Delicious Thumbnail &#38; Favicon
// @namespace    Yamamaya
// @include      http://delicious.com/*
// @version      2.00
// ==/UserScript==
(function(){
var insertEle = document.getElementById(&#8221;sidebar&#8221;);
var toggle = document.createElement(&#8221;div&#8221;);
toggle.id = [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://topo.72pines.com/2008/12/01/blinklistcom-20-%e7%bb%88%e4%ba%8e%e5%8f%91%e5%b8%83%e4%ba%86%ef%bc%8c%e4%bd%86%e6%98%af/" target="_blank">blinklist 的升级令人失望</a>，决定用 <a href="https://addons.mozilla.org/en-US/firefox/addon/748" target="_blank">Greasemonkey</a> 把 <a href="http://delicious.com" target="_blank">delicious</a> 改进一下，让它至少看上去和旧版的 <a href="http://blinklist.com" target="_blank">blinklist</a> 有些相像。</p>
<p>改造之处：</p>
<p>1、点击 delicious 显示的书签时让它在新的 tab 里面显示；</p>
<p>2、显示书签网站的缩略图和 favicon。</p>
<p><a href="http://userscripts.org/scripts/show/35179" target="_blank">Yamamaya 的脚本</a>已经完成了2，我就在此基础上增加了1。</p>
<p>脚本代码如下：</p>
<p>// ==UserScript==<br />
// @name         Delicious Thumbnail &amp; Favicon<br />
// @namespace    Yamamaya<br />
// @include      http://delicious.com/*<br />
// @version      2.00<br />
// ==/UserScript==</p>
<p>(function(){<br />
var insertEle = document.getElementById(&#8221;sidebar&#8221;);<br />
var toggle = document.createElement(&#8221;div&#8221;);<br />
toggle.id = &#8220;toggleBox&#8221;;<br />
toggle.style.cursor = &#8220;pointer&#8221;;<br />
var h3 = document.createElement(&#8221;h3&#8243;);<br />
toggle.appendChild(h3);<br />
var span = document.createElement(&#8221;span&#8221;);<br />
span.className = &#8220;toggle-button&#8221;;<br />
span.innerHTML = &#8220;Thumbnail Size&#8221;;<br />
h3.appendChild(span);</p>
<p>var setBox = document.createElement(&#8221;div&#8221;);<br />
setBox.id = &#8220;sizeSetBox&#8221;;<br />
setBox.style.display = GM_getValue(&#8221;display&#8221;);</p>
<p>var sele = document.createElement(&#8221;a&#8221;);<br />
sele.href=&#8221;#&#8221;;<br />
sele.innerHTML = &#8220;Small&#8221;;<br />
setBox.appendChild(sele);</p>
<p>var seleM = document.createElement(&#8221;a&#8221;);<br />
seleM.href=&#8221;#&#8221;;<br />
seleM.innerHTML = &#8220;Medium&#8221;;<br />
setBox.appendChild(seleM);</p>
<p>var seleL = document.createElement(&#8221;a&#8221;);<br />
seleL.href=&#8221;#&#8221;;<br />
seleL.innerHTML = &#8220;Large&#8221;;<br />
setBox.appendChild(seleL);</p>
<p>if(setBox.style.display == &#8220;none&#8221;) span.style.backgroundPosition = &#8220;3px -359px&#8221;;</p>
<p>h3.addEventListener(&#8221;click&#8221;,function(){<br />
setBox.style.display == &#8220;&#8221; ? setBox.style.display = &#8220;none&#8221;: setBox.style.display = &#8220;&#8221;;<br />
setBox.style.display == &#8220;&#8221; ? span.style.backgroundPosition = &#8220;&#8221; : span.style.backgroundPosition = &#8220;3px -359px&#8221;;<br />
GM_setValue(&#8221;display&#8221;,setBox.style.display);<br />
},false);<br />
var addImg = function(link){<br />
if(link.parentNode.nodeName.toLowerCase() != &#8220;h4&#8243;) return;<br />
// favicon<br />
var fBox = document.createElement(&#8221;div&#8221;);<br />
var fStyle = fBox.style;<br />
fStyle.cssFloat = &#8220;left&#8221;;<br />
fStyle.minWidth = &#8220;16px&#8221;;<br />
fStyle.minHeight = &#8220;16px&#8221;;<br />
fStyle.margin = &#8220;0px 7px&#8221;;<br />
fStyle.backgroundImage = &#8216;url(&#8221;chrome://global/skin/icons/folder-item.png&#8221;)&#8217;;<br />
var favi = document.createElement(&#8221;img&#8221;);<br />
favi.src=&#8221;http://&#8221; + link.hostname + &#8220;/favicon.ico&#8221;;<br />
favi.width = &#8220;16&#8243;;</p>
<p>// No favicon<br />
favi.removeEventListener(&#8217;error&#8217;, revertIcon, false);<br />
favi.addEventListener(&#8217;error&#8217;, revertIcon, false);</p>
<p>var parent = link.parentNode;<br />
fBox.appendChild(favi);<br />
parent.insertBefore(fBox,link);</p>
<p>// Thumbnail<br />
if (parent.parentNode.parentNode.firstChild.nextSibling.nodeName.toLowerCase() != &#8220;a&#8221;) {<br />
var tBox = document.createElement(&#8221;div&#8221;);<br />
tBox.style.cssFloat = &#8220;left&#8221;;<br />
tBox.style.margin = &#8220;0px 3px 3px 0px&#8221;;<br />
var a = document.createElement(&#8221;a&#8221;);<br />
a.href = link.href;<br />
a.target = &#8220;_blank&#8221;;<br />
var thumb = document.createElement(&#8221;img&#8221;);<br />
thumb.src=&#8221;http://open.thumbshots.org/image.pxf?url=&#8221; + link.href;<br />
thumb.alt = &#8220;thumb&#8221;;<br />
thumb.width = GM_getValue(&#8221;width&#8221;, 90);<br />
thumb.height = GM_getValue(&#8221;height&#8221;, 70);<br />
thumb.style.border = &#8220;1px solid #c4c4c4&#8243;;<br />
a.appendChild(thumb);<br />
tBox.appendChild(a);<br />
parent.parentNode.insertBefore(tBox, parent);</p>
<p>insertEle.insertBefore(toggle, insertEle.firstChild);<br />
insertEle.insertBefore(setBox, insertEle.firstChild.nextSibling);</p>
<p>switch(thumb.width){<br />
case 70:<br />
sele.style.color = &#8220;#fff&#8221;;<br />
sele.style.backgroundColor = &#8220;#6C6C6C&#8221;;<br />
break;<br />
case 90:<br />
seleM.style.color = &#8220;#fff&#8221;;<br />
seleM.style.backgroundColor = &#8220;#6C6C6C&#8221;;<br />
break;<br />
case 120:<br />
seleL.style.color = &#8220;#fff&#8221;;<br />
seleL.style.backgroundColor = &#8220;#6C6C6C&#8221;;<br />
break;<br />
};<br />
};</p>
<p>link.style.display = &#8220;block&#8221;;<br />
link.style.paddingLeft = &#8220;5px&#8221;;<br />
var linkContainer = document.createElement(&#8221;div&#8221;);<br />
linkContainer.style.marginLeft = &#8220;30px&#8221;;<br />
parent.insertBefore(linkContainer,link.nextSibling);<br />
linkContainer.appendChild(link);</p>
<p>sele.addEventListener(&#8221;click&#8221;,function(e){<br />
thumb.width = &#8220;70&#8243;;<br />
thumb.height = &#8220;60&#8243;;<br />
this.style.color = &#8220;#fff&#8221;;<br />
this.style.backgroundColor = &#8220;#6C6C6C&#8221;;<br />
seleM.style.color = &#8220;#666666&#8243;;<br />
seleM.style.backgroundColor = &#8220;#fff&#8221;;<br />
seleL.style.color = &#8220;#666666&#8243;;<br />
seleL.style.backgroundColor = &#8220;#fff&#8221;;<br />
set(thumb);<br />
e.preventDefault();<br />
},false);</p>
<p>seleM.addEventListener(&#8221;click&#8221;,function(e){<br />
thumb.width = &#8220;90&#8243;;<br />
thumb.height = &#8220;70&#8243;;<br />
this.style.color = &#8220;#fff&#8221;;<br />
this.style.backgroundColor = &#8220;#6C6C6C&#8221;;<br />
sele.style.color = &#8220;#666666&#8243;;<br />
sele.style.backgroundColor = &#8220;#fff&#8221;;<br />
seleL.style.color = &#8220;#666666&#8243;;<br />
seleL.style.backgroundColor = &#8220;#fff&#8221;;<br />
set(thumb);<br />
e.preventDefault();<br />
},false);</p>
<p>seleL.addEventListener(&#8221;click&#8221;,function(e){<br />
thumb.width = &#8220;120&#8243;;<br />
thumb.height = &#8220;90&#8243;;<br />
this.style.color = &#8220;#fff&#8221;;<br />
this.style.backgroundColor = &#8220;#6C6C6C&#8221;;<br />
sele.style.color = &#8220;#666666&#8243;;<br />
sele.style.backgroundColor = &#8220;#fff&#8221;;<br />
seleM.style.color = &#8220;#666666&#8243;;<br />
seleM.style.backgroundColor = &#8220;#fff&#8221;;<br />
set(thumb);<br />
e.preventDefault();<br />
},false);</p>
<p>// lxl added: open link in a new tab<br />
link.target = &#8220;_blank&#8221;;<br />
// lxl added: open link in a new tab</p>
<p>};</p>
<p>var addStyle = (function(){<br />
var style = &#8220;ul.bookmarks li.post h4 a {background-color: #EFF5FB;}&#8221;;<br />
style += &#8220;ul.bookmarks li.post h4 a:hover {color: #fff; text-decoration: none; background-color: #3472D0;}&#8221;;<br />
style += &#8220;ul.bookmarks li.post .description {margin-left: 130px; width: 84%;}&#8221;;<br />
style += &#8220;.main #popular ul.bookmarks li.post .bookmark {padding-left:80px;}&#8221;;<br />
style += &#8220;ul li.post .bookmark .full-url {margin: 5px 3px;}&#8221;;<br />
style += &#8220;ul.bookmarks li.post .TITLEONLY h4 a.taggedlink, ul.bookmarks li.post .TITLEONLY h4 .editdel {float: none;}&#8221;;<br />
style += &#8220;ul.bookmarks li.post h4 .editdel a.action {padding: 0px 5px;}&#8221;;<br />
style += &#8220;ul li.post .bookmark .full-url {margin: 5px 5px 5px 110px;}&#8221;;<br />
style += &#8220;#sidenav-title {margin-top:20px;}&#8221;;<br />
style += &#8220;#toggleBox h3 {width:190px; margin:0px 0px 10px 30px;}&#8221;;<br />
style += &#8220;#sizeSetBox {margin:0px 0px 5px 30px;}&#8221;;<br />
style += &#8220;#sizeSetBox a {color:#666666; margin:0px 3px 0px 0px; padding:2px 0px 2px 16px; display:block; border-bottom:1px solid #E3E3E3;}&#8221;;<br />
GM_addStyle(style);<br />
})();</p>
<p>var faviThumb = function(){<br />
var path = [<br />
'.//h4/a[@class="inlinesave action" or @class="action" or @class="inlinesave"]&#8216;,<br />
&#8216;.//span[@class="saved"]&#8216;,<br />
&#8216;.//h4/div[@class="editdel"]&#8216;,<br />
].join(&#8221; | &#8220;);<br />
forEachMatch(&#8217;.//a[@class="taggedlink"]&#8216;, addImg);<br />
forEachMatch(path,addSave);<br />
};<br />
faviThumb();</p>
<p>window.AutoPagerize&amp;&amp;window.AutoPagerize.addFilter(<br />
function(docs){<br />
docs.forEach(faviThumb);<br />
});</p>
<p>function revertIcon(event) {<br />
this.src=&#8221;http://media.aruko.net/favicon/m/file.gif&#8221;;<br />
};</p>
<p>function set(t){<br />
GM_setValue(&#8221;width&#8221;,t.width);<br />
GM_setValue(&#8221;height&#8221;,t.height);<br />
};</p>
<p>function addSave(links){<br />
if (!links) return;<br />
if (links.parentNode.nodeName.toLowerCase() == &#8216;div&#8217;) return;<br />
var saveBox = document.createElement(&#8221;div&#8221;);<br />
saveBox.style.marginTop = &#8220;5px&#8221;;<br />
saveBox.style.marginLeft = &#8220;30px&#8221;;<br />
var boxParent = links.parentNode;<br />
saveBox.appendChild(links);<br />
boxParent.appendChild(saveBox);<br />
};</p>
<p>function forEachMatch(path, f, root) {<br />
var el;<br />
var root = (root == null) ? document : root;<br />
var matches = root.evaluate(<br />
path, root, null,<br />
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);<br />
for (var i=0;el=matches.snapshotItem(i);i++)<br />
f(el);<br />
};</p>
<p>})();</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2008/12/09/%e6%8a%8a-delicious-%e6%94%b9%e9%80%a0%e6%88%90-blinklist/feed/</wfw:commentRss>
		</item>
		<item>
		<title>blinklist.com 2.0 终于发布了，但是&#8230;&#8230;</title>
		<link>http://topo.72pines.com/2008/12/01/blinklistcom-20-%e7%bb%88%e4%ba%8e%e5%8f%91%e5%b8%83%e4%ba%86%ef%bc%8c%e4%bd%86%e6%98%af/</link>
		<comments>http://topo.72pines.com/2008/12/01/blinklistcom-20-%e7%bb%88%e4%ba%8e%e5%8f%91%e5%b8%83%e4%ba%86%ef%bc%8c%e4%bd%86%e6%98%af/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 20:49:37 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/2008/12/01/blinklistcom-20-%e7%bb%88%e4%ba%8e%e5%8f%91%e5%b8%83%e4%ba%86%ef%bc%8c%e4%bd%86%e6%98%af/</guid>
		<description><![CDATA[盼星星盼月亮，终于盼来了 blinklist 2.0 发布了。
对比 blinklist 和 delicious， blinklist 更符合我的个人习惯，包括在新 tab 里面打开书签连接，快速转换网页快照和列表显示方式，favorite 方式，tag cloud 方式等等功能（我的 delicious 需要用 greasemonkey+custom script 来实现其中一些功能，当然，只能在 Firefox 里面才可以）。
但是 blinklist 1.0 一直有个问题，就是速度慢（而且越来越慢），慢到无法忍受的地步。官方论坛上 Mike 一直吹 2.0 多么多么地改进了速度、界面，让人无法不期待。
星期六终于丑媳妇见公婆了，我的近千条书签居然只剩下90条，私密的书签也被公开，龟速依旧，原有的特色功能被大幅裁减，甚至连官方提供的 Firefox addon 也无法 blink 新书签，omg，别的网站做到这种程度恐怕连 alpha 都不好意思讲，blinklist.com 居然敢发布。
To be honest, now I feel embarrassed to tell people I am using blinklist as my primary social bookmark manager, [...]]]></description>
			<content:encoded><![CDATA[<p>盼星星盼月亮，终于盼来了 blinklist 2.0 发布了。</p>
<p>对比 <a href="http://blinklist.com" target="_blank">blinklist </a>和 <a href="http://delicious.com" target="_blank">delicious</a>， blinklist 更符合我的个人习惯，包括在新 tab 里面打开书签连接，快速转换网页快照和列表显示方式，favorite 方式，tag cloud 方式等等功能（我的 delicious 需要用 greasemonkey+custom script 来实现其中一些功能，当然，只能在 Firefox 里面才可以）。</p>
<p>但是 blinklist 1.0 一直有个问题，就是速度慢（而且越来越慢），慢到无法忍受的地步。官方论坛上 Mike 一直吹 2.0 多么多么地改进了速度、界面，让人无法不期待。</p>
<p>星期六终于丑媳妇见公婆了，我的近千条书签居然只剩下90条，私密的书签也被公开，龟速依旧，原有的特色功能被大幅裁减，甚至连官方提供的 Firefox addon 也无法 blink 新书签，omg，别的网站做到这种程度恐怕连 alpha 都不好意思讲，blinklist.com 居然敢发布。</p>
<p>To be honest, now I feel embarrassed to tell people I am using blinklist as my primary social bookmark manager, maybe it&#8217;s time to dismiss <a href="http://www.douban.com/group/blinklist/" target="_blank">blinklist douban group</a>.</p>
<p><span style="color: #ff0000"><strong>12/4后续</strong></span>：和网站支持沟通了几次之后，终于把书签全找回来了，目前在适应新版中。由于引入了 Google Gears 插件，速度确有提高，但有些功能还未开启，暂时还看不见朋友。</p>
<p><strong><span style="color: #ff0000">1/5后续</span></strong>：终于放弃了 blinklist。</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2008/12/01/blinklistcom-20-%e7%bb%88%e4%ba%8e%e5%8f%91%e5%b8%83%e4%ba%86%ef%bc%8c%e4%bd%86%e6%98%af/feed/</wfw:commentRss>
		</item>
		<item>
		<title>软件运行文件越小越好吗？</title>
		<link>http://topo.72pines.com/2008/09/26/%e8%bd%af%e4%bb%b6%e8%bf%90%e8%a1%8c%e6%96%87%e4%bb%b6%e8%b6%8a%e5%b0%8f%e8%b6%8a%e5%a5%bd%e5%90%97%ef%bc%9f/</link>
		<comments>http://topo.72pines.com/2008/09/26/%e8%bd%af%e4%bb%b6%e8%bf%90%e8%a1%8c%e6%96%87%e4%bb%b6%e8%b6%8a%e5%b0%8f%e8%b6%8a%e5%a5%bd%e5%90%97%ef%bc%9f/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 06:54:17 +0000</pubDate>
		<dc:creator>topo</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://topo.72pines.com/2008/09/26/%e8%bd%af%e4%bb%b6%e8%bf%90%e8%a1%8c%e6%96%87%e4%bb%b6%e8%b6%8a%e5%b0%8f%e8%b6%8a%e5%a5%bd%e5%90%97%ef%bc%9f/</guid>
		<description><![CDATA[这篇文章是读过善用佳软的“超级小巧的5款免费款树状笔记软件”后，关于软件运行文件大小的一些感想。
在其他条件都相同的理想情况下，当然同样尺寸的软件，实现功能越多越好，这是没有疑问的。
不过&#8230;&#8230;
首先，其他条件都相同这个情况，本身就非常不容易满足；
其次，即使满足了其他条件都相同 ，如何衡量和比较不同软件的实现功能呢？如果两个软件的运行文件大小一样，A 软件实现了 10 个功能，完成每个功能各需要 1 分钟，B 软件实现了 8 个功能，完成每个功能各需要 30 秒，虽然 A 软件的实现功能比 B 软件多，但用户对 A 软件的评价是否一定比 B 软件高呢？
我们现在来看看，软件运行文件的大小都受什么因素影响。
1、编译器优化方面的因素
以 C 为例， 编译器提供了 inline function（或者用 #define 的变种），就是牺牲文件运行代码的尺寸来换取运行速度的提高（这在需要实时快速反应的软件来说尤其重要），使用了 inline function 的运行文件，尺寸比较大；
现代的高级语言编译器，都有各种优化选项，供程序员选择，比如 gcc 中的 -O 选项就相当复杂，可参看 info gcc 中的 Optimize Options 一节，-O 默认的优化目标是产生的代码小，运行效率高，但实际情况中，这两方面往往是互相矛盾的。由于优化技术已经很成熟，用高级语言编程的代码，经编译器优化后，不同程序员之间的差别越来越小，所以高手间代码本身尺寸大小的对决，往往是汇编这一层次的较量，在高级语言层次，除非实现方法完全不同，否则很难从文件尺寸上分出高下。
2、 软件运行环境的因素
同样一个 hello world 的实现，如果用 perl 来写，一行字符的脚本就能搞定，而用 C 写一个简单的程序编译成可执行代码则要2KB多，表面上看来，用 perl 写出来的代码小，但是 perl 脚本需要有 perl 解释环境才能运行，如果把 [...]]]></description>
			<content:encoded><![CDATA[<p>这篇文章是读过<a href="http://xbeta.info/" target="_blank">善用佳软</a>的<a href="http://xbeta.info/5-treenote.htm" target="_blank">“超级小巧的5款免费款树状笔记软件”</a>后，关于软件运行文件大小的一些感想。</p>
<p>在其他条件都相同的理想情况下，当然同样尺寸的软件，实现功能越多越好，这是没有疑问的。</p>
<p>不过&#8230;&#8230;</p>
<p>首先，<strong>其他条件都相同</strong>这个情况，本身就非常不容易满足；</p>
<p>其次，即使满足了<strong>其他条件都相同</strong> ，如何衡量和比较不同软件的实现功能呢？如果两个软件的运行文件大小一样，A 软件实现了 10 个功能，完成每个功能各需要 1 分钟，B 软件实现了 8 个功能，完成每个功能各需要 30 秒，虽然 A 软件的实现功能比 B 软件多，但用户对 A 软件的评价是否一定比 B 软件高呢？</p>
<p>我们现在来看看，软件运行文件的大小都受什么因素影响。</p>
<p>1、编译器优化方面的因素</p>
<p>以 C 为例， 编译器提供了 inline function（或者用 #define 的变种），就是牺牲文件运行代码的尺寸来换取运行速度的提高（这在需要实时快速反应的软件来说尤其重要），使用了 inline function 的运行文件，尺寸比较大；</p>
<p>现代的高级语言编译器，都有各种优化选项，供程序员选择，比如 gcc 中的 -O 选项就相当复杂，可参看 info gcc 中的 Optimize Options 一节，-O 默认的优化目标是产生的代码小，运行效率高，但实际情况中，这两方面往往是互相矛盾的。由于优化技术已经很成熟，用高级语言编程的代码，经编译器优化后，不同程序员之间的差别越来越小，所以高手间代码本身尺寸大小的对决，往往是汇编这一层次的较量，在高级语言层次，除非实现方法完全不同，否则很难从文件尺寸上分出高下。</p>
<p>2、 软件运行环境的因素</p>
<p>同样一个 hello world 的实现，如果用 perl 来写，一行字符的脚本就能搞定，而用 C 写一个简单的程序编译成可执行代码则要2KB多，表面上看来，用 perl 写出来的代码小，但是 perl 脚本需要有 perl 解释环境才能运行，如果把 perl 解释环境都加入考虑的范畴，那么 perl 脚本的尺寸要比 C 编译出来的可执行代码要大很多了。</p>
<p>类似的软件环境还有 .NET,  JRE, python, PHP&#8230;&#8230; 等等。脱离了软件运行环境，只比较运行软件文件的大小，得出的结果意义并不大。</p>
<p>3、 动态库的因素</p>
<p>现在一般用户接触到的软件，已经很少能找到不加载动态库的了，用 Microsoft Visual C++ 写 Windows GUI 界面软件，最常见的就是使用 MFC，如果选择动态连接的话，生成的可执行代码会很小，但运行过程中系统必须加载相应版本的 MFC dll。如果只比较可执行代码，而不是同时也使用 <a href="http://www.dependencywalker.com/" target="_blank">depends</a> (Windows) 或者 <a href="http://www.linuxcommand.org/man_pages/ldd1.html" target="_blank">ldd</a> (Linux) 来考虑它们需要加载的动态库的话，就有失偏颇了。</p>
<p>有时为了满足特定系统的需求或者运行稳定性要求，程序员也会编译出静态连接的可执行代码，比如</p>
<p>. 系统不支持动态库，如 DOS</p>
<p>. 某些低层软件可能在动态库系统还未建立时就需要运行，如用不含 initrd 的嵌入式 Linux 小系统中的 busybox/init，在它开始执行时包含动态库文件系统可能还未加载</p>
<p>. 为避免不同版本动态库的冲突而故意编译成静态连接软件，这种软件不依赖系统中的动态库，可以不考虑不同版本之间的兼容性，有时能大大节省技术支持部门的开销。</p>
<p>4、跟程序员有关的附加信息</p>
<p>这一部分也许和一般用户关系不大，但有时它也是影响软件可执行文件大小的因素</p>
<p>. Debug 版本，这类软件含有调试信息，在软件出现问题时对程序员非常宝贵，尤其是在这个 beta 满天飞的时代</p>
<p>. paranoid 型容错编程风格，假如两个程序员写出的程序是这样的：</p>
<p>程序员 A 的：</p>
<p>function foo()</p>
<p>{</p>
<p>try {</p>
<p>job1();</p>
<p>job2();</p>
<p>job3();</p>
<p>} catch exception(e)</p>
<p>{ exception_handler(e);}</p>
<p>}</p>
<p>程序员 B 的：</p>
<p>function foo()</p>
<p>{</p>
<p>job1();</p>
<p>job2();</p>
<p>job3();<br />
}</p>
<p>程序员 B 的版本一定会比程序员 A 的版本小，但是说实话，我宁可要尺寸较大的程序员 A 的版本。</p>
]]></content:encoded>
			<wfw:commentRss>http://topo.72pines.com/2008/09/26/%e8%bd%af%e4%bb%b6%e8%bf%90%e8%a1%8c%e6%96%87%e4%bb%b6%e8%b6%8a%e5%b0%8f%e8%b6%8a%e5%a5%bd%e5%90%97%ef%bc%9f/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
