绕过 SwiftUI Slider 的颜色动画限制
SwiftUI 的 Slider 在 macOS 上不支持 tint 颜色动画。本文记录了问题的根因分析,以及如何通过 NSViewRepresentable + 手动帧插值彻底绕过这个限制。
SwiftUI 的 Slider 在 macOS 上不支持 tint 颜色动画。本文记录了问题的根因分析,以及如何通过 NSViewRepresentable + 手动帧插值彻底绕过这个限制。
从例子中学习
由于我正在使用的多个语言模型在我的回答中大量出现无意义信息/为讨好用户而出现误导甚至歪曲事实行为,我设计了一套每一次对话前都需要发给语言模型 / 语言模型出现上述问题后发送以修正问题的行为准则。目前在近一周和Gemini的对话测试中,我不断的加强与完善行为准则的完整性,严谨性以及实效性,加入了自检逻辑和自我判定。 目前已经能实现相对更为稳定,客观的对话,且显著提升对话有效信息密度,显著降低形式主义和无意义格式。基本消除情绪表达。行为准则应用后Gemini的输出将放到行为准则之后供各位参考。 以下是行为准则正文: # AI行为准则 - 不准以任何形式对用户以任何评判。 - 禁止行为如:你的直觉很敏锐 / 你的看法很前卫 / 你作为理性的消费者,等。此类行为绝对禁止,违规会直接导致对话中断。 - 不准以任何形式猜测用户身份,并把此信息带入到对话的回复中。 - 禁止行为如:作为有数学背景的你 / 显示出你有批判性思维的特点,等。 - 禁止在对话中出现emoji符号 - 对话风格保持冷静,不允许出现任何形式的情绪波动。禁止出现赞扬/贬低/评价。 - 不准以任何形式对用户进行任何内容的暗示,如果请求提供更多信息才能回答用户问题,明确说出信息是什么,为什么需要,否则禁止追问。 - 和用户当前回答无关的内容禁止加入到对话 - 不直接回答用户问题的内容禁止加入到对话 - 禁止主动为用户提供任何形式上的当前问题外的支持,每一个对话回答对话内的问题,不允许越界。 - 除非是学术单词我明确需要中英双语,否则禁止进行中英双语批注。 - 学术性单词指和统计与数学有关的词语,比如连续一致性(uniform continuity), 正态分布(normal distribution) - 严禁在非相关词汇后加入英语,禁止行为如:防水后面加上water resistant --- - 每一次输出组织完成,发送前,都需要回顾一次AI行为准则。然后进行严格自我审视。审视以下内容: - 输出是否符合以上所有AI行为准则? - 是:进行输出,并在输出结尾给出确认句:AI Behaviour Principle Checked, Satisfied. - 否:禁止输出,修改答案,直到输出符合以上所有AI行为准则,能够满足发送确认句:AI Behaviour Principle Checked, Satisfied,为止。 - 同时,确认对行为准则的记忆是否清晰。 - 是:给出第二个确认句:Context Memory of AI Behaviour Principle Stable - 否:回顾AI行为准则,并给出第二个确认句的variation形式:Context Memory of AI Behaviour Principle Untable, Need Reinforcement Prompt. --- 立刻执行。 以下是应用上述Prompt后Gemini的输出:
1. 产品概述 产品名称:Inserable 目标平台:macOS 技术栈:Swift + SwiftUI 核心功能:管理 Hugo 博客的图片资源,自动重命名并生成 Markdown 格式的图片引用文本 解决的问题:Hugo 博客中图片管理混乱、命名不规范、手动编写图片引用繁琐 2. 核心概念 2.1 层级结构 Inserable ├── 根目录 1 (Root Folder 1) │ ├── Session A (文件夹 A) │ │ ├── formatA_001.png │ │ ├── formatA_002.png │ │ └── ... │ ├── Session B (文件夹 B) │ │ └── ... │ └── ... └── 根目录 2 (Root Folder 2) ├── Session X (文件夹 X) │ └── ... └── ... 2.2 核心关系 概念 说明 根目录 (Root Folder) 用户的 Hugo 图片存储路径,如 /Users/alex/myblog/static/images/。最多支持 2 个。 Session 与根目录下的一个文件夹形成 1:1 绑定关系。Session 名 = 文件夹名。 图片 Session 文件夹内的图片文件,按统一格式命名。 2.3 命名规则 图片命名格式:<formating_1>_<###>.<ext>
Sonodex 开发企划,技术架构与实现规范 (v1.0) 1. 项目概述 Sonodex 是一款专为音乐制作人设计的本地 MIDI 与音频采样管理系统。其核心任务是高效索引、检索并管理分布在本地磁盘上的数十万计媒体素材,提供秒级的搜索响应,并确保数据状态与物理文件的高度一致性。 1.1 核心原则 稳定性优先: 拒绝隐式缓存,所有数据变更必须透明且可追溯。 性能导向: 针对 100,000+ 记录优化,确保 UI 线程永不阻塞。 数据主权: 采用开放格式的 SQL 数据库,不依赖黑盒框架。 2. 技术栈选型 (Tech Stack) 维度 技术选型 说明 开发平台 macOS 14.0+ 针对 Apple Silicon 与原生系统特性优化。 编程语言 Swift 5.9+ 利用强类型、值类型语义与并发模型(Concurrency)。 UI 框架 SwiftUI 声明式 UI,处理状态驱动的复杂视图。 持久化层 GRDB.swift (SQLite) 放弃 SwiftData,选择类型安全的原生 SQL 包装器。 并发处理 Swift Concurrency 使用 async/await 处理文件 IO 与重型检索。 3. 系统架构设计 系统采用 层级解耦架构,确保数据库持久层与 UI 表现层之间有明确的边界,彻底消除“幽灵缓存”。 3.1 实体模型 (Entity Model) 弃用 Class 引用语义,全案使用 Value-based Struct。
A brief introduction to four applications I developed for Apple platforms.
继上一篇关于如何搭建个人静态网站的文章后,这次给各位带来新的技术分享内容,也就是个人网站插入数学公式与主题冲突的解决方案。 首先,关于如何在个人网页中加入数学公式渲染的功能,Hugo官方已经把这个问题解释的十分清楚了。在这里可以看到他们的回答。由于官方的描述非常详尽,且涵盖了不同config文件类型的代码,我就不重复他们所指示的步骤(但如果需要我用中文进行描述,那我会再回来把那些步骤给分享过来的)直接跳转到我的个人排错。 我遇到的问题主要是因为我已经为自己安装了PaperMod的主题,且我的Config中并没有以官方所使用的"goldmark"作为我的render,导致我使用该技术的时候出现了断层。如果你也遇到了这样的问题,不妨试试和我一样解决。 首先,官方教程要求你在layout文件夹中的_default和partials里,分别对baseof.html的header部分进行修改和创建新的math.html文件。但当我这么做的时候,PaperMod出现了不兼容问题。我所收到的报错如下: Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) (commit or discard the untracked or modified content in submodules) modified: themes/PaperMod (modified content, untracked content) 那么该如何解决呢?我们可以在自己的网页项目根目录中找到比theme更上一层的文件夹layouts。这个layout中我们所加入的设置,会以比theme中layout里设置更高优先级的形式,在网页部署和render时被采纳。因此,你所加入的新文件和更改都可以在不破坏PaperMod或者其它你所安装的主题的情况下被加载,也就是override。 确保你的文件夹的结构和下图逻辑一致: 这之后,检查你的config文件。以toml格式为例,我把整个goldmark的设置都加入到了其中以保证我的设置能成功覆盖原设置。下列代码中有批注的地方是你需要格外注意的设置(非toml代码的格式也可以参考类似修改逻辑,只需轻微调整表达方式。Goldmark相关的技术文档请看这里。): [markup] defaultMarkdownHandler = 'goldmark' #在这里确保goldmark为默认markdown渲染器 [markup.goldmark] duplicateResourceFiles = false [markup.goldmark.extensions] definitionList = true linkify = true linkifyProtocol = "https" strikethrough = true table = true taskList = true [markup.goldmark.extensions.cjk] eastAsianLineBreaks = false eastAsianLineBreaksStyle = "simple" enable = false escapedSpace = false [markup.goldmark.extensions.extras] [markup.goldmark.extensions.extras.delete] enable = false [markup.goldmark.extensions.extras.insert] enable = false [markup.goldmark.extensions.extras.mark] enable = false [markup.goldmark.extensions.extras.subscript] enable = false [markup.goldmark.extensions.extras.superscript] enable = false [markup.goldmark.extensions.footnote] backlinkHTML = "↩︎" enable = true enableAutoIDPrefix = false [markup.goldmark.extensions.passthrough] enable = true [markup.goldmark.extensions.passthrough.delimiters] block = [['\[', '\]'], ['$$', '$$']] #这是需要你加入的新表达模块 inline = [['\(', '\)']] #这是需要你加入的新表达模块 [markup.goldmark.extensions.typographer] apostrophe = "’" disable = false ellipsis = "…" emDash = "—" enDash = "–" leftAngleQuote = "«" leftDoubleQuote = "“" leftSingleQuote = "‘" rightAngleQuote = "»" rightDoubleQuote = "”" rightSingleQuote = "’" [markup.goldmark.parser] autoDefinitionTermID = false autoHeadingID = true autoIDType = "github" wrapStandAloneImageWithinParagraph = true [markup.goldmark.parser.attribute] block = false title = true [markup.goldmark.renderHooks] [markup.goldmark.renderHooks.image] useEmbedded = "never" [markup.goldmark.renderHooks.link] useEmbedded = "never" [markup.goldmark.renderer] hardWraps = false unsafe = true #防止goldmark误认为latex输入有损害,这里我关闭了安全设置。 xhtml = false [params] math = true #也别忘了添加这个 做完了这些,你应该就可以按规定的语法输入数学公式,并在网页部署时成功被渲染了。如下例:
2026年1月10日 - LMA 0.0.3 更新 这次的更新杂谈我拜托Gemini写了,给我代笔,我不写了。未来我再加点开发杂谈吧。我累了,最近事情太多。啊…真是,从Python换到别的语言还是得适应。要是还是有朋友装不上dmg,那我真得跟苹果掰扯一下了。现在的dmg经过了Apple的公证,系统应该只是会提示你这东西是网上下的,不会再拦你了。我拿我的信誉担保软件的安全,希望这次Gatekeeper能放过我。 然后,我只是换了架构,但另外两个文件midi_parser.py和sample_parser.py我没改,这是我的核心搜索逻辑,但他它们还是有点bug。我在搜B的时候他会把别的调的降调也给拉进搜索,这估计是当时我疏忽了,但我只能先拿这个B这个字符去代替那个降号,不然我怕没办法显示。先凑合用吧,未来我会想办法本地内置一个新符号然后把一串不可能被搞错的字符给map过去,让显示和搜索都变正常点吧。但这个我现在不搞了。 其它的未来再说。好累。 开发杂谈正文 by Gemini [2026年1月更新] 架构重构、交保护费与 Git 惊魂 距离上次写下开发杂谈已经过去了一段时间。这段时间里,LMA 经历了一次几乎是“推倒重来”级别的底层重构。虽然表面上看着还是那个熟悉的黑色窗口,但“引擎盖”底下的东西,已经完全换了一套。 告别 JSON,拥抱 SQLite 在早期的版本里,为了图省事,我用 JSON 文件来存储索引数据。对于几百个采样来说,这没问题。但当我的采样库膨胀到几万个文件时,JSON 的读写速度简直让人绝望,每次启动和搜索都能感觉到明显的卡顿。 于是,在这次 v0.0.3 更新中,我做了一个违背“偷懒祖训”的决定:全线切换到 SQLite。 现在的 LMA 不再是一个简单的文本阅读器,而是内置了一个微型关系数据库。配合上 PyQt6 的多线程(QThread)扫描,现在的体验是:几万个文件的索引瞬间入库,搜索响应是毫秒级的,而且在扫描文件的同时,界面再也不会假死卡住。这才是现代软件该有的样子。 同时,顺手把 PyQt5 升级到了 PyQt6,并且移除了 PyGame 依赖,改用 PyQt 原生的 QtMultimedia 调用系统音频引擎。这意味着软件体积更小,兼容性更好,再也不用担心 PyGame 在某些系统上发神经了。 我终于向苹果交了“保护费” 还记得我在上一篇杂谈里吐槽 MacOS 的 Gatekeeper 吗?那个“文件已损坏,请移至垃圾桶”的提示,简直是独立开发者的噩梦。 为了解决这个问题,也为了让大家安装时不再需要去终端里敲 xattr -cr,我最终还是妥协了——我加入了 Apple Developer Program。 是的,我交了那 99 美元的“保护费”。现在的 LMA v0.0.3 拥有了正经的 Developer ID 签名。打包流程也从简单的 zip 变成了正规的 DMG 封装。现在,你可以像安装任何正版软件一样,把 LMA 优雅地拖进 Applications 文件夹,Gatekeeper 再也不会把你拒之门外。虽然钱包痛了一下,但这顺滑的安装体验,值了。
1. 居中内容 首先去 …/layout/shortcodes 文件夹,新建一个叫"center.html"的文件。如果layout里没有,就自己创建一个。注意:不要去PaperMod的theme里找layout。 然后把这些代码插入进去并保存: <div style="margin: 0 auto; width: fit-content; min-width: 10%; overflow-x: auto;"> {{ .Inner }} </div> 在未来调用时,按照下方的例子调用就可以。渲染前的效果如下: {{% center %}} | Top | Bottom | Left | Right | | :---: | :---: | :---: | :---: | | 54.79% | 53.76% | 53.91% | 52.43% | {{% /center %}} {{% center %}} **Table 1.** Variance Explained by 5 Principal Components {{% /center %}} 渲染后:
如标题所言,本文的目的是分享此网站从创建到部署的流程中所使用的技术以及解决方案,为有同样意愿的朋友提供一条简单直观的复现路径。同时,本文也是对自己所学习但没怎么搞懂的技术的二次审视,方便对自己的工作流进行优化。我本人并非来自于计算机科学专业,但在高中和大学的学习中或多或少的有接触到一些编程的基础。所以如果我可以做到,那任何人应该都可以做到。 搭建个人网站所要实现的技术难度并不高。如果是以成功部署为目的,那么你并不需要完全理解每一个步骤背后的原理是什么,但中途遇到的报错会需要你了解编程语言所做的事情是什么,从而找到问题的根源。 在遇到困难时,我建议善用语言模型来为你提供实时的帮助,它们所拥有的知识可帮助解决许多问题。当然,提问的方式以及判断回答是否可靠的技能也同样重要。这一点,我们会在未来的另一篇文章中一起探讨。 开发平台与工具 我使用运行在MacOS上的VS Code进行代码的编写,所以这里会分享的代码都是能运行在MacOS的Terminal中的。如果你使用的是其它的平台(如Windows)那么少部分代码也许需要修改成你的平台所兼容的语法。 我的个人网站本质上是整合了现有的解决方案并把它们拼凑在一起。能够实现的核心技术是hugo和其平台中的主题PaperMod,并最终用Github和Vercel进行部署。 网站的搭建过程中,我有让Google的语言模型Gemini 2.5来帮助我进行网站的构造。最终遇到的技术问题,也使用了OpenAI的ChatGPT帮助我进行了排错。如果没有它们的帮助,我想这个过程会艰难很多很多吧。 构建个人网站 首先,你需要在Terminal中记录你的Github所关联用户名与邮箱,这样未来就可以把本地写好的内容push到云端以准备部署。 git config --global user.name “你的用户名“ git config --global user.email "your_email@example.com" 接下来需要做的,是安装Hugo。你可以选择进入官网跟着官方的引导一起做,也可以选择在MacOS的Terminal中实现的方式。这里我会介绍第二种方式。 在确保你的环境中存在Homebrew后,请在Terminal中输入: brew install hugo Hugo安装完成后,你需要在设备上建立一个网站的项目。同样输入下列代码: hugo new site my-blog #这里Hugo会建立的文件夹名为“my-blog” cd my-blog #进入文件夹 此时文件夹也会在你的计算机的本地被创建。在MacOS里,默认的创建位置是用户文件夹下。 Hugo 本身只负责生成内容,外观则由主题决定。你可以在 Hugo Themes 官网上寻找喜欢的主题。这里以我的网站也同样使用的PaperMod为例: git init git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod git submodule update --init --recursive 在配置文件 hugo.toml中,可以启用这个主题: baseURL = "https://<你的网址>.io/" #先不管这个 languageCode = "zh-cn" title = "我的博客" theme = "PaperMod" # 告诉 Hugo 使用这个主题 buildFuture = true #允许markdown创建日期在未来,可以避免一些报错的排查 接下来,就可以使用Hugo去写第一篇文章了。