让人焦虑的「点赞」按钮、失联的火星气候轨道飞行器、死难数百人的波音 737 Max 空难……原来都与代码有关。
2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah Pearlman 和 Justin Rosenstein 在内的数名程序员和设计师的创意。他们认为 Facebook 用户经常太忙而无法在朋友的帖子上发表评论,但是如果有一个简单的按钮可以使用,那一定会大受欢迎。「朋友们可以更频繁、更轻松地相互点赞互动」,Pearlman 说。
这个按钮奏效了,甚至有点超乎想象。到 2012 年,「赞」这个按钮已经有了超过 1 万亿次的点击。但它也产生了副作用。我们发布一张照片后,会坐立不安地刷新页面,等待更多的「赞」。我们想知道为什么别人的赞越来越多。因此,我们开始在社交网络中「暗暗发力」:变得更有趣、更犀利、更迷人、更极端。
代码重构了我们的生活。正如风险资本家 Marc Andreessen 写的那样,「软件正在吞噬整个世界」,不过说软件正在消化这个世界可能更准确。
因此,美国 Slate 杂志做了这样一个调查。为了厘清改变世界的那些软件,编辑们对计算机科学家、软件开发人员、历史学家、政界人士和新闻工作者进行了民意调查。他们需要选择:哪些代码有巨大影响力?哪些改变了我们的生活?有 75 位人士提出了自己的想法,Slate 选择了其中 36 位(译文有删减)。这并不是一个完整的清单,因为有影响力的代码太多。该清单旨在激发思想——帮助我们重新思考代码如何影响我们的生活以及程序员的决策如何影响未来。
二进制穿孔卡片(1975 年)
第一种代码
二进制编程出现时间比计算机都早。Basile Bouchon 是第一个在纸上打孔并用它来控制机器的人:1725 年,他发明了一种织机,该织机根据所送入的穿孔纸编织出不同图案。打孔是「1」,没有打孔是「0」。此后机器发生了很多变化,但基本的代码组成并没有改变。——Elena Botella, Slate 执行的第一个现代代码(1948 年)
引领了计算机代码的使用和核灾难计算机模型的出现,为冷战时期的军备竞赛打下了基础
电子数字积分计算机是第一台可编程电子计算机。它于 1945 年完成,通过在许多组件之间进行连接来为每个新问题进行配置。当一项任务(例如加法)完成时,一个脉冲会触发下一项任务。但是几年后,冯·诺依曼(Von Neumann)和 Los Alamos 的科学家 Nicholas Metropolis 改进了 ENIAC,运行了在计算机上执行的第一条现代代码:从可寻址的只读存储器(ENIAC 的功能表开关)执行数百条数字指令。他们使用蒙特卡洛技术模拟了在新墨西哥州的洛斯阿拉莫斯国家实验室提出的几种原子弹设计的爆炸过程,通过这种方法逐步模拟了复杂系统,绘制了可能结果的概率分布。冯·诺依曼和梅特罗波利斯向洛斯阿拉莫斯的核科学家发送了 20,000 多张卡片,通过引爆弹头追踪了模拟中子的过程。如今,此代码的后续版本仍在洛斯阿拉莫斯使用。——Thomas Haigh,《ENIAC in Action: Making and Remaking the Modern Computer》合著者
GRACE HOPPER 的编译器(1952 年)
使计算机处理单词成为可能
Grace Hopper 在对一台早期计算机编程时,为了简化整个过程决定将编程语言植根于人类语言。霍珀(Hopper)在第二次世界大战期间加入了美国海军预备役。她知道,像她的军事上司一样,人们都在努力理解二进制代码。如果编程语言可以是基于英语的,那么这项工作就不会那么容易出错,并且对于那些不是数学博士的人来说也更容易理解。
一些人对此想法不以为然,但到了 1950 年代初,她设计了一个编译器,即一组指令,将一种更易懂的代码转换为机器直接处理的低级代码。她和她的实验室使用该工具开发了 FLOW-MATIC,这是第一种将英文单词融入该过程的编程语言。——Molly Olmstead, Slate
太空战争!(1961 年)
第一个分布式视频游戏(Spacewar)
电子邮件的起源(1965 年)
Come on,电子邮件来了!
阿波罗 11 号登月舱救援代码(1969 年)
防止登月舱计算机在太空中空间耗尽的代码
Hello, World!(1972 年或更早)
引领一代又一代人打开编程大门的代码
当你坐下来学习一种新的编程语言时,教程要求你做的第一件事就是让计算机显示「Hello,world!」。也许最著名的早期示例来自贝尔实验室的「C—A 编程教程」。该教程写于 1974 年,尽管在 1972 年的手册中也发现了另一种更早的语言 B。
「Hello,world!」这是极好的教学方法。这是一项小的、可实现的任务,能够使学生有成就感。这是一个标准,有助于说明不同编程语言之间的差异。这也是高级程序员确保安装新环境后一切正常的一种快速简便的方法。(有时程序员使用「到'hello world'的时间」比较语言和环境的速度。)也许最重要的是,「Hello,world!」能帮你打开编程的大门,它告诉你这就是新世界。——Chris Noessel,IBM AI 设计主管。
以空字符结尾的字符串(1972 年)
计算史上最大的灾难性设计错误
1972 年,Dennis Ritchie 做出了一个重大决定:用一种名为「空字符结尾字符串」(null-terminated string)的新语言来表示文本。这个概念早就出现了,但是他把其写进了他称为 C 的新语言中,这个决定就一直影响我们到现在。
编程语言代表一段文本的主要方式有两种:一是具有固定、显式长度——「只包含 10 个字符,不能再多了」或者可以以空值结尾——「这里有一串字符,继续努力,直到看到零字节为止!」
C 代码中有一个非常常见的错误,在将一个长字符串复制到一个较短的字符串中时,会出现结尾溢出,即你破坏了刚好在附近的其他数据。就像在白板的边缘上乱涂乱画一样。
除了仅使程序出现故障外,还可以利用此类错误来改变程序行为,方法是使用经过精心设计的特定数据覆盖某些内容。这些就是缓冲区溢出攻击。你听说过的几乎所有安全漏洞都从 1988 年的 Morris Worm 开始。
你必须在 C 语言中仔细编码以避免此类错误,但是此类错误仍然容易发生。从路由器到「智能」灯泡,几乎每种现代语言都避开了空字符结尾字符串,但是 C 和 C++仍然在语言界有支配地位。因此,近 50 年后的现在,我们还在「饱受折磨」。——Jamie Zawinski,Netscape 开发人员、Mozilla.org 创始人
温哥华股票交易所的交易错误(1982 年)
不起眼的小数误差造成极大损失
1982 年初,温哥华证券交易所推出了一种电子股票指数,该指数最初定为 1000 点。在两年内,它跌了一半,这在 1980 年代初期的牛市中似乎匪夷所思。一项调查显示,使用 floor() 而非 round(),会造成对索引的计算错误。该命令意味着该值会被直接截止而不是四舍五 入到小数点后三位。(数字计算机必须具有有限的分辨率,因此需要四舍五入或直接截止。)因此,如果索引计算为 532.7528,则会被存储为 532.752,而不是四舍五入为 532.753。在每天数千次计算的过程中,这种看似很小的差异——每次必须四舍五入时未进行四舍五入——导致了巨大损失。这个编程错误最终在 1983 年 11 月得到解决,当时周五的收盘指数在 500 点左右。问题解决后,该股票于周一重新开盘,指数就超过了 1,000 美元,损失的价值得以恢复。——Lav Varshney,伊利诺伊大学香槟分校助理教授
THERAC-25(1985-1987 年)
过度自信是致命的
当真相浮出水面时,各大媒体的头版头条就对机器现代化发出了警告。《洛杉矶时报》宣称:「在这个复杂时代,软件漏洞变得致命。」一台用于治疗癌症的机器在几家医疗机构中对六名患者进行了大剂量过量辐射,造成至少三人死亡。
研究人员发现,Therac-25 的代码可能带来致命的错误。该机器提供低功率和高功率治疗,后者需要一个金属设备来过滤光束。但是由于软件中的错误,操作员可能会在没有金属设备的情况下意外触发高功率模式。
Therac-25 被设计为 Therac-20 的「改进」,设计时被认为是万无一失的,不需要外部安全检查。结果:几起死亡归咎于过度自信的工程师,他们没有考虑到失误的可能性。——Molly Olmstead
认知智能未来机器人接口API简介介绍
- 认知智能是计算机科学的一个分支科学,是智能科学发展的高级阶段,它以人类认知体系为基础,以模仿人类核心能力为目标,以信息的理解、存储、应用为研究方向,以感知信息的深度理解和自然语言信息的深度理解为突破口,以跨学科理论体系为指导,从而形成的新一代理论、技术及应用系统的技术科学。 认知智能的核心研究范畴包括:1.宇宙、信息、大脑三者关系;2.人类大脑结构、功能、机制;3.哲学体系、文科体系、理科体系;4.认知融通、智慧融通、双脑(人脑和电脑)融通等核心体系。 认知智能四步走:1.认知宇宙世界。支撑理论体系有三体(宇宙、信息、大脑)论、易道论、存在论、本体论、认知论、融智学、HNC 等理论体系;2.清楚人脑结构、功能、机制。支撑学科有脑科学、心理学、逻辑学、情感学、生物学、化学等学科。3.清楚信息内涵规律规则。支撑学科有符号学、语言学、认知语言学、形式语言学等学科。4.系统落地能力。支撑学科有计算机科学、数学等学科。
接口申请官网地址:www.weilaitec.com
接口地址(例子):
http://a239p06512.zicp.vip/Web/BuAppJava.bujqrex?apikey="+apikey+"&msg="+msg+"&ip="+ip
用户端消息内容。
String msg ="你在干嘛呀?";
apikey参数。这个apikey就是网站上申请的APIKEY
apikey ="";
//客户端ip,最终用户端的唯一标识(可以是用户端的IP,或者手机设备号,或者微信号或者,qq号码等能证明身份的唯一标识就可以)
String ip ="";
//这里一定要encode转换编码。转成GBK。
msg = URLEncoder.encode(msg, "GBK");
三个参数全部小写
msg参数就是传输过去的对话内容。
msg参数要编码成gbk,不然会乱码。
接口具体代码:
package ai.nlp.jiekou.test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import ai.nlp.util.changliang.ChangLiangZi;
public class ApiTest {
/**
* Get请求,获得返回数据
* @param urlStr
* @return
*/
private static String opUrl(String urlStr)
{
URL url = null;
HttpURLConnection conn = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try
{
url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 10000);
conn.setConnectTimeout(5 * 10000);
conn.setRequestMethod("POST");
if (conn.getResponseCode() == 200)
{
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1)
{
baos.write(buf, 0, len);
}
baos.flush();
String result = baos.toString();
return result;
} else
{
throw new Exception("服务器连接错误!");
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (is != null)
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (baos != null)
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
conn.disconnect();
}
return ChangLiangZi.WU;
}
public static void main(String args []){
//三个参数全部小写
//msg参数就是传输过去的对话内容。
//msg参数要编码成gbk,不然会乱码。
String msg ="你在干嘛呀?";
//apikey参数。
String apikey ="UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV";
//客户端ip,最终用户端的唯一标识(可以是用户端的IP,或者手机设备号,或者微信号或者,qq号码等能证明身份的唯一标识就可以)
String ip ="127.0.0.1";
//这里一定要encode转换编码。转成GBK。
try
{
msg = URLEncoder.encode(msg, "GBK");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
System.out.println(opUrl("http://a239p06512.zicp.vip/Web/BuAppJava.bujqrex?apikey="+apikey+"&msg="+msg+"&ip="+ip));
}
}