读书笔记,一段时间以来

021《火星公主》作者:[美] 埃德加·赖斯·伯勒斯, young@nenu

我坚信,一个男人和女人的交往正好和他的勇敢成反比。一个懦弱的蠢货经常能轻

易地迷住女人,而一位可以毫无惧色 地面对成千上万个真正敌人的勇士却只能像

受了惊吓的孩子一祥躲在暗处。

young@nenu, 021《火星公主》作者:[美] 埃德加·赖斯·伯勒斯, loc. 1239-1241

068《星船伞兵》作者:[美] 罗伯特·海因莱因, young@nenu

发生这种事本来会使你停下来,好好想想为什么当初竟然选择参军。只不过我太忙

了,没时间为任何事停顿。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 191-192

失败。一个人可以向一个孩子灌输知识,但他无法教会他怎样思考。"

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 330-331

(这一部分使我吃了一惊。我过去一直认为一个服役期就是两年,大家都是这么说的。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 427-428

杜波司先生早就在历史和道德哲学课上给我们分析了就职誓言,

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 434-435

Notes: 1) contradictory

杜波司先生早就在历史和道德哲学课上给我们分析了就职誓言,让我们逐句学习

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 434-435

他说你不笨,只是太无知了,

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 491-491

兹穆中士后来说过,一群人要比单独一个人来得弱,除非他们受过训练,配合默契

(他是对的).例如,

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 583-584

但是,把新兵营搞得这么惨,有这个必要吗?对这个问题,我只能这么说:下一次

我不得不空降作战时,我希望我的战 友是从考利营或是与它相当的西伯利亚营地

毕业的。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 686-687

在某些情况下,用氢弹去攻击敌人的一个城市就像用斧子砍孩子的屁股一样愚蠢。

战争不仅仅是暴力和杀戮这么简单。 战争是为达到某种目的而使用的有控制的暴

力。   战争的目的就是以武力支持政府的决定,绝不是为杀人而杀人……   而

是为了让他做你想让他做的事。不是杀戮……而是有控制、有目的的暴力。选择暴力

的方式不是你我所能决定的。士兵的任务不是决定何时、何地、以何种方 式——以

及为什么——作战。那是政府高层和将军们的事。政府高层决定为什么、何种程度。

将军们从他们那儿接受任务,决定时间、地点和手段。我 们提供暴力,其他人——

他们称之为'聪明的老家伙们'——实施控制。这就是战争的形式。这是我能提供的最

好的答案。如果你还不满意,我可以给 你提供一个面见团长的机会。如果他同样

不能使你信服——你就回家去,当个老百姓!因为在这种情况下,你永远不会成为一

名士兵。"

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 779-787

比如,如果我们两个恰好在剧院或商店里碰上,只要你对我的军衔表现出应有的尊

敬,我所拥有的扇你耳光的权利不会 比你拥有的扇我耳光的权利更多。但是在军

务中,规则就完全不同

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 863-865

我可以打碎你的下巴,为此我会向我自己的上司做出必要解释。但是我不必向你解释。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 867-868

当然,值勤教官也可以哄你,说'亲爱的,乖',或是问你今早是否想在床上用早餐

——如果我们能抽出一个教官专门 当你的保姆的话。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 873-874

我们不能恨他们,也不能喜欢他们。我们必须教导他们。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 1024-1024

一个人可以想像的最崇高的生活方式,就是将他自己的身体挡在荒芜的战场和可爱

的家园之间。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 1136-1137

仅有的记录留在了最重要的地方。   脑子里。你永远不会忘了它。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 1352-1353

漫长繁忙的军旅生涯可能仅仅只有几个小时和敌人面对面作战,剩下的都是训练、

准备、出发——随后返回、调养修 整,准备进入下一个循环,并且在战斗间隙不断

练习,练习,练习。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 1842-1843

足足五十三件装甲动力服需要检查、维护,战斗间歇必须检修,更不用提武器和特

殊装备了。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 1849-1849

在我们的系统之下,任何一个投票者或是政府官员都是一个这样的人,他已经通过

志愿参加的艰苦服役表明,他能够将 集体的利益摆在个人之前。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2310-2312

如果希福中尉不能推荐提升他为中士,那么他就不会继续把他留在这个排,他会以

最快速度把他赶出这艘船。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2741-2742

我们已经有一位副排长去了军官学校,本来就少一个中士,我自己人手都不够,当

然有理由拒绝他们的要求。"

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2749-2750

这是一场野蛮的战争,小子,而且你的自己人会从你这儿把人偷走,如果你不好好

看着他们的话。"

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2750-2751

意外总是会发生的。"

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2768-2768

不要告诉他你和我商量过了——是你给他下命令。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2779-2779

着:"方位检查。你的方位是275,十二英里。"   "长官,你的是96,十二英

里。"   "很接近。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 2909-2910

躺下。这是命令。准备睡觉……一……二……三——乔尼!"   "上尉,如果你允许的

话,我想先检查一下听地器,之后再休息,如果你坚持的话。我自己情愿醒着。我

——"   布莱基在我耳边大笑。"听着,小子,你已经睡了一个小时又十分钟了。"

  "长官?"   "看一下时间。"我看了——感到自己真蠢透了。"你清醒了吗,小

子?"

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 3092-3096

由于它们仍然关押着我方的被俘人员,我们无法在克兰达斯上使用超新星炸弹——必

须空降,降落到地面,

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 3373-3374

海因莱因这部作品不仅流露出了作者对天赋人权的质疑,更描绘了一个只有被训练

成一名军人才能成为"公民"的"理 想社会",

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 3429-3431

他并不是一个法西斯分子,而是一个深受进化论哲学影响的自由意志论者。

young@nenu, 068《星船伞兵》作者:[美] 罗伯特·海因莱因, loc. 3433-3434

084《霸主的影子》作者:[美] 奥森·斯科特·卡德, gift.young@gmail

没有什么能够训练你在行星表面生活,除了生活在那里。

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 158-158

她对竞争没有特殊的兴趣,因为她总是一开始就已经假设了它,如果很重要的话,

她会找到取胜的办法的。   

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 160-161

就象安德曾经说过的,绝大多数胜利来自及时扩大你的敌人愚蠢的错误,而不是由

于你自己的计划有任何特别卓越的地 方。

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 1361-1362

我正在把我的生命放到他手重。而且现在我发现了他的整个生活中从来没有和任何

人建立诚实的关系。"

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 1934-1935

如果你只把你认为我需要的资料给我的话,"比恩说,"那么我的建议的只能由告诉

你你已经知道的事情来组成,而我 现在最好就回家去。"

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 2450-2451

他们都是全数返回。有受伤但是没有死亡。有的时候任务失败,但是没有人死亡。

  "这是个失败的任务,"比恩说,"但是让你赢得他们的信赖。当你们看到那比

我们预期危险得多的时候,是需要降低目标的,然后告诉他们你比目前的目标更

重视他们的生命。稍后,当你没有选择只能让他们去冒险的时候,他们会知道那是

因为这次是值得去死的。他们知道你不会象孩子对待糖果或者垃圾那 样浪费他们的。"

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 3895-3899

在所有的时候,萨里文都几乎不能提供任何帮助而且有的时候显示出直接的敌意。

但是比恩接纳了萨里文,委托他进行 指挥,鼓励人们帮助萨里文学习他们能够做

的。所有的时候,比恩从没有把萨里文视为一个下属或者累赘,而是宁可把他看作

未来的上级官员。

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 3901-3904

因为他搂着你,就象是情人,"比恩说。"站在那里,枪口对着你的头,他用带着爱

的心境抓住你。我认为他打算在他 带你登机之前吻你。他希望我看到。"   "她

根本不会让他吻她的,"弗拉密厌恶地说。   但是佩查看着比恩注视的眼睛,眼

中的泪水给出了比弗拉密的勇敢的言语更真实的回答。她已经让阿契里斯吻过她

了。和颇克一样。   "他给你打了印记,"比恩说。"他爱你。你有比他更高的力

量。在他不再需要你作为人质避免我杀掉他以后,你就不会再活下去了。"

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 4362-4366

他要为自己的行为负责,而不是别人。即使那些拯救了他的生命的人。"

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 4368-4369

你从他那里自由了。你现在的每分每秒每天每科都比比去设想如果他听到你的话会

怎么对付你,也不用去象他可能看的 时候你该怎么做。他现在唯一能够伤害你的

方法,就是你在心里一直监视着他。"

gift.young@gmail, 084《霸主的影子》作者:[美] 奥森·斯科特·卡德, loc. 4371-4373

106《银河系公民》 罗伯特·海因莱恩, 罗伯特·海因莱恩

老爹一直认为聪明人不可能觉得受了侮辱,因为真理不可能被侮辱,如果侮辱本身

是一种谬误,那就更不值得为它光火 了。

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 114, loc. 1746-1747

你们为这种空前的自由所付出的代价却是……自由本身。不,我不是说谜语,我是

说,'同胞'这个整体的自由是以牺 牲你们每个人的个人自由为代价换来

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 134, loc. 2048-2049

自由是个难以放弃的习惯

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 136, loc. 2072-2072

电脑停止运行以后,杰里放下手头工作,看到索比还对着控制面板发愣……不一会

儿,索比又活跃起来,想根据最后出 现的数据再计算一次。杰里一只手搭在他肩

上,说:"打完了,索比。"

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 142, loc. 2168-2169

可他不愿坐办公室,所以主动降级——两次降为上校——好直接指挥飞船。

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 176, loc. 2699-2700

那就更好了。现在您可以让他上船当兵,以后当您搞清楚他该去什么地方时,您就

会发现他的年龄搞错了……必须纠 正。给他发些工资,打发他回到自己的星球上去

就是了。"   布里斯比眨了眨眼睛,说:"财务官,你们这些当出纳的都这么狡

猾吗?"

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 182, loc. 2776-2779

你没有当过巴斯利姆上校的部下。那个人,让他高兴很容易,只要你做到百分之百

的完美就行。

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 198, loc. 3030-3031

这天夜里,索比好像听见了族长奶奶严厉的声音:"——再想一想!要是你不懂它是

什么意思,而文件在付诸法律以后 又可以生效执行,那就不要签字!不管这份文

件看上去有多大好处,你也不能签。过分懒惰或者过分急切都可以毁掉一个贸易商。"

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 221, loc. 3378-3381

所以,如果有人来要求去做某项工作,我们是不会立即同意的。相反,我们要求他

做到叫他干什么,他就必须去干什 么。我们只是使用他,往往会让他干到直至做

不动为止。

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 254, loc. 3882-3883

某个衣冠楚楚的应声虫就会站出来大放厥词,他会说,奴隶制也不见得那么坏,因

为许多人如果不用承担自由民的责 任,他们的生活其实比承担责任幸福得多。

罗伯特·海因莱恩, 106《银河系公民》 罗伯特·海因莱恩, pg. 256, loc. 3921-3922

177《猫的摇篮》作者:[美] 库特·冯尼古特, young@nenu

父亲看了一会儿那圈绳子,然后就用手指翻弄着花样。他翻出来的花样叫'猫的摇篮'。

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 89-90

自然界中有那么多货真价实的游戏,我何苦自找烦恼去玩那些人们生造出来的呢?

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 94-95

他拒人于千里之外,因为他从来对人们就没有兴趣。

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 112-113

他说:"要是我能够主管费利克斯的话,那么我现在就准备去主管火山、湖水、

鸟、鼠的迁徙了。那个人是一种自然力 量。人们无法左右他。"

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 177-179

我问布里德博士有多少人在研究实验室工作,他说:"七百人,但是真正从事研究

工作的不到一百人。另外六百人都是 打杂的,而我是头号的打杂工。"

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 263-265

霍尼克博士常说,一个科学家要是不能向一个八岁的孩子讲明他在干什么的话,那

他就是一个江湖骗子。"

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 277-278

人们提出的建议铺天盖地,但从事纯研究工作的人对此不屑一顾。他脑子里装潢了

自己的计划,而我们需要的正是这种 工作作风。"

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 337-338

他们提出各种各样的乌七八糟的计划,到现在还是这样。这些计划的唯一不足在于

目前我们所具备的知识还不能将它们 付诸实践。

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 340-341

费利克斯的奇迹就在于——我衷心希望你能把这一点写进你的书里——他永远能把陈旧

的难题当成全新的奥秘去探 索。"

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 354-355

他注视着遮掩洞穴的水帘。他对我说;"我所理解的成熟,就是要有自知之明。"

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 1547-1548

他常说,他永远也不做他劝别人做的事情,因为他知道那是没有价值的。

young@nenu, 177《猫的摇篮》作者:[美] 库特·冯尼古特, loc. 2142-2143

Kindle Paperwhite 用户指南(第 2 版), 亚马逊

如需标注下一页内容,请拖动手指到屏幕右下角以翻页。您可以一直拖动对多个页

面进行标注。 如需标注上一页内容,请拖动手指到屏幕左上角以翻页。您可以一

直拖动对多个页面进行标注。 选取标注后,如需编辑标注范围,请点击并按住标

注内容起止两端的手柄,然后拖动到理想位置。除个别语言外,仅当您选择两个或

以上字词时才会显示手柄。

亚马逊, Kindle Paperwhite 用户指南(第 2 版), loc. 575-584

Red Mars, Kim Stanley Robinson

In games there are rules, but in life the rules keep changing.

Kim Stanley Robinson, Red Mars, loc. 7001-7002

"Can you determine where?"

Kim Stanley Robinson, Red Mars, loc. 8548-8548

"No, there's too many unknowns.

Kim Stanley Robinson, Red Mars, loc. 8549-8549

Black ice would melt by day, then freeze at night. Sublimate and

precipitate.

Kim Stanley Robinson, Red Mars, loc. 8944-8944

it might have been anywhere anytime, and their tired faces bright with

some collective success, or merely with the pleasure of eating together—

while just outside their chamber the broken world roared, and rockfall

could annihilate them at any instant. And it came to her that the

pleasure and stability of dining rooms had always occurred against such

a backdrop, against the catastrophic background of universal chaos; such

moments of calm were things as fragile and transitory as soap bubbles,

destined to burst almost as soon as they blew into existence.

Kim Stanley Robinson, Red Mars, loc. 9061-9065

the+coquest+of+happiness, [email protected]

I have aimed only at putting together some remarks which are inspired by

what I hope is common sense.

[email protected], the+coquest+of+happiness, loc. 4-4

of the devotion of their mothers.

[email protected], the+coquest+of+happiness, loc. 16-17

Notes: 1) judged by other persons.

Gradually I learned to be indifferent to myself and my deficiencies; I

came to centre my attention increasingly upon external objects: the

state of the world, various branches of knowledge, individuals for whom

I felt affection.

[email protected], the+coquest+of+happiness, loc. 42-43

与鬼为邻, 萨苏

榻榻米的面是草编的席子,如果穿普通的鞋上去很容易磨坏。

萨苏, 与鬼为邻, pg. 24, loc. 367-367

您看,这就是日本人的性格,他有事儿从来不当面锣对面鼓,专在背后瞎嘀咕。

萨苏, 与鬼为邻, pg. 28, loc. 429-430

这是因为日本过去幼儿园和小学都有一个他们视为传统我们看作陋习的习惯,那就

是孩子中谁强大,谁就称王称霸,老 师不管。这种做法日本人认为是培养孩子竞

争力和具备等级观念的精神。

萨苏, 与鬼为邻, pg. 49, loc. 745-746

越经常锻炼身体好的,对氧气的消耗越多,所以在缺氧环境下剧烈运动,往往是还

没等出缺氧反应,就趴下了。

萨苏, 与鬼为邻, pg. 82, loc. 1256-1257

天下最喜欢穿制式服装的大概也就是日本人了。无论是铁路的乘务员还是指挥交通

的保安,日本人只要一穿上制服就会 两眼发亮,自信十足。仿佛制服代表着他们

属于一个高贵的阶层。也许,对日本人来说,面子和习惯的重要性,是远远胜过舒

适和自由的。

萨苏, 与鬼为邻, pg. 92, loc. 1407-1409

就是认为雇你干活你对我就有一定程度的人身依附关系,

萨苏, 与鬼为邻, pg. 117, loc. 1789-1789

比起欧美政坛的巨头们更多地在经济上寻求共同利益,从封建时代直接进入资本主

义社会的日本更加重视姻亲和裙带的 效力

萨苏, 与鬼为邻, pg. 137, loc. 2097-2098

因为随着国际交流的发展,大家都明白日本人说话就是习惯这样模模糊糊,藏头露

尾的,

萨苏, 与鬼为邻, pg. 157, loc. 2403-2404

大江大海1949(插图版), 龙应台

有一种人,愈是在风雨如晦的时候,心灵愈是宁静。他能穿透所有的混乱和颠倒,

找到最核心的价值,然后就笃定地坚 持。

龙应台, 大江大海1949(插图版), loc. 81

夹边沟记事, 杨显惠

夹边沟的右派到了明水以后,仅仅劳动了半个多月,垦荒工作就停止了。作为最下

层的一个劳教犯,我不知道停止垦荒 是否有着更为深层的原因:可能是整个国家

经济生活当时进入了困难时期,经济政策有所调整;也可能是因为仓促上马,条件

不成熟,上级撤销了这个 项目。

杨显惠, 夹边沟记事, pg. 407, loc. 5810-5813

每一次合并,我都发现,是那些总也躺着不动的人在搬家,还有些个别的能偷能抢

或者家庭支援颇丰的人,而那些成天 在田野上挖野菜捋草籽的人早早倒毙了,被

人用被褥或者毯子卷起来抬出去了。因为他的胃从野菜和草籽里摄取的营养补充不

了他劳作而失去的热量。

杨显惠, 夹边沟记事, pg. 455, loc. 6493-6495

我说,把裤子和衬衣都换了吧。你还想得远——明年夏天!你先想眼前怎么活过去吧。

杨显惠, 夹边沟记事, pg. 456, loc. 6514-6515

技术的本质:技术是什么,它是如何进化的, 布莱恩•阿瑟

然而,作为人类,我们实际上不应该和技术如此紧密地结合,而是应该和其他什么

东西融合得更为紧密,那就是自然。 在最深的层次上,人的存在应该和自然,和

我们最初的环境,以及最初使我们成为人的那些条件相融合。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 30, loc. 338-340

如今机器被用来生产机器了,同时它又变成了以后同类机器的父母。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 36, loc. 426-426

技术的建构不仅来自已有技术的组合,还来自于对自然现象的捕捉和征服。在

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 43, loc. 529-530

三个基本原理

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 44, loc. 544-544

技术(所有的技术)都是某种组合。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 44, loc. 544-545

其次,技术的每个组件自身也是缩微的技术。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 44, loc. 545-546

第三条基本原理是,所有的技术都会利用或开发某种(通常是几种)效应

(effect)或现象 (phenomenon)。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 44, loc. 547-548

技术组件的集成或组合是为了满足它们的目的。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 44, loc. 550-550

Notes: 1) motivation 2) motivation , difference between the evolution

of technology and biology.

技术组件的集成或组合是为了满足它们的目的。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 44, loc. 550-550

定义:技术是实现人的目的的一种手段。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 49, loc. 605-605

技术是实践和元器件(components)的集成(assemblage)。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 49, loc. 610-611

将技术作为在某种文化中得以运用的装置和工程实践的集合。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 50, loc. 613-614

装置和流程的确可以归于相同的范畴。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 53, loc. 663-663

技术总是围绕着一个中心概念或原理,如"事物的方法"或者一个可行的核心理念来组建

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 55, loc. 696-696

各个子程序就处于不断的相互联系之中,它们不停地"对话",就如同喷气发动机那样。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 57, loc. 724-725

技术的分解随着市场的细分而加剧。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 60, loc. 767-768

一开始的一系列松散地串在一起的零件如果被用得足够多,就会"凝固"成独立的单

元。技术模块随着时间的推移会变 成标准组件。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 61, loc. 772-773

一个技术绝少是固定不变的。它会不断地变换结构,当目的改变时,它会去适应并

进行重新的配置,

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 66, loc. 851-852

在真实世界中,技术是高度可重构的,它们是流动的东西,永远不会静止,永远不

会完结,永远不会完美。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 66, loc. 854-855

现象是技术赖以产生的必不可少的源泉。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 73, loc. 929-930

Notes: 1) theory , principle .

这个例子阐明了如何应用现象的组合去达到目的。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 75, loc. 960-961

在实践中,现象在能够被应用于技术之前,一定要被"驯服",并且作好恰当的准

备。天然形式的现象很难被利用,需 要巧妙的诱导,它们才能令人满意地运作起

来。它们可能只在很有限的条件下起作用,所以一定要建立正确的支持方式才能使

它们为预设的目的服务。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 75, loc. 972-974

货币系统利用了这样一种现象:只要我们相信其他人会相信一种交换媒介是有价值

的,而且这种信任会在未来持续下 去,我们就会相信这个系统。需要注意的是,

这里的现象不是物理性的,而是行为性的,

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 83, loc. 1076-1078

物理现象。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 83, loc. 1079-1079

目的性系统(purposed systems)。

布莱恩•阿瑟, 技术的本质:技术是什么,它是如何进化的, pg. 84, loc. 1090-1090

李银河说性, 李银河

弗罗姆在讲到欧洲中世纪时说:那时,"个人"尚未形成。

李银河, 李银河说性, pg. 14, loc. 212-213

道德保守派一直没有放弃纯净社会道德使之尽量趋向于禁欲主义的目标。他们顺应

(或者说利用)社会中一部分人的保 守道德观念,压制另一部分人的权利一殊不

知按照《宪法》中关于言论自由和出版自由的规定,后者的道德观念也有加以表达的

合法权利。用行政处罚 的办法钳制后者的言论自由和出版自由,用社会中一部分

人的道德标准来压制另一部分人的言论自由权利,严格地说属于违宪的行为,是应

当认真加以 检讨的。 在中国一部分人群进人现代化的都市生活之后,个人主义渐

渐得到应有的地位,也渐渐在人们的观念中与自私自利的利己主义区分开来。人们

越来越多地意识到自己 的权利,一些"准群体"也渐渐形成为"利益群体"(达伦多

夫语),他们希望运用自己的权利,实现自己的利益,争取和保护自己作为一个人

的一般 权利和作为某个利益群体的成员的特殊权利。

李银河, 李银河说性, pg. 15, loc. 218-225

福柯说过:性是没有任何一个权力能够忽视的资源。

李银河, 李银河说性, pg. 18, loc. 268-268

权力能够通过对性的控制来控制人,

李银河, 李银河说性, pg. 18, loc. 269-269

在制定与法律不一致的团体规定时,必须有绝对必要的理由。换言之,在剥夺团体

成员的某项法定权利时,必须有充分 的理由。

李银河, 李银河说性, pg. 25, loc. 380-381

如果有一个社会或时期,人们会以某种知识为耻(无论是关于什么事物的知识),

那么对这个社会或时期人们的理性就 不能抱有太大的希望。对这样一个社会最精

辟的概括只能是乔治奥威尔在他那本闻名遐迩的预言体小说《1984》中所说的:"战

争即和平;自由即 奴役;无知即力量。"

李银河, 李银河说性, pg. 35, loc. 526-528

中国的禁欲主义并无任何宗教色彩,而是一种世俗的出于意识形态纯洁化意图的禁

欲主义。

李银河, 李银河说性, pg. 38, loc. 579-580

现代技术结束了对大批人工劳力的需求,原子能和技术的进步结束了对以数量取胜

的军队的需求,人口除了消费之外不 再有任何积极意义。

李银河, 李银河说性, pg. 42, loc. 638-639

新右派的口号是"保卫家庭"。在美国,它与宗教结盟,将不同的利益群体联合到了

同一个易于理解的政治目标下。这 是一个与"放纵"同样有力却全然对立的政治符

号,它在政治党派动员力量逐渐减弱的西方政治中提供了一个有力的图腾。

李银河, 李银河说性, pg. 43, loc. 650-652

以及一种更普遍的恐惧:破坏了维系男性和女性关系的传统纽带。

李银河, 李银河说性, pg. 43, loc. 660-660

罗素提出:性应当被视同为食,是人的自然需求,对它的约束应当只因为保护健康

的原因,其他不必。

李银河, 李银河说性, pg. 45, loc. 680-681

正是因为我们一向按照传统的规范来看问题,想不到越过这些规范,原来对事情还

町以有另一种看法。

李银河, 李银河说性, pg. 48, loc. 729-730

我们甚至都不会觉得在这个问题上是权力让我们这样想的,而误以为这完全是自己

经过独立思考得出的看法。

李银河, 李银河说性, pg. 48, loc. 736-737

我们甚至都不会觉得在这个问题上是权力让我们这样想的,而误以为这完全是自己

经过独立思考得出的看法。福柯的深 刻之处就在于此,是他告诉我们:不是别人

剥夺了我们的自由,是我们自愿被剥夺了自由思想的权利,权力就是这样来建构我

们的主体的。如果我们要 想证明自己还是有独立思考能力的,就让我们在习俗的

思路之外自由地思考一下:

李银河, 李银河说性, pg. 48, loc. 736-739

一位公民有权选择自己的道德标准。如果他选择了一种不道德的生活方式,社会道

德可以批评他,教育他,却没有权利 用《刑法》去处罚他。

李银河, 李银河说性, pg. 56, loc. 856-857

一位公民有权选择自己的道德标准。如果他选择了一种不道德的生活方式,社会道

德可以批评他,教育他,却没有权利 用《刑法》去处罚他。用法律的形式来处罚公

民的不道德行为,这是一种立法上的道德清高主义。

李银河, 李银河说性, pg. 56, loc. 856-857

Notes: 1) ?

不应当逮捕性工作者,把她们关进监狱,因为她们是性工作者,她们的行为方式没

有侵犯任何人,她们的行为没有受害 者;

李银河, 李银河说性, pg. 60, loc. 915-917

仅仅因为爱情而締结的婚姻才是道德的婚姻,只有继续保持爱情的婚姻才是道德的

婚姻。

李银河, 李银河说性, pg. 63, loc. 964-964

当儿童说他是或不是遭到暴力侵害时,

李银河, 李银河说性, pg. 67, loc. 1023-1023

Notes: 1) what about being cheated?

压制并不仅仅来自国家,而且来自我们自己。

李银河, 李银河说性, pg. 80, loc. 1218-1219

福柯之所以如此,有他的理由,其中最主要的在我看来是他对身份政治所持的否定

态度。他从没有隐瞒过自己的性倾 向,但是对于身份政治却存有极大的疑虑。

李银河, 李银河说性, pg. 91, loc. 1390-1392

福柯顺理成章地反对同性恋身份政治中所倡导的"现身"(被形象地称做"走出壁

橱")的行动,因为这个行动的前提 恰恰是:每个人都有一个固定的性身份,而且

这种身份是应当公开的。他在1982年一次与同性恋行动主义分子的会谈中指出:我

们和我们自己的关 系,不是认同的关系,而应该是变异的关系、创造的关系、革

新的关系。保持同一,实在令人腻烦。"

李银河, 李银河说性, pg. 93, loc. 1411-1414

Notes: 1) processing & private

这是一种忽视占有和忠诚观念的关系。

李银河, 李银河说性, pg. 94, loc. 1440-1441

萨德的哲学就是沿着这一思路发展的。他的创新之处在于将上述唯物主义原则的伦

理含义推向其逻辑结论。

李银河, 李银河说性, pg. 106, loc. 1619-1620

权力将受害者变为非人,

李银河, 李银河说性, pg. 107, loc. 1629-1629

例如萨特的存在主义是用政治的形式取代上帝,以便使人类能够有秩序地生活在一起。

李银河, 李银河说性, pg. 107, loc. 1639-1640

科学真理被当时的人们视为一种潜伏在事物内部的本质,只等聪明的人们把它发现

出来,公之于众。这种对自然科学的 看法也浸染着社会科学的研究,

李银河, 李银河说性, pg. 117, loc. 1783-1785

性学的抱负不仅是要发现、描述和分析性现象背后所隐藏的自然规律,而且由于人

类的性行为是一种社会行为,性学还 想发现性现象背后的社会规律。

李银河, 李银河说性, pg. 117, loc. 1785-1786

每一个人和所有的人的生活方式都可以是好的。

李银河, 李银河说性, pg. 120, loc. 1832-1833

他们认为,就连生理性别也是社会建构的。

李银河, 李银河说性, pg. 127, loc. 1943-1943

在同与异的问题上,强调差异曾是法西斯主义把人分为等级的基础,差异实际上就

是"不如"。

李银河, 李银河说性, pg. 127, loc. 1943-1944

第三,将女性客体化。在男性事务和交易中将女性用做客体。限制和阻碍女性的创

造力;不让女性接触社会知识和文化 成就的很多领域;否定女性的性;将男性的

性强加于女性;命令和剥削女性的劳动力,控制其产品;肉体上限制女性,阻止女

性的活动;文化意识形态 和信息贬低女性,贬低女性的角色、工作、产品和社会

环境;符号设计暗含对女性的贬低;社会结构安排从社会最高权力机制排斥女性。

李银河, 李银河说性, pg. 129, loc. 1965-1968

当他们想促使女性屈从于男性时,却是用"保护家庭"的口号出现。

李银河, 李银河说性, pg. 129, loc. 1974-1975

中国自1978年以来,把家庭重新变成经济、社会和道德的重心,重新强调一夫一妻

制关系,为女性的家内角色增加 荣誉感。

李银河, 李银河说性, pg. 130, loc. 1988-1990

她们被告知:家庭才是她们基本的社会责任所在。

李银河, 李银河说性, pg. 130, loc. 1990-1991

在整饬自己的身体时,女性的地位变得低下、客体化。在许多男权制文化中,女性

只有在外貌、姿态、动作、声音、身 材、精神和价值方面达到所谓女性标准,才

能受到喜爱、雇佣、提拔,才能被选中,任何拒绝和反抗就都要付出昂贵的代价。

在这里,女性受到男性统 治的惩罚和规训,这惩罚就包括:失去建立异性亲密关

系的机会,不能过上体面的生活。

李银河, 李银河说性, pg. 137, loc. 2094-2098

对于从弱势群体如女性的角度对影视作品提出批评,人们还不大习惯。这就是左芳

的文章引起较大反响的原因之一。在 我看来,这样的批评太少了,应当再多一些

才好。

李银河, 李银河说性, pg. 145, loc. 2211-2212

也许有人会说:对于真实的描述一定要有个正确的态度,对于男人压迫女人的关

系,如果你是反对的就可以写;如果你 是赞成的就不可以写。

李银河, 李银河说性, pg. 146, loc. 2228-2229

这种要求的荒谬是显而易见的一一它将取消所有的文艺创作。

李银河, 李银河说性, pg. 146, loc. 2232-2232

综上所述,我认为,左芳的批评在文学批评上毫无意义(它不属于文学批评的范

畴),它是一个女性主义的政治批标。

李银河, 李银河说性, pg. 146, loc. 2236-2237

这一选择之所以具有政治性,是因为她们认为,男女两性之间的关系在本质上具有

政治性,含有权力和统治的成分。由 于女同性恋拒绝了两性关系而选择了女性,

她就蔑视了现存的政治体制。在当时的政治潮流中,许多政治性的女同性恋并不一

定是性倾向上的女同性 恋。

李银河, 李银河说性, pg. 153, loc. 2339-2341

Notes: 1) smoke in poland.

对于进步男性运动的支持程度有阶层的差异,越是处于社会上层的人越倾向于接受

进步男性运动,而越是处于社会底层 的人观念越传统。

李银河, 李银河说性, pg. 158, loc. 2415-2416

一个有趣的例证就是:我国的离婚法曾以感情破裂为离婚的充分理由,它因此被世

界其他文化中的人视为最前卫的标 准。

李银河, 李银河说性, pg. 161, loc. 2463-2464

爱情是人心的一种感觉,如果它到了需要道德来约束的程度,它还存在吗?

李银河, 李银河说性, pg. 162, loc. 2467-2468

其实,在我看来,在情与性的关系上,男女两性在行为和观念上的差异,根本不可

以用生理的原因来解释,而只能用社 会对男女两性的塑造和建构来解释。说得更

明白些,男女两性的这种差异,是丁百年来男权文化的产物,是男女两性双重道德

标准的产物。

李银河, 李银河说性, pg. 164, loc. 2499-2501

据社会史家研究,在前现代的欧洲,大部分婚姻都是契约式的,是以经济条件而不

是以彼此间的性魅力为基础的。

李银河, 李银河说性, pg. 168, loc. 2558-2559

但是实际上,在婚姻中,激情最终变成柔情、亲情。

李银河, 李银河说性, pg. 169, loc. 2573-2574

罗辑思维, 罗振宇

美国为了扶植日本,给了日本大量的军工订单。扶植日本难道是为了让日本再崛起

吗?不是的,而是要把日本纳入由美 国主导的国际经济体系当中,要让日本人围

着美国的贸易指挥棒打转转,这就是政治影响力。

罗振宇, 罗辑思维, pg. 40, loc. 613-615

而且他的生活技能在这个城市能销售掉,他被嵌入到这个城市的大系统当中,他已

经无法抽离等等

罗振宇, 罗辑思维, pg. 43, loc. 653-653

很多媒体人之间的交流,不是开个专业会议就算成功交流。有时候只是打个招呼、

发个短信,或者闲聊几句,这些非正 式交流都意味着个人是否嵌入到中国的传媒

系统当中,能否感受到大家的气味,并跟上大家共同成长的步伐。从北京回到保

定,可能生活质量一下提升 好几档

罗振宇, 罗辑思维, pg. 44, loc. 667-670

回到著名哲学家维特根斯坦[2]的一句名言,他说:"凡是能够言说的世界,就是我

们能够掌握的世界。如果不能言 说出来,也就是不能把它符号化、简化的世界,

我们只好保持沉默。"

罗振宇, 罗辑思维, pg. 64, loc. 981-983

我们的成长过程就是不断构建自我和外界,也就是"我们"和"他们"之间边界的过程。

罗振宇, 罗辑思维, pg. 66, loc. 1002-1003

所以历史上真正想明白的人,不会把组织内的身份看得那么重。

罗振宇, 罗辑思维, pg. 81, loc. 1242-1242

税收制度成本也是全社会每一个公民非常沉重的负担。李稻葵先生讲:"不要说什

么所得税制就一定是大势所趋,时代 不同了。其实美国人也在酝酿改革这种税

制,而我们中国人为什么非要去学习这种税制呢?"

罗振宇, 罗辑思维, pg. 95, loc. 1452-1453

流民图

罗振宇, 罗辑思维, pg. 134, loc. 2048-2048

到最后,获取权力中心者的意见偏向只有靠这种纯文艺的方法,而不是诉诸于真相

的方法,

罗振宇, 罗辑思维, pg. 134, loc. 2049-2050

但是后来的历史学家分析说,正是因为德国人觉得必有一战,那么就按照必有一战

的方式去做这样的战争准备,而你的 所有准备让对手看到又害怕,然后对手也做

相应的战争准备,那么就真的必有一战。这有一个名词,叫"自我实现的预言"。

罗振宇, 罗辑思维, pg. 183, loc. 2805-2807

所以,达尔文真正赶下神坛的压根儿不是什么上帝,他其实是把人类生存的一切信

心和信念都全部毁掉了,我们以为我 们这一代人都在奔向美好,我们不断地改善

自己的命运,试图掌控自己的命运,而达尔文就在旁边冷笑,用他那英国式散文优

雅的笔调冷笑说道:"你 们什么都不懂,大自然的剪刀在决定你们,你们自己什么

都决定不了。"这是达尔文进化论真正的精髓。

罗振宇, 罗辑思维, pg. 196, loc. 3000-3003

"我非常爱你,但是你这套理论把上帝算是彻底给得罪了,我嫁给你之后,我们相

爱一生之后在天堂还能重逢吗?"

罗振宇, 罗辑思维, pg. 197, loc. 3017-3018

举个简单的例子,如果你们家小区门口只有一个摄像头,那它只能够扫描到你进去

的那一刹那。可是如果这个摄像头一 直在,覆盖掉所有的时间节点之后,那产生

的是什么效应呢?就是你的轨迹就被监控了。

罗振宇, 罗辑思维, pg. 218, loc. 3339-3340

举个简单的例子,如果你们家小区门口只有一个摄像头,那它只能够扫描到你进去

的那一刹那。可是如果这个摄像头一 直在,覆盖掉所有的时间节点之后,那产生

的是什么效应呢?

罗振宇, 罗辑思维, pg. 218, loc. 3339-3340

Notes: 1) 1+1>2

new math mode.

其实我就抓住两点:第一点,只要你对这个女孩好,它就会像一颗种子一样,一定

会在她心里种下点儿什么,虽然她此 时可能是拒绝,可能是给你冷脸看,但不要

紧,只要种子种下了,将来就有发芽的机会。

罗振宇, 罗辑思维, pg. 236, loc. 3618-3620

只要种子种下了,将来就有发芽的机会。

罗振宇, 罗辑思维, pg. 237, loc. 3619-3620

Notes: 1) responsibility of education.

群星,我的归宿 (阿尔弗雷德·贝斯特, Alfred Bester)

柯达——未来柯达家族的首领。

Alfred Bester), 群星,我的归宿 (阿尔弗雷德·贝斯特, pg. 42, loc. 631-631

"通过意志和想法。"普瑞斯特恩重复,"派尔只能依靠精神致动学引爆。它的能量

只能依靠思想来解放。它必须被想 着要爆炸,而且这思想直接作用于它。那是惟

一的方法。"

Alfred Bester), 群星,我的归宿 (阿尔弗雷德·贝斯特, pg. 227, loc. 3474-3475

Notes: 1) the same to stone effect.

西方哲学史[英文版]罗素.文字版, gift.young@gmail

"modern"

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7931-7931

diminishing authority of the Church, and the increasing authority of

science.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7932-7932

State has less influence on the opinions of philosophers than the Church

had in the Middle Ages.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7936-7936

the Copernican theory in 1543; but this theory did not become

influential until it was taken up and improved by Kepler and Galileo in

the seventeenth century.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7947-7949

intellectual, not governmental.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7950-7951

as liable to modification.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7956-7956

The triumph of science has been mainly due to its practical utility, and

there has been an attempt to divorce this aspect from that of theory,

thus making science more and more a technique, and less and less a

doctrine as to the nature of the world.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7962-7964

it had not the same anarchic character.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7972-7972

Notes: 1) political makes philosophy

Modern philosophy, however, has retained, for the most part, an

individualistic and subjective character.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7972-7973

individualistic and subjective character.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7973-7973

Scientific technique requires the co-operation of a large number of

individuals organized under a single direction. Its tendency, therefore,

is against anarchism and even individualism, since it demands a

well-knit social structure.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7983-7985

The modern world, at present, seems to be moving towards a solution like

that of antiquity: a social order imposed by force, representing the

will of the powerful rather than the hopes of common men.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 7993-7995

To understand the Renaissance, it is necessary first to review briefly

the political condition of Italy.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8004-8005

Notes: 1) social outter environment .

The game of power politics

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8073-8073

It must be said that Italy would inevitably have lost its importance,

owing to the discovery of America and the Cape route to the East; but

the collapse could have been less catastrophic, and less destructive of

the quality of Italian civilization.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8080-8082

The Renaissance

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8082-8082

essential preliminaries

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8082-8082

it encouraged the habit of regarding intellectual activity as a

delightful social adventure, not a cloistered meditation aiming at the

preservation of a predetermined orthodoxy.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8086-8087

were too busy acquiring knowledge of antiquity to be able to produce

anything original in philosophy.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8092-8092

Consequently Italian unorthodoxy, in the Renaissance, was purely

intellectual, and did not lead to schism, or to any attempt to create a

popular movement away from the Church.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8112-8113

The first effect of emancipation from the Church was not to make men

think rationally, but to open their minds to every sort of antique nonsense.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8116-8117

Notes: 1) variety of Russel .

A stable social system is necessary, but every stable system hitherto

devised has hampered the development of exceptional artistic or

intellectual merit.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8131-8132

How much murder and anarchy are we prepared to endure for the sake of

great achievements such as those of the Renaissance?

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8132-8132

Notes: 1) individual vs. colectivity

Savonarola dominated Florence; his miserable end evidently made a great

impression on Machiavelli, for he remarks that "all armed prophets have

conquered and unarmed ones failed,"

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8144-8145

Notes: 1) personal experience . the importance of individual .

which was that of the sack of Rome by the troops of Charles V. This year

may be reckoned also that in which the Italian Renaissance died.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8154-8155

Admiration of skill, and of the actions that lead to fame, was very

great at the time of the Renaissance.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8188-8189

The Neoplatonists, the Arabs, and the Schoolmen took a passionate

interest in the metaphysics of Plato and Aristotle, but none at all in

their political writings, because the political systems of the age of

City States had completely disappeared.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8217-8219

In what follows, I am expressing not my own opinions, but opinions which

are explicitly or implicitly his.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8228-8229

Notes: 1) haha . he never emphasized this.

stability,

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8231-8231

We must concede to Machiavelli that this was an important element in the

growing power of the Church during the eleventh, twelfth, and thirteenth

centuries, as well as in the success of the Reformation in the sixteenth

century.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8242-8244

This northern Renaissance was in many ways very different from that of

Italy. It was not anarchic or amoral; on the contrary, it was associated

with piety and public virtue.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8268-8270

Notes: 1) why

according to which true religion comes from the heart, not the head, and

all elaborate theology is superfluous. This point of view has become

increasingly common, and is now pretty generally accepted among Protestants.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8330-8331

exaggerating Augustine, rejected. Luther replied savagely,

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8357-8357

In 1534, the king got Parliament to pass the Act of Supremacy, declaring

him, not the Pope, the head of the Church of England.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8375-8375

In 1534, the king got Parliament to pass the Act of Supremacy, declaring

him, not the Pope, the head of the Church of England. Under this act an

Oath of Supremacy was exacted, which More refused to take; this was only

misprision of treason, which did not involve the death penalty. It was

proved, however, by very dubious testimony, that he had said Parliament

could not make Henry head of the Church; on this evidence he was

convicted of high treason, and beheaded. His property was given to

Princess Elizabeth, who kept it to the day of her death. More is

remembered almost solely on account of his Utopia ( 1518). Utopia is an

island in the southern hemisphere, where everything is done in the best

possible way. It has been visited accidentally by a sailor named Raphael

Hythloday, who spent five years there, and only returned to Europe to

make its wise institutions known. In

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8375-8381

More is remembered almost solely on account of his Utopia ( 1518).

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8378-8379

More is remembered almost solely on account of his Utopia ( 1518).

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8378-8379

Diversity is essential to happiness, and in Utopia there is hardly any.

This is a defect of all planned social systems, actual as well as imaginary.

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8433-8434

Notes: 1) diversity or passion or emotion?

Roughly speaking, the Reformation was German, the Counter-Reformation

Spanish; the wars of religion were at the same time wars between Spain

and its enemies,

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8439-8440

Luther, Calvin, and Loyola. All three, intellectually, are medieval in

philosophy,

gift.young@gmail, 西方哲学史[英文版]罗素.文字版, loc. 8446-8447

随便画一张,奥古斯丁的世界观 及 lambda

他说:我依靠上帝,得见此眼前的世界,因上帝的光芒照耀它们;而正因为我身在上帝的光辉之中,我甚至不知道祂的存在。

他是早期基督教哲学家圣奥古斯丁,他著有《上帝之城》和《忏悔录》。

上周,长春-武汉-宜昌,没有取得预想的结果。这算是武汉-宜昌之行的一个收获。飞机上升下降抖啊抖的,我正看到这一章,脑海里出现的就是下面这幅画的场景。

上上周,上海,完成了求音频的音高算法,也算一个收获。

回到长春,开始发烧。

我的显示器闪啊闪的

说来话长,故事得从2011年1月讲起,三年半以前。

X200笔记本到手没有多久,有一阵我成天拿它打文明。某天半夜,没打完困得不

行,扣上盖让它休眠,我也倒头就睡。第二天开盖,操作系统不启 动了。

X200没带光驱,我花了三天时间试了一堆方法,试图恢复win7,把文明和进度整回

来。后来似乎还试图安装来着,未果。三天没装上操作系 统,这对于一个学计算

机的实在是重大刺激,我断然决定舍弃win7,奔向Linux的怀抱。Ubuntu的安装简

单又快捷,记得不到1个小 时,全完事了。

背景交待:我外接了一个显示器,和笔记本间用VGA线联接。显示器支持数字口,

但是笔记本不支持。

过了又一段时间,某天,我在emacs黑背景下,发现显示器闪啊闪的。上面有斜

纹,就像电视信号不好,刷一下来了,刷一下又没了。为此,我把 emacs背景调成

不那么黑,不好使。

又试了各种招,也都无效。我怀疑VGA线有问题,但是同一根线插在另一台笔记本

上,没有问题。

请教包师弟,他说VGA的上限就是1920*1024,应该是到达极限了,容易受到噪音的

干扰。

我俩讨论了一堆方案:在VGA外面接个模拟转数字的口,然后用数字线接外接显示

器;再买个VGA卡,PCMCIA的那种插笔记本里...想想 VGA的上限带来的问题,真是

令人绝望。

网上一堆贴子,也没啥好招。

有一天,我甚至发现了个神奇的现象:把VGA线接在没问题的笔记本上,然后拔下

来接在X200上,闪烁会消失一会儿。我讲给包师弟,他说:神 啦啊。

就这样,三年左右过去了。我天天就被闪着,有时感到要晕车,有时觉得可能会诱

发癫痫,有时啪地把笔记本扣上,连活也不想干了。

有一天 (2014年4月22日) 在办公室准备讨论的环境。我有个比较强迫症的习惯,

乐意在大家都没来的时候先把现场布置好,分频器接上,多个显示器连接好,大家

来了就开始讨论。正接着 线,突然一闪念,我居然从来没有试过换一根VGA线。

带了一根线回家,换上。电闪雷鸣的刺激啊--一、点、也、不、闪、烁。换成原来

的线,闪。把原来的线换在办公室上,不闪。

这根线,就只有接在我的X200和DELL显示器上,才闪。估计是奇葩成对出现,才能

把二者的弱点表现出来吧。这条线与别的显示器、别的显卡 配合,不闪烁;这个

笔记本与别的线配合,也不闪烁。

这是我在整机器的时候,持续时间最长的一次故障处理。中间经历了多次尝试,就

只是为了不让它闪。我升级过ubuntu操作系统,试图更换和升 级显卡驱动,整得

我原来的个人设置大半不好使了。花了不少时间,还得忍受升级后的糟糕体验。说

起来,我见过的几乎所有软件,升级后的体验都远 不如原版的,只有帝国时代除外。

而真正的解决,是三年多以后,换了那根在别的笔记本上测试没问题的VGA线。所

以,对比法不总是有效。只有当对比得到负面结论的时候,才是正 确的,而对比

得到的正面结论,只能增加我们的信心,却不能作为定论。

为了解决闪烁,我升级了操作系统,升级了emacs,不得不变更个人设置。虽然换

了VGA线以后,闪烁现象消失了,但是想回到未升级前的 Ubuntu,那个版本却已经

不再被支持了。伴随着成长而刻在我们身上的印迹,早就失去了当初的意义,甚至

它们在最初就是没有意义的,却万难 去除,成为我们的一部分。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift] =======================

如果遇到实验室事故

如果遇到实验室事故

作为一个原来学计算机和电子的学生,我跟化学有千丝万缕的联系,所以亲眼和耳

闻了一些事故。

我亲眼见过的事故一共也就只有一次,影响范围不过几米。中午跟导师正谈着,传

来崩地一声。我们俩人同时冲到门口,我离门还近一些。犹豫了一 下,我说:你先。

这是个经典的笑话,一般讲到这里大家就哈哈大笑了。不过,故事的真正寓意并不

是我这个学生在危险当前的时候把导师推前面去了。在事故和危险面 前,应该服

从专家,并且现场只应产生一个专家。导师是专家,因此他应该走在前面。

那次是有人糊涂,倒残液的时候把酸液倒到碱液的瓶子里了。反应生成热和气体,

积累到中午没人的时候终于炸开瓶子。瓶子稀碎,门上玻璃裂了一 块。旁边一个

人也没有,这是万幸。

有的事故中,不服从专家后果就严重多了。在网上看来的一个事故。似乎是浓硫酸

喷了,在车间里。负责的小伙喊大家把衣服全脱了,马上淋水。被喷 的人里有女

同志害羞,跑到卫生间去了。这点路程导致的结果很严重,我忘记了是深度烧伤还

是把命搭进去了。

学生在"下实验室"以前,有的会问"要注意些啥啊",有的胆大就啥也不问。照例,

我要重复一遍我导师当初对我说的:什么也不要碰。

"什么也不要碰",有个反面例子。关同学曾经编程的时候,没事就摆弄一个玻璃

管。包师弟有一次语气淡然,"小关,你知道那玻璃管里装过什么 吗?"十有八九

是氰化物。学计算机的思维是,他们怎么能这么干呢,这玩意怎么能到处乱扔呢?

问题是,世界就是这个样的,他们乱扔以后还能为后 果负责呢,就像闯红灯的司

机,但是痛苦还是你来承担。

"什么也不要碰",遵循这一原则,我在用氮气吹灰的时候都是请别的同学帮我开气

阀。有不止一个同学跟我说过,这个玩意用起来特别简单,这么一 拧,再那么一

拧,你自己也能整。我每次都老老实实地请求,你替我整吧,而且别走,一会再替

我关上。有同学问过,这有什么难的。我的回答是,最 可怕的是,万一有一天我

觉得自己学会了,把纯氧的气阀当氮气拧开了可咋整。纯氧气体喷在柴火上,能直

接起火,还可能导致爆炸。而我,没有判别 氧气和氮气的能力。有同学可能说

了,那有什么难的,根据气瓶的颜色不就行吗?说起来简单,我见过绿瓶子,按说

应该装氯气的,有的组在里面装了 氮气--这也许没啥,不过既然有这种糊涂的

人,天知道他们不会把氯气装氮气瓶子里。

气体装反这种低级错误可能让人认为根本不会发生吧。不过我导师就是活生生的受

害者。他每到冬天的时候就卡卡咳,跟个小老头似的。那是因为他年 轻的时候做

实验,正做着,有人顺手把通风厨关了,然后导师的呼吸道就被酸性气体腐蚀了。

医生说,永久不能治愈,只能缓解。所以说,猪一样的队 友总是存在的,小心在

意这种事,要由自己负责。不懂的东西,或者不确定懂的东西,啥也别碰是第一原则。

不仅别碰任何东西,如果旁边人做实验,最好也离远点。某组有个师姐,被旁边师

弟的氨水溅在脸上一滴。大多数同学学过初高中化学,对氨水就只知 道气味难

闻,就是夏天厕所那味,可能并不了解它具有腐蚀性。幸亏溅到的氨水不多,而且

在下巴上。其实,下巴离眼睛又能有多远呢。

这是看得见的危险,真正的危险是你看不到的,特别是你以为你能看到。福尔摩斯

说,人只能看到自己想看到的东西。当年想在棱镜上刻标记,想到了 氢氟酸。高

中化学学的,氢氟酸能腐蚀玻璃。我跟导师说,怎么在玻璃上整上蜡,然后怎么拿

小刀划个印,怎么把氢氟酸滴在印上,或者把玻璃泡在氢 氟酸里。导师听完想了

一会儿,说,那个谁某某某,你去整吧,小杨不行。我还不服呐,心想,氢氟酸不

是弱酸吗,这有啥?多年以后,读到网上那个 著名的化学事故大集锦的贴子,上

面说,氢氟酸会透过皮肤进入人体,取代骨中的钙,而且到处游走,因为化学性质

如此活泼,因此无法清除。那块皮 肤永远都是烂了的样子,永远也治不好。医学

之发达,令很多人错觉这种小病不算啥,这个错觉忽视了两个事实,一是这种病医

学也很少见到,二是浓 度不同,化学性质差别可能极大。而咱们平时的生活中,

根本见不到高浓度的危险品,因此可能觉得实验和生产上也是这样。

实验和生产上完全不一样,因此遵循指令和原则非常重要,可能性命相关。一次去

钢厂,被要求戴安全帽,穿长袖工作服。钢厂里那个热啊,烤得慌。 同行有个小

伙汗流浃背的,就把安全帽摘了,马上遭到同行大哥的呵斥。该小伙后来把长袖衣

服脱了,从车间出来以后,露出来的胳膊像在海边晒过半 个月,感觉毛都掉光

了。我这才明白为什么非得要求穿长袖。鉴于学计算机的同学没有遇到过啥危险,

胆子大,我后来强烈建议上级,这个项目咱们还 是别做吧。

刚刚听到某师弟说,他的一个同学的典故。500L什么釜蒸馏减压爆了,把这同学伤

了。那天,他破天荒穿了防爆服和面具,防爆服被炸得一条条 的,胸口和胳膊也

被玻璃划了。如果没有防护,后果可想而知。

成天做实验,难保没有某天头脑发昏的时候,所以总是按原则、规章来做就安全多

了。导师还讲过吉大当年有个哥们就有头脑不清的时候,高压瓶上的 气阀滞住

了,把气瓶放倒了蹲前面拿扳子砸。怎么砸也觉得不对劲,后来就骑气瓶上砸。砸

着砸着气阀飞出去,嵌对面墙里了。如果当时他还蹲前面, 估计就被气阀打穿了。

就是万分小心,自己也有发昏到连规章都忘了的时候,就是万分小心,也有队友变

成猪连累自己的时候。如果一旦遇到实验室事故,导师对此也有指导 原则。导师

说,如果看到着火了,你什么也不要管,不要想着救同学救设备救资料的,什么也

没有人值钱;如果着了,一看灭不掉,跑。

所以,我记住了实验室安全两条原则:啥也别碰;遇到着火,跑。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift] =======================

geek青年的状态机,查表,纯C语言实现

geek青年的状态机,查表,纯C语言实现

1. 问题的提出,抽象

建一,不止是他,不少人跟我讨论过这样的问题:如何才能保证在需求变更、扩充

的情况下,程序的主体部分不动呢?

这是一个非常深刻和艰难的问题。在进入实质讨论之前,我们还得先明确什么是"

主体",就是我们不希望动的那一部分是什么。事实上,没有什么" 主体",这是被

我们主观划分的,代码中有一部分是不动的,另一部分是动的。而追求永恒(一劳

永逸?) ,是我们的天性吧。

我们希望实现一段程序,换一些东西,游戏就由 双截龙 变成了 超级玛丽,再换

一点东西,就变成了 魂斗罗。只要招些美工,再招些脚本作者,所有的程序员就

可以--解雇了。

这看起来不太现实,那么我们来看一段类似的,但是更现实一点的。我们希望实现

一段程序,在每轮迭代/循环中,这段代码都能完成我们需要做的任 务,虽然这些

任务可能在每轮迭代中有所不同。在数学归纳法,在 sigma 符号的的周围,甚至

在积分符号的周围,都在发生这样的事情。

这些梦想或者已经实现的技术,都基于"抽象"。我们试图找到在不同的情境 (动

作、需求) 下那些相同的部分。我们对具体事件做抽象,并且期待抽象的结果适用

于所有的具体的事例。这样,原来的很多工作就成为 应用抽象的理论 的过程,不

再需要创造力,因此也不再能吸引我们。那么,我们再对抽象的结果继续抽象,直

到形而上。

2. 状态机的引擎

引擎,就是上文中提到的开发出一个游戏,然后能衍生出很多游戏的技术。代码的

核心部分、流程部分不会改变,只有数据 (甚至可以在外部文件中) 才随需求的变

化而变化。

状态机,也可以用引擎实现。实现这一目标的技术也存在已久,就是查表。查表的

经典案例是 求三角函数 (在一定精度下),常量时间复杂度的解决方案 就是查

表。事先把三角函数在不同度数下的值都求出来,放在hash表 (?) 里。你要查哪

个度数,我就去查哪个度数对应的函数值。

在这个案例里,查表的那段代码,不随三角函数由sin变成cos或tan而发生任何变

化。这就是引擎,被查的表就是数据。

3. 接口

我们期待的接口跟前一篇普通青年中的完全一样。在主函数中调用 void

state_change(enum message m) 向状态机传递消息,用 test.in 作为测试用例。

主函数还知道,一共就这样几种消息:

enum message { play, stop, forward, backward, record, pause };

4. 状态迁移表

在讲如何查表前,我们先设计 表 本身。我们期待表格能够描述 状态迁移 中的要

素。记得么,一共4个。 (1) 当前状态, (2)当前消息, (3)将迁移到的状态,

(4)在状态迁移中的动作。我们期待能用表格,而不是如普通青年一文中用代码

(switch-case)的方式描述。因为我们相 信,改表格比改代码容易。

状态迁移表与状态迁移图完全等价。

表格看起来像下面这样,如果想像划上竖线效果更佳。。

1 struct transition fsm[transition_num] = {

2 /* current_state, message/event, next_state*/

3 {s_play, stop, s_stop},

4 {s_play, pause, s_pause},

5 {s_pause, pause, s_play},

6 {s_pause, stop, s_stop},

7 {s_stop, forward, s_forward},

8 {s_stop, play, s_play},

9 {s_stop, backward, s_backward},

10 {s_stop, record, s_record},

11 {s_forward, stop, s_stop},

12 {s_backward, stop, s_stop},

13 {s_record, stop, s_stop} };

每一行,都是一组状态迁移的匹配。第一列是当前状态,第二列是接收到的消息,

第三列是在此种情况下将迁移到的状态。每增加一个迁移的匹配,我 们就按这样

的规则增加一行。这规定了状态机迁移中4要素里的3条,剩下的那条是在迁移中的

动作,后面再介绍。

当然,为了遵循C语言的语法,我们需要在此前就定义 (1) 状态枚举、 (2) 消息

枚举,还有 (3) 迁移的结构体。如下。

1 enum state { s_stop='s', s_play='p', s_forward='f', s_backward='b',

s_pause='_', s_record='r' };

2 enum message { play, stop, forward, backward, record, pause };

3

4 struct transition {

5 enum state current;

6 enum message m;

7 enum state next;

8 };

我们还需要定义一共多少条迁移规则,是为了我们还没有写出来的代码准备的,不

过此处已经用到,所以定义如下。

1 #define transition_num 11

5. 迁移时的动作

我们希望把迁移时的动作放在每个状态到达之处。即,每个状态都可以有一些"副

作用"。这与迁移时的动作是等价的,证明略去。如果仅想在迁移时 写代码,也可

以利用这种方法实现。

状态机的动作 表格如下:

1 struct state_action state_action_map[state_num] = {

2 {s_stop, do_stop},

3 {s_play, do_play},

4 {s_forward, do_forward},

5 {s_backward, do_backward},

6 {s_pause, do_pause},

7 {s_record, do_record}};

每一行,是一个状态对应的动作。第一列是状态,第二列是对应的动作。这样,每

增加一个状态 (如果它有对应动作),就在这里加入一行;动作对应的函数需要实

现,后面会介绍。

类似于状态迁移图,为了遵循C语言语法,我们需要在此前声明如下。

1 #define state_num 6

2 typedef void (*action_foo)() ;

3

4 enum state { s_stop='s', s_play='p', s_forward='f', s_backward='b',

s_pause='_', s_record='r' };

5

6 /* action starts */

7 void do_stop() {printf ("I am in state stop and should doing something

here.n");}

8 void do_play() {printf ("I am in state play and should doing something

here.n");}

9 void do_forward() {printf ("I am in state forward and should doing

something here.n");}

10 void do_backward() {printf ("I am in state backward and should doing

something here.n");}

11 void do_pause() {printf ("I am in state pause and should doing

something here.n");}

12 void do_record() {printf ("I am in state record and should doing

something here.n");}

13

14 struct state_action {

15 enum state m_state;

16 action_foo foo;

17 };

第1行,是状态的数量。第2行和第7行到第12行,以及第16行,使用了函数指针(指

向函数的指针,一个指针,它的基类型是一个函数),用于 表示要执行的动作。第

4行,是状态枚举。第14行到第17行,是 状态-动作 对应关系的结构体。

第7行至第12行,是动作的执行部分。当增加的状态需要动作时,程序员要在此处

加入一个函数,它遵守第2行的签名约定。

6. 引擎

如果表格的数据结构已定,代码就好写了。我们的引擎代码的核心部分是查表,遍

历表格,找到与当前状态、当前消息匹配的将迁移到的状态。

我们还是自顶向下,假设 查表部分已经完成,为主函数提供与 普通青年一文相同

的接口--而内部实现是不同的。

1 void state_change(enum message m)

2 {

3 static state = s_stop;

4 enum state next;

5 int index = 0;

6

7 index = lookup_transition(state, m, fsm);

8 if(index!=ERR)

9 {

10 state = fsm[index].next;

11 lookup_action(state, state_action_map)();

12 }

13 return;

14 }

如第3行如示,初始状态是 停止。在第7行,我们引用了一个尚未写好的函

数,lookup_transition。虽然函数还不存在,不过我们能猜出来它的作用,查

表,找到 当前状态是 state,当前消息是 m 时所对应的表项的下标 index。fsm

参数是为了可能有多个状态迁移表设计的,此处可以略过。

当查找到 index 以后,且 index 不是 ERR (没找到),就可以令 下一个状态为

state = fsm[index].next,见第10行。

以上,完成了状态迁移4要素中的3个:当前状态、当前消息、将迁移到的状态。

第11行,完成的功能是执行与状态对应的动作。这里又用到函数指针。在代码

lookup_action(state, state_action_map)() 中,lookup_action(state,

state_action_map) 用于找到状态 state 对应的动作,后面的 "()",是因为这个

动作是一个函数指针,可以使用这样的方式执行这个指针指向的函数。与上文中的

fsm 参数类似,state_action_map是为了应对有多个状态-动作表的情况,这里可

以略过。

无论数据 (状态迁移、状态-动作)如何变化,引擎代码都不会变化。所以,甚至可

以把引擎放在静态或动态链接库里,或者把数据放在外部文件里,运行时再载入,

从而提 高部署时的灵活性。

7. 查表

刚刚用到的两个未定义的函数 lookup_transition(state, m, fsm) 和

lookup_action(state, state_action_map) 都使用了查表的方法。

代码如下。可以看出,二者的结构非常类似,遍历数组 (for循环) ,找到符合条

件的元素 (if判断),然后把该元素的索引或者该元素结构体的某个成员返回。

ERR 和 ACTION_NOT_FOUND 是用来容错的,万一表格有误,没有查到匹配的项。

1 int const ERR = -1;

2 int lookup_transition (enum state s, enum message m, struct transition

* t)

3 {

4 int ret=ERR;

5 int i;

6 for(i=0;i<transition_num;++i)

7 {

8 if(t[i].current == s && t[i].m == m)

9 {

10 ret = i;

11 }

12 }

13 return ret;

14 }

15

16 action_foo ACTION_NOT_FOUND = NULL;

17 action_foo lookup_action(enum state s, struct state_action* a)

18 {

19 action_foo ret = ACTION_NOT_FOUND;

20 int i=0;

21 for (i=0;i<state_num;++i)

22 {

23 if(s == a[i].m_state)

24 {

25 ret = a[i].foo;

26 }

27 }

28 return ret;

29 }

8. 总结

geek青年,从接口上看,与普通青年并无不同。甚至在情况相对简单 (状态少、状

态迁移种类少) 的时候,代码量比普通青年还有不如。那么,geek青年的长处在哪

里呢?

古人云:沧海横流方显英雄本色。古人又云:大丈夫山崩于前不变色,海啸于后不

动容。

geek青年的长处在于,他始终如一,无论遇到的情形是多么糟糕多么恶劣,他始终

没有变化。这个世界上,总需要一些因素,一些承诺,不随任何 易变的感情、任

何旁人不能承受的痛苦或诱惑而变化,稳定地坚持。这才能让我们对这个世界保留

一丝希望,未来才能够和值得期待。

这一篇和上一篇的代码在这里 [http://download.csdn.net/detail/younggift

/7569627]。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

=======================

普通青年的状态机,纯C语言

我们第一次接触到状态机,是在数字电路课程里。计数器、串行奇偶检校、 检验

三个1连续出现的报错电路 等,都需要状态机作为模型。实现这些功能的电路,与

状态机的状态转换图、状态转换表都是等价的。

后来,我们再接触状态机,是在编译原理课程里。状态机用于描述与正则表达式匹

配的字符串。

再后来,我们在GUI界面设计中,需要设置一些控件在某些条件下 禁用,某些条件

下使能,某些条件下打个对号。这也可以用状态机模型来控制。

1. 不要写成 消息响应/事件处理

状态机和消息响应都是 双层 switch-case 结构。不同的是,状态机的外层是状

态,内层是消息;消息响应外层是消息,内层是状态。

有的同学会说,那又有多大的区别呢?代码只是外在形式而非本质,它所反应的是

你对模型的理解,或者说,对于问题,你使用了哪种模型。

消息响应适合于这样的情形:有很多种消息,对于同一种消息,你的程序总是给出

同一种反应。打个比方,你女朋友喜欢吃冰淇淋,任何时候你给她 买,她都高

兴,或者转怒为喜,或者转悲为喜,总之,会置心情为"喜"。这种情形,适合用消

息响应解决。

而状态机适合于另一种情形,你的程序是"有状态的",它在不同的情况 (状态)

下,会对同一消息做出不同的反应。状态,是一种数据,但是它影响流程的行为。

按面向对象的观点,数据与流程间的这种高内聚关系,非常适合用 类 来实现。这

是题外话,我们回到女朋友和冰淇淋间的关系。你女朋友可能并非在任何情况下吃

了冰淇淋都高兴,比如刚刚吃完十个八个的时候...这与她当前的状 态有关。

状态机中,我们需要掌握的核心的数据是:当前状态,当前消息,将迁移到的状

态,在迁移中发生的动作。

在状态机代码之前,请先看一段消息响应机制,VC生成的win32api代码大抵如此。

我们随便找来一段片断看看:

1 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,

LPARAM lParam)

2 {

3 int wmId, wmEvent;

4 PAINTSTRUCT ps;

5 HDC hdc;

6 switch (message)

7 {

8 case WM_COMMAND:

9 wmId = LOWORD(wParam);

10 wmEvent = HIWORD(wParam);

11 case ID_MENU_GO: .... break;

12 case IDM_ABOUT: .... break;

13 case IDM_EXIT: .... break;

14 default:

15 return DefWindowProc(hWnd, message, wParam, lParam);

16 }

17 break;

18 case WM_PAINT: .... break;

19 case WM_DESTROY: ... break;

20 case WM_KEYDOWN: ... break;

21 default: return DefWindowProc(hWnd, message, wParam, lParam);

22 }

23 return 0;

24 }

第6行开始到第22行结束,对每个消息给出一个响应。没错,win32api也把这个传

进来的东西称为 message。这是很典型的适合消息响应机制的情形,程序对于相同

的消息,处理的方法总是相同的。

我们常常错误地把状态机写成了消息响应,消息这部分处理得不错,但是,由于没

有很好地记录和迁移状态,写起来容易把自己写糊涂了。无他,用错 了工具。拿

螺丝刀打孔,不是工具差,而是工程师选错了工具。

2. 状态机实例,录音机

实例得是相对简单的,不然我们很容易淹没在细节之中,没有足够精力去关注状态

机本身的机制了。假设我们仿真一台录音机...

我们先假设你见过录音机。录音机是一种曾经先进的设备,有一个或两个"卡",可

以放进磁带。"卡"前面有几个按键,这几个按键上的标识因为图 形简单且示意性

强,现在还在广泛使用。它们分别是 播放 > 、暂停 || 、快进 >> 、快退<< 、

录音 O 、停止 []。

这几个按键之间是有一定的"互斥关系"的。比如当播放键按下时,我们不应该能把

快进键按下。当然,淘气的同学可能这样干过,我们会听到"咔咔"的声音,然后是

家长骂败家玩艺的声音。可以就"互斥关系"开始写程序,但是我觉得这样有点 麻烦。

我们认为,这种"互斥关系"是因为录音机是"有状态的"。所以,我们打算用状态机

来实现。状态转换图是这样的。请读图的时候关注这四点:当前 状态,当前消

息,将迁移到的状态,在迁移中发生的动作 (本例中没有) 。

digraph state

{

graph [ nodesep=1.2];

rankdir = LR;

播放 -> 暂停 [label="按下 || "];

暂停 -> 播放 [label="按下 || "];

暂停 -> 停止 [label="按下 []"];

停止 -> 播放 [label="按下 >"];

播放 -> 停止 [label="按下 []"];

停止 -> 快退 [label="按下 <<"];

停止 -> 快进 [label="按下 >>"];

快进 -> 停止 [label="按下 []"];

快退 -> 停止 [label="按下 []"];

停止 -> 录音 [label="按下 O"];

录音 -> 停止 [label="按下 []"];

}

备注:我实在想不起来 暂停 和 停止 之间的关系了,似乎是这样的,又似乎不

是。反正大概是那么个意思,不影响对状态机的理解,就这么地吧。

接下来是C代码实现。

3. 接口 及 测试

看到以下代码,有的同学会说,你这不就是主程序么,为什么要把小标题叫做接

口。因为,它规定了我们的状态机函数将是什么样子的。

1 enum message { play, stop, forward, backward, record, pause };

2

3 int main(int argc, char *argv[])

4 {

5 char c=0x00;

6 while(1)

7 {

8 c = getchar();

9 switch(c)

10 {

11 case ' ': state_change(pause); break;

12 case 'p': state_change(play); break;

13 case 'r': state_change(record); break;

14 case 's': state_change(stop); break;

15 case 'f': state_change(forward); break;

16 case 'b': state_change(backward); break;

17 case 'q': return EXIT_SUCCESS;

18 }

19 }

20 return EXIT_SUCCESS;

21 }

上述代码规定了,状态机迁移函数的原型/签名是 void state_change(enum

message m)。

测试的时候,我们这样做:./state < test.intest.in的内容是"psfsbspq",测

试时期待看到输出的状态迁移过程。之所以这样做,而不是每次从控制台手动输

入,是因为每 次测试的内容都应该是相同的--相同的输入,程序有相同的反应--

可重现性。或者说,DRY原则。

一个非常值得我们注意的问题。在上述接口中,我们看不到"状态"。事实上,我们

将会定义:

enum state { s_stop, s_play, s_forward, s_backward, s_pause, s_record };

但是,接口以外的代码,是 *不应该* (是不应该,不是 不必要,是一定不要) 知

道状态的,既不应该知道当前状态,也不应该知道将要迁移到哪个状态,也不应该

知道在迁移过程中应该做什么动作。如果接口以外的代码知道了这些,就侵入了

状态机的隐私,子系统的边界就模糊了。而契约的首要任务就是规定边界,规定国

家与个人、个人与个人、个人与集体的边界。

这一原则,早在195X年,软件工程刚刚开始的时候就确立了,是最初确立的原则,

即 信息隐藏。后面的原则,都是它的儿子孙子。有个比喻讲过这个道理。当你在

超市出口付款的时候,你会自己把钱从钱夹里拿出来递给售货员,而不会转过身去

对她 说,"在我屁股兜里,你自己掏吧,别忘了把零钱放回来。"这既增加了假设

--你极端信任她,也增加了她的责任。

接口,最主要的任务就是为了明确责任,把责任分布在子系统边界两侧。其次才是

规定调用的方法,即边界长什么样。

4. 状态迁移

以下是状态机的代码片断。

1 enum state { s_stop, s_play, s_forward, s_backward, s_pause, s_record};

2 void state_change(enum message m)

3 {

4 static enum state s=s_stop;

5 switch (s)

6 {

7 case s_play:

8 if(m==stop)

9 {

10 s = s_stop;

11 printf("stop.n");

12 }

13 else if (m==pause)

14 {

15 s = s_pause;

16 printf("pause");

17 }

18 break;

我们还是要关注那四个关键点: (1) 当前状态, (2) 当前消息, (3) 将迁移到

哪个状态, (4) 迁移中会做哪些动作。

(1) 当前状态必然是第1行的枚举类型中的一个。我们初始化状态为 停止,见第4行。

在第5行到第7行,我们的双重 switch-case 的外层 按当前状态分类,如下。

5 switch (s)

6 {

7 case s_play:

下面还有很多 case,第1行的枚举类型中的每一个状态,都有一个 case。

(2) 当前消息。如果当前状态是第7行了,那么,当前消息由双层 switch-case的

内层,即第8行,第13行的 if...else if 来响应。

(3) 将迁移到哪个状态。在 s_play状态 (第7行) 接收到 stop 消息 (第8行)的

话,将迁移到 s_stop 状态,即第10行。

(4) 在迁移中会做哪些动作,如果还是这个状态这个消息,会做的动作是 第11

行,打印一段文字描述接下来的状态。

在函数 void state_change(enum message m) 中,维护了当前状态,规定了在某

种状态下-接收到某个消息,会迁移到哪个状态,在状态迁移中做哪些动作。

主函数在调用state_change时,是通过这一接口,向状态机发送一个消息;由状态

机对这个消息做出适合自己当前状态的响应--状态迁 移、动作。主函数所看到

的,是一个多彩或善变的女人,而她之所以对同一消息做出不同响应的原因,在她

的内心深入保留着,那是她不会对你说的状 态,以及状态迁移中的波澜壮阔。即

使表面上善变的状态机,也是可以理解和预测的,如果她对你倘开心扉,允许你一

行一行把附录A中的代码读完, 了解所有的 switch-case,了解所有的状态下她将

会如何响应每一种消息。

附录A 完整代码

1 #include <stdlib.h>

2 #include <stdio.h>

3

4

5 //recorder

6

7 enum state { s_stop, s_play, s_forward, s_backward, s_pause, s_record };

8 enum message { play, stop, forward, backward, record, pause };

9

10

11 void state_change(enum message m)

12 {

13 static enum state s=s_stop;

14 switch (s)

15 {

16 case s_play:

17 if(m==stop)

18 {

19 s = s_stop;

20 printf("stop.n");

21 }

22 else if (m==pause)

23 {

24 s = s_pause;

25 printf("pause");

26 }

27 break;

28 case s_pause:

29 if(m==pause)

30 {

31 s = s_play;

32 printf("play.n");

33 }

34 else if(m==stop)

35 {

36 s = s_stop;

37 printf("stop.n");

38 }

39 break;

40 case s_stop:

41 if(m==play)

42 {

43 s = s_play;

44 printf("play.n");

45 }

46 if(m==backward)

47 {

48 s = s_backward;

49 printf("backward.n");

50 }

51 if(m==forward)

52 {

53 s = s_forward;

54 printf("forward.n");

55 }

56 if(m==record)

57 {

58 s = s_record;

59 printf("record.n");

60 }

61 break;

62 case s_forward:

63 if(m==stop)

64 {

65 s = s_stop;

66 printf("stop.n");

67 }

68 break;

69 case s_backward:

70 if(m==stop)

71 {

72 s = s_stop;

73 printf("stop.n");

74 }

75 break;

76 case s_record:

77 if(m==stop)

78 {

79 s = s_stop;

80 printf("stop.n");

81 }

82 break;

83

84

85 }

86

87 }

88

89

90 int main(int argc, char *argv[])

91 {

92 char c=0x00;

93 while(1)

94 {

95 c = getchar();

96 switch(c)

97 {

98 case ' ': state_change(pause); break;

99 case 'p': state_change(play); break;

100 case 'r': state_change(record); break;

101 case 's': state_change(stop); break;

102 case 'f': state_change(forward); break;

103 case 'b': state_change(backward); break;

104 case 'q': return EXIT_SUCCESS;

105 }

106

107

108 }

109

110 return EXIT_SUCCESS;

111 }

附录B 状态图源代码 in graphviz

digraph state

{

graph [ nodesep=1.2];

rankdir = LR;

播放 -> 暂停 [label="按下 || "];

暂停 -> 播放 [label="按下 || "];

暂停 -> 停止 [label="按下 []"];

停止 -> 播放 [label="按下 >"];

播放 -> 停止 [label="按下 []"];

停止 -> 快退 [label="按下 <<"];

停止 -> 快进 [label="按下 >>"];

快进 -> 停止 [label="按下 []"];

快退 -> 停止 [label="按下 []"];

停止 -> 录音 [label="按下 O"];

录音 -> 停止 [label="按下 []"];

}

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

=======================

读卡器的状态机, python实现 (图又更新)

读卡器的状态机, python实现

1. 问题的提出,及状态机简介

ZHUMAO整了个门禁用的读卡器,比以前那种更好,不需要发指令就能读,只要刷

卡,读卡器就向串口上写数据。仍然是串口的,还是韦根协 议。"刷卡就向上写"

避免了轮询读卡器,效率更高,代码也容易了。不过,也造成一个问题。下发命

令,然后轮询读的模式下,如果在串口线上只有 一个读卡器,不需要对输入的数

据特别检验和处理,接收到的数据一定是对的,按协议读入多少个字符,然后按偏

移量取有效的部分就行了。"刷卡就 向上写"的模式,需要保证对齐,必须从刷卡

后产生的第一字符开始读,读到最后一个,要避免从中间读起。如果中间出现了噪

音之类的干扰,由于不 能下发指令要求对齐 (或者开始读),就再也找不到开始位

置,数据全乱。

解决这个问题的方案是状态机。

状态机是个著名的数学模型,在数字电路、编译原理、面向对象系统分析与设计、

形式语言与状态机中都有提及。状态机效率很不错,刘典同学曾经用 状态机模型

写程序参加过CSDN上的比赛,检验IP地址是否合法,获得过第二名。状态机描述问

题清晰,邦哥和亮哥曾经用状态机重写安卓程序的 界面部分,把原来"朴素"方法

可能出现的BUG都去除了。

正确的思考方法是有效的工具,在解决问题中非常重要。人类通常不懈于在猛兽面

前炫耀速度和力量,而是使用弩箭和陷阱。所以,工具对于成为人类 多么重要。

所以,不用状态机,而依靠单纯的智力是多么愚蠢。

2. 问题描述

该型号读卡器上传的数据看起来是这样的,以十六进制表示,"02 XX XX XX XX 0d

0a 03"。其中的4个 XX 表示卡号,是我们感兴趣的部分。其余的部分必须匹配,

才能说明读卡器正常工作,卡号有效。

主程序准备写成这样:

1 if __name__ == '__main__':

2 s = state_machine()

3 t = serial.Serial('COM3')

4 while True:

5 str = s.go(t)

6 print str.upper()

其中第2行初始化一个 state_machine 类的实例。在第4行开始的循环中,每次迭

代都调用 s.go(t),把串口传给状态机。在状态机的go中,读很多次串口,直到遇

到一次完整有效的卡号,作为返回值,在第6行中打印出来。这个串口t如果改为

在 state_machine 的构造函数中,会更好一些。不过我对python语法不熟,大部

分时间都消耗在查语法手册上了,头昏眼花,当时就写成了这样。

当然,真实程序的目标不是打印卡号,而是用卡号作为检索条件,去数据库里查询

和更新一些数据。

3. 状态机

开始写状态机,才发现 python 居然没有 switch-case。可见我对语法得多么不熟。

根据 "02 XX XX XX XX 0d 0a 03",状态转换如图所示。状态图中的关键是,我在

哪个状态,接收到哪个消息后,会迁移到哪个状态,在迁移的过程中,会做哪些动作。

4. 状态机代码解释

代码如附录A所示。state_machine 是一个类 类型。

成员变量,count用于计数,在0x00状态 (及0x02状态) 一共接收了几个字符,这

些字符应该添加到有效卡号 (成员变量ret)的末尾。成员变量state,是当前的状

态,其初始状态是 0xff。

成员函数 str2hex 是从zhumao那里抄来的,用于把二进制转为十六进制文本形式。

成员函数 go (self, ser) 是核心部分。每次调用 go,它会从串口读入一个字

符,并把这个字符作为发送给状态机的消息;状态机根据自己的 (1) 当前状态

state,然后再根据这个 (2) 消息 c,判定 (3)应该迁移到哪个状态, (4)应在迁

移时做哪些动作。

在状态图中,(1) 当前状态标记为椭圆,箭尾所指的那个椭圆, (2)消息,标记为

线上的文字,斜线"/"左边的部分, (3)应该迁移到哪个状态,箭头所指的那个椭

圆, (4)在迁移时做的动作,标记为线上的文字,斜线右边的部分。

成员函数 go,一旦读到的字符可以拼成一个有效的卡号 (包括0x03也已读入),就

给出卡号作为返回值,退出 go 函数,控制权转交回主函数。如果尚未形成有效的

卡号,就继续在 go 里面转。

如果你想测试,还没有找到读卡器。那么把第12行改成从一个二进制文进中读入。

附录A 状态机代码

1 class state_machine:

2 count = 0

3 state = 0xff # 02 XX XX XX XX 0d 0a 03

4 ret = ""

5 def str2hex(self, c):

6 hvol = ord(c)

7 hhex = '%02x'%hvol

8 return hhex

9

10 def go(self, ser):

11 while True:

12 c = ser.read(1)

13 c = self.str2hex(c)

14 # print self.state

15 # print c

16 # print self.ret

17 # print

18 if self.state == 0xff:

19 if c == '02':

20 self.state = 0x02

21 self.ret = ""

22 continue

23 if self.state == 0x02:

24 self.state = 0x00

25 self.count = 0

26 self.count=self.count+1

27 self.ret = self.ret + c

28 continue

29 if self.state == 0x00:

30 if self.count<4:

31 self.count=self.count+1

32 self.ret = self.ret + c

33 self.state = 0x00

34 continue

35 else:

36 if c == '0d':

37 self.state = 0x0d

38 continue

39 else:

40 self.state = 0xff

41 self.ret = ""

42 continue

43 if self.state == 0x0d:

44 if c == '0a':

45 self.state = 0x0a

46 continue

47 else:

48 self.state = 0xff

49 continue

50 if self.state == 0x0a:

51 if c == '03':

52 self.state = 0x03

53 self.state = 0xff

54 return self.ret

55 else:

56 self.state = 0xff

57 continue

58 else:

59 continue

附录 B 状态机图示的源代码 in graphviz

digraph state

{

graph [ nodesep=1.2]

start -> "0xff" ;

"0x00" [color=red];

"0xff" -> "0x02" [label="0x02"];

"0xff" -> "0xff" [label="不是0x02"];

"0x02" -> "0x00" [label="任意字符 / (count=1,该字符填入卡号末尾)",

color=red, fontcolor=red];

"0x00"-> "0x00" [label="任意字符 & count<4 / (count+=1,该字符填入

卡号末尾)", color=red, fontcolor=red];

"0x00" -> "0x0d" [label="0x0d & count>=4"];

"0x00" -> "0xff" [label="不是0x0d & count>=4"];

"0x0d" -> "0x0a" [label="0x0a"];

"0x0d" -> "0xff" [label="不是0x0a"];

"0x0a" -> "0x03" [label="0x03"];

"0x0a" -> "0xff" [label="不是0x03"];

"0x03" -> "0xff" [label="无条件"];

}

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

=======================

读卡器的状态机, python实现 (图有更正)

读卡器的状态机, python实现

1. 问题的提出,及状态机简介

ZHUMAO整了个门禁用的读卡器,比以前那种更好,不需要发指令就能读,只要刷

卡,读卡器就向串口上写数据。仍然是串口的,还是韦根协 议。"刷卡就向上写"

避免了轮询读卡器,效率更高,代码也容易了。不过,也造成一个问题。下发命

令,然后轮询读的模式下,如果在串口线上只有 一个读卡器,不需要对输入的数

据特别检验和处理,接收到的数据一定是对的,按协议读入多少个字符,然后按偏

移量取有效的部分就行了。"刷卡就 向上写"的模式,需要保证对齐,必须从刷卡

后产生的第一字符开始读,读到最后一个,要避免从中间读起。如果中间出现了噪

音之类的干扰,由于不 能下发指令要求对齐 (或者开始读),就再也找不到开始位

置,数据全乱。

解决这个问题的方案是状态机。

状态机是个著名的数学模型,在数字电路、编译原理、面向对象系统分析与设计、

形式语言与状态机中都有提及。状态机效率很不错,刘典同学曾经用 状态机模型

写程序参加过CSDN上的比赛,检验IP地址是否合法,获得过第二名。状态机描述问

题清晰,邦哥和亮哥曾经用状态机重写安卓程序的 界面部分,把原来"朴素"方法

可能出现的BUG都去除了。

正确的思考方法是有效的工具,在解决问题中非常重要。人类通常不懈于在猛兽面

前炫耀速度和力量,而是使用弩箭和陷阱。所以,工具对于成为人类 多么重要。

所以,不用状态机,而依靠单纯的智力是多么愚蠢。

2. 问题描述

该型号读卡器上传的数据看起来是这样的,以十六进制表示,"02 XX XX XX XX 0d

0a 03"。其中的4个 XX 表示卡号,是我们感兴趣的部分。其余的部分必须匹配,

才能说明读卡器正常工作,卡号有效。

主程序准备写成这样:

1 if __name__ == '__main__':

2 s = state_machine()

3 t = serial.Serial('COM3')

4 while True:

5 str = s.go(t)

6 print str.upper()

其中第2行初始化一个 state_machine 类的实例。在第4行开始的循环中,每次迭

代都调用 s.go(t),把串口传给状态机。在状态机的go中,读很多次串口,直到遇

到一次完整有效的卡号,作为返回值,在第6行中打印出来。这个串口t如果改为

在 state_machine 的构造函数中,会更好一些。不过我对python语法不熟,大部

分时间都消耗在查语法手册上了,头昏眼花,当时就写成了这样。

当然,真实程序的目标不是打印卡号,而是用卡号作为检索条件,去数据库里查询

和更新一些数据。

3. 状态机

开始写状态机,才发现 python 居然没有 switch-case。可见我对语法得多么不熟。

根据 "02 XX XX XX XX 0d 0a 03",状态转换如图所示。状态图中的关键是,我在

哪个状态,接收到哪个消息后,会迁移到哪个状态,在迁移的过程中,会做哪些动作。

4. 状态机代码解释

代码如附录A所示。state_machine 是一个类 类型。

成员变量,count用于计数,在0x00状态 (及0x02状态) 一共接收了几个字符,这

些字符应该添加到有效卡号 (成员变量ret)的末尾。成员变量state,是当前的状

态,其初始状态是 0xff。

成员函数 str2hex 是从zhumao那里抄来的,用于把二进制转为十六进制文本形式。

成员函数 go (self, ser) 是核心部分。每次调用 go,它会从串口读入一个字

符,并把这个字符作为发送给状态机的消息;状态机根据自己的 (1) 当前状态

state,然后再根据这个 (2) 消息 c,判定 (3)应该迁移到哪个状态, (4)应在迁

移时做哪些动作。

在状态图中,(1) 当前状态标记为椭圆,箭尾所指的那个椭圆, (2)消息,标记为

线上的文字,斜线"/"左边的部分, (3)应该迁移到哪个状态,箭头所指的那个椭

圆, (4)在迁移时做的动作,标记为线上的文字,斜线右边的部分。

成员函数 go,一旦读到的字符可以拼成一个有效的卡号 (包括0x03也已读入),就

给出卡号作为返回值,退出 go 函数,控制权转交回主函数。如果尚未形成有效的

卡号,就继续在 go 里面转。

如果你想测试,还没有找到读卡器。那么把第12行改成从一个二进制文进中读入。

附录A 状态机代码

1 class state_machine:

2 count = 0

3 state = 0xff # 02 XX XX XX XX 0d 0a 03

4 ret = ""

5 def str2hex(self, c):

6 hvol = ord(c)

7 hhex = '%02x'%hvol

8 return hhex

9

10 def go(self, ser):

11 while True:

12 c = ser.read(1)

13 c = self.str2hex(c)

14 # print self.state

15 # print c

16 # print self.ret

17 # print

18 if self.state == 0xff:

19 if c == '02':

20 self.state = 0x02

21 self.ret = ""

22 continue

23 if self.state == 0x02:

24 self.state = 0x00

25 self.count = 0

26 self.count=self.count+1

27 self.ret = self.ret + c

28 continue

29 if self.state == 0x00:

30 if self.count<4:

31 self.count=self.count+1

32 self.ret = self.ret + c

33 self.state = 0x00

34 continue

35 else:

36 if c == '0d':

37 self.state = 0x0d

38 continue

39 else:

40 self.state = 0xff

41 self.ret = ""

42 continue

43 if self.state == 0x0d:

44 if c == '0a':

45 self.state = 0x0a

46 continue

47 else:

48 self.state = 0xff

49 continue

50 if self.state == 0x0a:

51 if c == '03':

52 self.state = 0x03

53 self.state = 0xff

54 return self.ret

55 else:

56 self.state = 0xff

57 continue

58 else:

59 continue

附录 B 状态机图示的源代码 in graphviz

digraph state

{

graph [ nodesep=1.2]

start -> "0xff" ;

"0x00" [color=red];

"0xff" :e -> "0x02" : e [label="0x02"];

"0xff" :e -> "0xff" : e [label="不是0x02"];

"0x02" :e -> "0x00" : e [label="任意字符 / (count=1,该字符填入卡号

末尾)", color=red, fontcolor=red];

"0x00"-> "0x00" : e [label="任意字符 & count<4 / (count+=1,该字符

填入卡号末尾)", color=red, fontcolor=red];

"0x00" :e -> "0x0d" : e [label="0x0d & count>=4"];

"0x00" :e -> "0xff" : e [label="不是0x0d & count>=4"];

"0x0d" :e -> "0x0a" : e [label="0x0a"];

"0x0d" :e -> "0xff" : e [label="不是0x0a"];

"0x0a" :e -> "0x03" : e [label="0x03"];

"0x0a" :e -> "0xff" : e [label="不是0x03"];

"0x03" :e -> "0xff" : e [label="无条件"];

}

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

=======================

读卡器的状态机, python实现

读卡器的状态机, python实现

1. 问题的提出,及状态机简介

ZHUMAO整了个门禁用的读卡器,比以前那种更好,不需要发指令就能读,只要刷

卡,读卡器就向串口上写数据。仍然是串口的,还是韦根协 议。"刷卡就向上写"

避免了轮询读卡器,效率更高,代码也容易了。不过,也造成一个问题。下发命

令,然后轮询读的模式下,如果在串口线上只有 一个读卡器,不需要对输入的数

据特别检验和处理,接收到的数据一定是对的,按协议读入多少个字符,然后按偏

移量取有效的部分就行了。"刷卡就 向上写"的模式,需要保证对齐,必须从刷卡

后产生的第一字符开始读,读到最后一个,要避免从中间读起。如果中间出现了噪

音之类的干扰,由于不 能下发指令要求对齐 (或者开始读),就再也找不到开始位

置,数据全乱。

解决这个问题的方案是状态机。

状态机是个著名的数学模型,在数字电路、编译原理、面向对象系统分析与设计、

形式语言与状态机中都有提及。状态机效率很不错,刘典同学曾经用 状态机模型

写程序参加过CSDN上的比赛,检验IP地址是否合法,获得过第二名。状态机描述问

题清晰,邦哥和亮哥曾经用状态机重写安卓程序的 界面部分,把原来"朴素"方法

可能出现的BUG都去除了。

正确的思考方法是有效的工具,在解决问题中非常重要。人类通常不懈于在猛兽面

前炫耀速度和力量,而是使用弩箭和陷阱。所以,工具对于成为人类 多么重要。

所以,不用状态机,而依靠单纯的智力是多么愚蠢。

2. 问题描述

该型号读卡器上传的数据看起来是这样的,以十六进制表示,"02 XX XX XX XX 0d

0a 03"。其中的4个 XX 表示卡号,是我们感兴趣的部分。其余的部分必须匹配,

才能说明读卡器正常工作,卡号有效。

主程序准备写成这样:

1 if __name__ == '__main__':

2 s = state_machine()

3 t = serial.Serial('COM3')

4 while True:

5 str = s.go(t)

6 print str.upper()

其中第2行初始化一个 state_machine 类的实例。在第4行开始的循环中,每次迭

代都调用 s.go(t),把串口传给状态机。在状态机的go中,读很多次串口,直到遇

到一次完整有效的卡号,作为返回值,在第6行中打印出来。这个串口t如果改为

在 state_machine 的构造函数中,会更好一些。不过我对python语法不熟,大部

分时间都消耗在查语法手册上了,头昏眼花,当时就写成了这样。

当然,真实程序的目标不是打印卡号,而是用卡号作为检索条件,去数据库里查询

和更新一些数据。

3. 状态机

开始写状态机,才发现 python 居然没有 switch-case。可见我对语法得多么不熟。

根据 "02 XX XX XX XX 0d 0a 03",状态转换如图所示。状态图中的关键是,我在

哪个状态,接收到哪个消息后,会迁移到哪个状态,在迁移的过程中,会做哪些动作。

4. 状态机代码解释

代码如附录A所示。state_machine 是一个类 类型。

成员变量,count用于计数,在0x00状态 (及0x02状态) 一共接收了几个字符,这

些字符应该添加到有效卡号 (成员变量ret)的末尾。成员变量state,是当前的状

态,其初始状态是 0xff。

成员函数 str2hex 是从zhumao那里抄来的,用于把二进制转为十六进制文本形式。

成员函数 go (self, ser) 是核心部分。每次调用 go,它会从串口读入一个字

符,并把这个字符作为发送给状态机的消息;状态机根据自己的 (1) 当前状态

state,然后再根据这个 (2) 消息 c,判定 (3)应该迁移到哪个状态, (4)应在迁

移时做哪些动作。

在状态图中,(1) 当前状态标记为椭圆,箭尾所指的那个椭圆, (2)消息,标记为

线上的文字,斜线"/"左边的部分, (3)应该迁移到哪个状态,箭头所指的那个椭

圆, (4)在迁移时做的动作,标记为线上的文字,斜线右边的部分。

成员函数 go,一旦读到的字符可以拼成一个有效的卡号 (包括0x03也已读入),就

给出卡号作为返回值,退出 go 函数,控制权转交回主函数。如果尚未形成有效的

卡号,就继续在 go 里面转。

如果你想测试,还没有找到读卡器。那么把第12行改成从一个二进制文进中读入。

附录A 状态机代码

1 class state_machine:

2 count = 0

3 state = 0xff # 02 XX XX XX XX 0d 0a 03

4 ret = ""

5 def str2hex(self, c):

6 hvol = ord(c)

7 hhex = '%02x'%hvol

8 return hhex

9

10 def go(self, ser):

11 while True:

12 c = ser.read(1)

13 c = self.str2hex(c)

14 # print self.state

15 # print c

16 # print self.ret

17 # print

18 if self.state == 0xff:

19 if c == '02':

20 self.state = 0x02

21 self.ret = ""

22 continue

23 if self.state == 0x02:

24 self.state = 0x00

25 self.count = 0

26 self.count=self.count+1

27 self.ret = self.ret + c

28 continue

29 if self.state == 0x00:

30 if self.count<4:

31 self.count=self.count+1

32 self.ret = self.ret + c

33 self.state = 0x00

34 continue

35 else:

36 if c == '0d':

37 self.state = 0x0d

38 continue

39 else:

40 self.state = 0xff

41 self.ret = ""

42 continue

43 if self.state == 0x0d:

44 if c == '0a':

45 self.state = 0x0a

46 continue

47 else:

48 self.state = 0xff

49 continue

50 if self.state == 0x0a:

51 if c == '03':

52 self.state = 0x03

53 self.state = 0xff

54 return self.ret

55 else:

56 self.state = 0xff

57 continue

58 else:

59 continue

附录 B 状态机图示的源代码 in graphviz

digraph state

{

graph [ nodesep=1.2]

start -> "0xff" ;

"0x00" [color=red];

"0xff" :e -> "0x02" : e [label="0x02"];

"0x02" :e -> "0x00" : e [label="任意字符 / (count=1,该字符填入卡号

末尾)", color=red, fontcolor=red];

"0x00"-> "0x00" : e [label="任意字符 & count<4 / (count+=1,该字符

填入卡号末尾)", color=red, fontcolor=red];

"0x00" :e -> "0x0d" : e [label="0x0d & count>=4"];

"0x00" :e -> "0xff" : e [label="不是0x0d & count>=4"];

"0x0d" :e -> "0x0a" : e [label="0x0a"];

"0x0d" :e -> "0xff" : e [label="不是0x0a"];

"0x0a" :e -> "0x03" : e [label="0x03"];

"0x0a" :e -> "0xff" : e [label="不是0x03"];

"0x03" :e -> "0xff" : e [label="无条件"];

}

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

=======================

增加PDF文件对比度的粗浅原理,及方法

增加PDF文件对比度的粗浅原理,及方法

最近的照片在[http://www.douban.com/photos/album/134230762/]。

电子书扫描版跟照片差不多,一个可能的问题是看起来乌突突的,黑的不够黑,白

的不够白,像是蒙了一层雾。用picasa的luck功能或者 snapseed的automatic功

能,都能把图片上的雾去掉。但是同样的功能用在PDF上的软件我没有找到。

但是如果弄懂了原理--让我想起 倚天屠龙记 里的杨左史,长戟大刀蛾眉刺各种武

器的招法都是可以溶入拳法之中的。

就黑白 (严格地说,灰度)图片而言,"去雾"的基本原理是增加对比度。人眼看到

的全黑、全白,以及其间所有的过渡色调,在计算机图片中都是用数字来表示的。

人眼 是非常精密和拥有极大检测范围的光学仪器,从明亮到直视的太阳,到电影

院里黑暗的座号,都能看到。而计算机图片只能展示人眼可承受的范围中非 常小

的一部分。这部分中最重要的信息(对于黑白图片而言是全部)是亮度。计算机图片

用数字的大小来表示亮度,越亮的,也就是越白的,用较大的 数字,越暗的,也

就是越黑的,用较小的数字表示。

这样,比如说,图片上的每个像素,从最暗到最亮,就对应着从0到255之间的数

字。各种图像处理软件中的gamma校正就是用来指定这种对应 关系的。这种对应可

能是线性的,也可能是非线性的,在非线性的情况下,可能数字变化了很多,而亮

度变化非常小--类似于你调洗澡时的冷热水, 扭了半天,还是挺凉,突然就热得

能烫突鲁皮。你可能觉得,这不是有毛病吗?是的,这种非线性有时会带来麻烦,

但是,同时它还有个优点,那就是 识别度 好。

我们规定一个数值,低于它就是全黑,不管数值如何变化;再规定一个数值,高于

它就是全白,不管数值如何变化。这两个数值就是黑到灰和灰到白的 阀值。之所

以低于某数就视为全黑,是因为我们可能不希望呈现这部分暗调的细节,之所以高

于某数就视为全白,是因为我们可能希望把这些都表现为 高光。

捕捉到的现实是一回事,如何呈现,是完全不同的另一回事。二猫昨天问到,为什

么书里净写些吓人的事情,既然它们很少发生。我说,如果灰姑娘的 故事真的完

全写实,那么,整个故事里你大部分时间看到的都不是她遇到王子的舞会和红舞

鞋,而是灰姑娘成天给她后妈和后姐们做饭做饭做饭做饭做 饭做饭做饭……做饭

同样,一本PDF电子书如果扫描不当,也可能呈现了过多的暗部和高光的细节,而

灰色调子的过渡层次不够分明。暗部和高光的范围可以通过调整黑 和白的阀值完

成,下面会继续介绍;灰色调子的过渡层次,可以通过细调gamma校正完成,本文

不讨论,请自学。

所以,提高有雾电子书的对比度,原理就是重新设置黑和白的阀值。以上是原理部

分,以下是操作方法。

知乎上有人说,把pdf中的图片都导出来,用photoshop处理调整gamma或者设置黑

和白的阀值,然后再导入成PDF。原理正是如 此,但是这需要安装高大上的收费工

具photoshop和acrobat professional,还可能需要一页一页操作 (?) ,有些杀

鸡用牛刀的意思。下面介绍成批处理的方法。

第1步 抽样,使用 ImageMagick 把 PDF 转换为图片。事实上,我们只需要其中的

一两张,不过我不知道如何完成。ImageMagick是linux下和windows下都有的工

具,支持命令行。

$ convert 1.pdf 1.jpg

这样,得到了一大批jpg图片。

第2步 尝试,使用 GIMP 确定白色和黑色的阀值。用GIMP也行,用photoshop也

行,凡是能调灰度图片阀值的,都行。调到你感觉最好,没错,就是"感觉",这是

个主观标 准。然后把白色和黑色的阀值记下来。GIMP是linux下的photoshop。

以上两步不做也行,那么,接下来的阀值就可以靠猜、靠经验、靠多次尝试。

第3步 使用 ImageMagick 修改对比度

$ convert -level 38%,99% 1.pdf 2.pdf

这行命令的意思是:低于38%的,视为黑,高于99%的,视为白,把源文件1.pdf转

换后存为目标文件2.pdf。

因为调整阀值的同时,也自动调整gamma线,使之更陡峭,所以灰色调子的层次会

更鲜明一些。

原理讲了一大堆,还是只是精浅的介绍,而方法中真正起作用的只是一行命令。所

以,这个故事告诉我们,知道怎么干很容易,而知道为什么这么干会 成功就难得

多。当然,唯其如此,才能把长戟大刀蛾眉刺的功夫用在拳法掌法这些徒手格斗之

中。或者,唯其如此,才能把阴影透视和色彩模型应用在 画妆上。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]