• 把 Blog 从 Jekyll 迁移到 Hexo

    花了几个小时把 Blog 平台引擎从 Jekyll 迁移到了 Hexo 上,换成 Hexo 的主要原因是 Jekyll 用起来总是出问题,比如提交到 GitHub 上生成的静态页速度很慢,以及一些莫名其妙的错误,和对 MarkDown 支持的比较差等等。

    找了一圈综合对比,最终发现 Hexo 能完全满足我的需求,功能强大,插件和主题比较丰富,支持多种平台一键部署,比如 GitHub Pages, Heroku, AS3, 甚至直接 rsync, 有了之前的教训,我果断选择了通过 rsync 放在了自己闲置的一台 Digital Ocean 的 VPS 上。更吸引我的是 Hexo 是基于 NodeJS 的,我对 Node 和 EJS 模版引擎比较熟悉,有无法满足的需求时,就直接顺手添加上了,比如这次分页的方式,对友言的评论的支持,以及 UI 上的一些改动等等。

  • Swift 之类型的协变与逆变

    今天科比正式退役,在未来的日子里,也许还会有像科比一样有天赋又努力的球员出现,但我们却不再有青春去追随了。
    — 沃茨・其索特

    1 什么是协变与逆变

    刚开始看到协变 (Covariance) 和逆变 (Contravariance) 的时候,差点晕菜,反复查了一些资料,才稍有些自己的体会,难免有理解不对的地方,欢迎指出 :]

    在计算机科学和类型的领域内来看,变化 (variance) 这个词指的是两个类型之间的关系是如何影响从它们衍生出的两种复杂类型之间的关系的。相对于原始类型,这两种复杂类型之间的关系只能是不变 (invariance),协变 (covariance) 和逆变 (contravariance) 之中的某一种。

    这段比较拗口,我们一步一步拆解,既然上面提到了两个类型之间的关系,在主流的编程观念里,类型之间的关系中通常会包含子类型 (subtype) 和 父类型 (supertype)。

    首先假设 Cat 是 Animal 的子类,就是说 Cat 是 Animal 的 subtype,可以看作上面的 “原始类型”,然后有两个衍生出来的 List<Cat>List<Animal>类型,就是从 Cat 和 Animal 衍生出来的两种复杂类型。

    那么我们就可以这么来解释协变和逆变了:

    • 协变: 如果说 List<Cat> 也是 List<Animal>的 subtype,也就是衍生类型的关系和原来类型( Cat 与 Animal)的关系是一致的,那我们就说 List 是和它的原来类型协变(共同变化)的。
    • 逆变:如果说List<Cat>List<Animal>supertype,也就是衍生类型的关系和原来类型( Cat 与 Animal)的关系是相反的,那我们就说 List 是和它的原来类型逆变(反变)的。
    • 不变:如果说List<Cat> 既不是 List<Animal>的 subtype,也不是 supertype,也就是说没有关系,则说是不变的。
  • 动态加载 FLEX 的越狱插件 - FLEXLoader

    介绍

    FLEXLoader 是一个我在上周末写的一个可以动态加载 FLEX 的开源越狱插件,它以加载动态库的方式注入到系统 App 和用户的 App 中 (欢迎使用 star, fork, clone 等一切方法蹂躏我~~)。FLEX 全称是” Flipboard Explorer”,是 Flipboard 团队开发一组调试和探测 App 的开源工具,功能非常强大,比如查看和修改 View 的层级结构,查看和修改堆内存中的对象信息等等,更多 FLEX 介绍和使用信息参考这里

    FLEXLoader 参考了RevealLoader,顾名思义,它是一个加载 Reveal 动态库的越狱插件,是一款非常方便的插件,如果你经常用 Reveal 来查看和调试,一定不要错过。我把它的源码做了一些修改,把 Reveal 的动态库改成了 FLEX 的动态库,因为 FLEX 官方只提供了源代码,所以我参考了 Tony 的这篇文章编译了一个动态库,如有有兴趣,也可以直接用我已经构建好的 Xcode 工程 FLEXDynamicLibProject来编译。

    安装 FLEXLoader

    有下面两种安装方式:

    1. 在 Cydia 中搜索Flipboard FLEX loader并安装 (BigBoss 源)
    2. 如果安装有越狱的开发环境,比如 theos,可以自己来编译安装,配好环境变量后,make package install一下 (也可以自己编译 FLEX 的动态库替换掉工程中的FLEXDylib.dylib).
  • Swift 之 @auto_closure

    用 C 实现一个assert(),通常是这么做的: 12345678#ifdef NDEBUG#define assert(e) ((void)0)#else#define assert(e) \ ((void) ((e) ? ((void)0) : __assert (#e, __FILE__, __LINE__)))#define __assert(e, file, line)...
  • Swift 之 ? 和 !

    Swift 语言使用 var 定义变量,但和别的语言不同,Swift 里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错: 12345var stringValue : String//error: variable 'stringValue' used before being initialized//let ...
  • Run loop 和 Thread

    Run-loop 是什么?首先考虑这个问题:你的 Cocoa 程序大部分的时间什么都没做,更具体点,是在等待输入。然而,一旦你触摸屏幕,相应的事件被触发,就可能会执行你的一段事件处理代码。同理,socket 中返回一些数据,或者计时器触发等也是一样的情况。而且更重要的是,一旦触发事件的代码执行完,程序就会回到等待状态。在很多情况下,代码执行的时间要远小于程序等待输入的时间。 我认为 run ...
  • 使用 Theos 做一个简单的 Mobile Substrate Tweak

    Mobile Substrate 和 TheosMobile Substrate是 Cydia 的作者 Jay Freeman (@saurik) 的另外一个牛 X 的作品,也叫 Cydia Substrate, 它的主要功能是 hook 某个 App,修改代码比如替换其中方法的实现,Cydia 上的 tweak 都是基于 Mobile Substrate 实现的。目前支持 iOS 和 An...
  • Background Fetch

    Background Fetch 是 iOS7 带来的非常 Cool 的新特性,开启 Background Fetch 的 App 会被系统在合适的时机执行后台任务的代码。比如这个场景:你每天晚上 10 点会通过自己的 RSS 阅读器 App 来阅读,系统可能会在 10 点之前执行 App 中设定的下载 RSS 最新资源的任务,当你打开 RSS 阅读器 App 的时候就显示出最新的内容。实现...
  • 轻量级 KVO [译]

    在这篇文章中,我会实现一个自己用的简单 KVO 类,我认为 KVO 非常棒,然而对于我大部分的使用场景来说,有这两个问题: 我不喜欢在observeValueForKeyPath:ofObject:change:context:方法里通过 keyPath 值来做调度,当 Observe 比较多的对象时,会使得代码变得杂乱和迷惑。 必须手动的来注册和删除一个观察者,如果能自动做就好了。 ...
  • AppCode JVM 参数优化

    昨晚花了 2 个小时熟悉了一下 AppCode, 和 IDEA 系列给人的感觉一样:很卡很强大。就打算优化一下 JVM 的设置,AppCode 的 JVM 参数配置文件在 /Applications/AppCode EAP.app/bin/idea.vmoptions 使用默认的参数,用一段 AppCode,观察了一下 GC 的情况: ➜ ~ jstat -gcutil 50991 1s...