日志分类:软件开发

微软牵手笑傲江湖意欲何为?

2010年04月13日 11:29 上午  |  分类:软件开发

 外媒报道,中国游戏公司完美开发的《笑傲江湖OL》将登陆XBOX360平台,并支持XBOX LIVE成为首款支持TVGAME在线的国产游戏,当然如果想搜索到更多其在境外的消息不妨使用其英文名“Sword man”。在好奇心的驱使下,我特意从完美的朋友那里打探了一番,他对此只说:“消息并非炒作。”
 
    此言一出,这件事就做实了。XBOX360向来和中文游戏绝缘,更加不要说是网游了。而此次,《笑傲江湖OL》登陆XBOX360主机,自然是破天荒头一遭。其意义非同一般。
 
    微软缘何会看上《笑傲江湖OL》,一方面自然是对其游戏品质的认可,完美进军海外多年,其在美国的口碑早已树立。然另一方面,则是微软希图在电视游戏领域直插入中国网游市场,从而在这个世界上最大的网游玩家集散地和网游市场价值最高的地区,切一块肥厚的蛋糕。
 
    长期以来,电视游戏和网络游戏一直是楚河汉界,不相侵犯。特别是比尔盖茨的维纳斯家庭娱乐中心计划失败之后,这一泾渭越显分明。加之,许多电视游戏产品再改造成网游之后,往往在网游市场折戟沉沙,如《真无双三国OL》、《使命召唤》等,这都让XBOX360等电视游戏主机,对网游市场望而却步。再则说,中国市场对游戏主机一直有所限定,主流游戏主机根本就没有通过正常渠道进入中国市场的机会。这都让电视游戏在中国市场呈现空白状态。
 
    而微软此次,以《笑傲江湖OL》来打开网游市场,其实可以说是其既定战略使然。电视游戏进军网游市场是大势所趋,电视游戏网游化,也必然是未来的主流发展趋势。而中国市场目前电视游戏的空白,又无人可以填补,XBOX360显然是瞄准了这一空白,加以冲击。
 
    完美俨然也是获利者,通过微软的技术加入,其《笑傲江湖OL》将不可避免的在技术和游戏娱乐性上进一步提升,毕竟《笑傲江湖OL》的设计理念还是针对PC平台和网游玩家,现在微软想要让笑傲江湖登陆是一回事,但登陆之后,如何同数以百计的强大电视游戏同场竞技,将是一个重大问题。毕竟网游普遍上在游戏娱乐性、画面质量和游戏声光效等之上,都因为网络传输能力和服务器支持程度,而不可避免的被“牺牲”,这将让《笑傲江湖OL》在XBOX360上的竞争压力更大,也对其品质提出的挑战更大。完美的朋友也很明确的指出:近期《笑傲江湖OL》确实在进行大规模游戏质量提速,其品质将由此再上一个台阶,以此契机,笑傲游戏江湖,也未可知。
 
    游戏主机原本就是一个平台,其无法进入中国市场的根源,最关键的不是版权软件价格昂贵,而是其搭载产品的意识形态过于复杂,为管理者所难以控制。而采用全国产的、获得相关部门审批的产品,以网游的形式进军中国市场,显然更加切合实际,也更加容易从缝隙中找到生存的依据。微软其实早已垂涎中国市场久已,此次收编《笑傲江湖OL》,就是将口水咽下,真正实干一番,和其他游戏公司较一日之长短。
 
    《笑傲江湖OL》成为XBOX360的收编对象,其实恰恰说明了电视游戏将逐步走向网游化,网游未来的平台也将不仅仅是电脑,而将扩展到游戏主机这样的专业游戏平台之上,这其实也是国内游戏厂商应该注意的一个趋势,如何利用这一趋势,蓄势而发,将是未来十年,网游厂商能否占据市场主动权的关键所在。

标准的软件工程过程之文档标准

2010年04月12日 9:43 上午  |  分类:软件开发

标准的软件开发过程

软件开发的标准过程包括六个阶段,而六个阶段需要编写的各类文件达14种之多,在每个阶段需要编写哪些文件,以及这些文件的主要内容见下:

1.可行性与计划研究阶段

可行性研究报告:在可行性研究与计划阶段内,要确定该软件的开发目标和总的要求,要进行可行性分析、投资一收益分析、制订开发计划,并完成应编制的文件。

项目开发计划:编制项目开发计划的目的是用文件的形式,把对于在开发过程中各项工作的负责人员、开发进度、 所需经费预算、所需软、硬件条件等问题作出的安排记载下来,以便根据本计划开展和检查本项目的开 发工作。

2.需求分析阶段

软件需求说明书:软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解, 使之成为整个开发工作的基础。内容包括对功能的规定对性能的规定等。

数据要求说明书:数据要求说明书的编制目的是为了向整个开发时期提供关于被处理数据的描述和数据采集要求的技术信息。

初步的用户手册:用户手册的编制是要使用非专门术语的语言,充分地描述该软件系统所具有的功能及基本的使用方法。使用户(或潜在用户)通过本手册能够了解该软件的用途,并且能够确定在什么情况下,如何使用它。

3.设计阶段

概要设计说明书:概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。编制的目的是说明对程序 系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计。 运行设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。

详细设计说明书:详细设计说明书又可称程序设计说明书。编制目的是说明一个软件系统各个层次中的每一个程序 (每个模块或子程序)的设计考虑,如果一个软件系统比较简单,层次很少,本文件可以不单独编写,有关 内容合并入概要设计说明书。

数据库设计说明书:数据库设计说明书的编制目的是对于设计中的数据库的所有标识、逻辑结构和物理结构作出具体的设计规定。

测试计划初稿:这里所说的测试,主要是指整个程序系统的组装测试和确认测试。本文件的编制是为了提供一个对该软件的测试计划,包括对每项测试活动的内容、进度安排、设计考虑、测试数据的整理方法及评价准则。

4.实现阶段

模块开发卷宗(开始编写):模块开发卷宗是在模块开发过程中逐步编写出来的,每完成一个模块或一组密切相关的模块的复审时编写一份,应该把所有的模块开发卷宗汇集在一起。编写的目的是记录和汇总低层次开发的进度和结果,以便于对整个模块开发工作的管理和复审,并为将来的维护提供非常有用的技术信息。

用户手册完工

操作手册:操作手册的编制是为了向操作人员提供该软件每一个运行的具体过程和有关知识,包括操作方法的细节。

测试计划终稿:

5.测试阶段

模块开发卷宗(此阶段内必须完成)

测试分析报告:测试分析报告的编写是为了把组装测试和确认测试的结果、发现及分析写成文件加以记载。

项目开发总结报告:项目开发总结报告的编制是为了总结本项目开发工作的经验,说明实际取得的开发结果以及对整个开发工作的各个方面的评价。

6.运行与维护阶段

开发进度月报的编制目的是及时向有关管理部门汇报项目开发的进展和情况,以便及时发现和处理开发过程中出现的问题。一般地,开发进度月报是以项目组为单位每月编写的。如果被开发的软件系统规模比较大,整个工程项目被划分给若干个分项目组承担,开发进度月报将以分项目组为单位按月编写。

对于一项软件而言,有些文件的编写工作可能要在若干个阶段中延续进行。

鉴于软件开发是具有创造性的脑力劳动,也鉴于不同软件在规模上和复杂程度上差别极大,本指南认为在文件编制工作中应允许一定的灵活性,并不是14种文件每种都必须编写。

文件编制的衡量因素

◆在因素总和较低的情况下,项目开发总结报告的内容应包括:程序的主要功能、基本流程、测试结果和使用说明。          

◆测试分析报告应该写,但不必很正规。

◆数据要求说明和数据库设计说明是否需要编写应根据所开发软件的实际需要来决定。

例2:为了避免在软件开发中文件编制的不足或过分,一个简便的办法是把对软件文件的编制要求同软件的规模大小联系起来,这就是本例的出发点。软件的规模不妨分为四级:

1.小规模软件源程序行数小于5 000的软件;

2.中规模软件源程序行数为 10 000~ 50 000的软件;

3.大规模软件源程序行数为 100 000?500 000的软件;

4.特大规模软件源程序行数大于500 000的软件。

对上述的四级软件的文件编制要求分别列于表O3。 

至于源程序行数为 5 000~ 10 000, 50 000~ 100 000的软件,其文件编制要求介于两级之间,可根据一个软件产品的具体情况,由项目负责人参照表O3的规定,确定需要编制的文件种类。

对于源程序行数大于500 000的特大规模软件,可进一步把本指南规定的十四种文件按实际需要扩展成更多种类。

应用商店,以应用商店之名

2010年03月12日 3:31 下午  |  分类:软件开发

刚刚过去的2009年,是略显平淡的一年,美国总统换届、金融风暴继续、M.J离去、哥本哈根气候峰会…可供全世界人民的谈资寥寥可数。在如此背景的映衬下,在电信领域移动互联网这一细分市场中,应用商店们一跃而出,吸引了众多业内外人士和消费者的眼球,成为一道华丽的风景。

 

2008年的苹果在IT界和电信界可谓星光熠熠,AppStore借势iPhone大获成功,不久,多家终端厂商、IT企业、电信运营商纷纷跟进。08年10月,Google推出Android Market,09年更是成为应用商店之年,4月开始,BlackBerry、Nokia、Palm、LG、中国移动、三星、Vodafone、中国电信、Motorola等企业的应用商店以每月1~2家的速度依次上线,让业界眼花缭乱。

但绚丽的出场不代表永远的辉煌,纵观到目前为止的多家应用商店,只有苹果仍旧保持强劲势头,下载总量超过30亿,应用总量超过13万,平均每天新增应用几百个;紧随其后的Android Market,尽管应用总量超过2.5万,日均应用增长已达到100款,但由于开展收费模式较晚,终端的市场数量仍旧不足,开发者很难盈利,甚至连Gameloft这样的企业都已经暂时退出Android游戏的开发;终端巨头Nokia的OVI Store,覆盖用户遍布全球,但在发布后3个月内,应用下载量仅为1000万,即使在今年1月达到日均100万的下载量级,与苹果相比也仅相当于1/5,完全不是一个竞争级别;至于中国移动的MM,由于覆盖终端繁杂、开发人员有限、用户消费习惯等诸多原因,业务推出至今没有出现井喷式的增长,今后一段时间仍将保持平稳走势,循序渐进。

 

 

站在2010年回顾“应用商店之年”的诸多选手,有人懵懂入局、茫然四顾;有人形势使然、奋力搏击;有人醉翁之意、韬光养晦;有人志得意满、快马加鞭。每个人的心境不同,处境也不同,应用商店是光明大道,还是荆棘坎坷,抑或是蹊径独辟,在到达终点前没人说得清,但最起码现在看来,这条路,大家都走的并不轻松。

 

AppStore的成功是苹果才有的成功

苹果和乔布斯永远能够给人带来惊喜,在iPhone发布整整一年后,AppStore如同一颗重磅炸弹,将电信行业搅得天翻地覆。现在看来,AppStore的成功不仅是经营数据上的、外在的成功;同时也是商业模式上的、内在的成功。而不论外在因素还是内在因素,苹果的成功都有其独特性,甚至不可复制性。首先,苹果保证用户获得应用渠道的唯一性——AppStore+iTune,并辅以相应的配套设施——上网和支付的便捷性;其次,首创的商业模式和多个成功个案保证应用和开发者的数量;最后,完备的SDK和适配的唯一性,降低开发门槛,充分发挥开发者创造性。

走先一步的苹果可能早就预料到,这种商业模式一经推出即会被大量抄袭,但如同iPod的大容量存储、iPhone的多点触摸一样,一种新技术新模式的最大成功,只属于苹果,任何其他企业只能跟随成功者的脚步,有的则完全模仿不来。

所说模仿者指的就是如今如雨后春笋一般的应用商店们,他们既不具备独有的渠道优势,也没有苹果的先发优势,同时激烈的竞争使得用户和开发者都过于分散。一个用户可以选择终端层、操作系统、运营商三个商店,开发者也顾此失彼,一稿多投,找不到稳定持续的收入前景。现状预示着应用商店市场的刀光剑影,弱肉强食,似乎在群雄并起的移动互联网上,应用商店中的弱势群体注定要走上一条不归路?

 

应用商店经营者的志向大不同

尽管市场竞争异常激烈,但经营者们并没有被硝烟混淆了视线,一味丧失理智的冲锋。如今的局面也许早在各家的意料之中,这也说明,经营者对应用商店的趋之若鹜必定有其自身的理由。

第一类经营者经营应用商店是顺势而为,将其作为移动互联网战略的前沿阵地,通过应用商店提供丰富应用和差异化服务,因此盈利不是这类经营者的唯一目的,应用商店能够让他们站得更高,走得更远。概括来说,Nokia、Vodafone和中国移动等企业是这类的代表。Nokia早早推出互联网品牌OVI,OVI Store只不过是这个品牌在无线领域的第一站;Vodafone在2009年公布了新的移动互联网品牌Vodafone 360,Vodafone Store是包含在其中的子品牌服务;中国移动对MM的重视毋庸赘述,对基地来说,MM是收入来源,但对整个中国移动来说,MM是移动互联网布局中的一子。

第二类经营者经营应用商店是刻意为之,带有明显的企业战略意图,他们不计较应用商店是否盈利,希望通过应用商店拓展自身影响力和相关产品市场。这类公司均是IT翘楚——Intel、Microsoft、Google——他们各自在硬件、软件、互联网领域称霸一方,通过提供应用,抓住最终用户,反过来影响终端企业,以期获得更多的机会和更大的市场。

第三类经营者带有明显的从众心理,在宣传品牌形象的同时试探市场情况,具体表现为只针对某系列高端机型在特定区域内开放应用商店服务,这样既不需要前期大规模的平台和人员投入,也可以根据市场行情随时调整战略扩张或止损。这样的战略多被终端企业采用,如三星Omnia系列在韩国、新加坡等国家开放应用商店,LG Application Store仅服务于数款WM的手机。

第四类经营者经营应用商店是完全的跟随应战,以模仿应对相同市场中的竞争,起码在气势上先不输于对手,再精耕细作,徐徐图之。从国内来看,中国电信的软件基地刚刚上马,中国联通的Unistore开业在即。两家企业应大量借鉴苹果、Google、中国移动等先行者的经验,从建店伊始就规范应用商店伙伴引入、产品引入等合作规则,明确应用排序、权力制约等运营要素,给开发者适宜的环境,把握应用商店的控制点,力争建立行业标杆水准的应用商店。

 

应用商店最终将归于常态

其实,不管采用哪种思路的经营者,都无法再现AppStore的辉煌,甚至苹果自身都已经不具备那些天时、地利、人和。大幅盈利已经不是现有应用商店经营者的最终目的,能够藉由应用商店获得一场战役的胜利或是进一步抢占新的战场是更现实的战略。

2010年的立春刚刚过去,更多的应用商店酝酿着破土而出。应用商店会逐渐变为一个常态业务,出现在越来越多电信用户的生活中,就像曾经的短信、彩信一样,喝彩逐渐淡去,喧嚣归于平静,不同的经营者沿着自身的战略规划继续前行。经历了百花齐放的春天,熬过烈日炎炎的夏季,这些“以应用商店之名”存在着的Store们,会否像AppStore一样,在丰收的季节结出丰实的“苹果”,让我们拭目以待。

从Win32消息值反推出名称串:自动代码生成

2010年03月11日 2:12 下午  |  分类:软件开发

   这些天刚开始学习win32 API,出于对未知的不安,我试图用打印出所有爬过系统的消息的详细资料。其中有个简单的需求:从消息值反推出名称串,类似:

 

  1. TRACE(  TranslateMsgID(0×000F)  );  // output: WM_PAINT  

 

     在MSDN上搜了下,貌似没有API;也没怎么找到网上的资源,只好自己动手了。


     我们现在就要获得一个完整的、C++程序能识别的消息值-消息名的表。Win32的大部分消息在 WinUser.h 中定义的,形如:

  1. #define WM_PAINT  0×000F   
  2. #define CB_ERRSPACE         (-2)   
  3. #define DM_SETDEFID         (WM_USER+1)   

 

     考虑到消息种类非常多,手工完成这个表很累也很容易出错。这里我想起一种有趣的技术:我们可以用C++写一个自动程序,扫描 WinUser.h 文件,自动完成所需的C++代码。碰巧逻辑也不难。以最重要的 WM_前缀消息为例,只要将所有以 “#define WM_” 开头的行提取出来,分别读出字符串 “WM_ PAINT” 以及剩下的串”0×000F”,就可以转化为类似下的 C/C++ 代码:

  1. msg_name[ 0x000F ] = “WM_PAINT”;   
  2. msg_name[ (-2) ] = “CB_ERRSPACE”;   
  3. msg_name[ (WM_USER+1) ] = “ DM_SETDEFID”;  

 

     这样算还相当稳健,规避了棘手的表达式解析。鉴于后面将提到的条件编译问题,保留表达式反倒比解出来更准确。
 

     这里共享一个简化的版本,包括 VS2008 的 WinUser.h 中所有 WM_ 前缀的消息(该文件可以编译通过): 

 

 

     这种“自动生成代码的代码”的设计,被语法、工具卡住不妨试试这方面。


     试图编一小块代码来全自动生成大堆代码的时候,自然会遇到很多例外杂项。不过同时也有好处:为了安全和Debug,你必须得写些防御性的测试代码,反过来这些冷酷的代码顺便也能给研究对象盖棺定论。

  • 绝大部分WM_ 开头的消息都在 0~ 0×400 之间且不冲突,我们本可以用一个容量为 0×401 的数组来完成这个映射(其中有些格子留空)。 可惜消息值域方面有一个例外: WM_APP = 0×8000,严重超出正常范围,这迫使我使用 std::map;值域独立性上也有一个唯一例外:有一行 #define WM_SETTINGCHANGE  WM_WININICHANGE,显然这两个名称对应同一个值。这一行的输出是手动修改的。
  • 处理一对多的映射。
    实际上,除了WM_系列以外,WinUser.h 中包含很多系统控件对应的消息(MSDN 的 About Messages and Message Queues 一文给出了他们详细的前缀列表)。颇为糟糕的是,他们的消息值不再唯一对应名字。例如 0×6 同时对应 SB_TOP/SB_LEFT/WM_ACTIVATE, 具体消息取决于上下文。 map 中一个键只能对应一项;我这里的解决方案是使用 std::multimap。相对于把所有冲突的名字拼成一个string(或者更土的只保留一项),multimap 保留了所有项,我们就可以单独搜索比如WM_前缀的消息。
  • 处理条件编译。
    宏常量并不总是固定的。例如CB_MSGMAX ,我们会有:

    1. #if(_WIN32_WINNT >= 0×0501)   
    2. #define CB_MSGMAX                   0×0165   
    3. #elif(_WIN32_WCE >= 0×0400)   
    4. #define CB_MSGMAX                   0×0163   
    5. #elif(WINVER >= 0×0400)   
    6. //…  


    于是,CB_MSGMAX 的值悲剧的取决于 windows SDK版本,我们输出代码的时候怎么知道他是 0×165还是 0×163?

    一个简单的解决方案是,在解析的时候,顺便将输出所有条件编译语句到生成代码中。这样基本能再现最初的条件编译路线。稍微不美观的是,会出现很多不包含消息定义的 #if #endif 对。 我们需要栈和研究宏的 if else镶嵌规则… 茫然… 既然他们无害那就先留着吧。

  • 拿着锤子也只能把所有东西当钉子
    用C++解析文本的时候不得不生造很多辅助函数,差点写了个完整的表达式求值器。用正则表达式大概会方便很多吧? 该学学 C# 啊脚本语言之类的了。

 http_imgload

一项研究分析了130个研究报告,涉及超过13万人,证实暴力视频游戏确实让孩子们更好斗、不关心他人。美国爱荷华州立大学教授Craig Anderson表示这可能是他最后一次分析暴力游戏,因为这回的结论很确定。
研究者分析了暴力游戏对青少年行为、思想和情感的影响,接受测评的人年龄从小学生到本科生都有。有趣的是,无论游戏是第一人称还是第三人称,施暴对象是人类还是非人类,都不会造成差别。
年轻人好斗的思想和行为增加,同情心和亲社会行为降低,暴力游戏要负部分责任。无论东方还是西方,男性还是女性,年龄段如何,暴力游戏带来的影响都差不多。暴力游戏会同时增加短期和长期的攻击行为可能性,并且降低人们的亲社会行为。
研究人员中包括来自日本的顶尖视频游戏开发者。
决策者不需要再问“暴力游戏真的会造成严重影响吗?”这个问题已经被回答了1次又1次了。对于家长来说,暴力游戏带来的风险则相对比较容易应付,至少比贫困和遗传结构带来的风险要好对付。 Anderson觉得,现在应该推进到更有建设性的问题,如“怎么能在文化、社会和法律允许的范围内,让父母能容易地玩到暴力视频游戏,而同时让孩子健康地度过童年?”

小编个人感想:
这个问题确实已经被回答了1次又1次,这回连研究人员都说不会再进行更多的分析了,但其实这个问题还是值得继续讨论,目前关于视频游戏与攻击行为的关系依然存在争议。
另外,3月16日,战神3这个被很多人认为极度暴力的游戏就要发售了,小编倒是很期待…

网游向阿凡达致敬的时刻到了

2010年03月3日 4:04 下午  |  分类:软件开发

     当《阿凡达》在2010年初上映之时,不仅仅给中国的电影观众打来了震撼,也同样让一贯自高自大的国产网游产商们被“雷”到了。李瑜、史玉柱、丁磊等诸多大佬纷纷取经阿凡达,可游戏界向阿凡达致敬了许久之后,光见打雷不见下雨。
 
    当我在围脖上发出“谁最有可能成为第一个向阿凡达致敬的中国网游”这一疑问之时,回复我微博的十多条留言中,似乎大多比较看好《星辰变》,在不排除其中有人是盛大潜伏的“余则成”的情况下,我想其实也还算公允,同时也颇多感慨。围脖的字数太少,只能写140字,也太零散,说不清道不明,最后我想想还是写成博客,把自己的想法记录下来为好。
 
    认为《星辰变》能够独领风骚,当然也不是毫无原因的。尽管目前《星辰变》还没有正式和玩家见面,但通过和其设计人员的交流,“偷窥”一些原画和游戏视频,也能提前窥视一二。
 
    对于我而言,《星辰变》改编于同名网络小说、取材玄幻武侠之流,并没有太多的感觉。毕竟现在这一类型的网游实在如过江之鲫,数都数不过来,而且一个比一个粗制滥造,让人厌烦。
 
    《星辰变》给我的最大感觉就是动作华丽之外,其动作打击感之强烈,则是在国产网游中所鲜见的。为何说《星辰变》是向阿凡达致敬的第一部国产网游,其原因也在于此。表面上,两者之间没有任何联系,阿凡达取材外星文明之科幻,星辰变取材中国武侠之玄幻。然而两者在暗线上却一脉相承,即已超现实主义的画面效果,营造出一个另类的真实。
 
    大多数玩家已经看腻了无聊的砍怪和招式,固然华丽,却没有打击感,而《星辰变》则不然,在游戏中植入了很多新的元素,如二倍镜特效、次世代画风等等,这些都将动作打击的张力发挥到了极致。表面上看,《星辰变》是2D网游,在3D网游盛行的今天,貌似技术上力有所不逮。然而这不过是国人惯性思维下的偏见,真正优质的2D网游,其实往往能够更好的表现出精美的人物设定和绚丽的动画效果,反而较之3D网游需要强大游戏引擎和玩家电脑配置的完美配合来说,实现极强打击感的可能性更大。   

    这恰恰是我对《星辰变》研发人员敬佩之所在,看似难度不高,但实际上,《星辰变》并没有因此而放松对技术上的要求,正如《阿凡达》就算不是3D电影,一样可以成就无上辉煌,但《阿凡达》却勇于挑战巅峰,而《星辰变》同之。研发团队在游戏开发的初期就考虑到游戏运行对计算机资源占用的问题,经过充分的论证,《星辰变》最终选择了Gamebryo引擎。这一游戏引擎,可以有效的避免玩家在游戏过程中游戏画面太过绚丽却大量消耗计算机资源的问题。通过只绘制可见物体的方式,极大的降低CPU使用率,其高性能渲染和模块化的工具包,还可以让玩家拥有丰富的、身临其境的体验。
 
    由是之,星辰变成为向阿凡达致敬之第一部国产游戏成为可能,而谁会成为第二部、第三部乃至第N部?那将是玩家之福。

谷歌中国可以做的一些产品和应用

2010年02月27日 3:26 下午  |  分类:软件开发

      谷歌中国曾经开发了不少出色的产品和应用,不过有不少应用开发的功能比较少,我做为使用谷歌产品的用户,感觉有不少应用还有进一步提升的机会和可能,这里就列举一些可以进一步开发和提升的产品应用。

  谷歌音乐播放器:

  谷歌音乐是一个不错的本地化产品,速度和界面都不错,虽然歌曲库相对较少,但各方面功能都算全面,但有一个问题我一直感到不解,就是音乐播放器为什么没有客户端。

  音乐播放器的客户端需求其实非常简单实际,就是用户需要不联网的时候能听音乐。QQ就专门为QQ音乐做了一个客户端软件“QQ音乐”,可以管理本地的歌曲和歌手、自动下载歌词等,功能类似“千千静听”,并不复杂,如果谷歌也做一个音乐播放器的客户端,不但能提升谷歌音乐的访问量,还可以用这个小软件占领用户的桌面,用来推广谷歌的其他产品,可谓两全其美。
QQ音乐的界面

  谷歌浏览器中国版:

  谷歌浏览器有中文版,却没有在国内进行过类似火狐的推广,我们都知道,火狐浏览器有一个专门的中国版网站g-fox.cn,提供一个专门的“火狐中国版”,该版本专门针对中国用户的使用习惯做了一些定制扩展,并集成在浏览器里,对于网络初级用户来说有些用处。谷歌浏览器的界面简洁虽然让高端用户很喜欢,但这往往会让低端网络用户感到不知所措。
谷歌浏览器界面

  浏览器不仅仅是用户上网的入口,还能带来大量的收入,这方面360浏览器的推广是一个成功盈利模式。下图是我统计的前段时间网站访问者浏览器对比,可以看到对于月光博客这样的IT类网站,360浏览器都能达到第二名的水平,比Google Chrome几乎高了一倍,而这个浏览器只用了短短一年时间的推广。
月光博客网站访问者统计

  360浏览器推广成功的秘诀在于免费营销和绑定推广,前期以免费安全产品360安全卫士为主导获取了大量市场份额,之后再通过360安全卫士安装时的默认选项,让用户不知不觉中安装了这个360安全浏览器,如下图所示。
  而在360安全浏览器的安装最后,又会默认将上网首页设置为360网址导航,这样,随着360浏览器的装机量上升,360网址导航的访问量也会随之上升。而360网址导航则是360系列免费产品中最赚钱的,通过网址广告、搜索以及在此基础上推广网络游戏获得游戏收入等等,成为一个成功的免费盈利模式。
  谷歌以“不作恶”为信条,当然不可能按照360的这种推广方式营销,但其中某些做法也值得学习,因为中国有大量低端用户根本就不会上网,也记不住网站,如果谷歌浏览器可以针对这些低端用户进行一些插件扩展的定制开发,并设置主页为谷歌265上网导航,相信不但能提高这些用户的上网体验,还能开辟另一条完全不同的盈利渠道。
360浏览器界面

  谷歌拼音输入法手机版:

  谷歌拼音输入法的桌面版很不错,但奇怪的是,其他各个拼音输入法都推出了手机版输入法,例如腾讯QQ手机输入法、百度手机输入法、搜狗手机输入法等,唯独谷歌没有针对各个手机平台推出手机输入法,这是个非常奇怪的现象,手机平台的重要性已经毋庸置疑了,而手机输入法又是中国智能手机用户必装的软件,为什么这么简单的占领手机端的应用都会被遗忘呢?

  谷歌Picasa:

  谷歌的Picasa是一款不错的照片管理软件,各方面功能都很齐全,但Google Picasa目前只支持自己的网络相册,在Picasaweb经常无法访问的情况下,如果Google能像微软的Live照片库那样默认支持Flickr等其他网络相册,甚至支持国内各个门户网站的网络相册,那对于Picasa在国内的推广无疑会起到很大作用。

  谷歌Buzz:

  关于Google Buzz,我试用了一段时间,感觉需要修改的功能还是很多,最主要的一条是提供140字的录入限制版,目前Buzz不限制字数我认为不是一个明智的措施,这使得其在移动产品应用上的体验会差于Twitter,此外针对中国用户来说,Google Buzz还可以考虑做一个同步器服务,将Buzz的信息同步到新浪微博等国内微博客系统,当然前提还是需要140个字的录入限制。

  总而言之,谷歌开发的一些免费的客户端应用还有很大的提升空间,如果运营的好,可以帮助谷歌提高不少搜索的市场份额。

金山调整:盛大旧将任游戏高管 毒霸词霸换血

2010年02月26日 3:53 下午  |  分类:软件开发

29236145

盛大系接盘游戏 毒霸词霸高层换血

腾讯科技讯(乐天 李乐东)2月26日独家消息,金山软件(股票代码:03888.HK)近日在内部宣布了多项重要人事任命:原盛大游戏系统总经理吴裔敏出任金山网游总裁,金山安全副总裁王欣被任命金山安全软件CEO,全面负责金山毒霸业务,贾琳被任命为金山词霸业务总经理。

伴随多位高层的调整,金山旗下游戏和安全软件两大子公司也出现了大规模的人事调整。这一变化同时也意味着,金山和盛大自去年12月宣布成立合资公司之后,双方资源整合正在进入高潮。

盛大系入主金山游戏

2009年2月,金山公司宣布将旗下游戏、办公软件和安全软件三大业务分拆成三大独立公司,网游业务CEO职位由金山软件高级副总裁邹涛担任,金山软件高级副总裁、软件事业部总经理葛珂担任安全软件业务子公司CEO,负责金山毒霸、WPS等金山软件产品。

然而,在金山游戏与盛大游戏宣布成立合资公司之后,金山游戏的人事很快发生重大调整。据知情人向腾讯科技介绍,不久前加盟金山的吴裔敏已被正式任命为金山网游公司总裁,主管网游业务的具体运营,邹涛则转向负责网游的研发工作。金山游戏COO湛振阳协助邹涛负责研发工作。

值得注意的是,吴裔敏此前身份是盛大游戏系统总经理。与吴裔敏一同加盟金山的盛大系毕振华也有望出任金山游戏副总裁,具体负责运营方面的工作。另一位随吴裔敏加盟的原盛大员工,将接手金山游戏技术方面的领导工作。

去年12月,金山CEO求伯君曾向腾讯科技透露,盛大游戏与金山软件共同出资建立合资公司,并不存在谁控股的问题,双方持股比例相当。对于相应的人事任命,他当时未透露相关计划详情。

有意思的是,金山软件高级副总裁、金山游戏CEO邹涛在年前举行的游戏产业年会上也曾作出惊人表态:“金山人骨子里就没运营的基因”,“21年来研发是金山的主导性根文化,运营不过是大树上的小枝丫”。他认为,金山是拥有强大研发背景的公司,同时也造成了研发实力强过运营的缺憾。

业内人士认为,金山引入吴裔敏,显然希望游戏业务打破这种运营和研发实力不平衡的状态。

截至发稿前,腾讯科技还未获得金山游戏部门其他人事调整信息。但据知情人透露,从去年底开始,金山游戏部门便已进行局部人事调整,不少中高层职位已经发生变化。

不过,金山内部人士今日上午向腾讯科技透露,目前盛大与金山合资公司还在筹建阶段,而吴裔敏接管金山游戏运营,与金山与盛大合资公司并无直接联系。

王欣晋升为金山安全业务CEO

员工“换血”比例最高30%

上述不愿透露姓名的知情人透露,金山游戏的人事震荡只是金山旗下“三驾马车”全面转型的一个侧影,更大规模的人事调整还发生在金山旗下安全软件子公司。

腾讯科技独家获悉,春节之后,金山安全软件COO王欣被正式任命为子公司CEO,全面负责金山毒霸业务。与此同时,去年11月加盟金山的贾琳被任命为金山词霸业务总经理,负责金山词霸产品线整体规划。

在上述两项任命背后,随之而来的是子公司的大面积“换血”。

据知情人士透露,截至本周,金山毒霸业务北京部门已经完成员工劝退工作,裁员比例高达30%,其中毒霸北京的线下推广全部砍掉,其中一个部门裁员达30多人。同时金山安全软件还计划引入了大批“新鲜血液”,从而加速向互联网业务的全面转型。

同时,金山词霸部门也计划裁掉10%员工。从下周开始,人事部将和这些被劝退的员工一一面谈。“金山的想法是:未来词霸会更加深入的进行互联网战略。传统业务在不萎缩的前提下,其在词霸整体业务中的比重将不断降低。”该人士透露说。

由于金山毒霸、词霸的研发部门主要在珠海分公司。截至发稿前,腾讯科技还没有获得珠海方面是否裁员的消息。

资料显示,金山毒霸业务曾是金山软件利润来源的重要组成部分。但据上述人士透露,金山毒霸在过去一两年受到360等新兴网络安全厂商免费策略的冲击,业务已出现较大萎缩,向互联网转型已经成为金山全公司的共识。

据悉,现任金山安全软件CEO王欣过去一直倡导金山毒霸的互联网化,她在任职金山安全副总裁期间,曾主导金山毒霸的互联网化运营的转型。她的晋升也折射了金山要求安全软件业务转型的巨大决心。金山毒霸近期进行的内部调整应该可以看做应对冲击的第一步。

 

通过分区(Partition)提升MySQL性能

2010年02月24日 5:25 下午  |  分类:软件开发

什么是数据库分区?

数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

分区主要有两种形式://这里一定要注意行和列的概念(row是行,column是列)

1. 水平分区(Horizontal Partitioning)这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。

举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。(朋奕注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)

2. 垂直分区(Vertical Partitioning) 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列 被划分到特定的分区,每个分区都包含了其中的列所对应的行。

举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

在数据库供应商开始在他们的数据库引擎中建立分区(主要是水平分区)时,DBA和建模者必须设计好表的物理分区结构,不要保存冗余的数据(不同表中同时都包含父表中的数据)或相互联结成一个逻辑父对象(通常是视图)。这种做法会使水平分区的大部分功能失效,有时候也会对垂直分区产生影响。

在MySQL 5.1中进行分区

MySQL5.1中最激动人心的新特性应该就是对水平分区的支持了。这对MySQL的使用者来说确实是个好消息,而且她已经支持分区大部分模式:

Range(范围) – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980’s)的数据,90年代(1990’s)的数据以及任何在2000年(包括2000年)后的数据。

Hash(哈希) – 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区,。例如DBA可以建立一个对表主键进行分区的表。

Key(键值) – 上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

List(预定义列表) – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA建立了一个横跨三个分区的表,分别根据2004年2005年和2006年值所对应的数据。

Composite(复合模式) - 很神秘吧,哈哈,其实是以上模式的组合使用而已,就不解释了。举例:在初始化已经进行了Range范围分区的表上,我们可以对其中一个分区再进行hash哈希分区。

分区带来的好处太多太多了,有多少?俺也不知道,自己猜去吧,要是觉得没有多少就别用,反正俺也不求你用。不过在这里俺强调两点好处:

性能的提升(Increased performance) - 在扫描操作中,如果MySQL的优化器知道哪个分区中才包含特定查询中需要的数据,它就能直接去扫描那些分区的数据,而不用浪费很多时间扫描不需要的地方了。需要举个例子?好啊,百万行的表划分为10个分区,每个分区就包含十万行数据,那么查询分区需要的时间仅仅是全表扫描的十分之一了,很明显的对比。同时对十万行的表建立索引的速度也会比百万行的快得多得多。如果你能把这些分区建立在不同的磁盘上,这时候的I/O读写速度就“不堪设想”(没用错词,真的太快了,理论上100倍的速度提升啊,这是多么快的响应速度啊,所以有点不堪设想了)了。

对数据管理的简化(Simplified data management) - 分区技术可以让DBA对数据的管理能力提升。通过优良的分区,DBA可以简化特定数据操作的执行方式。例如:DBA在对某些分区的内容进行删除的同时能保证余下的分区的数据完整性(这是跟对表的数据删除这种大动作做比较的)。

此外分区是由MySQL系统直接管理的,DBA不需要手工的去划分和维护。例如:这个例如没意思,不讲了,如果你是DBA,只要你划分了分区,以后你就不用管了就是了。

站在性能设计的观点上,俺们对以上的内容也是相当感兴趣滴。通过使用分区和对不同的SQL操作的匹配设计,数据库的性能一定能获得巨大提升。下面咱们一起用用这个MySQL 5.1的新功能看看。

下面所有的测试都在Dell Optiplex box with a Pentium 4 3.00GHz processor, 1GB of RAM机器上(炫耀啊……),Fedora Core 4和MySQL 5.1.6 alpha上运行通过。

如何进行实际分区

看看分区的实际效果吧。我们建立几个同样的MyISAM引擎的表,包含日期敏感的数据,但只对其中一个分区。分区的表(表名为part_tab)我们采用Range范围分区模式,通过年份进行分区:

 

1. mysql> CREATE TABLE part_tab
2. -> ( c1 int default NULL,
3. -> c2 varchar(30) default NULL,
4. -> c3 date default NULL
5. ->
6. -> ) engine=myisam
7. -> PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995),
8. -> PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,
9. -> PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,
10. -> PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,
11. -> PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,
12. -> PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),
13. -> PARTITION p11 VALUES LESS THAN MAXVALUE );
14. Query OK, 0 rows affected (0.00 sec)

注意到了这里的最后一行吗?这里把不属于前面年度划分的年份范围都包含了,这样才能保证数据不会出错,大家以后要记住啊,不然数据库无缘无故出错你就爽了。那下面我们建立没有分区的表(表名为no_part_tab):
1. mysql> create table no_part_tab
2. -> (c1 int(11) default NULL,
3. -> c2 varchar(30) default NULL,
4. -> c3 date default NULL) engine=myisam;
5. Query OK, 0 rows affected (0.02 sec)

下面咱写一个存储过程(感谢Peter Gulutzan给的代码,如果大家需要Peter Gulutzan的存储过程教程的中文翻译也可以跟我要,chenpengyi◎gmail.com),它能向咱刚才建立的已分区的表中平均的向每个分区插入共8百万条不同的数据。填满后,咱就给没分区的克隆表中插入相同的数据:
1. mysql> delimiter //
2. mysql> CREATE PROCEDURE load_part_tab()
3. -> begin
4. -> declare v int default 0;
5. -> while v < 8000000
6. -> do
7. -> insert into part_tab
8. -> values (v,’testing partitions’,adddate(’1995-01-01′,(rand(v)*36520) mod 3652));
9. -> set v = v + 1;
10. -> end while;
11. -> end
12. -> //
13. Query OK, 0 rows affected (0.00 sec)
14. mysql> delimiter ;
15. mysql> call load_part_tab();
16. Query OK, 1 row affected (8 min 17.75 sec)
17. mysql> insert into no_part_tab select * from part_tab;
18. Query OK, 8000000 rows affected (51.59 sec)
19. Records: 8000000 Duplicates: 0 Warnings: 0

表都准备好了。咱开始对这两表中的数据进行简单的范围查询吧。先分区了的,后没分区的,跟着有执行过程解析(MySQL Explain命令解析器),可以看到MySQL做了什么:

 

1. mysql> select count(*) from no_part_tab where
2. -> c3 > date ‘1995-01-01′ and c3 < date ‘1995-12-31′;
3. +———-+
4. | count(*) |
5. +———-+
6. | 795181 |
7. +———-+
8. 1 row in set (38.30 sec)
9. mysql> select count(*) from part_tab where
10. -> c3 > date ‘1995-01-01′ and c3 < date ‘1995-12-31′;
11. +———-+
12. | count(*) |
13. +———-+
14. | 795181 |
15. +———-+
16. 1 row in set (3.88 sec)
17. mysql> explain select count(*) from no_part_tab where
18. -> c3 > date ‘1995-01-01′ and c3 < date ‘1995-12-31′\G
19. *************************** 1. row ***************************
20. id: 1
21. select_type: SIMPLE
22. table: no_part_tab
23. type: ALL
24. possible_keys: NULL
25. key: NULL
26. key_len: NULL
27. ref: NULL
28. rows: 8000000
29. Extra: Using where
30. 1 row in set (0.00 sec)
31. mysql> explain partitions select count(*) from part_tab where
32. -> c3 > date ‘1995-01-01′ and c3 < date ‘1995-12-31′\G
33. *************************** 1. row ***************************
34. id: 1
35. select_type: SIMPLE
36. table: part_tab
37. partitions: p1
38. type: ALL
39. possible_keys: NULL
40. key: NULL
41. key_len: NULL
42. ref: NULL
43. rows: 798458
44. Extra: Using where
45. 1 row in set (0.00 sec)

从上面结果可以容易看出,设计恰当表分区能比非分区的减少90%的响应时间。而命令解析Explain程序也告诉我们在对已分区的表的查询过程中仅对第一个分区进行了扫描,其他都跳过了。
哔厉吧拉,说阿说……反正就是这个分区功能对DBA很有用拉,特别对VLDB和需要快速反应的系统。

对Vertical Partitioning的一些看法

虽然MySQL 5.1自动实现了水平分区,但在设计数据库的时候不要轻视垂直分区。虽然要手工去实现垂直分区,但在特定场合下你会收益不少的。例如在前面建立的表中,VARCHAR字段是你平常很少引用的,那么对它进行垂直分区会不会提升速度呢?咱们看看测试结果:

 

1. mysql> desc part_tab;
2. +——-+————-+——+—–+———+——-+
3. | Field | Type | Null | Key | Default | Extra |
4. +——-+————-+——+—–+———+——-+
5. | c1 | int(11) | YES | | NULL | |
6. | c2 | varchar(30) | YES | | NULL | |
7. | c3 | date | YES | | NULL | |
8. +——-+————-+——+—–+———+——-+
9. 3 rows in set (0.03 sec)
10. mysql> alter table part_tab drop column c2;
11. Query OK, 8000000 rows affected (42.20 sec)
12. Records: 8000000 Duplicates: 0 Warnings: 0
13. mysql> desc part_tab;
14. +——-+———+——+—–+———+——-+
15. | Field | Type | Null | Key | Default | Extra |
16. +——-+———+——+—–+———+——-+
17. | c1 | int(11) | YES | | NULL | |
18. | c3 | date | YES | | NULL | |
19. +——-+———+——+—–+———+——-+
20. 2 rows in set (0.00 sec)
21. mysql> select count(*) from part_tab where
22. -> c3 > date ‘1995-01-01′ and c3 < date ‘1995-12-31′;
23. +———-+
24. | count(*) |
25. +———-+
26. | 795181 |
27. +———-+
28. 1 row in set (0.34 sec)

在设计上去掉了VARCHAR字段后,不止是你,俺也发现查询响应速度上获得了另一个90%的时间节省。所以大家在设计表的时候,一定要考虑,表中的字段是否真正关联,又是否在你的查询中有用?

补充说明

这么简单的文章肯定不能说全MySQL 5.1 分区机制的所有好处和要点(虽然对自己写文章水平很有信心),下面就说几个感兴趣的:

◆支持所有存储引擎(MyISAM, Archive, InnoDB, 等等)

◆ 对分区的表支持索引,包括本地索引local indexes,对其进行的是一对一的视图镜像,假设一个表有十个分区,那么其本地索引也包含十个分区。

◆关于分区的元数据Metadata的表可以在INFORMATION_SCHEMA数据库中找到,表名为PARTITIONS。

◆All SHOW 命令支持返回分区表以及元数据的索引。

◆对其操作的命令和实现的维护功能有(比对全表的操作还多):

 

1. o ADD PARTITION
2. o DROP PARTITION
3. o COALESCE PARTITION
4. o REORGANIZE PARTITION
5. o ANALYZE PARTITION
6. o CHECK PARTITION
7. o OPTIMIZE PARTITION
8. o REBUILD PARTITION
9. o REPAIR PARTITION

站在性能主导的观点上来说,MySQL 5.1的分区功能能给数据性能带来巨大的提升的同时减轻DBA的管理负担,如果分区合理的话。

360狂砸杀毒投放央视广告将带来什么?

2010年02月23日 3:50 下午  |  分类:软件开发

   360在央视投放免费杀毒广告不仅是扩大免费杀毒的影响力,同时也是让自己破釜沉舟将免费进行到底,更是将360这个品牌和免费的趋势深入到每一个网民的心中。

 

    春节期间遇到的最雷人的事,不是赵本山春晚当“软广告王”,也不是刘谦把魔术搞成“演话剧”,而是360在央视狂砸的广告。为啥这么说?

 

    1、一个免费的产品如此大张旗鼓的做电视媒体宣传,这在中国互联网领域、中国广告历史上除了淘宝以外,恐怕是前所未有的。单纯考量这个广告的投放回报比,可以说是0(不会给360带来直接任何收入),够雷的。

 

    2、看看360广告的其中几个播出时段:CCTV-1新闻联播、今日说法之后,还有CCTV-2、5、6等好几个频道都有滚动播出。好家伙,这阵势真有点“标王”的风采了,又是一雷。

 

    3、从广告内容来看,创意很简单,甚至谈不上任何创意,但绝对雷人:身兼主持人、导演和演员多职的刘仪伟拿着喇叭,反复喊“免费”、“永久免费”、“(360杀毒)再也不用花钱啦”。

 

    我认为360这次雷人的广告行为会产生3个结果:

 

    1、全中国人民都知道“杀毒软件免费”,尤其是免费的理念将深入人心,进而为360带来品牌上的快速提升。我个人认为,装机量绝对不是360投广告的目的,这样做成本太高了。实际上从第三方艾瑞公布的360的数据来看,“免费杀毒”根本不愁装机量。截至2009年底,360杀毒的用户覆盖率已经到了30.8%,在也就是说有1亿多人在使用这个免费杀毒软件。

 

    尽管不是直接目的,但央视这一轮投放一定会间接拉高360的装机量和市场占有率,而且这其中很多是一些对互联网并不熟悉的低端初级网民。这将帮助360拿下更多的增量潜在用户市场,从用户量和品牌上全面超越超过收费杀毒,应该几乎只是时间问题。

 

    2、对收费杀毒形成一种震慑力,但也让自己破釜沉舟。我不知道其他杀毒厂商的老板们看到刘仪伟卖力地喊着“免费”的时候,心情如何?估计不会舒服。登陆央视已让周鸿祎没有退路——让全国人民一起作证,他不但必须做一个坚定的免费主义者,也必须与收费杀毒抗争战斗到底,而且还得让360的产品和服务还要做得比收费杀软还要更好,否则“免费”只能成为一句口号反倒会成为众矢之的。

 

    3、杀毒江湖可能变天已成定局。从360宣布免费以来,收费杀毒一方面打压免费杀毒,保持自己的姿态和立场,但另一方面不断通过降价促销、采用阶段性增加免费时段等手法来拖延竞争态势,但同时它们也在做着各种抵制关于“免费杀毒”的种种尝试。但笔者我相信随着免费杀毒声势的进一步壮大,可能有必然会更多的收费杀毒转投身免费阵营。这样正中周鸿祎下怀。杀毒软件这个互联网最后一块基础服务市场必将像当年的邮箱、游戏那样,彻底免费化。

Pages: 1 2 Next