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())