<?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>年华转瞬 &#187; 读书笔记</title>
	<atom:link href="http://blog.xiaket.org/category/reading/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xiaket.org</link>
	<description>xiaket 的网志</description>
	<lastBuildDate>Sat, 21 Aug 2010 02:31:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>要说阴谋诡计还得说咱中国人</title>
		<link>http://blog.xiaket.org/2010/08/17/too-simple-sometimes-naive/</link>
		<comments>http://blog.xiaket.org/2010/08/17/too-simple-sometimes-naive/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 13:12:00 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[电影]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=474</guid>
		<description><![CDATA[印象中, 我在英文书店看到的版本最多的中文原著应该是孙子兵法了. 这本在古今中外都备受推崇. 不过撇掉治国之道不谈, 这本书里面关于战争的部分实际上只是印证和演绎了下面这句话而已:

兵者诡道也

然而老实说, 这一点对于西方人来说真是必要的, 而对于在阴谋诡计里面浸淫了十几个世纪的中华子民来说, 光说这一点还是太显粗浅.

<span class="readmore"><a href="http://blog.xiaket.org/2010/08/17/too-simple-sometimes-naive/" title="要说阴谋诡计还得说咱中国人">阅读全文——共1807字</a></span>]]></description>
			<content:encoded><![CDATA[<p>印象中, 我在英文书店看到的版本最多的中文原著应该是孙子兵法了. 这本在古今中外都备受推崇. 不过撇掉治国之道不谈, 这本书里面关于战争的部分实际上只是印证和演绎了下面这句话而已:</p>
<pre>兵者诡道也</pre>
<p>然而老实说, 这一点对于西方人来说真是必要的, 而对于在阴谋诡计里面浸淫了十几个世纪的中华子民来说, 光说这一点还是太显粗浅.</p>
<p>口说无凭, 要找点例子才像话. 今天早上看到指环王里面Frodo在旅店里遇到化名为Strider的Aragorn. A先是对F说, 我知道你很危险, 我想请你带上我一起走, 我会帮你们的. 然后旅店老板上来说, Gandalf说过让他照顾F, 并拿出一封信, 说, 这个是G留给你的. 接下来F打开信, 里面说我拜托了另一个人照顾你, 他叫Aragorn, 化名为Strider. 看到这儿, 要不是我早知Frodo命不绝于此, 我真要以为Aragorn是一个骗子, 合伙店主利用伪造的纹章取得了Frodo的信任. 如果这部书是中国的话本小说, 接下来的戏码肯定是到了某僻静处, Strider露出狰狞面目, 而Gandalf却适时赶到, 救下了刀口下的Hobbit四人众. 但可惜, 直肠子的西方人不会这么写, Strider竟然是个好人.</p>
<p>拿上面这段和水浒里的智取生辰纲对比无疑是很具有说服力的. 话说青面首杨志得梁中书赏识抬举, 带了生辰纲要过贼人出没的黄泥冈. 待见这票人等上得冈来, 个个累得睡倒在地, 不肯起身. 杨志苦劝不得, 却遇见了晁盖等人, 晁天王却不直接动手劫货. 而是扮为枣贩, 降低了青面兽的警惕性. 待得白日鼠白胜上得冈来卖酒, 晁盖等人去买了酒来喝. 引得杨志手下的军汉也抢来买酒, 结果中了蒙汗药, 失了生辰纲. 把这个宛如九曲回环的骗局和前面指环王里的段子对比下, 不得不感叹中华儿女骗人的鬼魅伎俩在各种角度都完全超越了西方文学作品里的雕虫小技们.</p>
<p>我这段时间另外在读的一本书是显克微支的十字军骑士, 讲的是波兰人民如何受尽了标榜崇高神圣的十字军骑士的欺侮而奋起抵抗的故事. 里面讲到几个十字军骑士受了波兰一个名为尤仑德的骑士的欺负, 为了报仇就骗到了他的女儿达奴莎, 再以她为要挟使尤仑德就范. 这个情节终于能够勉强被称为连环计了, 不过骗到达奴莎只是找了一个陌生人扮作信使带来口信, 哪里比得上吴用晁盖们救宋江时使了圣手书生萧让和玉臂匠金大坚来给蔡太师的儿子写信. 从结果来看, 十字军骑士里, 公爵夫人们就这样被一个信使给唬了过去; 而在水浒里面, 即使用上这两人, 负责送信的神行太保还是被识破, 差点陪着宋江去问候阎王爷.</p>
<p>阴谋诡计的巅峰之作大都是在朝堂之上或者深宫之内. 这一点很容易想见, 因为碌碌如我等凡夫俗子, 夙兴夜寐只为多讨一口饭多买一方土, 实在没有废寝忘食来算计一个人的时间和空间. 要研究这种高端的诡变之道还得看食有鱼出有车有以为家的领导们. 中国古代的王侯与权臣们献上了一幕又一幕的悲喜剧. 赵高和李斯引领了中国封建史上第一次皇位争夺战, 给三十六计贡献了暗渡陈仓这个专有名词的汉高祖自然也跑不掉, 连他老婆也不甘示弱, 掀起一阵一阵的风浪. 三国是个人才辈出的阶段, 孔明们的机谋百出实在达到了历史的巅峰, 可谓前无古人. 唐太宗登基后大力篡改史书, 他的所作所为是否高明也可见一斑. 宋太祖杯酒释兵权, 是否能被称为光明正大, 恐怕也只有当事人心里清楚. 到了元朝, 好容易有个不怎么用阴谋诡计的皇帝, 可惜却不是土生土长来的, 而且这段历史究竟算中国历史的杯具还是洗具还有待商榷. 辗转到了现代, 这种风气仍未有变化. 太祖为了斗倒一个人而发动全国浩劫, 声东而击西, 欲擒而故纵, 明修栈道而暗渡陈仓, 实在不愧是精研过孙子兵法并有着充分实践经验的人. 相比于此, 国外的那些君主们肯定是没吃太饱没穿太暖. 瞧瞧, 哈姆雷特里弟弟毒死哥哥竟然还需亲身去下毒, 放在清宫戏里肯定会威胁利诱一个太子的侍从来操刀, 事后再杀人灭口了.</p>
<p>我们再从另一个角度看看. 国外的影视和游戏作品里常有以墓穴探险为题材的, 从这些墓穴里的机关我们也可以一窥端倪. 无论是古墓丽影还是夺宝奇兵, 我总电影里描绘的墓穴机关太过正大光明. 放几只上古的恐怖动物就算是很对得起观众了. 而反观中国文化作品里的墓穴和宝藏们, 就明显比前面那些内容要高一个档次. 例如大唐双龙传里面描写的杨公宝库, 从开启到入口, 从真库假库到控制室, 处处透着心战的味道. 的确, 要打死一只上古的怪物也许是很难的, 但总算光明正大. 但是如果对手是一个聪明绝顶的人, 你就不得不面对比利爪和毒牙更危险的敌人了.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/08/17/too-simple-sometimes-naive/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>疯狂实验室(读后)</title>
		<link>http://blog.xiaket.org/2010/08/02/on-mad-science/</link>
		<comments>http://blog.xiaket.org/2010/08/02/on-mad-science/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 16:37:20 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[读书笔记]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=470</guid>
		<description><![CDATA[书籍元信息

书名: 疯狂实验室

豆瓣链接: http://book.douban.com/subject/3732346/

<span class="readmore"><a href="http://blog.xiaket.org/2010/08/02/on-mad-science/" title="疯狂实验室(读后)">阅读全文——共870字</a></span>]]></description>
			<content:encoded><![CDATA[<h3>书籍元信息</h3>
<p>书名: 疯狂实验室</p>
<p>豆瓣链接: <a href="http://book.douban.com/subject/3732346/">http://book.douban.com/subject/3732346/</a></p>
<p>当当链接: <a href="http://product.dangdang.com/product.aspx?product_id=20723209">http://product.dangdang.com/product.aspx?product_id=20723209</a></p>
<p>更多的meta自己去查吧, 乖~</p>
<h3>读后感</h3>
<p>周六晚购于购书中心, 已读完.</p>
<p>上面对于普通人来说也许已经可以成为一个手不释卷的实证来说明这本书引人入胜. 不过对我这个阅读偏快的人来说区区不足300页这么长时间足够读完三四遍了. 所以我必须加上我还做了一堆事情的脚注. 脚注: 我还做了一堆事情.</p>
<p>我读这本书比其他书快, 这一声明自有相关数据以支撑, 不过我们在这儿更关心这一事实的成因. 一方面我们可以将此归咎于书中常见的插图, 另一方面, 全书是由一个个的小故事按时间顺序编排起来的, 因此印刷上留白比较大, 当然, 虽然没有直接的数据能够支持这一观点, 但是我本人更愿意承认的理由是这本书比较引人入胜.</p>
<h3>广告</h3>
<p>为了达到更好的推销效果, 本广告对不同的人以不同的形式发布.</p>
<p>对普通ACG宅男: 你不太会感兴趣的, 还是算了吧.</p>
<p>对理科宅: 多知道点总不是坏处, 对吧? 这本书里面有很多比较少为人知的科学史和伪科学史. 这些内容可以坚定你继续执着地扮演理科宅的决心. 另外, 看过这本书后你的知识结构和Sheldon的差距又小了一点(Sheldon打断: 我在你看完这本的时间内足够看完整部Britannica了&#8230;).</p>
<p>对腐女: 你可能会对书里的部分实验比如换头术, 囚徒的自我人格主动丧失, x之漂流筏等感兴趣, 读下也好.</p>
<p>对科学研究者: 里面有很多观点值得了解, 例如如何处理科学于伦理学的关系, 如何尽量保证实验不会受到外在条件的影响等等. 另外, 编造数据是不好的, 虽然你可能会一时名声大噪, 但是你最好的下场还是遗臭万年. 个人的名声不论, 你还可能会误导同时期的其它研究者, 而这一点是最令人沮丧的.</p>
<p>对自己: food for thought.</p>
<p>对8岁的Sheldon: 模仿前先想想后果, 小心点, 炸掉地球死很多人就没人给你唱soft kitty了.</p>
<p>对Sheldon: 你不是已经看过了咩?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/08/02/on-mad-science/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>翻译: scp协议原理</title>
		<link>http://blog.xiaket.org/2010/05/18/how-scp-protocol-works/</link>
		<comments>http://blog.xiaket.org/2010/05/18/how-scp-protocol-works/#comments</comments>
		<pubDate>Tue, 18 May 2010 04:21:10 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[Linux相关]]></category>
		<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[scp]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=406</guid>
		<description><![CDATA[译自: http://blogs.sun.com/janp/entry/how_the_scp_protocol_works. 原作者为Jan Pechanec. 这篇文章主要讲solaris中的scp协议实现. 本人对原文做了适当的润色, 希望能更易理解而不易产生误会. 水平有限, 有错误请不吝指出.

rcp协议简史

rcp命令1982年第一次出现在4.2版的BSD里面(man页面链接). 近30年的岁月让这个命令有了一些变化, 所以最初的rcp和现代的rcp会有些不一致的地方. rcp的基本协议在ssh-1.2.x版本里有实现, 而ssh-1.2.x又是OpenSSH的基础. 由于Solaris用的SSH工具(SunSSH)是OpenSSH的分支, 因此前面所讲的rcp协议到现在都还是在起作用. 说了这么多, 我也许应该把这篇文章的标题改成&#60;rcp协议原理&#62;, 不过这样看起来就不够酷了, 你懂的.(译者注: 这样偶就看不到这篇文章了&#8230;)

<span class="readmore"><a href="http://blog.xiaket.org/2010/05/18/how-scp-protocol-works/" title="翻译: scp协议原理">阅读全文——共6587字</a></span>]]></description>
			<content:encoded><![CDATA[<p>译自: <a href="http://blogs.sun.com/janp/entry/how_the_scp_protocol_works" target="_blank">http://blogs.sun.com/janp/entry/how_the_scp_protocol_works</a>. 原作者为<a href="http://blogs.sun.com/janp/" target="_blank">Jan Pechanec</a>. 这篇文章主要讲solaris中的scp协议实现. 本人对原文做了适当的润色, 希望能更易理解而不易产生误会. 水平有限, 有错误请不吝指出.</p>
<h3>rcp协议简史</h3>
<p>rcp命令1982年第一次出现在4.2版的BSD里面(<a href="http://blogs.sun.com/janp/resource/scp/rcp.txt" target="_blank">man页面链接</a>). 近30年的岁月让这个命令有了一些变化, 所以最初的rcp和现代的rcp会有些不一致的地方. rcp的基本协议在ssh-1.2.x版本里有实现, 而ssh-1.2.x又是OpenSSH的基础. 由于Solaris用的SSH工具(SunSSH)是OpenSSH的分支, 因此前面所讲的rcp协议到现在都还是在起作用. 说了这么多, 我也许应该把这篇文章的标题改成&lt;rcp协议原理&gt;, 不过这样看起来就不够酷了, 你懂的.(译者注: 这样偶就看不到这篇文章了&#8230;)</p>
<h3>协议工作方式</h3>
<p>前面已经说过, rcp和scp在协议层面上没有区别, 不同在于传输时使用了rlogin. 从现在开始, 我就只讲scp了. 其使用摘要如下:</p>
<pre>scp [options] [user@]host1:]file1 []... [ [user@]host2:]file2</pre>
<p>除开远程服务器之间的文件复制这个特殊情况, scp会先解析命令行参数, 然后打开一个到远程服务器的连接. 再通过这个连接起另一个scp进程, 这个进程的运行方式可以是源模式(source)也可以是宿模式(sink). (译者注: 前者是数据提供者, 源头, 以源模式运行的scp进程后面会被称作是源端. 后者是数据的目的地, 归宿, 以宿模式运行的scp进程后面会被称作是宿端)前者读取文件并通过SSH连接发送到另一端, 后者通过SSH连接接收文件. 源模式和宿模式是通过-f (from)和 -t (to)这两个隐藏选项来启动的. 这两个参数仅供命令内部使用, 因此没写进文档. (译者注: 你执行scp -t不会给出非法参数的报错提示, 而scp -s就会, 因为没有-s这个选项.) 除了这两个隐藏参数外, 还有另一个隐藏参数-d, 表示复制的对象是一个目录而不是文件.</p>
<p>下图给出了一个简化后的scp源/宿模式工作示意图:</p>
<pre>

+-----------+   remote command: scp -t file2    +------+
| ssh hostB |----------------------------------&gt;| sshd |
+-----------+                                   +---+--+
     ^                                              |
     |                                              |
     |fork()                                  fork()|
     |                                              |
+----+-----------------+                +-----------V--+
| scp file hostB:file2 |                | scp -t file2 |
+----------------------+                +--------------+
</pre>
<h3>协议</h3>
<p>下面介绍传输协议是如何工作的. 你不如先暂时忘了ssh, sshd以及两台机器之间的连接这些东东. 如果我们只关注以源宿两种模式工作的scp命令的话, 上图可以简化成:</p>
<pre>
                      data transfer
+------------------+   ___________   +--------------+
| scp fileX hostY: | -&gt;___________-&gt; | scp -t fileX |
+--------.---------+                 +-------.------+
         |                                   |
         |read()                             |write()
   __....|....__                       __....|....__
  =__  fileX  __:'                    =__  fileX  __:'
     `''''''''                           `''''''''
</pre>
<p>需要注意的是, 永远不会有两个工作模式一样的scp协同工作. (译者注: 你可以想象下两个源端互相期待对方给自己传文件会是啥情况&#8230;) 远程服务器上的scp进程选定一种模式后, 本地的scp进程(就是本地用户命令行起的这个进程)会自动选定另一种模式, 因为这个本地进程会于用户交互.</p>
<h4>源端</h4>
<p>协议信息是由文本和二进制数据混合构成的. 例如, 当我们要传出一个普通文件时, 协议消息的类型, 文件的权限位, 长度及文件名都会以文本的方式发送, 接着在一个换行符后发送文件的内容. 我们在后面会更详细地讨论这一点. 协议消息内容可能类似:</p>
<pre>
C0644 299 group
</pre>
<p>二进制数据传输前需要传输的文本信息可能更多. 源端会一直等宿端的回应, 直到等到回应才会传输下一条协议文本. 在送出最后一条协议文本后, 源端会传出一个ASCII字符&#8217;\0&#8242;来表示真正文件传输的开始. 当文件接收完成后, 宿端会给源端发送一个&#8217;\0&#8242;.</p>
<h4>宿端</h4>
<p>来自源端的每条消息和每个传输完毕的文件都需要宿端的确认和响应. 宿端会返回三种确认消息: 0(正常), 1(警告)或2(严重错误, 将中断连接). 消息1和2可以跟一个字符串和一个换行符, 这个字符串将显示在scp的源端. 无论这个字符串是否为空, 换行符都是不可缺少的.</p>
<h3>协议消息类型列表</h3>
<pre>Cmmmm <length> <filename></filename></length></pre>
<p>表示传输单个文件, mmmm是文件的权限位. 实例: C0644 299 group</p>
<pre>Dmmmm <length> <dirname></dirname></length></pre>
<p>表示开始整个目录的递归复制. 此处文件长度将会忽略, 但是不可缺少. 实例: D0755 0 docs</p>
<pre>E</pre>
<p>表示目录的结束(D-E这一对可以嵌套使用, 这也是我们能正常递归复制目录树的原因.)</p>
<pre>T<mtime> 0 <atime> 0</atime></mtime></pre>
<p>当命令行给出-p选项时, 这一类协议消息用来传输所传递的文件的修改时间和访问时间(我猜你应该知道为啥我们不把文件创建时间传到宿端吧?). 时间记录了从UTC 1970.01.01 00:00:00到现在所经历的秒数. 这一类协议消息在最初的rcp实现中并未出现. 实例: T1183828267 0 1183828267 0</p>
<p>传完了这些消息后就开始传文件数据了. 宿端从数据流中读取之前协议消息中指定的文件长度. D和T需要在其他消息之前指定. 这是因为如果这两类消息放在其他消息之后, 这两类消息的内容具体是消息还是数据就不清楚了. 我们可以总结如下: </p>
<ul>
<li>传完了C类消息后开始传输文件数据.</li>
<li>在传完了D类消息后, 要么出现C类消息, 要么出现E类消息.</li>
</ul>
<h3>最大文件大小和文件完整性</h3>
<p>scp所能传输的最大文件大小是由scp协议, scp软件, 操作系统以及文件系统综合决定的. 由于OpenSSH用long long int来放文件大小, 因此理论上可以传输的最大文件大小是2^63 Byte. 给一个参考值, 2^40 Byte的大小是1T. 这意味着我们可以认为协议本身没有文件大小的限制.</p>
<p>scp本身不提供对文件完整性的保护, 这一特性是在ssh协议那一层完成的. 你可以参考<a href="http://blogs.sun.com/janp/entry/ssh_messages_code_bad_packet" target="_blank">我之前写的博客文章</a>, 也可以直接去围观<a href="http://www.ietf.org/rfc/rfc4253.txt" target="_blank">RFC43253</a>.</p>
<h3>例子</h3>
<p>讲协议是扯不清楚的, 直接看例子更直观更形象.</p>
<h4>1. 本地文件复制到另一位置</h4>
<pre>
$ rm -f /tmp/test
$ { echo C0644 6 test; printf "hello\n"; } | scp -t /tmp
test                 100% |***************************| 6       00:00
$ cat /tmp/test
hello
</pre>
<p>好玩吧? 我用了printf命令, 这样我们能够很清楚地看见为什么文件长度为6. 接下来我们试试复制一个目录.</p>
<h4>2. 本地目录复制到另一位置</h4>
<p>我们准备将一个名为testdir的目录, 内含一个名为test的文件, 递归地复制到/tmp下去.</p>
<pre>
$ rm -rf /tmp/testdir
$ { echo D0755 0 testdir; echo C0644 6 test;
    printf "hello\n"; echo E; } | scp -rt /tmp
test                 100% |****************************| 6       00:00
$ cat /tmp/testdir/test
hello
</pre>
<p>请注意, 我们在此处用了-r参数, 因为我们要复制整个目录.</p>
<h4>3. 将另一位置的目录复制到本地</h4>
<p>之前的例子中, 管道里的scp都是充当宿端. 这个例子里面, scp进程的角色是源端. 就像前面说的那样, 我们必须要对每个成功的消息和文件传输加以应答. 另外, 这个例子只是模拟应答的过程, 而没有真正去创建文件和文件夹. 因为要创建的东西都已经在你的终端里打印出来了.</p>
<pre>
$ cd /tmp
$ rm -rf testdir
$ mkdir testdir
$ echo hello &gt; testdir/test
$ printf '\000\000\000\000\000\000' | scp -qprf testdir
T1183832947 0 1183833773 0
D0700 0 testdir
T1183833773 0 1183833762 0
C0600 6 test
hello
E
</pre>
<p>解释下, 这次没有进度条了, 这是因为我们用了-q选项. 你可以看到传输了文件时间信息, 这是因为我们是用了-p选项. 另外, -f表示这一次scp进程是源端. 你可以发现我们丢了六个&#8217;\000&#8242;给scp, 这是我们模拟的传输过程中的应答. 第一个来开始传输过程, 四个响应消息, 一个响应文件传输结束. 对了吗? 不对, 我们还没响应最后的E呢. 此时看看退出状态:</p>
<pre>
$ echo $?
1
</pre>
<p>如果我们用七个&#8217;\000&#8242;, 就不会有问题了:</p>
<pre>
$ printf '\000\000\000\000\000\000\000' | scp -qprf testdir
T1183832947 0 1183833956 0
D0700 0 testdir
T1183833773 0 1183833956 0
C0600 6 test
hello
E
$ echo $?
0
</pre>
<h4>4. 发送错误消息</h4>
<p>下面这个例子中, 我们将会返回2给scp, 你可以看到即使我们在这个2后面又发送了几个&#8217;\000&#8242;, scp命令也不接受后面的这些确认信息了.</p>
<pre>
$ printf '\000\000\002\n\000\000' | scp -qprf testdir

T1183895689 0 1183899084 0
D0700 0 testdir
</pre>
<h3>远程服务器shell配置文件有输出</h3>
<p>有时候, 会有scp不能正常工作而ssh却一切正常的情况发生. 这通常是由于远程服务器的配置文件里有echo/printf而造成的. 下面展示几个例子:</p>
<h4>输入密码后, scp就卡住不动了</h4>
<p>要重现这一症状, 在远程服务器的配置文件里面添加一行:</p>
<pre>echo ""</pre>
<p>为什么会有这种情况发生呢? 这是因为在源端的scp进程会等待第一个协议消息的确认信息. 如果拿到的不是0, 它会认为这是远程服务器错误提示的一部分, 并会接着无限期地等待标志消息结束的换行符. 由于你在第一个换行符后没有打印新的内容, 你本地的scp就卡住不动了. 一直处于read状态. 另一方面, 远程服务器在处理完配置文件后, 以宿端scp进程也就开始了它也会卡在read状态, 等待一个0来表示文件传输的开始. 好吧, 现在两边的scp都卡住不动了. 总结下, 这种情况下, 问题的起因是远程服务器的shell配置文件的输出参与了scp协议的对话.</p>
<h4>如果我将文件复制到远程服务器, scp执行完我的shell配置就退出了</h4>
<p>这句话的意思是, scp只是将用户的shell配置文件打印出来的第一句话打印出来就退出了. 要重现这个问题, 可以执行下面的操作:</p>
<p>译者注: 这个实验会清空你的.bashrc&#8230; 慎用.</p>
<pre>
$ echo 'echo "hi there!"' &gt;&gt; .bashrc
</pre>
<p>然后执行scp命令:</p>
<pre>
$ scp /etc/passwd localhost:/tmp
hi there!
$ echo $?
1
</pre>
<p>这个问题和第一个问题很类似. 由于接收到的第一个字符不是0(这个例子中是&#8217;h'), 它会认为有问题, 一直读到下一个换行符. 将读到的东西打印出来, 然后退出.</p>
<p>这一类问题都比较容易解决, 用下面的命令, 当你真正是通过终端登录时才把你想要的东西打印出来即可.</p>
<pre>
tty -s &#038;&#038; echo "hi there!"
</pre>
<h4>屏幕提示&#8221;协议错误: 未预料的&lt;换行符&gt;&#8221;然后scp退出了</h4>
<p>同样和第一个问题类似, 但是你是从远程将文件复制到本地时会出现这种情况. 为什么呢? 你本地的scp是宿端, 等待源端传来的协议消息. 但是, 它拿到的是一个空行, 紧接着又拿到一个换行符. 这显然是违背协议的, 因此你本地的scp就退出了. 如果你在远程服务器配置文件里面还打印了额外的东西, 这些就会被当作是错误提示(除非这条消息是由一个有效的消息头标识符所引导的, 而如果这种纠结的事情真的发生了, 那么打印出来的错误提示会更难懂.) , 直到下一个换行符之前的输出都会被认为是错误提示的内容. 打印完这些内容后, scp就退出了. 例如我将下面这行加到我的shell配置里去:</p>
<pre>printf "XXXX"</pre>
<p>(printf不会自动打印换行符的, 记得吧?)第一条协议消息之前的所有输出都会被认为是错误提示:</p>
<pre>
$ scp localhost:/etc/passwd .
Password:
XXXXC0644 1135 passwd
$ echo $?
1
</pre>
<p>另外, 如果你恰好很纠结地在你的配置文件中指定了输出D之类的有效字符, 你拿到的消息就更纠结了.</p>
<pre>
$ scp localhost:/etc/passwd .
Password:
protocol error: bad mode
$ echo $?
1
</pre>
<p>知道教训了吧? 记得检查scp的退出状态!</p>
<h3>协议的扩展性</h3>
<p>rcp协议很简单, 我们现在想研究下它的可拓展性. 例如, 我们怎么样才能传输文件的ACL信息? 问题在于, 如何拓展这个协议, 让其具有向后的兼容性. 也许这个地方有些很简单的办法但是我没想到的, 不过我很怀疑这一点. 现在的问题是, 你不能拓展已有的消息. 比如, 看看我们往T消息结尾处添加一个字符串&#8221;123&#8243;会怎么样:</p>
<pre>
$ { echo T1183832947 0 1183833773 0 123;
    echo D0755 0 testdir; echo E; } | scp -rt /tmp
scp: protocol error: atime.usec not delimited
</pre>
<p>C类消息也是一样:</p>
<pre>
$ { echo D0755 0 testdir; echo C0644 6 test 123;
    printf "hello\n"; echo E; } | scp -rqt /tmp
$ ls -1 /tmp/testdir/
test 123
</pre>
<p>而且你又不能添加一类新消息, 因为scp命令不能识别:</p>
<pre>
$ { echo X 1 a; echo D0755 0 testdir; echo C0644 6 test;
    printf "hello\n"; echo E; } | scp -rt /tmp
scp: X 1 a
$ echo $?
1
</pre>
<p>可能的办法:(有其他的办法咩?) 一个比较明显能解决问题的办法是给scp命令添加一个选项, 指明可以是用一些拓展协议消息. 如果运行失败的话可能远程服务器上的scp版本和本地的scp版本不一样, 然后就可以退到普通模式下运行了. 不过我不确定是不是真要搞得这么纠结. 有些scp软件的开发者已经在用sftp协议传输文件了, 而这也是我们想要做的事情. 我想也许可能在非交互方式下执行exec sftp, 再转换下参数就可以了.</p>
<h3>远程服务器之间的复制</h3>
<p>一个通常会问到的问题是, 为啥远程服务器之间的复制不能有密码输入之类的认证方式. 这不是bug, 这是特性. 代码上虽然可以实现有密码输入的认证, 但是由于实现的机理是建立hostA和hostB之间的直接连接, 而有人不希望把他在hostB的密码暴露给hostA, 所以代码上没有实现这一点. 远程服务器之间的文件复制是由本地的scp命令建立一个到hostA的连接, 然后执行&#8221;scp fileX hostB:&#8230;&#8221;来实现的.</p>
<p>我们最近更新了scp的手册页, 添加了这样一段:</p>
<pre>
一般来说, 通过密码或键盘交互来用scp实现远程服务器之间的文件传输不能正常
工作. 而用公钥, 基于主机或者GSSAPI的认证则是可行的. 对于公钥认证, 要么
不能有非空的加密短语, 要么需要使用ssh认证转发功能. GSSAPI认证能够在
kerberos_v5 GSS_API机制下使用, 但是必须启用GSSAPIDelegateCredentials
选项.
</pre>
<h3>效率</h3>
<p>现在你对scp的工作机理应该比较清楚了, 也应该比较容易理解为什么在一个延时比较高的网络环境下复制大量小文件会比将文件夹打包后传输需要长得多的时间. 每条协议信息以及传输结束后的确认信息的开销很大. 所以下一次, 你应该用类似下面的命令来传输大量小文件:</p>
<pre>
tar cfv - testdir | ssh user@host 'cd /tmp; tar xfv -'
</pre>
<h3>结论</h3>
<p>就这样吧, 总结下: rcp/scp协议是一个很简单的文件传输协议, 第一次在4.2BSD里面出现. 这个协议的可扩展性不强, 以后scp实现中可能会用sftp协议取代它.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/05/18/how-scp-protocol-works/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Twilight读后</title>
		<link>http://blog.xiaket.org/2010/04/19/on-twilight/</link>
		<comments>http://blog.xiaket.org/2010/04/19/on-twilight/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 16:30:19 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[文学]]></category>
		<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[挪威的森林]]></category>
		<category><![CDATA[电影]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=387</guid>
		<description><![CDATA[今天终于看完了Twilight四部曲, 很难说有什么关于这部作品的剧情的感想. 新鸳鸯蝴蝶派的文章虽然我没看过, 但是小时候毕竟多少看过一些琼瑶剧, 所以这种程度的文章, 倒也很难说能够引起我特别的兴趣. 不过既然是读后感, 总得写些东西才算数. 这样吧, 四部里面各挑一段我喜欢的细节随便扯扯.

本次列车前方到站Pasadena, 请Sheldon和不喜欢剧透的童鞋准备下车&#8230;

Twilight

<span class="readmore"><a href="http://blog.xiaket.org/2010/04/19/on-twilight/" title="Twilight读后">阅读全文——共1245字</a></span>]]></description>
			<content:encoded><![CDATA[<p>今天终于看完了Twilight四部曲, 很难说有什么关于这部作品的剧情的感想. 新鸳鸯蝴蝶派的文章虽然我没看过, 但是小时候毕竟多少看过一些琼瑶剧, 所以这种程度的文章, 倒也很难说能够引起我特别的兴趣. 不过既然是读后感, 总得写些东西才算数. 这样吧, 四部里面各挑一段我喜欢的细节随便扯扯.</p>
<p>本次列车前方到站Pasadena, 请Sheldon和不喜欢剧透的童鞋准备下车&#8230;</p>
<h3>Twilight</h3>
<p>访问吸血鬼的家会是怎样的, 这本书给出的情景是一个现代化的家, 什么都是井井有条, 什么都是品位高雅. 作者这么写是为了让读者对这群吸血鬼进一步产生好感, 不过这个设定本身在我来看也是合理的. 大部分作品里面吸血鬼都不是正面角色, 谁管他们回家后会不会感觉沉闷呢?</p>
<h3>New Moon</h3>
<p>看书的时候没用特别的感觉, 倒是看电影的时候, 对那一个旅行团的团灭印象深刻. 一般说耳闻不如目见, 不过在这个场合, 倒是耳闻更能让人念念不忘. 话说Volturi家族都不出去觅食, 只是诱使不明真相的旅行者资源来到有吸血鬼的建筑被杀掉, 这个事实也让我印象深刻. 我总设想现实中可能发生的情况是某些微妙的方程的解, 对于一般的解我总是不太感兴趣, 对于奇异解就会有研究的欲望, 这个事实本身就是一个奇异解, 如是而已.</p>
<h3>Eclipse</h3>
<p>讲Edward和Alice和Alice下棋那段有点创意. 设想两个有特异功能的人下棋, 一个有读心术, 一个能够预知未来. 读心术那个能够看到对方会怎么下棋, 自己也能够找出相应的对策; 而能够预知未来的那个也是完全一样. 按照小说里的说法是绝大部分的对弈过程都是在大脑里进行的, 往往是他们每个人动了两个兵以后就有一方认输了&#8230; 关于这个预知未来的人, 整套书里面还有一些其他的细节让我觉得赏心悦目, 不过性质和这个差不多, 戏剧效果也大都没这一处强烈, 就不再详细说了.</p>
<h3>Breaking Dawn</h3>
<p>虽然最后那个confrontation很无聊很扯, 不过整本书能够给我留点记忆点的也就只有这段了. 后面那个half-breed出现得很没创意, 因为这是最平庸的解决冲突的办法. 另外, 整套书都是说Jacob那一族是狼人, 到了现在才说不是狼人只是简单的shape-shifter, 这个借口也让人很无语. 好吧我也知道狼人的故事, 也知道狼人见到满月会变形, 咬人会传染, 和这套书里不一样. 但是整套书你形容他们全是用werewolf, 到了最后5%才向大家解释说之前我们都错了他们其实不是, 真不知该怎么说你才好.</p>
<h3>总结</h3>
<p>一套四本书总共2400页, 读起来还是很快的. 倒不是我阅读速度快, 而是这个真的只能拿来做light reading. 我也大都是在火车上飞机上读这本书的. 如果你能够满足下面几个条件的话还是能看看这套书的:</p>
<ul>
<li>不介意Mary Sue小说</li>
<li>你是女生, 年龄在25岁以下</li>
<li>如果你对类似金庸小说的作品感兴趣, 而又认为金庸的作品太过纠结.</li>
</ul>
<p>很显然, 我这几条都不满足. 只是我已经买了书一定要读完, 哎, 以后买书之前要谨慎啊. 也许真要像挪威的森林里永泽说的那样, 去世小于三十年的作家的作品不要再读了&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/04/19/on-twilight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>英雄志读后感</title>
		<link>http://blog.xiaket.org/2010/02/28/legend-of-heroes/</link>
		<comments>http://blog.xiaket.org/2010/02/28/legend-of-heroes/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 17:26:05 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[读书笔记]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=330</guid>
		<description><![CDATA[介绍

作品: 英雄志

作者: 孙晓

<span class="readmore"><a href="http://blog.xiaket.org/2010/02/28/legend-of-heroes/" title="英雄志读后感">阅读全文——共2082字</a></span>]]></description>
			<content:encoded><![CDATA[<h3>介绍</h3>
<p>作品: 英雄志</p>
<p>作者: 孙晓</p>
<p>状态: 未完成, 大约每年更新一次, <a href="http://www.jiang-wu-tang.com/JWTphpBBS/viewtopic.php?t=3527" target="_blank">有风声说今年能够结束</a></p>
<p>字数: 目前已有的字数大约在300万左右</p>
<p>英雄志是一本很早就开始写作的传统武侠小说, 作者是台湾的孙晓, 开始写作这部长篇小说的时间是1996年. 它以明朝土木堡之变为时代背景, 在历史里面安设了四个主人公, 以这四个人的历程来推动历史的发展(文中存在一定程度的架空). 这四个人, 分别是权臣, 反贼, 武将和儒生. 所谓英雄志, 也就是写他们的故事.</p>
<p>我在之前的一篇博客里面提过, 英雄不是普通人好当的. 这四个人里面, 权臣(杨肃观)抱着我不入地狱谁入地狱的心态弑父弑师. 一心努力维护国家的安定. 反贼(秦仲海)被打穿琵琶骨, 剜去一条腿, 九死一生逃出生天开始造反, 好容易遇到真爱却又被造化弄人. 武将(伍定远)历经磨难才得以出头, 与一个自己喜欢而不喜欢自己的女人结婚, 和权臣站在一边却又一边迷茫自己做得对不对一边还要遵从权臣的命令. 儒生(卢云)年少时蒙冤入狱, 在和情投意合的顾倩兮新婚前眼见身边的上级, 同僚, 兄弟一一离自己而去, 自己也被困绝境, 十年后重返尘世却发现顾倩兮已是权臣的妇人. 无奈, 造化弄人啊.</p>
<h3>人物评价</h3>
<p>下面这些, 不期望没读过的小说的人能够读懂, 不期望读过小说的人能够同意, 只希望若干年之后, 自己看到这些文字, 能够一笑了之&#8230;</p>
<p>最可恨的人</p>
<p>戏剧里面经常见到这样的情景, 每个人都是从自己的角度出发, 做出了自己认为正确(或者唯一可能)的选择. 没有人会单纯从为恶的角度出发去做坏事, 做坏事往往都是因为没有好事可以做. 于是, 我也是从这个角度来评价一个角色是不是可恨的. 不在于他/她做出了为善或为恶的选择, 而是在于他/她有没有更好的选择. 从这个角度来说, 让至少一半英雄志读者恨得牙痒痒的杨肃观实在不是一个可恨的人. 在我看来, 杨肃观一手创建大佛国, 造就千千万万的饿殍都只是没有更好选择的选择. 至于其弑师弑父更是如此. 杨肃观就好比一台精密的仪器, 按照自己订下的规则来管理这个世界. 虽然由他造就了很多的惨剧, 但是, 这些都是无可奈何的事情. 他, 不是最可恨的人. 小说里另一个坏事做尽的人是朱阳, 即潜龙. 但是这个人出发点是要正名, 要当皇帝. 我可以理解和同意这样的出发点, 如果是我的话, 我也可能会去这样做, 因此我对潜龙完全没有恨感.</p>
<p>小说前期写了两个&#8221;奸臣&#8221;, 一个是刘敬, 一个是江充. 刘敬老实说只是一个忠于先皇的宦官, 是一个忠诚. 虽然他也做了一点点坏事, 不过基本可以忽略. 江充就完全不一样了. 小说中的这个人物和历史上的王振一样可恨, 不过说起办事能力, 江充还算是有两把刷子的. 历史上王振的事迹这儿就不多说了, 基本上就是一个废人. 而江充虽然在后面还标榜自己不是一个奸臣, 而是一个忠臣. 但是他为了发迹而做的很多事情, 例如造成御驾亲征兵败如山, 逃回京城谎报军情, 处死秦霸先家人, 拥立新皇, 神鬼亭杀死秦霸先等等, 都是罪无可恕的. 从这一点上来说, 他无疑是个大恶人, 要找最可恨的人, 他无疑是名至实归的.</p>
<p>另外, 小说里面还有很多的男女感情描写. 在这个问题上最可恨的人, 我想艳婷肯定是逃不掉的了. 这个女人喜欢杨肃观没什么错, 喜欢杨肃观而又被伍定远感动没什么错, 喜欢杨肃观而又被伍定远感动而以身相许没什么错, 喜欢杨肃观而又被伍定远感动而以身相许但又和杨肃观纠缠不清也还能得到我的理解. 好吧, 到这个程度也许就是普通的婚外情而已, 现在这种事情太多了. 但是受杨肃观所托背着伍定远陷害伍定远的恩人和上司柳昂天全家就开始有些离经叛道了. 而后她能够背着伍定远成为杨肃观监视伍定远的棋子, 就已经完全走上了不归路. 我实在很难理解她做了这么多亏心事, 对不起这么多人, 心里怎能没有忏悔, 而且还能心安理得地继续这种生活?</p>
<p>最可敬的人</p>
<p>所谓英雄, 大都是令人钦佩不已的. 这本书里面写的正面人物也实在很不少. 要说全书最可敬的人实在是比较难. 而观海云远四个人里面, 也都很难直接归到可敬的范畴里去. 杨肃观虽然有大智慧大勇气, 但毕竟做了很多坏事, 要是可敬那是扯不上边的. 秦仲海一生蹉跎, 但是所谓天生反骨, 造反不为一个明确的善意, 只求痛快, 却也很难说让人敬佩. 伍定远练成绝世武功, 却遇事优柔, 明知艳婷不忠害死自己上司, 害得自己的兄弟远走天涯海角, 却还处处容忍, 这种人我是不佩服的. 四个人里面只有卢云的遭遇和行为能够让人有点敬佩的感觉. 虽然在处理有些事情上不够精明不够果决, 但是他一生维护自己的理想, 不惜抛下自己最珍爱的顾倩兮, 不惜状元顶戴和大好前程, 不惜和生死兄弟反目. 这一点上还是很让人钦佩的. 当然, 遇事不知道取舍不知道变通他却又有所欠缺了. 不过金无足赤, 想想也就释然了. 另外, 我们都是读书人出身, 作者也是. 这个人物这样写也寄托了我们这些臭知识分子身上的那股硬气, 如果现实中不能强硬一点, 在虚拟世界中一展胸怀也未尝不是一个寄情之法. 从这一点上来说, 武侠小说又被称为成人童话, 事出有因名至实归.</p>
<p>小说名为英雄志, 除了这四个主人公, 还有相当多的人物配得上英雄这两个字. 至于要在其他主要人物中相互PK, 挑一个出来做最可敬的人, 我想这个问题是不可能回答出来的.</p>
<p>累了, 下次有机会继续&#8230;  好吧我又在挖坑了&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/02/28/legend-of-heroes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Marley &amp; Me读后感</title>
		<link>http://blog.xiaket.org/2010/01/24/on-marley-and-me/</link>
		<comments>http://blog.xiaket.org/2010/01/24/on-marley-and-me/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 15:38:49 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[文学]]></category>
		<category><![CDATA[读书笔记]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=285</guid>
		<description><![CDATA[用一个星期就读完了这本书, 除了本周时间较多外, 主要还是因为这本书读起来让人兴致盎然.

这本书是为爱狗的读者写的. 从我这个不太爱狗的读者眼里看来, 文章的主线很平淡, 基本就是按照时间顺序写了怎么买狗怎么养狗最后狗怎么慢慢变老. 但是由于作者出色的文笔, 简单的故事写起来却总是让人着迷. 而如果你是一个热爱狗的人, 那么, 去买书吧, 你肯定不会觉得花在这本书上的钱是浪费.

很难写进一步的读后感了, 因为这本书的主题不是那么大. 我准备举几个我印象比较深刻的剧情了, 不过先说点背景吧. 它叫Marley, 是一只超级不听话的狗. 最害怕打雷, 喜欢咬任何能咬的东西, 喜欢闻小孩尿布的味道(囧), 喜欢水.

<span class="readmore"><a href="http://blog.xiaket.org/2010/01/24/on-marley-and-me/" title="Marley &#038; Me读后感">阅读全文——共865字</a></span>]]></description>
			<content:encoded><![CDATA[<p>用一个星期就读完了这本书, 除了本周时间较多外, 主要还是因为这本书读起来让人兴致盎然.</p>
<p>这本书是为爱狗的读者写的. 从我这个不太爱狗的读者眼里看来, 文章的主线很平淡, 基本就是按照时间顺序写了怎么买狗怎么养狗最后狗怎么慢慢变老. 但是由于作者出色的文笔, 简单的故事写起来却总是让人着迷. 而如果你是一个热爱狗的人, 那么, 去买书吧, 你肯定不会觉得花在这本书上的钱是浪费.</p>
<p>很难写进一步的读后感了, 因为这本书的主题不是那么大. 我准备举几个我印象比较深刻的剧情了, 不过先说点背景吧. 它叫Marley, 是一只超级不听话的狗. 最害怕打雷, 喜欢咬任何能咬的东西, 喜欢闻小孩尿布的味道(囧), 喜欢水.</p>
<ul>
<li>男主人公有一次给老婆买了一串项链, 他老婆很喜欢, 戴了起来. 一会儿后发现项链已经不在脖子上了, 寻寻觅觅以后发现这只狗偶然比较不正常, 进一步观察发现狗嘴里叼着一串金光闪闪的东西&#8230;男主和女主两人分头前后夹击准备抓住它, 但是Marley很审时度势地在最后一刻将项链吞下. 无奈的男主连续冲洗狗便便若干天, 三天后淘金行动获得成功, 而且经过狗消化道的项链比原来更亮更漂亮了&#8230;</li>
<li>这只狗偶然有了出演电影的机会, 扮演一只调皮的狗(这应该不难), 不过拍摄过程中屡屡被cut. 有一次在万众期待下Marley久久不现身, 导演无奈cut掉后男主去围观, 发现Marley bent over licking himself where no male was ever meant to lick.(这句话太邪恶了就不翻译了&#8230;)</li>
<li>这只狗变老后后腿不好, 爬楼梯很不方便, 但是它每天晚上总是很执着地爬上二楼到男女主人床边睡觉. 即使他也许需要失败摔倒若干次也在所不惜.(为什么不抱上二楼? 这只是Labrador Retriever, 成年后很大只的&#8230;)</li>
<li>为了保持狗身体健康, 男主家里专门买了给狗吃的维生素. 不过喂食维生素片的最好方式是在它面前假装不小心把药品掉在地上然后去捡, 这时候它会很自觉地抢先跑过来把药品吃下去&#8230;</li>
</ul>
<p>另外提醒一句, 这不是一部小说. 这本书里描写的所有故事都是真实的, 包括这只狗去演电影的故事.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/01/24/on-marley-and-me/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>东方快车谋杀案 &#8211; 读后感</title>
		<link>http://blog.xiaket.org/2010/01/17/on-murder-orient-express/</link>
		<comments>http://blog.xiaket.org/2010/01/17/on-murder-orient-express/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 15:51:53 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[文学]]></category>
		<category><![CDATA[读书笔记]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=277</guid>
		<description><![CDATA[在我看来, 这是一部很平淡的小说, 很难让人对这本书本身有什么感想. 不过无论如何, 还是先说几句吧.

首先谈谈Poirot这个人物的塑造吧. 至少在东方快车谋杀案这部小说里面, 我没有看到对Poirot这个人物特征的成功的描写. 整部小说看完, 我所认识的Poirot基本上只是一个比较能够体察人意的侦探, 这个人物只是一个苍白的躯壳, 被作者驱动着来推动一个并不是特别吸引人的故事往前进. 再来批下这本书的结构, 看看目录你就知道我在这儿想要说什么了. 除掉开头的几章, 主要侦查部分的章节名就剩下审xxx这么几个字. 每拿一个人的口供就单独作为一章. 话说这个章节结构就差去掉章节标题仅保留1234这些数字编号了. 不仅这本书的章节结构让人倒胃口, 语言也往往都很死板. 语言也不出彩, 实在让人难以读下去. 所以老实说这本书我读得那叫一个飞快. 管你什么案情曲折, 就你这个文笔, 我眼睛扫过这些字都已经很对得起人民对得起党了. 这本书里面的几个人物应该还算是比较不一样的, 给一个正经点会来事的作者, 肯定能够把里面的一群次要人物也写得活灵活现, 但是AC大人就一根筋地往前推剧情, 剧情靠供词来推, 换言之, 除了对话还是对话, 能够反映人物心理活动的动作却是很罕见, 其他背景描写就根本没有, 真让人情何以堪!

<span class="readmore"><a href="http://blog.xiaket.org/2010/01/17/on-murder-orient-express/" title="东方快车谋杀案 &#8211; 读后感">阅读全文——共793字</a></span>]]></description>
			<content:encoded><![CDATA[<p>在我看来, 这是一部很平淡的小说, 很难让人对这本书本身有什么感想. 不过无论如何, 还是先说几句吧.</p>
<p>首先谈谈Poirot这个人物的塑造吧. 至少在东方快车谋杀案这部小说里面, 我没有看到对Poirot这个人物特征的成功的描写. 整部小说看完, 我所认识的Poirot基本上只是一个比较能够体察人意的侦探, 这个人物只是一个苍白的躯壳, 被作者驱动着来推动一个并不是特别吸引人的故事往前进. 再来批下这本书的结构, 看看目录你就知道我在这儿想要说什么了. 除掉开头的几章, 主要侦查部分的章节名就剩下审xxx这么几个字. 每拿一个人的口供就单独作为一章. 话说这个章节结构就差去掉章节标题仅保留1234这些数字编号了. 不仅这本书的章节结构让人倒胃口, 语言也往往都很死板. 语言也不出彩, 实在让人难以读下去. 所以老实说这本书我读得那叫一个飞快. 管你什么案情曲折, 就你这个文笔, 我眼睛扫过这些字都已经很对得起人民对得起党了. 这本书里面的几个人物应该还算是比较不一样的, 给一个正经点会来事的作者, 肯定能够把里面的一群次要人物也写得活灵活现, 但是AC大人就一根筋地往前推剧情, 剧情靠供词来推, 换言之, 除了对话还是对话, 能够反映人物心理活动的动作却是很罕见, 其他背景描写就根本没有, 真让人情何以堪!</p>
<p>这本书里面所涉及的案件要和CD笔下的Holmes破的案相比较无疑是不太现实的. 和Holmes经常要在伦敦城跑来跑去, 时不时还要出个差, 召唤下小弟协助调查相比, 这种被大雪困住前不着村后不着店的火车里的凶杀案件无疑是小儿科, 幼稚程度直逼主要观众设定为小孩的名侦探柯南. 而和柯南相比, Poirot的人物形象却模糊得很, 不要说没性格没特点没爱好, 估计就让人能够记住这个人都是比较困难的. 和Holmes的人物形象相比? 别欺负人嘛~</p>
<p>说得简单一点, 就这本书所表现出来的水平, AC大概也就刚够给青山刚昌写写柯南的文案. 要和CD相提并论还是差太多了.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2010/01/17/on-murder-orient-express/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>挪威的森林, 中文与英文</title>
		<link>http://blog.xiaket.org/2009/12/28/norwegian-wood-translations/</link>
		<comments>http://blog.xiaket.org/2009/12/28/norwegian-wood-translations/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 14:36:31 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[文学]]></category>
		<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[挪威的森林]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=218</guid>
		<description><![CDATA[最近在读村上春树的挪威的森林的英文版. 之前一直认为既然村上春树能够在美国的大学里面教书, 这本书应该会自己译成英文才对. 于是一直很期待体验英文版的风味. 不久前去书店仔细看了下才知道不然, 这本书是另一个美国教授所译, 印象分就此大打折扣. 前些天考虑是否买这本书时, 心想, 罢了, 生活总是这样不能尽如人意的, 就体验一次吧, 还是定购了这本. 另外, 看这本书的英文版似乎需要恶补下F. Scott Fitzgerald的The Great Gatsby才对, 毕竟这是村上本人和小说的主人公都十分热爱的作品. 可惜手头没有实体书, 习惯了看印刷体英文小说后要回去看电子版的无疑是种煎熬. 我说这两层意思只是要强调, 下面我要发表的意见仅仅是一个没看过背景介绍, 对这本书本身期待很高但是对英文版期待较低, 而且显然没有读过日文原著的人的一点盲人摸象后的见解.

<span class="readmore"><a href="http://blog.xiaket.org/2009/12/28/norwegian-wood-translations/" title="挪威的森林, 中文与英文">阅读全文——共1447字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近在读村上春树的挪威的森林的英文版. 之前一直认为既然村上春树能够在美国的大学里面教书, 这本书应该会自己译成英文才对. 于是一直很期待体验英文版的风味. 不久前去书店仔细看了下才知道不然, 这本书是另一个美国教授所译, 印象分就此大打折扣. 前些天考虑是否买这本书时, 心想, 罢了, 生活总是这样不能尽如人意的, 就体验一次吧, 还是定购了这本. 另外, 看这本书的英文版似乎需要恶补下F. Scott Fitzgerald的The Great Gatsby才对, 毕竟这是村上本人和小说的主人公都十分热爱的作品. 可惜手头没有实体书, 习惯了看印刷体英文小说后要回去看电子版的无疑是种煎熬. 我说这两层意思只是要强调, 下面我要发表的意见仅仅是一个没看过背景介绍, 对这本书本身期待很高但是对英文版期待较低, 而且显然没有读过日文原著的人的一点盲人摸象后的见解.</p>
<p>要说什么呢? 意见最大的还是翻译质量吧. 手头的一本中文版是林少华先生的作品, 据说很有些过译的嫌疑. 而手头这本英文版却像缺了佐料, 怎么读都不够味道. 如果我所看的是其他作品的英文版, 我想我的失望不会这么大. 村上的作品很多地方是可以品的, 有很多细节的描写让我想起了海明威对文学作品的要求: &#8220;人的语言对于人的思想的表达就好象冰山一样,只有八分之一在水上面,有八分之七在水下&#8221;. 如果你有些类似的经历, 在这部作品里面能够得到不断的共鸣和思考. 举个不恰当的例子, 在金圣叹批评的水浒中, 经常可以看到&#8221;如画&#8221;的平均, 意即这边写得生动贴切, 就像真的一样. 而村上的作品在代入感于参与感上比&#8221;如画&#8221;更进一步, 经常会让人产生诸如&#8221;如果我是渡边我该如何选择&#8221;的思考. 而这种作品如果是过译往往不太容易显出问题, 而译得平淡却会让人叹息了. 试举两个例子:</p>
<p>例子1:(第3章)</p>
<pre>第二个周六, 直子打来电话. 我们在周日幽会了. 我想大概还是称为幽会好, 此外我想不出确切字眼.</pre>
<pre>Naoko called me the following Saturday, and that Sunday we had a date. I supppose
I can call it a date. I can't think of a better word for it.</pre>
<p>这个例子里面, 中文的译文明显更有音韵感一些, 前面三段字数都不多, 琅琅上口, 而后面的两段字数更多, 所写的内容也发生了变化, 这一点在英文译文里面是看不出来的. 当然这个要求也许太高了, 毕竟相对于英文, 日文更贴近中文一些, 中文译文中保留这种音韵感是理所当然的事情. 但是后面将直子和渡边的聚会翻译成date则让我对这部书的英文译者敬意骤减. 村上在这儿费心多写了一句扭曲的话, 就是要强调这种聚会的不正常, 而将这种不正常的聚会用正常至极的date翻译出来, 顿时令原文失色不少, 而且给人以突兀的感觉.</p>
<p>例子2:(第10章)</p>
<pre>"不要同情自己!" 他说, "同情自己是卑劣懦夫的勾当."</pre>
<pre>"Don't feel sorry for yourself," he said. "Only arseholes do that."</pre>
<p>这个地方与其说是腹诽英文译文的平淡, 倒不如应该更责备林少华先生的过译. 从全书来看, 这句话不应该占有特别重要的地位. 我以为这句话应该译得恰到好处, 一方面这句话要有一定的分量, 让渡边在后面能够记得它; 另一方面从永泽的嘴里说出的这句话不应成为让人眼睛一亮的名言警句. 林先生的这句话如果最后一个名词不是勾当, 我想会合适很多. 当然, 这句话的英文译文则太过普通, 没有任何抓住人记忆的记忆点, 让人失望.</p>
<p>读完手头这些作品再去读读赖明珠先生的译本吧, 据说会更贴近原文.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2009/12/28/norwegian-wood-translations/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>闲扯《挪威的森林》和The Time Traveler&#8217;s Wife</title>
		<link>http://blog.xiaket.org/2009/12/05/norwegian-wood-and-the-time-travelers-wife/</link>
		<comments>http://blog.xiaket.org/2009/12/05/norwegian-wood-and-the-time-travelers-wife/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 15:28:56 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[文学]]></category>
		<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[the time traveler's wife]]></category>
		<category><![CDATA[挪威的森林]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=161</guid>
		<description><![CDATA[我不知道国内同时看过这两本书的人有多少. 前者(全文链接)我的同龄人很多应该看过. 后面这部小说早几年就是畅销书, 电影今年8月在国外上映(预告片链接). 虽然未能如我所愿地在国内上映, 但是小说读过的应该不少, 否则我在淘宝上买书时也不会得到&#8217;时间旅行者的妻子在上海已经卖断了&#8217;的回复. 因此, 写下这篇比较, 或说随感, 大约应该没有办法确定是在制造电子垃圾吧, 我希望.

这两个故事看起来没什么联系, 虽然两本书的故事都有够纠结. 第一本书里面的主人公渡边在大学期间和已自杀身亡少年时好朋友的青梅竹马的女友直子偶然相逢. 和一切小说该有的情节一样, 他对她有了好感. 但是她依然沉浸在男友自杀的噩梦中无法醒来, 或者简而言之, 她心理上受了太大的刺激而无法与人交往. 渡边尝试了很多方式去帮助她, 但最后直子仍是撒手人寰. 后面那个故事或许更离奇些. Henry是一个时间旅行者, 他会在空间和时间中不由自主地跳来跳去, 不过不幸的是, 他到一个新的时间点时是身无寸缕的. 在成年后的他的教育下, 他学会了常用的生存技能例如偷窃, 斗殴, 逃逸等等. 他或许还算平安地渡过了二十多年的人生, 此时, 他的职业是图书管理员. 这时, 他第一次遇见了Clare. Clare却早已认识他, 她六岁时就遇见了成年后的Henry, Henry每隔一段时间就会时间旅行去伴随她成长. 省略掉中间很多重要细节后, 最后的结局是Henry在时间旅行的过程中被Clare的父亲和哥哥枪杀. Clare带着她和Henry的孩子长大, 直到82岁时最后一次遇见Henry. 

<span class="readmore"><a href="http://blog.xiaket.org/2009/12/05/norwegian-wood-and-the-time-travelers-wife/" title="闲扯《挪威的森林》和The Time Traveler&#8217;s Wife">阅读全文——共1417字</a></span>]]></description>
			<content:encoded><![CDATA[<p>我不知道国内同时看过这两本书的人有多少. 前者(<a href="http://www.cunshang.net/book/nor_lsh/contents.htm">全文链接</a>)我的同龄人很多应该看过. 后面这部小说早几年就是畅销书, 电影今年8月在国外上映(<a href="http://v.youku.com/v_show/id_XOTgxODg4Mjg=.html">预告片链接</a>). 虽然未能如我所愿地在国内上映, 但是小说读过的应该不少, 否则我在淘宝上买书时也不会得到&#8217;时间旅行者的妻子在上海已经卖断了&#8217;的回复. 因此, 写下这篇比较, 或说随感, 大约应该没有办法确定是在制造电子垃圾吧, 我希望.</p>
<p>这两个故事看起来没什么联系, 虽然两本书的故事都有够纠结. 第一本书里面的主人公渡边在大学期间和已自杀身亡少年时好朋友的青梅竹马的女友直子偶然相逢. 和一切小说该有的情节一样, 他对她有了好感. 但是她依然沉浸在男友自杀的噩梦中无法醒来, 或者简而言之, 她心理上受了太大的刺激而无法与人交往. 渡边尝试了很多方式去帮助她, 但最后直子仍是撒手人寰. 后面那个故事或许更离奇些. Henry是一个时间旅行者, 他会在空间和时间中不由自主地跳来跳去, 不过不幸的是, 他到一个新的时间点时是身无寸缕的. 在成年后的他的教育下, 他学会了常用的生存技能例如偷窃, 斗殴, 逃逸等等. 他或许还算平安地渡过了二十多年的人生, 此时, 他的职业是图书管理员. 这时, 他第一次遇见了Clare. Clare却早已认识他, 她六岁时就遇见了成年后的Henry, Henry每隔一段时间就会时间旅行去伴随她成长. 省略掉中间很多重要细节后, 最后的结局是Henry在时间旅行的过程中被Clare的父亲和哥哥枪杀. Clare带着她和Henry的孩子长大, 直到82岁时最后一次遇见Henry. </p>
<p>就我看来, 两本书都是以不太正常的情节作为载体来讲述男女间的感情问题. 两部小说里面的主角的爱情都因为一方去世而成为绝唱. 两本书里面的相似最大的地方在于两个男主角身上带有的那种漂浮在时空中的带不走的哀伤. 前者虽然爱着直子, 但是却一直面对着一个可望而不可及的, 从没爱过自己的恋人, 而且除却少许时候的错觉外, 自己一直都很清楚这一点. 但是出于对直子的爱, 责任感和对渺茫的未来的憧憬, 仍是执着着追寻, 甚至面对更合适的绿子也不愿去倾注感情. 虽然他生活在自己的世界里, 但是却因为直子的病患而不得不像在处于一个不确定的时间和不确定的位置一样, 出于自己的直觉和性格而做着让自己不知所谓的事情. 后一本书的设定更是直接将男主角设定成在时空中漂泊. 这本书前半部分温馨有趣得让人觉得不安. 果不其然, 在后半部分的有些章节(尤其是他遇到自己未来的女儿的那一章, Alba, an introduction)确是让人不忍心读下去. 如果单纯从经历来看, 男主角Henry的生活是很悲惨的, 少年时莫名其妙得到时间旅行的能力, 而后在交通事故中失去母亲, 父子反目, 和前女友纠缠不清, 遇见Clare后又因为时间旅行的能力而遇到各种问题, 尤其是Clare腹中的小孩也遗传得到了这种能力而使得Clare数次流产, 夫妻又因为这个问题而不和睦. 再往后不久, 他就冻坏了脚, 而后死去. 不过, 我举出这一连串不幸只不过是要赞叹Henry在面对这一切时所表现出来的勇气. 尤其是他已经得知自己时日不多, 仍是为了Clare而努力地生活, 这种态度相比渡边无疑是主动得太多了. 当然, 从个人的角度来讲, 处于他们两人的地位, 尤其是如果我处于Henry的地位, 我做的事情也许不会有太大的区别. 为什么不是渡边? 大的方向上我应该是一致的, 包括以各种可能的方式支持直子, 包括暂不接受绿子. 但是要做到对那些超越我想象力的事情能够处乱不惊, 我还是不够啊.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2009/12/05/norwegian-wood-and-the-time-travelers-wife/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pro Django阅读笔记: 第二章 第一部分</title>
		<link>http://blog.xiaket.org/2009/11/21/pro-django-ch2-notes-1/</link>
		<comments>http://blog.xiaket.org/2009/11/21/pro-django-ch2-notes-1/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 11:43:33 +0000</pubDate>
		<dc:creator>xiaket</dc:creator>
				<category><![CDATA[Django开发]]></category>
		<category><![CDATA[Python开发]]></category>
		<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[django-orm]]></category>
		<category><![CDATA[metaprogramming]]></category>

		<guid isPermaLink="false">http://blog.xiaket.org/?p=72</guid>
		<description><![CDATA[Pro Django是由Marty Alchin写的一本关于Django高级技巧的技术书籍. 由Apress出版, 我手头的是09年的第一版. 书籍相关信息及链接如下:



Appress上的书籍主页

<span class="readmore"><a href="http://blog.xiaket.org/2009/11/21/pro-django-ch2-notes-1/" title="Pro Django阅读笔记: 第二章 第一部分">阅读全文——共3784字</a></span>]]></description>
			<content:encoded><![CDATA[<p>Pro Django是由Marty Alchin写的一本关于Django高级技巧的技术书籍. 由Apress出版, 我手头的是09年的第一版. 书籍相关信息及链接如下:</p>
<ul>
<li><a href="http://www.apress.com/book/view/1430210478">Appress上的书籍主页</a></li>
<li><a href="http://prodjango.com/">疑似作者架设的书籍主页</a></li>
<li><a href="http://martyalchin.com/">作者博客</a></li>
</ul>
<p>这本书不适合Django初学者学习, 但是对于已经入门的又需要进一步学习的开发者却很有针对性. 我准备在这儿写一下这本书的读书笔记, 也逼着自己能够继续看完这本书&#8230;第一章基本是闲扯, 虽然概念上很重要, 但是没有提供任何直接的技巧, 就略过了&#8230;这篇文章主要是关于第二章: Django中的python技巧.</p>
<h3>Python中类的创建</h3>
<h4>动态类创建:使用type函数</h4>
<p>要创建一个类, 比较大众化的方法是酱紫的:</p>
<pre class="brush: python;">
&gt;&gt;&gt; class NormalClass(object):
...     print 'Loading NormalClass...',
...     spam = 'eggs'
...     print &quot;done&quot;
...
Loading NormalClass... done
&gt;&gt;&gt; NormalClass
&lt;class '__main__.NormalClass'&gt;
&gt;&gt;&gt; NormalClass.spam
'eggs'
</pre>
<p>除了这种方法之外, 还可以用另外一种方式来创建类:</p>
<pre class="brush: python;">
&gt;&gt;&gt; DynamicClass = type('DynamicClass', (object,), {'spam': 'eggs'})
&gt;&gt;&gt; DynamicClass
&lt;class '__main__.DynamicClass'&gt;
&gt;&gt;&gt; DynamicClass.spam
'eggs'
</pre>
<p>上面这种方面里面用到了type函数. 一般来说, 我们是将一个对象作为参数传递给type函数, 这种情况下type函数的作用是给出这个对象的类型. 而当type接受三个参数时, type函数可视作是class语句的动态形式. 此时, 三个参数依次为新类名, 基类和包含新类属性的字典. 用type来动态构建类是很方便的.</p>
<h4>用元类(metaclass)来改变类的属性</h4>
<p>type实际上是一个元类, 元类是能够创建其它类的类. 元类编程所要实现的目的是在代码运行时而不是在程序编写时创建和改变代码. 例如上面的类定义的例子, 类的名字是代码运行时的一个变量. Python对元类编程的支持是通过允许在类定义里面包括一个元类而实现的. 如果一个类的定义里面包含了对__metaclass__属性的定义, 那么我们不会用默认的type方法来创建这个类, 而是用这个__metaclass__来创建我们定义的类:</p>
<pre class="brush: python;">
&gt;&gt;&gt; class MetaClass(type):
...     def __init__(cls, name, bases, attrs):
...         print 'Defining %s' % cls
...         print 'Name: %s' % name
...         print 'Bases: %s' % (bases, )
...         print 'Attributes:'
...         for (name, value) in attrs.items():
...             print '    %s: %r' % (name, value)
...
&gt;&gt;&gt; class RealClass(object):
...     __metaclass__ = MetaClass
...     spam = 'eggs'
...
Defining &lt;class '__main__.RealClass'&gt;
Name: RealClass
Bases: (&lt;type 'object'&gt;,)
Attributes:
    __module__: '__main__'
    __metaclass__: &lt;class '__main__.MetaClass'&gt;
    spam: 'eggs'
&gt;&gt;&gt; RealClass
&lt;class '__main__.RealClass'&gt;
</pre>
<p>注意哦, 这个类没有实例化, 我们在创建这个类的过程中就执行了MetaClass中的代码. 在这个例子中, MetaClass定义了一个__init__方法, 而在Django内部代码里面, 更多的元类编程是在__new__方法中完成的. 另外, 关于python的元类编程(metaprogramming), 下面有三篇文档, 包括一篇wikipedia上的介绍和IBM DevWorks上两篇不错的文章:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Metaprogramming">Metaprogramming简介</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-pymeta/index.html">Python 中的元类编程</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-pymeta2/index.html">Python 中的元类编程，第 2 部分</a></li>
</ul>
<h4>实际的元类编程例子: Django中的模型定义</h4>
<p>下面是一段典型的Django创建模型的代码:</p>
<pre class="brush: python;">
class Ox(models.Model):
    horn_length = models.IntegerField()

    class Meta:
        ordering = [&quot;horn_length&quot;]
        verbose_name_plural = &quot;oxen&quot;
</pre>
<p>现在我们一起来体会下这段代码执行时到底干了什么. 首先需要说明的是, Ox这个类的基类是models.Model, 相关代码在django/db/models/base.py. 而Model这个类是由ModelBase这个元类生成的:</p>
<pre class="brush: python;">
class ModelBase(type):
    &quot;&quot;&quot;
    Metaclass for all models.
    &quot;&quot;&quot;
    def __new__(cls, name, bases, attrs):
+---170 lines: super_new = super(ModelBase, cls).__new__------------------

class Model(object):
    __metaclass__ = ModelBase
    &quot;&quot;&quot;some more code&quot;&quot;&quot;
</pre>
<p>这种布局, 或者说代码结构的好处, 在于在Ox模型的定义过程中隐藏了元类声明, 因为这理应是比较低层的内容, 不应该让普通用户过多干涉. 另一个比较显著的好处在于Ox模型能够方便的继承models.Model里定义的各种方法. 当然, 这样布局后, Ox模型的定义也很清晰易懂, 更pythonic. 读完上面的代码, 会发现类的定义里面还有一个子类, 叫Meta. 简单看了下代码, 虽然名字一样, 但是这段似乎和元类编程没有直接的关系. 尽管Meta里面定义的内容是在ModelBase的__new__方法里面处理而作为_meta来保存的.</p>
<p>关于Django的ORM的进一步讨论会在第三章里面进行~</p>
<h3>各种数据类型的通用方法</h3>
<p>注意下, 这些是约定俗称的通用方法, 而不是确定一定以及肯定有的方法. 对于Django来说, 这些类型都是具有这些方法的, 对于较大的Django的库来说也是这样. 但是不要太想当然&#8230;</p>
<h4>可调用的类型</h4>
<p>此处, 可调用的类型包括函数, 类和类方法都是可调用的. 另外, 如果一个类定义了__call__方法, 那么这个类的实例也是可调用的:</p>
<pre class="brush: python;">
&gt;&gt;&gt; class Multiplier(object):
...     def __init__(self, factor):
...         self.factor = factor
...     def __call__(self, value):
...         return value * self.factor
...
&gt;&gt;&gt; times2 = Multiplier(2)
&gt;&gt;&gt; times2(5)
10
&gt;&gt;&gt; times3 = Multiplier(3)
&gt;&gt;&gt; times3(10)
30
</pre>
<p>在这一段代码中, 我们首先定义了一个乘法器的类, 这个类初始化时接受一个参数, 乘数因子. 这个类的实例能够被调用, 接受一个参数, 被乘数. 例如, 在第7行, 括号中的2是类初始化参数. 初始化后times2是一个Multiplier类的一个实例. 之后我们调用times2(5)是将5作为参数交给Multiplier类中的__call__方法. 另外提一句, Python还提供了一个callable函数来判断一个对象是不是可以被调用的.</p>
<h4>字典</h4>
<p>一般字典类型或者类似字典类型都会提供下面三种方法: __contains__(self, key), __getitem__(self, key), __setitem__(self, key, value). 其中__contains__方法一般通常是通过in运算符使用.</p>
<h4>可迭代的类型</h4>
<p>可迭代的类型是指能够送进for循环的类型. 列表, 元组, 字典等都是可迭代的. 如果你的类想要变成一个可迭代的类型, 那么你需要定义自己的__iter__方法:</p>
<pre class="brush: python;">
&gt;&gt;&gt; class Fibonacci(object):
...     def __init__(self, count):
...         self.count = count
...     def __iter__(self):
...         a, b = 0, 1
...         for x in range(self.count):
...             if x &lt; 2:
...                 yield x
...             else:
...                 c = a + b
...                 yield c
...                 a, b = b, c
...
&gt;&gt;&gt; for x in Fibonacci(5):
...     print x,
...
0 1 1 2 3
&gt;&gt;&gt; for x in Fibonacci(10):
...     print x,
...
0 1 1 2 3 5 8 13 21 34
</pre>
<p>今天就酱紫吧, 明天有时间继续.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xiaket.org/2009/11/21/pro-django-ch2-notes-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
