XCode3 User Scripts

本文讲的是XCode 3的,XCode 4中移除了User Scripts的功能,可以参看这里:http://blog.carbonfive.com/2011/03/10/code-formatting-in-xcode-4/

使用XCode编程,有时候想快速的格式化一段文本,或者转换一段文本,比如将一段字符字母全部变成大写或者全部变成小写,这个时候你可以使用XCode3 中的User Scripts这个功能,其实就是使用脚本完成转换的工作。
这里就以将选中文本大写来举例。
在XCode 3的菜单中选择Edit User Scripts

在打开的界面的Text这里增加一个Shell脚本,并使用tr命令做转换。脚本和设置如图。

最后为这个脚本绑定一个快捷键。
然后就可以到编辑器中进行测试了。

扩展阅读: http://orangejuiceliberationfront.com/helpful-xcode-user-scripts/

SQLite Autoincrement

在SQLite3的表中每一行记录都有一个ROWID的隐藏字段,
你在sql中可以通过ROWID,_ROWID_, OID这三个名称来访问这个隐藏字段,他们都是等价的。
但是你可以定义一个显式的字段作为这个隐藏字段的别名。
比如你创建表的时候定义一个名为uid的字段,字段类型为 INTEGER PRIMARY KEY ,那么这个字段就为这个隐藏字段的别名了。
你插入记录的时候可以显式的为uid提供一个值,但是也可以不提供,或者插入一个NULL,这个时候SQLite3的引擎会自动算出这个字段的值了。
默认的ROWID的select算法是将表中已经存在的最大的ROWID的值加1,如果到表中最大的ROWID已经达了64位整数的最大值,那么系统随机的取值,然后看对应的id是否在用,如果在用则放弃,继续找,经过一定次数的尝试,如果还没有找到,则报错。

但是如果你将字段的类型定义为 INTEGER PRIMARY KEY AUTOINCREMENT 那么这个时候ROWID的select算法就和默认的不一样了。这时候,ROWID也是自增的,但是自增的ROWID的得保证当前数据库的当前表中之前一直没用过,即使你插入过100行记录,ROWID分别位1到100,这个时候你将这100条记录都删除掉,这个时候你再插入的时候,ROWID是从101开始的,而在默认的情况的下,还是从1开始的。

参考地址 : http://www.sqlite.org/autoinc.html

Jenkins CI Used For Mac App Dev

介绍

在开发一个软件的过程中,测试或者项目经理经常需要得到软件的最新版本。
如果每次都是开发手动编译给他们,有点浪费时间,也不科学。
所以这个任务可以交给计算机来作,每当你有代码提交的时候或者每当系统定期检测到有代码更新的时候,系统自动进行编译打包,并可以通过浏览器来下载最新的软件版本。
你也许会说,这个不是持续集成的一部分么?哈哈,的确是。

这里使用的CI(持续集成)软件是 Jenkins CI,以前叫做Hudson ci后来迫于oracle的相关政策,年初的时候改名了。https://github.com/jenkinsci 这里是其代码。
其实CI囊括的东西远远不止自动编译了,还可以有代码提交后的自动化测试,生成各种测试报告,自动打包部署等等。

安装配置及使用

这里要说的是开发一个mac软件,想要使用Jenkins进行定期编译打包应该怎么做。
首先你得有一台mac server或者一台普通的mac机器做服务器。

下载Jenkins http://jenkins-ci.org/ 可以直接下载mac系统的安装包。
安装好了之后,会在Applications目录下多一个Jenkins的目录,里面就一个war包,jenkins.war
这个时候你可以启动Jenkins服务了
进去/Applications/Jenkins目录,运行 java -jar jenkins.war –httpPort=9080 –ajp13Port=9009 (当然你可以通过nohup的方式使得其在后台运行)你也可以不指定http和ajp的端口,使用默认的值,默认的http端口是8080
启动好了之后就可以通过浏览器 访问http://localhost:9080/

系统的一些设置都在 Manage Jenkins 选项中,你可以在插件管理的界面中选择安装一些插件。
比如帐号权限管理的插件,Git支持的插件,这里就先不要权限管理了。直接安装一个git插件。

然后进入主界面,新建一个Job,
勾选第一个Build a free-style software project,下一步中填写项目描述,源码管理处选择Git,然后填写Git库地址以及分支
Build Triggers 可以选择定期执行
Build这边,由于是Mac项目,不像Java项目可以有Ant或者Maven这些三方的构建工具。
命令行编译XCode的项目只能通过XCode自带的命令行工具来,所以只能选shell脚本的方式,这边的输入框中可以写脚本,也可以将具体的脚本写在项目中随项目一起提交到git库中,这里只负责一些环境变量的设置以及脚本的调用。

1
2
3
4
5
REVISION="${GIT_COMMIT:0:7}"
FOLDER="#${BUILD_NUMBER}.Rev.${REVISION}"
export ARCHIVE_DIR="/Users/Luke/Test/${FOLDER}"
mkdir -p "$ARCHIVE_DIR"
Scripts/build.sh CONFIGURATION TARGET APPNAME

xcodebuild的具体用法可以参考官方的文档

1
2
3
获取脚本传递过来的参数并算好项目的路径以及编译之后app的路径
xcodebuild -target "${TARGET}" -configuration "${CONFIGURATION}"
编译成功之后,进行zip打包并移到ARCHIVE_DIR中

Post-build Actions 就是build结束后的后继操作,比如可以将编译结果邮件发送给相应的人员。

NSImage imageNamed:

1.图片的加载

NSImage 这个应该是经常用到的一个类,最常用的莫过于 [NSImage imageNamed:@"name"] 来加载一个资源中的图片。
可能这并没有你想象的那么简单。

1
NSImage *myImage = [NSImage imageNamed:@"imageName.png"] ;

加载一个图片的时候,先到到缓存中搜寻,看cache中是否存在,如果不存在则从资源中加载,用完了之后,其实这个图片会被缓存起来,且在缓存中一个图片对应一个唯一标识,默认为不带后缀的图片名(具体方式),
当然你可以主动的为某一个图片注册一个自己的标识,比如

1
2
NSImage *myImage = [NSImage imageNamed:@"imageName.png"] ;
[myImage setName:@"myImage"];

这样之后你就可以通过[NSImage imageNamed:@"myImage"]来获取这个缓存中的图片了,如果你硬是不想缓存某个图片,那么你可以在用完了图片之后进行如下操作

1
[myImage setName:nil];

这样下次你加载图片的时候就会重新从资源中加载了。

2.坐标系的问题

在cocoa中默认情况下的View采用的坐标系是类似于数学坐标系的,左下角为坐标原点(在cocoa touch中,左上角为坐标原点)。
但是为了方便,cocoa中有些控件默认情况下是Flipped的(如NSTableView NSButton 链接),即坐标原点在左上角,这当然是为了控件实现的方便。

如果你需要在一个Flipped View中画一个NSImage,那你得注意了,最好别用NSImage的setFlipped方法(Deprecated in Mac OS X v10.6),因为前面讲过了,图片是在缓存中的,可能你下次需要在一个非Flipped View中画这个图,那你之前把图片设置成flipped会造成影响,所以NSImage在draw的时候优先选择drawInRect:fromRect:operation:fraction:respectFlipped:hints:这个方法