说说我和Mac(二)

Panther-X.3-picture

回复 98 可以看 《说说我和Mac(一)》,今天是二。

我在洪恩软件一共工作了3年半的时间,这段经历让我的能力和见识得到了长足的成长。期间做过互联网(没错,就是传说中的第一波互联网神奇泡沫,一触即溃),基于Perl构建洪恩在线网站;做过企业级软件数字校园,基于Java和Jsp技术;做过英语培训软件,基于.Net和C;还管理过儿童产品事业部。不过让人非常伤感的是,我参与的大部分软件项目都以失败告终,洪恩在线遭遇互联网泡沫,数字校园过于超前,销量一般,英语培训碰到2003年非典,完全无人问津。当时洪恩的主要的业务还是电脑教育、高教、英语、儿童软件等,现金流良好。但安则思变,公司开始尝试其他的业务类型,比如互联网、游戏、企业软件、培训等等,这些项目我基本都参与了,但成者寥寥,这对当时年少轻狂的我来说打击非常大,经常参与失败或无疾而终的项目会让人产生对己对人的怀疑和不自信。

要么留下来继续坚持,要么出走寻找新的挑战,这是很多人当时的选择。有些人选择坚持,有些人选择离开,留下的很多技术人员组成了后来的游戏公司完美时空的技术和策划班底,完美时空2007年在纳斯达克上市,目前发展得非常好。离开的人,则就各自有各自的生活和精彩。

所以说选择这个动作真的很神奇,人生漫漫征途,到处十字路口,每次选择就把你带向一个完全不同的路和沿途的风景,我们只能慨叹,嗟夫,人无常势,水无常形。

当时我选择了离开,那段时间是1999到2003年。在这段时期里,地球的那一边,乔布斯正在重新整肃苹果,在进行了精兵健身并相继推出了iMac和iPod,苹果正在一步步走向巅峰,只不过还没有看看到这家没落帝国的潜力,在国内,Mac仍然是稀有物品,我也仅仅见过两款。(待续)

昨天谈了第一季第二季的想法,有读者回复,一季一季也不错,间歇期间可以出点题目之类让大家投稿,分享大家的想法。
这个思路,我觉得不错。

今日Mac技巧:

说完了Objective-C的Category,今天简单说说Protocol。

Protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现。这种模式一般称为代理(delegation)模式。你通过Protocol定义各种行为,在不同的场景采用不同的实现方式。在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View和Controller的解耦。
 
定义Protocol很简单,在声明文件(h文件)中通过关键字@protocol定义,然后给出Protocol的名称,方法列表,然后用@end表示Protocol结束。在@end指令结束之前定义的方法,都属于这个Protocol。例如:

@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;
@optional
- (id) submitOrder: (NSNumber *) orderid;
@end

 
以上代码可以单独放在一个h文件中,也可以写在相关类的h文件中,可以视具体情况而定。该Protocol包含两个方法,processSuccessful和submitOrder。这里还有两个关键字,@required和@optional,表示如果要实现这个协议,那么processSuccessful方法是必须要实现的,submitOrder则是可选的,这两个注解关键字是在Objective-C 2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现。
 
那么如何实现这个Protocol呢?创建一个普通的Objective-C类,取名为TestAppDelegate,这时会生成一个h文件和m文件。在h文件中引入包含Protocol的h文件,之后声明采用这个Protocol即可,如下:

@interface TestAppDelegate : NSObject<ProcessDataDelegate>;
@end

用尖括号(<…>)括起来的ProcessDataDelegate就是我们创建的Protocol。如果要采用多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。例如<ProcessDataDelegate,xxxDelegate>
 m文件如下:

@implementation TestAppDelegate
- (void) processSuccessful: (BOOL)success{
    if (success) {
        NSLog(@"成功");
    }else {
          NSLog(@"失败");
    }
}   
@end 

由于submitOrder方法是可选的,所以我们可以只实现processSuccessful。

方恨少

fhs

微信公众平台在首页放了一份“系统升级造成群发延迟的说明”,看来不是想关门,那么大伙还可以写下去。最近时间严重不够用,业余时间里又增加了一项新任务,准备重新规划一下自己的时间,周末或节假日Mac技巧可能会断更,用大块的时间做些其他的事情,先和大家说明一下。

昨天的《晓说不小》收到很多反馈,有些人看过晓说,有些人准备去看,还有些人吃惊高晓松怎么会有那么多东西可以讲。其实没什么可吃惊的,高晓松出生书香门第,可以说是博览群书,年轻的时候随着性子看了很多杂七杂八的书,包括音乐、军事、科技、历史等等,有些成了他谋生的手段,有些成了兴趣,但是我觉得有一点可以确定,他当年去读去记去探索这些史料文集的时候,肯定不会想到几十年之后会和优酷做一个晓说的脱口秀节目,也不会想到这个节目在2012年会成为年度最佳视频节目,没有鲜衣怒马,只有古砚香台,结果反而老少皆宜,各自有各自的收获。

所以说,看书学东西,不必那么功利,还没开头就想知道结果,一个Hello World还没写完就问这门语言在市场上什么价位。拿出时间和计划去积累就好了,但行好事,莫问前程,河狭水急,人急计生。我们很难预测积累的这些东西什么时候会用到,如果将来用到,那是你的幸运,没用到,就当做兴趣。挺好。

其实对于那些中大型的企业也是一个道理,在有条件的时候尽可能的预研和积累,无论是技术还是业务,别成天惦记员工花了你的工资,不想着种树成天想着摘桃,等别人摘到果实了,您才想起来要种树了,第一没时间了,第二没人了,在IT行业想要倚马可待把人家积累很多年的东西搞出来,基本上是天方夜谭。所以,希望每个老板的眼光都能长远一些,也希望大家能够找到这样的老板。

书到用时方恨少,为啥,cause it’s too late.

Mac技巧写了这么多期,我觉得我需要更多的积累才能继续输出,我在考虑这玩意是不是也搞个第一季,完结之后重新思考一段时间再继续上路……

今天讲两个Mac Tips

1、屏幕画中画

在早期的《副产品》(回复19可看)一文中,介绍过屏幕放大功能,也就是通过option command ±可以放大和缩小屏幕,使用control + 滚轮也可以。

不过这只是放大屏幕方式的一种表现形式,我们还可以通过辅助设置改为画中画模式,打开系统偏好设置-缩放-缩放样式,把全屏幕改为画中画即可,效果大家自己看吧。

2、粘贴纯文本

我们在网页或其他文档上复制文字的时候,会把文字格式一并复制下来,command+v会把文字格式都粘贴过去,如果我们只想粘贴纯文本,可以使用shift+option+commadn+v,大部分软件都支持这种方式复制纯文本。

晓说不小

morningcall

这几天微信公众平台的文章审核慢的令人发指,让人慨叹难道这是要过慢生活了么?难道全中国网民都开始写微信平台了么?一小撮不明真相的读者还发来微信,说为毛这两天都凌晨发送,您改夜猫子了?这真是天大的冤情,以至于周五北京要迎来再次降温(这个寒冷的北京之春)。要怨就怨伟大的审查制度,要恨就恨媒体的自我阉割。

最近这段时间利用上下班的时间,把高晓松的《晓说》第一季全部听了一遍,晓说虽小,但格局很大,在这里给大家推荐一下,有心人可以去找mp3听一遍,涨见识不费电。

作为一个典型的70后,高晓松这个人我当然是在听了《同桌的年》,《睡在我上铺的兄弟》,《白衣飘飘的年代》等等校园民谣之后才熟知的,当时的感觉是此子才华横溢但恃才傲物,歌里表达的是内向伤感,外在却神采飞扬。后来才知道这位兄弟端得是根正苗红,外公张维是深圳大学的创办者、中国工程院、科学院两院院士;外婆陆士嘉中国著名的流体力学家、教育家;舅舅张克潜是著名的物理电子学与光电子学科学家;母亲是著名的建筑学家张克群,老爹最不济,也是清华大学教授。基本上是脑门上刻着“高知子弟”四个金光闪闪的大字出生的,小时候对门住着梁思成(梁启超之子)和林徽因,还去过共和国将帅家里玩耍,见过传奇大奖粟裕将军……哎,这见识怎么比啊,怪不得人家能说一年的脱口秀!

高晓松以前的定位是音乐人、导演、制作人、词曲创作者等等,2012年之后,又多了一个名号,脱口秀主持人。2012年3月,由韩寒命名的脱口秀栏目《晓说》开始播出,每周一期说了近50期,其中涉及的内容包括民国的刺客、镖局、青楼,千年科举,美国的医疗、种族、大选、枪、工会,开国将帅授衔、抗日风云、朝鲜战争、军力对比,大师照亮八十年代,好莱坞启示录等等,内容繁复,博古抵今,精彩纷呈,尽管有些观点我不能完全认同,但大部分是高晓松的独立思考,观点新颖,非常值得一阅。

以高晓松的杂文集《如丧》里的一句话结束今天的扯淡:迄今为止,我把所有喜欢做的事情都做了,除了恋爱和旅行,都已换成了钱,钱不多,够生活。感谢所有的衣食父母,包括我父母。所有人都老了,再没人死于心。我数着日子和钱,等着永逝降临。

今日Mac技巧:

上次讲了Objective-C的Category,今天接着说下。

在什么场景下试用Category呢?如果你遇到:

  1. 当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。
  2. 一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现。
  3. 当你在使用基础类库中的类时(比如NSString),你可能希望这些类实现一些你需要的方法。
     

遇到以上这些需求,Category可以帮助你解决问题。当然,使用Category也有注意事项:

  1. Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。
  2. Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。
  3. 和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。
     
    用好Category可以充分利用Objective-C的动态特性,编写出灵活简洁的代码。

程序员提高英语阅读水平

问题:作为一名程序员,虽说每天都在和英语打交道,但是当看到一篇英语文档或者英语技术文章的时候还是比较头疼,理解他们的意思也只能是20%。尤其是使用google搜索的时候,很多问题解决办法都是英文的,还有一些国外比较有名的网站比如 stack overflow,上面也有很多学习的资源。怎样才能让自己顺利阅读这些技术文章呢?

回答:其实学英语和其他技能没什么太大区别,无论是你想在英语阅读、口语或写作方面提升自己,都需要进行长期的不间断的练习,坚持一段时间后(时间长短根据你自己的效率、每天用时、频率都有关系),你会发现自己的水平自然就提升了。举个例子,以前写博客似乎是最难坚持的,但是如果你每个月都能写一篇略有价值文章的话,5年就会有60篇高质量的博客,你几乎都能集结出书了。到了微信时代,似乎写微信公众平台是最难坚持的,但是如果你能坚持一年,那就有300多篇文章,于人于己,都是一份宝贵的财富。

作为程序员,英语阅读能力是最基本的要求,相对口语和写作来说也是最容易达到的,因为计算机类图书的那些常用单词就那么多,多读几本英语类技术图书,想不认识都难。
一个相对容易坚持的办法就是,找一本和当前工作相关的、急需的技术图书,每天拿出一小时阅读,不认识的单词,如果不影响阅读可以不查词典。如果某个单词多次出现,那么就该查下词典并计入生词本。如果你能坚持查阅英英词典,那么提高就会更快了。
每天坚持一小时,这本书读完,你就会发现自己的阅读能力提高了一大截。

这样看来提高阅读能力似乎很简单,但是,问题的关键是,你能否坚持下来,尤其是阅读初期,你只能看懂20%,需要不停的查字典,单词记了又忘,几个星期过去了,进展依然缓慢。这时候最容易放弃,你会痛苦的怀疑自己,我究竟是不是这块料。

毕竟人类的大脑都是倾向于舒适和懒惰的,谁都知道看美剧刷微薄,是容易的愉悦的。学英语学编程是痛苦的,有时候你甚至会有意识的去避免开始这件事情,先干点这个,再干点那个,熬到最后,发现没时间了,再拿起书来读一会,困了,今天先睡吧。就这样,一天天很快过去了,你发现自己似乎每天都在坚持,但依然没效果。但事实是,你既没坚持,也没效率,这根本不是刻意练习。

提高英语阅读能力这事,比提高英语口语和写作能力容易多了。如果程序员缺乏英语阅读能力,这将是你非常大的一块短板,如果意识到了,尽早补上。
另外说一点,英语翻译对提升英语阅读有一定的帮助,但这个要求比较高,必须要查字典,遣词造句,力求原汁原味的表达作者的意图。翻译并不是提升阅读能力的捷径。我曾经翻译过很多文章和半本书,没觉得自己英语水平有很大提升。

最简单的坚持,最后的结果都是惊人的。这世界上一直存在一条路,让我们的能力从平庸到杰出,这条路漫长而且艰辛,只有少数人愿意走下去,所以,优秀的人永远是少数。

今日Mac技巧:

今天推荐一款优秀的背单词App,叫做拓词,以前好像也说过,这款App的口号是,少壮不努力,老大背单词,大家体会体会。

喜欢看Mac Tips的,回复 m,可以查询文章目录,或者去公众账号搜索 searchmp 上进行全文检索。

今天波士顿马拉松比赛上发生了惨无人道的恐怖袭击,让我们为死者祈福,祝生者平安。

这件事让我忍不住想到运气这个词,人们说勤奋的人会有更多的运气、强者运强等等,我觉得这些说法纯属扯淡,运气有好运气和还运气之分,都是个几率问题。你勤勉半生,健康阳光,习得一身本领,结果看比赛时咣当一声烟消云散,这算是哪门子运气呢?

嗟夫,朝闻道,夕死可矣?唉……万恶的恐怖分子!

刻意练习

practice

最近几期的文字有越写越长的趋势,我觉得这不是个好兆头,个人以为微信公众平台的文章不易太长,短而有趣,能引发思考最好。太长我写起来费劲,用时也长,你们读起来也累不是?最近时间实在是不够用啊。

这几天在读一本打鸡血的书,叫做《哪来的天才》,副标题是练习中的平凡和伟大,英文名称:Talent Is Overrated︰What Really Separates World-Class Performers from Everybody Else。还没读完,有点感想和大家说说。

这本书和把《时间当作朋友》有些类似的观点,但写作风格完全不同。老外写书不像国内作者那样直接表达自己的观点,而是通过大量的研究和实验来动之以情晓之以理,最后说出自己的想要表达的东西,弯弯绕绕挺有趣,但有时看起来也蛮繁琐的。书中的观点有这么几个:

  1. 凡是取得伟大成就的人无不经过艰苦卓绝的努力(貌似是废话)
  2. 天赋没那么重要,即使是对莫扎特和老虎伍兹来说(这个……)
  3. 成就并不简单的来自于勤奋(一万小时理论也不是随便能搞定的)
  4. 刻意练习的重要性(Deliberate Practice) 后续还有一半的内容没读完……

书中的核心思想就是强调刻意练习的重要性,什么是刻意练习呢?它既不是工作,也不是玩乐,其特征是:通常有明确的目的和计划;为了提高绩效,常常需要老师的帮助;能够反复多次;可以持续获得结果的反馈;很累而且枯燥无味。

大家感受一下,反正我思前想后,对照自己的职业生涯,我不得不承认人家说得有道理。坚持的重要性就不用说了,估计大部分人都是半途而废的专家,而常常拿兴趣说事的人,也得反省一下,奋斗的过程并不像很多书本里描绘的那么美妙,很多琐碎的枯燥的事情和练习,都等着我们去做,不做就无法提升。另外针对性和计划性也很重要,老师也是,很多找教练练习羽毛球的人显然比我们这些打野球的进步迅速,而他们的练习方式就是拿好几桶羽毛球不停的练同一个动作……

书里还有一些有意思的内容,等我看完再表吧……

今日Mac技巧:

最近两期讲了Objective-C的一些特性,很多人表示看不懂,很多人表示不过瘾,要求再讲讲Block、GCD、runloop、KVO、离线、Rest等等,我觉得这些点都可以讲,但是大家不要指望通过微信公众平台就把某一门技术学好了,微信平台本身就不适合长篇累牍,写着累看着也累,而且不适合贴代码,我这儿介绍的技术,都是点到为止,告诉大家有这些东西,真正想深入学习的,网上资料多的是。不怕没书,就怕不读!

今天讲两个小Tips:

1、用Spotlight搜索的时候,搜到文件时,我们有时候会需要打开该文件所在的文件夹,这时候按住command键,点击文件即可打开Finder,并定位到该文件所在文件夹。

2、Finder是OS X系统中的常驻程序,一般不需要退出,如果想重新启动Finder时,有一个简单的方式,按住option键,右键点击Dock上的FInder图标,底部菜单会出现重新开启的选项,点击即可。同样的操作对其他Dock上的程序是强制退出。

复用和抄袭

computer-maintenance-300x300

昨天的微信是晚10点左右发送的,写了盗版和付费的问题,结果到凌晨也没发出去,不知道为什么,可能是微信审核人员休假去袅,按理说这个内容不该犯禁啊(当然,你永远不知道自己是否踩线,因为没人告诉你线在哪里,理在哪里)。基于这种微信抽风和个人写作时间不定的情况,我新增加了一条规则,晚上11点之后如果大家还没有收到Mac技巧,回复 t,可以收到当天的微信。如果发现还是昨天的那条,要么是我忘改了,要么是确实没写。
(看昨天的“Mac上的软件付费”,回复103,看当天的,回复 t)

今天聊聊软件的复用和抄袭,本来想用复用和复制做标题,觉得有标题党之嫌,而且意思也不明确,遂改为复用和抄袭。

文字上的抄袭相对容易辨识,你复制了别人的文字说是自己写的,在现在这个互联网时代已经很容易被发现了。我所关注的几位微信平台的作者基本都是原创,即使有引用也标注的清清楚楚,这一点技术人还是毫不含糊的,而持续的原创也是吸引读者的重要原因之一,否则你也很难拥有成千上万的读者。

但是在软件层面,复用和抄袭就不是那么容易分辨了。比如复用被骂抄袭的,抄袭了说自己是复用的等等。这个主题其实挺大,我简单说说。
软件复用是一个久远而不过时的主题,其主要目的就是复用已有的软件技术(收费的或免费的),建立新的软件系统,提高生产力和质量。复用是软件开发领域一直倡导的,从早期的代码复用、算法复用,到现在的组件复用、框架复用、服务复用、计算复用、资源复用等等,我个人近些年也一直在做这方面的工作,复用的宗旨就是让程序员写最有价值的代码,而不是写重复的代码!

与复用相对的是NIH综合症,NIH(Not Invented Here)的意思是“非我所创”。得了这个病的人,症状是所有的东西都要自己写,永远不使用现成的代码、库、框架、服务,因为那些是别人写的。他们的口头禅是我可以写的更好。且不论能不能更好,单是推倒别人的系统重写一遍这件事,就只是模仿而不是创造,大部分时候都是无用功,徒增代码和浪费时间。无论大小,每个组织几乎都有NIH患者,得了这个病怎么办?一得治,二药不能停。

真相就是:无论你从事什么领域的工作,无论你有多么优秀,聪明伶俐精力旺盛锐意进取,但是漫漫人生路,时间和精力都是有限的,合理利用世界上其他人的劳动成果,方可成就自己的事业。

那什么是抄袭呢,我觉得可以从产品和技术两个方面去看。

从产品层面,看到一款具备优秀创意和功能的软件产品,你研究一下,然后做了一个一模一样的复制品,改改名称和语言,就说是自己的创意和产品,这毫无疑问是抄袭,就像大家说当年的微信1.0抄袭Talkbox一样,有阵子业界还为此类抄袭起了个洋名叫微创新。但是如果你看到了这款产品,经过研究,激发了你新的创意,你在这个产品的基础上做出了一个全新的东西,那就不再是抄袭了,就像没人说现在的微信抄袭Talkbox一样,因为大家都忙着学习微信的创新呢。

技术层面相对简单一些,使用商用和免费的技术和组件做自己的软件,都是复用;把别人的技术拿过来说成是自己的成果,都是抄袭。

有优秀的框架和组件不去复用自己写的,是愚蠢;把别人的东西拿来改改说成是自己的,是无耻。

今日Mac技巧:

上次讲OC那篇收到诸多好评,今天接着聊吧。

Objective-C与Java一样,不支持多重继承,但是通过分类(Category)和协议(Protocol)可以很好的实现代码复用和扩展。这期技术内容聊聊Objective-C的Category(分类)。
Objective-C提供了一种与众不同的方式——Category,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
实现起来很简单,我们举例说明。

SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 

 
这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:

#import "SomeClass.h"
@interface SomeClass (Hello)
-(void)hello;
@end

实现文件代码如下

#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
        NSLog (@"name:%@ ", @"Jacky");
}
@end 

其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。
调用也非常简单,如下:
首先引入Category的声明文件,然后正常调用即可。

#import "SomeClass+Hello.h"
SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 

执行结果是:
name:Jacky