Sky Watch

OS X: 配置完了,小研究一下

Google 了无数次,也找到了一些安装显卡驱动的方法,但在我的机器上就是不管用... 所以到现在还没有硬件加速,这个本来没什么,少一些特效而已,但是发现 OS X 里播放视频是需要硬件加速的...

大概研究了一下 OS X 下的程序,标准的 OS X 程序都是一个名字以 .app 结尾的文件夹,里边一般只有一个文件夹叫 Contents,这个程序的一切都在这个文件夹里,包括图标,配置(有些比较底层的会在 /Library/System 里面放配制)语言文件等等。比较爽的是,OS X 和它里面的程序都是极端脚本化的,不仅配置一律是 xml,而且控件的摆放(!),图片的位置,dock 图标,甚至部分逻辑都是 xml,对于我们这些喜欢没事瞎改的人来说,这样的系统基本上就是天堂了~~。举个简单的例子,无论在什么操作系统里,只要有一个图形界面的文件管理器,你在里面新建一个目录的时候都有一个默认的目录名,比如在 Windows 里叫“新建文件夹”,这是被硬编码的,没有源代码的人改不了;在 OS X 里叫 untitled name,这个可以在 /System/Library/CoreServices/Contents/Resources/English.lproj 中修改,这个 .lproj 是一个语言文件,会被其他的 xml 调用。貌似现在达到这种境界的基本上就只有 wxWindow 了(用 xml 来摆控件)。

OS X 里面是有 python 的,不过是 2.3 版,严重不爽,于是装了一个 2.5(装好以后还要手动做符号连接...),开始考虑有什么程序可以写~~。想了半天,决定写一个批量删除语言文件的东西,把机器里的那些非人类语言都删掉,可以节省数百 MB 的硬盘~~,代码(用法看开头的注释):

:::Python
#!/usr/bin/env python
#   
# Usage:
#     kill-lang.py app_list
#   
# eg: kill-lang.py mail.app aquamacs.app
#     ls -1 | awk '{print "\""$0"\""}' | xargs kill-lang.py

import os
import sys
import re
import shutil
ReservedLang = ["English", "zh_CN"]

if len(sys.argv) == 1:
    usage()
    sys.exit(1)

def usage():
    print(' '.join(["Usage:", sys.argv[0],
                    "application_names (with \".app\")"]))
    return

def handleRmError(function, path, excinfo):
    sys.stderr.write(''.join(["Error deleting ", path, ", err:\n", str(excinfo), "\n"]))

def killLang(app):
    # Get the path where language files are located.
    AppResource = '/'.join([app, "Contents", "Resources"])

    if not os.path.isdir(AppResource):
        sys.stderr.write("This program dose not have a standard app structure.\n")
        sys.exit(2)

    AppSubs = os.listdir(AppResource)
    Langs = []
    for Sub in AppSubs:
        if re.match(".*\.lproj$", Sub) != None:
            Langs.append(Sub)

FullLangs = ['/'.join([AppResource, Lang]) for Lang in Langs]
    for i in range(len(FullLangs)):
        if not Langs[i][:-6] in ReservedLang:
            print("".join(["Deleting ", Langs[i], "..."]))
            shutil.rmtree(FullLangs[i], False, handleRmError)
    return 0

def main():
    for App in sys.argv[1:]:
        App = os.path.abspath(App)
        print App + ':'

        if not os.path.isdir(App) or len(App) - App.rfind(".app") != 4:
            print "Not an app, skipped"
            continue
        killLang(App)
    return 0

sys.exit(main())