本次更新聚焦「轻量体验」深度优化:不仅重构了 CPU 占用逻辑与系统唤醒机制,让后台运行更高效;更让动画交互全程保持丝滑流畅,资源消耗却低到近乎无感 —— 哪怕它常驻菜单栏,你也几乎察觉不到它的存在,既不拖慢系统,又能随时响应需求~
下载地址: [ github ] [ gitee ]
目前软件主要包含以下功能:
🚀 智能CPU动态图标
让性能可视化
将任何GIF图片设置为你的菜单栏图标,它的播放速度会实时响应你的CPU使用率
空闲时悠然自得,高负荷时急速狂飙,用最酷的方式监控系统状态
支持完全自定义上传,打造你的专属动画🌈 渐变彩色心情签名
用美丽的渐变色彩表达每日心情状态
完全可自定义的颜色和文字,展现独特个性
为您的菜单栏增添一抹艺术气息📋 高效剪切板管理
记录多次复制历史,随时找回需要的内容
智能分类整理,快速定位所需片段
支持文本、图片等多种格式,提高工作效率🖥️ 屏幕圆角美化
为Mac屏幕添加优雅圆角,提升视觉美感
智能适配多显示器设置,每块屏幕完美呈现
无性能影响的背景运行,细腻改善视觉体验📎 菜单栏折叠工具
自动整理拥挤的菜单栏图标,保持界面整洁
一键展开/折叠,平衡简洁与便捷
自定义排序和分组,完全按您的方式组织
技术特点
- 原生 Swift 开发,完美兼容最新系统
- 轻量级设计,资源占用极低
- 直观易用的界面,无需学习成本
- 定期更新,持续改进功能和体验
如果有好的建议或者使用时遇到任何问题欢迎随时反馈👏
文章作者: m-finder
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 M-finder!
相关推荐

2025-08-25
Mac 菜单栏多合一工具自荐:FancyTool
鉴于本人特别喜欢花里花哨的菜单栏,但又不想开机自启太多软件,所以自己开发了一个新的、轻量的,有点花里胡哨但又有些实用功能的多合一工具:[ FancyTool ], 感兴趣的朋友可以点击链接下载使用。 我承认,这里的介绍是有点啰嗦😊 目前软件主要包含以下功能: 🚀 智能CPU动态图标 让性能可视化! 将任何GIF图片设置为你的菜单栏图标,它的播放速度会实时响应你的CPU使用率。 空闲时悠然自得,高负荷时急速狂飙,用最酷的方式监控系统状态。 支持完全自定义上传,打造你的专属动画! 🌈 渐变彩色心情签名 用美丽的渐变色彩表达每日心情状态 完全可自定义的颜色和文字,展现独特个性 为您的菜单栏增添一抹艺术气息 📋 高效剪切板管理 记录多次复制历史,随时找回需要的内容 智能分类整理,快速定位所需片段 支持文本、图片等多种格式,提高工作效率 🖥️ 屏幕圆角美化 为Mac屏幕添加优雅圆角,提升视觉美感 智能适配多显示器设置,每块屏幕完美呈现 无性能影响的背景运行,细腻改善视觉体验 📎 菜单栏折叠工具 自动整理拥挤的菜单栏图标,保持界面整洁 一键展开/折叠,平衡简洁与便捷 自定义排序和分组,完全按您的方式组织 技术特点 原生 Swift 开发,完美兼容最新系统 轻量级设计,资源占用极低 直观易用的界面,无需学习成本 定期更新,持续改进功能和体验 使用方法 赞赏如果觉得有用,可以请我喝杯咖啡☕️ 感谢以下老板投喂,🫰❤️ 姓名 金额 时间 留言 *龙 ¥ 10.00 2025-08-27 15:00:00 ☕️

2025-12-10
飞牛 NAS + Tailscale 组网踩坑实录
废废的话多多的说家里有台用了很多年的笔记本, 型号是联想小新 700, i7 的 CPU, 8G 内存, 硬盘是买来时我自己换的一块固态 256. 这台笔记本购于 17 年 10 月, 陪我度过了刚毕业时的懵懂, 也陪大美丽度过了研究僧苦修的日常. 进可敲代码, 退可搞学术, 进过水, 也换过屏, 可以说是功高劳苦, 遍体鳞伤. 不忍心让它就这么丢在家里吃灰, 前段时间我一个没忍住, 买了一块 2T 的机械, 一块 1T 的固态, 还有一根 16G 的内存条. 换上以后, 大黑满血复活. 当时有个老登整天找我念叨要组装小主机, 搞 NAS, 我被折磨久了, 心里也有火苗在跳. 心动完我先整理了一下需求, 然后丢给 AI 帮我整理方案: 我有一台闲置的联想小新700电竞版笔记本,i7的cpu,16+8g内存,GTX905m显卡,1t固态硬盘,2t机械硬盘,想安装飞牛OS作为影音nas,win10用来打steam游戏,linux和macOS用来写代码开发php/java/qt/swift,现在了解到可以通过hyper-v, vm等虚拟机,也可以通过pve,ESXi等虚拟化平台满足我的需求,我对开发和游戏可能有一定的性能要求,帮我分析下用哪种方案最优 AI 说我这个需求 PVE 是首选. 那还说啥, 搞呗. 趁着周末, 我一口气折腾到半夜, 然后发现 GG 了. 大黑不支持一个什么 Bios 直通, 给 Bios 升完级依然找不到对应选项. 我特么心里哇凉啊, 头发咔咔掉一地. 裤子都脱了就给我看这个? 第二天一早我还是老老实实地装了 Windows, 然后又通过 Hyper-V 装了飞牛 NAS. 我给飞牛绑了局域网内的固定 IP, 然后把 2T 的机械盘从 windows 禁用掉, 专门给飞牛做存储, 最后又通过 SMB 把硬盘挂载回了大黑, 方便我在不开浏览器的时候也能随时查看飞牛里的文件. 说实话, 用着是真的爽啊, 自带的远程连接虽然只有 2M 带宽, 但是也足够我在公司上传下载文件用, 比之前玩黑群晖的体验强到没话说! 玩了几天以后, 我又喊上老登一块儿联机我的世界, 当时龙猫的启动器正在小范围试用联机功能, 老登刚好就有, 分享完我们畅玩了一天. 结果第二天就看到龙猫发了篇声明, 联机功能没了, 组网的需求嗷一下就上来了. 鉴于龙猫用的 EasyTier, 我也先尝试了一下, 发现功能确实好用, 但碍于我不喜欢他们那套 UI, 我又放弃了. 没错, 颜控就是这么离谱. 挑来选去, 最后还是选了 Tailscale. 踩坑过程虽然 Tailscale 下载安装后登录下账号就能用, 但是最开始我没搞明白, 也不知道它其实需要客户端和命令行结合使用. 我只发现两台设备都安装登录后, 互相访问似乎是没什么反应. 拉上老登又陪我折腾一圈, 发现登录完设备之间确实是通了, 我当时不通是因为访问了飞牛的内网 IP, 而我, 跟本就没给它配置子网路由. 😭 首先, Windows 安装后, 可以直接在命令行使用 tailscale 的各项命令, Mac 安装后, 需要手动添加一个环境变量: 1export PATH="$PATH:/Applications/Tailscale.app/Contents/MacOS" 然后才能在命令行愉快地玩耍, 比如通过 tailscale status 查看各台设备的连接状态, 再或者通过 tailscale ping ip 来查看当前设备到对应设备的连通状态. 也就是这个时候, 我和老登都发现设备之间虽然通了, 但是延迟有点高. AI 说, 应该是没能打洞成功, 再一看 status 的结果, 果然都是中转. 它让我先把 41641 端口在防火墙放开, 但是我没开防火墙, emmm🤔… 那问题就只剩一个, 网络层给我拦了! 登上光猫后台, 没找到什么 UPnP, 但是有个端口映射, 我给配了一下, 再运行 tailscale status, 连接状态果然变成了直连, 快多了. 当天晚上又拉老登联机了一个游戏, 结果游戏内时不时弹起的网络延迟过高让我有点蛋疼. 打开测速网一跑: 73 Mbs, 我千兆的光纤 FTTR, 可以说是拉了一裤兜. 把 Tailscale 关了, 再跑能到 230, 大黑的无线网卡是 400 多, 也算能说得过去. 初步怀疑运营商对大端口的 UDP 做了主动丢包, 尝试查找怎么给 Tailscale 配个端口, 强制所有流量去走 443, 安装目录添加配置C:\ProgramData\Tailscale\config.json: 12345{ "ForceTCP": true, "Socks5Server": "localhost:443", "TunMode": "userspace"} 配置后重启,似乎没啥作用. 微软服务内添加 --port=443 后重启, 依然没啥作用. 正跟 AI 较劲到底该怎么配的时候, 我突然看到之前配置子网路由时的命令, 似乎带了一句 --accept-routes, 去掉以后再测速, 又回到 200+. 总结, 不知道是哪个傻逼在博客里提了一嘴改 443, 被 AI 抓取到以为 Tailscale 是可以配端口的, 特么误我啊! 已知问题如果是 Mac 且开了代理, 打开文件管理有很大概率一直转圈, 似乎是因为 Safari 在代理模式有概率连不上 Socket. 解决方法未知, 暂时只能换浏览器或者关代理.

2024-03-03
职业生涯知识回顾-关于抽象类和接口的思考
抽象类和接口是两个很容易产生疑惑的概念,分不清它们的使用场景,其实只要记住两点就比较好理解: 接口是对行为的抽象 抽象类是对子类有哪些属性和行为的抽象 当你需要对一个类有哪些行为进行约束时,使用接口;需要为其他类提供一个模板以及一些通用的属性和行为,使用抽象类。 在理解什么是抽象类和接口的前提下,延伸出一些思考:在一定程度上,接口似乎是比抽象类更底层的存在,是否可以理解为先有行为,对行为进行组合才能有类? 那么下面代码中,抽象类对接口的实现有没有实际意义? 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061<?phpinterface IAnimal{ public function move(): void; public function sleep(): void; public function eat(): void;}interface Wag{ public function wag();}interface Climb{ public function climb();}abstract class AbstractAnimal implements IAnimal{ abstract function move(): void; public function sleep(): void { echo 'sleeping', PHP_EOL; } public function eat(): void { echo 'eating', PHP_EOL; }}class Dog extends AbstractAnimal implements Wag{ function move(): void { echo 'dog running', PHP_EOL; } public function wag(): void { echo 'wagging', PHP_EOL; }}class Cat extends AbstractAnimal implements Climb{ function move(): void { echo 'cat walking quietly', PHP_EOL; } public function climb(): void { echo 'climbing', PHP_EOL; }} 如果更进一步,抽象类的方法和接口相同,并且都是抽象方法的情况下,接口和抽象类谁更有存在的意义? 抽象类是为了提高代码复用,定义类之间的层次关系,接口是为了实现多态性和解耦。我们要知道两者并不是对立关系,甚至目标一致,都是为了提高代码质量。 工具是死的,但人是活的,所以我认为使用者并不用太过于纠结,代码没有百分百完美,也不是死板的教条。只要在需求和设计目标明确的前提下,选择抽象类或接口,甚至组合起来使用都是可以的,解决实际问题才是我们最终的目的…… 最后,再来回答一下前边的三个问题: 抽象类和接口的层级关系:抽象类可以被视为介于接口和类之间的一种中间形式。 抽象类实现接口的意义:统一接口规范,确保抽象类和子类都遵循接口的约束。 全抽象方法的抽象类和接口谁更有意义:如果只是定义方法契约而不提供具体实现,接口更有意义;抽象类有明确扩展目标时,保留抽象类。

2024-03-01
Laravel Octane 和 Swoole 协程的使用分析二
又仔细研究了下 Octane 源码和 Swoole 的文档,关于前几天 Laravel Octane 和 Swoole 协程的使用分析中的猜想,得到进一步验证: Swoole 的 HTTP Server 启动后会创建一个 master 进程和一个 manager 进程;master 进程又会创建多个 reactor 线程,负责将请求转发到 work,并从 work 接收结果发送给客户端,相当于 nginx;manager 会创建多个 work 和 task 子进程,work 进程相当于 php-fpm,task 专门处理一些耗时任务,最后将结果交给 work; 而 LaravelOctane 的 concurrently 方法,其实是以 task 为基础,也就解释了为什么脱离 HTTP server 会无法使用。 Swoole

2024-09-19
Mac 用 Brew 安装旧版本 PHP
最近又用到 php7.4,奈何本地早就已经升到了 8,想搞回来,发现一个简单好用爽歪歪的三方库,需要的可以试一下,5.6 - 8.4 都有。[ homebrew-php ] 添加地址库1brew tap shivammathur/php 安装指定版本1brew install shivammathur/php/php@7.4 切换版本12345brew services stop php@7.4brew unlink php@xxbrew link php@7.4brew services start php@7.4 搞定收工。

2024-02-28
Laravel Octane 和 Swoole 协程的使用分析
之前在工作中使用 Laravel Octane 的 concurrently 处理并发时,发现在队列和定时任务中不会触发并发效果。经过分析,作了如下猜测:队列定时任务都属于一个独立的进程,与 Octane 服务无关,而 Octane conturrently 恰恰需要在 Octane 环境下才能运行。 后来通过代码进行环境检测和查看 php 的进程,证明猜想成立。 1234info('check env', [ 'served by octane' => isset($_SERVER['LARAVEL_OCTANE']) && ((int)$_SERVER['LARAVEL_OCTANE'] === 1), 'on swoole server' => (extension_loaded('swoole') || extension_loaded('openswoole')) && app()->bound(Server::class)]); 为了能够在任意代码中实现并发,我们研究参考了 Hyperf 框架关于协程的代码,然后抽取了如下两个类: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071<?phpnamespace App\Services;use App\Exceptions\ParallelExecutionException;use Laravel\Octane\Facades\Octane;use Throwable;use Swoole\Coroutine as Co;class Parallel{ protected array $callbacks = []; protected array $results = []; /** * @var Throwable[] */ protected array $throwables = []; public function add(callable $callable, $key = null): void { if (is_null($key)) { $this->callbacks[] = $callable; } else { $this->callbacks[$key] = $callable; } } public function wait(bool $throw = true): array { if (isset($_SERVER['LARAVEL_OCTANE']) && ((int)$_SERVER['LARAVEL_OCTANE'] === 1)) { return Octane::concurrently($this->callbacks, 300000); } app('log')->useLoggingLoopDetection(false); Co\run(function () { foreach ($this->callbacks as $key => $callback) { Co::create(function () use ($callback, $key) { try { $this->results[$key] = $callback(); } catch (Throwable $throwable) { $this->throwables[$key] = $throwable; unset($this->results[$key]); } }); } }); if ($throw && ($throwableCount = count($this->throwables)) > 0) { $message = 'Detecting ' . $throwableCount . ' throwable occurred during parallel execution:' . PHP_EOL . $this->formatThrowAbles($this->throwables); $executionException = new ParallelExecutionException($message); $executionException->setResults($this->results); $executionException->setThrowAbles($this->throwables); unset($this->results, $this->throwables); throw $executionException; } app('log')->useLoggingLoopDetection(true); return $this->results; } private function formatThrowAbles(array $throwables): string { $output = ''; foreach ($throwables as $key => $value) { $output .= sprintf('(%s) %s: %s' . PHP_EOL . '%s' . PHP_EOL, $key, get_class($value), $value->getMessage(), $value->getTraceAsString()); } return $output; }} 1234567891011121314151617181920212223242526272829303132<?phpnamespace App\Exceptions;use RuntimeException;class ParallelExecutionException extends RuntimeException{ protected array $results = []; protected array $throwables = []; public function getResults(): array { return $this->results; } public function setResults(array $results): void { $this->results = $results; } public function getThrowAbles(): array { return $this->throwables; } public function setThrowAbles(array $throwables): array { return $this->throwables = $throwables; }} 其中,第一个类的作用是检测系统是否运行在 Octane 环境下,是则调用Octane concurrently,否则就执行 Swoole 协程代码,使用起来也比较简单: 1234567$parallel = new Parallel();$parallel->add(fn() => $this->analysisStructure(), 'structure');$parallel->add(fn() => $this->analysisHabit(), 'habit');[ 'structure' => $structure, 'habit' => $habit,] = $parallel->wait(); 之所以没有完全使用 Swoole 协程,是因为相比之下,Octane 代码更加优雅,我们在期待着某天更新后,Octane concurrently 也能直接在队列中运行使用。 第二个类的作用比较简单,就是对协程中异常的一个定义。 另外在分析过程中,我们也发现了一个比较有意思的事情: 如图所示,当我在路由中运行检测代码时,Octane 和 Swoole server 都为 true;在控制器中运行检测代码时,又只有 Octane 为true;为什么会有这样的区分?我个人猜测是 Octane 在将框架代码读进内存时,特意跳过了控制器中的代码,以避免数据更新不及时等问题。 有知道具体原因的小伙伴,欢迎留言探讨。