轻量级笔记工具 · Notempty(悟空笔记)

轻量级笔记工具 · Notempty 一个对新手友好的本地网页笔记工具: 浏览器里写 Markdown,自动保存 粘贴或拖拽上传图片,和笔记放一起 支持公开页展示勾选为「公开」的笔记 支持 代理登录 / GitHub / Gitee OAuth 登录(多用户隔离) 适合个人知识库、小团队内网笔记、或者把数据同步到 Git 仓库做版本管理。 ...

June 9, 2026 · 9 min · 4152 words · TechBlogger

写笔记一键发布到github 网页

📝 关于悟空笔记 悟空笔记 是一款支持 Markdown 并自动保存图片到本地工作目录的笔记工具,非常适合配合静态博客工作流。 🚀 完整工作流程 1️⃣ 编写笔记 在悟空笔记中正常编写 Markdown 内容,插入的图片会自动保存到工作目录,并在笔记中使用相对路径引用(如 ![](image-xxx.png))。 ...

June 3, 2026 · 1 min · 263 words · TechBlogger

语音放大

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 MCU/ADC 电源 (3.3V) │ [R1 2.2kΩ 1% 贴片电阻] <-- 唯一的偏置电阻 │ ├───[C1 0.1uF 贴片电容]─────────────── AIN+ (芯海 ADC 输入+) │ ( 话筒 + ) [驻极体话筒] (选最便宜的 2-pin 电机引脚或贴片式) ( 话筒 - ) │ ├───[C2 0.1uF 贴片电容]─────────────── AIN- (芯海 ADC 输入-) │ GND (模拟地) VCC (或 MIC_BIAS) │ [R1 2.2kΩ] │ ├───[C1 10uF]─────────── AIN+ │ ( 话筒 + ) [驻极体话筒] ( 话筒 - ) │ ├───[C2 10uF]─────────── AIN- │ [R2 2.2kΩ] (阻值必须与R1严格相等) │ GND ...

June 3, 2026 · 2 min · 633 words · TechBlogger

不会烂的苹果

June 1, 2026 · 0 min · 0 words · TechBlogger

oauth2改代理登录需求

迁移说明:从直接 OAuth 登录改为代理登录 背景 原项目直接在前端/客户端处理 GitHub/Gitee OAuth 登录,需要: 在前端配置 Client ID 和 Client Secret(不安全) 每个环境都要在 OAuth 应用后台配置不同的回调地址 前端直接处理授权码换取 Token 的流程 新方案:使用代理登录服务 已部署代理登录服务 http://47.107.74.235:9011 ,统一处理 GitHub/Gitee OAuth 流程。 ...

April 10, 2026 · 2 min · 664 words · TechBlogger

萬事都是对等的

大师在流浪,小丑在殿堂。 预制菜进写字楼,中华美食流落街头。 写字楼里的程序员开发手机毒害工厂里制作预制菜的小伙,回头吃小伙做的预制菜!

April 10, 2026 · 1 min · 66 words · TechBlogger

写笔记直接发布到github

设计的原理是这样的,使用开源笔记应用直接写,然后使用如下脚本直接推送到github 通过github 的action自动生成可浏览的网页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 #!/bin/bash # ==================== 配置区域 ==================== # 仓库的远程地址 REPO_URL="https://github.com/fmpty/fmpty.github.io.git" # 本地仓库目录 REPO_DIR="/tmp/fmpty_repo" # 源目录(需要拷贝的内容来源) SOURCE_DIR="/usr/local/notes/notes-vault/users/gitee/zmpty/" # 目标目录(仓库内的 posts 目录) TARGET_DIR="${REPO_DIR}/content/posts/" # Git 提交信息 COMMIT_MSG="Update posts from obsidian - $(date '+%Y-%m-%d %H:%M:%S')" # 远程分支名称 BRANCH="master" # 是否启用推送(false = 仅验证,不推送) ENABLE_PUSH=true # 是否启用删除同步(删除目标中源已不存在的文件) ENABLE_DELETE=false # 是否显示详细输出 VERBOSE=true # ================================================= # 设置错误处理 set -e # 日志函数 log_info() { echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2 } log_success() { echo "[SUCCESS] $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 显示配置信息 show_config() { echo "==========================================" echo "同步配置信息" echo "==========================================" echo "源目录: ${SOURCE_DIR}" echo "目标目录: ${TARGET_DIR}" echo "仓库目录: ${REPO_DIR}" echo "分支: ${BRANCH}" echo "推送模式: $([ "${ENABLE_PUSH}" = true ] && echo "启用" || echo "禁用(验证模式)")" echo "删除同步: $([ "${ENABLE_DELETE}" = true ] && echo "启用" || echo "禁用")" echo "==========================================" } # 检查依赖 check_dependencies() { log_info "检查依赖工具..." if ! command -v rsync &> /dev/null; then log_error "rsync 未安装,请安装 rsync" exit 1 fi if ! command -v git &> /dev/null; then log_error "git 未安装,请安装 git" exit 1 fi log_success "依赖检查通过" } # 主流程 main() { show_config # 1. 检查依赖 check_dependencies # 2. 检查源目录 if [ ! -d "${SOURCE_DIR}" ]; then log_error "源目录不存在: ${SOURCE_DIR}" exit 1 fi log_success "源目录存在" # 统计源文件 SOURCE_COUNT=$(find "${SOURCE_DIR}" -type f | wc -l) log_info "源目录包含 ${SOURCE_COUNT} 个文件" # 3. 处理 Git 仓库 if [ -d "${REPO_DIR}/.git" ]; then log_info "本地仓库已存在,正在拉取最新变更..." cd "${REPO_DIR}" # 检查并切换分支 CURRENT_BRANCH=$(git branch --show-current) if [ "${CURRENT_BRANCH}" != "${BRANCH}" ]; then log_info "从 ${CURRENT_BRANCH} 切换到 ${BRANCH} 分支" git checkout ${BRANCH} fi # 拉取最新代码(带超时) if timeout 30 git pull origin ${BRANCH} 2>&1; then log_success "拉取成功" else log_error "拉取超时或失败,继续使用本地版本" fi else log_info "本地仓库不存在,正在克隆..." rm -rf "${REPO_DIR}" git clone --depth 1 --branch ${BRANCH} ${REPO_URL} "${REPO_DIR}" cd "${REPO_DIR}" log_success "克隆成功" fi # 4. 确保目标目录存在 mkdir -p "${TARGET_DIR}" log_success "目标目录已准备: ${TARGET_DIR}" # 5. 统计拷贝前文件 BEFORE_COUNT=$(find "${TARGET_DIR}" -type f 2>/dev/null | wc -l) log_info "拷贝前目标目录文件数: ${BEFORE_COUNT}" # 6. 执行 rsync 同步 log_info "开始 rsync 同步..." echo " 从: ${SOURCE_DIR}" echo " 到: ${TARGET_DIR}" # 构建 rsync 参数 RSYNC_OPTS="-avh" if [ "${VERBOSE}" = true ]; then RSYNC_OPTS="${RSYNC_OPTS} --progress" fi if [ "${ENABLE_DELETE}" = true ]; then RSYNC_OPTS="${RSYNC_OPTS} --delete" log_info "启用删除同步(目标中多余的文件将被删除)" fi # 执行同步 rsync ${RSYNC_OPTS} "${SOURCE_DIR}" "${TARGET_DIR}" # 7. 统计拷贝后文件 AFTER_COUNT=$(find "${TARGET_DIR}" -type f | wc -l) CHANGED_COUNT=$((AFTER_COUNT - BEFORE_COUNT)) log_success "同步完成" echo " 拷贝后目标目录文件数: ${AFTER_COUNT}" echo " 新增/更新文件数: ${CHANGED_COUNT}" # 8. 显示目标目录内容预览 if [ "${VERBOSE}" = true ]; then echo "" echo "目标目录内容预览(前15个文件):" ls -lh "${TARGET_DIR}" | head -15 fi # 9. 检查 Git 状态 cd "${REPO_DIR}" echo "" echo "==========================================" echo "Git 仓库状态检查" echo "==========================================" # 显示状态 git status --short CHANGED_FILES=$(git status --porcelain | wc -l) if [ ${CHANGED_FILES} -gt 0 ]; then echo "" echo "==========================================" log_info "检测到 ${CHANGED_FILES} 个文件变更" echo "==========================================" # 显示变更统计 echo "" echo "变更统计:" git diff --stat # 显示文件类型分布 echo "" echo "文件类型分布:" git status --porcelain | awk '{print $2}' | sed 's/.*\.//' | sort | uniq -c | sort -rn | head -10 if [ "${ENABLE_PUSH}" = true ]; then echo "" log_info "推送已启用,正在提交并推送..." git add . git commit -m "${COMMIT_MSG}" # 显示提交信息 echo "提交信息: ${COMMIT_MSG}" # 推送到远程 if timeout 30 git push origin ${BRANCH}; then log_success "推送成功" else log_error "推送失败或超时" exit 1 fi else echo "" echo "==========================================" echo "⚠️ 验证模式:检测到变更,但未提交和推送" echo "==========================================" echo "" echo "如需启用推送,请修改脚本中的 ENABLE_PUSH=true" echo "" echo "或者手动执行以下命令:" echo " cd ${REPO_DIR}" echo " git add ." echo " git commit -m \"${COMMIT_MSG}\"" echo " git push origin ${BRANCH}" echo "" echo "查看详细变更:" echo " git diff" echo " git status" fi else log_success "没有检测到任何变更(源目录和目标目录内容一致)" fi # 10. 输出总结 echo "" echo "==========================================" echo "同步流程完成!" echo "==========================================" echo "源目录: ${SOURCE_DIR}" echo "目标目录: ${TARGET_DIR}" echo "仓库目录: ${REPO_DIR}" echo "同步文件数: ${CHANGED_COUNT}" echo "Git 变更数: ${CHANGED_FILES}" echo "==========================================" # 11. 验证命令提示 if [ ${CHANGED_FILES} -gt 0 ] && [ "${ENABLE_PUSH}" != true ]; then echo "" echo "验证命令:" echo " # 查看拷贝的文件" echo " ls -la ${TARGET_DIR}" echo "" echo " # 对比源和目标" echo " diff -r ${SOURCE_DIR} ${TARGET_DIR} | head -50" echo "" echo " # 查看 Git 状态" echo " cd ${REPO_DIR} && git status" echo "" echo " # 查看具体变更" echo " cd ${REPO_DIR} && git diff" fi } # 运行主函数 main

April 8, 2026 · 5 min · 2027 words · TechBlogger

新封神

六千年前神族黄帝打败了魔族蚩尤犹太人,三千年前神族输给了人族开启私心时代,今天人族将会战胜蚩尤犹太魔族。 每三千年封印一次神,正邪交互封印。正者为公,邪者为私。

April 8, 2026 · 1 min · 79 words · TechBlogger

生态链

蟑螂吃蚊子幼虫 老鼠吃蟑螂 猫吃老鼠 但他们不会,他们只知道 打蚊子药,打蟑螂药 ,打老鼠药,典型的西医做法 殊不知,不理会 才是最好的状态

April 2, 2026 · 1 min · 63 words · TechBlogger

本地网页笔记

本地网页笔记 · Local Notes 一个对新手友好的本地网页笔记工具: 浏览器里写 Markdown,自动保存 粘贴或拖拽上传图片,和笔记放一起 支持公开页展示勾选为「公开」的笔记 支持 GitHub / Gitee OAuth 登录(多用户隔离) 适合个人知识库、小团队内网笔记、或者把数据同步到 Git 仓库做版本管理。 ...

April 1, 2026 · 4 min · 1597 words · TechBlogger