linfan's blog

在沙盒环境中使用Finder打开文件夹

从6月1日开始,Apple要求所有提交到App Store的应用程序都必须运行在沙盒环境中,这可苦了我们这些悲催的码农。一则受到沙盒环境的种种限制,一些很常用的操作都没法实现;二则App Sandbox本身就是BUG重重,这个更是有理没处说。

举个例子,常规环境中,一般使用Shared File List API来设置程序随系统自动运行。到了沙盒环境中,Apple不许我们使用此API了,而建议使用Service Management来实现类似功能。Service Management不如传统方法直接,必须将一个Helper程序设置为启动项,由Helper程序唤起主程序,而且创建的启动项不能显示在系统设置中。这就算了,问题是Helper程序怎么也不能唤起主程序,这个BUG直到10.7.4才解决。

言归正传,本文要说的是另一个BUG。通常,如果需要展示某个文件夹的内容,我们会使用NSWorkspace的OpenURL方法。即使在沙盒环境中,只要已经取得了该文件夹的相关权限,此方法显然也应该没问题。但Apple不这么想,直到目前的Lion 10.7.4中,即便是打开沙盒容器中的目录都无法成功,可以在控制台看见这样的信息。

各种OS中生成UUID的方法

开发人员或多或少都应该知道UUID或GUID,这是摘自维基百科的一段描述。

通用唯一识别码 (Universally Unique Identifier, UUID) 是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分散式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。

UUID 的目的,是让分散式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。另外我们也可以在 e2fsprogs 套件中的 UUID 函式库找到实作。

Xcode: 使用Git自动设置项目版本

本来一直使用SVN进行版本管理,并习惯于将代码版本(revision)作为Xcode项目的编译号(CFBundleVersion)。最近开始了解Git,被其种种美好所诱惑,于是一股脑将个人的所有项目都转移到Git,然后发现CFBundleVersion不好设置了。

实现Mac应用的自我重启

对于应用程序的某些配置项,需要重新启动应用才能生效。比较友好的方式是提醒用户,并在用户确认后完成自我重启。

实现自我重启的方法很多,易于理解且实现简单的一种如下。

  1. 启动一个子进程;
  2. 主进程退出;
  3. 子进程延时一定时间后拉起主进程,或者检测主进程已经关闭后重新拉起。

Xcode的点滴记录

升级到Lion以及Xcode 4之后,发现Xcode 4在配置上与Xcode 3有些不同,记录于此备忘。

HP-UX中SFTP的一个小问题

最近工作的一个项目,使用libssh2在HP-UX环境下实现SFTP的文件传输。测试时发现一个问题,使用libssh2_sftp_rename重命名文件时,若目标文件已经存在,总是不能成功。使用libssh2_sftp_last_error得到的错误代码是LIBSSH2_FX_FAILURE(4),基本没有参考价值;另外可排除用户权限因素。

使用Wine在Mac OS X中运行Windows程序

目前,在Mac OS X中运行Windows程序,不外乎两种方法。一是在虚拟机软件如VirtualBoxVMware FusionParallels Desktop中安装完整的Windows操作系统;另一种则是利用Wine或其商业版本Crossover Office直接运行Windows软件。

Wine的名字是一个有意思的缩写,Wine Is Not an Emulator,如其所表,Wine并非虚拟机,它实现功能的方法是提供对Windows API的兼容,从而使Windows程序能够运行在Linux/Mac OS X操作系统中。与虚拟机相比,Wine的运行效率和系统资源占用都有很大优势,但兼容性会差一些,不过很多软件包括Office、Photoshop之类的大型软件都能运行。这里有一个Wine的兼容性列表。

本文谈一下Wine在Mac OS X中的安装和配置。

Mac OS X下读写ext2/ext3文件系统

我的移动硬盘上,有个分区是ext2文件系统的,不能在Mac OS X中挂载。幸好,在开源世界里,我们总是能找到各种问题的解决方法,感谢无私的开发者。

fuse-ext2是ext2文件系统在FUSE上的实现,支持Linux和Mac OS X。FUSE是在操作系统用户态下实现的文件系统,源自Linux,Mac OS X的移植版本主要有三个,MacFUSEFuse4XOSXFUSE,其中,MacFUSE已经停止开发,后二者是MacFUSE的继承者。Fuse4X和OSXFUSE都把对FUSE最新API的支持作为项目目标,但Fuse4X不提供对MacFUSE旧版本接口的兼容,OSXFUSE则同时兼容MacFUSE旧接口。fuse-ext2二进制安装包是基于MacFUSE编译的,所以我们选择OSXFUSE,获取最佳的功能与兼容性。

Cocoa菜单栏右侧图标的实现

与Windows中的Tray Icon不同,Mac OS X中类似的UI元素位于屏幕右上角菜单栏的右侧,官方命名为Status Item,我们可以使用NSStatusBar和NSStatusItem类在菜单栏上为自己的应用添加图标。

1
2
3
4
5
6
NSStatusBar *statusBar = [NSStatusBar systemStatusBar];
NSStatusItem *statusItem = [statusBar statusItemWithLength:NSVariableStatusItemLength];
[statusItem setImage:image];
[statusItem setMenu:menu];
[statusItem setHighlightMode:YES];
[statusItem retain];

使用这种方法创建的图标,位于菜单栏图标区域的最左侧,如果菜单栏上图标太多,很容易就被程序菜单遮挡了。那么,有没有办法在菜单栏的右侧添加图标呢?