换了几个博客的插件

刚刚换了几个博客的插件,感觉还算可以。

首先启用了Markdown on Save Improved这个插件,以便于用markdown来写博客。主要是原来的可视化编辑器在写作的时候总是出一些奇怪的问题,然后导致产生的HTML很奇怪。再者因为在github上经常用markdown些README之类的东西,这边就好直接贴过来了。

然后代码高亮插件换用了一个Crayon Syntax Highlighter的插件,这个插件看上去貌似很强大的样子,设置选项一整页,还没研究透过。不过貌似比以前那个好。

暂时就这样弄着吧,不知道有什么问题,到时候再说吧。

今天雅思考试遇到的问题

第二次雅思考似乎结果不会比第一次好,特别是作文,估计还是5.5左右。

考试中遇到了一些问题,第一个问题是阅读的时间分配的问题。这次还是跟上次一样用了19分钟得分的时间分配(另外一分钟写答案),但是这个办法似乎不是特别好。这次加入了平行阅读法,所以前两篇的阅读都非常快,一遍读好之后,还剩下5分钟左右的时间,但是都有一道题没有做。但是我并没有将这时间的空余累积到下一篇阅读上去,而是将这些时间花掉去寻找那一道没有找到的答案。但是在第三篇上,19分钟就不够了,一方面主要是这次最后一篇的题目一大半是乱序题,没法平行阅读,另外一个问题是,做最后一篇阅读的时候,老师就开始倒计时了,所以会开始心慌,以至于没法集中精神理解文章,本来打算是最后一分钟抄答案的,但是老师说5 minutes left的时候,我认为等到最后一分钟写答案的风险太大,所以就开始写答案了。于是后面5分钟等于是没心思做题,有6道题是空的,全都蒙D了。所以以后不应该将最后的5分钟考虑在做题时间内。

写作的话,这次考了道地图题。当然这在我的预料范围之内,因为我关注了今年所有的考题,想想大概这次是要考地图题了,所以考前着重复习了一下地图题,还是有点帮助的。不过在大的压力下写文章真的比较难,有些词组什么的,平时用得好好的,到了考试的时候就会记岔,或者写得对的词组,会怀疑是不是写错了,然后改改就改错了,这个问题主要表现在介词的使用上的,比如这次说花园通过一条footpath和教学楼相连。相连物体之间的相连准确的用应该是be connected to,但是我改改就变成with了(当然也有这个词组,但是这个是侧重精神上的)。

大作文上面,在考试压力下我估算了一下只能发挥到60%左右。这次写大作文的策略和上次不同,降低了用词的复杂度和句子的复杂度,提高了语法准确度。其实是因为复杂的词语我一紧张就不敢用,有时候写了一个词,想想没有把握,就换一个稍微确定一点的简单词。不过还是有很多错误,最严重的两个是把medical care写成了medicalcare,然后把medical conditions和health problems记混了,写成了health conditions了。另外,行文上面也出了重大的纰漏。第二段论证的时候,我本来想论证的是,城市里面工厂比较集中,造成的污染会有损人的健康。但是写的时候,论证了太多为什么城市会比农村污染严重,但是忘记把最后的结论引到有损人的健康上面去(这次的题目是“大城市的生活是否对人的健康不利”)。所以这段论证是偏题的。这些问题实际上在考试结束后,我在厕所就想到了。但是在考场上就没想到这些问题,这也是一直困扰我的,在我高中的时候,也经常发现,一些题目在考试的时候没有思路,但是一旦走出考场,甚至是刚跨出一步,就想到了解题办法。这次因为task1用的时间有点超时,所以task2没有列提纲。如果用顾家北的ARE方法列提纲的话,大概是可以避免论证结构的问题的。

总之,马上又要给雅思网站充钱去了。明天还要考口试,这次口试没怎么复习过,不知道能考多少。。。

慎用method swizzling

今天在调试股吧的时候,发现UIImagePickerController右边的BarButtonItem向右边偏移了10个像素。一开始我以为是因为我的UINavigationController的一个category写得有问题导致的,然而我把所有的自定义方法全部弄掉之后,问题还没解决。然后我用了一招更加极端的方法,在applicationDidFinishLoad的地方,把代码全部删掉,把引用的头文件全部删掉,用最原始的UINavigationController和一个空的UIViewController做实验,结果还是偏移了10个像素。这让我百思不得其解,感觉像见鬼了一样。然后我把这个问题交给同事去调,他调了两个小时也崩溃了。

于是我去stackoverflow问了一下。但是大家似乎对这个问题的原因也无法解释,因为我用的是最最基础的代码。一个回答者在下面留言说,最好去查查那个button的大小。虽然UIBarButton是没有frame的,但是我设断点的时候突然发现self.navigationItem.rightButtonItem不是一个Button,而是一个spacing,而且width是-11。但是我奇怪我什么都没做过,为什么会多出来一个spacing,而且宽度是个负数。后来我想起天天基金组前几天在跟财富通组讨论怎么解决iOS7上NavigationBarButtonItem偏移的问题,财富通组的同事说,只要引他们一个头文件就解决了。我想大概是这个头文件引起的问题,它解决了自定义控件向中间偏移的问题,却导致了原生控件向两边偏移的问题。但奇怪的是,我根本没有引用它的头文件,也没调用它的方法,怎么会在我这个地方生效呢?

后来我查了一下那个category,这个是直接引用别人的开源代码。看了代码我就知道是怎么回事了。

这串代码坑爹的地方在于,它把自己的方法和系统的setRightBarButton置换了一下(method swizzling)。于是我明明调用的是系统的方法,而实际上却是调用了它的方法。

更加坑爹的代码在于,method swizzling是在这个类+ load方法里面进行的。只要这个category最后编译进我的代码里,它就会起作用,无论我是不是引入它的头文件。而恰恰财富通组把这个category放在了给我们的framework里面,我们的工程连接了他们的framework,然后这个方法就生效了。

所以说,method swizzling要慎用。虽然objc的动态特性很酷,可以用一些tricks快速解决问题而不需要做大量修改,但是在大型工程里面,特别是涉及到framework的时候,很容易引起side effects。我是iOS组里唯一一个有财富通SVN权限和股吧权限的人,所以我能够发现问题。如果把问题交给别的同事,估计永远就不知道是怎么回事了。

iOS下编译leveldb的总结

之前看到@糖炒小虾_txx 关于如何将leveldb编译到iOS中的文章。自己也试了试,不过还是碰到很多麻烦。

Xcode在build settings里面可以设置使用哪个C++标准库。有两个可以选择,libc++和libstdc++。其中libc++写着是with c++11 support。不过选了libc++之后,deployment target为4.3,就会编译错误,提示libc++只能用于iOS 5.0之后的工程。

所以如果有公司还需要支持iOS4.3的,就必须使用libstdc++。一旦选择了标准库,就需要在任何编译设置里统一它,包括.a文件的编译。

所以我的编译过程如下:

首先,进入leveldb,修改它的makefile,是它支持armv7s和arm64架构:

找到 ifeq ($(PLATFORM), IOS),将下面.cc.o和.c.o中的 -arch armv6去掉,增加 -arch armv7s和 -arch armv64。保留原有的-arch armv7。

然后编译,编译命令改为 CXXFLAGS=-stdlib=libstdc++ make PLATFORM=IOS

编译完成之后,将.a拖到工程里,将leveldb中的include中的头文件拖到工程里。

然后进行Xcode工程设置,在build settings中,将C++ Standard Library改为libstdc++,并且在build phases里面增加连接libstdc++.dylib。这样就行了。

另外,老谭的文章里的demo,里面的AppDelegate不需要把.m改成.mm,只要link了libstdc++.dylib。

iOS7中UILabel高度调整注意事项

我的“记词助手”在升级到iOS7之后,一直出现UILabel错位的问题:

ios7label

我的label是用- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode 来计算的,但是似乎计算得不是很正确。

实际上UILabel的frame是红框的大小,但是在宽度不够的时候,不知道触发了什么bug,这个Label在绘制的时候文字会被挤下去。这个问题到底是什么,我也没搞清楚,但是增加UILabel的宽度后,就会显示正常。

在跟了一遍代码后发现,在iOS7下面,- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode这个函数返回的值是带小数的,设给UILabel的frame之后,UILabel的宽度就小于文字绘制需要的宽度了。就会造成上面的问题。

在官方文档里可以看到,- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode这个函数在iOS7里面已经deprecated了,取而代之的是boundingRectWithSize:options:attributes:context:这个函数。实际上这两个函数在iOS7里面的计算结果是一致的,都是带小数的。boundingRectWithSize:options:attributes:context:的文档中可以看到这么一句话:

This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function.

也就是说,计算出的size需要用ceil函数取整。

在iOS7中,正确地计算UILabel可能占有的高度需要如下的步骤:

iOS 6(及以下版本)的Navigation手势pop

iOS 7 里面的UINavigationController里面新增了一个interactiveGestureRecognizer。如果不自定义leftBarButton的话,它会自动生效,如果自定义leftBarButton的话,就要麻烦一点,自己弄一个delegate,不过需要很小心,因为我已经碰到了好几个bug related to interactiveGestureRecognizer。比如多个NavigationController一起使用的话会出现界面死锁,push没完成的适合划一下,会导致navigation bar错乱等等。

Anyway,现在讲一下怎么在iOS6上面实现这个效果。原始代码我在https://gist.github.com/siqin/7579845 找到的,不过这串代码有点问题,我改了改。

原理是障眼法——这个方法在很多控件里面都用到了——自定义UINavigationController,在它的view下方插一个UIImageView。在UINavigationController push的时候,对当前屏幕生成一个snapshot,保存到自己设定的snapshot栈里面去。那个UIImageView里面显示栈顶图片。UINavigationController本身的View增加一个pan gesture recogniser。在手指滑动的时候,把UINavigationController.view进行位移,露出后面的UIImageView,这样就出现滑动效果了。等滑到底或者滑到预设的pop阈值后松手时,在动画完成后,马上执行对navigationController.view的frame的重设,并且pop without animation。这一系列的障眼法看上去就跟真的似的。

完整代码: https://gist.github.com/hikui/8160076

澳洲留学移民失败情况得失评估

如果申请PR失败,情况的总结。
得:

  • Master学位
  • 增加阅历
  • 英语能力提高
  • 回国可能可以进外企
  • 2年的新鲜空气和安全的食品、水
失:
  • 50~60w的资产蒸发,回国后暂时无法买车
  • 2~3年的工作经验丢失
  • 离家
  • 2~3年的辛苦(学业和生活)
比别人的优势:
  • 在中国没有住房压力

iOS 7 下UITextView的bug一枚

这个问题是早上蚊子发给我的。我说iOS7发布之后蚊子找出了一大堆系统的bug,不去苹果可惜了。

描述是这样的,往一个UITextView中不断地输入文字,不断地换行,换到最底下的时候,光标就跑到TextView的frame外面去了。因为没有什么特殊的操作,可以认为是iOS7的bug。

通过stackoverflow找到了暂时的解决办法(只能说是一种很复杂的hack)

原帖:http://stackoverflow.com/questions/18966675/uitextview-in-ios7-clips-the-last-line-of-text-string

啊,最近又在准备雅思了

实际上去年这个时候我有准备考雅思(目标是移民)。当时背了小半本词汇书。当时就在思考怎么样背单词可以记得持久一些。以前有个什么电子词典有个“艾宾浩斯记忆法”,去年在豆瓣上面也看到有人说这个东西,我本人又是非常相信心理学的,所以就琢磨尝试这种方法来背单词。不过抱着词汇书背单词不是特别方便,而且词汇书没有真人发音,对听力什么可能不是特别有利,所以我寻求用软件来背单词。找来找去,发现市面上的软件都没有引入这种记忆法背单词,唯一用过不错的就是“拓词”了,但是拓词非常依赖于网络,而且它本身服务器就慢的要死,那时候从来没能够顺利地背一次单词。于是作为iOS程序员,我就自己做一个。于是就有了《记词助手》这玩意儿,里面引进了艾宾浩斯记忆法,然后又通过金山词霸的API拿到了单词的发音(虽然金山词霸很多的单词发音实际上是错的)。

不过我其实对英语兴趣不大,对编程兴趣很大,所以开始做记词助手之后,就慢慢地把精力都投入到软件开发上面去了。本来这玩意儿就是为我一个人设计的,后来想想,要是把他发布到Appstore上去不是更好。于是开始着手对软件进行重新设计,琢磨美工什么的。后来因为金山词霸服务器一直down掉,我还在SAE上面做了个缓存服务器。软件倒是很成功,但是对雅思的热情就慢慢消退了。后来自己做了几套真题,发现正确率很低,然后对写作和口语的题目完全没想法。觉得长路漫漫看不到头,慢慢也就放弃了。

今年7月份的时候,到日本去了一趟,充分感受到了中国跟发达国家的差距,而且今年以来,GFW愈发猖狂,而习李政府对互联网的限制愈加厉害,所以移民的念头又出来了。本来是想到日本去工作的,所以学了新标日初级的一半多一点,后来很多人反对,而且那些有赴日经验的朋友都觉得日本的工作比较辛苦,所以放弃了这条路。另外,我大量好友都去国外留学了,我一打开Qzone或者Facebook,总是能看到他们很充实的生活,还不乏有朋友开始着手移民了,我便觉得羡慕又不服气。心想再冲一次,先弄一个留学的机会吧。其实我临近毕业的时候就很后悔大学成绩不好,这个GPA太低了,申请不了什么大学,现在我也不知道有什么学校可以申请的。不过常年挂科的聪聪最近也去英国留学了,学校的录取信里面还说“Your academic backgroud is so strong.”顿时给我莫大的信心。。。

从再拿起雅思的书籍到现在,大概是三个礼拜吧。当然很久没背单词,以前背的忘得很厉害,好在之前引入了艾宾浩斯记忆法,有很多单词回想一下还是能想起来的。不过这次我放弃自己自学成才了,花了点钱买了沪江的一套课程。怎么说呢,那套课程不同的部分是不同的老师上的,水准有点参差不齐,不过在考试技巧上面还是给我很大帮助的。像阅读什么的,因为用了一些应试技巧,正确率有所提高。听力的话,按照新东方的彭新松老师说的训练方法训练,还是有一定提高的。顺便为了练习听力,我自己又做了一个类似复读机的软件。当然这次花了几个小时就做好了,只满足自己需求,不再重蹈覆辙了。

写作和口语还是我巨大的缺陷。最近买了《十天突破》系列的书看,感觉还是蛮有用的,我觉得我缺乏的不仅是词汇的精准度和句子的多样性,更缺乏的是行文思路。虽然我们的教育经常会说马克思主义哲学的辩证思想,但是我们从小到大的教育核心还是“学校好、祖国好、共产党好”,完全是缺乏真正的辩证思想的,雅思的写作是需要比较强的辩证思想和逻辑的。我只能看《十天》系列里面的思路分析找点灵感了,虽然这是很应试的,但是真的是没办法。

顺便说一下,有个叫lang-8.com的网站,会有native speaker帮你改文章的,我之前学日语的时候,经常在那里问日本人问题。看起来学英文也是挺好的。但是因为学英文的人特别多,所以L点数不够的话,别人看不到你的文章的,只能在必要的时候花$7一个月买个会员。

我预计是明年的1月或者2月去考试。考试准备金都准备完了,打算最多花6000在这上面吧,现在都放在活期宝里面收利息。