I'm TualatriX

Hello! This is TualatriX's blog

Latest articles

PasteNow 1.0 正式发布:剪贴板工具的新选择

今天很高兴和大家宣布我的新产品,它的名字叫 PasteNow,这是一款面向 macOS 平台的剪贴板工具。就如名字所表达的那样,它是一款能让用户便捷地完成「Paste」这个操作的工具。本篇我想好好介绍一下 PasteNow 是什么,以及开发它的背景故事。 开发 PasteNow 的背景故事 PasteNow 是一个剪贴板管理工具,它可以扩展你的剪贴板,从一份变成无限份,通过在后台自动保存你的所有剪贴板数据,改变日常使用或记录临时数据的习惯,使工作效率更上一层楼。 在日常使用电脑的过程中,无论是开发者与代码打交道,还是文字工作者处理文本,还是设计师操作图像,我们都会在有意无意间用到剪贴板,将其作为一个临时的数据中转站去使用。通过「复制」和「粘贴」这两步操作,我们在这个临时空间中保存和读取数据,就完成了对它的主要使用过程。...

SwiftUI Previews 不工作时的一种解法

去年 11 月末,我在写 SwiftUI 代码时,常常遇到 Previews 不工作的问题。用 SwiftUI 就是为了预览方便,因此 Previews 不工作是不能忍的。当时用了一个 Workaround 来解决这个问题,没想到今天在 Xcode 12.5 beta 2 又发生了类似情况,之前的 Workaround 依然有效,于是写篇记录。 SwiftUI Previews 不工作的现象是: 省略掉的文字大约是:XXXTests.swift must belong to at least one target in the current scheme in order to use previews 非常诡异,我的这个 XXXTests.swift 明明是隶属于 Tests 这个...

如何正确地使用 Clubhouse

2021-03-06 更新 当你看到这篇文章的时候,我已经不再使用 Clubhouse 了。 最近我手机的屏幕时间被 Clubhouse 彻底夺走了,讽刺的是,这是一款实时语音聊天的 App:它应该是放在后台听,不该占用屏幕时间才对。 在我几乎天天花很多时间打开它、浏览 Room、看看大家都在哪里聊什么或听什么的时候,我想真的很久很久没有一款社交型 App 能如此持续地夺走我的注意力了,这场景很像十年前初玩社交网络时的状态,每天都要不停地刷刷刷。而它更可怕一些:文字照片类社交网络的内容,是会刷完的(当然刷完后也可以去关注新的),而它作为实时的语音聊天,时刻都有人在聊各种话题,有些话题从早聊到晚,换了一波又一波的人,几乎没有停止的可能——就像看电视,只要你想看东西,不停地转台就可以了,上百个频道任君挑选。...

谈谈如何合理地为 App 与 Web 项目制定维护计划

上周我有两项工作内容是和产品维护有关的,刚好一个是 App 项目,一个是 Web 项目,每个项目都遇到了一点问题,于是借此我决定好好梳理一下如何为 App 与 Web 项目制定合理的维护计划,让项目能在持续良性运作与节省维护成本之间找到一个平衡。 App 项目的维护计划 我的 App 项目就是我发布于 2013 年的 macOS 桌面效率工具——Manico,目前它的最新版本是 2.8.1,更新于 2020 年 12 月,目前可以运行在 macOS 10.12 及以上更新的系统。 作为开发者,我自然希望我的产品可以尽可能多的运行在更多的设备与平台上,因此它支持 macOS 10.12,这个发布于 2016 年,整整五年前的操作系统版本。 然而过去几个月,大概是 macOS Big Sur...

使 Django 在搜索 Char 类型的 ArrayField 时不区分大小写

很久以前用 Django 做的一个外包项目,我用了 PostgreSQL 的 ArrayField 套 CharField,非常方便的实现了基于 Tag 的搜索。最近客户反应了一个小问题,问能不能让搜索 Tag 时可以不区分大小写,我简单的研究了一下,发现是可行的。 首先,这个 Field 是这样定义的: tags = ArrayField(models.CharField(max_length=32), blank=True, null=True, verbose_name="标签") 然后,搜索时是这样调用的: queryset.filter(tags__contains=[query]) 问题来了,用这种方式,不仅没办法实现不区分大小写的搜索,甚至 Tag 必须得全匹配,少输一个字母都不行。所以,要如何实现搜索时不区分大小写?很简单,在搜索时改成这样的代码即可:...

如何判断 SwiftUI Previews 环境以条件运行相关代码

最近在写 macOS 产品,不知道从什么时候开始,在 Xcode 里进行 SwiftUI Previews 时会把 App 也跑起来,导致总是打断我写 SwiftUI 代码。从 Xcode 的视角就是,它执行 SwiftUI Previews 的过程中,把 AppDelegate 给完整地跑了一遍。 我去测试了之前用过 SwiftUI 的两个项目,发现也是这样。但是我新建的干净 Xcode 项目,无论是 AppDelegate 的 Life Cycle 模式还是 SwiftUI 的 Life Cyle,却没有这样的问题。 在我找到真实的原因之前,我用了一招 Workaround 解决了这个问题,那就是利用环境变量XCODE_RUNNING_FOR_PREVIEWS 来判断是不是 Xcode...

用 SwiftUI 在 macOS 下实现全尺寸的窗口内容

一周前,我在用 SwiftUI 做 macOS App 的时候,发现了一个兼容问题:即实现全尺寸窗口内容在不同的系统版本和不同的 Xcode 版本不一致的情况。 简单地说,我有一个开启了 Full Size Content View 的 NSWindow,通过 NSHostingController 的形式载入了一个 SwiftUI View,但是效果并不一致。有的搭配是 Full Size Content View,有的搭配却不是: Big Sur + Xcode 12.1:正常 Catalina + Xcode 12.1:不正常 Big Sur + Xcode 12.2 beta 3:不正常 Catalina + Xcode 12.2 beta 3:不正常 正常的情况...

SwiftUI:如何通过 Mask 做不规则图形

在创建自定义 UI 的时候,View 常常会是非矩形的窗口,最常见的就是圆角矩形了。还有一种情况是不规则的图形,比如缺了某个角,或中间镂个空。在 SwiftUI 下做这个,可以说是非常方便的。 假如我们在要在一个矩形里镂一个圆形,只需要这么做: import SwiftUI func HoleShapeMask(in rect: CGRect) -> some View { var shape = Rectangle().path(in: rect) shape.addPath(Circle().path(in: rect)) return shape.fill(style: FillStyle(eoFill: true)) } struct...

初探 App Store Connect 的 API:获取销售数据

假期的时候想做一个 iOS Widget,显示最近 App 的销售数据,于是玩了一下 App Store Connect 的 API。记录一下过程,以供后续回顾和加强。 如何调用 App Store Connect 的 API 该 API 是通过 JWT 验证的 Rest API,我用的编程语言是 Python,处理 JWT 验证的库是 @lepture 的 Authlib,使用起来非常方便。 代码大概如下: def create_token(private_key_id, issue_id, auth_key_path): header = { "alg": "ES256", "kid": private_key_id, ...

Moment 1.1 发布:支持自定义进度

Moment 是我和 @creativewang 联合开发的一款面向 macOS 的新产品,在六月份的时候发布了 1.0 版本,还没有在 Blog 上介绍过。今天,趁着 1.1 版本的发布,在 Blog 正式介绍一下它。 Moment 是什么? Moment 是一款设计美观、快速小巧的倒数日期、进度跟踪的 App,通过入驻在 macOS 的菜单栏的形式,让大家方便快捷地查看重要的日期、时间 Deadline 等。同时,它也具备原生的体验和贴合系统的设计。 截图是运行在 macOS Big Sur 下的 Moment,具备日期、进度倒计时跟踪的功能。 比如用户可以创建一个未来的日程,了解现在距这个日程还有几天,还可以设置提醒,让 Moment 在这个日程迫近的时候来提醒你。 它的一个特色功能是,单个日程可以加到菜单栏上,于是可以随时看到当前的进度,而不必打开主界面才能看到。...

Discover, share and read the best on the web

Subscribe to RSS Feeds, Blogs, Podcasts, Twitter searches, Facebook pages, even Email Newsletters! Get unfiltered news feeds or filter them to your liking.

Get Inoreader
Inoreader - Subscribe to RSS Feeds, Blogs, Podcasts, Twitter searches, Facebook pages, even Email Newsletters!