駦卂qq厷呞13淍姩菗奨萿憅湜嫃哋嬷ゥウ駦卂qq13分组淍姩挖

回答一下一个比较specific的问题:为什么C不容易反编译。&br&首先,明确定义一下问题。反编译的input是可执行程序,在这个帖子里我会叫它binary。output是C代码。&br&&br&binary是电脑执行的一行行指令。所以我们会想,先把binary还原成指令。这个过程叫做disassembling,还原出的指令叫做disassembly。&br&&b&Disassembly是很难全对的。几乎不可能。&/b&这个看似简单的动作其实很复杂。一般是两种方法,动态和静态。动态方法是,让计算机跑程序,跑了什么记录下来。但是你怎么知道计算机把程序跑全了呢?静态方法是,不让计算机跑,而是让计算机读这些指令。binary会有entry point,然后你就知道从binary的哪里开始读啦,然后就一行行读呗。但是,仍然会有你读不到的地方。entry point一般是main()的第一行,然后main读完了你读哪里?有些function可能main根本没调用。别说反汇编,&b&即使把一个binary里面的函数都找全找对都很难。&/b&&br&在此卖一下自己的paper: &a href=&///?target=https%3A//www.usenix.org/node/184522& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BYTEWEIGHT: Learning to Recognize Functions in Binary Code&i class=&icon-external&&&/i&&/a&. 里面有一个section介绍了万恶的optimization会把function变成什么样的恶心的代码。&br&&br&然后,即使Disassemble完了,之后要做的是还原各种变量。&b&同样很难,目前为止几乎不可能&/b&。有两方面的工作要做。一个叫做variable recovery, 一个叫做type recovery。一般做这两部之前会把disassembly再转化成另一种中间语言。这样做的目的是把一些有side effect的指令中那些隐藏信息都explify出来,比如,你在做加法的时候有可能会影响那些flag寄存器,通过中间语言,“这些寄存器可能也会被改变”这样的信息就会明确表达出来。有可能一条disassembly对应几条中间语言的语句。&br&&br&还原完变量和变量的type,就要开始还原程序的真正结构了。&b&还原真正结构还是很难完全正确。&/b&比如这样的一个control flow graph:&br&&br&x &-&br&|
|&br&x &-----&br&|
|&br&x __|
|&br&x_____|&br&|&br&v&br&...&br&&br&这种结构只能用goto语句来表达。evaluate反编译的其中一个指标是goto指令。&b&反编译越少使用goto指令,说明结构更明晰,也就被认为反编译的效果更好。但是这个指标是有问题的,稍后再说。&/b&&br&类似于上面的很难用for/while循环和if-then-else表达的结构在现实的binary中很多。&br&&br&嗯,最后再说反编译的evaluation问题。首先,goto语句的多少并不能完全客观地衡量反编译的效果如何。有可能源代码自带goto呀,有可能源代码其实写的时候很挫啊,你反编译完还优化了本身的代码能。谁能定夺?其次,很难有自动的办法来评价本来的代码和反编译完的代码是equivalent的。如果原来的代码是while,反编译完的代码用for,是不能说反编译完是错的。所以反编译的evaluation也一直是一个值得探讨推敲的话题。&br&&br&就酱。写得比较散比较跳,大家见谅。
回答一下一个比较specific的问题:为什么C不容易反编译。 首先,明确定义一下问题。反编译的input是可执行程序,在这个帖子里我会叫它binary。output是C代码。 binary是电脑执行的一行行指令。所以我们会想,先把binary还原成指令。这个过程叫做disassembli…
谢邀(终于用上这个高大上的词汇了,真的有点小激动呢)&br&&br&WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。&br&而且封装得也不完全,还是随处可见 HWND HDC之类的东西。&br&用途主要是写一些很小的程序,或者作为其他UI框架的后端实现部分,比如我写过一个小框架用来做安装卸载程序,非常小,其中创建管理窗口部分是用WTL的。&br&&br&MFC是更高级点的Win API封装,比WTL封装彻底,很难见到HWND HDC了,也提供了不少实用工具类,比如高级控件,泛型容器,IO访问,网络协议等。除此之外,还提供了一些基本框架,比如 Document/View,这就是个MVC的简化版本,只有MV,但是对于数据的管理,消息的传递等又没有什么约束,导致Doc/View被用得乱七八糟。尤其是对事件处理的模型,消息映射是功能简陋,而且容易出错的方式,唯一优点是性能好。 从VC++ 1.X就有MFC了,那时整个UI界的设计思想都比较落后(除了Apple),MFC又背负了沉重的兼容性包袱,比如vc++ 1.52的MFC程序到了vc2003稍加修改都可以编译,导致MFC后期没有什么发展,就是沿着老的思路完善了些细节,添加了些组件,但是根本性的设计问题没有改进。&br&&br&GTK,这个吃了语言的亏,用C写面向对象实在是痛苦,虽然在思想上比MFC要先进了些,但是写出来的代码比MFC要罗嗦很多了。相比MFC,多了Layout的概念,事件处理上有了Signal/slot,虽然用起来很麻烦。&br&&br&wxWidgets,这个基本就是个跨平台的MFC,对各个平台的差异做了抽象,实际上后端大多还是用平台原生的API实现,好多控件都是直接用系统原生的。有wxWidgets for GTK+的版本,后端就是GTK+,wxWidgets就是一层壳。这也是wxWidgets的优点,它编译出来的程序发行包比较小,性能也不错。&br&&br&以上这些就是上世纪90年代的UI Framework技术水平了,至今它们也依然没有太多进步。&br&下面来谈谈21世纪的技术。&br&&br&Qt,虽然它也是上世纪90年代出现的,但是它在21世纪有了长足的进步。应该说它的起点就比较高,一开始就定位跨平台,而且不满足于简单封装系统API,而是要自己创造出一套完整的API和框架,甚至要代替系统API,所以不仅仅是做UI,而是涉及到了APP开发所用到的所有东西,包括网络,数据库,多媒体,脚本引擎等。signal/slot是Qt发明的,这是事件通知模型里C++语言的最佳实现了,甚至我都觉得这该写进C++标准,估计C++委员会的老顽固们是从不写GUI的。&br&早期的QT也是没有DirectUI的概念的,每一个QWidget都对应一个原生窗口,从Qt4.4开始,只有顶层QWidget才是原生窗口,而Child Widget是Alien Widget,只是个抽象的图层不对应原生窗口,这就实现了DirectUI的概念,很多图形效果也就变得可能了,比如窗口层叠透明效果。&br&在4.8后实现了QPA(Qt Platform Abstraction),这就使移植Qt变得很容易,目前Qt是支持平台最多的框架没有之一。&br&由于早期授权的问题,Qt对于开源社区不是很友好,导致推广不太顺利,直到它改成了LGPL方式,如果Qt能早点想开了,恐怕就没有wxWidgets的生存空间了。&br&Qt的缺点也是有的,就是太大,不过可以自己剪裁,我可以把QT库剪裁到发行包压缩后2.5MB。&br&&br&WPF,微软在Win Form的思路上走到死胡同后,终于痛下决心用正确的方法开发UI库了。21世纪的UI一定是定义出来的,绝对不能是代码写出来的,所以有了XAML这个强大的定义工具,不但可以定义UI布局,还包括图形动画效果,消息响应方式等。配合C#这种优秀的语言,更是如虎添翼。但是问题也很明显,就是过于庞大,不仅开发时要用到庞大的IDE和设计工具,发行的安装包也十分巨大,所以目前还是很少有人拿他写通用软件客户端的,大多是做企业项目时写专用客户端。&br&大概4-5年前吧疼讯曾经用WPF写了个QQ,但是只实现了基本功能就已经比C++客户端大好多了,而且运行缓慢,主要是太吃内存,而且那时WPF的优化还不充分。&br&&br&最后我想补充下真正的UI库之王,cocoa。&br&Apple的成功有很多原因,其中之一就是cocoa,cocoa理念十分先进,而且出来得早,我都怀疑Qt和WPF有不少思想都是借鉴cocoa的。&br&定义式的UI,用xib就可以定义UI的绝大部分细节,而且提供所见即所得的可视化设计工具。&br&严格的MVC,而且定义非常清晰,分工明确。&br&signal/slot,虽然不叫这个名字,但思想就是,而且真的是拖动鼠标就能connect。&br&提供了ARC,闭包和反射,给UI开发带来巨大的便利性,当然这得益于Objective-C这个语言。&br&&br&再补充下 Borland的OWL和VCL。&br&我是从Borland C++3.0和Delphi 1.0开始用的,那时的Borland看来很有前途的,可惜后来一系列决策失误导致现在这个公司几乎消失了,同学们不要再往这个坑里跳了。&br&OWL曾经和MFC是竞争对手,设计思想也差不多,个人感觉OWL的API设计更优雅一点,但是在市场上OWL被MFC彻底击败。&br&Delphi是神作,它在RAD(快速应用开发)领域长时间没有对手,直到BS架构取代CS架构。Delphi的特点就是简单、开发快,单纯就写个基本可用的应用来说,可能至今都没有比他更快的,但是缺点就是丑,基本大多数Delphi应用都是一大堆控件堆积在一起,很不美观,另外由于Pascal语言的限制无法和现有大量的C/C++代码融合。虽然后来有C++ Builder,但是Builder里简单和快的优点也消失了。Borland的C++编译器越做越差,导致后来开源项目都不太愿意兼容这个编译器了。&br&VCL准确地说不是UI库,而是一套组件接口规范,类似COM ActiveX。delphi和C++builder都是基于这个规范构建了基础库。&br&&br&UI库是个很大的话题,够写好几本书来探讨的,我这里就是随便写点自己的感受。&br&单纯讨论每个库的优劣是没有意义的,而是要放到具体的应用场景里来看,每个库都有自己擅长的场景。&br&&br&如果仅在Windows下,追求程序小巧,用WTL,不足的地方自己实现去吧,但是视觉效果就呵呵了。&br&如果可以大一点,还要好看点,那就Qt。&br&如果完全不在乎大小,只要视觉效果华丽,就用WPF,如果把开发工具价格也考虑进来,那么土豪才会选WPF呢。&br&MFC就是个鸡肋了,除非你现有的工程师不会用别的,或者有历史遗留代码要保持兼容。&br&&br&如果要求跨平台,那么就用Qt,wxWidgets和GTK+跟现在的Qt比起来没有什么优势了。&br&&br&如果是iOS Android,那么最好用原生UI库,除非你写游戏。
谢邀(终于用上这个高大上的词汇了,真的有点小激动呢) WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码…
回答之前说明一点,三星并非拥有什么火星科技,其技术水平也都在行业平均水平(某些方面还是不能和Intel抗衡)。三星的主控也并非业界翘楚,强大的主控也有很多(比如SF)。使三星&b&看起来比其他SSD厂商成功&/b&的原因是三星有着足够性价比的部件(注意,这句话只能说明三星的成本低利润率高,并非代表价格一定会比任何厂商都低)和一个比较拉风的外壳(至少三星SSD正面的那个小方块带来了一定的品牌辨识度)和强大的营销网络,在正确的产品策略指导之下走出了自己的路子。在这里具体解释一下为什么三星的SSD会受到欢迎。&br&&br&首先,三星的SSD从830开始为人所知,到840时代开始分化市场,840加速普及,840 Pro在性能上更进一步。个人认为830和840 Pro之所以受欢迎是因为它们第一具有品牌效应(Samsung LOGO加成),第二是它们都是没有明显硬伤和大规模质量问题的产品。这两点是以上两者受欢迎的原因(Intel的SSD还曾经有过8M门),并非因为什么火星科技。下面的回答我主要想说的是840和840 Evo,因为这两者是真正意义上的普及产品(不过有一点,因为现在840 Evo的价格还没有公布,所以价格暂时无法评论,不过估计单位容量的价格应该会与840相当甚至更便宜)。&br&&br&然后,消费级市场非常重要的一个因素就是价格。而三星从主控到NAND全部可以自己生产,首先具备了相对大多数厂商的成本优势,而从840开始三星在入门级SSD上使用了TLC闪存后更进一步增加了这种优势。现在淘宝上840同价位上的MLC SSD都比840的容量少了一半,当然这些MLC的SSD在性能上都是同级别的王者,但是这种格局势必导致对性价比非常敏感的用户转向840,而这样的用户就是为840创造销量的一个重要来源(更何况三星自己还有840Pro作为性能上的旗舰级产品)。再加上三星自己的营销网络远强于其他SSD厂商,相比其他对手优势确实非常明显。(&u&&b&如果你嫌上面这个自然段有点长,那么就总结成一句:三星的成本更低性价比更高以及营销强大。&/b&&/u&)&br&&br&老实说,三星上代旗舰830口碑确实不错,840Pro也不错,这两款SSD都是基本没什么明显硬伤没爆发过大规模质量问题的产品,但是围绕840产生的争议就很多了。&br&&br&围绕840产生的争议无非两点:一是对TLC耐久度的质疑,二是对TLC性能的质疑。&br&&br&确实,TLC的性能和耐久度都远不如MLC,如果和SLC比耐久度的话更是差了两三个数量级(一千对十万)。而性能因为TLC的结构更加复杂导致相对MLC也仍然有相当的下降。&br&&br&但是,这里有一个很重要的问题,就是用户到底需要多久的寿命?&br&&br&一般情况下,一个普通用户一年能够使用的写入量大概为100P/E(P/E指的是闪存的编程擦写次数,这里可以简单地理解为实际写入数据除以磁盘容量后所得到的比值),这是中等使用情况,重度的话可能有500P/E甚至更多,但是即使如此,一块1000P/E的840仍然可以挺过两年,而840有3年质保。更何况还有网友测试7*24小时写入结果写进了3000P/E才把840写挂,如果真的能有3000P/E的寿命的话,重度使用可以使用五六年,而中等程度使用甚至能用30年!而三十年后,我们还会用到这块硬盘么?也许三十年后的新技术会让这块硬盘显得土得掉渣。而一般用户在3-5年后都会考虑换下一台新电脑。&br&&br&所以三星认为1000P/E的TLC是可以满足大部分消费者的需求的。而且使用了低价的TLC,还可以使得自己的产品更具价格优势,还能加速普及SSD。(&u&&b&如果你嫌以上两个自然段有点长,那么总结成一句:价格够低而且一般消费者也就能用三五年,不必在乎它用不到的那部分寿命&/b&&/u&)&br&&br&现在,寿命问题我们可以认为是解决了,那么还剩下一个关键的问题就是速度。&br&&br&840时代因为主控算法不够先进,NAND性能没有进步,所以导致性能不强。但是840 Evo发布以后我们发现三星在入门级SSD上也开始注重性能了。三星给840 Evo的主控芯片提升了相当幅度的频率,同时引入了更大的缓存(1TB型号的Evo缓存大小1GB),采用了更新速度更快的128Gb NAND,同时采用了早先OCZ就已经采用过的SLC Cache模式。这个模式下,多块TLC会被模拟成一个SLC来用,这样的好处有二:一是部分达到SLC SSD的性能,二是可以分摊对NAND的写入,有效延长TLC的寿命。坏处亦有二:一是初期听着不好听并且会给用户造成厂商没节操的印象,二是一旦空间写满了没有空闲NAND可做SLC Cache来用的话真实性能就原形毕露了。不过三星赌的是几乎没有用户能够真正把盘完全填满(实际利用率平均下来大概就是70%,有这些空间的话还是做得了SLC Cache的),既然不会填满,那么坏处就全没了。何乐而不为?(&u&&b&嫌这段话长的话就看这四个字:性能够用&/b&&/u&)&br&&br&另外一个问题就是容量了。现在SSD和HDD的价格比一直走低,500GB的HDD和SSD的价格比大概在1:5左右,可以预见随着摩尔定律的进步,10nm的FLASH逐渐普及,这个价格比还会继续下降。&br&&br&总结,三星的SSD之所以受欢迎,是因为三星把握住了消费级用户的四个够用需求:&b&寿命足够,价格够低,性能够用,容量够大&/b&。可以说三星现在SSD的壮大主要应该归功给840。所以虽然840的系列产品在玩家圈很有争议,但是对于大多数性能要求不高但是对性价比很敏感的用户来说,还是很受欢迎的。&br&&br&PS,作为一名普通用户,只要知道SLC,MLC,TLC,QLC性能和耐久度逐级递减,这就足够了。&br&&br&PPS,关于SLC Cache模式,具体可以参考&a href=&///?target=http%3A///1/269/269618.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三星840 EVO写入性能暴涨的秘密&i class=&icon-external&&&/i&&/a&一文,在回答中限于篇幅只简要概括下结论。
回答之前说明一点,三星并非拥有什么火星科技,其技术水平也都在行业平均水平(某些方面还是不能和Intel抗衡)。三星的主控也并非业界翘楚,强大的主控也有很多(比如SF)。使三星看起来比其他SSD厂商成功的原因是三星有着足够性价比的部件(注意,这句话只能说…
首先简单说一下SSD的特性:在SSD中,Page为最小的读写单位,Block为最小的擦除/编程单位,其中1个Page为4KB,1个Block由256个Page组成,1个Plane由2048个Block组成,2个Plane组成1个Die,也就是最小的芯片(4GB)。假如写入的Page有内容,即使是一个字节,也需要擦除整个Block,然后再写入这个Page的内容,这个就是SSD的写入放大问题;同时,SSD主要使用MLC SSD芯片,该芯片可以擦写1w次(SLC可以擦写10w次,但是价格太高使用有限),所以对于频繁地擦写很容易造成SSD损坏。&br&因此根据SSD的特性就决定了SSD的使用方式应该和普通HDD(SATA、SAS)盘有所区别,同时也应该进行相关的优化。这方面有两个非常值得一看的成果:第一个是三星的F2FS(上面已经有人提到了),F2FS是一个log-structured file system,F2FS针对LFS的结构、wandering tree和cleaning penalty做了很多优化,是一个优秀的针对NAND Flash开发的文件系统,Linux kernel 3.8以后的内核都包含了该文件系统;第二个是俄亥俄州立大学张晓东教授的研究论文“Hystor: making the best usage of Solid State Drives in high performance storage systems”,提出了SSD与HDD的混合优化存储方案,主体思想就是根据文件访问频率和文件大小的关系将文件分别存储到SSD和HDD中,获得非常卓越的性价比回报,目前已经应用到了上面提到过的Apple Fusion Storage(&a href=&///?target=http%3A//engineering.osu.edu/news/2013/04/computer-science-research-ohio-state-makes-impact-apples-hybrid-storage-productNetApp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&News | COLLEGE OF ENGINEERING&i class=&icon-external&&&/i&&/a&) &a data-hash=&b3be6c051833eaa074003& href=&///people/b3be6c051833eaa074003& class=&member_mention& data-hovercard=&p$b$b3be6c051833eaa074003&&@齐亮&/a& 和NetAPP Fusion Storage(&a href=&///?target=http%3A//www.cse.ohio-state.edu/%7Ezhang/NetApp-hAggregates-2012.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&cse.ohio-state.edu/~zha&/span&&span class=&invisible&&ng/NetApp-hAggregates-2012.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)等公司的商用存储系统中,我们自己开发的文件系统也借鉴了这种思路,效果非常明显。&br&SSD是一个好东西,但需要用对用好,才能获得最大的性价比回报。
首先简单说一下SSD的特性:在SSD中,Page为最小的读写单位,Block为最小的擦除/编程单位,其中1个Page为4KB,1个Block由256个Page组成,1个Plane由2048个Block组成,2个Plane组成1个Die,也就是最小的芯片(4GB)。假如写入的Page有内容,即使是一个字节,也…
最后更新于, 15:50&br&本文是12306和招行的软文,脑残黑请出门右拐。&br&&br&&br&正确。&br&&br&&b&未经用户许可&/b&偷偷添加根证书信任是非常严重的行为!&br&&br&关键点在&b&未经用户许可&/b&,这种行为好比,&b&你请支付宝到你家来做客,结果他把你家的钥匙给偷偷配了一把&/b&。&br&&br&&br&&b&作为支付宝,请求用户信任其颁发的证书,是合理的!&/b&&br&&br&但是偷偷的跟用户的保安说,这用户是我的哥们儿,以后我介绍的人你就不要盘问了,这种行为怎么说都不为过。&br&&br&由此可见,中国的互联网主要都是一群&b&毫无节操&/b&的公司。不要使用任何&b&请求系统权限&/b&的所谓&b&安全&/b&控件,才能真正的保证您的&b&安全&/b&。&br&&br&&br&未经用户许可,利用安全控件窃取系统权限,安装根证书的行为,&b&毋庸解释,流氓无疑&/b&。所谓安全目的,均是&b&障目之术,毫无节操&/b&。(我在我电脑上就没有发现招行的根证书颁发机构)。&br&&br&在这一点上,就连12306都比较有节操的让用户自行下载和安装,并且有其“正当目的”(HTTPS+CDN)。&br&&br&&br&下面有人评论说怎么能证明这个证书就是支付宝弄的。&br&很简单,先删除这个证书,然后到下面的地址下载支付宝的安全控件:&br&&a href=&///?target=https%3A///sc/aliedit/intro.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&安全中心 - 支付宝&i class=&icon-external&&&/i&&/a&&br&然后安装,就会发现&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&的证书赫然出现在&b&受信任的根证书颁发机构&/b&。&br&&br&证书截图:&br&&img data-rawheight=&667& data-rawwidth=&484& src=&/bc2fa3ceaa5f01c9c3031_b.jpg& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&/bc2fa3ceaa5f01c9c3031_r.jpg&&&br&&br&&br&事实上这个证书是毫无必要的,因为即使删除这个证书,支付宝依然能够登录,除了&b&开后门,几乎没有别的解释!&/b&&br&&br&&br&&br&&br&&br&&b&证书这货到底是什么东西:&/b&&br&&br&在早期的互联网时代,我们的网站、软件,都是依赖于我们&b&自己的信任&/b&而使用的。&br&&br&例如我有一套游戏的安装程序,你从我这边拷贝过去,然后安装玩。你之所以认为这个程序能够安装游戏而不是把你的硬盘格了,完全是依赖于我告诉你的。&br&&br&网站也是同理,我知道&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&这个地址是招商银行,是因为招行营业厅的MM告诉我的,我信任营业厅的这个MM。&br&&br&这种信任是非常薄弱和糟糕的,病毒、木马就是在这种环境下肆虐横行。你从我这边拷贝的游戏安装程序,可能已经被病毒侵袭,它当然还是可以安装游戏,但同时也会安装病毒!&br&&br&营业厅的MM有可能是招行的员工,也可能是个卖保险的。尽管她大概不会给我一个钓鱼的网站,但是经常会给我推销一些完全用不到的保险啥的。&br&&br&&br&在继续讨论之前,我要引入一个新的概念,&b&信任链&/b&。&br&&br&拿刚才的例子来说,你从我这边拷贝了一份游戏的安装程序。信任链是这样的:&br&你信任我,我是你的朋友,我没必要害你&br&我信任卖光盘的,他是个卖光盘的,没必要给我装病毒&br&卖光盘的信任刻光盘的&br&刻光盘的信任下载的网站&br&下载的网站信任上传的用户&br&上传的用户信任分发该份拷贝的盗版组织&br&…………&br&&br&很显然,这么长的一个信任链,中间出现问题的可能性是非常大的。可以说,&b&信任链越长,就越不安全&/b&。&br&&br&同时,因为这一份程序在这么多人之间拷贝分发,任何一个环节感染病毒,都会导致下游所有的环节感染病毒。&br&&br&&br&&br&&b&证书是如何解决这两个问题的&/b&?&br&&br&证书有两个功能:&br&1、&b&身份标识&/b&,证明这个网站/软件/其他的发布者是谁(如微软、UBI、Google、招行)。&br&2、&b&数字签名&/b&,确保这个网站/软件/等等的内容没有被任何人篡改。&br&&br&第一个功能解决了信任链的问题,通过证书,我们的信任链可以变得非常的简单:用户 &b&信任&/b& 发行者。&br&例如一个英雄无敌V的游戏安装程序,如果&b&它是使用正确的UBI的证书签名&/b&的,那么我就可以完全的&b&信任&/b&这个程序,可以给我安装一个英雄无敌V的拷贝。&br&&br&第二个功能则杜绝了在分发过程中被篡改,植入病毒和木马的可能。&br&同样是这个英雄无敌V的游戏安装程序,只要他是被正确的UBI的证书签名了,那么不论我是从盗版光盘上拷贝还是从某个不知名的下载网站下载的,我都可以放心的知道,这个和UBI发售的光盘上的东西是一模一样的。&br&&br&&br&&br&&b&那么,我是怎么知道这个证书是UBI的呢?换言之,我是怎么知道哪个证书是正确的UBI的证书,而不是隔壁王二狗子自己冒充的呢?&/b&&br&&br&这就依赖于&b&证书颁发体系&/b&了。&br&&br&几乎网络上所有的证书(除去用于个人用途的自签名证书以及根证书颁发机构的证书),都是由某个&b&证书颁发机构&/b&颁发的。证书颁发机构负责&b&核实证书申请者的真实身份&/b&(例如我们公司网站申请SSL证书就需要提交公司营业执照的影印件,还有证明自己拥有网站域名的材料),以及吊销被泄漏和滥用的的证书。&br&&br&也就是说证书颁发机构,就是证书&b&所有者身份的确认人&/b&。一旦你信任了某个证书颁发机构,就等于&b&信任了这个证书颁发机构所颁发的所有证书的身份确认信息!&/b&&br&操作系统&b&只会把确认好的身份信息展示给你!&/b&&br&&br&&br&&br&&b&神马是根证书颁发机构?&/b&&br&&br&证书颁发机构和域名一样,是一个树状的结构,全球有为数不多的几个根证书颁发机构。这些根证书颁发机构轻易不颁发证书,因为一旦根证书颁发机构的证书被泄漏,所有直接间接的证书,都会受到严重的影响。&br&&br&所以,根证书颁发机构一般授权二级证书颁发机构颁发证书,一旦信任一个根证书颁发机构,等同于&b&信任其下所有颁发的所有证书&/b&,以及&b&其授权的二级证书颁发机构颁发的所有证书&/b&。&br&&br&更为严重的事情是,根证书颁发机构,是整个证书颁发体系中,&b&唯一不受任何身份验证的&/b&。其身份的正确性,&b&由其自行保证!&/b&也就是说,&b&根证书颁发机构可以宣称自己是任何一个公司,没有任何人和组织可以对其进行审查!&/b&&br&&br&&b&换句话说,支付宝要更没节操点,给你弄个自己签发的VeriSign的根证书装你电脑里也没商量。&/b&&br&&br&事实上,根证书颁发机构是整个证书体系中,最薄弱的环节。这就是为什么上次微软在操作系统中内置CNNIC这个流氓的根证书引起了网络上广泛的质疑。&b&根证书几乎只能由操作系统内置,通过操作系统安装程序二进制代码的安全来确保正确&/b&。&br&&br&&br&&br&下面是一个正确的证书的栗子:&br&&img data-rawheight=&667& data-rawwidth=&484& src=&/cac46af962da7c1d0e36_b.jpg& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&/cac46af962da7c1d0e36_r.jpg&&这个就是支付宝网站的SSL证书。&br&&br&可以看到,这里是证书路径的界面,其中指出了这个证书的颁发者:&br&颁发者是VeriSign Class 3 Secure Server CA - G3&br&颁发者的证书是受根证书颁发机构VeriSign Class 3 Public Certification Authority - G5 &b&信任&/b&的&br&&br&VeriSign Class 3 Public Certification Authority - G5&br&就是全球为数不多的几个根证书颁发机构之一。&br&&br&&br&所以自行添加根证书这种行为,完全可以视同&b&是木马!是后门!甚至是更严重的行为!&/b&&br&尤其是在现代互联网和操作系统中,这种行为是&b&从根本上动摇系统安全&/b&的行为!&br&&br&&br&&b&&br&支付宝是怎么做到的?&br&&/b&&br&事实上要注入受信任的根证书颁发机构,是需要系统管理员的权限的,所以当安装安全控件的时候,系统会提示这货在请求系统管理员权限(Windows Vista及以后的版本正确配置UAC的环境下):&br&&img data-rawheight=&267& data-rawwidth=&466& src=&/daaffbbf2da7e1_b.jpg& class=&origin_image zh-lightbox-thumb& width=&466& data-original=&/daaffbbf2da7e1_r.jpg&&&br&当你看到这个界面的时候,请注意,你在打开潘多拉的盒子。一旦你点击是,那么这个应用将获得系统管理员的所有权限,对你的系统偷摸摸的更改而无需你的确认。&br&&br&请谨慎使用任何请求系统管理员权限的应用。事实上如果每次遇到这个对话框你都点击否的话,你的电脑被安装病毒木马的可能性几乎是零。&br&&br&&br&&br&&b&&br&我该怎么做?&/b&&br&&br&对于这种没有节操的行为,最好的办法就是把他们永远的封印起来,让他们永不超生。&br&&br&打开Windows运行,然后输入mmc回车,&br&此时会看到一个智能控制台的界面:&br&&img data-rawheight=&559& data-rawwidth=&966& src=&/4ee4ce838466_b.jpg& class=&origin_image zh-lightbox-thumb& width=&966& data-original=&/4ee4ce838466_r.jpg&&&br&选择&b&文件&/b&菜单中的&b&添加/删除管理单元&/b&功能。&br&在弹出的窗口中找到证书,并添加。&br&在弹出来的界面上选择本地计算机账户:&br&&img data-rawheight=&537& data-rawwidth=&620& src=&/b6d5fd609fd512_b.jpg& class=&origin_image zh-lightbox-thumb& width=&620& data-original=&/b6d5fd609fd512_r.jpg&&&br&完成后,在&b&受信任的根证书颁发机构&/b&中,找到这个臭流氓:&br&&img data-rawheight=&559& data-rawwidth=&966& src=&/e388ef481a3da09e7d2a_b.jpg& class=&origin_image zh-lightbox-thumb& width=&966& data-original=&/e388ef481a3da09e7d2a_r.jpg&&&br&把它拖拽到&b&不信任的证书&/b&下面的&b&证书&/b&文件夹去。。。。。&br&&img data-rawheight=&667& data-rawwidth=&484& src=&/2acdcf0ccf1dbf3dd9b773eff474cca9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&/2acdcf0ccf1dbf3dd9b773eff474cca9_r.jpg&&然后他就不能再耍流氓了,,,,&br&&br&&br&不过要谨记,你可以把他扔到不信任的区域,流氓也能自己再弄出来,或者用安全恐吓,功能缺失来威胁用户。对待这种情况,要坚决的&b&say no!&/b&&br&&br&事实上我把这个证书给干掉了,支付宝屁事儿没有。&br&&br&&br&&br&&br&最后纠正一下其他答案的几个误区:&br&&br&&b&1、注入一个根证书不过是能发起中间人攻击,危害不大。&br&&/b&&br&&b&HTTP SSL加密只是证书的其中一个用途!&/b&证书在现代互联网和操作系统中的应用会越来越广泛,在可预见的将来,所有的程序、邮件、文档,全部都会使用证书加密,确保其在传输、分发过程中,不被篡改。确认发行者的身份。&br&&br&事实上三大智能手机平台的应用,就是用证书来确保分发不被篡改的。&br&&br&&br&&b&2、注入根证书颁发机构是为了自己的加密用途,是合理的。&/b&&br&&br&事实上,支付宝的网站,有合法的被信任的证书(上面有截图),所以没有必要自行颁发证书。并且,如果是自行加密用途,可以在服务器记录公钥私钥即可。并没有必要颁发证书来完成安全用途。&br&&br&还有所举的那些银行网站,都是一堆没有节操的公司。招行就没有安装任何证书,我使用招行专业版好好的。&br&&br&&br&&br&&b&证书具体有些什么用途?&br&&/b&&br&HTTP SSL加密(即HTTPS协议)是证书目前最为广泛的一个用途。通过服务器SSL证书的身份验证,我们可以确认我们访问的服务器是正确的网站。涉及到资金和帐号的网站,一般都使用HTTPS协议,例如支付宝、网上银行、Google登录等。&br&&br&同时,HTTP SSL加密可以确保浏览器与服务器之间的通信,不被任何第三方窃取和监听。这保障用户数据的安全,所以Gmail目前已经全面使用HTTPS协议。&br&&br&&b&中间人攻击&/b&,仅仅是根证书污染可能造成的威胁之一,也是上次CNNIC证书加入到根证书中人们所最担心的事情。&br&&br&简单来说,中间人攻击的主要目的是窃取HTTPS传输过程中的内容。&br&&br&具体的做法是通过网络劫持(网络运营商非常容易做到,如电信联通),在用户与目标网站之间加设代理服务器。由于HTTP协议传输过程中是不加密的,所以可以窃取所有传输的资料并进行篡改。&br&&br&&b&事实上电信一直在干这事儿,莫名其妙的电信广告弹窗就是这样冒出来的。&/b&&br&&br&但由于HTTPS协议使用了证书对传输过程进行了&b&加密&/b&,并且对服务器进行&b&身份验证&/b&,所以简单的网络劫持加设代理便宣告无效。&br&&br&但如果此时,由某个用户信任的根证书颁发机构,给这个加设的代理服务器进行&b&身份认证&/b&,并提供传输加密。&b&那么用户通过HTTPS协议访问网站时不会有任何的异样,而以为是安全的&/b&。&br&&br&所以CNNIC根证书为什么会受到广泛的质疑,就是&b&因为这个机构和中国电信是一个窝&/b&的。故而大家非常担心他会串通电信进行&b&中间人攻击&/b&。&br&&br&&br&&br&&b&钓鱼网站伪造&/b&,尽管中间人攻击可以直接窃取用户传输的内容,如帐号密码,但是中间人攻击仍然需要对网络进行攻击来加塞代理服务器。&br&&br&而伪造一个钓鱼网站,例如什么&a href=&///?target=http%3A//.cn& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&.cn&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&则简单的多。证书颁发机构可以&b&可以确认这个网站的身份&/b&,即使你对这个钓鱼网站存疑,但是如果浏览器告诉你这个网站是&b&安全&/b&的,你会怎么做呢?&br&&br&&br&&b&伪造程序签名&/b&,证书不仅仅可以确认网站的身份,以及进行传输的加密,也可以确认应用程序发布者的身份,并让你信任它。&br&&br&这是一个经过签名的应用程序请求系统权限的时候的提示:&br&&img data-rawheight=&289& data-rawwidth=&466& src=&/345e9b8d05dbfe7ed7cef_b.jpg& class=&origin_image zh-lightbox-thumb& width=&466& data-original=&/345e9b8d05dbfe7ed7cef_r.jpg&&&br&&br&可以看到,与上面支付宝的控件请求系统权限不同,这个提示的底色已经变成了蓝色,表示这是操作系统信任的一个程序,点击查看证书信息,我们可以看到这个应用程序的证书:&br&&img data-rawheight=&667& data-rawwidth=&484& src=&/9ea34cd7_b.jpg& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&/9ea34cd7_r.jpg&&&br&这个证书可以确保这个应用程序是由Disc Soft Ltd公司发布的,并且没有被任何第三方篡改过。这意味着,这个程序包含病毒的可能性取决于Disc Soft Ltd这个公司的节操。当然一般国外软件公司的节操我还是信得过的。所以我可以放心的点击是。&br&&br&而这个Disc Soft Ltd公司的&b&身份验证&/b&,则是由上面的根证书颁发机构来确认的。&br&&br&&br&&b&其他许多场景&/b&&br&在最后,我想再次强调一下,&b&证书,是现代软件和互联网行业,最为简单便捷的确保安全的方案&/b&。其广泛运用于:&b&软件、网站、邮件、文档等等等等的加密和验证领域&/b&。&br&&br&尽管证书的应用目前并不广泛,但是&b&证书却是未来互联网的信任的基石&/b&。&br&&br&而这个基石的基础,就是用户对根证书颁发机构的&b&绝对信任!&/b&&br&&br&请注意我这里使用的是&b&绝对信任&/b&,因为,根证书颁发机构的证书,不能被任何组织或机构所验证,因为几乎一切互联网上的验证机制,都是通过证书体系来完成的。&br&&br&我举一个栗子,我如何验证我电脑上的这个VeriSign的根证书是正确的?我们可以想出很多种办法:&br&&br&&b&1、直接问我,或者问某个安全领域的砖家。&/b&&br&你怎么知道我或者砖家不会骗你?万一我收了别人的钱呢?或者我也被人骗了呢?&br&&br&&b&2、去VeriSign网站查询。&/b&&br&你怎么知道这个网站是VeriSign的?有HTTP,有绿色的小锁?问题是这些都是基于你所信任的根证书的。如果你的根证书是假的,他肯定会弄个假的网站给你认证了,反而把那个真的网站给认证成不安全的。&br&&br&&b&3、去第三方网站下载证书的校验码。&br&&/b&哪个网站是可信的?没有证书的情况下,所有的网站都可能被劫持,被篡改。&b&&br&&br&所以对于根证书的绝对信任,构建了整个证书体系,也是整个互联网的安全体系。&br&而支付宝不告知用户自动安装根证书的行为,是从根本上破坏互联网安全的行为!&/b&&br&&br&&br&&b&&br&那么,如果支付宝不干坏事,我信任支付宝,是否这个根证书就毫无风险?&/b&&br&&br&不是的,整个互联网和软件的安全,构筑在对根证书的&b&绝对信任&/b&上。任何一个根证书的植入,都给用户带来了一分威胁。即使支付宝不干坏事,&b&但如果支付宝的这个证书的私钥哪天被泄露了,后果会怎样?!&/b&&br&&br&&b&你信任支付宝,但你信任支付宝对别人的认证&/b&么?&br&说到这里淘宝天猫卖家要笑而不语了。。。。&br&&br&&br&&br&最后解答一下,为什么说支付宝这种行为,比起12306来说更为恶劣,因为12306也要求安装根证书才能用啊。两点:&br&&br&1、这个根证书对于支付宝的使用不是必需的,而对于12306而言,在某种程度上是必须的(否则浏览器会自动阻止12306网站的HTTPS访问)。&br&&i&当然,事实上12306也有麻烦自己的方案,但是国企&b&你懂的&/b&。&br&&/i&&br&2、12306是让你自行决定安装与否,这样,在使用后,你可以自行卸载或作相应处理,支付宝是强行安装,完全没有告知。&br&&br&这好比,12306是给你家做装修的装修队,他说我们在这里搞装修要一个多月,你把门钥匙给我,跟门口的保安说一声让我们进来,我们好出去买材料,出出进进的方便。&br&&br&支付宝呢?支付宝是你请他来你家后,转身就把你家的门钥匙配了一份,还偷偷跟你保安说,那个用户是我哥们儿,他让我随便进,还有我的朋友,也可以随便进。&br&&br&&b&尽管12306这种麻烦自己不如麻烦用户的的行为不值得提倡,但是支付宝这种不麻烦用户,把用户家当自己家的行为,则是更为无耻,没有下限的行为。&/b&
最后更新于, 15:50 本文是12306和招行的软文,脑残黑请出门右拐。 正确。 未经用户许可偷偷添加根证书信任是非常严重的行为! 关键点在未经用户许可,这种行为好比,你请支付宝到你家来做客,结果他把你家的钥匙给偷偷配了一把。 作为支付宝,请…
《乔布斯传》里有这样一段话:&br&&blockquote&“史蒂夫总体上认为与自己相比,比尔稍逊一筹,尤其是在品味和风格上。”安迪·赫茨菲尔德说到“比尔瞧不起史蒂夫是因为史蒂夫不会编程。”&/blockquote&我觉得乔布斯还是会一些编程的,我看过的所有的和乔布斯相关的视频中,见他演示过两次简单的编程,只是不知道他是在一个什么水平。&br&&br&下面的回答中那句“乔布斯对编程有很深的理解”是我说的,我看了一下别人的回答,我说错了。要是当时说“有一些理解”可能会好很多。&br&&br&原答案:&br&Quora上有一个赞同数超过10K的回答,很好地解释了为什么说乔布斯对编程有很深的理解。&br&问题是,什么是面向对象编程?&br&Amogh Talpallikar的回答:&br&&blockquote&在乔布斯之前,我还没有见过有人能对面向对象编程做出这么恰当的解释。乔布斯从来没有接受过正式的工程训练,但是他对自己所做的事总是有非常清楚的认识,无论是对技术、设计还是艺术。&br&&br&1994年《Rolling Stone》采访:&br&Jeff Goodell:你能用通俗易懂的语言解释一下,什么是面向对象编程吗?&br&&br&乔布斯:对象像人一样,也是活生生的生命。他们有储备的知识,知道怎么完成任务,他们有记忆,能把发生的事情记下来。而你和他们的互动并不是低层次的,而是在一个高度抽象的层面上互动,就像我们现在的对话一样。&br&&br&我给你举个例子:如果我是你的洗衣对象,你给我你的脏衣服,然后给我一个消息说:“把我的衣服洗干净。”我知道旧金山最好的洗衣店在哪里,而且我说英语,我的口袋里有钱,所以我出去打出租车,告诉司机带我去这个地方。我拿着你的衣服去洗干净,然后再打车回到这里,把洗好衣服还给你,说:“这是你的干净的衣服。”&br&&br&你并不知道我是怎么做到的。你不知道哪个地方洗衣服好,也许你说法语,或者你兜里没钱,连车都打不了。但是我知道如何去做,而你不需要知道任何细节。所有的这些复杂的流程都隐藏在我的内部,我们在一个高的抽象层次上进行交互,这就是对象。他们把复杂过程封装在内部,而对外呈现的接口是高层次的,抽象的。&/blockquote&&br&部分翻译来自网络。&br&&br&目录 &a href=&/question//answer/& class=&internal&&从乔布斯身上我们可以学到哪些好的精神与品质? - 知乎用户的回答&/a&&br&&br&参考资料&br&&a href=&///?target=https%3A///What-is-object-oriented-programming& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/What-is-objec&/span&&span class=&invisible&&t-oriented-programming&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///sayings/stevejobsinterviews/rollingstone94.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Steve Jobs in 1994 (Jeff Goodell)&i class=&icon-external&&&/i&&/a&
《乔布斯传》里有这样一段话: “史蒂夫总体上认为与自己相比,比尔稍逊一筹,尤其是在品味和风格上。”安迪·赫茨菲尔德说到“比尔瞧不起史蒂夫是因为史蒂夫不会编程。”我觉得乔布斯还是会一些编程的,我看过的所有的和乔布斯相关的视频中,见他演示过两…
题主问了一个好问题,答案是肯定的:&b&这种形变确实存在。&/b&&br&&br&VSauce(&a href=&///?target=https%3A//youtu.be/mQ0hS7l9ckY& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&youtu.be/mQ0hS7l9ckY&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&)有一集专门讲这个问题。&br&&br&先从照相机讲起。数字相机和光学相机不一样,它是通过逐行扫描方式来生成图片的。这样,照片不同部分实际上是不同时间的影像。一般来说没有问题,但是如果目标移动很快,照片上就会呈现滚动快门效果(Rolling Shutter Efffect),比如下面的飞机螺旋桨和吉他弦的振动效果。&br&&img src=&/b31505fecd968efb2f1a7_b.png& data-rawwidth=&458& data-rawheight=&250& class=&origin_image zh-lightbox-thumb& width=&458& data-original=&/b31505fecd968efb2f1a7_r.png&&&br&下面这张照片拍下了小孩眨眼的瞬间。由于左边和右边图像生成时间的差异,它们分别拍下了眨眼过程中不同的阶段。&br&&img src=&/bf7ebe9a67b5fe3f3426d6_b.png& data-rawwidth=&442& data-rawheight=&290& class=&origin_image zh-lightbox-thumb& width=&442& data-original=&/bf7ebe9a67b5fe3f3426d6_r.png&&&br&这个滚动快门效果是由于快门扫描速度造成的。而在宇宙中,由于光速有限,滚动快门效果也存在。以仙女座星系为例,它对着我们的角度是倾斜的,而它的直径超过20万光年。所以它前端的光和后端的光到达我们时间会相差10万年以上。加上星系本身的旋转,我们也许应该看见这样的图像(以一个旋转的棋盘为例子)。&br&&img src=&/c2a1e2bf542b8fdc4bf9fd4a_b.png& data-rawwidth=&549& data-rawheight=&184& class=&origin_image zh-lightbox-thumb& width=&549& data-original=&/c2a1e2bf542b8fdc4bf9fd4a_r.png&&&br&从技术上来说,这种效果应该存在,但是实际上,效果小到可以忽略不记 的地步。这是因为星系的旋转速度实在太慢,转一圈要上亿年的时间。在下面的仙女座星系照片中,滚动快门效果造成的扭曲最大的部分小于1个像素。&br&&img src=&/60f9de10feb05dceb7715_b.png& data-rawwidth=&721& data-rawheight=&364& class=&origin_image zh-lightbox-thumb& width=&721& data-original=&/60f9de10feb05dceb7715_r.png&&
题主问了一个好问题,答案是肯定的:这种形变确实存在。 VSauce()有一集专门讲这个问题。 先从照相机讲起。数字相机和光学相机不一样,它是通过逐行扫描方式来生成图片的。这样,照片不同部分实际上是不同时间的影像。一般来说没有问…
&img src=&/13aea92f64b_b.jpg& data-rawwidth=&499& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&499& data-original=&/13aea92f64b_r.jpg&&比你语文排名高的在橙色框内 A+B+C=4&br&比你数学排名高的在蓝色框内 C+D+E=5&br&比你综合排名高(综合成绩假定就是语文成绩和数学成绩之和)的在粉红色线右上 B+C+D&br&已知A,B,C,D,E&=0&br&所以0&=B+C+D&=(A+B+C)+(C+D+E)=9&br&当且仅当A=4 E=5时 B+C+D=0 此时题主为第一名&br&当且仅当A=C=E=0时 B+C+D=9 此时题主为第十名&br&因此两边不等式的等号均能取到&br&&b&故题主综合排名至少是第十名&/b&。
比你语文排名高的在橙色框内 A+B+C=4 比你数学排名高的在蓝色框内 C+D+E=5 比你综合排名高(综合成绩假定就是语文成绩和数学成绩之和)的在粉红色线右上 B+C+D 已知A,B,C,D,E&=0 所以0&=B+C+D&=(A+B+C)+(C+D+E)=9 当且仅当A=4 E=5时 B+C+D=0 此时题主为第一…
请问题主问的是堆(heap)还是栈(stack)?我不喜欢堆栈这个词所以我的回答里会完全避免使用它,免得起歧义。&br&&br&栈的话,纯Java代码是没办法泄漏栈空间的,它完全被JVM掌控,Java代码无法创建任何指向栈空间的指针所以无从谈起泄漏栈空间。反正一个方法每被调用一次,入口出会分配栈空间,出口处会释放栈空间,就这么简单,没办法出错。&br&&br&堆的话,这里大概想问的是最后那个 img = null 是否足以释放 img 指向的 Image[] 数组。&br&简单答案是:这个赋值是完全多余的,没有任何必要在方法临返回前给引用类型的局部变量赋值为null。这个赋值并&b&不会&/b&帮助GC回收 img 所指向的 Image[] 数组;就算没有这个赋值GC也可以在它选择的时机正确回收该数组。&br&&br&要看更长的解释的话请跳传送门(特别是里面开头的那个传送门):&a href=&/question//answer/& class=&internal&&这段 Java 代码中的局部变量能够被提前回收吗?编译器或 VM 能够实现如下的人工优化吗? - RednaxelaFX 的回答&/a&&br&没耐心看完这个传送门的话,上面的简单答案就够用了。&br&&br&不过要额外注意的是,这个代码例子里有个隐含的陷阱:许多Java里的图像处理库都不是纯Java的,而是对某些native库的包装(例如JMagick之于ImageMagick)。这样就不只要关注纯Java的部分,还得关注Java与native交互(JNI)的部分。&br&如果题主问题中的Image类有finalizer(void finalize()方法)并且该finalizer能正确释放native部分的资源的话,那这个代码就没问题;&br&反之,如果这个Image类有特别说明需要显式调用释放资源的方法去释放native资源的话,那题主的代码就会泄漏native资源。这方面请参考另一个问题的回答:&br&&a href=&/question//answer/& class=&internal&&为什么Java有GC还需要自己来关闭某些资源? - RednaxelaFX 的回答&/a&&br&&a href=&/question//answer/& class=&internal&&Java使用JNI调用C写的库时,使用malloc分配的内存是由谁来管理? - RednaxelaFX 的回答&/a&&br&&br&于是题主问的Image类是这个么?&br&&a href=&///?target=https%3A///javame/config/cldc/ref-impl/midp2.0/jsr118/javax/microedition/lcdui/Image.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Image (MID Profile)&i class=&icon-external&&&/i&&/a&
请问题主问的是堆(heap)还是栈(stack)?我不喜欢堆栈这个词所以我的回答里会完全避免使用它,免得起歧义。 栈的话,纯Java代码是没办法泄漏栈空间的,它完全被JVM掌控,Java代码无法创建任何指向栈空间的指针所以无从谈起泄漏栈空间。反正一个方法每被…
前段时间写过一片文章专门讲微软在WinPhone发展上的错误决定的,也回复在另外一个问题中:&a href=&/question/& class=&internal&&windows phone 是否已经走向失败? - Windows Phone&/a& ,贴在下面。&br&&br&PS:我到目前仍然觉得WinPhone有机会,虽然微软错失了很多机会。&br&&br&&p&  前段时间决定将自己用了三年多的Lumia 800正式退役,这是我用的时间最长的手机,虽然系统上有缺陷,但是好不妨碍他成为我最有感情的一部手机。由于之前是WinPhone 开发者的关系,这部手机是微软送的,眼睁睁的看着WinPhone系统从出生到长大,还没成熟时就蔫了的历程,心里很不是滋味。这篇文章先晒晒被我用过的Lumia手机,然后再分析下WinPhone发展成现在这样微软需要承担的责任。&/p&&br&&strong&先晒手机&/strong&&br&&br&  由于普遍反映篇幅较长,所以删去晒手机的部分,直接进入正题。&br&&br&&strong&关于WinPhone&/strong&&br&&br&  首次接触WinPhone是在2011年下半年,当时刚刚毕业,没有赶上ios和android那趟船,也因为主要的工作语言是.net,所以对刚刚兴起的WinPhone寄予厚望。在开发了几个小软件,微软送了个手机后,我便以WPer自居,并且期望作为国内第一批的WinPhone开发者,享受到系统发展带来的红利。但是后来的事情大家都知道了,四年过去了,WinPhone在中国的市场份额是0.8%,甚至比三年前还要低。全球的WinPhone份额基本也就是在2%到3%之间,已经没有了和前两大系统叫板的底气。&img src=&/92cc1edfad4fc469ca3e9b795dda7190_b.png& data-rawwidth=&626& data-rawheight=&352& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/92cc1edfad4fc469ca3e9b795dda7190_r.png&&图:2014年手机操作系统市场份额图表&br&&br&  作为一个WPer,对WinPhone的发展深感痛心,我们曾经幻想成为三大系统之一(虽然现在是第三,但是好意思和ios/android排一起么),而且当时的WP也的确有着成为三大系统的机会,但是微软没有抓住机会,带领着WinPhone一步步的走向没有未来的世界。。。&img src=&/bd372ddcb3ae3ae1114ffc0_b.png& data-rawwidth=&588& data-rawheight=&383& class=&origin_image zh-lightbox-thumb& width=&588& data-original=&/bd372ddcb3ae3ae1114ffc0_r.png&&&br&&br&&strong&WinPhone系统诞生的过程&/strong&&br&&br&  很多人不知道为什么WinPhone的第一个版本,叫WinPhone 7,那是因为在WinPhone之前,微软还有个手机操作系统叫Windows Mobile,最后一个版本是Windows Mobile 6.5,所以新系统就顺势叫做WinPhone 7。当年那个Windows Mobile非常厉害,相当于Windows的手机版本,上面可以找到开始菜单,也可以玩和pc版本一致的纸牌。HTC在大陆的前身多普达则出过多款该系统的智能手机,那时候有一个Windows Mobile系统的手机是一件倍有面子的事情。&img src=&/aaeb33e74edbffe5bddfd_b.png& data-rawwidth=&446& data-rawheight=&299& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&/aaeb33e74edbffe5bddfd_r.png&&图:当年的多普达手机&br&&br&  但是这一切都在苹果推出iPhone之后被打破,人们惊讶的发现,原来智能手机系统应该怎么玩,于是纷纷模仿起来。先是有Google的android,然后诺基亚也坐不住了,抛弃了之前的塞班 S60,和英特尔联合开发MeeGo系统。微软眼看着再没动作就要错失良机了,于是在2010年隆重推出了全新的WinPhone 7系统。还记得当时搞了个声势浩大的游行,举行葬礼宣判iPhone死刑,现在看来是多么的可笑。&img src=&/838e1f53f5_b.jpg& data-rawwidth=&590& data-rawheight=&353& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/838e1f53f5_r.jpg&&图:当时宣判iPhone死刑的游行&br&&br&  在微软内部确定WinPhone取代Windows Mobile后,WinPhone项目就开始了。负责WinPhone 7界面的是微软的设计总监 Flora,他在WinPhone的设计上引入了Metro的设计风格,打造了在UI上完全不同于IOS和android的体验。当然对于这种设计风格褒贬不一,作为我个人的体验来说,虽然和当时主流的设计不是很相符,但是也是可接受的,当然如果你说它长得丑了点我也不反对。&img src=&/648c5b183e4c7ca9eb17cbcd5bb597e0_b.jpg& data-rawwidth=&503& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/648c5b183e4c7ca9eb17cbcd5bb597e0_r.jpg&&图:左为WinPhone 7,又为WinPhone 8&br&&br&  另外一个掌握了WinPhone 7生命的是微软移动设计团队主管,他主管了WinPhone 7的设计。不知道是因为时间上太紧迫还是其他方面的原因,最初版的WinPhone 7简直是个半成品。很多人可能不知道,最开始发布的WinPhone 7是完全的单任务,也就是说你每次打开一个应用都是重新加载的,无法继续你刚才的操作。因为这样的限制,微软强制要求开发者在发布程序时使用“墓碑机制”来重启时还原程序关闭前的状态,这不但降低了用户体验,也提高了应用程序的门槛。好在WinPhone 7.5就解决了这个问题,这是我印象中微软在WinPhone上动作最快的一次。还有其他的一些没有达到业界平均水平的点,深受诟病的有音量无法单独调节,重力感应不能关闭、没有文件夹、没有通知中心等等,槽点太多,无力吐槽。&img src=&/cbca4f38da343ce6dc0dfe3_b.png& data-rawwidth=&400& data-rawheight=&300& class=&content_image& width=&400&&&br&  以上说的都是一些系统级别的缺陷,大部分应用级别的缺陷都可以通过第三方来解决,但是微软很多权限都没有放开,API少的可怜。所以你当时在市场上看不到流量控制的软件,也无法找到能显示来电归属地的软件,甚至找不到能显示通话记录的软件。。。&br&  当然刚才说的很多问题微软都在后续的版本中解决,但是这样就OK了么,你以为用户会为了通知中心等你24个月么。最好的时光已经过去,最佳的机会也已经溜走。&br&&br&&strong&微软是如何抛弃WinPhone 7的&/strong&&br&  相信在所有早期的WinPhone用户和开发者的记忆中,微软宣布WinPhone 7不能升级的时候是毁灭性的。我是5月份刚拿到了Lumia 800,你要知道当时的Lumia行货价格接近3000,然后6月21日,微软推出了winPhone 8,并且宣布所有WinPhone 7系统手机不能升级到WinPhone 8,取而代之的是升级到一个安慰版本——WinPhone 7.8。&img src=&/6c662f23c9a3db551a49feb5e5a5fc83_b.png& data-rawwidth=&576& data-rawheight=&509& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/6c662f23c9a3db551a49feb5e5a5fc83_r.png&&图:WinPhone 7不能升级得到了铺天盖地的宣传&br&&br&  如果是一个有经验的公司,即使在不能升级的情况下,也可以将WinPhone7.8纳入到WinPhone 8中,作为一个特殊的版本。或者说WinPhone 7可以升级到WinPhone 8,但是需要硬件和内核支持的功能不可用,这样也会让WinPhone的老用户心里舒服很多。但是微软在宣传策略上直接说明“老用户只能升级7.8,不能升级8”,完全看不出一个老牌世界500强公司应有的宣传实力。相同的一个事件是IOS 6宣布支持iPhone 3GS,虽然很多功能不能用,但是很多苹果用户都大喊苹果良心。&img src=&/23dc9bf6f22db88f3c680_b.png& data-rawwidth=&600& data-rawheight=&365& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/23dc9bf6f22db88f3c680_r.png&&&br&  我们再看下为什么WinPhone 7不能升级到WinPhone 8,微软给出的解释是内核的转变。WinPhone 7使用的是Windows CE内核,这是一个有着十多年的老内核,所以对硬件的支持不够,比如不支持65536色以上,不支持多核处理器、NFC等,这也就是WinPhone 7清一色的单核处理器的原因。而Windows 8使用的是Windows NT内核,他是个新开发的内核,简单点讲就是它能支持非常牛逼的硬件,是不能运行在低端的硬件之上的。但是在技术上是不是真的无法实现升级呢,当然不是,民间就有高手将HD2刷成了WinPhone 8, 并且在论坛上放出了刷机包。所以不能升级的原因是在微软看来WinPhone 7的用户和销量都比较小,不值得为这么少的用户来大费周折的推出一个定制版的WinPhone内核。只能说微软是基于商业的考虑,而并非从用户的角度来考虑升级这件事情。&img src=&/a79bb4c906bf2d942fe33_b.png& data-rawwidth=&690& data-rawheight=&411& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&/a79bb4c906bf2d942fe33_r.png&&&br&  结合第一段WinPhone的发展过程来看,其实在内核和技术上WinPhone 7并没有比Windows Mobile高出多少,而更像是改了一个UI的系统,而WinPhone 7到WinPhone 8才是真正的改变。而微软着急推出WinPhone 7是为了一个姿态,也让用户习惯Metro UI以及App的积累,虽然不能升级,但是App反正都是托管代码,Winphone 8还是可以运行WinPhone 7的应用的。从这个角度考虑,WinPhone 7从一开始就是一个仓促推出的短期版本,也就注定了它悲剧的命运。&br&  微软在宣布的时机选择上也是非常重要的,当时恰逢 Lumia 系列的销量上升,并且诺基亚在大陆趁势推出了更高端的Lumia 900手机,才推出一个多月,微软就宣布老款手机不支持升级。关键还在于当时离WinPhone 8正式推出还有四个多月的时间,这四个多月诺基亚是何等的尴尬,让消费者买不能升级的Lumia,还是劝我们买两百一个的功能机呢。&img src=&/3e401fea55fdaa0ad2d53a0_b.png& data-rawwidth=&690& data-rawheight=&458& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&/3e401fea55fdaa0ad2d53a0_r.png&&&br&  不管不能升级是因为系统内核的原因、成本的考虑还是其他商业上的目的,微软这样的做法完全伤透了所有使用WinPhone 7产品的用户。虽然损失的这部分用户的份额不大,但是这部分早期用户实际上会有比表面上的市场份额更大的能量。早期的WinPhone 7产品并不便宜,而且系统上不是很完善,很多使用WinPhone都是对数码产品比较熟悉的用户,他们可能是周边同事朋友购机的顾问,这部分用户对其他人有强烈的带动作用,所以损失这部分用户其实是非常可惜且影响十分恶劣的。&br&  另外,不能升级也会对尚未购买WinPhone 手机的用户产生影响。我在使用Lumia 800过程中,公司有不同的同事表达对这款手机的喜爱,并且有意愿购买WinPhone 手机,但是自从不能升级之后,没有一个朋友准备购买WinPhone手机,并且对使用WinPhone手机的用户或多或少表现出一点不理解的眼神。几乎所有第一次发现我使用的是WinPhone手机的朋友,问出的第一句话就是,听说这个手机不能往上升级了。&br&&br&&strong&微软对用户需求的无视&/strong&&br&  从WinPhone推出的第一天起,就伴随着大量的吐槽,而微软在系统改进上的速度比蜗牛还要慢。我们看几个典型的例子:&br&&br&&em&&strong&通知中心&/strong&&/em&&br&  通知中心目前应该算是只能操作系统的标配,但是WinPhone却没有。所以可能会出现的场景是,有通知时在顶部一闪而过,没来得及点击后你就没法知道他通知的是什么,你永远不知道刚才是哪个应用通知了你。有些应用可能会在磁贴上有个小的数字提示有通知,但是前提是必须将这个应用固定到首页。&br&  那么为什么微软为什么不在WinPhone 7中就将通知中心做进去呢。微软的Metro的设计理念是动态磁贴(即Live Tiles)来实现通知中心的功能,有通知时实现通知的内容呈现在磁贴上。但是大部分应用都没有实现这样的功能,基本有消息时只会显示一个数字,没有通知的信息,如果想知道具体的内容仍然要启动应用才能看到。另外一个限制是必须固定到首页的应用才能实现动态磁贴,对于没有固定到首页的应用如果没有点中一闪而过的通知,那就没地方可以看到通知了。&br&  没有通知中心还有个特别不顺手的地方,无法一键开关Wifi,蓝牙、网络、GPS等功能,需要到找到设置里面的相应页面才能开关。直接的后果就是很长一段时间在微软的MarketPlace中相应的一键设置软件的下载量长期占据前十名中的好几名。&img src=&/eaac01c2a5af68e7fa088b1_b.png& data-rawwidth=&936& data-rawheight=&509& class=&origin_image zh-lightbox-thumb& width=&936& data-original=&/eaac01c2a5af68e7fa088b1_r.png&&&br&  微软在后期也确认将会增加通知中心,不过这已经是14年4月随着WinPhone 8.1才推出,离WinPhone的第一版已经过去了四年的时间。微软曾经给出解释称是资源不足,导致没有在WinPhone 8中搭载通知中心,但是我是不相信一个有着10万人的公司,会因为资源不足导致对市场的反应如此之慢,只能说明微软的官僚主义已经深入到骨髓。&br&&br&&strong&&em&音量无法单独调节&/em&&/strong&&br&  WinPhone在相当长的时间内所有音量都只有一个值,就是说你的电话铃声和各种app的声音是一样的,无法实现铃声,应用,系统铃声音量的分开调节。在我实际的使用中,经常在玩游戏时静音,如果游戏结束时忘记把音量调回来的话,那么一整天手机都是出于静音状态,我也因此漏接过许多电话。这个问题也经过了漫长的等待之后,直到WinPhone 8 GDR3版本才修复,别问我为什么记得这么清楚,你们有过那种等待好几年终于如愿的感受么。&br&  仔细了解发现,WinPhone的音频架构是非常完善的,实现音量控制的分离是非常容易的一件事情。WinPhone的音频APIs是通用音频架构UAA的一套API,可以独立处理每个进程下的音频API请求,也就是说每个应用的音量都可以单独控制。这么牛逼的架构,微软却一直不在其基础上实现单独调节音量,如果不是官僚主义,就是完全对用户需求的漠视。&img src=&/75be7e885560dea1e8e3f5bf5d30cd30_b.jpg& data-rawwidth=&690& data-rawheight=&517& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&/75be7e885560dea1e8e3f5bf5d30cd30_r.jpg&&图:高手发的音频架构图&br&&br&  还有一些像屏幕旋转、没有桌面文件夹我就不一一列举了,随便一个功能的推出时间都被 IOS 和 Android 甩开好几年。&br&&br&&strong&微软对开发者的“虐待”&/strong&&br&  这里我用了“虐待”这个词,可能很多人觉得有点过头,但是这是我真实的感受。没有一家厂商敢这么儿戏的对待开发者,没有一家平台会如此频繁的变更架构。&br&  微软的C#语言是一个非常容易入门的语言,Visual Studio 也是一个很好很强大的工具,加上微软的号召力,所以在中国有非常庞大的C#程序员,规模甚至可以和Java相比。所以在WinPhone刚发布时,有很多像我一样的 C# 程序员希望搭上WinPhone的顺风车,当时的个人开发者数量其实并不少。WinPhone 7 的应用基于Silverlight for Windows Phone(普通应用) 和XNA (游戏应用)开发,虽然微软开放的API比较少,但是还是有不少个人开发者或者团队出了不少不错的应用,也出现了一些以WinPhone为主的游戏分发公司。同时微软也时不时的举办开发者活动,虽然收集了很多垃圾应用,但是客观上还是增加了应用的数量。这段时期WinPhone的生态正在慢慢建立,并且有着向好的方向发展的趋势。&br&  当微软宣布退出WinPhone 8,抛弃WinPhone 7时,顺便也大幅修改了API,增加了Windows Phone Runtime,也支持了C++的开发。这个时候其实微软已经有将WinPhone和Windows的开发模式合并的想法了,但是可能是时间不够,这个时候并没有完全的统一,给WinPhone的Windows Phone Runtime也是Windows Runtime的大幅度严格版本。对于普通应用来说,这期的版本变化不大,都是基于Silverlight的,迁移时稍作修改即可。但是对于游戏应用,WinPhone 8支持Native的DirectX开发,所以WP7的游戏开发者基本抛弃了xna,这个的一直工作量还是有点的。&br&  对于开发者来说,真正大的改变是WinPhone 8.1的发布,这时候微软统一了WinPhone和Windows 的开发架构,推出了新的基于Windows Runtime的所谓Universal App,当然同时也保留了之前的Silverlight,只是升级到了Silverlight 8.1,不过所有人都能看得出来Windows Runtime app才是未来。但是既然Windows Runtime是未来,竟然不支持部分Sliverlight 的API,比如VOIP、锁屏、相机启动器。而WinPhone 8.1的Windows Runtime 和 WinPhone 8有多大区别呢,下面是其他开发者列举的几条:&img src=&/a6f05d8e4d8bf7a03d0d4f4fc8cd1d89_b.png& data-rawwidth=&793& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&793& data-original=&/a6f05d8e4d8bf7a03d0d4f4fc8cd1d89_r.png&&&br&&br&  还有很多没有列举,所以如果需要移植的话几乎要重写和系统交互的部分。这也就是为什么到目前为止很多开发者都没有升级为Universal App的原因。&br&  上面每一次的改变都会流失一部分开发者,这让本身优秀开发者就不多的平台渐渐的失去了崛起的基础。当然还有一部分死忠仍然在坚守,压死他们的最后一根稻草是兼容IOS和Android。微软这样的举措事实上和之前黑莓公司宣布兼容安卓软件一样,已经承认了WinPhone生态系统的失败,也就意味着放弃了此前一直坚守的WinPhone开发者。目前我所知道的WinPhone开发者几乎都是在抱怨,因为他们发现,就算现在继续坚持下去,到最后依然会被微软抛弃。所以我加入的几个Winphone开发者群几乎都是在闲聊和各种段子,偶尔有个技术问题出来,也是半天没人讨论,一段时间下来,QQ表情倒是收集了不少。&img src=&/22e690a88c5a5a2583367babc4e2e4b4_b.png& data-rawwidth=&510& data-rawheight=&813& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&/22e690a88c5a5a2583367babc4e2e4b4_r.png&&&br&&br&  对于WinPhone 10(可能就叫Win 10 Mobile)兼容IOS和Android应用的前景,我非常不看好。这种移植过来的应用本身是为其他平台设计的,交互方式和操作习惯都是其他平台的,用户体验上肯定要比原生应用差很多,所以对于移植过来的应用用户并不一定买账。而对于开发者来说,微软的这种做法已经伤透了他们的心,几乎仍然在坚持编写原生应用的开发者不多,而IOS和Android开发者,本来就看不上WinPhone的用户量,移植工具比较方便还好,如果操作比较麻烦甚至都不愿意花时间移植过来。所以极有可能造成自家开发者失望的离开,别人家的开发者反应冷淡,最后竹篮打水一场空。&br&&br&&strong&结语&/strong&&br&  WinPhone从2010年发布至今已经有五年的时间,版本也几经更替,曾经有着快速的发展和光明的前景,但是在微软的多次折腾下而慢慢倒下。纵观WinPhone的发展历程可以发现,几次重大的变革都是由于微软的举棋不定和动作缓慢造成的。如果最开始就坚定了大一统的理念,最开始就推出NT内核的WinPhone,最开始就坚持Windows Runtime,可能就不会有抛弃WinPhone 7,不会有开发方式的大改变,而等到生态好了,也就不大可能会兼容IOS和Android。&br&  虽然整篇文章是对微软的批判,但是WinPhone目前还是有机会的,机会在于Android还不够好。希望微软在新CEO的领导下,抛弃以往的官僚作风,坚持自己的风格,在后面的移动生态系统中占有自己的一席之地。&br&&br&&br&&br&PS:可能想要说的话太多,写的有点乱。也没有提到单就系统来说,目前的WinPhone8.1已经是一个优秀的系统了,如果有时间的话我后面再写一篇WinPhone相比于其他两大系统的优点,以及目前比较好的应用,给准备转移到WinPhone平台的用户一些参考。&br&再次PS:部分是看了第三方的资料,如有错误,请指正。
前段时间写过一片文章专门讲微软在WinPhone发展上的错误决定的,也回复在另外一个问题中: ,贴在下面。 PS:我到目前仍然觉得WinPhone有机会,虽然微软错失了很多机会。 前段时间决定将自己用了三年多的L…
已有帐号?
无法登录?
社交帐号登录
1368 人关注
4274 人关注
151 条内容
1267 人关注
493 条内容
10919 人关注
370 条内容
6941 人关注
6234 条内容}

我要回帖

更多关于 qq13分组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信