【💰】在这种三倍奖励的日子里签到大失败真是令人心痛
唉散点财,积攒人品一下
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
唉散点财,积攒人品一下
过年发现这糟心事,目前估计要等开春解决,问问 v 友一般去哪里找师傅靠谱?
哈喽大家好,今天给大家安利一个我最近用 Vue 手搓的在线工具——JWT编码/解码器。 做开发的同学应该都知道 JWT(JSON Web Token),现在前后端分离项目里用得特别多。但有时候调试接口、排查问题,手里没个顺手的工具,解析个 Token 还得去找在线网站,挺麻烦的。 所以我就想,干脆自己做一个网页版的,打开就能用,还不用安装。 JWT 是由三部分组成的,用点号隔开。这个工具会自动把 Header、Payload、Signature 分开显示,还用不同颜色标出来,一眼就能看明白哪个部分是啥。 不止是最常用的 HS256,像 RS256、PS256、ES256 这些非对称加密算法也都支持。不管你用的是对称密钥还是 RSA/ECDSA 密钥对,都能帮你编码和验证签名。 想确认 Token 是不是被篡改过?只要勾选"验证签名",输入密钥,立马就能告诉你签名是否有效。再也不用写代码去验证了,调试效率翻倍。 刚上手不知道怎么用?没关系,我准备了现成的示例,点一下"加载示例"按钮,立马给你填好一个完整的 Token 和密钥,跟着看一遍就会了。 这个小工具是我用 Vue 3 做的,核心的 JWT 处理逻辑是自己手写的,还用到了 Web Crypto API 来做 RSA 和 ECDSA 的签名验证。所有操作都在你的浏览器里完成,密钥不会上传到服务器,安全又放心。 虽然它可能没有那些专业工具那么多功能,但胜在轻便、干净。 如果你平时开发调试刚好缺这么一个顺手的小工具,欢迎来试试看!要是觉得好用,或者有什么想吐槽的,也欢迎随时告诉我哈~JWT编码/解码 在线工具分享
在线工具网址:https://see-tool.com/jwt-encryptor
工具截图:
这个工具有啥特别的?
1. 一眼看懂 Token 结构
2. 支持多种算法
3. 签名验证超方便
4. 示例一键加载
碎碎念
二刷《花束般的恋爱》读懂了一些细节和伏笔:
以上是个人观后的一些拙见,《花束般的恋爱》真的是一部很好看,细节满满的电影,强烈推荐各位去看看!
新的一年即将开始,愿有情人终成眷属,愿各位按时吃饭,平安喜乐。
有感于现在很多桌面端网站都不太在意“链接”这个概念了,全部都是用纯 JavaScript 来打开页面,一旦禁用 JS 几乎就无法使用,体验不是很好,于是写了一篇简短的博客,全文: https://blog.k2dong.com/use-link-in-react-vue/
躺家里一天刷了 15 集
Model Context Protocol 是一个开放标准,它的目标是给 LLM 一种干净、统一的方式去发现和调用外部工具。不用再写自定义解析、不用再维护脆弱的胶水代码,就是一个好用的协议。 大多数 MCP 教程上来就讲 JSON-RPC 规范、传输层协议,搞得很复杂。其实用 MCP 不需要理解协议内部构造就像写 Web 应用不需要去读 HTTP 规范一样。 真正需要掌握的东西就三个概念,花 15 分钟就够了。 MCP 的核心就三样东西: Server:对外暴露工具的服务端,本质上是一个 Python 脚本,声明"这些函数可以被 LLM 调用",跑起来之后就在监听请求。 Tool:希望 LLM 使用的函数,可以是任何东西:查天气、查数据库、发邮件。这跟写普通 Python 函数没什么区别,加个装饰器剩下的交给 MCP。 Client:连接 Server 并调用工具的客户端。生产环境里一般就是 LLM 应用本身。测试阶段可以用 FastMCP 自带的客户端,开箱即用。 Server 暴露工具,Client 调用工具。就这么简单。 传输方式、JSON-RPC、能力协商这些都是实现细节,上生产之前不用管。 FastMCP 是让 MCP 用起来简单的 Python 框架。装一下就行,不需要任何配置。 本教程不需要虚拟环境,生产环境建议还是用一个。 新建一个 文件: 创建一个带名称的服务器实例。 装饰器把普通函数注册为 MCP 工具。函数的 docstring 会变成工具描述——LLM 靠这个来判断什么时候该调用它。类型提示( 、 )告诉 MCP 输入输出的类型。 表示通过标准输入输出通信,本地测试够用了。 整个 Server 就这些,实际代码 15 行。 新建 : 指定要连接的 Server 文件; 自动管理连接生命周期; 负责动态发现可用工具,这是 MCP 的核心能力之一; 带参数调用具体工具。 终端里执行: 输出应该是这样的: 到这里就完成了。一个 MCP Server 搭好了Client 也成功调用了它。 MCP 真正好用的地方在于扩展成本极低,再往 Server 里再加两个工具: 再跑一次测试客户端,三个工具全部自动发现: 不需要改配置,不需要写路由。加了工具就直接可用。 前面写的 Client 是测试用的。生产环境里,LLM 框架本身充当 Client 角色。概念上大概是这样: Server 端的代码完全不用动,这正是 MCP 的价值所在——工具写一次,任何兼容 MCP 的客户端都能用。 生产部署时需要把传输方式从 换成 : 这样 MCP Server 就以 HTTP 端点的形式对外暴露,远程客户端可以直接连接。 现在你手头已经有一个能跑的 MCP Server 了,前后也就 15 分钟。下一步就是把它接到实际的 LLM 上,做点真正有用的东西出来。 https://avoid.overfit.cn/post/c9314c34543a4ed1a1bb15b92d1c6ca2 by Paolo Perrone
三个核心概念
步骤 1:安装 FastMCP
pip install fastmcp步骤 2:创建 Server
my_server.py from fastmcp import FastMCP
# Initialize the server with a name
mcp = FastMCP("my-first-server")
# Define a tool using the @mcp.tool decorator
@mcp.tool
def get_weather(city: str) -> dict:
"""Get the current weather for a city."""
# In production, you'd call a real weather API
# For now, we'll return mock data
weather_data = {
"new york": {"temp": 72, "condition": "sunny"},
"london": {"temp": 59, "condition": "cloudy"},
"tokyo": {"temp": 68, "condition": "rainy"},
}
city_lower = city.lower()
if city_lower in weather_data:
return {"city": city, **weather_data[city_lower]}
else:
return {"city": city, "temp": 70, "condition": "unknown"}
# Run the server
if __name__ == "__main__":
mcp.run(transport="stdio")FastMCP("my-first-server")@mcp.toolcity: str-> dicttransport="stdio"步骤 3:写个 Client 测试一下
test_client.py import asyncio
from fastmcp import Client
async def main():
# Point the client at your server file
client = Client("my_server.py")
# Connect to the server
async with client:
# List available tools
tools = await client.list_tools()
print("Available tools:")
for tool in tools:
print(f" - {tool.name}: {tool.description}")
print("\n" + "="*50 + "\n")
# Call the weather tool
result = await client.call_tool(
"get_weather",
{"city": "Tokyo"}
)
print(f"Weather result: {result}")
if __name__ == "__main__":
asyncio.run(main())Client("my_server.py")async with client:list_tools()call_tool("get_weather", {"city": "Tokyo"})步骤 4:跑起来
python test_client.py Available tools:
- get_weather: Get the current weather for a city. ==================================================Weather result: {'city': 'Tokyo', 'temp': 68, 'condition': 'rainy'}步骤 5:增加更多工具
from fastmcp import FastMCP
from datetime import datetime
mcp = FastMCP("my-first-server")
@mcp.tool
def get_weather(city: str) -> dict:
"""Get the current weather for a city."""
weather_data = {
"new york": {"temp": 72, "condition": "sunny"},
"london": {"temp": 59, "condition": "cloudy"},
"tokyo": {"temp": 68, "condition": "rainy"},
}
city_lower = city.lower()
if city_lower in weather_data:
return {"city": city, **weather_data[city_lower]}
return {"city": city, "temp": 70, "condition": "unknown"}
@mcp.tool
def get_time(timezone: str = "UTC") -> str:
"""Get the current time in a specified timezone."""
# Simplified - in production use pytz or zoneinfo
return f"Current time ({timezone}): {datetime.now().strftime('%H:%M:%S')}"
@mcp.tool
def calculate(expression: str) -> dict:
"""Safely evaluate a mathematical expression."""
try:
# Only allow safe math operations
allowed_chars = set("0123456789+-*/.() ")
if not all(c in allowed_chars for c in expression):
return {"error": "Invalid characters in expression"}
result = eval(expression) # Safe because we validated input
return {"expression": expression, "result": result}
except Exception as e:
return {"error": str(e)}
if __name__ == "__main__":
mcp.run(transport="stdio") Available tools:
- get_weather: Get the current weather for a city.
- get_time: Get the current time in a specified timezone.
- calculate: Safely evaluate a mathematical expression.最后:接入 LLM

How MCP connects your LLM to external tools: the framework calls the client, which discovers and invokes tools from your server.stdiohttp if__name__=="__main__":
mcp.run(transport="http", host="0.0.0.0", port=8000)总结
安装的破解版,公司电脑不给装
说是只要公司电脑安装就算商用,没有购买授权,有侵权风险
一安装,安全部门的人就监控到然后要求删除
想问下,有没有类似 Navicat 的软件,用起来感觉挺顺手的,可以管理多种数据库
和对象是学校认识的,目前现在大概 5 年左右,预计今年结婚。
今年过年在对象家过,对象有一个弟弟(自己开店,目前自负盈亏,大概一年 10w 左右吧)
已经订婚(彩礼 18.8+3 金) 24 年订婚,因为对象比较强势(所以彩礼基本都是转给对象这里)-(但是这里有一点不愉快,对象母亲想拿着彩礼,但是对象强势还是拿回来了)
但是对象弟弟在 25 年结婚,我理解是因为如果对象和我结婚基本就不会补贴家里,所以就要弟弟先结婚了;在这里对象家里也有一些小变化吧(陆陆续续,借加给 大概 15w 左右吧),这里我也没什么意见( op 本身家庭也刚刚过贫穷吧,目前稍微好点吧,年包大概 40 )
我和对象的钱目前同居状态,所以工资大部分到账就转给对象一起存着了。
但是今年过年去她家,遇到一件事,就是对象母亲做生意和别人合伙,一共有 3 个合伙人,其中一个合伙人把钱挪用了,导致年底没有办法给员工发工资;然后其中一合伙人找对象母亲找我对象来借钱,大概 5w 左右,这点让我有点不高兴,让我感觉到对象母亲根本就没有不在意对象,有点自私;这让我觉得我和对象本身是想在一线安家的,但是本身我们的家庭没有办法托举,也不至于拖累吧。
我和对象本身没有什么矛盾,但是我们在要孩子的问题上有一点点分歧,我是想要的,但是对象说没有钱生什么孩子,我的态度是如果孩子不要了,那买房子干什么呢(对象对买房子有很强的意愿)
我们两没有共同的兴趣爱好,她爱看 dy ,我比较看 b 站;她需要宅,而我更喜欢探索;她急性子,我性格温和(可能和本身从小家庭有关,和母亲生活)。
可能我们两个分开都能找到更好的,但是因为很久了,都不想分开吧;我能感受到她对我是不满意的,目前也只是相对高工资维持的,一旦维持不了,就算结婚也会离吧(自我感觉)。
并且在争吵中,也说过我家 qiong (这点我不否认),不想和我结婚,想找个有钱的,很喜欢用钱来衡量。
所以 op 该如何选择呢?
有的人使用 Code Agent 提效 30%,有的人提效 300% 甚至更多。 区别不仅在于模型的选择,或是 Prompt 写得有多好,更重要的是工作流程。 提升 30% 是工具的辅助,提升 300% 则是生产关系的变革。如果只看到 30%,那用不用 Code Agent,差别好像不那么大,而如果有的人用了 Code Agent 实现了自身几倍效率的提升,对于不使用 Code Agent 的人来说,就是降维打击了。 传统的开发流程中,所有工作都必须由人完成,所以只能串行开发,即使负责多个项目,也是在多个项目中切换,同时只能处理一个项目。 Code Agent 已经可以完成大部分编码工作,如果还是按照传统的工作流程,只是把编码的工作交给 Code Agent ,这时效率提升仅仅来自代码生成速度的加快,提升有限。 和 AI 的交流也是需要学习和适应的,知道 AI 能做什么,不能做什么,擅长什么,不擅长什么,需要在不断的尝试中探索。 有限的效率提升加上与 AI 的沟通成本,这也是很多人拒绝使用 AI 的原因。 当掌握了和 AI 的沟通方法后,就能将自己从编码工作中解放出来,获得很多看着 AI 干活的空闲时间。 如果把 Code Agent 带来的空闲时间也利用起来,就能进一步提升效率,这就需要切换到并行开发流程。 并行开发可以按项目和分支维度分为多项目单分支,单项目多分支,多项目多分支。 这是并行开发最好上手的方式,只需要在多个项目中开启 Code Agent,自己不断给 Code Agent 描述需求,确认方案,由 Code Agent 来实施。 哪个 Code Agent 完成了或者需要确认了,程序员再介入。 相对多项目的需求,更常碰到的情况是单个项目中有多个需求,它们可能是互相依赖的,也可能是互相独立的。 平时我们在一个项目中可以切换分支,但同时只能使用一个分支,无法并行开发。这时就需要 git worktree 命令。git worktree 可以管理工作区,多个工作区彼此独立,在每个工作区都可以开一个 Code Agent。 常用的几个命令: 在实际开发中,如果要开发一个新的功能,就添加一个使用新功能分支的工作区,在工作区进行开发,直到相应分支代码合并到主线分支,再移除工作区。 如果功能互相独立,就从主线分支签出,如果互相依赖,则从具体的功能分支签出。 因为会有集成测试的需求,我会再添加一个用于集成测试的工作区,并添加一个脚本用于将各个功能分支合并到集成测试分支,每次有新的功能分支或对功能分支做了新的提交,就重新执行一次脚本进行合并。 注意这个脚本不要放在集成测试分支的工作区,不然会被 reset。 有了多项目单分支和单项目多分支的基础,多项目多分支也没什么难度了。 AI 生成代码的速度很快,并行开发时,程序员往往成为卡点。 要找到自己的卡点,才能进一步提升效率。我目前发现卡点主要来自两部分,一是 review 代码,二是功能验证。 这两部分都需要人来操作,如果操作时间过长,很多 Code Agent 都等待人来确认下一步,这时就又回到了串行流程。 关键在于如何减少这两部分所花费的时间。 对于代码 review,如果是一个比较大的功能点,尽量先和 AI 确认好实现方式,不要让 AI 自由发挥,或者将大功能拆成多个小功能,分步实现,这样每次 review 的工作量不会太大,自己看完一部分代码后,可以先提交,然后不断往之前的提交中追加内容,这样也更容易区分每次的改动。 对于功能验证,如果需要启动服务,构造数据进行验证,往往花的时间最多。比较好的办法是让 AI 自己验证,比如先让它写好单元测试,或者给它一个验证方式,而不要一直等着人去验证。 Code Agent 出现之前,程序员之间的差别可能不那么明显,即使再厉害的程序员,要实现一个功能,也有很多时间要花在编码上,而编码的速度是有一个上限的。 而有了 Code Agent 之后,程序员之间的差别将成倍拉大,当有的人满足于使用 Code Agent 从编码工作中解放出来,多了一些空闲时间,有的人则同时开发多个功能,将自己的效率提升好几倍。 如果只把 Code Agent 当做一个更快的代码生成器,只是有了更好的辅助工具。而如果使用了并行开发流程,一个人能干之前好几个人的事情。从一个人只能做一件事,到一个人同时推进多件事,生产关系有了变革,这才是 Code Agent 真正的价值。串行开发
并行开发
多项目单分支
单项目多分支
git worktree add:添加一个工作区,比如 project-a,要开发一个 feature-a,就可以使用 git worktree add -b feature-a ../project-a-feature-a master,从 master 签出一个 feature-a 分支,工作目录是 ../project-a-feature-a。git worktree list:查看工作区列表。git worktree remove:移除工作区。cd ../project-a-integration
git checkout integration
git reset --hard master
git merge feature-a --no-ff --no-edit
git merge feature-b --no-ff --no-edit
git merge feature-c --no-ff --no-edit
...
git push -f效率卡点
写在最后
公司提供了 codex 、Claude 、Gemini 。Claude code 是中转的,codex 和 Gemini 都是走官方的 API 。
额度很多,平时工作用不完。如果我用来搞个人项目( GitHub 开源),会有啥风险不?

这个小软件只有一个功能,就是把 win11 任务栏变回小图标,从 win95 一直用过来,还是习惯小图标的任务栏,只可惜微软在 win11 里砍掉了这个原生功能,苦于找不到合适的解决方案。
StartAllBack 能用,但是右下角只能显示时间,显示不了日期。
Windhawk 可以,右下角日期时间也都有,但是软件太臃肿,为了一个小功能搞一个 800 多兆的臃肿庞大的软件划不来。
所以花了几天时间 vibe coding 一个,一行代码都没写也不懂什么 C++,对代码一窍不通,这事放到一年前,想要做一个这样的软件简直是天方夜谭,现在有了 AI ,居然可以把想法变成现实了。感觉我现在强的可怕,感觉没有我做不出来的软件了,嚯哈哈哈哈。
另外又用 AI 做了个 pdbtools 用于下载微软的 pdb 文件并把偏移量保存到 taskbar_symbols.ini 符号偏移表里,不保证适配大部分版本,因为每个版本都不一样,所以如果你打开软件以后,跳出控制台下载文件,说明 ini 里没有适配到你的 win11 版本的偏移量,软件会自动从微软服务器下载两个 pdb 文件并放在当前目录里,下载完后,软件会自动找到对应的偏移量并保存到 ini 文件里,应用成功以后软件会自动删除两个文件。
首先把软件解压到任何你喜欢的目录,比如 D:\Tools\Taskbar\ 或者 C:\Program Files\TaskbarTweaker\ 然后运行
如果没效果,试试以管理员权限运行。
如果软件成功运行,并且成功应用到任务栏,软件会自动被加载到 任务计划程序 里,跟随开机自动启动
如果你想停用它,可以带参数 -u 来运行它,使用这个命令 taskbar_tweaker -u
如果遇到任何问题,请积极反馈。
本项目是一个基于STM32微控制器的LCD12864液晶显示屏驱动程序,通过串行通信方式控制LCD12864显示屏,实现正弦函数波形的实时显示。这个项目将数学函数可视化,让抽象的数学概念变得直观可见,是学习STM32嵌入式开发和图形显示技术的绝佳实践项目。 LCD12864是一款128×64点阵的图形型液晶显示模块,具有体积小、功耗低、显示内容丰富等特点,广泛应用于各种嵌入式系统中。本项目采用串行接口方式驱动LCD12864,相比并行接口方式,可以节省更多的IO引脚资源,非常适合引脚资源有限的STM32微控制器使用。 正弦函数是数学中最基础的周期函数之一,在信号处理、通信系统、音频处理等领域有着广泛的应用。通过在LCD12864上实时显示正弦波形,不仅能够直观地展示正弦函数的周期性特征,还能帮助理解数字信号处理的基本原理。 本项目的核心功能包括:LCD12864的初始化配置、串行通信接口的实现、正弦函数数据的计算与存储、波形绘制算法的实现等。通过这个项目,读者可以深入学习STM32的GPIO、SPI通信、定时器等外设的使用方法,掌握图形显示的基本原理和编程技巧。 直接放到之前写的文章里了,免费开源,下载学习即可。 本项目采用STM32F103系列微控制器作为主控芯片,该系列基于ARM Cortex-M3内核,具有丰富的外设资源和良好的性价比。STM32F103C8T6是最常用的型号,具有64KB Flash存储器、20KB SRAM、48个GPIO引脚,完全满足本项目的需求。 STM32F103的主要特性包括: LCD12864是一款128×64点阵的图形型液晶显示模块,内置ST7920控制器,支持串行和并行两种通信方式。主要技术参数如下: 采用串行接口方式连接STM32和LCD12864,需要以下连接: 软件系统采用模块化设计,主要包含以下模块: LCD12864的串行通信协议采用三线制(CS、SID、SCLK),数据传输时序严格遵循ST7920控制器的规范。以下是LCD12864初始化的核心代码: 正弦函数波形的绘制需要将数学上的连续函数转换为离散的点阵显示。LCD12864的分辨率为128×64,我们需要在这个有限的像素空间内绘制出平滑的正弦波形。 正弦函数的基本公式为:y = A × sin(ωx + φ) + k 其中: 以下是正弦波形绘制的核心代码: 主程序负责系统的初始化和功能协调,通过定时器实现波形的动态刷新,或者通过按键实现不同参数波形的切换。 LCD12864的串行通信采用SPI时序,但与标准SPI有所不同。ST7920控制器定义了特殊的通信协议,每个字节传输需要先发送5个同步字节,然后发送RS位和数据位。这种设计虽然增加了通信开销,但提高了通信的可靠性。 在点阵显示屏上绘制平滑曲线需要采用适当的算法。本项目使用Bresenham直线算法来连接离散的正弦函数点,这种方法计算效率高,适合在资源有限的嵌入式系统中使用。 STM32F103具有硬件浮点运算单元,但为了提高运算效率,在实际应用中可以考虑使用定点数运算代替浮点数运算,或者使用查表法预先计算正弦函数值。 为了提高显示效率,可以建立显示缓冲区,先在内存中完成图形绘制,然后一次性更新到LCD显示屏。这种方法可以减少LCD的访问次数,提高显示速度。 本项目通过STM32驱动LCD12864显示正弦函数波形,展示了嵌入式系统图形显示的基本原理和实现方法。项目涵盖了硬件设计、软件编程、算法实现等多个方面的知识,是学习STM32嵌入式开发的综合性实践项目。 通过本项目的学习,读者可以掌握STM32的GPIO配置、串行通信、定时器使用等基本技能,理解图形显示的原理和方法,为后续更复杂的项目开发打下坚实的基础。项目的代码结构清晰,功能模块化,便于学习和扩展。 项目采用开源方式发布,欢迎广大爱好者学习交流,共同进步。希望这个项目能够帮助更多人了解嵌入式开发的魅力,激发对电子技术的兴趣和热情。【免费开源】stm32串行驱动LCD12864显示正弦函数 波形可视化神器完整项目分享
一、项目概述
源码分享
https://blog.csdn.net/weixin_52908342/article/details/158101046二、系统设计流程图
三、硬件设计
3.1 STM32微控制器选型

3.2 LCD12864液晶显示屏
3.3 硬件连接方案
四、软件设计
4.1 系统架构设计
4.2 LCD12864驱动程序
#include "stm32f10x.h"
#define LCD_CS_PIN GPIO_Pin_0
#define LCD_SID_PIN GPIO_Pin_1
#define LCD_SCLK_PIN GPIO_Pin_2
#define LCD_RST_PIN GPIO_Pin_3
#define LCD_PORT GPIOA
void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = LCD_CS_PIN | LCD_SID_PIN | LCD_SCLK_PIN | LCD_RST_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
GPIO_SetBits(LCD_PORT, LCD_CS_PIN);
GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
GPIO_SetBits(LCD_PORT, LCD_RST_PIN);
}
void LCD_WriteByte(uint8_t data, uint8_t rs)
{
uint8_t i;
uint8_t temp;
GPIO_ResetBits(LCD_PORT, LCD_CS_PIN);
for(i = 0; i < 5; i++) {
GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
}
GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
if(rs) GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
else GPIO_ResetBits(LCD_PORT, LCD_SID_PIN);
GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
for(i = 0; i < 4; i++) {
temp = data;
temp = temp << i;
temp = temp & 0x80;
GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
if(temp) GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
else GPIO_ResetBits(LCD_PORT, LCD_SID_PIN);
GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
}
for(i = 4; i < 8; i++) {
temp = data;
temp = temp << i;
temp = temp & 0x80;
GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
if(temp) GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
else GPIO_ResetBits(LCD_PORT, LCD_SID_PIN);
GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
}
GPIO_SetBits(LCD_PORT, LCD_CS_PIN);
}
void LCD_WriteCommand(uint8_t cmd)
{
LCD_WriteByte(0xf8, 0);
LCD_WriteByte(cmd & 0xf0, 1);
LCD_WriteByte((cmd << 4) & 0xf0, 1);
}
void LCD_WriteData(uint8_t data)
{
LCD_WriteByte(0xfa, 0);
LCD_WriteByte(data & 0xf0, 1);
LCD_WriteByte((data << 4) & 0xf0, 1);
}
void LCD_Init(void)
{
LCD_GPIO_Init();
GPIO_ResetBits(LCD_PORT, LCD_RST_PIN);
Delay_ms(10);
GPIO_SetBits(LCD_PORT, LCD_RST_PIN);
Delay_ms(10);
LCD_WriteCommand(0x30);
Delay_ms(5);
LCD_WriteCommand(0x30);
Delay_ms(5);
LCD_WriteCommand(0x0c);
Delay_ms(5);
LCD_WriteCommand(0x01);
Delay_ms(5);
LCD_WriteCommand(0x06);
Delay_ms(5);
}
void LCD_Clear(void)
{
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x01);
Delay_ms(10);
}4.3 正弦函数波形绘制
#include <math.h>
#define PI 3.14159265358979323846
#define LCD_WIDTH 128
#define LCD_HEIGHT 64
void LCD_DrawPoint(uint8_t x, uint8_t y)
{
uint8_t x_addr, y_addr;
uint8_t bit_data;
if(x >= LCD_WIDTH || y >= LCD_HEIGHT) return;
y_addr = y / 8;
bit_data = 0x01 << (y % 8);
LCD_WriteCommand(0x80 | y_addr);
LCD_WriteCommand(0x80 | x);
LCD_WriteData(bit_data);
}
void LCD_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
{
int dx, dy, sx, sy, err, e2;
dx = abs(x2 - x1);
dy = abs(y2 - y1);
if(x1 < x2) sx = 1;
else sx = -1;
if(y1 < y2) sy = 1;
else sy = -1;
err = dx - dy;
while(1) {
LCD_DrawPoint(x1, y1);
if(x1 == x2 && y1 == y2) break;
e2 = 2 * err;
if(e2 > -dy) {
err -= dy;
x1 += sx;
}
if(e2 < dx) {
err += dx;
y1 += sy;
}
}
}
void LCD_DrawSineWave(void)
{
uint8_t x, y;
float angle;
float amplitude = 25.0;
float frequency = 2.0;
float offset = 32.0;
LCD_Clear();
LCD_WriteCommand(0x34);
LCD_WriteCommand(0x36);
for(x = 0; x < LCD_WIDTH; x++) {
angle = (float)x * frequency * 2.0 * PI / LCD_WIDTH;
y = (uint8_t)(offset + amplitude * sin(angle));
LCD_DrawPoint(x, y);
if(x > 0) {
uint8_t prev_x = x - 1;
float prev_angle = (float)prev_x * frequency * 2.0 * PI / LCD_WIDTH;
uint8_t prev_y = (uint8_t)(offset + amplitude * sin(prev_angle));
LCD_DrawLine(prev_x, prev_y, x, y);
}
}
LCD_WriteCommand(0x30);
}
void LCD_DisplayText(uint8_t x, uint8_t y, char *str)
{
LCD_WriteCommand(0x80 | y);
LCD_WriteCommand(0x80 | x);
while(*str != '\0') {
LCD_WriteData(*str);
str++;
}
}4.4 主程序设计
int main(void)
{
SystemInit();
LCD_Init();
LCD_Clear();
LCD_DisplayText(0, 0, "Sine Wave Demo");
Delay_ms(1000);
LCD_DrawSineWave();
LCD_DisplayText(0, 2, "y=A*sin(wx+phi)+k");
LCD_DisplayText(0, 4, "A=25, w=2, phi=0");
LCD_DisplayText(0, 6, "k=32");
while(1) {
Delay_ms(1000);
}
}
void Delay_ms(uint32_t ms)
{
uint32_t i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 9000; j++);
}五、关键技术点分析
5.1 串行通信时序
5.2 图形绘制算法
5.3 浮点数运算优化
5.4 显示缓冲区管理
六、项目扩展与应用
6.1 功能扩展
6.2 应用场景
七、总结
八、参考资料









没有 mitm/rewrite 之类的需求
稳定可靠最好可以和 mac 兼容一套
这年头,谁家里还没个“小爱同学”? 但说实话,用久了你一定也发现了: 问点复杂的,她就开始装傻—— 如果我告诉你:只要 5 分钟,就能让家里这个“只会听指令的小爱”,直接升级成能写代码、能做方案、能陪你聊天的 AI 大神,你愿不愿意折腾一下? 今天这篇文章,就是一个真正能照着做、不踩坑的保姆级教程。 一句话总结: 👉 给小爱同学换个“更聪明的大脑”。 最关键的一点:不用买新硬件。 在开始之前,先确认你有下面这些: 1️⃣ 小米账号(已经绑定小爱音箱) 没什么技术门槛,全程网页操作。 打开: 注册并登录后,你会看到一个非常清爽的后台界面。 在后台找到 「我的账号」 → 立即配置。 这里需要填写: 这一步的作用: 这里可以给小爱定一个“人设”。 比如: 你写什么,它就按什么性格跟你说话。 绑定小米账号后: 选中你要用的那个即可。 这里我们用 小米 Xiaomi MiMo 模型 举例: 创建并复制你的 API Key。 进入设备 → AI 服务配置: 使用方式很简单: 👉 先唤醒小爱 → 再说「请问 + 你的问题」 可以用你刚才设定的 AI 角色关键词,测试是否生效。 以前: 现在: 一句话,全都能接住。 不用再照本宣科, 1️⃣ 延迟是正常的: 2️⃣ 随时可解绑: 当那个原本只会报天气的小音箱, 👉 这 5 分钟,真的值。 如果你在配置过程中遇到问题, 关注我,后面继续分享更多智能家居和 AI 的“野路子玩法”。
“哎呀,这个问题难倒我了”;
想让她写个周报、出个方案、分析点东西?
除了放歌、设闹钟,基本属于智商掉线状态。
我们用一个叫 Lerio AI Speaker 的工具,
给小爱同学来一次“原地飞升”。一、为什么要折腾这一出?
升级前的小爱:
升级后的小爱:
你家现在那个小爱音箱,直接就能用。二、准备工作(3样东西就够)
2️⃣ Lerio AI Speaker 账号(音箱和大模型之间的“中转站”)
3️⃣ Xiaomi MiMo API 开放平台账号(用小米账号就能登录)三、手把手教程(一步一步来)
1️⃣ 登录 Lerio 控制台
👉 https://mi.lerio.cn/dashboard2️⃣ 授权你的小米账号(关键步骤)
👉 让 Lerio 拿到控制你音箱的权限,否则后面没法通信。# passToken 获取方法
1. 使用 Chrome 浏览器访问小米账号官网并登录
2. 按 F12 打开开发者工具
3. 切换到 Application(应用)
4. 左侧 Cookies → https://account.xiaomi.com
5. 找到 passToken,复制它
注意:不要主动退出小米账号,否则 passToken 会失效
这一块很多人会紧张,其实就是读取 Cookie,用完随时可以解绑。
3️⃣ 创建使用卡槽

4️⃣ 创建 AI 角色(最好玩的地方)

5️⃣ 添加你的小爱音箱
👉 系统会自动拉取你名下所有的小爱设备。
6️⃣ 申请大模型 API Key
👉 https://platform.xiaomimimo.com/#/console/api-keys
7️⃣ 关联大模型(装上灵魂)

8️⃣ 启动服务,开始对话


四、升级后的小爱,能干啥?
场景一:深夜情绪救援
“我可以为你播放一首伤感的歌”
“听得出来你很难受,要不要慢慢说给我听?”
场景二:办公摸鱼神器
场景三:孩子的十万个为什么
它能用孩子听得懂的话,把复杂问题讲清楚。五、一些实用小提醒
云端大模型需要 1~2 秒思考时间。
不想用了,后台一键关闭,小爱立刻恢复原样。写在最后
突然开始跟你聊人生、讲逻辑、写方案,
你会发现:
或者想接入更强的模型,
欢迎在评论区留言,我会一步步帮你搞定。
原文链接:https://www.nocobase.com/cn/blog/nocobase-2-0-officially-released NocoBase 2.0 是一次面向 复杂应用构建与规模化部署 的重要升级。本次版本在 AI 能力、应用架构、数据编辑体验以及前端事件流等方面进行了系统性增强,同时全面推进 V2 页面与核心能力的适配。 AI 能力正式下沉至内核,成为 NocoBase 的一等公民,支持通过插件体系持续扩展: 参考文档: 应用监管器插件用于 统一发现、调度与管理多个 NocoBase 应用实例,适用于多应用与多环境部署场景。 共享内存 多环境混合部署 参考文档: 为满足不同复杂度的关联数据编辑需求,NocoBase 提供两种子表格编辑模式,可按场景灵活选择: 子表格(行内编辑) 子表格(弹窗编辑) 参考文档: 全新的字段赋值对表单数据的 初始化与写入逻辑 进行了统一与强化,显著提升可理解性与一致性: 参考文档: 事件流在执行时,严格按照 Event → Flow → Step 的层级顺序运行,并在各层级的执行前后触发对应 Hook,便于精细化控制与扩展。 参考文档: 参考文档: 参考文档: 参考文档: 参考文档: 参考文档: V2 页面已全面支持本地化,覆盖 页面、区块、操作、字段 等多个层级。 启用本地化插件后,系统将自动收集缺失翻译词条,并集中展示于本地化管理列表,便于统一维护。 在 JS 区块中,可通过 新创建的审批工作流均以 2.0 的区块编排界面。1.x 已配置的仍支持继续使用,如 1.x 已配置的审批希望使用 2.0 的界面编排,需要选择 v2 版本重新配置界面,且配置后不能再还原到 1.x。 新创建的抄送节点,被抄送人的查看界面均以 2.0 的区块编排,1.x 已配置的仍支持继续使用,如 1.x 已配置的抄送希望使用 2.0 的界面编排,需要选择 v2 版本重新配置界面,且配置后不能再还原到 1.x。 以下功能模块尚未在 2.0 中完成适配,将在后续版本中逐步升级:新特性
AI 员工

应用监管器


工作流画布编排能力增强
支持拖拽节点调整顺序

支持复制粘贴节点

子表格(行内编辑 / 弹窗编辑)


字段赋值(新版)

事件流触发时机
event:
before:
- track_event_start
flows:
- name: flow1
before:
- track_flow_start
steps:
- name: step1
before: [track_step_start]
run: do_something
after: [track_step_done]
after:
- track_flow_end
- name: flow2
...
- name: flow3
...
after:
- track_event_end
新增 2.0 适配
批量编辑

复制

区块高度

表格行拖拽排序

数据加载方式

表单支持展示关系字段的字段

页面(V2)本地化支持
ctx.t() 获取本地化文案,并支持变量插值:const label = ctx.t('Your name is {{name}}', {
name: await ctx.getVar('ctx.user.nickname')
});
ctx.render(label);审批 2.0
配置发起人的界面

配置审批人的界面

抄送 2.0

尚未适配的功能
功能模块 当前替代方案 自定义请求 工作流请求节点 浏览器打印 JS 操作 分步表单 JS 区块 树筛选区块 JS 区块 日历区块 JS 区块 自定义变量 事件流 甘特图区块 JS 区块 看板区块 JS 区块 文本复制 事件流 表格列设置 JS 操作 样式联动规则 事件流 复制文本快捷键 事件流 二维码字段 JS 字段 扫码录入 事件流 嵌入 NocoBase — 中国行政区字段 — 编码字段 — 公开表单 — 工作流人工节点待办 — 提交成功后 事件流 表单数据模板 事件流
OpenClaw 作为一款功能强大的自主 AI 助手,具备代码执行、工具调用、全平台消息集成等核心能力,能够自主完成各类复杂任务。搜索功能作为其获取实时信息、拓展知识边界的关键模块,合理配置搜索工具可大幅提升其使用体验。本文将详细讲解如何在 OpenClaw 中部署 SearXNG(自建)、DuckDuckGo 和 Tavily 三种主流搜索工具,对比各方案优劣并提供精准选型建议,助力不同需求的用户快速完成配置、高效使用。 三种搜索工具在成本、配置难度、适用场景上各有侧重,结合自身需求选择合适方案,可实现效率与体验的双重提升。以下是详细对比: | 搜索方案 | 成本投入 | 配置难度 | 推荐场景 | 关键备注 | | SearXNG(自建) | 完全免费 | 高 | 对数据隐私有极高要求、需要完全掌控搜索流程、追求高可用性的用户,如隐私敏感型开发、企业内部搜索场景 | 需自行部署服务器,支持 q(搜索词)和 format=json(返回格式)参数,可通过 Docker 快速部署 | | DuckDuckGo | 完全免费 | 低 | 个人学习、功能测试、快速获取即时答案,无需复杂配置,追求便捷性的场景 | 无需注册账号、无需 API Key,可直接调用公开 API,但搜索质量相较于 Tavily 略逊一筹 | | Tavily | 免费额度+付费升级 | 中 | 商业项目开发、需要高质量、结构化实时数据,对搜索结果准确性要求较高的场景 | 免费计划每月提供 1000 次搜索额度,无需信用卡验证,国内网络环境下访问友好 | DuckDuckGo 的 Instant Answer API 为公开接口,无需注册和 API Key,是 OpenClaw 最易配置的默认搜索工具,适合所有新手用户快速上手。 DuckDuckGo 的 API 地址固定不变,支持多种参数自定义搜索结果,核心参数如下: 可根据自身需求选择配置方式,修改配置文件为推荐方案,适合长期使用;web_fetch 工具调用适合临时测试,无需修改全局配置。 方法一:修改配置文件(推荐,全局生效) OpenClaw 的配置文件通常位于两个路径之一,可根据自身系统查找:~/.openclaw/openclaw.json 或 ~/.claude/settings.json。编辑该文件,添加如下配置,将搜索提供者指向 DuckDuckGo: 方法二:使用 web_fetch 工具(临时调用,无需修改配置) 若无需全局启用 DuckDuckGo,可直接在 OpenClaw 对话中通过 web_fetch 工具调用 API,示例如下(搜索“Python 编程”): 配置完成后,重启 OpenClaw 生效。重启后尝试提问:“今天有什么新闻?”,若 OpenClaw 能返回带有 DuckDuckGo 来源的搜索结果,且格式清晰、内容可正常解析,说明配置成功。 避坑提示:若未返回结果,可检查网络连接,或确认 API 参数是否完整(重点核对 format=json 参数),公共 API 存在频率限制,可适当延长请求间隔或使用代理提升稳定性。 Tavily 是专为 AI Agent 设计的搜索工具,搜索结果质量高、结构化强,且提供免费额度,兼顾实用性与专业性,适合日常办公、商业项目等对搜索质量有要求的场景,国内用户可顺畅使用。 Tavily 需通过 OpenClaw 的技能市场安装对应插件,方可在 OpenClaw 中调用,打开 OpenClaw 终端,执行以下任一命令即可完成安装: 安装完成后,终端会提示“安装成功”,若出现安装失败,可检查网络连接或更新 OpenClaw 至最新版本。 安装技能后,需将获取的 Tavily API Key 设置为系统环境变量,确保 OpenClaw 能正常调用,不同操作系统的设置方法如下: Linux / macOS 系统(终端执行): Windows 系统(PowerShell 执行): 提示:环境变量仅临时生效,若需长期使用,可将上述命令添加至系统配置文件(如 Linux 的 ~/.bashrc、macOS 的 ~/.zshrc)。 重启 OpenClaw 后,尝试提问:“帮我搜索最新的 AI 技术趋势”,若 OpenClaw 能够返回带有明确来源、结构化的搜索结果(如包含标题、链接、摘要),且无报错提示,说明配置成功。 SearXNG 是一款开源、去中心化的元搜索引擎,可聚合多个搜索服务的结果,且能保证用户隐私不被追踪分析。自建 SearXNG 实例可完全掌控数据流向,但配置难度较高,需具备服务器部署基础,适合对隐私保护和定制化有极致需求的用户。 在配置 OpenClaw 集成前,需先完成 SearXNG 实例的自建部署,确保满足以下条件: 补充:SearXNG Docker 快速部署命令(参考): 由于 SearXNG 是自定义实例,OpenClaw 无内置 Provider,需通过自定义工具或修改配置文件的方式集成,推荐新手使用 web_fetch 工具,操作更简单。 方法一:使用 web_fetch 工具(最直接,适合新手) 无需修改全局配置,直接在 OpenClaw 对话中调用 web_fetch 工具,访问自建的 SearXNG 实例 API,示例如下(搜索“OpenAI”): 方法二:修改配置文件(高级,全局生效,需开发基础) 编辑 OpenClaw 配置文件,添加自定义搜索工具,配置如下(需自行编写对应函数实现搜索逻辑): 注:此方法需要具备一定的开发能力,需编写 custom_search 函数的具体实现,实现与 SearXNG 实例的交互、结果解析等逻辑,适合有开发基础的用户。 使用 web_fetch 工具执行上述示例代码,若能成功返回 SearXNG 实例的 JSON 格式搜索结果,且结果可正常解析,说明 OpenClaw 与 SearXNG 实例集成成功。若未返回结果,可检查 SearXNG 实例是否正常运行、实例地址是否正确,或确认 JSON 输出格式是否已启用。 本文详细讲解了三种主流搜索工具在 OpenClaw 中的配置流程,结合各方案的核心优势,再次梳理选型与使用要点,帮助用户快速落地: 通过本文的配置指南,相信你能快速完成 OpenClaw 搜索功能的部署与优化。根据自身需求选择合适的搜索方案,让 OpenClaw 更好地为你获取实时信息、提升工作与学习效率。若在配置过程中遇到其他问题,可参考 OpenClaw 官方文档或 SearXNG、Tavily 官方教程进一步排查。 本文由mdnice多平台发布一、搜索方案对比与选型指南
💡 选型核心建议:若追求零成本、零配置,仅用于个人测试和即时查询,首选 DuckDuckGo;若需要高质量、结构化搜索结果,兼顾便捷性与实用性,优先选择 Tavily;若对隐私保护和定制化有极致需求,且具备服务器部署能力,可选择自建 SearXNG 实例。
二、详细配置步骤(按配置难度从低到高)
2.1 配置 DuckDuckGo(Instant Answer API)
2.1.1 获取 API 地址与参数
https://api.duckduckgo.com/2.1.2 在 OpenClaw 中配置(两种方法)
{
"tools": {
"web": {
"search": {
"provider": "duckduckgo",
"apiKey": "", // DuckDuckGo 无需 API Key,留空即可
"maxResults": 5, // 最多返回 5 条搜索结果,可按需调整
"timeoutSeconds": 30 // 超时时间 30 秒,避免请求卡顿
}
}
}
}
# 示例:搜索 "Python 编程",调用 DuckDuckGo API
url = 'https://api.duckduckgo.com/?q=Python%20%E7%BC%96%E7%A8%8B&format=json&no_html=1&skip_disambig=1'
print(web_fetch(url=url))
2.1.3 配置验证
2.2 配置 Tavily(Research Skill)
2.2.1 获取 Tavily API Key
2.2.2 安装 Tavily Research Skill
# 方法一:使用 ClawHub(OpenClaw 官方技能市场)安装
npx clawhub@latest install tavily-search
# 方法二:使用 Skills 命令直接添加
npx skills add tavily-ai/skills@research
2.2.3 配置 API Key(设置环境变量)
export TAVILY_API_KEY="tvly-your-api-key-here" # 替换为你的实际 API Key$env:TAVILY_API_KEY="tvly-your-api-key-here" # 替换为你的实际 API Key2.2.4 配置验证
2.3 配置 SearXNG(自建实例)
2.3.1 前提条件
# 拉取 SearXNG 镜像
docker pull searxng/searxng
# 启动容器,映射 8080 端口(可按需修改)
docker run -d -p 8080:8080 --name searxng searxng/searxng
2.3.2 在 OpenClaw 中配置(两种方法)
# 示例:搜索 "OpenAI",调用自建 SearXNG 实例
url = 'http://your-searxng-server:8080/search?q=OpenAI&format=json' # 替换为你的实例地址
print(web_fetch(url=url))
{
"tools": {
"custom_search": {
"type": "function",
"function": {
"name": "custom_search",
"description": "Search the web using a custom SearXNG instance(通过自定义 SearXNG 实例搜索网络)",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The search query(搜索关键词)"
}
},
"required": ["query"] // 必传参数:搜索关键词
}
}
}
}
}
2.3.3 配置验证
三、总结与常见问题解答
3.1 核心总结
3.2 常见问题解答(FAQ)
A:检查网络连接是否正常,确认 API 参数是否完整(重点核对 format=json),若频繁请求失败,可添加代理提升稳定性,避免触发公共 API 频率限制。
A:确认 API Key 输入正确(注意 tvly-前缀不可遗漏),检查环境变量是否设置成功,重启 OpenClaw 后再次尝试。
A:检查 SearXNG 实例是否正常运行,确认配置文件中已启用 JSON 输出格式,实例地址是否正确(避免端口冲突),可直接在浏览器访问实例地址,验证是否能正常返回搜索结果。
A:可以,OpenClaw 支持多搜索工具并存,可根据不同场景在对话中手动指定使用哪种工具,或通过配置文件设置默认工具。
我每天启动 Claude Code 大约 30 次。在不同项目之间切换,每次都要执行同样的流程: 换个项目,再来一遍: 一天 30 次,4 步操作 × 20 秒 = 每天浪费 10 分钟。一年就是 60 小时。 问题不在 Claude Code 本身——它很好用。问题在于启动它的工作流太笨了。所以我做了 GroAsk,一个 macOS 菜单栏的 AI 启动器,用全局快捷键 按 关键点:不是打开终端让你输入,而是终端打开时 Claude Code 已经带着你的指令在跑了。 路径来源有三个优先级: 这是项目里最有技术含量的部分。macOS 上四种主流终端,每一种的自动化实现完全不同。 最标准的实现。AppleScript 字典完整,可以控制窗口、Tab、执行任意命令。 和 Terminal.app 类似,但 API 更现代。Profile 支持让你可以指定特定的终端配置。 Ghostty 是 Mitchell Hashimoto 做的新终端,性能很好但没有 AppleScript 支持。用 踩坑点: Warp 是最棘手的。没有 AppleScript,没有 唯一能用的是 Launch Configuration 机制: 然后通过 URI scheme 触发: GroAsk 每次启动时动态生成这个 YAML 文件,写入 Warp 配置目录,再触发 URI scheme。多了一步文件 I/O,但用户体验和其他终端一致。 因为没法统一。四种终端的能力边界完全不同: 只能逐个适配,做四套实现。 不同 CLI AI 工具的安装路径差异很大: 有 curl 安装器的工具(Claude Code、Kimi Code): 依赖 npm 的工具(Gemini CLI、Codex)需要处理依赖链: 全程不需要 sudo、Homebrew、Xcode Command Line Tools。 安装触发后,后台每 2 秒执行一次检测: 用 macOS GUI 应用不加载 shell profile,PATH 和终端里不一样。GroAsk 的做法: 用 再加上文件系统扫描兜底——扫描 GroAsk 支持 6 个 CLI AI + 4 个 Web AI: 同一个 | 能力 | Claude Code Now | Raycast 插件 | GroAsk | GroAsk 本身就是 Claude Code 协作的产物: 每个模块——AppleScript 终端控制、WebKit 注入脚本、PATH 环境检测、Cloudflare Workers 后端——都是我定方向、Claude Code 写实现、我审代码的循环。 GroAsk 免费,macOS 原生,100% 本地桥接,不存数据。 欢迎 Star,有问题到 GitHub Discussions 聊。背景
cd ~/Projects/my-app
claude "fix the login bug"cd ~/Projects/api-server
claude "add rate limiting"⌥Space 一步到位。一键启动的实现
用户视角
传统方式:
打开终端 → cd ~/Projects/my-app → claude "fix the login bug" → 等
GroAsk:
⌥Space → 输入 "fix the login bug" → 回车⌥Space(可自定义),弹出输入框。选 Claude Code 通道,写 prompt,回车。终端自动打开,cd 到正确目录,带着 prompt 直接启动 Agent。工作目录检测
/app fix bug 展开为 cd ~/Projects/my-app && claude "fix bug"四种终端的自动化差异
Terminal.app — AppleScript
do scripttell application "Terminal"
activate
do script "cd ~/Projects/my-app && claude \"fix the login bug\""
end telliTerm2 — AppleScript
create window with profiletell application "iTerm"
activate
create window with profile "Default" command "cd ~/Projects/my-app && claude \"fix the login bug\""
end tellGhostty —
-e 参数 + login shell 包装-e 参数启动:open -na Ghostty --args -e bash -l -c 'cd ~/Projects/my-app && claude "fix the login bug"'-e 是替换 shell 而不是在 shell 里执行,.zshrc 不会加载,PATH 不完整。所以必须包一层 bash -l -c 来加载完整的 shell profile。Warp — YAML Launch Config + URI scheme
-e 参数,没有任何编程接口。# ~/.warp/launch_configurations/groask_session.yaml
---
name: groask_session
windows:
- tabs:
- layout:
cwd: ~/Projects/my-app
command: claude "fix the login bug"open "warp://action/launch?config=groask_session"为什么不统一抽象?
终端 AppleScript -e 参数配置文件触发 窗口控制 Terminal.app 完整 - - 完整 iTerm2 完整 - - 完整 Ghostty 无 有(替换 shell) - 无 Warp 无 无 有 无 一键安装 CLI 工具
依赖链自动处理
# 一行搞定
curl -fsSL https://cli.example.com/install.sh | bash
# 自动追加 PATH 到 .zshrc
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc检测 npm → 有就直接装
→ 没有,检测 fnm → 有就用 fnm 装 Node.js 再装 CLI
→ 没有 → 装 fnm → 装 Node.js → 装 CLI安装状态轮询
bash -l -c 'command -v claude'bash -l 加载完整 shell 环境,确保能发现 fnm 刚安装的工具。检测到就立刻刷新 UI。设了 3 分钟超时保护。PATH 问题的解决
bash -l -c 'printf MARKER%s "$PATH"'MARKER 前缀隔离 conda/pyenv 等工具在 shell 初始化时输出到 stdout 的噪声。~/.local/bin、~/.cargo/bin、Homebrew 路径、nvm/fnm/Volta/mise 的安装路径,覆盖所有安装方式。不只是 Claude Code
⌥Space 输入框,Tab 切换不同 AI。还支持划词即问——选中文本,按快捷键,自动填入输入框发给 AI。竞品对比
|------|:-:|:-:|:-:|
| 启动方式 | Dock 图标 | Raycast 搜索 | ⌥Space 全局快捷键 |
| 带 prompt 启动 | 不支持 | 不支持 | 支持 |
| 多终端 | 仅 Terminal.app | Terminal/Alacritty/Ghostty/Warp | Terminal/iTerm2/Ghostty/Warp |
| 图形化安装 | 不支持 | 不支持 | 支持,依赖链全自动 |
| 多 AI 切换 | 仅 Claude Code | 仅 Claude Code | 6 CLI + 4 Web AI |
| 划词即问 | 不支持 | 不支持 | 支持 |用 Claude Code 做了一个 Claude Code 启动器
如需下载该数据集,可通过以下方式获取: 随着城市化与交通运输业的快速发展,道路基础设施的健康状况直接关系到出行安全与城市运行效率。据统计,全球每年因道路缺陷引发的交通事故造成数十万人死亡,经济损失高达数千亿美元。长期高强度的使用、气候变化以及施工质量差异,都会导致道路表面出现裂缝、坑洼、井盖下沉及修补不良等缺陷。这些问题不仅影响驾驶舒适度,还可能引发交通事故,增加道路养护成本。 传统的道路巡检方式主要依靠人工目测或简单的仪器检测,存在效率低、准确性不足、主观性强等局限。例如,人工巡检需要大量的人力物力,检测速度慢,难以实现对大面积道路的快速覆盖;检测结果依赖于巡检人员的经验和责任心,容易出现漏检、误检等情况。 近年来,随着深度学习与计算机视觉技术的飞速发展,利用图像识别算法实现道路缺陷的自动化检测与分类成为研究热点。这种方法通过训练深度学习模型,从道路图像中自动识别缺陷类型和位置,具有高效、准确、可扩展性强等优点。然而,要开发出准确、可靠的道路缺陷检测模型,高质量、多样化且已标注的数据集是关键基础。 为满足这一需求,我们构建了一个涵盖多类缺陷的道路表面缺陷数据集,共计6000张高分辨率图片,涵盖了常见的裂缝、井盖、坑洼、修补区域等多种复杂场景。该数据集采用YOLO项目标准格式,并已完成train、val、test划分与标注,可直接用于深度学习模型的训练与验证。本文将对该数据集进行详细介绍,包括数据集背景、概述、结构、特点、适用场景等内容,旨在为相关研究和应用提供参考。 道路是城市基础设施的重要组成部分,其质量直接影响到交通运行效率和交通安全。据交通运输部统计,我国公路总里程已超过530万公里,其中高速公路总里程超过16万公里,居世界第一。随着公路里程的不断增加和交通量的持续增长,道路养护任务日益繁重。 道路表面缺陷是道路养护中的常见问题,主要包括以下几种类型: 传统的道路缺陷检测方法主要包括以下几种: 基于深度学习的图像识别技术为道路缺陷检测提供了新的解决方案。这种方法通过训练深度学习模型,从道路图像中自动识别缺陷类型和位置,具有以下优势: 然而,要开发出准确、可靠的道路缺陷检测模型,高质量、多样化且已标注的数据集是关键基础。目前,公开可用的道路缺陷图像数据集存在以下问题: 为应对这些挑战,我们构建了本数据集,旨在为道路缺陷检测算法的研究与落地提供高质量的数据支持。 本数据集专注于道路表面缺陷检测与识别,共计6000张高分辨率图片,涵盖了常见的裂缝、井盖、坑洼、修补区域等多种复杂场景。所有图片均经过精心筛选与标注,确保数据的准确性与代表性。 类别定义: 数据划分: 图像特征: 本数据集采用标准的文件夹结构进行组织,具体如下: 其中, 本数据集采用YOLO标准格式进行标注,每个标注文件对应一张图像,文件名与图像文件名相同,后缀为 其中, 本数据集的图像来源于多个城市的道路巡检,涵盖了不同类型、不同等级的道路。为确保数据集的质量和多样性,我们在数据采集过程中遵循了以下原则: 在数据处理过程中,我们对图像进行了以下处理: 本数据集包含8类道路表面缺陷,各类别的样本数量分布如下: 注:样本数量为估计值,实际样本数量可能因数据采集和处理过程而有所差异。 本数据集的图像涵盖了多种实际场景,包括: 这种场景多样性使得数据集能够更好地模拟实际道路环境,提高模型的泛化能力。 为确保数据集的质量和可用性,我们在构建过程中遵循了严格的数据处理流程,具体步骤如下: 本数据集具有以下显著特点: 共计6000张高分辨率图片,涵盖了8类道路表面缺陷,每个类别均有足够的样本量,确保模型训练的充分性。与其他同类数据集相比,本数据集的样本数量更多,类别覆盖更全面。 数据集涵盖了不同城市、不同道路类型、不同天气条件、不同光照条件下的道路图像,场景多样性强。这种多样性使得模型在训练过程中能够学习到不同场景下的缺陷特征,提高模型的泛化能力。 所有图像均由专业人员进行手动标注,标注准确、一致。标注过程中严格遵循统一的标注规范,确保边界框的准确性和类别的一致性。高质量的标注为模型训练提供了可靠的基础。 数据集采用YOLO标准格式进行标注,已按照训练集、验证集和测试集进行了合理划分,可直接用于主流目标检测框架的训练和验证。用户无需进行格式转换或数据划分,开箱即用,提高了数据集的易用性。 数据集涵盖了道路表面常见的多种缺陷类型,应用价值广泛。可用于道路缺陷检测、智能交通系统、自动驾驶感知等多个领域,为相关研究和应用提供数据支持。 数据集的图像均来自实际道路巡检,贴近实际应用场景。包含了各种复杂情况,如不同光照、不同天气、不同路面材料等,使得模型在实际应用中能够更好地适应各种情况。 数据集的图像分辨率统一为高清规格,缺陷特征清晰可见。高分辨率图像有助于模型学习到更多的细节特征,提高检测精度。 本数据集可广泛应用于以下研究与工程应用场景: 可直接用于训练YOLOv5、YOLOv8等目标检测模型,实现对道路表面缺陷的自动检测和分类。通过在本数据集上训练模型,可以提高道路缺陷检测的准确率和效率,为道路养护提供技术支持。 可作为智能交通系统的感知层数据支撑,用于城市道路养护、交通安全监测等。例如,可以集成到城市交通管理系统中,实时监测道路状况,及时发现和处理道路缺陷,提高道路养护效率和交通安全水平。 在自动驾驶系统中,道路表面信息是重要的环境感知因素。本数据集可用于训练自动驾驶系统的感知模块,提高车辆对道路表面状况的识别能力,为路径规划和驾驶决策提供依据。 可作为目标检测、分割、异常检测等领域的benchmark,用于验证新模型的有效性。例如,可以用于比较不同目标检测算法在道路缺陷检测任务上的性能,或者用于研究新的目标检测方法和技术。 适用于道路养护部门开发的AI道路巡检机器人或无人机检测系统,帮助减少人力巡检成本,提高检测效率。例如,可以部署在巡检车辆或无人机上,实现对道路的自动巡检和缺陷检测。 可用于构建道路养护决策支持系统,基于检测结果评估道路状况,制定合理的养护计划。例如,可以根据缺陷的类型、严重程度和分布情况,预测道路的使用寿命,优化养护资源分配。 可集成到城市管理系统中,作为智慧城市建设的一部分。例如,可以与地理信息系统(GIS)结合,实现道路缺陷的空间分布分析,为城市规划和建设提供参考。 针对本数据集的特点,我们提出以下模型训练建议: 对于道路缺陷检测任务,建议使用以下模型: 由于道路缺陷检测任务的特殊性,建议使用以下数据增强技术: 使用以下指标评估模型性能: 基于本数据集训练的YOLOv8模型,开发了一款智能道路巡检系统。该系统通过安装在巡检车辆上的摄像头实时采集道路图像,然后利用训练好的模型自动识别图像中的道路缺陷。系统会生成巡检报告,标记出缺陷位置、类型和严重程度,并提供养护建议。该系统已在多个城市的道路养护部门试用,巡检效率提高了70%以上,缺陷检测准确率达到90%以上。 将训练好的模型集成到城市道路养护管理系统中,实现对城市道路状况的实时监测和管理。系统通过分析巡检车辆采集的图像,自动识别道路缺陷,生成缺陷分布图和养护优先级报告。养护部门可以根据这些信息制定合理的养护计划,优化养护资源分配。该系统已在某省会城市部署,道路养护效率提高了50%以上,养护成本降低了30%以上。 利用本数据集训练的模型,开发了一款自动驾驶感知系统的道路表面状况检测模块。该模块通过车载摄像头采集道路图像,实时识别道路表面的缺陷,如裂缝、坑洼、井盖等,并将这些信息传递给自动驾驶决策系统。决策系统会根据道路状况调整行驶策略,如减速、绕避等,提高自动驾驶的安全性和舒适性。该模块已在某自动驾驶测试车辆上试用,车辆对道路缺陷的识别准确率达到95%以上,能够及时调整行驶策略,避免因道路缺陷引发的安全问题。 将训练好的轻量化模型部署到无人机上,开发了一款无人机道路巡检系统。该系统通过无人机航拍获取道路图像,然后利用训练好的模型自动识别图像中的道路缺陷。无人机可以快速覆盖大面积道路,特别适合交通繁忙的高速公路和难以到达的偏远地区。该系统已在某高速公路管理局试用,巡检速度提高了10倍以上,能够及时发现和处理道路缺陷,提高高速公路的安全性和畅通性。 在构建和使用本数据集的过程中,我们遇到了以下技术挑战,并提出了相应的解决方案: 挑战:道路缺陷类型多样,形态各异,不同类型的缺陷特征差异较大,同一类型的缺陷在不同场景下也有很大差异。 挑战:不同光照和天气条件下,道路缺陷的外观差异很大,模型在一种条件下训练的效果可能在另一种条件下表现不佳。 挑战:一些道路缺陷(如细小裂缝)在图像中占比较小,属于小目标,传统的目标检测模型难以有效检测。 挑战:在实际应用中,如嵌入式设备、移动设备等资源受限的平台上部署模型,需要考虑模型大小和计算复杂度。 挑战:手动标注道路缺陷工作量大,效率低,成本高。 本数据集是我们在道路缺陷检测领域的初步尝试,未来我们计划从以下几个方面对数据集进行扩展和完善: 道路是城市的动脉,其质量直接关系到城市的运行效率和居民的生活质量。随着城市化进程的加快和交通量的持续增长,道路养护任务日益繁重,传统的人工巡检方式已经难以适应现代城市发展的需求。 基于深度学习的道路缺陷检测技术为道路养护提供了新的解决方案,能够实现对道路缺陷的自动检测和分类,提高巡检效率和准确性。而高质量、多样化的数据集是推动这一技术发展的关键基础。 本数据集通过系统性地收集、整理和标注道路表面缺陷图像,为道路缺陷检测算法的研究与落地提供了有力支持。数据集共计6000张高分辨率图片,涵盖了8类道路表面缺陷,场景多样性强,标注质量高,格式标准统一,应用价值广泛。 我们希望通过本数据集的发布,能够促进道路缺陷检测技术的发展,推动智能交通系统和智慧城市建设的进步。我们诚邀学术界与工业界的研究者在此基础上深入探索,共同推动道路缺陷检测技术的创新和应用,为提高道路养护效率、保障交通安全、建设智慧城市做出贡献。 本次发布的《道路表面多类型缺陷的图像识别数据集》为道路养护、智能交通、自动驾驶等领域提供了一个高质量、结构规范的图像识别基准数据集。数据集共包含6000张已标注图像,涵盖了8类道路表面常见缺陷,采用标准YOLO格式,已按训练、验证、测试集划分完毕,可直接应用于YOLOv5、YOLOv8等主流目标检测框架。 该数据集具有样本数量充足、场景多样性强、标注质量高、格式标准统一、应用价值广泛、贴近实际场景、分辨率高等特点,不仅适合用于常规的目标检测任务,也适合开展小目标检测、多模态融合、模型压缩与部署等前沿研究,特别契合道路缺陷检测、智能交通系统、自动驾驶感知等实际应用需求。 通过本数据集的使用和相关技术的应用,我们相信道路缺陷检测技术将会取得更大的突破,为道路养护和交通安全提供更加有力的支持,为智能交通系统和智慧城市建设做出更大的贡献。道路表面多类型缺陷的图像识别数据集分享(适用于目标检测任务)
数据集分享
引言
数据集背景
数据集概述
基本信息
文件结构
dataset/
├── train/
│ ├── images/
│ └── labels/
├── val/
│ ├── images/
│ └── labels/
└── test/
├── images/
└── labels/images文件夹存放不同划分的图像文件,labels文件夹存放对应的YOLO格式标注文件。标注格式
.txt。标注文件的每一行表示一个目标,格式如下:<class_id> <x_center> <y_center> <width> <height>class_id为类别编号,x_center和y_center为目标中心点的归一化坐标,width和height为目标的归一化宽高。坐标值和宽高均为相对于图像宽度和高度的归一化值,范围在0到1之间。数据集详情
数据采集与处理
类别分布
类别编号 类别名称 样本数量(约) 说明 0 Crack 1500+ 道路表面的线性裂缝 1 Manhole 1200+ 道路上的井盖及其周围区域 2 Net 800+ 道路表面的网状裂缝 3 Pothole 1000+ 道路表面的坑洼 4 Patch-Crack 500+ 修补后的裂缝区域 5 Patch-Net 300+ 修补后的网状裂缝区域 6 Patch-Pothole 400+ 修补后的坑洼区域 7 Other 300+ 其他道路表面异常 场景多样性




数据处理流程
数据集特点
1. 样本数量充足
2. 场景多样性强
3. 标注质量高
4. 格式标准统一
5. 应用价值广泛
6. 贴近实际场景
7. 分辨率高
适用场景
1. 道路表面缺陷检测
2. 智能交通系统(ITS)
3. 自动驾驶感知模块
4. 深度学习算法研究
5. 实际工程落地
6. 道路养护决策支持
7. 城市管理系统
模型训练建议
1. 模型选择
2. 数据增强
3. 训练策略
4. 评估指标
5. 模型优化
应用案例
案例一:智能道路巡检系统
案例二:城市道路养护管理系统
案例三:自动驾驶感知系统
案例四:无人机道路巡检系统
技术挑战与解决方案
1. 缺陷多样性和复杂性
解决方案:2. 光照和天气条件变化
解决方案:3. 小目标检测困难
解决方案:4. 模型部署资源受限
解决方案:5. 标注工作量大
解决方案:数据集扩展与未来规划
结语
总结