<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>车东[Blog^2]</title>
   <link rel="alternate" type="text/html" href="https://www.chedong.com/blog/" />
   <link rel="self" type="application/atom+xml" href="https://www.chedong.com/blog/atom.xml" />
   <id>tag:www.chedong.com,2026:/blog//1</id>
   <updated>2026-02-16T10:21:46Z</updated>
   <subtitle>良好引用，良好结构，良好导航 Well referenced and well organized, with easy navigation</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.36</generator>

<entry>
   <title>openclaw配置飞书 channel 机器人通道 多账号</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001512.html" />
   <id>tag:www.chedong.com,2026:/blog//1.1512</id>
   
   <published>2026-02-15T07:20:58Z</published>
   <updated>2026-02-16T10:21:46Z</updated>
   
   <summary>1. 创建飞书机器人：访问飞书开放平台 https://open.feishu.cn • 创建企业自建应用 创建版本号1.0.1 • 获取 App ID 和 App Secret cli_############## ##################### 2. 配置 OpenClaw：添加飞书插件 • 在 OpenClaw 配置中添加飞书通道 通过openclaw channels add 完成，一个openclaw可以配置连接多个飞书账号： &quot;feishu&quot;: { // 全局默认设置（可被单账号覆盖） &quot;enabled&quot;: true, &quot;domain&quot;: &quot;feishu&quot;, // 或 &quot;lark&quot; &quot;accounts&quot;: { //...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="应用安装|AppInstall" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[1. 创建飞书机器人：访问飞书开放平台 <a href="https://open.feishu.cn">https://open.feishu.cn</a>
  • 创建企业自建应用 创建版本号1.0.1
  • 获取 App ID 和 App Secret
<blockquote>    cli_##############
    #####################</blockquote>
2. 配置 OpenClaw：添加飞书插件
  • 在 OpenClaw 配置中添加飞书通道 通过<blockquote>openclaw channels add</blockquote> 完成，一个openclaw可以配置连接多个飞书账号：
<blockquote> "feishu": {
         // 全局默认设置（可被单账号覆盖）
         "enabled": true,
         "domain": "feishu", // 或 "lark"

         "accounts": {
           // 第一个机器人（主账号）
           "main": {
             "appId": "cli_a1b2c3d4",
             "appSecret": "wkEb...123",
             "botName": "主助手",
             "groupPolicy": "open"
           },
           // 第二个机器人（例如用于特定测试或部门）
           "test_bot": {
             "appId": "cli_x9y8z7w6",
             "appSecret": "abCd...456",
             "botName": "测试号",
             "dmPolicy": "allowlist", // 不同的权限策略
             "allowFrom": ["ou_..."]
           }</blockquote>

然后用openclaw channels list命令：
? OpenClaw 2026.2.14 (c1feda1) — I'm not magic—I'm just extremely persistent with retries and coping strategies.

03:36:47 [plugins] feishu_doc: Registered feishu_doc, feishu_app_scopes
03:36:47 [plugins] feishu_wiki: Registered feishu_wiki tool
03:36:47 [plugins] feishu_drive: Registered feishu_drive tool
Chat channels:
- Telegram default: configured, token=config, enabled
<strong>- Feishu test_bot: configured, enabled
- Feishu main: configured, enabled</strong>

Auth providers (OAuth + API keys):
- google-gemini-cli:chedong@gmail.com (oauth)
- google:default (api_key)
- minimax:default (api_key)
- qwen-portal:default (oauth)
- moonshot:default (api_key)
- minimax-portal:default (oauth)
- minimax-cn:default (api_key)]]>
      <![CDATA[3. 飞书开放平台上的配置： open.feishu.cn feishu和lark账号是分开的
  3.1  批量导入权限：
  <a href="https://open.feishu.cn/app/cli_##########/auth">https://open.feishu.cn/app/cli_##########/auth</a>
<blockquote>    {
       "scopes": {
         "tenant": [
           "im:message", "im:message:send_as_bot", "im:chat", "im:message.p2p_msg:readonly",
           "im:message.group_at_msg:readonly", "im:message.group_msg", "im:message:readonly",
           "im:resource", "im:chat.access_event.bot_p2p_chat:read"
         ]
       }
     }</blockquote>
   3.2. 在飞书后台 “事件订阅” 页面， <a href="https://open.feishu.cn/app/cli_##########/event">https://open.feishu.cn/app/cli_##########/event</a>
      选择 “使用长连接接收事件”。
注： 一定要先在第2步：openclaw上启动这个账号，然后再在3.2配置事件订阅：否则在飞书开放平台会有“应用未设置长连接”错误提示。

   3.3. 在飞书后台 “事件订阅” 页面， <a href="https://open.feishu.cn/app/cli_##########/event">https://open.feishu.cn/app/cli_##########/event</a> 添加事件：im.message.receive_v1 (接收消息)。   

4. 发布应用：创建一个版本号 1.0.2

5. 用飞书app：查找连接飞书bot 
   OpenClaw：访问未配置。
  您的飞书用户 ID：ou_###################
  配对码：#######
  请机器人所有者使用以下命令进行批准：<blockquote>openclaw pairing approve feishu #########</blockquote>
<blockquote>  > openclaw pairing approve feishu #########
  06:48:21 [plugins] feishu_doc: Registered feishu_doc, feishu_app_scopes
  06:48:21 [plugins] feishu_wiki: Registered feishu_wiki tool
  06:48:21 [plugins] feishu_drive: Registered feishu_drive tool
  06:48:21 [plugins] feishu_bitable: Registered 6 bitable tools</blockquote>

? OpenClaw 2026.2.14 (c1feda1) — Claws out, commit in—let's ship something mildly responsible.

Approved feishu sender ou_##################
]]>
   </content>
</entry>
<entry>
   <title>使用Opencore patcher升级老款Macbook: Hacintosh</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001511.html" />
   <id>tag:www.chedong.com,2026:/blog//1.1511</id>
   
   <published>2026-01-09T07:52:55Z</published>
   <updated>2026-02-09T14:48:34Z</updated>
   
   <summary>最新版本的Opencore Patcher下载，目前用的是2.4.1 大约700M的安装包。 下载安装后：会有这样一个界面，按照安装OpenCore ==&gt; 创建USB安装盘 ==&gt; 安装后的驱动更新这几个步骤进行系统升级： 安装主要以下几个步骤：...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="桌面应用|Desktop" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[<a href="https://github.com/dortania/Opencore-Legacy-Patcher/releases">最新版本的Opencore Patcher下载</a>，目前用的是2.4.1 大约700M的安装包。

下载安装后：会有这样一个界面，按照安装OpenCore ==> 创建USB安装盘 ==> 安装后的驱动更新这几个步骤进行系统升级：
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-Main-Menu.40fc1dad.png" style="width: 50%; height: 50%;">



安装主要以下几个步骤：]]>
      <![CDATA[1 构建和OpenCore驱动到目标Mac设备上：操作选择macOS设备所在硬盘和EFI引导，
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-EFI-Select-Disk.d9a3392f.png" style="width: 50%; height: 50%;">
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-EFI-Select-Partition.131e5d28.png" style="width: 50%; height: 50%;">

2 创建 macOS 安装程序到USB设备上：
下载各种版本的macOS安装程序：
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-Create-Installer-Menu.6220ded8.png" style="width: 50%; height: 50%;">

创建安装U盘：
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-Installer-Download-Listed-Products.033408f2.png"  style="width: 50%; height: 50%;">
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-Installer-Format-USB.a14e2cea.png" style="width: 50%; height: 50%;">

3 启动 OpenCore 和 macOS：在启动过程中<strong>按住Alt键</strong> 在启动界面看到EFI引导选项，然后选择EFI引导，就会进入U盘引导模式+源系统磁盘引导的选项界面
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/efi-boot.8307f610.png" style="width: 50%; height: 50%;">
如果启动过程中<strong>按空格</strong>，会有更多debug模式引导的选项

然后选择安装对应的macOS安装版本：目前最新的是Sequoia，Tahoe目前尚不支持。
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/oc-boot.3c2bdab5.png" style="width: 50%; height: 50%;">
安装后，启动有可能显示异常，非常卡顿 网络无法连接的情况。

如果基于安装U盘的启动过程中经常：直接通过EFI启动到本地磁盘，然后直接运行U盘的安装程序也可以。通过EFI引导后：就不会有不支持当前硬件的提示。

4 安装后的驱动更新：运行post-install Root Patching，解决各种显示驱动，无线网卡驱动的问题
<img src="https://dortania.github.io/OpenCore-Legacy-Patcher/assets/img/OCLP-GUI-Root-Patch-Status.88367958.png"  style="width: 50%; height: 50%;">

后记：系统升级后不要再用macOS的系统更新
<blockquote>MacOS的系统配置： 通用 ==> 软件更新  
禁用头两个自动更新选项：下载可用更新 和 安装可用更新 </blockquote>
避免引导区被更新版本的OS改写导致无法patch当前版本新的驱动。

如果万一系统自动安装升级了：会导致OCLP会无法进行post install root patch和更新驱动
<blockquote>- Starting Patch Process
- Determining Required Patch set for Darwin 24
Pulling metallib list from MetallibSupportPkg API
Direct match found for 24G419 (15.7.3)
metallib already installed (15.7.3-24G419), skipping
- Verifying whether Root Patching possible
- Patcher is capable of patching
- Local PatcherSupportPkg resources available, continuing...
- Running sanity checks before patching
- SystemVersion.plist build version mismatch: found 26.2 (25C56), expected 15.7.3 (24G419)
An update is in progress on your machine and patching cannot continue until it is cancelled or finished
- Unmounting root volume
- Failed sanity checks, cannot continue with patching!!!
- Please ensure that you do not have any updates pending</blockquote>

解决办法：在OCLP的post install root patch里，选择revert root patch
重启后： OCLP会提示重新patch 重新运行post install root patch后再重启就可以了



]]>
   </content>
</entry>
<entry>
   <title>迁移SF上的项目：从cvs到git  通过cvs-fast-export</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001508.html" />
   <id>tag:www.chedong.com,2026:/blog//1.1508</id>
   
   <published>2026-01-07T06:19:58Z</published>
   <updated>2026-01-12T04:25:58Z</updated>
   
   <summary>根据SF官方文档的介绍： https://sourceforge.net/p/forge/documentation/CVS/ 把CVS项目转换到git需要用cvs2svn项目中的cvs2git，但实际上这个需要Python2 而自己的MacBook上已经都是python3了： 会遇到错误信息： brew install cvs2svn Warning: No available formula with the name &quot;cvs2svn&quot;. ==&gt; Searching for similarly named formulae and casks... Error: No formulae or casks found for cvs2svn. install cvs2svn Defaulting to user installation because normal...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="虚拟主机|Web Hosting" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[根据SF官方文档的介绍：
<a href="https://sourceforge.net/p/forge/documentation/CVS/">https://sourceforge.net/p/forge/documentation/CVS/</a>
把CVS项目转换到git需要用cvs2svn项目中的cvs2git，但实际上这个需要Python2 而自己的MacBook上已经都是python3了： 
会遇到错误信息：
<blockquote>brew install cvs2svn
Warning: No available formula with the name "cvs2svn".
==> Searching for similarly named formulae and casks...
Error: No formulae or casks found for cvs2svn.</blockquote>

<blockquote>install cvs2svn
Defaulting to user installation because normal site-packages is not writeable
ERROR: Could not find a version that satisfies the requirement cvs2svn (from versions: none)
ERROR: No matching distribution found for cvs2svn


错误: cvs2git 无法运行
请检查 Python 3 是否已安装: python3 --version

ERROR: cvs2git requires Python 2, version 2.4 or later; it does not
work with Python 3.  You are currently using version 3.14.2.
Please restart cvs2git using a different version of the Python
interpreter.  Visit http://www.python.org or consult your local system
administrator if you need help.

</blockquote>
好在找到了<a href="https://gitlab.com/esr/cvs-fast-export">cvs-fast-export项目</a>，用Claude重新生成了迁移脚本：
]]>
      <![CDATA[我的工作目录是/Users/chedong/CodeWork，迁移脚本如下：

<blockquote>#!/bin/bash
# CVS to Git 转换脚本 - phpunixman 项目
# 使用 cvs-fast-export 工具（现代替代方案，不需要 Python 2）
# 工作目录: /Users/chedong/CodeWork

set -e  # 遇到错误立即退出

# 配置变量
WORK_DIR="/Users/chedong/CodeWork"
PROJECT_NAME="phpunixman"
CVS_BACKUP_URL="https://sourceforge.net/code-snapshots/cvs/p/ph/${PROJECT_NAME}.zip"

# 颜色输出
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${BLUE}=== phpunixman CVS to Git 转换开始（使用 cvs-fast-export）===${NC}"

# 检查 cvs-fast-export 是否已安装
if ! command -v cvs-fast-export &> /dev/null; then
    echo -e "${YELLOW}未找到 cvs-fast-export，正在安装...${NC}"
    brew install cvs-fast-export
    echo -e "${GREEN}cvs-fast-export 已安装${NC}"
fi

# 检查 CVS 是否已安装
if ! command -v cvs &> /dev/null; then
    echo -e "${YELLOW}未找到 cvs，正在安装...${NC}"
    brew install cvs
    echo -e "${GREEN}cvs 已安装${NC}"
fi

# 进入工作目录
cd "$WORK_DIR"
echo -e "${GREEN}[1/9] 进入工作目录: $WORK_DIR${NC}"

# 下载 CVS 仓库备份
echo -e "${GREEN}[2/9] 下载 CVS 仓库备份...${NC}"
if [ ! -f "${PROJECT_NAME}.zip" ]; then
    curl -L -o "${PROJECT_NAME}.zip" "$CVS_BACKUP_URL"
    echo "CVS 备份已下载"
else
    echo "CVS 备份文件已存在，跳过下载"
fi

# 解压 CVS 备份
echo -e "${GREEN}[3/9] 解压 CVS 备份...${NC}"
if [ ! -d "${PROJECT_NAME}" ]; then
    unzip -q "${PROJECT_NAME}.zip"
    echo "CVS 备份已解压"
else
    echo "CVS 备份目录已存在，跳过解压"
fi

# 创建 author mapping 文件（可选）
echo -e "${GREEN}[4/9] 创建作者映射文件...${NC}"
cat > author-map.txt << 'EOF'
# CVS 用户名到 Git 作者的映射
# 格式: cvs_username=Full Name <email@example.com>
chedong=Che Dong <chedong@example.com>
EOF
echo "作者映射文件已创建（author-map.txt），请根据需要编辑"

# 查找所有 CVS 文件
echo -e "${GREEN}[5/9] 分析 CVS 仓库结构...${NC}"
CVS_FILES=$(find "${PROJECT_NAME}" -name '*,v' | wc -l | tr -d ' ')
echo "找到 ${CVS_FILES} 个 CVS 文件"

# 创建新的 Git 仓库目录
echo -e "${GREEN}[6/9] 创建新的 Git 仓库...${NC}"
GIT_REPO="${PROJECT_NAME}-git"
if [ -d "$GIT_REPO" ]; then
    echo -e "${YELLOW}警告: $GIT_REPO 已存在，将被删除${NC}"
    read -p "是否继续？(y/N) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "操作已取消"
        exit 1
    fi
    rm -rf "$GIT_REPO"
fi

mkdir -p "$GIT_REPO"
cd "$GIT_REPO"
git init
cd ..

# 使用 cvs-fast-export 转换
echo -e "${GREEN}[7/9] 转换 CVS 到 Git 格式（这可能需要几分钟）...${NC}"
cd "${PROJECT_NAME}"

# 执行转换
find . -name '*,v' -print | cvs-fast-export -A ../author-map.txt > ../cvs-export.fi

cd ..

# 导入到 Git 仓库
echo -e "${GREEN}[8/9] 导入数据到 Git 仓库...${NC}"
cd "$GIT_REPO"
git fast-import < ../cvs-export.fi

# 检出主分支
git checkout master 2>/dev/null || git checkout main 2>/dev/null || true

# 显示转换结果
echo -e "${GREEN}[9/9] 验证转换结果...${NC}"
echo ""
echo "提交数量: $(git rev-list --all --count)"
echo "分支列表:"
git branch -a
echo ""
echo "最近的提交:"
git log --oneline -5 || echo "暂无提交"

cd ..

echo -e "${BLUE}=== 本地转换完成 ===${NC}"
echo ""
echo "转换后的 Git 仓库位于: $WORK_DIR/$GIT_REPO"
echo ""
echo "接下来的步骤:"
echo "1. 验证转换结果："
echo "   cd $WORK_DIR/$GIT_REPO"
echo "   git log --all --graph --oneline"
echo ""
echo "2. 推送到 SourceForge（需要先配置 SSH 密钥）："
echo "   cd $WORK_DIR/$GIT_REPO"
echo "   git remote add origin ssh://chedong@git.code.sf.net/p/${PROJECT_NAME}/code"
echo "   git push origin --all"
echo "   git push origin --tags"
echo ""
echo "3. 清理临时文件（在确认无误后）："
echo "   cd $WORK_DIR"
echo "   rm -f ${PROJECT_NAME}.zip"
echo "   rm -f cvs-export.fi"
echo "   rm -f author-map.txt"
echo "   rm -rf ${PROJECT_NAME}"
</blockquote>


导出到工作目录
<blockquote>git clone ssh://chedong@git.code.sf.net/p/phpunixman/code.git phpunixman
cd phpunixman</blockquote>



]]>
   </content>
</entry>
<entry>
   <title>Movable Type 3.3 字符集乱码故障修复记录：</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001507.html" />
   <id>tag:www.chedong.com,2025:/blog//1.1507</id>
   
   <published>2025-12-16T03:59:14Z</published>
   <updated>2026-02-15T07:26:12Z</updated>
   
   <summary>一、故障背景 站点运行于 Movable Type 3.3，历史跨度较长（十年以上）。 在升级服务器环境（Perl 5.3 + 新版 MySQL / MariaDB）后，发现： 文章标题、分类、评论、TrackBack 出现乱码（如：å®‰è£…ç¬”è®°） 数据库表字符集显示为 utf8 / utf8mb3，但内容明显异常 后台管理界面：界面菜单正常，但博客各种内容部分都受中文乱码影响 二、问题本质分析（核心结论） 这是一个经典的历史字符集问题： 早期 MT 3.x + MySQL 常以 latin1 方式写入数据 实际内容是 UTF-8（甚至混有 GBK / GB2312） 后期 MySQL / Perl 按 UTF-8...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="MovableType|MT" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[<h2>一、故障背景</h2>
<p>站点运行于 <strong>Movable Type 3.3</strong>，历史跨度较长（十年以上）。
在升级服务器环境（Perl 5.3 + 新版 MySQL / MariaDB）后，发现：</p>
<ul>
  <li>文章标题、分类、评论、TrackBack 出现乱码（如：å®‰è£…ç¬”è®°）</li>
  <li>数据库表字符集显示为 utf8 / utf8mb3，但内容明显异常</li>
  <li>后台管理界面：界面菜单正常，但博客各种内容部分都受中文乱码影响</li>
</ul>

<h2>二、问题本质分析（核心结论）</h2>
<p>这是一个<strong>经典的历史字符集问题</strong>：</p>
<ul>
  <li>早期 MT 3.x + MySQL 常以 <code>latin1</code> 方式写入数据</li>
  <li>实际内容是 UTF-8（甚至混有 GBK / GB2312）</li>
  <li>后期 MySQL / Perl 按 UTF-8 读取，导致“UTF-8 被当 latin1 再显示”</li>
</ul>
<p><strong>修复原则：</strong></p>
<ul>
  <li>不修改程序逻辑：尝试修改mt-config.cgi中配置增加<pre>DBIParams mysql_enable_utf8=0</pre>是没有用的，改用ObjectDriver DBI::MariaDB 但Movable Type 3.3根本不支持MariaDB驱动。
<pre>Got an error: Unsupported driver MT::ObjectDriver::DBI::MariaDB: Can't locate MT/ObjectDriver/DBI/MariaDB.pm in @INC (you may need to install the MT::ObjectDriver::DBI::MariaDB module) (@INC contains: /home/path/to/cgi-bin/mt/extlib lib /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.34.0 /usr/local/share/perl/5.34.0 /usr/lib/x86_64-linux-gnu/perl5/5.34 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.34 /usr/share/perl/5.34 /usr/local/lib/site_perl) at (eval 8) line 1. BEGIN failed--compilation aborted at (eval 8) line 1.
</pre>

</li>
  <li>不整体强制转换数据库字符集</li>
  <li>仅针对“人类可读字段”做字节级修复</li>
<li>修复前使用mysqldump或者phpmyadmin的工具备份数据库：mysqldump database_of_mt  > mt_entry.bak.sql</li>

</ul>



<h2>四、通用修复方案（核心 SQL 模式）</h2>
<p><strong>统一采用以下安全转换模式：</strong></p>
<pre>
CONVERT(
  CAST(CONVERT(column_name USING latin1) AS BINARY)
  USING utf8mb4
)
</pre>
<p>说明：</p>
<ul>
  <li>latin1：还原历史错误解码</li>
  <li>BINARY：保留原始字节</li>
  <li>utf8mb4：以现代 UTF-8 重新解释</li>
</ul>

<h2>五、各主要数据表修复脚本</h2>

<h3>1. mt_entry（文章）</h3>
<pre>
UPDATE mt_entry SET
  entry_title = CONVERT(CAST(CONVERT(entry_title USING latin1) AS BINARY) USING utf8mb4),
  entry_text = CONVERT(CAST(CONVERT(entry_text USING latin1) AS BINARY) USING utf8mb4),
  entry_text_more = CONVERT(CAST(CONVERT(entry_text_more USING latin1) AS BINARY) USING utf8mb4),
  entry_excerpt = CONVERT(CAST(CONVERT(entry_excerpt USING latin1) AS BINARY) USING utf8mb4),
  entry_keywords = CONVERT(CAST(CONVERT(entry_keywords USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h3>2. mt_comment（评论）</h3>
<pre>
UPDATE mt_comment SET
  comment_author = CONVERT(CAST(CONVERT(comment_author USING latin1) AS BINARY) USING utf8mb4),
  comment_text = CONVERT(CAST(CONVERT(comment_text USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h3>3. mt_category （分类目录） / mt_tag （标签）</h3>
<pre>
UPDATE mt_category SET
  category_label = CONVERT(CAST(CONVERT(category_label USING latin1) AS BINARY) USING utf8mb4),
  category_description = CONVERT(CAST(CONVERT(category_description USING latin1) AS BINARY) USING utf8mb4);

UPDATE mt_tag SET
  tag_name = CONVERT(CAST(CONVERT(tag_name USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h3>4. mt_template（模板）</h3>
<pre>
UPDATE mt_template SET
  template_name = CONVERT(CAST(CONVERT(template_name USING latin1) AS BINARY) USING utf8mb4),
  template_text = CONVERT(CAST(CONVERT(template_text USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h3>5. mt_tbping（TrackBack ping）</h3>
<pre>
UPDATE mt_tbping SET
  tbping_blog_name = CONVERT(CAST(CONVERT(tbping_blog_name USING latin1) AS BINARY) USING utf8mb4),
  tbping_title = CONVERT(CAST(CONVERT(tbping_title USING latin1) AS BINARY) USING utf8mb4),
  tbping_excerpt = CONVERT(CAST(CONVERT(tbping_excerpt USING latin1) AS BINARY) USING utf8mb4),
  tbping_junk_log = CONVERT(CAST(CONVERT(tbping_junk_log USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h3>6. mt_blog（博客信息）</h3>
<pre>
UPDATE mt_blog SET
  blog_name = CONVERT(CAST(CONVERT(blog_name USING latin1) AS BINARY) USING utf8mb4),
  blog_description = CONVERT(CAST(CONVERT(blog_description USING latin1) AS BINARY) USING utf8mb4),
  blog_welcome_msg = CONVERT(CAST(CONVERT(blog_welcome_msg USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h3>7. mt_author（作者）</h3>
<p><strong>仅修以下字段，严禁修改密码 / token 字段：</strong></p>
<pre>
UPDATE mt_author SET
  author_name = CONVERT(CAST(CONVERT(author_name USING latin1) AS BINARY) USING utf8mb4),
  author_nickname = CONVERT(CAST(CONVERT(author_nickname USING latin1) AS BINARY) USING utf8mb4),
  author_hint = CONVERT(CAST(CONVERT(author_hint USING latin1) AS BINARY) USING utf8mb4);
</pre>

<h2>六、验证与验收</h2>
<h3>1. 乱码扫描</h3>
<pre>
SELECT entry_id FROM mt_entry
WHERE entry_title REGEXP '[åæçéï]';
</pre>
<p>返回 0 行表示修复完成。</p>

<h3>2. 随机抽样</h3>
<pre>
SELECT entry_id, entry_title FROM mt_entry
ORDER BY RAND() LIMIT 10;
</pre>

]]>
      <![CDATA[<h2>三、诊断方法</h2>
<h3>1. 典型乱码特征</h3>
<pre>å  æ  ç  é  ï  ï¼š</pre>
<p>以上字符几乎可以 100% 判定为 UTF-8 被当作 latin1 显示。</p>

<h3>2. 抽样检测 SQL</h3>
<pre>
SELECT entry_id, entry_title
FROM mt_entry
WHERE entry_title REGEXP '[åæçéï]';
</pre>
<p>返回结果即为待修复数据。</p>

<h2>七、关于 Warning #1300 的说明</h2>
<p>修复过程中可能出现大量：</p>
<pre>Warning: #1300 Invalid utf8mb4 character string</pre>
<p>这通常意味着：</p>
<ul>
  <li>历史数据中混有 GBK / GB2312 或垃圾字节</li>
  <li>不影响前台显示</li>
  <li>可安全忽略</li>
</ul>

<h2>八、最终建议</h2>
<ul>
  <li>不要再次整体转换表字符集</li>
  <li>不要尝试一键 CONVERT DATABASE</li>
  <li>完成修复后立即做完整备份</li>
</ul>

<p><strong>至此，Movable Type 3.3 字符集乱码问题修复完成。</strong></p>]]>
   </content>
</entry>
<entry>
   <title>几种Wiki文档系统比较：Teambition thoughts 语雀 Notion GitHubWiki Confluence</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001502.html" />
   <id>tag:www.chedong.com,2020:/blog//1.1502</id>
   
   <published>2020-03-08T14:35:23Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>Confluence已经不是一个非常好的wiki文档模式了，多个人同时写一篇wiki已然是非常容易产生冲突。而Teambition thoughts这样的工具又和石墨没什么区别，而且最重要的文档和文档之间很容易变成孤岛。 相对来说： 语雀的效果就不错：结合目录管理和协同的文档，表格管理等，而且还支持从confluence备份整体导入。 Notion 估计是商业组合软件里面模板做得最好的。...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="桌面应用|Desktop" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[<a href="https://www.atlassian.com/zh/software/confluence">Confluence</a>已经不是一个非常好的wiki文档模式了，多个人同时写一篇wiki已然是非常容易产生冲突。而<a href="https://thoughts.teambition.com/site/case">Teambition thoughts</a>这样的工具又和石墨没什么区别，而且最重要的文档和文档之间很容易变成孤岛。

相对来说： <a href="https://www.yuque.com/yuque/help/cpeo0y">语雀</a>的效果就不错：结合目录管理和协同的文档，表格管理等，而且还支持从confluence备份整体导入。 

<a href="https://www.notion.so/work">Notion</a> 估计是商业组合软件里面模板做得最好的。]]>
      <![CDATA[最简单的是：直接使用Github内置的：<a href="https://github.com/g0v/dev/wiki/%E5%A6%82%E4%BD%95%E7%B7%A8%E8%BC%AF-Wiki">Github Wiki 功能</a>，用markdown语法编写；]]>
   </content>
</entry>
<entry>
   <title><![CDATA[Perl 5.22以后的语法更新：Unescaped left brace in regex is illegal here in regex; marked by &lt;-- HERE in m/\"%{ &lt;-- HERE Referer}i\"/ at ./awstats.pl line 9045.]]></title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001506.html" />
   <id>tag:www.chedong.com,2019:/blog//1.1506</id>
   
   <published>2019-07-03T15:11:04Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>虚拟主机的操作系统升级后，perl的版本也升级到了5.26.x，awstats的统计中断了，从后台的错误信息： Unescaped left brace in regex is illegal here in regex; marked by 查了一下，此类信息应该是从5.22开始的： As written by @Leobaillard you can use his patch. If you want to fix this with your editor (vi) you can go to line 3936 and...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="日志分析|AWStats" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[虚拟主机的操作系统升级后，perl的版本也升级到了5.26.x，awstats的统计中断了，从后台的错误信息：
<blockquote>Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\"%{ <-- HERE Referer}i\"/ at ./awstats.pl line 9045.</blockquote>

查了一下，此类信息应该是从5.22开始的：
As written by @Leobaillard you can use his patch. If you want to fix this with your editor (vi) you can go to line 3936 and make the following changes
$ vi buildroot/output/host/usr/bin/automake
goto line :3936 and change
$text =~ s/\${([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;
to
$text =~ s/\$\{([^ \t=:+\{\}]+)\}/substitute_ac_subst_variables_worker ($1)/ge;
The error is with automake and perl v5.26.

从perl v5.22开始：不再推荐在正则表达式中使用 {，而且如果没有转义 \{ 会有错误警告，从v5.26开始：不仅有警告，还会有语法错误提示。
]]>
      <![CDATA[<a href="https://unix.stackexchange.com/questions/238539/automake-error-unescaped-left-brace-in-regex-is-deprecated">解决方法：在所有正则表达式的 "{" "}" 前面增加转义符:</a>

diff -r1.1008 awstats.pl
9045,9050c9045,9050
< 		$LogFormatString =~ s/\"%{Referer}i\"/%refererquot/g;
< 		$LogFormatString =~ s/\"%{User-Agent}i\"/%uaquot/g;
< 		$LogFormatString =~ s/%{mod_gzip_input_size}n/%gzipin/g;
< 		$LogFormatString =~ s/%{mod_gzip_output_size}n/%gzipout/g;
< 		$LogFormatString =~ s/%{mod_gzip_compression_ratio}n/%gzipratio/g;
< 		$LogFormatString =~ s/\(%{ratio}n\)/%deflateratio/g;
---
> 		$LogFormatString =~ s/\"%\{Referer\}i\"/%refererquot/g;
> 		$LogFormatString =~ s/\"%\{User-Agent\}i\"/%uaquot/g;
> 		$LogFormatString =~ s/%\{mod_gzip_input_size\}n/%gzipin/g;
> 		$LogFormatString =~ s/%\{mod_gzip_output_size\}n/%gzipout/g;
> 		$LogFormatString =~ s/%\{mod_gzip_compression_ratio\}n/%gzipratio/g;
> 		$LogFormatString =~ s/\(%\{ratio\}n\)/%deflateratio/g;]]>
   </content>
</entry>
<entry>
   <title>免费版StatPlus在Mac Excel 2016 v16以上版本集成菜单安装：Excel 加载项 ==&gt; 启用StatPlusMacAddin</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001505.html" />
   <id>tag:www.chedong.com,2019:/blog//1.1505</id>
   
   <published>2019-02-20T13:41:32Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>上门课要用Excel的分析插件，但Excel Mac版缺省没有：需要安装AnalystSoft的StatPlus插件。标准的安装步骤如下：可以启用相应的Excel集成菜单。 1 从官网下载StatPlus for Mac安装包并解包； 2 移动StatPlus到“应用程序”并打开StatPlus； 3 从StatPlus的菜单中选取SpreadSheet并启用Excel菜单集成模式： 低版本的Excel（包括Microsoft Office Excel 2011 2013 2016 v15及以下）会重启Excel并显示集成菜单： 但如果Excel是2016 v16版本以上（包括Excel 2019）则会收到以下提示： Latest Excel 2016 versions (v16+) require additional step to enable StatPlus integration. Please follow the &apos;Integration with Excel 2016 v16&apos;...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="应用安装|AppInstall" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[上门课要用Excel的分析插件，但Excel Mac版缺省没有：需要<a href="https://www.analystsoft.com/en/products/statplusmac/">安装AnalystSoft的StatPlus插件</a>。标准的安装步骤如下：可以启用相应的Excel集成菜单。
1 从官网<a href="http://download.analystsoft.com/statplusmac.zip">下载StatPlus for Mac安装包并解包</a>；
2 移动StatPlus到“应用程序”并打开StatPlus；
3 从StatPlus的菜单中选取SpreadSheet并启用Excel菜单集成模式：
<img alt="Excel menu integration: Statplus mac " src="http://www.chedong.com/blog/archives/2019/02/20/WechatIMG73.png" width="510" height="130" />

低版本的Excel（包括Microsoft Office Excel 2011 2013 2016 v15及以下）会重启Excel并显示集成菜单：
<img alt="Mac Excel 2011: StatPlus 6" src="http://www.chedong.com/blog/archives/2019/02/21/WechatIMG125.png" width="401" height="153" />

但如果Excel是2016 v16版本以上（包括Excel 2019）则会收到以下提示：
<blockquote>Latest Excel 2016 versions (v16+) require additional step to enable StatPlus integration. Please follow the 'Integration with Excel 2016 v16' steps from the registration letter or contact us if you have any questions.
</blockquote>
其实注册邮件里面根本没有任何关于v16+的提示，官网也上没有任何关于<a href="http://download.analystsoft.com/workaround_excel2016mac_16.pdf">Excel 2016 v16版本如何启用Excel菜单集成</a>的帮助入口：通过在线帮助提交问题会收到一个手动启用操作方法的回复，按提示在Excel 2016 v16.22上安装设置验证如下：]]>
      <![CDATA[启动Excel集成菜单步骤：打开Excel ==> 工具 ==> Excel 加载项 ==> 手动启用✔️StatPlusMacAddin模块
<img alt="Excel 2016 v16+ additional step enable StatPlus integration" src="http://www.chedong.com/blog/archives/2019/02/20/WechatIMG74.png" width="660" height="532" />
然后再次重启就可以在Excel的菜单中看到StatPlus工具栏了：
<img alt="StatPlus Excel integrated menu" src="http://www.chedong.com/blog/archives/2019/02/20/WechatIMG1192.png" width="874" height="148" />


]]>
   </content>
</entry>
<entry>
   <title>浏览器中丢失referrer和HTTPS=&gt;HTTP丢失referer的解决：基于会话的站内来源地址URL还原</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001501.html" />
   <id>tag:www.chedong.com,2017:/blog//1.1501</id>
   
   <published>2017-12-08T12:35:23Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary><![CDATA[Referer丢了会导致很多来源分析就做不了了，以前referer丢失来源有三种： 0 代码因素：一些js构造链接打开的模式会造成referer丢失，解决方法是尽量避免windows.open meta refresh等； 1 代码+浏览器因素：meta js打开新窗口 部分浏览器会丢失 2 协议因素：https协议降级http，解决的方法是靠https端增加声明，比如：通过meta的方式：referer meta &lt;meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url"&gt; 目前搜索引擎https后的页面：Google用的是orgin 百度用的always 或者通过http header的方式，总体来说，这些问题是可以通过代码修复的。 现在有多了几种：主要来自多核浏览器使用率的增加。 3 多核浏览器切换内核/隐私浏览模式，部分第三方浏览器版本会丢referer，360支持renderer 标签，可以强制使用某种内核进行页面渲染，比如：webkit。 4 浏览器的各种鼠标手势等高级功能，会丢失referer， 5 来自移动app：微信 微博的点击；...]]></summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="技术笔记|Tech Notes" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5" label="session referer cookie" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[Referer丢了会导致很多来源分析就做不了了，以前referer丢失来源有三种：
0 代码因素：一些js构造链接打开的模式会造成referer丢失，解决方法是尽量避免windows.open meta refresh等；
1 代码+浏览器因素：<a href="https://blog.oldj.net/2012/08/04/document-referrer/">meta js打开新窗口 部分浏览器会丢失</a>
2 协议因素：https协议降级http，解决的方法是靠https端增加声明，比如：通过meta的方式：<a href="https://imququ.com/post/referrer-policy.html">referer meta</a>
<blockquote>&lt;meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url"&gt;</blockquote>
目前搜索引擎https后的页面：Google用的是orgin 百度用的always
或者通过http header的方式，总体来说，这些问题是可以通过代码修复的。

现在有多了几种：主要来自多核浏览器使用率的增加。
3 多核浏览器切换内核/隐私浏览模式，部分第三方浏览器版本会丢referer，<a href="http://se.360.cn/v6/help/meta.html">360支持renderer 标签</a>，可以强制使用某种内核进行页面渲染，比如：webkit。
4 浏览器的各种鼠标手势等高级功能，会丢失referer，
5 来自移动app：微信 微博的点击；]]>
      <![CDATA[从实际的项目来看，需要修补referer丢失的环节太多，开发测试量也很大（尤其加上浏览器因素后），更简单的方法是需要通过<a href="https://github.com/openresty/encrypted-session-nginx-module">服务端设置会话cookie</a>，然后通过日志分析系统：跟踪同一个cookie的访问路径进行完整路径的模拟还原。]]>
   </content>
</entry>
<entry>
   <title>搜索引擎来路关键词的挖掘：百度统计的高级分析报告导出获取来源关键词</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001500.html" />
   <id>tag:www.chedong.com,2017:/blog//1.1500</id>
   
   <published>2017-09-02T11:41:30Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>简单的说就是买百度统计的高级分析，然后用关键词维度组合其他访问属性导出报告。 n年没有接触SEO了，最近发现现在的搜索引擎优化已经和以前完全不一样了。 自从各大搜索引擎（Google2011年，百度2015年）https化以后，网站获得自己的搜索来源关键词都变得非常的麻烦，最近几年百度/Google等搜索引擎已经全面取消referer中的关键词传递， 除了搜索自身的网站，实时拿到用户搜索来源关键词基本不可能了。 通过https+取消referer中的关键词传递，可以有效避免电信运营商劫持流量获取用户搜索行为，但本来应该得到用户搜索意图信息的目标网站也失去了这个便利。 如果搜索来源关键词量很大，网站使用百度统计的网站可以通过百度统计的“预定全部关键词”功能来全部导出（百度统计各种前端报表导出一般只能导出1000）数据可以隔天拿到：全部关键词和对应的搜索次数的关键词下载包，需要每天手工下载，百度统计的api目前不支持压缩包的下载。 百度6月份推出了一个高级分析功能，是的：收费，根据网站流量价格1万-5万/年，完整拿到每天百万级的来源关键词/URL/PV/UV/转换等维度的组合报告，这个价格还是非常值的。 百度云还有两外一个收费服务：1￥/千次 实时解析referer中的百度关键词：搜索Referer API。...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="搜索引擎动态|Search Engine" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[简单的说就是<a href="http://datamarket.baidu.com/app.html#app/detail/tongjiPro">买百度统计的高级分析</a>，然后用关键词维度组合其他访问属性导出报告。

n年没有接触SEO了，最近发现现在的搜索引擎优化已经和以前完全不一样了。 自从<a href="http://zhanzhang.baidu.com/wiki/383">各大搜索引擎（Google2011年，百度2015年）https化以后</a>，网站获得自己的搜索来源关键词都变得非常的麻烦，最近几年<a href="http://zhanzhang.baidu.com/wiki/495">百度/Google等搜索引擎已经全面取消referer中的关键词传递</a>， 除了搜索自身的网站，实时拿到用户搜索来源关键词基本不可能了。

通过https+取消referer中的关键词传递，可以有效避免电信运营商劫持流量获取用户搜索行为，但本来应该得到用户搜索意图信息的目标网站也失去了这个便利。 如果搜索来源关键词量很大，网站使用百度统计的网站可以通过<a href="http://zhanzhang.baidu.com/college/articleinfo?id=1022 ">百度统计的“预定全部关键词”功能来全部导出</a>（百度统计各种前端报表导出一般只能导出1000）数据可以隔天拿到：全部关键词和对应的搜索次数的关键词下载包，需要每天手工下载，百度统计的api目前不支持压缩包的下载。

百度6月份推出了一个<a href="https://tongji.baidu.com/web/help/article?id=270">高级分析功能</a>，是的：<a href="http://datamarket.baidu.com/app.html#app/detail/tongjiPro">收费</a>，根据网站流量价格1万-5万/年，完整拿到每天百万级的来源关键词/URL/PV/UV/转换等维度的组合报告，这个价格还是非常值的。

百度云还有两外一个<a href="https://cloud.baidu.com/product/refererapi.html">收费服务：1￥/千次 实时解析referer中的百度关键词：搜索Referer API</a>。
]]>
      <![CDATA[简单介绍一下获取关键词和落地页的方案：以<a href="http://CSDN.NET">CSDN</a>的数据为例。

都在实时分析中增加相应维度然后存成报告，之后就可以定期手工导出了（希望百度能尽快提供导出接口下载功能）。实时分析是抽样的（根据网站的访问量，过去7天或者过去30天的可能只有个位的抽样），不用太纠结于实时分析的全面，确定维度定制成报告后就可以对全量数据进行导出了。

首先是搜索来源关键词/受访页面，以及对应的PV/UV/停留时间，后续访问量报告，这些属性可以用于对页面质量进行评价。
<img alt="baidu-landing-keywords.png" src="http://www.chedong.com/blog/archives/2017/09/02/baidu-landing-keywords.png" width="983" height="626" />

另一个常用报告样例是来源关键词+入口页+转换统计：注意转换相关指标和受访页面/PV/UV这类指标不可以同时使用。转换相关属性只对应入口页。
<img alt="landing-keywords-con.png" src="http://www.chedong.com/blog/archives/2017/09/02/landing-keywords-con.png" width="1005" height="434" />

使用高级可以很多维度导出用户访问数据，但要还原用户完整的访问会话， keyword landing_url映射可以得到了，结合自定义维度功能 利用日志映射到用户也是有可能的。

最希望百度统计统计提供的是直接将原始日志直接能ping到百度云或者其他第三方云服务上直接进行数据的清洗，用户画像，用于内容的个性化特征挖掘和广告推荐。
]]>
   </content>
</entry>
<entry>
   <title>Mac下处理PC以^M结尾的文本 </title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001499.html" />
   <id>tag:www.chedong.com,2017:/blog//1.1499</id>
   
   <published>2017-06-06T05:16:36Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>awk -v RS=&apos;\r\n&apos; foo.log Unix 用\n行末结尾 Mac 用\r行末结尾 PC 用 \r\n行末结尾...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="日志分析|Analytics" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      awk -v RS=&apos;\r\n&apos; foo.log

Unix 用\n行末结尾
Mac 用\r行末结尾
PC 用 \r\n行末结尾
      <![CDATA[参考： 
<a href="https://stackoverflow.com/questions/13069905/awk-print-is-adding-a-control-m-character-at-end-of-line#comment17754368_13069905">https://stackoverflow.com/questions/13069905/awk-print-is-adding-a-control-m-character-at-end-of-line#comment17754368_13069905</a>
The record separator is automatically set to the line-ending of the current system, LF (\n) on the Unix-based systems, CR-LF (\r\n) on MS systems and CR (\r) on Mac OS prior to Mac OS X. ]]>
   </content>
</entry>
<entry>
   <title>特殊字符Ctrl-A Ctrl-B Ctrl-C Ctrl-D Ctrl-E Ctrl-F分隔符在awk中的输入</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001498.html" />
   <id>tag:www.chedong.com,2017:/blog//1.1498</id>
   
   <published>2017-06-05T12:45:23Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>遇到Contral-A ^A的分隔符： awk -F &apos;\1&apos; &apos;{print $1,$3}&apos; foo.log awk &apos;{print &quot;\001\002\3\4\005\06\07&quot;}&apos; bar.log |more 会得到： ^A^B^C^D^E^F^G ^A^B^C^D^E^F^G...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="技术笔记|Tech Notes" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      遇到Contral-A ^A的分隔符：
awk -F &apos;\1&apos;  &apos;{print $1,$3}&apos; foo.log


awk &apos;{print &quot;\001\002\3\4\005\06\07&quot;}&apos; bar.log |more

会得到：
^A^B^C^D^E^F^G
^A^B^C^D^E^F^G
      <![CDATA[参考：
<a href="https://stackoverflow.com/questions/19227926/awk-doesnt-work-on-first-row-delimited-by-a">https://stackoverflow.com/questions/19227926/awk-doesnt-work-on-first-row-delimited-by-a</a>]]>
   </content>
</entry>
<entry>
   <title> iPhone照片的云端备份和本地移动硬盘备份 策略</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001497.html" />
   <id>tag:www.chedong.com,2017:/blog//1.1497</id>
   
   <published>2017-01-31T14:16:47Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>每年春节是整理收集的时间，除了微信需要清理一次之外，积攒了一年的照片也占用了十几 G 的空间。我忽然发现自己已经很久没有用电脑归档自己的照片了，可以用云端的都直接同步到云端了。只是最近腾讯微云和百度云都开始限制免费用户：微云限制了10G，百度限制了上传。360的云服务则彻底关闭了。 经过一晚上的整理，我将自己云端，本地备份策略整理如下：...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="个人爱好|Hobbies" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      每年春节是整理收集的时间，除了微信需要清理一次之外，积攒了一年的照片也占用了十几 G 的空间。我忽然发现自己已经很久没有用电脑归档自己的照片了，可以用云端的都直接同步到云端了。只是最近腾讯微云和百度云都开始限制免费用户：微云限制了10G，百度限制了上传。360的云服务则彻底关闭了。

经过一晚上的整理，我将自己云端，本地备份策略整理如下：
      <![CDATA[
<strong>手机到PC/Mac的导入</strong>：
手机 ==> PC 导入：Windows 缺省的iTunes照片服务会将照片按照 YYYY-MM 格式导入到照片目录下。
手机 ==> Mac 导入：直接使用 Mac 的照片服务导入，全部导入，有以前导入过的

如果想清空手机空间：以上两个导入都有删除手机上的副本的选项。

<strong>PC/Mac上的本地移动硬盘备份</strong>：经过几年积累，PC/Mac 上也会没有足够空间存放，还是需要本地移动硬盘归档。
PC 直接把目录移动到移动硬盘上即可，Mac 上则是使用<a href="https://support.apple.com/kb/PH21336?locale=zh_CN&viewlocale=zh_CN">照片的导出功能</a>，Mac 上的照片导出时候会有选项按照事件生成目录：这个还是非常有必要的，只是生成的目录是按照 “地点-时间”命名的，不知道有没有选项可以按照“时间-地点”命名：这样有没有事件地点的目录名就可以统一排序了。

<strong>PC/Mac 上的云端备份</strong>：<a href="https://pan.baidu.com/">百度云同步盘</a>（不是百度网盘：云同步盘的客户端已经停止维护，比较难找到下载入口）
微云限制了100G，不付费已经不能继续上传了，超标的部分暂时还可以用。
百度云盘则显示了单次上传的文件数量不能超过500个，如果一个月内的照片超过500，上传一个月的目录的话就非常麻烦了。

比较方便的还是使用百度云同步盘：同步是目前没有文件数量和流量的限制。空间上限2T。

建议将照片归档目录直接设置成百度云同步盘的同步目录：而将另外一个完整归档的目录设置不同步到本地

我的照片[同步] 
             |----2015-12 
             |----2016-01
             |----2016-02
             |----...
照片归档[不同步]

平时不定期导入照片后，开机就同步到云端了，需要腾出本地空间，将YYYY-MM 目录<strong>从云端</strong>移动到照片归档目录，本地再同步就删除了。




]]>
   </content>
</entry>
<entry>
   <title>5miles：挑战Craiglist的海外C2C平台 找BI工程师</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001496.html" />
   <id>tag:www.chedong.com,2016:/blog//1.1496</id>
   
   <published>2016-01-27T06:17:14Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>岗位需求：BI工程师 公司名称：第三石科技发展有限公司 业务方向：无线互联网的C2C电商平台 建模方向：商品推荐，用户积分平衡体系、无线互联网用户行为分析 要求：研究生，熟悉机器学习，熟悉概率统计，有日志分析经验者优先 素质：非常聪明（因为和你一起工作的人都是geek），善于学习，非常敏锐，善于总结 联系方式：geek@wespoke.com...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="日志分析|Analytics" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[岗位需求：BI工程师

公司名称：<a href="http://www.baijingapp.com/article/3630">第三石科技发展有限公司</a>
业务方向：无线互联网的C2C电商平台
建模方向：商品推荐，用户积分平衡体系、无线互联网用户行为分析
要求：研究生，熟悉机器学习，熟悉概率统计，有日志分析经验者优先
素质：非常聪明（因为和你一起工作的人都是geek），善于学习，非常敏锐，善于总结

联系方式：geek@wespoke.com]]>
      
   </content>
</entry>
<entry>
   <title>美国旧金山：租车被拖走了怎么办 找AutoReturn (415) 865 8200</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001495.html" />
   <id>tag:www.chedong.com,2016:/blog//1.1495</id>
   
   <published>2016-01-17T06:06:51Z</published>
   <updated>2025-12-14T16:10:13Z</updated>
   
   <summary>如果你看到这篇文章说不定车已经被拖走了，根据旧金山的公共交通管理局的介绍，发现被拖走后：请即刻拨打电话+1 415.865.8200 并提供牌照（租车的话，一般钥匙上有）和驾照号码，被拖走的地点和时间。 拖车和保管费：Towing Fees Towing fee (passenger vehicles): $491.25 First 4 hours of storage: free First day after first 4 hours of storage: $58.50 First day after 24 hours, and each day thereafter: $68.25 Transferring vehicle to long-term lot:...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="个人爱好|Hobbies" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[如果你看到这篇文章说不定车已经被拖走了，根据<a href="https://www.sfmta.com/services/permits-citations/booting-towing">旧金山的公共交通管理局的介绍，发现被拖走后</a>：请即刻拨打电话+1 415.865.8200 并提供牌照（租车的话，一般钥匙上有）和驾照号码，被拖走的地点和时间。

<a href="https://www.sfmta.com/sites/default/files/pdfs/2015/AutoReturn_Notice_Towing_and_Storage_Fees_2015-07-01.pdf">拖车和保管费：Towing Fees</a>
Towing fee (passenger vehicles): $491.25
First 4 hours of storage: free
First day after first 4 hours of storage: $58.50
First day after 24 hours, and each day thereafter: $68.25
Transferring vehicle to long-term lot: $27.75

罚款会放在雨刮器上：
<a href="https://www.sfmta.com/paycitation">https://www.sfmta.com/paycitation</a>
在网上可以缴纳罚款（但还尚未成功缴纳）或者邮寄支票。]]>
      <![CDATA[教训：把车停在位于车库出口附近的路边，但离出口道牙不够远。去找车的时候，有人正在打电话投诉刚刚停在那里的其他车辆。还好距离AutoReturn很近，走路即可到达：AutoReturn还是旁边小店的服务员告诉我们在哪里的。差点当时就要再去租一辆，想着如果租不到车，这个下雨的晚上就得住在旧金山了……去旧金山城里还是尽量少开车，Uber很方便，以后可以考虑停在郊区附近的停车场。还有就是使用ParkMe预约或者 https://www.parkinsf.com/street-parking 这样的服务。有一天10$-40$的停车场。

参考：
<a href="http://ww2.kqed.org/news/2015/06/02/why-is-towing-so-expensive-in-san-francisco">http://ww2.kqed.org/news/2015/06/02/why-is-towing-so-expensive-in-san-francisco</a>]]>
   </content>
</entry>
<entry>
   <title>北京地区美国B1/B2十年签证免面试续签流程 2025年12月份更新</title>
   <link rel="alternate" type="text/html" href="http://www.chedong.com/blog/archives/001492.html" />
   <id>tag:www.chedong.com,2014:/blog//1.1492</id>
   
   <published>2014-10-25T12:19:41Z</published>
   <updated>2025-12-16T03:38:23Z</updated>
   
   <summary>适用于 北京地区递交、且 符合免面试（Interview Waiver）条件 的美国 B1/B2 十年签证续签申请人。 一、官方参考链接 美国 B1/B2 免面试续签官方说明 中文电码查询 二、详细办理流程 Step 1｜准备签证照片 规格：51mm × 51mm 必须为 6 个月内近照 不可与历史照片重复（系统会做人脸识别） 准备电子版 + 打印 1 张纸质照片 材料：(1) Step 2｜注册并登录签证系统 美国签证预约系统 注册时跳转至：https://atlasauth.b2clogin.com/ 登录后选择“新的签证申请 / 续签”，填写 Renew 信息 Step 3｜填写 DS-160...</summary>
   <author>
      <name>车东</name>
      <uri>http://www.chedong.com</uri>
   </author>
         <category term="工作招聘 |recruit" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="zh-cn" xml:base="https://www.chedong.com/blog/">
      <![CDATA[<p>适用于 <strong>北京地区递交</strong>、且 <strong>符合免面试（Interview Waiver）条件</strong> 的美国 B1/B2 十年签证续签申请人。</p>

<hr />

<h2>一、官方参考链接</h2>
<ul>
    <li><a href="https://www.ustraveldocs.com/cn/zh/renew-visa" target="_blank">美国 B1/B2 免面试续签官方说明</a></li>
    <li><a href="https://chinesecommercialcode.net" target="_blank">中文电码查询</a></li>
</ul>

<hr />

<h2>二、详细办理流程</h2>

<h3>Step 1｜准备签证照片</h3>
<ul>
    <li>规格：51mm × 51mm</li>
    <li>必须为 6 个月内近照</li>
    <li>不可与历史照片重复（系统会做人脸识别）</li>
    <li>准备电子版 + 打印 1 张纸质照片</li>
</ul>
<p>材料：(1)</p>

<h3>Step 2｜注册并登录签证系统</h3>
<ul>
    <li><a href="https://www.usvisascheduling.com/zh-CN/" target="_blank">美国签证预约系统</a></li>
    <li>注册时跳转至：https://atlasauth.b2clogin.com/</li>
    <li>登录后选择“新的签证申请 / 续签”，填写 Renew 信息</li>
</ul>

<h3>Step 3｜填写 DS-160 并缴费</h3>
<ol>
    <li><a href="https://ceac.state.gov/genniv/" target="_blank">填写 DS-160</a>，地点选 Beijing</li>
    <li>打印 DS-160 确认页（AA 开头编号）→ (2)</li>
    <li>缴费并打印成功页面 → (3)</li>
    <li>填写免面试问卷，全部选 Yes → (4)</li>
</ol>

<h3>Step 4｜中信银行递交材料</h3>
<ul>
    <li>(1) 照片</li>
    <li>(2) DS-160 确认页</li>
    <li>(3) 缴费页面</li>
    <li>(4) 免面试确认页</li>
    <li>护照（含旧签证）</li>
</ul>
<p>推荐地点：中信银行北京分行（富华大厦）</p>
<p>获取护照跟踪号 → (5)</p>

<h3>Step 5｜等待并领取护照</h3>
<ul>
    <li>审理时间：约 4–5 周</li>
    <li>自取或 EMS 到付（约 ¥110）</li>
</ul>

<hr />

<h2>三、实操提示</h2>
<ul>
    <li>DS-160 信息保持真实、前后一致</li>
    <li>系统可能随时转为面谈</li>
    <li>护照有效期需 ≥ 6 个月</li>
</ul>
]]>
      <![CDATA[<h2>常见问题解答</h2>

<h3>哪些人可以使用 B1/B2 免面试续签？</h3>
<p>通常为曾获 B1/B2 签证、无拒签或撤销记录，并被系统判定符合免面试条件的申请人。</p>

<h3>照片为什么必须是 6 个月内？</h3>
<p>系统会比对历史照片，重复或过旧可能导致退件或人工审查。</p>

<h3>DS-160 填错了怎么办？</h3>
<p>可以重新填写新的 DS-160，并在签证系统中更新为最新编号。</p>

<h3>免面试是否 100% 不会被要求面谈？</h3>
<p>不是。使领馆保留要求面谈或补材料的权利。</p>

<h3>超过 5 周还没出签正常吗？</h3>
<p>在高峰期或抽查情况下属于正常。</p>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "哪些人可以使用 B1/B2 免面试续签？",
      "acceptedAnswer": {"@type": "Answer","text": "通常为曾获 B1/B2 签证、无拒签或撤销记录，并被系统判定符合免面试条件的申请人。"}
    },
    {
      "@type": "Question",
      "name": "照片为什么必须是 6 个月内？",
      "acceptedAnswer": {"@type": "Answer","text": "系统会比对历史照片，重复或过旧可能导致退件或人工审查。"}
    },
    {
      "@type": "Question",
      "name": "DS-160 填错了怎么办？",
      "acceptedAnswer": {"@type": "Answer","text": "可以重新填写新的 DS-160，并在签证系统中更新为最新编号。"}
    },
    {
      "@type": "Question",
      "name": "免面试是否一定不会被要求面谈？",
      "acceptedAnswer": {"@type": "Answer","text": "不是，使领馆保留要求面谈或补材料的权利。"}
    },
    {
      "@type": "Question",
      "name": "超过 5 周还没出签正常吗？",
      "acceptedAnswer": {"@type": "Answer","text": "高峰期或抽查情况下属于正常。"}
    }
  ]
}
</script>

2025年12月份更新：可以在美国签证<a href="https://www.usvisascheduling.com/zh-CN/">续签申请的缴费和预约网站查询文件快递进度</a>。护照开始快递或者签证办理好以后会有电子邮件通知。
2025年护照更新：8月底填写提交DS160，预约中银银行提交材料到了11月初，收到更新后的签证和护照12月中，续签成功。

参考文档：<a href="https://www.dealmoon.com/guide/1002121">十年签证免面谈续签｜手把手填表申请“免面谈确认信” & tips & 时间线</a>



]]>
   </content>
</entry>

</feed>
