Wikiwand:优雅地访问维基百科

Wikiwand: Wikipedia Reimagined

本文隆重介绍 Wikiwand 这个网站。它的口号是:

Wikipedia Reimagined: A beautiful new interface to the human knowledge

它能够将维基百科的页面重新排版展现给用户,开起来会非常漂亮。

缺陷是它尚并不支持中文维基百科的繁简、地区词处理机制。

下面是它的主页。您可以从它的主页上直接进入词条,或下载它的 App、浏览器插件。
https://www.wikiwand.com/
http://www.wikiwand.com/

您可以用以下链接体验一下效果:
https://www.wikiwand.com/zh/%E6%95%A3%E5%BA%A6

考虑到它在中文社区的知名度尚低,应该还可以愉快地使用一段时间。当做维基百科专门的 Web 代理。你懂的。(完)

C/C++ 判断整数相加是否溢出

算术方法,或者内联汇编判断溢出标志位

方法1:算术方法,根据运算结果判断。
这种判断方法非常直接。

int isAddOverflow1(int x, int y)
{
    int z = x + y;
    if(x > 0 && y > 0 && z < 0)
        return 1;  
    if(x < 0 && y <  0 && z > 0)
        return 1;
    return 0;
}

方法2:从 CPU 读取溢出标志位。
8086 的控制寄存器里的标志寄存器 FLAG 里有个 OF 溢出标志位,如果上一次运算发生溢出,该位会被置 1。使用 jo 指令可依该标志位跳转。
采用内联汇编。以下代码是 VC 的写法。gcc 相应的关键字是 __ASM__。

//compile with MSVC, run on 8086
int isAddOverflow2(int a, int b) {
    __asm {
        mov eax,a
        add eax,b
        jo  overflowed
        xor eax,eax
        jmp no_overflowed
overflowed:
        mov eax,1
no_overflowed:
    }
}

可采用以下程序进行测试:

#include 
int isAddOverflow1(int x, int y);
int isAddOverflow2(int a, int b);
int main() {
    int a,b;
    int samplesA[]={-23333, -1, 0, 1, 2, 2333333};
    int nSamplesA = sizeof(samplesA)/sizeof(int);
    int samplesB[]={233333, 2147483647, -2147483647, -2147483648};
    int nSamplesB = sizeof(samplesB)/sizeof(int);
    for(int iA=0; iA

如有其他方法,欢迎评论补充。本文整理自网上资料。(完)

试译 John Gordon 的 Alice and Bob 餐后演讲(未完待续)

首次尝试翻译学术向的文章。这是一篇经典的,风趣的演说稿,现在网上流传的中译本有些谬误,故试译以改正之。


关于 Alice 和 Bob 的餐后演讲
作者 John Gordon
受 James Massey 教授之邀,于 Zurich Seminar 学术研讨会,1984 年 4 月

由 Zhaoyang 译出,参考了 Friendren 的译文
英文原文于 http://downlode.org/Etext/alicebob.html

女士们,先生们,晚上好。

  人们参加这样的学术会议,肯定希望有点更轻松的东西,能让他们换个节奏、换种风格,把专业的事情放在一边,想一些完全不同的东西。

  所以呢,咱们聊聊编码理论。在座的有些同仁不是编码理论的专家,而是不怎么情愿地被差遣来的。于是我想我可以来个五分钟的速成课程,像面对研究生那样给大家扫盲一下编码理论。

  编码理论的专家关心两件事。第一件,即最重要的一件,是两个人的私人生活—— Alice 和 Bob。在本领域的论文中,若一位学者想描述一个涉及双方的业务过程,他不会称双方为A和B,而是遵从一个长期形成的传统,称他们为 Alice 和 Bob。

  现在已经有数百篇关于 Alice 和 Bob 的论文了。数年来,Alice 和 Bob 尝试过欺诈保险公司,通过电子邮件玩高赌注的扑克游戏,还在被窃听的电话线上交换秘密信息。

  如果我们把这些散落在论文里的细节整理一番,我们就可以得到关于这两人生活的一副美妙图画。这可能将是大家首次听到 Alice 和 Bob 的确切传记。

  在美国作者撰写的论文中,Bob 常常在向投机商卖股票。根据 Bob 参与的股票交易的数目,我们推断他很可能是一名股票经纪人。然而他也非常在意自己是否被窃听,所以估计他活跃在什么反政府活动之中。注意到 Alice 曾多少次试图从 Bob 手中购买股票,我们知道 Alice 很可能就是一个投机商。此外,Alice 非常担心她与 Bob 的经济往来被她丈夫发现。所以说 Bob 是一个背地里从事破坏活动的股票经纪人,Alice 是一个脚踩两只船的投机商人。

   Alice 需要面对不少难题。她和 Bob 只通过电话或电子邮件来交流。在他们居住的那个国家的电话费很贵,可偏偏两人都很吝啬。所以 Alice 首先要设法将电话费降到最低。

  另外,电话线上总有很大的噪音。由于干扰之强,Alice 和 Bob 经常难以听清对方。电话线上还有不少非常强大的敌人,比如税收当局,比如秘密警察。这是个坏消息,因为二人感兴趣的话题正是税务欺诈和反政府。

  这些敌人有几乎无限的资源可用。他们总守在电话线旁,监听 Alice 和 Bob 的通话。这些敌人也很狡猾,他们最爱玩的把戏就是装作 Bob 给 Alice 打电话。

  你可能会想,Alice 只要仔细辨别 Bob 的嗓音就可以了。但是不行,事实上 Alice 与 Bob 从未谋面,Alice 根本不知道 Bob 的声音是什么样的。

  于是,你看到,Alice 面对着这么多棘手的问题。对了,忘了说,Alice 并不信任 Bob。我们不知道个中缘故,但肯定是过去发生过什么事情。

  如果在 Alice 的处境下,大多数人都会放弃。但 Alice 没有。她有令人敬畏的勇气。无惧艰险,在嘈杂的电话线上,尽管被税收当局和秘密警察监听着,Alice 还是会愉快地尝试与一个她并不信任,听不清楚,有可能被别人冒充的人通信,来篡改自己的退税信息,来谋划政变,同时,还要将电话费降到最低。

  而编码学家则是一群认为 Alice 没疯的人。

信息(Information)

  编码学家关心的另一件事是信息。没有别的东西像信息一样独特:它可以被凭空创造,也可以被彻底销毁。你可以窃取它,而且是在不使其离开原位的前提下。有时候你仅凭猜测就可以得到它的一部分(比如,即使我不知道你的手机号,我也知道它的第一位是1——译者注)。然而它可以具有很大的价值,可以被买卖。

  有一种信息被称作金钱。

  有一群人不承认金钱可以创造或销毁,他们花费毕生精力维护精确的记录,只为确保:只要一点点钱离开某处,一定有等量的钱出现在另一处。我们称这些人为会计。

信源编码、信道编码和加密编码

  编码理论,就像高卢(地名——译者注)一样,被分为三个部分:信源编码、信道编码和加密编码。

信源编码(Source coding)

  首先聊聊信源编码。这是 Alice 用来省电话费的办法。它经常被用于做数据压缩,即缩短信息的长度。

  有个故事,关于一位信息论的学生在大学的第一天。那一天他进入了一个古怪的世界。他唯一能听到的,就是时不时地,一位教授说出一个数字,和随之而来的笑声。比如一位教授说出“52”,然后是短暂的安静,然后就是响亮的笑声了。又有人说出“713”,结果大家都快笑趴下了。
  “这是什么鬼?”这位学生满脸狐疑地问他的导师。
  “我们在讲笑话,”他的导师说。
  “讲笑话?”
  “对的。你看,我们都在这里工作很久了,每个人有什么笑话,我们互相都知道。一共有一千个。作为信息论的专家,我们对笑话们实施了数据压缩。我们为它们赋予了从0到999的编号,这样讲起笑话来非常省时省力。你可以试一试,说一个0到999之间的数字……”

  这学生将信将疑,不过还是试了一下。他轻轻地说出了“477”。
  只有几乎听不见的低语声。
  他看着他的导师,“我做错了什么?”他说。“再试一次,”导师说。
  他照做了。“318”——和刚才一样,几乎鸦雀无声。
  “不对吧,”他说。
  “好吧,”导师说,“一定是你讲的不好笑!”

  然后就是这个故事精彩的结局了。这位学生最终意外取得了戏剧性的成功。他说了一个范围之外的数——“负105”。
  话音落下,起初众人惊诧地说不出话,然后一位教授笑了起来,继而一个接着一个,直到所有人都笑得摇摇晃晃站不稳。

  这是因为他们从来没有听过这个笑话。

信道编码(Channel coding)

  接下来我们谈谈信道编码。这是 Alice 用来克服电话线上的噪声和干扰的办法。其实大部分人已经不自觉地在用信道编码了,他们会在说话的时候把重要的单词拼读出来。这样做增加了冗余性,并且使得收听者可以进行核实。即使有一部分信息在传输途中丢失,缺少的那一点儿也可以根据剩余的部分经推断得以重建。

  在例如军队,航空,警察这样的组织中,有一套专门为此设计的标准的语音字母表。它是“Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,……”于是他们说“Mike”和“November”,比起发音容易混淆的“M”和“N”显然要清楚得多。(我国军队中以“幺、两、拐、勾、洞”等代替“一、二、七、九、零”同理。——译者注)

   Alice 正在向 Bob 说明,她的丈夫 Bob 已经开始怀疑她的股票交易。
  “我必须跟你说说迈克(Mike),”她说的是。然而 Bob 听到的是“我-嘶嘶-和你讲讲-嘶嘶—嘶-克”。
  “你说什么?” Bob 问。“我必须得和你讲讲Mike”,Alice 说。
  “最后一个词我没听见,Alice,” Bob 说,“你能拼一下么?”
  “Mike India Kilo Echo”。
  “我只听见了India Kilo Echo,你说的第一个词是什么?”
  “Mike。”
  “你能拼一下么?”
  “Mike India Kilo Echo”……

  (这个故事的中文版本应该是这样的:
  ——我说的是‘清’,‘清华’的‘清’。
  ——你说什么?什么‘华的清’?前一个字没听见。
  ——‘清华’的‘清’。
  ——我只听见了‘华的清’,第一个字是什么?
  ——‘清’,‘清华’的‘清’……
  由此进入死循环。——译者注)

  事实上我们有很多套这样的语音字母表。比如在此之前的国际标准是“Able,Baker,Charlie……”

  也有基于地名的:Africa,Brazil,Chile,Denmark,England,France,Greenland,Holland,India,Japan,Khazakistan,Lithuania,Morocco,Niger,Oman,Papua,Qatar,Russia,Spain,Tanzania,Uruguay,Venezuela,Westphalia,Yemen,Xanadu,Zambia。

  我个人最喜欢是这个:

  * A for ‘Orses(音同hay for horses,干草喂给马儿——译者注,下同)
  * B for Mutton(beef or mutton,牛肉羊肉)
  * C for Yourself(see for yourself,亲自看)
  * D for Mation(deformation,变形)
  * E for Brick(heave a brick,举起一块砖头)
  * F for Vescence(effervescence,冒泡)
  * G for Police(chief of police,警长)
  * H for Consent(age of consent,承诺年龄)
  * I for Lutin(highfalutin,自大)
  * J for Orange(Jaffa orange,一种水果)
  * K for Teria(cafeteria,自助餐厅)
  * L for Leather(hell for leather,飞快地)
  * M for Sis(emphasis,强调)
  * N for Mation(information,信息)
  * O for A Muse of Fire(莎翁《亨利五世》的开场白)
  * P for Ate(perforate,打孔)
  * Q for A Song(cue for a song,提示歌词)
  * S for Something Else(as for,至于别的事情)
  * T for Two(tea for two,两人份的茶水)
  * U for Mism(euphemism,婉辞)
  * V for La France(Vive La France,法兰西万岁)
  * W for Mism(double euphemism,两个婉辞)
  * X for Breakfast(eggs for breakfast,早餐吃鸡蛋)
  * Y for Lover
  * Z (zee) for yourself

加密编码(Secrecy coding)

  终于到重头戏——加密编码了。加密编码也被称作密码学(Cryptography)。这是 Alice 用来防止税收当局和秘密警察理解她电话的内容的办法。

  密码学家是真正古怪的人,他们脑袋里的想法是“迂回”的。有时候他们把笑话加密。安全机关称这种笑话为“隐秘笑话”,称编写他们的人为“笑话炮制家”。
  一个使常人可以理解、能引人发笑的笑话,在以其原始形式呈现时,被称为“明笑话”(Plainjoke,变自plaintext,指明文——译者注),被加密后则成为了“密笑话”(Cipherjoke or Cryptojoke,变自ciphertext,指密文——译者注)。显而易见,密笑话只有在被解密(Decryption)后才能被常人所理解,这一过程也被一些人称作解释

  面对一个无法理解的密笑话,有三种攻击方法,这是按照笑话分析师(Jokeanalyst,指攻击者——译者注)所掌握的资源进行分类的。首先我们有“唯密笑话攻击”,这种情况下笑话分析师拥有无限多的“据说很好笑”的材料。

  第二种更强,是“已知明笑话攻击”,这种情况下他可以拥有若干组相互对应的“明笑话——密笑话”样本。

  然而最强的攻击情形是“选择密笑话攻击”,这种情况下他有机会要求笑话炮制家解释他们炮制出的密笑话究竟为什么好笑。或者反过来,是“选择明笑话攻击”,要求笑话炮制家根据已知的笑点炮制出密笑话来。(原文此处可能有误,已修改——译者注)

  那些比较弱智的笑话,通常只用很简单的密码加密,比如只把真正引发笑点、抖包袱的那几个字改掉。这种加密方法被称作“结尾跑偏系统”(Deflected Ending System),简称DES。(事实上DES是一种正经的加密标准 Data Encryption Standard,已因易被破解而停用——译者注)

  那些质量很高、很重要的笑话,比如若被外人理解,就会对国家安全构成威胁的,需要加密得更加安全。通常是把情节、场景、结局全都改掉。这种加密方法被称作“特别聪明掩护”(Particularly Klever Coverup),简称 PKC。其中有一种最著名,可以“抵抗严重攻击”(Resists Serious Attack),故被称作 RSA。(事实上 PKC 是 Public Key Cryptosystem,即公钥密码系统,RSA 是一种 PKC 算法,以发明者 Ron Rivest, Adi Shamir 和 Leonard Adleman 命名。比 DES 强。——译者注)

  当然,这里有一个必然的推论:只有极具天赋、聪明非凡的人才能真正理解一个幽默演讲的美妙之处。

标准化(Standardisation)

  考虑到设计一套好的加密机制的难度之大,和相应仪器设备的成本之高,人们正在努力将加密机制标准化。就在我说话的当下,国际标准化组织 ISO 就正在开会讨论这一点。关于加密机制的标准化,现存不少误解,我应要求来详细阐述一下。语言存在的意义在于传达信息,只有在信息发送和接收的双方采用相同的系统时(比如都说英语、或上海话——译者注)这一目的才能达成。换句话说,语言能够精确地完成其任务,正是因为它是标准化的。

   然而,密码学的意义,恰恰相反,是让信息对除特定人以外的所有人都不可理解,换言之,密码学能够精确地完成其任务,正因为它不是标准化的。所以,他们做的事情实际上是,将加密机制的大部分标准化,然后把非标准化的部分集中到一起,即密钥(key)。

  目前为止一切顺利。但是密钥,这非标准化的部分,必须按照标准化的方法“非标准”。并且密钥的管理必须要遵循一定的标准。换言之,密钥应被阐述为这样的部分,它们本身是非标准的,遵循一定的非标准化的标准,必须以标准化的非标准方法来处理,以在非标准化的基础上实现标准化。

  但愿我解释清楚了标准化的问题。(作者绕了半天“标准化”“非标准化”,看起来是在黑 ISO 对加密机制标准化的尝试——译者注)

弱密钥(Weak keys)

  很多加密机制都存在“坏”的密钥。如果你使用了它们,你的加密就会很容易被破解。比如,全零密钥是 DES 的弱密钥。有很多寻找弱密钥的深入研究。数年来越来越多的弱密钥已被发现,所以你必须非常小心地避免使用它们。

  也许更好的想法是去寻找强密钥。恩,为什么不找一个宇宙中最强的密钥呢?(事实上这是显然不可行的——编者注)

  然后我们就可以把所有的标准化都建立在这个最强密钥上了。

处理延迟(Processing delay)

  编码理论并非完美,它有它自己的问题。在介绍信源编码、信道编码和加密编码的同时,通常也要说一说“处理延迟”。这指由于编码、解码的一切过程造成的延迟——这种延迟有时巨大惊人。

(本段落还在翻译中)

当下图景

(本段落还在翻译中)

(未完待续)