<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>贤民的博客</title><link>https://www.xianmin.org/</link><description>Recent content on 贤民的博客</description><follow_challenge><feedId>57631672911801359</feedId><userId>51859777516028928</userId></follow_challenge><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 12 Sep 2025 01:35:00 +0000</lastBuildDate><atom:link href="https://www.xianmin.org/index.xml" rel="self" type="application/rss+xml"/><item><title>硅谷魔法画布 AI Agent 招聘全栈开发（远程友好）</title><link>https://www.xianmin.org/post/weekly/016/</link><pubDate>Fri, 12 Sep 2025 01:35:00 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/016/</guid><description>&lt;p>&lt;img alt="Jaaz magic" src="https://www.xianmin.org/images/2025/09/jaaz.png">&lt;/p>
&lt;p>大家好，我们是 Jaaz (&lt;a href="https://jaaz.app">https://jaaz.app&lt;/a>) —— 一个开源的“魔法画布”AI 设计 Agent，专注于 AI 图像/视频生成，目前在全球已经有快速增长的用户和社区。我们的产品已经获得硅谷顶级投资机构支持，GitHub Star 4k+ (&lt;a href="https://github.com/11cafe/jaaz">https://github.com/11cafe/jaaz&lt;/a>)，发展很快。&lt;/p>
&lt;p>现在我们在招募一位全栈开发工程师，希望你有扎实的前后端开发经验，如果有 AI 生图生视频工具的经验更好（如 mj， veo， 即梦， nanobanana 等），一起把 Jaaz 打造成世界级的 AI 创意工具。&lt;/p>
&lt;p>作为全栈工程师，你将参与：&lt;/p>
&lt;ul>
&lt;li>开发和优化前后端产品（React / Next.js）&lt;/li>
&lt;li>优化 agent 系统（langraph）&lt;/li>
&lt;/ul>
&lt;p>我们希望你具备：&lt;/p>
&lt;ul>
&lt;li>熟悉 React / Next.js，能独立开发和优化复杂前端&lt;/li>
&lt;li>有 Python 开发经验更佳&lt;/li>
&lt;li>有 AI 生图/生视频相关经验更佳（如 MJ、Veo、即梦、Nanobanana 等）&lt;/li>
&lt;li>熟练使用 AI 辅助开发工具（如 Cursor、Copilot），提升开发效率&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>加分项：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>有自己做过的 AI 创意项目/作品&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>工作方式 &amp;amp; 薪酬：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>远程友好 🌏&lt;/li>
&lt;li>薪资待遇 12-14k RMB 每月，希望先从日结薪资开始，尝试合作后再转成长期全职&lt;/li>
&lt;li>灵活的工作氛围，和全球开发者一起打造下一代 AI 创意平台&lt;/li>
&lt;/ul>
&lt;p>欢迎简历和自我介绍发送到邮箱： &lt;a href="mailto:xianmin12@qq.com">xianmin12@qq.com&lt;/a>&lt;/p></description></item><item><title>一个可本地运行的 AI 绘图创作工具 | 远程技术管家创业周记（15）</title><link>https://www.xianmin.org/post/weekly/015/</link><pubDate>Mon, 09 Jun 2025 01:35:00 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/015/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="本周思考">本周思考&lt;/h2>
&lt;p>本周参与了一个开源项目， &lt;a href="https://github.com/11cafe/jaaz">Jaaz&lt;/a> ，一个可本地运行的 AI 绘图创作工具。
这个项目是由 &lt;a href="https://github.com/11cafe">11cafe&lt;/a> 发起的，团队中的小伙伴能力都很强，才发布一周，就在 Github 上收获了 300+ 的关注。
很荣幸我能参与到早期的开发。&lt;/p>
&lt;p>&lt;img alt="Jaaz storyboards 创作截图" src="https://www.xianmin.org/images/2025/06/screenshoot.png">&lt;/p>
&lt;p>做开源项目，大多数时候都是搞情怀，没有资金支撑，是很难维持的。
比如我自己也有做开源项目，但只能说解决个人需求，再和其他人分享。
因为生计问题，没办法投入更多精力和时间，只能偶尔空闲了去维护。
代码完全开源，容易被一些小老板们改个名、套个壳，拿去当做自己的产品售卖。
所以我也特别好奇， Jaaz 如何接下来在商业上能有所运转。&lt;/p>
&lt;h2 id="信息过载导致决策瘫痪">信息过载导致决策瘫痪&lt;/h2>
&lt;p>周记中断了 2 周。太忙了，是原因之一。
从接单干活的角度，每一分钟都是钱，只要想做，真的忙不过来。
写作内容陷入瓶颈，不知道写什么，车轱辘话说多了，自己也觉得没意思。&lt;/p>
&lt;p>还有一个主要原因，我个人分析是 &lt;strong>由于信息过载，导致了决策瘫痪。&lt;/strong>&lt;/p>
&lt;p>整个五月份，除了给别人干活，我同时也在思索「要写什么内容、要如何调整方向、该做什么样的产品」的问题。
此前的周记内容形式在我看来，有点儿陷入了低质量重复。
这样的内容，我自己不喜欢写，估计读者朋友也不会喜欢看。
那就看看其他人都在写些什么吧，然后就被信息洪流淹没了，自己更不知道写什么了。
干脆就断更了，现在还是没有找到感觉。&lt;/p>
&lt;blockquote>
&lt;p>DeepSeek: 信息过载 → 超出个体的认知处理能力 → 导致关键信息淹没、优先级混乱、选项评估困难、情感压力剧增、决策标准模糊 → 大脑不堪重负 → 无法有效整合信息形成清晰的判断和选择 → 最终表现为犹豫不决、拖延、回避决策（即决策瘫痪）。&lt;/p>
&lt;/blockquote>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>自己找不到方向，那就让老板找方向，给老板干活吧。&lt;/p></description></item><item><title>不要依赖单一平台、单一收入来源 | 远程技术管家创业周记（14）</title><link>https://www.xianmin.org/post/weekly/014/</link><pubDate>Sun, 18 May 2025 21:15:39 +0800</pubDate><guid>https://www.xianmin.org/post/weekly/014/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="本周思考">本周思考&lt;/h2>
&lt;p>上周，女友的自媒体账号被抖音封禁 15 天，没有任何理由，导致这半个月没有任何收入。&lt;/p>
&lt;p>这也给我带来了反思，如果我的接单渠道消失了，我的收入是否会受影响？这也是为什么我要做多个平台、多个账号，多渠道发布内容。即便最坏的情况，我的微信不能用了，那我的老客户也可能通过我的个人网站找到我。这或许也是做个人网站的好处之一，它是我们个体在互联网上与他人链接的一个根据地，不受平台约束。（如何您有做个人网站的需求，欢迎与我联系！）&lt;/p>
&lt;p>我在很多年前就意识到，仅靠工作的收入，抗风险能力是很低的，一旦失去工作，就失去了收入来源。据我观察，抗风险能力高的个体，他们通常都会有多个收入渠道。当然，道理是简单明了的，可是我们该怎么做呢？&lt;/p>
&lt;p>主动出击永远都不会过时。一位盲人朋友，在西安开了一家盲人按摩店，为了拓客，他到停车场，一辆车一辆车去投递自荐信，第一天就成功转化了一位客户。&lt;/p>
&lt;p>在任何一个可曝光的地方曝光自己，这都是主动出击的方式。也包括给群聊群发、广投自荐信等等。我们之所以还没这么做，只是还没有被逼到无路可走。焦虑是没意义的，不如每天发一篇小红书。&lt;/p>
&lt;h2 id="客户维护的重要性">客户维护的重要性&lt;/h2>
&lt;p>接单久了才发现，老客户真的是宝贵资源。他们不仅会带来持续的业务，还会介绍新客户。&lt;/p>
&lt;p>本周有个老客户找我帮他解决一个问题，话不多说就直接微信转了 300 元。整个过程只花了我不到两小时，这种效率是在任何平台上难以达到的。&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>在创业的路上，安全感往往来自于多元化的收入来源。&lt;/p>
&lt;p>就像农民不会只种一种作物，投资者不会只买一只股票，我们作为技术创业者，也不能依赖单一平台或单一技能。&lt;/p>
&lt;p>多元化不仅能降低风险，还能带来更多可能性。&lt;/p>
&lt;p>你的收入来源有多元化吗？你的技能有多元化吗？&lt;/p>
&lt;p>与君共勉。&lt;/p></description></item><item><title>一次失败的二开经历 | 远程技术管家创业周记（13）</title><link>https://www.xianmin.org/post/weekly/013/</link><pubDate>Sun, 11 May 2025 14:39:12 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/013/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="本周行动">本周行动&lt;/h2>
&lt;p>五一前接了个 4000 的活儿，是个跨平台的桌面应用。
客户着急要，我答应了一周内交付，五一期间就没有休息。&lt;/p>
&lt;p>跨平台应用最大的挑战是兼容性问题。
我平时主力开发机用的是 Windows , 在 Windows 下一路开发，一路测试。
MacOS 呢，中间编译测试过一次，没问题。
但是等功能开发完成，再编译测试，就打不开了，报错。
报错内容丢给 AI ，AI 瞎改了一通，找不到实际 bug 根源。
从没问题到有问题，中间大概有 30 次提交。
不知道是哪一步出现的问题。
这时候只能用二分法，去定位哪一次提交导致的程序出错。
差不多回退四次，就能找到了。
发现只是一行代码，在 MacOS 下不支持，但是编译呢，又能通过，可程序打开却会导致崩溃。
编译太耗费时间，差不多用了半天，才修复这个 bug 。
后面就成功交付了。&lt;/p>
&lt;h2 id="一个失败的案例">一个失败的案例&lt;/h2>
&lt;p>五一期间还接了个二次开发的活儿，远程看客户演示，基本功能都完成差不多了，有三点需要修改。
我粗略看了下源码，前端用的 react ，后端用的 python ，这俩我都熟悉啊，就接下了这个活儿。&lt;/p>
&lt;p>真正开始改动的时候，发现还是大意了，要改动的其中一个核心文件有将近 2000 行代码。
状态值分散在各处，根本无从下手。
&lt;strong>我想的很简单，不是有 AI 嘛，让它帮忙重构，分割成多个组件，用上下文重新管理。&lt;/strong>&lt;/p>
&lt;p>重构的差不多，可以动手了。
但又发现，客户的需求，与原先的代码逻辑是不一致的。
要实现客户的需求，得换一套操作逻辑，还得继续重构。
最后我放弃了，浪费了两天时间。&lt;/p>
&lt;ol>
&lt;li>二次开发，一定要注意原本的代码规范如何，如果有多个文件大于 1000 行，那就要小心了，大概率代码凌乱。&lt;/li>
&lt;li>对于代码凌乱的项目，不改变原有的逻辑，添加一两个功能可能还好。如果要重构，最好的方式，彻底重写效率可能还高一些。&lt;/li>
&lt;li>太久远的历史遗留项目，比如六七年前的 vue2 项目，node 12 以下的版本，这一类的活儿也可能比较恶心。&lt;/li>
&lt;/ol>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>你有没有失败的二次开发的经历呢？&lt;/p></description></item><item><title>创业者没有假期 | 远程技术管家创业周记（12）</title><link>https://www.xianmin.org/post/weekly/012/</link><pubDate>Sun, 04 May 2025 15:05:59 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/012/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;p>从上周开始呢，我就一直在思考如何突破现状。&lt;/p>
&lt;p>当前的状况，靠接单解决温饱是没问题的，只要肯花时间，还能有点儿盈余。
&lt;strong>想要增加收入呢，要么多花时间，要么提高单价。&lt;/strong>
根据经验，提高单价还是挺难的，我做的也不是什么高精专的技术，这个价格是由市场决定的。&lt;/p>
&lt;p>我有两个想做的产品，但经过市场调研，已有类似的竞品，需求也比较小众，想要做成，还是得解决营销的问题。
今年我在做产品的一个思路上的转变，就是&lt;strong>先去找买家，如果找不到买家，那就先缓缓，或者换个方向。&lt;/strong>
当然，如果是解决个人的需求，那就无所谓了。&lt;/p>
&lt;p>这也是为什么我今年开始写公众号和小红书，还是想增加一些曝光度，为将来可能的产品先铺路。
不过这个周记写了也有 12 期了，进展缓慢。
公众号目前 50+ 的关注，小红书 100 + 的关注。
我自己也知道，主要还是内容的问题。
内容没多少价值，既没娱乐价值，也缺少实用价值，更新频率还低。&lt;/p>
&lt;p>在内容上，我有考虑要不要学习一些博主的做法，用 AI 洗稿爆款文。
调研后，我感觉洗稿最大的问题是缺少灵魂，偶尔会有几篇爆款，收益主要来自平台激励。
只是靠广告收益的话，投入的时间还不如接单呢。
&lt;strong>所以我还是坚持自己手写，尽管过程缓慢，但至少是真实的记录和分享。&lt;/strong>&lt;/p>
&lt;p>五一假期本想好好休息，却被客户打断了计划。
创业者没有假期啊，有活儿就得干，没活儿还得自己去找活儿。
后面争取在内容上能有所突破吧。&lt;/p>
&lt;p>与君共勉。&lt;/p></description></item><item><title>独立开发者的真实生存现状与破局之道 | 远程技术管家创业周记（11）</title><link>https://www.xianmin.org/post/weekly/011/</link><pubDate>Sun, 27 Apr 2025 12:15:32 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/011/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="本周行动">本周行动&lt;/h2>
&lt;p>发布了一个 VSCode 扩展——&lt;a href="https://marketplace.visualstudio.com/items/?itemName=Xianmin.markdown-to-wechat">markdown-to-wechat - Visual Studio Marketplace&lt;/a> 。
这个扩展主要是解决我个人的一个痛点，算是今年的第一个开源小作品。&lt;/p>
&lt;p>还记得三周前，有客户问我，我有哪些项目案例。
&lt;strong>我个人经手的项目不算多，但大大小小的加起来也有上百个了。&lt;/strong>
这些项目有我全职开发的，也有只是修复 bug 的，不过很多在网上都找不见踪迹了。
只好找一些截图，跟他说，我做过这个、做过那个。
很多时候，没有自己署名的项目，一般都不好意思放到个人网站上，毕竟版权是属于公司的。
我也没有大厂的工作经历做背书，空口无凭啊。&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Talk is cheap. Show me the code.&amp;rdquo; - Linus Torvalds&lt;/p>
&lt;/blockquote>
&lt;p>这或许是做个人项目的价值之一吧。&lt;/p>
&lt;h2 id="近期做的有趣项目">近期做的有趣项目&lt;/h2>
&lt;h3 id="数据标注脚本">数据标注脚本&lt;/h3>
&lt;p>数据标注，一般都是要人工做的，这位朋友为了提升工作效率，让我帮他写了一个脚本。
脚本的作用无非就是批量点击、批量粘贴，再增加几个快捷键便于操作。
&lt;strong>在操作效率上，至少提升了十倍吧。&lt;/strong>
我好奇的咨询了一下，他们这一行的收益如何。
他说，也没多少。
不过我看他是给 AI 做标注，当前的工作量应该是挺稳定的。&lt;/p>
&lt;h3 id="ai-应用">AI 应用&lt;/h3>
&lt;p>今年接触的有一半项目都是跟 AI 相关的，这东西看起来高大上，其实就是调用一下 AI 的接口，就算是拥抱 AI 啦。
做项目呢，依旧是过去的那一套工具链。
现在的 AI 项目大多如此，包装得很高级，骨子里还是那套增删改查。不过这也是好事，让我这种&amp;quot;技术管家&amp;quot;也能接单干活。&lt;/p>
&lt;h3 id="帮科研工作者干杂活">帮科研工作者干杂活&lt;/h3>
&lt;p>我发现优秀的科研工作者是有生意头脑的，他们知道把手头繁琐的工作外包出去。
现在各行各业真是都卷的不行。
&lt;strong>生命中最宝贵的是什么，是时间啊。&lt;/strong>
如果能花点小钱买到时间，我觉得太划算了。
唯一的挑战是需要理解他们的专业知识，好在我接触的科研人员都很有耐心，愿意解释他们的需求。&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>偶尔会有失业的朋友私信向我请教，如何接单，该怎么办。
愧不敢当，其实我也没太多可分享的，每个人的境遇不同，技术水平不同，何况我也还在生存线上挣扎呢。&lt;/p>
&lt;p>就像我写这篇周记，其实挺水的，可万一就来单了呢？
不曝光自己，肯定是没有单的。
水就水点吧，水平就在这儿，如果明年还是这水平，哎，那明年再说吧。&lt;/p>
&lt;p>我最近也在反思，自己似乎在做一些无用功。
不过换个角度想，今年写这些鬼东西也才两个月，才写了十篇出头吧，我觉得还有很大的提升空间。
必须得先行动起来，在行动中去反思去改进。&lt;/p>
&lt;p>分享一个两年前看过的视频： &lt;a href="https://www.bilibili.com/video/BV1da4y1p7c9/?vd_source=594fbb093a27640e480caa16373d580f">【Netflix】托尼·罗宾斯：做自己的大师 1080P官方双语字幕 Tony Robbins I Am Not Your Guru_哔哩哔哩_bilibili&lt;/a> 。&lt;/p>
&lt;p>关注我，下期再见！&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>用 VSCode 写公众号：markdown-to-wechat</title><link>https://www.xianmin.org/post/2025/vscode-markdown-to-wechat/</link><pubDate>Fri, 25 Apr 2025 10:00:56 +0800</pubDate><guid>https://www.xianmin.org/post/2025/vscode-markdown-to-wechat/</guid><description>&lt;p align="center">
&lt;img width="200px" src="https://www.xianmin.org/images/2025/04/markdown-to-wechat.png" />
&lt;/p>
&lt;p>有没有人像我一样用 VSCode 编辑 Markdown 文本，然后发布到微信公众号的？&lt;/p>
&lt;p>通常你需要把 Markdown 内容先复制到其他编辑器，再复制到公众号上。
现在，这一步你可以省略了。&lt;/p>
&lt;p>&lt;strong>本扩展将 Markdown 转换为微信公众号兼容的 HTML ，直接在 VSCode 上预览复制，与 VSCode 完美结合。&lt;/strong>&lt;/p>
&lt;p>本项目完全开源，无需注册，安装即用。&lt;/p>
&lt;p>&lt;img alt="markdown-to-wechat 截图" src="https://www.xianmin.org/images/2025/04/screenshoot.png">&lt;/p>
&lt;h2 id="功能特点">功能特点&lt;/h2>
&lt;ol>
&lt;li>在 VSCode 上实时预览 Markdown 内容&lt;/li>
&lt;li>一键复制公众号格式 HTML&lt;/li>
&lt;li>离线使用&lt;/li>
&lt;li>本地 css 主题样式管理&lt;/li>
&lt;li>主题色切换&lt;/li>
&lt;li>标题编号、强制换行、图片域名、引用链接等特色功能&lt;/li>
&lt;/ol>
&lt;h2 id="如何安装">如何安装&lt;/h2>
&lt;ol>
&lt;li>在 VSCode 商店搜索： markdown wechat ，&lt;code>markdown-to-wechat&lt;/code> 这个扩展就是；&lt;/li>
&lt;li>打开链接安装： &lt;a href="https://marketplace.visualstudio.com/items/?itemName=Xianmin.markdown-to-wechat">https://marketplace.visualstudio.com/items/?itemName=Xianmin.markdown-to-wechat&lt;/a>&lt;/li>
&lt;li>项目地址： &lt;a href="https://github.com/xianmin/vscode-markdown-to-wechat">https://github.com/xianmin/vscode-markdown-to-wechat&lt;/a>&lt;/li>
&lt;/ol>
&lt;h2 id="如何使用">如何使用&lt;/h2>
&lt;p>当你安装了这个扩展，在你编辑 &lt;code>markdown&lt;/code> 文件窗口的右上角，会添加一个 &lt;code>markdown-to-wechat: 预览&lt;/code> 的图标，点击即可。&lt;/p>
&lt;p>&lt;img alt="编辑器右上角的按钮" src="https://www.xianmin.org/images/2025/04/screenshoot-2.png">&lt;/p>
&lt;h2 id="如何自定义主题">如何自定义主题&lt;/h2>
&lt;p>你可以通过 VSCode 命令面板，通常默认快捷键是 &lt;code>Ctrl-Shift-p&lt;/code> ，来使用 &lt;code>markdown-to-wechat&lt;/code> 的相关命令。&lt;/p>
&lt;p>&lt;img alt="VSCode 中的 markdown-to-wechat 命令" src="https://www.xianmin.org/images/2025/04/screenshoot-3.png">&lt;/p>
&lt;p>比如 &lt;code>markdown-to-wechat: 打开主题文件夹&lt;/code> ，它会打开主题文件默认的存储位置。&lt;/p>
&lt;p>在 &lt;code>themes/&lt;/code> 目录内，已经有一个 &lt;code>custom.css&lt;/code> 文件，你可以直接编辑它，或者新建一个 css 文件。&lt;/p>
&lt;h2 id="为何开发这个扩展">为何开发这个扩展&lt;/h2>
&lt;p>我日常使用 VSCode 编辑 Markdown ，记笔记、写作，发布到个人博客。
自 2025 年开始写微信公众号，每次发布都要在其他 Markdown 编辑器中转一个流程，这让我觉得挺别扭。
有时候在手机上预览，发现有地方需要修改，这个复制再复制的流程又得重复一次。
为了节省这几分钟，跳过中间环节，所以有了这个扩展。&lt;/p>
&lt;p>开发这个扩展的过程中，我还发现了一些额外的好处，比如：
可通过 VSCode 同步配置；
本地管理个人的 css 样式文件，等等。
这样，我就拥有了一个完全自主可控的微信公众号排版工具。&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>目前这个项目还有诸多不完善的地方，如果你在使用过程中遇到任何问题，欢迎向我反馈 👋！&lt;/p>
&lt;p>反馈地址： &lt;a href="https://github.com/xianmin/vscode-markdown-to-wechat/issues">https://github.com/xianmin/vscode-markdown-to-wechat/issues&lt;/a> 。&lt;/p>
&lt;p>本文在公众号上的预览地址为： &lt;a href="https://mp.weixin.qq.com/s/OnAAm6BPtzgPzb6__-uGTA">https://mp.weixin.qq.com/s/OnAAm6BPtzgPzb6__-uGTA&lt;/a>&lt;/p></description></item><item><title>没活儿了 | 远程技术管家创业周记（10）</title><link>https://www.xianmin.org/post/weekly/010/</link><pubDate>Sun, 20 Apr 2025 16:25:20 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/010/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="本周行动">本周行动&lt;/h2>
&lt;p>过去的三周，手上一直积压着两三个活儿，导致基本没有时间休息，状态多少有点儿焦虑。
本周婉拒了一些活儿，终于把积压的项目做完了。
&lt;strong>接活儿就是这样，没活儿的时候焦虑，活儿多了也焦虑。&lt;/strong>&lt;/p>
&lt;p>不过呢，我这人总是很乐观的。
只要生存问题解决了，那就可以做点自己感兴趣的事儿了。&lt;/p>
&lt;p>给别人干活儿呢，多少有点「迫不得已」，你要满足客户的需求。
你比如说改网页样式，这改点边距，那改点颜色，很多时候挺无聊的，也没啥技术含量。
但谁让人家是金主呢，金主怎么要求，咱就怎么执行。&lt;/p>
&lt;p>尽管很多时候写代码是为了生存，但不管怎么说，我还是挺热爱这项活动的。
遇到好玩儿的项目，钱多钱少不重要，能提升技术，能开阔视野，就挺好。
项目好玩儿，还有人愿意给钱，那就是双倍快乐。
这或许也是为什么我至今还是穷人吧。
太容易知足了。&lt;/p>
&lt;p>别人的代码写完了，终于可以写点「自己的代码」了。&lt;/p>
&lt;h2 id="一个-vscode-扩展">一个 VSCode 扩展&lt;/h2>
&lt;p>最近这两天，我写了一个 VSCode 扩展， &lt;strong>一键复制 Markdown 内容排版到微信公众号。&lt;/strong>
类似这样的应用已经有好几个了，不过都是 Web 应用，Markdown 文本，得在他们的应用上编辑。&lt;/p>
&lt;p>我以前的流程是这样的：
在 VSCode 上编辑 Markdown 内容，写好后呢，复制到其他 Markdown 渲染应用，再复制到微信公众号。&lt;/p>
&lt;p>&lt;strong>在 VSCode 上居然没有一个好用的渲染 Markdown 的扩展，可用于直接复制到微信公众号上的。&lt;/strong>&lt;/p>
&lt;p>这让我很不舒服。&lt;/p>
&lt;p>别人不想写，那就我自己写吧。&lt;/p>
&lt;p>这篇短文，不出意外，公众号上的排版应该就是用我写的 VSCode 扩展，渲染出来的。&lt;/p>
&lt;p>由于目前还有一些没有完善的功能，估计要到下周才能发布了，敬请期待！&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>你用 VSCode 编辑 Markdown 文本吗？&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>一个输出英文的利器 | 远程技术管家创业周记（九）</title><link>https://www.xianmin.org/post/weekly/009/</link><pubDate>Sun, 13 Apr 2025 14:59:39 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/009/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="第九周创业行动">第九周创业行动&lt;/h2>
&lt;p>基于一个开源项目进行了二次开发，&lt;a href="https://github.com/xianmin/inpot-desktop">inpot-desktop: 一个专注于输入翻译的跨平台软件&lt;/a> 。&lt;/p>
&lt;p>主要解决我个人的一个需求：输入中文，输出英文。&lt;/p>
&lt;p>传统的方式，流程比较繁琐。
打开浏览器，输入一个网址，打开网页，输入中文，复制，切换，黏贴。&lt;/p>
&lt;p>大部分翻译工具，解决的是外语翻译为母语的流程。
但鲜少有母语翻译成外语的工具。&lt;/p>
&lt;p>&lt;a href="https://github.com/pot-app/pot-desktop">Pot&lt;/a> 是一个以 GPL 协议发行的开源软件。
功能挺全的：划词翻译、输入翻译、截图翻译、文字识别等等，还接入了不少翻译接口。&lt;/p>
&lt;p>但我在使用过程中，还是遇到了让自己的「难受」的痛点。
比如：输入翻译时，不能切换窗口，否则会导致源文本丢失；打开翻译窗口响应太慢；竖排的展示方式，我不太喜欢……&lt;/p>
&lt;p>既然是开源软件，那干脆就自己改吧。&lt;/p>
&lt;p>当你与国际友人交流，一般都得用英语，如果你的英语表达能力又不是那么流利，那么你是如何解决的呢？&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>Git Archive：高效打包、项目交付的实用指南</title><link>https://www.xianmin.org/post/2025/git-archive-tutorial-project-packaging/</link><pubDate>Sat, 12 Apr 2025 10:00:56 +0800</pubDate><guid>https://www.xianmin.org/post/2025/git-archive-tutorial-project-packaging/</guid><description>&lt;p>在软件开发和项目交付过程中，我们经常需要将源码打包，但打包文件中我们又需要排除 &lt;code>.git/&lt;/code> 、&lt;code>node_modules&lt;/code> 等目录。&lt;/p>
&lt;p>一般做法是，手动勾选需要的文件，进行打包。
或者，把不想打包的文件先删除，再打包整个文件夹。
这两种方法，都需要人为的筛选。&lt;/p>
&lt;p>那么，有什么优雅的办法，方便打包项目源码呢？&lt;/p>
&lt;h2 id="太长不看版">太长不看版&lt;/h2>
&lt;p>使用 &lt;code>git archive&lt;/code> 命令打包，它会自动排除 &lt;code>.git/&lt;/code> ，以及 &lt;code>.gitignore&lt;/code> 中的文件。&lt;/p>
&lt;p>在你的 Windows 系统中的 &lt;code>PowerShell Profile&lt;/code> 添加一个命令，&lt;code>Git-ArchiveProject&lt;/code> 。
当你在项目目录使用这个命令，它就会打包整个项目，并在项目的上一层目录，输出一个名为 &lt;code>yyyyMMdd-projectName.zip&lt;/code> 的打包文件。&lt;/p>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1"> 1&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2"> 2&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3"> 3&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4"> 4&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5"> 5&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6"> 6&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7"> 7&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8"> 8&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-9">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-9"> 9&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-10">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-10">10&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-11">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-11">11&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-12">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-12">12&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-13">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-13">13&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-14">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-14">14&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-15">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-15">15&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-16">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-16">16&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-17">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-17">17&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-18">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-18">18&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-powershell" data-lang="powershell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># 创建当前工作目录的压缩包，输出到上一级目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># 压缩包中有一个顶级目录，名为当前的工作目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># 输出的压缩包，命名为 yyyyMMdd-projectName.zip&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020;font-weight:bold">function&lt;/span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#007020">Git-ArchiveProject&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#60a0b0;font-style:italic"># 获取当前工作目录的名称作为项目名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb60d5">$projectName&lt;/span> = &lt;span style="color:#007020">Split-Path&lt;/span> -Path (&lt;span style="color:#007020">Get-Location&lt;/span>) -Leaf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb60d5">$date&lt;/span> = &lt;span style="color:#007020">Get-Date&lt;/span> -Format &lt;span style="color:#4070a0">&amp;#34;yyyyMMdd&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#bb60d5">$outputFile&lt;/span> = &lt;span style="color:#4070a0">&amp;#34;../&lt;/span>&lt;span style="color:#bb60d5">$date&lt;/span>&lt;span style="color:#4070a0">-&lt;/span>&lt;span style="color:#bb60d5">$projectName&lt;/span>&lt;span style="color:#4070a0">.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> git archive --format=zip --prefix=&lt;span style="color:#4070a0">&amp;#34;&lt;/span>&lt;span style="color:#bb60d5">$projectName&lt;/span>&lt;span style="color:#4070a0">/&amp;#34;&lt;/span> --output=&lt;span style="color:#4070a0">&amp;#34;&lt;/span>&lt;span style="color:#bb60d5">$outputFile&lt;/span>&lt;span style="color:#4070a0">&amp;#34;&lt;/span> HEAD
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#007020;font-weight:bold">if&lt;/span> (&lt;span style="color:#bb60d5">$LASTEXITCODE&lt;/span> &lt;span style="color:#666">-eq&lt;/span> &lt;span style="color:#40a070">0&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#007020">Write-Host&lt;/span> &lt;span style="color:#4070a0">&amp;#34;Success: &lt;/span>&lt;span style="color:#bb60d5">$outputFile&lt;/span>&lt;span style="color:#4070a0">&amp;#34;&lt;/span> -ForegroundColor Green
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#007020;font-weight:bold">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#007020">Write-Host&lt;/span> &lt;span style="color:#4070a0">&amp;#34;Fail: &lt;/span>&lt;span style="color:#bb60d5">$outputFile&lt;/span>&lt;span style="color:#4070a0">&amp;#34;&lt;/span> -ForegroundColor Red
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>如果你用的是 Linux ，可以用 Bash 写一个类似的脚本。&lt;/p>
&lt;h2 id="什么是-git-archive">什么是 Git Archive？&lt;/h2>
&lt;p>&lt;code>git archive&lt;/code> 是 Git 提供的一个命令，用于从 Git 仓库创建源代码归档文件（如 .zip 或 .tar），同时自动排除版本控制相关的信息。它主要用于：&lt;/p>
&lt;ul>
&lt;li>创建发布版本的源代码包&lt;/li>
&lt;li>分发项目代码给无需访问版本历史的用户&lt;/li>
&lt;li>部署应用到服务器环境&lt;/li>
&lt;/ul>
&lt;p>&lt;code>git archive&lt;/code> 的主要特点是&lt;strong>只打包已提交到仓库的文件&lt;/strong>，并自动排除 .git 目录和 .gitignore 中指定的文件。&lt;/p>
&lt;h2 id="基本用法">基本用法&lt;/h2>
&lt;h3 id="创建-zip-格式归档">创建 ZIP 格式归档&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip --output&lt;span style="color:#666">=&lt;/span>project.zip HEAD&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3 id="创建压缩的-tar-文件">创建压缩的 TAR 文件&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>tar HEAD | gzip &amp;gt; project.tar.gz&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2 id="关键参数详解">关键参数详解&lt;/h2>
&lt;h3 id="1-格式指定---format">1. 格式指定: &lt;code>--format&lt;/code>&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip HEAD&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>支持的格式主要有 &lt;code>zip&lt;/code>、&lt;code>tar&lt;/code>。如果未指定，Git 会根据输出文件名猜测格式。&lt;/p>
&lt;h3 id="2-输出位置---output">2. 输出位置: &lt;code>--output&lt;/code>&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip --output&lt;span style="color:#666">=&lt;/span>../releases/project.zip HEAD&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>指定归档文件的保存路径和文件名。&lt;/p>
&lt;h3 id="3-添加前缀---prefix">3. 添加前缀: &lt;code>--prefix&lt;/code>&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip --prefix&lt;span style="color:#666">=&lt;/span>project-name/ --output&lt;span style="color:#666">=&lt;/span>project.zip HEAD&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>在归档的所有文件前添加目录前缀，创建顶级目录。&lt;/p>
&lt;h3 id="4-版本指定">4. 版本指定&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-1">1&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-2">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-2">2&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-3">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-3">3&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-4">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-4">4&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-5">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-5">5&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-6">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-6">6&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-7">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-7">7&lt;/a>
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-8">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-8">8&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># 归档特定标签版本&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip v1.0.0 --output&lt;span style="color:#666">=&lt;/span>release-1.0.0.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># 归档特定分支最新提交&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip feature/new-ui --output&lt;span style="color:#666">=&lt;/span>new-ui.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#60a0b0;font-style:italic"># 归档特定提交&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip 5a8e2 --output&lt;span style="color:#666">=&lt;/span>specific-commit.zip&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3 id="5-限定目录归档">5. 限定目录归档&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --format&lt;span style="color:#666">=&lt;/span>zip HEAD:src --output&lt;span style="color:#666">=&lt;/span>src.zip&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>只归档仓库中的特定子目录。&lt;/p>
&lt;h3 id="6-远程仓库---remote">6. 远程仓库: &lt;code>--remote&lt;/code>&lt;/h3>
&lt;div class="highlight-container">
&lt;button class="copy-code-btn outline">Copy&lt;/button>
&lt;div class="highlight">&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-1">1&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git archive --remote&lt;span style="color:#666">=&lt;/span>origin --format&lt;span style="color:#666">=&lt;/span>zip master &amp;gt; remote-master.zip&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>从远程仓库创建归档（需要远程服务器支持）。&lt;/p>
&lt;h2 id="归档文件范围说明">归档文件范围说明&lt;/h2>
&lt;p>了解 &lt;code>git archive&lt;/code> 归档的文件范围非常重要：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>已提交文件&lt;/strong>：会被归档（最新提交版本）&lt;/li>
&lt;li>&lt;strong>已修改但未提交的文件&lt;/strong>：不会被归档！&lt;/li>
&lt;li>&lt;strong>已暂存但未提交的文件&lt;/strong>：不会被归档！&lt;/li>
&lt;li>&lt;strong>未跟踪的文件&lt;/strong>：不会被归档！&lt;/li>
&lt;li>&lt;strong>已忽略的文件&lt;/strong>：不会被归档！&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>特别注意&lt;/strong>：&lt;code>git archive&lt;/code> 无法包含 .git 目录，这是设计使然，目的是创建不包含版本控制信息的干净归档。&lt;/p>
&lt;h2 id="与其他打包方式的对比">与其他打包方式的对比&lt;/h2>
&lt;p>与使用 7-Zip、WinRAR 等工具手动打包相比，&lt;code>git archive&lt;/code> 具有以下优势：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>自动排除非跟踪文件&lt;/strong>：无需手动指定排除规则&lt;/li>
&lt;li>&lt;strong>遵循 .gitignore 规则&lt;/strong>：保持与版本控制一致&lt;/li>
&lt;li>&lt;strong>不包含 .git 目录&lt;/strong>：避免版本控制信息泄露&lt;/li>
&lt;li>&lt;strong>可指定任意历史版本&lt;/strong>：便于创建特定版本的归档&lt;/li>
&lt;/ol>
&lt;h2 id="结语">结语&lt;/h2>
&lt;p>不是每个客户都会使用 Git ，许多私有项目也不方便上传到网上。
对于小型项目， zip 压缩包是最直接的交付方式。&lt;/p>
&lt;p>以前我都是手动选择文件打包，实在低效。
后面用 7z 的 exclude 命令参数排除一些文件，也还是有点儿麻烦。&lt;/p>
&lt;p>直到发现了 &lt;code>git archive&lt;/code> 命令，项目交付方便多了。&lt;/p></description></item><item><title>远程技术管家创业周记（八）- 手里有活心不慌</title><link>https://www.xianmin.org/post/weekly/008/</link><pubDate>Sun, 06 Apr 2025 15:39:53 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/008/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="第八周创业行动">第八周创业行动&lt;/h2>
&lt;p>这周对接上了一家外包公司，估计他们人手不够吧，找到了我。
一开始干了点小活，我看他们的项目是个长期活儿，还有挺多任务没做。
&lt;strong>我主动跟经理说，干脆你们把我下午的时间包了，专做你们的活儿，我也不用自己去找活了。&lt;/strong>
我的想法很简单，只做半天呢，双方都有灵活安排的空间，他们想节约成本，我也不想完全依赖一家公司，互惠共赢。&lt;/p>
&lt;p>上个月，有位网友评论，「手里有活，心里不慌」。
我觉得他说的有道理。&lt;/p>
&lt;p>我想了想，这里的「有活」，可以拆解为​​「有技术」和「有客户」​​两个维度。
&lt;strong>​​「有技术」不容易被市场淘汰。「有客户」不至于陷入被动。​&lt;/strong>&lt;/p>
&lt;p>作为技术工作者，在过去，我只是单纯的提升技术，却一直忽略了「有客户」这个维度的积累。&lt;/p>
&lt;h2 id="反思">反思&lt;/h2>
&lt;ol>
&lt;li>最近两周一直都比较忙碌，有点儿项目过载了。&lt;/li>
&lt;li>时间分配不合理，个人项目进展缓慢。鱼与熊掌不可兼得啊……&lt;/li>
&lt;li>想法太多，不够聚焦。&lt;/li>
&lt;/ol>
&lt;h2 id="一点分享">一点分享&lt;/h2>
&lt;p>本周确实不知道该写点什么，思绪混乱，为了避免不至于太水，分享一下我的项目管理方法吧。&lt;/p>
&lt;p>我用的是 PARA 文件管理方法（Project、Area、Resource 和 Archive），它的提出者是 Tiago Forte 。&lt;/p>
&lt;p>日常短期工作，都在 &lt;code>Project/&lt;/code> 目录下进行，每起一个项目，就新建一个文件夹，在文件夹前备注上日期。&lt;/p>
&lt;p>一个项目完成，不再动了，就把它移动到 &lt;code>Archive/&lt;/code> 目录下。&lt;/p>
&lt;p>就这么简单。&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>得找时间休息休息了。&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>远程技术管家创业周记（七）- 爆单了</title><link>https://www.xianmin.org/post/weekly/007/</link><pubDate>Sun, 30 Mar 2025 15:23:55 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/007/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="第七周创业行动">第七周创业行动&lt;/h2>
&lt;p>这周爆单了。
从周一开始，就一直在忙碌，每天晚上都要加班。
截止到现在周日晚 10 点半，还有两单没完成。&lt;/p>
&lt;p>即便是爆单，收入也是有限的，因为时薪是固定的，每天可工作的时长也是固定的。
我目前的报价方式，是根据对方的需求判断工作量，估算时长，再乘以我的时薪。
我的时薪，是在与多个客户的交流后，逐渐调整到目前 80 每小时的价格。
&lt;strong>报价的时薪，并非真实的时薪，前期的沟通、后期的维护，这些时间都没有计算在内。&lt;/strong>
所以我的真实时薪，估计是在 50 左右。
这个收入，应该说是中规中矩吧，饿不死，也富不了。
相比上班，自由一点，但终究是售卖自己的时间，忙碌起来，也没啥自由可言。&lt;/p>
&lt;p>本周接了各种各样的活儿。&lt;/p>
&lt;h3 id="一咨询">一、咨询&lt;/h3>
&lt;p>上周发了个广告，还真有同学愿意找我聊天，哈哈！
那天比较忙，只聊了一个小时，主要是私人情感方面。
虽然我不是情感专家，但我价格低啊，还且同是程序员，也许更能共情。
我和他分享了我的 &lt;strong>一手经验和二手经验&lt;/strong> 的理论，简言之就是多去约姑娘，增加一手经验。
我的咨询服务，定价低，主要也是想多增加这方面的一手经验，同时还能多认识个朋友。&lt;/p>
&lt;h3 id="二教学">二、教学&lt;/h3>
&lt;p>算是老客户了。
第一次是帮他解决开发环境的依赖问题，当时我发现他用 AI 编程，但他不懂代码、不懂项目管理，用 AI 写出来的代码就是一坨，难以维护，AI 自己都改不下去了。
我劝他干脆重启一个新的项目，我演示给他看，现代 AI 编程的最佳实践策略。
比如如何 &lt;strong>通过 Git 进行版本管理，与 AI 编码的技巧，如何分解代码，遇到 Bug 怎样解决等等&lt;/strong> 。
有几次差点翻车，但 AI 都很好的挽回了局面。&lt;/p>
&lt;h3 id="三项目国际化">三、项目国际化&lt;/h3>
&lt;p>这是基于一个中型开源项目的二次开发。
原本的项目只有英文，由于代码量大，文本数量多，是个难度不大、但费时的活儿。&lt;/p>
&lt;p>&lt;strong>小企业，员工有限，活儿干不过来，再招人又要增加成本。找我就很合适，即刻上手干活，临时的合作关系，干完即走。小成本解决大问题。&lt;/strong>&lt;/p>
&lt;h3 id="四docker-部署">四、Docker 部署&lt;/h3>
&lt;p>远程帮客户把整个应用搭建起来。
尽管 Docker 已经很方便了，但在现实中，对于非开发者，依然是个麻烦的东西。&lt;/p>
&lt;h3 id="五linux-服务器应用部署">五、Linux 服务器应用部署&lt;/h3>
&lt;p>同样是为老客户服务。
他的应用在本地运行正常，但是到服务器就出错了。&lt;/p>
&lt;p>这里面主要是 Debug 找到出错的原因。
没有具体的报错，AI 也难啊。
定位到出错的文件，让 AI 给这个文件写了个测试，本地测试正常，服务器上定位到了出错的位置。
再让 AI 解决就简单了。&lt;/p>
&lt;h3 id="六echarts-画图">六、ECharts 画图&lt;/h3>
&lt;p>客户说，找了个人做了 2 天放弃了。
如果是我，如果半天没进展，就早点放弃……&lt;/p>
&lt;p>为啥不好做？最后发现是因为后端给的数据本身就是有问题的。
如果数据有问题，生成的图表就总是错误的。&lt;/p>
&lt;p>怎么发现的呢？自己先用模拟数据，把正确的图表做出来，至少说明图表是能正常生成的。
然后排查后端给的数据，以及数据的处理， console.log 打印出来。&lt;/p>
&lt;h3 id="七为啥我好像啥都会">七、为啥我好像啥都会&lt;/h3>
&lt;p>先说结论，我是走野路子在实战中训练出来的程序员，技术面广，但都不够深入。&lt;/p>
&lt;p>我至今不知道是好是坏。
早年我也学过 C 语言，了解过汇编，想深入学习 Linux 系统底层，但终究没有实战机会。
我最开始学的是 Python ，因为市场需要，入了前端的坑。&lt;/p>
&lt;p>&lt;strong>后来我就认清现实了，人生苦短，黑猫白猫，能抓老鼠，就是好猫……&lt;/strong>&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>程序员该选择技术深度还是技术广度？&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>远程技术管家创业周记（六）- 第一单咨询业务</title><link>https://www.xianmin.org/post/weekly/006/</link><pubDate>Sun, 23 Mar 2025 06:39:41 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/006/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="第六周创业行动">第六周创业行动&lt;/h2>
&lt;p>本周最大的收获是接到了我的第一单咨询。&lt;/p>
&lt;p>来访的是一位即将毕业找工作的大学生，他是我两周前的一位客户。
他跟我说，马上毕业了对前途有点迷茫，想找我聊聊天。
我自知才疏学浅，短时间也解决不了他什么问题，告诉他，我在社会上混了这么多年，我也迷茫。
他还是想找我聊，主动提了价钱，刚好我也有空，那就聊聊呗。&lt;/p>
&lt;p>这次咨询（也可以说是一个迷茫的零零后毕业生与一个迷茫的中年失业者的碰撞），分两个部分进行：&lt;/p>
&lt;h3 id="第一个小时聊人生">第一个小时聊人生&lt;/h3>
&lt;p>我很怕给人生建议，但他想知道，我会给十年前的自己说些什么。
我说，我的想法都是从书本上读来的，没有新鲜的东西，
可以的话就推荐一本书，《穷查理宝典》，分享了书中关于安全边际和多元思维模型的理念。
&lt;strong>我理解的「安全边际」，不仅仅是要保住本金的安全，衍伸了讲，健康、时间、信用等等，都要保证是安全的，不应该透支。&lt;/strong>
还有，芒格的「反向思考」方法也很有意思， &lt;strong>与其去想「我该做什么」，不如思考「我该避免什么」。&lt;/strong>&lt;/p>
&lt;p>聊到他应聘了一家 Web3 公司，关于 Web3 我了解的不多。
只是做了友情提醒，如果不是国内合规的公司，难有保障，也要注意法律风险。&lt;/p>
&lt;p>他说他想考研。
那就努力去考啊，任何时候都不晚，一年时间足够了。
计算机科学里最核心的一个思维模型是 &lt;strong>分而治之&lt;/strong> 。
考研，是大目标大问题，我们怎么把它分解、再分解为一个一个具体的小目标小问题呢？
想是没有用的，只有行动起来。
&lt;strong>行动起来，世界会给你答案。&lt;/strong>&lt;/p>
&lt;p>后面他又续了一个小时。&lt;/p>
&lt;h3 id="第二个小时聊技术">第二个小时聊技术&lt;/h3>
&lt;p>主要是针对两周前给他做的项目，讲解他不懂的地方。
技术方面，没那么多虚的东西，他问什么，我就解释什么。
顺便说了说他这个项目中，有哪些关键的技术点。&lt;/p>
&lt;p>但是对于如何面试、如何找工作，这方面就不是我擅长的了。&lt;/p>
&lt;h2 id="关于这次咨询的思考">关于这次咨询的思考&lt;/h2>
&lt;p>如果这位同学一开始，只是想跟我闲聊，不提付费的事儿，那我可能也就真的只是闲聊，不会讲太多。
但他付了费，性质就不一样了，我就必须把服务做好。&lt;/p>
&lt;p>每个人都可以提供咨询服务，每个人都有自己独有的经验。
付费可以获得更优质的服务。
想从他人的口中获取点什么，不如先给他一点好处。
这是我从这位大学生身上学到的。&lt;/p>
&lt;p>这次咨询，我没有任何准备，但也给了我一些启发。&lt;/p>
&lt;p>或许可以把「咨询服务」包装成产品？这件事儿我还得再琢磨琢磨。&lt;/p>
&lt;p>不过先打个广告吧。&lt;/p>
&lt;p>本人提供以下咨询服务：&lt;/p>
&lt;ol>
&lt;li>计算机前端技术讲解，前端技术最佳实践等；&lt;/li>
&lt;li>针对大众的 AI 使用技巧，AI 对于你所在的行业有哪些应用，我可以分享我的见解；&lt;/li>
&lt;li>如何经营管理民宿的相关建议（好歹我做过 7 年青旅）；&lt;/li>
&lt;li>如何自学计算机、自学英语；&lt;/li>
&lt;li>关于床车、房车自驾旅行的经验；&lt;/li>
&lt;li>关于徒步、长途骑行的经验；&lt;/li>
&lt;/ol>
&lt;p>收费标准： 42 每小时。（数字 42 是「生命、宇宙和万物的终极问题的答案」😄）&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>哪些类型的咨询服务值得付费？
如何有效评估咨询师的专业能力和服务质量？有哪些可靠的评价指标和参考因素？&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>远程技术管家创业周记（五）- 小成本解决大问题</title><link>https://www.xianmin.org/post/weekly/005/</link><pubDate>Fri, 14 Mar 2025 18:07:14 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/005/</guid><description>&lt;p>你好，我是贤民，你身边的 IT 技术管家，这里是我的创业周记。&lt;/p>
&lt;h2 id="第五周创业行动">第五周创业行动&lt;/h2>
&lt;p>关注过我前几期周记内容的朋友，应该会发现，我的标题改了。&lt;/p>
&lt;p>是的，短期自救行动可以告一段落了。
&lt;strong>我有独立接单的能力，能为客户带来价值，也获得了不错的反馈。&lt;/strong>
那么，我觉得可以暂时抛弃找工作的想法，开创自己的事业了。&lt;/p>
&lt;p>如果从创业的角度，此前的内容主题存在以下问题：&lt;/p>
&lt;ol>
&lt;li>「失业」、「农村」、「自救」等字眼，也许能吸引眼球，但降低了我的专业可信度。&lt;/li>
&lt;li>从推荐算法的角度，吸引的或许是同龄失业者和程序员同行，他们并非我的潜在客户。我需要改变策略。&lt;/li>
&lt;li>有点儿以自我为中心了，而非以客户价值为导向。&lt;/li>
&lt;/ol>
&lt;p>目前，我的大方向没有改变，还是希望能做出一款好用且能盈利的产品。本周再次重启了个人的开发计划。&lt;/p>
&lt;p>&lt;strong>生存方面，依然以接单为主，当前接单的收入每周稳定在 1500 左右，可考虑有选择性的接单。&lt;/strong>
每天用于接单的工作时间尽量控制在 5 个小时，其余时间用来做个人项目。&lt;/p>
&lt;p>以上是最近的一点反思。&lt;/p>
&lt;h2 id="本周收获">本周收获&lt;/h2>
&lt;ol>
&lt;li>为一位老师制作了一款浏览器插件，难度不大，但能解决实际问题，同时有助于教育工作，还是有成就感的；&lt;/li>
&lt;li>帮一位程序员解决了小程序在 iOS 下的输入问题；&lt;/li>
&lt;li>解决 Puppeteer 在需要登录的情况下，下载文件的问题。这个问题挺有意思的， AI 又一次陷入了改 Bug 的死循环，我灵机一动，问他通过「某某方法」有没有可能处理，他也恍然大悟。当然，我不喜欢这种 hack 技巧，但 AI 在某个错误的方向上一意孤行的时候，人工介入还是有必要的。&lt;/li>
&lt;li>帮一位大学生写作业。&lt;/li>
&lt;/ol>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>写周记以来，收到了几位陌生朋友的私信，比如分享接单讯息，什么单子可以挣钱；
比如分享工作讯息，告诉我有个可接受远程办公的公司在招人，可能适合我。
也有不少鼓励。&lt;/p>
&lt;p>&lt;strong>我由衷的感谢你们。&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;figure style="display: flex; gap: 10px;">
&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg" alt="图片1描述" style="width: 49%;object-fit: contain;">
&lt;img src="https://www.xianmin.org/mp_wechat.jpg" alt="图片2描述" style="width: 49%;object-fit: contain;">
&lt;/figure></description></item><item><title>33 岁失业农村程序员自救周记 （四）- AI 提效，收入 1410 元</title><link>https://www.xianmin.org/post/weekly/004/</link><pubDate>Sun, 09 Mar 2025 05:50:37 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/004/</guid><description>&lt;p>你好，我是贤民，程序员，你身边的技术管家。
在乡下生活，失业两年，自谋生路，这里是我的自救周记。&lt;/p>
&lt;h2 id="本周自救行动">本周自救行动&lt;/h2>
&lt;p>说说几个有意思的单子：&lt;/p>
&lt;h3 id="企业表格自动化处理">企业表格自动化处理&lt;/h3>
&lt;p>根据表格的内容，提取信息，下载附件到指定位置，压缩，更新表格。&lt;/p>
&lt;p>用的是 Node.js &amp;amp; TypeScript 。
前几年写 ts ，最麻烦的就是标注类型，
有了 AI 之后，写 ts 的效率提高了太多。
用 ts 写出的程序，更健壮，也更容易维护。&lt;/p>
&lt;p>从我的经验而言，AI 依然是一个助手的角色，我必须知道它每一步都做了什么，才不会被它带偏方向。&lt;/p>
&lt;h3 id="automa-自动化脚本">Automa 自动化脚本&lt;/h3>
&lt;p>这是一个老客户的需求，自动给招聘网站投简历。&lt;/p>
&lt;p>这个需求还是挺耗费时间的，因为 AI 帮不上忙，都得手动定位和调试。&lt;/p>
&lt;p>自动化脚本，这块儿市场需求还是挺多的，每个人的操作流程不同，需要不一样的定制方案。
以后或许可以多接一些这类单子。&lt;/p>
&lt;p>对于一些重复性操作，都应该让机器帮我们自动完成。&lt;/p>
&lt;h3 id="vue-改-react">Vue 改 React&lt;/h3>
&lt;p>这又是一个需要知道 AI 做了什么的例子。&lt;/p>
&lt;p>客户会用 AI 帮忙转换，但他不理解 React 的代码，运行不了，他就没招了。&lt;/p>
&lt;p>有人说， AI 取代程序员，目前看来，完全取代还做不到。
但是五天的工作量，压缩到一天完成，或者原本需要五个人做的事情，现在也许只需要一个人就能做了。&lt;/p>
&lt;p>对于我这种靠接单吃饭的程序员是有好处的。
以前，一个单子，如果是两天的活儿，报价 1000 ，客户会嫌贵，不做了。
这种单子没法成交，一方面程序员要耗费时间，另一方面，客户那边预算不够。
但现在只需要两小时，报价 200 ，客户可以接受了。
所以，在我看来， &lt;strong>我们可接单的范围是更广阔了。&lt;/strong>
但从找工作的角度，也许岗位更少了，甚至要求也更高了。&lt;/p>
&lt;h3 id="基于-wangeditor-的二次开发">基于 WangEditor 的二次开发&lt;/h3>
&lt;p>这是一个失败案例。&lt;/p>
&lt;p>客户一开始说的是，改两个 BUG 。
接了单以后，才发现是一个实验项目，主要是针对 WangEditor ，一个富文本编辑器的二次开发。&lt;/p>
&lt;p>需求表面上看并不复杂，但实际操作，要深入到 WangEditor 的源码。
研究了两个小时的源码，跟客户说，要耗费更多的时间。
然后才知道，客户是中介，他把单子转交给我做。
唉，这种不能直接面对客户，交流就比较费劲，最后只能退款了。&lt;/p>
&lt;h2 id="本周收入">本周收入&lt;/h2>
&lt;p>成交 8 笔单子，合计 1410 元。
其中有 2 笔，是老客户。
感谢所有支持我的老板！&lt;/p>
&lt;p>&lt;strong>为什么很多人在失业之后，会遇到困境？ 一大原因是没有自己的客户资源。&lt;/strong>
我以前做青旅的时候，年营业额差不多有近三成是老顾客贡献的。
但后面转型做回程序员，青旅的客户资源基本就用不上了，只能重新开始。&lt;/p>
&lt;p>&lt;strong>客户是需要积累的，信任也需要时间和合作案例去加深。&lt;/strong>&lt;/p>
&lt;p>目前老客户并不多，我也还是在模仿学习，比如把客户的联系方式加上，以后对方再有需求的时候，可能会直接想到我。&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>如果你在生活中，遇到任何计算机相关的技术问题，欢迎扫描下方二维码，免费咨询。&lt;/p>
&lt;p>&lt;img src="https://www.xianmin.org/wechat_qrcode.jpg">&lt;/p></description></item><item><title>33 岁失业农村程序员自救周记 （三）- 明确定位</title><link>https://www.xianmin.org/post/weekly/003/</link><pubDate>Sat, 01 Mar 2025 14:41:53 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/003/</guid><description>&lt;p>你好，我是贤民，33 岁，程序员，在乡下生活，失业两年。&lt;/p>
&lt;p>这周收入破千，算是完成了阶段性的目标。&lt;/p>
&lt;h2 id="本周自救行动">本周自救行动&lt;/h2>
&lt;p>这周的前四天，一直在忙碌。
一人身兼数职，销售、客服、售后、写手，反正都得自己上。
计算机技能就不多说了，这是吃饭的手艺。
而且，我发现自己杂而不精的技术，特别适合干一些专业人士看不上的小活儿。&lt;/p>
&lt;p>被人需要，是有价值感的。
最多的一天，跟十多个客户沟通，同时做四个任务。
尽管说，也没挣多少钱吧，但起码对我个人的劳动成果是一种肯定。&lt;/p>
&lt;h2 id="讲讲失败的案例吧">讲讲失败的案例吧&lt;/h2>
&lt;p>第一个，是远程打印的活儿。
这位老板对我挺好的，先给我做了个小活儿打赏了点，然后给我安排了这个活儿。
好巧不巧，当时我手边还有两个未完成的项目。
琢磨了俩小时，发现远程打印没那么简单，自己还有其他未完成的项目，只能跟他说退款了。
这其实挺尴尬的，消耗了他人对我的信任。
唉，收钱是信用的保障，如果没时间、没把握，不能随便收钱啊。&lt;/p>
&lt;p>第二个，是做一个网页篡改的插件。
客户说的比较简单，就是某个网页的表格，1 改成 2 ，所以我报价也比较低。
后面发现是外国政府的网站，光密钥登录就耗费了一个多小时，修改吧也没那么容易。
也只能退款了。
这位客户是比较狡猾的，跟你描述的是很容易的业务，但实际情况并非如此。&lt;/p>
&lt;p>成功案例呢，就不多说了，说个比较感动的反馈：&lt;/p>
&lt;p>&lt;strong>「我折腾了一周都没解决，你一个小时就帮我搞定了，下次就直接来找你了。」&lt;/strong>&lt;/p>
&lt;h2 id="阶段性总结">阶段性总结&lt;/h2>
&lt;p>在 2 月份，春节结束后，我重新梳理了自己的境况。
明确了以接单为主线，优先解决生存问题，
以内容写作、开发个人项目为第二曲线，这样的个人发展方向。
尽管如此选择，依然属于高风险，但也是过往经历造就的，没什么好与不好的。&lt;/p>
&lt;p>从过去三周的成果来看呢，今年的短期自救计划应该是可行的。
只要接单能解决生存问题，那暂时就不需要去找工作了。
我现在重新给自己的定位是： &lt;strong>你身边的技术管家。&lt;/strong>
换言之，计算机技术方面的水电临时工。
Bug 搞不定，我来修；开发环境建不起来，远程我帮你；
历史遗留项目不想弄，没事，让我来；要开发个小应用，可以的，三天给你做出来。&lt;/p>
&lt;p>&lt;strong>大的项目，如果不是特别感兴趣，短期应该是不考虑了。&lt;/strong>&lt;/p>
&lt;p>&lt;strong>一些反思：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>高效沟通，不能恋战。一看是灰产的，直接拒绝。想找廉价劳动力的，尽早结束对话。10 句话谈不清需求和预算的，不必再聊了。&lt;/li>
&lt;li>梳理话术，并熟练掌握。朋友说我说话太硬，是的，从我的行文风格也能看出来，可以说是情商太低。但在销售、客服方面呢，又需要有服务态度和意识，这只能让 AI 教我怎么跟客户沟通了。&lt;/li>
&lt;li>提升报价水平。这方面只能靠经验积累了。有些小单，是很简单，但要耗费三四个小时，价格太低就很不划算了。有些问题事先沟通就可以及早解决的。&lt;/li>
&lt;/ol>
&lt;h2 id="本周收入">本周收入&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">日期&lt;/th>
&lt;th style="text-align: left">概况&lt;/th>
&lt;th style="text-align: left">时长&lt;/th>
&lt;th style="text-align: left">金额&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">0224&lt;/td>
&lt;td style="text-align: left">网站搭建&lt;/td>
&lt;td style="text-align: left">2h&lt;/td>
&lt;td style="text-align: left">50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0224&lt;/td>
&lt;td style="text-align: left">企业应用&lt;/td>
&lt;td style="text-align: left">2d&lt;/td>
&lt;td style="text-align: left">600&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0225&lt;/td>
&lt;td style="text-align: left">bug 修复&lt;/td>
&lt;td style="text-align: left">1.5h&lt;/td>
&lt;td style="text-align: left">80&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0225&lt;/td>
&lt;td style="text-align: left">功能添加&lt;/td>
&lt;td style="text-align: left">2h&lt;/td>
&lt;td style="text-align: left">80&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0225&lt;/td>
&lt;td style="text-align: left">远程支援&lt;/td>
&lt;td style="text-align: left">1.5h&lt;/td>
&lt;td style="text-align: left">80&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0226&lt;/td>
&lt;td style="text-align: left">上周回款&lt;/td>
&lt;td style="text-align: left">0&lt;/td>
&lt;td style="text-align: left">450&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0226&lt;/td>
&lt;td style="text-align: left">企业应用&lt;/td>
&lt;td style="text-align: left">1d&lt;/td>
&lt;td style="text-align: left">300&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">0227&lt;/td>
&lt;td style="text-align: left">网站搭建&lt;/td>
&lt;td style="text-align: left">2h&lt;/td>
&lt;td style="text-align: left">80&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>合计： 1720 元。&lt;/p>
&lt;p>以上关于时长的统计只是粗略计算，通常沟通要占据不少时间。&lt;/p>
&lt;p>我感觉公开收入似乎并不太合适，以后可能视情况再公开了……&lt;/p>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>如果你对中年失业程序员的自救行动有什么看法，欢迎给我留言，谢谢！🙏&lt;/p></description></item><item><title>33 岁失业农村程序员自救周记 （二）- 写论文</title><link>https://www.xianmin.org/post/weekly/002/</link><pubDate>Sun, 23 Feb 2025 00:31:09 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/002/</guid><description>&lt;p>你好，我是贤民，33 岁，程序员，在乡下生活，失业两年。&lt;/p>
&lt;h2 id="本周自救行动">本周自救行动&lt;/h2>
&lt;p>上周末接了个写论文的活儿，关于机器学习的。
我对机器学习领域了解的不多，但会写点 Python 。
而且不是有 AI 辅助么，就大胆的接了单。
现在看来，真是有点儿不自量力了。&lt;/p>
&lt;p>写代码写了整整四天，头两天没啥进展的时候，都想要放弃了。
第三天有点进展了，硬件不行，AI 改 BUG 又陷入死循环。
主要还是不懂啊，让 AI 帮忙解释，每行字都认识，就是不知道它为什么这么做。
我也没那么多时间去啃基础知识，只能硬着头皮一轮接一轮新的对话去试验。
最麻烦的就是上下文的缺失，我得重新给它梳理我们之前的进度。
不管怎么样，最后勉强达到了实验目的，距离跟客户约定的交稿时间也只剩一天了。
最后一天匆匆忙忙，赶出了一篇近两万字的论文，当然，都是 AI 辅助的。&lt;/p>
&lt;p>交稿的那一刻，我感觉自己整周的精力都耗尽了。
这是我第一次写论文，第一次写机器学习相关的代码。
干这个活儿，何止是跳出了舒适圈，简直是在不舒适的黑暗中打滚。
尽管对于稿子质量、代码质量，我是没有那么满意的，不过至少对客户有了个交代。
这个钱，不好挣呐！&lt;/p>
&lt;p>我事后总结，对于专业人士，就是两天的活儿。
一天写代码，一天写论文，相当于一天 500，这活儿也不是不能做。
我主要是对机器学习一窍不通，这就需要花时间去学习了。
把基础知识搞明白，我预计需要两周时间。
但我不清楚弄明白了机器学习，除了写论文，还能做什么。&lt;/p>
&lt;h2 id="本周收入">本周收入&lt;/h2>
&lt;ol>
&lt;li>成交 2 笔小单 +110 元；&lt;/li>
&lt;/ol>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;ol>
&lt;li>你是否有辅导写论文的经历？&lt;/li>
&lt;li>你认为机器学习这个方向值得投入时间学习吗？&lt;/li>
&lt;/ol>
&lt;p>如果你对中年失业程序员的自救行动有什么看法，欢迎给我留言，谢谢！🙏&lt;/p></description></item><item><title>33 岁失业农村程序员自救周记 （一）</title><link>https://www.xianmin.org/post/weekly/001/</link><pubDate>Sun, 16 Feb 2025 02:23:22 +0000</pubDate><guid>https://www.xianmin.org/post/weekly/001/</guid><description>&lt;p>你好，我是贤民，33 岁，程序员，在乡下生活，失业两年。
初中学历，自学的编程，早年在深圳入的行。
后来去丽江做了 7 年的青旅店长，因为疫情等原因，关门了。
不想去大城市，做了一年多的远程工作。
前年和女友流浪旅行，编程工作又中止了。
旅行期间帮女友做自媒体账号，拍视频、写文案。
去年稍有起色，可收益连半个人的开销都不够。
软饭硬吃的愿望破灭了。&lt;/p>
&lt;p>今年为了解决生存问题，我必须做一些改变。
就从这篇周记开始吧，在这里记录过去一周我的自救行动。&lt;/p>
&lt;h2 id="如何自救">如何自救&lt;/h2>
&lt;p>在去年，我有简单地尝试过独立开发的路线，做了一个阅读器应用——EvoReader。
但上线后没有什么反馈，很多功能还没有完善，我就暂停了。
因为我没想好如何宣传、如何变现的问题，继续开发可能会不断增加沉没成本。
我对这个项目没有信心。
然后我就去学习、了解，别的独立开发者是怎么做的，他们是如何盈利的。
真实状况比我想象的要困难的多，绝大多数独立开发者的作品，都隐没在互联网的汪洋中。
脱颖而出的少数，变现也十分不容易。
要走通这条路，对个人综合能力的要求非常高，而且费时费力还不一定有结果。
我目前亟须挣钱，这条路只能空闲时间玩一玩了。&lt;/p>
&lt;h2 id="排除去大城市找工作">排除去大城市找工作&lt;/h2>
&lt;p>我在云南乡下生活多年，自由散漫惯了，很难再回大城市。
我的履历再去找工作也是地狱模式。&lt;/p>
&lt;h2 id="找远程工作">找远程工作&lt;/h2>
&lt;p>一般小的创业团队才可能用得上我这种复合型程序员。
这个相对合适，但又需要机缘。&lt;/p>
&lt;h2 id="接单">接单&lt;/h2>
&lt;p>去年在某平台上接了一些小单，算是跑通了一条路子。
只是单子太少，单价太低。
积累的不够，过去选择多，没在接单上下过功夫。
有些不感兴趣的单子又不想干，现在不得不转变观念了。&lt;/p>
&lt;p>接单的正反馈简单直接，一个单子就是一笔收入。
在 AI 的加持下，效率有了极大的提升。
这是我短期内自救的主线。&lt;/p>
&lt;h2 id="内容写作">内容写作&lt;/h2>
&lt;p>我很早就有个人网站，也因为这个网站找到过工作，认识了新朋友。
但是怎么说呢，产出太少，更新频率太低，主要还是自己太懒了。
这条路线，短期为接单服务，长期为个人可能的作品服务。&lt;/p>
&lt;h2 id="写更多的工具类应用">写更多的工具类应用&lt;/h2>
&lt;p>目前熟练了一套自用的 AI 开发流程。
只要有想法，开发效率直接起飞。&lt;/p>
&lt;h2 id="本周完成事项">本周完成事项&lt;/h2>
&lt;ol>
&lt;li>在个人网站上放了 Google 广告。唉，尽管知道不会有多少收益，但目前的境况各个方向都得去尝试；&lt;/li>
&lt;li>开通微信公众号——认知跃迁计划；&lt;/li>
&lt;li>更新公众号和小红书，必须迈出这一步，我感觉自己开窍比别人晚一百步；&lt;/li>
&lt;li>整理了一份找远程工作的网站清单；&lt;/li>
&lt;li>加入 3 个接单群（依旧是开窍太晚）；&lt;/li>
&lt;/ol>
&lt;h2 id="本周收入">本周收入&lt;/h2>
&lt;ol>
&lt;li>成交 1 笔小单 + 98 元；&lt;/li>
&lt;li>成交 1 笔小单 + 149 元；&lt;/li>
&lt;li>这样的小单请多来点……&lt;/li>
&lt;/ol>
&lt;h2 id="结束语">结束语&lt;/h2>
&lt;p>如果你对中年失业程序员的自救行动有什么看法，欢迎给我留言，谢谢！🙏&lt;/p></description></item><item><title>为什么我使用 Vivaldi 作为主力浏览器</title><link>https://www.xianmin.org/post/2025/why-choose-vivaldi-browser-vs-chrome/</link><pubDate>Thu, 13 Feb 2025 12:57:01 +0800</pubDate><guid>https://www.xianmin.org/post/2025/why-choose-vivaldi-browser-vs-chrome/</guid><description>&lt;p>我用了许多年的 Chrome ，它速度快，扩展多，调试网页方便，满足我的一切需求。&lt;/p>
&lt;p>但在前年的某一天，Chrome 突然改变了 UI 风格，让我用的很不习惯。&lt;/p>
&lt;p>主要是右键菜单栏的变化，菜单选项的间距大了，选项过多时还需要滚动。&lt;/p>
&lt;p>一开始可以通过 &lt;code>chrome://flags/&lt;/code> ，换回旧的 UI 风格，后来压根儿就换不回去了。&lt;/p>
&lt;p>我在网络上寻找新的解决办法，然后就看到有人说，可以用 Vivaldi 。
那就试一试吧。&lt;/p>
&lt;p>&lt;img alt="Vivaldi 浏览器" src="https://www.xianmin.org/post/2025/why-choose-vivaldi-browser-vs-chrome/vivaldi.jpg" title="Vivaldi 浏览器界面展示">&lt;/p>
&lt;p>切换到 Vivaldi 没有太多不适，它也是基于 Chromium 的浏览器，可以直接安装 Chrome 商店的扩展。&lt;/p>
&lt;p>我把书签迁移过去，把常用扩展装上，需求基本就满足了。
&lt;strong>Vivaldi 的右键菜单，可以切换回旧的样式，这是我最初使用它的动机。&lt;/strong>&lt;/p>
&lt;p>Vivaldi 在 Chromium 的基础上，增添了许多额外的功能。
我开始并没有怎么用，但后来发现，有些功能还挺好用的。&lt;/p>
&lt;p>分享几个我最常用的功能：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>侧边栏标签页管理。&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>标签一旦多了，看不到标题，找不到想要跳转的标签。
但是侧边栏的窗口管理器就很方便。
方便切换标签，也方便标签的删除、移动等操作。&lt;/p>
&lt;ol start="2">
&lt;li>&lt;strong>多页面平铺。&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>有时候在一个窗口同时展示两个标签页，这样就不用来回切换了。&lt;/p>
&lt;ol start="3">
&lt;li>&lt;strong>加载图片的开关。&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>有的内容网站图片太多了，我只需要看文字。&lt;/p>
&lt;ol start="4">
&lt;li>&lt;strong>整个网页截图。&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>内置的网页截图工具，操作便捷。&lt;/p>
&lt;p>等等。&lt;/p>
&lt;p>尽管以上功能，某些 Chrome 扩展就能实现，但 Vivaldi 将它们集成在浏览器中，体验更加流畅&lt;/p>
&lt;p>至于 Vivaldi 的其他功能，如内置邮箱客户端、RSS 阅读器等，这些我用不上，就不做评价了。&lt;/p></description></item><item><title>解除网页复制限制的插件 - userscript-copy-unblocker 油猴脚本</title><link>https://www.xianmin.org/post/2025/userscript-copy-unblocker/</link><pubDate>Mon, 03 Feb 2025 13:36:42 +0000</pubDate><guid>https://www.xianmin.org/post/2025/userscript-copy-unblocker/</guid><description>&lt;p>有的网站不能复制文本，我原来使用的是 SuperCopy 这个 Chrome 扩展，来解除网站的复制限制。后来看到这个扩展存在流量劫持的行为： &lt;a href="https://www.v2ex.com/t/1084504">60W 用户 Chrome 插件存在恶意代码 - V2EX&lt;/a> 。&lt;/p>
&lt;p>好吧，那干脆让 AI 帮我写一个脚本吧。&lt;/p>
&lt;p>项目地址： &lt;a href="https://github.com/xianmin/userscript-copy-unblocker">xianmin/userscript-copy-unblocker: Automatically removes copy restrictions&lt;/a>&lt;/p>
&lt;h2 id="userscript-copy-unblocker">userscript-copy-unblocker&lt;/h2>
&lt;p>userscript-copy-unblocker 是一个油猴脚本，可以自动移除网页的复制限制，让你能够自由地复制文本内容。&lt;/p>
&lt;h2 id="如何使用">如何使用&lt;/h2>
&lt;ol>
&lt;li>安装浏览器扩展：
&lt;ul>
&lt;li>Chrome：&lt;a href="https://chromewebstore.google.com/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo">Tampermonkey&lt;/a>&lt;/li>
&lt;li>Firefox：&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/">Greasemonkey&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>安装 Copy Unblocker 脚本：&lt;a href="https://raw.githubusercontent.com/xianmin/userscript-copy-unblocker/refs/heads/master/copy-unblocker.user.js">点击安装&lt;/a>&lt;/li>
&lt;li>访问支持的网站，脚本会自动移除复制限制&lt;/li>
&lt;/ol>
&lt;h2 id="功能特性">功能特性&lt;/h2>
&lt;ul>
&lt;li>自动移除网页复制限制&lt;/li>
&lt;li>启用文本选择和右键菜单&lt;/li>
&lt;li>移除遮挡内容的覆盖层&lt;/li>
&lt;li>支持键盘快捷键（Ctrl+C/Cmd+C）&lt;/li>
&lt;/ul>
&lt;h2 id="添加新网站支持">添加新网站支持&lt;/h2>
&lt;p>如果你希望脚本支持新的网站，可以：&lt;/p>
&lt;ol>
&lt;li>在 GitHub 上提交 &lt;a href="https://github.com/xianmin/userscript-copy-unblocker/issues">Issue&lt;/a>&lt;/li>
&lt;li>或者直接修改脚本，在代码头部添加新的 &lt;code>@match&lt;/code> 规则&lt;/li>
&lt;/ol>
&lt;h2 id="隐私和安全">隐私和安全&lt;/h2>
&lt;ul>
&lt;li>完全在客户端运行&lt;/li>
&lt;li>无数据收集&lt;/li>
&lt;li>开源透明&lt;/li>
&lt;/ul>
&lt;h2 id="其他参考链接">其他参考链接&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/WindRunnerMax/TKScript">WindRunnerMax/TKScript: 油猴脚本 &amp;amp; 浏览器扩展&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.runningcheese.com/enable-copy">3 个方法，帮你解决 99% 的网页复制问题 - 奔跑中的奶酪&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>