过了几年了我才发现原来 Typecho 不支持这种下标式超链接设置 title 属性:
[应该有 title 的链接][1] >-< [没 title 的链接][2]
[1]: http://example.com "Example"
[2]: http://example.com/2这次偶然点了自己博客文章的链接才发现,这样会把可选的 title(即上面引号里的内容)当作链接一块解析。过程中会去除不安全的特殊符号,最终会变成指向 http://example.comexample 之类的超链接。搜了一下网上和 issue 没有人提,确定了 Markdown 是有这种语法,不想一个个改文章链接,遂自己从源码层面解决。
既然拾起这个博客了,不一会就想到不少要写的。其中就是我应该好好整理我的经验跟 SOP(Standard Operating Procedure,可以理解为标准流程),不只是让它们分散躺在我的记事本甚至 IM 收藏。说不定茫茫人海、长尾市场有人同样需要呢。这次就先描述一下我拿到手全新 Windows 11 会做的事。
部分操作可能 Windows 10 也适用。我没有实际测试。基本上我现在只用 Windows 11 x86_64 跟 arm64。
工作中我有这么一种需求,想要将对某些 IP 地址的访问重定向到另外的 IP 地址,至少要包括 TCP 流量。实际场景大概是,云服务器之间能够用他们自身的 IP 地址访问,但是办公网访问这些服务需要使用 EIP(应该代表弹性 IP),偶尔我需要本地修改为测试环境的 namespace,直连云上的数据库和微服务。配置中心自然会返回给我一堆 IP 而不是 EIP,我希望不改动他们只在我本地将请求映射到 EIP。
如果是域名倒是好办,只需要简单修改 hosts 文件。这是也 LLM AI 给我的方案之一。但我不指望这些客户端蠢到 IP 地址本身(而不是域名)还需要另外解析为 IP 地址。另一个似乎是修改网卡的网关还是路由规则,看上去也不可行,没有一台对端机器来处理这些路由。可能 Windows 的网络底层不是很自由,所以我问 Linux 是不是简单很多(我印象中用 iptables 的 NAT 规则做过转发)。LLM AI 表示确实如此。
千呼万唤,Snipaste 这款截图贴图软件终于支持 OCR 功能。OCR 可以识别图片上的文字,跟截图软件一起工作再合适不过了。在更新日志引用的这个 issue 下,我看到 Coxxs 提供了一个改进的 OCR 组件。原来对于 Windows,Snipaste 默认的系统内置选项会调用旧版的微软组件,准确率低、识别率慢。然而我使用以后觉得新版也差强人意,尝试看看能不急集成微信 PC 版的 OCR。
答案是可以。Coxxs 的项目实际利用了 Snipaste 的第二种方式:Tesseract 对接。从 Snipaste 界面可以看出其命令行参数默认是 stdin stdout。我实际下载了 Tesseract 使用,速度不快,结果有很多空格,差点意思。但是重要的是可以用帮助命令看出参数含义,结论是 Snipaste 将图片传给标准输入 stdin,OCR 文本结果传给标准输出 stdout。那么我只要写个程序在中间调用微信 OCR 就好了。
这篇博客记录我在阿里云提交的一次工单,产品是通义千问,问题点是 OpenAI 兼容接口的函数调用(function call)。界面上所选产品分类是“大模型服务平台百炼”。因为早有耳闻网友吐槽阿里云客服,我提工单后,一开始回复就令我摸不着头脑、疑似 AI 生成、毫无帮助,即刻印证我的刻板印象,而最后以创建钉钉群结束,自认为有一定参考价值,值得记录。因为问题最终得到解决,我在过程中间耐心也不多,加之我的业务不重要(不是公司业务),所以特别声明我不持批评态度,而更多以现象学的宗旨提供客观文本,悬置其中的立场和争议。各位可以自行作出判断。
首先我将工单对话按原样贴上,之后给出附件内容,最后以结语总结钉钉群内容。
眼看 GPT-4 系列正式开放(general available),OpenAI 还为流式(stream)输出增加 token 统计字段,我决定更新我的 GPT 网页。我一直用 chatgpt-web,自己修改代码加上的按量计费、版本切换(按量计费的 token 数还是估计的,对 GPT-4o 会高估),这时想再支持图片上传。想了几个方案,不是很妥:前端交互复杂,后端还依赖于 chatgpt-api 底层库。换一套“皮”是更好的选择。搜索 GitHub,就 ChatGPT Next Web 吧。
本来我没打算大改 ChatGPT Next Web。每个聊天对话能独立切换模型,它有了。我想要加上的图片输入,也有。我只需要加上计费。然而最终我还是动了很多地方,可以说是“魔改”吧,包括功能和外观的。我 fork 一份,提交了一个 bug 修复到上游,至今没有被合并。既然如此,我也没有后续提交的兴致。索性在这里稍微记录一下。
我在《我与机器学习的前缘》中写道:“《快乐星球》有一集讲述主角由于自动写日记程序造成误会的故事。来自快乐星球的法宝,输入关键词就能写日记,小学的我也想要啊。但我不知道哪里有;掂量掂量我的编程技术,我也不知道怎么做出来,只能做做白日梦。如今有 GPT 这类生成式 AI 就不是梦了。”今天,既然想要恢复博客更新,那就从这个“低垂的果实”开始,把这个“法宝”做出来吧。
为了贴近原剧,我特意去回顾了这一集。将其中多面体介绍这个软件的关键词记下,再结合东方老师对日记的要求,可以写出给 GPT 类生成式 AI 的提示词(prompts):
我用 Chanzhaoyu/chatgpt-web 搭了一个 GPT 的网页端,小范围交流共享。本来这个项目没有计费功能,我也懒得加,GPT-3.5 价格不高,我都自己承担。GPT-4 公开开放以后,眼看费用骤增,于是我琢磨怎么计费。原作者实际上在推一个收费版,但我以成本价共享还是作罢。最终,我设计实现一套分用户、按量计费的简单方案。然后趁热打铁,顺势编写切换模型版本的功能,这样想便宜可以用 3.5,想有高质量用 4。
因为我仍然很懒,同时无意与前述收费版本竞争,所以也没编写用户管理。HTTP Basic Auth 够用了,用 Nginx 即可方便实现访问认证。需要添加用户的时候用 htpasswd 添加。本文预设前提即是这个。当然这只影响获取用户名,其他设计代码可以通用。假设有人用我改好的 fork,请注意这一点。
受 UDPspeeder 启发,我一直想有一个 TCP 的带 XOR(异或)加密的端口转发程序。某些情况下我不希望流量完全明文传输,但也不至于用到 AES 甚至 TLS 那样强加密通道的程度。只需要简单的混淆,那 XOR 非常好使。不过似乎没有现成程序,我得自己编写一个。最近终于又出现实际用例,搜了 GitHub 没发现符合需求的,索性熬夜写了一个,命名为 xavior。
XOR 是一种基本位运算。两个相同的位(二进制数)结果为 0,不同为 1。它是一些现代加密算法的基本逻辑单元,也可独立视作加密算法。并且,明文按位异或密钥得到密文,再按位异或即得明文。所以不仅加密、解密密钥相同,函数也是完全一样的。作为加密算法,XOR 非常快,也很不安全。理论上,只要密钥长度大于消息长度,且密钥每次随机产生,XOR 可以获得完美保密性。但这种一次性密码本不太现实。所以 XOR 不被视作正经安全的加密算法。但如果我们只是稍微象征性地加密、混淆流量,那 XOR 实现简单、效率高,还算是可取。
若干年前我比较常重装操作系统、修复系统问题,所以有一件称手“兵器”很重要,就是装机盘。现在的装机盘当然不需要是光盘,更多是 U 盘。形式不重要,里面的内容是重点。最近我淘了一枚固态 U 盘,索性把装机所需要的文件整理一番,顺便分享一下。
所有的程序、文件不包含下载地址。应该很容易在网上找到官方下载通道。