“不务正业”的阿里巴巴工程师,这次盯上了流浪狗



有句名人名言叫做“真正决定人生高度的,是你下班后的时间“。一向以“不务正业”著称的阿里工程师从一个很刁钻的角度证明了这句话。1月22日,一款名为“宠物码”的小程序在支付宝悄然上线。这是一款能够帮助主人为宠物定制二维码狗牌的小程序。如果宠物走失,捡到的好心人能够在通过防骚扰验证后,快速通过扫描二维码联系到宠物主人。

乍一看,这并非是什么重大的技术创新。但值得注意的是,这个项目是几名阿里巴巴的工程师自发组织,利用一个多月的业余时间开发完成的。事情的起因是发起人被一条知乎回复打动了:

——“宠物丢失是一种什么样的体验?”

——“我把你弄丢了,我的身体也像被剥了魂灵一般。那一夜我都没怎么睡,闭上眼睛,全是狗狗的身影。”

发起人蚂蚁金服工程师小蛋(花名)看到这条回复后触动很大。他还查询到一组数据:狗狗丢失超过24个小时以上,张贴寻犬启示等方式的成功率还不到1%,但接到诈骗勒索电话的概率,是接到有效电话的30倍。“我们必须要做点什么”。

(宠物码民间项目组成员合影)

“下班时间搞事情”似乎已经成为阿里巴巴工程师的传统。根据之前阿里公益披露的数据,2018财年阿里共有3000多名工程师利用技术助推公益,整整贡献了5754个公益时。其中,不少民间项目已经是耳熟能详。

支付宝的一位产品经理在2013年就开始用业余时间为视障用户适配手机“听支付宝”功能,并积极推动无障碍开发标准,最终成为支付宝的开发规范。

阿里云的50多名工程师利用1000多个小时的业余时间,搭建了“码上公益”平台。全社会的IT工程师能够通过这个平台向公益机构“捐赠”自己的技术。

帮助找回走失儿童的”团圆“系统同样是阿里的一群工程师下班之后没回家,在公司鼓捣出来的,截至2018年9月15日,“团圆”系统已找回3367名失踪儿童,并得到联合国推广。

就连大名鼎鼎的“蚂蚁森林”其实最初也只是一个不到10人的阿里工程师民间团队做出来的。

(阿里巴巴工程师“不务正业”那些事)

工程师下班时间的“不务正业“与这家公司的侠义文化一脉相承。宠物码项目的发起人小蛋说,“这与KPI无关,与金钱无关,我们做这些事,只是想用自己的技术能力,让这个世界变好一点点。”


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

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

英国脱欧影响300万人:官方居留申请App却麻烦不断



英国的脱欧进程,给想要合法居留在该国的三百万欧盟民众带来了巨大的麻烦。其中一些人已经在英国生活了 40 多年,在这里购房、定居、养育了孩子。然而他们想要将英国作为家园的自由权利,正面临被无情地取消。尽管英国政府承诺,目前居住在英国的人们可以提出定居申请,从而保留之前以欧盟公民身份取得的同等权利。但现实情况是,他们需要填写表格,然后转入漫长的等待。

图片.png

想要处理超过 300 万人的居留申请,显然不是一件小事情。为方便起见,英国政府推出了一款 App,允许人们提交文件进行验证,而无需邮寄原件。

遗憾的是,这款 App 的功能并不好用。许多用户反馈,在使用手机的后置摄像头进行护照扫描的时候,可能会遇到问题。

即便顺利拍完照片,他们还需要将护照放到手机背面,通过 NFC 功能来读取护照中存储的 RFID 信息(也不见得有多顺利)。

最后,用户需要提交自拍的照片,以确保‘人证合一’。

图片.png

这个流程听起来很简单,但实际情况却有些复杂 —— 因为官方仅提供了适用于 Android 设备的 App,而且你的手机要配备了近场通讯(NFC)模块,才能正常工作。

鉴于 iOS 和 Android 分别占据了英国智能手机市场的一半份额(2018 年 9 月的数据为 49.96% vs 49.24%),政府确实考虑不周。

此外,尽管 Android 设备的保有量很大,但大多数入门级设备根本不支持 NFC 功能(尤其是 30~100 英镑这个价位区间)。

这意味着很多人无法在截止日期前,通过自助渠道来完成认证。

图片.png

讽刺的是,该 App 的官方文档写到 —— 如果没有兼容的设备,也可以通过‘付费’的方式,借助他人的手机完成验证。

此外,申请人也可以通过传统的邮寄方式,将资料交付给人工渠道进行审核。但是显然,这需要耗费大量的时间和精力,尤其是那些行动不便的人们。

图片.png

Apptopia 移动研究副总裁 Adam Blacker 表示:

用于提交英国脱欧居留申请文件的 App,其下载量已经超过 4 万次。但与需要注册的百万级人数相比,这部分用户只占极少数。

截止发稿时,该 App 在 Google Play 商店中的评分仅为 2.7 星。在 246 条评价中,有 113 人只给出了一星 —— 大部分投诉都拍照或 RFID 识别出问题有关。

随着时间 3 月 29 日的临近(过渡期间没有保证),不知道英国政府和申请人方面还会爆发出多少的矛盾。

[编译自:TNW]


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

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

大众新一代高尔夫无伪装实车首曝:下半年发布



据外媒报道,大众第八代高尔夫车型无伪装谍照日前曝光,新车预计今年6月在海外投产,第四季度在欧洲市场率先上市。从曝光的图片来看,新车与国内现款并没有过多颠覆性的新设计,但在细节上还是能发现它的变化,譬如与现款明显区别的前大灯造型,新车前大灯采用不规则多边形设计,相比现款更有设计感,且与此前外媒绘制的假想图重合。

新车前包围疑似采用了左右全贯穿式设计,上面的一根细镀铬饰条勾勒出了下部进气口的上沿,而两侧雾灯组的面积也比较可观。

车身方面,新车侧窗轮廓与现款基本一致,但腰线位置明显上移,由现款的门把手下方,改为贯穿前后门把手,并一直延伸至后翼子板中部。

动力上新车海外市场预计提供1.0T三缸、1.5T四缸等多种动力,国内现款则提供1.6L、1.2T和1.4T高功率三款发动机,GTI车型特别配备EA888 2.0T引擎。

(海外假想图)

(现款高尔夫)


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

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

估值一度达3亿美元 美特色菜外卖平台Munchery倒闭



北京时间1月22日消息,美国按需外卖创业公司、私厨特色菜预订平台Munchery周一在发给顾客的邮件中宣布,公司将停止运营,立即生效。

2C7DA29156EAAB062053F87C85F741CA20342F85_w1200_h628.jpg

Munchery创建于2010年,总部位于旧金山。研究机构PitchBook的数据显示,Munchery已经累计筹集了1.25亿美元风投资金,2015年完成8700万美元融资时的估值达到3亿美元。Munchery的投资者包括美国风投公司Greycroft、ACME Ventures、Menlo Ventures等。

“今天,我们怀着沉重的心情宣布,Munchery将关门停止运营,立即生效,”Munchery称,“所有未完成的订单将被取消和退款。”

“自2010年以来,我们一直致力于把新鲜、本地化、美味可口的菜肴带到你以及我们全国所有顾客的家中,”Munchery在一份邮件声明中称,“我们很高兴能够与世界一流的厨师共事,试验了多元化和独特的佐料和食谱,成为你们假日宴会和传统菜肴的一部分。我们也很享受通过膳食捐赠、志愿服务等措施回馈我们的社区。”

鉴于Munchery已于去年5月份关闭了西雅图、洛杉矶以及纽约的业务运营,裁员257人,占据员工总量的30%,Munchery倒闭的新闻也并不令人感到惊讶。当时,Munchery表示要加倍投资最大市场旧金山,该城市有助于公司“在近期实现盈利,建造长期、可持续业务”。

然而,Munchery未能兑现承诺。在2018年裁员后,Munchery曾努力克服按需外卖市场的挑战。为了存活下去,Munchery曾谋求转型,面向老客户推出了8.95美元的订阅服务,并在旧金山BART地铁站开设门店以吸引通勤人群。

Munchery只是最新一家倒闭的外卖创业公司。此前,饼干外卖公司Doughbies已在2018年关门。Sprig、Maple、Josephine等其他外卖公司也在激烈市场竞争压力下倒闭。(编译/箫雨)


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

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

魅族预告的“全球第一”揭晓:首款无开孔手机来了



今天上午,魅族突然秀肌肉,放出了“World‘s 1st_____”的刮刮乐,并预告“是时候展现真正的技术了,黑科技,明天见”。经图片调整亮度、对比度等处理,网友已经成功解谜,原来隐藏文字是“holeless phone(无孔手机)”,也就是说魅族要带来全球首款正面甚至机身无开孔的手机,将全面屏概念推向新高度。

目前,业内已经有前摄盲孔、屏幕发声、屏下指纹、多传感器合一等技术,实现正面零孔似乎并无障碍,当然,暂时还没有厂商真正做到。

此前,黄章通过与煤油多次互动,已经公布了16s、16s Plus、16T游戏手机、千元机Note 9等产品,看起来作为旗舰的16s系列首用该技术的可能性最高。不过,也不排除魅族仅仅展示方案,未来有机会再商用的可能。

在经历一系列架构调整、人员变动、产品策略重修后,2019年对魅族来说尤为关键,魅族到底会打磨出怎样的惊喜,拭目以待!


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

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

消费者版 Office 2019 在华上市 售价748元



微软中国今日宣布,面向消费者及小型企业的Office 2019正式上市,包括Office家庭和学生版2019及Office小型企业版2019。Office 2019在Office 2016的基础上进行了全面更新,是新一代PC端永久使用零售版。根据官网显示,Office家庭和学生版2019售价为748元,适用于1台WindowsPC或Mac。

访问购买入口:

Office 2019 家庭和学生版

Office 2019向消费者提供新的墨迹工具、数据类型、函数、翻译和编辑工具、支持3D模型、平滑切换等功能。、

微软表示,对于尚未准备好使用云服务的用户来说,基于Windows 10本地部署的Office 2019融入了部分Office 365的非云端功能,能够提供新功能和更新。

微软称,微软中国与包括戴尔、华硕、华为、惠普、联想、同方、小米等OEM伙伴长期合作,在消费类PC设备中预装Office家庭和学生版2019。

图片.png


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

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

日本便利店巨头7-11和罗森计划禁售成人杂志 全家表示没这打算



岛国风情代表之一的便利店黄书将成为过去了!日本最大的3家24小时便利连锁店其中的7-11和罗森昨日都宣布将禁售成人杂志,不过另一家巨头全家则发表声明表示不会跟风禁售,将继续维持现状。

·遍布日本大街小巷旮旯胡同各自拥有上万家连锁店的日本最大的3家24小时便利连锁店最大的特色除了超级便民外,各种最新版成人杂志也是一大特色,不过这种传统状况即将成为过去了。

·7-11和罗森都于21日宣布,旗下店铺将逐渐取缔成人杂志的销售,计划于今年8月份前完成全部店铺的禁售,而关于取缔成人杂志的理由,2家巨头官方表示为了日益增多的外国人顾客以及女性和高龄人士着想。

·就在业内人士把目光纷纷投向业界排名第二的全家时,然而全家则表态:“没有禁售成人杂志的计划”。目前全家在日本本土有着约16700家连锁店,出人意料的是已经有2000家不受总部的约束已经提前禁售了成人杂志。


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

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

裙子长短不影响被痴汉 最新岛国公共场所性骚扰调查报告出炉



日本一家专门研究性骚扰行为的机构《#WeToo Japan》发布了最新关于《骚扰的社会调查报告》,还在被岛国各种痴汉传说迷惑的小伙伴们一起来了解下真实的岛国现状吧。·首先这张图表显示的是曾经在电车或道路上曾经遭遇各种《骚扰》的人员比例,女性以70%的比例遥遥领先,值得注意的是这些《骚扰》不仅是性骚扰,还包括其他的各种不文明骚扰情况。


·重点来了,《骚扰》中最受关注的性骚扰比例,比较轻微的比如恶意接触身体比例女性居然有近一半都遭遇过,而恶性的露阴癖则有18.6%的女性曾经遇到过。当然男性也遇上过,不过比例较低。

·关于痴汉行为遇害的年龄层,不出意料的10岁~20岁区间的青春妹子们比例最高达到22.9%。

·下面则是更加细节的调查了,首先是在电车里呆的时间越久受害几率越高,这个比较正常。

·然后是喜欢穿超短裙的妹子们受害比例最高,不过那些比较低调的长裙女生受害比例却也不是最低的,达到了22.3%。看来裙子长短并不是被痴汉的首要因素哦。

·接下来是妹子们的穿着了,不论是学生制服和是水手装比例都居高不下,平常衣服比例更低,显然“制服控”的传说属实。

·最后就是所有国家遭遇性骚扰后的反应这个普遍性话题了,岛国妹子们同样有一半的比例左右选择“忍让”,20个人中只有1个妹子勇敢的选择了向周围人求助。


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

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

北京大兴国际机场完成第一飞 即将进入验收移交阶段



1月22日9时12分,位于北京首都机场地区的中国民航飞行校验中心停机位上,一架奖状680飞机申请放行:“北京放行上午好,校飞001,停机位校验坪,大兴新机场校验,请予放行。”无线电波里,传出管制员回答的声音:可以按计划去大兴校飞。9点28分,飞机起飞,目的地是北京大兴国际机场。大兴机场即将迎来第一架飞机。

(现场报道: 陈嘉佳 图片拍摄:李超、 焦晨、陆二佳)

10时10分,一架奖状680校验飞机平稳地降落在北京大兴国际机场西一跑道上,留下了第一道飞机轮胎印迹,这意味着大兴国际机场第一场校验任务圆满完成,标志着大兴国际机场工程建设即将进入验收移交阶段。


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

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

[观点]iPhone降价究竟慌了谁



“因为之前iPhone XR一直卖的就不是很好,所以我就没囤太多货,因此这轮降价影响倒是不太。不过那些之前囤货准备应对春节高峰的商家可能影响就会比较大了,估计亏的比较惨。”谈起这次各大电商平台苹果手机的降价促销活动,中关村一位经销商对懂懂笔记说道。

由于销量不及预期,苹果近两周在国内各大电商平台开始进行降价促销,部分型号的最大优惠力度达到了1500元。这样的降价幅度,对于年度新款iPhone而言从未出现过。而这一轮赶在春节假期之前的促销活动,不仅打乱了部分潜在消费者原本的购机计划,也对苹果线下销售渠道造成了很大影响。

消费者在观望,他们大多数会在确定价格触底之后再出手。经销商们则一边忙着清库存,一边也在观望,因为每一次渠道价格的调整都无时无刻触动着他们的神经。

X拿货价逆市上涨,XR成重灾区

这次官方授意的加价中,此前售价最贵的iPhone XS Max成为了优惠王。目前部分平台256G的iPhone XS Max降价幅度已经达到1500元。而线上的跳水王,在线下市场反倒开始备受追捧,相对便宜的iPhone XR反倒成为经销商们的心头大患。

有渠道商反映,按照苹果的原计划,相对便宜的iPhone XR将会是今年最走量的产品。但或许是果粉用户对于极致的追求,最贵的iPhone XS Max反倒成为了目前最受用户认可的型号。根据国外数据统计机构MixPanel的统计数据显示,截止2018年12月末,三款新iPhone中售价最高的iPhone XS Max市场份额最高,iPhone XS和iPhone XR的占比则相对持平。

这一现象,几乎和当年“廉价版”的iPhone 5C一样:低价的iPhone并没有很好地对整体产品销量起到支撑作用。

消费者对于iPhone XR的态度甚至不及上一代的iPhone X,部分消费者宁愿买上一代的iPhone X都不去选XR,这也导致iPhone X的市场行情一路上涨。对此,有中关村的苹果经销商对懂懂笔记表示:“之前iPhone X 256G的拿货价是7800到7900(元)左右,现在拿货价已经到了8600。”

至于iPhone XR,据部分经销商透露:“之前有一些商户囤了不少货,原本是想着趁春节之前这段黄金时间段进行销售,由于其他机型的降价相比XR要大一些,这也让本来就不好卖的XR更难卖了。这些囤货的商户多多少少会亏一些。”

不过,最令线下经销商着急的,不是这次官方渠道降价带来的损失,而是这次苹果官方一反常态的突然降价,很大程度上让那些潜在消费者变得更加谨慎了。或许不少消费者都在想,现在是不是最低价了?春节前买会不会亏?万一春节期间进一步降价了呢?

在华强北的几家大卖场里,懂懂笔记就遇到不少前来打探行情的消费者。在交流中,一位小伙子对懂懂笔记表示:“本来打算上周去买的,现在还是再等等吧,说不定过两天又会降一点儿,反正春节假期还有几天,说不定还会继续降一波。”

资本对于苹果的“促销”动作也都在紧密关注。美国投行Wedbush分析师丹尼尔·艾维斯1月14日在一份报告中表示,苹果手机在中国将会大幅降价。他强调:“我们预计在未来数月中,iPhone XR将会大幅降价。苹果在中国市场正面临‘红色警报’,为iPhone XR和未来型号的iPhone制定正确的价格策略,对于苹果而言至关重要。”

对于未来的不确定性,让本来相对稳健的iPhone市场变得有些吊诡。一边是忙着清货的经销商,一边是持币观望的消费者,本应该火爆的春节销售档期,现在已经变得供销不旺。

官方不降价,换新做主力

就在降价消息打乱第三方销售渠道节奏的同时,苹果的官方渠道依然保持着自己原本的节奏。

目前,以北京地区为例,苹果官方直营渠道,如官网和Apple store店面的产品价格不变,均维持原价。就降价的消息,懂懂笔记询问北京东城区某Apple store的销售人员时,对方表示,近期店里所有产品的价格不会有变动,还是跟官方零售价保持一致。

其实,这并不难理解。因为从降价消息传出,到线下分销渠道以及第三方电商平台开始大幅度降价至今,苹果官方从来没有正式“宣告”过降价促销的事宜。虽然有电商平台方面表示“降价”是苹果方面的授意,但苹果并未证实这一点。所以,苹果自己官方的销售渠道维持原价情有可原。

不过,第三方渠道的降价对于苹果官方的销售状况肯定会造成一定冲击。虽然从人流上来看,平日里的Apple store依然人山人海,但有店员表示,还是看一看逛一逛的人多。也就是说第三方平台降价,店里的人流量并没有受太多影响。而当懂懂笔记询问几家Apple store里体验产品的消费者时,大多数人都表示,面对1000多元的差价还是会首选京东、天猫等第三方电商平台。

当然,官方渠道并不是一点优惠政策都没有,只是着重点不同。

目前无论是苹果官网还是Apple store的店内,都把以旧换新的宣传海报放在了最显眼位置,帮助引导用户通过置换的方式来换购新iPhone。而且,就像此前懂懂笔记在《苹果的“倔强”促销》一文中所描述的,今年苹果官方的以旧换新活动,是历年以来力度最大的一次,而这种大力度的以旧换新活动,某种意义上就是一种促销手段。

1月初库克在美国接受媒体采访时就曾指出,“我们不会坐等宏观环境发生改变。”他强调苹果公司会更多依靠这一“计划”鼓励用户更频繁地升级自己的苹果手机。

不过,苹果官方在换购过程中给出的旧手机估值,往往要大幅低于市面上一般二手平台的交易价格。尽管官方换购的流程相对便捷也更有保障,但在不小的价差面前,很大一部分用户依然会选择将手机卖给商贩或者二手平台,然后再购买新的产品。

有分析人士指出:作为官方渠道,苹果依然要保持自己长久以来的高姿态。毕竟,刚刚发布几个月的新机就开始在官方降价,这是iPhone十几年以来从未出现过的情况。在保持格调的同时让第三方渠道大卖,不失为一种不损颜面的举措。毕竟单纯提振销量的话,第三方销售渠道降价促销已经能够起到有效作用了。

毕竟官方降价,会直接影响到下一代iPhone的定价,如果苹果接下来的新机还要继续“卖高价”,现阶段官方渠道就必须咬牙抗住。

结束语

已经12岁的iPhone面对不断崛起的挑战者们,似乎已经显得有些力不从心。随着整个市场的价格上涨,智能手机行业都在挖掘利益最大化。不过库克过于崇尚利润为先,导致iPhone价格的上涨势头显然要快于其他友商。在上万元的售价面前,iPhone似乎已经逐渐成为一件奢侈品。与此同时,苹果曾经自豪的创新力显然没有跟上其售价上涨的速度。

面对十几年来的首次营收预警,如今库克或许正站在苹果的历史转折点上,如何带领苹果继续走下去?如何让iPhone继续引领时代步伐?这一切只靠降价显然是无以为继的。


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

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

保时捷:纯电超跑Taycan需求强劲 计划产量已翻番



作为对特斯拉 Model S 的回应,保时捷在 2015 年底发布了自家的首款纯电超跑(原名 Mission E),并计划在今年晚些时候上市销售(正式名称 Taycan)。几周前,保时捷北美 CEO Klaus Zellmer 表示:“Taycan 已经吸引了不少特斯拉车主的浓厚兴趣”。有趣的是,2017 年的时候,Zellmer 还承认 Model S 对自家的销售产生了影响。

porsche-taycan.jpg

本月早些时候,Zellmer 表示:“通常我们会吸引来自奥迪、宝马、或梅赛德斯的消费者,但现在又吸引了特斯拉车主,这点是非常有趣的”。

Automobilwoche 的一份新报告称,由于可预见的强劲需求,保时捷目前已将原定的 2 万辆 Taycan 产能,翻番至 4 万辆。

有鉴于此,我们对 Taycan 推出后的表现(对特斯拉 Model S 销量的影响)充满了期待。

参数方面,Taycan 能够在 3.5 秒内完成 0-62 英里/小时(0-100 公里/小时)的加速,极速可超过 155 英里/小时(250 公里/小时)。

更重要的是,Taycan 拥有 310 英里(约 500 公里)的续航里程。配合保时捷的超级充电桩,可在 20 分钟内增加 250 英里(400 公里)的续航。

[编译自:BGR]


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

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

微软征集Windows 10 PC游戏体验改进建议



DX12、Game Mode(游戏模式)、对新硬件更好的驱动支持……这些变化有让你觉得Windows 10是最佳的PC游戏平台吗?显然,微软对自己所作的工作仍不满意。Xbox论坛上发起了团队邀请玩家就Win10平台游戏体验进行建言的活动,包括对已经提出的建议进行投票。

截止发稿,呼声最高的是,“在游戏运行时,Windows自动禁用所有无关进程”,另外一些热门点子还包括开发一套专门面向游戏用户的Win10 SKU、借助手柄可直接启动游戏(目前必须靠鼠标)、允许PC游戏在Xbox上串流。

值得一提的是,Steam发布与去年12月的软硬件统计显示,在这一全球最流行最知名的PC游戏分发平台,使用Win10 64bit操作系统的用户占比已经达到63%。


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

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

工业互联网或达万亿级规模 安全问题如何保障?



工业互联网无疑是这个寒冬中最热的产业经济话题。“BAT们”视之为“互联网的下半场”,正在竞相“+工业”“+制造业”而工业企业、制造业企业们也在积极“+互联网”,希望借助互联网的科技力量,为工业、制造业的发展配备上全新引擎,从而打造“新工业”。

industry-3087393_960_720.jpg

图片来自于 Pixabay

不难看出,工业互联网正面临着一个重要的高速发展期,预计至2020年将达万亿元规模。但与此同时,工业互联网所面临的安全问题日益凸现。在设备、控制、网络、平台、数据等工业互联网主要环节,仍然存在传统的安全防护技术不能适应当前的网络安全新形势、安全人才不足等诸多问题。

万亿级产业规模引发安全隐患

相关数据显示,2017年我国工业互联网直接产业规模约为5700亿元。在2017年到2019年期间,预计产业规模将以18%的年均增速增长,至2020年时将达到万亿元规模。世界各国正加速布局工业互联网,围绕工业互联网发展的国际竞争日趋激烈。

对此,国家信息中心副主任马忠玉曾表示:“一方面,加快工业互联网发展是制造业转型升级的必然要求;另一方面,工业互联网是构筑现代化经济体系的必然趋势。”

工业互联网是深化“互联网+先进制造业”的重要基石,也是发展数字经济的新动力。发展工业互联网,实现互联网与制造业深度融合,将催生更多新业态、新产业、新模式,创造更多新兴经济增长点。

马忠玉分析,伴随着工业互联网的发展,越来越多的工业控制系统及设备与互联网连接,网络空间边界和功能极大扩展,以及开放、互联、跨域的制造环境,使得工业互联网安全问题日益凸显。

一是网络攻击威胁向工业互联网领域渗透。近年来,工业控制系统漏洞呈快速增长趋势,相关数据显示,2017年新增信息安全漏洞4798个,其中工控系统新增漏洞数351个,相比2016年同期,新增数量几乎翻番,漏洞数量之大,使整个工业系统的生产网络面临巨大安全威胁。

二是新技术的运用带来新的安全威胁。大数据、云计算、人工智能、移动互联网等新一代信息技术本身存在一定的安全问题,导致工业互联网安全风险多样化。

三是工业互联网安全保障能力薄弱。目前,传统的安全保障技术不足以解决工业互联网的安全问题,同时,针对工业互联网的安全防护资金投入较少,相应安全管理制度缺乏,责任体系不明确等,难以为工业互联网安全提供有力支撑。

如何构建工业互联网安全体系?

那么,如何铸造工业互联网的安全基石,加快构建可信的工业互联网安全保障体系呢?工信部网络安全管理局副局长梁斌针对这一问题,也提出五点建议。

一是突破关键核心技术。要紧跟工业互联网最新发展趋势,努力引领前沿技术和颠覆性技术发展。二是推动工业互联网安全技术标准落地实施。全面推广技术合规性检测,促进工业互联网产业良性发展。三是完善监管和评测体系。四是切实推进工业互联网安全技术发展。加强全生命周期安全管理,构建覆盖系统建设各环节的安全防护体系。五是联合行业力量打造工业互联网安全生态。

此外,中国信通院院长刘多也提出建议,要从五个方面加强工业互联网的安全防护能力:顶层设计:出台系列文件,形成顶层设计;标准引导:构建工业互联网安全标准体系框架,推进重点领域安全标准的研制;技术保障:夯实基础,强化技术实力;系统布局:依托联盟,打造产业促进平台;产业应用:加强产业推进,推广安全最佳实践。

近年来,中国也陆续出台了《关于深化“互联网+先进制造业”发展工业互联网的指导意见》、《工业互联网发展行动计划(2018-2020年)》等文件,明确提出工业互联网安全工作内容,从制度建立、标准研制、安全防护、数据保护、手段建设、安全产业发展、人员培养等方面,要求建立涵盖设备安全、控制安全、网络安全、平台安全、数据安全的工业互联网多层次安全保障体系。

在国家政策以及业界的一致努力下,相信我国工业互联网在取得快速发展的同时在安全层面的保障也会更上一层楼。


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

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

忘掉Lite:谷歌开始花式下调Pixel 3和Pixel 3 XL的售价



尽管谷歌官方尚未发布 Pixel 3 Lite,但已经有 YouTube 用户发表了关于原型机的视频评论。那些只注重 Pixel 3 相机体验的朋友,应该不会被 Pixel 3 Lite 的较低配置给劝退 —— 其采用了中端处理器、仅提供 32GB 存储空间、外壳为塑料材质、辅以后置单摄像头。换言之,规格的降级,带来的是更加实惠的售价。

当然,Pixel 3 Lite 的处理器,是它最大的短板。毕竟标准款搭载了高通骁龙 845(与 OnePlus 6 / 6T 和 Galaxy S9 等竞品相同)。

软件更新方面,作为谷歌的亲儿子,我们倒是并不担心。因为在 2021 年之前,官方都会保证 Pixel 3 能第一时间用上新版 Android 。

谷歌目前正以 649 / 749 美元的价格销售 Pixel 3 和 Pixel 3 XL 。尽管比首发时的 799 / 899 美元低了 $150,但整体还是偏高。

当然,如果你愿意用一台状态良好的旧手机来换购,那谷歌将为您提供最高 400 美元的折扣。

此外,Verizon 网站上推出了买一送一的促销活动(其中包括 Pixel 3),不过该优惠将在周一结束。

至于 Pixel 3 Lite,我们暂不知它确切的售价和上市时间。许多人猜测,该机有望在谷歌开发者大会(I/O 2019)后不久上市,意味着我们需要再耐心等待数月。

[编译自:BGR]


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

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

[图]Android Q将为有锁手机提供更精细控制:可限制SIM副卡功能



上周深入挖掘的Android Q代码中,我们看到了系统级黑暗主题、更精细的权限控制等诸多内容。不过并非所有新功能都会让用户感到兴奋,部分新功能甚至可能会让用户生气。援引外媒9to5Google报道,通过Android的Gerritt源代码显示了四个标记为“适用于Android Q的运营商限制增强”的commit,似乎为运营商对SIM锁定智能手机提供更精细的控制。

图片来自于 9to5Google

根据提交的commit显示,其中一项增强型限制允许运营商锁定双卡手机的第二个SIM卡托盘。对于希望更严苛控制设备的运营商来说,这项功能的杀伤力是非常大的。例如,运营商可以创建规则,想要启用第二个托盘的SIM卡,那么主卡必须要使用来自该运营商尚处于激活状态的SIM卡。

而更具杀伤力的结果就是,运营商可以更加具体的了解手机支持或者不支持哪些其他运营商。实质上就是在手机上创建黑名单/白名单,这对于运营商来说是非常有利的,可以阻止运行在相同网络的MVNO。例如,一款AT&T有锁智能手机目前可以使用电信运营商

Cricket的SIM卡,而Cricket同样隶属于AT&T并使用相同信号基站。升级至Android Q之后,AT&T可以阻止有锁手机使用Cricket的网络。

虽然目前Android Q的最终代码并未公布,也不确定这些commit是否能够稳定发布,但相信在2019年之后会有更多消费者选择无锁版本。


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

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

jdk1.5-1.10新特性



从网上搜集摘录的jdk特性,在这里记录下来以便自我学习.

jdk5新特性
    1、自动装箱和拆箱
    2、枚举
    3、静态导入
    4、可变参数
    5、內省
       是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性那么,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter,setter方法,通过这些API可以使你不需要了解这个规则,这些API存放于包java.beans中。
       一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来调用这些方法。
    6、泛型
    7、For-Each循环

jdk6新特性
    1、Desktop类和SystemTray类
       AWT新增加了两个雷:Desktop,SystemTray。
       Desktop可以用来打开系统默认浏览器指定的URL,打开系统默认邮件客户端给指定的邮件账号发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开txt文件),用系统默认的打印机打印文档
       SystemTray可以用来在系统托盘区创建一个托盘程序
    2、使用JAXB2来实现对象与XML之间的映射
       也就是对象与XML之间的映射(OXM),也可以通过XMLBeans和Castor等来实现同样的功能。
    3、StAX
       StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让 程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件 然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符; 
                SAX也是基于事件处理xml文档,但却 是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM 采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
    4、使用Compiler API
                使用JDK6的Compiler API去动态的编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码。
    5、轻量级Http Server API
    6、插入式注解处理API
    7、用Console开发控制台程序
    8、对脚本语言的支持如:ruby,groovy,javascript
    9、Common Annotations

jdk7新特性
    1、switch中可以使用字符串
    2、泛型的自动判断
    3、自定义自动关闭类(实现AutoCloseable接口)
    4、新增一些取环境信息的工具方法(System中的方法)
    5、Boolean类型反转,空指针安全,参数与位运算
    6、两个char间的equals
    7、安全的加减乘除

    1、对Java集合(Collections)的增强支持
       List<String> list=[“item”]; //向List集合中添加元素
       String item=list[0]; //从List集合中获取元素
       Set<String> set={“item”}; //向Set集合对象中添加元
       Map<String,Integer> map={“key”:1}; //向Map集合中添加对象
       int value=map[“key”]; //从Map集合中获取对象
       但是经过自己测试,按照上面的使用方法,并不能创建集合。
    2、int支持二进制数据
    3、在try catch异常捕捉中,一个catch可以写多个异常类型
    Connection conn = null;
    try {
        Class.forName(“com.mysql.jdbc.Driver”);
        conn = DriverManager.getConnection(“”,””,””);
    } catch(ClassNotFoundException|SQLException ex) {
        ex.printStackTrace();
    }
    4、try catch中资源定义好之后try catch自动关闭
    try (BufferedReader in  = new BufferedReader(new FileReader(“in.txt”));
         BufferedWriter out = new BufferedWriter(new FileWriter(“out.txt”))) {
    int charRead;
    while ((charRead = in.read()) != -1) {
            System.out.printf(“%c “, (char)charRead);
            out.write(charRead);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
jdk8新特性
    1、接口的默认方法
    Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示例如下:
    public interface Formula {
        double calculate(int a);
        default double sqrt(int a) {
    return Math.sqrt(a);
        }
    }
    Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。
        Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
    return sqrt(a * 100);
            }
        };
        System.out.println(formula.calculate(100));  // 100.0
        System.out.println(formula.sqrt(16));  // 4.0
    文中的formula被实现为一个匿名类的实例,该代码非常
    2、Lambda表达式
    List<String> names = Arrays.asList(“tom”,”jace”,”mike”);
    Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
    return o2.compareTo(o1);
        }
    });
    只需要给静态方法Collections.sort传入一个List对象以及一个比较器来指定顺序排列。通常做法都是创建一个匿名的比较器对象,然后将其传递给sort方法。
    在Java 8中提供了更简洁的语法,lambda表达式:
    Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
    });
    还可以更简洁:
    Collections.sort(names, (String a, String b) -> b.compareTo(a));
    去掉大括号以及return关键字
    Collections.sort(names, (a,b) -> b.compareTo(a));
    Java编译器可以自动推导出参数类型,所以可以不用再写一次类型。
    3、函数式接口
    Lambda表达式是如何在java的类型系统中表示的呢?
    每一个lambda表达式都对应着一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以也可以给自己的函数式接口添加默认方法。
    我们可以将lambda表达式当做一个抽象方法的接口类型,确保自己的接口一定达到这个要求,你只需要给你的接口添加@FunctionalInterface注解,编译器如果发现标注了这个注解的接口有多于一个抽象方法的时候就会报错。也就是说@ FunctionalInterface注解标注的接口只能有一个抽象方法。
    例如:
    @FunctionalInterface
    public interface Converter<F, T> {
    T convert(F from);
    }
    Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
    Integer converted = converter.convert(“123”);
    System.out.println(converted);
    以上代码不需要@FunctionalInterface注解也是正确的。
    4、方法与构造函数引用
    上面的代码也可以通过静态方法引用来表示:
    Converter<String, Integer> converter = Integer::valueOf;
    Integer converted = converter.convert(“123”);
    System.out.println(converted);
    Java8允许使用::关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:
    public class Person {
        String firstName;
        String lastName;
        Person() {
        }
    public Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
        }
    }
    指定一个用来创建Person对象的对象工厂接口:
    public interface PersonFactory<P extends Person> {
    P create(String fisrtName, String lastName);
    }
    创建Person对象
    PersonFactory<Person> personFactory = Person::new;
    Person person = personFactory.create(“Peter”,”Parker”);
    我们只需要使用Person::new 来获取Person类构造函数的引用,Java编译器就会自动根据PersonFactory.create方法的签名来选择合适的构造函数。
    5、Lambda作用域
    在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
    6、访问局部变量
    我们可以直接在lambda表达式中访问外层的局部变量
    final int num = 1;
    Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);
    stringConverter.convert(2);
    但是和匿名对象不同的是,这里的变量num可以不用声明为final,该代码同样正确。
    7、访问对象字段与静态变量
    和本地不良不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的:
    static int outerStaticNum;
    int outerNum;
    public void testScopes() {
        Converter stringConverter1 = (from) -> {
            outerNum = 23;
            return String.valueOf(from);
        };
        Converter stringConverter2 = (from) -> {
            outerStaticNum = 72;
            return String.valueOf(from);
        };
    }
    8、访问接口的默认方法
    9、Date API
    10、Annotation注解
    11.HashMap
    HashMap中的红黑树:HashMap中链长度大于8时采取红黑树的结构存储。红黑树,除了添加的情况外,其他时候效率高于链表结构。
    ConcurrentHashMap:底层采用node数组+链表+红黑树的存储结构,通过CAS算法(乐观锁机制)+synchronized来保证并发安全的实现。
    put()方法过程:
    1) 根据key的hash值数组中相应位置的Node还未初始化,则通过CAS插入相应的数据;
    2) 如果相应位置的Node不为空,且当前该节点不处于移动状态,则对该节点加synchronized锁,如果该节点的hash不小于0,则遍历链表更新节点或插入新节点;
    3) 如果该节点是TreeBin类型的节点,说明是红黑树结构,则通过putTreeVal方法往红黑树中插入节点;
    
jdk1.9新特性
    1. Java 平台级模块系统
    Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的 API。此外,类路径本身也存在问题: 你怎么知晓所有需要的 JAR 都已经有了, 或者是不是会有重复的项呢? 模块系统把这俩个问题都给解决了。

    模块化的 JAR 文件都包含一个额外的模块描述器。在这个模块描述器中, 对其它模块的依赖是通过 “requires” 来表示的。另外, “exports” 语句控制着哪些包是可以被其它模块访问到的。所有不被导出的包默认都封装在模块的里面。如下是一个模块描述器的示例,存在于 “module-info.java” 文件中:

    module blog {
      exports com.pluralsight.blog;
     
      requires cms;
    }
    我们可以如下展示模块:

    请注意,两个模块都包含封装的包,因为它们没有被导出(使用橙色盾牌可视化)。 没有人会偶然地使用来自这些包中的类。Java 平台本身也使用自己的模块系统进行了模块化。通过封装 JDK 的内部类,平台更安全,持续改进也更容易。

    当启动一个模块化应用时, JVM 会验证是否所有的模块都能使用,这基于 `requires` 语句——比脆弱的类路径迈进了一大步。模块允许你更好地强制结构化封装你的应用并明确依赖。你可以在这个课程中学习更多关于 Java 9 中模块工作的信息 。

    2. Linking
    当你使用具有显式依赖关系的模块和模块化的 JDK 时,新的可能性出现了。你的应用程序模块现在将声明其对其他应用程序模块的依赖以及对其所使用的 JDK 模块的依赖。为什么不使用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢? 这可以通过 Java 9 中的新的 jlink 工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载 JDK 安装版本。

    3. JShell : 交互式 Java REPL
    许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell ,并直接启动输入和执行 Java 代码。 jshell 的即时反馈使它成为探索 API 和尝试语言特性的好工具。

    测试一个 Java 正则表达式是一个很好的说明 jshell 如何使您的生活更轻松的例子。 交互式 shell 还可以提供良好的教学环境以及提高生产力,您可以在此了解更多信息。在教人们如何编写 Java 的过程中,不再需要解释 “public static void main(String [] args)” 这句废话。

    4. 改进的 Javadoc
    有时一些小事情可以带来很大的不同。你是否就像我一样在一直使用 Google 来查找正确的 Javadoc 页面呢? 这不再需要了。Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。此外,你会注意到,每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。

    5. 集合工厂方法
    通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:

    Set<Integer> ints = Set.of(1, 2, 3);
    List<String> strings = List.of(“first”, “second”);
    除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。

    6. 改进的 Stream API
    长期以来,Stream API 都是 Java 标准库最好的改进之一。通过这套 API 可以在集合上建立用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:

    IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
    第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。

    除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(可能是空的) Stream 对象:

    Stream<Integer> s = Optional.of(1).stream();
    在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 非常有用。

    7. 私有接口方法
    Java 8 为我们带来了接口的默认方法。 接口现在也可以包含行为,而不仅仅是方法签名。 但是,如果在接口上有几个默认方法,代码几乎相同,会发生什么情况? 通常,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法会成为公共API的一部分。 使用 Java 9,您可以向接口添加私有辅助方法来解决此问题:

    public interface MyInterface {
     
        void normalInterfaceMethod();
     
        default void interfaceMethodWithDefault() {  init(); }
     
        default void anotherDefaultMethod() { init(); }
     
        // This method is not part of the public API exposed by MyInterface
        private void init() { System.out.println(“Initializing”); }
    }
    如果您使用默认方法开发 API ,那么私有接口方法可能有助于构建其实现。

    8. HTTP/2
    Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你可以在 Java 9 中开始使用这套 API:

    HttpClient client = HttpClient.newHttpClient();
     
    HttpRequest req =
       HttpRequest.newBuilder(URI.create(“http://www.google.com”))
                  .header(“User-Agent”,”Java”)
                  .GET()
                  .build();
     
     
    HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
    HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
    除了这个简单的请求/响应模型之外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,比如流和服务端推送。

    9. 多版本兼容 JAR
    我们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:

    multirelease.jar
    ├── META-INF
    │   └── versions
    │       └── 9
    │           └── multirelease
    │               └── Helper.class
    ├── multirelease
        ├── Helper.class
        └── Main.class
    在上述场景中, multirelease.jar 可以在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,可以运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,因为较老版本的 Java 只会看到顶层的这个 Helper 类。

jdk1.10新特性
    1.局部变量类型推断:局部变量类型推断将引入”var”关键字,也就是你可以随意定义变量而不必指定变量的类型.
    原本需要这样:  
    List <String> list = new ArrayList <String>(); 
    Stream <String> stream = getStream();
     
    现在你可以这样:
     
    var list = new ArrayList <String>(); 
    var stream = getStream();
     
    说到类型推断,从JDK 5引进泛型,到JDK 7的”<>”操作符允许不绑定类型而初始化List,再到JDK 8的Lambda表达式,再到现在JDK 10的局部变量类型推断,Java类型推断正大刀阔斧的向前发展。
    2.GC改进和内存管理

    JDK 10中有2个JEP专门用于改进当前的垃圾收集元素。
     
    第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不同垃圾收集器的源代码隔离。
     
    预定用于Java 10的第二个JEP是针对G1的并行完全GC(JEP 307),其重点在于通过完全GC并行来改善G1最坏情况的等待时间。G1是Java 9中的默认GC,并且此JEP的目标是使G1平行。
    3.线程本地握手(JEP 312)

    JDK 10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。
    4.备用内存设备上的堆分配(JEP 316)

    允许HotSpot VM在备用内存设备上分配Java对象堆内存,该内存设备将由用户指定。
    5.其他Unicode语言 – 标记扩展(JEP 314)

    目标是增强java.util.Locale及其相关的API,以便实现语言标记语法的其他Unicode扩展(BCP 47)。
    6.基于Java的实验性JIT编译器

    Oracle希望将其Java JIT编译器Graal用作Linux / x64平台上的实验性JIT编译器。
    7.根证书(JEP 319)

    这个的目标是在Oracle的Java SE中开源根证书。
    8.根证书颁发认证(CA)

    这将使OpenJDK对开发人员更具吸引力,它还旨在减少OpenJDK和Oracle JDK构建之间的差异。
    9.将JDK生态整合单个存储库(JEP 296)

    此JEP的主要目标是执行一些内存管理,并将JDK生态的众多存储库组合到一个存储库中。
    10.删除工具javah(JEP 313)

    从JDK中移除了javah工具,这个很简单并且很重要。


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

原文地址:https://www.cnblogs.com/chaoqun/p/10302624.html

java项目升级spring4.3.x 、jdk1.8 、tomcat8.5遇到的坑及解决方案



在将spring3.x 升级为4.3.x,jdk1.7 tomcat7升级到jdk1.8、tomcat8.5过程中,碰到了很多问题,也学习到了很多东西,现将这些问题分享出来,方便大家后续遇到同样问题时快速定位处理。

1、tomcat8.5不可在类似.test.com域名下写cookie

之前代码类似如下:

Cookie cookie = new Cookie("__admin__" ,"");
cookie.setDomain(".baidu.com");
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);

这样写在tomcat8.0上是没问题的,但是把它放到tomcat8.5上就报错了,tomcat启动报错信息如下:java.lang.IllegalArgumentException: An invalid domain [.baidu.com] was specified for this cookie
网上查阅资料,问题根源在于tomcat8.5本身的规则限制:
问题解决及原因分析帖子地址如下:
https://blog.csdn.net/cml_blog/article/details/52135115
https://blog.csdn.net/cml_blog/article/details/52135397

2、jackson-all包

之前项目用到了jackson-all的jar包,maven依赖如下:

<dependency>
     <groupId>jackson-all</groupId>
     <artifactId>jackson-all</artifactId>
     <version>2.0.1</version>
</dependency>

在springmvc4.x以上版本中会出现兼容问题,需升级jackson版本 2.7以上,且Jackson 2.x版提供了三个JAR包供下载:

  1. Core库:streaming parser/generator,即流式的解析器和生成器。
    下载:
    http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.1.0/jackson-core-2.1.0.jar

  2. Annotations库:databinding annotations,即带注释的数据绑定包。
    下载:
    http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.1.0/jackson-annotations-2.1.0.jar

  3. Databind库:ObjectMapper, Json Tree Model,即对象映射器,JSON树模型。
    下载:
    http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.1.0/jackson-databind-2.1.0.jar

从Jackson 2.0起,
核心组件包括:jackson-annotations、jackson-core、jackson-databind。
数据格式模块包括:Smile、CSV、XML、YAML。

替换maven依赖如下:

<jackson.version>2.8.11</jackson.version>

 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
  </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
  </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${jackson.version}</version>
  </dependency>

3、.html请求返回application/json数据报406问题

之前代码存在.html结尾请求json数据的代码,升级之后报406 error,代码如下:

    @ResponseBody
    @RequestMapping(value = "/test/captcha.html", produces = "application/json;charset=UTF-8")
    public String captcha(String callback) {
        logger.warn("/test/captcha.html 验证码 ");
    .....

我的解决方案是将produces = “application/json;charset=UTF-8″后面注解去掉,然后在spring-mvc.xml中添加一下代码如下:

<mvc:annotation-driven>
        <mvc:message-converters>
            <bean id="mappingJacksonHttpMessageConverter"
                  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

网上参考解决方案参考:https://www.jianshu.com/p/eea6e2551749

4、tomcat 请求出现RFC 7230 and RFC3986的错误

在一些get请求中,带有{}的请求报400 error,tomcat控制台出现了RFC 7230 and RFC3986错误,网上查阅资料,发现是tomcat8.5对于一些特殊字符有限制,这个问题是高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我们的系统在通过地址传参时,在url中传了一段json,传入的参数中有”{“不在RFC3986中的保留字段中,所以会报这个错。

解决方案有两种:

  1. 修改get请求,将path中的特殊字符进行转码后再传到后台 encodeURIComponent()
  2. 修改tomcat中的配置…/conf/catalina.properties,找到最后注释掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=|  ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行

参考解决方案:https://blog.csdn.net/weixin_41986096/article/details/82785118


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

原文地址:https://www.cnblogs.com/aixw/p/10302559.html

Connection 对象简介 方法解读 JDBC简介(四)



通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接
    Connection conn = DriverManager.getConnection(url, user, password);

看得出来,
在JDBC中连接被抽象为Connection
表示:与特定数据库的连接(会话)
在连接上下文中执行 SQL 语句并返回结果
image_5c46846f_5994

方法梗概

对于应用程序开发者来说,连接Connection主要用于执行对象的获取从而进一步执行SQL,这是
应用程序与数据库交互的主要途径
然后提供了数据库事务相关信息的设置以及其他信息的设置与获取

image_5c46846f_4ffd

执行对象

用于将 SQL 语句发送到数据库中
对象有三种
Statement
* 作用:用于执行不带参数的简单 SQL 语句
* 特点:
每次执行 SQL 语句,数据库都要执行 SQL 语句的编译,仅执行一次查询并返回结果的情形建议使用这个,此时效率高于 PreparedStatement 

PreparedStatement
* 作用:用于执行带 或 不带参数的预编译 SQL 语句
* 特点:是
预编译的, 在执行可变参数的一条 SQL 语句时,比 Statement 的效率高,安全性好,有效防止 SQL 注入等问题,对于多次重复执行的语句,效率会更高
CallableStatement
* 作用:用于执行对数据库
存储过程 的调用

事务

Connection提供了对于事务相关操作的支持
事务有自动提交的特性可以设置,自动提交默认每条SQL将会单独一个事务,Connection提供了自动提交属性的查询方法
如果不是自动提交,那么将会延续到手动COMMIT或者ROLLBACK
还能够设置和获取事务的隔离性
另外还可以灵活的设置保存点,从而让一个事务分割成几部分,可以部分提交

连接属性

连接本身有一些属性信息,比如目录等
其中最重要的就是Connection的关闭,数据库的连接是有限的,Connection在使用完毕后需要进行关闭
另外还提供了连接状态的测试方法

小结

Connection最为基础的方法就是执行对象的创建以及事务相关以及连接属性相关的 
其他方法属于对于数据库本身能力的API支持。

重点方法简介

执行对象

静态执行对象创建createStatement
Statement createStatement()
          创建一个 Statement 对象来将 SQL 语句发送到数据库。
Statement createStatement(int resultSetType, int resultSetConcurrency)
          创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
 

createStatement的核心是为了创建Statement,不带参数的 SQL 语句通常使用 Statement 对象执行;
如果多次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。
三个版本的createStatement核心是一样的,
区别在于参数的设置,参数的设置是针对于结果集的
空参数的createStatement返回的Statement 对象,创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别
已创建结果集的可保存性可调用
getHoldability() 确定
 

resultSetType – 以下 ResultSet 常量之一:
ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
 
resultSetConcurrency – 以下 ResultSet 常量之一:
ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
 
resultSetHoldability – 以下 ResultSet 常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 

简言之,createStatement系列用于创建Statement–通常用来执行不带参数的SQL,并且附带的可以设置结果集的类型、并发性、可保存性
 
动态执行对象创建prepareStatement
PreparedStatement prepareStatement(String sql)
          创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
          创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
          创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
PreparedStatement prepareStatement(String sql, String[] columnNames)
          创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。 

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
          创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          创建一个 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。
 
 

prepareStatement系列方法创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
 
1. prepareStatement(String sql) 最为基础的创建方法
带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在 PreparedStatement 对象中。然后
可以有效地使用此对象来多次执行该语句
结果集属性在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。
已创建结果集的可保存性可调用
getHoldability() 确定。
image_5c46846f_41a9
2. 返回键值数据
prepareStatement(String sql, int autoGeneratedKeys)
创建一个默认 PreparedStatement 对象,
该对象能获取自动生成的键
autoGeneratedKeys – 指示是否应该返回自动生成的键的标志,它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一
通过设置Statement.RETURN_GENERATED_KEYS要求返回主键
通过getGeneratedKeys方法,获取结果集,进而可以获取主键
此处插入一条记录,所以主键返回必然只有一个,当试图获取不存在的下标时,将会抛出异常,如下面所示,读取rs.getInt(2);时就报错了

image_5c468470_351b
另外还可以使用int数组指定列下标,或者String数组指定列名,指明用于返回的键
prepareStatement(String sql, int[] columnIndexes)
prepareStatement(String sql, String[] columnNames)
注意:
这几个方法并不是说所有的数据库都支持都一样,比如对于MYSQL来说,都是一回事
image_5c468470_6bce
 
通过测试代码我们也可以看得出来,随便设置的数组,也都无所谓,因为mysql压根就没关注数组的内容(上面的代码为mysql的实现)
image_5c468470_154d
 
类似createStatement 也有可以设置结果集类型、并发性、可保存性的方法
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
 

resultSetType – 以下 ResultSet 常量之一:
ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE
 
resultSetConcurrency – 以下 ResultSet 常量之一:
ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE
 
resultSetHoldability – 以下 ResultSet 常量之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 

 

默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。
已创建结果集的可保存性可调用
getHoldability() 确定。
这一点还是那样子,如果没设置的,存在默认值
 
存储过程执行对象创建CallableStatement
CallableStatement prepareCall(String sql)
          创建一个 CallableStatement 对象来调用数据库存储过程。
 
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
          创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
 
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          创建一个 CallableStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。 

 
核心为创建存储过程的执行对象,另外与createStatement和prepareStatement方法类似,可以设置结果集的类型、并发性、可保存性。

事务

支持事务的数据库一般都有自动提交,提交、回滚、保存点、事务隔离级别这几个基本属性。
Connection中提供了对他们的支持。
 
boolean getAutoCommit()
          获取此 Connection 对象的当前自动提交模式。 
 

void commit()
          使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。
 
void rollback()
          取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。
 
void rollback(Savepoint savepoint)
          取消所有设置给定 Savepoint 对象之后进行的更改。
 
void setAutoCommit(boolean autoCommit)
          将此连接的自动提交模式设置为给定状态。          
 
void setTransactionIsolation(int level)
          试图将此 Connection 对象的事务隔离级别更改为给定的级别。
 
int getTransactionIsolation()
          获取此 Connection 对象的当前事务隔离级别。
 
Savepoint setSavepoint()
          在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。
 
Savepoint setSavepoint(String name)
          在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象。  
 
void releaseSavepoint(Savepoint savepoint)
          从当前事务中移除指定的 Savepoint 和后续 Savepoint 对象。

 

连接自身属性状态

Connection最重要的一个状态就是打开与关闭,通过getConnection方法如果连接成功,那么该连接被打开
在使用结束之后你需要手动进行关闭
void close()
          立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。

JDBC还提供了查询方法用于检测该连接是否已经被关闭。
boolean isClosed()
          查询此 Connection 对象是否已经被关闭。
 
另外还有检测连接是否有效的方法
boolean isValid(int timeout)
          如果连接尚未关闭并且仍然有效,则返回 true。   

总结

Connection主要用于创建SQL的执行对象,而连接通过驱动管理器DriverManager的getConnection方法进行获取。
Connection并不是所有的方法都如API描述的一模一样,要看具体的驱动程序的支持情况
比如前面提到的MYSQL对于prepareStatement(String sql, String[] columnNames)和prepareStatement(String sql, int[] columnIndexes)的情况
通过连接对执行对象的创建,决定了很多事情
比如执行语句的特质,是用来执行静态SQL还是预编译带参数的动态的SQL还是存储过程?
也可以对结果集的参数进行设置
事务的相关处理也是在连接中操作的。
通过连接还能够获得数据库的元数据信息
我们所有的查询都是在一个数据库连接中进行的,所以此次操作所需要的东西,比如sql设置、结果集属性设置再或者数据库相关的元数据信息等都可以通过Connection获得。
 


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

原文地址:https://www.cnblogs.com/noteless/p/10302526.html

java 集合stream操作



分组

Map<Integer, List<T>> group = List.stream().collect(Collectors.groupingBy(T::getField));

排序

// 升序
List<T> list = List.stream().sorted(Comparator.comparing(T::getSize)).collect(Collectors.toList());
// 倒序
List<T> list = List.stream().sorted(Comparator.comparing(T::getSize).reversed()).collect(Collectors.toList());

条件查询

//    非boolean
ListUtil.where(List, x -> "LL".equals("LL"));
//    boolean
ListUtil.where(List, T::isLL);

封装


import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ListUtil {
    /**
     * 判断集合是否有值
     *
     * @param list
     * @return
     */
    public static <TOrigin> boolean isAny(List<TOrigin> list) {
        return list != null && list.size() > 0;
    }

    /**
     * 判断map是否有值
     *
     * @param map
     * @return
     */
    public static <Key, Value> boolean isAny(Map<Key, Value> map) {
        return map != null && map.size() > 0;
    }

    /**
     * 获取范围集合行
     *
     * @param list 集合
     * @param skip 跳过多少行:pagesiz*pageindex
     * @param take 获取多少行:pagesize
     */
    public static <TOrigin> ArrayList<TOrigin> getRange(List<TOrigin> list, Integer skip, Integer take) {
        ArrayList<TOrigin> itemList = new ArrayList<>();
        if (skip < list.size()) {
            Integer max = skip + take;
            if (max > list.size()) {
                max = list.size();
            }
            for (Integer i = skip; i < max; i++) {
                itemList.add(list.get(i));
            }
        }
        return itemList;
    }

    /**
     * 扩展where方法
     *
     * @param source 数据源
     * @param predicate 表达式
     */
    public static <TOrigin> List<TOrigin> where(List<TOrigin> source, Predicate<? super TOrigin> predicate) {
        //  判断当前关键字缓存是否已存在
        Stream<TOrigin> stream = source.stream().filter(predicate);
        //将Stream转化为List
        List<TOrigin> list = stream.collect(Collectors.toList());
        return list;
    }

    /**
     * 扩展 去重 方法
     *
     * @param source 数据源
     */
    public static <TOrigin> List<TOrigin> distinct(List<TOrigin> source) {
        Set set = new  HashSet();
        List newList = new  ArrayList();
        set.addAll(source);
        newList.addAll(set);
        return newList;
    }

    /**
     * 获取最小值
     * @param sourceList 数据源集合
     * @param keyExtractor 需要获取最小值的属性
     * */
    public static <TOrigin, TAttribute extends Comparable<? super TAttribute>> TOrigin min(List<TOrigin> sourceList, Function<? super TOrigin, ? extends TAttribute> keyExtractor)
    {
        return sourceList.stream().min(Comparator.comparing(keyExtractor)).get();
    }
}

View Code

 


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

原文地址:https://www.cnblogs.com/Cailf/p/10302527.html

三大运营商2018年运营数据:中国移动“配齐”三个第一



2018年已经过去了,这一年,是通信界辛苦劳作的一年。提速降费、混改、建设5G……忙的不亦乐乎。有付出就有回报,三大运营商全年的运营数据也已经悉数出炉了,来看看它们的表现如何。

先从移动说起,刚刚过去的2018年,对于中国移动来说无疑是载入史册的一年,固网宽带正式封王,配齐了行业中移动用户、4G用户和宽带用户三个第一。中国电信稳中有进,虽然在宽带市场上落人一步,但是移动用户突破了3亿大关,离中国联通仅一步之遥;4G用户更是每月平均五百多万净增量的好成绩。一直忙于混改的中国联通在2018年上半年凭借着各类“王卡”,实现了4G业务的大翻身,但是在宽带业务上有点小遗憾。

12月份完美收官

作为2018年的最后一个月,三大运营商都是卯足了劲“冲业绩”。

根据数据显示,12月,中国移动的移动用户净增客户296万,总数达到9.25069亿户;中国电信12月份净增移动用户322万户,累计达3.03亿户;中国联通12月移动用户净增数约203.4万户,累计到达数约3.15亿户。三家运营商最后一个月移动用户的增量均比11月份有所上升。

就4G用户而言,对比11月也是略有增长。中国移动12月份4G用户净增814.9万,总数达到7.1265亿户;中国电信12月份4G用户净增463万户,累计用户数达2.4243亿户。中国联通12月4G用户净增数253万户,累计到达数约2.2亿户。中国移动的净增数量比中国电信和中国联通加起来还多九十余万户。

相比移动业务和4G业务的完美落幕,三大运营商的宽带业务略显惨淡。三家的净增用户都出现了不同程度的降幅。12月份,中国移动有线客户净增客户数242万户,总数达到1.5669亿户。中国电信12月份有线宽带用户净增55万户,累计1.4579亿户。中国联通固网宽带用户出现了负增长,12月份净减22.1万户,累计到达数8088万户。

总体来看,在12月份,三大运营商都取得了不错的成绩,为2018年画上了一个完满的句号。

4G市场龙争虎斗

2018年,三大运营商在4G市场上可谓是“龙争虎斗”,如果说“龙”是中国移动,那么这个“虎”就是中国联通。

就上半年而言,中国联通4G业务的发展势头可以说异常猛烈。凭借着各路互联网卡的加持,中国联通的势头一度赶超中国移动。据统计,仅仅腾讯王卡的产品为联通和腾讯带来新增用户超8000万户。然而这个局面在5月份之后还是急转直下,这一境况到2018年最后一个月也仍未好转,据C114统计中国联通4G用户平均每月仅净增375.6万户,居三家运营商之末。

业内人士表示,连续下滑的数据无疑给中国联通敲响了警钟,曾经引以为傲的王卡效应正在褪去,中国联通是时候寻找打开用户增长的另一扇大门了。

数据显示,2018年,中国移动4G用户平均每月净增526.2万户,稳居第一。中国移动董事长尚冰曾在2018MWC上表示,要加快推动4G网络演进和TDD/FDD融合发展,力争实现2018年TD-LTE用户突破7亿户。而早在10月份的时候中国移动的4G用户就达到了7.00369亿户,到2018年收尾达到了7.1265亿户,超额完成了年度目标。

对于中国电信来说,在4G业务上面对的是中国移动和中国联通两座大山,但是中国电信一直坚定的把质量放在第一位,虽然也推出了“不限流量”套餐,但是并没有一味地追求低资费,大流量套餐也并非价格战产品,中国电信认为,套餐一方面可满足社会需要、推动信息消费,另一方面是回应国家的提速降费政策,强调大流量套餐能释放价格弹性并带动增长属于好事。这样的策略也让中国电信的4G业务稳中有进,中国电信4G用户平均每月净增数量为503.2万户,全年保持在较好的水平线上。

在人口红利日益消退的境况下,三大运营商能取得这样的成绩实属不易,值得鼓励。

宽带市场改朝换代

2018年宽带市场彻底改朝换代。从9月份开始超过中国电信之后,中国移动可以说是一路“开挂”,在宽带市场站稳了脚跟。最新数据显示,中国移动的宽带用户累计为1.5669亿户;中国电信的宽带用户累计为1.4579亿户;中国联通的宽带用户累计为8088万户。

据C114统计,中国移动2018年每月平均净增宽带用户367万户;中国电信2018年每月平均净增宽带用户97.6万户;中国联通2018年每月平均净增宽带用户36.2万户。

在最后一个月运营数据公布的时候,中国电信更新了其非上市公司的和上市公司有线宽带的累计用户,总数合计为1.7亿户。中国电信一直在强调其整体的宽带用户数,根据这组数据可得出,中国电信貌似还是固网市场的巨擘,但是仍旧改变不了移动已经是宽带市场第一的事实。

从被人嘲笑痴心妄想到把固网市场的宝座收入囊下,中国移动用了不到一年的时间,中国移动夺得固网市场第一让曾经的固网家宽双雄中国联通和中国电信都开始回过身来与中国移动近身肉搏。为此,中国电信还单独成立了智慧家庭分公司。

曾经的王者已经谢幕,但是对于中国电信而言,却是塞翁失马焉知非福。纵观2018年全年,在固网宽带市场,中国电信发展并非不快,只能说相较之下中国移动发展太快。中国电信虽然没有在增量用户规模上出彩,但是其维持了宽带收入的绝对老大位置。

在固网市场更为弱势的一方中国联通更应该积极去应对这样的不利局势,应充分利用混改契机,挖掘宽带网络潜力,将固网宽带业务与OTT服务商进行合作,探索合作共赢的新业务模式,开放价值链条,构建合作共赢。要知道,宽带市场是重要的业务增长保障,也是运营商发展智慧家庭、开展新兴业务的重要根据地。


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

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