首页 文章 精选 留言 我的

精选列表

搜索[Web 应用托管],共10000篇文章
优秀的个人博客,低调大师

【聚能聊有奖话题】人脸识别、指纹、WIFI考勤打卡,你工作中有没有这些习以为常的人工智能应用?

本话题地址,参与即可获得礼品:https://yq.aliyun.com/roundtable/63026 最开始单位打卡是用指纹,这个有些年头了,所以没什么感觉。后来启用了人脸识别,一下就感觉高大上了。后来启用了钉钉,居然还有WIFI打卡?脑路一下被打开了。有道理啊,WIFI只有一个小区域,进入这个WIFI说明人肯定到了,比指纹和人脸打卡都靠谱。最近,单位居然乘钉钉智能前台(考勤机)做0元购活动,入了个新款钉钉考勤机。再一次刷新了我的三观。这款考勤机能做到多人、远距离、毫秒级人脸识别。你靠近考勤机的时候,他就会激活。在圣诞节的时候,你刷脸时,还会在你头上戴个圣诞帽……并且对你说,某某某圣诞快乐。最扯的是,他居然还带美!颜!功!能!害得我打卡的时候,忍不住在考勤机的屏幕前摆各种造型…… 平时总感觉人工智能离我们非常遥远,其实很多密切相关的人工智能现在已经实现,而且就在我们身边~只是我们并没有太过注意。集各种人工智能于一身的网红产品天猫精灵就先不说了。说点大家一直在接触,但可能并未察觉的人工智能~ 隐藏最深的人工智能谷歌搜索在表面上只是一款搜索引擎,但其引擎的机理和很多人工智能程序相同:以并行计算、大数据及更深层次算法为基础,完成对数据、问题的智能化分析。或许很多谷歌用户都能感受到,谷歌搜索正变得越来越“聪明”,越来越“懂你”,而赋予其这种学习能力的,正是人工智能。 近期百度发布了基于融合统计和深度学习方法的在线翻译系统。该系统借助海量计算机模拟的神经元,模仿人脑“理解语言,生成译文”。这种翻译方法最大的优势是译文流畅,更符合语法规范,易于理解。有意思的是,这个系统并不是一开始就具备强大大脑,而是像刚出生的婴儿一样通过学习大量双语对照的句子,逐渐提升翻译水平。百度挖掘了海量的双语句子作为系统的“教材”。 各路写稿机器人比如新华社去年11月上岗的“快笔小新”,腾讯新闻的Dreamwriter等,也许你不经意间看到的体育或财经新闻就出自他们之手。外媒报道,美联社(AP)现在不少棒球新闻也已经由AI机器人完成。美联社主要是和Major League BaseballAdvanced Media合作,后者提供数据,AI机器人导入后即可完成创作。AP不否认自己会扩大AI机器人覆盖的新闻种类,而且最最关键的是,机器人在比赛乏味的时候不会犯困。 至此,可能很多人要问,苹果的siri呢?可能在国外siri表现还不错,但是在大陆,水土不服,被科大讯飞的灵犀语音助手完爆了~

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

诊断 Java 代码: 提高 Java 代码的性能 尾递归转换能加快应用程序的速度,但不是所有的 JVM 都会做这种转换

简介:很多算法用尾递归方法表示会显得格外简明。编译器会自动把这种方法转换成循环,以提高程序的性能。但在 Java 语言规范中,并没有要求一定要作这种转换,因此,并不是所有的 Java 虚拟机(JVM)都会做这种转换。这就意味着在 Java 语言中采用尾递归方法将导致巨大的内存占用,而这并不是我们期望的结果。Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则通常不会。他说明了为什么这是一个重要问题,并提供了一段代码来帮助判断您的即时(JIT)编译器是否会在保持语言语义的同时做尾递归代码转换。 尾递归及其转换 相当多的程序包含有循环,这些循环运行的时间占了程序总运行时间的很大一部分。这些循环经常要反复更新不止一个变量,而每个变量的更新又经常依赖于其它变量的值。 由于这一特点,在尾递归函数和循环之间有一个很好的对应关系:可以简单地把每个递归调用看作是一个循环的多次迭代。但因为所有可变的参数值都一次传给了递归调用,所以比起循环来,在尾递归中可以更容易地得到更新值。而且,难以使用的 break 语句也常常为函数的简单返回所替代。如果把迭代看成是尾递归函数,那么,就可以把这些变量看成是函数的参数。简单提醒一下:如果一个调用的返回值被作为调用函数的值立即返回,那么,这个递归调用就是尾递归;尾递归不必记住调用时调用函数的上下文。 但在 Java 编程中,用这种方式表示迭代将导致效率低下,因为大量的递归调用有导致堆栈溢出的危险。 解决方案比较简单:因为尾递归函数实际上只是编写循环的一种更简单的方式,所以就让编译器把它们自动转换成循环形式。这样您就同时利用了这两种形式的优点。 但是,尽管大家都熟知如何把一个尾递归函数自动转换成一个简单循环,Java 规范却不要求做这种转换。不作这种要求的原因大概是:通常在面向对象的语言中,这种转换不能静态地进行。相反地,这种从尾递归函数到简单循环的转换必须由 JIT 编译器动态地进行。 要理解为什么会是这样,考虑下面一个失败的尝试:在 Integers 集上,把 Iterator 中的元素相乘。 因为下面的程序中有一个错误,所以在运行时会抛出一个异常。但是,就象在本专栏以前的许多文章中已经论证的那样,一个程序抛出的精确异常(跟很棒的错误类型标识符一样)对于找到错误藏在程序的什么地方并没有什么帮助,我们也不想编译器以这种方式改变程序,以使编译的结果代码抛出一个不同的异常。 清单 1. 一个把Integer集的Iterator中的元素相乘的失败尝试 import java.util.Iterator; public class Example { public int product(Iterator i) { return productHelp(i, 0); } int productHelp(Iterator i, int accumulator) { if (i.hasNext()) { return productHelp(i, accumulator * ((Integer)i.next()).intValue()); } else { return accumulator; } } } 注意product方法中的错误。product方法通过把 accumulator 赋值为 0 调用productHelp。它的值应为 1。否则,在类Example的任何实例上调用product都将产生 0 值,不管 Iterator 是什么值。 假设这个错误终于被改正了,但同时,类Example的一个子类也被创建了,如清单 2 所示: 清单 2. 试图捕捉象清单 1 这样的不正确的调用 import java.util.*; class Example { public int product(Iterator i) { return productHelp(i, 1); } int productHelp(Iterator i, int accumulator) { if (i.hasNext()) { return productHelp(i, accumulator * ((Integer)i.next()).intValue()); } else { return accumulator; } } } // And, in a separate file: import java.util.*; public class Example2 extends Example { int productHelp(Iterator i, int accumulator) { if (accumulator < 1) { throw new RuntimeException("accumulator to productHelp must be >= 1"); } else { return super.productHelp(i, accumulator); } } public static void main(String[] args) { LinkedList l = new LinkedList(); l.add(new Integer(0)); new Example2().product(l.listIterator()); } } 类Example2中的被覆盖的productHelp方法试图通过当 accumulator 小于“1”时抛出运行时异常来捕捉对productHelp的不正确调用。不幸的是,这样做将引入一个新的错误。如果Iterator含有任何 0 值的实例,都将使productHelp在自身的递归调用上崩溃。 现在请注意,在类Example2的 main 方法中,创建了Example2的一个实例并调用了它的product方法。由于传给这个方法的Iterator包含一个 0,因此程序将崩溃。 然而,您可以看到类Example的productHelp是严格尾递归的。假设一个静态编译器想把这个方法的正文转换成一个循环,如清单 3 所示: 清单 3. 静态编译不会优化尾调用的一个示例 int productHelp(Iterator i, int accumulator) { while (i.hasNext()) { accumulator *= ((Integer)i.next()).intValue(); } return accumulator; } 于是,最初对productHelp的调用,结果成了对超类的方法的调用。超方法将通过简单地在 iterator 上循环来计算其结果。不会抛出任何异常。 用两个不同的静态编译器来编译这段代码,结果是一个会抛出异常,而另一个则不会,想想这是多么让人感到困惑。 回页首 您的 JIT 会做这种转换吗? 因此,如清单 3 中的示例所示,我们不能期望静态编译器会在保持语言语义的同时对 Java 代码执行尾递归转换。相反地,我们必须依靠 JIT 进行的动态编译。JIT 会不会做这种转换是取决于 JVM。 要判断您的 JIT 会否转换尾递归的一个办法是编译并运行如下小测试类: 清单 4. 判断您的 JIT 能否转换尾递归 public class TailRecursionTest { private static int loop(int i) { return loop(i); } public static void main(String[] args) { loop(0); } } 我们来考虑一下这个类的loop方法。这个方法只是尽可能长时间地对自身作递归调用。因为它永远不会返回,也不会以任何方式影响任何外部变量,因此如清单 5 所示替换其代码正文将保留程序的语义。 清单 5. 一个动态转换 public class TailRecursionTest { private static int loop(int i) { while (true) { } } public static void main(String[] args) { loop(0); } } 而且,事实上这也就是足够完善的编译器所做的转换。 如果您的 JIT 编译器把尾递归调用转换成迭代,这个程序将无限期地运行下去。它所需的内存很小,而且不会随时间增加。 另一方面,如果 JIT 不做这种转换,程序将会很快耗尽堆栈空间并报告一个堆栈溢出错误。 我在两个 Java SDK 上运行这个程序,结果令人惊讶。在 SUN 公司的 Hotspot JVM(版本 1.3 )上运行时,发现 Hotspot 不执行这种转换。缺省设置下,在我的机器上运行时,不到一秒钟堆栈空间就被耗尽了。 另一方面,程序在 IBM 的 JVM(版本 1.3 )上咕噜噜运行时却没有任何问题,这表明 IBM 的 JVM 以这种方式转换代码。 回页首 总结 记住:我们不能寄希望于我们的代码会总是运行在会转换尾递归调用的 JVM 上。因此,为了保证您的程序在所有 JVM 上都有适当的性能,您应始终努力把那些最自然地符合尾递归模式的代码按迭代风格编写。 但是请注意:就象我们的示例所演示的那样,以这种方式转换代码时很容易引入错误,不论是由人工还是由软件来完成这种转换。 参考资料 您可以参阅本文在 developerWorks 全球站点上的英文原文. 参与本专栏的讨论论坛。 欲了解Hotspot的更多信息,请参阅 SUN 的有关文档。 欲详细了解尾递归及其到迭代的转换,请参阅CMU Common Lisp User's Manual(CMU Common Lisp 用户手册)。虽然这本手册是(当然是)为 Common Lisp 写的,但其中关于尾递归的讨论也适用于其他语言,包括 Java 语言。 对提高您 Java 代码的性能有兴趣?在二月底于纽约召开的国际 Java 开发大会上,性能专家 Peter Haggar 在他的音频演示中讨论了这个问题的本质。 阅读 Eric 关于诊断 Java 代码的完整系列。 关于作者 Eric Allen 在 Cornell 大学获得了计算机科学及数学的学士学位。他目前是Cycorp,Inc的主要 Java 软件开发人员带头人,编程部的副经理,还是位于JavaWorld的 Java 初学者论坛的主持人。他还是 Rice 大学编程语言小组的兼职研究生。他的研究涉及在源程序和字节码层次上的正规语义模型和 Java 语言扩展的开发。目前,他正在为 NextGen 编程语言实现一种从源代码到字节码的编译器,这也是 Java 语言的泛型运行时类型的一种扩展。可通过eallen@cyc.com与 Eric 联系。 ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/articles/2193026.html,如需转载请自行联系原作者

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

AbMole 抑制剂篇丨 Avibactam(阿维巴坦):可逆共价 β-内酰胺酶抑制剂,在耐药机制与抗菌研究中的应用

摘要:Avibactam(阿维巴坦,NXL-104,AbMole,M6174,CAS No.:1192491-61-4)是二氮杂双环辛烷(DBO)类非 β-内酰胺 β-内酰胺酶抑制剂。β-内酰胺酶水解是细菌对 β-内酰胺类抗菌化合物产生耐药的主要机制,Avibactam 通过其羧基与β-内酰胺酶的活性中心丝氨酸形成可逆共价氨酯键,广谱抑制 A 类(ESBL、KPC)、C 类(AmpC)及部分 D 类(OXA-48)β-内酰胺酶,与头孢他啶(Ceftazidime)联用可恢复Ceftazidime 对多重耐药肠杆菌目细菌的活性。本文讲解Avibactam的分子机制、酶学、细胞实验体系及动物感染模型的研究方案。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册