🐹 日常战报: 写 Go 代码 → 用
pprof
灭火 → 泡咖啡 → 循环🐍 日常战报: 写 Python 时:▇▇▇▇▇ 自动化脚本加载中… 🐞 捕获 BUG:TypeError ×3
💻 日常战报: 写 Shell 时:[[ $? -eq 0 ]] || 重启玄学调试模式
🌿 非技术时刻:骑行川藏线记录 | 胶片摄影暗房教程
💡 终极真理:echo “rm -rf /” > deploy.sh
pprof
灭火 → 泡咖啡 → 循环📡 MCP 协议简明说明文档 什么是 MCP 协议? MCP(Message Calling Protocol)是一种用于“大模型调用工具”的通信协议标准。 它的目标是解决这个问题: 🧠 “模型说要调用工具 A 干点事,那我们怎么告诉它工具叫啥、怎么传参、怎么返回结果呢?” MCP 协议规定了什么?(共 4 点) 1. 工具定义格式 使用 JSON Schema 定义工具的名称、描述和参数: { "name": "get_weather", "description": "获取城市天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名" } }, "required": ["city"] } } 2. 调用请求格式 遵循 JSON-RPC 格式: { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "get_weather", "arguments": { "city": "北京" } } } 3. 返回结果格式 { "jsonrpc": "2.0", "id": 1, "result": { "content": [ { "type": "text", "text": "北京今天晴,最高25度。" } ] } } 支持返回多种类型的数据(如文本、图片、文件等)。 4. 多轮交互 & 中间件机制 支持多轮对话中的函数调用 MCP Server 可实现日志、权限、缓存、调度等中间件机制 MCP 协议需要客户端和服务端做什么? 🖥️ 服务端(MCP Server)职责 功能 说明 接收 JSON-RPC 请求 支持 HTTP / WebSocket / stdio 等方式 查找并执行工具逻辑 按名称 name 执行对应函数或脚本 返回标准格式结果 输出 result.content,统一格式 返回示例: ...
展示下启动完成后的效果 依赖 docker 环境 .env 文件 GITLAB_HOST_IP=192.168.1.8 GITLAB_PORT=8929 GITLAB_ROOT=/Users/mako/gitlab GITLAB_WEB_URL=192.168.1.8:8929 GITLAB_SHELL_SSH_PORT=2224 使用 docker compose 进行安装 # yaml-language-server: $schema=https://cdn.jsdelivr.net/gh/compose-spec/compose-spec@master/schema/compose-spec.json services: web: image: gitlab/gitlab-ce:latest restart: always container_name: gitlab hostname: gitlab environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://${GITLAB_HOST_IP}:${GITLAB_PORT}' gitlab_rails['gitlab_shell_ssh_port'] = ${GITLAB_SHELL_SSH_PORT} ports: - ${GITLAB_PORT}:${GITLAB_PORT} - ${GITLAB_SHELL_SSH_PORT}:22 volumes: - ${GITLAB_ROOT}/config:/etc/gitlab - ${GITLAB_ROOT}/logs:/var/log/gitlab - ${GITLAB_ROOT}/data:/var/opt/gitlab shm_size: 256m runner: image: gitlab/gitlab-runner:latest container_name: gitlab-runner restart: always volumes: - ${GITLAB_ROOT}/runner/config:/etc/gitlab-runner - ${GITLAB_ROOT}/runner/docker.sock:/var/run/docker.sock 控制脚本 control.sh 进行自动更新 .env及启停 在不同网络下本机的 IP 地址变更,只需要 ./control.sh restart 即可,脚本中会自动重新配置 .env 内容 ...
unsafe 包学习 uintptr 和 unsafe.Pointer 的区别 unsafe.Pointer 只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算 而 uintptr 是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象, uintptr 类型的目标会被回收 unsafe.Pointer 可以和 普通指针 进行相互转换 unsafe.Pointer 可以和 uintptr 进行相互转换 示例 package main import ( "fmt" "unsafe" ) type W struct { b int32 c int64 } func main() { var w = new(W) fmt.Println(w.b, w.c) // 通过指针运算给 b 变量赋值 b := unsafe.Pointer(uintptr(unsafe.Pointer(w)) + unsafe.Offsetof(w.b)) *((*int)(b)) = 100 fmt.Println(w.b, w.c) } // uintptr(unsafe.Pointer(w)) 获取了 w 的指针起始值 // unsafe.Offsetof(w.b) 获取 b 变量的偏移量 // 两个相加就得到了 b 的地址值,将通用指针 Pointer 转换成具体指针 ((*int)(b)),通过 * 符号取值,然后赋值。*((*int)(b)) 相当于把 (*int)(b) 转换成 int 了,最后对变量重新赋值成 10,这样指针运算就完成了
import datetime def date_range1(start, end): days = (datetime.datetime.strptime(end, "%Y%m%d") - datetime.datetime.strptime(start, "%Y%m%d")).days + 1 return [datetime.datetime.strftime(datetime.datetime.strptime(start, "%Y%m%d") + datetime.timedelta(i), "%Y%m%d") for i in xrange(days)] def date_range2(beginDate, endDate): dates = [] dt = datetime.datetime.strptime(beginDate, "%Y%m%d") date = beginDate[:] while date <= endDate: dates.append(date) dt = dt + datetime.timedelta(1) date = dt.strftime("%Y%m%d") return dates dt_list = date_range1('20161218', '20161220') // ['20161218', '20161219', '20161220']