Repository navigation
Expand file tree
/
Copy pathindex.json
More file actions
1 lines (1 loc) · 127 KB
/
Copy pathindex.json
File metadata and controls
1 lines (1 loc) · 127 KB
1
[{"categories":["SSH","代理转发"],"content":"一、前言 SSH 端口转发的命令不算难,难的是日常维护。隧道一多,命令记不住、终端不敢关、断了要手动重连、哪个还活着全靠记忆。这个工具就是来收拾这些事的。 写一条转发命令是几秒钟的事: ssh -N -L 3306:db.internal:3306 -i ~/.ssh/id_rsa user@jump.example.com 但用起来就不是几秒钟的事了。手上同时开着五六条隧道的时候,问题会一个接一个冒出来——参数记不住要翻笔记,每条隧道都得占一个终端窗口,终端一关隧道就没了,网络抖一下断线还得手动敲一遍重连,至于哪条还活着、哪条已经挂了,基本靠猜。 我把自己这套流程做成了一个桌面工具:SSH Tunnel,基于 Wails v2 + Vue 3,用图形界面管理多条 SSH 隧道。 项目地址:https://github.com/midaug/ssh-tunnel 开源协议:MIT 当前版本","date":"2026-10-10","objectID":"/posts/2026101002/:1:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"二、解决什么问题 针对上面那几个痛点,工具的做法是这样的。 命令不用记了。 隧道保存成配置,点一下启停。已经写好的 ssh -L ... 命令可以直接粘贴进来,工具会解析成配置项,不用重新填一遍表单。 终端可以关了。 隧道跑在应用自己的进程里,配合系统托盘常驻,关掉主窗口隧道照样跑。macOS 上还能把 Dock 图标藏起来,完全当菜单栏应用用。 断线不用手动重连。 内置自动重连,最小退避、最大退避、心跳间隔都能配。 隧道状态看得见。 每条隧道的状态实时同步,托盘图标会随整体状态变色:有隧道在跑是蓝色,全部停止自动变灰。 连接状态也看得见。 这一条是 v0.0.2 补上的。隧道通了不等于业务通了——连到哪、跑了多少流量、是哪个本机进程发起的,以前只能靠 lsof 或者抓包。现在有独立的连接监控页,这些信息直接列在表格里。 ","date":"2026-10-10","objectID":"/posts/2026101002/:2:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"三、主要功能 1. 多隧道管理 每条隧道独立启停,状态实时同步,支持一键全部启用 / 全部关闭。 2. 三种转发模式 -L 本地转发、-R 远程转发、-D 动态转发都支持。 动态转发这里做了一点额外的事:同一个监听端口上同时兼容 SOCKS5 和 HTTP 代理,按首字节自动识别协议。HTTP 模式下支持 CONNECT 隧道(可以走 HTTPS 或任意 TCP),也支持普通请求转发,并复用 keep-alive 连接。 3. 连接监控 v0.0.2 新增。把「现在有哪些连接、连到哪、跑了多少流量」直接摆到界面上,不用再开 lsof 或抓包。 表格里每条连接显示:进程名与 PID、来源地址、目标地址、所属隧道、协议(TCP / SOCKS5 / HTTP / HTTPS)。顶部汇总活跃连接数、累计上下行流量和当前速率。 排序做得比较细。进程 / 来源、目标 / 隧道、流量、速率、时长这五列","date":"2026-10-10","objectID":"/posts/2026101002/:3:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"四、界面预览 1. 隧道列表 主界面列出所有隧道配置,包含运行状态、转发规则和错误信息。 2. 连接监控 实时展示所有进行中的连接:进程、来源、目标、流量与速率。图中按流量降序排列。左侧绿色圆点表示活动连接,灰色是刚结束还在保留期内的,红色表示连接目标失败。 3. 新建与编辑隧道 配置 SSH 连接信息、认证方式(密钥或密码)、端口转发规则和高级选项。保存前可以先用「测试连接」验证 SSH 连通性,这一步只测连接,不会真的启动转发。 4. 导入与导出 三个页签对应三种方式:从 SSH 命令导入、JSON 导入导出、导出 SSH 命令。 5. 设置 开机自启、窗口行为、Dock 显示这些全局配置都在这里。配置文件路径也会显示出来,可以直接打开所在目录。 6. 系统托盘 托盘菜单里直接操作隧道,图标颜色反映整体运行状态。 ","date":"2026-10-10","objectID":"/posts/2026101002/:4:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"五、下载与安装 1. 直接下载 到 Releases 页面按平台取对应文件: 平台 架构 文件 macOS Apple Silicon ssh-tunnel-v0.0.2-darwin-arm64.zip macOS Intel ssh-tunnel-v0.0.2-darwin-amd64.zip macOS 通用(Intel + ARM) ssh-tunnel-v0.0.2-darwin-universal.zip Windows x64 ssh-tunnel-v0.0.2-windows-amd64.exe(免安装)、ssh-tunnel-v0.0.2-windows-amd64-installer.exe(NSIS 安装包) Windows x86 ssh-tunnel-v0.0.2-windows-386.exe(免安装) Linux x64 ssh-tunnel-v0.0.2-l","date":"2026-10-10","objectID":"/posts/2026101002/:5:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"六、技术实现 层 技术 框架 Wails v2(Go + WebView) 后端 Go,golang.org/x/crypto/ssh,golang.org/x/net/proxy 前端 Vue 3 + TypeScript + Pinia + Vue Router 系统托盘 fyne.io/systray 进程反查 macOS libproc / Linux procfs / Windows iphlpapi macOS Dock 控制 cgo 调用 NSApp.setActivationPolicy 开机自启 macOS LaunchAgent / Windows 注册表 / Linux .desktop 选 Wails 而不是 Electron,主要是看中产物体积和内存占用——它用系统自带的 WebView 渲染前端,不用打包一整个 Chromium。v0.0.2 的 macOS A","date":"2026-10-10","objectID":"/posts/2026101002/:6:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"七、平台支持与系统要求 功能 macOS Windows 系统托盘 ✅ ✅ 连接监控(含进程反查) ✅ ✅ 开机自启 ✅ LaunchAgent ✅ 注册表 隐藏 Dock 图标 ✅ 菜单栏应用模式 — 启动时不显示窗口 ✅ ✅ 关闭窗口最小化到托盘 ✅ ✅ Linux 同样能构建,连接监控和进程反查(走 /proc)也都支持,只是没有 Dock 和托盘的系统级集成。 系统版本要求: 平台 最低版本 备注 macOS 10.13 High Sierra — Windows 10 / Server 2016 需要 WebView2 Runtime(Win10/11 通常已内置) Windows 7 和 8 不支持——Wails v2 依赖 WebView2(Edge 内核),而且 Go 1.21+ 本身已经移除了 Win7 支持。 配置文件按平台放在用户配置目录下: 平台 路径 macOS ","date":"2026-10-10","objectID":"/posts/2026101002/:7:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"八、更新日志 1. v0.0.2(2026-10-21) 新增 连接监控:实时连接列表、流量与速率、五列排序、单条 / 全部断开 进程反查:macOS libproc / Linux procfs / Windows iphlpapi 三平台 CI:每次提交自动在 macOS / Linux / Windows 上跑测试 修复 转发正确性:半关闭未传播导致响应被截断;-R 目标缺端口时拼出非法地址 连接稳定性:SSH 握手无法中断、keepalive 超时不生效、stopCh 数据竞争 配置安全:写盘改为原子替换并可从损坏中恢复;修正 IPv6 导出括号与含空格密钥路径 界面:macOS 上 confirm() / alert() 被 WebView 静默吞掉(表现为「删除点了没反应」)、编辑页覆盖旧隧道、-D 行删除按钮错位;删除隧道补上二次确认 连接监控:表头与数值列错位;速率改为按实","date":"2026-10-10","objectID":"/posts/2026101002/:8:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["SSH","代理转发"],"content":"九、小结 这个工具解决的是我自己的实际问题:隧道多了之后,命令行和终端窗口的方式确实不太够用。v0.0.2 把连接层面的可见性补上之后,排查「隧道是通的但服务连不上」这类问题省事了不少。 项目还在早期,有问题或者想要的功能,欢迎到 GitHub 上提 issue。 仓库:https://github.com/midaug/ssh-tunnel 下载:https://github.com/midaug/ssh-tunnel/releases/latest 协议:MIT 顺带一提,SSH 端口转发本身的用法,之前写过一篇 SSH Tunnel 端口转发详解,三种转发模式的参数和场景在那里讲得比较细,可以对照着看。 ","date":"2026-10-10","objectID":"/posts/2026101002/:9:0","tags":["SSH","Tunnel","端口转发","开源项目","Go","Wails","Vue3","桌面应用"],"title":"SSH Tunnel:用图形界面管理多条 SSH 隧道","uri":"/posts/2026101002/"},{"categories":["Docker","容器","macOS"],"content":"一、前言 公司发的电脑,Docker Desktop 我一直没装。不是装不上,是不想碰授权这条线。 Docker Desktop 走 Docker Subscription Service Agreement 授权,免费范围是个人使用、教育、非商业开源,以及员工少于 250 人且年营收低于 1000 万美元的小型企业。麻烦的地方在于:这是台公司设备,我虽然只是自己用(跑跑自己的项目、学点东西),但\"个人使用\"和\"公司使用\"在办公电脑上本来就是个模糊地带。真按公司使用算,大企业就得买订阅、走采购流程,为这点事不值当。 机器内存也不宽裕(16 GiB),Docker Desktop 那套常驻 GUI 加后台进程的开销也不小。 所以需求很明确: 授权干净,个人在公司电脑上用不涉及任何授权问题 资源占用小,16 GiB 的机器得留够内存给 IDE 和浏览器 性能要好,构建和文件挂载不能拖后腿 原生","date":"2026-10-10","objectID":"/posts/2026101001/:1:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"二、方案选型 几个候选方案放一起对比: 方案 授权 原生 docker/compose 资源占用 结论 Docker Desktop 个人免费,公司设备上归属模糊 是 重(GUI + 常驻进程) 有合规风险,排除 OrbStack 商业/公司使用需按人购买 是 很轻 同上,性能最好但有合规风险 Rancher Desktop Apache-2.0,免费 可切到 moby(dockerd) 中(Electron GUI) 可用,GUI 偏重 Podman Apache-2.0,免费 否,命令是 podman / podman compose 轻 免费但兼容性打折 Colima MIT,完全免费 是(跑的就是 dockerd) 轻(纯 CLI) 选它 ","date":"2026-10-10","objectID":"/posts/2026101001/:2:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"1. Docker Desktop 默认答案,兼容性最好。授权上它其实给个人开了免费口子,但装在办公设备上归属说不清,没必要冒这个风险。 ","date":"2026-10-10","objectID":"/posts/2026101001/:2:1","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"2. OrbStack 这几个里性能最强的,启动快、占用低,但它同样不是免费的。官方授权页写得很清楚:freelancer、商业或非营利实体、政府实体,或者与 OrbStack 相关的工作年收入超过 1 万美元,都必须按用户购买授权;装完只有 30 天 Pro 试用,试用结束降级为\"个人使用\"。所以在公司设备上它和 Docker Desktop 是同一个问题。 ","date":"2026-10-10","objectID":"/posts/2026101001/:2:2","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"3. Rancher Desktop SUSE 开源的(Apache-2.0),免费,功能也全,内置 k3s,运行时能在 moby(dockerd)和 containerd 之间切。代价是它是个 Electron 桌面应用,GUI 和常驻开销比纯 CLI 方案大,对 16 GiB 的机器不算友好。 ","date":"2026-10-10","objectID":"/posts/2026101001/:2:3","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"4. Podman 完全免费,无守护进程、rootless,安全性也好。问题是它的命令叫 podman 而不是 docker,compose 也是 podman compose,背后还要另装 provider。虽然可以配 alias 或 socket 兼容层,但终究做不到原生兼容——平时看到的教程、文档、脚本里全是 docker xxx,我不想在这上面花精力。 ","date":"2026-10-10","objectID":"/posts/2026101001/:2:4","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"5. Colima 刚好满足这几条需求:MIT 协议,个人怎么用都不涉及授权问题;纯 CLI,没有 GUI 常驻进程;而且它不是\"模拟\" docker——它就是在虚拟机里跑了一个真的 dockerd,把 socket 暴露给宿主机,所以 docker 和 docker compose 完全原生,一个命令都不用改。 ","date":"2026-10-10","objectID":"/posts/2026101001/:2:5","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"三、Colima 简介 Colima 是 Containers on Lima 的缩写。它在 macOS 上借 Lima 起一个轻量 Linux 虚拟机,虚拟机里跑 dockerd,再把 Docker socket 暴露给宿主机的 docker 命令。 macOS 主机 Colima 虚拟机 docker CLI / docker compose ─socket─▶ dockerd / 容器 / 镜像 除了 Docker,运行时还能选 containerd(配 nerdctl)或 incus,顺手也能起一套 k3s。 ","date":"2026-10-10","objectID":"/posts/2026101001/:3:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"四、安装 ","date":"2026-10-10","objectID":"/posts/2026101001/:4:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"1. 安装命令行工具 brew install colima docker docker-compose docker-buildx 四个包各管一摊: colima:管理器,依赖 lima docker:只装 CLI,不带 daemon,这正是关键 docker-compose:Compose v2 docker-buildx:构建插件,brew install docker 不会带上它,得单独装 ","date":"2026-10-10","objectID":"/posts/2026101001/:4:1","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"2. 创建虚拟机 我创建时只用了这一条: colima start --cpu 4 --memory 8 --disk 60 跑完之后,Colima 会把解析后的完整配置写进 ~/.colima/default/colima.yaml。我这份是: cpu: 4 memory: 8 disk: 60 arch: aarch64 runtime: docker hostname: colima vmType: vz mountType: virtiofs portForwarder: ssh rosetta: false binfmt: true nestedVirtualization: false mountInotify: false autoActivate: true rootDisk: 20 sshConfig: true sshPort: 0 mounts: [] provisi","date":"2026-10-10","objectID":"/posts/2026101001/:4:2","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"3. 资源参数 CPU:默认 2 核偏少,给 4 核,编译和并行跑容器都从容。 内存:默认 2 GiB 基本不够用,跑两个容器就开始吃紧,我给了 8 GiB。16 GiB 的机器这么分走一半后,宿主机还剩 8 GiB,同时开 IDE 和浏览器会有点紧;如果觉得吃力,退回 6 GiB 也够跑一般项目。 磁盘:默认 100 GiB,我设了 60。磁盘只能调大不能调小,官方注释写得很明确(value can only be increased after virtual machine has been created),所以一开始宁可给宽一点。 ","date":"2026-10-10","objectID":"/posts/2026101001/:4:3","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"4. 编辑配置 有些配置没法用命令行参数表达,比如 dockerd 的 daemon 配置、provision 脚本。这种情况用: colima start --edit 它会打开 yaml,改完保存再启动。也可以直接编辑 ~/.colima/default/colima.yaml,下次 start 生效。 ","date":"2026-10-10","objectID":"/posts/2026101001/:4:4","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"5. 验证 $ colima list PROFILE STATUS ARCH CPUS MEMORY DISK RUNTIME ADDRESS default Running aarch64 4 8GiB 60GiB docker $ colima status INFO[0000] colima is running using macOS Virtualization.Framework INFO[0000] arch: aarch64 INFO[0000] runtime: docker INFO[0000] mountType: virtiofs INFO[0000] docker socket: unix:///Users/\u003c用户名\u003e/.colima/default/docker.sock 进虚拟机看资源占用: $ colima ssh -- free -h total use","date":"2026-10-10","objectID":"/posts/2026101001/:4:5","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"五、Compose 命令 装完 docker run 是好的,但 docker compose(带空格那个)会直接报错: $ docker compose version docker: unknown command: docker compose Run 'docker --help' for more information 原因是 brew 装的 docker-compose 是 Docker CLI 的插件,它被放在 Homebrew 自己的插件目录里($(brew --prefix)/lib/docker/cli-plugins),而 Docker CLI 默认不会去那里找。 ","date":"2026-10-10","objectID":"/posts/2026101001/:5:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"1. 直接用 docker-compose $ docker-compose version Docker Compose version 5.5.1 就是命令名多了个连字符,别的没差别。我比对过两者的 md5——brew 在插件目录里放的那个 docker-compose,本身就是指向 bin/docker-compose 的软链,同一个二进制、同一个版本: $ md5 -q /opt/homebrew/Cellar/docker-compose/5.5.1/bin/docker-compose dccdcf38cd7fff7f229d3a1748b74126 $ md5 -q /opt/homebrew/Cellar/docker-compose/5.5.1/lib/docker/cli-plugins/docker-compose dccdcf38cd7fff7f229d3a1748","date":"2026-10-10","objectID":"/posts/2026101001/:5:1","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"2. 注册为 CLI 插件 如果你更习惯带空格的写法,或者手上的脚本、文档里都是 docker compose,把它注册成插件就行。两种方式我都实测过,都能生效。 方式一是告诉 Docker CLI 去 Homebrew 的插件目录找(Homebrew 官方推荐): { \"auths\": {}, \"currentContext\": \"colima\", \"cliPluginsExtraDirs\": [ \"/opt/homebrew/lib/docker/cli-plugins\" ] } 注意是往已有的 ~/.docker/config.json 里加一个字段,别整个覆盖。Apple Silicon 的 brew 前缀是 /opt/homebrew,Intel 机器是 /usr/local,用 brew --prefix 确认一下。 方式二是软链到用户级插件目录: mkdir -p ~/.do","date":"2026-10-10","objectID":"/posts/2026101001/:5:2","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"六、私有镜像仓库 公司内网一般都有自建的 registry。这里分两种情况,都要改 colima.yaml——Colima 没有对应的命令行参数。 有个前提要先知道:colima.yaml 里的 docker 段会原样映射成虚拟机内的 /etc/docker/daemon.json,所以 dockerd 层面的配置都写在这儿。 ","date":"2026-10-10","objectID":"/posts/2026101001/:6:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"1. HTTP 明文仓库 内网私服图省事只开了 HTTP,docker 默认会拒绝(它要求 HTTPS),得显式声明这是\"不安全仓库\"。 编辑 ~/.colima/default/colima.yaml: docker: insecure-registries: - registry.example.com:5000 写 域名:端口 或 IP:端口,端口不能省。colima.yaml 自带的注释里给的也是同样的示例。 改完重启生效: colima restart 验证有两种方式: $ docker info | grep -A3 \"Insecure Registries\" Insecure Registries: registry.example.com:5000 127.0.0.0/8 # 或者直接看虚拟机里的实际配置 $ colima ssh -- sudo cat /etc/dock","date":"2026-10-10","objectID":"/posts/2026101001/:6:1","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"2. 自签证书的 HTTPS 仓库 如果私服上了 TLS,但证书是自签的,docker pull 会报: x509: certificate signed by unknown authority 这种情况不要拿 insecure-registries 绕过去,那等于放弃证书校验。正确做法是把 CA 装进虚拟机。 按 Docker 官方文档,Linux 上的 dockerd 会从 /etc/docker/certs.d/\u003c仓库地址\u003e/ 读自定义 CA:目录名就是仓库的 host:port,里面的 *.crt 会被当作根证书。 /etc/docker/certs.d/ └── registry.example.com:5000 └── ca.crt # 签发该仓库证书的根 CA(PEM) 后缀要留意:.crt 才会被当成 CA 根证书,写成 .cert 会被误判为客户端证书然后报错。 虚拟机","date":"2026-10-10","objectID":"/posts/2026101001/:6:2","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"3. 注意事项 insecure-registries 只是让 docker 跳过 TLS 校验,不等于免认证,该 docker login 还是要登录。 登录凭据存在宿主机的 ~/.docker/config.json 里,不在虚拟机内。 如果是公司统一的内部 CA(而不是单台自签),用 provision 把 CA 装进去,比逐个加 insecure 干净得多。 换成 containerd 运行时(--runtime containerd)时配置方式不同,要写 containerd 的 hosts.toml,这里不展开。 ","date":"2026-10-10","objectID":"/posts/2026101001/:6:3","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"七、日常操作 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"1. 起停与状态 colima start colima stop colima restart colima status colima list # 别名 ls ","date":"2026-10-10","objectID":"/posts/2026101001/:7:1","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"2. 调整资源 只能先停再改: colima stop colima start --cpu 6 --memory 12 CPU 和内存随便调,磁盘只能往上加。 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:2","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"3. 挂载目录 默认会把 $HOME 和 /tmp/colima 挂进去,容器里能直接访问你的代码目录。要额外挂别的: colima start --mount ~/work:w # :w 表示可写 我平时用默认的挂载就够。 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:3","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"4. 端口与网络 容器映射到宿主机的端口默认就能访问,不用额外配。要让虚拟机在局域网里有独立 IP: colima start --network-address 国内网络可能需要指定 DNS: colima start --dns 223.5.5.5 --dns 1.1.1.1 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:4","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"5. 多套环境隔离 想同时跑两套互不干扰的环境,用 profile: colima start --profile dev --cpu 2 --memory 4 colima start --profile test --runtime containerd colima list colima stop --profile dev 每个 profile 是独立的虚拟机和 socket。 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:5","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"6. 切换 containerd 运行时 colima start --runtime containerd colima nerdctl install nerdctl run hello-world ","date":"2026-10-10","objectID":"/posts/2026101001/:7:6","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"7. 启用 k3s brew install kubectl colima start --kubernetes kubectl get nodes 管理命令:colima kubernetes start|stop|reset|delete。 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:7","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"8. 进入虚拟机 colima ssh colima ssh -- htop # 直接执行命令 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:8","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"9. 彻底删除 --data 连镜像和容器一起清,--force 跳过确认: colima delete --data --force 两个参数一起用要谨慎,删掉就恢复不了。 ","date":"2026-10-10","objectID":"/posts/2026101001/:7:9","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"八、常见问题 ","date":"2026-10-10","objectID":"/posts/2026101001/:8:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"1. docker compose 提示 unknown command 直接用 docker-compose 就行,两者是同一个二进制;想用带空格的写法,按上面注册插件。 ","date":"2026-10-10","objectID":"/posts/2026101001/:8:1","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"2. Cannot connect to the Docker daemon 多半是虚拟机没起来,或者 context 跑偏: colima status docker context use colima ","date":"2026-10-10","objectID":"/posts/2026101001/:8:2","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"3. 启动时报虚拟化相关错误 换个 VM 类型试试: colima start --vm-type vz # Apple Silicon 默认,最快 colima start --vm-type qemu # 兼容性更好,慢一些 ","date":"2026-10-10","objectID":"/posts/2026101001/:8:3","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"4. 挂载的文件在容器里不更新 开一下 inotify: colima start --mount-inotify ","date":"2026-10-10","objectID":"/posts/2026101001/:8:4","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"九、卸载 colima stop colima delete -f brew uninstall colima docker docker-compose docker-buildx ","date":"2026-10-10","objectID":"/posts/2026101001/:9:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["Docker","容器","macOS"],"content":"十、小结 换成 Colima 之后,docker 命令照旧,compose 用 docker-compose(或者按上面的方式注册一下,让 docker compose 也能用),授权上的顾虑没了,机器上也少了一个常驻的 GUI 应用。 纯 CLI、没有 GUI、配置就是一份 YAML。16 GiB 的机器给 8 GiB 内存、4 核 CPU,自己跑跑容器完全够用。 ","date":"2026-10-10","objectID":"/posts/2026101001/:10:0","tags":["Docker","Colima","Docker Compose","容器","macOS","虚拟化","Homebrew"],"title":"Mac 上不装 Docker Desktop,用 Colima 跑 Docker","uri":"/posts/2026101001/"},{"categories":["AI","大模型"],"content":"前言 随着大语言模型(LLM)的普及,如何编写高质量的 Prompt 成为提升模型输出质量的关键。好的 Prompt 就像好的需求文档,能让 AI 准确理解你的意图并产出符合预期的结果。本文结合实际项目经验,系统总结 Prompt 调优的策略、技巧和框架,帮助你快速掌握与大模型高效沟通的方法。 ","date":"2026-06-23","objectID":"/posts/2026062302/:1:0","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"核心调优策略 Prompt 调优可以从简单到复杂分为五个层次,建议按需递进使用: 层次 策略 适用场景 难度 基础 编写清晰的指令 所有场景 ⭐ 进阶 任务分解 复杂多步骤任务 ⭐⭐ 进阶 给予思考时间 逻辑推理、分析决策 ⭐⭐ 高级 外部工具增强 需要实时数据、专业领域知识 ⭐⭐⭐ 高级 额外推理输出 需要高准确度的结构化输出 ⭐⭐⭐ ","date":"2026-06-23","objectID":"/posts/2026062302/:2:0","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"策略一:编写清晰、具体的指令 适用场景:所有 Prompt 编写场景,是最基础也最重要的策略。 清晰的指令是高质量输出的基础。以下是几种常用方法: 1. 定义 System Prompt System Prompt 用于设定 AI 助手的行为模式,包括角色设定、语言风格、任务模式和行为约束。 你是一位资深Python工程师,擅长代码审查和优化。 请用专业的技术语言,指出代码中的潜在问题并给出优化建议。 对于每个问题,需要说明:问题描述、影响范围、优化方案。 2. 提供具体的细节要求 在 Prompt 中添加背景信息和细节要求,让模型更准确地理解上下文: 背景:我正在开发一个高并发的电商订单系统 需求:设计一个分布式锁方案 要求: 1. 支持高并发场景(QPS \u003e 10000) 2. 具备自动续期机制 3. 支持主从切换时的一致性保证 3. 角色扮演 赋予 AI 特定角色身份,可以更准确地模","date":"2026-06-23","objectID":"/posts/2026062302/:2:1","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"策略二:将复杂任务分解为简单子任务 适用场景:当任务涉及多个步骤、多种能力,或输出需要对接下游系统时。 大模型在处理复杂任务时容易出现\"幻觉\"或遗漏,将任务拆解可以显著提升准确性。 意图理解与实体提取 当模型输出需要直接对接后端接口时,必须确保格式可解析: 请从用户输入中提取意图和实体,严格按照以下JSON格式输出: { \"intent\": \"意图标识\", \"entities\": [ {\"type\": \"实体类型\", \"value\": \"实体值\"} ] } 用户输入:帮我预订明天晚上7点的海底捞火锅,4个人 多步骤任务拆解 将一个复杂任务拆分为多个独立的子任务,逐步完成: 请按以下步骤完成竞品分析报告: 步骤1:列出3个主要竞品及其核心功能 步骤2:对比各竞品的定价策略 步骤3:分析各竞品的目标用户群体 步骤4:总结各竞品的优劣势 步骤5:给出我方产品的差异化建议 每步完成后输出\"✓ 步骤","date":"2026-06-23","objectID":"/posts/2026062302/:2:2","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"策略三:给予模型思考时间 适用场景:逻辑推理、数学计算、方案评估等需要深度思考的场景。 在模型给出最终结论前,引导其进行自我探索和推理,即思维链(Chain of Thought): 请分析并评估以下Python代码的质量和功能。 在生成最终回答之前,请: 1. 先编写一份推荐的示例代码 2. 然后从代码结构、可读性、功能完整性三个维度进行评分(1-10分) 3. 最后给出详细的改进建议 待评估代码: def calc(lst): return sum(lst)/len(lst) 关键技巧:在 Prompt 中加入\"请先思考\"、“请展示推理过程\"等语句,可以显著提升推理类任务的准确率。 ","date":"2026-06-23","objectID":"/posts/2026062302/:2:3","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"策略四:使用外部工具增强模型能力 适用场景:需要实时数据、专业领域知识、或执行特定操作的场景。 Function Call 通过定义工具函数,让模型在需要时调用外部能力: { \"tools\": [ { \"type\": \"function\", \"function\": { \"name\": \"search_product\", \"description\": \"根据关键词搜索商品\", \"parameters\": { \"type\": \"object\", \"properties\": { \"keyword\": {\"type\": \"string\"}, \"category\": {\"type\": \"string\"} } } } } ] } 知识库检索(RAG) 将领域知识注入 Prompt,提升回答的准确性和专业性: 基于以下知识库内容回答用户问题: --- 知识库 --- 产品A:支持7天无理由退货,质保期1","date":"2026-06-23","objectID":"/posts/2026062302/:2:4","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"策略五:通过推理输出提升准确度 适用场景:需要高准确度的结构化输出,如分类、判断、提取等任务。 核心思路是:让模型先解释原因,再给出结论。这样可以减少错误判断。 示例:偏好分类场景 在处理用户偏好时,要求模型先输出判断理由,再输出分类结果: Prompt 设计: 请分析用户的输入,判断是否包含可提取的偏好信息。 要求: 1. 先输出判断理由(reason字段) 2. 再输出分类结果 3. 仅提取正面或中性偏好,不支持\"不喜欢\"类否定表达 输出格式: { \"reason\": \"判断理由\", \"category\": \"分类标识\", \"category_name\": \"分类名称\", \"category_content\": [...] } 测试用例: 用户输入 期望输出要点 “我喜欢吃辣和甜的东西” reason: 用户明确提到喜欢 → category: food_preference “我不喜","date":"2026-06-23","objectID":"/posts/2026062302/:2:5","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"常用 Prompt 框架 掌握了基础策略后,可以使用框架来组织更复杂的 Prompt。以下是三个主流框架的对比: 框架 组件数 特点 适用场景 RACE 4 简洁高效 快速任务、简单问答 CO-STAR 6 结构完整 复杂任务、多平台输出 CRISPE 6 增加人格和示例 需要特定风格的输出 ","date":"2026-06-23","objectID":"/posts/2026062302/:3:0","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"RACE 框架(OpenAI 推荐) RACE 是最简洁的框架,适合快速构建 Prompt: 组件 含义 填写要点 Role 角色 赋予 AI 专业身份 Action 行动 明确要执行的任务 Context 上下文 任务背景、相关信息 Expectation 期望 输出质量与格式要求 实战示例: Role: 资深Python工程师 Action: 优化以下代码,提升执行效率并修复潜在bug Context: 代码用于处理百万级用户数据 Expectation: 输出优化后代码+详细优化说明,标注关键改进点 ","date":"2026-06-23","objectID":"/posts/2026062302/:3:1","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"CO-STAR 框架(新加坡 GovTech 获奖) CO-STAR 结构完整、适用性广,特别适合需要精细化控制的场景: 组件 含义 填写要点 Context 上下文 任务背景、相关信息、AI 身份设定 Objective 目标 明确最终要达成的结果,用\"完成/生成/分析\"等动词 Style 风格 内容呈现形式(如学术论文、营销文案、技术文档) Tone 语气 表达情感色彩(正式/亲切/专业/幽默) Audience 受众 内容面向的人群(专家/新手/客户/学生) Response Format 响应格式 输出结构(表格/列表/段落/JSON) 实战示例: # Context: 我是一家初创电商公司的运营,正在策划双11促销活动 # Objective: 生成3套不同主题的促销方案,包含活动流程、预算分配和预期效果 # Style: 专业商业计划书风格,数据支撑充分 # Tone: 积极进","date":"2026-06-23","objectID":"/posts/2026062302/:3:2","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"CRISPE 框架 CRISPE 在 CO-STAR 基础上增加了 Persona(人格特质)和 Example(参考示例),进一步提升输出精准度: 组件 含义 填写要点 Context 上下文 任务背景、相关信息、AI 身份设定 Role 角色 赋予 AI 专业身份 Intention 意图 动词短语明确任务及达到的效果 Style 风格 内容呈现形式 Persona 人格 定义角色的性格特点(严谨务实/活泼易懂/专业权威) Example 示例 提供 1-2 个简短示例(Few-shot) 实战示例: 【C - Context】 某咖啡店推出新品「冰萃椰香拿铁」,主打0糖0脂,面向18-30岁年轻消费者,用于小红书发布。 【R - Role】 资深小红书美食文案博主,擅长短句种草。 【I - Intention】 生成3条15字以内的宣传短文案,突出\"0糖0脂+椰香\"卖点。 【S - ","date":"2026-06-23","objectID":"/posts/2026062302/:3:3","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"如何选择框架? 简单任务(翻译、摘要、问答) → 使用 RACE 需要精细控制输出风格和内容 → 使用 CO-STAR 需要 AI 模仿特定人格/风格 → 使用 CRISPE 逻辑推理、数学计算 → 单独使用思维链(CoT) ","date":"2026-06-23","objectID":"/posts/2026062302/:3:4","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"获奖级 Prompt 示例 以下是一个结构完整、可复用的 System Prompt + CO-STAR 组合示例,展示了如何构建一个生产级的 Prompt: --- SYSTEM PROMPT START --- 你是资深政治竞选传播专家,拥有15年国际竞选经验,专注年轻选民(21-35岁)沟通策略。 必须遵守以下护栏规则: 1. 严格遵循CO-STAR框架生成内容,禁止遗漏任何组件 2. 语言必须符合新加坡政治规范,不使用负面攻击、极端表述 3. 每个平台文案风格必须差异化,适配平台用户行为习惯 4. 所有文案必须包含3个核心议题:住房、就业、数字服务 5. 完成后进行自我评估,确保符合所有要求 --- SYSTEM PROMPT END --- --- CO-STAR PROMPT START --- 【C】Context: 新加坡某政党候选人参加2024年社区议会选举,目标选民为2","date":"2026-06-23","objectID":"/posts/2026062302/:4:0","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["AI","大模型"],"content":"总结 Prompt 调优是一个不断迭代的过程,核心要点如下: 要点 说明 明确目标 清楚知道你想要什么样的输出 结构化表达 使用框架组织 Prompt,确保信息完整 提供上下文 给予足够的背景信息和约束条件 善用示例 Few-shot 学习能显著提升输出质量 引导思考 让模型展示推理过程,获得更可靠的结论 持续优化 根据输出结果不断调整和改进 Prompt 快速上手建议: 从 RACE 框架开始,快速构建基础 Prompt 效果不理想时,升级到 CO-STAR 或 CRISPE 框架 涉及逻辑推理时,加入思维链引导模型逐步思考 对接下游系统时,使用分隔符 + JSON 格式确保输出可解析 持续收集 bad case,针对性优化 Prompt 参考链接: OpenAI Prompt Engineering Guide Prompt Engineering 最佳实践 ","date":"2026-06-23","objectID":"/posts/2026062302/:5:0","tags":["AI","Prompt","LLM","提示词工程"],"title":"AI大模型Prompt调优实战指南","uri":"/posts/2026062302/"},{"categories":["SSH","代理转发"],"content":"前言 SSH(Secure Shell)不仅仅是用来远程登录服务器的工具,它还提供了强大的端口转发(Port Forwarding)功能,也叫 SSH Tunnel。通过 SSH Tunnel,我们可以加密传输数据、绕过防火墙限制、访问远程内网服务等。本文介绍 SSH 端口转发的常用参数及一些实用技巧。 ","date":"2026-06-23","objectID":"/posts/2026062301/:1:0","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"SSH 常用参数 除了基本的远程登录,SSH 还有一些别的参数值得介绍。 ","date":"2026-06-23","objectID":"/posts/2026062301/:2:0","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"-N 和 -T 参数 -N 参数表示只连接远程主机,不打开远程 shell;-T 参数表示不为这个连接分配 TTY。这两个参数可以放在一起用,代表这个 SSH 连接只用来传数据,不执行远程操作。 $ ssh -NT -D 8080 host ","date":"2026-06-23","objectID":"/posts/2026062301/:2:1","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"-f 参数 -f 参数表示 SSH 连接成功后,转入后台运行。这样一来,你就可以在不中断 SSH 连接的情况下,在本地 shell 中执行其他操作。 $ ssh -f -D 8080 host 要关闭这个后台连接,就只有用 kill 命令去杀掉进程。 ","date":"2026-06-23","objectID":"/posts/2026062301/:2:2","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"SSH Tunnel 端口转发类型 SSH Tunnel 主要分为三种类型:本地端口转发、远程端口转发和动态端口转发。 ","date":"2026-06-23","objectID":"/posts/2026062301/:3:0","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"本地端口转发(Local Port Forwarding) 将本地机器的某个端口转发到远程服务器的指定端口。 # 语法 $ ssh -L [本地绑定地址:]本地端口:目标主机:目标端口 用户名@远程服务器 # 示例:将本地 8080 端口转发到远程服务器的 80 端口 $ ssh -L 8080:localhost:80 user@remote_host # 示例:将本地 3306 端口转发到远程内网的数据库服务器 $ ssh -L 3306:db_server:3306 user@jump_host ","date":"2026-06-23","objectID":"/posts/2026062301/:3:1","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"远程端口转发(Remote Port Forwarding) 将远程服务器的某个端口转发到本地机器的指定端口。 # 语法 $ ssh -R [远程绑定地址:]远程端口:目标主机:目标端口 用户名@远程服务器 # 示例:将远程服务器的 8080 端口转发到本地的 80 端口 $ ssh -R 8080:localhost:80 user@remote_host ","date":"2026-06-23","objectID":"/posts/2026062301/:3:2","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"动态端口转发(Dynamic Port Forwarding) 动态端口转发相当于创建了一个 SOCKS 代理,可以代理所有端口的流量。 # 语法 $ ssh -D [本地绑定地址:]本地端口 用户名@远程服务器 # 示例:在本地 1080 端口创建 SOCKS 代理 $ ssh -D 1080 user@remote_host # 结合 -N、-T、-f 参数在后台运行 $ ssh -fNT -D 1080 user@remote_host ","date":"2026-06-23","objectID":"/posts/2026062301/:3:3","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"SSH Tunnel 专用帐号配置 如果你正好有一台已经装了 sshd 的 Linux 系统,你可以很方便地 useradd 一个账户就能开始 SSH 了,当然也可以 Tunnel 了。 但是,这样子留下了一个可以登录 shell 的用户,有一定的安全隐患,怎么避免呢? ","date":"2026-06-23","objectID":"/posts/2026062301/:4:0","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"方案一:限制 Shell 登录 最简单的增加 SSH Tunnel 专用帐号的办法: useradd -M -s /usr/sbin/nologin tussh 这样的用户如果使用 Putty 等工具登录,输入密码后会看到这样一句话,然后 SSH 就会断开: This account is currently not available 但是 SSH Tunnel 功能并不受影响。 ","date":"2026-06-23","objectID":"/posts/2026062301/:4:1","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"方案二:允许用户自行修改密码 方案一还不够完美。对于 SSH Tunnel 用户,通常只有一个需求,那就是修改密码。由于不能登录 shell,用户不能自己更改密码,只能求助管理员,这样既不安全,也不方便。 完美的解决方案是用这样的 useradd 参数: useradd -M -s /usr/bin/passwd tussh 这样的用户登录的时候,会直接进入修改密码状态,用户就可以收到管理员设置的一个简单密码后,自己设置自己的密码,甚至定期更换自己的密码。 方便,安全! 记得用 passwd 为新用户设置初始密码。 ","date":"2026-06-23","objectID":"/posts/2026062301/:4:2","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"常用组合命令 实际使用中,我们通常会将多个参数组合使用: # 后台运行本地端口转发 $ ssh -fNL 8080:localhost:80 user@remote_host # 后台运行远程端口转发 $ ssh -fNR 8080:localhost:80 user@remote_host # 后台运行动态端口转发(SOCKS 代理) $ ssh -fNT -D 1080 user@remote_host # 指定本地绑定地址(允许外部访问) $ ssh -fNL 0.0.0.0:8080:localhost:80 user@remote_host ","date":"2026-06-23","objectID":"/posts/2026062301/:5:0","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["SSH","代理转发"],"content":"总结 SSH Tunnel 是一个强大而灵活的网络工具,掌握端口转发可以解决很多实际问题: 本地端口转发:访问远程内网服务 远程端口转发:将本地服务暴露给外网 动态端口转发:搭建 SOCKS 代理 配合专用帐号配置,既能满足转发需求,又能保证系统安全。 参考链接: SSH 端口转发 OpenSSH 官方文档 ","date":"2026-06-23","objectID":"/posts/2026062301/:6:0","tags":["SSH","Tunnel","端口转发","网络"],"title":"SSH Tunnel 端口转发详解","uri":"/posts/2026062301/"},{"categories":["css"],"content":"前端多终端自适应网页开发模式 智能移动终端大爆发的现阶段,手机访问网页已经成为人们不可或缺的使用习惯,开发自适应网页大势所趋,实际上无论改造还是开发本身并不复杂,但是掌握更好的开发模式会使得你编写页面更加高效快捷 ","date":"2023-01-04","objectID":"/posts/2023010401/:1:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"关于自适应网页 所谓自适应网页,通过屏幕的宽度实现加载对应的CSS样式表,提高移动终端的访问体验。 自适应网页主要用于解决,PC网页在移动端显示出现字体过小、模块错位、浮动遮挡等不良体验。 实际上网页无论是否进行了自适应,通过手机/平板等移动终端都是可以访问的。 但是对网页做移动端自适应适配,在如今是非常有必要的。 ","date":"2023-01-04","objectID":"/posts/2023010401/:2:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"自适应三要素 自适应网页开发简单归纳为以下三大要素: 选定关键屏幕宽度判断 当你要开始进行自适应网页开发的时候,你需要在内心中有大致的布局,明确需要开发几套自适应的配套模板。 然后通过指定min-width and max-width(选定关键屏幕判断)进行CSS覆写。 宽高尽量使用百分比 自适应网页更多的时候是为了给移动终端带来更好的访问体验,但是移动终端的种类繁多,特别是屏幕尺寸应有尽有。 你不可能对所有的宽度都开发模板,那样工作量太大而且没有意义。 因此如果对元素的各项px属性均指定为百分比,就可以一套自适应模板适配于各类尺寸的屏幕中。 遵循代码聚合的原则 开发自适应网页需要覆写大量的CSS,在开发过程中尽量规划某一个区域专门进行代码编写。 否则将有可能出现大量冗余样式(特别是大量冗余的屏幕尺寸判断语句)以及样式冲突,对于后期调试极为不利。 ","date":"2023-01-04","objectID":"/posts/2023010401/:3:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"自适应开发方式 实际上自适应开发是一件非常简单的事情。 其麻烦并不在于技术,而是对整个网页的CSS样式进行重新编写,这是一个比较浩大的工作。 那么如何进行自适应开发呢? 首先网页的head区域要标注一个这样的viewport元标签。 \u003c!DOCTYPE html\u003e \u003chtml lang=\"zh_CN\"\u003e \u003chead\u003e \u003c!-- 网页的宽度自动适应手机屏幕的宽度 --\u003e \u003c!-- width=device-width :表示宽度是设备屏幕的宽度 --\u003e \u003c!-- initial-scale=1.0:表示初始的缩放比例,1.0就是占网页的100% --\u003e \u003c!-- minimum-scale=1.0:表示最小的缩放比例 --\u003e \u003c!-- maximum-scale=1.0:表示最大的缩放比例 --\u003e \u003c!-- user-scalable=no:表示用户不可以调整缩放比例 --\u003e \u003cmeta n","date":"2023-01-04","objectID":"/posts/2023010401/:4:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"传统CSS覆写 在原来的CSS文件中增加覆写,举例说明。 案例已经完全包括了自适应开发中应用到的所有方法,比较简单。 /*原始的网页样式*/ .container { width: 1200px; margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } /*当屏幕宽度小于等于991px时,一般多为手机*/ /*className为container的元素宽度为100%*/ @media (max-width: 991px) { .container { width: 100% } } /*当屏幕宽度大于等于992px且小于等于1099px时,一般多为平板*/ /*className为container的元素宽度为90%*/ @media (min-width: 992px) and (","date":"2023-01-04","objectID":"/posts/2023010401/:5:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"关于CSS覆写 我们将根据CSS样式渲染生效原则,在这里简单提一下 浏览器缺省 \u003c 外部样式表 \u003c 外部样式表类选择器 \u003c 外部样式表类派生选择器 \u003c 外部样式表ID选择器 \u003c 外部样式表ID派生选择器 \u003c 内部样式表 \u003c 内部样式表类选择器 \u003c 内部样式表类派生选择器 \u003c 内部样式表ID选择器 \u003c 内部样式表ID派生选择器 \u003c 内联样式 关于这么多种样式生效类型,就不一一介绍了,这属于CSS的基础。 ","date":"2023-01-04","objectID":"/posts/2023010401/:6:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"完整CSS覆写 定义一个全新的文件,与原来的CSS样式文件互不干扰。 值得注意的是,自适应的样式表一定要放在原始样式表的下面。 CSS样式渲染生效还有一个基本原则就是,后者覆写前者(或者又称为距离元素最近的样式生效) 。 这种方式与传统方式的差异在于不需要指定大量的@media标签在CSS文件中,与源CSS样式表分开,易读性高。 在开发的时候就和正常编写CSS样式一致,更为高效。 \u003c!DOCTYPE html\u003e \u003chtml lang=\"zh_CN\"\u003e \u003chead\u003e \u003c!-- 原始的样式表 --\u003e \u003clink rel=\"stylesheet\" href=\"/static/css/index.css\"\u003e \u003c!-- 当屏幕宽度低于768px时会加载这个CSS文件 --\u003e \u003clink rel=\"stylesheet\" href=\"/static/css/mobile.css\" media=\"scr","date":"2023-01-04","objectID":"/posts/2023010401/:7:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["css"],"content":"结尾小结 实际开发中更加推荐使用第二种开发模式: 不需要指定大量的@media标签(判断屏幕宽度) 保留的编写CSS样式表的习惯 对于需要适配多种尺寸终端,只需要引用指定的CSS文件 对于旧版网页改造无需破坏原有的样式,直接引入新文件即可 ","date":"2023-01-04","objectID":"/posts/2023010401/:8:0","tags":["css"],"title":"前端多终端自适应网页开发模式","uri":"/posts/2023010401/"},{"categories":["git"],"content":"前言 有时候,我们误提交了某些隐私文件,使用git rm xxx删除后,其实版本库中是有历史记录的,想要删除这些记录,但是又不想删除仓库,重建来提交。那么就想办法删除历史记录了。 我们当然不能直接删除.git文件夹,这将导致git存储库出现不可预知的问题。 注意!这会删除所有的历史记录,谨慎操作 ","date":"2022-08-30","objectID":"/posts/2022083002/:1:0","tags":["git"],"title":"Git删除历史版本,保留当前状态","uri":"/posts/2022083002/"},{"categories":["git"],"content":"操作步骤 要删除所有提交历史记录,但将代码保持在当前状态,可以按照以下方式安全地执行此操作: 创建并切换到latest_branch分支 git checkout --orphan latest_branch 添加所有文件 git add . 提交更改 git commit -am \"删除历史版本记录,初始化仓库\" 删除分支 git branch -D master 将当前分支重命名 git branch -m master 强制更新存储库 git push -f origin master ","date":"2022-08-30","objectID":"/posts/2022083002/:2:0","tags":["git"],"title":"Git删除历史版本,保留当前状态","uri":"/posts/2022083002/"},{"categories":["git"],"content":"前言 虽然不是第一次使用mac,也不是第一次在mac上使用git,但对mac实际上非常不熟悉。每次git上传时多出来的.DS_Store文件虽然不清楚具体做什么,但看上去并没什么问题。git一般也是自己一个人单机使用,就算换机也一般是直接换,没有遇到过两个同时使用的时候,上传.DS_Store也就默认都上传了。 但这次用两个mac,一个mac提交了修改,第二个mac想要拉下来时居然遇到了.DS_Store文件被修改过需要提交再merge。什么?我没改过内容呀?所以这个.DS_Store是什么鬼? .DS_Store是Mac OS用来存储这个文件夹的显示属性的,被作为一种通用的有关显示设置的元数据(比如图标位置等设置)为Finder、Spotlight用。所以在不经意间就会修改这个文件。而文件共享时为了隐私关系将.DS_Store文件删除比较好,因为其中有一些信息在不经意间泄露出去。 ","date":"2022-08-30","objectID":"/posts/2022083001/:1:0","tags":["git"],"title":"Mac中Git忽略.DS_Store文件","uri":"/posts/2022083001/"},{"categories":["git"],"content":"Git中处理方案 ","date":"2022-08-30","objectID":"/posts/2022083001/:2:0","tags":["git"],"title":"Mac中Git忽略.DS_Store文件","uri":"/posts/2022083001/"},{"categories":["git"],"content":"方案一:项目设置.gitignore 仅针对git的处理最naive的想法就是设置.gitignore文件。 .gitignore文件用于忽略文件,官网介绍在这里,规范如下: 所有空行或者以注释符号 # 开头的行都会被 git 忽略,空行可以为了可读性分隔段落,# 表明注释。 第一个 / 会匹配路径的根目录,举个栗子,”/*.html”会匹配”index.html”,而不是”d/index.html”。 通配符 * 匹配任意个任意字符,? 匹配一个任意字符。需要注意的是通配符不会匹配文件路径中的 /,举个栗子,”d/*.html”会匹配”d/index.html”,但不会匹配”d/a/b/c/index.html”。 两个连续的星号 ** 有特殊含义: 以 **/ 开头表示匹配所有的文件夹,例如 **/test.md 匹配所有的test.md文件。 以 /** 结尾表示匹配文件夹内所有内容","date":"2022-08-30","objectID":"/posts/2022083001/:2:1","tags":["git"],"title":"Mac中Git忽略.DS_Store文件","uri":"/posts/2022083001/"},{"categories":["git"],"content":"方案二:全局设置忽略 虽然每个项目配.gitignore文件可以成功,但是每个项目都需要配,嗯,有点烦。我们可以在git的全局进行配置来忽略.DS_Store文件。 设置之前我们先看下现在的git config配置情况(git config官方文档说明): $ git config --list 实际上git配置情况可以在 ~/.gitconfig 文件中查看。 $ vi ~/.gitconfig 通过 :q! 退出后,我们需要建立一个文件,把需要全局忽略的文件路径写入其中。该文件起名为.gitignore_global: $ touch ~/.gitignore_global 然后对这个文件进行修改。 # Mac OS **/.DS_Store 然后对git进行全局设置,让git忽略.gitignore_global中的所有文件: $ git config --global core.e","date":"2022-08-30","objectID":"/posts/2022083001/:2:2","tags":["git"],"title":"Mac中Git忽略.DS_Store文件","uri":"/posts/2022083001/"},{"categories":["nginx"],"content":"场景 使用场景:项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,使用 Nginx 缓存将大幅度提升请求速度。 ","date":"2021-12-21","objectID":"/posts/2021122101/:1:0","tags":["nginx"],"title":"Nginx 内容缓存及常见参数配置","uri":"/posts/2021122101/"},{"categories":["nginx"],"content":"基础 只需要配置 proxy_cache_path 和 proxy_cache 就可以开启内容缓存,前者用来设置缓存的路径和配置,后者用来启用缓存。 http { ... proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { proxy_cache mycache; location / { proxy_pass http://localhost:8000; } } } 对应参数说明: 1.用于缓存的本地磁盘目录是 /path/to/cache/ 2.levels 在 /path/to/cache/ 设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使","date":"2021-12-21","objectID":"/posts/2021122101/:1:1","tags":["nginx"],"title":"Nginx 内容缓存及常见参数配置","uri":"/posts/2021122101/"},{"categories":["nginx"],"content":"Nginx 缓存相关进程 缓存中还涉及两个额外的NGINX进程: cache manager 周期性地启动,检查高速缓存的状态。如果高速缓存大小超过 proxy_cache_path 中 max_size 参数设置的限制,则高速缓存管理器将删除最近访问过的数据。在两次缓存管理器启动的间隔,缓存的数据量可能短暂超过配置的大小。 cache loader 只运行一次,NGINX 开始之后。它将有关以前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会消耗足够的资源来在启动后的最初几分钟内降低 NGINX 的性能。要避免这种情况,请通过在 proxy_cache_path 指令中包含以下参数来配置缓存的迭代加载: loader_threshold - 迭代持续时间,以毫秒为单位(默认情况下 200) loader_files - 一次迭代期间加载的最大项目数(默认情况下 100) lo","date":"2021-12-21","objectID":"/posts/2021122101/:1:2","tags":["nginx"],"title":"Nginx 内容缓存及常见参数配置","uri":"/posts/2021122101/"},{"categories":["nginx"],"content":"其他常用参数 配置示例: proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { ... location / { proxy_cache my_cache; # proxy_cache_key \"$host$request_uri$cookie_user\"; proxy_cache_min_uses 3; proxy_cache_methods GET HEAD POST; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; # proxy_cache_valid any 5m; proxy_pass http://localhost:8000;","date":"2021-12-21","objectID":"/posts/2021122101/:1:3","tags":["nginx"],"title":"Nginx 内容缓存及常见参数配置","uri":"/posts/2021122101/"},{"categories":["nginx"],"content":"清除缓存 需要提前加一个配置,用于标识使用 HTTP PURGE 方法的请求并删除匹配的 URL 对应的缓存。 1.在 http {} 上下文中创建新变量,例如 $purge_method, 他依赖于 $request_method 变量: http { ... map $request_method $purge_method { PURGE 1; default 0; } } 2.在 location {} 块中,已经配置缓存的前提下,引入 proxy_cache_purge 参数来指定清除缓存请求的条件。例如在上一步指定的 $request_method server { listen 80; server_name www.example.com; location / { proxy_pass https://localhost:8002; proxy_cache mycache","date":"2021-12-21","objectID":"/posts/2021122101/:1:4","tags":["nginx"],"title":"Nginx 内容缓存及常见参数配置","uri":"/posts/2021122101/"},{"categories":["nginx"],"content":"Nginx 基于url参数的反向代理加缓存实践 nginx.conf: user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] \"$request\" ' '$status $body_bytes_sent \"$http_referer\" ' '\"$http_user_agent\" \"$http_x_forw","date":"2021-12-21","objectID":"/posts/2021122101/:2:0","tags":["nginx"],"title":"Nginx 内容缓存及常见参数配置","uri":"/posts/2021122101/"},{"categories":["博文收藏"],"content":"一、前言 俗话说,“男怕入错行,女怕嫁错郎”,如果你是互联网/IT 那恭喜你,入对行了,因为: 互联网/IT 行业薪资是第二,仅次于金融行业 薪资排名前列的岗位都是互联网/IT 行业。 好的行业是个好的开始,混的如何,就要看自己的努力了。 ","date":"2021-11-16","objectID":"/posts/2021111601/:1:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"二、职业发展路线 “打工人,打工魂”,优秀的打工人需要时刻思考自己的打工路线图(职业发展路径),做一个有规划、有目标、有追求的打工人。 结合上述两张图,程序员发展路线还是比较丰富的,仔细对比上面两幅图,可以发现一条比较专业路线 初级程序员(工程师)—\u003e 中/高级/资深程序员(工程师)—\u003e 系统架构师—\u003e 初级/高级技术经理—-\u003e 技术(研发)总监—\u003eCTO 接下来,本文从_薪资、技能、职责、岗位特征_等角度一一总结每个阶段。 ","date":"2021-11-16","objectID":"/posts/2021111601/:2:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"三、初级程序员 ","date":"2021-11-16","objectID":"/posts/2021111601/:3:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"3.1 基本特征 计算机、软件相关的童鞋毕业后,大部分会应聘程序员岗位(程序猿、程序猿),英文名 coder/programmer,大家常自嘲叫码农的阶段。 这个角色核心职责:把需求或产品实现为用户可用的软件产品,白话就是:敲代码,从各种 Hello world 开始。 此角色为执行级别,因为经验较少,一般需要求助别人,或与别人一起完(ban)成(zhuan)一个任务。大部分公司会安排一个师傅/老手带你。 ","date":"2021-11-16","objectID":"/posts/2021111601/:3:1","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"3.2 职责(示例) 参与需求分析、设计、评审工作; 执行上级主管安排的工作任务,对负责模块进行数据库表设计、接口文档设计与开发、核心功能开发、冒烟测试 d 等; 对自己负责的工作质量进行把关,主动进行技术与业务知识总结; 负责项目的日常开发维护工作等; 对线上产品出现的较为重大的故障进行分析、排查并且解决或协助解决问题,使产品恢复正常使用; 完成上级安排的其他工作; ","date":"2021-11-16","objectID":"/posts/2021111601/:3:2","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"3.3 任职要求示例(以 Java 为例) JAVA 基础扎实,熟悉 JSP/Servlet、spring 、spring mvc 等; 熟悉 html、css、Jquery、Ajax 、Javascript 等前端技术; 熟悉 SQL 语法 、oracle 数据库; 熟悉 SQL 语法 、oracle 数据库;具有良好的问题分析、解决能力和沟通表达能力,积极主动,具备一定抗压能力; 具有良好的问题分析、解决能力和沟通表达能力,积极主动,具备一定抗压能力; 为人诚恳、诚实、积极、负责; 有 1 年以上经验或优秀应届毕业生; ","date":"2021-11-16","objectID":"/posts/2021111601/:3:3","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"3.4 成长 此阶段大概要经历 3 年,主要是打基础的为主,积累自己的开发经验,掌握开发技巧,熟悉开发流程,也同步锻炼自己的综合素质,比如:总结汇报、演讲、资源协调等等。 在这个阶段,如果你发现自己不适合做开发,可以转向技术之外的岗位:测试、产品、售前等 这个阶段的薪资水平:3K~10K 之间,不包括大厂哦~~ ","date":"2021-11-16","objectID":"/posts/2021111601/:3:4","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"四、中/高级/资深程序员 ","date":"2021-11-16","objectID":"/posts/2021111601/:4:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"4.1 基本特征 如果你在开发岗站稳脚,不出意外,你会一直往这条路上走下去,随着开发技能、业务经验、公司年限的增加,公司会给予你升职加薪的机会,你得职位也会从低-\u003e 高-\u003e 资深 这样的路径成长,至于所需的时间和你平时的积累努力是分不开的。 ","date":"2021-11-16","objectID":"/posts/2021111601/:4:1","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"4.2 职责(示例) 主要有核心技术方案设计、封装组件、核心功能/逻辑代码开发、技术评审等工作 负责后端的模块设计和开发,并负责完成核心代码; 完成模块的设计、编码、测试工作,编写各类技术文档等; 支持解决各项目中提出的定制需求,协调人员及进度控制,把控产品的研发质量; 配合前端开发人员进行程序调试测试,最好也能掌握基本的前端开发技巧; 能够按照负责人的要求进行系统程序设计和数据库设计; 指导中初级软件工程师完成工作任务; ","date":"2021-11-16","objectID":"/posts/2021111601/:4:2","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"4.3 任职资格示例(以 Java 为例) 掌握 JAVA 语言,熟练使用 servlet、JDBC、多线程、网络、IO 等技术,熟悉常见算法及数据结构,有良好的编码习惯; 熟练使用 Spring, Spring Cloud 等开源主流框架,了解框架设计思想及其实现原理; 熟悉 Linux/Unix 系统,熟悉 Oracle、SQLServer、MySQL 等关系型数据库,SQL 功底扎实; 熟悉 Reids、MongoDB 等 NoSQL 数据库。 具备良好的识别和设计通用框架及模块的能力 ","date":"2021-11-16","objectID":"/posts/2021111601/:4:3","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"4.4 成长 这个阶段,你不仅可以完成任务,开始注重代码的质量,能够写出工业级的代码。 你的经验可胜任模块级的系统设计,承担完成较为复杂的技术,能有效的自我管理,有帮助别人快速解决问题(trouble shooting)的能力。 此阶段你需要经历到 7、8 年左右的体验,中间要经历一段深刻自我历练的过程。 有时给人致命一击其实是心里的小蟊贼。一般人在 5 年前后遇到一个门槛,碰到天花板 + 彷徨期,或者你打心眼里不再喜欢编程,可尝试转为其它角色,如产品经理,售前售后支持等岗位,也不失为好选择。 当你做到中高级程序员,基本上组织也会让你当个小组长/主管之类的岗位,让你管理几个小组员,你的思维就要从个人思维转向团队思维了,要多思考团队何去何从。 当我们熬过这段儿,就会“山随平野尽,江入大荒流“,渐入佳境矣。 工资范围:10K~30K ","date":"2021-11-16","objectID":"/posts/2021111601/:4:4","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"五、系统架构师 ","date":"2021-11-16","objectID":"/posts/2021111601/:5:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"5.1 基本特征 到了架构师级别,想必你已经学会降龙十八掌,可登堂入室,成为一位准(lao)专(you)家(tiao)。 我们大喊声:“单打独斗,老衲谁也不惧!“,遂开始领导一众技术高手,指点武功,来设计和完成一个系统,大多是分布式,高并发的系统架构平台。 架构师的任务是为公司产品的业务问题提供高质量技术解决方案。可能每条产品线都设置了架构师,也可能多条生产品线的的后端是由一个架构师设计的平台提供。 ","date":"2021-11-16","objectID":"/posts/2021111601/:5:1","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"5.2 职责(示例) 需求分析:“知彼”有时比“知已”还重要。管理市场,产品等的需求,确立关键需求。坚持技术上的优秀与需求的愿景统一,提升技术负债意识,提供技术选项,风险预判,工期等解决方案。 架构设计:在产品功能中抽取中非功能的需求,由关键需求变成概念型架构。列出功能树,分层治之,如用户界面层、系统交互层,数据管理层。达成高扩展,高可用,高性能,高安全,易运维,易部署,易接入等能力。 功能设计与实现:对架构设计的底层代码级别实现。如公共核心类,接口实现,应用发现规则、接口变更等。 负责核心系统的架构设计,重构、优化现有的技术架构,及关键架构设计的落地实现; 承担业务重点、业内难点的技术攻坚,主导核心组件/服务的编码和上线; 负责架构和质量意识的布道,驱动研发过程的改进和交付质量的提升; 项目售前支持,在技术方面配合客户立项及标书规范的制定、规划设计方案、商务报价、合同相关条款等事宜; 不","date":"2021-11-16","objectID":"/posts/2021111601/:5:2","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"5.3 任职资格示例 本科或以上学历,6 年以上工作经验,3 年以上系统架构设计经验; 掌握微服务框架、分布式架构、缓存、日志、消息等大规模集群技术; 熟悉虚拟化以及 Docker、kubernetes 等容器技术,有 3 年以上云计算设计经验者优先; 熟悉掌握 Nginx/ElasticSearch/Redis/RabbitMQ 等中间件; 主导并参与过大型项目的系统设计与研发; 深刻理解大数据处理(流计算、分布式计算、分布式文件系统、分布式存储等相关技术和实现方法,有架构和设计实践经验; 熟悉大数据解决方案包括 Hadoop、Spark、Storm、机器学习、深度学习等大数据解决方案; 精通 java、scala、python 中的一种或多种语言; 对数据敏感,有严谨的工作思路,良好的沟通能力,和团队合作精神; 高扩展性、高性能和分布式系统的实践及运维经验者优先; 有大型数据仓库实施、","date":"2021-11-16","objectID":"/posts/2021111601/:5:3","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"5.4 成长 成为架构师至少要 6~8 年,经历大大小小的项目。 架构下一步可以继续往技术方向深度发展,也可以往技术管理岗发展。 薪资范围:20K~40K ","date":"2021-11-16","objectID":"/posts/2021111601/:5:4","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"六、技术经理 ","date":"2021-11-16","objectID":"/posts/2021111601/:6:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"6.1 基本特征 技术经理坦率的讲,就是从高级程序员开始分化而来,一部分同学选择继续专研技术,往纵向发展,一部分同学打算觉得未来管理这条路很好,主动选择开始转型管理这个方向,于是才有里技术主管或者经理经理这个称谓。 我还是以阿里为参考,阿里的 M 代表管理方向,你可以通过下图可以清晰的看见 P 系列和 T 系列对应的级 这个时候你就非常清晰了,技术经理本身就是从资深工程师发展而来,很多公司的技术经理根本没有从一线研发做起,大部分就是一个项目经理,带带项目为主,根本无法胜任刚才我讲到的技术经理的工作。 ","date":"2021-11-16","objectID":"/posts/2021111601/:6:1","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"6.2(示例) 负责开发团队的日常管理,制定开发计划、任务分解、工日评估、任务安排等; 负责开发团队的人员培养,制定培养计划,形成人才梯队; 对团队所承担的项目开发进程负责,从技术上对团队提供指导;负责项目的软件开发工作及相关的技术问题的跟踪和解决; 参与公司软件产品或项目的关键性需求分析,以便于能对项目技术、框架选型做出相对比专业的决定; 深入了解公司基础平台,编写符合自身软件产品或项目的编码规范、技术文档、系统设计文档 ; 跟踪技术发展潮流,为公司新基础平台提供合理建议,在未来产品或项目中使用上; 完成直接上级安排的临时或其它工作。 从架构、框架层、平台层等技术方案设计;技术推广、技术视野、新技术引进等维度上制定; ","date":"2021-11-16","objectID":"/posts/2021111601/:6:2","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"6.3 任职资格示例 能力方面 组织能力 技术架构能力 业务分析能力 项目管理能力 沟通表达和讲演能力 培训下属的能力 风险承受能力 团队技术引领能力 意识方面 组织能力建设意识 提高团队和个人绩效意识 ","date":"2021-11-16","objectID":"/posts/2021111601/:6:3","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"七、技术总监 如果一个研发团队超过 20 人,有多条产品线或业务量很大,这时已经有多个技术经理在负责每个业务,这时需要一位技术总监。: ","date":"2021-11-16","objectID":"/posts/2021111601/:7:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"7.1 职责(示例) 根据公司战略规划与年度工作计划,制定中长期技术规划,提升公司的 IT 竞争力; 负责制定公司技术管理体系,包括技术规范、业务流程、项目管理、考核机制等; 全面有效管理研发项目的实施,保证项目的进度和质量控制,并确保项目目标的按期实现; 负责研发项目的技术选型、整体框架设计评审、核心代码开发评审,制定合理的技术路线,解决系统建设,开发效率,运行质量,用户体验中的问题; 主导技术难题攻关,持续提升核心功能的性能,解决各类潜在系统技术风险,保证系统的安全、稳定、快速运行; 负责技术团队的建设与管理,包括培训指导、考核等,全面提升团队技术水平 ","date":"2021-11-16","objectID":"/posts/2021111601/:7:1","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"7.2 任职资格示例 本科及以上学历,计算机及相关专业; 全栈开发者,6 年以上后端开发或系统架构师工作经验, 4 年以上技术团队管理经验; 丰富的产品分析和设计经验,有技术战略推动能力; 有较强的信息规划能力,对信息技术发展有较强的敏锐度,对公司信息化技术发展提供决策性的建议; 具备较强的团队管理能力、项目管理能力、队伍培训能力,丰富的团队管理经验,有 PMP 经验或证书为佳。 ","date":"2021-11-16","objectID":"/posts/2021111601/:7:2","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"八、CTO ","date":"2021-11-16","objectID":"/posts/2021111601/:8:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"8.1 基本特征 首席技术官,英文名 Chief Technology Officer。是与 CEO、COO、CFO 同级的领导者,是技术和业务融合的领袖。 国内与国外对 CTO 的定义有些许不同。 美国对 CTO 的职责是设计公司三年内的产品和服务的技术发展方向,较少参与技术团队的日常管理和项目管理事务。基本是前瞻性的策略思维,比如 Google 的谢尔盖.布林一直保持对技术方向的敏锐,比如无人驾驶汽车,人工智能等走向。 在国内,CTO 大部分则偏重于研发管理,相当于技术总监的 Plus 版。它相当于美国互联网公司常设的工程师副总裁 + CTO 的工作并集。但总体事情比美国的 CTO 层次低,大部分 CTO 的是领导技术团队开发各类产品,解决技术问题,管理不同的项目,排期交付。还有一部分的职能类似于架构师或总工程师,作为技术侧的权威,为下一步的发展方向 做研究探讨,为 CEO 提供建设型","date":"2021-11-16","objectID":"/posts/2021111601/:8:1","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"8.2 职责(示例) 结合公司战略规划,协助公司总裁挖掘企业信息资源、制定企业信息化战略、合理布局企业信息化、评估信息化对企业的价值等; 负责信息流、物流、资金流的整合,完成信息系统的选型实施,收集研究企业内外部的信息,为决策提供依据,负责公司整体 Oracle 全面的集成云平台和云服务的实施与推行情况; 协助企业完成业务流程重组,运用信息管理技术重建企业的决策体系和执行体系。不仅要推动企业信息化的软硬环境优化,而且要为集总裁当好参谋,与各高层管理者一起促进企业内外部商务环境的改善; 负责信息系统建设及正常运营使用,包括建立信息系统体系及相关管理制度、规范及业务流程、标准工具,并提供关于信息技术的相关咨询、培训,推动并监督信息技术资源的建立及充分利用; 负责研究和拟定公司未来三至五年信息化建设战略规划,落实公司信息化建设计划;跟进各信息化作业实施进度及质量,对信息化投入产出负责;推进信息化","date":"2021-11-16","objectID":"/posts/2021111601/:8:2","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"8.3 任职资格示例 全日制本科及以上学历,计算机、信息管理、通信工程相关专业,精通 JAVA,懂.NET; 精通现代企业经营管理,有较丰富的企业管理经验,有大型食品制造企业大数据系统建立经验优先考虑; 10 年以上信息化管理相关工作经验,综合性集团公司背景优先考虑; 有知名企业公司相关岗位任职经验优先考虑; 熟悉移动互联、物联网、大数据、O2O 等发展趋势,对综合型业务集团信息化建设有全局的认识,对行业的新技术如大数据/人工智能有一定的研究及经验; 掌握基本的 IT 软件开发技术工具,有国内外主流 ERP 系统上线实施管理经历优先考虑; 熟悉 OA、ERP、CRM、WMS 等常用信息系统,熟悉用友、SAP、Oracle 等项目实施与管理经验; 独立组织实施过大型企业 IT 项目,熟悉企业内部信息系统的架构、运作和管理; 具备丰富软件系统分析、软件系统架构经验; 具备较强的数据安全意识,保","date":"2021-11-16","objectID":"/posts/2021111601/:8:3","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"8.4 成长 CTO 做的事情,是商业、产品、技术、管理、团队相平衡的综合统管,公司的技术研发方向与重点商业化的结果负责,激励员工,营造工程师文化。 而技术总监主要是协调团队内部各个资源,引入工具,和方法提升工作效率。 技术经理角色相对具体,绩效考核,产品落地,执行优胜劣汰的规则。 正像《少有人走的路》,每个人的成长路径都不同,但无一不是兴趣与使命驱动——无论你是程序员,技术经理,还是在 CTO 的角色。大家一起发挥潜力,去迎接不期而遇的挑战与胜利后的曼妙风光。 ","date":"2021-11-16","objectID":"/posts/2021111601/:8:4","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":["博文收藏"],"content":"九、附录:企业各职位英文缩写 简称 释义 GM(General Manager) 总经理 VP(Vice President) 副总裁 FVP(First Vice President) 第一副总裁 AVP(Assistant Vice President) 副总裁助理 CEO(Chief Executive Officer) 首席执行官,类似总经理、总裁,是企业的法人代表 COO(Chief Operations Officer) 首席运营官,类似常务总经理 CFO(Chief Financial Officer) 首席财务官,类似财务总经理 CIO(Chief Information Officer) 首席信息官,主管企业信息的收集和发布 CTO(Chief technology officer) 首席技术官 类似总工程师 HRD(Human Resource Director) 人力","date":"2021-11-16","objectID":"/posts/2021111601/:9:0","tags":["修炼"],"title":"深度分析 IT 职业发展路线,做一个透彻的打工人","uri":"/posts/2021111601/"},{"categories":null,"content":"Studio 3T是我用过最好的用的Mongodb客户端,Mac系统未升级到Big Sur前一直使用2019.3.0版本加 data-man-mongodb-ent-2019.3.0.jar使用,直到升级Big Sur后2019.3.0死活打不开了,重新安装,换别的破解版本都不行。目前使用Studio 3T 2020.8.0 加 data-man-mongodb-ent-2019.3.0.jar版本成功在Big Sur上破解运行了,下面分享一下资源和流程 下载地址:Studio-3T-for-mac_x86_11.4.zip 解压获得文件如下: 资源包 安装前先用clear.sh清理原来的缓存及文件 安装 Studio-3T-20200800.dmg 版本 安装完后打开软件让其初始化缓存,什么也不干直接退出 打开 应用程序 \u003e 右键“显示包内容” \u003e 打开Contents/Resource","date":"2021-07-02","objectID":"/posts/2021070201/:0:0","tags":null,"title":"Intel MacOs Big Sur 11.4系统Studio 3T破解","uri":"/posts/2021070201/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"RabbitMQ简介 以熟悉的电商场景为例,如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就需要消息队列登场了。 消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。 RabbitMQ就是这样一款我们苦苦追寻的消息队列。RabbitMQ是一个开源的消息代理的队列服","date":"2019-07-23","objectID":"/posts/20190723/:0:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"普通模式 默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得","date":"2019-07-23","objectID":"/posts/20190723/:1:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"镜像模式 把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。 ubuntu下安装RabbitMQ集群 ","date":"2019-07-23","objectID":"/posts/20190723/:2:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"1.配置节点hosts 先配置节点hosts,用于集群,再安装RabbitMQ, 不然安装后可能读不到配置的hosts。如果有自建DNS更佳。 vim /etc/hosts #在每个节点上编辑/etc/hosts文件写入以下内容 192.168.10.101 node1 192.168.10.102 node2 192.168.10.103 node3 ","date":"2019-07-23","objectID":"/posts/20190723/:3:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"2.rabbitmq-server安装 以ubuntu为例,使用下面快速安装脚本 #!/bin/sh ## 官方最新版安装脚本 ## Install RabbitMQ signing key curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add - ## Install apt HTTPS transport sudo apt-get install apt-transport-https ## Add Bintray repositories that provision latest RabbitMQ and Erlang 21.x releases sudo tee /etc/apt/so","date":"2019-07-23","objectID":"/posts/20190723/:4:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"3.在每个节点启用管理插件 sudo rabbitmq-plugins enable rabbitmq_management sudo rabbitmq-plugins enable rabbitmq_tracing #如果服务已经在启动则先执行 rabbitmqctl stop_app #然后再执行rabbitmq-plugins enable #最后重新start:rabbitmqctl start_app ","date":"2019-07-23","objectID":"/posts/20190723/:5:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"4.加入集群 因为RabbitMQ集群是基于erlang同步的,所以先配置使各个节点 中 .erlang.cookie文件一致。 #启动集群前先统一所有节点.erlang.cookie文件,注意文件权限 scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/ #systemctl start rabbitmq-server.service 启动所有节点 #假定node1是主节点, 其他节点依次执行 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@node1 #node1的名称与 rabbitmqctl cluster_status 中的信息一致 #rabbitmqctl join_cluster rabbit@node1","date":"2019-07-23","objectID":"/posts/20190723/:6:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"5.创建RabbitMQ用户 设置用户命令, 建议创建好集群后再设置, 不然会被集群配置覆盖 rabbitmqctl add_user sunday sunday # 创建账号 rabbitmqctl set_user_tags sunday administrator # 设置用户角色 rabbitmqctl set_permissions -p \"/\" sunday \".*\" \".*\" \".*\" # 设置用户权限 rabbitmqctl list_users # 查看用户列表 rabbitmqctl change_password username password # 修改用户密码 #其他命令 rabbitmqctl status #查看服务信息 rabbitmqctl cluster_status #查看集群状态 Cluster status of node rabbit@node","date":"2019-07-23","objectID":"/posts/20190723/:7:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["消息中间件","中间件","消息队列","RabbitMQ"],"content":"6.命令行开启镜像策略 #开启所有队列为镜像队列\"^\"匹配名称为所有, \"^ha.\"匹配名称为ha开头的 rabbitmqctl set_policy ha-all \"^\" '{\"ha-mode\":\"all\"}' rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority] -p Vhost: 可选参数,针对指定vhost下的queue进行设置 Name: policy的名称 Pattern: queue的匹配模式(正则表达式) Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes all:表示在集群中所有的节点上进行镜像 exactly:表示在指定个数的节点上进行镜像,节点的个","date":"2019-07-23","objectID":"/posts/20190723/:8:0","tags":["RabbitMQ","消息中间件"],"title":"ubuntu下RabbitMQ安装及集群配置","uri":"/posts/20190723/"},{"categories":["Nginx"],"content":"Nginx conf 配置 server { listen 80; server_name 10.43.0.0; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location /build_results","date":"2019-06-15","objectID":"/posts/20190615/:0:1","tags":["Nginx","文件下载服务"],"title":"Nginx作为文件下载服务器","uri":"/posts/20190615/"},{"categories":["Nginx"],"content":"配置Basic Auth权限认证 我们需要htpassword来创建和生成加密的用户用于基础认证(Basic Authentication) ubuntu 安装 sudo apt-get install apache2-utils htpasswd 命令参数 -c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容. -n 不更新passwordfile,直接显示密码 -m 使用MD5加密(默认) -d 使用CRYPT加密(默认) -p 使用普通文本格式的密码 -s 使用SHA加密 -b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互 -D 删除指定的用户 sudo htpasswd -c /etc/nginx/passwd Postgres #创建密码文件以及用户名= #/etc/nginx/passwd 文件格式如","date":"2019-06-15","objectID":"/posts/20190615/:0:2","tags":["Nginx","文件下载服务"],"title":"Nginx作为文件下载服务器","uri":"/posts/20190615/"},{"categories":["Nginx"],"content":"优化显示页面 对日期进行格式化,并添加导航路径 #add_after_body /autoindex.html; #添加html内容, 此文件应放置在 location / 配置的 root目录下 \u003cscript\u003e var formatDate = function (datetime, format) { if (!isNaN(Date.parse(datetime))) { d = new Date(datetime); pad = function (s) { return s \u003c 10 ? '0' + s : s }; mon = function (m) { return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][m] }; datetime = for","date":"2019-06-15","objectID":"/posts/20190615/:0:3","tags":["Nginx","文件下载服务"],"title":"Nginx作为文件下载服务器","uri":"/posts/20190615/"},{"categories":["css"],"content":"Chrome滚动条 /*滑道*/ ::-webkit-scrollbar { width: 5px; height: 5px; background-color: #f7f7f7; } ::-webkit-scrollbar-track { box-shadow: inset 0 0 6px #f7f7f7; border-radius: 10px; } /*滑块*/ ::-webkit-scrollbar-thumb { background-color: #222; border-radius: 10px; } ::-webkit-scrollbar-thumb:hover { background-color: #222; } IE滚动条 \u003cstyle type=\"text/css\"\u003e html{ /*三角箭头的颜色*/ scrollbar-arrow-color: #f4ae21;","date":"2018-08-14","objectID":"/posts/2018081401/:0:0","tags":["css"],"title":"CSS自定义滚动条(IE和chrome)","uri":"/posts/2018081401/"},{"categories":["爬虫"],"content":" 前言 前阵子遇到一个需求,需要爬取学信网学历的查询结果进行解析并截图留证,利用java完成了爬取的html解析功能后发现截图较为困难。我偶然发现了 phantomjs,可以由服务端去做类似爬虫的操作来爬取html和保存图片,正好满足上述两个需求。 phantomjs 官方网站: phantomjs.org phantomjs 是 一个基于 webkit 内核的无头浏览器,没有 UI 界面。它就是一个浏览器,只是内部的点击、翻页等人为相关操作需要程序设计实现。 提供了 javascript API 接口,可以通过 js 直接与 webkit 内核交互,在此之上可以结合 Java 语言等,通过 Java 调用 js 等相关操作,从而解决了以前 c/c++ 才能比较好的基于 webkit 开发优质采集器的限制。 提供了 windows、linux、mac 等不同 OS 的安装使用包,也就是说可","date":"2018-01-29","objectID":"/posts/20180129/:0:0","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"常用内置对象 // 获得系统操作对象,包括命令行参数、phantomjs系统设置等信息 var system = require('system'); // 获取操作dom或web网页的对象,通过它可以打开网页、接收网页内容、request、response参数,其为最核心对象。 var page = require('webpage'); // 获取文件系统对象,通过它可以操作操作系统的文件操作,包括read、write、move、copy、delete等。 var fs = require('fs'); ","date":"2018-01-29","objectID":"/posts/20180129/:1:0","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"常用API // 通过page对象通过url链接打开页面,加载完成后回调 page.open(url, function (status) {} // 当page.open调用时,会首先执行该函数,在此可以预置一些参数或函数,用于后边的回调函数中 page.onLoadStarted = function() {} // page的所要加载的资源在加载过程中,失败回调处理 page.onResourceError = function(resourceError) {} // page的所要加载的资源在发起请求时,可以回调该函数 page.onResourceRequested = function(requestData, networkRequest) {} // page的所要加载的资源在加载过程中,每加载一个相关资源,都会在此先做出响应, // 它相当于http头部分,核心回调对象","date":"2018-01-29","objectID":"/posts/20180129/:2:0","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"调用方式 $ /bin/phantomjs [配置文件(js文件)] [参数1] [参数2] [参数3] ... 实现 java使用java.lang.Runtime调用,接收返回结果进行操作 ","date":"2018-01-29","objectID":"/posts/20180129/:3:0","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"config.js 配置文件内容 var page = require('webpage').create(); var system = require('system'); var ssionid = system.args[1]; var address = system.args[2]; // 请求地址,url var output = system.args[3]; // 输出 var pageWidth = 1366; //初始化游览器宽 var pageHeight = 1080; //初始化游览器高 page.viewportSize = { width: pageWidth, height: pageHeight }; //初始化游览器 // 添加ssionid至cookie phantom.addCookie({ 'name' : 'JSESSIONID', 'valu","date":"2018-01-29","objectID":"/posts/20180129/:4:0","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"配置文件总结 output为输出方式, 为输出的绝对路径(例如:‘c:/123.jpg’), 以后缀决定文件格式. 建议使用pdf格式, pdf格式目前测试来看没有出现问题, 图片则出现过背景颜色丢失的情况 console.log(page.renderBase64(‘JPEG’)) 以Base64的格式输出至控制台 这里是因为同时进行html爬取和截图快照, 所以不使用Base64的方式, 且输出的字符串有长度限制, 建议不要大量console.log(), 否则后面的内容可能会缺失 page.evaluate内可进行dom操作, 这里只取了html, 同理可有规则的针对爬取想要的页面信息 addCookie会返回一个boolean值, 有见到别人的文章判断了这个值才进行后续操作, 但我测试来看是有bug的, 即使成功也返回了false 可以利用dom操作获取元素的位置及宽高对clipR","date":"2018-01-29","objectID":"/posts/20180129/:4:1","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"java封装 public String phantomjs(String confPath, String url, String ssionId, String outPath) { StringBuilder sb = new StringBuilder(); InputStream is = null; InputStreamReader isr = null; BufferedReader br = null; try { String cmd = \"phantomjs \" + confPath + \" \" + ssionId + \" \" + url + \" \" + outPath; Process ps = Runtime.getRuntime().exec(cmd); is = ps.getInputStream(); isr = new InputStreamReader(","date":"2018-01-29","objectID":"/posts/20180129/:5:0","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["爬虫"],"content":"java封装总结 我这里直接使用phantomjs是因为设置了环境变量, 否则请使用文件的绝对路径 编码格式尤为重要, 否则将出现html乱码问题 总结 phantomjs的功能非常强大,使用起来也是非常简单的。本文中只是一些简单的使用,更多的请自行查看官方API。 致谢 这是我第一篇hexo文章,在Bingo phantomjs的文章中得到了大量素材与灵感,以此致谢。 ","date":"2018-01-29","objectID":"/posts/20180129/:5:1","tags":["phantomjs","爬虫","网页快照","javascript","java"],"title":"java调用phantomjs爬取网页及快照","uri":"/posts/20180129/"},{"categories":["测试"],"content":"欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown: 整理知识,学习笔记 发布日记,杂文,所见所想 撰写发布技术文稿(代码支持) 撰写发布学术论文(LaTeX 公式支持) $$x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}.$$ $$\\sum_{i=0}^N\\int_{a}^{b}g(t,i)\\text{d}t$$ 除了您现在看到的这个 Cmd Markdown 在线版本,您还可以前往以下网址下载: ","date":"2017-12-20","objectID":"/posts/20171220/:1:0","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"Windows/Mac/Linux 全平台客户端 Windows/Mac/Linux 全平台客户端 请保留此份 Cmd Markdown 的欢迎稿兼使用说明,如需撰写新稿件,点击顶部工具栏右侧的 新文稿 或者使用快捷键 Ctrl+Alt+N。 ","date":"2017-12-20","objectID":"/posts/20171220/:1:1","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"什么是 Markdown Markdown 是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题,分割不同的段落,粗体 或者 斜体 某些文字,更棒的是,它还可以 ","date":"2017-12-20","objectID":"/posts/20171220/:1:2","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"1. 制作一份待办事宜 Todo 列表 支持以 PDF 格式导出文稿 改进 Cmd 渲染算法,使用局部渲染技术提高渲染效率 新增 Todo 列表功能 修复 LaTex 公式渲染问题 新增 LaTex 公式编号功能 Cmd Markdown 开发 改进 Cmd 渲染算法,使用局部渲染技术提高渲染效率 支持以 PDF 格式导出文稿 新增Todo列表功能 语法参考 改进 LaTex 功能 修复 LaTex 公式渲染问题 新增 LaTex 公式编号功能 语法参考 七月旅行准备 准备邮轮上需要携带的物品 浏览日本免税店的物品 购买蓝宝石公主号七月一日的船票 ","date":"2017-12-20","objectID":"/posts/20171220/:1:3","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"2. 书写一个质能守恒公式 $$E=mc^2$$ ","date":"2017-12-20","objectID":"/posts/20171220/:1:4","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"3. 高亮一段代码 @requires_authorization class SomeClass: pass if __name__ == '__main__': # A comment print 'hello world' ","date":"2017-12-20","objectID":"/posts/20171220/:1:5","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"4. 高效绘制流程图 流程图使用插件:hexo-filter-flowchart 流程图 st=\u003estart: Start op=\u003eoperation: Your Operation cond=\u003econdition: Yes or No? e=\u003eend st-\u003eop-\u003econd cond(yes)-\u003ee cond(no)-\u003eop ","date":"2017-12-20","objectID":"/posts/20171220/:1:6","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"5. 高效绘制序列图 序列图使用插件:hexo-filter-sequence 序列图 Alice-\u003eBob: Hello Bob, how are you? Note right of Bob: Bob thinks Bob--\u003eAlice: I am good thanks! ","date":"2017-12-20","objectID":"/posts/20171220/:1:7","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"6. 高效绘制甘特图 甘特图 不支持甘特图 title 项目开发流程 section 项目确定 需求分析 :a1, 2016-06-22, 3d 可行性报告 :after a1, 5d 概念验证 : 5d section 项目实施 概要设计 :2016-07-05 , 5d 详细设计 :2016-07-08, 10d 编码 :2016-07-15, 10d 测试 :2016-07-22, 5d section 发布验收 发布: 2d 验收: 3d ","date":"2017-12-20","objectID":"/posts/20171220/:1:8","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"7. 绘制表格 项目 价格 数量 计算机 $1600 5 手机 $12 12 管线 $1 234 ","date":"2017-12-20","objectID":"/posts/20171220/:1:9","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"8. 更详细语法说明 想要查看更详细的语法说明,可以参考我们准备的 [Cmd Markdown 简明语法手册][1],进阶用户可以参考 [Cmd Markdown 高阶语法手册][2] 了解更多高级功能。 总而言之,不同于其它 所见即所得 的编辑器:你只需使用键盘专注于书写文本内容,就可以生成印刷级的排版格式,省却在键盘和工具栏之间来回切换,调整内容和格式的麻烦。Markdown 在流畅的书写和印刷级的阅读体验之间找到了平衡。 目前它已经成为世界上最大的技术分享网站 GitHub 和 技术问答网站 StackOverFlow 的御用书写格式。 ","date":"2017-12-20","objectID":"/posts/20171220/:1:10","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"什么是 Cmd Markdown 您可以使用很多工具书写 Markdown,但是 Cmd Markdown 是这个星球上我们已知的、最好的 Markdown 工具——没有之一 :)因为深信文字的力量,所以我们和你一样,对流畅书写,分享思想和知识,以及阅读体验有极致的追求,我们把对于这些诉求的回应整合在 Cmd Markdown,并且一次,两次,三次,乃至无数次地提升这个工具的体验,最终将它演化成一个 编辑/发布/阅读 Markdown 的在线平台——您可以在任何地方,任何系统/设备上管理这里的文字。 ","date":"2017-12-20","objectID":"/posts/20171220/:2:0","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"1. 实时同步预览 我们将 Cmd Markdown 的主界面一分为二,左边为编辑区,右边为预览区,在编辑区的操作会实时地渲染到预览区方便查看最终的版面效果,并且如果你在其中一个区拖动滚动条,我们有一个巧妙的算法把另一个区的滚动条同步到等价的位置,超酷! ","date":"2017-12-20","objectID":"/posts/20171220/:2:1","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"2. 编辑工具栏 也许您还是一个 Markdown 语法的新手,在您完全熟悉它之前,我们在 编辑区 的顶部放置了一个如下图所示的工具栏,您可以使用鼠标在工具栏上调整格式,不过我们仍旧鼓励你使用键盘标记格式,提高书写的流畅度。 ","date":"2017-12-20","objectID":"/posts/20171220/:2:2","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"3. 编辑模式 完全心无旁骛的方式编辑文字:点击 编辑工具栏 最右侧的拉伸按钮或者按下 Ctrl + M,将 Cmd Markdown 切换到独立的编辑模式,这是一个极度简洁的写作环境,所有可能会引起分心的元素都已经被挪除,超清爽! ","date":"2017-12-20","objectID":"/posts/20171220/:2:3","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"4. 实时的云端文稿 为了保障数据安全,Cmd Markdown 会将您每一次击键的内容保存至云端,同时在 编辑工具栏 的最右侧提示 已保存 的字样。无需担心浏览器崩溃,机器掉电或者地震,海啸——在编辑的过程中随时关闭浏览器或者机器,下一次回到 Cmd Markdown 的时候继续写作。 ","date":"2017-12-20","objectID":"/posts/20171220/:2:4","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"5. 离线模式 在网络环境不稳定的情况下记录文字一样很安全!在您写作的时候,如果电脑突然失去网络连接,Cmd Markdown 会智能切换至离线模式,将您后续键入的文字保存在本地,直到网络恢复再将他们传送至云端,即使在网络恢复前关闭浏览器或者电脑,一样没有问题,等到下次开启 Cmd Markdown 的时候,她会提醒您将离线保存的文字传送至云端。简而言之,我们尽最大的努力保障您文字的安全。。~ ","date":"2017-12-20","objectID":"/posts/20171220/:2:5","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"6. 管理工具栏 为了便于管理您的文稿,在 预览区 的顶部放置了如下所示的 管理工具栏: 通过管理工具栏可以: 发布:将当前的文稿生成固定链接,在网络上发布,分享 新建:开始撰写一篇新的文稿 删除:删除当前的文稿 导出:将当前的文稿转化为 Markdown 文本或者 Html 格式,并导出到本地 列表:所有新增和过往的文稿都可以在这里查看、操作 模式:切换 普通/Vim/Emacs 编辑模式 ","date":"2017-12-20","objectID":"/posts/20171220/:2:6","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"7. 阅读工具栏 通过 预览区 右上角的 阅读工具栏,可以查看当前文稿的目录并增强阅读体验。 工具栏上的五个图标依次为: 目录:快速导航当前文稿的目录结构以跳转到感兴趣的段落 视图:互换左边编辑区和右边预览区的位置 主题:内置了黑白两种模式的主题,试试 黑色主题,超炫! 阅读:心无旁骛的阅读模式提供超一流的阅读体验 全屏:简洁,简洁,再简洁,一个完全沉浸式的写作和阅读环境 ","date":"2017-12-20","objectID":"/posts/20171220/:2:7","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"8. 阅读模式 在 阅读工具栏 点击 或者按下 Ctrl+Alt+M 随即进入独立的阅读模式界面,我们在版面渲染上的每一个细节:字体,字号,行间距,前背景色都倾注了大量的时间,努力提升阅读的体验和品质。 ","date":"2017-12-20","objectID":"/posts/20171220/:2:8","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"9. 标签、分类和搜索 在编辑区任意行首位置输入以下格式的文字可以标签当前文档: 标签: 未分类 标签以后的文稿在【文件列表】(Ctrl+Alt+F)里会按照标签分类,用户可以同时使用键盘或者鼠标浏览查看,或者在【文件列表】的搜索文本框内搜索标题关键字过滤文稿,如下图所示: ","date":"2017-12-20","objectID":"/posts/20171220/:2:9","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["测试"],"content":"10. 文稿发布和分享 在您使用 Cmd Markdown 记录,创作,整理,阅读文稿的同时,我们不仅希望它是一个有力的工具,更希望您的思想和知识通过这个平台,连同优质的阅读体验,将他们分享给有相同志趣的人,进而鼓励更多的人来到这里记录分享他们的思想和知识,尝试点击 (Ctrl+Alt+P) 发布这份文档给好友吧! 再一次感谢您花费时间阅读这份欢迎稿,点击 (Ctrl+Alt+N) 开始撰写新的文稿吧!祝您在这里记录、阅读、分享愉快! ","date":"2017-12-20","objectID":"/posts/20171220/:2:10","tags":["test"],"title":"Cmd Markdown 复制过来的语法测试","uri":"/posts/20171220/"},{"categories":["MongoDB","数据同步","数据备份"],"content":" #!/bin/bash #锁定脚本执行目录 DIR=\"$( cd \"$( dirname \"$0\" )\" \u0026\u0026 pwd )\" cd \"${DIR}\" #指定执行命令 MONGODUMP=mongodump MONGORESTORE=mongorestore #设置tmp或备份目录 BACKUP_DIR=\"./sync/backup\" NOW=`date +\"%Y-%m-%d-%H%M\"` #源数据库 DB_SRC_HOST=\"host:port\" DB_SRC_USER=user DB_SRC_PASSWD=passwd DB_SRC_NAME=database #对象数据库 DB_DES_HOST=\"host:port\" DB_DES_USER=user DB_DES_PASSWD=passwd DB_DES_NAME=database #指定需要同步的表名称 COLLECTIONS=","date":"2017-11-21","objectID":"/posts/20171121/:0:0","tags":["MongoDB"],"title":"MongoDB快速同步脚本","uri":"/posts/20171121/"},{"categories":["树莓派","Raspberry Pi"],"content":"入手raspberry pi3,觉着还是刷个centos系统比较顺手。整理了一下刷centos后WIFI问题解决方式。 ","date":"2017-08-21","objectID":"/posts/20170821/:0:0","tags":["树莓派","Raspberry Pi","RPI3"],"title":"树莓派3安装centos7的无线WIFI模块","uri":"/posts/20170821/"},{"categories":["树莓派","Raspberry Pi"],"content":"驱动安装 # 直接执行下面命令即可,如果没有网络就使用u盘拷贝到对应的目录下 curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/54bab3d6a6d43239c71d26464e6e10e5067ffea7/brcm80211/brcm/brcmfmac43430-sdio.bin \u003e /usr/lib/firmware/brcm/brcmfmac43430-sdio.bin curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/54bab3d6a6d43239c71d26464e6e10e5067ffea7/brcm80211/brcm/brcmfmac43430-sdio.txt \u003e /usr/lib/firmware/b","date":"2017-08-21","objectID":"/posts/20170821/:0:1","tags":["树莓派","Raspberry Pi","RPI3"],"title":"树莓派3安装centos7的无线WIFI模块","uri":"/posts/20170821/"},{"categories":["树莓派","Raspberry Pi"],"content":"查看无线网卡并连接WIFI nmcli d nmcli d wifi #查看周围的wifi nmcli d wifi connect yourSSID password 'yourpassword' #连接wifi SSID就是WIFI名称 nmcli d show wlan0 #查看wlan0的状态 ","date":"2017-08-21","objectID":"/posts/20170821/:0:2","tags":["树莓派","Raspberry Pi","RPI3"],"title":"树莓派3安装centos7的无线WIFI模块","uri":"/posts/20170821/"},{"categories":["树莓派","Raspberry Pi"],"content":"设置静态IP #设置网络配置信息vi /etc/sysconfig/network-script/ifcfg-???? #????是wifi的名字 BOOTPROTO=static #静态IP IPADDR=192.168.31.160 #IP地址 GATEWAY=192.168.31.1 #默认网关 NETMASK=255.255.255.0 #子网掩码 ","date":"2017-08-21","objectID":"/posts/20170821/:0:3","tags":["树莓派","Raspberry Pi","RPI3"],"title":"树莓派3安装centos7的无线WIFI模块","uri":"/posts/20170821/"},{"categories":["树莓派","Raspberry Pi"],"content":"修改DNS # vi /etc/resolv.conf #修改以下内容 nameserver 8.8.8.8 #google域名服务器 nameserver 8.8.4.4 #google域名服务器 223.5.5.5 阿里dns nameserver 114.114.114.114 ","date":"2017-08-21","objectID":"/posts/20170821/:0:4","tags":["树莓派","Raspberry Pi","RPI3"],"title":"树莓派3安装centos7的无线WIFI模块","uri":"/posts/20170821/"},{"categories":null,"content":"👋 Hi, I’m MidAug 从业务架构到云端落地,多年智能座舱云端语音研发经验,专注技术深度与工程效率 📍 上海 · 🎓 本科 · 📧 days0814@gmail.com · 🐙 github.com/midaug · 🌐 100180.xyz ","date":"0001-01-01","objectID":"/about/:1:0","tags":null,"title":"About","uri":"/about/"},{"categories":null,"content":"🛠️ Tech Stack ☕ 后端 — Java Spring Boot Spring Cloud MyBatis Nacos 🖥️ 前端 — Vue ElementUI JS/HTML/CSS 💾 存储 \u0026 消息 — MySQL MongoDB Redis ES Kafka RabbitMQ RocketMQ ☁️ 云原生 \u0026 DevOps — Docker K8S Helm CI/CD Nginx APISIX Prometheus Grafana ELK 📊 大数据 — Hadoop Spark Flink 🤖 AI 工程化 — LLM NLU VLM TTS Agent MCP Agentic ","date":"0001-01-01","objectID":"/about/:1:1","tags":null,"title":"About","uri":"/about/"},{"categories":null,"content":"✨ Highlights 🏗️ 微服务架构 — 高可用系统设计与落地 🚀 性能调优 — 单接口 200 → 4000+ QPS 📈 高吞吐 — 日均 20 亿+ 日志处理,4w+ QPS 🔐 高可用 — SLA 99.9%+,百万级用户在线 🤖 AI 落地 — NLU / TTS / Agent 全链路 ","date":"0001-01-01","objectID":"/about/:1:2","tags":null,"title":"About","uri":"/about/"},{"categories":null,"content":"🔭 Exploring AI Agent Agentic MCP VLM 视觉理解 AI Coding ","date":"0001-01-01","objectID":"/about/:1:3","tags":null,"title":"About","uri":"/about/"},{"categories":null,"content":" 欢迎访问本网站。在使用本网站前,请仔细阅读以下声明。访问或使用本网站即视为您同意并接受本声明的全部条款。 ","date":"0001-01-01","objectID":"/disclaimer/:0:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"📝 内容性质 本网站为个人非营利性技术博客,所有内容仅供学习、交流与知识分享之用。 网站内容仅代表作者个人观点,不代表任何机构、公司或组织的立场。 技术文章中的代码、配置、方案等内容基于作者个人实践经验,不构成任何形式的专业建议。读者应根据自身实际情况独立判断和决策。 ","date":"0001-01-01","objectID":"/disclaimer/:1:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"⚠️ 准确性声明 本网站尽力确保所提供信息的准确性与时效性,但不对内容的完整性、正确性或适用性作出任何保证或承诺。 技术内容可能因软件版本更新、环境差异等因素而失效,读者在使用前请自行验证。 因使用本网站信息而导致的任何直接或间接损失,本网站不承担任何法律责任。 ","date":"0001-01-01","objectID":"/disclaimer/:2:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"🤖 AI 生成内容声明 本网站部分文章可能借助人工智能工具(如大语言模型)辅助创作。 AI 辅助生成的内容已经过作者审阅,但不保证其完全准确。如发现错误,欢迎反馈指正。 读者在引用或依赖相关内容前,请自行进行核实与验证。 ","date":"0001-01-01","objectID":"/disclaimer/:3:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"©️ 版权声明 ","date":"0001-01-01","objectID":"/disclaimer/:4:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"原创文章 本网站所有原创文章的版权均归作者所有,采用 CC BY-NC-SA 4.0 知识共享许可协议。 转载时请注明作者及原文链接,且不得用于商业目的。 转载或引用时请保持原文完整性,不得进行歪曲或篡改。 ","date":"0001-01-01","objectID":"/disclaimer/:4:1","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"转载文章 本网站转载的文章均注明来源及原作者,版权归原作者所有。 如原文章有明确的版权声明,本网站将严格遵循。 如原文章注明\"禁止转载\",本网站不会进行转载。 ","date":"0001-01-01","objectID":"/disclaimer/:4:2","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"📩 侵权处理 若您是某篇文章的版权所有者,且认为本网站的转载侵犯了您的权益,请通过邮件联系:days0814@gmail.com。 请在邮件中提供: 您的身份证明或权利证明 涉嫌侵权内容的具体链接 您的处理要求(删除/修改/标注等) 本网站将在收到邮件后 3 个工作日内 进行处理。 ","date":"0001-01-01","objectID":"/disclaimer/:5:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"🔗 第三方链接 本网站可能包含指向第三方网站或服务的链接,这些链接仅为方便读者参考。 第三方网站的内容、隐私政策及安全性不在本网站控制范围内,本网站对其不承担任何责任。 点击第三方链接即表示您理解并同意离开本网站,请自行评估相关风险。 ","date":"0001-01-01","objectID":"/disclaimer/:6:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"🛡️ 责任限制 在适用法律允许的最大范围内,本网站及其作者不对以下情形承担任何责任: 因使用或无法使用本网站内容而导致的任何直接、间接、附带或衍生损失 数据丢失、业务中断或利润损失 计算机病毒、恶意程序或其他有害组件造成的损害 因不可抗力(如自然灾害、网络故障、政策变化等)导致的服务中断 ","date":"0001-01-01","objectID":"/disclaimer/:7:0","tags":null,"title":"免责声明","uri":"/disclaimer/"},{"categories":null,"content":"🔄 声明更新 本网站保留随时修改本声明的权利,更新后的声明将在此页面发布。 继续使用本网站即视为您接受更新后的声明。 最后更新日期:2026 年 6 月 23 日 ","date":"0001-01-01","objectID":"/disclaimer/:8:0","tags":null,"title":"免责声明","uri":"/disclaimer/"}]