macOS 屏蔽 Apple OCSP 验证服务加快程序启动速度

自 macOS Catalina 后,在沙箱中隔离(quarantine)的应用和脚本均需通过 Apple OCSP 验证后才可启动,这大大减慢了程序的打开速度,且面临隐私泄露风险。由于在离线状态下,程序可以正常访问,我们可以通过屏蔽该项服务来略过这一验证步骤,加快程序启动速度。

以 root 权限编辑 /etc/hosts:

sudo vim /etc/hosts

开启编辑模式,在文件尾端加入

0.0.0.0 ocsp.apple.com

键入 :wq 保存并退出。

如果正在使用系统代理,则也需要在代理处进行相应的配置。

比如在 ClashX 的配置文件中,可以加入

DOMAIN, ocsp.apple.com, REJECT

关于 Apple OCSP 的更多资料:https://medium.com/@acecilia/apple-is-sending-a-request-to-their-servers-for-every-piece-of-software-you-run-on-your-mac-b0bb509eee65

在macOS Mojave及更新版本中配置gdb

参考链接:https://segmentfault.com/q/1010000004136334

在网上很容易找到相关教程,然而新版本的macOS带来了更严格的安全限制。详细步骤请见以上参考链接。

简要步骤:
1. 在Keychain Access(钥匙串访问)中为gdb创建证书;
2. 对证书添加信任;
3. 如果是macOS High Sierra (10.13)或以下版本的系统,直接对证书签名(在终端执行codesign命令);
如果是macOS Mojave (10.14)或以上版本的系统,撰写额外的xml文件并对gdb进行dubugger签名,命令是

codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

其中,gdb-entitlement.xml是撰写的xml路径,gdb-cert是刚刚创建的证书名称,$(which gdb)是gdb可执行文件路径。

如果gdb经常卡死,可以参见https://github.com/Homebrew/homebrew-core/issues/49631

解决macOS中某些App需要安装Java 6环境的问题

更新:推荐使用Jar2App打包,更为方便。
https://github.com/Jorl17/jar2app


以下为原本的答案(不推荐,兼容性不好且麻烦)

很多小型的Java应用使用JarBundler打包,这种应用的Contents/MacOS/内通常会有一个JavaApplicationStub的程序。当运行该App时,会弹出需要安装Java 6的通知。然而,如果Mac上装了新版本的Oracle Java,按照指示安装Java 6时会提示磁盘中已安装了更新版本的Java而无法安装。这里采用一个修改plist文件+手写运行jar程序的方式来解决问题。

准备工作

首先在Finder中找到打不开的App,在选单中点击显示包内容,并在包内某处找到.jar文件,记下路径(这里以Logisim为例,是Contents/Resources/Java/logisim.jar)。如果可以直接运行该jar,一般就可以继续使用下面的方法。

修改plist文件

用文本编辑器打开Contents/Info.plist文件。尝试将<key>Java</key>一项中的Java改为其它字串,并启动App。如果仍然无法启动,请继续下面的步骤,或尝试修改其它带有Java字样的key。

编写启动程序

Contents/MacOS中一般会有一个JavaApplicationStub的程序(可在Info.plist中的CFBundleExecutable项查看运行的是哪个程序),这个JarBundler项目已经很旧了,我们需要自己动手做一个运行jar的程序。注意,如果在终端中无法执行java命令,可能需要按照提示安装JDK

运行jar的命令是

java -jar PATH_TO_JAR/xxx.jar

这里使用C++(C)编写可执行文件。jar文件的路径需要按照实际修改。

#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <mach-o/dyld.h>

int main() {
  char path[1024];
  char cmd[100];
  strcpy(cmd, "java -jar ");
  uint32_t size = sizeof(path);
  if (_NSGetExecutablePath(path, &size) == 0) {
    strcpy(strrchr(path, '/'), "/../Resources/Java/logisim.jar");
    system(strcat(cmd, path));
  } else {
    printf("Error: Buffer too small. Size required: %u.\n", size);
  }  
}

编译后将可执行文件放到Contents/MacOS/下,再回到plist文件中,修改CFBundleExecutable项下方的值为可执行文件的名字(这里是runJar)。

<key>CFBundleExecutable</key>
<string>runJar</string>

保存plist,就可以运行App啦!

macOS Automator 自动化操作 PowerPoint(格式转换、生成PDF、文件提取)

利用macOS的Automator,可以在Finder菜单中快速对一个或多个PowerPoint文稿进行格式转换、生成PDF、文件提取等操作。此操作需要macOS中安装较新版本的Microsoft Office PowerPoint。

背景:要从物理课的.ppt文件格式的操作中提取出音频用以加速播放及调整进度条,而.ppt文件无法直接解压缩,需要转换为.pptx格式再解压缩后提取出音频。

开始编写Quick Action流程

打开Automator App(默认位于Launchpad的Other文件夹中),新建Quick Action。Quick Action是可以加入Finder菜单、Services菜单的一类Workflow流程。

在左侧查找Filter Finder Items拖入右侧流程中,对输入文件的后缀名称进行过滤。这里仅接受ppt后缀名的文件,若要对pptx pps ppsx等后缀名的文件进行处理,也可以将其加入过滤器中并将规则All改为Any。

开始编写Apple Script,打开PowerPoint文件

参考资料:https://apple.stackexchange.com/questions/217004/how-do-i-get-automator-actions-for-microsoft-powerpoint-and-word

在左侧寻找Run Apple Script,拖入右侧流程图中。下面的代码将ppt转为pptx并保存在同一文件夹中。若要接受更多格式的后缀名,需要修改makeNewPath部分(这里是将后三位ppt截掉,换成pptx)。

on run {input, parameters}
	set output_list to {}
	tell application "Microsoft PowerPoint"
		launch
		set theDial to start up dialog
		set start up dialog to false
		repeat with i in input
			open i
			set output_path to my makeNewPath(i)
			save active presentation in output_path
			close active presentation saving no
			set end of output_list to output_path as alias
		end repeat
		set start up dialog to theDial
		quit
	end tell
	return output_list
end run

on makeNewPath(f)
	set t to f as string
	return (text 1 thru -4 of t) & "pptx"
end makeNewPath

若要转换为PDF格式,则需将

save active presentation in output_path

一句改为

save active presentation in output_path as save as PDF

并修改makeNewPath的部分:

on makeNewPath(f)
    set t to f as string
    if t ends with ".pptx" then
        return (text 1 thru -5 of t) & "pdf"
    else
        return t & ".pdf"
    end if
end makeNewPath

至此,将ppt转为pptx或将ppt/pptx转为pdf的功能已实现完毕。如不需要文件提取,请向后跳到“调试和使用”一节。

编写Shell Script提取pptx中的文件

使用压缩软件打开.pptx文稿即可读取其内容。若要实现自动化处理,可以使用Automator的Run Shell Script模块。

下面是提取全部音频文件的代码,Run Shell Script设置为将输入传达到参数中。

for f in "$@"
do
  unzip "$f" -d "$f Files/"
  mkdir "$f Audio"
  for file in `ls "$f Files/ppt/media/"`
  do
    if [ "${file##*.}" = "wav" ]; then
      mv -f "$f Files/ppt/media/$file" "$f Audio/"
    fi
  done
  rm -rf "$f Files/"
  rm -f "$f"
done

这段代码将pptx中附着的音频文件拷贝到与pptx相同目录下的*.pptx Audio文件夹中,并将源文件删除。

调试和使用

由于在Automator中测试并没有文件读入,测试时可以在流程开始处拖入Get Specified Finder Items指定输入文件(正式在Automator外使用前要删掉)。

之后,按下Command+S保存脚本,输入一个名字,就可以在Finder右键菜单的Services项或是文件的预览栏中找到刚刚编写的脚本了。

.workflow文件的存储位置在~/Library/Services/下,对其重命名即可改变菜单中的名称。

此处有一个问题:在较高版本的macOS中实际执行时会出现读写磁盘权限不足的问题。这时需要对该脚本赋予Full Disk Access权限。打开System Preferences,在Security & Privacy中找到Full Disk Access,左下角解锁后点击加号,将执行该脚本的Finder加入进去并赋予权限。Finder.app的路径在/System/Library/CoreServices中。

可以用了!