<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>W's</title><link>https://zhangwei.name/</link><description>BoringLife-LOG</description><item><title>AI周报2026-02</title><link>https://zhangwei.name/post/AI%E5%91%A8%E6%8A%A52026-02.html</link><description>&lt;h1&gt;AI 模型&lt;/h1&gt;

&lt;h2&gt;Claude（Anthropic）&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：Claude 模型可在数秒内分析财务报表并生成投资备忘录。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：演示显示模型处理完整财务报表并快速输出结构化投资备忘录，突出高度自动化潜力。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：揭示 AI 对初级金融分析、投研助理等岗位的直接冲击，加速金融工作流自动化。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Gemini 3 Flash&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：Gemini 3 Flash 将传统手动 ETL 转换为近实时工作流。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：演示中模型可快速识别数据来源不匹配问题，并自动生成、修复数据管道。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：体现 AI 在数据工程中的速度与推理能力，大幅提升数据处理效率。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;DeepCode（多代理系统）&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：DeepCode 使用多代理系统将研究论文直接转化为可运行代码。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：通过 MCP 协调多个代理完成论文解析、代码实现，并同步生成测试与文档。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：显著缩短从学术研究到工程原型的路径，加速创新落地。&lt;/p&gt;

&lt;hr /&gt;

&lt;h1&gt;AI 工具 / 产品&lt;/h1&gt;

&lt;h2&gt;Nano Banana × N8N&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：Nano Banana 与 N8N 结合，可自动创建大规模滚动视觉效果。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：实现从产品目录到创意素材的全自动流程，利用 Google 图像模型生成专业广告视觉。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：极大降低营销视觉内容的制作成本与周期，并支持无限创意变体。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;GPU vs ASIC&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：在 AI 场景中，GPU 相比 ASIC 具备更强的可编程性。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：随着模型结构与任务不断变化，AMD 与 NVIDIA 预计将持续主导加速器市场。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：明确 AI 硬件趋势中，灵活性优先于单一性能指标，GPU 地位进一步巩固。&lt;/p&gt;

&lt;hr /&gt;

&lt;h1&gt;AI 创意 / 用法&lt;/h1&gt;

&lt;h2&gt;逝后对话 AI&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：基于父亲生前语音邮件训练 AI，实现“逝后对话”。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：通过模拟真实交谈提供情感慰藉，借助 Geoff 工具完成模型构建。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：展示 AI 在情感陪伴与哀悼管理领域的高度个人化应用潜力。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;AI 辅助编码学习&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：通过 AI 辅助编码学习，采用“构建项目 + 逆向工程”方式提升能力。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：在具备基础后，使用 AI 构建完整项目，并要求对每一行代码进行解释，确保真正理解。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：显著加快学习速度，同时避免“只会复制、不懂原理”的陷阱。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;多模态爆炸视图&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：使用 AI 工具生成塔可的爆炸视图，清晰展示五种核心成分。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：结合 Nano Banana Pro 与 Kling AI，实现商业级配方分解与视觉呈现。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：体现多模态 AI 在视觉解释与教学、营销场景中的实际价值。&lt;/p&gt;

&lt;hr /&gt;

&lt;h1&gt;行业观点 / 趋势&lt;/h1&gt;

&lt;h2&gt;技术技能杠杆&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：AI 正在显著放大技术技能的杠杆效应，尤其在工程领域。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：智能代理接管大量常规工作，使专业人士将精力集中于战略与创造性任务。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：率先采用 AI 的工程师与技术人员，正处于长期竞争优势位置。&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;RAG 架构演进&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：总结 8 种 RAG 架构，从 Naive RAG 到 Agentic RAG。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;补充完善&lt;/strong&gt;：覆盖从简单检索增强生成，到复杂多代理系统，适配不同复杂度任务需求。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：为构建高级、可定制的 AI 检索系统提供清晰框架参考。&lt;/p&gt;
</description><pubDate>Thu, 08 Jan 2026 21:26:55 +0800</pubDate></item><item><title>comfyUI 节点安装失败，艰苦填坑36小时</title><link>https://zhangwei.name/post/comfyui-node-debug.html</link><description>&lt;p&gt;填坑背景介绍：&lt;/p&gt;&lt;p&gt;公司设计师的windows系统使用的comfyUI的一键安装包，各种牛鼻的ai图片是真不错。&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://img.e.scienmedia.com/zblog/public/images/2024/11/202411081185_7776.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;然后，自己在家里的ubuntu24系统上也弄了一套，可惜，卡在了各种节点的安装上，把公司的工作流加载进来那是一片红阿，比美女老婆的经期都要红。各种google chatgpt gemini，连百度的一言都没放过，都没有能够解决。对于我的情况，排除了以下错误方案，如果你也有同样烦恼，不妨一一失错，万一对你有用。(如果是网络文字，就自己解决吧)&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;卸载python-opencv,重新安装指定版本的opencv 所谓指定，真没有个定数，网友提供了各个版本，所以在这儿，我也不指定了，你们一个个试&amp;nbsp;&lt;img class=&quot;ue-emoticon&quot; src=&quot;https://zhangwei.name/zb_users/emotion/face/Sleep.gif&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;完全删除整个ComfyUI文件夹，重新git clone，重新装manager，有些网友，竟然解决了&amp;nbsp;&lt;img class=&quot;ue-emoticon&quot; src=&quot;https://zhangwei.name/zb_users/emotion/face/Cry.gif&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;权限不够，赋予ComfyUI文件夹755权限，我在这一步，有点儿小进展，可能是&lt;strong&gt;必选&lt;/strong&gt;步骤&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GPT的推荐，使用sudo python main.py 实在没招，可以一饰&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;网络方面的折腾，电脑有线千兆网卡（socket代理）、WIFI百兆网卡（连接自由网络），两个网络环境都能正常启动，但是在安装有些节点的时候有线会卡住，切换到wifi直连会好，就是各种切换各种折腾。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;好了，我最终的解决方法，还是从runcomfy网站上找到的，可是很多人都懒得看这些文章，只会在各种同性恋论坛上发问，&lt;a href=&quot;https://comfyui-guides.runcomfy.com/ultimate-comfyui-how-tos-a-runcomfy-guide/how-to-fix-this-action-is-not-allowed-with-this-security-level-configuration&quot; target=&quot;_blank&quot;&gt;文章地址&lt;/a&gt;&amp;nbsp;就是降低ComfyUI-Manager的安全等级&amp;nbsp;&lt;img class=&quot;ue-emoticon&quot; src=&quot;https://zhangwei.name/zb_users/emotion/face/Music.gif&quot;/&gt;&amp;nbsp;ComfyUI-Manager/config.ini&amp;nbsp;&amp;nbsp;security_level = normal 改成 weak&lt;/p&gt;</description><pubDate>Fri, 08 Nov 2024 18:22:54 +0800</pubDate></item><item><title>微信群聊机器人介入AI</title><link>https://zhangwei.name/post/%E5%BE%AE%E4%BF%A1%E7%BE%A4%E8%81%8A%E6%9C%BA%E5%99%A8%E4%BA%BA%E4%BB%8B%E5%85%A5AI.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://img.e.scienmedia.com/zblog/public/images/2024/04/202404099625_3710.png&quot; title=&quot;WX20240409-112633@2x.png&quot; alt=&quot;WX20240409-112633@2x.png&quot; width=&quot;699&quot; border=&quot;0&quot; vspace=&quot;0&quot;/&gt;&lt;/p&gt;&lt;p&gt;16年那时候我们的工作群就加入了机器人，那时候用的是web版的接口，后来微信封锁了，又改称了目前的PC端软件hook方式。只是最近把我们机器人拉入了客户群，充当客服，给他们解答订单进度问题。客户领导感兴趣了，追着问怎么搞。&lt;/p&gt;&lt;p&gt;其实hook也不算是新事物，可能觉得对接上openai，变得更牛逼了，有些人才会更感兴趣。只聊实现思路啊，具体的还是靠大家去github找轮子，或者自己diy。&lt;/p&gt;&lt;p&gt;hook就离不开注入器，我们公司大部分都是mac系统，目前好像真没有针对mac的hook成熟技术。我们自己搞得时候也不费神了，直接找个机子换成windows系统，然后装微信，再弄个对应版本的注入器，搞定。&lt;/p&gt;&lt;p&gt;然后就自己开发了，ws方式与hook通信，微信收到的所有信息，你都能拿到，想怎么弄就随便你了，我们一直用的是python，我看到也有些用的是go，其实没什么区别。openai的sdk直接装下，介入ai太简单了&lt;/p&gt;</description><pubDate>Tue, 09 Apr 2024 11:25:09 +0800</pubDate></item><item><title>摩友福音！通知转语音</title><link>https://zhangwei.name/post/VoiceNotify.html</link><description>&lt;p&gt;因为穷，一直摩托车通勤，开了这么多年摩托车，其他什么都好，但是有个小困扰，行驶过程中会耽误一些重要的回复，虽然大多数人的消息可以滞后再回复，但是咱还没有到那么高的级别，什么事情都可以不紧不慢的处理。就曾经耽误了非常重要客户的消息。&lt;/p&gt;&lt;p&gt;怎么解决？一开始最简单的方式，就是换车，换一台有智能行车面板的摩托车，可是找了一圈，符合这个要求的车型我又不喜欢，本人一只喜欢复古巡航车。第二个方案，找个智能屏装上，试了几个车行，装上效果就是丑爆，跟我车型完全不搭。&lt;/p&gt;&lt;p&gt;准备放弃的时候，Google Play上搜了下通知转语音，wooooo ～～～&amp;nbsp; 终于有个app完美解决我这个小需求。&lt;/p&gt;&lt;p&gt;链接&amp;nbsp;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.pilot51.voicenotify&amp;hl=zh_CN&quot; _src=&quot;https://play.google.com/store/apps/details?id=com.pilot51.voicenotify&amp;hl=zh_CN&quot;&gt;https://play.google.com/store/apps/details?id=com.pilot51.voicenotify&amp;amp;hl=zh_CN&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;里面所有设置都100%符合我的期望，比如，只播放某些app的通知，只播放指定内容的通知，只在连接蓝牙/熄屏时播报 😄 非常非常赞&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://img.e.scienmedia.com/zblog/public/images/2024/01/202401166335_2843.webp&quot; title=&quot;unnamed.webp&quot; alt=&quot;unnamed.webp&quot; width=&quot;482&quot; height=&quot;1011&quot; border=&quot;0&quot; vspace=&quot;0&quot; style=&quot;width: 482px; height: 1011px;&quot;/&gt;&lt;/p&gt;</description><pubDate>Tue, 16 Jan 2024 16:46:05 +0800</pubDate></item><item><title>换种思路训练gpt3.5</title><link>https://zhangwei.name/post/%E6%8D%A2%E7%A7%8D%E6%80%9D%E8%B7%AF%E8%AE%AD%E7%BB%83gpt3.5.html</link><description>&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;问题一&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;我用的是aws的免费服务器，centos，版本比较老旧，想在python3基础上运行openai，可惜怎么都装不了，openai提供的方法，使用&lt;span style=&quot;color: rgba(255, 255, 255, 0.5); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; white-space-collapse: preserve; background-color: #000000;&quot;&gt;pyenv&lt;/span&gt;来装，顺利解决。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;curl&amp;nbsp;https://pyenv.run&amp;nbsp;|&amp;nbsp;bash&lt;/pre&gt;&lt;p&gt;然后配置下环境&amp;nbsp;&lt;span style=&quot;color: #FFFFFF; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-weight: 600; white-space: pre-wrap; background-color: #444654;&quot;&gt;~/.bashrc&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;export&amp;nbsp;PATH=&amp;quot;$HOME/.pyenv/bin:$PATH&amp;quot;
eval&amp;nbsp;&amp;quot;$(pyenv&amp;nbsp;init&amp;nbsp;-)&amp;quot;
eval&amp;nbsp;&amp;quot;$(pyenv&amp;nbsp;virtualenv-init&amp;nbsp;-)&amp;quot;&lt;/pre&gt;&lt;p&gt;最后&lt;span class=&quot;hljs-built_in&quot; style=&quot;border: 0px solid #D9D9E3; box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-shadow: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-shadow-colored: 0 0 transparent; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; color: #E9950C; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; white-space-collapse: preserve; background-color: #000000;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; white-space-collapse: preserve; background-color: #000000;&quot;&gt; ~/.bashrc&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;开始安装python&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;pyenv&amp;nbsp;install&amp;nbsp;3.9.0&lt;/pre&gt;&lt;p&gt;如果系统存在更高的python版本，需要设置成你想要的版本号&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;pyenv&amp;nbsp;global&amp;nbsp;3.9.0&lt;/pre&gt;&lt;p&gt;也还有可能出现这个错误 The `python3&amp;#39; command exists in these Python versions:3.9.0&lt;/p&gt;&lt;p&gt;这个情况下，需要指定shell版本&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;pyenv&amp;nbsp;shell&amp;nbsp;3.9.0&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;问题二&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;urllib3的库只支持openssl 1.1.1+，奈何系统已经升级了最新版本的openssl，urllib还是报错，只能降级urllib3了&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;pip3&amp;nbsp;install&amp;nbsp;urllib3==1.26.6&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;问题三&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;openai的关联库sklearn，已安装的情况下，一直报错&amp;nbsp;ModuleNotFoundError: No module named &amp;#39;sklearn&amp;#39;&lt;/p&gt;&lt;p&gt;解决方法：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;pip&amp;nbsp;install&amp;nbsp;scikit-learn&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;问题都解决了，那开始进入正题，如何换思路呢？&lt;/p&gt;&lt;p&gt;前面这篇&lt;a href=&quot;https://zhangwei.name/post/%E4%B8%8D%E5%A4%AA%E7%90%86%E6%83%B3%E7%9A%84Fine-tunes.html&quot; target=&quot;_self&quot;&gt;POST&lt;/a&gt;已经提到过了，finetunes不理想，我个人已经放弃训练这个3.0版本了，3.5有角色功能，system assistant&amp;nbsp; user，我直接从system角色入手，提前将匹配的答案存入system。实操是有明显效果的，只是会消耗更多的token。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;开始，首先思路有了，怎么才能轻松地把匹配的答案找到呢，我们还是使用openai的工具：embeddings_utils，我们先将原县喂给&lt;span style=&quot;text-wrap: wrap;&quot;&gt;finetunes的资料丢给&lt;span style=&quot;text-wrap: wrap;&quot;&gt;embeddings，然后get_embedding出最佳答案，最后存入system，发送给api。效果挺好，就是费钱。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 07 Jun 2023 10:43:15 +0800</pubDate></item><item><title>mpvue vant 做个简单的核销小程序</title><link>https://zhangwei.name/post/mpvue%20vant%20%E5%81%9A%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E6%A0%B8%E9%94%80%E5%B0%8F%E7%A8%8B%E5%BA%8F.html</link><description>&lt;p&gt;我们公司业务一般偏营销，小程序的属性在营销这块没有那么明显，所以很少会有小程序的业务，这次也是帮朋友的忙，用mpvue+vant做了个简单的应用。应用不复杂，但是大部分的功能也都用到了，比如生成/扫描二维码，支付，订阅通知，控制屏幕亮度，监测截图行为。&lt;/p&gt;&lt;p&gt;过程中还算比较顺利，我虽然接近20年的经验，但是vue还真是第一次去主动接触。不过也没觉得有什么特别的优势，工具嘛，捡顺手的用，黑白猫的意思。能高效创造价值的都是好工具。&lt;/p&gt;&lt;p&gt;特别要注意的就是各个插件的版本兼容问题&lt;/p&gt;</description><pubDate>Tue, 16 May 2023 10:49:55 +0800</pubDate></item><item><title>不太理想的Fine-tunes</title><link>https://zhangwei.name/post/不太理想的Fine-tunes.html</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://img.e.scienmedia.com/zblog/public/images/2023/04/202304246154_3201.jpg&quot; title=&quot;b1763ecd87edaa9a1c9914f452476b.jpg&quot; alt=&quot;b1763ecd87edaa9a1c9914f452476b.jpg&quot;/&gt;之前了解到openai可以针对GPT3.0进行再训练时，就已经迫不及待的试验了一把，但是效果不尽人意，我都准备放弃它了。&lt;/p&gt;&lt;p&gt;需求点，是准备让它充当客服，喂了一部分客服QA。但是各种微调之后给的结果仅是补充文字，离3.5相差十万八千里。看最终效果图：&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://img.e.scienmedia.com/zblog/public/images/2023/04/202304243234_5656.png&quot; title=&quot;WX20230424-104723@2x.png&quot; alt=&quot;WX20230424-104723@2x.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;max_token 这是太大，他会说一通不相关的废话。设置短了，回答又不完整。&lt;br/&gt;&lt;/p&gt;&lt;!--more--&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;记录下大致步骤吧，详细流程也可以参考&lt;a href=&quot;https://platform.openai.com/docs/api-reference/fine-tunes&quot; target=&quot;_blank&quot;&gt;openai的文档&lt;/a&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;使用openai cli工具转换问答资料。xlsx格式我就不赘述了，如果格式不对，tool工具会友善的提示你的。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;openai&amp;nbsp;tools&amp;nbsp;fine_tunes.prepare_data&amp;nbsp;-f&amp;nbsp;客服话术.xlsx&lt;/pre&gt;&lt;p&gt;生成完了就是类似这个样子，文件格式 jsonl&lt;/p&gt;&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://img.e.scienmedia.com/zblog/public/images/2023/04/202304247332_1145.png&quot; title=&quot;WX20230424-111330@2x.png&quot; alt=&quot;WX20230424-111330@2x.png&quot;/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;接着就可以开始训练了。我使用的是它的最大的模型达芬奇002，一共4个模型可拿来训练。越大的模型费用越高，有多高，看看第一张截图便知 😭&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;openai&amp;nbsp;api&amp;nbsp;fine_tunes.create&amp;nbsp;-t&amp;nbsp;客服话术_prepared.jsonl&amp;nbsp;-m&amp;nbsp;text-davinci-002&lt;/pre&gt;&lt;p&gt;开始训练后，openai会返回训练任务ID，后续可以根据这个ID，跟踪训练任务状态。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;openai&amp;nbsp;api&amp;nbsp;fine_tunes.status&amp;nbsp;-i&amp;nbsp;ft-DjHI8zfOeOUJgEnVVsFTHGYT&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;其实整个训练任务就此结束了，后续调用或者更多参数设置可以查看文档。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;这个效果根本无法达到线上要求。需要找更好的办法才行。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 24 Apr 2023 10:40:10 +0800</pubDate></item><item><title>Debian 10 开发一个go语言接口</title><link>https://zhangwei.name/post/go-lang-api.html</link><description>&lt;p&gt;首先是安装go环境&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;1、预备工作
sudo&amp;nbsp;apt-get&amp;nbsp;update
sudo&amp;nbsp;apt-get&amp;nbsp;-y&amp;nbsp;install&amp;nbsp;wget&amp;nbsp;gcc&amp;nbsp;make

#&amp;nbsp;2、下载go安装包
wget&amp;nbsp;https://dl.google.com/go/go1.16.2.linux-amd64.tar.gz

#&amp;nbsp;3、解压
sudo&amp;nbsp;tar&amp;nbsp;-C&amp;nbsp;/usr/local&amp;nbsp;-xzf&amp;nbsp;go1.16.2.linux-amd64.tar.gz

#&amp;nbsp;4、环境配置
nano&amp;nbsp;/etc/profile
#&amp;nbsp;添加到末尾
export&amp;nbsp;PATH=$PATH:/usr/local/go/bin
export&amp;nbsp;GOPATH=$HOME/go

#&amp;nbsp;5、使配置生效
source&amp;nbsp;/etc/profile

#&amp;nbsp;验证&amp;nbsp;/&amp;nbsp;打印&amp;nbsp;go&amp;nbsp;版本
&amp;nbsp;go&amp;nbsp;version&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;go环境配置结束，进入正题，很多coder喜欢golang的高并发，但是我们这种小项目真的是～ 有些多余，纯体验下&lt;/p&gt;&lt;p&gt;1、go安装sql库，我用的MariaDB，就是Mysql的分支，用mysql的库就行&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;go&amp;nbsp;get&amp;nbsp;-u&amp;nbsp;github.com/go-sql-driver/mysql
#&amp;nbsp;一般情况下，都是要设置代理的&amp;nbsp;github得翻一翻&lt;/pre&gt;&lt;p&gt;2、直接代码展示了&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;package&amp;nbsp;main

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;database/sql&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;encoding/json&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fmt&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;net/http&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;strconv&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_&amp;nbsp;&amp;quot;github.com/go-sql-driver/mysql&amp;quot;
)

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http.HandleFunc(&amp;quot;/search&amp;quot;,&amp;nbsp;ocrHandler)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http.ListenAndServe(&amp;quot;:8080&amp;quot;,&amp;nbsp;nil)
}

func&amp;nbsp;ocrHandler(w&amp;nbsp;http.ResponseWriter,&amp;nbsp;r&amp;nbsp;*http.Request)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;参数处理
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keyword&amp;nbsp;:=&amp;nbsp;r.FormValue(&amp;quot;keyword&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;:=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageParam&amp;nbsp;:=&amp;nbsp;r.FormValue(&amp;quot;page&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;pageParam&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageInt,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;strconv.Atoi(pageParam)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;==&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;pageInt
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;连接数据库
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;sql.Open(&amp;quot;mysql&amp;quot;,&amp;nbsp;&amp;quot;root:123456@tcp(localhost:3306)/VIVA&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;db.Close()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;总数量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;count&amp;nbsp;int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rowscount,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Query(&amp;quot;SELECT&amp;nbsp;count(1)&amp;nbsp;FROM&amp;nbsp;ocr&amp;nbsp;WHERE&amp;nbsp;path&amp;nbsp;LIKE&amp;nbsp;?&amp;nbsp;or&amp;nbsp;content&amp;nbsp;LIKE&amp;nbsp;?&amp;nbsp;&amp;quot;,&amp;nbsp;&amp;quot;%&amp;quot;+keyword+&amp;quot;%&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;quot;%&amp;quot;+keyword+&amp;quot;%&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;rowscount.Close()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;rowscount.Next()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;rowscount.Scan(&amp;amp;count);&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;处理错误
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;rowscount.Err();&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;处理错误
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;查询数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;offset&amp;nbsp;:=&amp;nbsp;(page&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;20
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rows,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;db.Query(&amp;quot;SELECT&amp;nbsp;id,title,path&amp;nbsp;FROM&amp;nbsp;ocr&amp;nbsp;WHERE&amp;nbsp;path&amp;nbsp;LIKE&amp;nbsp;?&amp;nbsp;or&amp;nbsp;content&amp;nbsp;LIKE&amp;nbsp;?&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;id&amp;nbsp;DESC&amp;nbsp;LIMIT&amp;nbsp;?,&amp;nbsp;20&amp;quot;,&amp;nbsp;&amp;quot;%&amp;quot;+keyword+&amp;quot;%&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;quot;%&amp;quot;+keyword+&amp;quot;%&amp;quot;,&amp;nbsp;offset)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;defer&amp;nbsp;rows.Close()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;解析结果
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;ocrs&amp;nbsp;[]map[string]interface{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;rows.Next()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;id&amp;nbsp;int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;path&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;title&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;rows.Scan(&amp;amp;id,&amp;amp;path,&amp;amp;title)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ocr&amp;nbsp;:=&amp;nbsp;map[string]interface{}{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;id&amp;quot;:id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;path&amp;quot;:path,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ocrs&amp;nbsp;=&amp;nbsp;append(ocrs,&amp;nbsp;ocr)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;输出结果
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;:=&amp;nbsp;map[string]interface{}{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;msg&amp;quot;:&amp;nbsp;&amp;nbsp;&amp;quot;success&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;data&amp;quot;:map[string]interface{}{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;total&amp;quot;&amp;nbsp;:&amp;nbsp;count,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;lists&amp;quot;&amp;nbsp;:&amp;nbsp;ocrs,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;json.NewEncoder(w).Encode(data)
}&lt;/pre&gt;&lt;p&gt;3、接着编译下，就可以执行了&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;go&amp;nbsp;build&amp;nbsp;main.go
./main&lt;/pre&gt;&lt;p&gt;4、配置api接口自动启动&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;/etc/systemd/system/main.service
[Unit]
Description=Search&amp;nbsp;API&amp;nbsp;for&amp;nbsp;OCR
After=network.target

[Service]
Type=simple
WorkingDirectory=/usr/bin/goLang
ExecStart=/usr/bin/goLang/main
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target&lt;/pre&gt;&lt;p&gt;5、对应服务命令&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;启动服务
sudo&amp;nbsp;systemctl&amp;nbsp;start&amp;nbsp;main.service

#&amp;nbsp;停止服务
sudo&amp;nbsp;systemctl&amp;nbsp;stop&amp;nbsp;main.service

#&amp;nbsp;重启服务
sudo&amp;nbsp;systemctl&amp;nbsp;restart&amp;nbsp;main.service

#&amp;nbsp;查看服务状态
sudo&amp;nbsp;systemctl&amp;nbsp;status&amp;nbsp;main.service

#&amp;nbsp;开机启动服务
sudo&amp;nbsp;systemctl&amp;nbsp;enable&amp;nbsp;main.service

#&amp;nbsp;禁用开机启动服务
sudo&amp;nbsp;systemctl&amp;nbsp;disable&amp;nbsp;main.service&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 21 Mar 2023 14:27:35 +0800</pubDate></item><item><title>利用树莓派设置局域网代理</title><link>https://zhangwei.name/post/%E5%88%A9%E7%94%A8%E6%A0%91%E8%8E%93%E6%B4%BE%E8%AE%BE%E7%BD%AE%E5%B1%80%E5%9F%9F%E7%BD%91%E4%BB%A3%E7%90%86.html</link><description>&lt;p&gt;还有更方便的软路由就不介绍了，自己Google。正好有个闲置的树莓派，国外有个正在用的服务器。就给同事提供福利咯&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;思路：在树莓派上安装v2ray客户端，然后同事们连接树莓派的代理就行了。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1、树莓派安装v2ray很慢，或者说，完全连接不到github，先设置树莓派自己的代码吧&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;nano&amp;nbsp;/etc/profile&amp;nbsp;
#&amp;nbsp;添加类似下面的代理
export&amp;nbsp;http_proxy=192.168.0.250:10809
export&amp;nbsp;https_proxy=192.168.0.250:10809

source&amp;nbsp;/etc/profile&amp;nbsp;#启用&lt;/pre&gt;&lt;p&gt;记住，配置结束后一定要关闭这个代理 注释掉就行&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2、安装github上的v2ray&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;bash&amp;nbsp;&amp;lt;(curl&amp;nbsp;-L&amp;nbsp;https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;3、v2ray的配置文件，自已搞定哦&lt;/p&gt;&lt;p&gt;4、设置自启动&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;auto.sh&amp;nbsp;启动脚本&amp;nbsp;权限问题，所有文件不要放在root下

#!/bin/sh
/home/pi/Downloads/v2ray/v2ray&amp;nbsp;run&amp;nbsp;&amp;amp;&amp;nbsp;&amp;gt;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1&amp;nbsp;&amp;amp;

#&amp;nbsp;系统启动命令
sudo&amp;nbsp;nano&amp;nbsp;/etc/rc.local
#&amp;nbsp;放在exit&amp;nbsp;0&amp;nbsp;前

su&amp;nbsp;pi&amp;nbsp;-c&amp;nbsp;&amp;quot;exec&amp;nbsp;/home/pi/auto.sh&amp;quot;

exit&amp;nbsp;0&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 20 Mar 2023 21:43:39 +0800</pubDate></item><item><title>predis 配合 supervisord 做消息队列</title><link>https://zhangwei.name/post/predis.html</link><description>&lt;p&gt;不是完整的代码，了解大概用。我的测试服务器比较老。centos 6.5&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;yum&amp;nbsp;install&amp;nbsp;supervisord&amp;nbsp;&amp;nbsp;//&amp;nbsp;直接安装&lt;/pre&gt;&lt;p&gt;安装解释后，配置/监听可执行文件&amp;nbsp;/etc/supervisord.conf&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[program:predis_program]
command=/usr/bin/php&amp;nbsp;/www/web/queue/index.php
autostart=true
autorestart=true
user=web
redirect_stderr=true
stdout_logfile=/var/log/predis.log&lt;/pre&gt;&lt;p&gt;直接启动&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;service&amp;nbsp;supervisord&amp;nbsp;start&amp;nbsp;//&amp;nbsp;启动&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;index.php中，使用了 predis库，show code&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;require&amp;nbsp;&amp;quot;./library/predis/vendor/autoload.php&amp;quot;;

Predis\Autoloader::register();

//&amp;nbsp;定义远程接口地址和其他参数
$remoteApi&amp;nbsp;=&amp;nbsp;&amp;#39;https://www.ab.com/api&amp;#39;;

//&amp;nbsp;实例化&amp;nbsp;Redis
$client&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Predis\Client([
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;scheme&amp;#39;&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;#39;tcp&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;host&amp;#39;&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;#39;127.0.0.1&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;port&amp;#39;&amp;nbsp;=&amp;gt;&amp;nbsp;6379,
]);

//&amp;nbsp;定义处理函数
function&amp;nbsp;handleQueueItem($item,&amp;nbsp;$remoteApi)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;将消息队列中的数据解析为数组或对象
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$data&amp;nbsp;=&amp;nbsp;json_decode($item,&amp;nbsp;true);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;向远程接口发送请求
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$ch&amp;nbsp;=&amp;nbsp;curl_init();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_setopt($ch,&amp;nbsp;CURLOPT_URL,&amp;nbsp;$remoteApi);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_setopt($ch,&amp;nbsp;CURLOPT_RETURNTRANSFER,&amp;nbsp;true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_setopt($ch,&amp;nbsp;CURLOPT_POST,&amp;nbsp;true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_setopt($ch,&amp;nbsp;CURLOPT_POSTFIELDS,&amp;nbsp;http_build_query($data));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_setopt($ch,&amp;nbsp;CURLOPT_HTTPAUTH,&amp;nbsp;CURLAUTH_BASIC);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$response&amp;nbsp;=&amp;nbsp;curl_exec($ch);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_close($ch);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;处理远程接口返回的数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;...
}

//&amp;nbsp;开始监听消息队列
while&amp;nbsp;(true)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;从队列中获取数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$item&amp;nbsp;=&amp;nbsp;$client-&amp;gt;lpop(&amp;#39;message_queue&amp;#39;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($item)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;处理队列中的数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handleQueueItem($item,&amp;nbsp;$remoteApi);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;休眠&amp;nbsp;1&amp;nbsp;秒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep(1);
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;代码结束。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;系统设置自启动 Centos 6.5&lt;/p&gt;&lt;p&gt;添加 启动配置文件&amp;nbsp;&lt;span style=&quot;color: #FFFFFF; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-weight: 600; white-space: pre-wrap; background-color: #444654;&quot;&gt;/etc/init.d/supervisord&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#!/bin/bash
#
#&amp;nbsp;supervisord&amp;nbsp;&amp;nbsp;&amp;nbsp;Startup&amp;nbsp;script&amp;nbsp;for&amp;nbsp;the&amp;nbsp;Supervisor&amp;nbsp;process&amp;nbsp;control&amp;nbsp;system
#
#&amp;nbsp;chkconfig:&amp;nbsp;-&amp;nbsp;95&amp;nbsp;04
#&amp;nbsp;description:&amp;nbsp;Supervisor&amp;nbsp;is&amp;nbsp;a&amp;nbsp;client/server&amp;nbsp;system&amp;nbsp;that&amp;nbsp;allows&amp;nbsp;its&amp;nbsp;users&amp;nbsp;\
#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to&amp;nbsp;monitor&amp;nbsp;and&amp;nbsp;control&amp;nbsp;a&amp;nbsp;number&amp;nbsp;of&amp;nbsp;processes&amp;nbsp;on&amp;nbsp;UNIX-like&amp;nbsp;\
#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;operating&amp;nbsp;systems.
#&amp;nbsp;processname:&amp;nbsp;supervisord
#&amp;nbsp;config:&amp;nbsp;/etc/supervisord.conf
#&amp;nbsp;pidfile:&amp;nbsp;/var/run/supervisord.pid

#&amp;nbsp;Source&amp;nbsp;function&amp;nbsp;library
.&amp;nbsp;/etc/rc.d/init.d/functions

#&amp;nbsp;Source&amp;nbsp;system&amp;nbsp;settings
if&amp;nbsp;[&amp;nbsp;-f&amp;nbsp;/etc/sysconfig/supervisord&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.&amp;nbsp;/etc/sysconfig/supervisord
fi

prog=&amp;quot;supervisord&amp;quot;
pidfile=${PIDFILE-/var/run/$prog.pid}
lockfile=${LOCKFILE-/var/lock/subsys/$prog}

start()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;-n&amp;nbsp;$&amp;quot;Starting&amp;nbsp;$prog:&amp;nbsp;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daemon&amp;nbsp;--pidfile=${pidfile}&amp;nbsp;supervisord&amp;nbsp;-c&amp;nbsp;/etc/supervisord.conf
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETVAL=$?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;nbsp;$RETVAL&amp;nbsp;-eq&amp;nbsp;0&amp;nbsp;]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;touch&amp;nbsp;${lockfile}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;$RETVAL
}

stop()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;-n&amp;nbsp;$&amp;quot;Stopping&amp;nbsp;$prog:&amp;nbsp;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;killproc&amp;nbsp;-p&amp;nbsp;${pidfile}&amp;nbsp;${prog}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETVAL=$?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;nbsp;$RETVAL&amp;nbsp;-eq&amp;nbsp;0&amp;nbsp;]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;rm&amp;nbsp;-f&amp;nbsp;${lockfile}&amp;nbsp;${pidfile}
}

reload()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;-n&amp;nbsp;$&amp;quot;Reloading&amp;nbsp;$prog:&amp;nbsp;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;killproc&amp;nbsp;-p&amp;nbsp;${pidfile}&amp;nbsp;${prog}&amp;nbsp;-HUP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETVAL=$?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo
}

case&amp;nbsp;&amp;quot;$1&amp;quot;&amp;nbsp;in
&amp;nbsp;&amp;nbsp;start)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;stop)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status&amp;nbsp;-p&amp;nbsp;${pidfile}&amp;nbsp;${prog}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETVAL=$?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;restart)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;condrestart)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;-f&amp;nbsp;${pidfile}&amp;nbsp;]&amp;nbsp;;&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;reload)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reload
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;*)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;$&amp;quot;Usage:&amp;nbsp;$0&amp;nbsp;{start|stop|status|restart|condrestart|reload}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETVAL=2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
esac

exit&amp;nbsp;$RETVAL&lt;/pre&gt;&lt;p&gt;授权&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;chmod&amp;nbsp;+x&amp;nbsp;/etc/init.d/supervisord&lt;/pre&gt;&lt;p&gt;添加到系统服务并设置为开机自启&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;chkconfig&amp;nbsp;--add&amp;nbsp;supervisord
chkconfig&amp;nbsp;supervisord&amp;nbsp;on&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 07 Mar 2023 09:41:32 +0800</pubDate></item></channel></rss>