[译] Xcode 6的“矢量图支持”是如何工作的

翻译自这个答案

矢量图在Xcode 6中如何使用

  1. 以一倍图(@1x)大小将图片保存成PDF格式的矢量图
  2. Images.xcassets文件中新建一个Image Set
  3. attributes inspector中,将Type设为Vectors
  4. 将pdf文件拖拽到All, Universal
  5. 这样,你就可以通过名称(指images.xcassets对此图片起的名称)来指向这个图片,跟使用png图片一样。

矢量图在Xcode 6是如何工作的

“矢量图支持”在Xcode 6中可能跟大家想象的有所出入,因为很多人想到矢量图的时候,他们想到的是那些可以被扩大,缩小,但是还能显示得完好的图片。然而,Xcode 6对于iOS的矢量图支持并不完全,所以它的做法有点不同。

为了消除这种疑惑,在此说明矢量图系统的工作流程如下:

  • 它只是一个转换系统,它在 构建期 通过你的png文件生成@1x.png, @2x.png, @3x.png

比如,假定你有44×44大小的foo.pdf矢量图,在 构建期 ,它会生成如下的文件:

  1. foo@1x.png 44 x 44
  2. foo@2x.png 88 x 88
  3. foo@3x.png 132 x 132

这意味着:

  • 你不能更改图片的大小(指的是把一个44×44的图片塞进100×100的ImageView里)。它只有在44×44的大小中才看起来对。原因是(iOS)并没有实现矢量图的完全支持。这些矢量图的作用只是让你保存image assets的时候帮你节省时间。如果你已经用了某些工具,比如一个Photoshop脚本,这些pdf文件的作用只是对未来可能出现的情况的适配(比如如果苹果要求对iOS 9进行@4x图片的支持的时候),以及减少文件的管理。
  • 你必须将所有的矢量图保存为@1x大小的PDF格式。这样做才能保证UIImageView有正确的固有大小(intrinsic content size)

苹果这么做的原因是:

  • 能对老版本的iOS向下支持。
  • 运行时缩放矢量图是一个计算密集型的工作,但是通过上面这种方式,就不会对性能造成任何影响。

雅思备考建议(3)

第三阶段:基础训练、技巧练习(2)

写作训练

写作和口语是最容易挂的两门,我所有挂掉的都是因为这两门导致的。并且,多数商业培训机构喜欢在这两门上面忽悠赚钱,所以有很多受害者,我也是其中之一。其实这也很好理解,因为很多人都在这两门上挂好几次,这时候有个人过来跟你说,其实你不用学英语也能考高分,只要跟着我走就行了,那么很多人理所当然就信了。这就跟医院里的骗子一样,专门针对不治之症的病人行骗。当然每个人有每个人的学习特点,不排除有些人用商业培训所教的方法提分。

写作和口语另外一个比较恶心的情况是,你没法一个人学习。不像前面两部分,这两部分都是主观评分,所以你平时练习写作和口语的时候,根本不知道自己能得几分。有时候你觉得写得很好的文章,可能通篇都是Chinglish,外国人根本看不懂。所以这两块需要重点花钱来解决。

写作基础训练

在练习雅思写作的时候,必须牢记这个是学术写作,所以绝对不能用口语化的词和俚语,也不能用缩写。否则肯定分数低。基础训练没有特别的技巧,就是多写多练(这是血的教训,如果光读不练的话,分数怎么都没法提高)。

基础训练第一步是学习雅思写作的题型和应对方案,这可以通过网上的资料,或者网络课程,或者一些相关的书来学习。

其中,网络课程有很多,而且这些老师会给你洗脑,特别是郑仁强,他会推荐他的预测班。他的预测班自称是给你答案的地方,他的方法很简单,就是写一些段子让你去背,然后在考场上通过拆拼组合凑出答案来。我第一次考的时候遵循了这个方案,而且考题和预测基本一致,所以我洋洋洒洒写了一大堆,觉得能拿7分了,结果给了5.5。后来我意识到,我不适合这种学习办法,因为别人的idea我很难记住,即便记住了,这些素材用起来也不得心应手。况且初学的时候语法不行。所以后来老老实实地从头开始学。

书有很多,慎小嶷的《十天突破》可以备一本,这本书可以让你知道雅思写作考什么,分数是怎么打的。不过你只要知道这些就行了,书的其他部分大可以瞄一眼就过去了。里面给出的高分词组,也不用去背,因为背了也没用,背下来的单词都是被动单词,你看到的时候看得懂,用的时候不会想到去用。这其实不只是英文是这样,就连中文,很多成语和高级词汇,在写作的时候你根本不会想到去用,虽然你看得懂。另外,顾家北的《手把手教你雅思写作》的第一章也对雅思写作的总体做了介绍。

第二步是语法学习,这是至关重要的。一方面这是评分的一个标准,另一方面一些语法问题会导致歧义,可能导致别的部分的分数,比如词汇的准确性分数被扣掉。关于这一点,有两本书可以推荐,一本是《文法俱乐部》,这本书已经绝版了,只能网上找点盗版看看。书比较厚,所以语法基础不好的同学可以多花点时间啃啃。对于语法好的同学可以直接看《顾家北手把手教你雅思写作》的第二章。在这一章里,他把中国人容易犯的语法错误都归纳了一遍,很有用。语法学习是否到位了,可以通过一个方法来验证,就是《顾》的第三章起,全部都有对学生写的句子的批改。如果你能做到不看下面的答案而能批改到位,那么就差不多了。

第三步开始就是长时间的练习加积累词汇了。写作词汇很重要的一点就是注重词语的搭配,顾家北称之为“词伙”,其实英文名叫做collocations(这个页面里面有两个链接很有用,需要加以利用)。积累不是一蹴而就的,需要时间,并且需要读写结合。

我的方法是:

  1. 先看预测题,这个微博属于“雅思我预测”机构的,它的置顶帖上都是预测题。和阅读、听力预测不同,我认为写作和口语预测是在考雅思过程中非常必要的环节。因为中国人掌握的词汇本来就比较少,尤其是话题词汇,而写作口语预测能够让你把话题词汇的范围缩小,从而在考试的时候用到更多地道的词。
  2. 选择一到预测题,抽取话题关键词,Google一下(again,需要科学上网,为什么不推荐百度呢?百度对英文的理解能力就是渣)。由于雅思写作的话题,在西方都还是比较热门的,所以经常可以看到别人写的博客,或者论坛上的辩论。有几个网站我这边highlight一下:procon.org, idebate, 英国卫报。这三个网站,前面两个因为都引用了Google的一些文件,所以打开来特别慢,英国卫报已经被墙了,所以建议科学上网。可以准备一个笔记本,把里面的用词搭配记下来,然后拿来造句,或者用Evernote或者Pocket将整篇文章裁剪下来,高亮词伙。然后经常复习(如果你是Android用户,你可以试着用一个叫Revunote的软件,这个软件将配合Evernote进行艾宾浩斯记忆法复习,不知道国内市场有没有这个软件,如果没有,请再科学上网)。浏览这些资料,不但可以提升词汇量,而且能够开拓思路,知道外国人怎么在思考这些问题的,所以一举多得。
  3. 写文章。要把被动词汇转变成主动词汇,唯一的办法就是多用它。但是文章写了之后,你不知道好坏。这时候只能求助于人了。淘宝上有很多雅思作文批改的店,可以试试。我个人选择了这家,一开始老师的态度非常好,不但指出了我的语法错误,而且对于段落结构之类的问题也会做出修改,还会提醒我下一阶段着重要训练哪一方面,最后还给出一个模拟评分。不过后来批了很多次之后,发现分数给我打得越来越高,批改的地方越来越少。后来有几篇文章只给我一些小改动,然后打了个8分。我不知道是我真的在进步,还是他们越来越懒了。总之,写作需要有反馈才能进步。另外,如果不希望付钱的话,可以到lang-8.comitalki上的社区,找老外批改。但是这个批改有几点不足,一是他们不是针对雅思的,所以最多给你改改语法错误。二是那里的老外很少会批长篇的雅思作文,他们喜欢看的是个人日记之类的小文章。三是你需要帮学中文的老外改中文作文,才能赚到足够的点数让老外留意你的文章。这两个网站在口语部分还会提到。

写作技巧训练

写作技巧主要有两点,一是brain storming,二是字数的控制。第一点是离不开基础训练的,只有平时多想,才能在考试中迅速列出提纲来。第二点可以下载写作答题纸,然后尝试在答题纸里面写文章。文章字数控制是比较重要的,如果写少了,要扣分,写多了,时间不够检查。

总的来说,写作是很头疼的事情,需要不断练习才行,一天不练习,就要退步了。我个人在平时不计时的条件下写作,能写7~8分左右,但是考场上我最多考6.5分。

口语训练

口语部分我觉得是最难以把握的部分。因为老师打分的依据总是让人捉摸不定,影响最后分数的因素很多很多,除了本身能力的好坏之外,可能还跟考官当天的心情、你的穿着、你的长相、其他考生的表现有关。虽然雅思考官追求公平公正,但考官总是人,摆脱不了感性。我就有口语5.5复议到6.5的经历,所以很难说他们是绝对公正的。甚至我认为如果你觉得你的表现跟最后的分数不符,应该马上去复议。

话虽如此,保持说话的自然,以及回答的扩展性依然是起决定性因素的。

口语基础训练

  1. 先看预测题。我推荐人人“雅思哥”主页里面的口语预测,它的不但范围小,精准度几乎达到了100%。看口语预测跟看写作预测一样,能在有限的时间内帮助你建立起足够的话题词汇量。
  2. 寻找地道的表达。只有地道的口语表达才能提高分数。之前说了,保持说话自然是起很重要的作用的,但是老外的“说话自然”和我们认为的“说话自然”可能不是一回事。因为我们从小到大教的都是比较学术性的词语,所以口语的时候比较容易说学术性词语而忽略了生活的表达。这个时候考官会认为你不够自然,甚至认为你是背出来的。学习口语生活化表达有3个好地方,一是English Pod(链接: http://pan.baidu.com/s/14bKIi 密码: 4jhe)。还有BBC的六分钟英语。另外一个是美剧《摩登家庭》。English Pod和六分钟英语里面有很多场景,有时候跟雅思口语考试的场景能对应起来。而摩登家庭可以让你知道什么是自然的英语交流。这个过程也是很漫长的,需要不断地积累。
  3. italki请一个一对一的口语老师。这个网站除了能在社区找老外改作文之外,还可以请老外上正规课。上面有很多来自英国的职业英语教师,甚至有些专门培训雅思的。不同的老师价格参差不齐,但英国的老师基本上都在15美元到20美元一小时左右的价格。另外还有很多社区辅导,那些老师都不是职业教师,但是都是native speaker,这些老师的价格就很低,我的一个老师Vector每小时只收4美元。建议先在职业教师,尤其是有雅思培训执照的老师那里上一节课,他们会对你目前的问题,如何改进,怎样自己在家里练习等给予指导。然后在自己练习雅思口语的基础上,找社区辅导老师,进行日常对话,来培养说英语的自信。这样考试也就不会紧张了。
  4. 准备part2。这个部分是口语考试中最不自然的地方,也就是给你一张卡片,然后准备1分钟,再自己讲2分钟。这个不是正常人的交流习惯,所以需要准备。准备方式是把预测题一张一张地看过去,然后写下你的答案,保证这些答案够你说两分钟,然后贴到italki或者lang-8里面让老外帮你改。但是这些答案不要背,而是记一下脉络、用词以及高级语法。这些在1分钟的准备里面很重要。另外要注意的是,准备的时候尽量用生活化语言,不要在维基百科上面抄,因为维基百科的用语太正式了。另外不要给出很精确的数字,比如“这栋建筑是1864年建造的,占地面积是524平方米”,因为这样明显是准备过的答案,给出的分数会很低。实际上P2最主要的,不是介绍一个人、一个物、一件事,而是你对这些东西的看法和体验。
  5. 录音和改进。自己可以在家里模拟一下考试,然后把自己的答案录下来,然后不断地改进。改进主要是来培养语法敏感度。因为要保持讲话时语法全对是很困难的,英语里面的复数形式、时态等等,在中文没有对应关系,所以需要不断练习来改进。如果你自己听不出语法错误,建议再次进行语法修炼,因为这对写作也是有影响的。

总之,口语练习本质还是要多说,而且跟Native speaker对话是很有效果的。我第一次在italki请老师的时候,只能支支吾吾地进行对话。到了第三次的时候,已经可以跟对方开点玩笑了。现在的商业培训机构给出的方案基本上就是预测+背答案。网上最火的是刘薇和黄瀚生,方案也是一样的。但是这个方法是不可取的,因为虽然P1预测能做到话题100%准确,但是问题细节还是会有出入的。刘薇的答案,一个话题就给了一长串的段子。如果你拿这个去背,就很不自然。比如考官问你:“你家乡在哪啊?”,然后你说一大堆东西,把他下面要问的问题都回答了,他就不知道问什么了,也会明显察觉你是有准备的,然后多半会给5.5,很多人包括我在内,越准备充分考得越低,就是因为如此。前考官Simon和我的一个英国老师的建议都是,尽可能保持简洁,但又有扩展性,一般保持在每个问题回答3~4句左右,然后等下一道问题。

口语技巧训练

口语的唯一技巧在于Part2的1分钟准备。这时候,你需要在草稿纸上面写下回答的脉络,以及你可能会忘记说的高级词汇和高级语法(比如完成时、定语从句等等)。

另外注意事项

口语考试比写作更加容易出现分数的偏差,因为它是由一个考官现场打分的。而人与人之间的交流,不太可能会完全客观公正。其他因素也会影响。比如要多用手势,面带微笑,然后保持眼神接触,这些都是很重要的,否则考官很容易觉得你是在背。如果你这些都做到了,并且自己觉得发挥的蛮好,但是分数又给的很低,那建议你去韩国整容复议吧。

考前准备

考前要对考试的事情做基本了解。首先要了解的是,考试只要带身份证、准考证和一张照片就可以了(这些在报名网站都有写),其他都不需要带。笔试期间,从听力开始到阅读结束(加上考官读注意事项的时间)这两个小时之内是不能上厕所的。写作的最后5分钟也是不能上厕所的。另外,带手表如果有液晶读数,也有可能被禁止带入。所以不要买卡西欧,要买劳力士。

更多资源

有个网站要推荐,就是ielts-simon。Simon是前考官,所以对雅思非常了解,在他的网站里经常有非常好的建议。跟着他练习将会有很大的帮助。顺便说一下,顾家北是Simon的忠实信徒,顾家北的课和微信,经常会引到Simon的东西讲。

另外一个要推荐的就是顾家北的微信。他的微信每天都会推送词伙,这些词伙来自BBC或者Simon的一些东西。每天积累一点点对于写作的帮助很大。

雅思备考建议(2)

第三阶段:基础训练、技巧练习(1)

第三阶段是最主要的阶段,也是最后的阶段了。那就是对于听说读写全方位地进行基础训练和技巧练习。如果时间比较充裕的话,可以先从听力和阅读开始训练,因为这两科是最容易训练和提分的,并且国人在这两科的基础普遍都比较好。

听力训练

听力基础训练

听力的训练,我没有什么经验,主要是我这方面基础比较好。毕业设计那会为了学iOS开发,硬是把斯坦福的公开课不带字幕地看下来学会了。所以听外国人讲话还是蛮适应的(实际上英国人讲话我一开始很不适应,很多人都不适应,之前有个美国佬说,他看英国的电视要挂字幕才看懂。不过多听多听也就熟了)。第一次考雅思就考了6.5分,后面几次都在7分以上。

不过个人觉得可以遵照环球雅思王陆的方法:

  1. 练习对名词的敏感程度。因为多数填空题的答案都是名词。方法是先看听力原文,把原文中的名词快速圈出来。然后把原文盖住,开始听录音。听的时候,把听到的每一个名词都写在纸上(注意边听边写,不能停录音)。听完之后把写下来的答案和原文中对比。如果能写出绝大多数的名词(90%正确率),那就完成了。否则就再听一遍,直到写出大多数名词为止。
  2. 对复数名词敏感度。因为听力中,如果听到复数名词,而你填写单数名词,是不给分的。所以也要训练。方法和1一样,但只关注复数名词。
  3. 拼写反应训练。听到一个词能够马上写下来的能力。这个需要配合王陆的语料库来使用,具体方法里面有写。在拼写反应训练的基础上,我建议增加数字反应的训练。因为总有几道题是要求填数字的。而国人对英文数字的反应总是要慢半拍。英文数字反应的能力,按照王陆的方法不是听,而是读。打开手机的通信录,把里面所有的号码用英语读一遍。反复练习就有效果。

由于剑桥雅思真题有限,所以需要珍惜这些材料,不要全都做完。每一套题的每一篇section都能够一天的训练量了(尤其是s3, s4)。除此之外,个人的经验是可以用额外的材料进行休闲式的听力练习。比如听BBC的音频广播,平时可以听听,不需要全部听懂,主要是用来适应英国人讲话的那个调调。另外还可以听听公开课,对s4很有帮助,因为s4本质上就是课堂笔记的填空。

听力的技巧训练

主要有三点:

  1. 读题能力。雅思听力在每个section前都会有一小段时间来读题目。读题能力在这段时间是至关重要的。它包括两部分,一是能快速读题。特别是选择题,如果能在读题时间中看得越多,那么对题目把握也就越大。二是边听边读题,这个相当困难,我本人也做得很糟糕。总的来说,这个需要第2点关键词定位做辅助。当判断当前内容已经脱离了上一个小题,但还没进入到下面一题时,就是看下面一题的时机。因为比较难,所以初学者应该依赖于快速读题,来提高前面题目的正确率,每个section的最后两题可以考虑放弃。
  2. 关键词定位能力。关键词定位有助于在听力考试中明确地知道当前进行到哪道题了,即使前面有道题没听到,也不至于后面不知道进行到哪里了。在读题时间里,首先要圈出题干中的关键词。注意,关键词应该是不变的词,比如特殊名词,长得特别奇怪的词。因为雅思考试考的就是同义替换的能力,普通的词很有可能在对话中被替换掉,而唯独特殊名词和特别奇怪的单词不会。
  3. 地图题跟踪能力。地图题要考验方向感,所以拿到地图时,应该在图的四边标注好方向(W, E, S, N)然后再停录音去跟踪路径。

阅读训练

总的来说,阅读是最容易训练的一科了。主要有两个原因,一来国人的阅读基础向来很好,虽然英语可能不会说,但是阅读题做了十几年了自然不会陌生。二来,在训练其他三科的时候多多少少会读一些英文的资料,所以阅读的能力会伴随提高。以个人的经验来看,半年内从6分提到9分是可以的。基础好的同学可能会更快一点。

阅读基础训练

阅读基础训练没有太大的技巧可言,关键就是多读,在读的过程中积累词汇量。并且遵照第二阶段的方法,把同义替换找出来,积累这些东西。

阅读基础训练用的材料,除了剑桥真题系列之外,还可以找很多。剑桥真题因为十分稀少,所以要省着点用,建议用在技巧训练上而不是基础训练上。个人阅读过的材料有这些:

  1. BBC新闻。这个其实读多了很无聊,国外的新闻网站给出的多数都是坏消息,坏消息总是很相似的,特别是今年,今天掉了这架飞机,明天掉了那架飞机,讲来讲去还是一样的东西,而且词汇量也不是很大,如果连着看一个月,就会发现翻来覆去就这几个词。BBC新闻本身跟雅思考试没有什么关系,因为考试的题材跟这个完全不一样,所以这个建议在上班上学的路上随意看看。
  2. 《雅思我预测》阅读预测系列。这个系列不是正规出版物,所有的题目都是雅思真题,但不是剑桥系列的真题。关于预测,下文会有详细说明。简单来讲,这套书里面的题目,很可能会在以后的考试中出现。平均来说,每次考试三篇阅读里面会有一到两篇能够命中,有时候命中三篇也是可能的。不过我用这套书的目的不是为了预测(因为阅读不用预测也能考很高的分数),而是为了拓展雅思水平的文章阅读。如果基础比较差的同学可以多读一读。跟剑桥真题系列不一样的是,这套书里面的文章看得越多越好,一方面量很多,所以不需要珍惜,另一方面看多了说不定考的时候就命中了。但是我个人认为这套书应该放在基础训练上来做,而不是技巧训练上,因为一方面除了文章是准确的之外,它的题目和答案都是来自别人的记忆,不一定准确;另一方面,文章里面的疑难词,它都会有中文标注。所以不适合当模拟题来用。
  3. New Scientist(需要科学上网)。这本杂志实际上是雅思阅读的源头之一,雅思阅读题很多出自这个杂志。如果你是iPhone或者iPad用户,这个杂志在App Store中国区是有售的。而且是为数不多的价格便宜的国外杂志,每一期只要12元人民币,跟中国的杂志价格差不多。由于是雅思阅读源头之一,它的题材跟雅思考试比较接近。又因为可以在手机上看,所以无论是上下班路上瞟两眼,还是静下心来慢慢读都是可以的。

阅读技巧训练

在阅读上,技巧很重要,如果没有技巧地去读,很可能做不完题目。阅读技巧一言以蔽之就是平行阅读法。这是完全符合雅思出题习惯的解题套路。因为市面上有对这套方法的详细介绍,不同题目有不同的应对方法,所以这边不细讲了。

用两本书可以学会平行阅读法:刘洪波的《雅思阅读真经总纲》和张岳的《雅思阅读新题 平行冲刺训练》。先读前一本书,作为指导,大约两周就能完成。然后用后一本书做完整的训练。另外,在技巧训练上,可以多加用剑桥真题系列。

平行阅读法简洁明了,也不需要特别刻苦地练习。掌握了之后基本上能提高1分以上,并且以后即便不训练也不会生疏。个人觉得,如果考上了7分,并且7分已经足够小分最低要求了,那么阅读大可以不训练了。因为在训练其他三项时,阅读能力自然而然会提高。

(未完待续)

雅思备考建议(1)

最近雅思终于过了入学最低要求(口语和写作终于双双过6.0了)。本学渣在备考的过程中走了不少弯路,导致前前后后考了5遍才考过。在此总结经验教训希望对后来人有用。

其实考雅思真的是看英语功底的,英语功底好的人,首战拿四个7都不是问题。而且这个功底是看听说读写各个方面的,对多数中国人来说,听和读的功底基本上没问题,问题都是在写和说上面。因为无论是高考英语还是四六级英语,听力和阅读都是重中之重,写作对分数的影响不是特别大,而口语根本就没有。这也导致学了10年英语的中国学生根本不会说英文。

第一阶段:背单词

如果在准备四六级的时候背过单词了,那么恭喜你这一步可以省略了,因为雅思的词汇量要求不高,六级词汇量已经完全足够了。如果没有背过,那么需要在第一阶段背一下。背词汇手册不需要把每个意思都很详细地记住,只需要记个大概印象就好了。这是因为背单词只是前期准备,避免后面阅读训练时被一大堆生词吓住。对于单词和词组的学习,可以说是准备雅思的本质,这会贯穿整个备考过程中,而且主要形式不是背词汇手册。并且,单个词的意义其实不大,无论是听说读写,最主要的是对地道的词组搭配的运用。但这不是说不用背单词了,背了的单词其实是起到bootstrap的作用,如果一句话里面只认识一两个词,那么根本没法做以后的训练。

背单词建议使用艾宾浩斯记忆法(后面所有的训练都可以遵循这个记忆法),这能在短期内大量提升词汇量。背单词的时间控制在一个月以内,个人主要使用星火英语4~6级那本词汇手册,一天一个word list,以word list为单位做艾宾浩斯记忆法复习。选择这本的主要原因是它会对一些单词之间的联系做阐述,使得背起来没那么枯燥。虽说如此,背单词依然是最痛苦的部分。一个月之后,这本词汇手册正好背完。但由于用了艾宾浩斯记忆法,其实很多word list已经背了四五遍了。这时应该结束背单词,进入到下一个环节。

第二阶段:熟悉雅思题型

在第二阶段开始之前,应该购买剑桥雅思真题4~10系列。这是最重要的习题,而且因为只有7本,数量有限,所以需要善加利用,千万不要用题海战术一口气全部做完,因为做完意味着没有资源再训练了。剑桥真题系列中,数字越大的越新,越和最进考试接近,所以是很珍贵的。建议7,8,9,10在第二阶段先不去动它们,而是从4~6中挑选一本。

第二阶段熟悉雅思题型的方法有很多,比如完整地做一套题(第一次做不用在意时间),或者网上搜一些文章(这有很多,特别是你会科学上网的话,用Google很方便就能查到),或者到淘宝买环球雅思或者其他机构的盗版课(虽然强烈不推荐盗版,但是我一开始就这么干的,另外如果你有钱的话可以去YY教育买他们的现场正版课,但是要注意,不能尽信这些老师的方法,因为他们是赚钱机构,很容易忽悠学生,我也上了很多当。你要从中学的,就是熟悉基本题型)。雅思的题型这几年来似乎一直没有变过,只有权重的变化,所以熟悉了就熟悉了。

熟悉了基本题型,就可以试着做一两套真题了。第二阶段做真题不在乎对多少错多少,而在于能学到多少。有一件事情可以在第二阶段开始做起来了,就是收集听力、阅读部分的替换词。雅思考试的最大特点就是考同义替换(paraphrasing)。比如一道阅读题:

题目:In addition, over two thousand years ago kites were used in China as weapons, as well as for sending ______

原文:and other ancient civilisations certainly knew about kites; as early as 1250 BC, the Chinese were using them to deliver messages and dump flaming debris on their foes.

其中,题目和原文有很多意义对应的同义词,如China=>Chinese; over two thousand years ago=>as early as 1250 BC; as well as=>and; sending=>deliver。

无论听说读写,几乎所有的雅思题目都是考同义替换的。所以从第二阶段开始,最好准备一本本子把遇到的同义替换记下来。(像Simon那样记录)。

另外,如果基础不是很好的话,第二阶段一定会感觉四处碰壁。不过你需要适应这些,特别是阅读时,一定会碰到很多不懂的单词,这时候你需要猜它的意思,或者试着跳过它是不是能把句子大意读懂。适应这种情况是很重要的,因为雅思考试中总会遇到不认识的单词。如果不能很好地处理的话,会影响阅读进度。

在做一两套题之后,第二阶段就算完成了。这个阶段最快只需要1周时间。

(未完待续)

MHGJavascriptBridge简介

用途

在iOS开发中,我们经常会碰到这样的需求:在UIWebView中的一个链接,点了之后不是进下一个网页,而是进下一个UIViewController,或者让ObjC代码做点事情。这在资讯类的应用中很常见,比如网易新闻、腾讯新闻,以及我们公司的东方财富通中的资讯。

而在旧的iOS版本中,系统不提供在Javascript直接调用ObjC的方法。只能通过变换location等发起网络请求的方式,使得UIWebViewDelegate中的- (BOOL)webView:shouldStartLoadWithRequest:navigationType:感知到,进而做ObjC的处理。

然而这样做比较不优雅,所有的事情都围绕在URL请求上面,而不是方法调用上面,看上去不优雅。MHGJavascriptBridge的用意便是将URL请求等等封装起来,让Javascript和ObjC代码注重于方法调用本身上来。

Github地址:https://github.com/hikui/MHGJavascriptBridge

使用方法

MHGJavascriptBridge由3个文件组成,MHGJavascriptBridge.h, MHGJavascriptBridge.m, MHGJavascriptBridge.js。将这三个文件加入Xcode工程中。注意,MHGJavascriptBridge.js必须加入到资源文件中(在”Building phases” -> “Copy bundle resources”中出现),Xcode默认会将.js文件加入到Compile Sources里面去,这是错误的。

Objective C设置

首先,我们需要初始化一个bridge,这通常是在一个UIViewController中进行的。这里假设在UIViewController中对bridge进行初始化。在初始化中,需要设定bridge的webView属性:

在MHGJavascriptBridge中,所有能被Javascript调用的Objective C方法将以block的形式呈现。首先我们需要定义一些blocks,然后对每一个block起名。

MHGJavascriptBridge的原理是构造特定的URL,并且用UIWebViewDelegate中的- (BOOL)webView:shouldStartLoadWithRequest:navigationType:拦截这个URL。所以在这个delegate方法中,我们需要加入拦截语句:

其中,interceptRequest:方法会返回一个BOOL,如果拦截成功,则返回YES

这样,Objective C部分就设置完成了。其中需要注意的是,block被调用时,会传入一个dict,这是Javascript部分代码调Objective C代码时所传的参数。

Javascript设置

Javascript部分设置比较简单,最基本的设置是要保证UIWebView中的HTML引入了MHGJavascriptBridge.js

Javascript调用Objective C代码

一旦设置完成之后,Javascript和Objective C就能互相调用了。代码如下:

这时,点击button1时,就能触发Objective C的代码了。MHGJavascriptBridge.callNativeBlock有两个参数,第一个参数是在Objective C中注册的block名字,第二个参数是传给block里面的dict的额外信息。其中第二个参数必须是一个字典(或者说是一个Javascript Object),或者什么都不传。

Objective C调用Javascript代码

方法和上述类似:

其中第一个参数是Javascript函数名。如果你在HTML中定义了function xxx(){}或者var xxx = function(){}的话,就能被调用。第二个参数是一个数组,传的是Javascript函数要用的参数列。

局限性

  • Javascript调用Objective C时,所有的调用都是异步的,暂时无法实现同步调用。
  • Javascript调用Objective C时,所传参数受URL长度限制而限制。

UIViewController解耦尝试

当我们使用UIViewController时,从一个ViewController跳到另外一个ViewController,最简单的代码(不用storyboard的情况下)就是alloc一个实例,然后用navigation controller去push它。比如

而这样一来,这个ViewController必须知道另外一个ViewController的存在,而且需要import它的头文件。这样一来,两个ViewController就紧密耦合了。

在一般的程序里面,这么做没有任何问题。但是我们公司的两个主打产品有一个特殊需求就是:两个产品共用部分界面,而这些共用界面中的一些按钮,点击之后,在不同的程序里需要push出不同的界面(界面初始化需要的参数是一样的,但就是完全不同的界面)。而这两个产品又是由不同的小组去完成的,他们不共享同一个工程。

这时,我们想到的是将这些共用界面提取出来做成framework。那么问题就出现了:我如果在framework里面的view controller新建一个下一级view controller,就需要知道下一级view controller的头文件,下一级view controller又实际存在于每一个主工程里面。这样就出现了循环依赖的情况,这样做出来的framework即使能编译通过也没法维护。

好在ObjC是一个动态语言,实际上我们根本不需要知道一个类的信息就能初始化它。使用的方法就是NSClassFromString()函数,此时你只要知道class名字就行,如果它返回一个Class不为nil,就可以实例化它,并且用KVC注入需要的property。所以稍加改进的代码如下:

虽然这个能解耦,但是每次写那么冗余的代码总归不易维护。所以我尝试把这些东西抽象出来,以配置文件的形式,在不同工程里配置不同的界面。灵感来自于前几年在写Java的时候用的Spring。最后做了一个叫做EMViewControllerManager的东西。

EMControllerManager的配置文件的基本结构如下:

其中Test1Test2被称为view controller名称(昵称)。ClassName指定了view controller的真实类名,而Dependencies可以做一点基础的DI功能。

然后在AppDelegate里面载入配置文件:

而在view controller里面,可以这么来初始化一个view controller对象:

其中Named:是view controller的昵称,withPropertyValues:是初始化之后马上注入的property。

不同的工程只要改配置文件,而不需要改具体的代码,就能达到差异化的效果。

具体用法请阅读EMControllerManager的Github主页

改革不是抓贪官

自习李上台后,一批又一批的贪官接连倒下,其中不乏有位高权重者。大家都拍手叫好,我也认为习李上台之后对于反腐做得比较到位。然而,他们在上台之初所做的最大承诺不是反腐而是改革。在这点上,我看不出有什么进步,倒是在2014年开始,国内的一些方面,尤其是在互联网方面出现了一系列严重的倒退。虽然我们要为反腐叫好,但是反腐不是改革,只是在现有的框架内做自我清理。这样的做法,中国在帝制时期也做过,但这叫改革吗?显然不是。

最近我听到最让人失望的消息,当属广电总局遏止互联网电视的消息(见http://ent.sina.com.cn/v/u/hlw/2014-07-15/17414175454.shtml)。虽然小米盒子上市之初就被广电强力打压,最后导致它把视频网站的应用全部删除。而今天的消息,可以说是完全将这个新行业粉碎了。广电总局如此明目张胆地开倒车,真是让人瞠目结舌。

虽然我不像以前那样把所有社会问题都归结与制度问题,但是我不得不说,在这个点上,这个不是制度的问题是什么问题?中共执政的方针可以归结为“权力寻租”这四个字。所有的法律法规,核心思想无外乎就是“不准动我的利益”,无非不同的法律是针对不同机构的权力寻租而已。所以才有国企垄断,才有国进民退。我们的教科书经常非议清朝早期对明朝中后期资本主义萌芽的打压,说这是中国落后的起点。我建议教育局把这段内容去掉,否则再这么发展下去就要打自己脸了。

互联网电视诞生之初,我认为是一个非常好的开端。中国一直是盗版问题非常严重的国家,而互联网电视,由于接入的都是有资质的视频网站,这些网站买了大量的版权,又推出一些付费服务,我认为是一个正版化的最好开端。而现在这点难得朝着正确方向的萌芽就因为触及到政府部门的权利而被扼杀了。幸好现在广电总局只能管电视机顶盒,要是他们有权管视频网站的话,那么中国会出现一个更加严重的倒退,而我觉得,这一天很可能会到来,当《生活大爆炸》等一些优秀国外电视剧在中国被强制下架的那天起,我认为这个领域已经阴云密布了。

现在的执政者,现在的制度,毫无疑问正在扼杀中国的发展——即便是他们所谓的以经济建设为中心,其实也只不过是保卫他们自身利益罢了。如果这个制度无法改变的话,我可以想象中国未来会发展成什么样子。当西方发达国家都在发展工业的时候,我们坚守农业,扼杀资本主义;而今天西方国家都在发展信息产业的时候,我们坚守工业,扼杀信息产业。历史总是惊人地相似。改革不是抓贪官就好了,今天中国面临的这个问题需要一场真正的深层次的改革才能解决。

对My First Impression of Swift的修改

刚才看了tinyfool的My First Impression of Swift,发现了一些语法错误,所以做一些力所能及的修改。不过因为本人英语水平有限,可能改得不是很好。

Just after Apple announced swift at WWDC 2014, I downloaded Xcode 6 beta 1, but since then I didn’t have time to really learn swift. Today, I watched the WWDC Session videos about swift (Introduction to Swift, Intermediate Swift, and Advanced Swift).

Why Apple makes Swift?

There are so many theories about this. In the WWDC keynote, Craig Federighi said, “Now Objective-C has served us so well for 20 years. We absolutely love it. But we have to ask ourselves the question: what would it be like if we had Objective-C without the baggage of C? “.

Objective-C is a great programming language,  but it is still a very old language with so many baggages.

What is Objective-C without the C?

If we think this question from the angle of programming platform, I think the Objective-C platform includes:

1.Language: Objective-C language.
2.Development tools: Xcode, Interface builder and instrument.
3.Runtime library: Objective-C Runtime.
4.Framework: Cocoa and Cocoa touch.

Apple just changed the language, but still uses the same development tools, runtime library and frameworks. So Swift can change its syntax, but must have so many same  structures with Objective-C underneath. So developers who familiar with Objective-C can learn easily and fast with their old experience.
In the WWDC session I noticed that the speaker said Swift has 3 key design points: safe, modern and power.

So after combing all these things together, I think the purpose of swift is trying to create a safe (strong type), modern (convenient, easy to learn and use) and powerful (doesn’t loss any functionalities from Objective-C) language which doesn’t have any baggages from C, and can be fully supported by Apple’s development infrastructures.

My first impression of the language

1. Swift uses strong type, but the syntax looks just like weak type.

A strong type language is faster and safer than a weak type language, but it also needs more lines of code and looks more complex. On the other hand, a weak type language is convenient, easy to learn and use, but much slower and not very safe. With swift, you can declare the type of variables explicitly like this:

var somestring: String = “this is a string”

You also can declare the type of variables implicitly like this:

var somestring = “this also is a string”

When you don’t explicitly declare the type of variables, the complier will automatically inference it.

2. Swift desn’t use single root class.

Java and Objective-C both use single root class. In Objective-C your classes have to inherit NSObject directly or indirectly. But Swift doesn’t use single root class, your classes can inherit any classes or just never inherit anything.

I think that’s because at the moment when Java and Objective-C are designed, there are so many functionalities that can not be implemented by the complier easily, so just put them to the root class. Now these functionalities can be implemented by the language.

3. You don’t need to use class member variables and properties separately

In Swift, all class member variables are properties, called “stored properties”. And if you want a property that has some setters and getters, it is a computed property.

4. You don’t need to alloc memory for your objects

Yeah!!!!  The complier will do it for you.

5. Structures can have computed properties and methods

But structures still have some differences with classes:

  1. Structures can not inherit other structures.
  2. Structures are passed by value, while Classes are passed by reference.

6. Extensions can extent any classes, named types , or even built-in types

Extensions just like the category of Objective-C, which can be used to extend other classes, but in Swift, extensions can even extend built-in types.

It is convenient but may be dangerous.

7. Optional and Non-Optional type

The optional type gives you the ability to do the safety-checking of variables, making sure they are valid, and it provides a easy and convenient way to do it.

End

Ok, there are more and more syntax and features in the books and the WWDC session videos. But I just want to talk about these, which are easily to learn and may be different to other languages.

吐槽一下公司混乱的API设计

这几天公司准备上线美股和港股的行情和股吧,财富通组已经忙了几个礼拜了,而股吧组则刚刚开始对它进行适配。我本来觉得适配一下应该是很简单的事情,原本碰到港股和全球股票全都跳到特定的股吧,现在只要把这个限制解除就行了。然而新的Web API出来实在是吓了我一跳。

本来后台接口已经很乱了。别的暂且不说,只是所有证券软件最基本的股票代码这个设计就是一塌糊涂。从原理来说,一只股票的完整信息有三个,市场、股票代码、股票名,这是非常明确的。东方财富通的分时K线接口原本有一个不错的实现,就是市场标志+股票代码作为股票的全码,再加股票名。即:

这个类已经包含了所有的必要信息了。

按理说,这个可以作为标准的设计,在所有系统中涉及到股票的,都可以用这两个字段来查找到唯一一只股票。但是我们不同的团队做的不同系统,使用的股票代码的格式是完全不一样的。

股吧的系统,一开始因为只做沪深股市,所以用的股票代码不加市场标记。比如SZ000001变成了000001。而股票代码有冲突的,比如财富通里面SH000001(上证指数)在股吧的接口里当做主题吧处理变成了szzs。

这时候,如果我要对股吧接口返回的股票进行行情查询,我就不得不补全丢失的市场标记。在我们公司还是有统一的一套“码表数据库”的,从这套码表数据库里面可以做到三个信息里面知道两个补全另外一个。但是码表数据库非常的大,查询起来非常耗时,特别是自选股列表的行情请求时一次要转换几十个股票,会使得UI卡死。所以这边还得做异步处理。

而这其实只是噩梦的开始。现在股吧要做美股和港股的行情和股吧。这次改动可能比较急,所以不同的模块给不同的人去做。结果四五个团队做出四五个股票代码的格式,而且规则稀奇古怪。比如帖子列表的查询,沪深不加市场标记,美股加us的前缀,港股加hk的前缀(财富通里面的HK是大写的,这边是小写,财富通里面的美股细分3个市场,这里变成了一个us)。股吧股票搜索对港股和美股的代码标记又不一样了,格式是1234567_01里面的_01代表美股,如果是_02就是港股。单是从股吧的一个接口获得的信息去请求第二个接口,我就要做一次转换。

而这只是四五个不同规则的其中一个。比如F10里面的请求格式是123456701,这里的最后两位01代表上证,如果是02则是深证。资讯接口的格式跟股吧搜索的格式很像,1234567_01,而这里面的01,02又跟F10里面的01,02代表相同的意思,恰好跟股吧搜索接口的意义不一样。更可气的是,股吧搜索接口返回的股吧类型会是错误的,比如明明需求说港股是个股吧,但是接口返回的数据都值为主题吧。我们向后台反映,后台说他们得到的数据就是这样的,竟然叫我们自己手动修正。并且,他们在生成JSON数据的时候从来没有用标准的JSON库,而是自己手拼字符串拼出来的,有时候传过来的JSON根本没法解析的,\n, \t这样的字符从来不转义,说是UTF8编码,里面还夹杂着几个GB18020的字节。我们反映的结果都是“你们自己去改啊”。

对于我们公司的后台,我是已经完全不能忍了。我今天忙了一整天就是在搞各种各样的转换,事情本来可以变的很好,只需要一份统一的股票代码格式。我不知道在一个公司里为什么连这个都做不到,股票代码这个能确定股票唯一性的东西,理应作为primary key来处理才对,即便不是,也应该是一个被索引的统一字段,为什么到了我们公司就乱七八糟了呢。如果我不是经常看见那些后台程序员在公司里走动,我会以为我在跟三四个公司在打交道。

面对这般混乱的局面,我只能望洋兴叹,无能为力了。想想也只有几个月,我就要卷铺盖走人了,也便无所谓了。

NSData转NSString – 如何处理不合法编码问题

在做iOS开发中一个很常见的应用场景就是从服务器接收一段数据然后把它显示出来。但是有时候服务器在数据处理时,比如拼接之类的操作,会出一些问题,造成传过来的数据并不符合指定的编码。(我碰到过的一种情况是,一段宣称用GB18030编码的文字中突然出现了几个用UTF8编码的词语)。浏览器在处理这个问题时,一般就会出现乱码,常用的编程语言在处理这个问题时,也是以乱码显示,而ObjC的NSString则直接返回了一个nil。这一直让我比较头疼,在旧版股吧的开发中曾经碰到因为接口返回的数据里面有一个字节是错的,导致整个接口返回的数据不能用了,当时在国内几个网站上问了别人,得到的都是一些不靠谱的回答。

今天同事又遇到了这个问题,不过他找到了如何让UTF8编码的里面混有错误字节的数据,以容错的方式显示出来而不是nil(见这个Gist),其实原理很简单,一个一个字节读过来,参照UTF8编码的说明,判断是不是合法字节,如果不是,用“?”来代替。根据这段代码,我改了一个用于GB18030编码的混有不合法字节的数据的容错转换。

Gist地址