晓说不小

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的动态特性,编写出灵活简洁的代码。

复用和抄袭

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 

神奇的程序员—王小波

goldtime

从昨晚到现在大概收到了1500多条反馈意见,也没法统计了,大体上看了下,差不多是3:3:3的比例,喜欢看随笔的,喜欢看技术和一样都不能少的。那就维持现有风格,可能每篇文章在随笔和技术内容上各有侧重吧。另外tips类型的Mac技巧已经讲了很多了,后续的技术内容略有进阶,不喜欢的自动忽略吧,想看tips的,记住回复 m。

(昨天最奇葩的一个回复是俩字:退订,然后人家就退订了,言出必行,赞!)

喜欢读书的人,我想对王小波都不陌生,他是中国最富创造性的作家之一,他是中国近半世纪的苦难和荒谬所结晶出来的天才,他英年早逝。他的作品对我们生活中所有的荒谬和苦难作出最彻底的反讽刺。他还做了从来没有人想做和做也没才力做到的事:他唾弃中国现代文学那种“软”以及伤感和谄媚的传统,而秉承罗素、伊塔洛·卡尔维诺他们的批判、思考的精神,同时把这个传统和中国古代小说的游戏精神作了一个创造性的衔接。(以上部分摘自百度百科)

我读过王小波三部曲黄金时代,白银时代和青铜时代,读过沉默的大多数,读过红拂夜奔,读过似水六年,但是最近才知道,原来王小波是一个伪装成作家的程序员(这位同学不用站起来了,不知道这是调侃么)。

  • 王小波很早就接触了计算机,1988年毕业于美国匹兹堡大学东亚研究中心,获硕士学位,那时就知道Macintosh,玩过IBMPS/2。
  • 90年学习FORTRAN,开始进行数据统计,并开始在北大教统计学。
  • 91年搞了个用调整字模发生器方法输出汉字的系统,并发出嗟叹:嗟夫,不过现在我对微机已无兴趣,因为发现写小说也可赚到钱。一代天才作家终于开始写小说了,但他依然没有停止编程的脚步。
  • 92年开始写C,“用C编的软件已经用熟,并做出了各种写小说的工具,别人的软件已不用了。现在主要是写书赚钱。从今年初开始写长篇,首先做了写长篇的专用软件,现在基本调通,开始写了”。
  • 93年开始搞汇编,“下决心买了一台286,这些日子在改造软件,作了不少汇编工作。其核心是它在虚拟保护方式(virtual address protected)下工作,以便利扩展内存(expandedmemory)”。
  • ……

如果王小波不那么早辞世,估计会有更多伟大的文学作品和软件产品留下。谁说文科生不懂技术?谁说程序员不能写书?这才是技术与人文的完美结合啊,你们感受一下……

点击底部的{原文},查看王小波的软件历程。

今日Mac技巧:

1、更简单的禁用通知的方式

经过多位童靴提醒,我们可以通过按住option键,点击右上角的通知按钮,即可禁用或恢复通知系统。

2、Objective-C的消息机制

上次讲了一些Objective-C的历史,很多童靴觉得不过瘾,今天为大家介绍下这门语言的消息机制。

Ojbective-C的语法设计主要基于Smalltalk,除了提供传统的面向对象编程特性之外,还增加了很多类似动态语言Ruby、Python才具有的特性,例如动态类型、动态加载、动态绑定等等,同时强化了消息传递机制和表意(Intention Revealing Interface)接口的概念。

消息传递模型(Message Passing)是Objective-C语言的核心机制。在Objective-C中,没有方法调用这种说法,只有消息传递。在C++或Java中调用某个类的方法,在Objective-C中是给该类发送一个消息。在C++或Java里,类与类的行为方法之间的关系非常紧密,一个方法必定属于一个类,且于编译时就已经绑定在一起,所以你不可能调用一个类里没有的方法。而在Objective-C中就比较简单了,类和消息之间是松耦合的,方法调用只是向某个类发送一个消息,该类可以在运行时再确定怎么处理接受到的消息。也就是说,一个类不保证一定会响应接收到的消息,如果收到了一个无法处理的消息,那么程序就是简单报一个错。甚至你可以向一个值为nil的空对象发送消息,系统都不会出错或宕掉。这种设计本身也比较符合软件的隐喻。   在表意接口(Intention Revealing Interface)方面,Objective-C也是设计的比较出色的语言。面向对象语言的特性之一就是通过API把实现封装起来,为上层建筑提供服务。但是需要注意的一点就是,你封装的API最好能够让调用者看到接口描述就知道怎么使用。如果为了使用一个API必须要去研究它的实现,那么就失去了封装的意义。Objective-C通过显式的API描述,让开发者不自觉的写出满足表意接口的API,比如下图中的API描述。 objcapi 上图中描述了一个传统意义的实例方法,但和Java或C++不同的是,其方法关键字由多个字符串组成,在这个例子是insertObject和atIndex,(id)anObject和(NSUInterger)index分别表示参数类型和参数名称。整个方法看上去就像一个英语句子,我们可以很容易的知道,这个方法就是在索引为index处插入一个对象。如果你是从其他语言转到Objective-C,那么开始的时候会感觉这种写法有些繁复,但是一旦理解并习惯了你会感受到其巨大的好处,这种写法会强制你写出优美易读的代码和API,而且有了XCode强大的提示功能,再长的方法也是一蹴而就。

后续讲讲Objective-C的多态和继承。与Java一样,Objective-C一样不支持多重继承,但是通过类别(Category)和协议(Protocol)可以很好的实现代码复用和扩展。

苹果的语言

apple8

申明:今天的文章技术性强一些,不喜欢的……可以申诉

最近连续被问到学习Objective-C的问题,比如我原来学的是C或C++,学Objective-C行吗?这门语言语法怎么那么古怪呢?现在学Objective-C有前途吗?
好吧,今天简单说说苹果的当家语言Objective-C。

首先说明一下,技术这种东西很难说学哪个更有前途,而且以前有一期也说过,如果你准备以技术手段谋生或实现你的理想,基本不可能只懂一门语言。就目前来看,Objective-C似乎是薪酬较高的语言,但是这个阶段迟早会过去的,就像当年的Java一样。一门语言只有掌握的足够深入,才有机会探讨它的前途和钱途。
想要看得远,必须站得足够高。吐槽完毕!

Objective-C是C语言的扩展,设计思路上借鉴了Smalltalk的面向对象和消息机制的思想。从我个人使用过的面向对象语言来看Obj-C是对消息传递支持的最彻底也最显式的。Objective-C的类中定义的方法都是消息传递,而且类和消息之间是运行时绑定的,运行时编译器把消息发送转换成对objc_msgSend方法的调用。其它的C++、Java、Python、Ruby都体现得不明显,更倾向于对象的封装和抽象。

Objective-C和C++基本上是两门语言,没有太大的关系。Objective-C本身是静态语言,编译后就是机器码,执行效率很高,但引入了很多类似Python、Ruby的动态特性,像动态类型推断,id,selector,block等特性,所以又非常灵活。用惯了Java或C++会觉得Objective-C的语法很怪,但如果你用学习新事物抛弃旧思路的方式去学习这门语言的话,你会很快爱上它的消息式的编程风格,加上XCode,无论是写Mac应用还是iOS应用,都会非常得心应手。

关于苹果为什么采用Objective-C的问题,说明一下,其实不是苹果采用了Objective-C,而是乔布斯创建的Next公司的操作系统NextStep采用了Objective-C作为原生语言。
Objective-C在计算机编程语言中有着不短的历史,80年代初Brad Cox和Tom Love发明了Objective-C,1988年乔布斯的Next公司获得了这门编程语言的授权,并开发出了Objective-C的语言库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基础,Objective-C是其语言和运行库。后来的事大家都比较清楚了,苹果买了NextStep,乔布斯回归苹果,NextStep也成了Max OS X的基础。以后发展越来越好,Objective-C反而成了苹果的当家语言,现在基本上是苹果在维护这门语言的发展。

随着苹果的APP帝国不断壮大,这门语言也得到了长足的发展,从1.0到2.0,从面向对象的C语言扩展,到内存引用计数管理,属性管理,引入块的概念,实现自动引用计数,优化编译器,简化语法等等。Objective-C在2011年和2012年分别获得了TIOBE评选的年度语言,目前排名第四。
苹果CEO库克在2012年的WWDC大会上宣布,苹果已经为全球开发者支付了超过50亿美金的分成收入,时至今日,估计已经远远超过50亿了,对于开发者来说,这是一门能够独立创富的编程语言。

还有一点不能不提,第一台万维网的Server就是一个叫蒂姆·伯纳斯-李的大牛在NextStep上写的,包括浏览器。所以,咱们得感谢Objective-C,要不然还不知道互联网会发展成啥样呢……