<?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>李凡希的Blog</title>
	<atom:link href="http://www.freemindworld.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.freemindworld.com/blog</link>
	<description>Free as in Freedom</description>
	<lastBuildDate>Fri, 18 May 2012 03:10:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>泰国游记</title>
		<link>http://www.freemindworld.com/blog/2012/120427_travel_to_thailand.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120427_travel_to_thailand.shtml#comments</comments>
		<pubDate>Fri, 27 Apr 2012 12:46:06 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[游记]]></category>
		<category><![CDATA[旅游]]></category>
		<category><![CDATA[泰国]]></category>
		<category><![CDATA[照片]]></category>
		<category><![CDATA[贴士]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=1037</guid>
		<description><![CDATA[2008年菲律宾、2009年台湾省、2010年美国硅谷、2011年美国硅谷，最近几年每年都有一次出境的机会，运气还不错。前几天公司组织了一次以自费为主的泰国游，行程总得来说不是很有意思，就在这里分享一下这次行程的一些Tips和体会，供大家参考。 本次行程主要包含泰国曼谷和芭提雅两个城市，总共在泰国呆5个白天，由于是跟团游，总的感觉是所有的时间都被旅行社占用掉了，完全没有自主的时间。这点对于喜欢乱逛的我来说是很郁闷的，尤其是没有机会去体验曼谷市区的轨道交通，颇为遗憾。 在出发前，建议在国内提前到银行预约泰铢的兑换，在国内兑换的汇率比在泰国要合算的多，最不济的情况下，在泰国的ATM机上用银联卡直接提款也比在机场或导游那里兑换要合算。泰国银联的普及率还是比较高的，大部分情况下用银联卡比走VISA/MasterCard是要合算的。 泰国天气较热，阳光也比较强烈，最好准备SPF指数较高的防晒产品。跟其它国家一样，酒店大多不提供一次性用品，自己带上比较靠谱。泰国电压跟中国一样AC220V 50Hz，插座大多是美标的三脚插座，两脚插头的设备都没有压力，三脚的可能需要转换器。 泰国洒店大多不提供免费Wi-Fi和Internet服务，可以付费使用但价格较高，或者可以在泰国购买手机卡打电话或上网。中国移动和中国电信的泰国漫游资费都比较高，GSM和CDMA网络泰国都有，不用换手机。 泰国有遍地的7-Eleven便利店，在那里可以买到日常用品和手机卡。便利店的店员不保证能听懂中文或英文，但酒店和旅游场所的人大多会一点中文或英文。 TrueMove运营商为游客设计的手机卡49泰铢一张，另外可以用充值卡充值50或90铢。打中国的电话是1.07铢/分钟，上网可以用50铢包50M的流量。以我个人的经历，TrueMove的网络很不怎么样，常常上不了网，而且扣费也扣得莫明其妙。客服电话是收费的，而且只有泰文提示音，我是乱按了好久才转接到人工服务的，人工服务可以用英语。所以如果要用TrueMove，应该在国内时先上网查好它的各项服务的使用方法。 泰国服务业普遍有收小费的习惯，一般情况下可以给20泰铢左右。 我的这次行程景点主要包括曼谷的玉佛寺、大皇宫、湄南河、大城王朝遗迹（维修中）、芭堤雅水上集市、金沙岛和五世皇行宫，总体来说没有感觉看到有特别让人Wow的东西。进入皇家的建筑要求穿长裤和有袖上衣，不然就只能花钱买一条布把自己围起来了。 导游带的泰国购物点主要包括珠宝中心、皮件中心、燕窝中心、干果市场、毒蛇研究中心和免税店。某种程度上说宝石、鳄鱼皮、燕窝、水果干和蛇药确实可以算是泰国的特产，是值得买的，但对于导游带去的购物点，尤其是珠宝中心，还是尽量要谨慎一些，如果确实要买，建议提前做功课。我对于干果市场的水果干品质表示极度怀疑，所以后来特地偷闲跑到曼谷当地一家很大的Tesco Lotus超市去，结果发现这么大的综合超市中完全不见水果干这种商品，7-Eleven/Big C便利店也没有，看来水果干这个东西是“特供”外国游客了。在泰国购买欧莱雅的化妆品相比国内比较有优势，其它的都明显比美国或香港要贵得多。Lee的牛仔裤大约2000铢左右，跟美国或菲律宾比也很没有优势。 最具泰国特色的人妖表演或相关的“自费”项目，实话说没有什么特别值得一看，大多所谓表演很拙劣，不具有艺术性，可以映证那句“不看后悔，看了也后悔”的话。相对来说在芭提雅艺城看的泰国历史文化演出还比较有意思一点，不过这个如果不提前做点功课了解一点泰国历史的话， 看不懂。 泰国很多景点都有一个不错的营销模式，在游客进入景区时，会有人以迅雷不及掩耳之势为各位游客拍摄照片。等游客游完景点后，这些照片已经冲印完毕并嵌入相框，或做成盆子、杯子之类的工艺品，放在景点门口以100-200铢的价格出售。尽管大家都自己带着相机拍照，但看到这些成品的照片还是会有很多人愿意花钱买下来。这种“所见即所得”的营销模式，感觉比在国内常见的搭个大阳伞被动等人花钱来拍照的的效果要好得多。 泰国新鲜的热带水果还是很便宜的，椰子即使在景区宰客的情况下，也只有20-25铢一个。山竹、榴莲、红毛丹和芒果都很值得推荐 。对了，还有DQ的冰淇凌也很便宜，小杯的只要29铢。 大部分照片都按惯例放在Picasa相册（包括Google+）中了，有兴趣的自行设法去看吧： View all Get your own]]></description>
			<content:encoded><![CDATA[<p><a title="Home Building Project" href="https://picasaweb.google.com/101128035604430034036/081110HomeBuildingProject">2008年菲律宾</a>、<a title="Taiwan" href="https://picasaweb.google.com/101128035604430034036/091016Taiwan">2009年台湾省</a>、<a title="USA" href="https://picasaweb.google.com/101128035604430034036/100301USA">2010年美国硅谷</a>、<a title="USA" href="https://picasaweb.google.com/101128035604430034036/110821USATrip">2011年美国硅谷</a>，最近几年每年都有一次出境的机会，运气还不错。前几天公司组织了一次以自费为主的<a title="Thailand" href="https://picasaweb.google.com/101128035604430034036/120419Thailand">泰国游</a>，行程总得来说不是很有意思，就在这里分享一下这次行程的一些Tips和体会，供大家参考。</p>
<p>本次行程主要包含泰国曼谷和芭提雅两个城市，总共在泰国呆5个白天，由于是跟团游，总的感觉是所有的时间都被旅行社占用掉了，完全没有自主的时间。这点对于喜欢乱逛的我来说是很郁闷的，尤其是没有机会去体验曼谷市区的轨道交通，颇为遗憾。</p>
<p>在出发前，建议在国内提前到银行预约泰铢的兑换，在国内兑换的汇率比在泰国要合算的多，最不济的情况下，在泰国的ATM机上用银联卡直接提款也比在机场或导游那里兑换要合算。泰国银联的普及率还是比较高的，大部分情况下用银联卡比走VISA/MasterCard是要合算的。</p>
<p>泰国天气较热，阳光也比较强烈，最好准备SPF指数较高的防晒产品。跟其它国家一样，酒店大多不提供一次性用品，自己带上比较靠谱。泰国电压跟中国一样AC220V 50Hz，插座大多是美标的三脚插座，两脚插头的设备都没有压力，三脚的可能需要转换器。</p>
<p>泰国洒店大多不提供免费Wi-Fi和Internet服务，可以付费使用但价格较高，或者可以在泰国购买手机卡打电话或上网。中国移动和中国电信的泰国漫游资费都比较高，GSM和CDMA网络泰国都有，不用换手机。</p>
<p>泰国有遍地的7-Eleven便利店，在那里可以买到日常用品和手机卡。便利店的店员不保证能听懂中文或英文，但酒店和旅游场所的人大多会一点中文或英文。</p>
<p><a title="TureMove InterSIM" href="http://www.truemove.com/en/Inter-SIM-Prepay.rails">TrueMove</a>运营商为游客设计的手机卡49泰铢一张，另外可以用充值卡充值50或90铢。打中国的电话是1.07铢/分钟，上网可以用50铢包50M的流量。以我个人的经历，TrueMove的网络很不怎么样，常常上不了网，而且扣费也扣得莫明其妙。客服电话是收费的，而且只有泰文提示音，我是乱按了好久才转接到人工服务的，人工服务可以用英语。所以如果要用TrueMove，应该在国内时先上网查好它的各项服务的使用方法。</p>
<p>泰国服务业普遍有收小费的习惯，一般情况下可以给20泰铢左右。</p>
<p>我的这次行程景点主要包括曼谷的玉佛寺、大皇宫、湄南河、大城王朝遗迹（维修中）、芭堤雅水上集市、金沙岛和五世皇行宫，总体来说没有感觉看到有特别让人Wow的东西。进入皇家的建筑要求穿长裤和有袖上衣，不然就只能花钱买一条布把自己围起来了。</p>
<p>导游带的泰国购物点主要包括珠宝中心、皮件中心、燕窝中心、干果市场、毒蛇研究中心和免税店。某种程度上说宝石、鳄鱼皮、燕窝、水果干和蛇药确实可以算是泰国的特产，是值得买的，但对于导游带去的购物点，尤其是珠宝中心，还是尽量要谨慎一些，如果确实要买，建议提前做功课。我对于干果市场的水果干品质表示极度怀疑，所以后来特地偷闲跑到曼谷当地一家很大的Tesco Lotus超市去，结果发现这么大的综合超市中完全不见水果干这种商品，7-Eleven/Big C便利店也没有，看来水果干这个东西是“特供”外国游客了。在泰国购买欧莱雅的化妆品相比国内比较有优势，其它的都明显比美国或香港要贵得多。Lee的牛仔裤大约2000铢左右，跟美国或菲律宾比也很没有优势。</p>
<p>最具泰国特色的人妖表演或相关的“自费”项目，实话说没有什么特别值得一看，大多所谓表演很拙劣，不具有艺术性，可以映证那句“不看后悔，看了也后悔”的话。相对来说在芭提雅艺城看的泰国历史文化演出还比较有意思一点，不过这个如果不提前做点功课了解一点泰国历史的话， 看不懂。</p>
<p>泰国很多景点都有一个不错的营销模式，在游客进入景区时，会有人以迅雷不及掩耳之势为各位游客拍摄照片。等游客游完景点后，这些照片已经冲印完毕并嵌入相框，或做成盆子、杯子之类的工艺品，放在景点门口以100-200铢的价格出售。尽管大家都自己带着相机拍照，但看到这些成品的照片还是会有很多人愿意花钱买下来。这种“所见即所得”的营销模式，感觉比在国内常见的搭个大阳伞被动等人花钱来拍照的的效果要好得多。</p>
<p>泰国新鲜的热带水果还是很便宜的，椰子即使在景区宰客的情况下，也只有20-25铢一个。山竹、榴莲、红毛丹和芒果都很值得推荐 。对了，还有DQ的冰淇凌也很便宜，小杯的只要29铢。</p>
<p>大部分照片都按惯例放在Picasa相册（包括Google+）中了，有兴趣的自行设法去看吧：</p>
<div style="text-align: center; width: 400px; font-family: arial,sans-serif; font-size: 13px;">
<div><object width="400" height="267" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="https://picasaweb.google.com/s/c/bin/slideshow.swf" /><param name="flashvars" value="host=picasaweb.google.com&amp;captions=1&amp;hl=en_US&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F101128035604430034036%2Falbumid%2F5735317208219269777%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" /><embed width="400" height="267" type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" flashvars="host=picasaweb.google.com&amp;captions=1&amp;hl=en_US&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F101128035604430034036%2Falbumid%2F5735317208219269777%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object></div>
<p><span style="float: left;"><a style="color: #3964c2;" href="https://picasaweb.google.com/101128035604430034036/120419Thailand?authuser=0&amp;feat=flashalbum">View all</a></span></p>
<div style="text-align: right;"><a style="color: #3964c2;" href="http://picasaweb.google.com/lh/getEmbed?feat=flashalbum">Get your own</a></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120427_travel_to_thailand.shtml/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>体验WPS for Linux</title>
		<link>http://www.freemindworld.com/blog/2012/120328_wps_for_linux_experience.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120328_wps_for_linux_experience.shtml#comments</comments>
		<pubDate>Wed, 28 Mar 2012 15:27:14 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[工具]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=1025</guid>
		<description><![CDATA[昨天得知WPS for Linux开始发放测试邀请，马上去申请了一下，今天拿到了邀请码，回到家速度展开测试。 这次放出的WPS for Linux实际上只包含了Kingsoft Presentation这一个组件，以DEB包的方式发布，122M大，不算小。 安装： 我所使用的系统是Debian， i686架构，使用GNOME桌面， WPS for Linux的安装包在我的环境中缺少ttf-mscorefonts-installer这个依赖，这个不难解决，apt-get一下就行。之所以要依赖这些Windows下字体，我想可能是为了在不同的平台下提供一个比较一致的体验吧。 解决依赖问题后，用dpkg -i直接安装WPS for Linux，报了一堆错： /usr/bin/xdg-mime: 769: cannot create /root/.local/share/applications/defaults.list.new: Directory nonexistent grep: /root/.local/share/applications/defaults.list.new: No such file or directory 不知道为什么安装程序非要不依不饶往/root/.local中去注册MIME类型，写/usr/local/share中不好么？反正都给了root权限了。不管怎么说，帮它创建好一个/root/.local/share/applications目录，然后重新安装，安装成功。 运行： 安装后，在菜单中Office项中，会出现Kingsoft Presentation项，点了点，没有反应。出现这种现象常常是因为库的问题，所以去命令行运行wpp： /opt/kingsoft/wps-office/office6/wpp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not &#8230; <a href="http://www.freemindworld.com/blog/2012/120328_wps_for_linux_experience.shtml">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>昨天得知WPS for Linux开始发放测试邀请，马上去申请了一下，今天拿到了邀请码，回到家速度展开测试。</p>
<p>这次放出的WPS for Linux实际上只包含了Kingsoft Presentation这一个组件，以DEB包的方式发布，122M大，不算小。</p>
<p><strong>安装：</strong></p>
<p>我所使用的系统是Debian， i686架构，使用GNOME桌面， WPS for Linux的安装包在我的环境中缺少ttf-mscorefonts-installer这个依赖，这个不难解决，apt-get一下就行。之所以要依赖这些Windows下字体，我想可能是为了在不同的平台下提供一个比较一致的体验吧。</p>
<p>解决依赖问题后，用dpkg -i直接安装WPS for Linux，报了一堆错：</p>
<pre>/usr/bin/xdg-mime: 769: cannot create /root/.local/share/applications/defaults.list.new: Directory nonexistent
grep: /root/.local/share/applications/defaults.list.new: No such file or directory</pre>
<p>不知道为什么安装程序非要不依不饶往/root/.local中去注册MIME类型，写/usr/local/share中不好么？反正都给了root权限了。不管怎么说，帮它创建好一个/root/.local/share/applications目录，然后重新安装，安装成功。</p>
<p><strong>运行：</strong></p>
<p>安装后，在菜单中Office项中，会出现Kingsoft Presentation项，点了点，没有反应。出现这种现象常常是因为库的问题，所以去命令行运行wpp：</p>
<pre>/opt/kingsoft/wps-office/office6/wpp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /opt/kingsoft/wps-office/office6/libkso10.so.1)</pre>
<p>好吧，libstdc++库的问题，我的Debian Squeeze中带的版本太低了。在Debian网站上找一个sid中的<a title="Debian sid中的libstdc++" href="http://packages.debian.org/sid/i386/libstdc++6/download" target="_blank">版本</a>，直接装是不敢啦，怕把系统搞挂了（实际上也装不上，因为别的依赖的问题），所以用dpkg-deb -x把它解开，然后用加上LD_LIBRARY_PATH的方式运行，WPS for Linux的Presentation界面终于出现在我的眼前了。</p>
<div id="attachment_1026" class="wp-caption aligncenter" style="width: 1035px"><a href="http://www.freemindworld.com/blog/2012/120328_wps_for_linux_experience.shtml/120328a" rel="attachment wp-att-1026"><img class="size-full wp-image-1026" title="WPS for Linux Presentation主界面" src="http://www.freemindworld.com/blog/wp-content/uploads/2012/03/120328a.jpg" alt="WPS for Linux Presentation主界面" width="1025" height="756" /></a><p class="wp-caption-text">WPS for Linux Presentation主界面</p></div>
<p><strong>体验：</strong></p>
<p>WPS Presentation提供了两种风格的界面，包括类似于Office 2003的经典界面和类似于Office 2007+的Ribbon界面。可以通过“切换界面”按钮或菜单项完成切换。</p>
<p>WPS Presentation支持的文件格式不多，只有它自己的.dps格式和Office的.ppt/.pptx格式。.odp格式没有被支持这点不是很美好，也很出乎我的意料。它也没有提供导出.pdf的功能，也不是很美好。</p>
<p>作为WPS一贯的作风，它对Office文件的兼容性还是相当不错的，打开.ppt文件展现出来效果跟Windows下比并没有严重的走样。</p>
<p><del>保存文件的功能在我的环境中有严重的问题，会直接导致程序core掉，不知道跟我简单偷换libstdc++.so有没有关系。</del>跟locale有关，用dpkg-reconfigure locales加上zh_CN.UTF-8的locale后，问题就消失了。原本我机器上只有en_US.UTF-8的locale。</p>
<p>WPS Presentation在首页上提供了从金山网站在线下载幻灯片模版的功能，很好用，有些模版也比较好看。相对而言，Office提供的这样的功能我就从来都没用过。</p>
<p>从使用感觉上来说，跟被我淘汰了有一阵子了的OpenOffice.org和正在使用的LibreOffice相比，WPS给我留下的最直接的印象是：快。整个软件在我的机器上表现非常流畅，用起来很舒服，这点很让我满意。</p>
<p>WPS没有提供英文拼写检查的功能，不过作为一个面向国人的软件来说，不算是太大的问题。</p>
<p>软件的稳定性似乎还存在一定的问题，在试用过程中，发生过若干次莫名其妙的crash，但暂时还没有找到稳定重现的方法。</p>
<p>体验完了WPS Presentation，期待WPS的Word Processing System早日登场。</p>
<p>PS. 突然有点怀念下面的这个界面：</p>
<div id="attachment_1027" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.freemindworld.com/blog/2012/120328_wps_for_linux_experience.shtml/120328b" rel="attachment wp-att-1027"><img class="size-full wp-image-1027" title="UCDOS下的WPS启动界面" src="http://www.freemindworld.com/blog/wp-content/uploads/2012/03/120328b.gif" alt="UCDOS下的WPS启动界面" width="500" height="375" /></a><p class="wp-caption-text">UCDOS下的WPS启动界面</p></div>
<p>还有多少人记得Ctrl + q i u b o j u n是用来做什么的？</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120328_wps_for_linux_experience.shtml/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>偷梁换柱终级版：用最少的步骤在Bambook上阅读原生EPUB文件</title>
		<link>http://www.freemindworld.com/blog/2012/120313_bambook_epub_with_calibre_final.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120313_bambook_epub_with_calibre_final.shtml#comments</comments>
		<pubDate>Tue, 13 Mar 2012 12:37:37 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[折腾]]></category>
		<category><![CDATA[Bambook]]></category>
		<category><![CDATA[calibre]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[电子书]]></category>
		<category><![CDATA[盛大]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=1010</guid>
		<description><![CDATA[本文内容已过时，云梯0.98b版本开始，直接支持向Bambook中传送原生EPUB格式文件，不再需要用本文的方法去折腾了。 我不得不说，伸手党是促进社会劳动生产率不断进步的源泉。 前一篇“偷梁换柱”写完以后放到某论坛上，很快就有伸手党跳出来说，还是太复杂了，能不能把所有的东西写成一个软件一运行就好了。我有点生气的回复他，可以，不过我没有兴趣和精力做这个。不过过了一会儿转念想想，其实这事儿吧，也真没有那么难。花了几十分钟，搞定了这个“终级版”的“偷梁换柱”，希望后面我不要再想出什么更好的办法来，不然我真不知道该用什么词来做文章的标题了。 目标：把calibre中管理的自有EPUB格式的电子书传到Bambook中原生阅读，不做格式转换。 适用人群：Bambook用户，有用Bambook阅读原生EPUB格式电子书的需求，基本会用calibre管理电子书，会用记事本修改文本文件，能知道自己所用电脑的IP地址。 系统与环境要求：安装过云梯和calibre的Windows操作系统，Bambook通过USB连接，可以通过该Windows系统代理上网。或者安装过calibre的Windows操作系统，Bambook通过Wi-Fi上网。（其它操作系统的用户，也可以参照执行，完全是可行的，只是本文中不做针对性说明，如果有问题，可以留言询问） 1. 从本站下载工具包： 本地下载：工具包 把下载的文件解压缩到硬盘上，比如C:\，得到fakedns.py和fakehttp.py。还有两个批处理1.bat和2.bat。 2. 运行脚本文件 如果calibre是安装在默认的C:\Program Files\Calibre2中，直接双击运行1.bat和2.bat即可。运行成功的话，会在屏幕上保留两个命令提示符的窗口，里面会显示本机IP，后面还会不断显示一些调试信息。 如果calibre不是装在默认路径下：用记事本打开1.bat和2.bat，修改里面的calibre安装路径后再运行。 两个脚本运行后，都会在屏幕上打出本机的IP地址。如果与实际情况不符，请把命令提示符窗口关掉，用记事本修改脚本文件中的IP = &#8220;&#8221;行，写成IP = &#8220;192.168.0.1&#8243;这样的形式，强行指定本机IP，保存后重新运行这两个脚本。 3. 修改电脑或Bambook的DNS设置，指向我们的假DNS服务器 为了确保成功，在这里先把Bambook断开USB或无线连接，并重启一次。 如果用电脑USB共享给Bambook上网，就修改电脑上网网卡上的DNS设置，改成本机的IP地址（在第2步的脚本运行过程中会打印在屏幕上，照抄就行了）。改完后，把Bambook用USB连接到电脑上。 如果Bambook自己Wi-Fi无线上网，就修改Bambook上网络配置中的DNS设置，设成电脑的IP地址。改完后，关闭并重新开启Bambook的无线连接。 在修改前，请记下原来的值（也有可能原来选的是“自动获取”），以便在用完后把它恢复原样。 4. 启动calibre服务器 运行calibre，主界面下“连接/共享”-&#62;“启动连接服务”，这时calibre应该会在8080端口上启动http服务器，提供 OPDS服务，可以通过访问http://127.0.0.1:8080/opds来验证。（这是在默认配置的情况下，如果有改变过配置，需修改fakehttp.py中的URL） 搞定了！ 在Bambook上按“找书”-&#62;1.访问云中书城-&#62;*.切换到第三方书库，或者最新固件上书架主菜单中选3.更多书城，就可以看到被我们 “篡改”过的第三方书城列表，选择其中的5. calibre，就可以尽情的享用你本地calibre书库中的EPUB图书了。 从calibre中获取到心仪的EPUB图书后，记得把第3步中改过的DNS值恢复原样，免得影响正常上网。]]></description>
			<content:encoded><![CDATA[<p><em>本文内容已过时，云梯0.98b版本开始，直接支持向Bambook中传送原生EPUB格式文件，不再需要用本文的方法去折腾了。</em></p>
<p>我不得不说，伸手党是促进社会劳动生产率不断进步的源泉。</p>
<p>前一篇“<a title="偷梁换柱升级版：用calibre为Bambook提供EPUB书库" href="http://www.freemindworld.com/blog/2012/120312_bambook_epub_support_with_calibre.shtml">偷梁换柱</a>”写完以后放到某论坛上，很快就有伸手党跳出来说，还是太复杂了，能不能把所有的东西写成一个软件一运行就好了。我有点生气的回复他，可以，不过我没有兴趣和精力做这个。不过过了一会儿转念想想，其实这事儿吧，也真没有那么难。花了几十分钟，搞定了这个“终级版”的“偷梁换柱”，希望后面我不要再想出什么更好的办法来，不然我真不知道该用什么词来做文章的标题了。</p>
<p><strong>目标：</strong>把calibre中管理的自有EPUB格式的电子书传到Bambook中原生阅读，不做格式转换。</p>
<p><strong>适用人群：</strong>Bambook用户，有用Bambook阅读原生EPUB格式电子书的需求，基本会用calibre管理电子书，会用记事本修改文本文件，能知道自己所用电脑的IP地址。</p>
<p><strong>系统与环境要求：</strong>安装过云梯和calibre的Windows操作系统，Bambook通过USB连接，可以通过该Windows系统代理上网。或者安装过calibre的Windows操作系统，Bambook通过Wi-Fi上网。（其它操作系统的用户，也可以参照执行，完全是可行的，只是本文中不做针对性说明，如果有问题，可以留言询问）</p>
<p>1. 从本站下载工具包：</p>
<p>本地下载：<a href="http://www.freemindworld.com/blog/wp-content/uploads/2012/03/BambookEPUBToolkit.zip">工具包</a></p>
<p>把下载的文件解压缩到硬盘上，比如C:\，得到fakedns.py和fakehttp.py。还有两个批处理1.bat和2.bat。</p>
<p>2. 运行脚本文件</p>
<p>如果calibre是安装在默认的C:\Program Files\Calibre2中，直接双击运行1.bat和2.bat即可。运行成功的话，会在屏幕上保留两个命令提示符的窗口，里面会显示本机IP，后面还会不断显示一些调试信息。</p>
<p>如果calibre不是装在默认路径下：用记事本打开1.bat和2.bat，修改里面的calibre安装路径后再运行。</p>
<p>两个脚本运行后，都会在屏幕上打出本机的IP地址。如果与实际情况不符，请把命令提示符窗口关掉，用记事本修改脚本文件中的IP = &#8220;&#8221;行，写成IP = &#8220;192.168.0.1&#8243;这样的形式，强行指定本机IP，保存后重新运行这两个脚本。</p>
<p>3. 修改电脑或Bambook的DNS设置，指向我们的假DNS服务器</p>
<p>为了确保成功，在这里先把Bambook断开USB或无线连接，并重启一次。</p>
<p>如果用电脑USB共享给Bambook上网，就修改电脑上网网卡上的DNS设置，改成本机的IP地址（在第2步的脚本运行过程中会打印在屏幕上，照抄就行了）。改完后，把Bambook用USB连接到电脑上。</p>
<p>如果Bambook自己Wi-Fi无线上网，就修改Bambook上网络配置中的DNS设置，设成电脑的IP地址。改完后，关闭并重新开启Bambook的无线连接。</p>
<p>在修改前，请记下原来的值（也有可能原来选的是“自动获取”），以便在用完后把它恢复原样。</p>
<p>4. 启动calibre服务器</p>
<p>运行calibre，主界面下“连接/共享”-&gt;“启动连接服务”，这时calibre应该会在8080端口上启动http服务器，提供 OPDS服务，可以通过访问http://127.0.0.1:8080/opds来验证。（这是在默认配置的情况下，如果有改变过配置，需修改fakehttp.py中的URL）</p>
<p>搞定了！</p>
<p>在Bambook上按“找书”-&gt;1.访问云中书城-&gt;*.切换到第三方书库，或者最新固件上书架主菜单中选3.更多书城，就可以看到被我们 “篡改”过的第三方书城列表，选择其中的5. calibre，就可以尽情的享用你本地calibre书库中的EPUB图书了。</p>
<p>从calibre中获取到心仪的EPUB图书后，记得把第3步中改过的DNS值恢复原样，免得影响正常上网。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120313_bambook_epub_with_calibre_final.shtml/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>偷梁换柱升级版：用calibre为Bambook提供EPUB书库</title>
		<link>http://www.freemindworld.com/blog/2012/120312_bambook_epub_support_with_calibre.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120312_bambook_epub_support_with_calibre.shtml#comments</comments>
		<pubDate>Tue, 13 Mar 2012 04:38:54 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[折腾]]></category>
		<category><![CDATA[Bambook]]></category>
		<category><![CDATA[calibre]]></category>
		<category><![CDATA[Eink]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[电子书]]></category>
		<category><![CDATA[盛大]]></category>
		<category><![CDATA[锦书]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=998</guid>
		<description><![CDATA[本文内容已过时，云梯0.98b版本开始，直接支持向Bambook中传送原生EPUB格式文件，不再需要用本文的方法去折腾了。 上一篇Blog中提供了在Bambook上阅读EPUB书籍一个折腾方法，但那个方法显然很tricky，依赖环境多，成功率低，要传多本图书更复杂。这次又折腾出个改进版的方法，虽然也比较复杂，但成功率比以前高多了，而且也更直观好用，分享给大家。原理：用calibre提供的OPDS服务，把这个服务器添加到Bambook的第三方书城列表中。用到的软件和技术跟以前差不多：calibre，DNS劫持，nginx反向代理与rewrite。 前提条件：有一台正常上网的电脑A，Bambook用无线上网并在上网过程中可以访问到电脑A。或者，有两台电脑(可以是虚拟机)A和B，A用来做服务器，B上安装云梯给Bambook共享网络，AB之间也可以相互访问。 1. 在电脑A上下载安装nginx for Windows http://nginx.org/download/nginx-1.1.15.zip 下载后，解压缩到C:\，得到C:\nginx-1.1.15 2. 配置nginx，实现Web服务和反向代理 用记事本打开C:\nginx-1.1.15\conf\nginx.conf，把它修改成以下内容，其中的192.168.8.102为A电脑的IP地址，请自行替换（下同）： worker_processes  1; events {     worker_connections  1024; } http {     include       mime.types;     default_type  application/octet-stream;     server {         listen          80;         server_name     opds.gk.sdo.com;         location / &#8230; <a href="http://www.freemindworld.com/blog/2012/120312_bambook_epub_support_with_calibre.shtml">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>本文内容已过时，云梯0.98b版本开始，直接支持向Bambook中传送原生EPUB格式文件，不再需要用本文的方法去折腾了。</em></p>
<p><a title="偷梁换柱：在Bambook中阅读自有epub电子书" href="http://www.freemindworld.com/blog/2012/120225_bambook_epub_support.shtml">上一篇Blog</a>中提供了在Bambook上阅读EPUB书籍一个折腾方法，但那个方法显然很tricky，依赖环境多，成功率低，要传多本图书更复杂。这次又折腾出个改进版的方法，虽然也比较复杂，但成功率比以前高多了，而且也更直观好用，分享给大家。原理：用<a title="calibre电子书籍管理软件" href="http://www.calibre-ebook.com" target="_blank">calibre</a>提供的<a title="openpub" href="http://code.google.com/p/openpub/">OPDS</a>服务，把这个服务器添加到Bambook的第三方书城列表中。用到的软件和技术跟以前差不多：calibre，DNS劫持，nginx反向代理与rewrite。</p>
<p><strong>前提条件：</strong>有一台正常上网的电脑A，Bambook用无线上网并在上网过程中可以访问到电脑A。或者，有两台电脑(可以是虚拟机)A和B，A用来做服务器，B上安装云梯给Bambook共享网络，AB之间也可以相互访问。</p>
<p>1. 在电脑A上下载安装nginx for Windows</p>
<p><a title="nginx下载" href="http://nginx.org/download/nginx-1.1.15.zip">http://nginx.org/download/nginx-1.1.15.zip</a></p>
<p>下载后，解压缩到C:\，得到C:\nginx-1.1.15</p>
<p>2. 配置nginx，实现Web服务和反向代理</p>
<p>用记事本打开C:\nginx-1.1.15\conf\nginx.conf，把它修改成以下内容，<strong>其中的192.168.8.102为A电脑的IP地址，请自行替换（下同）</strong>：</p>
<pre>worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen          80;
        server_name     opds.gk.sdo.com;
        location / {
            proxy_pass              http://$http_host$request_uri;
            proxy_redirect          off;
            proxy_set_header Host   $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            rewrite ^.*Default.aspx.*$ http://192.168.8.102:81/1.xml redirect;    
        }
    }
    server {
        listen       81;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }           
    sendfile        on;
    keepalive_timeout  65;
}</pre>
<p>3. 在C:\nginx-1.1.15\html中创建1.xml文件，内容如下，<strong>使用UTF-8编码</strong>（如果用记事本，那就需要用“另存为”对话框，把下面的“编码”由ANSI改为UTF-8）。</p>
<pre><!--?xml version="1.0" encoding="utf-8"?-->&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;feed xmlns:opds="http://opds-spec.org/2010/catalog" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:dc="http://dublincore.org/documents/dcmi-namespace/" xmlns="http://www.w3.org/2005/Atom"&gt;
  &lt;title type="text"&gt;锦书OPDS源列表&lt;/title&gt;
  &lt;id&gt;uuid:ea8a979d-7e28-4bf7-8d11-31aafb2ac66a;id=60&lt;/id&gt;
  &lt;updated&gt;2012-03-11T15:49:25Z&lt;/updated&gt;
  &lt;link rel="search" type="application/atom+xml" href="http://opds.gk.sdo.com/Search.aspx?ST=ALL&amp;amp;PageIndex=1&amp;amp;k={searchTerms}&amp;amp;{bbtk}" /&gt;
  &lt;entry&gt;
    &lt;id&gt;JiuYue&lt;/id&gt;
    &lt;title type="text"&gt;新华书店九月网&lt;/title&gt;
    &lt;updated&gt;2012-03-11T15:49:25Z&lt;/updated&gt;
    &lt;link rel="alternate" type="application/atom+xml" href="http://opds.9yue.com/category.atom?site=BamBook" /&gt;
    &lt;content type="text"&gt;新华书店九月网&lt;/content&gt;
  &lt;/entry&gt;
  &lt;entry&gt;
    &lt;id&gt;http://m.gutenberg.org/ebooks/?format=opds&lt;/id&gt;
    &lt;title type="text"&gt;古腾堡计划&lt;/title&gt;
    &lt;updated&gt;2012-03-11T15:49:25Z&lt;/updated&gt;
    &lt;link rel="alternate" type="application/atom+xml" href="http://m.gutenberg.org/ebooks/?format=opds" /&gt;
    &lt;content type="text"&gt;英文电子书&lt;/content&gt;
  &lt;/entry&gt;
  &lt;entry&gt;
    &lt;id&gt;http://www.feedbooks.com/site/free_books.atom&lt;/id&gt;
    &lt;title type="text"&gt;feedbooks&lt;/title&gt;
    &lt;updated&gt;2012-03-11T15:49:25Z&lt;/updated&gt;
    &lt;link rel="alternate" type="application/atom+xml" href="http://www.feedbooks.com/site/free_books.atom" /&gt;
    &lt;content type="text"&gt;在线阅读网线图书&lt;/content&gt;
  &lt;/entry&gt;
  &lt;entry&gt;
    &lt;id&gt;http://www.feedbooks.com/site/free_books.atom&lt;/id&gt;
    &lt;title type="text"&gt;calibre&lt;/title&gt;
    &lt;updated&gt;2012-03-11T15:49:25Z&lt;/updated&gt;
    &lt;link rel="alternate" type="application/atom+xml" href="http://192.168.8.102:8080/opds" /&gt;
    &lt;content type="text"&gt;calibre&lt;/content&gt;
  &lt;/entry&gt;
&lt;/feed&gt;</pre>
<p>4. 启动nginx</p>
<p>双击运行C:\nginx-1.1.15\nginx.exe，用任务管理查看nginx进程，确认启动成功。如果用netstat -na检查，应该在80和81端口上有LISTENING。如果访问http://192.168.8.102:81/1.xml，可以看到上面我们建立的1.xml文件。</p>
<p>5. 安装Python 2.7</p>
<p>从<a title="Python下载地址" href="http://www.python.org/getit" target="_blank">http://www.python.org/getit</a>下载Python Windows Installer并安装到C:\Python27目录。</p>
<p>6. 写Python脚本，建假DNS。把下面的内容存为C:\FakeDNS.py。同样，<strong>其中的192.168.8.102为A电脑的IP地址，请自行替换</strong>。</p>
<pre>#! /usr/bin/env python
# This code comes from
# http://code.activestate.com/recipes/491264-mini-fake-dns-server/
# with some modifications
import socket

class DNSQuery:
  def __init__(self, data):
    self.data=data
    self.domain=''
    tipo = (ord(data[2]) &gt;&gt; 3) &amp; 15
    if tipo == 0:
      ini=12
      lon=ord(data[ini])
      while lon != 0:
        self.domain+=data[ini+1:ini+lon+1]+'.'
        ini+=lon+1
        lon=ord(data[ini])

  def respuesta(self, ip):
    packet=''
    if self.domain:
      packet+=self.data[:2] + "\x81\x80"
      packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'
      packet+=self.data[12:]
      packet+='\xc0\x0c'
      packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'
      packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.')))
    return packet

if __name__ == '__main__':
  udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  udps.bind(('',53))
  try:
    while 1:
      data, addr = udps.recvfrom(1024)
      p = DNSQuery(data)
      if p.domain == 'opds.gk.sdo.com.':
        ip = '192.168.8.102'
      else:
        ip = socket.gethostbyname(p.domain)
      udps.sendto(p.respuesta(ip), addr)
      print p.domain + "=&gt;" + ip
  except KeyboardInterrupt:
    udps.close()</pre>
<p>7. 启动假DNS</p>
<p>在命行提示符中运行：</p>
<p><code>C:\Python27\python.exe C:\FakeDNS.py</code></p>
<p>启动后应该会停在那里，有请求时会打印出解析结果。可以再开一个窗口用nslookup确认它的工作状态：对于除了opds.gk.sdo.com以外的域名，都解析为正常IP地址；对于opds.gk.sdo.com.，解析为电脑A的IP地址。</p>
<p>8. Bambook设置</p>
<p>设置Bambook的无线连接，其中DNS服务器地址设为假DNS所在电脑A的IP地址。</p>
<p>如果采用两台电脑的方案，就把电脑B的网卡配置中的DNS指向电脑A的IP地址。然后连接Bambook与电脑B，让Bambook通过电脑B上网。</p>
<p>9. 启动calibre服务器</p>
<p>运行calibre，主界面下“连接/共享”-&gt;“启动连接服务”，这时calibre应该会在8080端口上启动http服务器，提供OPDS服务，可以通过访问http://127.0.0.1:8080/opds来验证。（这是在默认配置的情况下，如果有改变过配置，上面的1.xml做相应改动即可）</p>
<p>一切就绪，在Bambook上按“找书”-&gt;1.访问云中书城-&gt;*.切换到第三方书库，或者最新固件上书架主菜单中选3.更多书城，就可以看到被我们“篡改”过的第三方书城列表，选择其中的5. calibre，就可以尽情的享用你本地calibre书库中的EPUB图书了。</p>
<p>注意：这个方法只支持Bambook从calibre书库中下载EPUB格式的图书。如果书城列表获取不正常，可能是DNS缓存的问题，重启Bambook后再试一次。</p>
<p>calibre除了自带的OPDS连接服务，也可以用<a title="calibre2opds" href="http://calibre2opds.com/" target="_blank">calibre2opds</a>这个软件来提供更美好的OPDS服务器，以后另文介绍calibre2opds。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120312_bambook_epub_support_with_calibre.shtml/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>偷梁换柱：在Bambook中阅读自有epub电子书</title>
		<link>http://www.freemindworld.com/blog/2012/120225_bambook_epub_support.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120225_bambook_epub_support.shtml#comments</comments>
		<pubDate>Sat, 25 Feb 2012 09:54:44 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[折腾]]></category>
		<category><![CDATA[Bambook]]></category>
		<category><![CDATA[calibre]]></category>
		<category><![CDATA[Eink]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[电子书]]></category>
		<category><![CDATA[盛大]]></category>
		<category><![CDATA[锦书]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=978</guid>
		<description><![CDATA[本文内容已过时，云梯0.98b版本开始，直接支持向Bambook中传送原生EPUB格式文件，不再需要用本文的方法去折腾了。 先写一句话指南，免得浪费有很强动手能力的技术青年们的时间：通过假DNS把res.gk.sdo.com劫持到本地，对于非.epub文件下载请求，反向代理到真正的res.gk.sdo.com上；对于.epub文件请求，你想把什么书传到Bambook上，就在本地把这个.epub通过HTTP返回出去吧。在Linux上，可以用nginx做Web服务器、反向代理和Rewrite，用dnsmasq或我下面提供的Python脚本做假DNS。 我也算是Bambook的老用户了，从它上市第一天起就开始使用，当年写的体验心得算是很给面子、非常委婉指出了它的一些致命缺点（对于我自己而言的），其中最重要的两条是：只有Windows-Only的客户端程序和不支持除了它自有的SNB以外的任何电子书格式。第一个问题，我通过盛大后来开放的SDK给calibre写了一些插件基本解决了(支持Windows/Linux/Mac OS X，使用方法在这里)，第二个问题盛大后来自己开始支持PDF格式了，算是解决了一半，但如果再能支持一下epub格式就美好了。 在盛大去年发布的最后一版支持第三方书库(Feedbooks和古登堡计划)的固件中，某些人敏锐的注意到，从第三方书库下载的电子书明显有比SNB格式更丰富的排版，而且下载页面上也以很小的字体提示了说，这是epub格式的。由此可知，Bambook的固件已经可以支持epub的直读，剩下的问题就是怎么把epub书放进去了。 尝试过一些方法，比如把epub文件跟pdf文件一样，用SNB格式包裹起来再通过SDK传到Bambook上，总之都是失败。最后实在没有办法，决定用Wireshark抓包分析Bambook从Feedbooks下载图书的交互过程，从中做点坏事。 分析过程其实一点也不复杂，会用Wireshark的人应该都能搞定。我选了对Feedbooks的交互过程进行分析，分析的结果是，Bambook从第三方书库下载图书时，仍然会与盛大的服务器交互，并且最终是从盛大的服务器的URL上下载实际的文件(最新的分析结果是：可能从盛大的服务器，也可能从原始feedbooks的服务器，取决于盛大的服务器有没有缓存过这个文件。该分析未完全确定)，所以简单的劫持对Feedbooks.com的访问是没用的。反复尝试，下面描述的方法是可行的（但很可能不是最简单的，懒得再深入研究了）。为照顾大部分Windows用户，下面以Windows环境来介绍。Linux用户请参考本文第一段自己折腾，应该更简单一些。 前提条件：有一台正常上网的电脑A，Bambook用无线上网并在上网过程中可以访问到电脑A。或者，有两台电脑(可以是虚拟机)A和B，A用来做服务器，B上安装云梯给Bambook共享网络，AB之间也可以相互访问。 1. 在电脑A上下载安装nginx for Windows http://nginx.org/download/nginx-1.1.15.zip 下载后，解压缩到C:\，得到C:\nginx-1.1.15 2. 配置nginx，实现Web服务和反向代理 用记事本打开C:\nginx-1.1.15\conf\nginx.conf，把它修改成以下内容，其中的192.168.8.102为A电脑的IP地址，请自行替换： worker_processes  1; events {     worker_connections  1024; } http {     include       mime.types;     default_type  application/octet-stream;     server {         listen          80; &#8230; <a href="http://www.freemindworld.com/blog/2012/120225_bambook_epub_support.shtml">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>本文内容已过时，云梯0.98b版本开始，直接支持向Bambook中传送原生EPUB格式文件，不再需要用本文的方法去折腾了。</em></p>
<p>先写一句话指南，免得浪费有很强动手能力的技术青年们的时间：通过假DNS把res.gk.sdo.com劫持到本地，对于非.epub文件下载请求，反向代理到真正的res.gk.sdo.com上；对于.epub文件请求，你想把什么书传到Bambook上，就在本地把这个.epub通过HTTP返回出去吧。在Linux上，可以用nginx做Web服务器、反向代理和Rewrite，用dnsmasq或我下面提供的Python脚本做假DNS。</p>
<p>我也算是<a title="盛大Bambook锦书" href="http://bb.sdo.com" target="_blank">Bambook</a>的老用户了，从它上市第一天起就开始使用，当年写的<a title="盛大Bambook锦书首发体验" href="http://www.freemindworld.com/blog/2010/100928_sdo_bambook_test.shtml" target="_blank">体验心得</a>算是很给面子、非常委婉指出了它的一些致命缺点（对于我自己而言的），其中最重要的两条是：只有Windows-Only的客户端程序和不支持除了它自有的SNB以外的任何电子书格式。第一个问题，我通过盛大后来开放的SDK给<a title="calibre电子书籍管理软件" href="http://www.calibre-ebook.com" target="_blank">calibre</a>写了一些插件基本解决了(支持Windows/Linux/Mac OS X，使用方法在<a title="calibre使用技巧与常见问题" href="http://www.freemindworld.com/blog/2010/101022_calibre_tips_and_faq.shtml" target="_blank">这里</a>)，第二个问题盛大后来自己开始支持PDF格式了，算是解决了一半，但如果再能支持一下epub格式就美好了。</p>
<p>在盛大去年发布的最后一版支持第三方书库(Feedbooks和<a title="Gutenberg" href="http://www.gutenberg.org" target="_blank">古登堡计划</a>)的固件中，某些人敏锐的注意到，从第三方书库下载的电子书明显有比SNB格式更丰富的排版，而且下载页面上也以很小的字体提示了说，这是epub格式的。由此可知，<strong>Bambook的固件已经可以支持epub的直读</strong>，剩下的问题就是怎么把epub书放进去了。</p>
<p>尝试过一些方法，比如把epub文件跟pdf文件一样，用SNB格式包裹起来再通过SDK传到Bambook上，总之都是失败。最后实在没有办法，决定用Wireshark抓包分析Bambook从Feedbooks下载图书的交互过程，从中做点坏事。</p>
<p>分析过程其实一点也不复杂，会用Wireshark的人应该都能搞定。我选了对Feedbooks的交互过程进行分析，分析的结果是，Bambook从第三方书库下载图书时，仍然会与盛大的服务器交互，<del>并且最终是从盛大的服务器的URL上下载实际的文件</del>(最新的分析结果是：可能从盛大的服务器，也可能从原始feedbooks的服务器，取决于盛大的服务器有没有缓存过这个文件。该分析未完全确定)，所以简单的劫持对Feedbooks.com的访问是没用的。反复尝试，下面描述的方法是可行的（但很可能不是最简单的，懒得再深入研究了）。为照顾大部分Windows用户，下面以Windows环境来介绍。Linux用户请参考本文第一段自己折腾，应该更简单一些。</p>
<p><strong>前提条件：</strong>有一台正常上网的电脑A，Bambook用无线上网并在上网过程中可以访问到电脑A。或者，有两台电脑(可以是虚拟机)A和B，A用来做服务器，B上安装云梯给Bambook共享网络，AB之间也可以相互访问。</p>
<p>1. 在电脑A上下载安装nginx for Windows</p>
<p><a title="nginx下载" href="http://nginx.org/download/nginx-1.1.15.zip">http://nginx.org/download/nginx-1.1.15.zip</a></p>
<p>下载后，解压缩到C:\，得到C:\nginx-1.1.15</p>
<p>2. 配置nginx，实现Web服务和反向代理</p>
<p>用记事本打开C:\nginx-1.1.15\conf\nginx.conf，把它修改成以下内容，<strong>其中的192.168.8.102为A电脑的IP地址，请自行替换</strong>：</p>
<pre>worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen          80;
        server_name     res.gk.sdo.com;
        location / {
            proxy_pass        http://res.gk.cdn.sdo.com/;
            proxy_redirect    off;
            proxy_set_header  Host            $host;
            proxy_set_header  X-Real-IP       $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            rewrite ^.*/.*\.epub$ http://192.168.8.102:81/1.epub redirect;
        }
    }
    server {
        listen       81;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }           
    sendfile        on;
    keepalive_timeout  65;
}</pre>
<p>3. 启动nginx</p>
<p>双击运行C:\nginx-1.1.15\nginx.exe，用任务管理查看nginx进程，确认启动成功。如果用netstat -na检查，应该在80和81端口上有LISTENING。</p>
<p>4. 安装Python 2.7</p>
<p>从<a title="Python下载地址" href="http://www.python.org/getit" target="_blank">http://www.python.org/getit</a>下载Python Windows Installer并安装到C:\Python27目录。</p>
<p>5. 写Python脚本，建假DNS。把下面的内容存为C:\FakeDNS.py。同样，<strong>其中的192.168.8.102为A电脑的IP地址，请自行替换</strong>。</p>
<pre>#! /usr/bin/env python
# This code comes from
# http://code.activestate.com/recipes/491264-mini-fake-dns-server/
# with some modifications
import socket

class DNSQuery:
  def __init__(self, data):
    self.data=data
    self.domain=''
    tipo = (ord(data[2]) &gt;&gt; 3) &amp; 15
    if tipo == 0:
      ini=12
      lon=ord(data[ini])
      while lon != 0:
        self.domain+=data[ini+1:ini+lon+1]+'.'
        ini+=lon+1
        lon=ord(data[ini])

  def respuesta(self, ip):
    packet=''
    if self.domain:
      packet+=self.data[:2] + "\x81\x80"
      packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'
      packet+=self.data[12:]
      packet+='\xc0\x0c'
      packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'
      packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.')))
    return packet

if __name__ == '__main__':
  udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  udps.bind(('',53))
  try:
    while 1:
      data, addr = udps.recvfrom(1024)
      p = DNSQuery(data)
      if p.domain == 'res.gk.sdo.com.':
        ip = '192.168.8.102'
      else:
        ip = socket.gethostbyname(p.domain)
      udps.sendto(p.respuesta(ip), addr)
      print p.domain + "=&gt;" + ip
  except KeyboardInterrupt:
    udps.close()</pre>
<p>6. 启动假DNS</p>
<p>在命行提示符中运行：</p>
<p><code>C:\Python27\python.exe C:\FakeDNS.py</code></p>
<p>启动后应该会停在那里，有请求时会打印出解析结果。可以再开一个窗口用nslookup确认它的工作状态：对于除了res.gk.sdo.com以外的域名，都解析为正常IP地址；对于res.gk.sdo.com，解析为电脑A的IP地址。</p>
<p>7. Bambook设置</p>
<p>设置Bambook的无线连接，其中DNS服务器地址设为假DNS所在电脑A的IP地址。</p>
<p>如果采用两台电脑的方案，就把电脑B的网卡配置中的DNS指向电脑A的IP地址。然后连接Bambook与电脑B，让Bambook通过电脑B上网。</p>
<p>8. 把打算要传到Bambook上的EPUB电子书放到C:\nginx-1.1.15\html中，命名为1.epub。</p>
<p>9. Bambook上选择Feedbooks.com上任意一本Public Domain的图书，下载阅读。</p>
<p>找书-&gt;1.访问云中书城-&gt;*.切换到第三方书库-&gt;3.feedbooks-&gt;3.Public Domain Books-&gt;2.Recently Added-&gt;任选一本以前没有下载过的书-&gt;1. 免费试读本书。</p>
<p>搞定！返回书架后就可以看到你自己的epub电子书已经放进了Bambook，可以尽情的阅读了。</p>
<p><strong>重要更新：</strong>如果有时候发现下载下来的还是第三方书库的书，不是被自己替换过的。也许是因为盛大服务器上还没缓存过这本书，所以我们劫持盛大服务器就没用了。暂时的解决方案是换一本排在比较前面的书（这些书有缓存的可能性比较大），或者到书架上把刚刚下载的书删掉，重新再去下同一本，那时这书可能已经被缓存在盛大的服务器上了，这样我们的劫持就有效了。</p>
<p>其它说明：</p>
<p>1. 不能只用一台电脑或不用Bambook无线上网搞定的原因是：Bambook USB共享上网中的NAT服务中带了DNS服务，会与我们的假DNS抢53端口。</p>
<p>2. 制作在Bambook上阅读的EPUB电子书时，内部单个文件不要太大，不然翻页速度会让你抓狂。如果用calibre转换格式，可以在EPUB格式输出插件的设置中设定页面文件分割大小。</p>
<p>3. 虽然我们偷换掉了EPUB文件，但似乎Bambook还是认为我们是下载了我们所选的书籍并会记住这个状态，再次选择同一本书时，就不会再下载了。所以每次传书都得从Feedbooks中找一本以前没有用过书才行。</p>
<p>4. 这个方法只在Bambook SD928经典白色版上验证有效，未在全键盘版上验证过。且盛大只要服务器那里稍微动动手脚就可以让它失效，所以不保证有效期。并欢迎大家寻求更简单完美的解决方案。</p>
<p>5. 我曾经有过另一个在Bambook上阅读富格式书籍的想法，就是把HTML(或EPUB、MOBI等，反正本质都是HTML)页面封装成Bambook的Widget，用JavaScript在HTML中实现阅读器应该有的功能。现在是有SDK可以把Widget传入Bambook的，所以用这个方法完全可以写软件（或者给calibre写个插件，非常简单）自动完成常见的电子书格式转成Widget和传入Bambook的全过程。这个方法我已经做过POC，是完全可行的。但我没有能力用Java Script写出一个让我自己满意的阅读程序，所以最终放弃了。</p>
<p>6. 本文描述的所有内容仅供技术宅折腾和探讨，不愿折腾的人、Kindle或其它功能强大的阅读器拥护者请勿喷。谢谢。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120225_bambook_epub_support.shtml/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>GNU.org的本地化框架</title>
		<link>http://www.freemindworld.com/blog/2012/120216_gnu_translation_with_gnun.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120216_gnu_translation_with_gnun.shtml#comments</comments>
		<pubDate>Wed, 15 Feb 2012 16:36:31 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[工具]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[GNUN]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[自由软件]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=970</guid>
		<description><![CDATA[前几天Junwen同学翻译了Android设计指南的网页，由于他用的SourceForge的Web空间访问限额有限，我在自己的服务器上给他做了一个镜象站点。于是就想到了多镜象站点同步以及本地化语言版本与上游英文版网页之间的同步问题，正好我是GNU.org的中文翻译组的一员，在这里跟大家简单分享一下GNU网站的本地化框架，也算是补交了去年在NJLUG活动中曾经承诺过的一份作业。 以前，GNU网站的本地化是由各本地化翻译小组手工完成维护的，翻译组协调人确定要翻译的页面，翻译组成员自己从GNU网站或CVS上下载html网页，直接在网页上进行翻译，然后把html网页提交到翻译组的CVS中，经过审阅后，由具有GNU网站提交权限的人直接把html文件提交到GNU网站上。 这种简单的做法带来的问题主要有两个： 本地化版本的维护问题。由于全部是手工操作，很容易出现本地化版本与英文原始版本之间不同步的问题，而且这样的不同步很难被发现和跟踪。 网站改版的问题。当英文版网站进行大规模网页页面结构化调整时，即使页面上文字内容没有变，所有的翻译版本都需要全部手工进行更新。 大约是2008年开始，GNU开发了GNUnited Nation，简称GNUN，作为GNU网站本地化框架。GNUN实质上是一些脚本、DTD和Makefile，通过这些脚本，对GNU的网页自动进行各种必要的字符串提取、替换和合法性验证。 GNUN的实现基于在自由软件本地化中广为使用的gettext，GNUN从原始的英文HTML网页中提取需要翻译的字符串，生成gettext的.pot文件，各语言翻译组基于.pot文件翻译形成对应各自的语言的.po文件，最后GNUN系统再依据这些po文件生成相应语言版本的本地化网页。      .---&#60;--- * Original ARTICLE.html      &#124;      &#124;   .---&#62; ARTICLE.pot ---&#62; * ARTICLE.LANG.po ---&#62;---.      `---+                                               &#124;          `---&#62;---.   .------&#60;----------------------------'                  &#124;   &#124;                  &#124;   `---.                  &#124;       +---&#62; Translated ARTICLE.LANG.html &#8230; <a href="http://www.freemindworld.com/blog/2012/120216_gnu_translation_with_gnun.shtml">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>前几天<a title="太阳日志" href="http://sunblog.72pines.com/" target="_blank">Junwen</a>同学翻译了<a title="Android设计指南非官方中文版" href="http://adchs.sourceforge.net/" target="_blank">Android设计指南</a>的网页，由于他用的SourceForge的Web空间访问限额有限，我在自己的服务器上给他做了一个<a title="Android设计指南非官方中文版" href="http://www.freemindworld.com/adchs/index.html" target="_blank">镜象</a>站点。于是就想到了多镜象站点同步以及本地化语言版本与上游英文版网页之间的同步问题，正好我是<a title="The GNU Operating System" href="http://www.gnu.org" target="_blank">GNU.org</a>的<a title="GNU Chinese Translation Team" href="http://www.gnu.org/server/standards/translations/zh-cn/" target="_blank">中文翻译组</a>的一员，在这里跟大家简单分享一下GNU网站的本地化框架，也算是补交了去年在<a title="Nanjing Linux User Group" href="http://www.nanjinglug.org" target="_blank">NJLUG</a>活动中曾经承诺过的一份作业。</p>
<p>以前，GNU网站的本地化是由各本地化翻译小组手工完成维护的，翻译组协调人确定要翻译的页面，翻译组成员自己从GNU网站或CVS上下载html网页，直接在网页上进行翻译，然后把html网页提交到翻译组的CVS中，经过审阅后，由具有GNU网站提交权限的人直接把html文件提交到GNU网站上。</p>
<p>这种简单的做法带来的问题主要有两个：</p>
<ul>
<li>本地化版本的维护问题。由于全部是手工操作，很容易出现本地化版本与英文原始版本之间不同步的问题，而且这样的不同步很难被发现和跟踪。</li>
<li>网站改版的问题。当英文版网站进行大规模网页页面结构化调整时，即使页面上文字内容没有变，所有的翻译版本都需要全部手工进行更新。</li>
</ul>
<p>大约是2008年开始，GNU开发了<a title="GNUN" href="http://www.gnu.org/software/gnun/" target="_blank">GNUnited Nation</a>，简称GNUN，作为GNU网站本地化框架。GNUN实质上是一些脚本、DTD和Makefile，通过这些脚本，对GNU的网页自动进行各种必要的字符串提取、替换和合法性验证。</p>
<p>GNUN的实现基于在自由软件本地化中广为使用的<a title="gettext" href="http://www.gnu.org/software/gettext" target="_blank">gettext</a>，GNUN从原始的英文HTML网页中提取需要翻译的字符串，生成gettext的.pot文件，各语言翻译组基于.pot文件翻译形成对应各自的语言的.po文件，最后GNUN系统再依据这些po文件生成相应语言版本的本地化网页。</p>
<pre>     .---&lt;--- * Original ARTICLE.html
     |
     |   .---&gt; ARTICLE.pot ---&gt; * ARTICLE.LANG.po ---&gt;---.
     `---+                                               |
         `---&gt;---.   .------&lt;----------------------------'
                 |   |
                 |   `---.
                 |       +---&gt; Translated ARTICLE.LANG.html
                 `-------'</pre>
<p>这是GNUN的工作流程图，其中需要人工干预的只有图中打星号的两个步骤，其它都可以自动化完成。</p>
<ul>
<li>编写原始ARTICLE.html：由GNU的Web维护小组完成。</li>
<li>翻译ARTICLE.LANG.po文件：由GNU各语言翻译组完成。</li>
</ul>
<p>对于翻译组，GNUN框架中也提供了很轻量级的脚本用于从合并更新.po文件和自动检查.po文件的翻译进度，用起来很方便。</p>
<p>其实，从现在的眼光看，用gettext做网页的本地化也并不是什么新鲜的事儿，比如大家现在在用的WordPress就是这样处理的。不过，你有没有注意到GNUN跟WordPress中gettext的用法的不同呢？</p>
<p>在WordPress（或其它大部分用gettext的软件项目）中，要翻译的字符串资源常常会用类似于_(&#8220;&#8221;)这样的形式来标记，这样xgettext工具才能从中正确的提取出需要的翻译的资源，当然也是为了程序编译后运行起来时真正能把字符串完成翻译。而GNU的那些静态HTML网页上并没有也不方便用这样的标记去标记所有的字符串，GNUN实际上是一个特别针对GNU网站做的框架，它直接通过一些预定义的固定规则去处理GNU网页上的内容，在已知网页内容架构的情况下，跟据HTML页面中各标签本身的语意，去提取字符串内容。.po文件翻译好后，也是由固定的脚本直接把字符串替换回原始的网页，从而实现页面翻译。所以，暂时GNUN其实并不能成为一个通用的网站本地化框架，目前它只能用在GNU的网站上。但是这样的一套处理思路，也许在有些特定的情况下还是值得借鉴的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120216_gnu_translation_with_gnun.shtml/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用GNU screen管理多台Linux主机</title>
		<link>http://www.freemindworld.com/blog/2012/120211_screen_config.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120211_screen_config.shtml#comments</comments>
		<pubDate>Sat, 11 Feb 2012 10:40:06 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[工具]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=949</guid>
		<description><![CDATA[需要在Windows下管理一小堆Linux机器，开一堆PuTTY窗口的方式显然是会让人无法忍受的，怎么办？ 用SecureCRT或xshell 否决，能不用商业软件就不用商业软件，尤其是在没有人愿意为License买单时。虽然xshell个人和教育使用是免费的，功能也足够强大，但我花了N个小时改它和Emacs的配置，还是没有办法在它的终端下完美的使用Emacs，Emacs有那么多变态的快捷键，怎么配总有那么几个快捷键不能正常工作。虽然知道配不好是我自己的错，但能力精力有限，放弃。 用第三方PuTTY的外挂或窗口管理器 你真的确信有一个很美好的PuTTY多窗口管理器么？我把PuTTY官网上相关话题中给出的链接中的第三方程序都试了一遍，真没有靠谱的。 想来想去，最终还是决定采用开一个PuTTY窗口，先连上一台Linux主机，然后在上面启动GNU screen再连接到多台主机。 以前对screen的认识，是用来在下载机上运行rtorrent，所以screen的第一个用处是把程序放到后台去运行，不受SSH连接断开的限制，随时连上去都可以恢复到断开连接时的状态，这对于维持一个稳定持久的工作环境很有用。 要让screen可以做为一个多连接管理器，还需要花点精力，这可以通过配置~/.screenrc来实现。 让我知道我正在screen环境下工作，并知道我开了哪些连接 hardstatus alwayslastline "%{=b}%{G} Screen(s): %{b}%w %=%{kG}%C%A %D, %M/%d/%Y " 显示状态栏，并列出当前打开的窗口（创建的连接） 把screen的默认快捷键由Ctrl-A换成Ctrl-Z escape ^Zz 在我的Emacs配置中最用不到一个快捷键是Ctrl-Z，所以把screen的快捷键前缀由非常常用的Ctrl-A换成Ctrl-Z，真的需要Ctrl-Z时，只要按Ctrl-Z z就可以了。 启动时就打开多个窗口并连接到各远程主机上，并为每个连接所在窗口起个名字 screen ssh user@host1 title host1 screen ssh user@host2 title host2 这样启动screen时就会分别连上host1和host2，把设置好对应的窗口名字，在状态栏上可见。 远程连接关闭(或意外断开)时，不要关闭窗口 zombie "^[" &#8230; <a href="http://www.freemindworld.com/blog/2012/120211_screen_config.shtml">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>需要在Windows下管理一小堆Linux机器，开一堆PuTTY窗口的方式显然是会让人无法忍受的，怎么办？</p>
<ul>
<li>用SecureCRT或<a title="xshell" href="http://www.netsarang.com/products/xsh_overview.html" target="_blank">xshell</a></li>
</ul>
<p>否决，能不用商业软件就不用商业软件，尤其是在没有人愿意为License买单时。虽然xshell个人和教育使用是免费的，功能也足够强大，但我花了N个小时改它和Emacs的配置，还是没有办法在它的终端下完美的使用Emacs，Emacs有那么多变态的快捷键，怎么配总有那么几个快捷键不能正常工作。虽然知道配不好是我自己的错，但能力精力有限，放弃。</p>
<ul>
<li>用第三方PuTTY的外挂或窗口管理器</li>
</ul>
<p>你真的确信有一个很美好的PuTTY多窗口管理器么？我把<a title="PuTTY多连接支持说明" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/multiple-connections.html" target="_blank">PuTTY官网</a>上相关话题中给出的链接中的第三方程序都试了一遍，真没有靠谱的。</p>
<p>想来想去，最终还是决定采用开一个PuTTY窗口，先连上一台Linux主机，然后在上面启动GNU screen再连接到多台主机。</p>
<p>以前对screen的认识，是用来在<a title="折腾O2 Joggler" href="http://www.freemindworld.com/blog/2010/101121_o2_joggler.shtml">下载机</a>上运行rtorrent，所以screen的第一个用处是<strong>把程序放到后台去运行</strong>，不受SSH连接断开的限制，随时连上去都可以恢复到断开连接时的状态，这对于维持一个稳定持久的工作环境很有用。</p>
<p>要让screen可以做为一个多连接管理器，还需要花点精力，这可以通过配置~/.screenrc来实现。</p>
<ul>
<li>让我知道我正在screen环境下工作，并知道我开了哪些连接</li>
</ul>
<p><code>hardstatus alwayslastline "%{=b}%{G} Screen(s): %{b}%w %=%{kG}%C%A %D, %M/%d/%Y "</code></p>
<p>显示状态栏，并列出当前打开的窗口（创建的连接）</p>
<ul>
<li>把screen的默认快捷键由Ctrl-A换成Ctrl-Z</li>
</ul>
<p><code>escape ^Zz</code></p>
<p>在我的Emacs配置中最用不到一个快捷键是Ctrl-Z，所以把screen的快捷键前缀由非常常用的Ctrl-A换成Ctrl-Z，真的需要Ctrl-Z时，只要按Ctrl-Z z就可以了。</p>
<ul>
<li>启动时就打开多个窗口并连接到各远程主机上，并为每个连接所在窗口起个名字</li>
</ul>
<p><code>screen ssh user@host1<br />
title host1<br />
screen ssh user@host2<br />
title host2</code></p>
<p>这样启动screen时就会分别连上host1和host2，把设置好对应的窗口名字，在状态栏上可见。</p>
<ul>
<li>远程连接关闭(或意外断开)时，不要关闭窗口</li>
</ul>
<p><code>zombie "^["</code><br />
默认情况下，一个连接断开后，screen会关闭这个连接所在的窗口，如果要再连就得重新打开新窗口手工创建连接。用了zombie配置后，某个远程连接断开后对应的窗口仍会保留，切换到对应窗口后可以按Ctrl-[手工关闭窗口，也以Ctrl-@重新激活窗口（连接到远程主机）。</p>
<ul>
<li>screen启动完成后默认切换回第1个窗口</li>
</ul>
<p><code>select 0</code><br />
完成这一堆配置后，用起来就已经很得心应手了。按Ctrl-Z 0到Ctrl-Z 9可以在各窗口间切换，按Ctrl-Z Ctrl-Z可以在最近两个窗口间跳转。Ctrl-Z d把screen环境放到后台，返回shell。Ctrl-Z c新建一个本地shell窗口。如果需要在多个连接间复制文本，可以用Ctrl-Z &lt;ESC&gt;进入复制/滚屏模式，用回车键设定复制范围，然后用C-z ]贴粘到目标位置。</p>
<p>完成一切设置后，就可以在PuTTY连上终端后执行screen -d -R来创建或连接到screen环境了，用完了可以随手把PuTTY窗口关掉，再连上去时就恢复到上次工作的状态，非常方便。</p>
<p>在我完成了screen的学习和配置后，<a title="Hewig Xu" href="http://kernelpanic.im/" target="_blank">有人</a>为我推荐了另一个终端复用程序<a title="tmux" href="http://tmux.sourceforge.net/" target="_blank">tmux</a>，它比screen的功能更为强大，鉴于screen已经满足了我的需求的前提下，我没有再去折腾tmux，如果你是第一次尝试使用终端复用程序，也不妨试一下tmux。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120211_screen_config.shtml/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>五周年-我的独立博客</title>
		<link>http://www.freemindworld.com/blog/2012/120205_blog_five_years.shtml</link>
		<comments>http://www.freemindworld.com/blog/2012/120205_blog_five_years.shtml#comments</comments>
		<pubDate>Sat, 04 Feb 2012 16:05:31 +0000</pubDate>
		<dc:creator>Li Fanxi</dc:creator>
				<category><![CDATA[折腾]]></category>

		<guid isPermaLink="false">http://www.freemindworld.com/blog/?p=908</guid>
		<description><![CDATA[五年前的今天，因为“自由软件综合症”发作，在朋友给的fx.jiuzhe.com域名上用Emacs+Muse创建了我的独立博客，通过几次改进，最后就形成了今天大家所看到的FreeMindWorld.com。 为了折腾，我一直在享受和忍受着Emacs+Muse所建的Blog的各种方便和不方便之处。这次，终于是痛定思痛，放弃了个性，把整个Blog系统切换到了WordPress上面，不过还是花了不少的时间去定制WordPress，让整个网站的风格与原来大体上保持一致，所有页面的链接也尽量保持跟原来的一样，免得造成太多的死链。 这次迁移半自动半手动的迁移了原来FreeMindWorld.com上和我以前CSDN博客和Live Space上的文章169篇和465条评论，非常艰辛。现在我这个博客上包含了以下的文章： 2002年2月至2003年7月在CSDN文档中心发表的文章。 2004年6月至2007年2月在CSDN博客和Live Space上写的文章。 2007年2月以后FreeMindWorld.com上的文章。 所以，如果把当年给CSDN文档中心写文章也算上的话，这次也可以算是个10周年纪念。在转移这些文章时，不可避免的把它们都回顾了一遍，很有感触，人生的十年、互联网的十年，变化都很大。 五年，见证了微博从兴起到到兴旺。十年，见证了博客从兴起到衰落。谁会知道下一个五年又会发生什么。 上个月关停了我的另一台运行了5年的ASP虚拟主机，上面原本运行着一些从1999年就开始做的网站，但是这些网站早就没有了任何的访问量，只有发Spam的机器人坚持不懈的在留言板上活跃着。那台主机上还存放着的我早年做的一些静态个人主页，这次也一并迁移了过来，放在这里怀个旧吧。点击图片就可以访问相关的网页。三个版本的个人主页除了长的不一样，内容几乎是一样的。那年头，做个人主页就是做页面设计，内容有什么并不重要，现在可大不一样了。]]></description>
			<content:encoded><![CDATA[<p>五年前的今天，因为“<a title="自由软件综合症" href="http://www.freemindworld.com/blog/2007/070205_free_software_fans.shtml">自由软件综合症</a>”发作，在朋友给的fx.jiuzhe.com域名上用Emacs+<a title="Emacs Muse Project" href="http://mwolson.org/projects/EmacsMuse.html" target="_blank">Muse</a>创建了我的独立博客，通过几次改进，最后就形成了今天大家所看到的FreeMindWorld.com。</p>
<p>为了折腾，我一直在享受和忍受着Emacs+Muse所建的Blog的各种方便和不方便之处。这次，终于是痛定思痛，放弃了个性，把整个Blog系统切换到了WordPress上面，不过还是花了不少的时间去定制WordPress，让整个网站的风格与原来大体上保持一致，所有页面的链接也尽量保持跟原来的一样，免得造成太多的死链。</p>
<p>这次迁移半自动半手动的迁移了原来FreeMindWorld.com上和我以前CSDN博客和Live Space上的文章169篇和465条评论，非常艰辛。现在我这个博客上包含了以下的文章：</p>
<ul>
<li>2002年2月至2003年7月在CSDN文档中心发表的文章。</li>
<li>2004年6月至2007年2月在CSDN博客和Live Space上写的文章。</li>
<li>2007年2月以后FreeMindWorld.com上的文章。</li>
</ul>
<p>所以，如果把当年给CSDN文档中心写文章也算上的话，这次也可以算是个10周年纪念。在转移这些文章时，不可避免的把它们都回顾了一遍，很有感触，人生的十年、互联网的十年，变化都很大。</p>
<p>五年，见证了微博从兴起到到兴旺。十年，见证了博客从兴起到衰落。谁会知道下一个五年又会发生什么。</p>
<p>上个月关停了我的另一台运行了5年的ASP虚拟主机，上面原本运行着一些从1999年就开始做的网站，但是这些网站早就没有了任何的访问量，只有发Spam的机器人坚持不懈的在留言板上活跃着。那台主机上还存放着的我早年做的一些静态个人主页，这次也一并迁移了过来，放在这里怀个旧吧。点击图片就可以访问相关的网页。三个版本的个人主页除了长的不一样，内容几乎是一样的。那年头，做个人主页就是做页面设计，内容有什么并不重要，现在可大不一样了。</p>
<div id="attachment_910" class="wp-caption aligncenter" style="width: 330px"><a href="http://www.freemindworld.com/web1/"><img class="size-full wp-image-910" title="个人主页第一版" src="http://www.freemindworld.com/blog/wp-content/uploads/2012/02/120205a.jpg" alt="个人主页第一版" width="320" height="240" /></a><p class="wp-caption-text">个人主页第一版 1999年2月19日-1999年5月</p></div>
<div id="attachment_911" class="wp-caption aligncenter" style="width: 330px"><a href="http://www.freemindworld.com/web2/"><img class="size-full wp-image-911" title="个人主页第二版" src="http://www.freemindworld.com/blog/wp-content/uploads/2012/02/120205b.jpg" alt="个人主页第二版" width="320" height="240" /></a><p class="wp-caption-text">个人主页第二版 1999年5月-2000年5月</p></div>
<div id="attachment_912" class="wp-caption aligncenter" style="width: 330px"><a href="http://www.freemindworld.com/web3/"><img class="size-full wp-image-912" title="个人主页第三版" src="http://www.freemindworld.com/blog/wp-content/uploads/2012/02/120205c.jpg" alt="个人主页第三版" width="320" height="240" /></a><p class="wp-caption-text">个人主页第三版 2000年5月-？（不记得什么时候它就不存在了）</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.freemindworld.com/blog/2012/120205_blog_five_years.shtml/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

