首页 文章 精选 留言 我的

精选列表

搜索[禅道],共6139篇文章
优秀的个人博客,低调大师

史上最难的一道Java面试题:分析篇

无意中了解到如下题目,觉得蛮好。 题目如下: 该程序的输出结果? 程序输出结果 考察知识点 synchronize实例锁。 并发下的内存可见性。 在java中,多线程的程序最难理解、调试,很多时候执行结果并不像我们想象的那样执行。所以在java多线程特别难,依稀记得大学的时候考c语言二级的时候,里面的题目是什么++和很多其他优先级的符合在一起问最后的输出结果,这类题目就想考一些运行符优先级和结合性问题。那个背背就行了,但是java多线程还是需要好好理解才行,靠背是不行的。 下面开始简单分析: 该题目涉及到2个线程(主线程main、子线程)、关键词涉及到synchronized、Thread.sleep。 synchronized关键词还是比较复杂的(可能有时候没有理解到位所以上面题目会有点误区),他的作用就是实现线程的同步(实现线程同步有很多方法,它只是一种后续文章会说其他的,需要好好研究大神Doug Lea的一些实现),它的工作就是对需要同步的代码加锁,使得每一次只有一个线程可以进入同步块(其实是一种悲观策略)从而保证线程只记得安全性。 一般关键词synchronized的用法 指定加锁对象:对给定对象加锁,进入同步代码前需要活的给定对象的锁。 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。 上面的代码,synchronized用法其实就 属于第二种情况。直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。 可能存在的误区 由于对synchronized理解的不到为,由于很多时候,我们多线程都是操作一个synchronized的方法,当2个线程调用2个不同synchronized的方法的时候,认为是没有关系的,这种想法是存在误区的。直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。 如果一个调用synchronized方法。另外一个调用普通方法是没有关系的,2个是不存在等待关系的。 这些对于后面的分析很有作用。 Thread.sleep 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常,对于后面的分析很有作用。 分析流程 java 都是从main方法执行的,上面说了有2个线程,但是这里就算修改线程优先级也没用,优先级是在2个程序都还没有执行的时候才有先后,现在这个代码一执行,主线程main已经执行了。 对于属性变量 int b =100由于使用了synchronized也不会存在可见性问题(也没有必要在说使用volatile申明)。 当执行1步骤的时候(Thread t = new Thread(tt); //1)线程是new状态,还没有开始工作。 当执行2步骤的时候(t.start(); //2)当调用start方法,这个线程才正真被启动,进入runnable状态,runnable状态表示可以执行,一切准备就绪了,但是并不表示一定在cpu上面执行,有没有真正执行取决服务cpu的调度。 在这里当执行3步骤必定是先获得锁(由于start需要调用native方法,并且在用完成之后在一切准备就绪了,但是并不表示一定在cpu上面执行,有没有真正执行取决服务cpu的调度,之后才会调用run方法,执行m1方法)。 这里其实2个synchronized方法里面的Thread.sheep其实要不要是无所谓的,估计是就为混淆增加难度。3步骤执行的时候其实很快子线程也准备好了,但是由于synchronized的存在,并且是作用同一对象,所以子线程就只有必须等待了。由于main方法里面执行顺序是顺序执行的,所以必须是步骤3执行完成之后才可以到4步骤,而由于3步骤执行完成,子线程就可以执行m1了。 这里就存在一个多线程谁先获取到问题,如果4步骤先获取那么main thread b=2000,如果子线程m1获取到可能就b已经赋值成1000或者还没有来得及赋值4步骤就输出了可能结果就是main thread b=1000或者main thread b=2000,在这里如果把6步骤去掉那么b=执行在前和main thread b=在前就不确定了。但是由于6步骤存在,所以不管怎么都是main thread b=在前面,那么等于1000还是2000看情况,之后b=1000是一定固定的了。 多线程一些建议 线程也很珍贵,所以建议使用线程池,线程池用的很多,后续准备分享下,特别总要,需要做到心中有数。 给线程起名字,当线上cpu高的时候,需要用到高级jstack,如果有名称就方便很多。 多线程特别需要注意线程安全问题,也需要了解jdk那些是线程安全不安全,那样使用的时候不会出现莫名其妙问题。 还有一些技巧后续文章分享在慢慢提,多线程特别重要,也特别难,希望大家也多多花心思在上面。 多线程的一些调试技巧 由于断点,所有线程经过断点的时候,都需要停下,导致这个点不停的断住,很难受,eclispe里面有条件断点,当满足条件的时候就可以停下来,那么这样就方便了。 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

九道前端面试题及答案,妹子总结的

1、什么是W3C标准? WEB标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。 2、bootstrap响应式原理 是通过栅格系统和媒体查询实现的 // 小屏幕(平板,大于等于 768px)@media (min-width: @screen-sm-min) { ... }// 中等屏幕(桌面显示器,大于等于 992px)@media (min-width: @screen-md-min) { ... }// 大屏幕(大桌面显示器,大于等于 1200... 3、HTML/XHTM的区别 XHTML 与 HTML 4.01 标准没有太多的不同。 XHTML 元素必须被正确地嵌套。 XHTML 元素必须被关闭。 标签名必须用小写字母。 XHTML 文档必须拥有根元素。 4、页面构架和布局 布局可以是编码方面的,也可以是视觉方面的。 编码方面的涉及到语义化标签(也包含了div+css)布局、iframe框架(特殊地方使用)布局和表格布局(只用于一些特殊的地方,不推荐全站使用),具体你可以百度下了解学习下相关知识。 如果是视觉交互方面的,就比较多了,每年都会有新的设计布局,高级一点的比如视差类型布局,全屏布局,瀑布流,无缝拼图布局等,这些都不局限于传统的布局方式;传统电子商务、信息类的大多采用单栏、两栏或者三栏布局,还有更多栏布局;分辨率相关的宽屏布局和窄屏布局,感应式布局。太多的选择了,要学习的东西也比较多,要慢慢了解啦。还有更多的布局需要慢慢摸索和体验。我把我知道的说了。 至于手机端,例举一些:竖排列表、横排方块、九宫格、TAB切换式、手风琴布局(有多个分类及其内容同时展示)、抽屉/侧边栏、标签场景式),因为屏幕小,要增加用户体验都可以根据具体情况用不同的布局方式。 5、BootStrap学习笔记,优缺点总结 优点: BT的优势之一就是可以根据用户屏幕尺寸调整页面,使其在各个尺寸上都表现良好。 BT预先定义了很多CSS类,使用的时候直接给class赋予对应的类名即可,如text-left,text-align,.table等。最有代表性的就是btn类,BT定义了一个.bt的基础类,如果还想要其他样式可以在这个基础类上进行扩展,实现不同的视觉效果。 BT的JavaScript插件非常丰富,既可以用现成的也可以自己扩充,BT提供了一个集成板的BT.js您可以直接拿过来使用也可以单个使用引入*.js即可。 不足: 对IE兼容也存在不小的问题,BT将所有的元素盒模型都设置成了border-box,这是IE混杂模式下的盒模型,光这点就导致了不能兼容IE。此外还用到了大量的H5标签以及CSS3语法,这些语法标签兼容性方面同样存在不小的问题,当然网上存在很多兼容IE的办法,但需要引入其他文件,有些还不小,势必导致加载速度变慢,影响用户体验。 BT对IE6,7的兼容性肯定不好,对IE8的支持也需要一些额外的文件。 IE8的媒体查询需要response.js的配合才能实现 BT 不支持 IE 古老的兼容模式。为了让 IE 浏览器运行最新的渲染模式下,建议将此 <meta> 标签加入到你的页面中: <meta http-equiv="X-UA-Compatible" content="IE=edge"> 按 F12 键打开 IE 的调试工具,就可以看到 IE 当前的渲染模式是什么。 BT属于前端UI库,可以快速搭建前端页面,以及设计响应式界面,还可以使用saas重新设计组件, 6、JQeury学习笔记,优缺点总结 优点: jQuery实现脚本与页面的分离,是操作DOM的首选js库。 最少的代码做最多的事情 最少的代码做最多的事情,这是jQuery的口号,而且名副其实。使用它的高级selector,开发者只需编写几行代码就能实现令人惊奇的效果。开发者无需过于担忧浏览器差异,它除了还完全支持Ajax,而且拥有许多提高开发者编程效率的其它抽象概念。jQuery把JavaScript带到了一个更高的层次。以下是一个非常简单的示例: 代码如下: $("p.neat").addClass("ohmy").show("slow"); 通过以上简短的代码,开发者可以遍历“neat”类中所有的<p>元素,然后向其增加“ohmy”类,同时以动画效果缓缓显示每一个段落。开发者无需检查客户端浏览器类型,无需编写循环代码,无需编写复杂的动画函数,仅仅通过一行代码就能实现上述效果。 性能 在大型JavaScript框架中,jQuery对性能的理解最好。尽管不同版本拥有众多新功能,其最精简版本只有18KB大小,这个数字已经很难再减少。jQuery的每一个版本都有重大性能提高。 插件 基于jQuery开发的插件目前已经有大约数千个。开发者可使用插件来进行表单确认、图表种类、字段提示、动画、进度条等任务。 节省开发者学习时间 当然要想真正学习jQuery,开发者还是需要投入一点时间,尤其是如果你要编写大量代码或自主插件的话,更是如此。但是,开发者可以采取“各个击破”的方式,而且jQuery提供了大量示例代码,入门是一件非常容易的事情。 不足: 不能向后兼容 插件兼容性。 jQuery的稳定性 在大型框架中,jQuery核心代码库对动画和特效的支持相对较差。 7、”高内聚 ,低耦合“到底是什么意思? ‘高内聚,低耦合’是相对于代码而言,一个项目中: 每个模块之间相互联系的紧密程度,模块之间联系越紧密,则耦合性越高,模块的独立性就越差!反之同理; 一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即‘高内聚’ !如:一个项目中有20个方法调用良好,但是要修改了其中一个,另外的19个都要进行修改,这就是高耦合!独立性太差! 现在的软件结构设计,都会要求“高内聚,低耦合”,来保证软件的高质量!mark! 8、对前后端联合开发 的技术原理(Ajax、Json)有一定认识,理解DOM、Xml概念, 熟悉前后台交互方式。 Ajax异步交互原理:Ajax其核心有JavaScript、XMLHTTPRequest、DOM对象组成,通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用JavaScript来操作DOM而更新页面。 Json:一般我用的比较多的是通过AJAX异步来获取JSON数据。 DOM:文档对象模型,一个网页中所有的东西都是dom节点,根节点是<html>,它可以无线嵌套。用来获取或设置文档中标签的属性,例如获取或者设置input表单的value值。 BOM:浏览器对象模型。用来获取或设置浏览器的属性、行为,例如:新建窗口、获取屏幕分辨率、浏览器版本号等。 XML:被设计用来传输和存储数据,被设计用来格式化和显示数据。仅仅是纯文本。 -前后台交互方式: 9、GET和POST请求的区别 GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。 GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码. 原文发布时间:2018年05月31日 作者:O_禾火_O 本文来源:奔三路学习网如需转载请联系原作者

优秀的个人博客,低调大师

IoT 布局有“道”,看 IC 厂商如何化繁为“简”?

从互联网、到移动互联网、再到物联网,连接的形态正在发生着翻天覆地的变化。 从互联网、到移动互联网、再到物联网,连接的形态正在发生着翻天覆地的变化。互联网时代,主要是电脑与网络间的连接;移动互联网时代,则使得手机与电脑和网络连接在一起。而物联网时代,将会让各种各样形态的智能产品,从手机、手表、手环等个人相关的产品,到汽车、音箱、空调等家用产品,再到智慧农业、智慧工业等相关的产品,都将进行相互连接。 据研究数据显示,到 2020 年,物联网连接的设备将达 750 亿台。这些产品间的互联,是实时而且是长久的,有些需要几年甚至几十年。要实现这种互联,超低功耗成为物联网的关键要素。如何实现设备间的超低耗连接,关键要从无线连接技术、到芯片、传感器、微处器理等上游技术方案的优化。 蓝牙发布2016技术蓝图 提升距离、速度及MESH联网 蓝牙技术、Zigbee、Wi-Fi 是三种主流无线连接技术,蓝牙以点对点的超低低功耗见长,Zigbee 以低功耗和 MESH 自组网见长,而 Wi-Fi 则以大数据高带传输见长。为强化在物联网的应用,Wi-Fi 联盟推出低功耗 Wi-Fi 技术,Zigbee 联盟宣布 Zigbee3.0 获批。在发布蓝牙 4.2 之后,近日蓝牙联盟发布了 2016 年的技术蓝图。 对于蓝牙 2016 年的技术蓝图,蓝牙技术将实现更长通信距离、更快传输速度及 Mesh 联网功能。同时,宣传其开发工具 Bluetooth Developer Studio 上线以及发布全新蓝牙网关架构发布。“今年,蓝牙技术的演进将进一步为包括智能家居、工业自动化、基于位置的服务和智能基础设施等高速增长行业注入更多动能。”蓝牙技术联盟开发者计划总监何根飞指出。 在通信距离上,Bluetooth Smart 的射程范围最多将可扩大 4 倍,改变智能家居和基础设施领域的应用,为整个室内空间或户外中的不同使用情境提供传输距离更长、连接品质更稳健的无线连接。传输速度在不增加功耗的情况下也将提升至当前的 100%,可为关键性应用如医疗设备实现更快速地数据传输,以提高反应速度并降低时间延迟。而Mesh联网功能则能让蓝牙网络的覆盖范围得以遍及整栋建筑或整户住宅,使得范围内的蓝牙设备彼此互联,开启智能家居和工业自动化的更多应用可能。 同时,为了推动蓝牙设备与其他连接技术设备的连接,蓝牙技术联盟宣布推出传输发现服务(Transport Discovery Service;TDS),提供利于设备发现并连接的通用框架。未来,无论设备采用哪种无线技术,透过 TDS,设备间能够实现彼此发现并连接。何根飞指出:“TDS 让设备仅需最少的电量即可运行,将为物联网(IoT)解决了一项重要的难题。 此外,宣布开放蓝牙网关架构并推出入门工具套件,助力开发者快速为蓝牙产品创建互联网网关。具有蓝牙功能的传感器能透过蓝牙技术连接网关设备,向云端传递数据并进行数据交换。该架构让所有人都能对固定式的、具有蓝牙功能的传感器进行远程监测和控制,藉此扩展了物联网的潜在应用领域。 多协议 SoC 方案应运而生 简化 IoT 连接 在多种无线连接技术真正融合之前,仍存在着多种连接方式。为了简化物联网的连接,半导体企业开始推出多协议芯片方案。 近日,Silicon Labs 公司推出多协议片上系统(SoC)Wireless Gecko 产品系列,为物联网设备提供灵活的连通性和价格/性能选择。Wireless Gecko产品包括三个系列的多协议 SoC,分别针对 IoT 使用场景和最普遍的无线协议而优化:一是Blue Gecko系列,Bluetooth Smart连接,具有理想的输出功率和传输距离。二是Mighty Gecko系列,针对网状网络的最佳 ZigBee 和Thread连接。三是 Flex Gecko 系列,针对各种应用中灵活的专有无线协议选项。 “多协议 SoC 是一个新概念。具体来说,就是指能够在一个芯片上实时运行两种协议。从单一协议到多协议并行的不同类型,其复杂程度逐渐增加。其实,最令客户感兴趣的是,多协议产品系列能够创造出更智能的应用场景。” Silicon Labs物联网产品营销副总裁 Daniel Cooley 表示。 在应用案例上,Daniel Cooley 指出在医院的实际应用。以前的控制方式主要是医院护士站中有一个系统控制病床。不过,当护士离开时就无法操控。现在厂商在生产的医用病床上装有很多传感器,且使用的是网状网络,实现病床之间、病床和医院的信息总控室之间的连接和通信。同时病床里面还有很多动力组件,可以进行床位的位置调控。护士人手配一台平板电脑,操控的动作可以转移到平板电脑上,当护士走近病床时,通信从 ZigBee 网状网络切换到蓝牙连接,平板电脑可以获得与病床相关的信息,并且对病床进行操控;而当护士离开病床时,该病床的通信协议又会从蓝牙切换到 ZigBee 网状网络,直接和护士站的信息控制中心进行沟通和互动。 此外,Silicon Labs 推出即插即用型模块解决方案来简化 Wi-Fi 连接。WGM110 模块是添加Wi-Fi功能到各类设备的解决方案,例如工业/ M2M 系统、无线传感器、遥控器、恒温器、可连接家居产品、汽车信息娱乐系统、销售终端设备、健身和医疗设备等。 芯片厂商思路调整 从系统角度整合硬件、软件和套件 此前,半导体厂商重点在于推动技术的提升,随着物联网应用的多样化和应用需求的多元化,企业开始从专注于技术的提升转向如何更好地满足客户的需求。从芯片厂商的思维转向系统思维。 在推动物联网的连接应用上,ST 在推动 MCU 的发展上开始有所转变。“我们从系统角度考虑来整合器件、软件和套件,而不仅仅是芯片。”意法半导体大中华与亚太区微控制器市场及应用总监 James Wiartge 指出。 在推进 MCU 在物联网的应用中,需要有 4 个要素。意法半导体 STM32 超低功耗和网络微控制器市场经理 Hakim Jaafar 指出:“一是低功耗,未来会有很多传感器和传感器相连的供电电池,整个系统要更低的功耗。二是怎么优化动态模式下的功耗非常关键。电池能量是固定的,如何延长其寿命,需要从功耗入手。功耗有静态和动态两种,优化动态模式的功耗是关键。三是如何把系统做得更加精简。四是成本,BOM 需要越简单,这就要求集成度越高,用户采购成本和制造成本、系统成本会更低。 针对物联网领域的应用,未来 MCU 的布局将以低功耗、小引角、无线为主。对此,为推出对能效应用敏感的微控制器,意法半导体今年推出了 ARM CortexM0+STM32L0 微控制器,该产品的主要低功耗外设包括低功耗 ADC,它1000 次/秒进行12位分辨率采样时,功耗为 41μA,以及超低功耗定时器(16位定时器),在超低功耗模式下可以运行;低功耗模式包括停止模式,在保留 RAM 全部数据且能够自动唤醒情形下,消耗 340nA。 随着物联网应用的不断深入,半导体厂商的的竞争点发生了变化,企业开始从打造技术优势转向打造整体方案优势。“我们已经不会在意到底是 8 位还是 32 位,而是在意客户需要的性能、功耗和成本,什么样的内核对用户来讲是最合适的。”Hakim Jaafar 表示,“过去应用比较简单,现在应用会越来越复杂,特别是软件、系统层面要求会越来越多,仅仅靠一个供应商很难做 Sub System,我们会和合作伙伴一起做 Sub System。 在应用案例上,一是手机传感器融合,提供的方案是MCU+传感器+合作伙伴软件,这是 Sub System,用户把 sub System 集成到手机里,加上自身的应用系统可以形成完整的应用系统;二是可穿戴方面,方案是 MCU + 传感器+算法+显示+用户自身的软件/算法,从而形成完整的系统。 原文发布时间: 2016-04-08 17:24 本文作者: 慕容素娟 本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。

优秀的个人博客,低调大师

分享18道Java基础面试笔试题(面试实拍)

上图来自Java技术栈微信群里的群友分享,看起来比较基础,但不一定人人都答得上来。 图片比较模糊,小编把题目进行了文字化。 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求? 2.请简述http协议中get请求和post请求的区别. 3.请简述session和cookie的区別. 4.简述Servlet与JSP的关系, 5.JSP内置对象有哪些,各自起到的作用 6.简述你所理解的JAVA封装、继承、多态。 7.写出2个常用的设计模式(伪代码),并简述应用场景。 8.HashMap和HashTable区别。 9.HashSet和TreeSet的区别。 10.ArrayList和LinkedList的区别。 11.==与equals的区别。 12.简述泛型、反射、注解应用场景及各自解决了哪些问题。 13.Thread类的方法有哪些,如何多种方式实现线程同步。 14进程与线程的区别,JAVA中有哪些方式可以创建线程。 15.现有一学生表结构(student-id,class-id,name),请写出统计每班有多少学生的SQL语句。 16.假如你正在开发一个系统的登录程序,请简述你是如何实现记住用户名和密码这个操作的,并如何实现? 17.在视图层不支持存储cookie,服务端不支持session的场景下如何保持用户登陆状态。 18.设计一套CMS系统或者博客系统的表结构(画出大概的UML图即可)。 本试题来源于微信群友分享,没有标准答案哦。工作多年的攻城狮们,不知道你们还能不能全部做得上来,都来试试吧。 以下是Java技术栈微信群部分群聊截图。 小编作为一个职场多年的老司机,抽时间也做了一份参考答案,想要小编参考答案的可以加入我们的微信群获取哦。关注下面的Java技术栈微信公众号,在后台回复:微信群,加入微信群我们一起学习进步成长! 推荐:分享一套高级Java笔试题(实拍高清图) 推荐:春节跳槽最新Java面试题及答案整理

优秀的个人博客,低调大师

注意,一道重磅通知:取款方式已发生巨变!

该来的终究会来。但谁也没想到,它会来得如此突然!再见了,银行卡中国农业银行已开始为其遍布全国大江南北的ATM机,上线“刷脸取款”!站在农行ATM机前,看一眼摄像头,再输入手机号、取款金额、密码,自动吐钞,拿走现金。1、在ATM机上进入操作页面,点击刷脸取款2、面对摄像头进行人脸识别,大约需要1-2秒;3、输入手机号或身份证号验证,确认后即可取款。整个过程,不到20秒!不要银行卡、不要手机扫码,只靠一张脸,完成现金取款。实际上,国内很多银行已开始大范围使用人脸识别技术。大潮之下,传统银行都在积极拥抱创新。没有一点点准备,一个“靠脸吃饭”的时代,真的来了。重磅炸弹,深入乡镇农行总行已下发通知,要求全国推广。将为全国24064家分支机构、30089台柜员机、10万个ATM机安装人脸识别系统!你没有看错,这次农行不是试点,而是要一举覆盖全中国,真正把刷脸取款普及到中国的千家万户。这意味着,“刷脸取款”不再是大城市、城里人的专利,而是深入乡镇,让农村老百姓也能享受到科技的便利。重点:刷脸取款安全吗?“刷脸取款”功能通过红外双目摄像头活体检测技术,比对现场抓拍的照片与可信照片源(身份证信息),分析人脸皮肤的纹理及微小动作带来的变化进行检测,以确定取款人身份,识别速度很快,一般2秒内就能完成。简单来说,刷脸取款首先必须是本人,不能是照片或者视频。第二是通过现场照片与身份证照片进行比对识别。需要注意的是,女生化的淡妆也能识别,不过如果是进行过整容,或者化妆与本人差距实在太大,可能会造成识别失败。除了人脸识别之外,用户还需要输入手机号码或身份证号进行身份确认,最后再依靠密钥进行取款。简而言之,安全性相对插卡取款还多了一重保障。靠脸吃饭,正式开始。我们只知道刷脸时代已经开始,但绝没想到一切会来的这么快:8月25日,武汉火车站全面宣布:刷脸进站;9月1日,支付宝在杭州肯德基上线刷脸支付,成为全球首个商用刷脸支付的场所;9月5日,杭州大量宾馆不用身份证,刷脸也可入住;9月6日,汇丰银行宣布使用人脸识别技术;9月7日,京东苏宁开启刷脸支付,一张脸拿走货物;9月9日,北京所有公租房将推行“人脸识别”门禁;9月11日,北师大宣布学生宿舍全面启用“刷脸开门”;如今农行此举,更是让“刷脸取款”覆盖全中国,走进我们从未想过的农村乡镇!短短半个月,我们的这张脸就已经开始取代:银行卡、身份证、手机、火车票,乃至开门的钥匙。马云说,未来凭一张脸就能在全世界畅通无阻。他没有天马行空,这一天正离我们越来越近!当初,二维码支付总是被人质疑安全性,如今已遍布大街小巷,成为主要的支付手段之一;现在,“刷脸”这一模式看似不可思议,也已获得大银行推广应用,并成功在支付场所得到运行。今天拥抱“刷脸支付”,就如同5年前拥抱“手机支付”,早早享受各种红利。无论是商家还是个人,都不要错过。所以——永远不要觉得创新的大潮离自己还有很远。农行的一个举动,就让刷脸取款走进你老家的村头。永远不要低估时代变化的速度。它常常掀起一阵风,你还没有反应过来,倾盆大雨就突然袭来。永远不要相信一成不变。你现在离不开的钥匙、手机、身份证,也许下一秒就消失得无影无踪。未来的世界会越来越高效、越来越公平,会创造出越来越多的福利。但你不拥抱,就没有机会。不要等村头李大爷都靠一张脸取款、购物了,你还在家里翻箱倒柜找你那张已经泛黄的银行卡。明天起床,无论你身处城市还是农村,请狠狠洗一把脸,让我们一起迎接这个全新的时代!你的脸,正越来越值钱!

优秀的个人博客,低调大师

数据安全的第一道防线:为什么备份如此重要?

数字化浪潮席卷各行各业的今天,数据已经成为企业最核心的资产之一。无论是客户信息、交易记录,还是业务文档、研发代码,一旦丢失或损坏,都可能给企业带来难以估量的损失。然而,随着数据量的激增和应用场景的复杂化,数据面临的风险也在不断加大——硬件故障、人为误操作、勒索软件攻击、自然灾害等,都可能成为数据安全的致命威胁。

优秀的个人博客,低调大师

一道被前端忽略的基础题,不信看你会几题

前言 为了追求更高的境界,看我们忽略了多少的基础知识!!!下面我们就来看一看,瞧一瞧。 function Foo () { getName = function () { alert(1) } return this } Foo.getName = function () { alert(2) } Foo.prototype.getName = function () { alert(3) } var getName = function () { alert(4) } function getName () { alert(5) } //输入的值 Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName();复制代码 看下各位前端童鞋可以做对几题呢,大佬略过(哈哈) Foo.getName(); //2 getName(); //4 Foo().getName(); //1 getName();//1 new Foo.getName(); //2 new Foo().getName(); //3 new new Foo().getName(); //3 复制代码 解析 此题涉及的知识点众多,包括变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等等。 此题包含7小问,分别说下。 第一问 先看此题的上半部分做了什么,首先定义了一个叫Foo的函数,之后为Foo创建了一个叫getName的静态属性存储了一个匿名函数,之后为Foo的原型对象新创建了一个叫getName的匿名函数。之后又通过函数变量表达式创建了一个getName的函数,最后再声明一个叫getName函数。 第一问的 Foo.getName 自然是访问Foo函数上存储的静态属性,自然是2,没什么可说的。 第二问 直接调用 getName 函数。既然是直接调用那么就是访问当前上文作用域内的叫getName的函数,所以跟1 2 3都没什么关系。此题有无数面试者回答为5。此处有两个坑,一是变量声明提升,二是函数表达式。 变量声明提升 即所有声明变量或声明函数都会被提升到当前函数的顶部。 备注:1.初始化不会提升。 2.函数提升优先级高于变量提升,且不会被变量声明覆盖,但是会被变量赋值之后覆盖 例如下代码: console.log('x' in window);//true var x; x = 0;复制代码 代码执行时js引擎会将声明语句提升至代码最上方,变为: var x; console.log('x' in window);//true x = 0;复制代码 函数表达式var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,而 function getName 是函数声明。 函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。 例如下代码: console.log(x);//输出: function x(){} var x=1; function x(){}复制代码 实际执行的代码为,先将 var x=1 拆分为 var x; 和 x = 1; 两行,再将 var x; 和 function x(){} 两行提升至最上方变成: function x(){} var x; console.log(x); x=1;复制代码 所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。 同理,原题中代码最终执行时的是: function Foo() { getName = function () { alert (1); }; return this; } function getName() { alert (5);}//提升函数声明,覆盖var的声明 var getName;//只提升声明不提升初始化 Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; getName = function () { alert (4);};//最终的赋值再次覆盖function getName声明 getName();//最终输出4复制代码 第三问 第三问的 Foo().getName(); 先执行了Foo函数,然后调用Foo函数的返回值对象的getName属性函数。 Foo函数的第一句 getName = function () { alert (1); }; 是一句函数赋值语句,注意它没有var声明,所以先向当前Foo函数作用域内寻找getName变量,没有。再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量,找到了,也就是第二问中的alert(4)函数,将此变量的值赋值为 function(){alert(1)}。 此处实际上是将外层作用域内的getName函数修改了。 注意:此处若依然没有找到会一直向上查找到window对象,若window对象中也没有getName属性,就在window对象中创建一个getName变量。 之后Foo函数的返回值是this,而JS的this问题博客园中已经有非常多的文章介绍,这里不再多说。 简单的讲,this的指向是由所在函数 的调用方式决定的。而此处的直接调用方式,this指向window对象。 遂Foo函数返回的是window对象,相当于执行 window.getName() ,而window中的getName已经被修改为alert(1),所以最终会输出1 此处考察了两个知识点,一个是变量作用域问题,一个是this指向问题。 第四问 直接调用getName函数,相当于 window.getName() ,因为这个变量已经被Foo函数执行时修改了,遂结果与第三问相同,为1 第五问 第五问 new Foo.getName(); ,此处考察的是js的运算符优先级问题。 通过查文档可以得知点(.)的优先级高于new(无参数列表)操作,遂相当于是: new (Foo.getName)(); 所以实际上将getName函数作为了构造函数来执行,遂弹出2。 第六问 第六问 new Foo().getName() ,首先看运算符优先级括号高于new,实际执行为 (new Foo()).getName() 遂先执行Foo函数,而Foo此时作为构造函数却有返回值,所以这里需要说明下js中的构造函数返回值问题。 构造函数的返回值 在传统语言中,构造函数不应该有返回值,实际执行的返回值就是此构造函数的实例化对象。 而在js中构造函数可以有返回值也可以没有。 1、没有返回值则按照其他语言一样返回实例化对象。 2、若有返回值则检查其返回值是否为引用类型。如果是非引用类型,如基本类型 (string,number,boolean,null,undefined)则与无返回值相同,实际返回其实例化对象。 3、若返回值是引用类型,则实际返回值为这个引用类型。 原题中,返回的是this,而this在构造函数中本来就代表当前实例化对象,遂最终Foo函数返回实例化对象。 之后调用实例化对象的getName函数,因为在Foo构造函数中没有为实例化对象添加任何属性,遂到当前对象的原型对象(prototype)中寻找getName,找到了。 遂最终输出3。 第七问 第七问, new new Foo().getName(); 同样是运算符优先级问题。 最终实际执行为: new ((new Foo()).getName)(); 先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new。 遂最终结果为3 最后: 希望大家通过此文了解js一些特性。 并祝愿大家在新的一年找工作面试中胆大心细,发挥出最好的水平,找到一份理想的工作。 如果觉得这篇文章还不错,来个分享、点赞吧,让更多的人也看到 如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: http://github.crmeb.net/u/defu 不胜感激 ! 来自 “开源世界 ” ,链接: https://ym.baisou.ltd/post/755.html ,如需转载,请注明出处,否则将追究法律责任。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册