加速 Xcode 文档搜索

Xcode 的文档搜索速度实在是不给力,因为 Xcode 是实时的索引所有 Doc Sets 来查找。解决方法:

  1. 更换 SSD,一劳永逸,更能带来编译速度的极大提升。
  2. 第三方文档搜索工具,比如 Ingredients、AppKiDo,缺点是没法和 Xcode 完美结合,比如 Option+Click 快速查找。
  3. 修改 Find Options 来减少一些索引,只做 iOS 就没必要选 Mac 的 Doc Sets. 另外 Match Type 选 Prefix 也会快很多。可以参考下面这个 Find Options 设置。

感谢 @jjgod 分享的小技巧。

[self review:2011];

2011

2011 年度个人总结。

工作

一整年的 iOS 开发,相对于去年入门时 Rookie 最大的成长是教训,经验和信心。

有那么一次,客户端测试时候频繁崩溃却毫无头绪,那个上火啊,甚至晚上做梦都在 Debug,有一晚上还真在梦中解决了一个问题。没有教训就没有记忆,这也是为啥后来我偏执的强迫症般的抓内存泄漏找潜在崩溃。经验就是由这么一堆教训堆积出来的,一次次的总结然后下一次避免,这不就是成长么?

如果一年前跟我说我们的竞争对手如此之多,甚至还有上市公司,我绝对没有信心去继续这个项目。不是说我太消极,而是对于这个市场的一无所知。不是都说恐惧源自于无知么。这一年下来,随着技术上的完善,产品的坚持,市场的更加熟悉,我们现在是信心满满的面对每个竞争对手。

本来四季度时想跟进学一下服务端开发,阴差阳错的给错过了,算是今年的一个遗憾吧。来年一定要跟进。

没来得及搞服务端,腾出时间整理了内部 iOS 编码规范和通用库,这个过程正好把前面一年的开发梳理了一下,收获很大。以后要坚持定期的回头梳理。

产品细节上这一年有不少进步,但是整体把控还不行,产品这一块是个长期,坚持。

生活

圣诞节时跟远大萌感慨说老了,平安夜都没有出去 High。其实是平静了,我们会周末窝家里做饭,给爸妈打电话唠叨,我觉得挺好。

今年最高兴的就是在家里需要的时候我和妞妞有能力帮一把,不让爸妈那么累,那么苦,尽管力量还很小。我一直认为家是生活的中心,如果连家里人的生活都无力改善,那你改变世界的理想都是扯淡。

大年初六我和妞妞订婚了。这一年我们有生气,有争吵,但我们比以往更爱对方。两个人在一起不容易,很感谢妞妞对我的理解、支持和包容。

这一年控制着没有继续长胖,不过也没有瘦,身体没有什么大毛病,但明显身体素质比以前差了不少,得加强一下锻炼,向罗胖子学习。


2012

工作

  1. 加强 iOS 开发,尤其是新技术的学习和整理,比如 ARC。
  2. 尝试 iPad 开发,这可不是简单的界面放大,整个用户交互都需要重新学习理解。
  3. 服务端开发,至少是应用级别要跟上,已经落户一步,不能拖太久。
  4. 继续加强产品能力,尤其是整体把握。

生活

  1. 完婚。
  2. 给家里更多的帮助,让爸妈轻松一点。
  3. 希望今年能有一次旅游,厦门?

最后来张截图

2011

[MFMailComposeViewController canSendMail] issue

发现 MFMailComposeViewController 一个挺奇怪的问题,代码一:

if ([MFMailComposeViewController canSendMail]) {
    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    [mailComposer setSubject:@"Mail"];
    //...
    [self presentModalViewController:mailComposer animated:YES];
    [mailComposer release];
}

如果设备没有设置 Mail,那么该操作不会有任何反应。不会有弹窗出现。

代码二:

MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
if (![MFMailComposeViewController canSendMail]) {
    return;
}
//...

代码二这种情况下如果没有设置 Mail,会有系统弹窗提示 “无邮件账户”。

How To Make Your iPhone’s Home Button More Responsive

RegexKitLite Error: Undefined symbols for architecture i386

RegexKitLite 编译错误:

Undefined symbols for architecture i386:
  "_uregex_start", referenced from:
      _rkl_performRegexOp in RegexKitLite.o
      _rkl_search in RegexKitLite.o
      _rkl_findRanges in RegexKitLite.o

ld: symbol(s) not found for architecture i386

解决办法:

In project Build Setting search “Other Linker Flags” and add “-licucore”.

编译设置搜索 “Other Linker Flags” 添加 “-licucore” 字段

How to Google it

DLog

DLog is almost a drop-in replacement for NSLog. via The Evolution of a Replacement for NSLog

// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
#	define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#	define DLog(...)
#endif

入手 Alfred

QuickSilver 真心不错,尤其是配上插件功能后就是神器。但是 QS 对中文支持的不给力,crash 增多,加上 Alfred 添加了插件功能后越来越强大,毅然转向 Alfred。

目前对自定义搜索功能最为喜欢,设置 so 到 Stack Overflow,git 搜 Github,方便不少。

留记一篇,用一段时间后再整理 Alfred 使用,希望这钱没有乱花。

Picky to Octopress

不敢保证转换过程万无一失,请注意备份

前提条件:之前大多数文章已经是用 Markdown 格式。

  1. 仿照 AtomFeedHandler 新增 RSSOutHandler
class RSSOutHandler(webapp.RequestHandler):
  def get(self):
    site_domain = Datum.get('site_domain')
    site_name = Datum.get('site_name')
    site_author = Datum.get('site_author')
    site_slogan = Datum.get('site_slogan')
    site_analytics = Datum.get('site_analytics')
    site_updated = Datum.get('site_updated')
    if site_updated is None:
      site_updated = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
    feed_url = Datum.get('feed_url')
    if feed_url is None:
      feed_url = '/index.xml'
    else:
      if len(feed_url) == 0:
        feed_url = '/index.xml'

    template_values = {
      'site_domain' : site_domain,
      'site_name' : site_name,
      'site_author' : site_author,
      'site_slogan' : site_slogan,
      'feed_url' : feed_url
    }

    articles = db.GqlQuery("SELECT * FROM Article WHERE is_page = FALSE ORDER BY created DESC")
    template_values['articles'] = articles
    template_values['articles_total'] = articles.count()
    template_values['site_updated'] = site_updated
    path = os.path.join(os.path.dirname(__file__), 'tpl', 'shared', 'out.xml')
    output = template.render(path, template_values)
    self.response.headers['Content-type'] = 'text/xml; charset=UTF-8'
    self.response.out.write(output)
  1. main.py - main() 添加
('/out.xml', RSSOutHandler),
  1. 仿照 index.xml 添加 out.xml 模版
  2. 参考 Import XML of Wordpress to Octopress 造一个 Picky2Octopress
# -*- coding: utf-8 -*-
require 'fileutils'
require 'date'
require 'yaml'
require 'uri'
require 'rexml/document'
include REXML

doc = Document.new File.new(ARGV[0])

FileUtils.mkdir_p "_posts"

doc.elements.each("feed/entry") do |e|
    post = e.elements
    slug = post['slug'].text
    date = DateTime.parse(post['published'].text)
    name = "%02d-%02d-%02d-%s.markdown" % [date.year, date.month, date.day, slug]

    content = post['content'].text
    puts content

    content = content.gsub(/<code>(.*?)<\/code>/, '`\1`')

    ## 追加
    content = content.gsub(/<pre lang="([^"]*)">(.*?)<\/pre>/m, '<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>lang:\1 </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span></pre></td><td class="code"><pre><code class=''><span class="line">\2</span></code></pre></td></tr></table></div></figure></notextile></div>')

    (1..3).each do |i|
    content = content.gsub(/<h#{i}>([^<]*)<\/h#{i}>/, ('#'*i) + ' \1')
    end

    File.open("_posts/#{name}", "w") do |f|
    f.puts "---"
    #f.puts data
    f.puts "layout: post"
    f.puts "comment: true"
    f.puts "title: \"#{post['title'].text}\""
    f.puts "---"
    f.puts content
    end
end

如果内容较少 (<100),可以直接手动修改 index.xml 格式然后进行转换。

最后,不敢保证转换过程万无一失,请注意备份

New Blog again

最近 Octopress 火热,比如 Why Octopress?。忍不住手痒也来一个,花了半天时间把两年前的 Wordpress 和去年到现在的 Picky 都转移到 Octopress,目前表现良好,情绪稳定。

新的开始会更关注移动应用,毕竟是做这方面的,技术方面希望能输出一些代码吧。当然,生活碎碎念也肯定少不了。