I'm TualatriX

Hello! This is TualatriX's blog

Latest articles

谈谈如何合理地为 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 在这个日程迫近的时候来提醒你。 它的一个特色功能是,单个日程可以加到菜单栏上,于是可以随时看到当前的进度,而不必打开主界面才能看到。...

开箱体验新的 4K 显示器:LG 27UL550-W

前几天,我用了五年多的 Dell P2415Q(24 寸 4K 显示器)无法通过 DisplayPort 转 USB-C 数据线与我的电脑连接了,但 HDMI 接口仍是正常的。然而在我换了新的数据线后,故障依旧,我只能得出结论:DisplayPort 接口坏了。 近期正好也有买新显示器的打算,于是我就先把这台搁置一边,综合考虑了很多之后,购入了一台 LG 的 27 寸 4K 显示器:27UL550-W。把这些发到社交网络后,大家讨论比较热烈,于是我决定把相关信息都整理一下汇总在 Blog 上。 Dell P2415Q 显示器的使用经历 我于 2015 年初花了 3799 元购入了 Dell P2415Q 这台显示器,一直是我过去几年觉得买过最值的一个电子产品,主要是购买后的前几年价格一直很稳定,我也觉得它满足了我对一个...

One Switch 1.14 版本发布:一键「推出磁盘」+「清空剪贴板」

今天我们发布了 One Switch 1.14 版本,这个版本又新增了两个实用的开关,分别是:「推出磁盘」和「清空剪贴板」。让我用图文视频来简单介绍下吧。 推出磁盘 各位使用 macOS 的同学肯定遇到过安装了一堆 App 后,要逐个去推出安装盘。通过 One Switch 新增的这个开关就可以一键推出 N 个安装盘。当然它的本意就是「推出磁盘」,所以假如你在使用外接移动硬盘的过程中,也是可以用这个开关来一键推出的。请看视频演示(YouTube): 清空剪贴板 在 9 月即将发布的 iOS 14 里,Apple 加强了一个机制,凡是 App 读取剪贴板,都会得到提示,让用户知道。但是 macOS 目前还没有这样的机制,平常使用电脑过程中,对数据隐私等比较关心的用户,该如何进行保护呢?这个开关就为这个场景来设计。...

记开始写周报一年后

一年前的今天,我在 Twitter 上看到 @khotyn 的一条推文,感触良多,于是开始了自己写周报的过程。一年下来,从刚开始会懒得写、常常写成「双周报」、「月报」,到过去半年不仅坚持写周报,还专门写周计划。可以说,我已经养成了这个习惯。恰好前一阵子,听说了阿里巴巴有些部门要取消个人写周报的事情,我觉得写周报是一个值得讨论的话题,于是就决定写这么一篇文章,为自己做点总结。 契机 @khotyn 当时发的推文原文是这样的: 写周报其实是一件压力很大的事情,其实周报是在逼迫你做每周的思考。 当时看到后直击内心。因为做为一个自由工作者,我做得不太好,虽然我一直在尝试让自己变得更加自律,但我发现我缺少阶段性的反思。因为我要维护不少项目,于是我长期处在 multitasking 的状态下(这不好,不要模仿),在去年的这个时候,我已经养成记录工作时间这个习惯两年多了,但是,常常还是浑浑噩噩地过完一周又一周,时间花在哪里是有迹可循了,但是如何规划和管理时间,还是很随性,常常不知不觉一头裁进一些事务性的活(比如修...

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!