存档

‘技术’ 分类的存档

克林顿国务卿关于互联网自由的讲话

2010年1月22日 没有评论

本篇纯转载,读后感另开文章。 英文原文 voa中文翻译 网友小米翻译版

这里转载的是VOA的翻译版

克林顿国务卿关于互联网自由的讲话

希拉里∙克林顿(Hillary Rodham Clinton)国务卿
华盛顿哥伦比亚特区新闻博物馆(Newseum)
2009年1月21日(星期四)

非常感谢,艾伯托(Alberto)。不仅要感谢你的赞誉和介绍,而且要感谢你和你的同事们在这个重要机构中发挥的领导作用。很高兴来到新闻博物馆。这个博物馆是一座纪念碑,见证了我们最珍视的一些自由。我十分感谢能有此机会谈谈如何运用这些自由应对二十一世纪的各项挑战。

虽然我并不能看到你们所有的人——因为在这样的场合灯光照射我的眼睛,而你们都在背光处——但我知道在座的有很多朋友和老同事。我要感谢自由论坛(Freedom Forum)的首席执行官查尔斯∙奥弗比(Charles Overby)光临新闻博物馆,以及我在参议院时的老同事理查德∙卢格(Richard Lugar)和乔∙利伯曼(Joe Lieberman)两位参议员,他们两位都为《表达法》(Voice Act)的通过作出了努力。这项立法表明,美国国会和美国人民不分党派,不分政府部门,坚定地支持互联网自由。

我听说在场的还有参议员萨姆∙布朗巴克(Sam Brownback)、参议员特德∙考夫曼(Ted Kaufman)、众议员洛雷塔∙桑切斯(Loretta Sanchez)、许多大使、临时代办和外交使团的其他代表、以及从中国、哥伦比亚、伊朗、黎巴嫩和摩尔多瓦等国前来参加我们关于互联网自由的“国际访问者领袖计划”(International Visitor Leadership Program)的人士。我还要提到最近被任命为广播理事会(Broadcasting Board of Govenors)理事的阿斯彭研究所(Aspen Institute)所长沃尔特∙艾萨克森( Walter Isaacson)。毫无疑问,他在阿斯彭研究所从事的支持互联网自由的工作中发挥了重要作用。

这 是关于一个非常重要的议题的一个重要讲话。但在开始谈这个议题前,我想简要介绍一下海地的情况。过去八天来,海地人民和世界人民携手应对一场巨大的灾难。 我们这个半球曾历经磨难,但我们目前在太子港面临的困境鲜有先例。通讯网络在我们抗击这场灾难的过程中发挥了极其重要的作用。不用说,当地的通讯网络遭受 了重创,在很多地方被彻底摧毁。地震发生后仅几个小时,我们就与民营部门的伙伴发起“海地”(HAITI)短信捐款活动,使美国的移动电话使用者能通过发短信向救灾工作捐款。这项活动充分展示了美国人民的慷慨。迄今,该活动已为海地的抗震救灾筹集了2500多万美元。

信息网络在救灾现场也发挥了极其重要的作用。星期六,我在太子港会见普雷瓦尔(Preval) 总统时,他的重点目标之一是要努力恢复通讯。幸存的通讯设施不足以帮助当地政府官员相互联络,非政府组织以及我们的文职部门和军队的领导人的运作能力都受 到严重影响。高科技公司设立了互动地图,帮助确定救灾需要和目标资源。就在星期一,一名年仅七岁的小女孩和两名妇女通过发短信呼救被一个美国搜救队从坍塌 的超市的残砖碎瓦下救了出来。这些事例只是一个普遍现象的缩影。

信 息网络的扩展正在为我们的星球建立一个新的神经系统。在海地或湖南发生什么情况时,我们其余的人都能从当事者那里实时得知。我们还可以实时作出反应。灾后 迫切希望提供帮助的美国人和被困在超市瓦砾下的小姑娘以一年以前乃至一代人以前还想象不到的方式被联系在一起。今天,同样的原则适用于几乎整个人类。我们 今天坐在这里,你们中间任何人——或更有可能的是我们孩子中的任何人——都可以拿出很多人每天随身携带的通讯工具,将这次讨论的内容发送给全世界数十亿 人。

在很多方面,信息从未像今天这么自由。与过去任何时候相比,今天都有更多的方式把更多的想法传播给更多的人。即使在集权国家,信息网络也在帮助人们发现新的事实,向政府更多地问责。

例如,奥巴马总统11月 访华期间与当地大学生的直接对话包含了网上提问,突显了互联网的重要性。在回答一个网上提问时,他强调人民有权自由获取信息。他说,信息流通越自由,社会 就越强健。他谈到获取信息的权力如何有助于公民向自己的政府问责,激发新的想法,鼓励创造性和创业精神。我今天来这里发表讲话正是出于美国对这一经过实践 检验的真理的信念。

由 于人们的相互联系空前密切,我们也必须认识到这些新技术并非无条件地造福人类。这些工具也正被用于阻碍人类进步和剥夺政治权利。正如钢可被用于建造医院也 可用于制造机枪。核能可为城市提供动力也可摧毁城市。现代信息网络及其支持的技术既可被用于行善也可被用于作恶。有助于组织自由运动的网络也能使“基地” 组织得以煽动仇恨,挑起针对无辜者的暴力。具有开放政府信息和促进透明化潜力的技术也可被政府劫持,用于镇压异见,剥夺公民权利。

过去一年来,我们看到对信息自由流通的威胁激增。中国、突尼斯和乌兹别克斯坦加强了对互联网的审查。在越南,使用广受欢迎的社交网站的权利突然消失。上个星期五在埃及,30名博客作者和维权人士被拘留。这批博客作者中的一位是巴塞姆∙萨米尔(Bassem Samir)。他有幸获释,今天也在这里,同我们在一起。因此,一方面,这些技术的推广明显地正在改变我们的世界,另一方面,尚无法预知这样的改变将对世界人民的人权和幸福产生何种影响。

这 些新技术本身不会在争取自由与进步的斗争中选择立场。但是,美国要做到立场鲜明。我们支持一个允许全人类平等享有知识和思想的互联网。而且我们认识到,在 世界上建立何种信息基础设施将取决于我们和其他人为之确定的性质。虽然这是一个全新的挑战,但我们确保思想自由交流的责任可追溯至和众国诞生之初。《宪 法》第一修正案的内容字字镌刻在这座大楼前那块50吨重的田纳西大理石上。世世代代的美国人都为捍卫刻在那块石头上的价值观付出了努力。

富兰克林•罗斯福(Franklin Roosevelt)在1941年发表“四项自由”演讲时发扬了这些思想。当时,美国人面临着一系列的危机,此外还有信心危机。但是,对一个人人都享有言论表达自由、信仰自由、没有贫困、没有恐惧的世界的憧憬冲破了他那个时代的重重困难。多年之后,我的楷模之一艾琳娜•罗斯福(Eleanor Roosevelt)努力使这些原则成为《世界人权宣言》的奠基原则。这些原则成为继往开来每一代人的北斗,引导我们、鞭策我们、促使我们在险恶的环境中勇于向前。

在 科学技术飞跃发展的时候,我们必须反思这个传统。我们需要确保科学技术的进步与我们的原则同步。在接受诺贝尔奖时,奥巴马总统讲到需要建设这样一个世界, 让和平建立在每一个人固有的权利和尊严之上。几天后在乔治敦大学关于人权的演讲中,我表示我们必须探索途径,把人权变成现实。今天,我们迫切需要在二十一 世纪的电子世界中保护这些自由。

世 界上有许多其他的网络,有些帮助人员或资源的流动,有些辅助志同道合的个人之间的交流。但互联网是增强所有其他网络的能力和潜力的一个网络,因此,我们认 为确保其使用者享有某些基本自由至关重要。其中最重要的是言论表达自由。这种自由的定义不再仅仅是公民前往市政厅前的广场批评他们的政府,而不担心遭受报 复。博客、电子邮件、社交网络和手机短信开启了交流思想的新途径,也为信息审查带来了新目标。

甚至就在我今天向你们讲演的此刻,某些地方的政府审查人员正在竭力将我的话语从历史的记录中删除。但历史早已作出裁决:这些手法注定失败。两个月前,我在德国参加了推倒柏林墙20周年纪念活动。参加这次活动的各国领导人向这个屏障对面那些英勇的男女志士表示敬意,他们曾经通过散发被称为“地下刊物”(Samizdat)的小册子来阐明反对压迫的道理。这些传单对“东方集团”专制政权的宣传和用心提出了质疑。许多人因散发传单受到残酷迫害,但他们的声音帮助穿透了“铁幕”的钢筋水泥和带刺的铁丝网。

柏林墙象征着一个分隔的世界,代表一个时代。今天,这堵墙的一些碎片就陈列在这座它们理应归属的博物馆里。在我们这个时代,具有代表性的基础设施就是互联网。它取代了分隔,象征着联系。但是,就在网络扩展到世界各国的同时,我们发现许多地方以虚拟的墙壁代替了有形的墙壁。

有 些国家竖起了电子屏障,阻止本国人民分享世界上的一部分网络。他们从搜索引擎提供的结果中删除字词、名称和短语。他们侵犯了那些发表非暴力政治言论的人的 隐私权。这些做法违反了《世界人权宣言》,因为《宣言》告诉我们,人人都有权通过“各种媒体不受疆界限制地寻求、接收和传播信息和思想”。由于这些限制手 段的蔓延,一个新的信息帷幕正在世界上许多地方降临。为穿越这种阻隔,个人视频和博客文章正成为当今时代的“地下刊物”。

正 如过去的专制政权一样,有些政府正在打击那些利用这些工具的独立思考者。在伊朗总统大选后的游行示威期间,用手机拍摄的一位年轻女子遭血腥屠杀的斑驳画面 成为通过数字技术对该政府暴行提出的控诉。我们已看到有报道说,当生活在海外的伊朗人在网上张贴对他们国家领导人的批评时,他们在伊朗的家人便成为报复的 目标。尽管政府普遍采取严厉的恐吓手段,但伊朗英勇的公民记者们继续利用技术向全世界及其同胞报道他们国内发生的事件。伊朗人民为自身的人权呐喊,同时也 鼓舞了全世界,他们的勇气正在重新诠释如何通过技术传播真理和揭露非正义现象。

所 有的社会都承认言论自由有其限度。我们不能容忍煽动他人从事暴力的人,例如此刻正利用互联网在全世界宣扬大规模屠杀无辜百姓的“基地”组织成员。那些以种 族、宗教、族裔、性别或性取向为由攻击他人的仇恨言论也应受到严厉斥责。遗憾的是,这些问题均构成日益严重的挑战,国际社会必须共同进行抗击。我们还必须 解决匿名发表言论的问题。对于那些利用互联网招收恐怖主义分子或传播被盗窃的知识产权的人,不能让他们将其网络行为与其真实身份脱钩。然而,对于那些为了 和平的政治目的利用互联网的人士,这些并不能成为政府有计划地侵犯他们的权利和隐私的托辞。

随 着新技术的传播,言论自由可能是最明显会遇到各种挑战的一项自由权利,但并非仅此而已。信仰自由通常涉及个人与造物主对话或不对话的权利。这是一种不需依 赖技术的交流方式。然而,信仰自由还体现了与拥有共同价值观和人生观的人一起集会的普遍权利。在我们的历史中,这类集会常见于教堂、犹太会堂、清真寺和寺 庙。今天,这类集会也可能在网上进行。

互 联网有助于不同信仰的人消除相互间的分歧。正如总统在开罗所说,宗教自由对于人们能否共同生活至关重要。在我们寻求扩大对话之际,互联网蕴涵着巨大的希 望。我们已开始使美国学生与全世界穆斯林社会的年青人为讨论全球性挑战相互联络。我们将继续利用这个工具,支持不同宗教社群的个人相互讨论。

然 而,某些国家则利用互联网打击和压制宗教人士。例如,去年在沙特阿拉伯,一名男子因在博客上刊登介绍基督教的文章,被捕入狱达数月之久。哈佛大学一项调查 表明,沙特政府封锁了许多介绍印度教、犹太教、基督教乃至伊斯兰教的网页。包括越南和中国在内的一些国家也利用类似手段限制获得宗教信息的途径。

这 些技术不得用于惩罚和平的政治言论,同样也不可用于迫害或压制宗教少数派。祈祷往往在更高层次的网络进行。然而,互联网和社交网站等通讯技术应该有助于提 高人们根据自己的需要进行祈祷的能力,以及与拥有共同信仰的人集会和更多地了解其他人信仰的能力。正如我们促进其他生活领域的自由一样,我们也必须努力促 进在网络上祈祷的自由。

当 然,还有无数人的生活并没享受到这些技术带来的益处。在我们的世界里,正如我多次指出的,才智有可能普及众人,但机会并非如此。从长期获得的经验来看,我 们知道,在人民缺乏途径获得知识、市场、资本和机会的国家,要促进社会和经济发展会十分艰难,有时则徒劳无功。在这种情况下,互联网可发挥调节器的作用。 通过向人们提供获得知识和潜在市场的途径,各种网络可为那些缺乏机会的地区创造机会。

在过去一年中,我在肯尼亚亲眼目睹了这种情况。那里的农牧民在开始使用移动银行技术后,收入提高了多达30%。在孟加拉,30多万人报名通过手机学习英语。在非洲撒哈拉沙漠以南地区,妇女企业家使用互联网获得小型贷款并与全球市场接轨。

世界上经济地位最低的亿万人民有可能在生活中效仿上述取得进步的实例。在很多情况下,互联网、手机和其他通讯技术能对经济发展起到绿色革命(Green Revolution)对农业所起的同等作用。现在,小小的投入便能产生巨大效益。世界银行的一项研究显示,在一个典型的发展中国家,手机普及率每增加10%,人均国内生产总值便能增长将近1%。具体而言,如果以印度为例,那将相当于每年近100亿美元。

与全球信息网络连通就好比踏上了通往现代化的阶梯。在这些技术问世的最初几年,许多人以为它们将在世界上的富人和穷人之间划出鸿沟,但那种情况并没有发生。今天共有40亿只手机在使用。手机使用者中有很多是小贩、人力车夫和其他历来缺乏受教育及其他机会的人。信息网络是实现平等的有力手段,我们应共同使用这些技术帮助人们摆脱贫困,不再有匮乏之虞。

我 们完全有理由满怀希望:当人们充分利用信息网络和通讯技术时,他们将能取得巨大进步。但毫无疑问,也有些人正在利用全球信息网络实现其阴暗目的,而且将继 续这样做。暴力极端主义分子、犯罪集团、性犯罪者和独裁政府都妄图对全球网络加以利用。正如恐怖主义分子利用我们社会的开放性趁机实施阴谋,暴力极端主义 分子也要利用互联网进行煽动和恐吓。当我们努力增进这些自由时,我们也必须打击妄图利用通讯网络进行破坏并制造恐惧的人。

各国政府和公民必须保持信心,作为国家安全和经济繁荣核心环节的网络是安全且有韧性的。这不仅仅是几个小黑客污损几个网站的问题,如果我们的信息网络安全得不到保障,我们的网上银行业务、电子商务活动以及保护亿万美元知识产权的能力就全都岌岌可危。

面 对破坏这些系统的活动,各国政府、民营部门和国际社会必须协调一致地采取行动。当黑客犯罪分子和有组织犯罪集团为非法牟利攻击网络时,我们需要更多的工具 帮助执法机构进行跨辖区的合作。儿童色情以及遭到贩运的妇女和女童所受的剥削通过互联网为整个世界所见并为剥削者借以牟利,对这种社会弊病也应采取同样的 应对措施。欧洲理事会在网络犯罪公约(Convention on Cybercrime )方面的努力及其他方的类似努力促成了对此类犯罪起诉的国际协作,我们对此表示赞赏。我们还希望为此加倍努力。

我 国政府及国务院已经采取措施寻求通过外交方式来加强全球网络安全。国务院有大批人员从事这项工作。有关人员一直在协同努力。我们还在两年前设立了一个专门 协调有关网络的对外政策的办公室。我们致力于在联合国和其他多边论坛应对这一挑战,并把网络安全问题列入世界性议题。奥巴马总统刚刚任命了一位新的国家网 络政策协调员,来帮助我们更紧密地协调工作,以确保每个人的网络都是自由、安全和可靠的。

某 些国家、恐怖主义分子以及他们的代理人必须明白,美国将保护我们的网络系统。那些在我们国家或任何其他国家破坏信息自由流通的人对我们的经济、我们的政府 和我们的公民社会构成了威胁。从事网络攻击的国家和个人将承担后果并受到国际社会的谴责。在一个靠互联网连通的世界里,对一个国家的网络的攻击就是对所有 人的攻击。通过强调这一点,我们可以在国家间建立行为准则,并鼓励尊重全球网民。

最 后一项自由或许是罗斯福总统与夫人多年前所思考和论述的自由的必然内含,它源于我前面已提到的四项自由,这就是连接自由:政府不应阻止人民与互联网、与网 站或与彼此连接。连接自由如同集会自由一样,只不过它是在网络空间。这一自由允许个人上网,聚集,希望还有合作。一旦上网,你不必是大亨或摇滚乐明星便能 对社会产生巨大影响。

对孟买恐怖主义袭击的最大规模的公众反应是由一位13岁少年发起的。他使用社交网络组织了献血运动,并建立了一个大型跨宗教信仰的吊唁簿。在哥伦比亚,一位失业的工程师召集起全世界190个城市的1200万人,向哥伦比亚革命武装力量(FARC)的恐怖活动发出抗议。这些抗议是历史上规模最大的反恐怖主义示威活动。在随后几个星期中,哥伦比亚革命武装力量经历了十年军事行动中人数最多的弃甲和脱队事件。在墨西哥,一位对毒品暴力行径忍无可忍的公民发出的一份电子邮件像滚雪球一般发展成遍及该国所有32个省的大型示威活动。仅在墨西哥城就有15万人上街抗议。因此,互联网能有助于人道社会抵制鼓吹暴力、犯罪和极端主义的人。

在伊朗、摩尔多瓦以及其他国家,网上的组织动员已成为促进民主、使公民对可疑的选举结果表达抗议的重要工具。甚至在美国等已建立民主制度的国家,我们也看到这些工具具有改变历史的力量。你们当中有些人可能还记得这里2008年的总统选举。(笑声)

与这些技术相连接的自由可以帮助转变社会,但同时也对个人极其重要。我最近被一位医生的故事所感动——我不想说出他是哪个国家的人。他千方百计要为女儿的罕见疾病作出诊断。他征询了20多位专家的意见,但仍然没有答案。最后,他是靠互联网搜索引擎得到了确切的诊断并找到了治疗方法 。这就是不受限制地使用搜索引擎技术之所以对个人生活如此重要的原因之一。

我 今天概述的这些原则将成为我们对待互联网自由及其技术使用问题的指导方针。我要谈谈我们在实践中是如何应用这些原则的。美国致力于为促进这些自由投入必要 的外交、经济和技术资源。美国是一个由来自各个国家、反映全球各种利益的移民组成的国家。我们的外交政策基于这样一种理念:当人民之间和国家之间合作时, 美国比任何其他国家都受益。当冲突与误解造成国家间的不合时,美国肩负着比任何国家都更沉重的负担。因此,我们处于有利位置,可以抓住这些随相互连接而来 的机遇。我们作为如此众多技术的诞生地,有责任确保它们从善使用。为此,我们需要建立能力,以推行我们在国务院称之为21世纪外交方略的规划。

重 新调整我们的政策和我们的工作重点并非易事,而适应新技术也鲜有捷径。当电报技术开始使用时,它给外交界许多人带来严重焦虑,因为天天收到发自华盛顿的指 示不是一个百分之百令人欢迎的前景。但正如我们的外交人员最终还是掌握了电报一样,他们也在为掌握这些新工具的潜力而努力。

我引以为豪的是,国务院已经在40多个国家展开努力,帮助那些声音被压制性政府扼杀的人。我们也在努力使这个问题成为联合国的工作重点。我们正在将互联网自由纳入我国重新进入联合国人权理事会(United Nations Human Rights Council)后提出的第一项决议案中。

我 们还支持开发新工具,使公民能够避开政治审查而行使其自由表达的权利。我们正在为世界各地的团体和组织提供资金,确保将这些新工具以当地语言版本提供给需 要的人,并为他们提供安全上网所需的培训。美国支持开展这些努力已有一段时间,侧重于尽可能切实有效地实施这些项目。美国人民应当知道,对互联网进行审查 的国家也应当明白,我国政府致力于促进互联网自由。

我们希望让人们掌握这些工具,用以增进民主和人权,应对气候变化和流行病,为实现奥巴马总统提出的一个没有核武器的世界的目标争取全球支持,鼓励可持续的经济发展,帮助改善底层人民的生活。

因 此,我今天宣布,未来一年中,我们将与实业界、学术界和非政府组织的合作伙伴一道,确立发挥联网技术威力的长期努力,利用这些技术推进我们的外交目标。我 们可以依靠手机、测绘应用软件和其他新工具来增进公民权能,辅助我们的传统外交。我们能够解决目前创新市场存在的缺陷。

请让我举一个例子。假设我想设计一种手机应用软件,让人们能够对包括我国政府在内的各政府部门的责任心和工作效率打分,并能够发现和报告腐败行为,实现这一设想所需的硬件已在几十亿潜在用户的手中,而且所需软件的开发和应用成本较低。

如 果人们利用这项技术,就可以帮助我们有的放矢地使用对外援助经费、改善人民的生活并鼓励外国投资方对负责任的政府投资。但目前的情况是,移动应用技术开发 商尚无资金援助来自行开发这项技术,而国务院现在还缺乏使之成为可能的机制。不过,这项行动应当有助于解决这一问题,并且使小笔创新投资能够带来长期回 报。我们将与专家共同努力,为这种风险投资项目确定最佳框架。我们还将需要科技公司和非营利机构的人才和资源,才能尽快取得最佳效果。因此,在座各位如有 此类才干和专长,我谨在此邀请你们鼎力相助。

与 此同时,有些公司、个人和机构正在设计和开发各种已经能够推进我们的外交和发展目标的创意和应用技术,而国务院将展开一项创新竞赛活动,让这项工作立刻得 到推进。我们将邀请美国人提交应用软件和有关技术的最佳创意,它们应能有助于消除语言障碍、克服文盲局限、将人们与他们所需要的服务和信息连通。例如,微 软公司已经开发出网络医生软件的原型,以便为偏远地区提供医疗服务。我们希望看到更多这样的创意。我们将与竞赛获奖者合作,为帮助他们进一步发展创意提供 资金。

这些新的计划将大大充实我们过去一年来的重要工作。为了促进我们的外事和外交目标,我召集了一个有才干而且经验丰富的团队,领导我们就21世纪外交方略展开的努力。这个团队前往世界各地,协助各国政府和团体善用连接技术的益处。他们发起“公民社会2.0行动”(Civil Society 2.0 Initiative), 协助基层组织进入数字时代。他们在墨西哥制定了一个协助打击毒品暴力的方案,让民众向可靠的来源作出不露痕迹的检举,以免遭受报复。他们也将移动银行带进 阿富汗,现在正在刚果民主共和国进行同样的工作。在巴基斯坦,他们建立了一个首创的移动社交网络,称为“我们的声音”(Our Voice)。这个网络已经产生了数千万条讯息,并将希望抵制暴力极端主义的巴基斯坦年轻人联系在一起。

在短短时间内,我们已经取得了长足的进展,将这些技术的承诺转变成深富影响力的结果。可是仍有许多方面尚待努力。在我们和民营部门及外国政府联手推广21世纪外交方略的工具时,我们必须谨记彼此都有责任捍卫我在今天所谈的自由。我们坚信,信息自由这样的原则不仅是良好的政策,也不仅和我们的国家价值观相连,它还具有普世性,并能产生经济效益。

用 市场语言来说,一家在突尼斯或越南的审查环境中运营的上市公司,其交易价格总是低于在自由社会运营的同类公司。如果企业的决策者没有全球性的新闻和信息来 源,投资者对其决策的信心终将下降。实施新闻和信息审查的国家必须认识到,从经济角度而言,审查政治言论和商业言论是没有区别的。如果贵国的企业无法获取 其中一类信息,其增长必将受到影响。

在制定商业决策时,美国公司日益将网络和信息自由视为更重要的考量因素。我希望他们的竞争对手和外国政府会密切关注这一趋势。最近有关谷歌(Google)的情况引起了广泛的注意。我们希望中国当局对导致谷歌作出日前宣布的网络攻击事件进行彻查。我们也希望调查及结果透明。

互 联网已经成为中国取得巨大进步的源泉之一,令人惊叹。中国现在有如此多的人都在上网。但是,限制自由获取信息或侵犯互联网用户基本权利的国家面临着使自己 与下一个世纪的进步隔绝的风险。美中两国对于这个议题的看法不同,我们希望在两国积极、合作、全面的关系之下坦诚和持续地处理这些差异。

这个议题不仅关系到信息自由,最终还关系到我们希望有一个什么样的世界以及我们将会生活于一个什么样的世界。它关系到我们生活的地球是有一个互联网、一个全球社会以及一个造福并联系全人类的共同知识体,还是支离破碎、获取信息和机遇要取决于居住地点和审查者的心血来潮。

信息自由有助于维护作为全球进步基础的和平与安全。从历史上看,不对称的信息获取能力是国家间冲突的主要原因之一。在我们面对严重纠纷或危险事件时,当事双方能够了解相同的事实和观点是至关重要的。

目 前的情况是,美国人民可以思考外国政府提供的信息——对于这些政府向美国国内传送信息,我们不设置障碍。但是,在实行信息检查的社会中生活的公民却无从得 知外界的看法。例如在北韩,政府极力使其公民与外部意见完全隔绝。这种信息流通的不对称不但增加了发生冲突的可能性,也容易使微小的分歧升级。因此,我期 待那些希望看到全球稳定的负责政府能和我们携手合作,改变这种不对称的情况。

对 公司而言,这个问题所关系的不仅是道德威望,而且涉及公司与用户之间的信任。世界各地的用户都希望自己所依赖的互联网公司会提供全面的搜索结果,并且以负 责任的态度守护他们的个人信息。获得这种信赖并且基本上提供这种服务的公司将在全球市场蓬勃发展。我确实相信,那些失去用户信赖的公司,最终将失去用户。 住在任何地方的人都希望知道,他们放在网上的东西不会被用来加害于自己。

审查不应被世界任何地方的任何公司以任何形式接受。在美国,美国公司需要采取有原则的立场。这应该成为我们国家品牌的组成部分。我相信全世界的用户都会回报尊重这些原则的公司。

我们正在重振“全球互联网自由小组”(Global Internet Freedom Task Force),作为应对全球网络自由所受威胁的论坛。我们敦促美国媒体公司主动采取措施,质疑外国政府对于审查和监视的要求。民营部门也有责任协助保护言论表达自由。当他们的业务交易有可能破坏这种自由时,他们需要考虑什么是正确的,而不只是寻求短视的利润。

我们对于目前通过“全球网络倡议”(Global Network Initiative) 所做的工作倍感鼓舞。“全球网络倡议”是一项由高科技公司与非政府组织、学术专家和社会投资基金共同合作,回应政府审查要求而做出的自愿努力。这项倡议不 仅仅是申明原则,更是建立旨在宣扬真正责任感和透明度的机制。我们承诺支持负责任的民营部门参与护卫信息自由,作为我们承诺的组成部分,国务院将在下月召 集一次高层会议,由罗伯特•霍马茨(Robert Hormats)和玛丽亚•奥特罗(Maria Otero)两位副国务卿共同主持。会议将召集提供网络服务的公司,共同讨论互联网自由问题,因为我们希望与合作伙伴共同应对这个二十一世纪的挑战。

我 相信,追求我今天所说的自由是正确之举,但它也是智慧之举。通过推进这个议程,我们将使我们的原则、我们的经济目标以及我们的战略重点一致起来。我们需要 努力创建这样一个世界:在这个世界中,网络和信息使人民之间的关系更加密切,也使我们的全球社区概念得到扩展。鉴于我们面临的诸多巨大挑战,我们需要世界 各地的人民汇合他们的知识和创造力,帮助重建全球经济,保护我们的环境,战胜暴力极端主义,建设每一个人都能充分发挥和实现其天赋潜力的未来。

在 结束今天的讲话时,我要请你们记住星期一在太子港的废墟中获救的那个小女孩。她还活着,已经与她的家人团聚,并将有机会长大成人,因为网络把一个被埋得很 深的声音传播到全世界。我们不能容许任何国家、群体或个人继续被埋在压制的废墟之下。当层层审查墙把一些人与人类大家庭隔离开来的时候,我们不能袖手旁 观。我们不能因为听不到那些人的呼喊就对这些问题保持沉默。

因此,让我们重新作出承诺,为这一事业而努力。让我们把这些高科技化作推动全世界取得切实进步的力量。让我们并肩前进,倡导这些自由——为了我们这个时代,也为了应当得到我们所能给予的每一个机会的年轻人。

非常感谢你们。(掌声)

标签: ,

liboi – 管理基于OpenInkpot的电子书设备的支持库

2009年12月23日 没有评论

自从用了OpenInkpot,并且推荐了几个用v3的朋友换成OpenInkpot之后,越发觉得,对于普通用户来说,管理阅读器相当的麻烦,三天两头就需要提供技术支持,从安装字体到拷贝书籍再到配置系统,不一而足。

因为OpenInkpot在V3上使用USB RNDIS驱动连接阅读器和PC,并且通过SSH的方式连接设备,但是SSH的设置步骤复杂,而且在Vista x64和Win7这种比较新的操作系统上面总有些问题,对用户要求比较高。

其实V3的这种连接模式比较像Windows Mobile手机的方式,这种方式在具有一个客户端的时候有很大的灵活性,例如WM手机的Active Sync。另外就是等待OI支持USB Mass Storage,即模拟一个U盘出来的方式,但是看起来一时半会儿也没有做的计划。

但是OI有它的好处,就是很多可以自定义的东西,例如阅读器的键绑定——我一直想把翰林V3左侧的翻页键互换——但是修改的方式需要用户ssh到阅读器修改。这对于普通用户来说简直就是噩梦。

同时,OI还有一些问题,例如在0.2 rc5当中添加的libextract,即在书架模式下显示书籍的元信息,而不是文件名,在很多时候其实是有问题的。官方的绕过方式是重命名一个文件,但是同样需要ssh到阅读器修改。

由于这些问题,最好有一个可以用来管理电子书设备的客户端软件。这个软件也许可以做下面的事情:

  1. 自动配置电子书的USB RNDIS连接
  2. 书籍搜索、下载和同步
  3. 数据的同步,例如书签
  4. 状态备份和恢复,例如当前阅读的图书的页码,书籍版式(横屏,切白边等)。
  5. 安装字体
  6. 设备软件更新
  7. 设备配置修改,例如修改键绑定
  8. 其他工具性的功能,例如拷屏

等等。

但是前提是要有一个客户端软件。因此最近先整了一个基础库,取名 liboi,即lib-openinkpot之意,host在Google Code上面: http://code.google.com/p/liboi/。经过几个星期的晚上+周末的工作,现在把0.1版本放出来,这个版本支持最简单的功能:

  1. 根据默认的SSH配置连接阅读器。
  2. 获取阅读器信息,类似OpenInkpot版本号
  3. 在阅读器当中执行命令(有了这个功能剩下的就是想象力了)

目前只支持Linux平台,请在项目主页上下载源码包自行编译。源码包当中有oish.c文件,会生成一个oish(OpenInkpot Shell)的程序,可以作为例子程序使用。

后面的事情,主要包括:

  1. 拷贝文件,包括拷进来和拷出来。
  2. Windows Porting
  3. SSH自动配置

另外招募擅长客户端界面的同仁开发客户端GUI,我要做的话估计界面会很丑。当然了,没报酬,代码开源,纯自愿参与。

标签: , ,

Python multiprocessing 使用手记[3] – 关于Queue

2009年12月13日 没有评论

继续讨论Python multiprocessing,这次讨论的主要内容是mp库的核心组件之一的Queue。

Queue是mp库当中用来提供多进程对象交换的方式。对象交换和上一部分当中提到的对象共享都是使多个进程访问同一个对象的方式,两者的区别就是,对象共享是多个进程访问同一个对象,对象交换则是将对象从一个进程传输的另一个进程。

multiprocessing当中的Queue使用方式和Python内置的threading.Queue对象很像,它支持一个put操作,将对象放入Queue,也支持一个get操作,将对象从Queue当中读出。和threading.Queue不同的是,mp.Queue默认不支持join()和task_done操作,这两个支持需要使用mp.JoinableQueue对象。

由于Queue对象负责进程之间的对象传输,因此第一个问题就是如何在两个进程之间共享这个Queue对象本身。在上一部分所言的三种共享方式当中,Queue对象只能使用继承(inheritance)的方式共享。这是因为Queue本身基于unix的Pipe对象实现,而Pipe对象的共享需要通过继承。因此,在一个典型的应用实现模型当中,应该是父进程创建Queue,然后创建子进程共享该Queue,由父进程和子进程分别读写。例如下面的这个例子:

import multiprocessing
 
q = multiprocessing.Queue()
 
def reader_proc():
    print q.get()
 
reader = multiprocessing.Process(target=reader_proc)
reader.start()
 
q.put(100)
reader.join()

另一种实现方式是父进程创建Queue,创建多个子进程,有的子进程读Queue,有的子进程写Queue,例如:

import multiprocessing
 
q = multiprocessing.Queue()
 
def writer_proc():
    q.put(100)
 
def reader_proc():
    print q.get()
 
reader = multiprocessing.Process(target=reader_proc)
reader.start()
writer = multiprocessing.Process(target=writer_proc)
writer.start()
 
reader.join()
writer.join()

由于使用继承的方式共享Queue,因此代码当中并没有明显的传输Queue对象本身的代码,看起来似乎只要将multiprocessing当中的对象换成threading当中的对象,程序仍然能够工作。反之,拿到一个现有的多线程程序,是不是将threading改成multiprocessing就可以工作呢?也许可以,但是更可能的情况是你会遇到很多问题。

第一个问题就是mp的Queue需要考虑多进程之间的对象传输,因此所传输的对象必须是可以pickle的。否则,在Queue的put操作上会抛出PicklingError。

其他的一些差异表现在一些技术细节上,这些不是任何高层逻辑可以抽象掉的,不知道这些差异会导致一些潜在的错误,例如死锁。在总结这些潜在的犯错的可能的同时,我们会简单看一下mp当中Queue的实现方式,以便能够方便的理解为什么会有这样的行为。这些实现问题仅仅针对Linux,Windows上面的实现和出现的问题在这里不涉及。

mp.Queue建构在系统的Pipe之上,但是实际上进程并不是直接将对象写入到Pipe里面,而是先写入一个本地的buffer,再由一个专门的feed线程将其放入Pipe当中。读取端则是直接从Pipe当中读出对象。之所以有这样一个feed线程,是为了能够提供Queue接口函数所需要的put的超时控制。但是由于这个feed线程的存在,mp.Queue提供了几个额外的函数来控制它,一个函数close来停止该线程,以及join_thread来join该线程。close同时负责把所有在buffer当中的对象刷新到Pipe当中。

但是这个feed线程也是个麻烦制造者,为了保证所有被放入Queue的东西最终都能够到达另外一端的进程,mp库注册了一个atexit的处理函数,用来在进程退出的时候自动close并且join该feed线程。这个join动作带来了很多问题,比如潜在的死锁。考虑下面一种状况:一个父进程创建了两个子进程,一个子进程读,另一个子进程写。当需要停止这些进程的时候,父进程如果先把读进程结束,但是同时写进程已经将太多的对象写入Queue,导致后继的对象等待在buffer当中,则这个进程将无法终止,因为atexit的处理函数等待把所有buffer当中的对象放入Pipe,但是Pipe已经满了,然后陷入了死锁。

有人可能会问,那只要保证总是按照数据流的顺序来停止进程不就行。问题是在很多复杂的系统流程当中,可能存在一个环形的数据流,这种情况下,无论按照什么顺序停止进程,终究有一个进程可能陷入这种情景当中。

幸运的是,Queue对象还提供了一个成员函数cancel_join_thread,这个函数可以使得在进程停止的时候不进行join操作,这样可以避免死锁,代价就是这个时候尚未刷新到Pipe当中的对象都会丢失。鉴于即使调用了join_thread,残留在Pipe当中的对象仍然可能丢失,所以一旦选择使用mp的Queue对象,就不要假设不会在流程当中丢对象了。

另外一个可能的方案是使用mp库当中的SimpleQueue对象。这个对象在文档当中没有提及,但是在multiprocessing.queue模块当中有定义。这个对象就是去掉了buffer的Queue对象,因此可能能够避免上面说的问题的。但是SimpleQueue没有提供put和get的超时处理,两个动作都是阻塞的。

除了使用multiprocessing.Queue,还可以使用multiprocessing.Pipe进行通信。mp.Pipe是Queue的底层结构,但是没有feed线程和put/get的超时控制。一定程度上和SimpleQueue很像。需要注意的是Pipe带有一个参数 duplex,当设置为True(默认)的时候,Pipe并不是使用系统的pipe来实现,而是通过socketpair,即Unix Domain Socket来实现。这个和pipe相比有些微的性能差异。

另外一个使用Queue的方式不是mp库内置的。这种方式使用上一篇文章当中提到的server process的方式来共享一个Queue对象。这个Queue对象实际上在server process当中,所有的子进程通过socket连接到server process获取该Queue的代理对象进行操作。说到这有人会想起来mp库有一个内置的SyncManager对象,可以通过multiprocess.Manager函数获取到,通过该对象的Queue方法可以获取一个Queue的代理对象。不幸的是,这个方法不是正确的获取Queue的方式,原因正如上一篇文章所说,SyncManager.Queue方法的每次调用获取到的是一个新建对象的代理对象,而不是一个共享对象。正确的使用server process当中的Queue的方式是:

共同部分:

import multiprocessing.managers as mpm
import Queue
 
class SharedQueueManager(mpm.BaseManager): pass
q = Queue.Queue()
SharedQueueManager.register('Queue', lambda: q)

服务进程:

mgr = SharedQueueManager(address=('', 12345))
server = mgr.get_server()
server.serve_forever()

客户进程:

mgr = SharedQueueManager(address=('localhost', 12345))
mgr.connect()
q = mgr.Queue() # 这里q就是共享的Queue对象的代理对象

这种方式比起mp库内置的Queue,有一些性能上的影响,因为毕竟牵涉到多次网络通讯,但是带来的好处是没有feed线程带来的一系列问题,而且理论上不会存在丢数据的问题,除非server process崩溃。但是正如上一篇所说,server process本身就不是很靠谱的,因此这里也只是“理论上”不会丢数据而已。

说到性能,这里就列两个性能数据,以前在twitter上面提到过的(这两个连接无法访问的请联系我):

操作对象为 pickle后512字节的对象,通过proxy操作Queue的性能大约是7000次/秒(本机)或1100次/秒(多机),如果使用 multiprocessing.Queue,效率可达54000次/秒。

Python multiprocessing 使用手记[2] – 跨进程对象共享

2009年12月7日 没有评论

继续写关于Python multiprocessing的使用手记,继上次的进程模型之后,这次展开讨论一下multiprocessing当中的跨进程对象共享的问题。

在mp库当中,跨进程对象共享有三种方式,第一种仅适用于原生机器类型,即python.ctypes当中的类型,这种在mp库的文档当中称为shared memory方式,即通过共享内存共享对象;另外一种称之为server process,即有一个服务器进程负责维护所有的对象,而其他进程连接到该进程,通过代理对象操作服务器进程当中的对象;最后一种在mp文档当中没有单独提出,但是在其中多次提到,而且是mp库当中最重要的一种共享方式,称为inheritance,即继承,对象在父进程当中创建,然后在父进程是通过multiprocessing.Process创建子进程之后,子进程自动继承了父进程当中的对象,并且子进程对这些对象的操作都是反映到了同一个对象。

这三者共享方式各有特色,在这里进行一些简单的比较。

首先是共享方式所应对的对象类型,看这个表:

共享方式 支持的类型
Shared memory ctypes当中的类型,通过RawValue,RawArray等包装类提供
Inheritance 系统内核对象,以及基于这些对象实现的对象。包括Pipe, Queue, JoinableQueue, 同步对象(Semaphore, Lock, RLock, Condition, Event等等)
Server process 所有对象,可能需要自己手工提供代理对象(Proxy)

这个表总结了三种不同的共享方式所支持的类型,下面一个个展开讨论。

其中最单纯简单的就是shared memory这种方式,只有ctypes当中的数据类型可以通过这种方式共享。由于mp库本身缺少命名的机制,即在一个进程当中创建的对象,无法在另外一个进程当中通过名字来引用,因此,这种共享方式依赖于继承,对象应该由父进程创建,然后由子进程引用。关于这种机制的例子,可以参见Python文档当中的例子 Synchronization types like locks, conditions and queues,参考其中的test_sharedvalues函数。

然后是继承方式。首先关于继承方式需要有说明,继承本质上并不是一种对象共享的机制,对象共享只是其副作用。子进程从父进程继承来的对象并不一定是共享的。继承本质上是父进程fork出的子进程自动继承父进程的内存状态和对象描述符。因此,实际上子进程复制了一份父进程的对象,只不过,当这个对象包装了一些系统内核对象的描述符的时候,拷贝这个对象(及其包装的描述符)实现了对象的共享。因此,在上面的表当中,只有系统内核对象,和基于这些对象实现的对象,才能够通过继承来共享。通过继承共享的对象在linux平台上没有任何限制,但是在Windows上面由于没有fork的实现,因此有一些额外的限制条件,因此,在Windows上面,继承方式是几乎无法用的。

最后就是Server Process这种方式。这种方式可以支持的类型比另外两种都多,因为其模型是这样的:

server process模型

server process模型

在这个模型当中,有一个manager进程,负责管理实际的对象。真正的对象也是在manager进程的内存空间当中。所有需要访问该对象的进程都需要先连接到该管理进程,然后获取到对象的一个代理对象(Proxy object),通常情况下,这个代理对象提供了实际对象的公共函数的代理,将函数参数进行pickle,然后通过连接传送到管理进程当中,管理进程将参数unpickle之后,转发给相应的实际对象的函数,返回值(或者异常)同样经过管理进程pickle之后,通过连接传回到客户进程,再由proxy对象进行unpickle,返回给调用者或者抛出异常。

很明显,这个模型是一个典型的RPC(远程过程调用)的模型。因为每个客户进程实际上都是在访问manager进程当中的对象,因此完全可以通过这个实现对象共享。

manager和proxy之间的连接可以是基于socket的网络连接,也可以是unix pipe。如果是使用基于socket的连接方式,在使用proxy之前,需要调用manager对象的connect函数与远程的manager进程建立连接。由于manager进程会打开端口接收该连接,因此必要的身份验证是需要的,否则任何人都可以连上manager弄乱你的共享对象。mp库通过authkey的方式来进行身份验证。

在实现当中,manager进程通过multiprocessing.Manager类或者BaseManager的子类实现。BaseManager提供了函数register注册一个函数来获取共享对象的proxy。这个函数会被客户进程调用,然后在manager进程当中执行。这个函数可以返回一个共享的对象(对所有的调用返回同一个对象),或者可以为每一个调用创建一个新的对象,通过前者就可以实现多个进程共享一个对象。关于这个的用法可以参考Python文档当中的例子“Demonstration of how to create and use customized managers and proxies”。

典型的导出一个共享对象的代码是:

ObjectType object_
class ObjectManager(multiprocessing.managers.BaseManager): pass
ObjectManager.register("object", lambda: object_)

注意上面介绍proxy对象的时候,我提到的“公共函数”四个字。每个proxy对象只会导出实际对象的公共函数。这里面有两个含义,一个是“公共”,即所有非下划线开头的成员,另一个是“函数”,即所有callable的成员。这就带来一些限制,一是无法导出属性,二是无法导出一些公共的特殊函数,例如__get__, __next__等等。对于这个mp库有一套处理,即自定义proxy对象。首先是BaseManager的register可以提供一个proxy_type作为第三个参数,这个参数指定了哪些成员需要被导出。详细的使用方法可以参见文档当中的第一个例子。

另外manager还有一些细节的问题需要注意。由于Proxy对象不是线程安全的,因此如果需要在一个多线程程序当中使用proxy,mp库会为每个线程创建一个proxy对象,而每个proxy对象都会对server process创建一个连接,而manager那边对于每个连接都创建一个单独的线程来为其服务。这样带来的问题就是,如果客户进程有很多线程,很容易会导致manager进程的fd数目达到ulimit的限制,即使没有达到限制,也会因为manager进程当中有太多线程而严重影响manager的性能。解决方案可以是一个进程内cache,只有一个单独的线程可以创建proxy对象访问共享对象,其余线程只能访问该进程当中的cache。

一旦manager因为达到ulimit限制或者其他异常,manager会直接退出,遗憾的是,这时候已经建立的proxy会试图重新连接manager – 但是它已经不存在了。这个会导致客户进程hang在对proxy的函数调用上,这个时候,目前除了杀掉进程没有找到别的办法。

另外proxy使用socket的方式比较tricky,因此和内置的socket库有很多冲突,比如socket.setdefaulttimeout(Python Issue 6056 )。在setdefaulttimeout调用了之后,进程当中所有通过socket模块建立的socket都是被设置为unblock模式的,但是mp库并不知道这一点,而且它总是假设socket都是block模式的,于是,一旦调用了setdefaulttimeout,所有对于proxy的函数调用都会抛出OSError,错误代码为11,错误原因是非常有误导性的“Resource temporarily unavailable”,实际上就是EAGAIN。这个错误可以通过我提供的一个patch来补救(这个patch当中还包含其他的一些修复,所以请自行查看并修改该patch)。

由于以上的一些原因,server process模式作为一个对象的共享模式,能够提供最为灵活的共享方式,但是也有最多的问题。这个在使用过程当中就靠自己去衡量了。目前我们的系统对于数据可靠性方面要求不高,丢失数据是可以接受的,但是也只用这种模式来维护统计值,不敢用来维护更多的东西。

关于跨进程共享对象的问题就写到这里,后面内容待续……

test_sharedvalues

Python multiprocessing 使用手记[1] – 进程模型

2009年11月10日 没有评论

首先从multiprocessing的进程模型开始看。

multiprocessing的目的是创建一个接口和python.threading类似接口的库,用多进程的方式来并发处理。因此创建一个新的进程的的方法也和python.threading很像:

import multiprocessing
 
def dosomething(a,b,c): pass
 
p = multiprocessing.Process(target=dosomething, args=(1,2,3))
p.start()
p.join()

创建的这个新的进程在*nix上面使用的是fork,这意味着子进程开始执行的时候具有与父进程相同的全部内容。请记住这点,这个将是下面我们讨论基于继承的对象共享的基础。所谓基于继承的对象共享,是说在创建子进程之前由父进程初始化的某些对象可以在子进程当中直接访问到。在Windows平台上,因为没有fork语义的系统调用,基于继承的共享对象比*nix有更多的限制,最主要就是体现在要求Process的__init__当中的参数必须可以Pickle。

但是,并不是所有的对象都是可以通过继承来共享,只有multiprocessing库当中的某些对象才可以。例如Queue,同步对象,共享变量,Manager等等。

在一个multiprocessing库的典型使用场景下,所有的子进程都是由一个父进程启动起来的,这个父进程称为master进程。这个父进程非常重要,它会管理一系列的对象状态,一旦这个进程退出,子进程很可能会处于一个很不稳定的状态,因为它们共享的状态也许已经被损坏掉了。因此,这个进程最好尽可能做最少的事情,以便保持其稳定性。

OpenInkpot 2.0-rc4 新界面

2009年11月9日 没有评论

开源e-ink电子阅读器固件 OpenInkpot 前两天发布了 rc4 版本,该版本最大的可见改变是在选择列表当中将原来作为背景显示的数字单独抽出来作为一列显示。不过我还是觉得,以前那种作为背景显示的方式更好。

rc3之前的OpenInkpot界面

rc3之前的列表界面

rc4之后的列表界面

rc4之后的列表界面

标签:

Python multiprocessing库使用手记(引子)

2009年11月9日 2 条评论

前段时间在做的一个Python项目,需要实现一个后台服务程序,程序流程比较复杂,而且可能经常变动,但是如果把整个流程切分成一些步骤,每个步骤有自己的输入输出和处理。只要将他们的输入输出接在一起,进行不同的组合就可以实现常见的流程变动。

使用多进程的原因是考虑到Python的全局解释器锁(Global Interceptor Lock, GIL)。由于GIL的存在,在CPU密集型的程序当中,使用多线程并不能有效地利用多核CPU的优势,因为一个解释器在同一时刻只会有一个线程在执行。要想尽可能利用多核CPU并发,多进程是必需的。

引入多进程就带来几个问题:首先是这种设计方案需要一个类似于UNIX Pipe的底层结构,说的更确切一点就是message queue,操作类似于Python的Queue.Queue。另一个问题就是需要一个进程间信息共享的基础设施。

先说Queue,这个Queue需要满足下面一些需求,优先级递减:

  • 轻量 – 不需要依赖数据库等比较重型的程序。代价就是丢点东西没关系;
  • 跨进程 – 读端和写端可以不在一个进程当中;
  • 支持多进多出 – 读端和写端都要支持多个进程;
  • 稳定和高效 – 这个就不用多说了吧;
  • 有Pythonçš„API,再不济要有Cçš„API可以让我写Pythonçš„binding。

另外是进程间共享的设施,系统shm是迫不得已使用的,因为要自己处理Pickling和Unpickling,以及一些杂七杂八的竞争条件问题。有建构在上面的现成的库最好。

最终出于轻量的考虑,选定了Python的multiprocessing库,而没有用IPC MQ 或 RabbitMQ。这个库在Python2.6被引入到标准库当中,有为2.5提供的backport。因为我们的系统使用的是2.5版本,因此我们使用的其实是2.5的backport。这个实现除了一些细枝末节的地方之外,核心实现和2.6标准库当中是完全一样的。

在使用过程当中,遇到了挺多的问题,在这里一一记录。

Firefox更新了一把

2009年10月18日 1 条评论
标签: ,

一个有趣的东西:MIT Personas

2009年10月1日 没有评论

http://personas.media.mit.edu/

简单的说,这个东西就是告诉你“在互联网上,你看起来具有什么样的人格”,也就是说,因姐姐怎么看你呢?。

Personas 是MIT媒体实验室 (Media Lab) 研究员Aaron Zinman和他的伙伴们做的一个数据挖掘系统,利用了很多先进的理论和算法,来构造一个人在互联网上的全局视角。有点好玩。

ftofficerçš„personas

ftofficerçš„personas

不过由于重名的人很多,不可避免会有很大的误差,而且貌似只能理解英文?还好我的ID全球唯一一份,结果应该还算比较靠谱吧。不过结果使用一条长长的条状图来表示,但是每个项目的解释并没有找到,有几个项目,例如genealogy就不知道代表什么。另外,我的legal和illegal竟然一样大小,而religion (宗教) 如此的长。我可是一个行为上遵纪守法的无神论者,难道只是因为我说的太多了……

附:

Personas of Mao Zedong

Personas of Mao Zedong

Personas of Barack Obama

Personas of Barack Obama

因此,因姐姐认为,奥巴马是位政治家、管理者和社会活动者,而毛主席是位教育家、体育爱好者和作家。

标签:

WordPress <= 2.8.3 管理员密码远程重置漏洞(及绕过方案)

2009年8月12日 没有评论

今天刚刚看到的,WordPress 2.8.3版本之前(含)远程重置管理员密码漏洞。

关于该漏洞的信息参见这里。SuperHei的blog上面有一个简单的原理分析。

别拿我的blog做实验,我这个已经修改过了。

这个漏洞的危害不怎么大,只是用来做一些恶作剧。目前WordPress还没有新版,各位用WordPress自建blog的同仁们可以考虑自己修改 wordpress 的代码来绕过该问题:

在$(blog_root)下面,找到wp-login.php,打开,找到function reset_password。找到其中这一行:

function reset_password($key) {
global $wpdb;
$key = preg_replace('/[^a-z0-9]/i', '', $key);
if ( empty( $key ) )
return new WP_Error('invalid_key', __('Invalid key'));

将其改成:

if ( ! is_string($key) || empty( $key ) )

即可。