Tinyfool的Blog

这就是我,Tinyfool,郝培强!身高180,体重240,标准的中年老胖子。 有妻有女,无房无车,现居上海,程序员。

Browsing Posts published by tinyfool

盛大创新院有很多同事都有iPhone或者iPad,我刚到公司也有别的项目组的软件需要iPhone或者iPad客户端,找我咨询。所以我就有了在公司搞个iPhone/iPad开发讲座的念头。前些日子太忙,公司内场次也没安排开,今天终于可以搞了。

不过也算是一波三折,前两天我眼睛得了麦粒肿,第一天疼痛难忍几乎什么都干不了,下午去医院开了药。第二天在家里静养敷药等等,睡了一天。项目耽误了很多进度,讲座的Keynote也没时间做。所以第一讲的Keynote实际上是今天白天几个小时里面做出来的,刚刚全都做好就去讲,未免有点仓卒,内容有点凌乱。

讲的效果还好,大家也很热情,结果本来一小时的讲座多讲了快40分钟才结束,虽然耽误了一个很重要饭局,但是跟另一班同事吃了顿烤肉,喝冰凉的啤酒,也非常的快乐,而且讲座整个过程我都很High,讲完大汗淋漓,估计也有减肥效果,快哉快哉。

点击浏览:iPhone/iPad开发讲座 第一讲 Ios开发简介

内容大量参考了苹果的开发文档,以及斯坦福的iPhone开发开放课程CS193P,建议英语好且有志于iPhone开发的同学下载学习之。

下期准备介绍苹果推荐的iPhone应用设计方法。

相关链接:
iPhone/iPad开发讲座 第一讲 IOS开发简介 Keynote放出
iPhone/iPad开发讲座 第二讲 iPhone用户界面设计 Keynote放出
iPhone/iPad开发讲座 第三讲 基础UI和基础编程 Keynote放出
iPhone/iPad开发讲座 第四讲 网络通讯和Xml处理 Keynote放出
iPhone/iPad开发讲座 第五讲 定制视图和多点触摸 Keynote放出

How to use Objective-C get all fontfamily name and fontname in an iPad or iPhone?

代码很简单,效果就是把全部字体家族和字体名都输出到调试窗口。

	NSArray* familys = [UIFont familyNames];
	
	for (int i = 0; i<[familys count]; i++) {
		
		NSString* family = [familys objectAtIndex:i];
		NSLog(@"rnrnFontfamily:%@rn=====",family);
	
		NSArray* fonts = [UIFont fontNamesForFamilyName:family];
	
		for (int j = 0; j<[fonts count]; j++) {
		
			NSLog(@"%@",[fonts objectAtIndex:j]);
		}
	}

WWDC 2010开幕那晚,我一夜无眠,但没有时间看任何直播,我正在赶一个项目的进度。一天后,我从podcast下了那夜的Keynote,然后隔了几天,项目不那么紧张了,我才有时间看。有很多数字让我很有感受,这些日子跟一些朋友、跟一些同事零星的聊了一下,现在也分享给大家,更重要的是给自己记录一下,免得忘了。

一、当然是在59天内卖出了200万台iPad,平均3秒钟卖出一台。这个数字非常惊人,要知道很多号称流行一时的手机总的出货量也就是百万左右。一个月前,当苹果公布28天卖出了100万台iPad的时候,有人称赞,有人怀疑,有人认为这一旺盛的势头会很快降低。现在数字再次证明了一切。说起来,我的《iPad革命:开发者的机遇和挑战》几乎是最早的正面表扬iPad的文章,可惜因为投稿的原因发布到我自己的Blog的时间比较晚。iPad发布以后最好玩的一个现象是,一开始没见到这个东西的真身时,各种猜测,各种批评满天飞,等到各大媒体的记者们、Blogger们拿到手了以后,每个人都是在表扬,呵呵。

二、短短的两个月的时间,App store里面已经有了8500个iPad程序,这些程序被下载了3500万次,按照200万iPad计算,平均一个iPad上安装了17个程序。说到这个数字的时候,Jobs老师连说了两遍“That is a great number.”

这组数字非常值得玩味,我手中没有iPhone的平均程序数。但我怀疑,这个数字可能并不高,甚至可能低于17或者仅仅是相当。因为我们知道很多人买了iPhone仅仅是为了打电话,也就是说,iPhone有一个杀手应用,打电话。而iPad不同,它没有任何的杀手应用,每个买了iPad的人都应该买点(也许花钱,也许免费)什么app,要不然这个iPad看起来就太傻了。

几个月前,huoju同学的那个号称是中国前10个iPad之一的iPad到达上海的时候,我们公司一群同事正在钱柜K歌,iPad到了,开封以后,大家先是很兴奋的围观,然后是讨论,最后是把它弃置一旁,原因很简单,没有任何应用和数据的iPad看起来好傻,毫无用处。

另外一个值得玩味的点在于,35,000,000/8500约等于4118,也就是说平均每个应用有4118次下载。这个平台简直就是狼少肉多的状态,不赶快杀过来太傻了。以上的分析我跟几个朋友讲过后,他们第一反应就是本来要先做iPhone版的决定先做iPad版;本来不想马上杀入苹果平台的,也准备先做个自己软件的iPad版本。

还有一点,就是从我得到的反馈来看,虽然iPad可以完美支持iPhone程序(如果你觉得不完美,我没话说),但是大家很少会喜欢在iPad上面安装iPhone程序。我不知道Jobs老师之前是否想到了这点。那天聊到这个问题的时候,我有朋友说,那未来苹果会不会直接关闭这个支持呢?我认为不会,虽然大家喜欢在iPad上面用iPad应用,但是遇到一些特殊场合,以及相应iPad版本确实还没有推出的时候,大家也会用iPhone版本的。例如,也许即使没有iPad版本的植物大战僵尸,你也不会在iPad上面去玩iPhone版本。但是网银程序呢?支付程序呢?这些东西也许你更在意的是方便,而不是体验。

这里多说一点,Jobs不是神,苹果也不是神。在苹果一个最牛的设计方法的Keynote里面,大大夸奖了某公司的生化危机类游戏,称里面的软操纵杆的设计很好,溢美之词铺天盖地,但是,从我得到的反馈来看,大家喜欢的游戏,往往都是有鲜明iPad/iPhone操作风格的游戏。简言之就是,看到什么点什么的游戏。我的女儿才1岁半,但是看到我们玩iPad版植物大战僵尸的时候,她会主动去点那些飘动的小太阳,原因就是那东西太直观了,完全不用教育,太好用了,完全不费脑子。这样的东西,在iPad/iPhone上最有生命力。

另外值得讨论的例子是FieldRunner游戏,此游戏很早就有iPhone版本,我玩过多次完全不感冒。但是现在有了iPad版本,什么都没有改变,操作方式没变,界面没变,甚至地图都没有变,分辨率提高以后,我爱不释手。而且在公司掀起了我们整个一个小组的游戏沉迷高潮,甚至有我们公司某大牛,业界著名的技术高手,每天中午吃饭的时候,都捧着iPad玩FieldRunner游戏,好吃的都被我们抢走了都不知道。

三、65天内,电子书下载了500万次,平均一个iPad上2.5本书,按照在iPad上面有书的美国前五大出版社的统计,iBookStore的市场份额已经达到了整个电子书市场份额的22%。

虽然统计方法也许不是最公允的,但是仅仅两个多月22%的市场份额显然是好的不得了的成绩。

我更关注的是这次iBooks里加入了PDF的支持。这家公司以前是不懂得怎么解析PDF么?显然不是。

其实iPad出现之前,我就考察过很多可以读PDF的iPhone电子书阅读器(很严肃的考察,很多都是我真金白银买的,有些是免费的),效果都完全不可接受。原因很简单,流行的PDF文件多半都是用打印方式生成,是基于排版格式的,不是流式文本。所以,内容很难重排,如果保持排版样式,显示全部则很难看清,显示局部则很难阅读全貌。基本上可以说,这类软件从技术上是可行的,从实践上是毫无意义的(当然那东西确实可以读,只是实在是一种折磨)。

而iPad的分辨率下,想得到完美的PDF显示效果那实在是太容易了。而熟悉Mac开发的同学们,应该知道Mac平台的PDF支持是相当的好,有现成的API可以解析生成等等,iPad的SDK(也就是IOS 3.2 SDK)里面也包含了支持PDF的各种API。那么苹果为什么不在iPad发布伊始就在iBooks里面支持PDF呢?

基于我对Jobs老师和这家公司的认识,我认为这是因为,他们在认为一个东西可以完美实现之前,是绝对不会拿出来的,比如复制粘贴,比如多任务(这个我未来会有专门的技术文讨论),比如这次的PDF。

他们在等的应该就是iPhone 4,在等iPhone 4的Retina屏幕,在这个分辨率下,屏幕虽小,但是PDF是可以完美显示的。

我认为,iBooks支持PDF,iBooks支持iPhone,iPhone推出Retina屏幕,这三件事情的时间点太过巧合,绝对是有紧密关联的。

Retina屏幕绝不是某些人想象的,刚好有了,就刚好被放到了iPhone里面,耍耍酷这么简单。这就跟iPhone的Cpu一样,iPhone 3G是无法支持新的多任务功能的,那个功能必须有Samsung S5PC100 ARM Cortex-A8(iPhone 3GS)或者苹果A4才能支持。所以,你可以想见,在3GS切换到A8的时候,也许刚刚被在IOS 4中发布的多任务功能就已经在策划或者实现中了。

四、每周有15000个程序被提交到AppStore,包含30种语言,95%的程序可以在7天内审核过。剩下的5%,有三种最大的可能性:

  1. 程序的功能和开发者描述的不一致,会被拒绝。
  2. 使用了私有的API,苹果不允许开发者使用私有API,因为升级系统的时候,私有API可能会失效,程序崩溃,用户会很不满意。(当然有时候开发者也是不得已为之,比如某功能苹果的程序可以实现,为什么我们就不能实现。有些问题上,最后苹果和开发者达成了妥协,私有API可以调用,未来可能会变成公开API,例如UIGetScreenImage();)
  3. 程序会崩溃,这当然会被拒绝。

这一段显然是Jobs老师在自吹自擂,当然从我个人的经历以及我收到的一些反馈来看,AppStore审核效率确实是有大幅的提高。但是遇到了一些事件的时候,还是会大幅下降,比如iPad发布那段时间,所有iPhone程序的审核貌似都放慢了。

这场keynote显然还有更耀眼的明星iPhone 4,就是这两天的消息,预售第一天就突破了60万订货量,看来一个新的销售神话要诞生了,:)。

我把我的职业生涯回忆文章定名为《在路上》,是因为最近我有些感悟,开始不那么彷徨:人生是一段旅程,大多理想也许无法达到,但无所谓,只要还在路上,我们就可以继续追寻,这种努力的追寻有时候比结果更重要,有时候能产生比你想要的结果更好的结果。

其实我不并像很多人以为的那么乐观,我对我们的国家,我们的社会,我们的个人发展,总体的看法一直都是很悲观的,以至于这些认识讲出来都可能会违反我国法律。但是,最近在大问题上,我越来越不彷徨,我可以不管自己的内心多么悲观,多么苦闷,都积极的去面对这个世界,作出自己的努力。有些人对此有巨大作用,堪比照亮我漫漫前路的明灯,他们是刘涛,李志文,叶劲峰,周筠,刘江,李笑来,我会一一撰文介绍一下他们。

一、直爽,勤奋,执着的刘涛

twitter id:@liut
blog:http://liut.cc/blog/

刘涛是我的一个老朋友。最早知道他是很久以前了,那次我跟火炬讨论一个非常复杂的MySql问题,我们都束手无策。他跟我说要是刘涛在就好了,他说刘涛钻研一个东西就会钻研的很深,刘涛可以解决他遇到的所有的MySql的问题。说这句话的时候,刘涛还只是一个网管,兼MySql DBA。

过了几年,刘涛在一个公司做程序员。Donew5周年聚会,我、火炬和刘涛都应约参加。那次就是周鸿祎的第一次提出“谁的屁股都不干净,出来混都是要还的”,那时候,我和刘涛都坐在会场的一角。

刘涛问我,tiny,这个人这么无耻,你觉得应该不应该骂?

我说应该。

他立刻站起来,大喊了一句“周鸿祎,你给我滚下来”

全场皆惊,一片混乱,周鸿祎的回应大概是说,骂我的有本事上来说之类。

我就被刘涛吓了一跳,虽然之前火炬也跟我讲过刘涛的性格很直爽。此事,记录在我多年前写的Blog《参加Donews五周年聚会之爽与不爽》之中。那时我就非常佩服刘涛了,真是太直爽。

后来,我们创业曾考虑拉刘涛出来,但那时他所在的公司貌似很好,所以作罢。

后来,我老婆(@yatounini)生完孩子以后重新出来上班,刘涛和我另外一个朋友大鱼儿所在的公司也正在招人。我就跟刘涛说,希望让我老婆过去,跟他们学习学习。刘涛还是很直率的说,你老婆水平要是不行我们可不要啊。

其实那时候,我老婆的水平确实还很一般,我想让她过去主要目的也是希望她可以在一个比较靠谱的团队里面锻炼锻炼,提高一下水平,有刘涛和大鱼儿在的团队我百分百放心。

后来,因为我老婆的技术不行,编程习惯不好,刘涛有几次告诉我可能不想要她了。直到后来他和大鱼发现,我老婆做事情的时候往往还是很认真,也肯于学习,虽然底子差了一点,但是后来还是有很大进步的,我老婆才在那个公司真的立了足。

而因为刘涛的苛刻,我老婆也经常跟我抱怨刘涛要求太高了,甚至几次被气哭。

但是最后,我老婆还是理解了刘涛的苦心,从她自己的成长看到了刘涛的苛刻带来的诸多好处。

刘涛在项目中总是追求精益求精,对每个人check in的代码都会review,看到错误和不好的代码,都要求重做,或者他亲自改掉。因为他的严格,他们的项目才有了可靠的质量,也因为他的严格,我老婆的技术水平也有了很大的进步。

对比起来,我就很欠缺对完美追求的执着,也因为嫌麻烦不去做code review。在这个问题上实际上是有惨痛的教训的。我们做搜索产品的时候,有一个程序员水平虽然还可以,但是做事情很马虎。有很多次都出现了,他写一个代码花了一个星期,然后check in到我们的主线以后,后来,引发了很严重的事故,然后我和火炬花几个小时,甚至几天的时间调试才发现是他的bug。这些事故,很多都严重的影响了客户对我们服务的信任程度(不过幸亏我们的态度很诚恳,尽量及时解决问题,他们都原谅了我们)。

有一次是,我们的构建索引的老代码(我写的)因为省事儿用了Dom解析Xml,随着数据增长,内存耗费很严重。于是我要求他写一个Sax的解析程序,他自己没有搞定,在我做了demo后,指导后,终于做出来了。但是他把新的Sax实现加上去以后,居然没有去掉Dom实现。实际上,两个算法各跑了一遍。但是,他刚check in的时候,客户数据其实还不够大,而一个月后,客户的数据量暴增,我们的索引进程经常内存耗尽死掉。我调试了几次都没发现原因(数据量大测试也很麻烦),仔细看了代码后才发现他做的蠢事儿。这个错误非常明显,如果我们在他check in的时候,做code review是一定可以发现的。

还有一次是,让他来写一个文件下载功能。写好了以后简单测试都没有问题。过了一个月,有一天我们的lighttpd经常出问题,莫名其妙的php进程就占用了大量内存,甚至造成lighttpd无法响应。但是重起服务后,又没有任何问题了。出现问题的周期不固定,后来分析日志也很困难,出现问题的时候,有很多web行为,也很难看出有什么明显的入侵,或者反常访问。后来我怀疑是日志下载程序造成的,打开代码一看原来是他为了图省事儿调用file_get_contents函数来获取文件内容,下载小文件,小日志无所谓,用户下载几百兆的日志的时候,而且用多线程下载的时候,一下子就把服务器的内存耗尽了。这个问题很好解决,而且事先如果做了code review也是一定可以发现的。

所以我很后悔没有坚持拉刘涛跟我们一起创业,至少我们那个项目因为有了好的code review,能节省大量为解决各种程序bug耗费的时间。

刘涛很少写blog,最近才开始真的写一些,那天他刚写了一篇《一言难尽话PHP,兼谈我的编程经历》,我们公司的一个项目的负责人,一位非常牛的大牛,就跟我说要我帮忙把刘涛挖过来,因为这文章一看就知道刘涛是极少数真的懂PHP的人。

有刘涛这样直爽,勤奋和执着的朋友,或者说同道,时刻都提醒我不能对项目掉以轻心,要对质量有所追求,不要放弃自己观点,是我的第一盏明灯。

待续》》