中国重启地铁建设

去年,对地方政府债务的担忧导致包头、武汉等一批地铁项目被叫停,今年 8 月苏州新地铁项目获批
标志着政策 “逆转”。由于国内投资减弱以及美国关税造成的压力导致中国经济增长放缓,中国的政策制定者把地铁建设作为一种财政刺激工具。国际公共交通协会 (UITP) 的数据显示,2014 年至 2017 年间,中国占全球新建地铁里程的 68%,占客运量增幅的一半以上。不过,尽管按轨道里程计算,截止去年年底,中国占全球城市轨道交通的 30%,但仅占客运量的四分之一,这表明部分线路尚未得到充分利用。

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=59101

锂离子电池取得新进展

日本的锂离子电池
取得了新的进展,日本积水化学工业株式会社和旭化成最新开发的锂离子电池能将电动汽车的续航距离增加到 1000 里以上,但要到 2020 年代才能实用化。锂离子电池于 1991 年商品化,被用于笔记本电脑和摄像机等。2009 年被用于量产型纯电动汽车。完全充电可行驶的距离在 200 公里左右。一般认为 2010 年代初以当时的技术难以达到 500 公里,到 2030 年前后将被全固体电池等新一代电池取代。

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=59100

狮航 610 航班飞行员如何失去控制的

印尼狮航的一架波音 737 MAX8 客机十月底坠毁,机上 189 人全部遇难。根据公开的飞机黑匣子数据,纽约时报制作了互动图,
还原了飞行员如何失去对飞机的控制的。这架客机的状况被认为根本不适合飞行,已经多次发生传感器问题,但不清楚飞行员在起飞前是否知道飞机的故障,但起飞之后他们就立即意识到了飞机存在问题。飞机在继续爬升,但飞行员不知道空速和高度。他们向航管中心寻求帮助。机长和副驾驶之间的两个关键传感器显示了不同的读数。接着飞机突然掉落了 700 英尺,而机载计算机系统还强迫飞机俯冲,飞行员设法从俯冲中恢复了过来。但这时飞机外面的迎角传感器错误指示机鼻角度过高可能会失速。这一错误警告触发了自动系统 M.C.A.S.,让机尾稳定器前边缘向上,迫使机鼻向下。飞行员可能不熟悉或不知道飞机的这个新自动系统,他们再次尝试让机鼻向上,与自动系统展开了一场拔河战,机头向上向下的摆动持续了几十次。飞行员使用的是临时性的手动控制方法,10 秒之后自动系统就会再次接管。关闭自动系统就可以解决这个情况,但飞行员可能完全搞不清楚波音的新系统。在飞行的最后一分钟,飞行员在与自动系统的拔河中失利,飞机冲入了爪哇海。

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=59099

亲民智能家居品牌Wyze新品运动感应器和智能门铃曝光



以亲民价格和稳固质量为特色的wyze智能家居安全摄像头已经广受欢迎,20美元的售价提供了智能安全保障。现在,有消息曝光了 Wyze即将发布的智能家居两个新品,定价同样应该是亲民路线,也意味着Wyze正在扩展其产品线。

sensors.png

据Zatz Not Funny报道,Wyze已经准备好了全新的运动感应和接触式传感器(智能门铃),也将是Wyze除了智能家居安全摄像头之外(目前有两种型号)的首次产品线扩展。尽管细节尚未披露,媒体推测Wyze运动感应器的作用是当有人接近住宅时,自动感应并且实现开灯或者监控等功能。另外接触式传感器类似门铃的功能


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802655.htm

外商投资法草案公开

全国人大常委会在其官网 NPC
公布了《
外商投资法草案》,向社会公开征求意见,意见截止日期为 2019 年 2 月 24 日。《外商投资法》备受瞩目,因此它明文规定了禁止强制性技术转让。强制性技术转让是中美贸易战的焦点之一,本月早些时候,中美就贸易战达成了暂时的停火协议,同意就强制技术转让和知识产权保护等问题展开谈判。外商投资法被认为是中国给出的回应。草案第二十二条规定:“国家依法保护外国投资者和外商投资企业的知识产权,保护知识产权权利人和相关权利人的合法权益,鼓励基于自愿原则和商业规则开展技术合作。外商投资过程中技术合作的条件由投资各方协商确定,行政机关及其工作人员不得利用行政手段强制转让技术。”

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=59098

比特币创业公司纷纷裁员

在比特币币值跌至
3800 美元的大环境下,数字货币的创业公司纷纷
裁员求生。一年前,比特币币值攀升到了创纪录的近 2 万美元,今天的币值比一年前减少了八成以上。最大的矿机制造商比特大陆最近向香港证交所递交了 IPO 申请,该公司已经证实了裁员的消息,但没有披露裁员比例。根据中国职业社交平台脉脉上的流言,比特大陆裁员多达五成,该公司发言人否认了这一传言。比特大陆雇佣了 2500 多名雇员。另一家裁员的公司是数字货币交易平台火币,该公司有超过一千名雇员。

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=59097

招商银行率先进入“全面无卡化”时代



日前,招商银行宣布对全国网点的“全面无卡化改造”项目完成。至此,招行在柜面业务、可视柜台、ATM、取号、客户经理面访、金葵花门禁等网点厅堂业务中,除应监管合规、风险控制等要求的极少数业务外,均实现了无卡化办理。客户在招行全国任何网点办理业务,均无需再携带银行卡。这意味着,招行成为中国首家实现网点“全面无卡化”的银行。

201812 招商银行 无卡 扫码 存取款.jpg

据招行相关负责人介绍,“网点无卡化改造”包含两层意思:其一,招行全国网点的零售业务,绝大部分可直接使用招商银行APP线上办理;其二,必须通过线下渠道办理的业务,个人客户可以无需出示招商银行借记卡,直接通过招商银行App扫码,或提供银行卡号、身份证号、手机号加刷脸,来替代银行卡完成业务。

据了解,目前招行“网点无卡化”所覆盖的业务包括ATM存取款、可视柜台和柜面办理业务、APP取号、客户经理面访、金葵花门禁等,几乎涵盖了目前网点零售客户必须要出示卡片的全部场景,这就意味着招商银行全国网点几乎全部业务均可通过无卡化办理。

不过该负责人也强调,因为业务流程、监管合规、风险控制等要求,目前极少数业务如换卡、挂失解挂等,仍然需要提供实体卡片;另外,“无卡化”仅支持本人办理本人名下的业务,代办业务仍需按原业务流程提供银行卡办理。

网点“无卡化”助力轻型金融生活

据了解,此次招商银行零售业务进行无卡化系统改造,持续时间超过两年,涉及核心业务系统(CMBRun)、可视柜台、ATM、W+、收单平台、APP渠道、风控系统等多个系统的对接。

值得一提的是,网点全面无卡化项目的落地,也是招商银行打造最佳客户体验银行的有力举措。近年来,招商银行不断探索金融科技,持续推出了多种便捷人性化的金融服务功能与产品,助力打造消费者们轻型金融、科技金融的新生活。除了网点厅堂业务的无卡化,招行在2018年还完成了交易流水打印、存款证明打印、手机号维护、换卡等必须在网点线下办理的业务向线上迁移,打造全面交易环节的无卡化,提升客户体验。

以无卡取款为例,用户需要现金,可以用手机直接在ATM机上打开招商银行App扫码取现金。值得一提的是,招行还将ATM扫码存取款功能对接“天秤”实时风控系统,结合客户交易的风险情况进行综合判断,把客户每天取款限额从3000提升到2万人民币,免验证动码的交易比例从40%提升到98%,在方便客户的同时也降低了银行卡丢失、被盗刷的风险,带给用户的体验感大幅上升。

招行持卡人赵小姐则体验了一把网点无卡取号的便利,“真的很方便,取号、办理业务,直接用手机银行APP就可以搞定。以后出门先吃个饭、逛个街,等收到提醒时再去网点就可以了,方便又省心,不像再跟以前一样还得专门带银行卡。”

实现了全国网点全面无卡化之后,招商银行App俨然成为一条纽带,将网点业务与应用场景更有机地连接在一起,越来越多的招行客户正在享受网点无卡化带来的便利。

持续推动“卡时代”向“App时代”跃迁

银行业从“卡时代”向“App时代”跃迁,招行已做好充分的准备。早在2014年,招行就提早布局了智能手机带来的场景大迁徙,提出并实施了“移动优先”策略,加大投入,集中力量打造“招商银行”、“掌上生活”两大App。目前,两大App已成为招行连接用户的最主要的载体和零售经营平台,而实现网点“全面无卡化”更是持续推动“卡时代”向“App时代”跃迁的重要一站。

据招行相关负责人介绍,未来网点厅堂业务的全面无卡化仍存在许多优化探索的空间。“2019年,我行将继续聚焦产品升级,同时推动客户行为习惯变化,继续推进网点无卡化进程:其一,推进无卡化升级,用招商银行App扫码全面替代卡号、身份证号、手机号等无卡客户识别方式,让招商银行App替代银行卡成为客户在招行任一场景的通行证。其二,实现网点各渠道之间、招商银行App应用场景的互联互通,如客户在招商银行App进行业务预约后,客户卡片和交易信息可以流转到柜面,无需在柜面再次刷卡或者扫码,直接刷脸验密即可完成交易的办理;其三,增加无卡化的运营推广,通过活动抽奖等方式提升客户参与度和趣味性,吸引客户体验扫码交易的便捷,从而逐步养成无卡化交易的习惯。其四,构建全渠道数字化信息地图,实现多个交易渠道、服务平台、管理工具之间信息共享,让招行客户跟网点、APP甚至95555服务中心接触时,都有一致的、连贯的、精准的服务体验。”

在业内人士看来,招商银行通过运用互联网创新思维及技术推进了全面无卡化的落地,有效降低了客户的时间成本、以及商户和银行的经营成本。同时,生物识别、二维码、NFC、支付标记化技术及两大App应用支付等远程和近场移动支付技术持续发展,推动了无卡支付产品的快速迭代和客户支付体验的不断提升。

(中新网12月27日电)


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802653.htm

明年CES大展 LG将展示CLOi SuitBot辅助机器人



在所有大型消费电子公司中,LG可能是最痴迷于机器人的公司。但有别于索尼Aibo这样主打可爱但实际用途不大,LG主要探索如何更合理使用机器人来减少员工的工作负担。在明年的CES大展上,LG不仅将会展示PorterBot,ServeBot和CartBot机器人的改进版本,而且还会公开展示CLOi SuitBot机器人。

今年8月份LG官方就曾有过展示,并称该机器人为首款“可穿戴”的机器人。它融入了人工智能,是一种以“人为中心”辅助机械,它的目的并不是为了取代人类,而是对人类技能的延伸和增强。CLOi SuitBot能够为使用者提供更多的活动能力,在更少的肢体力量下能够获得更强大的力量支持。

虽然CLOi SuitBot本身并不突然行走或者跑步,但是它的内部装备一些大脑。内置的人工智能能够让机器人研究周围环境和使用者的习惯,从而调整运动和工作效率。此外它还能和其他LG CLOi SuitBot机器人进行通信,能够在需要的时候共享信息。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802651.htm

5999元起 ThinkPad S3锋芒发售:最轻薄的独显小黑



对小黑、轻薄、独显三大元素有需求的用户,联想今天新鲜上市了Think家族新品ThinkPad S3锋芒。凭借17.9mm厚度和1.67Kg重量,ThinkPad S3锋芒成为Think家族最轻薄的独显本。外形方面,S3锋芒的A、C、D三面机身采用全金属材质,拥有全新钛度灰配色。屏幕边框窄至6.9mm,符合当下潮流审美。官方介绍,A面还支持专属定制

核心配置方面,14英寸1080P显示屏,CPU可选i5-8265U/i7-8565U,最高8GB RAM(可扩展)和512GB SSD,显卡为AMD Radeon 540X(CPU和GPU周围采用陶瓷电容),预装Win10家庭和Office2019。

特色功能方面,全尺寸背光键盘、小红点、三键触摸板180度展开、按压指纹、ThinkShutter黑阀(物理遮盖前摄)等都得到保留,支持快充技术,在关机状态下一小时即可充满80%电量。

外部接口包含全功能USB-C接口、两个USB 3.1、1个USB 2.0、HDMI、RJ45以太网接口、SD card接口,耳机/麦克风接口。

价格方面,i5/8G/256G集显现售5999元,i7/8G/512G/独显顶配7999元。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802647.htm

荣耀总裁赵明:全球化手机品牌最后只会剩四五家



在气温零下10度的北京,荣耀总裁赵明一袭春装登场。如无意外,这将是2018年中国手机行业的最后一场发布会。12月26日,荣耀(HONOR)发布新品V20,并宣布品牌和业态升级:荣耀旗下电商平台“荣耀亲选”上线试运营,同时建立围绕社交模式的“荣耀青年派”社群平台。

作者 | 舒虹

赵明表示,“荣耀亲选”将成为荣耀的O2O平台。线上,荣耀目前已有华为商城Vmall,并和京东、天猫等电商平台合作,而“荣耀亲选”则试图将用户完全留在荣耀自有的平台上;线下,荣耀正在筹建首家旗舰店,计划2019年春天开出,为新零售打样。

2018年,智能手机市场难掩“寒冬”的气息。据中国信通院数据,2018年1-11月,国内手机市场出货量3.79亿部,同比下降15.6%。而全球智能手机出货量已经连续六个季度同比下滑。

与许多同行相比,荣耀今年的市场表现较为顺利。据市场调研机构赛诺发布的报告,今年1-11月,荣耀在中国市场销量为4982万部、销售额717亿元,超过苹果跻身市场第四。

12月25日,华为官宣“2018年全球发货量突破2亿台(含荣耀)”,与去年全年的1.53亿台相比,增势明显。虽未公布荣耀在华为体系中的贡献值,但赵明在采访中说:“我们还是占相当多比例的。”

赵明同时透露,今年荣耀海外市场的全年销量增长超过了150%,海外市场占比达到了20%-30%。预计到2020年,荣耀中国和海外市场将各占50%,未来海外市场销量将超过中国市场。

以下是12月26日,赵明与全天候科技在内的媒体采访实录(经全天候科技整理):

媒体:今年行业的整合和洗牌尤其明显,小品牌加快消失,头部几家厂商份额已经超过80%,甚至接近90%。面对寡头的竞争,荣耀的打法和策略会有什么不同?

赵明:每年4月我都会去GMIC(全球移动互联网大会)进行演讲,系统阐述我们对于当年市场的理解,我的市场判断从2015年到现在都是非常准确的。行业发展到今天,是一个必然的情况。科技的比拼现在已经不是微创新了,需要很多积累,需要大的团队和体系来做创新的支撑,小的品牌和厂家可能会借助于行业的解决方案、芯片提供商的能力做一些设计上的变化。但对于人工智能的处理、整个生态的引导不那么容易。

举个例子,3D TOF(飞行时间法3D成像)这个技术老早就有了,但为什么大家对体验都不满意?因为要在抓取图片的瞬间就把立体信息实时进行处理识别,并作出反应,实际上就需要类似于麒麟980这样的AI处理器和背后强大的图象处理算力来支撑。这也是造成整个手机行业发展越来越困难的原因。

GSM时代有多个手机品牌,最强大的设计概念来自于华强北,它的手机技术就这么多,谈不上生态和软件设计的体验,那时候诺基亚产品是最好的。但是到了今天,手机已经不是一个单纯的通讯工具,已经变成了一个中心,娱乐中心、通讯中心、交互中心,它承载很多东西。这些可不是简简单单的小公司就能做的,这是科技与技术发展的结果,需要很多的支撑,包括审美、全球设计能力的驱动、对于供应链的驱动,都会造成各种各样的问题。

今天我们很多产品在供应链已经拿不到合理的解决方案了,已经走到瓶颈了,怎么办?只能自己做,虽说开发一款芯片投入很大,但不做的话就要站在别人的背后,未来会受到很大的制约,这也是我们坚持的路。

媒体:有人说以后行业里可能只剩下四五家手机品牌,你怎么看?

赵明:全球化的品牌差不多就是四五家,我指的是具有全球影响力的,不只是在某一个国家或某一个地区。从中国手机市场来看,华为手机、荣耀手机的换机周期在行业内都是比较长的。原来手机换机周期是15-18个月,现在都是22-24个月,甚至更高。每一代手机升级,都是把最新的软件应用到原有手机上,甚至更上一代,让整个体验变得更好。

改变用户换机周期的唯一方法就是把新的产品做得更好,让他不忍拒绝,而绝对不会说停止对老产品的支持和服务。我们能力有限,但是会尽自己的努力,这是华为体系一个核心的理念。

媒体:这两天华为官宣出货量超过2亿台,荣耀在其中占比多少?

赵明:我们还是占相当多比例的,这个(具体数字)就不说了。

媒体:过去几年你遇到最大的挑战是什么?各个研究机构的数据、每个季度智能手机出货量都在下降,如何应对这种挑战?

赵明:荣耀起家时面临的环境是,一群具有华为To B基因的人做终端,很多人说华为不具有互联网基因,但我们不仅做了互联网,还做了互联网手机。2015年时遇到各种各样不理解:中国市场变数都这么大,为什么还去做海外?

坦率讲今年可能是很困难,但未必是最困难,也许几年后回过头来看也未必觉得难。人生当中不应该只是记住痛苦。跑马拉松,一想到40多公里跑起来是很苦的,但是真正跑马拉松的人在跑的过程当中是愉悦的,他不认为这是惩罚的过程,是快乐的事情。

媒体:对华为或荣耀手机来说,“五环外”是不是一个增长点?

赵明:其实一直都是。荣耀是一个互联网品牌,我们在电商上卖货,一个店就把中国都覆盖,这是理论上的。但电商的兴起跟线下很多服务一样,也是一、二、三线城市的服务(先起来),比如物流等,直到四、五、六线电商和整个信息的流动,是在4G手机普及起来的。今天信息扁平化了,只要上了各种各样的App,在北京获得的信息和在任何一个角落获得的信息是一样的,包括在农村,这对于我们来说也增加了渠道。

我到县、乡一级调查,过去几个月跑了中国五六个省份的乡镇,荣耀的产品也走到了他们当中。但很明显我们的能力是不够的,没有那么强的线下覆盖能力,未来对我们来说是一个新的增长点。

媒体:荣耀品牌升级背后的原因是什么?

赵明:荣耀从起家于互联网手机走到今天,走到全球市场时,面临各种各样的场景。今天的业态跟五年前完全不一样了,如果说五年前中国有七八百个手机的品牌,甚至说上千个也不为过,到了今天品牌越来越集中,大家都在从互联网走向全渠道。

其次,荣耀原来是根植于中国,到了2018年是荣耀全面走向全球市场的元年,荣耀海外市场比重会越来越高,未来到2020年,荣耀在中国和海外市场(份额比例)甚至可以达到1:1,再往后可能是荣耀海外市场会高于中国市场。

再者,荣耀同年轻人沟通和交流时,整个品牌的形象、理念以及沟通的方式会更加多元化,应该能够匹配和适应用户对于一个年轻的科技品牌的诉求。

媒体:能否聊一下今年全球化的成绩?

赵明:还没有到盘点,海外市场的全年销量增长率肯定超过150%,翻了好几番。就海外占比而言,今年应该可以达到20%-30%,增长非常大。

媒体:“荣耀亲选”这个平台的定位是什么?

赵明:这个平台是荣耀未来O2O,打通线上和线下的平台。荣耀现在有Vmall商城,同时还有天猫、京东、唯品会、苏宁易购等线上合作伙伴,这个平台是让我们更好去理解荣耀用户的群体,在跟用户交互时和交流时,我们会获得更直接的用户对于荣耀选择的信息。

今天已经跟大家宣布荣耀要在全国建第一家旗舰店,在打通O2O时,因为线上产品选择是多的,不可能把所有SKU(库存量单位)都放在线下,需要一个平台在未来给荣耀线下自己的旗舰店和合作伙伴赋能。未来只会建个别几个旗舰店,荣耀的轻资产这条战略是没有任何变化的。今天我告诉你要建成什么样,大家的理解是五花八门的,索性我们在全国打几个样。

媒体:“荣耀亲选”只会卖荣耀的东西,还是更宽泛的电商概念?

赵明:不一定。荣耀未来的产品选择上,会围绕着科技的周边,是帮用户亲选的概念,要用我们对于科技和对于产品的理解力帮助大家把最好的顶级的制造资源找到,带来最好的设计和制造的质量。我们未来是要给年轻人带来真正的高品质的生活,选到最好的产品。

媒体:今天荣耀发布了云电脑技术,这项技术未来会在荣耀产品线整体设计思路里将发挥怎样的作用?

赵明:云电脑可以让手机变成生产工具。可以想像一下,在很多公司里,未来可以不用买工作机甚至台式机,一部手机就可以了,小屏可以带着蓝牙键盘,处理一些工作信息没问题。个人的商务办公、大型的游戏非常吃GPU,但为了偶尔玩一把游戏就买一个很贵的台式机也不现实。

云电脑的功能会是整个手机应用的一次升级,它帮助我们通过手机入口进入另外一个Link,通过这样的方式随时随地都可以体验,这是传统图形工作站、游戏终端都达不到的。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802645.htm

国产水下滑翔机“海燕”再创续航里程新纪录



据新华社报道,昨日,由天津大学研制的国产水下滑翔机“海燕”再次刷新由自己保持的连续工作时间最长和续航里程最远等纪录。本次再创佳绩的是“海燕-L”长航程水下滑翔机(编号CHC03)。该型号的“海燕”是在国家重点研发计划“深海关键技术与装备”重点专项支持下,由天津大学与青岛海洋科学与技术试点国家实验室联合实验室研制的。

据介绍,今年11月下旬,该水下滑翔机在南海北部安全回收,顺利完成项目中期海上试验考核,无故障运行141天,最大工作深度1010米,连续剖面数达734个,续航里程3619.6公里,再次刷新此前由其保持的国产水下滑翔机连续工作时间最长和续航里程最远等纪录。

此外,今年上半年,“海燕-L”长航程水下滑翔机(编号CHC01)连续运行119天,完成剖面862个,航行里程2272.4公里,创造了当时国产水下滑翔机连续工作时间最长、测量剖面最多、续航里程最远等国家纪录。

据悉,2018年“海燕-X”万米级水下滑翔机也在马里亚纳海沟附近海域通过测试并安全回收,最大下潜深度至8213米,创造了水下滑翔机下潜深度的世界纪录。

青岛海洋科学与技术试点国家实验室海洋观测与探测联合实验室(天津大学部分)深海智能装备团队在国家部委的大力支持下,目前已经具备工作深度200米、1000米、4000米和10000米谱系化“海燕”研发、生产和技术服务能力。2018年度,“海燕”团队面向全国12家用户单位提供相关技术服务共50台次,完成剖面7807个,为我国水下滑翔机海上常态化观测能力的提升提供了重要支撑。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802643.htm

印尼狮航737 MAX空难致189死:家属以飞机故障为由怒告波音



今年10月29日,隶属印度尼西亚狮航(Lion Air)的一架波音737 MAX 8客机坠入爪哇海域,机上189人全部罹难,这是737 MAX机型自2017年投入商业运营后发生的首起重大事故。据外媒报道,一名遇难者(Sudibyo Onggo Wardoyo)家属在事故发生后将波音告上法庭,称其制造的客机存在不合理的危险,并要求在波音总部芝加哥进行陪审团审判。

家属讼称,机龄仅两个月的失事客机存在传感器向飞行控制系统提供不准确数据的问题,进而导致其反失速系统不正常运转从而酿成惨剧。

诉状中还提到,波音公司在地面飞行培训中也没有尽职,导致飞行员对新的反失速系统操作机制了解不全面。

负责为原告(死者父母以及三个兄弟姐妹)辩护的Corboy & Demetrio律所律师Thomas Demetrio形象地描述事故的核心“原因”,“波音把飞行员双眼蒙上,然后又捆住双手”

1280px-Lion_Air_Boeing_737-MAX8;_@CGK_2018_(31333957778).jpg

资料图


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802641.htm

领克0X Coupe轿跑车概念车:掀背设计还带鸥翼门



据外媒报道,一组被称为是领克0X Coupe轿跑车的概念图在网上流传开来,该设计图出自美国加州的大学生Tianbo Ma之手,几乎颠覆了领克汽车在01、02、03上沿用的设计语言。该车设计上极具未来感,车头大灯造型依稀能看到现款领克家族车型的元素,灯组内部双条形LED灯带依旧富有辨识度,但上下双层的保险杠造型已经不见。

车身采用与特斯拉Model X、奔驰SLS一样的鸥翼门设计,同时尾部还有开口巨大,地台很低的掀背式后尾厢。

据设计者介绍,美国加利福尼亚州的很多家庭都养宠物狗,如何让一辆车既能满足两人乘用,又可以容纳行李、方便宠物进出,成了他设计领克0X Coupe轿跑车的初衷,该车低矮的掀背式后尾厢恰好满足了这些要求。

而该车尾部设计与当下领克家族元素已经相去甚远,除了贯穿式黑色条幅上的领克LOGO,两侧灯组内部保留有类似现款的能量晶体设计,尾灯造型及保险杆样式都与现款完全不同。

但是从领克车型目前三款车型家族元素的统一性上来看,领克未来即便是推出这样更具未来感的所谓0X轿跑车型,设计上应该也不会如此颠覆,大伙给这设计打多少分?

(领克 03)


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802637.htm

汇总2018年有关Google Fuchsia的新闻和传闻



我们期待看到谷歌宣布谷歌Fuchsia发布, – 它是Chrome和Android操作系统(OS)的融合。但是,Google Fuchsia将采用什么形式呢?虽然Google Pixelbook和其他一些最好的Chromebook能够通过Google Play商店运行Android应用程序,甚至是早期版本的Fuchsia,但我们认为最终产品 – 如果它已经完成 – 可能会最终成为跨所有不同类型设备的第二个Google操作系统。

基本上,不知道Google Fuchsia最终将会是什么。关于Google Fuchsia的信息少而神秘。但是,我们知道Google Fuchsia的核心是能够在您使用的任何设备上做任何您想做的事情。我们可以在最近谷歌的一些举动中看到这种方法 – 比如将Android消息和VR视频编辑器带到各种设备上。

事实上,Google Pixel Slate可以让我们一睹未来可能对Google Fuchsia的影响 – 即使我们没有接近实际发布的操作系统。借助这款新平板电脑,谷歌已经改变了平板电脑操作系统的用户界面,使平板电脑更加美观 – 使其更接近不同系列设备的统一操作系统。它是否与Fuchsia有关还有待观察,但它可能是朝着正确方向迈出的一步。

因此,无论最终产品是什么,或者Google Fuchsia是否向公众发布,我们将继续跟踪最新的信息。

  • Fuchsia是什么?Android-和-Chrome,多设备操作系统

  • 什么时候出来?现在可以在Google Pixelbook上找到早期版本

  • Fuchsia会花多少钱?可能没什么,就像Android和Chrome一样

运行早期版本的Fuchsia OS的Google Pixelbook(图片来源:Ars Technica)

什么是Google Fuchsia?

虽然正在研究它的团队表示,他们希望Fuchsia成为第二谷歌操作系统,运行在所有手机、平板电脑、笔记本电脑和智能家居设备上 – 谷歌的领导层仍然将其称为实验。所以,只需要等待,看看会发生什么,以及实现所有这些实验的内容。

那么,Google Fuchsia是一个混合操作系统,仍处于开发阶段。根据9to5Google的说法,整个Fuchsia OS由两个截然不同但相互关联的用户界面(UI)组成:一个以电话为中心的代号为“Armadillo”和一个内部称为“ Capybara ”的传统桌面用户界面。

到目前为止,关于移动版Fuchsia的信息比笔记本电脑更为人所知,但ArsTechnica最近能够在一个非常早期的状态下使用Google Pixelbook运行Fuchsia。

根据与其一起使用的硬件将操作系统划分为两个独立的UI,这是一个经典的微软启发的移动系统。Windows 10已经扩展,具体取决于它是否与台式计算机、手机、平板电脑或游戏机一起使用。实际上,Windows 10唯一的统一程序是它的内核,它是控制大部分操作系统的根代码。

在Fuchsia的情况下,该内核被称为“锆石”,它的设计始终可以升级,除了可以安全地从不断访问它的应用程序,添加额外的安全层和消除应用程序与OS不兼容的情况更新。

无论是移动还是桌面方面,Fuchsia都充满了谷歌的Material设计,遍布其Android和Chrome OS产品。阴影是设计审美的一大焦点,使用一种新的基于Vulkan的图形渲染器,称为“Escher”来完成这项工作。结果是界面比传统的平板OS产品更具深度。

智能手机设备上出现的Google Fuchsia。

Fuchsia也非常关注基于卡片的界面,其中您打开的每个应用程序都出现在其中一张卡片中 – 此外,您可以将多个应用程序放入一张卡片中。这使用户围绕手头的任务而不是应用程序。由于Google开发了一种名为Flutter的新型跨平台移动应用开发框架,因此预计这些应用在不同设备上的外观相同。

除此之外,Google Fuchsia围绕Google智能助理更深入地访问和使用您的应用和信息,以提供更多操作和见解。根据GitHub开发人员页面,谷歌已将这些应用程序和信息称为“实体”,而且这些应用程序都可以通过Fuchsia上的Google智能助理访问。我们甚至看过最近的一个演示,进一步说明了Google智能助理在Fuchsia中的根深蒂固。

根据9to5谷歌的一份报告,谷歌似乎也在改变收集Fuchsia内部分析数据的方式。Fuchsia将看到一个名为“Cobalt”的新分析程序的实施,该程序将收集有关您如何在操作系统中使用应用程序的信息。据称Cobalt是谷歌对安全操作系统采取安全措施的一部分,但加密还没有开始 – 但是,我们确信谷歌最终会更好地为Cobalt提供安全保障。

根据谷歌9to5的一份报告,谷歌浏览器,或至少早期的Chromium版本已经在早期版本的Google Fuchsia上运行。而且,虽然它还没有为聚光灯做好准备,但这确实意味着刚刚起步的操作系统越来越接近无需准备时间即可使用。

最后,Fuchsia希望成为迄今为止最好的跨设备操作系统。为实现这一目标,Fuchsia使用GitHub社区称为“Ledger”的新工具。一旦您在Fuchsia设备上登录Google帐户,Ledger将自动在所有Fuchsia设备的所有已安装应用中保存您的位置。

总而言之,Fuchsia是谷歌尝试将Chrome和Android中的最佳产品整合到一个操作系统中,这个系统在您使用它和离开时都更有效 – 更不用说在这些状态之间或设备之间。

Google Fuchsia发布日期

自2016年8月以来,我们已经看到大量关于Google Fuchsia发布日期的传言 – 而且每个都被证明是假的。这些谣言通常出现在谷歌在加利福尼亚举行的Google大型IO开发者活动之前,或者当我们知道大型硬件版本即将来临时。

早在二月份,据透露,谷歌前安卓平台安全负责人尼克克拉列维奇已离开Android团队,在Fuchsia部门“定义安全”。Kralevich将其描述为“新的,实验性的操作系统”,并没有暗示任何特定的启动窗口,但它确实显示了谷歌选择放置其最重要资源的位置。

目前,该猜测指出,Fuchsia将在未来三年内在智能家居设备上运行,并在未来五年内完全公开发布。然而,即使这似乎是一个非常不稳定的谣言 – 如果我们看到它在2024年之前发布(或实际的机器人),我们会感到惊讶,如果它真的出来了。

但是,最近通过Android开源项目的开发者消息表明了一些动作。其中一个提交提到两个回购,9to5Google的人们认为是“官方Fuchsia SDK的合并”。另一个提交提到华为Honor Play智能手机,所以我们很快就可以看到Fuchsia在实际设备上进行了测试。

无论如何,当我们接近可能的发布日期时,请将其锁定在此页面上,因此可能会为您提供一些新信息。

Fuchsia对于Android和Chrome以及Windows和macOS有什么意义?

街上的消息是Google Fuchsia是谷歌对微软和苹果联合平台的回应。将Android变成两大智能手机平台之一,后来推广Chrome操作系统 – 更不用说谷歌基于网络的生产力计划G-Suite。谷歌已经成为所有平台上的主要参与者。

从它的声音来看,谷歌正着手完成微软和苹果已经拥有的Windows 10,iOS和macOS High Sierra的大部分内容。连续性,分别以谷歌的方式。您可以轻松地获得Google无与伦比的搜索和数据跟踪功能 – Google智能助理和’实体’,任何人? – 它可以比微软和Apple更好地吹嘘,以及一个不断发展的界面,以满足访问它的设备的需求。

这最终意味着Android和Chrome的终结吗?在名义上,最有可能,但他们的原则几乎肯定会存在 – 有太多坚实的基础,不能建立在他们之上。只需看看在这两个版本的紫红色的早期版本中找到的Material设计语言。

最终结果可能会在今年晚些时候的预览版和2019年的可购买设备中看到,这将是Google担心的一个平台。借助Fuchsia,Google将能够同时向所有版本推送新的更新和功能,从而简化支持以及用户理解。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802635.htm

译:Java局部变量类型推断(Var类型)的26条细则



原文链接:https://dzone.com/articles/var-work-in-progress

作者:Anghel Leonard

译者:沈歌

image

Java局部变量类型推断(LVTI),简称var类型(标识符var不是一个关键字,是一个预留类型名),Java 10中通过JEP 286: Local-Variable Type Inference 添加进来。作为100%编译特征,它不会影响字节码,运行时或者性能。在编译时,编译器会检查赋值语句右侧代码,从而推断出具体类型。它查看声明的右侧,如果这是一个初始化语句,它会用那个类型取代var。另外,它非常有助于减少冗余代码和样板代码。它还只在旨在编写代码时所涉及的仪式。例如,使用var evenAndOdd=... 代替Map<Boolean, List<Integer>> evenAndOdd... 非常方便。根据用例,它有一个代码可读性的权衡,会在下面第一条中提到。

此外,这里有26条细则,覆盖了var类型的用例,包括它的限制。

1. 争取起有意义的局部变量名

通常我们在起全局变量名的时候会注意这一点,但是选择局部变量名的时候不太注意。尤其是当方法很短,方法名和实现都不错的时候,我们趋向于简化我们的变量名。但是当我们使用var替代显式类型的时候,具体的类型是通过编译器推断出来的。所以,对于人来说阅读或者理解代码非常困难。在这一点上var削弱了代码可读性。这种事情之所以会发生,是因为大多数情况下,我们会把变量类型当成是第一信息,而把变量名当成第二信息。但是使用var的时候,恰恰相反。

示例1

即使到这里,一些朋友仍然坚持局部变量名短点好。我们看一下:


// HAVING
public boolean callDocumentationTask() {
    DocumentationTool dtl = ToolProvider.getSystemDocumentationTool();
    DocumentationTask dtt = dtl.getTask(...);
    return dtt.call();
}

我们换成var时,避免:

// AVOID
public boolean callDocumentationTask() {
    var dtl = ToolProvider.getSystemDocumentationTool();
    var dtt = dtl.getTask(...);
    return dtt.call();
}

更好:

// PREFER
public boolean callDocumentationTask() {
    var documentationTool = ToolProvider.getSystemDocumentationTool();
    var documentationTask = documentationTool.getTask(...);
  return documentationTask.call();
}

示例2:

避免:

// AVOID
public List<Product> fetchProducts(long userId) {
    var u = userRepository.findById(userId);
    var p = u.getCart();
    return p;
}

更好:

// PREFER
public List<Product> fetchProducts(long userId) {
    var user = userRepository.findById(userId);
    var productList = user.getCart();
    return productList;
}

示例3:

争取为局部变量起有意义的名字并不意味着要掉入过度命名的坑,避免在短方法中使用单一类型的数据流:


// AVOID
var byteArrayOutputStream = new ByteArrayOutputStream();

用如下代码代替更加清晰:

// PREFER
var outputStream = new ByteArrayOutputStream();
// or
var outputStreamOfFoo = new ByteArrayOutputStream();

另外,你知道吗,Java内部使用了一个类名字叫:InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState

额。。。命名这个类型的变量是个挑战。

2. 使用数据类型标志来帮助var去推断出预期的基本数据类型(int, long, float, double)

如果在基本数据类型中不使用有效的数据类型标志,我们可能会发现预期的类型和推测出的类型不一致。这是由于var的隐式类型转换导致的。

例如,下面两行代码的表现是符合预期的,首先,我们声明一个boolean 和一个char使用显式类型:

boolean flag = true; // 这是一个boolean类型
char a = 'a';        // 这是一个char类型

现在,我们使用var代替显式基本类型:

var flag = true; // 被推断为boolean类型
var a = 'a';     // 被推断为char类型

到目前为止,一切都很完美。接下来,我们看一下相同逻辑下的int, long, doublefloat:

int intNumber = 20;       // 这是int类型
long longNumber = 20;     // 这是long类型
float floatNumber = 20;   // 这是float类型, 20.0
double doubleNumber = 20; // 这是double类型, 20.0

以上代码是很常见而且清晰的,现在我们使用var:

避免:

// AVOID
var intNumber = 20;    // 推断为int
var longNumber = 20;   // 推断为int
var floatNumber = 20;  // 推断为int
var doubleNumber = 20; // 推断为int

四个变量都被推断成了int。为了修正这个行为,我们需要依赖Java中的数据类型标志。

更好实现:

// PREFER
var intNumber = 20;     // 推断为int
var longNumber = 20L;   // 推断为long
var floatNumber = 20F;  // 推断为float, 20.0
var doubleNumber = 20D; // 推断为double, 20.0

但是如果我们使用小数声明一个数字,会发生什么呢?当你认为你的数字是一个float的时候,避免这样做:

// 避免,如果这是一个float
var floatNumber = 20.5; // 推断为double

你应该用对应的数据类型标志来避免这样的问题:

// 更好, 如果这是一个float
var floatNumber = 20.5F; // 推断为float

3. 在某些情况下,Var隐式类型转换可以维持可维护性

在某些情况下,Var隐式类型转换可以维持可维护性。例如,假设我们的代码包含两个方法:第一个方法接收一个包含不同条目的购物卡,比较市场中不同的价格,计算出最好的价格,并汇总返回float类型的总价。另一个方法简单的把这个float价格从卡中扣除。

首先,我们看一下计算最好价格的方法:

public float computeBestPrice(String[] items) {
   ...
   float price = ...;
   return price;
}

然后,我们看一下扣款的方法:

public boolean debitCard(float amount, ...) {
    ...
}

现在,我们把这两个方法汇总,提供一个服务方法。顾客选择要买的商品,计算最优价格,然后扣款:

// AVOID
public void purchaseCart(long customerId) {
    ...
    float price = computeBestPrice(...);
    debitCard(price, ...);
}

一段时间后,公司想要去除价格中的小数部分作为打折策略,使用int代替了float, 我们需要修改代码。

public int computeBestPrice(String[] items) {
   ...
   float realprice = ...;
   ...
   int price = (int) realprice;
   return price;
}
public boolean debitCard(int amount, ...) {
    ...
}

问题在于我们使用了显示类型float,这样的更改不能被兼容。代码会报编译时错误。但是如果我们预判到这种情况,使用var代替float, 我们的代码会因为隐式类型转换而变得没有兼容性问题。

// PREFER
public void purchaseCart(long customerId) {
    ...
    var price = computeBestPrice(...);
    debitCard(price, ...);
}

4. 当数据类型标志解决不了问题的时候,依赖显式向下转换或者避免var

一些Java基础数据类型不支持数据类型标志。例如byteshort。使用显式基础数据类型时没有任何问题。使用var代替的时候:

// 这样更好,而不是使用var
byte byteNumber = 45;     // 这是byte类型
short shortNumber = 4533; // 这是short类型

为什么在这种情况下显式类型比var好呢?我们切换到var.注意示例中都会被推断为int, 而不是我们预期的类型。

避免使用以下代码:

// AVOID
var byteNumber = 45;    // 推断为int
var shortNumber = 4533; // 推断为int

这里没有基础数据类型帮助我们,因此我们需要依赖显示强制类型转换。从个人角度来讲,我会避免这么用,因为没啥好处,但是可以这么用。

如果你真的想用var,这么用:

// 如果你真的想用var,这么写
var byteNumber = (byte) 45;     // 推断为byte
var shortNumber = (short) 4533; // 推断为short

5. 如果变量名没有对人来说足够的类型信息,避免使用var

使用var有助于提供更加简练的代码。例如, 在使用构造方法时(这是使用局部变量的常见示例),我们可以简单地避免重复类名的必要性,从而消除冗余。

避免:

// AVOID
MemoryCacheImageInputStream inputStream = new MemoryCacheImageInputStream(...);

更好:

// PREFER
var inputStream = new MemoryCacheImageInputStream(...);

在下面的结构中,var也是一个简化代码而不丢失信息的好方法。

避免:

// AVOID
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fm = compiler.getStandardFileManager(...);

更好:

// PREFER
var compiler = ToolProvider.getSystemJavaCompiler();
var fileManager = compiler.getStandardFileManager(...);

为什么这样基于var的例子我们感觉比较舒服呢?因为需要的信息已经在变量名中了。但是如果使用var 加上变量名,还是会丢失信息,那么最好避免使用var

避免:

// AVOID
public File fetchCartContent() {
    return new File(...);
}
// As a human, is hard to infer the "cart" type without 
// inspecting the fetchCartContent() method
var cart = fetchCartContent();

使用以下代码代替:

// PREFER
public File fetchCartContent() {
    return new File(...);
}
File cart = fetchCartContent();

思考一个基于java.nio.channels.Selector的例子。这个类有一个静态方法叫做open(),返回一个新的Selector实例并且执行open动作。但是Selector.open()很容易被认为返回一个boolean标识打开当前选择器是否成功,或者返回void。使用var导致丢失信息会引发这样的困扰。

6. var类型确保编译时安全

var类型是编译时安全的。这意味着如果我们试图实现一个错的赋值,会导致编译时报错。例如,以下代码编译不会通过。

// 编译通不过
var items = 10;
items = "10 items"; // 不兼容类型: String不能转为int

以下代码编译会通过

var items = 10;
items = 20;

这个代码也会编译通过:

var items = "10";
items = "10 items" ;

所以,一旦编译器已经推断出了var对应的类型,我们只能赋值对应类型的值给它。

7. var 不能被用于将真实类型的实例赋值给接口类型变量。

在Java中,我们使用“面向接口编程”的技术。

例如,我们创建一个ArrayList的实例,如下(绑定代码到抽象):

List<String> products = new ArrayList<>();

我们避免这样的事情(绑定代码到实现):

ArrayList<String> products = new ArrayList<>();

所以,通过第一个例子创建一个ArrayList实例更好,但是我们也需要声明一个List类型的变量。因为List是一个接口,我们可以很容易的切换到List的其他实现类,而无需额外的修改。

这就是“面向接口编程”,但是var不能这么用。这意味着当我们使用var时,推断出的类型是实现类的类型。例如,下面这行代码,推测出的类型是ArrayList<String>:

var productList = new ArrayList<String>(); // 推断为ArrayList<String>

以下几个论点支持这一行为:

  • 首先,var是局部变量,大多数情况下,“面向接口编程”在方法参数和返回类型的时候更有用。
  • 局部变量的作用域比较小,切换实现引起的发现和修复成本比较低。
  • var将其右侧的代码视为用于对端实际类型的初始化程序,如果将来修改初始化程序,则推断类型会改变,从而导致后续依赖此变量的代码产生问题。

8. 意外推断类型的可能性

如果不存在推断类型所需的信息,则与菱形运算符组合的var类型可能导致意外推断类型。

在Java 7之前的Coin项目中,我们写了这样的代码:

//显式指定泛型类的实例化参数类型
List<String> products = new ArrayList<String>();

从Java 7开始,我们有了菱形运算符,它能够推断泛型类实例化参数类型:

// inferring generic class's instantiation parameter type 
List<String> products = new ArrayList<>();

那么,以下代码推断出什么类型呢?

首先应该避免这么用:

// AVOID
var productList = new ArrayList<>(); // 推断为ArrayList<Object>

推断出的类型是Object的ArrayList。之所以会这样是因为没有找到能够推测到预期类型为String的信息,这会导致返回一个最广泛可用类型,Object。

所以为了避免这样的情形,我们必须提供能够推断到预测类型的信息。这个可以直接给也可以间接给。

更好的实现(直接):


// PREFER
var productList = new ArrayList<String>(); // 推断为ArrayList<String>

更好的实现(间接):

var productStack = new ArrayDeque<String>(); 
var productList = new ArrayList<>(productStack); // 推断为ArrayList<String>

更好的实现(间接):

Product p1 = new Product();
Product p2 = new Product();
var listOfProduct = List.of(p1, p2); // 推断为List<Product>
// 不要这么干
var listofProduct = List.of(); // 推断为List<Object>
listofProduct.add(p1);
listofProduct.add(p2);

9. 赋值数组到var不需要中括号[]

我们都知道Java中如何声明一个数组:

int[] numbers = new int[5];
// 或者,这样写不太好
int numbers[] = new int[5];

那么怎么用var呢?左边不需要使用括号。

避免这么写(编译不通过):

// 编译通不过
var[] numbers = new int[5];
// 或者
var numbers[] = new int[5];

应该这么用:

// PREFER
var numbers = new int[5]; // 推断为int数组
numbers[0] = 2;   // 对
numbers[0] = 2.2; // 错
numbers[0] = "2"; // 错

另外,这么用也不能编译,这是因为右边没有自己的类型。

// 显式类型表现符合预期
int[] numbers = {1, 2, 3};
// 编译通不过
var numbers = {1, 2, 3};
var numbers[] = {1, 2, 3};
var[] numbers = {1, 2, 3};

10. var类型不能被用于复合声明(一行声明多个变量)

如果你是复合声明的粉丝,你一定要知道var不支持这种声明。下面的代码不能编译:


// 编译通不过
// error: 'var' 不允许复合声明
var hello = "hello", bye = "bye", welcome = "welcome";

用下面的代码代替:

// PREFER
String hello = "hello", bye = "bye", welcome = "welcome";

或者这么用:

// PREFER
var hello = "hello";
var bye = "bye";
var welcome = "welcome";

11. 局部变量应力求最小化其范围。var类型强化了这一论点。

局部变量应该保持小作用域,我确定你在var出现之前就听过这个,这样可以增强代码可读性,也方便更快的修复bug。

例如我们定义一个java栈:

避免:

// AVOID
...
var stack = new Stack<String>();
stack.push("George");
stack.push("Tyllen");
stack.push("Martin");
stack.push("Kelly");
...
// 50行不用stack的代码
// George, Tyllen, Martin, Kelly  
stack.forEach(...);
...

注意我们调用forEach 方法,该方法继承自java.util.Vector.这个方法将以Vector的方式遍历栈。现在我们准备切换StackArrayDeque,切换之后forEach()方法将变成ArrayDeque的,将以stack(LIFO)的方式遍历stack。

// AVOID
...
var stack = new ArrayDeque<String>();
stack.push("George");
stack.push("Tyllen");
stack.push("Martin");
stack.push("Kelly");
...
// 50行不用stack的代码
// Kelly, Martin, Tyllen, George
stack.forEach(...);
...

这不是我们想要的,我们很难看出引入了一个错误,因为包含forEach()部分的代码不在研发完成修改的代码附近。为了快速修复这个错误,并避免上下滚动来了解发生了什么,最好缩小stack变量的作用域范围。

最好这么写:

// PREFER
...
var stack = new Stack<String>();
stack.push("George");
stack.push("Tyllen");
stack.push("Martin");
stack.push("Kelly");
...
// George, Tyllen, Martin, Kelly  
stack.forEach(...);
...
// 50行不用stack的代码

现在,当开发人员从Stack切换到ArrayQueue的时候,他们能够很快的注意到bug,并修复它。

12. var类型便于三元运算符右侧的不同类型的操作数

我们可以在三元运算符的右侧使用不同类型的操作数。

使用具体类型的时候,以下代码无法编译:

// 编译通不过
List code = containsDuplicates ? List.of(12, 1, 12) : Set.of(12, 1, 10);
// or
Set code = containsDuplicates ? List.of(12, 1, 12) : Set.of(12, 1, 10);

虽然我们可以这么写:

Collection code = containsDuplicates ? List.of(12, 1, 12) : Set.of(12, 1, 10);
Object code = containsDuplicates ? List.of(12, 1, 12) : Set.of(12, 1, 10);

这样也编译不过:

// 编译通不过:
int code = intOrString ? 12112 : "12112";
String code = intOrString ? 12112 : "12112";

但是我们可以这么写:

Serializable code = intOrString ? 12112 : "12112";
Object code = intOrString ? 12112 : "12112";

在这种情况下,使用var更好:

// PREFER
// inferred as Collection<Integer>
var code = containsDuplicates ? List.of(12, 1, 12) : Set.of(12, 1, 10);
// inferred as Serializable
var code = intOrString ? 12112 : "12112";

千万不要从这些例子中得出var类型是在运行时做类型推断的,它不是!!!

当然,我们使用相同的类型作为操作数时var是支持的。

// 推断为float
var code = oneOrTwoDigits ? 1211.2f : 1211.25f;

13. var类型能够用在循环体中

我们能非常简单的在for循环中用var类型取代具体类型。这是两个例子。

var替换int:

// 显式类型
for (int i = 0; i < 5; i++) {
     ...
}
// 使用 var
for (var i = 0; i < 5; i++) { // i 推断为 int类型
     ...
}

var替换Order:

List<Order> orderList = ...;
// 显式类型
for (Order order : orderList) {
    ...
}
// 使用 var
for (var order : orderList) { // order 推断成Order类型
    ...
}

14. var类型能够和Java 8中的Stream一起用

将Java10中的var与Java 8中的Stream结合起来非常简单。

你需要使用var取代显式类型Stream:

例1:

// 显式类型
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);                
numbers.filter(t -> t % 2 == 0).forEach(System.out::println);
// 使用 var
var numbers = Stream.of(1, 2, 3, 4, 5); // 推断为 Stream<Integer>               
numbers.filter(t -> t % 2 == 0).forEach(System.out::println);

例2:

// 显式类型
Stream<String> paths = Files.lines(Path.of("..."));
List<File> files = paths.map(p -> new File(p)).collect(toList());
// 使用 var
var paths = Files.lines(Path.of("...")); // 推断为 Stream<String>
var files = paths.map(p -> new File(p)).collect(toList()); // 推断为 List<File>

15. var类型可用于声明局部变量,可用于分解表达式嵌套/长链

var类型可用于声明局部变量,可用于分解表达式嵌套/长链.

大的或者嵌套的表达看起来令人印象深刻,通常它们被认为是聪明的代码。有时候我们会故意这么写,有时候我们从一个小表达式开始写,慢慢越来越大。为了提高代码可读性,建议用局部变量来破坏大型/嵌套表达式。但有时候,添加这些局部变量是我们想要避免的体力活。如下:

避免:

List<Integer> intList = List.of(1, 1, 2, 3, 4, 4, 6, 2, 1, 5, 4, 5);
// AVOID
int result = intList.stream()
    .collect(Collectors.partitioningBy(i -> i % 2 == 0))
    .values()
    .stream()
    .max(Comparator.comparing(List::size))
    .orElse(Collections.emptyList())
    .stream()
    .mapToInt(Integer::intValue)
    .sum();

更好:


List<Integer> intList = List.of(1, 1, 2, 3, 4, 4, 6, 2, 1, 5, 4, 5);
// PREFER
Map<Boolean, List<Integer>> evenAndOdd = intList.stream()
    .collect(Collectors.partitioningBy(i -> i % 2 == 0));
Optional<List<Integer>> evenOrOdd = evenAndOdd.values()
    .stream()
    .max(Comparator.comparing(List::size));
int sumEvenOrOdd = evenOrOdd.orElse(Collections.emptyList())
    .stream()
    .mapToInt(Integer::intValue)
    .sum();

第二段代码可读性更强,更简洁,但是第一段代码也是对的。我们的思维会适应这样的大表达式并且更喜欢它们而不是局部变量。然而,使用var类型对于使用局部变量的方式来说是一个优化,因为它节省了获取显式类型的时间。

更好

var intList = List.of(1, 1, 2, 3, 4, 4, 6, 2, 1, 5, 4, 5);
// PREFER
var evenAndOdd = intList.stream()
    .collect(Collectors.partitioningBy(i -> i % 2 == 0));
var evenOrOdd = evenAndOdd.values()
    .stream()
    .max(Comparator.comparing(List::size));
var sumEvenOrOdd = evenOrOdd.orElse(Collections.emptyList())
    .stream()
    .mapToInt(Integer::intValue)
    .sum();

16. var类型不能被用于方法返回类型或者方法参数类型。

试着写下面的两段代码,编译通不过。

使用var作为方法返回类型:

// 编译通不过
public var countItems(Order order, long timestamp) {
    ...        
}

使用var作为方法参数类型:

// 编译通不过
public int countItems(var order, var timestamp) {
    ...  
}

17. var类型的局部变量可以用来传入到方法参数,也可以用来存放方法返回值

var类型的局部变量可以用来传入到方法参数,也可以用来存放方法返回值。下面这两段代码能够编译而且运行。

public int countItems(Order order, long timestamp) {
    ...
}
public boolean checkOrder() {
    var order = ...;     // Order实例
    var timestamp = ...; // long类型的 timestamp
    var itemsNr = countItems(order, timestamp); // 推断为int类型
    ...
}

它也适用于泛型。下面的代码片段也是对的。

public <A, B> B contains(A container, B tocontain) {
    ...
}
var order = ...;   // Order实例
var product = ...; // Product实例
var resultProduct = contains(order, product); // inferred as Product type

18. var类型能和匿名类一起使用。

避免:

public interface Weighter {
    int getWeight(Product product);
}
// AVOID
Weighter weighter = new Weighter() {
    @Override
    public int getWeight(Product product) {
        ...
    }
};
Product product = ...; // Product实例
int weight = weighter.getWeight(product);

更好的代码:

public interface Weighter {
    int getWeight(Product product);
}
// PREFER
var weighter = new Weighter() {
    @Override
    public int getWeight(Product product) {
        ...
    }
};
var product = ...; // Product实例
var weight = weighter.getWeight(product);

19. var类型可以是Effectively Final

从Java SE 8开始,局部类可以访问封闭块内final或者effectively final的参数。变量初始化后不再改变的参数为effectively final。

所以,var类型的变量可以是effectively final的。我们可以从以下代码中看到。

避免:

public interface Weighter {
    int getWeight(Product product);
}
// AVOID
int ratio = 5; // 这是effectively final
Weighter weighter = new Weighter() {
    @Override
    public int getWeight(Product product) {
        return ratio * ...;
    }
};
ratio = 3; // 这行赋值语句会报错

更好:

public interface Weighter {
    int getWeight(Product product);
}
// PREFER
var ratio = 5; // 这是effectively final
var weighter = new Weighter() {
    @Override
    public int getWeight(Product product) {
        return ratio * ...;
    }
};
ratio = 3; // 这行赋值语句会报错

20. var类型可以用final修饰

默认情况下,var类型的局部变量可以被重新赋值(除非它是effectively final的)。但是我们可以声明它为final类型,如下:

避免:


// AVOID
// IT DOESN'T COMPILE
public void discount(int price) {
    final int limit = 2000;
    final int discount = 5;
    if (price > limit) {
        discount++; // 这行会报错
    }
}

更好:

// PREFER
// IT DOESN'T COMPILE
public void discount(int price) {
    final var limit = 2000;
    final var discount = 5;
    if (price > limit) {
        discount++; // 这行会报错
    }
}

21. Lambda表达式和方法引用需要显示对象类型

当对应的类型推断不出来时不能使用var类型。所以,lambda表达式和方法引用初始化不被允许。这是var类型限制的一部分。

下面的代码无法编译:

// 编译不通过
// lambda表达式需要显式目标类型
var f = x -> x + 1;
// 方法引用需要显式目标类型
var exception = IllegalArgumentException::new;

用以下代码代替:


// PREFER
Function<Integer, Integer> f = x -> x + 1;
Supplier<IllegalArgumentException> exception = IllegalArgumentException::new;

但是在lambda的内容中,Java 11允许我们去使用var作为lambda参数。例如,以下代码在Java 11中可以很好的工作(详见JEP 323(lambda参数中的局部变量))

// Java 11
(var x, var y) -> x + y
// or 
(@Nonnull var x, @Nonnull var y) -> x + y

22. 为var类型赋值为null是不被允许的。

此外,也不允许缺少初始化程序。这是var类型的另一个限制。

以下代码不会编译通过(赋值null):

// 编译通不过
var message = null; // 类型错误: 变量初始化为'null'

这个代码也不会编译通过(缺少初始化):

// IT DOESN'T COMPILE
var message; // 使用var不能不做初始化
...
message = "hello";

更好:

// PREFER
String message = null;
// or
String message;
...
message = "hello";

23. var类型不能作为对象的域(Field)

var类型可以用来做局部变量,但是不能用来做对象的域/全局变量。

这个限制会导致这里的编译错误:

// 编译通不过
public class Product {
    private var price; // 'var' 不被允许
    private var name;  // 'var' 不被允许
    ...
}

用以下代码代替:

// PREFER
public class Product {
    private int price; 
    private String name;
    ...
}

24. var不被允许在catch块中使用

但是它被允许在try-with-resources中。

catch块

当代码抛出异常时,我们必须通过显式类型catch它,因为var类型不被允许。这个限制会导致以下代码的编译时错误:

// 编译通不过
try {
    TimeUnit.NANOSECONDS.sleep(5000);
} catch (var ex) {
    ...
}

用这个取代:

// PREFER
try {
    TimeUnit.NANOSECONDS.sleep(5000);
} catch (InterruptedException ex) {
    ...
}

try-with-resources

另一方面,var类型可以用在try-with-resource中,例如:

// 显式类型
try (PrintWriter writer = new PrintWriter(new File("welcome.txt"))) {
    writer.println("Welcome message");
}

可以用var重写:

// 使用 var
try (var writer = new PrintWriter(new File("welcome.txt"))) {
    writer.println("Welcome message");
}

25. var类型不能和泛型T一起使用

假定我们有下面的代码:

public <T extends Number> T add(T t) {
     T temp = t;
     ...
     return temp;   
}

这种情况下,使用var的运行结果是符合预期的,我们可以用var替换T,如下:

public <T extends Number> T add(T t) {
     var temp = t;
     ...
     return temp;   
}

我们看一下另一个var能够成功使用的例子,如下:

public <T extends Number> T add(T t) {
     List<T> numbers = new ArrayList<>();
     numbers.add((T) Integer.valueOf(3));
     numbers.add((T) Double.valueOf(3.9));
     numbers.add(t);
     numbers.add("5"); // 错误:类型不兼容,string不能转为T
     ...     
}

可以用var取代List

, 如下:

public <T extends Number> T add(T t) {
     var numbers = new ArrayList<T>();
     // DON'T DO THIS, DON'T FORGET THE, T
     var numbers = new ArrayList<>();
     numbers.add((T) Integer.valueOf(3));
     numbers.add((T) Double.valueOf(3.9));
     numbers.add(t);
     numbers.add("5"); // // 错误:类型不兼容,string不能转为T
     ...     
}

26. 使用带有var类型的通配符(?),协方差和反对变量时要特别注意

使用?通配符

这么做是安全的:

// 显式类型
Class<?> clazz = Integer.class;
// 使用var
var clazz = Integer.class;

但是,不要因为代码中有错误,而var可以让它们魔法般的消失,就使用var取代Foo<?>。看下一个例子,不是非常明显,但是我想让它指出核心。考虑一下当你编写这一段代码的过程,也许,你尝试定义一个String的ArrayList,并最终定义成了Collection<?>。

// 显式类型
Collection<?> stuff = new ArrayList<>();
stuff.add("hello"); // 编译错误
stuff.add("world"); // 编译错误
// 使用var,错误会消失,但是我不确定你是你想要的结果
var stuff = new ArrayList<>();
strings.add("hello"); // 错误消失
strings.add("world"); // 错误消失

Java协变(Foo<? extends T>)和逆变(Foo<? super T>)

我们知道可以这么写:

// 显式类型
Class<? extends Number> intNumber = Integer.class;
Class<? super FilterReader> fileReader = Reader.class;

而且如果我们错误赋值了错误的类型,接收到一个编译时错误,这就是我们想要的:

// 编译通不过
// 错误: Class<Reader> 不能转换到 Class<? extends Number>
Class<? extends Number> intNumber = Reader.class;
// 错误: Class<Integer> 不能转化到Class<? super FilterReader>
Class<? super FilterReader> fileReader = Integer.class;

但是如果我们使用var:

// using var
var intNumber = Integer.class;
var fileReader = Reader.class;

然后我们可以为这些变量赋值任何类,因此我们的边界/约束消失了,这并不是我们想要的。

// 编译通过
var intNumber = Reader.class;
var fileReader = Integer.class;

结论

var类型非常酷,而且将来会继续升级。留心JEP 323JEP 301了解更多。祝您愉快。


文章来源:http://www.cnblogs.com

原文地址:https://www.cnblogs.com/shenpengyan/p/10184082.html

去掉手机扬声器!韩媒:三星将展示OLED屏幕发声技术,基于振动和骨传导

来源:天极网IT新闻频道

自从去年苹果推出iPhone X手机之后,OLED全面屏就被大家所熟知。但是由于传感器摄像头等使得屏幕并没有完全达到全面屏。此后各大手机厂商也是绞尽脑汁的提高屏幕占比,出现了水滴屏、挖孔屏等。而在即将到来的2019年,挖孔屏也将成为主流。

随着消费电子展(CES 2019)的临近,有越来越多的消息表示,三星Galaxy系列智能机,将有望去掉扬声器组件。

12月26日,据韩媒报道,三星计划在下个月的CES 2019期间,展示其OLED屏幕发声(Sound on Display)技术。这项技术能够直接通过面板来发声,消除对于外部扬声器的需求。

其基于振动和骨传导,让三星有机会在屏幕下层放置另一个组件,为显示器留出更多的空间。并且这项技术除了应用到手机上也有望用到更大的电视面板上(LG 那边也在积极酝酿类似的解决方案)。

据悉,消费电子展(CES 2019)将于 1 月 8 日(星期二)开幕,并于 1 月 12 日(星期六)闭幕。

虽然三星Galaxy系列智能手机在将来可能会去掉扬声器组件,但是消费电子展临近,而这项技术现在看来也并不成熟,所以应用到三星Galaxy S10上的可能并不大。

文章来源:http://www.guancha.cn

原文地址:http://www.guancha.cn/industry-science/2018_12_27_484789.shtml

4K已成过去式:厂商全力以赴准备8K电视、面板…

来源:驱动之家

原标题:4K已成过去式:厂商全力以赴准备8K电视、面板…

4K面板要被淘汰了吗,至少从厂商的准备来看,的确是这样。

据上游产业链报道称,2019年8K电视面板制造将成为全球液晶面板行业的竞争焦点,目前所有的屏幕厂商都在把精力放在这个领域,而下有的终端厂商也在摩拳擦掌。

更多的平板制造商正在加强在8K领域的部署,因为4K面板已成为电视行业的标准,几乎所有43英寸以上的电视都采用4K面板,而65英寸和75英寸型号将成为8K液晶电视领域的主流尺寸。

目前,三星、京东方、友达光电、华星光电、群创光电等都在主攻85寸以上的大尺寸LCD屏,而LG Display仍将是2019年大尺寸OLED电视面板的独家供应商,其OLED电视面板在该年的出货量预计将达到370万片。

尽管8K电视面板的生产即将在2019年起飞,但由于SoC解决方案的匮乏,低成品率和高生产成本,初始出货量将有限,这也导致前期售价一定不会便宜。

文章来源:http://www.guancha.cn

原文地址:http://www.guancha.cn/industry-science/2018_12_27_484793.shtml

喜忧参半:特斯拉的2018



北京时间12月27日上午消息,随着Model 3的增产,特斯拉在2018年取得了蓬勃发展。对于特斯拉来说,2018年可以算是Model 3的天下。根据官方记录,特斯拉在2017年已经开始进行Model 3的生产和销售工作,但是由于产量极低,2018年前拿到Model 3的大多是公司的员工。

Tesla-Model-S-MOdel-X-SUpercharger.jpg

今年,Model 3开始增产,不过也发生了一些其他有趣的事情。

一起来逐月通过图片了解一下吧。

一月

特斯拉在2018年开始打造Model 3的展示车队,为许多预定者提供亲自看车的机会。

在美国的各处商店,人们都在驻足欣赏。

二月

model-5.jpg

在当时,Model 3的产量情况并不是那么重要,但它确实帮助特斯拉将总产量突破至30万辆电动车。

更疯狂的是,特斯拉花了大约15年时间才达到这一数据,而它却要在接下来一年内再次完成30万辆电动车的生产。

三月

2018年,特斯拉的电动卡车Tesla Semi进行了一次远途测试。当公司的首席执行官埃隆·马斯克(Elon Musk)宣布Tesla Semi将从内华达州的超级工厂Gigafactory 1行驶到加州弗里蒙特时,人们才见到了Semi的庐山真面目。

四月

特斯拉在2017年推出了太阳能屋顶系统,原计划是在2018年开始进行量产和安装,但是最终并未如期进行。

只有一部分员工和客户完成了太阳能屋顶系统的安装。

四月,第一位客户家的太阳能屋顶系统安装完成并启动运行。

五月

在Model 3获得安全评级之前,现实生活中开始出现了一些安全事故。五月,一辆Model 3发生了严重追尾事故,但据车主表示,Model 3的表现“令人感到不可思议”。

最终,Model 3在安全性能方面获得了五星评级。

六月

六月,埃隆·马斯克宣布在公司进行重组之际,特斯拉将辞退9%的员工。

这一声明让公司内的员工大感震惊,反对者称特斯拉要完蛋了。然而,他们错了。

七月

七月,特斯拉Model 3的周产量达到5000辆,员工为此举办庆祝活动。

不幸的是,特斯拉无法在数月内连续保持这一周产量。

八月

有越来越多的Model 3开始上路,一些新车主们开始充分利用特斯拉的Autopilot。

一位特斯拉Model 3的车主表示,“Autopilot帮助自己避免了一场潜在车祸”。

九月

九月,特斯拉Model 3在美国国家公路交通安全管理局(NHTSA)的各个指标下都获得了五星安全评级。特斯拉称Model 3是碰撞致伤率最低的车型。

十月

在车主翘首以待近数月之后,特斯拉正式推出了版本9.0的软件升级包,并通过视频简单向公众展示了新功能。

这是特斯拉在两年多内最重大的一次软件更新。

最终,特斯拉还在9.0版本的更新中推出了Navigate on Autopilot。

十一月

十一月,特斯拉提高了Model S和Model X基础车型的价格,并且削减选项以简化产品阵容。

这是2018年Model S和Model X发生的为数不多的调整。

十二月

除了汽车以外,2018年也是特斯拉能源及其澳洲Powerpack电池储能系统取得诸多进展的一年。

在澳洲运行的第一年时间里,该储能系统帮南澳洲节约了4000万美元。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802633.htm

HealthPlus手术中心可能让3700多名患者意外接触到了艾滋病毒



NBC News 刚刚播报了一则骇人的新闻 —— 曾在新泽西州的 HealthPlus 手术中心接受手术的 3700 多名患者,可能在意外情况下接触到了艾滋病毒、乙型肝炎、丙型肝炎等血源性病原体。虽然截止发稿时,尚未有任何令人担忧的症状报告,但卫生主管部门依然建议,所有在 2018 年 1 月 – 9 月 7 日到院就诊的人们,都应该回院去接受免费检测。

Needle-insertion-angles-1.png

(配图来自:维基百科 / BCIT

报道称,手术中心的工作人员,没有严格遵守保持器械清洁和无菌的医疗指南。结果就是,该机构需要至少承担数百万美元的额外成本。

HealthPlus 透露,灭菌 / 清洁器具过程的控制失误,导致器具可能在注射药物时,让患者意外感染上血源性病原体。此外,工作人员未能遵守有关药物配给和储存的其它规定,以及感染控制规程。

对于发生这种这种不可原谅的行为的深层原因,目前还没有探明。但这起事件的惊骇程度,已促使新泽西州卫生主管部门对 HealthPlus 手术中心展开调查。

报告补充道 —— 手术中心于 9 月 7 日被责令关闭,并在 9 月 28 日被准许重新开放。在此期间,HealthPlus 聘请了新员工、改进了感染控制规程、对无菌处理人员进行了培训、并对所有医疗设备进行了清洁和修整。

[编译自:BGR , 来源:PRWeb]


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802631.htm

日本锂离子电池进化:续航将超1000里



据《日本经济新闻》12月27日报道,1次充电可行驶相当于东京至大阪的500公里的锂离子电池技术开发在日本正日趋活跃。积水化学工业的技术已经具备取得突破的头绪,旭化成也已接近。均能采用现有的电极,预计到本世纪20年代前半期实现实用化。

Nissan_Leaf_012.JPG

资料图

日本经济产业省将扶持充分发挥电池性能的技术开发。在世界范围内,转向纯电动汽车(EV)的趋势正在加速,如果作为课题的续航距离大幅延长,以锂离子电池为主角的时代或将继续持续。

如果在完全充电状态下可行驶500公里,将匹敌汽油车的性能。日本经济产业省等认为这是纯电动汽车普及的条件之一,提出2030年达成的目标。纯电动汽车迅速普及的中国结束了对续航距离低于150公里的车型的补贴,增加了续航距离长的车型的补贴。

锂离子电池于1991年商品化,被用于笔记本电脑和摄像机等。2009年被用于量产型纯电动汽车。完全充电可行驶的距离在200公里左右。一般认为2010年代初以当时的技术难以达到500公里,到2030年前后将被全固体电池等新一代电池取代。

新一代电池的开发在世界范围内日趋活跃,但技术上的课题很多。另一方面,锂离子电池的技术开发取得进展,500公里的突破日趋具有现实可能性。研究人员等预测“锂离子电池还能继续使用10年左右”。

锂离子电池通过锂离子在正负电极间移动来产生电力和进行充电。要增加电池的容量,有必要增加电极中存储的离子,或减少内部电阻,使电子通过更加容易。

积水化学开发的是用于正极的技术,在加入的炭材料的结构上下功夫,使电子流动更容易。扩大正极之中电子通过的通道,电子流动更加顺畅,达到以往的10倍左右。除了大量获得发生的电流之外,电极不易损坏,耐久性得到提高。

将使正极加厚,以便更多取得锂离子。在实验中,电池的容量提高了3成左右。可将续航距离从现在的400公里提高至超过500公里的水平。计划到2021年作为零部件加以销售。

旭化成则是通过向负极混入氧化硅,将容量提高2成左右。向采用碳类材料的负极中加入硅系物质,使得存储锂离子更加容易,能增加容量。但是,具有在捕捉一部分离子的情况下无法释放的问题。通过在负极中预先注入离子,让被捕捉的部分不产生活动,锂离子的取得和释放变得顺利。旭化成力争在数年后实现实用化。

此外,采用此前不存在的电极材料的研究也在推进。横滨国立大学的薮内直明教授与松下合作,开发了混入氟的正极。不仅是金属,氧气也能用于电极内的电子流动,容量达到2倍。住友化学推进采用铝的负极的开发,提出将容量提高至2.5倍的目标。

日本经济产业省将自2019年度起,开发使完全用完锂离子电池电量成为可能的技术。为了防止起火事故等,电池以低于上限的容量使用。将扶持能准确检测剩余电量的传感器的开发,增加可使用量。在2019年度预算中列入2亿5千万日元,力争到2023年实现实用化。

日本曾在锂离子电池领域席卷世界,但2011年以后专利申请出现减少。在中国,大学和企业等的专利申请增加,到2015年,发展为日本和中国各占整体的3分之1。为了增加续航距离,大幅增加电池容量的技术开发正在推进,中国的专利申请预计进一步增加。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/802629.htm