见微知著 · TheSignalwise

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

  • 快速搭建面向AI Code的服务器环境,含Claude Code、Codex、Qwen Code

    根据我一年多的AI Code编程经验,要想在当今网络环境下,拥有一个非常舒服的面向AI Code的服务器开发环境,是否非常有必要的。

    什么是舒服的AI开发环境?

    我认为满足以下几个条件的环境是今天国内开发者用的最舒服的开发环境

    • 美国IP
    • 搜索Google、X、Reddit等平台无障碍
    • 预先安装node、npm、Python、git、screen/tmux/zellij等多窗口管理工具
    • 支持SSH访问
    • 预先安装OpenAI Codex、Claude Code、Qwen Code等工具
    • 预先安装多个适合的MCP工具
    • 预先安装cloudflared(后期可以通过access tunnel暴露端口或者服务)
    • 预先安装cloudflare wrangler并登录,方便后续发布项目
    • 4G以上内存(复杂项目要求会更高)

    搭建面向AI Code服务器开发环境

    以下是以一台Ubuntu 22.04新的服务器为例,介绍AI Code服务器的安装部署过程。

    # 升级
    sudo apt update -y
    sudp apt upgrade -y
    # 重启
    reboot
    
    # 安装nvm管理node
    # https://github.com/nvm-sh/nvm
    # 根据实际情况安装最新的版本
    
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
    source ~/.bashrc
    nvm install --lts
    nvm use --lts
    
    #### 查看node和npm版本
    # node -v
    # v22.19.0
    # npm -v
    # 10.9.3
    # https://github.com/npm/cli/releases
    
    # Install latest verion for codex
    npm install -g npm@11.6.0
    
    #https://developers.openai.com/codex/cli
    npm install -g @openai/codex
    
    # https://claude.com/product/claude-code
    npm install -g @anthropic-ai/claude-code
    
    # https://github.com/QwenLM/qwen-code
    npm install -g @qwen-code/qwen-code@latest
    git clone https://github.com/tmux/tmux.git
    
    # 安装多窗口管理工具(根据个人便好)
    wget https://github.com/zellij-org/zellij/releases/download/v0.43.1/zellij-x86_64-unknown-linux-musl.tar.gz
    tar -xzvf zellij-x86_64-unknown-linux-musl.tar.gz
    sudo mv zellij /usr/local/bin
    
    # 确认Python版本
    # python3 -V
    # Python 3.12.3
    
    # 安装wrangler并登录
    npm install -g wrangler
    wrangler login
    
    

    AI Code多窗口/Pane开发效果

    用户可以根据自己的需要调整窗口布局(数量,长宽等),以达到最舒服的开发姿势~

  • 如何设置Codex CLI通过HTTP代理服务器连接OpenAI

    如果你想在中国大陆使用OpenAI公司的Codex CLI,那么你必须要解决一个问题:让Codex Cli使用代理服务器访问网络,否则你即使安装了Codex 也无法使用,因为登录环节无法绕过。

    如何让Codex Cli启动后使用代理服务器?

    在正式运行codex命令之前,先设置环境变量中代理服务器地址,以macOS为例:

    # 安装codex
    npm install -g @openai/codex@latest
    # 设置环境变量中代理服务器参数,请确保http://127.0.0.1:8080通过可靠IP出境
    export HTTPS_PROXY="http://127.0.0.1:8080"
    # 如果有域名或者地址,可以通过NO_PROXY设置
    # export NO_PROXY="192.168.0.*,*.cn"
    codex login
    
    

    好了,接下来就可以正常使用Codex啦。

    额外的小提示(坑)

    有时候Codex在开发过程中访问一些资源,一直失败,很可能是他的一些请求(如:curl)使用了默认的代理服务器。你可以告诉他在执行bash命令前,先执行”unset $HTTPS_PROXY”释放代理服务器变量。这个不影响codex自己的网络连接。

  • 在Claude Code和Codex中使用Replicate MCP生成图片

    相信大多数开发者在开发项目过程中,都有临时做一些图片的需求。虽然你有100种方法,但是在今天的AI IDE中,快速制作图片最好的方法就是使用图片生成的mcp server。

    本文介绍在如何在Claude Code和Codex中使用Replicate官方提供的mcp server工具,是现在开发过程总随时生成图片。

    前提准备

    注册replicate并获取API Token

    访问官方网站并注册,然后导航到API Token菜单,或者直接访问https://replicate.com/account/api-tokens

    点击“Create token”,生成一个token,保存好。

    下载和试运行replicate mcp server

    假定你已经安装好了npm工具,那么直接运行下面的命令就可以完成replciate mcp server的下载和启动。

    export REPLICATE_API_TOKEN="r8_*********"
    npx -y replicate-mcp@latest
    

    看到下面信息时候,标识replicate mcp server 已经正常下载且能运行。

    export REPLICATE_API_TOKEN="r8_I3KPoAiVgGnhR1MXzibDN7spWrKERH44Vt5Hn"
    npx -y replicate-mcp@latest 
    MCP Server starting with 35 tools: [
      'list_collections',
      'get_collections',
      'create_deployments',
      'update_deployments',
      'list_deployments',
      'delete_deployments',
      'get_deployments',
      'create_deployments_predictions',
      'list_hardware',
      'get_account',
      'create_models',
      'list_models',
      'delete_models',
      'get_models',
      'search_models',
      'list_models_examples',
      'create_models_predictions',
      'get_models_readme',
      'list_models_versions',
      'delete_models_versions',
      'get_models_versions',
      'create_predictions',
      'list_predictions',
      'cancel_predictions',
      'get_predictions',
      'create_trainings',
      'list_trainings',
      'cancel_trainings',
      'get_trainings',
      'get_default_webhooks_secret',
      'create_files',
      'list_files',
      'delete_files',
      'download_files',
      'get_files'
    ]
    MCP Server running on stdio
    

    Ctrl+C,先结束进程,然后去配置AI IDE。

    在Claude Code中使用replicate mcp server

    直接使用下面的命令,添加replicate mcp server 到Claude Code开发环境

    claude mcp add replicate https://mcp.replicate.com/sse --transport sse --scope user
    

    如果你只希望在项目层面使用replicate,可以考虑更换一下scope范围。

    在OpenAI Codex中使用replicate mcp server

    修改用户目录下codex配置文件:~/.codex/config.toml

    追加如下如下内容:

    [mcp_servers.replicate]
    command = "npx"
    args = ["-y", "replicate-mcp@latest"]
    env = { "REPLICATE_API_TOKEN" = "r8_xxxxxx" }
    

    在其他AI IDE中使用replicate

    根据官方介绍,您还可以在其他AI IDE中使用replicate mcp server,如:Cursor,Chorus,Google Gemini CLI,Windsurf。

    强烈推荐使用replicate官方提供的mcp专用工具,尤其是remote模式的工具:https://mcp.replicate.com/。官方网站已经为你提供了不同IDE配置方法。

    如何在IDE中通过提示词生成图片

    在启动Claude Code或者Codex后可以执行/mcp查看replciate mcp server的连接状态。

    如果一切正常的话,就可以使用下面的提示词,让replicate帮你生成图片了。

    例如:“使用replicate mcp工具,帮我生成一张图片,使用flux模型,用在网站website/的首页,作为Hero图的备用。生成后下载到图片目录。”

    图片效果还是不错的。

  • 自动化双雄对决:Puppeteer vs Selenium,谁是你的终极武器?

    在现代 Web 开发和数据抓取的世界里,我们经常需要用代码模拟人类行为来与浏览器交互。无论是执行端到端的自动化测试,还是从复杂的动态网站上抓取数据,浏览器自动化工具都是我们不可或缺的伙伴。

    在这个舞台上,两位重量级选手——Google 的 Puppeteer 和老牌劲旅 Selenium——常常让开发者们陷入选择的困境。它们都异常强大,但性格迥异。选择哪一个,取决于你即将踏上一段怎样的征程。

    这不仅仅是一个技术选型问题,更像是在选择你的座驾:你需要的,是一辆为特定赛道打造、速度极致的 F1 赛车,还是一辆能征服任何地形、坚固可靠的全能越野车?

    赛车 vs 越野车:核心理念的碰撞

    • Puppeteer:Chrome 赛道上的 F1 赛车Puppeteer 由 Google Chrome 团队亲手打造,它的使命非常明确:深度控制并完美驾驭 Chrome/Chromium 浏览器。它通过 Chrome DevTools Protocol (CDP) 这条“内部专线”直接与浏览器内核对话。这就像 F1 赛车手和他的赛车一样,每一个指令都精准、快速,没有任何延迟和中间商。它的设计哲学是“专精”,追求在自己的主场上达到极致的性能和控制力。
    • Selenium:驰骋全地形的越野巨兽Selenium 则是一位久经沙场的元老,它的核心使命是跨浏览器兼容性。它通过 WebDriver 这座“标准化桥梁”,能够与 Chrome, Firefox, Safari, Edge 等几乎所有主流浏览器沟通。这就像一辆为征服任何地形而生的越-野车,无论前方是沙漠、丛林还是公路,它都能稳稳地驶过。它的设计哲学是“通用”,追求最广泛的适用性和兼容性。

    上车体验:谁的启动更平顺?

    想象一下拿到车钥匙的瞬间。

    使用 Puppeteer,体验就像启动一辆特斯拉。你只需在你的 Node.js 项目中输入 npm install puppeteer,它不仅会装好库,还会体贴地为你下载一个完美兼容的 Chromium 浏览器。一切准备就绪,开箱即用,你几乎立刻就能上路驰骋。

    Selenium 的启动过程则更像在组装一辆经典的手动挡吉普车。你需要:

    1. 为你选择的编程语言(Python, Java, C#…)安装 Selenium 库。
    2. 去官网下载与你的浏览器版本精确匹配的 WebDriver(比如 chromedriver)。
    3. 确保这个驱动程序在你的系统路径中,或者在代码里正确引用它。

    这个过程需要更多的手动操作,版本匹配问题是新手司机最常遇到的“熄火”点。

    速度与激情:性能表现的差异

    在直线加速赛中,结果毫无悬念。

    Puppeteer 因为走的是 CDP 内部专线,指令是事件驱动的,通信开销极小,速度飞快。它在执行抓取、截图等任务时,那种轻盈和敏捷感会让你印象深刻。

    Selenium 则因为需要通过 WebDriver 这个“翻译官”进行 HTTP 通信,每一次操作都意味着一次网络请求和响应。这层额外的抽象带来了延迟,虽然在大多数测试场景中可以接受,但与 Puppeteer 相比,确实感觉“慢了一拍”。

    仪表盘与控制台:功能与 API 对比

    驾驶体验的核心在于操控。

    Puppeteer 的仪表盘(API)充满了现代感,基于 Promise 的异步操作让代码写起来如丝般顺滑。更酷的是,它能让你接触到 Chrome 开发者工具的几乎所有功能:

    • 网络拦截:像交警一样拦截、修改甚至阻止任何网络请求。
    • 性能监控:轻松获取详尽的性能时间线,诊断网站瓶颈。
    • 模拟设备:一键切换到 iPhone 或任何自定义尺寸的设备视图。

    Selenium 的控制台则更传统、更标准化。它的 API 稳定而强大,足以完成绝大多数的 UI 自动化任务,比如点击、填写表单、导航等。虽然也能实现一些高级功能,但通常需要更复杂的代码或第三方库的辅助。它的强项在于其 Selenium Grid,可以轻松组建一个分布式测试车队,在数百台机器上并行执行测试。

    终点线:你应该选择哪一辆车?

    现在,让我们回到最初的问题。忘记“哪个更好”,而是问“哪个更适合我的旅程?”

    你应该选择 Puppeteer,如果:

    • 你的赛道是数据抓取和网络爬虫:它的速度和网络控制能力无人能及。
    • 你是一位 Node.js 开发者:它能完美融入你的技术栈。
    • 你的目标主要是 Chrome/Chromium:你不需要为不存在的跨浏览器需求牺牲性能。
    • 你需要进行性能分析或生成页面截图/PDF:它的 API 简直是为此而生。

    你应该选择 Selenium,如果:

    • 你的使命是保证跨浏览器兼容性:这是它的核心价值,无可替代。
    • 你的团队使用多种编程语言(如 Python, Java, C#):它为所有人提供了统一的接口。
    • 你需要进行大规模、分布式的企业级测试:Selenium Grid 是业界的黄金标准。
    • 你正在维护一个遗留项目,或者需要与一个庞大而成熟的生态系统集成。

    一图胜千言

    特性Puppeteer (F1 赛车)Selenium (全能越野车)
    核心协议Chrome DevTools Protocol (CDP)WebDriver (W3C 标准)
    主要目标Chrome/Chromium 的极致性能与控制跨所有主流浏览器的兼容性
    执行速度非常快相对较慢
    安装设置极其简单 (npm install)相对复杂 (库 + 驱动)
    支持语言主要是 JavaScriptJava, Python, C#, JS, Ruby 等
    最佳场景网页抓取、性能分析、前端测试跨浏览器兼容性测试、大规模E2E测试

    结论

    Puppeteer 和 Selenium 并非是你死我活的对手,而是两位各有所长的专家。Puppeteer 是一位追求极致速度和精准操控的短跑冠军,而 Selenium 则是一位经验丰富、能应对任何复杂路况的越野探险家。

    看清你的赛道,了解你的任务,然后选择那把能让你最快、最稳到达终点的钥匙吧!

  • 用 Claude 让手机“可编程”:基于 Mobile MCP 的端到端自动化实战

    摘要

    感谢 Mobile Next 提供的 Mobile CLIMobile MCPhttps://github.com/mobile-next/mobile-mcp):

    • Mobile CLI 允许你用命令行(CLI)操控手机模拟器或真机;
    • Mobile MCP 则把这些能力暴露为 MCP(Model Context Protocol) 工具,让 Claude、Cherry Studio 等 MCP 客户端能够用自然语言驱动手机操作。

    想象一下:你在聊天框里说出——“打开星巴克 App,下单一杯摩卡,少糖加冰,送到办公室。” 随后手机自动完成全部点击与输入。或者说:“从今天的相册里挑 3 张图,发个朋友圈/推文并@小王。” 这就是把手机变成“可编程界面”的震撼体验。

    本文以 macOS + iOS 模拟器 为例完成一套最小可行路径(真机与 Android 同理,参考官方 Wiki)。


    你将获得什么

    • 一套从 0 到 1 的环境搭建清单
    • 在 Cherry Studio 中配置 Mobile MCP 的模板
    • 可复制粘贴的一条龙命令
    • 首个自动化示例(用自然语言驱动 Safari 访问页面并上传文件)

    前置条件

    • macOS(已安装 XcodeiOS Simulator
    • Node.js(含 npx
    • 一款 MCP 客户端(如 Cherry Studio、Claude 桌面版等)
    • 具备基础命令行操作能力

    真机调试需要额外的签名/信任配置;Android 环境需替换对应驱动与工具,思路一致。官方WIKI(https://github.com/mobile-next/mobile-mcp/wiki/)提供不同设备的操作指导。


    架构一眼看懂

    MCP 客户端(Claude / Cherry Studio)
                ⇅  MCP 协议(stdio)
            Mobile MCP(@mobilenext/mobile-mcp)
                ⇅  WebDriver 协议
           WebDriverAgent(iOS 自动化驱动)
                ⇅
          iOS 模拟器 / 物理设备
    
    

    步骤一:启动 WebDriverAgent(WDA)

    WDA 是 iOS 端自动化的“底层遥控器”。我们用 Xcode 跑起它的测试 Runner 即可。

    # 1) 获取 WDA
    git clone --depth 1 https://github.com/appium/WebDriverAgent.git
    cd WebDriverAgent
    
    # 2) 确保模拟器已启动(任选其一)
    open -a Simulator
    # 或:列出现有设备并手动选择一个名称
    xcrun simctl list devices
    
    # 3) 使用 xcodebuild 以测试方式启动 WDA
    # 注意将 iPhone 名称替换为你的模拟器名称;注意使用直引号而非花引号
    xcodebuild \
      -project WebDriverAgent.xcodeproj \
      -scheme WebDriverAgentRunner \
      -destination 'platform=iOS Simulator,name=iPhone 16 Pro Max' \
      test
    
    

    常见坑:

    • 目的地字符串里不要用“弯引号”,要用 '" 直引号。
    • 若报 “找不到设备” ,先用 xcrun simctl list devices 查到精确名称再替换。
    • 初次运行若遇到签名/权限弹窗,按提示在 Xcode 里授权一次即可(模拟器通常无需真机签名)。

    可选验证(WDA 默认监听 8100 端口):

    curl http://127.0.0.1:8100/status
    
    

    看到包含 status / sessionId 等字段即表示 WDA 正常响应。


    步骤二:启动 Mobile MCP Server

    mobile-mcpstdio 模式运行,供 MCP 客户端连接。

    # 任意目录下执行
    npx -y @mobilenext/mobile-mcp@latest
    # 若看到:
    # mobile-mcp server running on stdio
    # 表示服务已就绪
    
    

    提示:保持该进程 常驻(不要关闭该终端),以便客户端连接。


    步骤三:在 Cherry Studio 配置 MCP

    1. 打开 Cherry Studio → 设置 → MCP 设置
    2. 选择“添加 MCP”,使用 JSON 导入 模式,粘贴以下配置:
    {
      "mcpServers": {
        "mobile-mcp": {
          "command": "npx",
          "args": ["-y", "@mobilenext/mobile-mcp@latest"]
        }
      }
    }
    
    1. 添加成功后点击 启用。在 Tools 页面可看到 mobile-mcp 暴露的全部动作列表。

    步骤四:用自然语言驱动手机(首个自动化)

    回到 Cherry Studio 的聊天界面,选择你的大模型(如 Claude),并开启 mobile-mcp。然后直接下达指令即可。

    示例 1:下单类操作(演示思路)

    “打开星巴克 App,下单一杯摩卡,少糖加冰,送到办公室。”

    注:模拟器要先安装目标 App;否则可以先从 App Store 或使用 Safari 完成替代流程。

    示例 2:浏览器 + 上传

    “打开 Safari,访问:https://tmpfile.link ,并上传一个本地文件。”

    这正是本文演示路径:模型会调用 MCP 工具,借助 WDA 在模拟器里完成打开 Safari → 访问链接 → 操作上传的全过程。

    贴士:复杂表单/多步流程建议拆成多句指令,让模型逐步执行并在关键处回显页面状态。


    常见问题与排错

    • WDA 编译通过但无法访问 8100
      • 重启模拟器:xcrun simctl shutdown all && open -a Simulator
      • 重新执行 xcodebuild ... test,观察终端是否有崩溃/挂起日志。
    • xcodebuild 提示 destination 不存在
      • xcrun simctl list devices 获取准确设备名称(包含型号与 iOS 版本),逐字替换。
    • 端口占用(8100 被占)
      • 查占用:lsof -i :8100,结束相关进程后重启 WDA。
    • App 未安装/无法自动拉起
      • 先在模拟器里手动安装需要的 App,或者改用 Safari 网页版流程。
    • JSON 配置导入失败
      • 检查是否是合法 JSON(逗号/引号),或在 Cherry Studio 中手动添加同等配置。

    安全与权限提示

    • 自动化可能涉及支付、隐私与账号操作。建议在测试环境或非生产账号中先验证完整流程。
    • 对“购买/转账/删除”等敏感操作,务必要求模型在执行前二次确认
    • 保护你的 API Key、账号密码与本地文件路径,避免出现在分享的日志与截图中。

    延伸:真机与 Android

    • iOS 真机:需要有效的签名与开发者权限,且需在手机上信任证书/驱动,并安装go-ios。
    • Android:思路一致,驱动由对应的 Android 自动化框架提供(ADB/UIAutomator 等)。
    • 多设备/多会话:进阶可在 MCP 层做设备路由与会话隔离。

    小结 & 致谢

    到这里,你已经完成了WDA → Mobile MCP → MCP 客户端的全链路打通:

    • WDA 负责 iOS 端底层输入与页面结构;
    • Mobile MCP 把手机能力以“工具”的形式暴露;
    • Claude/Cherry Studio 等 MCP 客户端将自然语言转译为可执行动作。

    感谢 Mobile Next 带来的 Mobile CLI / Mobile MCP。剩下的,就是你的想象力了:排班打卡、批量发消息、表单填写、内容采集、自动化测试……通通用自然语言来驱动吧。


    复制即用清单

    # 1. 启动模拟器(如未开启)
    open -a Simulator
    xcrun simctl list devices
    
    # 2. 获取并启动 WDA
    git clone --depth 1 https://github.com/appium/WebDriverAgent.git
    cd WebDriverAgent
    xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner \
      -destination 'platform=iOS Simulator,name=iPhone 16 Pro Max' test
    
    # 3. 启动 Mobile MCP(保持此进程常驻)
    npx -y @mobilenext/mobile-mcp@latest
    # 看到 "mobile-mcp server running on stdio" 即成功
    
    # 4. Cherry Studio 中导入以下 JSON 并启用
    # {
    #   "mcpServers": {
    #     "mobile-mcp": {
    #       "command": "npx",
    #       "args": ["-y", "@mobilenext/mobile-mcp@latest"]
    #     }
    #   }
    # }
    
    

    之后在聊天界面启用 mobile-mcp,用自然语言提指令即可。祝玩得开心!

  • Google中断网站内容收录的临时解决办法?

    发现网站收录异常

    TheSignalWise网站近期有频繁更新,但是在Google Search使用命令“site:thesignalwise.com” 查询不到最近更新的内容,初步判断是:Google搜索针对网站的收录暂停/中断。

    这是一个很严重的问题,如果新内容无法被收录,也就没有搜索流量进入网站,对于自然流量的网站是一个暴击。

    让我们尝试临时解决一下。

    登录Google Search后台查看

    通过查看Google Search Console后台可知,网站被索引的页面出现了数据小平台,8月份之后的文章一直没有被收录。

    手工提交页面,请求索引/收录

    查看后台,好像也没什么特别异常的提醒。于是点击后台菜单”URL inspection”,提交自己的URL,进行查看。

    此时Google提示该页面尚未被收录,点击“REQUEST INDEXING”按钮,请求索引。

    稍后将看到“Indexing requested”弹窗。

    接下来,等待,用不了多久,这篇文章就会被加入Google 搜索返回结果。或者查看Google Search Console,有数据更新就是成功了!

    祝你一切顺利!

  • 为什么 macOS 的 history 命令只返回很少的记录?深入解析 Shell 历史记录机制

    在使用 macOS 终端时,你可能会发现一个令人困惑的现象:明明执行过成百上千条命令,但输入 history 后却只能看到寥寥十几条记录。这到底是为什么?你的命令历史是否丢失了?本文将深入解析这个问题,并提供完整的解决方案。

    发现问题:history 命令返回数量异常少

    很多 macOS 用户都遇到过这样的困惑:

    $ history
    19989  vi .env
    19990  rm .env
    19991  cp .env.example .env
    19992  vi .env
    19993  vi .env.example
    19994  cd ..
    19995  cd frontend
    19996  ls
    19997  ls -al
    19998  cp .env.example .env
    19999  vi .env
    20000  exit
    20001  echo $SHELL
    20002  echo $HISTSIZE
    20003  echo $SAVEHIST
    20004  echo $HISTFILESIZE
    
    

    看到了吗?历史记录的编号已经到了 20000+,说明系统确实保存了大量的历史命令,但为什么只显示最后的 16 条?

    真相揭秘:这不是 Bug,而是特性

    原因一:Shell 的默认显示策略

    在 macOS Catalina(10.15)之后,系统默认使用 zsh 作为默认 Shell。zsh 的 history 命令在不带任何参数时,默认只显示最近的 16 条记录。这是 zsh 的设计决策,目的是避免在日常使用中输出过多信息造成干扰。

    原因二:历史记录完整保存着

    让我们验证一下历史记录是否真的存在:

    # 检查历史记录配置
    $ echo $HISTSIZE
    10000    # 内存中可保存 10000 条命令
    
    $ echo $SAVEHIST
    20000    # 历史文件中可保存 20000 条命令
    
    # 查看历史文件大小
    $ wc -l ~/.zsh_history
    20000 /Users/yourname/.zsh_history
    
    

    看到了吗?你的历史记录都在,只是 history 命令默认没有全部显示出来。

    原因三:与 Linux 的差异

    如果你之前使用过 Linux 系统,可能会发现 Linux 上的 history 命令通常会显示更多记录。这是因为:

    1. 很多 Linux 发行版默认使用 bash 而不是 zsh
    2. bash 的 history 命令默认显示更多条目
    3. 不同 Shell 的默认行为有所差异

    完整解决方案:如何查看所有历史记录

    解决方案 1:使用完整的 history 命令

    最简单的方法是给 history 命令添加参数:

    # 显示所有历史记录(从第 1 条开始)
    history 1
    
    # 显示最近 100 条
    history -100
    
    # 显示特定范围(如第 19000 到 19100 条)
    history 19000 100
    
    

    解决方案 2:使用 fc 命令(推荐)

    fc(fix command)是 zsh 中更强大的历史记录管理命令:

    # 列出所有历史记录
    fc -l 1
    
    # 列出最近 50 条
    fc -l -50
    
    # 列出包含时间戳的历史记录
    fc -li 1
    
    # 列出第 19000 条之后的所有记录
    fc -l 19000
    
    

    解决方案 3:直接查看历史文件

    历史记录实际保存在文件中,可以直接访问:

    # 使用 less 分页查看
    less ~/.zsh_history
    
    # 查看最后 100 条
    tail -100 ~/.zsh_history
    
    # 搜索特定命令
    grep "git commit" ~/.zsh_history
    
    # 统计最常用的命令
    cat ~/.zsh_history | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
    
    

    解决方案 4:创建便捷别名

    为了日常使用方便,建议在 ~/.zshrc 中添加以下别名:

    # 编辑配置文件
    nano ~/.zshrc
    
    # 添加实用别名
    alias h='history -30'              # 快速查看最近 30 条
    alias hh='history -100'            # 查看最近 100 条
    alias hall='fc -l 1'              # 查看所有历史
    alias hgrep='fc -l 1 | grep'      # 搜索历史记录
    alias htoday='fc -l -$(date +%H:%M | awk -F: "{print \$1*60+\$2}")'  # 今天的命令
    
    # 使配置生效
    source ~/.zshrc
    
    

    进阶技巧:提升历史记录使用体验

    1. 优化历史记录配置

    ~/.zshrc 中添加以下配置,让历史记录更好用:

    # 增加历史记录容量
    export HISTSIZE=50000
    export SAVEHIST=100000
    export HISTFILE=~/.zsh_history
    
    # 历史记录选项
    setopt EXTENDED_HISTORY          # 记录时间戳
    setopt HIST_EXPIRE_DUPS_FIRST    # 如果历史记录满了,先删除重复的
    setopt HIST_IGNORE_ALL_DUPS      # 不记录重复的命令
    setopt HIST_IGNORE_SPACE         # 不记录空格开头的命令
    setopt HIST_VERIFY                # 不立即执行历史扩展的结果
    setopt SHARE_HISTORY              # 在多个终端间即时共享历史
    setopt HIST_REDUCE_BLANKS        # 删除命令中的无用空格
    
    

    2. 使用交互式搜索

    Ctrl + R 启动反向搜索,这是查找历史命令最快的方式:

    # 按 Ctrl + R 后输入关键词
    (reverse-i-search)`docker': docker-compose up -d
    
    

    3. 安装 fzf 实现模糊搜索

    fzf 是一个强大的模糊查找工具:

    # 安装 fzf
    brew install fzf
    
    # 安装 shell 集成
    $(brew --prefix)/opt/fzf/install
    
    # 使用:按 Ctrl + R 会调用 fzf 进行历史搜索
    
    

    4. 使用 atuin 实现云同步历史

    Atuin 可以加密同步你的命令历史到云端:

    # 安装
    brew install atuin
    
    # 初始化
    atuin register -u YOUR_USERNAME
    atuin import auto
    atuin sync
    
    

    常见问题解答

    Q1: 为什么修改 HISTSIZE 后还是只显示 16 条?

    答: HISTSIZE 控制的是历史记录的保存数量,而不是 history 命令的默认显示数量。要查看更多记录,需要使用 history 1fc -l 1

    Q2: zsh 和 bash 的历史记录可以互通吗?

    答: 不能直接互通,因为它们使用不同的历史文件格式。但可以通过以下命令迁移:

    # 从 bash 迁移到 zsh
    cat ~/.bash_history >> ~/.zsh_history
    
    

    Q3: 如何防止敏感命令被记录?

    答: 有几种方法:

    • 在命令前加空格(需要设置 HIST_IGNORE_SPACE
    • 使用 history -d 删除特定记录
    • 设置 HISTORY_IGNORE 模式匹配

    Q4: 为什么有时候历史记录会”丢失”?

    答: 可能的原因:

    • 多个终端同时使用时的覆盖问题(设置 SHARE_HISTORY 可解决)
    • 历史文件权限问题
    • 达到了 SAVEHIST 的上限

    性能优化建议

    当历史记录文件变得很大时,可能会影响 Shell 启动速度。以下是一些优化建议:

    # 定期清理重复记录
    cat ~/.zsh_history | awk '!x[$0]++' > ~/.zsh_history.tmp
    mv ~/.zsh_history.tmp ~/.zsh_history
    
    # 压缩旧的历史记录
    fc -W  # 写入当前历史到文件
    gzip -k ~/.zsh_history  # 备份压缩
    
    # 设置历史文件的合理大小
    export SAVEHIST=10000  # 根据需要调整
    
    

    总结

    macOS 上 history 命令返回记录少并不是系统问题或配置错误,而是 zsh Shell 的默认行为。你的历史记录都完好地保存着,只需要使用正确的命令参数就能查看全部内容。

    通过本文介绍的方法,你不仅可以解决查看历史记录的问题,还能通过各种配置和工具大大提升终端的使用效率。记住最简单的解决方案:使用 history 1fc -l 1 即可查看所有历史记录。

    希望这篇文章帮助你彻底理解并解决了 macOS history 命令的”谜题”。如果你有其他终端使用技巧,欢迎在评论区分享交流!


    相关标签: #macOS #Terminal #zsh #history命令 #Shell脚本 #命令行 #开发工具 #终端技巧 #bash #命令历史

  • 在 M 系列 Mac(Apple Silicon)上安装与配置 PostgreSQL

    本文面向 M 系列(M1/M2/M3)芯片的 macOS 用户,涵盖安装 PostgreSQL、启动服务、以及创建业务数据库和账号的全过程。


    PostgreSQL(简称 pgsql)是目前最流行的开源关系型数据库之一。在 M 芯片的 macOS 上安装它和 Intel 版略有差别,尤其是路径和 Homebrew 的目录不同。本文将完整介绍安装、启动、以及如何创建业务库和账号。


    一、环境准备

    确保系统已经安装 Homebrew(在 M 系列 Mac 上路径是 /opt/homebrew):

    brew -v
    
    

    若未安装,可在终端运行:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
    

    二、安装 PostgreSQL

    直接使用 Homebrew 安装指定版本(这里以 14 为例):

    brew install postgresql@14
    
    

    安装完成后,Homebrew 会自动初始化数据库集群,路径位于:

    /opt/homebrew/var/postgresql@14
    
    

    三、启动与验证

    1. 启动服务:
    brew services start postgresql@14
    
    
    1. 验证服务是否运行:
    pg_ctl -D /opt/homebrew/var/postgresql@14 status
    
    
    1. 查看监听端口:
    lsof -iTCP:5432 -sTCP:LISTEN
    
    
    1. 登录数据库(初始超级用户与本机用户名一致,例如 chris):
    /opt/homebrew/opt/postgresql@14/bin/psql -d postgres
    
    

    进入后,可以查看已有数据库和用户:

    \l   -- 列出数据库
    \du  -- 列出用户
    
    

    四、配置环境变量

    为了能直接使用 psql 命令,需要把二进制路径加入环境变量。在 ~/.zshrc 中添加:

    export PATH="/opt/homebrew/opt/postgresql@14/bin:$PATH"
    
    

    执行:

    exec zsh
    
    

    现在直接运行 psql --version 即可。


    五、创建业务数据库和账号

    假设我们要为 CloudFinOps 云账通 项目创建独立数据库和账号。

    1. 进入 PostgreSQL:
    psql -U chris -d postgres
    
    
    1. 创建业务用户(替换为你自己的强密码;如果包含特殊字符如 @,记得在连接串里 URL 编码):
    CREATE ROLE cloudfinops WITH LOGIN PASSWORD 'Strong@Pass123';
    
    
    1. 创建业务数据库,并指定拥有者:
    CREATE DATABASE cloudfinops_db OWNER cloudfinops;
    
    
    1. 授权用户访问数据库:
    GRANT ALL PRIVILEGES ON DATABASE cloudfinops_db TO cloudfinops;
    
    
    1. 测试连接:
    psql -U cloudfinops -d cloudfinops_db
    
    

    六、获取连接字符串

    在应用(如 Python、Node.js、Java 等)中通常需要连接 URI:

    postgresql://USERNAME:PASSWORD@HOST:PORT/DATABASE
    
    

    例如:

    postgresql://cloudfinops:Strong%40Pass123@localhost:5432/cloudfinops_db
    
    

    注意:@ 被转义为 %40,否则会导致解析错误。


    七、常见问题

    • 提示 role "postgres" does not exist
      Homebrew 初始化时只会创建与你本机用户名相同的超级用户。如果确实需要 postgres 账号,可以手动创建: CREATE ROLE postgres WITH LOGIN SUPERUSER PASSWORD 'YourPass';
    • psql 默认报 “database … does not exist”
      默认会尝试连接与用户名同名的数据库,可以用: createdb $(whoami) 来创建一个同名数据库。

    八、总结

    在 M 芯片 Mac 上安装 PostgreSQL 与 Intel 版主要区别在于 Homebrew 的安装路径。通过 Homebrew 安装后,记得将二进制加入 PATH,并使用本机用户名作为初始超级用户。之后为业务项目创建独立的数据库和账号,即可实现隔离与安全控制。

    这样一来,你就可以轻松在 macOS 上搭建出一套 PostgreSQL 环境,为自己的 CloudFinOps 或其他应用提供数据支撑。 🚀

  • 让Claude Code使用qwen3-coder大模型(极速精炼版)

    前提条件

    本文假定你已经完成了以下前提条件的准备:

    • 已经安装了Claude Code命令行开发工具
    • 已经开通了阿里云百炼大模型平台的API服务

    可以使用命令npm install -g @anthropic-ai/claude-code安装Claude Code,或者参考本站文档:https://thesignalwise.com/2025/08/27/install-claude-code-locally-ubuntu/

    快速开始

    配置shell配置文件

    以macOS系统为例,设置环境变量。建议提前在命令行中运行`echo $SHELL`,确认自己的默认shell程序。

    Zsh配置Anthropic参数

    # 用您的百炼API KEY代替YOUR_DASHSCOPE_API_KEY
    echo 'export ANTHROPIC_BASE_URL="https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy"' >> ~/.zshrc
    echo 'export ANTHROPIC_AUTH_TOKEN="YOUR_DASHSCOPE_API_KEY"' >> ~/.zshrc
    
    source ~/.zshrc
    
    

    Bash配置Anthropic参数

    # 用您的百炼API Key代替YOUR_DASHSCOPE_API_KEY
    echo 'export ANTHROPIC_BASE_URL="https://dashscope.aliyuncs.com/api/v2/apps/claude-code-proxy"' >> ~/.bash_profile
    echo "export ANTHROPIC_AUTH_TOKEN='YOUR_DASHSCOPE_API_KEY'" >> ~/.bash_profile
    
    source ~/.bash_profile
    
    

    启动并运行Claude Code

    启动一个Terminal shell,先验证一下环境变量是否生效。

    echo $ANTHROPIC_BASE_URL
    echo $ANTHROPIC_AUTH_TOKEN
    

    然后,启动Claude Code。

    claude
    

    一切正常的话,你就可以通过Claude Code调用Qwen-coder大模型进行开发,解除Claude订阅额度不够的焦虑啦。

  • 申请Bybit Card轻松订阅ChatGPT和Claude

    Bybit,作为全球领先的加密货币交易所之一,现已向中国用户开放免费申请万事达(Mastercard)虚拟信用卡。此卡申请流程简单,无需繁琐的地址证明,并可轻松绑定Apple Pay及支付宝香港版,是您进行境外消费和享受数字货币便利的绝佳工具。除此之外,Bybit Card还可以协助大模型技术爱好者开通付费订阅账号,要知道即使是WildCard,也有被高概率拦截的可能。

    如何申请Bybit Card?

    1. 注册Bybit账户
    2. 申请Bybit Card
      • 如果您已有Bybit账户,可直接点击链接申请:Bybit Card申请入口
      • 或登录Bybit App,在首页点击“更多”,找到“Card”即可进入申请页面。
      • 邀请码YQZYR1M (入金超过100 USDT并成功消费后,可额外获得10U奖励)
    3. 申请注意事项
      • 开卡地区选择:在申请过程中,发卡地请选择日本/澳大利亚,无需提供地址证明,成功率最高。
      • 身份认证选择:中国,身份证/护照
      • IP建议:日本或澳大利亚IP地址,切记不要使用美国IP

    入金USDT用于消费

    访问Bybit Card管理中心,选择“Deposit”充值,从其他交易所或者数字货币钱包充值。

    ChatGTP和Claude充值注意事项

    1. 建议使用新账号申请订阅支付
    2. IP地址和开卡国家尽可能保持一致,已经成功的经验:开发地和IP地址都是日本
    3. 日本账单地址:https://haoweichi.com/Others/ri_ben_ren_shen_fen_zi_liao
    4. 注册过程中填写的信息,都记录下来,防止后面要求验证