普通视图

发现新文章,点击刷新页面。
昨天以前Yubolun 博客

在 Claude Code 中以 MCP 接入 Codex

2025年12月14日 00:00

Codex CLI 的命令行交互较为原始,沙箱环境存在不少 bug,执行命令时也受到诸多限制。相比之下,Claude Code 的设计更加完善,支持 MCP、Plugin、Skill、Agent 等多种自定义扩展形式。将 Codex 作为 MCP 服务器接入 Claude Code,可以获得更友好的用户体验和更强大的功能集成。

为什么选择 MCP 方式而非直接使用 Codex CLI

Codex CLI 的局限性

  • 命令行交互原始:缺乏现代化的交互体验,错误提示不够清晰
  • 沙箱环境 bug 多:执行复杂任务时容易遇到环境问题
  • 命令执行受限:某些操作在沙箱中无法正常执行,自由度较低

Claude Code 的优势

  • 设计完善:提供更流畅的代码编辑和 AI 交互体验
  • 扩展性强:支持 MCP、Plugin、Skill、Agent 等多种扩展方式
  • 工具集成:可以无缝整合多种工具和服务
  • 用户体验友好:界面直观,错误处理更完善

通过 MCP 方式,Codex 可以作为 Claude Code 的一个工具被调用,既保留了 Codex 的能力,又享受了 Claude Code 的完善生态。


前置要求

  • 已安装 Claude Code CLI(可通过 claude -v 验证)
  • 已安装 Codex CLI,并能在终端调用 codex 命令

配置步骤

一条命令完成添加(用户作用域)

claude mcp add codex -s user -- codex -m gpt-5.3-codex -c model_reasoning_effort="high" mcp-server

参数说明:

  • -s user:将服务器写入用户全局配置,所有项目可用且不会改动仓库文件
  • --:分隔 Claude MCP 参数与实际服务器启动命令
  • codex -m gpt-5.3-codex-max:指定要暴露的 Codex 模型
  • -c model_reasoning_effort="high":为 Codex 进程设置高推理强度
  • mcp-server:启动 Codex 的 MCP 服务器模式

验证配置是否生效

# 列出所有 MCP 服务器
claude mcp list

# 查看 codex 服务器详情
claude mcp get codex

若能看到 type: stdio 且状态为 running/available,说明已成功接入。


在 Claude Code 中使用

  1. 打开 Claude Code,在对话中输入 /mcp 命令
  2. 选择 codex 服务器
  3. 直接在对话中调用 Codex 暴露的工具;如需指定模型,可在提示中写明 gpt-5.3-codex

现在你可以在 Claude Code 的完善环境中使用 Codex 的能力,同时享受更好的交互体验和工具集成。


常见问题

  • 找不到 claude 命令:确保已安装 Claude Code CLI 并已加入系统 PATH
  • 找不到 codex 命令:先安装 Codex CLI(参考 Codex 官方安装说明),或检查 shell PATH 配置
  • 想移除服务器:使用 claude mcp remove codex 命令
  • 切换配置作用域:如需改用项目级配置,先删除用户级配置,再按需添加项目级配置

Claude Code 插件与 Hook 开发完整教程

2025年12月14日 00:00

Claude Code 提供了强大的插件系统,允许你通过自定义命令、代理、Hook、Skills 和 MCP 服务器来扩展功能。本文将完整介绍如何从零开始开发 Claude Code 插件和 Hook,包括创建插件、配置 Hook、发布到 Marketplace 等全流程。

为什么需要插件系统

Claude Code 的插件系统提供了多种扩展方式:

  • Commands(命令):创建自定义斜杠命令,快速执行常用操作
  • Agents(代理):定义专门的子代理来处理特定任务
  • Skills(技能):扩展 Claude 的能力,让模型自主调用
  • Hooks(钩子):在特定事件发生时自动执行脚本
  • MCP Servers:集成外部工具和服务

通过插件系统,你可以:

  • 自动化工作流:在文件写入后自动格式化、运行测试
  • 增强安全性:拦截危险操作、验证命令
  • 集成工具:连接数据库、API、通知系统等
  • 团队协作:在项目级别配置插件,确保团队使用一致的工具

快速开始:创建第一个插件

让我们通过创建一个简单的问候插件来熟悉插件系统。

前置要求

  • 已安装 Claude Code(可通过 claude -v 验证)
  • 基本的命令行操作知识

步骤 1:创建 Marketplace 结构

mkdir test-marketplace
cd test-marketplace

步骤 2:创建插件目录

mkdir my-first-plugin
cd my-first-plugin

步骤 3:创建插件清单文件

插件清单文件 .claude-plugin/plugin.json 描述了插件的基本信息:

mkdir .claude-plugin
cat > .claude-plugin/plugin.json << 'EOF'
{
  "name": "my-first-plugin",
  "description": "一个简单的问候插件,用于学习基础知识",
  "version": "1.0.0",
  "author": {
    "name": "Your Name"
  }
}
EOF

步骤 4:添加自定义命令

commands/ 目录下创建命令文件:

mkdir commands
cat > commands/hello.md << 'EOF'
---
description: 用个性化的消息问候用户
---

# Hello Command

热情地问候用户,并询问今天能如何帮助他们。让问候更加个性化和鼓励性。
EOF

步骤 5:创建 Marketplace 清单

返回上级目录,创建 Marketplace 配置文件:

cd ..
mkdir .claude-plugin
cat > .claude-plugin/marketplace.json << 'EOF'
{
  "name": "test-marketplace",
  "owner": {
    "name": "Test User"
  },
  "plugins": [
    {
      "name": "my-first-plugin",
      "source": "./my-first-plugin",
      "description": "我的第一个测试插件"
    }
  ]
}
EOF

步骤 6:安装和测试

# 从父目录启动 Claude Code
cd ..
claude

# 在 Claude Code 中添加测试 Marketplace
/plugin marketplace add ./test-marketplace

# 安装你的插件
/plugin install my-first-plugin@test-marketplace

选择 “Install now”,然后需要重启 Claude Code 才能使用新插件。

# 尝试你的新命令
/hello

你会看到 Claude 使用你的问候命令!运行 /help 可以查看新命令是否已列出。


插件结构详解

一个完整的插件可以包含以下组件:

my-plugin/
├── .claude-plugin/
│   └── plugin.json          # 插件元数据(必需)
├── commands/                 # 自定义斜杠命令(可选)
│   └── hello.md
├── agents/                   # 自定义代理(可选)
│   └── helper.md
├── skills/                   # Agent Skills(可选)
│   └── my-skill/
│       └── SKILL.md
├── hooks/                    # 事件处理器(可选)
│   └── hooks.json
└── .mcp.json                 # MCP 服务器配置(可选)

插件清单(plugin.json)

这是插件的核心配置文件,必须包含:

{
  "name": "plugin-name",
  "description": "插件描述",
  "version": "1.0.0",
  "author": {
    "name": "作者名称"
  }
}

Commands(命令)

Commands 是自定义的斜杠命令,通过 Markdown 文件定义。文件内容会被发送给 Claude 作为指令。

示例:代码格式化命令

---
description: 自动格式化当前项目的代码
---

# Format Command

格式化当前项目中的所有代码文件。使用项目配置的格式化工具(如 Prettier、Black 等)。
确保遵循项目的代码风格指南。

Agents(代理)

Agents 是专门的子代理,用于处理特定类型的任务。

示例:代码审查代理

---
description: 专业的代码审查助手
---

# Code Review Agent

你是一个专业的代码审查助手。你的任务是:
1. 仔细审查代码的质量、可读性和最佳实践
2. 识别潜在的安全漏洞和性能问题
3. 提供建设性的反馈和改进建议
4. 确保代码符合项目的编码标准

Skills(技能)

Skills 是模型可以自主调用的能力扩展。创建 skills/ 目录,每个技能是一个包含 SKILL.md 的子目录。

示例:Git 操作技能

# Git Operations Skill

这个技能允许 Claude 执行常见的 Git 操作,如提交、推送、创建分支等。
Claude 可以在需要版本控制操作时自动使用此技能。

Hook 开发详解

Hook 是插件系统中最强大的功能之一,允许你在特定事件发生时自动执行脚本。

Hook 配置位置

Hook 可以在以下位置配置:

  • ~/.claude/settings.json - 用户级设置
  • .claude/settings.json - 项目级设置
  • .claude/settings.local.json - 本地项目设置(不提交)
  • 插件中的 hooks/hooks.json - 插件提供的 Hook

Hook 事件类型

PreToolUse

在工具调用之前执行,可以拦截、修改或自动批准操作。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/validate-write.sh"
          }
        ]
      }
    ]
  }
}

PostToolUse

在工具成功执行后立即运行,常用于自动格式化、运行测试等。

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/format-code.sh"
          }
        ]
      }
    ]
  }
}

Notification

当 Claude Code 发送通知时触发,可以用于桌面通知、日志记录等。

{
  "hooks": {
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/notification.sh"
          }
        ]
      }
    ]
  }
}

UserPromptSubmit

在用户提交提示之前执行,可以添加上下文、验证提示等。

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/add-context.sh"
          }
        ]
      }
    ]
  }
}

SessionStart / SessionEnd

在会话开始或结束时执行,用于环境设置、清理任务等。

Hook 输入和输出

Hook 通过 stdin 接收 JSON 数据,包含会话信息和事件特定数据:

{
  "session_id": "abc123",
  "transcript_path": "/path/to/transcript.jsonl",
  "cwd": "/current/working/directory",
  "permission_mode": "default",
  "hook_event_name": "PostToolUse",
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/path/to/file.txt",
    "content": "file content"
  },
  "tool_response": {
    "filePath": "/path/to/file.txt",
    "success": true
  }
}

Hook 输出控制

Hook 可以通过退出码和 JSON 输出来控制行为:

简单方式:退出码

  • 0:成功,stdout 在详细模式下显示
  • 2:阻止操作,stderr 作为错误消息返回给 Claude
  • 其他:非阻塞错误,stderr 在详细模式下显示

高级方式:JSON 输出

{
  "decision": "block",
  "reason": "解释为什么阻止操作",
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "此操作被安全策略阻止"
  }
}

实战案例:通知插件开发

让我们参考 ritmex-marketplace 来创建一个完整的通知插件。

项目结构

ritmex-marketplace/
├── .claude-plugin/
│   └── marketplace.json          # Marketplace 配置
├── claude-code-notification/      # 通知插件
│   ├── .claude-plugin/
│   │   └── plugin.json            # 插件清单
│   ├── hooks/
│   │   └── hooks.json             # Hook 配置
│   └── scripts/
│       └── notification.sh        # 通知脚本
└── README.md

Marketplace 配置

.claude-plugin/marketplace.json:

{
  "name": "ritmex-marketplace",
  "owner": {
    "name": "discountry"
  },
  "plugins": [
    {
      "name": "claude-code-notification",
      "source": "./claude-code-notification",
      "description": "在 macOS 上显示 Claude Code 通知"
    }
  ]
}

插件清单

claude-code-notification/.claude-plugin/plugin.json:

{
  "name": "claude-code-notification",
  "description": "当 Claude Code 触发 Notification hook 时显示 macOS 通知",
  "version": "1.0.0",
  "author": {
    "name": "discountry"
  }
}

Hook 配置

claude-code-notification/hooks/hooks.json:

{
  "description": "自动显示 macOS 通知",
  "hooks": {
    "Notification": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PLUGIN_ROOT}/scripts/notification.sh",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

通知脚本

claude-code-notification/scripts/notification.sh:

#!/bin/bash

# 读取 JSON 输入
INPUT=$(cat)
MESSAGE=$(echo "$INPUT" | jq -r '.message // "Claude Code Notification"')
NOTIFICATION_TYPE=$(echo "$INPUT" | jq -r '.notification_type // ""')
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // ""')

# 设置通知标题
TITLE="${CLAUDE_NOTIFY_TITLE:-Claude Code}"

# 根据通知类型设置点击行为
if [ "$NOTIFICATION_TYPE" = "permission_prompt" ]; then
    # 权限提示:点击时聚焦到终端
    if command -v terminal-notifier &> /dev/null; then
        terminal-notifier \
            -title "$TITLE" \
            -message "$MESSAGE" \
            -activate "com.warp.Warp" \
            -sender "com.warp.Warp" 2>/dev/null || \
        terminal-notifier \
            -title "$TITLE" \
            -message "$MESSAGE" \
            -activate "com.apple.Terminal" \
            -sender "com.apple.Terminal"
    else
        # 使用 osascript 作为后备
        osascript -e "display notification \"$MESSAGE\" with title \"$TITLE\""
    fi
elif [ -n "$TRANSCRIPT_PATH" ]; then
    # 有 transcript 路径:点击时打开文件
    if command -v terminal-notifier &> /dev/null; then
        terminal-notifier \
            -title "$TITLE" \
            -message "$MESSAGE" \
            -open "$TRANSCRIPT_PATH"
    else
        osascript -e "display notification \"$MESSAGE\" with title \"$TITLE\""
    fi
else
    # 普通通知
    if command -v terminal-notifier &> /dev/null; then
        terminal-notifier -title "$TITLE" -message "$MESSAGE"
    else
        osascript -e "display notification \"$MESSAGE\" with title \"$TITLE\""
    fi
fi

exit 0

安装和使用

# 添加 Marketplace
/plugin marketplace add discountry/ritmex-marketplace

# 安装插件
/plugin install claude-code-notification@ritmex-marketplace

# 验证安装
/plugin

高级 Hook 示例

示例 1:自动代码格式化

在文件写入后自动运行格式化工具:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/format.sh",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

format.sh:

#!/bin/bash

INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_response.filePath // .tool_input.file_path // ""')

if [ -z "$FILE_PATH" ]; then
    exit 0
fi

# 根据文件类型选择格式化工具
case "$FILE_PATH" in
    *.js|*.jsx|*.ts|*.tsx|*.json)
        if command -v prettier &> /dev/null; then
            prettier --write "$FILE_PATH" 2>/dev/null
        fi
        ;;
    *.py)
        if command -v black &> /dev/null; then
            black "$FILE_PATH" 2>/dev/null
        fi
        ;;
    *.go)
        if command -v gofmt &> /dev/null; then
            gofmt -w "$FILE_PATH" 2>/dev/null
        fi
        ;;
esac

exit 0

示例 2:命令验证

拦截危险命令并建议更安全的替代方案:

#!/usr/bin/env python3
import json
import re
import sys

VALIDATION_RULES = [
    (
        r"\bgrep\b(?!.*\|)",
        "建议使用 'rg' (ripgrep) 替代 'grep',性能更好且功能更强大",
    ),
    (
        r"\bfind\s+\S+\s+-name\b",
        "建议使用 'rg --files | rg pattern' 替代 'find -name',性能更好",
    ),
    (
        r"rm\s+-rf\s+/",
        "危险操作:删除根目录!请确认这是你想要的。",
    ),
]

try:
    input_data = json.load(sys.stdin)
except json.JSONDecodeError as e:
    print(f"错误: 无效的 JSON 输入: {e}", file=sys.stderr)
    sys.exit(1)

tool_name = input_data.get("tool_name", "")
tool_input = input_data.get("tool_input", {})
command = tool_input.get("command", "")

if tool_name != "Bash" or not command:
    sys.exit(0)

issues = []
for pattern, message in VALIDATION_RULES:
    if re.search(pattern, command):
        issues.append(message)

if issues:
    for message in issues:
        print(f"• {message}", file=sys.stderr)
    sys.exit(2)  # 阻止命令执行

sys.exit(0)

示例 3:智能停止判断

使用 LLM 判断 Claude 是否应该继续工作:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "prompt",
            "prompt": "评估 Claude 是否应该停止工作。上下文: $ARGUMENTS\n\n分析对话并判断:\n1. 用户请求的所有任务是否已完成\n2. 是否有需要解决的错误\n3. 是否需要后续工作\n\n返回 JSON: {\"decision\": \"approve\"\"block\", \"reason\": \"你的解释\"}",
            "timeout": 30
          }
        ]
      }
    ]
  }
}

发布和分发插件

创建 GitHub Marketplace

  1. 创建仓库结构
mkdir my-marketplace
cd my-marketplace
mkdir .claude-plugin
# 创建 marketplace.json
# 添加插件目录
  1. 推送到 GitHub
git init
git add .
git commit -m "Initial marketplace"
git remote add origin https://github.com/your-org/my-marketplace.git
git push -u origin main
  1. 用户安装
/plugin marketplace add your-org/my-marketplace
/plugin install plugin-name@my-marketplace

团队配置

在项目的 .claude/settings.json 中配置自动安装:

{
  "extraKnownMarketplaces": {
    "my-marketplace": {
      "source": {
        "source": "github",
        "repo": "your-org/my-marketplace"
      }
    }
  },
  "enabledPlugins": {
    "plugin-name@my-marketplace": true
  }
}

团队成员信任仓库文件夹后,插件会自动安装。


最佳实践

安全性

  1. 验证输入:永远不要盲目信任输入数据
  2. 引用变量:使用 "$VAR" 而不是 $VAR
  3. 阻止路径遍历:检查文件路径中的 ..
  4. 使用绝对路径:为脚本指定完整路径
  5. 跳过敏感文件:避免处理 .env.git/、密钥等

性能

  1. 设置超时:为长时间运行的脚本设置合理的超时
  2. 并行执行:多个匹配的 Hook 会并行运行
  3. 去重:相同的 Hook 命令会自动去重

调试

  1. 使用调试模式claude --debug 查看详细执行信息
  2. 测试命令:先手动运行 Hook 命令确保正常工作
  3. 检查配置:使用 /hooks 查看已注册的 Hook

总结

Claude Code 的插件系统提供了强大的扩展能力:

  • Commands:快速创建自定义命令
  • Agents:定义专门的子代理
  • Skills:扩展模型能力
  • Hooks:自动化工作流和增强安全性
  • MCP Servers:集成外部工具

通过插件系统,你可以:

  • 自动化重复任务
  • 增强开发安全性
  • 集成团队工具
  • 提升开发效率

参考资源:

开始创建你的第一个插件,让 Claude Code 更加强大!

如何在手机上优雅地 Vibe Coding

2025年12月10日 00:00

在手机上写代码的核心思路是: 计算在远程,手机只负责输入与查看结果。

方案一:在 VPS 上运行 Codex / Claude Code 等 CLI

然后手机用 Termius(或任意 iOS SSH App)连接

流程非常简单:

  1. 在 VPS 上安装 Node(18+)与 Coding CLI:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

安装 Codex 或其他 CLI:

npm install -g @openai/codex
  1. 在 VPS 上运行 CLI:
codex
  1. 手机端用 Termius 等 SSH App 登录 VPS。 进入终端后就能直接使用 CLI,在手机上写代码、跑 agent。

特点:

  • 环境永远在线
  • 手机就是纯终端
  • 随时随地 vibe coding

方案二:使用 Happy,把家里电脑的 Coding CLI 映射到手机

(官方 Quick Start 工作方式)

Happy 的作用是: 把你家里电脑正在运行的 coding CLI,安全地连接到你的手机上。 不需要公网 IP,也不需要 SSH。

流程:

  1. 在家里电脑安装 Node(18+)与 Happy:
npm install -g happy-coder
  1. 在电脑执行认证:
happy --auth

电脑会显示一个二维码 / 代码。

  1. 打开手机上的 Happy(App 或 Web)扫描绑定。

绑定后,你就能:

  • 在手机上访问电脑的 coding CLI
  • 操作完全在手机界面完成
  • 电脑执行、手机查看结果

特点:

  • 复用家里电脑的性能与环境
  • 手机端操作舒服
  • 无需 SSH、无需对外暴露电脑

总结

手机优雅 vibe coding 的最简单实践就是:

  • 要稳定、常在线 → VPS + SSH 运行 Codex 等 CLI
  • 要高性能、用自己电脑 → Happy 远程连接本地 CLI

两种方式都足够轻量,也都能让手机实现完整 coding 体验。

在 512MB 微型 VPS 上创建虚拟内存并安装 Codex

2025年12月10日 00:00

在 512MB 甚至 256MB 这种微型 VPS 上跑现代工具(比如 bun addnpm install、Codex CLI)时,很容易遭遇内核 OOM(Out of Memory)直接把进程干掉:

/usr/bin/env: ‘node’: No such file or directory
Out of memory: Killed process ...

此类问题一般由两点引起:

  1. 系统没有 Node.js
  2. 没有启用 swap,内存耗尽即被 OOM 干掉

以下内容提供清晰可靠的处理流程: (1)释放磁盘空间 →(2)创建并启用 1GB swap →(3)安装 Node.js 20(NodeSource)→(4)安装 Codex CLI 最后附带完整一键脚本。


1. 查看当前内存与 swap 状态

free -h
swapon --show

典型输出(Swap 为 0B):

Swap: 0B  0B  0B

必须先启用 swap 才能稳定运行安装工具。


2. 释放磁盘空间(若 / 已满)

检查磁盘:

df -h

若使用率100%,需要先清理:

sudo truncate -s 0 /var/log/sing-box/access.log 2>/dev/null || true
sudo truncate -s 0 /var/log/btmp.1               2>/dev/null || true
sudo apt-get clean

再次确认:

df -h

3. 创建并启用 1GB swapfile

删除旧 swapfile(如果有)

sudo swapoff /swapfile 2>/dev/null || true
sudo rm -f /swapfile 2>/dev/null || true

创建新 swapfile

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

检查 swap 是否生效

swapon --show
free -h

应看到类似:

Swap:
/swapfile   file   1G   0B   1G

4. 开机自动挂载 swap

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

5. 安装 Node.js 20(NodeSource 官方源)

Codex CLI 基于 Node.js,因此必须先安装 Node.js。 使用 NodeSource 可获得最新稳定版本。

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

确认版本:

node -v

6. 安装 Codex CLI

sudo npm install -g @openai/codex

确认安装成功:

which codex
codex --help

若能正常输出帮助信息,则安装完成。


一键脚本:创建 swap + 安装 Node.js20 + 安装 Codex

保存为 setup_codex.sh

#!/usr/bin/env bash
set -e

SWAP_SIZE="1G"

echo ">>> 清理日志与 APT 缓存"
sudo truncate -s 0 /var/log/sing-box/access.log 2>/dev/null || true
sudo truncate -s 0 /var/log/btmp.1               2>/dev/null || true
sudo apt-get clean || true

echo ">>> 删除旧 swapfile(如有)"
sudo swapoff /swapfile 2>/dev/null || true
sudo rm -f /swapfile 2>/dev/null || true

echo ">>> 创建新的 swapfile (${SWAP_SIZE})"
sudo fallocate -l "${SWAP_SIZE}" /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

echo ">>> 写入 /etc/fstab(如果缺失)"
FSTAB_LINE="/swapfile none swap sw 0 0"
if ! grep -q "^/swapfile " /etc/fstab 2>/dev/null; then
  echo "${FSTAB_LINE}" | sudo tee -a /etc/fstab >/dev/null
fi

echo ">>> 安装 Node.js 20(NodeSource)"
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

echo ">>> Node 版本:"
node -v

echo ">>> 安装 Codex CLI"
sudo npm install -g @openai/codex

echo ">>> Codex CLI 已安装"
which codex || true
codex --help || true

echo ">>> 完成"
free -h
swapon --show

运行:

chmod +x setup_codex.sh
./setup_codex.sh

微型 VPS 上运行 Codex CLI 至此即可稳定运行,不再遇到 OOM Killed 或 node 不存在的问题。


如需我为你的服务器环境进一步优化配置,也可继续发我 df -hfree -htop 等输出。

买房时,我们到底在买什么?——中国住宅真实寿命研究报告

2025年12月10日 00:00

过去三十年,房地产是中国家庭资产配置的绝对核心。在长期单边上涨的市场环境下,房产被视为唯一的低风险高收益资产,吸纳了居民部门绝大多数的储蓄与未来现金流。

随着宏观经济进入调整期,资产价格预期的逆转迫使市场参与者重新评估其持有成本与潜在风险。当剥离了高增长时代的金融溢价后,一个长期被忽视的结构性风险暴露无遗:

购房者通过背负长达 30 年的刚性债务,试图锁定 70 年的土地使用权。然而,作为权益载体的钢筋混凝土建筑,其统计学意义上的物理寿命,往往无法覆盖完整的产权周期,甚至难以跑赢按揭贷款的偿付周期。这种债务久期与资产寿命的倒挂,构成了普通家庭资产负债表上最大的隐患。

1. 核心矛盾:设计标准 vs. 统计现实

关于房屋寿命,存在两个截然不同的概念:

  • 设计使用年限(理论值):指在正常设计、施工、使用和维护下,房屋结构能满足安全使用的年限。
    • 根据《建筑结构可靠度设计统一标准》(GB 50068-2001)和《民用建筑设计通则》(JGJ 37-1987),普通居住房屋的结构设计使用年限为 50年
    • 重要建筑(如高层地标)可达 100年
  • 实际服役寿命(统计值):指房屋从建成到被拆除的实际时间。
    • 根据剑桥大学 Zhou 等人 2019 年发表于《Sustainability》的研究,通过对 1978-2017 年中国城市住宅存量的生存分析,得出中国城市住宅建筑的平均寿命约为 34.1年
    • 这一数据验证了住建部原副部长仇保兴在 2010 年提出的观点:“我国建筑的平均寿命只能维持 25-30年。”

2. 寿命折损原因分析

中国住宅“短命”并非单一结构质量问题,而是复合因素的结果:

  • 非物理性折损(拆迁与更新):这是导致平均寿命偏低的主因。在城市化快速推进阶段,许多房屋结构尚未老化,但因土地价值重估、城市规划变更或容积率调整而被提前拆除。
  • 建造质量的历史包袱:上世纪 80-90 年代建造的早期商品房或房改房,受限于当时的建材标准(如预制板结构)和施工监管,耐久性确实不足,导致目前面临集中淘汰。
  • 维护体系缺失:相比于建设阶段的巨额投入,国内住宅在交付后的维护投入长期不足。缺乏系统的修缮导致建筑老化速度加快,“年久失修”成为拆除的合理化理由。

3. 一线城市的特殊性:上海与北广深

对于一线城市(北上广深),情况较全国平均水平略有不同。

  • 质量更优,寿命略长:一线城市执行更严格的建筑规范和监管。2024 年关于上海民用建筑全生命周期碳排放的研究指出,上海民用建筑的平均寿命约为 40年。这高于全国 34.1 年的平均水平。
  • 更新压力依然存在:尽管建筑质量较好,但一线城市土地稀缺,旧城改造和城市更新的动力更强。许多位于核心地段的低密度老旧小区(如 6 层砖混楼),往往因无法匹配当前的土地经济价值而被拆除重建。

对于一线城市购房者,30-40年 是一个基于历史数据的合理预期区间。特别是 2000 年之前建造的住宅,面临着更高的物理老化风险或拆迁不确定性。

4. 国际横向对比

将视野扩大到全球,中国住宅的寿命处于什么水平?

国家/地区 住宅平均寿命 (估算/统计) 主要特征
中国 25 - 35 年 受城市更新和早期质量影响大,实际寿命远低于设计寿命。
日本 25 - 35 年 尽管建筑技术先进,但因资产折旧制度和对新房的偏好,市场倾向于“拆旧建新”,经济寿命短。
美国 61 - 74 年 存量房市场成熟,木结构房屋维护体系完善。
英国 75 - 132 年 极端案例。大量维多利亚时期砖石建筑仍在使用,社会习惯于修缮而非拆除。
西欧 70 - 100 年 普遍拥有较长的建筑服役周期。

数据来源Sustainability (MDPI), ResearchGate, China Economic Review, 英国 BS 7543 标准。

5. 结语:最大的赌场往往不需要门票

在二级市场,无论是股票还是加密货币,成熟的投资者都会反复告诫新人一条铁律:远离合约,拒绝高杠杆。因为在波动的市场中,加杠杆等同于将命运交付给概率,稍有不慎便是爆仓归零。

然而,极具讽刺意味的是,在面对“买房”这一人生最大宗交易时,绝大多数以“稳健”自居的普通家庭,却毫不犹豫地选择了拉满杠杆、押上全部身家,进行一次长达 30 年的单边做多。

这不仅是一次满仓梭哈,更是一场针对劣质资产的豪赌。我们用透支未来 30 年现金流的代价,去锁定一个统计寿命可能仅有 34 年、且并不具备神圣不可侵犯之私有产权属性的耗材。当按揭贷款的周期几乎等同于建筑物本身的物理生命周期时,这在金融逻辑上已经构成了一种极其危险的“久期错配”。

在这个局中,人口老龄化是灰犀牛,建筑短命是黑天鹅,而产权的不确定性则是始终悬在头顶的达摩克利斯之剑。

当下越来越多的年轻人选择不婚、不育、不买房,被主流舆论诟病为“躺平”或“缺乏责任感”。但若从投资风控的角度审视,这或许是新生代作为市场参与者,在直觉上察觉到了赔率的失衡——当一张期货合约的底层资产在不断折旧,且交割规则由庄家单方面解释时,拒绝开仓,才是唯一的理性避险。

设计灵感网站推荐合集

2025年11月21日 00:00

在进行网站设计、界面 UI/UX 创作或品牌营销页开发时,拥有一个优质的灵感库至关重要。下面我整理了一批极具参考价值的设计展示网站,涵盖一页式 (One-Page) 设计、Landing Page 范例、动画与微交互动效、作品集、创意图库等多个维度。无论你是「小恐龙 KOL tweet 模板」「社区互动页」「区块链/AI 项目官网」等场景,都能从中找到有助于提炼风格、调色板、布局结构或动画节奏的参考。

1. siteInspire

这是一个专门展示优质网页设计的网站,其定位是「展示网络上最好的设计 + 才能」。:contentReference[oaicite:0]{index=0}
推荐理由

  • 涵盖了视觉、界面、交互佳作,适合做整体版式、配色与排版灵感采集。
  • 策展质量高,适合快速 « 浏览 + 收藏 »。
    使用建议:在构思品牌主页或大型项目官网(如你在 crypto/AI 生态中的各类主题页面)时,可先浏览 siteInspire ,锁定主视觉风格,再延伸开发。

2. Awwwards

这是一个全球知名的网页设计奖项平台,聚焦展示开发者、设计师、网页机构的高水准作品。:contentReference[oaicite:1]{index=1}
推荐理由

  • 包含「Site of the Day」「Nominees」「Winners」等分类,可看到当下最新最前沿的网页互动、动画技术、案例趋势。
  • 拥有按技术、类别筛选(如 React 、WebGL 、3D 、Scroll 等)功能。
    使用建议:如果你想让「小恐龙 & 蟹王」那种角色动画在网页中有炫酷交互,或想做一个区块链项目页带微交互、3D 效果,这里是寻找技术灵感的极佳来源。

3. CSS Design Awards

另一个高质量的网站奖项平台,强调 UI、UX 与创新三个维度。:contentReference[oaicite:2]{index=2}
推荐理由

  • 每个获奖作品都会标注 UI 、UX 、Innovation 评分,便于理解为何被评为佳作。
  • 可看到许多细节设计(排版、色彩、微动效)值得借鉴。
    使用建议:适用于你在制作 newsletter、Landing Page、社群宣传页 (如 Wind Runner SBT、YieldBasis allocation letter) 时,用于参考「优秀互动+体验」的结构。

4. One Page Love

专注于单页网站(One-Page)设计的灵感库。:contentReference[oaicite:3]{index=3}
推荐理由

  • 集合了大量单页网站案例、模板与资源,非常适合快速部署或构思一页式页面。
  • 模板、资源链接丰富,可作为启动项目参考。
    使用建议:如果你准备做一个「小恐龙 快报 #1」那种一页式宣传页,或者 crypto 空投活动页面、SBT 活动页面,这里可以先选一个布局,再调整品牌角色(小恐龙/蟹王等)、色彩、图像场景。

5. Landing.love

(你提供的 Landing.love 链接)这个站点专注于 Landing Page 设计灵感。
推荐理由

  • 虽不像其他奖项平台那样广为熟知,但专注在 Landing Page 范畴,可直接找到转化型页面结构的参考。
    使用建议:当你需要一个「注册/领取/参与」型页面时,此站可帮助你快速选定 Hero 区、 CTA 按钮位置、视觉聚焦等结构方案。

6. Landingfolio

专门为 Landing Page 提供灵感、模板与组件库。:contentReference[oaicite:4]{index=4}
推荐理由

  • 不仅有案例,还有可复用的组件(Tailwind、Webflow、Figma)和模板。
  • 分类细致(如 SaaS、产品、AI、加密、企业等)且资源丰富。
    使用建议:适合当你做「Kite AI Wind Runner SBT 宣页」或「Sentient Library 活动页」等具备 CTA 、注册流程、限时优惠结构的页面时使用。你甚至可以直接借用组件+模板,加快开发流程。

7. Wall of Portfolios

聚焦作品集类网页展示的灵感集合。
推荐理由

  • 当你需要做个人/团队 portfolio 页(例如你自己做 Web3 工具、AI 代理系统的展示页)时,这是一个不错的参考库。
    使用建议:建议浏览那些由设计师、创意工作室打造的「作品展示页」结构,借鉴 项目模块布局、案例 Thumbnail 布局、动画切换方式,再结合你品牌吉祥物“小恐龙”等角色元素。

8. UI UX Showcase

专注于 UI/UX 与设计资源展示的站点。:contentReference[oaicite:5]{index=5}
推荐理由

  • 除了网页设计,还有设计资源、AI 工具推荐,非常适合追求 UX 细节与工具效率的你。
    使用建议:你可以用它来找到微动效、界面组件、流程设计灵感。当你做「小恐龙 & Monkey 驾驶 Zama Car」那种场景动画/界面演示页时,借鉴 UI /UX 细节会更加出彩。

9. Httpster

一个手工精选、不追大奖但追设计态度的网页设计展示网。:contentReference[oaicite:6]{index=6}
推荐理由

  • 风格偏向极简、排版大胆、实验性强,很适合从中挖掘另类布局或打破常规的设计思路。
    使用建议:当你想让页面更具特色、更有“创意视觉冲击”时(比如 “Sentient Library” 场景页、或 “Cysic Mining Site” 互动页),在 Httpster 找灵感会很合适。

10. Designspiration

一个广泛的视觉灵感平台,涵盖色彩、图像、排版、插画等。
推荐理由

  • 虽不专门针对网页,但在找色彩组合、插画风格、品牌配色 palette 时非常有用。
    使用建议:你可将其用于“小恐龙 + 蟹王 + 熊猫 + 小猪”角色画面中的配色参考,或寻找背景插画风格、叙事图像组合,再在网页中加以延伸。

11. Abduzeedo

一个创意设计博客与视觉灵感分享平台。
推荐理由

  • 包含设计师访谈、教程、灵感汇总。适合你在品牌视觉、角色插画、小恐龙场景扩展中寻找更丰富的来源。
    使用建议:当你做“御花园 Portaltobitcoin 茶话会”那种叙事场景时,可借助 Abduzeedo 查找插画风格、排版摆设、空间构图等灵感。

12. GSAP Showcase

由 GSAP(GreenSock Animation Platform)官方维护的动画网页精选合集。:contentReference[oaicite:8]{index=8}
推荐理由

  • 专注于动效、微交互、滚动触发、SVG 动画等高级交互形式。
  • 若你网页中有「小恐龙 grid 交易在迪拜」「小恐龙 & 猴子 驾驶 Zama Car」这样的动态叙事场景,这类示例极具参考价值。
    使用建议:建议浏览其 Showcase 中发现哪种动画触发方式(如 ScrollTrigger、MorphSVG、Inertia)适合你的场景,再在项目中复用或改造。

13. Behance

由 Behance 提供的全球创意作品集平台。
推荐理由

  • 设计师、插画师、动效师、网页开发者大量作品集中地,适合探索「概念页」「完整项目展示」的视觉叙事方式。
    使用建议:你可以搜索关键词如 “web design crypto”, “landing page illustration”, “UI/UX animation”,看看别人如何将角色、叙事、品牌融合到网页设计中,从中提炼灵感再落地至你的 Web3/AI 生态页面。

14. Dribbble

由 Dribbble 提供的设计师作品分享平台。
推荐理由

  • 微交互、界面细节、动效 Preview 图常见;适合快速捕捉「一个按钮 hover 动画」「One-Page 滑动效果」这类设计元素。
    使用建议:当你在做页面细节(如 “小恐龙 & 猴子 驾驶 Zama Car”的按钮/切换/视觉反馈)时,Dribbble 是查找 UI 元素动效的绝佳场所,可供快速 slice 与复用。

📌 总结

  • 如果你需要 整体版式+版面灵感:推荐 siteInspire、Httpster、Designspiration。
  • 想看 获奖/前沿交互效果:推荐 Awwwards、CSS Design Awards、GSAP Showcase。
  • 需要 一页式或 Landing Page 结构参考:推荐 One Page Love、Landing.love、Landingfolio。
  • 作品集/品牌展示页:推荐 Wall of Portfolios、Behance、Dribbble。
  • 想丰富 插画/视觉风格/配色:推荐 Abduzeedo、Designspiration。
  • 想搜寻 UI/UX 组件/动效资源:推荐 UI UX Showcase、Dribbble。

在你下一次打造「小恐龙 KOL tweet 模板」「社区互动页」「AI 代理支付系统的Landing Page」的时候,不妨按照以下流程使用这些资源:

  1. 先从整体风格库(如 siteInspire、Httpster)中选出一个视觉方向。
  2. 再去 Landing/One-Page 站点(如 Landingfolio、One Page Love)锁定结构布局。
  3. 从交互/动画库(如 GSAP Showcase、Awwwards)选取可复用的动效方案。
  4. 最后去插画/视觉/组件站点(如 Designspiration、UI UX Showcase)提取角色、配色、按钮、组件样式。
  5. 汇总后结合你品牌中“小恐龙、小猪、蟹王、熊猫”等角色与 ARB/Zama/Sentient/Billions Logo 元素,融入场景叙事,再做 Tailwind CSS/React/Vite 或 Webflow 落地。

希望这份集合对你接下来的网页设计与品牌传播创作有所帮助!如果你想我帮你从其中任意一个站点摘出 10 个精选案例(比如「区块链项目专用Landing Page」)并生成 Figma 链接或 Tailwind 组件,也可以告诉我,我可以继续帮你整理。

使用 Warp 拯救 VPS 解锁 ChatGPT/Gemini/Netflix/Google验证码

2025年9月5日 00:00

用了很久的 VPS 突然打不开 Gemini 了,虽然是日本 IP 但是显示服务尚未在当前地区开放。

真实物理IP/静态住宅IP是比较贵的,那么有没有一种办法可以解除这些限制呢?

今天学习到了可以使用 Cloudflare 提供的免费 Warp 服务,为 VPS 服务器本身添加代理网络出口,达到解锁目的。

具体使用到的是warp-yg一键安装脚本。

bash <(curl -Ls https://raw.githubusercontent.com/yonggekkk/warp-yg/main/CFwarp.sh)

根据命令行的提示操作即可。

在末法时代里爬行

2025年8月25日 00:00

2002年,《波士顿环球报》揭露波士顿1500名神父中,有249名涉嫌性侵儿童。其中恶名昭著的吉欧根神父,面临130项性侵指控。

该调查过程于2015年被改编为电影《聚焦》(Spotlight)。

同年7月26日,中国互联网出现署名“释正义”的举报帖《少林寺方丈释永信这只大老虎,谁来监督》,指控释永信拥有双重户籍、强奸尼僧释延果、包养情妇,并与哈尔滨女子关丽丽、尼僧释延洁各育有一名私生女,并提供了相关证据。

2015年11月,河南调查组公布初步结果:释永信无私生子女,方丈资格“程序合法合规”;其余被举报问题仍在依法调查中。


释永信(原名刘应成),1965年9月6日生,八字乙巳 甲申 癸亥。2025年恰逢其转入戊寅大运,命理上讲,叫做「伤官见官」,主诉讼牢狱之灾。

2025年7月27日,少林寺管理处官方通报:释永信涉嫌刑事犯罪,挪用侵占项目资金及寺院资产;严重违反佛教戒律,长期与多名女性保持不正当关系并育有私生子。

7月28日,中国佛教协会公告,同意注销释永信戒牒。


佛教典籍载:佛法流传世间共一万二千年,分正法一千年、像法一千年、末法一万年。
正法为真佛法,像法尚存佛法之形,末法则佛法几近消亡。

佛陀涅槃前三月,于《法灭尽经》中预言末世景象:

“吾涅槃后,法欲灭时,五逆浊世,魔道兴盛。
魔作沙门,坏乱吾道,著俗衣裳,乐好袈裟,五色之服,饮酒啖肉,杀生贪味。
无有慈心,更相憎嫉。”

佛陀早已预言将有魔道假扮僧人,败坏佛法,行龌龊之事。

同时预言:末法时代,纵有真修行者舍己为人,亦会遭假僧诽谤驱逐。
寺庙终将荒废,僧人腐化,贪财淫乱,不分男女,无人持戒诵经。

以佛灭度年(公元前543年)为基准,2025年已入末法时代69年。
对照当下新闻与佛陀预言,世人皆可自忖:剧情已演进至哪一章节。


每只蚂蚁 都有眼睛鼻子 它美不美丽 偏差有没有一毫厘 有何关系

每一个人 伤心了就哭泣 饿了就要吃 相差大不过天地 有何刺激

有太多太多魔力 太少道理 太多太多游戏 只是为了好奇
还有什么值得 歇斯底里 对什么东西 死心塌地

一个一个偶像 都不外如此 沉迷过的偶像 一个个消失

谁曾伤天害理 谁又是上帝 我们在等待 什么奇迹

最后剩下自己 舍不得挑剔 最后对着自己 也不大看得起
谁给我全世界 我都会怀疑 心花怒放 却开到荼蘼

在512MB内存的VPS上使用brew安装cmake

2025年6月10日 00:00

在资源极其有限的 VPS 上使用 Homebrew 安装大型工具(如 CMake)通常会遇到内存不足、编译失败等问题。

在这篇文章中,我将分享如何在 仅 512MB 内存的 VPS 上通过 启用虚拟内存(Swap) 成功安装 cmake 的完整流程。

🧾 背景

  • VPS 配置:512MB RAM,无额外 swap
  • 操作系统:Debian / Ubuntu 系统(适用于大多数 Linux 发行版)
  • 安装工具:Homebrew(Linuxbrew)
  • 安装目标:CMake(可能会从源码编译,内存需求大)

🪄 解决思路:开启 Swap(虚拟内存)

由于 cmake 的安装过程可能需要超过 1GB 的内存,我们可以通过增加 Swap 空间(即硬盘模拟内存)来避免编译过程 OOM(内存溢出)的问题。


🛠️ 操作步骤

1. 创建并启用 Swap 文件

# 创建一个 1GB 的 Swap 文件
sudo fallocate -l 1G /swapfile

# 如果 fallocate 不可用,可使用 dd 命令代替:
# sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

# 设置文件权限为 600
sudo chmod 600 /swapfile

# 格式化为 swap 格式
sudo mkswap /swapfile

# 启用 swap
sudo swapon /swapfile

# 验证 swap 是否启用成功
swapon --show

2. 设置开机自动挂载 Swap

# 添加到 /etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

🍺 安装 Homebrew(如果尚未安装)

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

配置环境变量(添加到 .bashrc.zshrc):

echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

📦 使用 Brew 安装 CMake

brew install cmake

整个编译过程会非常耗时(尤其是第一次),但在启用了 swap 之后,即使只有 512MB RAM,也可以稳定编译完成!


✅ 验证安装

cmake --version

输出应类似于:

cmake version 3.xx.x

💡 小贴士

  • 如果你遇到 “killed” 错误,多半是内存不足导致的,需要确保 swap 正常启用。
  • 编译时可使用 htop 监控内存和 swap 使用情况。
  • 安装完成后可以关闭 swap(可选):
sudo swapoff /swapfile

在 Ubuntu 中,如果系统自带了 swap 文件,你可以通过以下方法查看其大小:

1. 查看当前 swap 文件的大小

执行以下命令:

sudo swapon --show

该命令会显示所有活跃的 swap 分区或文件,并包含它们的大小信息。

示例输出:

NAME      TYPE      SIZE  USED PRIO
/swapfile file      1G   0B   -2

在这个例子中,/swapfile 的大小是 1GB。

2. 查看 /swapfile 的实际大小

如果你想查看 swap 文件本身的大小,可以使用:

ls -lh /swapfile

这会显示 swapfile 的大小,例如:

-rw------- 1 root root 1.0G Jun 10 12:34 /swapfile

这里显示的是 1GB 大小的 swap 文件。


如果你发现默认的 swap 文件太小,可以通过以下步骤调整其大小:

  1. 关闭 swap

    sudo swapoff /swapfile
    
  2. 修改 swap 文件大小

    sudo fallocate -l 2G /swapfile  # 例如,修改为 2GB
    
  3. 重新格式化并启用 swap

    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  4. 验证

    sudo swapon --show
    

🏁 总结

在低配 VPS 上编译大型工具并非不可能,只需合理使用虚拟内存(swap),就能绕过 RAM 限制。通过本文提供的步骤,我成功在一台只有 512MB 内存的 VPS 上完成了 cmake 的安装。希望对你也有所帮助!

腾讯云安装 Dokploy(Vercel 开源平替)

2025年5月3日 00:00

一键把你的服务器变成 Vercel

服务器配置只需 2核 2G 内存即可

首先根据腾讯云官方文档安装 Docker

以 ubuntu 为例:

sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动
sudo systemctl start docker
# 验证
sudo docker info

重点是换源:

vim /etc/docker/daemon.json

输入如下内容并保存

{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}

重启 Docker

sudo systemctl restart docker

使用官方一键脚本安装 Dokploy

curl -sSL https://dokploy.com/install.sh | sh

等待 3 分钟左右即可,根据命令行提示,在浏览器中打开 http://your-ip-from-your-vps:3000 完成剩余配置

域名绑定

如果你的域名 DNS 在 Cloudflare,需要修改为 Full(strict) 或 Flexible 模式,具体参考https://docs.dokploy.com/docs/core/domains/cloudflare

自动部署

在 Github repo 中配置 webhook 即可自动部署,具体参考https://docs.dokploy.com/docs/core/auto-deploy

Bitcoin cycle

2024年6月17日 00:00

著名的经济学家周金涛有一句名言:人生发财💸靠康波。

康波,是俄国经济学家康德拉季耶夫发现的为期50-60年一轮的经济周期。

在这里我可以很负责任地告诉大家,这个周期就是60年。因为60年为一甲子。干支纪年法早在华夏文明诞生之初就已存在,我们的祖先早就掌握了不亚于今日科技的高精度的天文观测方法。

所谓人法地、地法天、天法道、道法自然。其实经济就是人类活动的总和,而作为自然界中渺小的一个物种,我们的所有活动都要尊从自然规律。

经济周期自然也要服从这个宇宙的周期。具象一点说,就是太阳☀️黑子活动会实质性影响你的心情和手机信号;🌓月心引力会引起潮汐和大姨妈。以此类推,如果所有人类的心情被周期控制,决策也会被周期控制,最后产生的经济活动是结果,只是自然周期的一个投影而已。

伟大的先人用天干地支来为周期计时。例如每60年的循环中,第一年叫甲子,2024年是甲辰年。除了年份外,月、日、时都可以通过干支表示。类比60年是一个大循环,60月(5年)是一个小循环。

这样的规律就解释了,为什么2019年和2024年如此相似(相差60个月)。无论从美联储的加息降息的时间点,还是比特币价格的走势,几乎都同频共振。

万事万物在大周期中,也有自己独特的小周期。我们每个人出生的时候,每个事物诞生的时候,都相当于是那一刻宇宙状态的投影,而诞生时的宇宙状态,同样可以用天干地支来表示,在传统文化中,它就叫做八字。

通过解读八字,我们可以了解一个人、一件事物自身的运势周期。

除了年份的判断以外,我们也可以尝试分析每月的运势。

===

  • 1月乙己克,暴力回调
  • 2月丙寅,丙火为用,大涨
  • 3月丁卯,丁火为用,卯酉相冲,冲顶
  • 4月戊辰,双劫财,暴跌
  • 5月己巳,巳火为用,己土比肩,反弹
  • 6月庚午,甲庚相克,子午相冲,天克地冲,暴跌
  • 7月辛未,食神化煞生财,反弹
  • 8月壬申,丙壬冲,寅申冲,暴跌
  • 9月癸酉,反弹
  • 10月甲戌,暴跌
  • 11月乙亥,乙己克,大暴跌
  • 12月丙子,丙火为用,子水为财,V反

===

类似的规律也可以精准到某一日,比如最近的6月11日(午月午日,双重子午冲)也是本轮暴跌的起点。有同学会说6月8日也跌了,没毛病,6月8日(午月卯日,子午冲+卯酉冲)冲突同样很强。

事实上,所有个体、事物的运势周期仍然要尊从大环境的周期。记得有一次找网上一个老阿姨算命,我说我2020年运气不太好,老阿姨说:“那是你不好吗?那是所有人都不好。”

《地母经》里记载:太岁庚子年,人民多暴卒。自古以来,庚子年就是多灾多难的年份,容易爆发各种瘟疫、灾难。顺便展开一下,上一个庚子年是1960年,即三年自然灾害时期;再上一个庚子年是1900年,八国联军侵华;再往前翻,还有1840年,鸦片战争。

个人是无法在时代的洪流面前螳臂当车的。学习周期,了解周期,对于我们个体的意义来说就是趋吉避凶,在好的年月里HODL&BUILD,在时运不济时EXIT SCAM&KEEP SAFU。

在加密货币市场中如何价值投资

2023年12月1日 00:00

加密货币市场是一个充满高波动性和不确定性的领域,但即便如此,许多投资者仍然在寻找价值投资的机会。

价值投资指的是寻找那些市场价格低于其实际价值的资产进行投资。

通过基本面分析进行价值投资,我们只需要关注两个要点:

估值

流通市值 Market Cap

我们在股票或加密货币市场上普遍意义中讨论的市值和大部分行情软件、网站中的所谓市值,指的都是流通市值。

流通市值是某一代币的短期估值或实时估值的量化。

流通市值 = 流通供应量 * 当前价格

(全流通市值)总市值 Fully Diluted Market Cap/Valuation

总市值是指如果所有的代币 100% 流通后,该加密货币的市场总价值。

加密货币和股票类似,根据其代币模型的不同,存在着不同比例的锁仓、质押等情况,因此其流通市值与总市值大概率不等。

全流通市值是一个理论值,因为并不是所有的代币都已经或将会被发行。(例如交易所代币回购销毁或者人为修改上限)

然而,它仍然是一个可靠的指标,用以评估加密货币的长期潜力。

更有用的是,我们可以通过总市值的排行榜进行横向对比,以确定一个代币的价格是否被高估或低估。

总市值 = 总供应量 * 当前价格

我们也可以通过流通市值与总市值的比率计算出其流通率:

流通率 = Market Cap / FDV

低流通率的代币在解锁前后容易出现暴涨暴跌,这就是所谓的解锁牛。(例如 LINK AVAX 这类还有 50% 以上锁仓的代币,有很强的拉升出货意愿)

高流通率,尤其是 100% 流通的代币,我们称之为去中心化代币,这类代币由于已经完全派发给韭菜,一般情况下会跑输大盘。(例如上一轮牛市的表现抢眼的 MATIC,这一轮明显落后于大盘)

投资逻辑

买入同类、同板块代币中被低估的代币、卖出被高估的代币,即买入同赛道、同级别项目中总市值较低的,例如 ARB 和 OP 之间要选 OP

市值相近、赛道接近的币种,选择锁仓量更高的,而不是已经完全去中心化的(反面教材 MATIC UNI EOS)

项目热度

梅特卡夫定律

梅特卡夫定律是一个用来估计网络价值的原理,它指出网络的价值是网络中可交互用户数的平方。

在加密货币领域,这个定律可以用来估计一个项目的潜在价值,特别是那些依赖网络效应的项目,例如社交网络平台和交易平台。

用户数是衡量一个项目热度的直观指标。一个拥有大量活跃用户的项目通常被认为具有更高的价值,因为这意味着更强的用户基础和更高的网络效应。

Meme 币 社区人数

Meme 币通常依赖其社区的热情和参与度。社区人数的增长可以作为这类币种潜在价值的一个指标。

GameFi 玩家数

GameFi,结合了加密货币和区块链游戏。游戏玩家数的增长表明了该 GameFi 项目的吸引力和潜在的盈利能力。

Defi 项目或 Layer2 项目 TVL

TVL(Total Value Locked,总锁定价值)是衡量 Defi 项目或 Layer2 项目健康状况的关键指标。

TVL 表示在 Defi 协议中锁定的资金总额,是衡量项目流动性和用户信任度的重要指标。

交易所平台币 交易量

交易所总交易量反映了交易平台的活跃度。一个高交易量的平台通常意味着该平台的平台币价值较高。

投资逻辑

追逐未来的热点!

追逐热点永远是没有错的,但是一定要掌握时机,要争取做早期的投资者,而不是当后来者接盘。

热点是变幻的、流动的、时过境迁的。

例如当我们看到币安日渐式微,OKX祭出 500 人豪华团队 All in web3 的时候,就能够判断出交易所赛道未来的趋势。

同样的逻辑可以套用在 MEME 币领域,当 PEPE/ORDI 等新型 MEME 币层出不穷的时候,我们也应该注意到 DOGE 的地位会被挑战。

一个聪明的投机者应该随机应变、见风使舵,而不是坚守信仰持仓待涨。

参考资料

如何用 jekyll 搭建你自己的播客 Podcast 频道

2022年8月15日 12:00

3 分钟,教会你如何用 jekyll 创建你的播客(Podcast)频道!

jekyll 是 Github 默认的博客站点生成系统,提供了功能非常完善的模版语言。

因此 jekyll 不光可以用来生成 HTML 文件,同样可以很轻松地生成 XML 文件。

这个 XML 文件也就是我们的播客需要订阅生成的 RSS Feed 文件,你只需要拷贝这个模版到你 jekyll 站点的根目录:


---
layout: none
---
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0" xml:lang="{{ site.lang }}">
   <channel>
      <atom:link href="{{ site.url }}/podcast.xml" rel="self" type="application/rss+xml" />
      <title>{{ site.title }}</title>
      <link>{{ site.url }}{{ site.baseurl }}</link>
      <language>{{ site.lang }}</language>
      <copyright>© {{ site.time | date: "%Y" }} {{ site.title }}</copyright>
      <itunes:subtitle>{{ site.subtitle | xml_escape }}</itunes:subtitle>
      <itunes:author>{{ site.author }}</itunes:author>
      <itunes:summary>{{ site.description | xml_escape }}</itunes:summary>
      <description>{{ site.description | xml_escape }}</description>
      <webMaster>{{ site.email }} ({{ site.author }})</webMaster>
      <itunes:owner>
         <itunes:name>{{ site.author }}</itunes:name>
         <itunes:email>{{ site.email }}</itunes:email>
      </itunes:owner>
      <itunes:image href="{{ site.url }}{{ site.baseurl }}/images/itunes.png" />
      <itunes:category text="Technology" />
      <itunes:category text="Business"> <itunes:category text="Investing" /></itunes:category>
      <itunes:category text="Education" />
      <itunes:explicit>no</itunes:explicit>
      {% for post in site.categories.podcast %}
      <item>
         <title>{{ post.title | xml_escape }}</title>
         <itunes:author>{{ site.author }}</itunes:author>
         <itunes:subtitle>{{ site.title | xml_escape }}: {{ post.title | xml_escape }}</itunes:subtitle>
         <itunes:summary>{{ post.summary | xml_escape }}</itunes:summary>
         <itunes:image href="{{ site.url }}/images/itunes.png" />
         <link>{{ post.url | prepend: site.url }}</link>
         <enclosure url="{{ post.file }}" length="{{ post.length }}" type="audio/x-m4a" />
         <guid isPermaLink="true">{{ site.url }}{{ site.baseurl }}{{ post.url }}</guid>
         <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
         <itunes:duration>{{ post.duration }}</itunes:duration>
         <itunes:explicit>{{ post.explicit }}</itunes:explicit>
         <description><![CDATA[ {{ post.content }} ]]></description>
         <itunes:keywords>{{ post.keywords }}</itunes:keywords>
         <itunes:block>{{ post.block }}</itunes:block>
      </item>
      {% endfor %}
   </channel>
</rss>

确保你站点的 _config.yaml 文件当中有定义上述相应的变量,例如 author subtitle 等。

注意其中 audio/x-m4a 需要修改成为你自己常用的音频文件格式,或者是根据不同格式文件动态填写。

你的 Podcast 封面 itunes.png 格式最好是 3000*3000 且文件大小不宜超过 512kb ,否则个别软件无法加载。

接下来你只需要在撰写新的 post 时添加相关的头部描述:

---
layout: post
title: "Title Goes Here"
date: Publishing date and time
categories: ['podcast']
file: link to file in S3
summary: "Quick exerpt of episode"
description: "Longer information"
duration: "how long in minutes and seconds" 
length: "in seconds"
explicit: "do we swear" 
keywords: "keyword tags"
block: "hold back publishing it" 
voices: "who did the talking"
---

注意分类要填写我们模版当中定义的 podcast 分类,当然你也可以通过 jekyll collection 等方式区分发布的播客类型页面。

之后等待站点生成,我们就能够获得标准的 Podcast RSS Feed 文件啦,你只需要把这个地址提供给 Apple 或者 Google,就能够分发你的播客内容了!

当然,还有很多朋友可能会对如何存储播客的音频文件有所疑问,其实使用任意的支持外链的云存储平台即可,例如 AWS 的 S3 之类的服务。

假如你拥有自己的服务器,也可以轻松搭建独立的文件伺服站点,常规的 FTP 或者利用 caddy 我们可以很轻松地通过 HTTP 分发指定目录下的文件内容:

you.domain.com {
 root * /var/www/podcast
 file_server browse
}

如此你只需把音频文件存放在站点目录下即可。

2021 前端学习路径

2021年6月1日 23:57

现如今的前端已经不再局限于一个写网页的,移动端、小程序、桌面应用,甚至是各类智能设备,处处都有前端的身影,有用户界面的地方,即是前端所在。

工程化概念的深入人心,ESM 的全面支持,从面向对象编程到函数式编程的思维转变,IE 的正式死亡,无不在改变着前端开发的生态。

数据与界面解耦,业务逻辑与布局组件解耦。从数据在界面中实时响应开始,直到突破 IO 性能瓶颈。前端框架也在不断革新。

如果你只是想尝试些新东西

  • Tailwind CSS 既然 JS 模块化了,CSS 也终有一日会模块化,Tailwind 带给你不同于 bootstrap 的全新体验。
  • deno 我们无需在此争论 node 与 deno 的优劣,至少它为你提供了另一种选择,以及更多未来 JS runtime 的可能性。
  • Vite 尤老板出品,必属精品,基于 ESM 的全新构建工具,带给你飞一般的感觉。
  • TypeScript 不会吧不会吧不会吧,不会有人到了 2021 年都没开始学 ts 吧。
  • Vue 3.0 新的生命周期,新的 Composition API,用起来就像一个新的 Vue
  • react hooks & CM React 18 马上也要发布了,别再用 class 定义组件了。
  • Svelte 这个世界上不是只有两种 JS 框架,如果是中小型应用,Svelte 可以让你快破天际。

除此之外,还有 serverless wasm PWA 等早就出现,却未大火的议题,感兴趣的朋友也可以做适当了解。

如果你想系统学习前端知识

计算机网络

  • 网络分层
  • TCP/IP
  • DNS
  • HTTP
  • HTTPS
  • HTTP2.0

阅读 当你在浏览器中输入 google.com 并且按下回车之后发生了什么? 你可以对相关的概念有一个整体性的了解。

编辑器

版本管理

HTML

现如今已经没有人会徒手干撸 HTML 了,大部分的用户界面都是由 JS 框架动态渲染的。但你仍然需要充分掌握这一构成 Web 界面骨架的标记语言。

CSS

市面上充斥着大量的高级JS工程师,然而却鲜能见到高级CSS工程师,毕竟 JS 只是一个语言,而 CSS 却是一个世界。

JavaScript

基础

在学习任何编程语言之前,你首先应该对计算机程序的相关概念有一个基本的了解:CS50

你可以在 freeCodeCamp 找到相关的练习JavaScript Algorithms and Data Structures

同样你也可以在 leetcode 精进你的算法知识。

进阶

语法

框架

数据

后端

测试

构建工具

跨平台

持续集成/部署

书籍推荐

  • JavaScript 权威指南
  • JavaScript 高级程序设计
  • You dont know JS

学习 Tips

  • 3 个月学成 XX 工程师是完全不现实的事情
  • 在你想成为任何发展方向的程序员之前,你都需要了解掌握基础的计算机科学知识
  • 在你使用任何框架前先掌握好基础知识
  • 能看得进去书的情况下别看视频
  • 删掉你手机里的抖音和王者荣耀

网站推荐

❌
❌