Project-Specific Vim Configuration

Usually, we have our own vim configuration in the file ~/.vimrc
What if we want one for our project?
For example, we are working on certain project which needs to read in a tags file.
Well, here is a possible solution.

You put a line at then end of your ~/.vimrc file

source ./.project.vim

Then for each project, put your project-specific stuff in a the file “.project.vim”.

If you don’t want the error message says vim cannot find the file “.project.vim”,
wrap the line above with an if statement:

if filereadable("./.project.vim")
    source ./.project.vim
endif

:]

tail -n

Quite useful trick, when you want to get rid of the first certain lines of the output/file.

$tail -n +2

tail prints out the result starts from the 2nd line.

When you use the “find” command to generate a file list under certain folder, this is quite easy to eliminate the folder path at the beginning of the output.

Learned this from SO How can I remove the first line of a text file using bash/sed script?

一个初始化结构体的用法

近来敲代码的时候,由于技术含量不高,所以就格外注重“代码好不好看”这个问题。
在无聊的Coding中看到一个没有用过的语法还是小有惊喜的。
记在这里:

主要是这段

    DemoStruct demos[4] = {
        {.val = 1, .point = &a},
        {.val = 2},        
        {.point = &b},
        {.val = 3, .point = &c},
    };

对于结构复杂一点的struct,这么写是不是挺好看的 :]

[Tip]iOS上的OpenGLES无显示问题

最近的项目用到了OpenGLES。
两个很容易出问题的地方,容易造成很难找到的Bug。

一个是EAGLLayer的大小,必须是32的倍数。否则用OpenGL画出来的东西,统统不会被显示。
Apple的文档:In iOS 4.2 and later, the performance of Core Animation rotations of renderbuffers have been significantly improved, and are now the preferred way to rotate content between landscape and portrait mode. For best performance, ensure the renderbuffer’s height and width are each a multiple of 32 pixels.
Apple Document

另一个是纹理的大小,必须是2的次方。
也就是说,如果使用一张图片来生成纹理,那么图片的长和宽的长度都必须是2的次方,否则加载纹理失败。

PlistBuddy

最近由于工作需要,发现了这么一个小工具。

PlistBuddy是一个Mac里的命令行下读写plist文件的工具。
位于/usr/libexec/下,由于这个路径不在默认的PATH里,需要通过绝对路径/usr/libexec/PlistBuddy引用。

使用起来很简单,功能也很丰富。

举几个例子:
A.plist内容如下

B.plist内容如下

通过命令打印出plist的内容

/usr/libexec/PlistBuddy -c "print" A.plist

得到结果

Dict {
    KeyA = ValueA
    KeyC = ValueC
    KeyB = ValueB
}

通过命令得到一个entry的值

$ /usr/libexec/PlistBuddy -c "print KeyA" A.plist 

输出

ValueA

这些都是简单的功能。PlistBuddy最好用的一个功能应该算是merge了。
merge命令可以合并两个plist文件,一个认为是源文件,一个作为目标文件。
比如命令

/usr/libexec/PlistBuddy -c "merge A.plist" B.plist

PlistBuddy把A.plist中的条目逐个插入到B.plist中,如果B.plist中已经有相同Key的条目就跳过此条目。
如上面的命令,得到结果

$ /usr/libexec/PlistBuddy -c "merge A.plist" B.plist 
Duplicate Entry Was Skipped: KeyA
$ /usr/libexec/PlistBuddy -c "print" B.plist 
Dict {
    KeyC = ValueC
    KeyD = ValueD
    KeyA = ValueNewA
    KeyB = ValueB
}

得到新的B.plist如下

更多命令可以通过man或者-h来查看

$/usr/libexec/PlistBuddy -h
man PlistBuddy

[技巧]从地址得到symbol

做iOS开发的时候,常常会遇到crash,需要分析call stack的时候。
有时候App在别人的设备崩溃,把crash report在自己的机器上打开,Xcode没有自动的进行符号化。
这时候就需要自己去把地址解析成符号。
大前提是,必须有相同版本App对应的.dSYM文件。
这时候打开Terminal,进入到build/Debug-iphoneos
使用命令:
$atos -arch armv7 -o XXX.app/XXX 0xabcdef
XXX是你的App名字,用需要解析的地址替换上面的0xabcdef
armv7是编译App时所用的Architecture,也可能是armv6,如果在simulator上的App,这个位置应该用i386

参考:stackoverflow