新闻中心

01-17
2018
修修补补又一年,微信小程序的困局在哪里?0101
微信小程序上线了游戏,而一年前,微信团队还信誓旦旦的宣称小程序不做游戏。张小龙说,现在跳一跳小程序日活已经1.7亿。也就是说,上线小游戏,微信才有公开数据的勇气。当然,食言这事谁都干过,比如马云也说过绝不做游戏。不过,当小程序打开了游戏界面之后,也就意味着小程序走到头了,有人说是毕业了,或者是肄业了,不管怎样,小程序已经背离了初心。这一年,微信小程序一直都在折腾,提供的功能无所不有了,不断的调整能力,上线新应用,但依然只是宣传上火爆而已。如果说小程序还有救,那只能是因为腾讯而已。对于大多数互联网应用,上市即决定成败,即便腾讯用了所有力量力推,也很难。腾讯为什么要做小程序?基本上看,有几个主要原因。第一,腾讯的业务以游戏为主,虽然也做了很多努力,但始终效果不佳,如果无法摆脱这种发展模式,面对中国游戏产业3000亿左右的产值,天花板将是腾讯难以逾越的障碍,也是未来被阿里巴巴拉下的必然。所以,腾讯希望用小程序连接一切,最重要的是开发其他的业务出来,拓展生存空间。第二,腾讯的能力主要体现在线上,只要是纯线上的业务发展就会很好,反之就会折戟。要想改变这个状态,就需要新的抓手,基于微信和二维码,小程序有可能成为线上线下的连接器,这对腾讯是最重要的。第三,虽然本身叫“小程序”,但其实是腾讯在把应用做重。微信本身是以轻应用起家并占领手机客户端的,所以,过重始终是微信管理团队的担忧。不过,随着流量富裕时代到来,重应用不再是问题,而且,这几年移动互联网发展证明,靠拉规模做范围然后寻找商业模式的互联网方式在移动端都不成功,只有把应用做重,在应用中设计付费才是出路,微信也必须走这条路。所以,小程序的本来设计是,用完即走,简单明快,这样才能更多的涉及全社会,而不是沉湎于个别热点之上。从本质上说,小程序承载的是腾讯的线下梦想。如今,本来要给微信引流的小程序现在变成靠微信引流,这可不是腾讯的初衷,如今连初心都改了,只是维持一个公众预期和资本故事而已。我们看到,承载着为微信连接线上线下连接使命的小程序,最终火的反倒是一些线上的功能,如腾讯自家的“王者荣耀小程序”、“腾讯投票”、“群里有事”,以及一些基于社交的爆款小程序,如“匿名聊聊”和同样基于好友分享的电商类小程序,如“拼多多”等。如果非要拿出一个线上线下的,恐怕也只有摩拜,而摩拜至今还陷入死战,多项指标落后,生死未卜。从通信视角看,微信这种应用轻、用户端重就是管道化,微信让运营商管道化了,然后微信自己也管道化了,这是腾讯最不愿意看到的。微信既不敢也没有能力让客户端变轻,自己主动加重又怕成为最后一根稻草,所以,小程序采取了很多主动轻量级的措施,这是在试错,如果可以承受,小程序会逐步变重,否则就会淡化退出。小程序并非是利用微信流量,只是利用微信的装机量,还要承担为微信拉流量的任务。很多人都只是看到了微信流量大,却忽视了微信流量垃圾流量占多数,微信的单位流量变现价值极低,从微信电话本开始,微信一直在找提高流量价值的出路,有成功也有失败,总体看,不理想。最近一段,微信开始主动试探网络电话,这其实就是在管道化无奈的情况下的只得去争抢运营商的蛋糕。那么,为什么小程序即便得到了全腾讯资源的竭尽全力的推动依然效果不好呢?因为,小程序从本质上违背了腾讯之所以成功的理念,不再注重用户的产品体验,而是以自我商业目的为中心的提供漫天功能,需要具备阿里巴巴的强运营思维才可以但这却是腾讯最缺乏的。此前,腾讯所有成功的业务都是讲产品做到极致,然后利用其强大的社交媒体流量吸引用户进来,但是,小程序是个例外,一直在拉用户进来,然后再看大家的反应而改动产品特性和功能。有专业人士指出,尽管争议不断,但微信强推小程序的决心丝毫未见动摇:开放“搜一搜”入口、马化腾亲自站台乘车码、拉拢星巴克等大品牌、推出信用分等动作,都是为了推广小程序,上一次微信在一个产品上如此下力气,大概还要追溯到微信支付上线之时。如此用心,小程序却依旧低迷。一句话,“小程序不好玩”,这对以游戏起家的腾讯产品就是致命的。由此,什么添加音视频、加上游戏等等,都没有必要分析,下一步添加Vr添加AI也是如此,只是在强行用呼吸机维持小程序生命而已。好吧,既然不好玩就没有找到出路,那么,现在直接上了游戏,这不就好玩了吗?可是,微信或者微信小程序直接上了游戏,这不就等于将微信给QQ化,让腾讯在游戏化的道路上更加坚持,所为大连接变成了游戏链接,与曾经的设计是南辕北辙。
01-17
2018
Python语言,如何在人工智能和大数据时代中占绝对的优势0101
本文探讨了Python语言在AI领域的优势与运用。谁会成为AI 和大数据时代的第一开发语言?这本已是一个不需要争论的问题。如果说三年前,Matlab、Scala、R、Java 和  Python还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明确了,特别是前两天 Facebook 开源了 PyTorch  之后,Python 作为 AI 时代头牌语言的位置基本确立,未来的悬念仅仅是谁能坐稳第二把交椅。不过声音市场上还有一些杂音。最近一个有意学习数据科学的姑娘跟我说,她的一个朋友建议她从 Java 入手,因为 Hadoop 等大数据基础设施是用 Java 写的。无独有偶,上个月 IBM developerWorks  发表的一篇个人博客(https://www.ibm.com/developerworks/community/blogs/jfp/entry/What_Language_Is_Best_For_Machine_Learning_And_Data_Science?lang=en),用职位招聘网站indeed  上的数据做了一个统计。这篇文章本身算得上是客观公正,实事求是,但传到国内来,就被一些评论者曲解了本意,说 Python 的优势地位尚未确立,鹿死谁手尚未可知,各位学习者不可盲目跟风啊,千万要多方押宝,继续撒胡椒面不要停。在这里我要明确表个态,对于希望加入到 AI 和大数据行业的开发人员来说,把鸡蛋放在 Python 这个篮子里不但是安全的,而且是必须的。或者换个方式说,如果你将来想在这个行业混,什么都不用想,先闭着眼睛把 Python 学会了。当然,Python不是没有它的问题和短处,你可以也应该有另外一种甚至几种语言与 Python 形成搭配,但是Python 将坐稳数据分析和 AI 第一语言的位置,这一点毫无疑问。我甚至认为,由于 Python 坐稳了这个位置,由于这个行业未来需要大批的从业者,更由于Python正在迅速成为全球大中小学编程入门课程的首选教学语言,这种开源动态脚本语言非常有机会在不久的将来成为第一种真正意义上的编程世界语。讨论编程语言的优劣兴衰一直被认为是一个口水战话题,被资深人士所不屑。但是我认为这次 Python 的上位是一件大事。请设想一下,如果十五年之后,所有40岁以下的知识工作者,无分中外,从医生到建筑工程师,从办公室秘书到电影导演,从作曲家到销售,都能使用同一种编程语言进行基本的数据处理,调用云上的人工智能  API,操纵智能机器人,进而相互沟通想法,那么这一普遍编程的协作网络,其意义将远远超越任何编程语言之争。目前看来,Python  最有希望担任这个角色。Python 的胜出令人意外,因为它缺点很明显。替换高清大图它语法上自成一派,让很多老手感到不习惯;“裸” Python 的速度很慢,在不同的任务上比C  语言大约慢数十倍到数千倍不等;由于全局解释器锁(GIL) 的限制,单个Python 程序无法在多核上并发执行;Python 2 和 Python  3  两个版本长期并行,很多模块需要同时维护两个不同的版本,给开发者选择带来了很多不必要的混乱和麻烦;由于不受任何一家公司的控制,一直以来也没有一个技  术巨头肯死挺 Python 。所以,相对于 Python 的应用之广泛,其核心基础设施所得到的投入和支持其实是非常薄弱的。直到今天,26岁的Python 都还没有一个官方标配的 JIT 编译器,相比之下, Java 语言在其发布之后头三年内就获得了标配 JIT 。另一个事情更能够说明问题。Python 的 GIL 核心代码 1992 年由该语言创造者 Guido van Rossum 编写,此后十八年时间没有一个人对这段至关重要的代码改动过一个字节。十八年!直到2010年,Antoine Pitrou才对 GIL 进行了近二十年来的第一次改进,而且还仅在 Python 3.x  版本中使用。这也就是说,今天使用 Python 2.7 的大多数开发者,他们所写的每一段程序仍然被26年前的一段代码牢牢制约着。说到 Python 的不足,我就想起发生在自己身上的一段小小的轶事。我多年前曾经在一篇文章里声明自己看好 Python,而不看好 Ruby。大概两年多以前,有一个网友在微博里找到我,对我大加责备,说因为当年读了我这篇文章,误听谗言,鬼迷心窍,一直专攻 Python,而始终对 Ruby 敬而远之。结果他Python 固然精通,但最近一学 Ruby,如此美好,如此甜蜜,喜不自胜,反过来愤然意识到,当年完全被我误导了,在最美的年华错过了最美的编程语言。我当时没有更多的与他争辩,也不知道他今天是否已经从Python后端、大数据分析、机器学习和 AI 工程师成功转型为Rails快速开发高手。我只是觉得,想要真正认识一件事物的价值,确实也不是一件容易的事情。Python 就是这样一个带着各种毛病冲到第一方阵的赛车手,但即便到了几年前,也没有多少人相信它有机会摘取桂冠,很多人认为 Java 的位置不可动摇,还有人说一切程序都将用 JavaScript重写。但今天我们再看,Python 已经是数据分析和 AI的第一语言,网络攻防的第一黑客语言,正在成为编程入门教学的第一语言,云计算系统管理第一语言。Python 也早就成为Web 开发、游戏脚本、计算机视觉、物联网管理和机器人开发的主流语言之一,随着 Python 用户可以预期的增长,它还有机会在多个领域里登顶。而且不要忘了,未来绝大多数的 Python 用户并不是专业的程序员,而是今天还在使用 Excel、PowePoint、SAS、Matlab和视频编辑器的那些人。就拿 AI 来说,我们首先要问一下,AI 的主力人群在哪里?如果我们今天静态的来谈这个话题,你可能会认为 AI 的主力是研究机构里的 AI 科学家、拥有博士学位的机器学习专家和算法专家。但上次我提到李开复的 “AI红利三段论”明确告诉我们,只要稍微把眼光放长远一点,往后看三至五年,你会看到整个 AI  产业的从业人口将逐渐形成一个巨大的金字塔结构,上述的 AI 科学家仅仅是顶端的那么一点点,95% 甚至更多的 AI 技术人员,都将是AI  工程师、应用工程师和AI 工具用户。我相信这些人几乎都将被Python 一网打尽,成为 Python 阵营的庞大后备军。这些潜在的 Python 用户至今仍然在技术圈子之外,但随着 AI  应用的发展,数百万之众的教师、公司职员、工程师、翻译、编辑、医生、销售、管理者和公务员将裹挟着各自领域中的行业知识和数据资源,涌入 Python  和 AI 大潮之中,深刻的改变整个 IT,或者说 DT (数据科技)产业的整体格局和面貌。为什么 Python 能够后来居上呢?如果泛泛而论,我很可以列举 Python 的一些优点,比如语言设计简洁优雅,对程序员友好,开发效率高。但我认为这不是根本原因,因为其他一些语言在这方面表现得并不差。还有人认为 Python 的优势在于资源丰富,拥有坚实的数值算法、图标和数据处理基础设施,建立了非常良好的生态环境,吸引了大批科学家以及各领域的专家使用,从而把雪球越滚越大。但我觉得这是倒因为果。为什么偏偏是 Python 能够吸引人们使用,建立起这么好的基础设施呢?为什么世界上最好的语言 PHP 里头就没有  numpy 、NLTK、sk-learn、pandas 和 PyTorch 这样级别的库呢?为什么 JavaScript  极度繁荣之后就搞得各种程序库层次不齐,一地鸡毛,而 Python 的各种程序库既繁荣又有序,能够保持较高水准呢?我认为最根本的原因只有一点:Python 是众多主流语言中唯一一个战略定位明确,而且始终坚持原有战略定位不动摇的语言。相比之下,太多的语言不断的用战术上无原则的勤奋去侵蚀和模糊自己的战略定位,最终只能等而下之。Python 的战略定位是什么?其实很简单,就是要做一种简单、易用但专业、严谨的通用组合语言,或者叫胶水语言,让普通人也能够很容易的入门,把各种基本程序元件拼装在一起,协调运作。正是因为坚持这个定位,Python 始终把语言本身的优美一致放在奇技妙招前面,始终把开发者效率放在CPU效率前面,始终把横向扩张能力放在纵向深潜能力之前。长期坚持这些战略选择,为 Python 带来了其他语言望尘莫及的丰富生态。比如说,任何一个人,只要愿意学习,可以在几天的时间里学会Python基础部分,然后干很多很多事情,这种投入产出比可能是其他任何语言都无法相比的。再比如说,正是由于 Python 语言本身慢,所以大家在开发被频繁使用的核心程序库时,大量使用 C 语言跟它配合,结果用 Python 开发的真实程序跑起来非常快,因为很有可能超过 80% 的时间系统执行的代码是 C 写的。相反,如果 Python 不服气,非要在速度上较劲,那么结果很可能是裸速提高个几倍,但这样就没人有动力为它开发 C 模块了,最后的速度远不如混合模式,而且很可能语言因此会变得更复杂,结果是一个又慢又丑陋的语言。更重要的是,Python 的包装能力、可组合性、可嵌入性都很好,可以把各种复杂性包装在 Python 模块里,暴露出漂亮的接口。很 多时候,一个程序库本身是用 C/C++ 写的,但你会发现,直接使用 C 或者 C++  去调用那个程序库,从环境配置到接口调用,都非常麻烦,反而隔着一层,用其python 包装库更加清爽整洁,又快又漂亮。这些特点到了 AI  领域中,就成了 Python 的强大优势。Python 也借助 AI 和数据科学,攀爬到了编程语言生态链的顶级位置。Python 与 AI绑在一起,对它们来说,无论是电子商务、搜索引擎、社交网络还是智能硬件,未来都只是生态链下游的数据奶牛、电子神经和执行工具,都将听命于自己。替换高清大图对编程语言发展历史缺乏了解的人可能会觉得,Python 的战略定位是犬儒主义和缺乏进取心的。但事实证明,能同时做到简单而严谨、易用而专业,是很难的,而能够坚守胶水语言的定位,更是难上加难。有的语言,从一开始就是出于学术而非实用的目的,学习曲线过于陡峭,一般人很难接近。有的语言,过于依赖背后金主的商业支持,好的时候风光无限,一旦被打入冷宫,连生存下去都成问题。有的语言,设计的时候有明确的假想场景,要么是为了解决大规模并发,要么是为了解决矩阵运算,要么是为了做网页渲染模板,一旦离开这个场景,就各种不爽。更多的语言,刚刚取得一点成功,就迫不及待的想成为全能冠军,在各个方向上拼命的伸展触角,特别是在增强表达能力和提升性能方面经常过分积极,不惜将核心语言改得面目全非,最后变成谁都无法掌控的庞然大物。相比之下,Python 是现代编程语言设计和演化当中的一个成功典范。Python 之所以在战略定位上如此清晰,战略坚持上如此坚定,归根结底是因为其社区构建了一个堪称典范的决策和治理机制。这个机制以 Guido van Rossum (BDFL,Pythoners 都知道这是什么意思), DavidBeazley,  Raymond Hettinger 等人为核心,以 PEP 为组织平台,民主而有序,集中而开明。只要这个机制本身得以维系,Python  在可见的未来里仍将一路平稳上行。最有可能向 Python 发起挑战的,当然是Java。Java 的用户存量大,它本身也是一种战略定位清晰而且非常坚定的语言。但我并不认为 Java 有很大的机会,因为它本质上是为构造大型复杂系统而设计的。什么是大型复杂系统?就是由人清清楚楚描述和构造出来的系统,其规模和复杂性是外生的,或者说外界赋予的。而 AI 的本质是一个自学习、自组织的系统,其规模和复杂性是一个数学模型在数据的喂养下自己长出来的,是内生的。因此,Java大多数的语言结构对于大数据的处理和 AI 系统的开发显得使不上劲,你强的东西这里用不上,这里需要的东西你做起来又别扭。而 Python 在数据处理方面的简洁强悍早就尽人皆知。对比两个功能相同的 Java 和 Python 机器学习程序,正常人只要看两眼就能做出判断,一定是 Python 程序更加清爽痛快。大概在 2003 或者 2004 年的时候,我买过一本 Python 的书,作者是一位巴西人。他说自己之所以坚定的选择 Python,是因为他小时候经常梦到未来世界将由一条大蟒蛇(蟒蛇的英文为python)统治。我当时觉得这哥们好可怜,做个梦都能梦到这么恐怖的场景。但今天来看,也许他只是像黑客帝国里的程序员安德森一样,不小心穿越到未来,并且窥探到了世界的真相。Python 现已逐步在网络爬虫、数据剖析、AI、机器学习、Web  开发、金融、运维、检验等多个领域扎根强大。随着它的被认可程度逐步提高,学习并把握这门言语的人群份额越来越大,许多公司也将为抢占该领域高精尖人才做着殊死搏斗!能够说,未来谁具有人工智能领域的技术权威,谁将会具有新年代互联网最高话语权。那么,在此之中,学好Python,必将让你在编程生计中大刀阔斧,勇闯天边!Python无疑将会成为AI年代下的新宠儿,
01-17
2018
解Bug之路:记一次JVM堆外内存泄露Bug的查找0101
前言JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。笔者将此Bug分析的过程写成博客,以飨读者。由于物理内存定量分析部分用到了linux kernel虚拟内存管理的知识,读者如果有兴趣了解请看ulk3(《深入理解linux内核第三版》)内存泄露Bug现场一个线上稳定运行了三年的系统,从物理机迁移到docker环境后,运行了一段时间,突然被监控系统发出了某些实例不可用的报警。所幸有负载均衡,可以自动下掉节点,如下图所示:登录到对应机器上后,发现由于内存占用太大,触发OOM,然后被linux系统本身给kill了。应急措施紧急在出问题的实例上再次启动应用,启动后,内存占用正常,一切Okay。奇怪现象当前设置的最大堆内存是1792M,如下所示:-Xmx1792m -Xms1792m -Xmn900m -XX:PermSi ze=256m -XX:MaxPermSize=256m -server -Xss512k查看操作系统层面的监控,发现内存占用情况如下图所示:上图蓝色的线表示总的内存使用量,发现一直涨到了4G后,超出了系统限制。很明显,有堆外内存泄露了。查找线索gc日志一般出现内存泄露,笔者立马想到的就是查看当时的gc日志。本身应用所采用框架会定时打印出对应的gc日志,遂查看,发现gc日志一切正常。对应日志如下:查看了当天的所有gc日志,发现内存始终会回落到170M左右,并无明显的增加。要知道JVM进程本身占用的内存可是接近4G(加上其它进程,例如日志进程就已经到4G了),进一步确认是堆外内存导致。排查代码打开线上服务对应对应代码,查了一圈,发现没有任何地方显式利用堆外内存,其没有依赖任何额外的native方法。关于网络IO的代码也是托管给Tomcat,很明显,作为一个全世界广泛流行的Web服务器,Tomcat不大可能有堆外内存泄露。进一步查找由于在代码层面没有发现堆外内存的痕迹,那就继续找些其它的信息,希望能发现蛛丝马迹。Dump出JVM的Heap堆由于线上出问题的Server已经被kill,还好有其它几台,登上去发现它们也 占用了很大的堆外内存,只是还没有到触发OOM的临界点而已。于是就赶紧用jmap dump了两台机器中应用JVM的堆情况,这两台留做现场保留不动,然后将其它机器迅速重启,以防同时被OOM导致服务不可用。使用如下命令dump:jmap -dump:format=b,file=heap.bin [pid]使用MAT分析Heap文件挑了一个heap文件进行分析,堆的使用情况如下图所示:一共用了200多M,和之前gc文件打印出来的170M相差不大,远远没有到4G的程度。不得不说MAT是个非常好用的工具,它可以提示你可能内存泄露的点:这个cachedBnsClient类有12452个实例,占用了整个堆的61.92%。查看了另一个heap文件,发现也是同样的情况。这个地方肯定有内存泄露,但是也占用了130多M,和4G相差甚远。查看对应的代码系统中大部分对于CachedBnsClient的调用,都是通过注解Autowired的,这部分实例数很少。唯一频繁产生此类实例的代码如下所示:@Override     public void fun() {             BnsClient bnsClient = new CachedBnsClient();           // do something     return  ; }此CachedBnsClient仅仅在方法体内使用,并没有逃逸到外面,再看此类本身public class CachedBnsClient   {     private ConcurrentHashMap<String, List<String>> authCache = new ConcurrentHashMap<String, List<String>>();     private ConcurrentHashMap<String, List<URI>> validUriCache = new ConcurrentHashMap<String, List<URI>>();     private ConcurrentHashMap<String, List<URI>> uriCache = new ConcurrentHashMap<String, List<URI>>(); ...... }没有任何static变量,同时也没有往任何全局变量注册自身。换言之,在类的成员(Member)中,是不可能出现内存泄露的。当时只粗略的过了一过成员变量,回过头来细想,还是漏了不少地方的。更多信息由于代码排查下来,感觉这块不应该出现内存泄露(但是事实确是如此的打脸)。这个类也没有显式用到堆外内存,而且只占了130M,和4G比起来微不足道,还是先去追查主要矛盾再说。使用jstack dump线程信息现场信息越多,越能找出蛛丝马迹。先用jstack把线程信息dump下来看下。 这一看,立马发现了不同,除了正常的IO线程以及框架本身的一些守护线程外,竟然还多出来了12563多个线程。"Thread-5" daemon prio=10 tid=0x00007fb79426e000 nid=0x7346 waiting on condition [0x00007fb7b5678000]    java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.xxxxx.CachedBnsClient$1.run(CachedBnsClient.java:62)而且这些正好是运行再CachedBnsClient的run方法上面!这些特定线程的数量正好是12452个,和cachedBnsClient数量一致!再次check对应代码原来刚才看CachedBnsClient代码的时候遗漏掉了一个关键的点!    public CachedBnsClient(BnsClient client) {         super();         this.backendClient = client;         new Thread() {             @Override             public void run() {                 for (; ; ) {                     refreshCache();                     try {                         Thread.sleep(60 * 1000);                     } catch (InterruptedException e) {                         logger.error("出错", e);                     }                 }             }     }这段代码是CachedBnsClient的构造函数,其在里面创建了一个无限循环的线程,每隔60s启动一次刷新一下里面的缓存!找到关键点在看到12452个等待在CachedBnsClient.run的业务的一瞬间笔者就意识到,肯定是这边的线程导致对外内存泄露了。下面就是根据线程大小计算其泄露内存量是不是确实能够引起OOM了。发现内存计算对不上由于我们这边设置的Xss是512K,即一个线程栈大小是512K,而由于线程共享其它MM单元(线程本地内存是是现在线程栈上的),所以实际线程堆外内存占用数量也是512K。进行如下计算:12563 * 512K = 6331M = 6.3G整个环境一共4G,加上JVM堆内存1.8G(1792M),已经明显的超过了4G。(6.3G + 1.8G)=8.1G > 4G如果按照此计算,应用应用早就被OOM了。怎么回事呢?为了解决这个问题,笔者又思考了好久。如下所示:Java线程底层实现JVM的线程在linux上底层是调用NPTL(Native Posix Thread Library)来创建的,一个JVM线程就对应linux的lwp(轻量级进程,也是进程,只不过共享了mm_struct,用来实现线程),一个thread.start就相当于do_fork了一把。其中,我们在JVM启动时候设置了-Xss=512K(即线程栈大小),这512K中然后有8K是必须使用的,这8K是由进程的内核栈和thread_info公用的,放在两块连续的物理页框上。如下图所示:众所周知,一个进程(包括lwp)包括内核栈和用户栈,内核栈+thread_info用了8K,那么用户态的栈可用内存就是:512K-8K=504K如下图所示:Linux实际物理内存映射事实上linux对物理内存的使用非常的抠门,一开始只是分配了虚拟内存的线性区,并没有分配实际的物理内存,只有推到最后使用的时候才分配具体的物理内存,即所谓的请求调页。如下图所示:查看smaps进程内存使用信息使用如下命令,查看cat /proc/[pid]/smaps > smaps.txt实际物理内存使用信息,如下所示:7fa69a6d1000-7fa69a74f000 rwxp 00000000 00:00 0  Size:                504 kB Rss:                  92 kB Pss:                  92 kB Shared_Clean:          0 kB Shared_Dirty:          0 kB Private_Clean:         0 kB Private_Dirty:        92 kB Referenced:           92 kB Anonymous:            92 kB AnonHugePages:         0 kB Swap:                  0 kB KernelPageSize:        4 kB MMUPageSize:           4 kB 7fa69a7d3000-7fa69a851000 rwxp 00000000 00:00 0  Size:                504 kB Rss:                 152 kB Pss:                 152 kB Shared_Clean:          0 kB Shared_Dirty:          0 kB Private_Clean:         0 kB Private_Dirty:       152 kB Referenced:          152 kB Anonymous:           152 kB AnonHugePages:         0 kB Swap:                  0 kB KernelPageSize:        4 kB MMUPageSize:           4 kB搜索下504KB,正好是12563个,对了12563个线程,其中Rss表示实际物理内存(含共享库)92KB,Pss表示实际物理内存(按比例共享库)92KB(由于没有共享库,所以Rss==Pss),以第一个7fa69a6d1000-7fa69a74f000线性区来看,其映射了92KB的空间,第二个映射了152KB的空间。如下图所示:挑出符合条件(即size是504K)的几十组看了下,基本都在92K-152K之间,再加上内核栈8K(92+152)/2+8K=130K,由于是估算,取整为128K,即反映此应用平均线程栈大小。注意,实际内存有波动的原因是由于环境不同,从而走了不同的分支,导致栈上的增长不同。重新进行内存计算JVM一开始申请了-Xmx1792m -Xms1792m即1.8G的堆内内存,这里是即时分配,一开始就用物理页框填充。12563个线程,每个线程栈平均大小128K,即:128K * 12563=1570M=1.5G的对外内存取个整数128K,就能反映出平均水平。再拿这个128K * 12563 =1570M = 1.5G,加上JVM的1.8G,就已经达到了3.3G,再加上kernel和日志传输进程等使用的内存数量,确实已经接近了4G,这样内存就对应上了!(注:用于定量内存计算的环境是一台内存用量将近4G,但还没OOM的机器)为什么在物理机上没有应用Down机笔者登录了原来物理机,应用还在跑,发现其同样有堆外内存泄露的现象,其物理内存使用已经达到了5个多G!幸好物理机内存很大,而且此应用发布还比较频繁,所以没有被OOM。Dump了物理机上应用的线程,一共有28737个线程,其中28626个线程等待在CachedBnsClient上。同样用smaps查看进程实际内存信息,其平均大小依旧为128K,因为是同一应用的原因继续进行物理内存计算1.8+(28737 * 128k)/1024K =(3.6+1.8)=5.4G进一步验证了我们的推理。这么多线程应用为什么没有卡顿因为基本所有的线程都睡眠在 Thread.sleep(60 * 1000);//一次睡眠60s上。所以仅仅占用了内存,实际占用的CPU时间很少。总结查找Bug的时候,现场信息越多越好,同时定位Bug必须要有实质性的证据。例如内存泄露就要用你推测出的模型进行定量分析。在定量和实际对不上的时候,深挖下去,你会发现不一样的风景!
01-17
2018
2018,怎么缓解大数据的尴尬0101
关于大数据,最近爆出的一个笑话:在电影业一次内部行业会议上,一位巨无霸级别的电影业发言人说:通过数据挖掘,我们发现不同观众的相关卖品偏好。比如《芳华》的观众比《战狼Ⅱ》观众消费了更多的热饮。这些都是之前我们不知道的,也是无法预测的。上面这样一个基于两部影片的观影数据分析得出来的结论,看似客观正确,实则因为模型不完善(缺少观影季节的考量)等原因,而闹出笑话。在近期,我们在给金融科技做盘点的时候,就发现大数据自身就是一个“尴尬”。我们找遍新闻,也没有发现这个词有什么特别值得说道的地方。只能靠着一点时政资料凑齐了这个关键词的盘点。2017年,大数据如此重要,却又如此没有料。大数据模型不完善,是因为根基不牢大数据一直不温不火,和他的发展缺陷有很大的关系。虽然大家极力看好它,但未能迎来行业的爆发。和一些做大数据的朋友聊天,他们甚至会很直白地吐槽自己家的数据模型。“那些所谓的数据模型之类的鬼东西,你只需瞄上一眼,就能头疼一整天。模型里的数据巨大无比,线索逻辑纷繁复杂。很多数据看似很重要却极其无聊,对结果判断毫无意义,食之无味弃之可惜,鸡肋一般的存在。”“说实在的,根本原因不在于技术的落后,而是整个行业的发展根基太浅,无法对数据的有效性进行勘误、归纳和合理解释。”“粗略地说,合理的大数据架构是,数据模型完善,能根据特定领域做出全面合理的数据精简,去掉无关数据和干扰数据,梳理出一条合理的客观建议,并根据数据分析师的主观判断和勘误,再总结出合理的结论,对相关行业做出准确的预判。”“现在呢?本来数据模型都存在这样和那样的漏洞,却还想着数据处理的完全自动化。”“而完全依靠客观数据,完成所谓的人工智能演算,那都是扯淡的事儿。”“刚才说的那个《芳华》和《战狼Ⅱ》的笑话其实就是一个看似客观,实则可笑的分析结论。”“这是因为,大家一说到大数据,就太拿数据想当然了。如果只靠着这点意识去做消费金融领域的数据分析,肯定有很多投资人被坑得底儿朝天!”“所以现在挣钱的还是那些靠着倒买倒卖用户资料的数据公司,一个数据包,加点水分,到处卖,收益无限。”“不过,最近似乎也没那么容易整了,因为官方越查越严,有些所谓的大数据公司搞不动了,怕是要凉了。”物联网或许是大数据公司的真正机会“除了行业经验的累积,还需要更多数据做线上支撑。”“当然,并不是说数据越多越好,而是说,线上的数据越丰富,越有利于我们组织有效数据。”“核心问题就在于,如何产生大量的有效数据。”“有效数据,简单了说,就某个领域,比如,消费金融领域的某一个小细分的消费品的相关数据,在合理组合和解构之后,对行业发展做出合理预判,对投资人预期负责的数据。否则,数据越大,负担越重,越成不了事儿。”积累经验到什么时候才算是个头呢?“或许要等到物联网时代的真正到来。”为什么?“物联网可以让更多的消费金融数据和物流数据线上化,个人消费信用信息也将进一步线上化,数据的归集和处理将更加高效和全面。”“不过,随着移动支付的快速发展,更多人的金融消费能力在线上就基本被呈现了出来,包括个人的消费习惯和个人征信信息都被线上化,而由此产生的物流信息、住房、贷款信息等都在逐步完成终极线上化,这些对大数据来说,都是极好的机会。”“大数据行业机会很大,但大数据是一个不稳定的行业,因为一切的数据都归结到机器里,而机器由人来掌控,相关的操作风险完全看自己的风险意识和人品。行业随时爆发大规模风险,运气好只影响数据安全,运气不好,很企业和个人的信用会破产。这会给行业,甚至整个社会带来巨大的灾难。”“因此,从业企业的相关准则需要进一步细化和规范,对人也需要有个职业操守方面的管制。”什么样的人怎么用数据,其目的和效果都是不一样的。这又和一个大数据相关的段子有点关系,正好段子开头,笑话结尾,也还算圆满。俺家钟点工说:“俺儿子又被老师训了。”俺问又咋啦?她说:学校请了个政法大学的教授来给孩子们讲课,说还是个名人呢,见天在电视上忽悠。他告诫孩子们不要打架,他说他统计过,打架斗殴死了的人百分之九十五以上都是先动手那个,然后问孩子们这是为什么?俺儿子说因为没死的说是死了的先动手的。
01-17
2018
我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!0101
从前几天微信最新版本 6.6.1 的更新开始,微信小程序游戏“跳一跳”似乎在一夜之间风靡了朋友圈。它甚至比五六年前的飞机大战游戏都火爆,这种小游戏的火爆不仅仅是因为有魔性、有意思,更重要的是可以进行好友 PK!“跳一跳”的小游戏推出后,很多准备奋发向上的同学,这个假期的美好愿景被毁了。为了多跳几步,以及朋友圈的排名,大家在整个假期都是这样的:就这样跳啊跳...挤地铁跳,蹲马桶跳,乘电梯跳,静默的每 1 秒都不能浪费在办公室,还要时刻警觉后面...说好的工作呢...我控制不住我自己啊!可是很多人费尽心思跳了一下午也没超过 100 分但排行榜里四分之三的人都超过三位数了……真是扎心了……今天小编来告诉你,如何才能获取高分,如何才能占据朋友圈榜首?游戏攻略拿高分普通版本的高分秘籍是这样的:如果你每次都能挑到各自的正中间的话,可以 + 2 分,如果连着跳到中间会 + 4、+6、+8、+10……跳到污水井盖上面,停留 2 秒,等到下水道声音响起直接 + 5 分跳到魔方上面,停留 2 秒,等到魔方转正会直接 + 10 分跳到音乐盒上面,停留 2 秒,等到音乐响起会直接 + 30 分跳到便利店,停留 2 秒,等到便利店开门会直接 + 15 分以上是针对普通用户,但对咱们程序猿来说用这套太 Low 了,接下来要说的是如何从技术层面去实现高分:技术手段实现高分通过 Python 手段在 Github 上面已经有人用 Python 来玩跳一跳这个游戏了,想多少分就有多少分。GitHub 地址:https://github.com/wangshub/wechat_jump_game步骤:安卓手机打开 USB 调试,设置》开发者选项》USB 调试。电脑与手机 USB 线连接,确保执行 adb devices 可以找到设备 id。界面转至微信跳一跳游戏,点击开始游戏。运行 python wechat_junp_auto.py,如果手机界面显示 USB 授权,请点击确认。很有趣!简单点说就是:用电脑帮你玩微信跳一跳,全自动,不用手动。效果:这里梳理一份稍微完整一点的操作步骤,以 Mac 的为例,Win 的思路是一样的。另外,这里用的是安卓手机,iOS 也差不多,不过要下载一个 5.5GB 的 Xcode。1、下载程序,打开下面的链接,点右侧 clone or download,再点 download zip。2、解压 zip 文档,再把文件夹挪到桌面,打开文件夹,你会看到很多东东:3、打开 mac 系统自带的“终端”,这是一个命令行应用,win 用 cmd 就可以了吧。4、通过终端进入文件夹,命令行如下:~/Decktop/wechat_jump_game-master5、安装 pip,在终端输入 sudo easy_install pip 再回车,可能要输入密码。6、安装各种依赖程序,在终端输入 pip install -r requirements.txt 再回车,系统会自动安装。requirements.txt 就是文件夹里的一个 txt 文档,里面写着会自动安装哪些程序。pip 就是第 5 步安装的程序,如果没安装,pip install -r requirements.txt 将无法执行。7、安装 adb,打开下面的链接查看,有 3 种方法,建议用第二种,是英文,如果你不懂英文可以百度中文教程。https://stackoverflow.com/questions/31374085/installing-adb-on-mac-os-x8、打开安卓手机的设置 - 开发者选项 - USB 调试(如果没有开发者选项,可百度打开开发者选项的方法),用 USB 线连接手机和电脑,手机可能会弹出对话框,点同意。如果出现运行脚本后小人不跳的情况,请检查是否有打开“USB 调试(安全模式)”,记得顺便打开 USB 模拟点击。9、在终端输入 adb devices,如果看到下面这种信息,说明 adb 已正确安装,也说明电脑成功检测到手机。如果你系统是 Win10 或 Win8 可能需要先设置一下“禁用强制驱动程序签名”。不然会出现下面的“文件的哈希值不在指定目录中”安装不上 adb 驱动的问题,网上有教程请自行学习。10、打开微信跳一跳点开始,在终端输入 python wechat_jump_auto.py 点回车,游戏就会自动开始~ 请根据手机分辨率运行相应的 *.py 文件。注意:我跳了很多次,最后都会掉下盒子,暂时最多只能跳到 1800+ 分,不能一直跳下去。分辨率不同,配置文件也不一样,具体看 config 这个文件夹。别刷太高分,有人刷到 4000,结果分数被微信清零。实验结果:只要有耐心,你就是王者下面分析一下代码,Main 部分有一个 While 循环,只要你不终止,它会一直重复操作。Main部分代码里面主要调用的自定义函数有三个,还有一个 time.sleep 是为了延迟一下:pull_screenshot() #获取图像find_piece_and_board(im) #根据图像获取两个点的坐标值jump(math.sqrt((board_x - piece_x) ** 2 + (board_y - piece_y) ** 2))#根据两点距离和手机像素计算按压时间并 JUMPpull_screenshot()这个函数主要是利用 adb 来获取图像,这里顺便说一下“adb”,adb 是连接 Android 手机与 PC 端的桥梁,可以让用户在电脑上对手机进行全面的操作。借助 adb 工具,我们可以管理设备,还可以进行如安装软件、系统升级、运行 Shell 命令等等操作。如“pull”就是获取设备中的文件,想更多了解 ADB 请自行学习~find_piece_and_board()根据图像获取当前小人位置和落点的坐标系(piece_x, piece_y, board_x, board_y),这个是这个脚本中的核心部分。jump根据设定的“长按的时间系数”计算需要的按压时间,这个系数是根据手机分辨率推出来的,按压时间设定不小于 200ms,核心命令是 adb 的“input swipe”。“input swipe”模拟的是手指在屏幕上的滑动事件,如果两个点坐标不变化就成了长按了。代码中四个变量的设置是:“swipe_x1,swipe_y1,swipe_x2,swipe_y2 = 320,410,320,410”,所以是模拟的长按,其实滑动也是可以的。伪造 POST 请求刷分除了可以用 Python 实现高分,还有网友爆料还可以直接伪造 POST 请求刷分,直接改分数。昨日,V2EX 网站上一篇题为《微信跳一跳 可以直接更改分数, POST 请求没有校验… 》的文章获得大量曝光,帖中指出微信小程序存在漏洞,跳一跳小游戏可以直接改分数。用户朱鹏飞根据帖子的指引,发现甚至连微信小程序、小游戏的源代码都可以直接下载,只需要知道 appid 和版本号,就可以直接构造 URL 下载后缀为 wxapkg 的源码包,不需要任何验证。据微信公众号“小专栏平台”消息,截自 1 月 1 日 23:50,微信官方已经修复了这个漏洞。不过,据说一些老版本的微信还是可以抓包获取包地址。最后一个微信已经修复 Bug(部分版本没有修复),但只要利用好前面两个攻略,再配合对节奏的把握,登上朋友圈前几完全不在话下。话不多说,赶紧去玩吧!!!
01-17
2018
WebAPI 实现前后端分离 0101
随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数。全栈工程师的压力越来越大。现在的前端的框架,既可以做各种Web,又可以做各种APP,前端框架更新换代越来越快,越来越多。传统的模式前端和后端进行调试,修改都非常麻烦。往往前端配合后端很痛苦,后端也嫌前端麻烦。(无解,能动手解决的事,尽量别动嘴。办公室应该常备一些,绷带,止血条,速效救心丸等药品。为了阻止事态升级,办公室要加强刀具管制条例。)前后端分离前端根据事先约定好的文档,可以自己摸拟数据,然后开发,测试,调试UI,发布到线上时把API接口改成线上API接口,即可完事。前端日后增加新功能,修改UI,自己修改,自己编译更新自己UI站点,发布线上只要调上线上API接口即可。并不需要麻烦到后端。两者工作进行分离。后端需要跟前端商量好接口,写好接口文档,在接口功能上相互沟通(其实相当于需求相互沟通),一旦接口文档订好之后,只需按事先约定实现API接口即口。把项目编译好发布到线上服务器。即可完事。后端实现WebApi接口,还可以面对各种调用,如PC端web,手机APP,或者其它设备。一个接口多种调用,实现代码去重。工作模式分析对前端和后端进行分离。各司其职,各自在自己的领域集中精力研究。更能有效的加深技术深度。 前后端分离的模式,你需要N名前端工程师和N名后端工程师。首先我们要约定一些返回基本的格式,比如用XML,还是JSON。结果大多数前端都是喜欢JSON,因为JS天生就支持JSON。我贴出一些示例代码  {    "ResultCode": 1300,    "Message":"权限不足",    "Date":null,   }: ::::返回参数说明参数名类型是否必有说明ResultCodeint是返回码Messagestring是结果说明DetailErrorjosn否具体错误Datejosn否数据        ResultCodeResultCode说明1000成功1100服务器异常1200身份验证异常1300权限不足1400传递参数验证不通过1500版本异常1600业务逻辑异常1700系统成升级中1800该接口己弃用          具体异常这是一个有点争议的地方,有很多业务逻辑异常,出于对用户的友好提示。一些生涩难懂的错误提示,直接给到用户,用户一脸懵逼。但是后端却不能修改成友好提示,这样不方便调试,寻找问题原因。一般来讲,前端可以自动修改友好提示给用户。如果后端返回字符串,前端写死在代码中,万一,某一天后端认为这个描述更符合场景,修改的字符串。敌军还有30秒到达战场。建议:尽量使用异常代码,大家可以看到上面贴出例子,就使用的异常代码。每种异常都有唯一编号,描述可以更改。但是编号不变。用户异常(1601000)说明1601001账号/密码错误1601002账号被冰冻1601003原密码不对    版本控制 每个API都有一个版本,其实也是就针对APP,如果是WEB端的,都是直接升级的因为B/S结构本身就是存在升级方便的优势,只需要把服务端更新就可以了。版本控制一般用两种方式第一种:URL不变,版本写在HTTP标头内面。第二种:版本写在URL上面。本人推荐第二种,比较直接方便了解。示例:http://www.xxx.com/版本号当前版本号:v1 http://www.baidu.com/v1/UserSecurity/LoginAPI风格现在流行的api风格比较多,最出名的就是restful风格。按本人的经验,完全走restful风格是很困难的,可能也是水平问题,在团队内面也要考虑到其它成员的水平问题。我们目前API风格还是保留以前风格。示例,V*代表版本号http://xx.com/V*/UserSecurity/SignOutHTTP谓词使用 Post 方法在服务器上创建/修改/删除资源使用 Get 方法从服务器检索某个资源或者资源集合基本命名规则使用骆驼式命名法-大驼峰法跨域处理前端站点和后端API布署到不同的站点,就会产生跨域问题。什么是同源策略?同源是域名,协议,端口相同。也就是说如果不同,则是非同源。同源策略是浏览器的一基本的安全功能,非同源访问,浏览器会进行拒绝。HMTL上面的SRC地址,你可以指定任何URL,表单提交,你可以提交到任何URL。但是,你如果使用AJAX技术,就会受到同源策略的影响,拒绝提交。现代浏览器几乎都支持跨域资源请求的一种方式。这种技术叫CORS(跨域资源共享)CORS跨域分两种第一种,简单跨域。第二种,复杂跨域。解决方案:HTTP输出标头增加如何节点注意有前端框架版本,对安全要求较高,不能使用通配符*,要指定跨域域名。Access-Control-Allow-Origin:* 下面节点可填,可不填,根据实际情况,自行决定。123Access-Control-Allow-Methods:GET,POST,OPTIONSAccess-Control-Allow-Credentials:trueAccess-Control-Allow-Headers:根据请求头的内容,填写  注意:复杂跨域比要简单跨域麻烦,更花费性能。因为复杂跨域在请求之前会先发一个options预请求,根据响应判断服务器是否支持跨域。也就是说,实际上请求了两次。Cookies作用域不同的站点,如何通用Cookies?一般情况只需把cookies作用域设置顶级域名,浏览器会自动把cookies在访问子域名的时候捎上去。示例,访问二级域名时候,cookies默认会被传送过去。顶级域名:baidul.com cookies作用域:.baidu.com 二级域名: www.baidu.com api.baidu.com 示例下面贴一些示例文档,其它的就不多讲啦 基本上,WebApi前后端分离的细节和注意点,都记录下来,还有更多的细节,需要读者在开发过程自己去寻找答案。随笔完毕!
01-17
2018
谷歌出来走两步:Home Max可致无线路由器崩溃0101
1月17日消息,谷歌Home Max智能音箱已经正式发售,价格是399美元。没想到上市没有多长时间,就有该产品的用户在谷歌论坛上反馈该音响问题频频。谷歌Home Max可致无线路由器崩溃(图片来自TheVerge)       谷歌产品论坛上有了一份初步报告,称用户在使用Home Max播放音乐时,无线网络可能会产生崩溃停止工作的情况。 目前谷歌方面要求用户将含有关键字“GHT3 -无法设置最大的网络”的截图和路由器日志的情况保留,以便他们对此问题进行诊断。       对于出现的问题, 谷歌公司的发言人对此作出回应,谷歌Home Max用户反映的问题描述显示,当该用户的Home Max连接无线网络时,无线路由器就会崩溃,只能通过重启无线路由器来解决这个问题。       不过一部分用户认为,路由器的硬件配置不同可能是导致这个问题出现的原因。但自最初的用户反映该情况以后,有人证实,他们在不同的无线路由器上都遇到了同样的问题。      据了解,谷歌Home Max是一款尺寸较大的音箱。这款音箱配备了双4.5英寸低音单元和0.7英寸的高音单元。谷歌在10月份的发布会上表示,谷歌Home Max的音量要比谷歌Home大20倍,而用户可以通过Cast、蓝牙或3.5毫米接口去连接音箱。       Home Max还支持Smart Sound功能,它将会让扬声器自动适应房间尺寸,消除一些杂音。如果将音响放置在墙边或者架子上,它们会听起来不同。Smart Sound功能就能够让这些差别消除。       Home Max能够支持许多主流音乐在线平台,比如YouTube Muisc Spotify以及Google Play Muisc、Pandora等。
01-16
2018
“微信之父”张小龙透露公众号两大惊喜!0101
微信公众号将会单独发布app,以后会是直接对作者进行赞赏,而不是对公众号。2018微信公开课PRO版”在广州保利世贸博览馆举行,“微信之父”张小龙在主旨演讲中公布了微信公众平台的最新变化。Part1-赞赏恢复,可直接打赏作者2017年4月19日,微信方面宣布,因苹果公司新规出台,对应用内支付规则进行了变更,iOS版微信公众平台及表情平台赞赏功能从当天17:00起被关闭,安卓等其他版本微信赞赏功能不受影响。对此,张小龙在“2018微信公开课PRO版”现场表示,公众号赞赏功能会很快恢复过来。此外,还有一个改变,公众号以后会是直接对作者进行赞赏。“2017年,微信和苹果公司做了很好的合作,经过协调达成了一些共识。跟苹果公司沟通之后,我们也对自己思考了很多。之前没有把作者作为一个独立个体,以后会是直接对作者进行赞赏。对公众号打赏还是对公众号背后的作者打赏,是两个事情。”Part2-公众号出app,将实现手机端编辑目前,微信公众号的内容编辑只能在PC端实现。张小龙透露,微信公众号的app很快就会推出。他说:“公众号的app做了,但还没有发布,因为没有达到我们的预期。微信是为手机而生,但公众号后台还是在PC上生成,这点确实很奇怪。我们确实很早就应该把app推出来,但因为我们自己的问题,没出来,挺可惜的。”Part3-微信之父“跳一跳”6000分!张小龙在现场还玩起了最近大火的小程序游戏“跳一跳”,并透露自己最高分为6000多分,获得了“立地成佛”的称号。作为微信花了最多的时间来做、也是最大的项目,张小龙对“小程序”非常有信心和耐心。他说:“希望小程序一步步地长大,而不是被催肥。小程序代表一种表达的方式,未来万事万物都包含信息。小程序刚好是各种信息的载体,是人们连接信息的方式。”2017年,微信月活跃用户数达到9.8亿,微信支付用户破8亿,小程序经历数十次更新完善……作为微信一年一度最大盛会,在“2018微信公开课PRO版”上,微信2017年重点业务线阵容全面亮相,小程序、微信支付、企业微信等产品亮眼呈现。现场参会嘉宾共同回顾2017并展望2018,以全新姿态迎接崭新时代。
01-16
2018
今天是Windows 10免费升级的最后一天0101
1月16日消息:今天是Windows 7/8.1免费升级Windows 10的最后一天了,虽然这个“最后一天”已经不是第一次了。  微软将在明天正式关闭Windows 10免费升级通道,之后拥有正版Windows 7和Windows 8.1的用户想要升级到Windows 10,只能花钱了。Windows 10  事实上,微软在2016年7月29日就结束了正常的Windows 10免费升级通道,但为了视听障碍人士,微软的辅助技术免费升级通道一直都没有关闭。  所以,在2016年7月29日之后,人们仍然可以通过辅助技术通道免费将Windows 7和Windows 8.1升级到Windows 10。  就在上个月,微软宣布这个通道会在12月31日关闭,结果还是没能关闭成功,延期到了现在。这一次应该是真要关闭了吧?Windows 7/8.1免费升级Windows 10系统的最后一个“后门”即将于明天正式封闭。这意味着用户在今天之后将不再免费升级,今后想要升级至少需要支付119.99美元(Windows 10家庭版本)的费用。Windows 10上线之初,微软提供了长达1年的免费升级计划,无论是正版还是盗版用户在这个时间段内都可以免费升级至Windows 10。2016年7月29日免费通道关闭之后,用户发现通过“辅助技术”依然能够免费升级。辅助技术更新是Windows 10在2016年7月一年免费升级期结束后的一个“小小漏洞”。因为微软对辅助技术的定义相当宽泛,包括使用键盘快捷方式、放大镜的Win7/8.1客户都算,所以实质上几乎适用于任何人。微软最初曾表示将于2017年12月31日关闭这个漏洞,不过本月微软宣布做出调整,延长至1月16日。