见微知著 · TheSignalwise

记录每一道灵光的信号,洞见背后的深刻逻辑。 在这里,我分享硬核而有趣的技术实践、天马行空的创意想法,以及点滴生活瞬间——让微小的信号汇聚成启发未来的智慧。

  • 我们在日常工作、学习中都会用到一些网站或者工具,以前我会在笔记、收藏夹、网盘等不同地方存储和记录。以方便不方便集中查看,另外也不利于分享。今天开始,统一在这里罗列。

    图形图像

    ASCII ART字符

    截图加框

    网络工具

    邮箱邮件

    • https://github.com/eoao/cloud-mail 使用Vue3开发的响应式简约邮箱服务,支持邮件发送附件收发,可以部署到Cloudflare云平台实现免费白嫖🎉 (Cloudflare Email Worker + Resend)
  • 作为一名开发者,我们每天都在与代码和文件打交道。当使用像Gemini CLI这样的AI编程助手时,如何高效、准确地将文件内容作为上下文提供给模型,是一个至关重要的问题。Gemini CLI提供了两种主要的文件引用方式:使用@符号(如@src/main.ts)和直接在提示中粘贴文件路径。

    这两种方式看似都能让模型“知道”我们要处理哪个文件,但其底层的实现逻辑和适用场景却截然不同。通过最近与Gemini的探讨,我深入了解了其core(核心)包处理这两种输入的差异。理解这些差异,能帮助我们更智能地使用CLI,提升与AI协作的效率。

    核心差异:“直接上下文注入” vs “模型驱动的工具调用”

    简单来说,这两种方式的最大区别在于由谁主导以及何时获取文件内容

    特性/方面 @一个文件 (例如: @src/main.ts 帮我重构这段代码) 直接粘贴路径 (例如: 帮我重构 src/main.ts 这段代码)
    主导方 用户/CLI前端 AI模型
    核心机制 前置处理与上下文注入 自然语言理解与后置工具调用
    交互流程 单轮(CLI准备好所有材料,一次性发给模型) 多轮(模型先请求读文件,CLI执行后返回内容,模型再处理)

    @符号:CLI前端的“快捷方式”

    当你使用@符号时,你实际上是在给Gemini CLI的前端下达一个明确的指令:“在向AI模型提问之前,请先帮我把这个文件的内容读取出来,并作为背景资料(上下文)和我接下来的问题一起打包发送。”

    @模式的内部执行流程

    1. CLI前端解析:CLI界面识别出@这个特殊指令。
    2. 调用文件发现服务:CLI会立即调用其核心的文件发现服务,并执行read_many_files工具来读取@指向的文件的内容。
    3. 构造新提示:在将任何内容发送给大模型之前,CLI在本地将文件内容和你的问题(例如“帮我重构这段代码”)拼接成一个全新的、内容详尽的提示。
    4. 一次性发送:这个包含了完整文件代码的“超级提示”被一次性发送给Gemini模型。
    5. 模型直接响应:模型接收到的是一个信息完备的请求,它无需再“提问”或调用其他工具来获取文件内容,可以直接开始分析代码并给出重构建议。

    可以把@想象成一个高效的“秘书”,在你和“AI专家”(模型)沟通前,已经把所有相关的会议资料(文件代码)整理好并放在了专家面前。

    @模式的优缺点

    • 优点
      • 高效直接:减少了与模型之间的通信轮次,对于意图明确的“读文件”操作,速度更快。
      • 准确无误:避免了模型因理解偏差而找错文件或调用错误工具的可能性。你明确指定了哪个文件,CLI就读取哪个。
    • 缺点
      • 灵活性低@的意图被固定为“读取并作为上下文”。你无法用它来执行删除、重命名等其他文件操作。

    直接路径:依赖模型智能的“自然语言指令”

    当你直接在提示中包含文件路径时,你是在用最自然的方式与AI对话。你没有给CLI任何特殊指令,而是完全依赖Gemini模型的“大脑”去理解你的意图。

    直接路径模式的内部执行流程

    1. 直接发送原始提示:你的原话,例如“帮我重构src/main.ts”,被直接发送给Gemini模型。
    2. 模型分析与决策:模型接收到提示后,通过其强大的自然语言理解能力,分析出你的意图包含两个关键信息:
      • 动作:重构
      • 目标:文件src/main.ts 模型会意识到,要完成“重构”这个动作,它首先需要获取“目标”的内容。
    3. 返回工具调用请求:此时,模型的第一步响应并不是最终答案,而是一个给CLI的指令,即一个**工具调用(Tool Call)**请求。这个请求会说:“请帮我执行read_file工具,参数是src/main.ts的绝对路径。”
    4. CLI执行工具:CLI的core接收到这个指令,执行read_file工具,从你的本地文件系统中读取文件内容。
    5. 将结果返回给模型:文件内容作为工具的执行结果,被CLI再次发送给模型。
    6. 模型生成最终答案:在这一轮通信中,模型终于拿到了它需要的代码。现在,它将结合最初的指令(“重构”)和刚刚收到的代码内容,进行思考并生成最终的重构建议。

    这个过程更像你与一位真人开发伙伴的协作。你告诉他“去看看那个文件,然后重构一下”,他会先跑去找到文件(第一步),阅读内容,然后再回来和你讨论如何重构(第二步)。

    直接路径模式的优缺点

    • 优点
      • 高度灵活:你可以要求模型对文件执行任何操作,比如“比较a.tsb.ts的区别”、“删除temp.log”、“把config.json里的端口号改成8080”等等。模型会智能地选择最合适的工具(read_file, search_file_content, replace, run_shell_command等)来完成任务。
      • 交互自然:符合人类的自然语言交流习惯。
    • 缺点
      • 可能增加交互轮次:对于简单的读文件任务,一来一回的通信会比@模式稍慢。
      • 依赖模型理解:在极少数复杂或模糊的指令下,模型可能会误解你的意图,导致调用错误的工具或操作错误的文件。

    结论:如何选择?

    理解了这两种模式的内在逻辑后,我们可以得出清晰的使用策略:

    • 当你需要为后续的复杂问题提供明确、大量的上下文时,请使用@

      • 最佳场景:“@src/api.ts @src/utils.ts 这两个文件定义了我的核心逻辑,请帮我为它们编写单元测试。”
      • 目的:确保模型在开始工作前,拥有最完整、最准确的“阅读材料”。
    • 当你希望模型对文件执行某个具体动作,或者进行更灵活、更自然的交互时,请直接使用路径。

      • 最佳场景:“帮我把README.md里的安装步骤更新一下。”,“搜索所有.js文件中包含TODO的行。”
      • 目的:利用模型的智能,让它为你选择并执行最合适的操作。

    掌握@和直接路径这两种武器,并根据你的具体需求灵活切换,你将能更高效地驾驭Gemini CLI,让AI成为你开发流程中无缝集成的得力助手。

  • 使用Gemini Cli研究和学习Gemini-Cli-1

    从今天开始,我将持续分享:使用Gemini Cli这款大模型编程工具的命令行交互的界面来学习Gemini Cli这个开源项目自身。

    关于Gemini Cli

    gemini-cli 是一个命令行 AI 工作流工具,旨在通过连接到您的工具、理解您的代码来加速您的工作流程。

    主要功能包括:

    • 处理大型代码库:能够查询和编辑超过 Gemini 1M 令牌上下文窗口的大型代码库。
    • 多模态应用生成:利用 Gemini 的多模态能力,从 PDF 或草图生成新应用。
    • 自动化操作任务:例如,查询拉取请求或处理复杂的 Git rebase 操作。
    • 可扩展的工具:可以连接新的功能,如使用 Imagen、Veo 或 Lyria 进行媒体生成,并内置了 Google 搜索功能。

    您可以通过 npx 或 npm 来安装和运行它。它支持从一个新目录开始一个项目,或者在现有的项目中运行,以帮助您理解代码、实现新功能或自动化工作流程。

    Gemini CLI 的架构

    docs/architecture.md 文件描述了 Gemini CLI 的架构。其核心由两大部分组成:

    1. CLI 包 (packages/cli): 这是面向用户的部分,负责处理用户输入、显示输出以及管理整体用户体验。
    2. 核心包 (packages/core): 这是 Gemini CLI 的后端,负责与 Gemini API 交互、管理和执行可用的工具。 此外,还有一套工具 (packages/core/src/tools/),这些工具扩展了 Gemini 模型的能力,使其能够与本地环境(如文件系统、shell 命令、网络请求)进行交互。 典型的交互流程如下:
    3. 用户在终端输入提示。
    4. CLI 包将输入发送到核心包。
    5. 核心包构建一个合适的提示,并将其发送到 Gemini API。
    6. Gemini API 返回一个响应,可能是一个直接的答案,也可能是一个使用工具的请求。
    7. 如果请求使用工具,核心包会执行该工具(在需要时会请求用户批准),并将结果发送回 Gemini API。
    8. Gemini API 处理工具结果并生成最终响应。
    9. 核心包将最终响应发送回 CLI 包。
    10. CLI 包将响应格式化并显示给用户。 该架构的主要设计原则是模块化、可扩展性和用户体验。
    Google Gemini Cli架构图

    Gemini Cli自带的工具包有哪些?

    Gemini CLI 提供了一套丰富的默认工具,用于与您的本地环境和网络进行交互。以下是这些工具的详细介绍:

    一、文件系统工具

      这些工具允许 Gemini 与您的本地文件系统进行交互,但操作通常会限制在您启动 CLI 的项目根目录内,以确保安全。

      • list_directory (别名: ReadFolder): 列出指定目录中的文件和子目录。
      • read_file (别名: ReadFile): 读取单个文件的内容,支持文本、图片和 PDF。
      • write_file (别名: WriteFile): 将内容写入文件。如果文件已存在,则会覆盖;如果不存在,则会创建新文件。
      • glob (别名: FindFiles): 根据通配符模式(如 src/*/.ts)查找文件。
      • search_file_content (别名: SearchText): 在文件内容中搜索正则表达式模式。
      • replace (别名: Edit): 在文件中替换文本。

      二、Shell工具

      run_shell_command: 执行 shell 命令。这使 Gemini 能够运行脚本、与版本控制系统(如 Git)交互或执行其他命令行操作。出于安全考虑,可以对可执行的命令进行限制。

      三、网络工具

      web_fetch: 从一个或多个 URL 提取、总结或比较信息。

      google_web_search: 使用 Google 搜索执行网络搜索,并返回带有来源引用的摘要。

      四、其他工具

      save_memory: 将信息保存到用户的 GEMINI.md 文件中,以便在未来的会话中记住这些信息。

      read_many_files: 一次性读取多个文件的内容,支持文本、图片和 PDF。

      MCP (Model Context Protocol) 服务器: 这不是一个单一的工具,而是一个框架,允许您将外部工具集通过 MCP 服务器连接到 Gemini CLI,从而极大地扩展其功能。您可以配置自己的 MCP
      服务器来暴露自定义的工具。

      这些工具共同为 Gemini CLI 提供了强大的能力,使其能够理解您的代码库、与您的本地环境交互,并利用网络资源来帮助您完成各种开发任务。

      read_many_files 工具的工作原理

      read_many_files 工具一次性读取多种类型文件的核心原理是分两步走:1. 文件发现;2. 内容处理。

      1. 文件发现 (File Discovery) 这是该工具的第一步,目的是确定需要读取哪些文件。
      • 使用 Glob 模式: 您提供给工具的 paths 参数不是一个简单的文件列表,而是一个或多个 glob 模式的数组(例如 src//.ts 或 docs/.md)。Glob 是一种强大的路径匹配语法,
        可以匹配任意层级的目录,* 可以匹配文件名中的任意字符。这使得工具能够一次性地在整个项目目录结构中找到所有符合模式的文件,而无需您手动列出每一个文件。
      • 过滤和排除: 工具还会结合 include 和 exclude 参数,以及默认的忽略规则(如 .git、node_modules 目录)和 .gitignore 文件中的规则,来精确地筛选出最终要处理的文件列表。 通过这个机制,工具首先高效地构建出一个包含所有目标文件路径的清单。
      1. 内容处理 (Content Processing) 在拿到文件清单后,工具会遍历清单中的每一个文件,并根据文件类型采用不同的处理策略,最终将所有处理过的内容整合成一个统一的格式,方便语言模型理解。
      • 对于文本文件 (.ts, .md, .js 等):
        • 读取内容: 直接以 UTF-8 编码读取文件的文本内容。
        • 拼接与分隔: 将所有文本文件的内容拼接成一个大的字符串。为了让模型能够区分不同文件的内容,它会在每个文件的内容之间插入一个明确的分隔符,格式为 — {filePath}—。这样模型在接收到长字符串时,就能清楚地知道“这是 fileA.ts 的内容”和“这是 fileB.ts 的内容”。
      • 对于图片和 PDF 文件 (.png, .jpg, .pdf 等):
        • 显式请求: 工具要求必须显式地在 paths 或 include 中指定这些文件(例如,通过完整文件名 logo.png 或扩展名模式 *.pdf)。这是因为它默认会跳过二进制文件,除非被明确告知要去读取。
        • Base64 编码: 图片和 PDF 是二进制格式,不能作为纯文本处理。工具会读取这些文件的二进制数据,然后将其转换为 Base64 编码的字符串。Base64 是一种将二进制数据表示为 ASCII字符串的方法,非常适合在基于文本的协议(如 API 调用)中传输二进制内容。
        • 结构化输出: 编码后的数据会与文件的 mimeType (例如 image/png) 一起打包成一个结构化的对象。这告诉模型:“这是一张 PNG 图片,这里是它的 Base64 数据”,模型就能理解并处理它。
      • 对于其他二进制文件:
        • 检测与跳过: 如果一个文件不是被显式请求的图片或 PDF,工具会检查其内容的开头部分。如果发现二进制文件的特征(如存在空字节 null),它就会跳过这个文件,避免向模型发送无意义的乱码。

      总结一下,read_many_files 的原理就是:先用 glob 模式高效地“扫描”并收集所有目标文件,然后“遍历”这个文件列表,对每个文件“对症下药”——文本文件直接拼接,图片/PDF 等二进制文件则编码成Base64——最后将所有处理好的内容打包成一个统一的、模型可以理解的格式。

    1. 制作iOS APP审核必备:如何录制模拟器视频

      最近开发了一款iOS APP,准备自己给Apple审核时候,需要上传产品截图和视频。

      苹果开发软件模拟器软件自带截图功能,有一个截图按钮,点击就可以截图,但是没有录制视频的操作。

      如果是使用普通的桌面录屏软件操作的话,没办法完整录制手机内部的视频肯定会带上模拟器的外壳以及边界非常不好看,经过调研发现使用下面这个命令就可以针对当前正在运行的模拟器进行录屏操作。

      打开macOS终端工具Terminal,输入如下命令:

         xcrun simctl io booted recordVideo ~/Desktop/demo.mov
      

      操作过程:

      • 开始录制当前已启动的模拟器画面,视频保存在桌面。
      • 录制时操作你的 App。
      • 录制完成后,回到终端按 Ctrl + C 停止录制。

      实际操作下来,挺方便的。完成之后可以使用剪映对视频做剪辑或者指定大小输出。

    2. 有一网站支持教育网邮箱登录获取一定的优惠政策,如果你希望拥有一个教育网的邮箱,可以考虑:your-name.edu.kg。

      注册地址

      访问:https://cctld.kg/ 注册一个账号。注册的人较多,有时候单填注册人数多了,可能要到次日才能注册。

      设置用户信息

      设置你的姓名、税号(身份证)、护照等信息。目前没看到要验证的地方。

      充值

      可以先检索域名,看一下这个域名要多少费用,建议增加一份隐私保护的费用。然后使用信用卡充值一个总金额。

      注册域名

      提交域名注册。注意此处的Name Server,建议填写稍后Cloudflare时候获取的域名

      绑定Cloudflare,使用Email Route策略收取邮箱

      在 Cloudflare控制台绑定域名,填写自己的三级域名:your-name.edu.kg。提交免费计划,并获得Name Server域名信息,用来设置上一步的NS。

      配置Cloudflare Email Route收邮件

      在域名绑定生效后(24小时内生效,有时候可能更快),启用并设置CF的邮箱转发策略即可。具体操作过程不在本内介绍。

      邮箱可以用来做什么?

      这个就发挥自己的想象啦。

    3. 近日,“谷歌发布免费命令行编程工具 Gemini Cli ! ”,压力给到了Claude Code, 哈哈。

      如果你是在远程服务器上运行Gemini Cli,首次启动时候会要求你完成Google账号登录,这时候,因为服务器不在本地,所以有些环节需要你手工完成。以下是两个关键点:

      • 启动–debug参数,这样可以看到绑定登录验证的URL
      • 本地浏览器最终返回的localhost链接,要在服务器上curl一次

      具体操作步骤如下:

      启动Google Gemini Cli

      # 使用你自己的GOOGLE_CLOUD_PROJECT ID
      export GOOGLE_CLOUD_PROJECT=upheld-altar-271215
      # 我测试时候发现不带debug看不到验证URL地址
      gemini --debug
      

      访问认证链接:

      上一步命令行会打印一个URL地址,使用你登录了Google账号的浏览器访问改地址,完成认证。

      获得Callback地址

      浏览器操作的最后一步,肯定会提示你网络不通的,因为认证完成后会回调一个本地地址:http://localhost:35887/oauth2callback?state=***。这是个远程服务器上的Gemini Cli监听的地址,不是你本地电脑的。

      在服务器上请求Callback地址

      在远程服务器上,新开一个Terminal,通过curl访问Callback地址。

      # 注意带上双引号
      curl "http://localhost:35887/oauth2callback?state=***"
      

      完成认证,使用Gemini Cli

      开启你的AI编程之旅。

      补充信息

      实际在正式完成工具使用前,有几个操作需要你完成:

    4. 从注册开发者账号开始到完成Apple Developer中Enroll的过程,请使用一个独立的手机完成,最好只使用数据网络。否则你会在前面很顺利的时候,在提交开发者认证的关键环节,遇到莫名问题:

      提交身份证和扫脸之后报错:“你的账户可能存在问题,需要解决后才能继续注册流程。请与支持团队联系。”

      我最后成功的经验是:注册账号,到登录developer app,到注册操作,全部是一个手机,走的数据网络,关了wifi。

      所以,Apple开发者注册过程中的第一原则是:数据网络,固定手机,新号。

    5. 今天上午收到了Apple开发者支持团队发来的邮件,我的企业注册正在进行中,需要补充材料。

      一共四类材料:

      • 申请人的身份证件(正面和反面)
      • 申请人的在职证明
      • 申请人的员工工牌或名片
      • XXX Technology Co., Ltd 的公司注册文件(企业法人营业执照)

      等我提交完成后,下午4点半左右,收到新的邮件,再次要求提交:“申请人的在职证明”。

      我自己看了一下,上午提交的在职证明,很可能是公章遮挡了日期,导致不清晰,审核不通过。因为下午的材料要求“申请人的在职证明(请加盖实体公章,包含最近日期)”。

      重新提交,等试试看。

    6. 闯过一道道关卡,终于越过所有门槛,进入Apple Developer注册环节,此时你发现有两个参数需要你填写:

      • 法人实体名称(Legal Entity)
      • D-U-N-S编号

      其中,令人困惑的是法人实体名称。这个地方如果是看英文的话,你是可以快速搞定的,但如果你是中文界面,就可能有疑惑。这里的法人实体名称并不是我们中国国内企业的法人名称,而是公司的英文名称,也就是你注册邓白氏编码D-U-N-S编号时候填写的公司名称,同样也是dnb.com给你邮件中的Business Name。

      参考https://www.qianfanyun.com/help/1238中“以组织身份注册 Apple Developer Program”章节的介绍。