0%

图源:官方文档

我首次购买的来自大厂的效率应用即是Alfred。它的社区十分成熟,围绕它开发的资源数不胜数,我几乎不用自己研究,直接从网上就能找到符合我需求的workflow。

若干年之后我购买了Keyboard Maestro,这个KM也有个类似Alfred的“搜索框”(见下图),且对我而言更重要的是,在KM里编辑Macro要比Alfred里编辑workflow要直观、容易得多,主要有以下几点原因:

  • 首先,它的Maco编辑是类似iOS/iPadOS中快捷指令式的模块组合,非常直观
  • 其次,KM具有更详细的说明文档,以及一个十分活跃的forum
  • 此外,KM对变量的管理非常容易理解,在偏好设置里有个专门分区进行各种变量的储存
  • Last but not least,它支持我最钟情AppleScript语言的语法高亮(在Alfred里编辑AppleScript可太难受了,既没有自动缩进也没有语法高亮)

于是,我开始思考,除了UI比较讨喜并且可以自定义之外,Alfred的优势究竟在哪里?直到最近我才发现——Script Filter即是答案。

KM的搜索框

首先我们要知道,Alfred是一种选单结构,选单里的每个条目,都能显示一定的信息(主副标题、图标等),当然还有你看不到的选中之后的供下一步操作的输出值(Alfred里叫做query)。

于是,如果简单描述,Script Filter可以让你利用一些脚本语言自定义一系列选单条目:包括它的显示内容及每个条目的query。所谓自定义,我比较熟悉的做法是用python脚本输出json格式的条目信息,这是本文希望向读者阐述清楚的内容。

官方Script Filter示例

步骤

首先,新建一个空的workflow,并右键空白处→Inputs→Script Filter新建一个Script Filter模块

然后,右键点击左栏中的workflow,选择Open in Finder,

这样会打开这个workflow所在的根目录,在该目录中建立myscript.py文件,文件内容如下:

这个results变量是一个dict,其中只有一个键值对,"items"的值是一系列会显示在Alfred选单里的条目,条目的数据类型为dict,其中不同的键对应着条目的不同属性。你需要用json.dumps将其转换成json格式,再print出来,相应的内容就会像下图那样显示在Alfred的结果里了。

上面涉及到的titlesubtitlearg是最基本的几个键,你可以在这个页面下找到官方支持的所有键。这三个键的前两个是主副标题,最后一个arg则是会进入workflow下一步操作的输出值query。在这个例子中,两个条目的输出值都是一个网址,如果我把这个Script Filter连接上一个Open URL的操作(见下图),并指定URL为{query}。那么当我选中一个条目,就会打开对应的网址。

以此类推,如果你是位python大神,可以很容易通过Script Filter让Alfred显示出更加复杂多样的内容。

我利用Script Filter做了啥?

对我而言,Script Filter配合python最佳用法自然就是爬虫了。我的工作需要频繁访问一个网页端数据库,其中有1000多个条目。

利用Script Filter我可以在不打开浏览器的情况下搜索并直接打开其中一个条目。

前言

身处国外,因为疫情严重,下班后几乎只能呆在家中。单调的生活导致我对时间流逝的感知变得有些模糊,突然就很想记录下周围发生的一切,好让未来的我知道,这段时间我并没有“白白浪费”。所谓流水账,就必须事无巨细。想记录的事情太多了:在B站上看了哪个视频、看了谁的吃播下饭、访问了哪个有意思的网站、Apple Music给我推荐了哪首好听的歌,甚至是「窗外树梢上有两只小鸟在打架」这样的小事我都必须记录下来。

其实我之前写过一篇如何像《未来日记》里男主那样记录生活的文章,但那篇文章里提到的Draft转订阅制后我已经彻底弃用了,而且实现方法过于复杂。于是就有了这篇文章。

演示

所需工具

  1. iCloud Drive(免费的5G容量已经够用了)
  2. 快捷指令
  3. Day One

添加「碎片事件」

利用这个添加事件快捷指令,快速键入一个碎片事件。这个碎片事件会被追加到iCloud Drive/Shortcuts/碎片事件目录下的名称为yyyy-MM-dd.txt的文件中。其中yyyy-MM-dd是符合Unicode Technical Standard #35 的格式。如果当天的txt文件不存在,快捷指令则会自动创建该文件并追加碎片事件内容。

每次键入,会在txt文件中添加一行如下内容

1
`HH:mm` [你键入的内容]

其中HH:mm表示记录时间(24小时制)。时间前后两个抑音符(backtick)是为时间添加一个代码块样式,不喜欢的可以去掉。

这样创建多个事件后,txt文件里就会变成这个样子:

这个快捷指令还可以从分享菜单中运行,如果分享内容包含URL,就会自动抓取URL标题并生成Markdown链接格式。下图中高亮的B站视频链接就是一个例子。

1
`HH:mm` [URL标题](URL)

生成当日总结

之后,你可以利用这个当日总结快捷指令来生成当日总结报告。

这个快捷指令会首先从iCloud Drive/Shortcuts/碎片事件路径下获取一个txt文件。为了避免在同一日期下创建两个总结条目,会先根据该文件的创建日期在Day One中查找是否具有这个日期下的总结条目。如果存在,就打开条目并把所有碎片事件复制到剪贴板,再手动粘贴到条目中;如果不存在,就按照下图中的模板创建新的总结条目。

1
2
3
4
5
6
7
8
###### 精彩事件
[来自事件收集文件里的内容]

###### 心情
😄🙂😐🙁😫

###### 时间线
[该日中的所有日历事件]

*在macOS上进行事件收集

因为上述方法用到了iCloud Drive的存储空间,于是在macOS下你也可以访问这些txt文件。于是我利用Keyboard Maestro来添加碎片事件到收集文件中,就实现了同步。不过在本文中我不赘述具体方案,只放几张截图,有兴趣研究Keyboard Maestro的朋友可以作为参考。

首先,创建一个名为“记录碎片事件”的Macro,由下列三个Action组成:

你还可以再配合下面的Action来收集Safari页面

其实这是一个小小的 LCP + Drafts + TextExpander 实例,因为微博上有人求方法,我就写一个正式的教程吧。

无差别日记需要用到的 App 有:

  • Launch Center Pro (LCP)
  • Drafts 4
  • TextExpander
  • 一个支持 URL Scheme 的笔记应用,比如 Day One(或 Evernote )

我把 Launch Center Pro 作为书写和提交「無差別日記」的入口,我设想你需要以天野雪辉那样丧心病狂的记录频率来记录周围发生的无差别事件,然后以「天」为单位提交一整天记录的内容到日记应用 Day One 中。所以一天下来的「無差別日記」记录流程基本上是这样的:

记录無差別事件

Drafts 是作为暂存区的存在。我们要先钦定一条专门用于录入無差別事件的 Draft。首先需要取得 Draft 的 UUID 码,UUID 相当于 Draft 的身份证号码,只有通过它 LCP 才能直到你需要往哪一条 Draft 里录入信息。

你可以运行 Copy UUID 这个 Action 来复制一条 Draft 的 UUID 码。

之后我们需要利用 TextExpander 来生成时间信息,我用下面这个 TE Snippet 来生成当前时间,缩写为 ttime,在 LCP 中使用 [textexpander:ttime] tag 来使用它。

得到 UUID 和并在 TextExpander 里添加了时间 Snippet 之后,我们打开 LCP,先在设置中同步一下 TextExpander 的 Snippets。然后新建一个 Action,在 Action Composer 里搜索到 Drafts 4,然后选择 Append to Draft and Return 这个预置 Action,之后依次填入

  • Name: 無差別日記
  • UUID: 你复制到的 UUID
  • Text:[textexpander:ttime] [prompt: 無差別事件]
  • Action:

提交一整天记录的事件

我在 Drafts 4 里创建了这样一个 Action:

  • Step 1: 将 Draft 内容复制到剪贴板

  • Step 2: 利用一个脚本来清空当前 Draft 内容,脚本内容

    // Script steps run short Javascripts
    // For documentation and examples, visit:
    // http://help.agiletortoise.com

    draft.content = “”;
    commit(draft);

  • Step 3: 用 Day One 提供的 URL Scheme 从剪贴板创建新日志

然后将此 Draft Action 命名为「无差别日记」

为了保证第二天能够继续使用这条被钦定的 Draft,我们必须要删除当天记录到 Draft 中的内容,所以需要清空它。

于是在 LCP 中创建一个新的 Action,在 Action Composer 中使用 Drafts 4 预置的 Open Draft,然后填好以下三条 Option 即可

  • Name: 提交無差別日記
  • UUID: 你之前复制的那条 Draft 的 UUID
  • Action: 无差别日记

如果需要你还可以给这个 Action 加一个 Schedule,让它每天固定时间提醒你提交当天记录的内容。

结语

通过这两个 LCP Action 你可以方便地记录无差别事件,然后每天睡前提交到日记应用中就可以了。这样你就可以走上成神之路了,加油吧少年(ง •_•)ง

基本截图功能

截图功能没什么好说的,它的默认截图快捷键是 ⌘+⇧+2,截图时再按住空格可以截取窗口。

img

那么,为何将其曾为称为「卡片式」截屏?因为这个软件的截图真像是把屏幕的一部分提取出来,并让它置顶悬浮在桌面上。像一张「小卡片」一样:

img

这已经不只是截图工具这么简单了,这意味着你可以用 Snappy 抓取屏幕中任何你希望「置顶」的信息。举个具体的例子,我正在看电子版的物理学教材,某处提到 A 公式是通过若干页之前的 B、C、D 公式推导出来的,如果我要想彻底理解这个推导过程,就必须同时看这几个公式。最没效率的方法就是给这几个公式的所在页码挨个加书签,然后来回切换,反复比对。但如果利用 Snappy 就可以方便地让 B、C、D 公式置顶在屏幕上,同时查看这几个公式:

img

这是 Snappy 最让我着迷的地方。下面是它支持的基本截图工具:

指针工具 ⬉

拖动、在边缘处放大缩小

画笔工具 🖌️

img

遗憾的是不支持形状📐输入,考验你鼠绘的时候到了。

文字工具 T

img

橡皮擦 ❍

擦除画笔工具的痕迹

img

属性设置 🕹

  • 数字 1-9 调整透明度
  • ⌘ +/- 调整大小

img

以上工具均可自定义快捷键

截图库

通过 ⌘+⇧+2 快捷键截取的「小卡片」,都会保存到 Snappy 的截图库中,你可以在菜单栏的 Snappy 图表打开截图库,也可以使用默认快捷键 ⌘⌥⇧L 打开。

img

可以看到截图库侧栏中有根据时间的分类,以及根据Apps的分类。截图库中的所有「小卡片」,你可以进行重新编辑和分享。

它支持的分享功能有:

  • SnappyApp 图床,支持定时删除的安全图床模式
  • Imgur 图床,无需注册
  • Evernote
  • Twitter
  • Slack
  • Facebook

你可以在 App Store 上免费下载到这一款软件。

前言

我是一个物理工作者,MS Word/WPS 什么的很早就扔掉了。LaTeX 才是我们的家常便饭。本科时候在课堂上我就喜欢拿着电脑做笔记。macOS 下只要下载一个 MacTeX,它自带 TeXShop,然后一切就都搞定了。

后来知道了 Markdown 语法,这样一个花 2 分钟就能学会的「标记语言」直接戳中我这样一个极简主义者的 G 点。与 LaTeX 最大的不同在于,它不会像大多数 LaTeX 编辑器一样在仅修改了一个标点之后,都要求重新编译。

然而要同时实现 Markdown 的极「简」,和 LaTeX 的「效」能是非常艰难的。虽然在静态博客里可以使用 MathJax 显示公式,但在 macOS 端编辑博文时没有 LaTeX 预览也是很难过的一件事。

MWeb

你可能会说 MWeb 就支持 LaTeX 的编辑和预览呀!的确,我尝试过它,但这里提出两点我后来放弃它的原因:

  1. 预览的公式字体太难看,不知道为什么作者不设置为科学期刊上最为常用的 Latin Modern Math 字体。我在作者的 GitHub 下发过一个 issue,他也没能给我一个有效的答复。
  2. MWeb 没有 iOS 版,不能多设备同步。

Typora

还有声名鹊起的 Typora,我觉得它单作为 Markdown+LaTeX 编辑器可谓最优选:插入公式的方式不能再漂亮、默认的主题也简单优雅。

但它不能对文档进行管理,没有所谓的「外部文件夹」。而且,它也没有 iOS 版。

综上,我的要求其实很苛刻——优秀的编辑环境、Markdown、LaTeX预览、多设备同步集合为一体。于是我开始在 Ulysses 和 iA Writer 上寻求出路,因为这两个软件首先就符合我对「优秀的编辑环境」的要求。最终我找到了我的解决方案。

方案一 Ulysses + HTML

Ulysses 是支持 HTML 预览的,所以我们在 Markdown 文档里插入一些 HTML 语言也没有关系。前天我就在 @ulysses 官推上看到这个在 Ulysses 下实现公式预览的方案。

只需要在文档开头加入这四行 Raw Source 即可

1
2
3
4
~~ <script type="text/x-mathjax-config">
~~ MathJax.Hub.Config({tex2jax: {inlineMath:[['$','$']]}});
~~ </script>
~~ <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

其实这就是 HTML 下的 MathJax 相关设置。不用担心那些小波浪号,它们是 Ulysses 用来标记 Raw Source 的符号,无论是导出还是发布到你的的静态博客上都不会造成影响。

之后只要将正常 LaTeX 语法包裹进 Raw Source 格式中即可,比如

1
2
3
神奇公式:
~~ $$\left(iD\!\!\!/+m\right)\psi = 0$$
~$\dfrac{1}{2}$~,这就是二分之一,想不到吧!

然后调整 Ulysses 的导出格式为 HTML,使用 ⌘+⇧+P 就可以预览文档里的公式了!

img

原文链接:Writing Mathematical Equations in Ulysses

方案二 iA Writer + Export Markdown to PDF(Service)

我们也可以利用 iA Writer 实现 Markdown + LaTeX。

同样是解决 LaTeX 公式预览问题,我发现了这样一个系统服务——Export Markdown to PDF。它是基于 pandoc 命令,在 iA Writer 下将文档转换为 PDF,并在默认 PDF 应用程序下预览。虽然不像 iA Writer 自带的预览那样高效,但如果只是插入几行公式,对我来说这已经最佳方案了。况且近日发布的 iA Writer 4 支持多文件、模块化编辑,对于每个子文件而言 pandoc 的编译效率也十分高了。
img

遗憾的是,这个 Export Markdown to PDF 已多年没有维护了,它环境变量设置已经因为新版本路径更改无法使用,而且最致命的是它不支持中文文档。于是我将它 Fork 了一下,修改成为了支持中文的 LaTeX 编译服务,下面我用四步教大家如何配置它:

第一步

首先,毋庸置疑你的电脑里必须安装有 MacTeX,而且我建议安装最新的 2016 版。
以及,转换 pdf 所必需的 pandoc(用 brew install pandoc 安装)

第二步

配置 xelatex 中文编译模板

1
2
3
mkdir ~/Templates
cd ~/Templates
pandoc -D latex > template.tex

然后编辑 template.tex 文件,定位到% if luatex or xelatex,在下图白色箭头处(\fi的下一行)插入如下语句:

1
2
3
4
5
6
7
8
9
% SUPPORT for Chinese
\usepackage[boldfont,slantfont,CJKchecksingle]{xeCJK}
\usepackage{fontspec,xltxtra,xunicode}
\defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
\punctstyle{quanjiao}
\setCJKmainfont{WenQuanYi Micro Hei}
\setCJKsansfont{KaiTi}
\setCJKmonofont{SimSun}
\defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}

img
其中\setCJKmainfont{WenQuanYi Micro Hei}可以自定义主字体(LaTeX 老司机也可以尝试修改其他内容),我测试时用的是「文泉驿微米黑」字体,大家可自行修改。但最好像我一样使用字体的英文名称。什么?你不知道怎么查看字体的英文名称?到终端使用下面这条命令查阅系统内的字体英文名吧。

1
fc-list :outline -f "%{family}\n"

如果系统提示找不到 fc-list 命令,可能你需要去安装一个 XQuartz

第三步

下载我 Fork 的 Export Markdown to PDF,把 workflow 文件放到~/Library/Services路径下

第四步

在 iA Writer 下使用:iA Writer → 服务(Services) → Export Markdown to PDF 即可。编译的时候可以看到右上菜单栏会有个旋转的小齿轮⚙️,特别可爱。如果 LaTeX 语法有错误,错误信息会以弹窗的形式出现,方便你 debug。

img

一些说明

  • $ \dfrac{1}{2}$ 会报错,要改为$\dfrac{1}{2}$才行,好像是第一个$后面不能出现空格
  • 需要自行研究一些特殊宏包的插入,例如页边距的设置等,毕竟在 Markdown 文档里无法使用 \usepackage 命令了,有些茫然不知所措
  • 用 Automator 打开 Export Markdown to PDF.workflow 你可以看到下面这些内容:
    • pandoc 环境设置
    • xelatex 环境设置
    • pandoc 转换 pdf 的命令,其中 --template 字段设置的是 pandoc 编译模板,这就是第二步中为何要生成 ~/Templates/template.tex 文件的原因,你可以自行配置多个模板,然后记得在 workflow 文件里修改模板位置。

结语

祝大家 LaTeX 愉快!

img

前言

短链接就是用简短的链接来替代冗长的网址,使它更有利于分享,我在 macOS 使用名为 Shorten URL 的 alfredworkflow 来缩短长链接。

img

那么 iOS 上又该如何实现短链接呢?首先想到的方案就是利用 iOS 上著名的效率神器 Workflow 来实现。

Workflow 的 Gallery 里有个基于 goo.gl 的短链接 workflow,goo.gl 的接口非常简单。使用以下网址

1
http://is.gd/create.php?format=simple&url=你的长链接

得到的网页内容就是缩短后的链接,然后再用 Workflow 里的 Get Contents of URL 直接获取文本信息再拷贝到剪贴板就够啦。

但使用 Google 的短链接服务需要科学的上网方法,周围的小伙伴大多不具备这样的条件,于是我决定使用渣浪提供的短链接服务。但渣浪的 API 不是单独返回一个短链接,而是以 json 的格式返回,这就需要用到 Python 脚本来提取了。好在 Workflow 支持运行 Pythonsita 的脚本。借此,也抛砖引玉地为读者们介绍一下我实现 Workflow 与 Pythonista 联动的方法。

## 新浪短链接 API

作为一个 Python 初学者,这是个练手的机会。我采用了渣浪提供的以 json 为格式的短链接 API。

它的请求地址是

1
http://api.t.sina.com.cn/short_url/shorten.json

需要提供两个传入参数

  • source,应用的 appkey
  • url_long,需要转换的长链接

例子

1
http://api.t.sina.com.cn/short_url/shorten.xml?source=3271760578&url_long=https://patricorgi.github.io

这里的 source 码由网友提供,据说未经审核,不过亲测可用。不放心的小伙伴,还可以到新浪微博开放平台自己去注册一个 appkey。

Workflow + Pythonista

有了地址,在桌面端用 Python 代码提取其中的字段是很容易的。但在 iOS 下使用 Workflow + Pythonista,我们就必须知道它们之间是如何传递变量的。

从 Workflow 向 Pythonista 输入

Text action为例,将其与 Run Script action 按次序相连,那么如果要在这个 Script 调用 Text action 的输出,代码上我是这样实现的:

1
2
3
4
5
6
import sys
import ast

rawInput = sys.argv.__str__()
listInput = ast.literal_eval(rawInput)
textInput = listInput[1]

下面依次介绍其中变量的含义:

  • rawInput,从 sys 获取的、长得与 list 一毛一样但实际上是 string 的内容
  • listInput,利用 ast 转换得到真正的 list 格式,含有两个元素,第一个元素为这个 Script 所在的地址,第二个才是从 Workflow 传入的变量。
  • textInput,获取 listInput 的第二个元素,这才是真正我们需要的东西

之后就可以像在桌面端写 Python 代码一样去处理 textInput 了。

短链接提取

先要在 Script 开头加上这两行

1
2
import urllib2
import json

直接贴出这几行代码吧

1
2
3
4
5
6
url = "http://api.t.sina.com.cn/short_url/shorten.json?source=3271760578&url_long=%s" % textInput

getcontents = urllib2.urlopen(url).read()
contents = json.loads(getcontents)
data = contents[0]
short_url = data['url_short']

此处的 short_url 即为转换而成的短链接

从 Pythonista 向 Workflow 输出

这可谓是奇技淫巧,利用的就是 iOS 的剪贴板而已。

首先我们要在 Script 开头加上这两行

1
2
import clipboad
import webbrowser

在代码结尾写上

1
2
clipboard.set(short_url) # 将短链接添加到剪贴板
webbroswer.open('workflow://') # 返回 Workflow 应用

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys
import ast
import urllib2
import json
import clipboad
import webbrowser

rawInput = sys.argv.__str__()
listInput = ast.literal_eval(rawInput)
textInput = listInput[1]

url = "http://api.t.sina.com.cn/short_url/shorten.json?source=3271760578&url_long=%s" % textInput

getcontents = urllib2.urlopen(url).read()
contents = json.loads(getcontents)
data = contents[0]
short_url = data['url_short']

clipboard.set(short_url) # 将短链接添加到剪贴板
webbroswer.open('workflow://') # 返回 Workflow 应用

尾声

在 Workflow 中添加一个 Extension 类的 workflow,可用于 Safari 浏览时把当前页面的长地址输入到这个 workflow 中。

在 Pythonista 中,写好这个 Script,命名为 shortenurl.py 或者其他你喜欢的名字,放在 Pythonista 应用的根目录下。

记得 Workflow 的 Run Script 要设置相同的名字。

img

获得成就「PY战士」

前言

今日著名的写作软件 iA Writer 放出了它的4.0版本。距离去年9月发布的3.0版本,不到15个月的时间。在后起之秀如 MWeb 和一直风头无两的 Ulysses 压力之下,咋看起来这样推进式的更新像是抢占市场份额一样。但实际上,4.0版本的更新却含金量十足。相比只有 macOS 版的 MWeb,iA Writer 还支持 iOS 系统,可以很轻松地在移动设备和桌面设备上共享文件,利用移动端随时随地记录灵感;与同样优雅清爽的 Ulysses 相比,iA Writer 又具有十分亲民的价格,macOS + iOS 两版同时购买也只有Ulysses 三分之一左右的价格。于是在 33% 的 Launch Discount 下,我马上入手了。

我的 Markdown 写作需求

  • 良好的写作环境
  • 多设备同步功能
  • 方便的资源管理
  • LaTeX语法支持

先简单介绍一下 Markdown 语言

Markdown 思维有点像是低配的 LaTeXLaTeX。与 Word 一类传统文本编辑工具的「所见即所得」特点不同,Markdown 语言则是轻量级的「标记语言」,输入的纯文本信息可经由特殊符号标记输出成为富文本信息。下面是一些简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
# 一级标题
## 二级标题
### 三级标题
- 项目A
- 项目B
- 项目C
1. 步骤1
2. 步骤2
3. 步骤3

代码格式:`git clone https://github.com/iissnan/hexo-theme-next themes/next`

插入链接:[Patrick's Blog](patricorgi.github.io)

插入图片:![yantuanzi](http://i.imgur.com/67YuVnf.jpg)
---

经输出后,我们就可以得到这样的打印结果:


一级标题

二级标题

三级标题

  • 项目A
  • 项目B
  • 项目C
    1. 步骤1
    2. 步骤2
    3. 步骤3

代码格式:git clone https://github.com/iissnan/hexo-theme-next themes/next

插入链接:[Patrick’s Blog](https://patricorgi.github.io/2016/11/22/我的 Markdown 写作方案/patricorgi.github.io)

插入图片:yantuanzi


除了轻量级的文本格式化输出,软件本身也是轻量级的,iA Writer 本身只有 12.4M 的体积,从各种意义上都能减小设备的负担。

良好的写作环境

良好的创作环境是必要的,就好比高中时候我们都会迫不及待地在新买的笔记本上记笔记一样,毫不夸张地说,这种新奇感可以很大程度上激发人的写作欲望。

img

我们可以先看看 MWeb,它的功能强大,预置了几乎所有 Markdown 语言的格式化按钮,用户不需要记忆和手动输入比较复杂的 Markdown 命令,就可以进行类似上面的链接和图片插入。它甚至还支持 LaTeXLaTeX 输入和即时预览,这也是我最初看好 MWeb 的原因。

但于我,MWeb 的问题在于它复杂的界面,各式各样不能和谐统一的按钮,以及不能隐藏的标题栏。极简主义表示无法忍受,我更倾向于 iA Writer 或 Ulysses 那种纯白的界面,没错,它们的界面就是一片空白,就像新买的笔记本一般精致优雅,让你有马上在上面进行写作的欲望。

img

我当时向作者发了 Feedback 建议把 MWeb 奇怪的 LaTeX 预览字体改成正统的 Latin Modern Math。然后 MWeb 作者给我的说法「字体定制功能并不是给普通用户用的」,当时我就不开心了,你应该帮助用户解决才对,反过来说用户太「普通」,所以到现在这个问题仍然没有解决。

img

多设备同步

iA Writer 和 Ulysses 都能利用 iCloud 进行多设备同步,还能支持 Dropbox 一类的云盘存储。所以可以随时随地写作、并方便上传手机图片。我们也不需要担心手机端的书写效率问题,因为 iA Writer for iOS 的键盘上内置了一排标记符号的按键,可以快捷输入这些标识符。不知 MWeb 什么时候才推出 iOS 版并实现多设备同步呢,如果这样的话我可能还会再考虑一下它呢。

文件管理系统

或者说外部文档浏览功能,使用静态博客的读者可能会知道,所有的文章都是放在同一个文件夹下的,站点文件夹下有一定的层次结构,如果编辑器能自带树状资源管理器,那读写博客是十分方便的。

面包还是要的

可有时候我还需要输入 LaTeX 公式,这该怎么办呢?方案有二:

方案一:使用 Typora

Typora 是一款免费极简 Markdown 软件,原生支持了 LaTeX 公式的输入,

img

对我而言,公式书写的情况占了少数,所以偶尔用 Typora 替代 iA Writer 书写,或用它来检测 LaTeX 语法是否正确。

Typora 像是一个带有 Markdown+LaTeX 功能的「记事本」,它没有同步功能和文件管理系统,否则它将会成为我唯一的 Markdown 编辑器。

方案二:将公式作为图片插入

如果 macOS 里安装了 MacTeX,那么一定会有个名为 LaTeXiT 的软件,这个软件专注于公式生产。你可以直接键入公式,然后「LaTeX iT!」就能生成公式,可以将其复制或保存为 png 在内的多种格式,然后我们把 png 图片插入 Markdown 文件里就可以啦。

有时候我们安装一个软件,下载到的不是可以直接复制进 Application 目录的 .app 文件,而是 .pkg/.mpkg 安装包。这是类似于 Windows 下的 setup.exe 安装文件,其缺点是无法在 Application 中直接删除应用(.app 文件)来卸载。有一种解决方案是删除它的相关文件及文件夹来卸载它们,但这样的卸载工作繁琐且又不彻底。

因此我们需要一个 pkg 管理工具——pkg uninstaller

安装 pkg_uninstaller

安装它的方法很简单,只需要一条命令

1
bash < <(curl -sL https://raw.github.com/mpapis/pkg_uninstaller/master/pkg-install)

然后在 .bash_profile 里加入路径信息

1
export PATH = $PATH:/opt/pkg_uninstaller:$HOME/.pkg_uninstaller

最后再 source .bash_profile 即可。

使用 pkg uninstaller

  • pkg-list 列出所有电脑上的 pkg 软件
  • pkg-uninstall <PKG_NAME> 用于卸载单个 pkg 软件

配合 Shell 脚本批量卸载

例如我要卸载所有用 pkg 包安装的 ROOT 工具,

1
pkg-list | grep 'ROOT' >> temp.sh

得到

1
2
3
4
5
6
7
8
9
10
11
com.HEPSoft.ROOT.applications
com.HEPSoft.ROOT.c-index-test
com.HEPSoft.ROOT.clang-headers
com.HEPSoft.ROOT.clangAnalysis
com.HEPSoft.ROOT.clangAST
com.HEPSoft.ROOT.clangASTMatchers
com.HEPSoft.ROOT.clangBasic
com.HEPSoft.ROOT.clangCodeGen
com.HEPSoft.ROOT.clangDriver
com.HEPSoft.ROOT.clangDynamicASTMatchers
...

在 vim 中编辑 temp.sh 文件,利用 vim 命令

1
:%s/^/sudo\ pkg-uninstall\ /g

这是在每一行前加上 pkg-uninstall 命令,为防止权限不足,加上 sudo

然后回到 bash 执行 sh temp.sh 即可。当然,最后别忘了删除 temp.sh

hb

HandBrake: Open Source Video Transcoder

对于很多视频编辑者来说,Mac 系统是不可或缺的神兵利器。即使是对普通用户而已,我们也有影音娱乐以及偶尔的上传视频需求,这一般会涉及到以下两个问题:

  1. 视频压制
  2. 视频格式转换

视频压制

视频从拍摄到上传到网站一般会经过这样的过程:视频采集,视频剪辑,视频压制,上传。

我们通过手机、相机采集到的视频的码率远超网页视频的码率。举个具体的例子,iOS 设备采集的视频码率大约在 50 Mbps,相比而言 Bilibili 弹幕网对超清视频的要求上限是 1.8 Mbps,一旦超过这个码率,视频会被官方重新压制(官方压制后的清晰度惨不忍睹)。所以我们必须自力更生压制出适用于 B 站上传的「高质量」视频——码率无限趋近于 1.8 Mbps 却又不超过 1.8 Mbps,以保证视频原有的分辨率和帧率

码率即每秒钟传输的信息量,例如一部动画每秒钟为 30 张画面(30 帧),每张画面大小为 1 Mb,那么该动画视频的码率即为 30 Mbps,低码率的视频具有相对来说更低的视频文件体积大小。

视频格式转换

为什么要统一 Mac 系统下的视频格式?在 Windows 下随手下载一个XX影音就能解决几乎所有类型的视频的解码问题。在 Mac 下也是一样的,但是 Mac 系统有个好玩的功能——快速预览(QuickLook)——在任何文件上敲击「空格」键,可以快速预览文件内容。比如,可以快速预览 PDF 文件每一页的内容,而不需要打开 PDF 阅读器,快速播放音乐文件而不需要打开音乐播放器,快速预览图片自不必说以及快速预览视频。但尴尬是,目前快速预览视频仅限于 mp4 和 mov 格式。因此我们要进行格式转换,使电脑中常用的视频文件格式统一为 mp4 和 mov。

rm

上图为无法预览的 rm 格式文件

Mac 上压制视频的常用方案

上述两款软件均可以进行高质量的视频压制和格式转换,但这里所谓的「高质量」并不是我们想要的「高质量」,而是指压制出来的视频码率仍然很高,超出了 1.8 Mbps 的限制。此外,它们具有 GB 级别的体积,作为 Mac 软件来说实在太大了,就 Final Cut Pro 而言还有很多普通用户用不到的专业功能,完全就是多余。

Handbrake

相较之下 Handbrake 就显得小巧精悍了,它仅有不到 30 MB 的体积。先来看一下它的主界面,不要马上就被它复杂的交互界面吓到,只要记住下面列出的几点即可。即便记不住也没关系,根据下面会介绍例子自己练习一次也就熟悉了。

handbrake1

  • 源文件路径:显示你目前正在处理的文件路径,导入源文件可以通过右上角的「Source」按钮选择文件,也可以直接拖动源文件到 Handbrake 界面下导入
  • 目标文件路径:压制/转换后视频的存储路径
  • 格式:目前有 mp4 和 mkv 两种格式
  • 编码设置:这部分是重点,在下面将会举例说明
  • 画幅设置:这部分是重点,在下面将会举例说明
  • 预览:完成编码设置之后可以通过这里看最终效果,可以预览静帧画面质量以及视频中任意部分 15 秒内动态画面质量
  • 首选项:除了预设的一些模板之外还可以存储用户自定义的「编码设置+画幅设置」

下面按之前提到的两个问题说明它的使用方法。

1. 视频格式转换

把之前无法快速预览的「[国产经典动画.十二生肖的故事].01.rm」文件拖入 Handbrake,然后目标文件设置为桌面,得到

source

进行简单的视频格式转换时,由于我们没有对视频体积、码率的要求,所以只要使用默认设置进行转换即可,直接点击左上的「Start」,等待转换完成就可以了。

转换后的十二生肖动画在 Mac 下可以利用 QuickLook 直接预览,视频预览还可以拖动进度条,占用的系统资源也比较少:

12shengxiao

经笔者测试,在保证相同视频质量的同时,除 mkv 格式的视频之外,其他格式的视频在转换为 mp4 格式后,体积都减小了,统一视频格式的同时还可以省下更多的空间,

wst

如果选择「Add to Queue」,还可以用同一套设置去批量转换视频格式,读者可以自己研究一下。

下面对默认设置里重要的两部分加以说明。

编码设置

encoding

  • Quality
    • Constant Quality: RF 20 这里的 RF 值越低视频质量越高,RF 值在 22 以内就已经具有很高的质量,所以我们按照默认值 20 转换格式即可。
    • Average Bitrate (kbps): 未选择(这在下一部分说)
  • Video Codec: H.264(x264) 选择此项无可厚非,这是主流视频编码器,具有小体积高质量的优点
  • Encoder Options
    • Preset: medium(笔者认为此项是视频压制的精髓,这一项决定了编码的速率,同时也决定了编码的精细程度,速率越快 Handbrake 的压制越马虎,效果越差,速率越慢,Handbrake 的压制越仔细,越能得到高质量低码率的视频)
    • Tune: none(out of film, animation, and so on)

画幅设置(Picture Settings)

picture1

  • 画幅设置中的 Cropping 裁边模式默认为 Automatic 自动裁边,这会起到去除黑边的作用,但有时候我们不需要去除黑边,只要改选为 Custom,然后把下面四个数值都设置为 0 即可
  • Anamorphic 默认下是 Loose,意思就是让视频的分辨率能够自适应为下面数值为「Modulus」倍数的分辨率(比如说 1920×1080,其中 1920 是 2 的倍数),对于 1921.6×1080.9 这样奇怪的分辨率(仍然是 16:9 比例)在 Loose 设置下能自适应为 2 倍数分辨率,即1921.6×1080.9(非 2 倍数分辨率)→ 1920×1080(2 倍数分辨率),可以看出它是会牺牲部分分辨率的,不过 Modulus 倍分辨率将具有更高的压制效率。
  • Filter 里可以设置 decomb 部分反交错和 deinterlace 完全反交错。分别适合部分交错视频和完全交错视频的修正。交错可以简单理解为重影,就像下面这个样子。
    interlace

2. 视频压制

接下来介绍的是 B 站 60 帧超清视频压制的实例。不过首先推荐各位 App Store 一款查看视频文件信息的免费软件 Media-Info。它可以帮助你查看视频文件的所有信息,包括文件大小、时长、码率、编码格式、分辨率、帧率等等。

先用 Media-Info 查看一下将要压制的视频信息

ow
  • Bit rate(码率): 20352 kbps(= 20.352 Mbps)
  • Width: 1600
  • Height: 900
  • *interlace(比较少见,但如果出现了,就需要在画幅设置中的Filter里把 decomb 改为 deinterlace,否则视频压制后可能出现重影现象)
    (对视频压制而言,重要的也就这几个啦)

这是我录制的一个 1600×900 分辨率、60 FPS 的游戏视频,它的码率实在是太高了,直接上传到B站上,肯定会被官方压得不成样子,而且帧率是肯定会被降到 30 FPS,极其影响观感。

我们在默认设置上进行修改,设置如下:

编码设置

  • Quality:一定要改成 Average Bitrate (kbps) 自定义平均码率并勾选「2-pass encoding」,而不是 Constant Quality 玄学码率。因为是平均码率,我们保险起见设置为 1650 kbps,保证视频每一部分的码率都不超过 1800 kbps。「2-pass encoding」即二次压制,对一次视频进行两次压制,好比铺设马路,压路机在铺好的水泥上压过一回之后回头再压一回,使得第一次压制不平整的区域更加平整。如果担心太慢也可以再勾选「Turbo first pass」,这样会使第一次压制快速进行。
  • Preset:设置为 veryslow 或者 placebo。从 20352 kbps 疯狂压制到 1650 kbps 必然会损失大量的视频信息,所以我们必须让 Handbrake 仔仔细细地压制,使视频中结构简单的大色块画面成分尽量压小,结构细致的画面成分尽量保留,挤出视频这块海绵里所有的水分,但是又不破坏海绵中的纤维结构。
  • Tune: 这个可以不改,默认为 none。如果是游戏或动画视频,笔者建议改为 animation。

设置结果如下

encoding1

画幅设置

因为是上传到 B 站的视频,那么其比例为 16:9,因为视频原本就是 16:9 的格式,如果 automatic 有自动裁边我们就要将它改选为 custom,但是这里 automatic 的数值均为0,所以画幅设置里不需要修改任何设置。

picture2

设置结束之后,我们点击「Start」开始压制,这段仅30秒的视频竟然压制了5分钟,可想而知一部90分钟以上的电影在这套设置下需要压制多久了。不过回报也是值得的,视频大小从 87 MB 被压缩到了 8.4 MB。

compressed

这样的视频文件可以保证其 1600×900 分辨率,60 帧的质量,上传到B站后而不会损失任何画质。

结语

存储下自己常用的压制配置到 Presets 里,流程就可以简化为拖入源文件 - 选择首选项 - Start!

done