博客首页|TW首页| 同事录|业界社区
2010-08-31

  我们知道在C++里有专门的bool类型,用来表示真或假。但是在C语言里没有这样的类型(至少我是一直这么认为的),表达式的值0为假,非0为真。所以条件判断语句( if(…)、while(…) )非常灵活,甚至一个指针类型都可以是条件表达式。

  为了使程序更清晰,我们常常会给出如下的宏定义:

  typedef int BOOL;

  #define TRUE 1

  #define FALSE 0

  这是最常见的写法,能被任何C语言编译器认可。

  今天我在一段程序里看见这么一行 #include ,这个陌生的头文件还以std打头而且还和bool有关,引起了我的警觉,立刻百度之。得知这是C99标准新增的头文件,意在引入bool类型,使之和C++兼容。随后我看了一下这个头文件的源代码,内容如下:

  /*

  * ISO C Standard: 7.16 Boolean type and values

  */

  #ifndef _STDBOOL_H

  #define _STDBOOL_H

  #ifndef __cplusplus

  #define bool _Bool

  #define true 1

  #define false 0

  #else /* __cplusplus */

  /* Supporting in C++ is a GCC extension. */

  #define _Bool bool

  #define bool bool

  #define false false

  #define true true

  #endif /* __cplusplus */

  /* Signal that all the definitions are present. */

  #define __bool_true_false_are_defined 1

  #endif /* stdbool.h */

  这个头文件很短,而且也很明了,不过我对_Bool这个类型产生的兴趣。又一翻百度,发现这是C99标准引入的新的关键字。对,是关键字,而不是宏定义,也不是typedef。通过sizeof(_Bool);得知这个类型占1个字节,而且无论给这个类型的变量赋任何非0整数值,其值都是1,这也说明了他不是其他整数类型的别名。

  好了,其实说白了,C语言不是没有布尔类型,只能说在C99标准之前没有。现在只要在源文件中包含stdbool.h这个头文件,就可以在C语言里像C++那样使用bool类型了。

  人说,有人的地方就有江湖,有江湖的地方就有利益,而最近互联网江湖因利益产生的口水争斗中,腾讯则成为了众矢之的。天下熙熙皆为利来,只能怪小企鹅的触角伸得太长,抢了其他人的饭碗。企鹅的触角在互联网江湖里到底有多长?覆盖到哪些领域?

  QQ游戏战略分析:农村包围城市,人数优势相当明显!

  为什么说QQ是农村包围城市?参照我国战争的成功路径,可得知农村有广阔的人群和无限潜能,可以足够多的人数优势来战胜时间先入优势,而这正是人数超多的QQ一直在加以发扬光大的。

  QQ游戏从无到有、再到发展壮大的思路清晰明了,遵循唯一的一个守则:我们来模仿市场上最赚钱的模式吧!于是,我们看到QQ游戏大厅代替了中国游戏中心;地下城与勇士、穿越火线、寻仙等成为了各式排行榜前几名;曾经名噪一时的劲舞团、跑跑卡丁车、泡泡堂等,也被QQ炫舞、QQ飞车、QQ堂等追赶或超越着。几乎你能数的出名字的网游,都对应有一个QQ游戏在跟你抗衡着,而你还必须时刻提防着!

  QQ网页游戏布局:产品开路,平台先行!

  就在上个月,QQ的网页游戏中心已经开通,将以平台的形式布局网页游戏,而与新浪玩玩网页游戏不同的是,QQ网页游戏中心上线时更多的是自己的游戏,而少联运,至于以后如何发展则有待进一步观察。

  有报告显示中国网页游戏用户规模已达1.05亿,其中社交类网页游戏用户为9209万,大型网页游戏用户规模2384万,单机网页游戏用户规模3791万。据报告中指出,44.3%的大型网页游戏用户在游戏中产生过花费。而从用户使用年限上看,使用年龄在3年以上的用户比例达到60.9%。CNNIC分析师认为,由于付费率较高、使用年限较长,所以大型网页游戏有较大的盈利机遇。

  庞大的市场蛋糕,让QQ闻到了盈利的味道,这支一向嗅觉灵敏的企鹅毫不犹豫的通过产品开路、平台先行的策略正式向网页游戏行业进军,而玩家的反应也很高涨,这一唱一和之下,相信很多页游厂商会心里直呼“狼来了”!

  网页游戏如何阻击?

  在市场逐渐繁荣的前景下,网页游戏行业的现状却是抄袭的游戏扎堆,精品太少,与QQ抗衡最重要的是要有精品,QQ注定不会将全部心力都在网页游戏行业,这就给了其他游戏生存的空间,如果某些人还是继续抱着赚一笔就跑的想法的话,基本就只有死路一条了。当然经过沉淀后现在也有一些精品的页游,能够有创新和突破的页游,比如下面的几款。

  傲视天地:充满创新和激昂的三国策略之作

  如你所知,这是一款三国类的策略游戏,而战争策略类的产品越来越不好混了。总体来说,这是N多你可能会混淆的三国策略网页游戏中的其中一款,这是一款经历过口碑从坏到好这样一个阶段的网页游戏。在这样的市场环境下这款游戏能够出头,大概会有一种”大难不死必有后福”的庆幸,以及”我是一只经历过大风大浪的洞庭湖老麻雀”的大气。

  如果用腾讯老总马化腾的思维来解释创新,就是不断学习最佳案例,无疑《傲视天地》是符合马总的商业哲学的,傲视的创新并没有跳脱游戏本质做不着边际的创新,只不过是跳脱战争策略游戏的固有模式,向其他游戏做了借鉴而已。让玩家不需等待造房子造兵就可以体验激昂的沙场征战,是从一开始就吸引玩家玩下去的理由,当然也有不受欢迎的地方,不那么完善的地方,但总的来说,是一款优质的、充满诚意的作品。

  总体来说,可以用继承与发扬来概括游戏的特色,继承了战争策略类游戏的基本玩法,虽然号称解放玩家的时间,却仅仅用了一个障眼法把等待时间放到了另外的地方,新手引导较为细致,玩家上手比较容易,不会产生生疏之感。金币的最大用途仍然是消耗等待时间,虽然收费功能比较隐蔽但还是必须承认得金币者得天下。

  至于游戏创新的地方确实较多,不然也不可能从一众策略网游中杀将出来,最核心的创新还是数千兵种的战将系统、相生相克的排兵布阵系统、不同势力的推图系统和组团爆BOSS的过关系统,让该游戏从众多同类游戏中脱颖而出。

  当然游戏也有很多小细节的创新和改良,有好有坏,比如军令系统,打仗是需要要军令的,而推图打BOSS的时候,军令实在是供不应求,很多玩家都是开着游戏,等待军令恢复再去作战和做任务,时间还是个重要门槛。另外作战也有小创新,如作战前,可以查看前5名过此关的玩家的攻略,作战时如果不想看过程,可以直接点结果查看,也可以有正常、快速、特效等观看选择,在战争结束后,可以选择重播,很细节和人性化的创新。

  功夫派:在儿童页游市场能否撼住QQ?

  把《功夫派》单独作为一款游戏来对抗QQ军团,似乎有些为难,但是把《功夫派》的东家淘米网络的《摩尔庄园》、《赛尔号》加起来,则足可以在儿童页游市场与QQ一较高低。

  淘米网络的出身于QQ的、一手操办了QQ宠物的老总,看到了儿童游戏的庞大市场,于是自己创业做起了儿童社区页游,《摩尔庄园》的横空出世让CCTV都主动报道了几次,接连面世的《赛尔号》、《功夫派》也都是有目的的面向不同的人群,野心十足!

  而相对于之前两款游戏的梦幻和未来感,《功夫派》更注重的是古风与武侠,而这个也很容易能够引起小朋友的共鸣。当然这款游戏有他的独特之处与创新之处,也就是我说的能够对抗QQ的法宝。主要表现在游戏画面的优美与古朴厚重中国风、丰富多样趣味的任务系统、依靠键盘打击感强的街机战斗模式等,这些创新或者说是突破,是淘米网络不断突破自己,完善产品链的一个非常值得赞赏的举措,对抗QQ的进攻,有戏!

  十年一剑:部分sns式的创新可取!

  《十年一剑》的宣传攻势很火很强大,品质(包括画面与音效)确实也不错,确实有页游大作的风范,也不太愧对“十年磨一剑”的噱头,但全自动的战斗模式,让我完全没有尝试各类武侠功夫的打击快感。

  《十年一剑》的开头很有武侠风,主角从一个被惊醒的梦开始,然后照顾你多年的老人引导你去完成江湖梦想,等等,是不是很熟悉?对,如果你玩过仙剑奇侠传的话,相信你会心中一热,一度认为:这,就是我要的游戏!

  但这却是一个“我只猜中了故事的开头,却猜不到结尾”式的杯具!按照官方的说法,武功共分为刀、剑、枪、棍、掌、腿六大类,玩家在游戏过程中可自由学习各种武功,六种武功集与一身也绝非难事。但是如前所述的战斗方式,没有让我直接享受到各种武功带来的不同感觉,让我直接对这些武功分类失去了兴趣。

  不过《十年一剑》在玩法上的一些创新还是让我们看到了诚意与突破,群英会、幸运星、座位抢夺等游戏玩法,都融入了SNS式的操作在里面,可以有效的增加玩家之间的互动,从已经试玩的玩家反应来看,他们对这些玩法和系统也比较认可,确信这对网页游戏的玩法丰富来说是一个好的发展方向。

  而现在网页游戏行业的大方向,从各大厂商、媒体、专业人士、玩家的反应来看,webgame与SNS的融合,应该是大趋势了,而《十年一剑》在某些方面的缺失,由他的SNS玩法创新给弥补了回来,在将来对抗腾讯的阵营中足有一地!

  当然,有诚意与创新的网页游戏作品还有很多,特别是在2010年,更是呈现出了精品页游层出不穷的现象,这是网页游戏行业在经历了野蛮增长、模式单一、发展困局之后的必走之路。在腾讯等寡头看中日益增大的网页游戏市场蛋糕后,原有的厂商该怎么办?这里列举的是一些可以抵抗QQ进攻的可借鉴范例,我想说的是诚意和创新,始终是生存的根本!另外一些创意精品大作,因视野、时间所限咱不能一一列举,敬请谅解!

2010-08-30

  最近有人对我说,老姚,你自称“大喷子老姚”,可是到现在也没见你喷过什么啊,真是名不副实啊。

  我惭愧。几乎无言以对。

  其实,喷这个字,多少是带有一些不太理性的成分,而我则是一个比较理性的人,不会随便乱喷,更何况在我们国家中,有些话能说,有些话不能说,乱喷的结果好一点被请去喝茶,不好呢那就不一定能再有机会发声音了。这种例子不少,像郭德纲、袁鹏飞什么的,所以说,喷是一个有技术含量的事情,即要喷出心中所想,又要避免惹火上身,这点韩寒、李大眼的尺度掌握得非常微妙,值得借鉴。

  所幸老姚是混游戏圈子的,这个圈子比较安全,最多喷的不好会得罪一些厂商,在媒体圈搞个封杀什么的,也就这样了,谁让现在游戏媒体基本上都属于半个太监呢——厂商一个电话过来,销售立马找到编辑,一个字,撤!

  所以说,我还是很喜欢博客,现在还有了微博,它可以让我说一些媒体上无法说的东西。像这次的CWLK,不少媒体朋友向我约稿,想让我写点东西,我就说,那我写点尺度大的,喷的行不行?媒体朋友说:其实我真想让你写,但是你也知道,写的过了肯定被删,那多可惜啊。

  我也苦笑,是啊,虽说网易在公关上做的一直不怎么样,但删点文章的能力还是有的。不过我又一想,不对啊,我为什么要喷网易和CWLK呢?人家多么不容易,多花了那么多钱把WOW给拿下来了,然后又花了更多的钱,用了一年多时间才把道路铺平,等到大家把台服的WLK玩腻了才争取到了这来之不易的开服,这其中的过程要是写出来,估计可以弄一个什么“辛酸史”、“血泪史”之类的了,所以我要喷也不能喷网易,但是想喷的我又不能喷,于是我应该写什么呢? 就写写作为玩家之一的我的一些感受吧!

  这次CWLK的开服让我想起一个故事,我认识一个阳痿多年的人,某天突然得到一记灵丹妙药,一下子雄起了,他于是兴奋无比,去找他那个一直等他的漂亮女友,结果他却杯具地发现,女友已经实在等不及,跟着别的男人跑路了。

  其实这事也怪暴雪,你说你开什么职业不好,偏偏开一个“死亡骑士”,那些技能和任务,都是些什么死亡啊、反叛啊、屠杀啊、一句话——比三俗的性质还要恶劣。那些负责审批的领导们肯定没有魔兽的粉丝,也不懂魔兽的历史,他们看到这种设定肯定是“拍案惊奇”,结果也只能是一个字——改!

  据说CWLK改动挺多的,其实不用据说,我用膝盖都能想到。自从盗贼改为“潜行者”以后,我就知道,CWOW肯定是WOW家族的一枝奇葩。就像很多电影都会有一个“内地版”,或者删减敏感镜头,或者直接修改不和谐的结局,总之中国的观众和玩家看到的总是经过二次加工的艺术作品,面对这种特殊待遇,不知道我们应该是高兴还是悲哀?

  不过,比起这些电影,CWLK更惨那么一点,不仅被阉割,还迟了一年多,人心都散了,再加上台服马上就要开CTM——这个快感真的不是打了一点半点的折扣,让人怎么也兴奋不起来。

  正当CWLK面临尴尬的局面时,一个非常体贴及时的消息来了——禁止交易未经审批的网络游戏点卡,这明显是针对台服魔兽点卡而来。我想我要是丁磊,只怕是感动得内牛满面了。CWLK没开这段时间,着实肥了一批贩卖点卡、代理服务器软件的人,这个规定先断了这些JS断的财路,然后玩家买不到台服点卡,就只能来玩我的CWLK了,妥妥的。

  不过站在玩家的角度来讲,似乎不能算是一件好事。本来玩什么游戏是玩家的自由,更何况台湾是我们伟大祖国不可分割的一部分,玩家抱着亲切友好的态度去和台湾玩家互动,也是为了增进两岸人民的友谊,这也算为咱们国家的统一做出了贡献,这下被强制拉回CWLK,不免多少有些郁闷。

  不过JS们总是有办法的,于是“智凡迪月饼”、“学雷锋季卡”出现了,买卖双方都知道这是什么玩意,让人多少有些哭笑不得。但是这次的政策来头不小,估计就算是伪装起来的这些东西,寿命也不会很长,过不了多久,台服点卡交易将全面转入地下,部分比较执着的玩家可以继续为两岸关系做努力,但是对于大部分玩家来说,他们将毫无选择的在被阉割后的CWLK中感受着不太完全的WOW,是否有快感将取决于个人天赋。对了,顺便再奢望的期盼一下CCTM能早点到来,否则就真想CTM了。

文:姚宇(转载请注明作者)

2010-08-27

  一般来说像我们访问的地址都叫做域名,而众所周知网络中的任何一个主机都是IP地址来标识的,也就是说只有知道了这个站点的IP地址才能够成功实现访问操作。

  不过由于IP地址信息不太好记忆,所以网络中出现了域名这个名字,在访问时我们这需要输入这个好记忆的域名即可,网络中会存在着自动将相应的域名解析成IP地址的服务器,这就是DNS服务器。能够实现DNS解析功能的机器可以是自己的计算机也可以是网络中的一台计算机,不过当DNS解析出现错误,例如把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,我们就无法通过域名访问相应的站点了,这就是DNS解析故障。

  出现DNS解析故障最大的症状就是访问站点对应的IP地址没有问题,然而访问他的域名就会出现错误。

  当我们的计算机出现了DNS解析故障后不要着急,解决的方法也很简单。

  (1)用nslookup来判断是否真的是DNS解析故障:

  要想百分之百判断是否为DNS解析故障就需要通过系统自带的NSLOOKUP来解决了。

  第一步:确认自己的系统是windows 2000和windows xp以上操作系统,然后通过“开始->运行->输入CMD”后回车进入命令行模式。

  第二步:输入nslookup命令后回车,将进入DNS解析查询界面。

  第三步:命令行窗口中会显示出当前系统所使用的DNS服务器地址,例如笔者的DNS服务器IP为202.106.0.20。

  第四步:接下来输入你无法访问的站点对应的域名。假如不能访问的话,那么DNS解析应该是不能够正常进行的。我们会收到DNS request timed out,timeout was 2 seconds的提示信息。这说明我们的计算机确实出现了DNS解析故障。

  小提示:如果DNS解析正常的话,会反馈回正确的IP地址。

  (2)查询DNS服务器工作是否正常:

  这时候我们就要看看自己计算机使用的DNS地址是多少了,并且查询他的运行情况。

  第一步:确认自己的系统是windows 2000和windows xp以上操作系统,然后通过“开始->运行->输入CMD”后回车进入命令行模式。

  第二步:输入ipconfig /all命令来查询网络参数。

  第三步:在ipconfig /all显示信息中我们能够看到一个地方写着DNS SERVERS,这个就是我们的DNS服务器地址。例如笔者的是202.106.0.20和202.106.46.151。从这个地址可以看出是个外网地址,如果使用外网DNS出现解析错误时,我们可以更换一个其他的DNS服务器地址即可解决问题。

  第四步:如果在DNS服务器处显示的是自己公司的内部网络地址,那么说明你们公司的DNS解析工作是交给公司内部的DNS服务器来完成的,这时我们需要检查这个DNS服务器,在DNS服务器上进行nslookup操作看是否可以正常解析。解决DNS服务器上的DNS服务故障,一般来说问题也能够解决。

  (3)清除DNS缓存信息法:

  当计算机对域名访问时并不是每次访问都需要向DNS服务器寻求帮助的,一般来说当解析工作完成一次后,该解析条目会保存在计算机的DNS缓存列表中,如果这时DNS解析出现更改变动的话,由于DNS缓存列表信息没有改变,在计算机对该域名访问时仍然不会连接DNS服务器获取最新解析信息,会根据自己计算机上保存的缓存对应关系来解析,这样就会出现DNS解析故障。这时我们应该通过清除DNS缓存的命令来解决故障。

  第一步:通过“开始->运行->输入CMD”进入命令行模式。

  第二步:在命令行模式中我们可以看到在ipconfig /?中有一个名为/flushdns的参数,这个就是清除DNS缓存信息的命令。

  第三步:执行ipconfig /flushdns命令,当出现“successfully flushed the dns resolver cache”的提示时就说明当前计算机的缓存信息已经被成功清除。

  第四步:接下来我们再访问域名时,就会到DNS服务器上获取最新解析地址,再也不会出现因为以前的缓存造成解析错误故障了。

  (4)修改HOSTS文件法:

  修改HOSTS法就是把HOSTS文件中的DNS解析对应关系进行修改,从而实现正确解析的目的。因为在本地计算机访问某域名时会首先查看本地系统中的HOSTS文件,HOSTS文件中的解析关系优先级大于DNS服务器上的解析关系。

  这样当我们希望把某个域名与某IP地址绑定的话,就可以通过在HOSTS文件中添加解析条目来实现。

  第一步:通过“开始->搜索”,然后查找名叫hosts的文件。

  第二步:当然对于已经知道他的路径的读者可以直接进入c:\windows\system32\drivers\etc目录中找到HOSTS文件。如果你的系统是windows 2000,那么应该到c:\winnt\system32\drivers\etc目录中寻找。

  第三步:双击HOSTS文件,然后选择用“记事本”程序将其打开。

  第四步:之后我们就会看到HOSTS文件的所有内容了,默认情况下只有一行内容“127.0.0.1 localhost”。(其他前面带有#的行都不是真正的内容,只是帮助信息而已)

  第五步:将你希望进行DNS解析的条目添加到HOSTS文件中,具体格式是先写该域名对应的IP地址,然后空格接域名信息。

  第六步:设置完毕后我们访问网址时就会自动根据是在内网还是外网来解析了。

  在C++中,还有一个引用的概念。引用就是一个变量的别名,它需要用另一个变量或对象来初始化自身。引用就像一个人的外号一样,例如:有一个人,他的名字叫做张旭,因他在家排行老三,别人给他取了一个外号叫张三,这样,我们叫张三或张旭,指的都是同一个人。下面的代码声明了一个引用b,并用变量a进行了初始化。

  int a = 5;

  int &b = a; //用&表示申明一个引用。引用必须在申明时进行初始化

  考虑下面代码:

  int a = 5;

  int &b = a;

  int c=3; //此处并不是将b变成c的引用,而是给b赋值,此时,b和a的值都变成了3

  引用和用来初始化引用的变量指向的是同一块内存,因此通过引用或者变量可以改变同一块内存中的内容。引用一旦初始化,它就代表了一块特定的内存,再也不能代表其他的内存。

  那么引用和指针变量有什么区别呢?

  引用只是一个别名,是一个变量或对象的替换名称。引用的地址没有任何意义,因此C++没有提供访问引用本身地址的方法。引用的地址就是它所引用的变量或者对象的地址,对引用的地址所做的操作就是对被引用的变量或对象的地址所做的操作。指针是地址,指针变量要存储地址值,因此要占用存储空间,我们可以随时修改指针变量所保存的地址值,从而指向其他的内存。

  引用和指针变量的内存模型如图2.15所示。

  在编写程序时,很少直接使用引用,即用一个变量来初始化一个引用(int a; int &b=a),如果这么做,通过变量和引用都可以修改同一块内存的内容,在程序中,就很容易出现问题,不知道此时内存中的值到底是多少了。

  引用多数用在函数的形参定义上,在调用函数传参时,我们经常使用指针传递,一是避免在实参占较大内存时发生值的复制,二是完成一些特殊的作用,例如,要在函数中修改实参所指向内存中的内容。同样,使用引用作为函数的形参也能完成指针的功能,在有些情况下还能达到比使用指针更好的效果。

  下面,我们以一段程序(如例2-23所示)的讲解作为引用这一小节的结束。

  例2-23

  #include

  //change函数主要用来交换a和b的值

  void change(int& a,int& b);

  void main()

  {

  int x=5;

  int y=3;

  cout<<”original x=”<

  cout<<”original y=”<

  change(x,y); //此处如果用指针传递,则调用change(&x, &y),这样很容易让人

  迷惑,不知道交换的是x和y的值,还是x和y的地址?此处用引用,

  可读性就比指针要好

  cout<<”changed x=”<

  cout<<”changed y=”<

  }

  /*在change()函数的实现中,我们采用了一个小算法,完成了a和b值的交换,读者下来可以仔细研读,细细体味一下(读者还可以采用其他的方法,当然也可以直接使用通常的实现,定义一个临时变量,完成a和b值的交换)*/

  void change(int& a,int& b)

  {

  a=a+b;

  b=a-b;

  a=a-b;

  }

  调优是一个大主题,涉及面颇广。目前受条件所限,大部分人可能只能从apache本身入手调优。所以本文将主要从apache的配置方面入手来详解apache调优。希望对正在使用apache的朋友有所裨益,有什么问题欢迎交流探讨,大家共同学习共同进步!

  KeepAlive参数

  KeepAlive On

  MaxKeepAliveRequests 0

  KeepAliveTimeout 15

  使用keepalive可以在单一连接时进行多个请求。

  Keepalivetimeout 每个连接保持的时间

  MaxKeepAliveRequests这个我就不解释了,意思是最大保持的连接数,0为不限制。

  我在来形象的描述一下,KeepAlive中的连接就像是餐厅中的女服务员,我和几个哥们要了几个菜以后,她不走还站继续服务(雅间门口的服务员),等了一个小时超过了她的最大服务时间(Keepalivetimeout),于是她撤了

  这个功能是开还是不开呢?因服务器而异,就像五星级的餐厅和街边小餐馆的区别。

  选择多处理模块(Multi-Processing Module,MPM)

  这玩意主要负责管理网络连接、调度请求。理解成不同的社会制度就好,万恶的封建主义和万恶的资本主义,很难说的清谁好谁坏,所以针对不同情况选择就好。

  每次只能有一种 MPM 被应用,必须使用 –with-mpm=(worker|prefork|event) 静态编译。Apache默认安装是使用一个进程的传统模型称为 prefork。较新的线程化模型称为 worker,它使用多个进程,每个进程又有多个线程,这样就能以较低的开销获得更好的性能。最新的 event MPM 是一种实验性的模型,为不同的任务使用单独的线程池。要确定当前使用的是哪种 MPM,可执行 httpd -l。

  MPM中的MinSpareServers 和MaxSpareServers

  MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。

  只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

  MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成“MinSpareServers+1″。

  以上说明摘自apache中文手册。根据我个人的理解这个进程就像是apache大酒店的服务小姐,MinSpareServers设置的就是小姐的基本富裕人数,服务员带着我去开房了这时候如果有其他人来也需要有人照顾的对吧?这个富裕人数就是应对这种状况的。MaxSpareServers就是最大空闲人数了,什么意思?你一个三星apache大酒店搞2万个服务员开的下去吗?很显然除非你有门路,不然是没有那么多人的,服务员住哪(硬件)都是个问题。哈哈,扯远了。所以设定这个值一定要结合自身情况,当客流量大的时候数值也适当增大。可是流量大的时候也就是个别时段,所以用crontab搞一下就好

  prefork模式中的调节

  默认配置如下

  StartServers 8

  MinSpareServers 5

  MaxSpareServers 20

  ServerLimit 256

  MaxClients 256

  MaxRequestsPerChild 4000

  几乎所有的文档都会罗列出上面的数据。StartServers的值是只要启动服务就会立即启动 8 个进程,并尽力保持 5 到 20 个空闲服务器运行。进程数的硬性限制由 MaxClients 指定。尽管一个进程能够处理许多相继的请求,Apache 还是会取消连接数超过 4,000 以后的进程,这降低了内存泄漏的风险。

  Worker模式中的调节

  默认配置如下

  StartServers 2

  MaxClients 150

  MinSpareThreads 25

  MaxSpareThreads 75

  ThreadsPerChild 25

  MaxRequestsPerChild 0

  与prefork的调节类似,不同之处只是必须确定使用多少线程和进程。要经过几次尝试和出错之后才能选好要使用的值。最重要的值是 MaxClients。目标在于允许足够多的 workder 进程或线程运行,同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力,那么至少满足此值的那些请求会得到服务,其他请求被阻塞。

  如果 MaxClients 过高,那么所有客户机都将体验到糟糕的服务,因为 Web 服务器会试图换出一个进程,以使另一个进程能够运行。而设得过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有 Apache 进程所导致的内存占用情况对设置这个值很有帮助。如果 MaxClients 的值超过256,必须将 ServerLimit 也设为同样的数值

  缓存动态内容

  

  CacheForceCompletion 100

  CacheDefaultExpire 3600

  CacheMaxExpire 86400

  CacheLastModifiedFactor 0.1

  

  CacheEnable disk /

  CacheRoot /home/wwwroot/

  CacheSize 327680

  CacheDirLength 4

  CacheDirLevels 5

  CacheGcInterval 4

  

  

  CacheEnable mem /

  MCacheSize 8192

  MCacheMaxObjectCount 10000

  MCacheMinObjectSize 1

  MCacheMaxObjectSize 51200

  

  

  参数的解释

  mod_cache.c

  CacheEnable: 启动mod_cache其后接两个参数。第一个参数指定快取的种类,应设为mem(记忆体快取)或disk(磁碟快取)之其一;第二个参数指定使用快取的URI路径,如果对整个网站(或虚拟主机)进行快取,简单指定为根目录(/)即可。

  CacheForceCompletion: 指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是60(%)。

  CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。

  CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。

  CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。

  mod_disk_cache.c

  CacheRoot: 指定磁碟快取所使用的目录。

  CacheSize: 指定快取使用的磁碟空间大小;以 KByte 为单位。

  CacheDirLength: 指定各目录存在于快取階层(hierarchy) 中所使用的字元数。

  CacheDirLevels: 指定快取的目录层数; CacheDirLength,acheDirLevels设定值相乘不能超过 20。

  CacheGcInterval: 指定收垃圾 (Garbage Collection) 的动作间隔时间;单位是小时。Apache2 中这个指令还沒有被实在。

  mod_mem_cache.c

  MCacheMaxObjectCount 最大缓存对象数;默认值1009。

  MCacheMaxObjectSize 缓存允许的最大文档大小;默认值10000。

  MCacheMaxStreamingBuffer 内存中允许缓冲的最大流式响应字节长度;默认值100000与MCacheMaxObjectSize中的小者。

  MCacheMinObjectSize 允许缓存的最小文档大小;默认值 0。

  MCacheRemovalAlgorithm 定义在需要时哪个文档被移出缓存的算法;默认值 LRU|GDSF。

  MCacheSize 允许使用的最大内存量;以KB为单位默认值100。

  关闭网页内容协商

  一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒体类型的版本甚至其组合。最常用的选择方法是提供一个索引页以供选择。但是由于浏览器可以在请求头信息中提供其首选项的表现形式,因此就有可能让服务器进行自动选择。

  除非是五星级饭店各国来宾都比较多,否则不建议开启,因为这玩意严重降低性能。

  Options -MultiViews

  关闭或者开启符号链接

  这个符号连接就是俗称的软链接,好像是windows中的快捷方式。

  通过这个链接用户很可能就进入到你不想让他们看见的位置,从安全角度上来说这是非常糟糕的。所以从安全角度上考虑那就用Options SymlinksIfOwnerMatch 。当然也许你根本不知道那个符号链接是个什么东西,那就直接Options FollowSymlinks

  控制.htaaccess文件

  关闭在全局选项中改为AllowOverride None

  这样可以省去apache找htaccess的时间,也自然就节省了资源。

  那么原来的.htaccess的如何安置呢?将其放入即可。

  关闭DNS查询

  五星级餐厅用的都少。直接关闭。

  HostNameLookups Off

  当优化工作完成后

  使用ab对负载进行测试

  ab –n 1000 –c 1000

  -n 1000 表示请求1000次

  -c 1000 表示每次1000个请求

  因为只能对某个页面进行测试,注意是单位是个。所以最后的结果可能并不一定能反应真实情况。

  或者使用 Apache Ant 和 Apache JMeter 频繁进行负载测

  结合自身情况确保关闭系统中不需要的服务

  参考文献

  Apache 中 KeepAlive 配置的合理使用

  Keepalive的开启与关闭

  在理想的网络连接状况下,系统的 Apache 进程数和内存使用可以用如下公式表达:

  HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)

  HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess

  换成中文:

  总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求

  Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数

  需要特别说明的是:

  [平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果[每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。

  基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive选项是划算的,否则就可以考虑打开。

  在阅读本文前,首先和各位读者普及两个基本知识。老姚不想把本文写成一篇技术类的枯燥文章,故此先把概念简述一下,为了后续行文方便。

  引擎:通俗地讲,游戏引擎就是整个游戏的框架,它操纵游戏中所有的元素,包括关卡、动作、音乐等等。简单来说,我们在游戏中体验的一切互动,都和引擎有关。对于比较简单的游戏,像《俄罗斯方块》,引擎通常只是一段起控制作用的代码;而像大型的游戏,比如《魔兽世界》,引擎就复杂无比。再比如像《孤岛危机》(Crysis)这样的游戏,它在物理特性、光影效果、动态模糊的模拟都接近真实的世界,可以让我们有非常逼真的游戏体验。

  虚幻3:著名游戏引擎虚幻(Unreal)的第三代,是目前针对于DirectX 9/10 PC、Xbox 360、PlayStation 3平台的一套非常成熟的游戏开发构架,它的编写理念是为了让游戏开发变得更加直观和简单,同时能够获得卓越的效果。自2004年发布以来,虚幻3引擎诞生了大量的精品游戏,诸如《战争机器》、《荣誉勋章》、《生化奇兵》、《质量效应》、《细胞分裂5》等等。

  为什么是虚幻3?

  玩是人的天性,因此从这个角度来说,每个人都是玩家。电子游戏自诞生以来,从最早的2D像素点阵,到如今每秒几千万个多边形,游戏引擎的进化一直没有停下它的步伐。

  这里要稍微提及一些游戏引擎的发展史,最早由天才程序员约翰·卡马克创造的Wolfenstein 3D引擎开启了FPS的时代,后来的《毁灭战士》(Doom)引擎的授权也创立了一个新的商业模式,很多游戏开发者发现,与其自行耗时耗力研发,不如直接购买一套成熟的游戏引擎,于是Doom成为了史上第一个对外授权使用的游戏引擎。

  卡马克和他的id Software公司尝到了引擎授权的甜头以后,开始做起了这门生意。比如后来开发的《雷神之锤》(Quake)系列游戏本身并没有什么出彩之处,销售状况也一般,但是Quake引擎的授权价高达40万~100万美金,让id Software赚了个盆满钵满,由于这个市场是id一家独大,因此尽管开发者屡屡抱怨,却也毫无办法。而这个时候,Epic Megagames的虚幻(Unreal)引擎问世了,它给观者的第一印象就是逼真的物理效果,比如水面、天空、雾化、火焰等,这在当时引起了极大的轰动,由此虚幻引擎就成为了id Software最有力的竞争者。

  更为关键的是,虚幻引擎不仅表现优秀,授权价格也较低,吸引了很多游戏公司购买,因此才诞生了无数经典游戏,像虚幻1有《杀出重围》、《RUNE》、《星际迷航》等,虚幻2有《细胞分裂》、《杀手十三》、《彩虹6号3》、《神偷3》、《手足兄弟连》等等,虚幻3的代表作在文章开头已有列举,不再赘述。

  之所以这么多游戏采用虚幻3,主要是得益于它简易的开发环境,另外还有一个重要原因,就是虚幻3 在跨平台游戏的支持上更好。所以包括SQUARE ENIX的这样的日系厂商,在其RPG《最后的神迹》中也采用了虚幻3引擎。

  “虚幻3网游”——宣传噱头还是真正进化?

  随着虚幻3引擎越来越流行。2009年,Epic还推出了免费的虚幻3版本,虽然不允许商业应用,但用来学习和研究是再好不过了。这一举动让韩国游戏公司欢欣鼓舞,据说开发包开放当天就有几万次的下载量。

  不出所料,很快就有一批采用虚幻3的韩国网游的公布,华丽的画面触动了人们的神经,包括《TERA》、《剑灵》、《AVA》、《Mstar》等等,同时也调动了中国网游开发者的胃口,免费版虚幻3也给他们提供了良好的研发条件,由此,“虚幻3网游”的概念在中国就浩浩荡荡的开始了。

  那么,很多人关心的是,所谓的“虚幻3网游”是否只是宣传的噱头,我们中国的游戏开发者能否有能力将这个超级引擎的能力发挥出来呢?那么老姚通过亲身体验这款以虚幻3为卖点的《神兵传奇》,可以说明一些问题。

  目前《神兵传奇》是内测,因此客户端还有很多不完善之处,比如需要安装大量的补丁和程序,进入游戏的等待时间过长等,都是比较影响用户体验的,笔者认为这些软件是否可以整合到客户端中,对用户电脑进行智能判断,这样会好很多。

  虽然有以上的问题,但终归是瑕不掩瑜。在进入游戏后,立刻发现虚幻3引擎所带来的的大幅进化,最明显的是光影效果的模拟。在光照效果下,角色更加富有立体感,装备细节非常突出。场景更加细腻,岩石的贴图更有质感,远景层次分明。水面模拟是虚幻3最拿手的,我们看到游戏开发组非常有默契的在场景中安排了不少的水潭、河沟,波光粼粼的水面下的游鱼清澈可见,的确赏心悦目。

  另外值得称道的一点是,游戏对显卡要求并不是特别高,以老姚的GeForce 8600GTS的显卡,1920*1200的全屏分辨率,全开特效的情况也能跑到将近30帧,这估计是得益于虚幻3支持NVIDIA PhysX物理引擎的关系。

  总体运行下来,单就画面来讲,《神兵传奇》应该算是交了80分的答卷,因为没时间体验更多的游戏内容,无法判断后续场景的优劣,除了希望能够有更加惊喜的表现外,还希望游戏能在AI方面得到增强,因为虚幻3的软肋正是AI,目前游戏给的老姚的感觉是NPC和敌人都太“死板”,基本不会走动,希望在下个版本中予以加强。

  对比几款同为虚幻3引擎开发的游戏,不难看出《神兵传奇》的确是发挥了虚幻3引擎的实力,为了避免纠纷,本文就不提及这几款游戏的名字:

  毋庸置疑:一场网游引擎的革命即将到来

  佳能公司曾经有一句广告语:革新,势在必行。

  这句话我想同样适用于中国网游行业。由于中国网游行业的特殊性,一款游戏的成功与否与画面好坏并无必要的联系。相反在中国市场吃香的除了《魔兽世界》外,大多是画面平庸的2D游戏,诸如《传奇世界》、《大话西游》、《征途》、《****》等等,这些游戏同样大赚特赚,那么难道说,中国网游就不用去追求画面了吗,当然不是!

  想想如今的硬件发展是多么的迅猛。拿《魔兽世界》来说,4年前的主流显卡是Geforce 4 MX系列,若想特效全开几乎不可能,而如今,主流显卡已经是Geforce 9800或者更高级的系列,甚至是笔记本电脑的显卡全开特效跑《巫妖王之怒》也是小儿科。但这样的电脑配置仍然在玩着像《传奇》这样的游戏,确实让人觉得有些暴殄天物了。

  目前游戏硬件的发展速度是由大型单机游戏带动的,像《孤岛危机2》、《使命召唤》这样的FPS,而网游在引擎的进化则是非常缓慢。道理也很简单,单机游戏受众群体较小,一般是高端玩家组成,他们不计成本升级电脑,就是为了追求画面的极限,但这部分人群所占比重非常之小。但网游则完全不同,受众群体广泛,如果配置要求太高,肯定影响到游戏的普及,所以网游对硬件的要求基本上是“够用就行”,所以除非像《魔兽世界》这样超人气网游出现,才能引发一轮硬件大升级外,基本上网游是不大可能会出现“硬件杀手”。

  然而,这正是导致中国网游目前产品同质化严重的罪魁祸首,中国网游行业整体缺乏一种对技术、创新追求的氛围,更多的厂商想的是怎么靠宣传包装,将一款过时甚至是粗制劣造的游戏推广出去,赚一票就走人。

  不幸的是,4年后的“巫妖王之怒”已经不能再引发硬件大升级换代,但幸运的是虚幻3引擎的及时出现,接替了这个艰巨的历史任务,尽管只是个舶来品,但它对于中国网游来说,正起到了一个引擎的推进作用,把中国网游的技术力推向一个新的高峰,从这个意义上来讲,所有采用虚幻3引擎的网游都是值得称赞的,无论做的是否出色,这都是一次有意义的尝试。

  对于《神兵传奇》,老姚认为要一分为二的看待。首先作为内测,有一些不足是难免的,包括很多技术性的问题,系统的设定等等,这一块还有很大的提高空间,只要久游在后续的版本中不断进行修正,它就不失为一款好游戏。从纯技术的角度来看,《神兵传奇》可以说是目前国产网游中画面最优秀的,势必会在行业内引起一轮跟风与追逐。

  老姚相信,将来会有很多游戏拥有比《神兵传奇》更加出色的画面,它们也许使用的同样是虚幻3引擎,也许是其他的自主研发的引擎,但这正是我们希望看到的,中国网游将进入到一个技术的时代,一个追求游戏品质的时代。

  这一天,相信不会太远了。(文:姚宇)

2010-08-26

  1.InfoGlue

  infoglue是一个高级的、可扩展的、健壮的内容管理系统,完全用Java开发。重要的功能包括完全支持多语言,站点之间良好的重用,以及广泛的集成能力。

 

  2.Magnolia

  Magnolia是一个开源基于Java的Web内容管理系统(CMS) ,构建在Java内容知识库标准(JSR-170).Magnolia支持包括英语,中文在内的14种语言,它支持本地搜索,基于XML的导入/导出,跨浏览器的文本编辑器,一个简易的War文件可部署到任何J2EE容器中。在最新版本中还添加对数字媒体在线编辑功能。

 

  3.OpenCms

  OpenCms 是一个J2EE的产品,它是用Java写成的。它和Tomcat捆绑在一起。但是也能够使用ATG Dynamo、WebLogic和WebSphere。OpenCms支持多种RDBMS来保存内容,包括Oracle、SQL Server、Sybase和mySQL。新版本提供了一个新的模板引擎,JSP支持,一种新的连接管理系统,提高了稳定性。

 

  4.eAdmin/OWX

  基于java/jsp的SiteEditor, CMS,列表生成器等开源软件。包括:模块,XML配置,Struts,自己的API,组件,WYSIWYG,多语言,多用户,基于Web的管理器。

 

  5.Cofax

  Cofax是以Java/XML为基础的CMS。源于Kinight Ridder为方便管理旗下新闻网站所开发。

 

  6.MMBase

  MMBase 基于 MPL 的开源 CMS, 具有方便信息发布、维护等特点, 包含有新闻发布、论坛、聊天室等模块, 不过个人认为该项目最大优点还是丰富的文档, 这是在开源项目中很难得地方。

 

  7.Ion

  ion是一个简单但功能强大的基于最新技术的内容管理系统。它完全符合J2EE标准,使用XML定义内容结构。利用XSL把内容转换成各种格式比如:HTML, XML, PDF, TXT等,并且使JSTL作为模板系统。

 

  8.Jahia

  Jahia 组织日前发布了Jahia 内容综合管理系统CMS和其工作所处的portal server,该版本包含了全功能的search engine,一个轻量级的文档管理系统(支持WebDAV )以及一些协作性的应用portalet(讨论组,WebMail,ToDo List,Timesheet…)

 

  9.dotCMS

  dotCMS 是一个100%免费基于J2EE/portal的内容管理系统,它有着许多吸引人的特性是其它许多CMS所没有的。在dotCMS中使用到的开源项目与框架有:Apache Tomcat ,Liferay Enterprise Portal ,Apache Struts, Hibernate ORM,Velocity模板语言,Lucene搜索引擎 。dotCMS采用Eclipse IDE开发并使用Velocity + Struts做为前端使得dotCMS变得容易扩展和构建。dotCMS的license:The Dotmarketing Public License。

 

  10.OpenEdit

  penEdit 包括三大模块Web内容管理,电子商务,博客。Web内容管理包括在线编辑,动态布局,拼写检查(英文), 用户管理,文件管理,版本控制和通告工具。电子商务模块包括在线产品目录管理,购物车,电子付款,产品展示与产品高级搜索(利用Nutch/Lucene 的web爬行与搜索功能进行高级搜索所以不需要用数据库的功能)。 Blog模块包括在线管理,评论,注册和RSS/Atom引擎。 OpenEdit运用到的开源组件有:Velocity,Dom4j,Spring,Lucene。

  Linux普通用户在行使超级权限sudo时,出现xxx is not in the sudoers file. This incident will be reported,解决方法如下:

  方法一:

  进入超级用户模式。也就是输入”su -”,系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。(当然,你也可以直接用root用户登录,因为红旗安装过后默认的登录用户就是root)

  添加文件的写权限。也就是输入命令”chmod u+w /etc/sudoers”。

  编辑/etc/sudoers文件。也就是输入命令”vim /etc/sudoers”,输入”i”进入编辑模式,找到这一 行:”root ALL=(ALL) ALL”在起下面添加”xxx ALL=(ALL) ALL”(这里的xxx是你的用户名),然后保存(就是先摁一 下Esc键,然后输入”:wq”)退出。

  撤销文件的写权限。也就是输入命令”chmod u-w /etc/sudoers”。

  方法二:

  直接执行sudo visudo

  输入”i”进入编辑模式,找到这一 行:”root ALL=(ALL) ALL”在起下面添加”xxx ALL=(ALL) ALL”(这里的xxx是你的用户名),然后保存(就是先摁一 下Esc键,然后输入”:wq”)退出。

  第二种方法安全!

  为避免出现:sudo时要求输入用户密码,直接将xxx ALL=(ALL) ALL改成:xxx ALL=(ALL) NOPASSWD: ALL

  显示Web网页:

  1. Uri uri = Uri.parse(”http://www.android123.com.cn”);

  2. Intent it = new Intent(Intent.ACTION_VIEW,uri);

  3. startActivity(it);

  显示Google地图:

  1. Uri uri = Uri.parse(”geo:38.899533,-77.036476″);

  2. Intent it = new Intent(Intent.Action_VIEW,uri);

  3. startActivity(it);

  Maps路径规划:

  1. Uri uri = Uri.parse(”http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en”);

  2. Intent it = new Intent(Intent.ACTION_VIEW,URI);

  3. startActivity(it);

  拨打电话:

  1. Uri uri = Uri.parse(”tel:xxxxxx”);

  2. Intent it = new Intent(Intent.ACTION_DIAL, uri);

  3. startActivity(it);

  1. Uri uri = Uri.parse(”tel.xxxxxx”);

  2. Intent it =new Intent(Intent.ACTION_CALL,uri);

  注意需要权限

  发送SMS/MMS

  1. Intent it = new Intent(Intent.ACTION_VIEW);

  2. it.putExtra(”sms_body”, “android开发网欢迎您”);

  3. it.setType(”vnd.android-dir/mms-sms”);

  4. startActivity(it);

  发送短信

  1. Uri uri = Uri.parse(”smsto:10086″);

  2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);

  3. it.putExtra(”sms_body”, “10086″); //正文为10086

  4. startActivity(it);

  发送彩信

  1. Uri uri = Uri.parse(”content://media/external/images/media/10″); //该Uri根据实际情况修改,external代表外部存储即sdcard

  2. Intent it = new Intent(Intent.ACTION_SEND);

  3. it.putExtra(”sms_body”, “android123.com.cn”);

  4. it.putExtra(Intent.EXTRA_STREAM, uri);

  5. it.setType(”image/png”);

  6. startActivity(it);

  发送Email

  2. Uri uri = Uri.parse(”mailto:android123@163.com”);

  3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);

  4. startActivity(it);

  1. Intent it = new Intent(Intent.ACTION_SEND);

  2. it.putExtra(Intent.EXTRA_EMAIL, “android123@163.com”);

  3. it.putExtra(Intent.EXTRA_TEXT, “android开发网测试”);

  4. it.setType(”text/plain”);

  5. startActivity(Intent.createChooser(it, “选择一个Email客户端”));

  1. Intent it=new Intent(Intent.ACTION_SEND);

  2. String[] tos={”android123@163.com”}; //发送到

  3. String[] ccs={”ophone123@163.com”}; //抄送

  4. it.putExtra(Intent.EXTRA_EMAIL, tos);

  5. it.putExtra(Intent.EXTRA_CC, ccs);

  6. it.putExtra(Intent.EXTRA_TEXT, “正文”);

  7. it.putExtra(Intent.EXTRA_SUBJECT, “标题”);

  8. it.setType(”message/rfc822″); //编码类型

  9. startActivity(Intent.createChooser(it, “选择一个Email客户端”));

  Email添加附件

  1. Intent it = new Intent(Intent.ACTION_SEND);

  2. it.putExtra(Intent.EXTRA_SUBJECT, “正文”);

  3. it.putExtra(Intent.EXTRA_STREAM, “file:///sdcard/nobody.mp3″); //附件为sd卡上的nobody MP3文件

  4. sendIntent.setType(”audio/mp3″);

  5. startActivity(Intent.createChooser(it, “选择一个Email客户端”));

  播放多媒体

  1.

  2. Intent it = new Intent(Intent.ACTION_VIEW);

  3. Uri uri = Uri.parse(”file:///sdcard/nobody.mp3″);

  4. it.setDataAndType(uri, “audio/mp3″);

  5. startActivity(it);

  1. Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, “1″); //从系统内部的MediaProvider索引中调用播放

  2. Intent it = new Intent(Intent.ACTION_VIEW, uri);

  3. startActivity(it);

  Uninstall卸载程序

  1. Uri uri = Uri.fromParts(”package”, packageName, null); //packageName为包名,比如com.android123.apkInstaller

  2. Intent it = new Intent(Intent.ACTION_DELETE, uri);

  3. startActivity(it);

  Installer安装APK