精华内容
下载资源
问答
  • 在哪里发起话题积分?在哪里发起话题积分?在哪里发起话题积分?在哪里发起话题积分?

    在哪里发起话题积分?在哪里发起话题积分?在哪里发起话题积分?在哪里发起话题积分?

    展开全文
  • 2021年前端面试题及答案

    万次阅读 多人点赞 2020-02-11 19:29:34
    混合模式 前端安全性问题 这个是老的话题,有的在初中级前端面试中可能不会提到。但是在高级面试的时候,你要说出前端安全性问题防御,及前端常见安全性问题的攻击原理是什么。 1 xss跨站脚本攻击原理?如何进行?...

    前端面试汇总(2020年)

    大纲

    1、前言

    2、前端工程化

    3、前端设计模式

    4、前端安全性问题

    5、前端跨域问题

    6、前端数据加密

    7、前端http相关问题

    8、*前端基础知识点面试题

    9、前端技术栈问题

    前言

    由于新冠肺炎疫情,现在成天呆在家里,加上也要准备面试,就在家里看面试题,看着网上一堆面试题,决定收集常见题目汇总一下。关于面试大纲,我认为每个人都是千差万别的。因为面试官都是对简历所写的项目经验进行深挖或者对你所掌握的基本技能进行考察。

    前端工程化

    1

    什么是"前端工程化"?

    前端工程化是使用软件工程的技术和方法来进行前端的开发流程、技术、工具、经验等规范化、标准化,其主要目的为了提高效率和降低成本,即提高开发过程中的开发效率,减少不必要的重复工作时间,而前端工程本质上是软件工程的一种,因此我们应该从软件工程的角度来研究前端工程。

    2

    如何做"前端工程化"?

    前端工程化就是为了让前端开发能够“自成体系”,个人认为主要应该从模块化组件化规范化自动化四个方面思考。

    前端设计模式

    前端常见的设计模式主要有以下几种,具体设计模式查看这篇文章
    1. 单例模式
    2. 工厂模式
    3. 策略模式
    4. 代理模式
    5. 观察者模式
    6. 模块模式
    7. 构造函数模式
    8. 混合模式

    前端安全性问题

    这个是老的话题,有的在初中级前端面试中可能不会提到。但是在高级面试的时候,你要说出前端安全性问题防御,及前端常见安全性问题的攻击原理是什么。

    1

    xss跨站脚本攻击原理?如何进行?防御手段?

    如何进行:如何XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

    主要原理:过于信任客户端提交的数据!

    防御手段:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。

    2

    CSRF跨站请求伪造原理?如何进行?防御手段?

    如何进行:当你在某网页登录之后,在没有关闭网页的情况下,收到别人的链接。例如:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change#

    点击链接,会利用浏览器的cookie把密码改掉。

    主要原理:在没有关闭相关网页的情况下,点击其他人发来的CSRF链接,利用客户端的cookie直接向服务器发送请求。

    防御手段:

    检测Referer

    Anti-CSRF token机制

    业务上要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

    3

    Sql脚本注入原理?如何进行?防御手段?  

    如何进行:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    主要原理:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

    防御手段:

    使用预编译,绑定变量(推荐)。

    检查数据类型。

    过滤特殊字符和语句。

    页面不错误回显。

    4

    web上传漏洞原理?如何进行?防御手段?  

    如何进行:用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。

    主要原理:当文件上传时没有对文件的格式和上传用户做验证,导致任意用户可以上传任意文件,那么这就是一个上传漏洞。

    防御手段:

    1. 最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的'x'权限;实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存加速降低能耗,二是杜绝了脚本执行的可能性;
    2. 文件类型检查:强烈推荐白名单方式,结合MIME Type、后缀检查等方式;此外对于图片的处理可以使用压缩函数或resize函数,处理图片的同时破坏其包含的HTML代码;
    3. 使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件;
    4. 单独设置文件服务器的域名;

    前端跨越问题

    1

    什么是跨域?  

    由浏览器同源策略限制的一类请求场景,当不同地址,不同端口,不同级别,不同协议就会构成跨域。

    2

    什么是同源策略?  

    所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

    它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。

    3

    如何解决跨域? 能说1,2,7,8就行。

    1、 通过jsonp跨域

    2、CORS

    3、 document.domain + iframe跨域

    4、 location.hash + iframe

    5、 window.name + iframe跨域

    6、 postMessage跨域

    7、 nginx代理跨域

    8、 nodejs中间件代理跨域

    9、 WebSocket协议跨域

    前端数据加密问题

    1

    一般如何处理用户敏感信息?  

    前端一般使用md5、base64加密、sha1加密,想要了解详情请自行百度。

    前端http相关问题

    1

    HTTP常用状态码及其含义?  

    1xx:指示信息--表示请求已接收,继续处理

    100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)

    101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)

    2xx:成功--表示请求已被成功接收、理解、接受

    200 OK 一切正常,对GET和POST请求的应答文档跟在后面。

    201 Created 服务器已经创建了文档,Location头给出了它的URL。

    202 Accepted 已经接受请求,但处理尚未完成。

    203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。

    204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

    205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。

    206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

    3xx:重定向--要完成请求必须进行更进一步的操作

    300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

    301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

    302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

    303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。

    304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

    305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。

    307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)

    4xx:客户端错误--请求有语法错误或请求无法实现

    400 Bad Request 请求出现语法错误。

    401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

    403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

    404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。

    405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)

    406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。

    407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)

    408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)

    409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)

    410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)

    411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)

    412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。

    413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。

    414 Request URI Too Long URI太长(HTTP 1.1新)。

    416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)

    5xx:服务器端错误--服务器未能实现合法的请求

    500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

    501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

    502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

    503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

    504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

    2

    websocket和轮询及长轮询区别  

    轮询如下:

    客户端:啦啦啦,有没有新信息(Request)服务端:没有(Response)客户端:啦啦啦,有没有新信息(Request)服务端:没有。。(Response)客户端:啦啦啦,有没有新信息(Request)服务端:你好烦啊,没有啊。。(Response)客户端:啦啦啦,有没有新消息(Request)服务端:好啦好啦,有啦给你。(Response)客户端:啦啦啦,有没有新消息(Request)服务端:。。。。。没。。。。没。。。没有(Response) ---- loop

    长轮询如下:

    客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)服务端:额。。 等待到有消息的时候。。来 给你(Response)客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop

    websocket如下:

    websocket解决了HTTP的这几个难题。 首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

    所以上面的情景可以做如下修改。

    客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)客户端:麻烦你有信息的时候推送给我噢。。服务端:ok,有的时候会告诉你的。服务端:balabalabalabala服务端:balabalabalabala服务端:哈哈哈哈哈啊哈哈哈哈服务端:笑死我了哈哈哈哈哈哈哈

    3

    Http和Https的区别?  

    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    *前端基础知识点面试题

    1

    HTML/5、CSS/3相关  

    一、html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

      新特性:

      HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
      拖拽释放(Drag and drop) API
      语义化更好的内容标签(header,nav,footer,aside,article,section)
      音频、视频API(audio,video)
      画布(Canvas) API
      地理(Geolocation) API
      本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
      sessionStorage 的数据在浏览器关闭后自动删除
      表单控件,calendar、date、time、email、url、search
      新的技术webworker, websocket, Geolocation

      移除元素:
      纯表现的元素:basefont,big,center,font, s,strike,tt,u;
      对可用性产生负面影响的元素:frame,frameset,noframes;
      h5新标签兼容:
      IE8/IE7/IE6支持通过document.createElement方法产生的标签,
      可以利用这一特性让这些浏览器支持HTML5新标签,
      当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
     
      如何区分:
      DOCTYPE声明\新增的结构元素\功能元素

    二、CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?

      CSS 选择符:

      1.id选择器( # myid)

       2.类选择器(.myclassname)

      3.标签选择器(div, h1, p)

      4.相邻选择器(h1 + p)

      5.子选择器(ul > li)

      6.后代选择器(li a)

      7.通配符选择器( * )

      8.属性选择器(a[rel = "external"])

      9.伪类选择器(a: hover, li:nth-child)

      可以继承的属性:

      可继承的样式: font-size font-family color, UL LI DL DD DT;

      不可继承的样式:border padding margin width height ;

      优先级:

      !important > id > class > tag

      important 比 内联优先级高,但内联比 id 要高

      CSS3新增伪类举例:

      p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。

      p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。

      p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。

      p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。

      p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。

      :enabled :disabled 控制表单控件的禁用状态。

      :checked 单选框或复选框被选中。

    三、CSS3有哪些新特性?

    更详细的请见:https://www.cnblogs.com/qianduantuanzhang/p/7793638.html

      CSS3实现圆角(border-radius),阴影(box-shadow),

      对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)

      transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜

      增加了更多的CSS选择器 多背景 rgba

      在CSS3中唯一引入的伪元素是::selection.

      媒体查询,多栏布局

      border-image

    四、解释盒模型宽高值得计算方式,边界塌陷,负值作用,box-sizing概念? 

      1. 盒模型:IE 678 下(不添加doctype) 使用ie盒模型,宽度 = 边框 + padding + 内容宽度; chrom、IE9+、(添加doctype) 使用标准盒模型, 宽度 = 内容宽度。 
      2. box-sizing : 为了解决标准黑子和IE盒子的不同,CSS3增添了盒模型属性box-sizing,content-box(默认),border-box 让元素维持IE传统盒子模型, inherit 继承 父盒子模型; 
      3. 边界塌陷:块元素的 top 与 bottom 外边距有时会合并(塌陷)为单个外边距(合并后最大的外边距),这样的现象称之为 外边距塌陷。 
      4. 负值作用:负margin会改变浮动元素的显示位置,即使我的元素写在DOM的后面,我也能让它显示在最前面。

    五、BFC(Block Formatting Context) 是什么?应用? 

      1. BFC 就是 ‘块级格式上下文’ 的格式,创建了BFC的元素就是一个独立的盒子,不过只有BLock-level box可以参与创建BFC,它规定了内部的Bloc-level Box 如何布局,并且与这个独立盒子里的布局不受外部影响,当然它也不会影响到外面的元素。 
      2. 应用场景: 
      1. 解决margin叠加的问题 
      2. 用于布局(overflow: hidden),BFC不会与浮动盒子叠加。 
      3. 用于清除浮动,计算BFC高度。

    六、如何实现浏览器内多个标签页之间的通信?

      调用localstorge、cookies等本地存储方式

    七、简要说一下CSS的元素分类

      块级元素:div,p,h1,form,ul,li;
      行内元素 : span,a,label,input,img,strong,em;

    八、解释下浮动和它的工作原理?清除浮动的方法

      浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。

      1.使用空标签清除浮动。

      这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。

      2.使用after伪对象清除浮动

     该方法只适用于非IE浏览器。具体写法可参照以下示例。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;

        #parent:after{

      content:".";

      height:0;

      visibility:hidden;

      display:block;

      clear:both;

     }

      3.设置overflow为hidden或者auto

      4.浮动外部元素

    九、CSS隐藏元素的几种方法(至少说出三种)

      Opacity:元素本身依然占据它自己的位置并对网页的布局起作用。它也将响应用户交互;
      Visibility:与 opacity 唯一不同的是它不会响应任何用户交互。此外,元素在读屏软件中也会被隐藏;
      Display:display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外,读屏软件也不会读到元素的内容。这种方式产生的效果就像元素完全不存在;
      Position:不会影响布局,能让元素保持可以操作;
      Clip-path:clip-path 属性还没有在 IE 或者 Edge 下被完全支持。如果要在你的 clip-path 中使用外部的 SVG 文件,浏览器支持度还要低;

    十、如何让一个盒子水平垂直居中

    复制代码

    复制代码

    //已知宽高<div class="div1"></div><style>
        .div1{
            width:400px;
            height:400px;
            position:absolute;
            left:50%;
            top:50% 
            margin:-200px 0 0 -200px;    }   
    </style>//未知宽高<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <style>
            .div1{
                position: absolute;
                left: 0;
                top: 0;
                bottom: 0;
                right: 0;
                margin: auto;
                border: 1px solid #000;
                width: 400px;
                height: 400px;        }    </style></head><body>    <div class="div1"></div></body></html>//未知宽高方法二:<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <style>
            .div1{
                position: absolute;
                left: 50%;
                top: 50%;
                transform: translate(-50%,-50%);
                border: 1px solid #000;
                width: 400px;
                height: 400px;        }    </style></head><body>    <div class="div1"></div></body></html>

    2

    JS部分

    1、cookie、localStorage、sessionStorage的区别和使用?

    cookie:是存储在本地的数据,有时候也用cookies,通常经过加密,应用最经典的就是判断注册用户是否已经登录过该网站。   localStorage:仅在客户端保存(即浏览器),不参与和服务器的通信;没有时间限制,即使浏览器关闭,数据依然存在;
       创建和访问localStorage:
            1)、设置数据:
            var forgetData = {phone:vm.phone};        localStorage.setItem("forgetData",JSON.Stringfy(forgetData));    //forgetData是存储在localStorage里边的本地数据;JSON.Stringfy(forgetData)是将数据转化为字符串格式;
                获取数据:
            vm.forgetData=JSON.parse(localStorage.getItem("forgetData"));  //将字符串转化为JSON化;
            2)、设置:localStorage.name = "zhao";
                 获取:localStorage.name    //zhao        localStorage.setItem(key,value);//设置数据        localStorage.getItem(key);//获取数据        localStorage.removeItem(key);//删除单个数据        localStorage.clear();//清除所有localStorage的数据
    
        sessionStorage:当用户的浏览器窗口关闭时,数据会被清除;
        
        共同点:都是保存在浏览器端,且同源的。
        区别:
            cookie数据始终在同源的http请求中携带9即使不需要),即cookie在浏览器和服务器之间来回传递;cookie数据还有路径的概念,可以限制cookie只属于某个路径下。存储大小限制也不同,cookie数据大小不能超过4K,同时因为每次http请求都会携带cookie,所以cookie只能保存很小的数据。
            sessionStorage和localStorage不会自动把数据发给服务器,只在本地保存,虽然也有大小限制,但是要比cookie大得多,可以达到5M或者更大。
            数据有效期不同,sessionStorage仅在当前浏览器窗口关闭前有效,不能持久保存;localStorage:始终有效,浏览器窗口关闭也一直保存;cookie:只在cookie设置的过期时间之前保存,即使浏览器窗口关闭。
            作用域不同,sessionStorage在不同浏览器窗口的数据不能共享,即使是同一个页面;localStorage在所有的同源窗口中都是共享的;cookie也是在同源窗口中共享的,

    2、如何实现浏览器多标签页之间的通信?

        调用localStorage、cookie本地存储方式。

    3、JavaScript的typeof返回类型有哪些?

    Object(null和Array)、number、undefined、string、Boolean、function

    4、类型转换

    强制转换:parseInt();parseFloat();number();

    5、数组的方法

    var list = [1,2,3];list.pop();//删除数组的最后一个元素 var list = [1,2];list.unshift(0,1);//头部添加  var list = [0,1,1,2,3];list.push(4,5);//尾部添加   var list = [1,2,3,4,5];var arr = list.concat(4,[5,6]);//把两个数组连接起来 //var arr = [1,2,3,4,5];  //var list = [1,2,3];list.join("-");    //1-2-3list.reverse();//3,2,1list.slice(1);//var list = [2,3];list.slice(1,2);//var list = [2];list.slice(1,-2);//设置了两个参数,终止下标为负数,当出现负数时,将负数加上数组长度的值来替换该位置的数。var arr = list.splice(0,1);//删除 var list = [2,3];  var arr = [1];可以删除任意数量的项,只需指定2个参数;要删除的第一项的位置和要删除的项数。例如splice(0,2);会删除当前数组的前两项list.splice(2,0,4,6);//插入,var list = [1,2,4,6,3]; 可以向指定位置插入任意数量的项,需要3个参数,起始位置、0(要删除的项数)、要插入的任意数量的项。例如splice(2,0,4,6);会从第二个位置插入4和6;list.splice(2,1,4,6);//替换,var list = [1,2,6,3]; 可以向指定位置插入任意数量的项,同时删除任意数量的项,需要3个参数,起始位置、要删除的项数、要插入的任意数量的项。例如splice(2,1,4,6);会从位置 2 开始插入4和6。list.sort();//按照第一个数字大小进行排序;function compare(a,b){
        return a-b;//正序;
        return b-a;//倒序;}list.sort(compare);

    6、ajax请求时get和post的区别?

    get:从服务器上获取数据,传送数据量小,安全性低,请求会被缓存,缓存是针对URL进行缓存的,get请求参数直接加在URL地址后面,一种参数组合就会产生一种URL的缓存,重复的请求结果是相同的;post:向服务器发送数据;传送数据量大,请求不会被缓存,参数封装在二进制的数据体中,服务器也不会记录参数,相对安全,所以涉及用户隐私的数据都要用post传送;

    7、ajax请求时,如何解释json数据?

    使用eval方法解析的时候,eval();不会去判断该字符串是否合法,而且json对象里的js方法也会被执行,这是非常危险的;推荐使用JSON.parse(); JSON.parse();把字符串转化成json。

    8、call和apply的区别?

    共同点:
        都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。
        另一种说法,都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行。
    不同点:
        apply();//最多只能有两个参数--新this对象和一个数组argArray,如果给该方法传递多个参数,则把参数都写进这个数组里边,当然,即使只有一个参数,也要写进数组里边。
        call();//可以接收多个参数,第一个参数apply()一样,后面则是一串参数列表。
        实际上,apply和call的功能是一样的,只是传入的参数列表的形式不同。

    9、http常用状态码?

        100  Continue  继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息    200  OK   正常返回信息    201  Created  请求成功并且服务器创建了新的资源    202  Accepted  服务器已接受请求,但尚未处理    301  Moved Permanently  请求的网页已永久移动到新位置。    302 Found  临时性重定向。    303 See Other  临时性重定向,且总是使用 GET 请求新的 URI。    304  Not Modified  自从上次请求后,请求的网页未修改过。    400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。    401 Unauthorized  请求未授权。    403 Forbidden  禁止访问。    404 Not Found  找不到如何与 URI 相匹配的资源。    500 Internal Server Error  最常见的服务器端错误。    503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。

    10.你有哪些性能优化的方法?

        (详情请看雅虎14条性能优化原则)。
    
          (1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
    
          (2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
    
          (3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
    
          (4) 当需要设置的样式很多时设置className而不是直接操作style。
    
          (5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
    
          (6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
    
          (7) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。

    11.深拷贝和浅拷贝

        基本类型指的是简单的数据段,引用类型指的是多个值构成的对象;    var name = "John"; // 基本类型值
    
        var obj = new Object(); 
        obj.name = "John"; 
        // obj 为引用类型值
        
        在复制变量中,对于基本类型来说,两者互不影响,    var num = 1;    var num1 = num; // num1 = 1;
    
        var num1 = 3; // num还是1,不会变
        
        浅拷贝和深拷贝的区别:
        对于浅拷贝来说,对于一个数组(数组是一个对象),只要我们修改了一个拷贝数组,原数组也会跟着改变。
        因为他们引用的是同一个地址的数据,拷贝的时候并没有给b数组创造独立的内存,只是把a数组指向数据的指针拷贝给了b;
        而深拷贝就与其相反,将会给b数组创造独立的内存,并且将a数组的内容一一拷贝进来,两者互不影响。
        
        实现深拷贝:
        一:层级拷贝,用递归实现;
        二:JSON解析        var b = JSON.parse(JSON.stringify(a));        

    3

    其他  

    一、怎么让Chrome支持小于12px 的文字?

    这个我们在做移动端的时候,设计师图片上的文字假如是10px,我们实现在网页上之后。往往设计师回来找我们,这个字体能小一些吗?我设计的是10px?为啥是12px?其实我们都知道,谷歌Chrome最小字体是12px,不管你设置成8px还是10px,在浏览器中只会显示12px,那么如何解决这个坑爹的问题呢?

    我们的做法是:

    针对谷歌浏览器内核,加webkit前缀,用transform:scale()这个属性进行缩放!

    <style>pspan{font-size:10px;-webkit-transform:scale(0.8);display:block;}</style><p><span>haorooms博客测试10px</span></p>

    二、IOS手机浏览器字体齿轮

    修改-webkit-font-smoothing属性,结果是:-webkit-font-smoothing:none:无抗锯齿-webkit-font-smoothing: antialiased | subpixel-antialiased |default:灰度平滑

    三、如何修改chrome记住密码后自动填充表单的黄色背景?

    大体可以通过input : -webkit-autofill来进行修改!

    input:-webkit-autofill {background-color:#FAFFBD;background-image: none;color:#000;}

    四、谷歌浏览器运行下面代码,并解释!

    [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)})

    运行上面代码之后,会发现HTML层都被使用不同的颜色添加了一个高亮的边框。为什么会这样呢?

    首先我们来看

    [].forEach.call(),关于call()和apply(),我前面有文章也写过,具体可以看http://www.haorooms.com/post/js_constructor_pro

    [].forEach.call()等价于Array.prototype.forEach.call()

    其次我们来看$$("*")

    你可以在你的Chrome浏览器控制台中输入$$('a'),然后你就能得到一个当前页面中所有锚元素的列表。

    $$函数是许多现代浏览器命令行API中的一个部分,它等价于document.querySelectorAll,你可以将一个CSS选择器作为这个函数的参数,然后你就能够获得当前页面中所有匹配这个CSS选择器的元素列表。如果你在浏览器控制台以外的地方,你可以使用document.querySelectorAll('')来代替$$('')

    为元素添加颜色

    为了让元素都有一个漂亮的边框,我们在上面的代码中使用了CSS属性outline。outline属性位于CSS盒模型之外,因此它并不影响元素的属性或者元素在布局中的位置,这对于我们来说非常有用。这个属性和修改border属性非常类似,因此下面的代码应该不会很难理解:

    a.style.outline="1px solid #"+ color

    真正有趣的地方在于定义颜色部分:

    (~~(Math.random()*(1<<24))).toString(16)

    ~~的作用相当于parseInt,和我前面讲解的“|”功能类似,关于运算符“I” ,可以去看看!

    通过上面代码可以获取到一个随机的颜色值!

    五、input [type=search] 搜索框右侧小图标如何美化?

    美化效果如下图:

    enter image description here

    右侧默认的比较难看的按钮,美化成右侧效果。

    input[type="search"]::-webkit-search-cancel-button{-webkit-appearance: none;height:15px;width:15px;border-radius:8px;background:url("images/searchicon.png")no-repeat 00;background-size:15px15px;}

    用到的是伪元素::-webkit-search-cancel-button,关于什么是伪类和为元素,请看:http://www.haorooms.com/post/css_wl_wys

    六、iOS safari 如何阻止“橡皮筋效果”?

    可以参考一下知乎上的回答 https://www.zhihu.com/question/22256539 。

    但是,我们遇到的问题不是这样,我是要解决弹跳导致弹出层(position:absolute)的覆盖层高度小于100%;

    针对这个问题,我想到的解决方案如下:

    方法一: 把position:absolute改成position:fixed,并在弹出层之后,设置body的高度是100%;overflow是hidden。

    方法二:

    思路是获取苹果浏览器导航栏的高度。然后滚动的时候,重新获取其高度。在导航栏高度变小的时候,给弹出层增加高度的百分比!

    代码如下:

    //ios safari 伸缩判断var topbarHeight=window.outerHeight-window.innerHeight,agent=navigator.userAgent,globleflag=true;
            $(window).scroll(function(){if(agent.indexOf("iPhone")!=-1|| agent.indexOf("iPad")!=-1){var topbarHeightNow=window.outerHeight-window.innerHeight;if(topbarHeightNow<topbarHeight){
                        globleflag=false//此处写处理逻辑}else{
                     globleflag=true//此处写处理逻辑}}});

    七、实现点击文字,文字后面radio选中效果

    这个效果是前端很经常用到和遇到的效果了,实现这个效果的方式也很多,很多朋友用js和jquery来实现,但是最简单的,我们可以直接用lable标签的 for 属性来实现。

    看下下面例子:

    <form><labelfor="male">Male</label><inputtype="radio"name="sex"id="male"/><br/><labelfor="female">Female</label><inputtype="radio"name="sex"id="female"/></form>

    label 的for属性后面跟着input的id,就可以点击label,来触发input效果了,大家可以试一试!

    八、网站中,图片文件(jpg,png,gif),如何点击下载?而非点击预览?

    我们平时在网站中的图片,假如我们要下载,如下写:

    <ahref="haorooms博客.jpg">下载</a>

    我们点击下载按钮,只会预览“haorooms博客.jpg”这张图片,并不会出现下载框,另存为那种?那么我们如何做呢?

    我们只需要如下写

    <ahref="haorooms博客.jpg"download>下载</a>

    就可以下载了。点击如下进行尝试吧!下载

    不但如次,我们还可以指定文件名称,如下写法:

    <ahref="haorooms博客.jpg"download="haoroom前端博客图片下载">下载</a>

    测试如下:下载

    上面就是指定下载的写法!

    九、Math.min()比Math.max()大

    Math.min()<Math.max()// falseMath.min()>Math.max()// true

    因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。

    前端技术栈问题

    1

    vue相关问题?  

    更多前端技能请关注公众号”极致简文“

    往期精彩回顾

    React组件与生命周期

    React函数组件和Class组件以及Hooks

    2020年最火爆的Vue.js面试题

    Redux使用之我要买个女朋友(入门篇)

    关注公众号,精彩不间断

    展开全文
  • Python写ROS话题

    千次阅读 2020-05-06 17:08:33
    Python写ROS话题导入ROS模块发送话题接收话题第一种方式:rospy.Subscriber第二种方式:rospy.wait_for_message完整程序多线程处理同时接受多个话题 导入ROS模块 用python编写ROS的程序有很多有点,Python的numpy...

    导入ROS模块

    用python编写ROS的程序有很多有点,Python的numpy模块可以方便快速的完成机器人规划、正逆运动学的开发,如果需要完成更复杂的计算功能,可以使用scipy模块完成科学计算,对采集数据的时间系列分析可以采用pandas做数据分析,最重要的是Python的matplotlib模块可以完成绝大部分的数据绘图,可以与pyqt5结合完成数据的可视化显示。当然Python还可以方便的调用机器人学习、深度学习等模块完成人工智能的开发,用最短的时间完成机器人的智能化。
    Python中使用ROS首先要导入rospy模块

    import rospy
    

    完成机械臂的控制还需要导入其他数据模块,ROS在C++中的数据类型在Python也可以找到,其中最常用的数据模块是std_msgs、sensor_msgs、geometry_msgs模块。

    from std_msgs.msg import Float64MultiArray
    from sensor_msgs.msg import JointState
    from geometry_msgs.msg import WrenchStamped
    

    发送话题

    ros话题是最常用的通讯方式,通过话题实现数据传输,下面将介绍话题发布。
    首先,需要建立一个一个节点,并发起一个或多个话题

    #建立节点
    rospy.init_node("joint_position_command", anonymous=True)
    #在该节点上发起话题
    pub = rospy.Publisher("/all_joints_position_group_controller/command", Float64MultiArray, queue_size=1)
    

    其次,设定发布的频率,每秒发送的次数

    rate = rospy.Rate(100) # 100hz
    

    然后,发送数据

    pub.publish(send_data)
    

    最后,需要休眠等待

    rate.sleep()
    

    完整的程序如下

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    # 本文档用于发送关节角度
    # 程序员:CYT
    # 版权:哈尔滨工业大学(深圳)
    # 日期:初稿:2019.11.6
    
    import rospy
    from std_msgs.msg import Float64MultiArray
    
    import os
    import numpy as np
    
    def talker():
        # 建立节点
        rospy.init_node("joint_position_command", anonymous=True)
        #建立话题
        pub = rospy.Publisher("joint_command", Float64MultiArray, queue_size=1)
        #设置发送频率
        rate = rospy.Rate(100)  # 100hz
    
        #假设数据
        command_pos = np.zeros([1000,7])
    
        # 重写数据
        kk = len(command_pos[:, 0])
        n = len(command_pos[0, :])
        command_data = np.zeros([kk, n])
        for i in range(kk):
            for j in range(n):
                command_data[i, j] = command_pos[i, j]
    
        #主循环中发送数据
        k = 0
        while not rospy.is_shutdown():
            if k == kk:
                break
            tip_str = "第 %s 次命令:" % k
            rospy.loginfo(tip_str)
    
            send_data = Float64MultiArray()
            send_data.data = command_data[k, :]
            print send_data.data
            #发送数据
            pub.publish(send_data)
            #休眠
            rate.sleep()
            k = k + 1
    
    if __name__ == '__main__':
        try:
            talker()
        except rospy.ROSInterruptException:
            pass
    

    接收话题

    Python接受话题有两种方式,但是与C++相比,其只有rospy.spin(),没有ros::spinOnce,所以想要在循环中处理需要特别注意。

    第一种方式:rospy.Subscriber

    第一种方式与c++类似,调用回调函数来处理,但是因为只有rospy.spin()来调用回调函数,所以程序会阻塞在回调函数中,接受到一个数据,调用一次。

    #建立节点
    rospy.init_node('listener', anonymous=True)
    #订阅话题
    rospy.Subscriber('/joint_states', JointState, callback)
    #调用回调函数,并阻塞,直到程序结束
    rospy.spin()
    

    第二种方式:rospy.wait_for_message

    该方法无需节点,也无需回调函数,其与一个函数类似,等待话题发布消息,当接收到一个消息时,返回数据,继续执行后面的程序。相对于第一种,我们把它称为半阻塞,接收的话题如果没有发布消息,它会一直等待,但是接收到一个消息后,等待结束,会继续执行后面的程序。

    msg2 = rospy.wait_for_message('/joint_states', JointState, timeout=None)
    

    完整程序

    通过两个函数演示两种不同的就收方法,当上文中话题启动后,下文中的程序就可接受到数据。

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    # 本文档用于接收信息
    # 程序员:CYT
    # 版权:哈尔滨工业大学(深圳)
    # 日期:初稿:2019.12.12
    
    import numpy as np
    
    import rospy
    from std_msgs.msg import Float64MultiArray
    
    def callback(data):
        print "msg:", data
    
    def listener1():
        #建立节点
        rospy.init_node('listener', anonymous=True)
        #订阅话题
        rospy.Subscriber('joint_command', Float64MultiArray, callback)
        #调用回调函数,并阻塞
        rospy.spin()
    
    def listener2():
        #用循环来订阅所有数据
        while not rospy.is_shutdown():
            #订阅话题
            msg = rospy.wait_for_message('joint_command', Float64MultiArray, timeout=None)
            print "msg: %s" % msg
    
    if __name__ == '__main__':
        #运行程序1
        #listener1()
        #运行程序2
        listener2()
    

    多线程处理同时接受多个话题

    在实际运用中,一个节点需要发送多个话题和接受多个话题,如机器人阻抗控制,需要同时接受关节角状态和末端六维力的数据,由于Python中没有ros::spinOnce,用rospy.spin()会阻塞程序,主程序无法执行其他模块,所以需要引入线程来处理。
    单独建立一个函数,存放rospy.spin(),用于线程调用

    def thread_spin(self):
        rospy.spin()
    

    调用线程处理回调函数,使其在子线程中阻塞,主程序正常运行

    # 运行线程1,收话题线程
    t1 = threading.Thread(target=self.thread_spin)
    t1.start()
    

    如果采用第二中方式,程序可以类似于C++的ros::spinOnce处理话题接受,当并不相同,且存在一个缺点:rospy.wait_for_message会一直等待话题,直到接收到一个数据,其等待时间与所接受的话题有关,所以其主程序循环周期不稳定。

    def listener2(self):
            # 用循环来订阅所有数据
            while not rospy.is_shutdown():
                # 订阅话题
                msg1 = rospy.wait_for_message('joint_command1', Float64MultiArray, timeout=None)
                print "msg1: %s" % msg1
                msg2 = rospy.wait_for_message('joint_command2', Float64MultiArray, timeout=None)
                print "msg2: %s" % msg2
                #处理其他函数
                print "处理其他函数!"
    

    多个回调函数的数据可以通过全局变量供主函数调用,也可以采用类来写该函数,通过类变量共享的特点实现数据调用。

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    # 本文档用于接收信息
    # 程序员:CYT
    # 版权:哈尔滨工业大学(深圳)
    # 日期:初稿:2019.12.12
    
    import numpy as np
    #ros模块
    import rospy
    from std_msgs.msg import Float64MultiArray
    #线程
    import threading
    
    class SubTopic(object):
        #定义全局变量
        qq = np.zeros(7)
        F = np.zeros(6)
        def __init__(self,flag = True):
            self.init()
            self.flag = flag
        def init(self):
            #调用第一个函数
            if(self.flag==True):
                print "第一种方式,多线程处理"
                self.listener1()
            else:
                print "第二中方式处理"
                self.listener2()
    
        def thread_spin(self):
            rospy.spin()
    
        def callback1(self, data):
            print "msg1:", data
    
        def callback2(self, data):
            print "msg2:", data
    
        def listener1(self):
            # 建立节点
            rospy.init_node('listener', anonymous=True)
            # 订阅话题
            rospy.Subscriber('joint_command1', Float64MultiArray, self.callback1)
            rospy.Subscriber('joint_command2', Float64MultiArray, self.callback2)
            # 运行线程1,收话题线程
            t1 = threading.Thread(target=self.thread_spin)  # 末端位置订阅线程
            t1.start()
            #处理其他函数
            while not rospy.is_shutdown():
                #处理其他函数
                print "处理其他函数!"
    
        def listener2(self):
            # 用循环来订阅所有数据
            while not rospy.is_shutdown():
                # 订阅话题
                msg1 = rospy.wait_for_message('joint_command1', Float64MultiArray, timeout=None)
                print "msg1: %s" % msg1
                msg2 = rospy.wait_for_message('joint_command2', Float64MultiArray, timeout=None)
                print "msg2: %s" % msg2
                #处理其他函数
                print "处理其他函数!"
    
    
    展开全文
  • 《人工智能杂记》人工智能时间简史

    万次阅读 多人点赞 2018-03-13 08:54:55
    在1955年,约翰·麦卡锡与另一位人工智能先驱马文·明斯基以及“信息论”创始人克劳德·香农一道作为发起人,邀请各路志同道合的专家学者在达特茅斯学院共同讨论人工智能。会上,正是约翰•麦卡锡说服大家使用人工...

    1人工智能基本概念

    人工智能(Artificial Intelligence,AI)是指计算机像人一样拥有智能能力,是一个融合计算机科学、统计学、脑神经学和社会科学的前沿综合学科,可以代替人类实现识别、认知,分析和决策等多种功能。如当你说一句话时,机器能够识别成文字,并理解你话的意思,进行分析和对话等。

    这里写图片描述

    2人工智能发展历程

    **人工智能的起源:**人工智能在五六十年代时正式提出,1950年,一位名叫马文·明斯基(后被人称为“人工智能之父”)的大四学生与他的同学邓恩·埃德蒙一起,建造了世界上第一台神经网络计算机。这也被看做是人工智能的一个起点。巧合的是,同样是在1950年,被称为“计算机之父”的阿兰·图灵提出了一个举世瞩目的想法——图灵测试。按照图灵的设想:如果一台机器能够与人类开展对话而不能被辨别出机器身份,那么这台机器就具有智能。而就在这一年,图灵还大胆预言了真正具备智能机器的可行性。1956年,在由达特茅斯学院举办的一次会议上,计算机专家约翰·麦卡锡提出了“人工智能”一词。后来,这被人们看做是人工智能正式诞生的标志。就在这次会议后不久,麦卡锡从达特茅斯搬到了MIT。同年,明斯基也搬到了这里,之后两人共同创建了世界上第一座人工智能实验室——MIT AI LAB实验室。值得追的是,茅斯会议正式确立了AI这一术语,并且开始从学术角度对AI展开了严肃而精专的研究。在那之后不久,最早的一批人工智能学者和技术开始涌现。达特茅斯会议被广泛认为是人工智能诞生的标志,从此人工智能走上了快速发展的道路。

    人工智能的第一次高峰 在1956年的这次会议之后,人工智能迎来了属于它的第一段Happy Time。在这段长达十余年的时间里,计算机被广泛应用于数学和自然语言领域,用来解决代数、几何和英语问题。这让很多研究学者看到了机器向人工智能发展的信心。甚至在当时,有很多学者认为:“二十年内,机器将能完成人能做到的一切。”

    人工智能第一次低谷: 70年代,人工智能进入了一段痛苦而艰难岁月。由于科研人员在人工智能的研究中对项目难度预估不足,不仅导致与美国国防高级研究计划署的合作计划失败,还让大家对人工智能的前景蒙上了一层阴影。与此同时,社会舆论的压力也开始慢慢压向人工智能这边,导致很多研究经费被转移到了其他项目上。
    在当时,人工智能面临的技术瓶颈主要是三个方面,第一,计算机性能不足,导致早期很多程序无法在人工智能领域得到应用;第二,问题的复杂性,早期人工智能程序主要是解决特定的问题,因为特定的问题对象少,复杂性低,可一旦问题上升维度,程序立马就不堪重负了;第三,数据量严重缺失,在当时不可能找到足够大的数据库来支撑程序进行深度学习,这很容易导致机器无法读取足够量的数据进行智能化。
    因此,人工智能项目停滞不前,但却让一些人有机可乘,1973年Lighthill针对英国AI研究状况的报告。批评了AI在实现“宏伟目标”上的失败。由此,人工智能遭遇了长达6年的科研深渊。

    人工智能的崛起 1980年,卡内基梅隆大学为数字设备公司设计了一套名为XCON的“专家系统”。这是一种,采用人工智能程序的系统,可以简单的理解为“知识库+推理机”的组合,XCON是一套具有完整专业知识和经验的计算机智能系统。这套系统在1986年之前能为公司每年节省下来超过四千美元经费。有了这种商业模式后,衍生出了像Symbolics、Lisp Machines等和IntelliCorp、Aion等这样的硬件,软件公司。在这个时期,仅专家系统产业的价值就高达5亿美元。

    人工智能第二次低谷:可怜的是,命运的车轮再一次碾过人工智能,让其回到原点。仅仅在维持了7年之后,这个曾经轰动一时的人工智能系统就宣告结束历史进程。到1987年时,苹果和IBM公司生产的台式机性能都超过了Symbolics等厂商生产的通用计算机。从此,专家系统风光不再。

    人工智能再次崛起: 上世纪九十年代中期开始,随着AI技术尤其是神经网络技术的逐步发展,以及人们对AI开始抱有客观理性的认知,人工智能技术开始进入平稳发展时期。1997年5月11日,IBM的计算机系统“深蓝”战胜了国际象棋世界冠军卡斯帕罗夫,又一次在公众领域引发了现象级的AI话题讨论。这是人工智能发展的一个重要里程。

    2006年,Hinton在神经网络的深度学习领域取得突破,人类又一次看到机器赶超人类的希望,也是标志性的技术进步。

    【注】Geoffrey Hinton的论文《A fast learning algorithm for deep belief nets》链接地址
    在最近三年引爆了一场商业革命。谷歌、微软、百度等互联网巨头,还有众多的初创科技公司,纷纷加入人工智能产品的战场,掀起又一轮的智能化狂潮,而且随着技术的日趋成熟和大众的广泛接受,这一次狂潮也许会架起一座现代文明与未来文明的桥梁。

    这里写图片描述

    2016 年,Google 的 AlphaGo 赢了韩国棋手李世石,再度引发 AI 热潮。

    这里写图片描述

    AI不断爆发热潮,是与基础设施的进步和科技的更新分不开的,从 70 年代 personal 计算机的兴起到 2010 年 GPU、异构计算等硬件设施的发展,都为人工智能复兴奠定了基础。

    这里写图片描述

    同时,互联网及移动互联网的发展也带来了一系列数据能力,使人工智能能力得以提高。而且,运算能力也从传统的以 CPU 为主导到以 GPU 为主导,这对 AI 有很大变革。算法技术的更新助力于人工智能的兴起,最早期的算法一般是传统的统计算法,如 80 年代的神经网络,90 年代的浅层,2000 年左右的 SBM、Boosting、convex 的 methods 等等。随着数据量增大,计算能力变强,深度学习的影响也越来越大。2011 年之后,深度学习的兴起,带动了现今人工智能发展的高潮。

    小贴士:人工智能开创先驱

    第一位名人大家耳熟能详,那就是大名鼎鼎的“计算机科学之父”和“人工智能之父”——阿兰·图灵(Alan Mathison Turing)。他对人工智能的贡献集中体现于两篇论文:一篇是1936年发表的《论数字计算在决断难题中的应用》,在文中他对“可计算性”下了一个严格的数学定义,并提出著名的“图灵机”设想,从数理逻辑上为计算机开创了理论先河;而另一篇论文对人工智能的影响更为直接,其名字就是《机器能思考吗》,在这篇论文中,图灵提出了一种判定机器是否具有智能的实验方法,即著名的图灵测试:如果一台机器能够与人类展开对话而不能被辨别出其机器身份,那么这台机器就是智能的。“中文房间实验”正是图灵测试的一个变种。可以说,图灵是第一个严肃地探讨人工智能标准的人物,被称作“人工智能之父”当之无愧。

    第二位名人是一位神童,18岁即取得数理逻辑博士学位,这就是“控制论之父”维纳(Norbert Wiener)。1940年,维纳开始考虑计算机如何能像大脑一样工作,发现了二者的相似性。维纳认为计算机是一个进行信息处理和信息转换的系统,只要这个系统能得到数据,就应该能做几乎任何事情。他从控制论出发,特别强调反馈的作用,认为所有的智能活动都是反馈机制的结果,而反馈机制是可以用机器模拟的。维纳的理论抓住了人工智能核心——反馈,因此可以被视为人工智能“行为主义学派”的奠基人,其对人工神经网络的研究也影响深远。

    第三位名人经常与图灵抢“人工智能之父”的帽子,第一次提出了“人工智能(Artificial Intelligence)”这一名词。他就是LISP语言发明者,真正的“人工智能之父”约翰·麦卡锡(John McCarthy)。在1955年,约翰·麦卡锡与另一位人工智能先驱马文·明斯基以及“信息论”创始人克劳德·香农一道作为发起人,邀请各路志同道合的专家学者在达特茅斯学院共同讨论人工智能。会上,正是约翰•麦卡锡说服大家使用人工智能(Artificial Intelligence)这一术语,参会人员也热烈讨论了自动计算机、自然语言处理和神经网络等经典人工智能命题。

    3人工智能的研究领域及分层

    人工智能研究的领域主要有五层,最底层是基础设施建设,包含数据和计算能力两部分,数据越大,人工智能的能力越强。往上一层为算法,如卷积神经网络、LSTM 序列学习、Q-Learning、深度学习等算法,都是机器学习的算法。第三层为重要的技术方向和问题,如计算机视觉,语音工程,自然语言处理等。还有另外的一些类似决策系统,像 reinforcement learning(编辑注:增强学习),或像一些大数据分析的统计系统,这些都能在机器学习算法上产生。第四层为具体的技术,如图像识别、语音识别、机器翻译等等。最顶端为行业的解决方案,如人工智能在金融、医疗、互联网、交通和游戏等上的应用,这是我们所关心它能带来的价值。

    这里写图片描述

    值得一提的是机器学习同深度学习之间还是有所区别的,机器学习是指计算机的算法能够像人一样,从数据中找到信息,从而学习一些规律。虽然深度学习是机器学习的一种,但深度学习是利用深度的神经网络,将模型处理得更为复杂,从而使模型对数据的理解更加深入。

    关于人工智能、机器学习和深度学习之间的关系请看笔者的另一篇文章。

    4人工智能的应用场景

     计算机视觉
    2000年左右,人们开始用机器学习,用人工特征来做比较好的计算机视觉系统。如车牌识别、安防、人脸等技术。而深度学习则逐渐运用机器代替人工来学习特征,扩大了其应用场景,如无人车、电商等领域。

     语音技术
    2010 年后,深度学习的广泛应用使语音识别的准确率大幅提升,像 Siri、Voice Search 和 Echo 等,可以实现不同语言间的交流,从语音中说一段话,随之将其翻译为另一种文字;再如智能助手,你可以对手机说一段话,它能帮助你完成一些任务。与图像相比,自然语言更难、更复杂,不仅需要认知,还需要理解。

     自然语言处理
    目前一个比较重大的突破是机器翻译,这大大提高了原来的机器翻译水平,举个例子,Google 的 Translation 系统,是人工智能的一个标杆性的事件。2010 年左右, IBM 的"Watson"系统在一档综艺节目上,和人类冠军进行自然语言的问答并获胜,代表了计算机能力的显著提高。

     决策系统
    决策系统的发展是随着棋类问题的解决而不断提升,从 80 年代西洋跳棋开始,到 90 年代的国际象棋对弈,机器的胜利都标志了科技的进步,决策系统可以在自动化、量化投资等系统上广泛应用。

     大数据应用
    可以通过你之前看到的文章,理解你所喜欢的内容而进行更精准的推荐;分析各个股票的行情,进行量化交易;分析所有的像客户的一些喜好而进行精准的营销等。机器通过一系列的数据进行判别,找出最适合的一些策略而反馈给我们。

    5人工智能的挑战

    计算机视觉:未来的人工智能应更加注重效果的优化,加强计算机视觉在不同场景、问题上的应用。
    语音识别:当前的语音识别虽然在特定的场景(安静的环境)下,已经能够得到和人类相似的水平。但在噪音情景下仍有挑战,如原场识别、口语、方言等长尾内容。未来需增强计算能力、提高数据量和提升算法等来解决这个问题。

    自然语言处理:机器的优势在于拥有更多的记忆能力,但却欠缺语意理解能力,包括对口语不规范的用语识别和认知等。人说话时,是与物理事件学相联系的,比如一个人说电脑,人知道这个电脑意味着什么,或者它是能够干些什么,而在自然语言里,它仅仅将"电脑"作为一个孤立的词,不会去产生类似的联想,自然语言的联想只是通过在文本上和其他所共现的一些词的联想, 并不是物理事件里的联想。所以如果要真的解决自然语言的问题,将来需要去建立从文本到物理事件的一个映射,但目前仍没有很好的解决方法。因此,这是未来着重考虑的一个研究方向。

    决策系统:存在两个问题,第一是不通用,即学习知识的不可迁移性,如用一个方法学了下围棋,不能直接将该方法转移到下象棋中,第二是大量模拟数据。所以它有两个目标,一个是算法的提升,如何解决数据稀少或怎么自动能够产生模拟数据的问题,另一个是自适应能力,当数据产生变化的时候,它能够去适应变化,而不是能力有所下降。所有一系列这些问题,都是下一个五或十年我们希望很快解决的。

    这里写图片描述

    欢迎访问我的网站:

    BruceOu的哔哩哔哩
    BruceOu的主页
    BruceOu的博客
    CSDN博客

    接收更多精彩文章及资源推送,请订阅我的微信公众号:

    在这里插入图片描述

    展开全文
  • DBA学习计划

    万次阅读 多人点赞 2018-06-17 13:11:24
    这其中,本地讨论组是一种非常好的资源,很多时候还会举行线下的聚会,讨论数据库相关的话题。  四、中级DBA进阶  请记住,SQL语言、关系型数据库理论和基本的数据库管理任务,是作为一名初级DBA所必备的技术理论...
  • 热点话题 :《三体》即将动画化,PV首映B站。 活动名称:科幻与二次元碰撞,超现实的结合。 活动形式: 1.微博晒三体的图片和视频,任何形式都行,点赞量达5可参与三体周边的抽奖; 2.B站发起CV活动,网友可充分想象...
  • 如今,话题营销早已成为了互联网营销中最快捷、影响力最大的营销方式之一,诸多企业也纷纷加入到话题营销的队伍中来,但是新接触话题营销的企业,对于话题营销的很多概念比较模糊,比如:企业引入话题营销的最终目的...
  • 由两个#框起来的文字,新浪官方的说法就是“话题”,简单来说就是搜索微博时用的关键字,也可以说是你给某条微博贴的一个标签,方便它与其他提到该关键字的内容相互关联起来。 【格式】#+关键字+# 例如:#超级...
  • 此前分享过一篇知乎的爬虫《Python网络爬虫实战:爬取知乎话题下 18934 条回答数据》,这篇爬虫主要是用来爬取知乎中一个问题下的全部回答数据。 而在后续跟读者朋友们的交流中发现,大家关心的其实不仅局限在爬取...
  • 面试话题讨论题 有些事情非常非常非常非常重要。 例如John Cleese 。 对于空白也是如此: 空格脱落 是。 仅23小时即可获得1080点Reddit Karma积分(非常需要!)。 这比我们曾经错误地想到的关于Java和SQL...
  • MQTT协议

    千次阅读 2016-04-26 21:48:31
    MQTT协议摘要MQ遥测传输(MQ Telemetry Transport,MQTT)是一个轻量级的基于代理的发布/订阅式消息传输协议,它的设计目标是开放、简单、轻量和易于实现。这些特征使它适用于各种受限环境,比如,但不限于: ...
  • 模拟登陆新浪微博,爬取新浪微博的热门话题版块的24小时内的前TOP100的话题名称、该话题的阅读数、讨论数、粉丝数、话题主持人,以及对应话题主持人的关注数、粉丝数和微博数。 二、开发语言 pyt...
  • 成员可以在项目组内发起话题讨论,讨论可以纯文本形式,也可以带上传附件,话题发起时可以@邀请某位或某几位成员参与,被@的成员在登陆系统时能接收到话题邀请的通知,并选择是否同意。同意参与话题的成员可以参与该...
  • 拉手网的话题检测与跟踪

    千次阅读 2016-05-12 11:11:33
    话题检测与跟踪即可解决人们对海量信息的甄选,选择自己感兴趣的话题进行了解,也可以对公司的舆情进行监控。 话题检测与跟踪(Topic Detection and Tracking,简写为TDT)是由美国国际高级研究计划局(DARPA)发
  • 发起http请求,一个cURL就够了

    千次阅读 2020-05-27 09:25:40
    curl支持n多协议(ftp、smtp等等),本文只讨论有关http基于命令行的相关话题,使用curl完全可以轻而易举地取代postman之流的图形界面工具。下面看下使用curl发起http请求。 1.发起http get请求 curl ...
  • 想必各位攻城狮都做过或者接触过OA系统,说到OA系统肯定离不开一个技术话题,那就是工作流~实现的手段五花八门,有公司内部自己独立研发、有结合其他三方插件然后编写业务代码实现的、也有直接采购工作流产品的。...
  • 既能够是品牌,也能够是话题发起者、参加者,因此品牌的植入能够做到愈加天然和隐性,也 给品牌留下了宽广的营销发挥空间。在方式和内容上,短视频较之于传统图文,更赋有旺盛生命力。 在千禧一代的网络方针受众...
  • 5)发起话题讨论 6)共享重要日程,定时提醒 3. 多平台支持 消息、公告、文件同时发送到手机和PC,不会错过任何重要信息。 4. 云端备份 云端保存联系人名片,重要文件,话题,图片。 信鸽截图
  • 5.6.3 密码学 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.6.3.1 选择加密方法 在上面的示例代码中,我们展示了三种加密方法的...
  • 群主可以设置不是会员也可以发起话题,或者回帖; 增加群组推荐功能,站长可以将特定群组进行推荐。 视频认证 新增视频认证功能,让好友之间由虚变实。 借助统一的视频认证审核平台,对于有能力审核的站长,可以...
  • 本次会议由上海浦东软件园、中国科学院上海高等研究院等主办,作为人工智能领域的一次盛会,本次大会汇聚了全球人工智能领域的顶级专家、学者和产业界优秀人才,围绕当前热点话题、核心技术等问题进行了深入交流和...
  • 微信读书产品调研报告

    千次阅读 2020-02-14 21:36:15
    《网易蜗牛读书》就在书桌功能页面增添了话题和书单的入口(区别是《网易蜗牛读书》的书桌上默认为一本书)。   3. 产品功能结构   微信读书的tab栏中虽然只有四个标签,但是个人认为它的主要功能模块...
  • 崔知事的开明心态和对区块链的理解,使我确定这次会上我们可以谈一些实质性和前沿性的话题。 崔知事在交流中说自己对区块链的了解并不深,但他点出了几个点,却是打中了区块链整个产业发展的命门。我想这可能是...
  • OPPO对诺基亚发起5G专利侵权诉讼

    千次阅读 2021-09-07 10:38:30
    据集微网报道称,近日,OPPO在中国和欧洲分别对诺基亚发起数起专利侵权诉讼,其中涉案的专利均为5G标准必要专利。显然,这是OPPO对月前诺基亚发起全球专利诉讼的反击。 随着5G技术逐渐商用,以OPPO为代表的中国手机...
  • 公众号发起话题思考打卡赠书活动!然后有位读者建议,把每天打卡优秀的话题思考的留言整理出来,让大家能在最短的时间内看到大家最精彩的留言 。我也觉得这建议非常好,所以小猿就...
  • 群主可以设置不是会员也可以发起话题,或者回帖; 增加群组推荐功能,站长可以将特定群组进行推荐。 视频认证 新增视频认证功能,让好友之间由虚变实。 借助统一的视频认证审核平台,对于有能力审核的站长,可以...
  • 群主可以设置不是会员也可以发起话题,或者回帖; 增加群组推荐功能,站长可以将特定群组进行推荐。 视频认证 新增视频认证功能,让好友之间由虚变实。 借助统一的视频认证审核平台,对于有能力审核的站长,可以...
  • 群主可以设置不是会员也可以发起话题,或者回帖; 增加群组推荐功能,站长可以将特定群组进行推荐。 视频认证 新增视频认证功能,让好友之间由虚变实。 借助统一的视频认证审核平台,对于有能力审核的站长,可以...
  • 群主可以设置不是会员也可以发起话题,或者回帖; 增加群组推荐功能,站长可以将特定群组进行推荐。 视频认证 新增视频认证功能,让好友之间由虚变实。 借助统一的视频认证审核平台,对于有能力审核的站长,可以...
  • 群主可以设置不是会员也可以发起话题,或者回帖; 增加群组推荐功能,站长可以将特定群组进行推荐。 视频认证 新增视频认证功能,让好友之间由虚变实。 借助统一的视频认证审核平台,对于有能力审核的站长,可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,365
精华内容 10,546
关键字:

发起话题