2023-12-13 10:08:49
OmniFocus 4 即将发布!在我多年管理我的待办的过程中,我尝试过 Todoist、滴答清单、Things、Sorted 等等几乎所有市面上的 TODO 软件,但最终,OmniFocus 终成我一直以来的最终选择。而谈及 OmniFocus 的强大性,不得不提的就是他强大的自动化能力 —— Omni Automation。
Omni Automation 实际上是基于 JS 脚本的,而编写纯 JS 脚本的过程…… 一言难尽。虽然 Omni Automation 官方提供了 TypeScript 的定义文件,但一方面难以做好类型检查,另一方面其详尽程度仍有待提升(长久不更新、大量使用 any 等),此外,由于缺乏打包工具,代码逻辑的复用也显得颇为困难(我甚至很长一段时间都是靠着 Mac 版本 OmniFocus 的一个 bug 实现的逻辑复用)。
为了庆祝 OmniFocus 4 的面世,我决定将我个人开发并使用的方案整理开源,包括打包脚本和类型定义,还有我使用的一些工具函数及脚本,希望可以让更多人能够愉快地编写 OmniFocus Script。
pnpm install
安装依赖项pnpm build
构建脚本脚本源码放在 src
目录中,编译结果(可被 OmniFocus Scripts 使用的)放在 dist
目录中。
src
目录内的任何不以 _
开头的 TypeScript 文件都将被视为 OmniFocus 脚本并编译(_
开头的脚本文件被保留用于工具函数)。
任何脚本都必须遵循以下模式:
1 |
export const action = new PlugIn.Action(function (selection) { |
其中:
action
和 meta
是必需的,action.validate
是可选的meta
必须是脚本的最后一部分。它之后不可以有任何内容。运行 pnpm build
,构建后的脚本(以 .omnifocusjs
结尾)将被放置在 dist
目录下。
你可以直接将 dist 目录中的脚本拷贝到 OmniFocus 的脚本目录,也可以利用脚本进行同步。
如果你使用 iCloud 保存 OmniFocus 脚本,可以直接使用 pnpm sync
自动将构建好的脚本同步到 iCloud 中的 OmniFocus 脚本目录;如果你不使用 iCloud 而是使用了自定义路径,可修改 sync.sh
文件改变目标路径。
此方案我个人已用一年有余,但一方面开源版本可能有些错误,另一方面可能有更多的定制化需求。
欢迎进入 仓库 页面提交 Issue 和 PR!
2023-12-12 06:29:38
基础规则:
在 Go1.20 及之前:
在 Go1.21 及之后:
特殊注意:
https://github.com/singee-study/go-init
2023-11-25 17:13:06
看到了 FeedbackTrace 这个项目,看起来不错,但是我不会去使用,一个主要的原因就是它没有公布定价。
如果去选择一个一个直接面向 C 端的第三方产品,我一定会选择已经有了明确定价的 —— 否则我将承担巨大的未来的风险。如果未来定价不满足我的预期,我需要去考虑怎么迁移数据、怎么抹平用户体验差异等,一方面可能带来不确定的时间成本,另一方面可能产生糟糕的终端用户体验。
面对公测期间的价格和上线后不一致的做法,各个产品有各个产品不同的思路,最统一的就是降价后下一期账单自动降价、涨价保持原有价格不变或至少保持原有价格一定时间。特别的,Rewind 在 Early Access 期间的策略是调低定价后为历史订单全额退款、调高价格保持用户的原有价格不变,而 ChatGPT 的策略则是调低定价后给予用户差额价格退款并给予额外补偿。
多说一句,公测免费并不是不预先提供价格点的「借口」,完全可以预先告诉哪些是付费点但是公测期间可以免费使用(例如 Omnivore 明确在文档中说明了它的哪些功能未来可能是收费的)。
因此,我的产品,也一定在最初就给出一个收费点定价方案 —— 哪怕不够完美。大体来说,我会提前将价格和收费点列明,公测期间可以免费使用收费功能(或部分收费功能),而预先开始订阅收费版本的用户(即早期支持者)承诺未来如果存在价格调整他们一定可以「使用最低且不高于现有的价格得到最多的服务」。
2023-10-27 07:48:02
最近在一个自己的小 Side Project 中使用了一下 Server Action,感受大概是
综上,全栈项目玩玩可以,其余的…没啥必要
2023-09-21 09:31:41
在 Swift 上,执行一个异步的函数大体上有两种办法
Swift 同时支持多线程和异步,因此
在队列层面,存在优先级的概念(在 Task 中叫 priority,在 DispatchQueue 中叫 qos)
main 同时隐含着两个概念:main thread 和 main queue,事实上无需特意区分(可以认为只有 main thread 才有 main queue,而 main thread 的不同 queue 之间并无特殊区别)
main 的主要用处在于其是直接和用户交互的,只有在 main 才能修改 UI、如果 main 繁忙用户会感觉到 UI 刷新卡顿
Task { @MainActor
DispatchQueue.main
注意,Task 的 @MainActor 实际上并不是让闭包代码在 main 执行,而是让其他执行它的 concurrency-aware 代码逻辑在 main 上执行(但是目前存在非 concurrency-aware 的代码,因此可能标记了 @MainActor 实际上仍然是在非 main 执行的,这种时候需要手动切换到 main;不过这种情况 XCode 会有警告,所以不必过于担心)
Grand Central Dispatch(GCD)
libdispatch