Chaofan's

Bonvenon al la malpura mondo.

标签: App

  • 在M1上打包一个Electron项目

    Typora开始收费了。作为五年前就开始使用这款软件的用户,感觉非常奇妙,就像一个大家都期待它发生但又觉得它不会发生的事情最后真的发生了。当然,三年前就没有用它了。因为我,真的,不喜欢,Electron.

    此后,我偶然在评论区看到Marktext这个软件。点开主页看,跟Typora有几分相似,下载下来后方才发现,可执行文件是x86_64的,需要Rosetta 2才能在M1上运行。好在是自由软件,Apple Silicon上的Electron也很成熟了,我们可以自己动手。

    不过,肯定有坑。

    第一步:伟大的node_modules

    没有在深夜痛苦地yarn install过的人,不足以谈人生。

    项目的构建步骤还是挺清晰的,在仓库文档里。一个开源项目,如果没有文档指引其他人如何将其编译、运行起来,恐怕只能算半个开源。

    首先我们clone以后,就开始yarn,等等等。然后打开,发现安装超时了。至于原因,懂的都懂。一个解决办法是用nrm切换安装源:

    > npm install -g nrm
    
    > nrm ls
    
      npm ---------- https://registry.npmjs.org/
      yarn --------- https://registry.yarnpkg.com/
      tencent ------ https://mirrors.cloud.tencent.com/npm/
      cnpm --------- https://r.cnpmjs.org/
      taobao ------- https://registry.npmmirror.com/
      npmMirror ---- https://skimdb.npmjs.com/registry/
    
    > nrm use tencent
    
      Registry has been set to: https://mirrors.cloud.tencent.com/npm/

    这里用了腾讯的源。切换之后,安装过程就不会超时了。

    第二步:构建

    没有人比我更懂C++!
    ——一位JavaScript程序员

    然后我们又遇到了新的问题:

    error marktext/node_modules/cld: Command failed.
    Exit code: 1
    Command: node-gyp rebuild
    Arguments: 
    ...
    ../src/cld.cc:9:12: error: no member named 'unexpected_handler' in namespace 'std'
    using std::unexpected_handler;
          ~~~~~^
    1 error generated.
    make: *** [Release/obj.target/cld/src/cld.o] Error 1

    看起来是某个C++代码编译出错了。std::unexpected_handler在C++17里被移除。我本想自己动手修改,不过还是先搜索一下这个包的GitHub仓库看有没有人提过这个问题。好在看最新的提交纪录,这个问题在2.7.1里已经修复。好吧,先手动改yarn.lock好了。

    继续安装,又遇到奇怪的问题,类似:

    name 'openssl_fips' is not defined while evaluating condition 'openssl_fips != ""' in binding.gyp while trying to load binding.gyp

    查看Github issue意识到,是我v17的node太新,那就降级吧。非前端程序员是不配使用高贵的n/nvm/ndenv/nodenv/nodeenv的,只能用Homebrew:

    brew install node@16
    brew link --overwrite node@16 # 小朋友切勿随意模仿

    舒服了……吗?

    第三步:签名

    然后就是惊险刺激的yarn run build release:mac了。

    众所周知,所有运行在macOS上的App都要签名,Electron也不能例外。所以负责打包部分的electron-builder会帮你做这个事情。但是,签名它失败了!

    Command failed: codesign --sign redacted --force --timestamp --options runtime --entitlements ...
    Electron Framework: code object is not signed at all
    In subcomponent: ...

    然后我们发现,出现这个错误是因为App里还有其他可执行文件,我们需要递归签名,也就是给codesign命令多传一个--deep选项。但我们不好手动调用codesign,只能魔改node_modules,找到用来签名的代码(‌node_modules/app-builder-lib/electron-osx-sign/sign.js):

    const args = [
      '--sign', opts.identity.hash || opts.identity.name,
      '--force',
      '--deep' # Add here
    ]

    重新构建。Build目录里就会产生打包好的zip和dmg文件。

    第四部:公证

    Time and time again, I asked you.

    为了测试这个软件被其他用户下载时能否正常打开,我将打包好的dmg上传到服务器再试着下载,悲剧地发现仍然有提示「无法打开『Mark Text』,因为Apple无法检查是否包含恶意软件」,然后只能手动在安全性设置里强制打开。这不科学。

    查阅文档后发现,除了签名这一步,macOS上运行的App还需要Notarize(中文意为「公证」),也就是将App打包发送给Apple,运行一个自动化检查,通过公证后的App可以打上标记,这样用户在电脑上打开时就不会有安全性提示了。

    自然,electron-builder也是可以帮你做这个事情的。在项目的electron-builder.yml中加入以下字段:

    build:
      afterSign: "notarize.js"

    如果你的Electron Builder配置文件是写在JSON里的,请把它改为对应的JSON记法。

    然后创建notarize.js这个文件:

    const { notarize } = require('electron-notarize')
    
    exports.default = async function notarizing(context) {
      const { electronPlatformName, appOutDir } = context
      if (electronPlatformName !== 'darwin') {
        return
      }
      const appName = context.packager.appInfo.productFilename
      return await notarize({
        # 请改为自己App的Bundle ID
        appBundleId: 'com.github.marktext.marktext',
        appPath: `${appOutDir}/${appName}.app`,
        # 临时打包用,所以直接填,真实项目里推荐使用dotenv
        appleId: 'MY_APPLE_ID_EMAIL',
        appleIdPassword: 'MY_APPLE_ID_SPECIAL_PASSWORD',
      })
    }

    注意。这里的Apple ID密码应该是你在Apple ID设置中生成的专用密码(如果你在其他平台客户端用过iCloud邮箱,你应该明白我在说什么),而不是你平时用来登录的那个密码。

    好了吗?没有。重新build,的确如我们预期的一般,App被发送给Apple进行公证了。但很快看到错误通知和邮件,告知我公证失败。查看JSON报告,错误信息是这样的:

    {
      "severity": "error",
      "code": null,
      "path": "Mark_Text.zip/Mark Text.app/Contents/MacOS/Mark Text",
      "message": "The binary is not signed with a valid Developer ID certificate.",
      "docUrl": null,
      "architecture": "arm64"
    }

    The binary is not signed with a valid Developer ID certificate.

    什么!?我可是给库克交过钱的!你们怎么能这样对我?

    冷静以后,我发现是用来签名的证书类型不对。通常来说,如果你之前只用过Xcode提交过App到Mac App Store的话,证书类型应该是Apple Distribution;而要在Mac App Store之外以dmg包发布App,签名的证书类型应该是Developer ID Application,所以需要找Apple重新签一个。

    按照这篇文档的说明,用本地钥匙串生成一个证书颁发请求。然后登录到Apple Developer,进入Certificates选择创建新的Certificate,类型选择Developer ID Application,点击上传前面生成的证书请求文件。然后我们就得到了一份新的证书,点击导入钥匙串。

    根据Electron Builder的文档,我们可以在环境变量里指定用来签名的证书ID:

    # 在钥匙串里找到对应的证书名字
    export CSC_NAME="YOUR_NAME (CERT_ID)"

    大功告成。

    顺便,因为Marktext的图标一直没有改为Big Sur的圆角正方形设计,我也自己改了一个。

    你可以在这里下载。只有arm64的版本,因为它已经很大了,Universal会更大。图标在这里下载。

    更多阅读

  • Reeder 4 初体验

    今天一早上就看到消息说 Reeder 4 终于正式发布了。作为一个在 App 领域啥便宜都捡的人,Reeder 3 免费时我第一时间就从 App Store 下载了 iOS 和 macOS 两个版本。然后为了试着玩,就尝试加了 RSS 源,然后为了多设备之间同步开始使用 Feedly 和 Inoreader……慢慢地自己订阅的源越来越多,也越来越觉得 RSS 这种伟大发明不应该如此死去。

    入 iOS 坑以来,在各类媒体的推(忽)荐(悠)之下,买过的 App 也不少(当然和大佬比更不算多)。不过只有 iA Writer 和 Reeder 感觉每天都能用上,非常值的。(iA 的 mac 版 200 块,还是有点贵)所以也果断入了 Reeder 4 当补票,也想看看拖了这么久的新版本有些啥功能。

    Reeder 4 Articles List
    Reeder 3 Articles List

    首先是界面的重新设计。Reeder 4 的风格明显更加……iOS 11 一点。Reeder 3 的 iOS 版其实已经相当扁平了,macOS 端在很多界面上还留有那么点早年苹果的味道。动画的速度感觉上 4 比 3 慢一点,不过也很自然。右划已读,左划收藏的手势依然保留。按住文章可以选择上面或下面的全部已读这个功能也还在。

    那个 Reeder 的代表性设计做了下改动:在 iPad 上,在文章界面向右划,文章列表会直接被弹到最右,整个文章界面都会被覆盖。虽然对新用户看起来可能直觉上合理那么一点,但是还是……挺不习惯的。

    Reeder 4 Article View

    标题字体变大了,正文字体变小了,默认字体还是苹果自己设计的 San Francisco,不过都是可以设置的。这标题大小在 iPad 上还合适,在手机上有些大了。

    下面一栏多了几个按钮,除了已读/未读、收藏/取消收藏、下一篇和分享按钮之外,下面多了 Read It Later、获取全文和 Bionic Reading 模式。Read It Later 简单来说就是把它加入到一个自己的稍后读列表里面,用 iCloud 同步的,如果你用苹果全家桶搭配 Reeder 还是……有点方便。(不过为什么不用 Pocket 呢?)获取全文功能比上一代几乎残废的 Mercury Reader 强了不少,但还是不如 Safari/Firefox 自带的阅读模式,比如有些文章就没法处理分页而只能显示第一页。最后这个 Bionic Reading 大约就是把文章里的一些部分加粗以便更好阅读,但其实我也没明白它的逻辑到底是抓文章重点还是单纯从视觉上考虑,反正对中文用处应该不大……

    支持的源基本上没变,有 Local,有上面说的基于 iCloud 同步的稍后读,有 Inoreader、Feedly 等若干平台,还支持自建的 Fever API,这一代还多了对 Google Reader API 的支持。(听说 Reeder 早期就是靠 Google Reader 客户端起家的)

    有用户抱怨原来的缓存图片功能没了,我用得不怎么多,因为不经常坐飞机……目前的 4 在 iPad 上特别是横屏的时候比较容易卡死。听说这位开发者比较高冷,不知道什么时候能好好修下 Bug……

    总的来说,如果你是个 Reeder 的老用户,再补个票支持一下也挺好的。如果你想入坑 RSS……好吧 Reeder 3 已经下架了,你也只有买了。或者尝试下 Inoreader 也不错。(好像国区没有?)时代变了,用 RSS 也成复古行为了。真不知道,是世界太浮躁,还是我们太骄傲?

  • 效率软件杂谈

    说起来自己几年来用过的效率类 App 也不少了,尽管自己很难坚持,不过倒是有个喜欢折腾的习惯,从早年的 Linux 到现在的效率软件。正好好久没更新博客了,就随便对它们说说自己的看法。

    效率类 App 的外延很大,从代码管理到任务规划,只要是能够提高工作、学习效率的软件,都可以划入效率这类范畴。不过,我们日常看到的多数效率软件无非都是写作、协作和日历事项。我想一方面是因为它们的开发门槛较低,不需要什么额外的领域知识(想想前端框架都用 TODO-List 做 Demo,搞个能用的并不麻烦);另外一方面,大众用户都需要这类软件,除了我等喜欢倒腾比较它们的爱好者之外,还有大量的用户此前从未接触过(仅因为一些偶然发现的小功能就感叹生活质量提高了),他们也完全是潜在市场。当然,用过一些雕琢不够细致的作品也会发现,要把它们做好,也不是那么容易的。

    奇妙清单

    奇妙清单是相当老的 TODO 列表软件了,对普通用户几乎免费。早期对一些要求团队协作的高级功能收费,被微软收购以后就停止高级功能和收费,但也不再更新了。奇妙清单的一大亮点在于全平台支持,从 iOS 到 Windows 乃至 Windows Phone 通通有 App,并且桌面端也是原生,实在不容易。(其实让几个 iOS 程序员兼任开发 Mac App 的任务也不会很难,满大街的 Electron 和 nw.js 实在影响体验)

    Wunderlist Sample

    如果之前没有过使用这类 App 习惯的话,奇妙清单在一开始可以有效地帮助自己捋清今天要做的事情。但它的功能实在有些单薄,不明显的子任务入口,缺乏记录和统计功能,实在让它只能安心做一个清单应用。无独有偶,最近兴起的一系列 App,从 Bear 到 Agenda,都将任务列表和笔记功能糅合在一起。尽管在提醒上有些欠缺,不过每填工作上都要主动查阅修改的记录,实在不需要严格的提醒。需要的,交给自带的提醒事项就好了。后面要提到的 Emacs 中著名的 org-mode 也基于这个逻辑。尽管它也可以用来记笔记、写文档,但如果一点都不用上它乍看奇怪却又灵活强大的 TODO 功能,总觉得会缺了些什么。

    当然了,任何软件都只是辅助提高工作生活效率的工具,改变自己的工作、学习节奏也一定是一个系统化的、长期的过程。寄改变生活方式的希望于某个软件并不现实。奇妙清单的功能并不复杂,容易上手。如果你此前没有太多折腾数字化工具的经验,可以将它作为入口,管理生活并进一步探索适合自己的方法体系。即使日后你认为它管理任务功能不足,至少作为购物和杂事清单还是不错的。一直都有传言称奇妙清单要倒闭或者停止运营,不过它大概还会在目前的状态下运营较长一段时间。即使要关闭服务器了,因为它提供了完善的 API,所以在发布通知之后,你也有足够的时间一键将已完成和未完成的任务列表转移到其他应用(比如 Todoist)中。当然,微软收购团队之后推出的 Microsoft To-Do (目前尚无 Mac 版)也是一个不错的相似选择。

    Ulysses

    某种程度而言 Ulysses 不算本文想描述的效率软件,不过实在有很多人推荐过它(包括后面的 iA Writer),所以也值得谈一谈自己对它的看法。Ulysses 是一个有相对久远历史的文本编辑器(好吧,有很多人习惯称呼它写作软件),提供了编辑 Markdown XL(一个扩展的 Markdown 语法)文本和管理文档等一系列功能。如果谈及 Mac 上辅助写作的软件,一定会有人提到 Ulysses,足以说明它在诸多 Mac 用户心中的地位。当然,Ulysses 也有 iOS 版本(尽管第一代 Ulysses 发布的时候好像还没有 iPhone),并提供基于 iCloud 的同步。

    Sample of Ulysses (From Web)

    我不是 Ulysses 的深度用户(使用 Ulysses 写的字数应该不超过 10000),体验它也主要是因为 SetApp 提供的试用机会。不过它的可定制主题、可定制 Markdown 语法、打字机模式、流畅的写作体验和文档管理等确实令人印象深刻。打开一个全屏界面很容易让人产生写点什么的冲动。(尽管用键盘而不是笔写作长文还是一个需要适应的过程)iOS 版界面相对简单,不过也足以在手机上进行临时的写作工作了。Ulysses 的同步没有使用 iCloud Drive,也就是说保存在文档库中的文档并不是对用户直接可见的(尽管你还是可以在 Mac 上的 Mobile Documents 目录中找到它),这点和 iA Writer 不同,同步也有稍长的延迟。

    用 Ulysses 来书写内容当然是足够的,然而写作本身必然也具备痛苦和苦闷,正如这个软件的名字,尤利西斯。值得一说的是它的价格。曾经的 Ulysses 在 Mac App Store 定价 45$(中国区 298¥ 左右),iOS 版定价 25$(中国区 128¥ 左右),算是普通用户需要的软件里面价格相对高昂的了。(我不禁想起当年花了快 400 大洋入的 Photoshop CS6 教育授权,结果一直吃灰)这个价格见仁见智,对很多人来说就是几顿饭的钱。但是你可能也会觉得,它的功能可替代性太强,几乎能写代码的编辑器都支持 Markdown,Mac 上还有好些开源编辑器——我为什么要用它?另外,我也看到过用户反映,Ulysses 在对较长(数千字)文章进行编辑时会有明显卡顿感。这也算是针对写作的文本编辑器的一个通病。(诸如 VS code、Sublime Text、Vim、Emacs 这样的代码编辑软件中倒是很少看到这种现象)

    不过,随着苹果企图在 App Store 推进订阅制,提高开发者从订阅中得到的分成,越来越多的软件采用订阅制,Ulysses 是其中引人注目的一员。对很多大型软件来说,订阅制是一个相对划算的更新方案(相比于每次出新版本之后再买断),比如 Office 365 和 Adobe Creative Cloud。尽管如此,你还是可以不选择 Office 365 而直接购买 Offce 2016,旧有的 Office 授权也没有任何影响。任何的转型都是麻烦。有些软件的转型给老用户提供了空间,可以照常使用或者优惠升级。不过 Ulysses 做得就比较绝了,尽管花钱购买了的老用户可以优惠订阅,但如果他们升级了版本,就必须在 14 天试用期内更新订阅,否则自己的文章就无法继续编辑;另外,用户的文章也没有好的方式导出。这算是一个极度损毁开发商信誉的事情,你至今在 Mac 和 iOS 的 App Store 里的 Ulysses 页面下,都能看到大量表达愤怒的评论。订阅制和买断制哪个更好,开发者、平台和用户争论至今也没有什么结果。不过自己花钱购买了产品,到头来还是要被开发商牵着鼻子走,这实在是有些可笑。

    Ulysses 现在的价格是 4.99$(中国区 26¥)一月,如果按年订阅则是 39.99$(中国区 218¥)一年,订阅在同一个 Apple ID 登录的全平台可用。如果是学生,可以得到优惠,6 个月订阅是 10.99$(中国区 73¥)。你可以得到 14 天的免费试用。另外,SetApp 也包含了 Ulysses,对于同一个 Apple ID 登录的 iOS 设备上也可用。

    iA Writer

    iA Writer,连同 Byword、Quiver 等在内的一系列写作软件,常被当作是 Ulysses 的竞争者。其中 iA 应该是最贵的,也是最老牌的,历经多个版本变迁。本文即是用 iA 写作的。相比 Ulysses 或者其他软件来说,iA 的可定制性很少——只能从两种等宽字体中选择,字体大小也只有三个等级,颜色主题除了日间模式和夜间模式外也不能调。设置页面可以用简陋来形容。

    iA Writer Sample

    很多人调侃说,自己已经买了的软件,就会想方设法找到它的优点。这话不假。因为潜意识里,对于已经购买的软件,自己就不会把价格纳入考虑因素了。也许对于我,iA Writer 也是这样。每次用 Filco 的红轴键盘和双拼输入法,搭配全屏模式的 iA,写作起来的体验非常好。你可以在 iA Writer 的官网通过视频观看到 iA Writer 的使用方式和界面。

    iA 基本支持 MultiMarkdown 语法,除了基本的 Markdown 标记之外,还有注脚、目录、任务列表、表格和 LaTeX 公式等扩展内容。最新的 iA Write 也加入了标签功能。iA 支持类似 Ulysses 和 Typora 上的打字机模式。同步过程是使用 iCloud Drive,意思是每篇文章其实就是一个 txt 格式的文本文件,并且可以在 iCloud Drive 上看到和用其他编辑器编辑。一开始我有点不满意这个做法,认为类似 CloudKit 的数据库同步方式更加易用和干净。不过 iA 支持新建文档的时候自动使用 Markdown 标题作为文件名,这一点也逐渐冲抵了基于文件的同步方式的不便。不过在处理中文全角标点作为标题时,文件名中的符号会被自动转为半角,这是个小问题。另外,可能因为文本文件本身不大,iCloud Drive 的同步还比较流畅。当然,你还可以选择用 Dropbox 同步或者直接在本机的某个目录下保存文档库,在你能够流畅连接 Dropbox 服务的时候,可能体验更好。iOS 端当然也支持对 iCloud Drive 上内容的编辑,并且甚至可以在里面打开你 iA Writer 目录之外的任何文件(即使需要用户自己操作,我也很惊讶 iOS 居然提供了这种接口)。使用基于文件的方式,即使有一天 iA 开发者作死不让你继续使用了,你也至少可以从目录导出你的所有文件。以 Evernote 为代表的数据库模式和若干编辑器代表的文件模式,实在是各有各的好处吧,也许有一天,会有一个兼具两者优点的应用出现也说不定。

    iA 的另一个优点在于支持 Windows 和 Android 平台。由于我没有用过,这里就不多讲了。缺点包括统计中文文章字数的时候有问题(Bear 也不对,除了 Word 很少有软件能把这事做好的),语法突出不支持中文(如果你使用英文写作,这倒是个很有意思的功能)。目前看来他们也不想把应用改成订阅制。(Ulysses 遭遇到的阻力应该会冲击很多开发者对订阅制打的算盘)他们的博客上每月会发布一篇文章,其中多数跟产品本身没有关系,质量倒是挺高的。iA Writer 采取买断制,Mac 版价格在中国区是 198¥,iOS 版在中国区是 30¥。Android 和 Windows 的价格没有看到,似乎 Android 采取了免费下载搭配 App 内购买的方式,Windows 版本可以免费试用,购买价格 19.99$。

    Org-mode

    总的来说 Org-mode 是众多笔记和日程解决方案中比较硬核的类型——没有界面,基于纯文本。当然,最简单的方式也就是最靠谱的方式,虽说 Org-mode 只是一个纯文本界面,不过神之编辑器 Emacs 对它有着绝好的支持。现在的 Emacs 内置对 Org-mode 文件(后缀名为 org)的解析,连带若干快捷键。如果你安装了 Spacemacs,那么功能就更是丰富。

    Example of Org-mode

    所以 Org-mode 到底是什么呢?简言之,类似 Markdown 的一种纯文本标记语法。Org-mode 基于大纲,常被用于笔记和待办事项。你可以切换大纲中任何一个条目的 TODO 状态,或者查看有哪些任务的 Deadline 是今天。不同于分裂的 Markdown,Org-mode 的发展基本都以 Emacs 为主要(几乎是惟一好用的)实现。借助于 Emacs 优秀的扩展性,Org-mode 的纯文本可以说被玩出了花。当然,即使没有 Emacs,用任何一个文本编辑器都可以手动处理 org 文件。而在移动平台上,有 Mobile Org 和 beorg 等 App 基于云盘提供编辑和同步 org 的功能。相对来说,beorg 是比较好用也在持续更新的一款,但就 Org-mode 的「大纲」本质而言,beorg 做得还不够,其团队思路更像是把它当作一个提醒事项和日历管理软件。

    Evernote

    Evernote 的出现早于大部分现存的电子笔记软件,以至于说起笔记软件,很多人第一时间想到的都是 Evernote,或者它的中国版,印象笔记。Evernote 带有基于笔记条目的同步功能,以笔记本和笔记本集(Stack)组织笔记,同时也具有扁平化的标签系统和搜索功能。Evernote 自带的编辑器对非技术人员来说应当很亲切,容易想起熟悉的 Word。不过如果用得稍微多些,就会发现这个编辑器实在是乏善可陈,基本的富文本编辑没做好,也没有类似 OneNote 一样的语义化文档结构(一级标题、二级标题、引言……),更勿谈 Markdown 支持这种功能了(尽管有马克飞象这类第三方 App,现在印象笔记也支持了 Markdown)。

    Evernote 和印象笔记的一大优势在于,多年的发展使其拥有了一个良好的生态圈,很多应用都支持将内容直接发送到 Evernote。另外,Evernote 还有用一个强大的 Web Clipper 插件,能够从网页中抓取正文自动保存到笔记本中,这也就是很多人说其「善于收集」的原因之一。不过从这个角度,Evernote 更像是一个云端同步的文档库,而不是全功能的笔记软件。从这个角度出发,也许一个具备全文搜索功能的文档管理软件也可以部分取代它的作用。

    Evernote Sample

    Evernote 和国内的印象笔记都可以免费使用,不过免费用户有诸多限制,比如一个月同步流量不得超过 60M(如果你同步的基本都是文字,这个数量倒是基本够用),只能同时两个终端登录,以及不可以使用在 PDF 内搜索等高级功能。付费采用的是订阅制,印象笔记的个人用户有标准版和高级版两个付费级别(Evernote 似乎只有高级版和企业版之分),标准版把每月流量提升到了 1G,不限制终端;高级版每月流量 10G,并且加入了一些高级功能。国区的印象笔记和 Evernote 是完全不同的两个账户体系,甚至可以用同一个邮箱注册 Evernote 和印象笔记两个不同账号。Evernote 高级版年付 5.83$ 一月,月付 7.99$ 一月。印象笔记标准版年付 8.17¥ 一月,高级版年付 12.33¥ 一月。

    需要注意的是,自 2018 年 8 月起,印象笔记已经从 Evernote 国际版独立出来。中国区的 App Store 只能下载印象笔记,而外国区只能下载 Evernote,图标也不一样了。Markdown 等新功能仅限中国版独有。Evernote 国际版的经营状况不佳,时常有裁员的消息,不过国内版还是暂时不用担心倒闭的问题的。由于监管原因,国内版的印象笔记是不支持笔记分享功能的。

    OneNote

    OneNote 是微软出品的笔记软件,据传其历史可以追溯到 docx 格式出现之前的 2003 年,最开始是作为 Office 套装的一部分销售的。一开始,OneNote 是一个像 Evernote 一样的电子笔记本,并且针对企业内部协作的场合进行设计。(一开始我还没有意识到为什么企业内部会需要一个笔记软件,直到后来我知道了传说中惹得天怒人怨的 Lotus Notes)不过实际上,OneNote 的使用体验让它比 Evernote 更像是一个现实生活中的笔记本,而不是数字资料集。

    Example of OneNote

    OneNote 采用了三层结构,从笔记本到节再到页,而页可以像书的章节关系一样无限划分出子页。这样的结构相比于 Evernote 而言明显具有更强的结构性,适合写书或者课程笔记一样的场合。但 OneNote 实在是太过自由,每个笔记页都可以有若干个像白班上的贴纸一样的块,每个块都可以自由移动甚至和其他的块重叠。这很像真实笔记,不过对单纯想数字化输入和保存一些东西的强迫症来说,这反而是个不便之处。(想想 Markdown 为何如此流行,它在富文本面前到底有何优势?)手写的内容和公式、录音等等可以随意插入笔记页的各个角落。手写和图片内容甚至可以被搜索(Evernote 高级版也有这个功能,没有比较过哪个更强大)。如果你没有类似的强迫症且从接触电脑以来就习惯 Office 软件的界面,那 OneNote 是很适合的笔记解决方案。

    不过笔者还是倾向于把 OneNote 单纯作为一个数字笔记本。OneNote 为平板和手写笔做了很多适配和优化,搭配 iPad 和 Apple Pencil,书写的体验非常舒服。如果你用 Surface,也可以好好试试。毕竟,相比 iPad 生态下的其他手写和录音笔记软件,OneNote 完全免费(只要你 OneDrive 还有足够空间),还是大厂出品,更新频繁,为什么不用呢?很多人抱怨 OneNote 同步速度慢,除了微软服务器和本地网络的原因之外,很可能也是因为 OneNote 是按照节为单位进行同步的,笔记稍丰富一些一次同步就可能是十多 MB,不光慢还是流量杀手。OneNote 的另一个大问题是关于默认字体的,在 Mac 和 PC 上谁用谁知道。

    Bear

    Bear 是苹果生态下的一款书写和笔记软件,荣获 2016 的 Mac 年度最佳 App 大奖。Bear 令人惊讶的是它的简单风格和明显经过设计的界面。默认的 Avenir 字体在外行眼中的第一感觉就是「洋气」。无独有偶,Bear 也没有使用 Evernote 风格的富文本编辑器,而是在 Markdown 基础上做了些小修改作为自己的语法,以每篇 Markdown 文本作为笔记条目。(可以打开「Markdown 兼容模式」)

    Bear 既不像一些文本编辑器一样不刻意突出 Markdown 元素,也不像 Typora 一样所见即所得,而是在文本中突出了样式。有很多人可能不喜欢这样的编辑器,但它可以帮助很多不熟悉 Markdown 格式的人慢慢上手。

    Sample of Bear

    Markdown 不是一个陌生的东西,Bear 除了界面上的美观之外,在笔记的组织方式上也有创新之处。传统的笔记软件,比如 Evernote,试图把现实生活中的笔记本映射到软件中,创造了「笔记本」这样一个概念,和笔记条目构成一对多的关系,然后为了多元化组织方式的需要,每个笔记可以有若干个标签,标签和笔记构成多对多关系。Bear 则直接放弃了笔记本这个做法,全部使用标签。除了每个笔记可以有多个所属标签之外,标签还可以层层嵌套,比如 job/code 就意味着 job 标签下的 code 子标签,一个以此为标签的笔记既可以在 job 下也可以在 jobcode 下找到。看似有些偷懒,实则打破了到底要创造哪些笔记本这一难题。书写体验这个事情,见仁见智,不过很多人把 Bear 当作轻量任务管理工具,或者做为增强版的备忘录。Markdown 用以写作当然很棒,但用来做知识管理就有些捉襟见肘了。

    Bear 采用了苹果推荐的订阅制模式,如果不订阅依然可以单机使用软件,但无法同步、使用高级主题和导出至更多格式。但它的同步基于 iCloud,所以目前也只支持 iOS 和 macOS 设备。不过这个把依赖苹果 iCloud 服务作为收费功能点的做法,严格来说似乎违反了苹果的规定。Bear 现在的价格是 1.49$ 一月初次附赠一周(中国区 10¥),14.99$ 一年初次附赠一月(中国区 103¥)。Bear 的团队来自意大利,主要成员只有 3 人(最近好像增至 6 人了),虽然不用担心它倒闭,但更新速度的确不快,Web 版也遥遥无期。

    WorkFlowy/Dynalist

    这两个软件属于笔记型软件中的奇葩,不是传统的所见即所得或 Markdown 文本,而是采用大纲的形式组织数据。WorkFlowy 算是这类软件的始祖,每个用户一打开就只有一个文档,没有办法新建和管理。文档可以是无限层级的,并且可以采用「聚焦」模式,即把大纲中某个节点作为当前视图的根节点。以此方法,用户的所有数据都组织成一棵树。WorkFlowy 并没有提供更多更复杂的功能,在大纲和聚焦的基础上,用户可以把某行标记为「完成」(就是打上删除线)或者在某行下方加上注释,用户也可以把常用的某个节点收藏起来方便快速聚焦。WorkFlowy 的功能基本就是如此了。

    Dynalist 相比 WorkFlowy 有一些改进,比如加入了 Markdown 和待办事项支持、支持多文档等。不过最重要的是,Dynalist 的免费版本即可无限创建节点,而 WorkFlowy 对免费用户有每个月 100 节点的限制(可以通过邀请的方式扩容,每邀请一个用户双方都可多获得 100 的每月免费节点)。

    Sample of WorkFlowy

    很多用户在尝试过功能丰富的富文本笔记软件之后可能会觉得基于大纲的方式太过简单,不过多尝试一下就能体会把思维整理得高度结构化的快感。这种模式特别适合于在开展某些项目或者写作文章之前为内容列好提纲,也可以用于组织某些结构化的笔记,比如读书笔记等。不过笔记这件事没有银弹,在其他一些用途上,可能大纲类软件的确是太过简单了。

    WorkFlowy Pro 版本的价格是 4.99$ 一月,49$ 一年。Pro 用户拥有无限的储存空间、备份至 Dropbox、带密码的协作、更改主题等功能。Dynalist Pro 版本价格每月 9.99$,如果年付则是每月 7.99$,包括自定义 CSS、Google Drive 和 Dropbox 备份、无限量创建书签、版本修改历史、Google 日历集成等功能。

    备忘录

    对很多苹果用户来说,备忘录可能才是每天使用次数最多的软件。尤其是 iOS 和 macOS 备忘录间的同步,对多设备用户而言,是个非常有吸引力的功能。备忘录和 Evernote 不同,本身的编辑界面没有明显的样式调整工具栏,在样式按钮下也只有寥寥几种选项:大标题、标题、正文、等宽和序列。但备忘录本身是的确支持带各种样式的富文本的(尽管不如 Evernote 一样完整)。在「编辑」菜单中的「格式」选项中,可以看到,可以设置备忘录内容的字体、大小、颜色、基线、对齐,加删除线,乃至调整缩进。另外,备忘录还支持在笔记中插入待办事项清单——就差个提醒了。

    在 iOS 上,iOS 11 对控制中心的改进可以让用户快速从任何界面启动备忘录;而在 Mac 上,备忘录也几乎是启动最快的笔记软件了。备忘录的同步完全依赖于 iCloud,这意味着只要你的 iCloud 有足够的剩余空间,同步的设备数量、同步流量都不是问题,完全免费。在 iOS 上,备忘录还支持扫描文件导入备忘录。这一功能和 Evernote Scanner、Office Lens 或者扫描全能王等专业应用比起来还是欠了点火候,不过在光线充足的时候已然够用了。如果你更新了 macOS 10.14,系统备忘录还支持从你的 iPhone 或 iPad 上拍摄扫描照片直接导入。

    系统备忘录也是支持从 Evernote 导入的,在「文件」菜单中的「输入」弹出的选择文件对话框里,选中 Evernote 导出的 enex 文件并打开,备忘录就能自动把里面的笔记转换成备忘录的格式放到一个统一目录中。样式可能会有丢失但大体结构还在。不过备忘录不支持导出功能,只能输出 PDF。好在备忘录支持同步其他互联网账号上的备忘录功能,因此你可以用备忘录连接你的 QQ 邮箱或者 Outlook,把 iCloud 或本机上的笔记条目移动过去,以此达到导出目的。不过要注意的是,邮箱账号的笔记本支持的文本格式相当有限,直接移动过去一些样式和链接可能会丢失。

    其他

    除了以上提到的几个(或许大名鼎鼎)软件之外,还有许多(号称)与生产力相关的 App 自己或多或少体验过。

    Simplenote

    Simplenote 如其名,的确简单。整个软件的功能就是,书写纯文本笔记,添加标签,然后同步。你可以选择开启 Markdown 模式,这样你就可以查看当前条目的 Markdown 预览。每条笔记都可以查看历史版本。或许正因为完全依赖纯文本,Simplenote 的同步速度相当快(如果没有连接问题)。目前,Simplenote 支持大部分平台,从 Windows 到 Mac 和 Linux,以及若干移动平台。Simplenote 是完全免费的,运营它的公司是 WordPress.com 平台的母公司,因此暂时还不用担心公司哪天倒闭了的问题。不过 Simplenote 的格式太简单了,连 Markdown 的支持也不是很完整。

    Agenda

    Agenda 给人的感觉像 Bear,也是备受赞誉的后起之秀。相比于笔记或者书写软件,Agenda 更侧重的是任务和日历的集成。每个项目中的单个条目都能连接到日历,同时顺便做做笔记。笔记语法基本和 Markdown 一致,但直接以带样式文本显示。不过 Agenda 目前看来编辑器还不太成熟,容易出现卡顿和样式出错等 bug。Agenda 的更新模式很特别,就像 Sketch 或者早年一些杀毒软件,按年付费,类似订阅制。不过如果停止付费,软件依然可以正常使用,只是得不到新的高级功能更新。对这种级别的软件而言,相比无脑订阅制,这个付费模式看上去更有责任感。目前一年的价格是 163¥,支持 iOS 和 Mac 平台。

    Agenda 的问题在于它的定位。它想统一日历、提醒事项和笔记的功能,但它似乎这几个都没做到很好。类似的应用有 Noteplan,也试图将笔记和日历统一到一起。可我们日常真有那么大「笔记随日历走」的需求吗?

    Dropbox Paper

    Dropbox Paper 是 Dropbox 推出的在线文档服务。这个服务支持用 Markdown 语法书写内容,在网页中也支持对内容进行全文搜索。但它作为笔记而言还是缺少了一些资料管理方面的功能。而且就官方定位而言,Paper 更像是 Google Docs 的竞争对手,而不是 Evernote 这样的软件。如果你有协作方面的需求,可以尝试一下 Paper,产品体验还不错。

    Typora

    Typora 不同于很多 Markdown 编辑软件——它成功地把所见即所得特性和 Markdown 的「干净」整合到了一起。在编辑器里打出两个星号,后面的文字就会自动变成粗体。在边界处按退格键删除字符时,删除掉的也不是粗体字而是星号。Typora 目前免费,作者曾宣称到正式版会开始收费,但正式版目前看来遥遥无期。Typora 跨主要的桌面平台,支持比较复杂的 Markdown 扩展,包括 LaTeX 公式、表格、目录等。另外,它还支持更换主题,自己把对应 CSS 放到指定目录就好。Typora 是一个优秀的 Markdown 编辑器(如果你喜欢这种 WYSIWYG 风格),尽管处理大文件时还是有明显卡顿感,但作为笔记软件,还是有所欠缺,一在文档管理,二在多端同步。

    生态

    计算机诞生的最初目的即是帮助人提高解决问题的效率,从 DOS 时代到今天,各类效率软件层出不穷,大名鼎鼎的也不少见。像 Things、OmniOutliner、OmniFocus 等软件本文没有一一介绍,读者有兴趣可以自己发掘。

    如果你平常主要使用的软件基本是 QQ、微信,那么用什么手机和电脑对你而言不会有太大影响,因为这些软件对多个系统都有良好的支持。(Linux QQ 和 Windows Phone 看来要除外了)但如果你接触这类效率软件比较多的话,就会很容易被某个平台所绑定——即使认为它贵或者对它不满意,也不得不继续使用,因为数据都放在这些软件和服务上面。

    所以,在选择软件时,除了软件本身的体验和功能之外,还得考虑它们的可迁移性。一般来说,自己提供后端存储的软件都具备网页界面,所以都可以跨平台。但反过来,这些服务的寿命几乎不会超过苹果、微软、Google 等巨头,维护人员的技术也不会有它们的高。如果数据能够存储在这些提供个人云盘服务的服务器上,可能更加可靠。一部分软件客户端是跨平台的,在更换手机或电脑的时候不用过分担心。但对于一些只在某些系统上有版本的应用(苹果生态居多),就要着重考虑它们是否有方便的导出功能了。基本上,数据和应用在一个生态里融入越深,要迁移出去的成本就越高,这是难以彻底解决的矛盾。

    没有一个软件能够让所有人满意,也许理想的笔记形态离我们还有一段距离。不过如果你有空反思过滤每天收到和发出的信息,勤整理笔记本,也许会发现对信息处理工作流的热忱,只是种没什么必要性的狂热。购买正版软件提高效率是好的,但它并不等于数字消费主义。

    毕竟,软件不是最重要的,作品才是最重要的