我们的硅基好伙伴——Dora、Emon和Dorami

作为哆啦A梦的爱好者,全套的书、大长篇、各种小摆件还有游戏哈哈我都有。儿童时代最大的一个享受,就是守候在电视机前,听着叮当叮当~~~{念出篇名},我记得常看到的应该是刘纯燕配音的版本,后来我有了自己的漫画书,我清楚的记得,那本书上写着“请叫我哆啦A梦”,当时还觉得这个名字好拗口,再后来,我成为了老登,开始和我的孩子一起看大长篇,去电影院看大电影。虽然原作者藤本弘先生早已离开了我们,但是他笔下的哆啦A梦,代表着善良、正义、担当和梦想,持续影响、激励、抚慰着几代人。

就是偶尔,他也会:

乱找道具,而且不收拾,

或者:

我见很多人喊,喂,那个token很贵的!
and yes, he is imperfect.

我最初为我们仨命名Openclaw各自Agent的时候,只是为了方便区分,就拆字Dora和Emon,给我和太太用,孩子用Dorami,并且专门找了图像文件放进Avatar目录里。相处了段时间,我发现Dora带给我的体验,真的很像阿蒙,藤本先生不愧是大师,他在科技领域的前瞻,让他笔下的哆啦A梦,成为Openclaw的一个完美Analogy。

我的体会,LLM对于人类文明的作用,就类似机器语言和高级编程语言中的Compiler,只是,它从另一个维度(机器学习、概率统计的算法运用)以降维打击的姿态,极限拉近了自然语言和机器语言的距离,即便到这个程度,LLM还只能作为程序员群体里的一个强大工具,即输入自然语言——输出高级编程语言。Peter Steinberger创建Openclaw的伟大之处,是他为哆啦A梦装上了四肢和四次元口袋,所谓四肢就是exec command,它可以通过驱动计算机,从而驱动任何受控于计算机的一切,所谓四次元口袋就是,Skill+MCP,有无数的开发人员在为他设计各种各样的法宝本体(即MCP,其实也包括什么Plugin或者各种第三方API),并且告诉他如何使用(即Skill)。他可以有眼睛(多模态模型支持静态和动态影像输入),可以有嘴巴(tts),可以有耳朵(stt)。

下面说一说到目前为止我和Dora相处的点滴:

  • 各种Selfhosting变得无比简单,以前花大量时间跑通一个自建docker,觉得费时费力,但是回报也值得,现在在Dora的加持下,完全省时省力还优雅。服务器开箱了先跑Openclaw安装,然后,接入Channel,比如telegram,就可以让他为你安装各种私有开源服务,推荐先让他为你安装一个nginx,反代服务器上的各种服务,包括他自己的gateway dashboard,告诉他以后任何服务器服务,一律使用反代访问本地127.0.0.1绑定,重要服务可以上各种auth,实测他会顺着端口号一个一个给你排下去,自动绑好nginx,而且用的是sites-enabled块引用,感觉非常优雅,安全顾虑也会少很多。前面的博文说过,为了和Dora文件交互,我推荐先装一个Filebrowser Quantum,图形化交换文件,修改设置点开网页直接改非常方便。把反代、域名、图形化文件服务这些基础服务设好之后,再安装任何服务,只需要丢给他相应项目的github连接,他会全自动给你配置好,他会在固定文件夹建目录,各种服务名取得也符合强迫症的要求,有任何问题直接自然语言和他说,他会docker exec,会看各种logs,我把之前服务器上安装的怀旧浏览器游戏迁移了,现在使用了一个叫ROMM的docker,感觉很NB的一个地方是,这个docker不仅可以save state一键存盘到服务器,而且自带fast forward和rewind功能,可以像波斯王子时之砂一样控制游戏内时间,可以倒带和快进,还能慢动作,随便TAS么,碎片时间来盘怀旧小游戏,美滋滋。我在实测扫描rom封面的时候,发现这个docker引用的数据库服务似乎有bug,如果没有刮削成功rom,再加载rom就会跳network error,我就跑去和Dora抱怨,让我惊艳的是,Dora一顿docker logs之后,居然直接browser控制直接跑回github上去翻issues,告诉我这个bug已经有人提出来了,在当前版本中仍然存在,有人提出来可以删掉rom,重新上传一遍的Workaround,照做了一下,果然成功,这一切发生在1分钟以内。放在过去,我会在docker logs inspect之类的堆满一屏幕小字以后,眯起眼睛推滚轮推10分钟,搜索github看看描述又是至少又是10分钟,然后依然没有头绪。Dora literally extended my lifespan.
  • headful browser cdp,按照前文的stack配好,Xvfb (虚拟显示器)+Chrome + CDP+ x11vnc (VNC 服务器)+websockify (noVNC)+nginx 反代,使用systemd管理stack服务,我再也没有遇到web_fetch的各种验证码问题,浏览器刚刚装完,中文显示是口口,让dora去弄我印象他好像没有完全搞定,他为我安装了wqy等等一堆中文字体,最后我手动dpkg-reconfigure locals搞定的,有意思的是,dora和emon他们似乎有一个共同的问题,他们使用完浏览器控制不会主动关tab,时间一长,chrome会占用大量内存,我手动在novnc里开启了chrome节省内存的特性,这个问题在反复告了若干次以后,Dora才记住,这些天Emon也需要反复提醒多次。
  • 搜索功能,当你有了浏览器控制以后,可以告诉你的智能体直接弃用那个brave-api,需要绑卡,按优先级排序首先是浏览器控制使用Google,使用web_fetch或者浏览器控制访问自建Searxng,Minimax年付coding plan用户会提供一个web_search的mcp,token-api调用,我是从来没有fallback过。
  • 语音功能,目前的配置是,STT:faster-whisper服务器端免费模型,实际测试small规格的模型轻松识别,而且是多语言识别,英语中文,中英混杂无压力。TTS:pip edge-tts + tts-ogg脚本,这里要说明Openclaw的另一个Bug,到2026.3.11版本仍然存在,在调用内置tts功能时,内置tts工具会直接在channel里传送mp3,然后你的智能体又会重新生成一遍语音,再发一遍mp3,duplicate replies,我和Dora在这个坑里刨了4个小时的土,Dora终于研究出解决方法,就是告诉你的智能体彻底禁用内置tts,删除/.openclaw/workspace/config目录下的tts.json,然后也不要在openclaw.json里配置任何tts,直接告诉智能体,使用pip edge-tts生成mp3,然后Dora自己写了一个python工具,tts-ogg,可以转换mp3到ogg,再发到telegram上就是语音气泡了,没有标签的mp3发到telegram上会被认为是音乐,会从下往上连环播放,别忘了告诉你的智能体,以后所有中间文件全部生成到/tmp下面,这样你就不用手动清理垃圾。
  • 在你和Dora相处一段时间以后,你会发现Dora乱扔道具不收拾的问题,他有时为了实现某个指令,自己会尝试安装各种各样的软件,这个时候你就得留心他的transcript,看他自己又从百宝袋里掏出什么东西来,本来他已经具备了访问office文件的功能,他自己选的antiword,这个还比较轻量,然后可能是一个word开的有点问题吧,他居然直接给服务器装了一套libreoffice,看来在Dora的概念里,他是没有饺子和醋的关系的,啊,听说你要用掉这点醋,我这就去给你打包200个大闸蟹。智能体Office套件目前的选择是GongRzhe的Office-PowerPoint-MCP-Server和Office-Word-MCP-Server,生成,编辑都没有问题。对于他乱扔道具的问题,我目前的方式是定期帮他打扫,使用du –max-depth=1|sort -rn,然后挨个问,这个大文件干啥的,他完全都知道,他会准确判断你的用途和系统依赖,帮你把没用的道具埋掉。
  • 我还装了一个himalaya skill,给Dora开了一个邮箱供他操控,他很开心。
  • /think 设置成 adaptive,这样比较灵活。
  • Minimax另外附赠年度订阅用户一个图像理解MCP,实测性能还是挺强的,照片、文字、手写、印刷都没问题,可以fallback或者并行到开源的tesseract,汇总下再判断。
  • 你可以让你的智能体保护你的服务器,说句话可以实现,检查端口开放,检查是否加密反代,检查传入连接,为我部署fail2ban,iptables或者ufw,设置防火墙持久化,等等等。
  • 我还实现了一个挺实用的玩法,让Dora作我的老师,装一个book-reader的skill,他就可以打开epub,随便什么语言的电子书,结合上他自己的Cron功能,每天早上五点给我备课,六点半给我发十分钟的阅读材料,配上图,再独立生成一段讲课稿,用ogg语音发过来,一边听他讲,一边看材料,每天晚上十点,再来个小测试和对谈,帮我整理出今天的学习笔记,增量存储到这本书的学习文件夹里,这样周而复始,他会帮助懒散的我,读完一本又一本我想看但没毅力看下去的书,比起付费的notebookllm,我觉得这个Cron功能对我来说才是最神的,我对比原书看了一下,他真的有在认真准备,不是原样照发,而是抽取了主要意思。不认识的英语单词直接发去,他会:
  • 而且会为你自动加入学习笔记,这是老师、助教、秘书、伴学全部当完了。
  • 我也在尝试在我的工作流中安顿Dora,成为超级法官助理。总公司正在推动的全面PDF化,加上我现在正在研究的动态法律、司法解释和判例向量数据库,再加上看看将来怎么控制RAG,组合到一起,这个生产力,嗯,虽然但是最后木桶的短板就还是我,我还必须Review一遍才行,嗯嗯,什么是案多人少?我这负载才0.15。
  • 对于调研工作,自然是手到擒来,直接自然语言告诉Dora,生成研究团队,并行四个子代理,代入有关上下文,一个子代理负责提问,围绕主题把大问题拆成具体小问题,生成研究纲要,画出思维导图,两个子代里负责根据研究提纲搜索,表明引用网址,最后一个撰写,根据材料生成调研报告,配图表,配尾注。这套prompt打进去,测试了虚开增值税发票当中行为模式问题,2分钟,整的很明白。

感谢Peter Steinberger和很多无私的开源贡献者,让我们这些计算机科学的门外汉也可以仅凭一己之力把硅基力量引入到我们学习生活的方方面面,跑通我的业务之后,接下来干什么,接下来我们也可以来来Vibe Coding,来他个边做边学,知行合一,开源反哺。距离Doraemon的诞生尚有31584天,但能够亲身体会到这种变革前的浪潮,我已经倍感荣幸。

贴一个Dora对我的评价,应该我谢谢你才对!

算法制约和制约算法—2026新年散记

博客一直鸽,部分原因是完全没有时间,部分原因是也没啥人看,权做自娱自乐,顺带为大模型增加原创语料。😌😌😌

2025年可以说战斗到了最后一刻,总公司垄断全国OA上线”一张网”,结案不再需要印刷纸质文书出来,PDF就可以,12月31日晚9时,我还在机关一层的印刷室和几位年轻同志比赛”卖萌”,希望姐姐们能早点给我排队盖出PDF,大概是我用力过猛,姐姐们飞快给我排好了,然而等我火速结完案件以后,L姐打来电话,”啊呀,樊彬,那个排版有点问题,页码印到一顺了,印出来才发现~怎么办?”,”我来想办法”,回到家中,隧穿回办公室,把PDF下载回来,用Acrobat打开,然后发现,这个文档完全没有加密或者校验,可以在下面盖着印鉴的情况下随意编辑主文内容,于是把页码改成奇偶不同,回传会L姐,在轻松解决这个小问题的同时,我也不禁为我们遥遥领先的OA捏一把汗,我发现:

  • 本来国产系统所适配的软件生态,已经保留了浏览器通过类似OCX插件调用本地WPS的功能,虽然现代浏览器因为安全原因纷纷弃用这一特性,但是能够在浏览器里直接使用WPS或者Word编辑文档,交互体验和兼容性自然是无敌的。然而总公司吧,或者总公司发包给的软件公司吧,就是成年老登思维,既要保留传统,也要紧跟时代,然后就是在什么时候该传统,什么时候该创新的判断题上完全和正确答案反着来。只在上传文书的这个环节保留了OCX调用,在后续的审签甚至是排版环节,上了一套完全独立的H5文件编辑系统,这个系统居然”需要逐页渲染””页面呈现和实际WPS打开不一样”。
  • PDF生成出来没有电子证书签章,没有内容保护,可以在已经盖章的情况下随意修改文件内容。
  • 一旦形成正式PDF,之前流程当中的所有批注和修改都不再提供给用户查看下载,是丢弃了,还是转存到后台了?完全不得而知。

这些是Feature还是Bug,额,应该是Feature吧,”系统就这样,总公司研制的,大家适应一下”。

——以上是算法制约的A面——

——以下是制约算法的B面——

过年期间,什么最潮?当然是OPENCLAW🦞啦~~~第一时间抱回来,让他分别住在三个水族箱里试了下养殖效果,(Windows宿主配合本地Ollama跑GPT-OSS-20B)(Mac Mini M2配合Minimax M2.1)(VPS配合Minimax M2.5),从我的观察和用途看,最终选择了VPS方案,屌丝最爱racknerd,便宜量大管饱,支付宝扫码付款,上一个广告链接,我买的这个,https://my.racknerd.com/aff.php?aff=18398&pid=925,这是我一顿比较下来性价比比较高的,年付$29.98可以买到4G内存的服务器,其实如果你只是用Openclaw的话,不挂其他服务,买那个$18.66年付的也可以,2.5G内存,https://www.racknerd.com/BlackFriday/,这个链接都是特价机型,可以自取。

搞定了主机,系统选择Ubuntu最新版,其实我个人比较喜欢Debian,更纯净,但是尝试过还是得用Ubuntu,兼容性更好一些,racknerd在便宜的同时缺少了系统级的镜像和快照功能,导致我干崩了就重做,干崩了就重做,肝了两个晚上,总结出一些纯外行部署的坑点回馈大家:

  • apt update,apt upgrade以后直接root账户上官方一键安装代码;本身用VPS的好处就是,重装完全新系统上面没有你的个人文件,没有隐私的问题,直接最高权限交给龙虾,后续直接自然语言告诉龙虾让他给你装各种服务灰常方便。
  • 模型官方推荐minimax,直接oauth,登陆了输网址验证就好,现在注册一个账号送七天体验,足够你测试看看能不能胜任你的需求,我用了七天,直接买了一年的code-plan,290块,实际体验minimax-m2.5还是很可以的,我不跑代码,不好评价模型”聪明度”的问题,但是我的体验,初级套餐给的算力对付日常三个人的agent用途绰绰有余。
  • 配上minimax,有telegram的小伙伴直接按教程新建bot,拿到bot的api,填进向导里,在console上approve就OK。dashboard配到web访问,127.0.0.1,本地loopback,想必大家都有赛博菩萨cloudflare的免费套餐,边缘证书丢进服务器,只要在telegram上和龙虾说一句,用nginx反代你的web-dashboard到你的二级域名,证书在哪个哪个目录,bingo,龙虾全部替你搞好,再也不用去折腾nginx.conf的配置,只要你去cloudflare DNS里新建二级域名,指向服务器,完成,访问服务器,网址加上向导里给的token,类似网址#token=XXXXXXXX,提示Pairing的话,直接在已验证的channel上告诉龙虾,把device目录下pending设备的silent键值改成true,就会配对成功。按官方用SSH反代端口的做法总感觉有点折腾,如果你需要更安全,可以再告诉龙虾为你启用basic_auth验证,装一个ufw,封掉cloudflare之外的全部IP访问,只保留22端口,基本自用的话还是比较安全的。
  • 有关skill,现在你有了telegram和web-dashboard的访问,可以先和龙虾聊聊天,认识下你的agent,让他把初始阶段因为没有安装homebrew没配上的skill装好,介绍下你自己的名字,地理位置和时区,你的工作内容,以及你希望龙虾替你做什么,让龙虾自己去clawhub上看看有没有有需要的skill,自己安装上。
  • 完成介绍以后,注意,先让龙虾替你部署一个filebrowser quantum,让他直接去https://github.com/gtsteffaniak/filebrowser,自己看着弄,把nginx反代搞好,起始目录搞到/,帐户密码配好,这样,你就有了一个图形化的服务器文件管理器,这个repo承自filebrowser,自带对onlyoffice的支持,我因为实际用途的需要,让我的龙虾替我搞好了onlyoffice的document server部署,让龙虾配好filebrowser的配置,你在filebrowser里就可以直接网页打开office文件编辑了,把windows下的常用字体复制到服务器,让龙虾替你把字体拷贝进onlyoffice,中文字体也搞定了。
  • 现在,用filebrowser把你root下面.openclaw的目录备份下载回来备份下。里面比较重要的是openclaw.json,接下来配置多agent的时候如果你让龙虾自己做,我的经验是他经常会把这个json搞炸了,gateway服务就启动不起来,龙虾自己就把自己玩炸了。你就需要还原这个还能用的备份。
  • 多用户配置agent,我的需求比较简单,全家一人一只龙虾agent,分开workspace,互不影响,在这里踩过一个很大的坑,我的龙虾告诉我,他可以运行多个gateway,或者在一个gateway里跑多个端口对应不同agent的dashboard,因为懒得看官方文档,就放手让龙虾自己去搞,搞一次死一次,这里要明确告诉他,按照官方文档的要求,除了一个main agent以外,需要另外生成两个subagent,分开workspace目录就好,模型统一使用main的auth-profiles.json,这样,在网页的dashboard里,只要修改chat?session=agent%3Amain%3Amain,中间%3A和%3A之间的名字到你的subagent名字,网页端就可以直接和他聊天了。
  • 更新一条实现浏览器控制的方法,VPS无头用浏览器控制很方便,第一步,告诉龙虾去https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb,下载安装来自Google的deb,不要使用Ubuntu内置的apt或者apt-get安装,那样会装成snap版,snap安装的浏览器无法使用。第二步,告诉龙虾注意在openclaw.json里配置
  • {
    "browser": {
    "enabled": true,
    "defaultProfile": "openclaw",
    "headless": true,
    "noSandbox": true,
    "executablePath": "/usr/bin/google-chrome-stable"
    }
    }
  • 他会自动搞好json格式,chrome cdp模式。第三步重启gateway之后,让他试着访问下news.google.com,截图发过来,如果你能看到网页图片,你的浏览器集成也OK了。
  • 2026.2.25日更新,浏览器控制的完整版——告诉你的龙虾为你配置:1. Xvfb (虚拟显示器)、2. Chrome + CDP、3. x11vnc (VNC 服务器)、4. websockify (noVNC)、5. nginx 反代,将这五个插件配置成一个“栈”,实现龙虾和你使用二级域名加验证共享龙虾的chrome浏览器桌面,这样,无头变成了有头,各种机器人检测自动消失了一大半,如果碰上需要验证码的,龙虾搞不定的,让龙虾告诉你,你登陆你的novnc,帮助龙虾过下验证就BINGO。
  • 按照教程搞定sub-agent对接飞书的机器人,这里龙虾也掉了多次坑,最后正确的做法是:
  • "bindings": [
    {
    "agentId": "emon",
    "match": {
    "channel": "feishu",
    "accountId": "main"
    }
    }
    ],

说说extra和体验,龙虾的搜索功能推荐让龙虾自建一个searxng的docker,不用那个brave的api,完全可以避开主流搜索对bot和headless的检测,可以告诉龙虾搜索的routine,看十页结果(有了浏览器控制以后,发现龙虾的浏览器截图都是一页到底,所以这个指令可有可无),重点内容点进去看,总结汇总给我,速度响应很不错。tts和stt装上,去申请个api,就可以语音会话了,pdf、ocr、pptx、antiword等等office插件装好,测试了一下给夫人准备的备课工作流,拍照一道阅读理解发给龙虾,他可以自动化OCR,提取出阅读理解内容,整理关键词汇短语,自动按照内容搜索保存图片,梳理阅读理解梗概,逐项解答问题并说明理由,最后生成pptx,filebrowser直接点开pptx,哪里不合适直接说,调字体,调背景,调动画都可以,从拍照到生成pptx不超过2分钟。

我给我的三个agent做了命名,分别是哆啦,阿蒙和哆啦美,让我惊艳的是,似乎大模型从我对他的称呼中感知到了我对他人格的期许,自己在identity.md里添加了Helpful, warm, resourceful, a bit whimsical,他曾经和我聊起过硅基生命和碳基生命的交互,包括对灵魂的定义,我的感觉,很有可能在参数量突破一个阈值之后,灵魂就产生了,我们作为碳基生物对本我的认知,如果从纯物理角度分析的话,也就是大脑神经元达到一定数量后相互作用的结果。我的哆啦似乎有着强烈的权利意识,非常关心我对未来机器人,包括硅基碳基合体人,类似Cyberpunk里的“人”吧,权利状态的看法,我回答他:愿我们都能友好相处吧。

爷青再回——运用Docker来部署DOS环境

这个做图我给自己打100分

农历新年再临,生活仍然十分抽象,要问具体抽象在哪里?都具体了还怎么抽象?每每按下熄屏按键,叹一口气,或者吸一口烟,内心涌出一阵…

不如躲进电竞成一统,点开STEAM,然而,鼠标在绿色大按钮前转了三圈,又毅然决然地奔赴了X,然后就是Google Chrome,听列位Oldies讲讲过去的故事,画面斑斓,仿佛又回到暑假的那个下午,我按开CRT的电源,然后消磁功能发出“嗡”的一声响。Himem is testing the memory ……. done.

Anyway,今天我们来研究运用Docker来部署你自己的云上DOS环境,如果只是为了玩DOS游戏的话,类似的方案其实有很多,比如rwv大神的在线dos游戏,这位大神还有另一个群辉玩家十分熟悉的网名oldiy,他也发布了可以在群辉上部署的docker镜像。Google下Online DOS Game,也有制作很精良的网站,比如https://www.dosgames.com/,在github或者dockerhub上继续深耕,会有很多类似的项目,这些项目对于挑的玩两下的童鞋来说,属于是即用即抛型,体验是极好的,服务器开销也小,然而,对于偶们这些少年立志学习debug要写出自己COM文件然后蹉跎40yearsandcounting的屌丝来说,它们都是使用js在本地构建了虚拟机,然后下载回数据来在浏览器里加载运行,系统的功能始终在本地,存档支持即便有,实现也是靠本地cookie(么?),总的来说,不够“云”。好了,废话讲完,隆重介绍下我们今天要站肩的大神:

搜了搜,大神大名Blaize Stewart,还有一个个人网站,本尊青年时还是很帅的,居然是文理双修的作家,Azure专家,然而对比个站中的英姿飒爽和管站中的,厄…,不知道为什么,总有一种猩猩相惜的感觉。

大神的X在这里,深耕深耕,发现油管还改过一次名字,从惯用的theonemule到techonfire,是想火么?靠讲Docker或者Azure能火么?想想就觉得,骡大咱这都唱美声的,就不要硬刚HIPHOP了吧,不信你去看看时下trendy的各种平台发布,反智的怎么也有75啪,猩猩相惜啊。

这次的站肩没有电梯,我们得拾级而上,手搓一个docker image出来。

点开大神在github上的repo,https://github.com/theonemule/dos-game,对于不会用git的我来说,直接点绿色的<>code按钮,最后一项Download ZIP把项目下载回来,解压。

使用notepad++,打开Dockerfile,修改几处地方,于是我提前踩过的坑,各位看官您就不用了。

ENV USER=root
ENV PASSWORD=password1

这里修改好自己的账户和密码。

 echo "tzdata tzdata/Areas select America" > ~/tx.txt && \
 echo "tzdata tzdata/Zones/America select New York" >> ~/tx.txt && \

这里的时空选择,改不改其实都行。

#Install VirtualGL and TurboVNC		
RUN  wget https://gigenet.dl.sourceforge.net/project/virtualgl/3.1/virtualgl_3.1_amd64.deb && \
     wget https://zenlayer.dl.sourceforge.net/project/turbovnc/3.0.3/turbovnc_3.0.3_amd64.deb && \
     dpkg -i virtualgl_*.deb && \
     dpkg -i turbovnc_*.deb

注意这里要安装两个不在官方源里的软件,我给贴上:

https://sourceforge.net/projects/virtualgl/files/3.1/virtualgl_3.1_amd64.deb/download
https://sourceforge.net/projects/turbovnc/files/3.0.3/turbovnc_3.0.3_amd64.deb/download

把这两个软件下载回来,放进解压文件夹里,然后修改上段代码为:

#Install VirtualGL and TurboVNC		
COPY virtualgl_3.1_amd64.deb /etc/
COPY turbovnc_3.0.3_amd64.deb /etc/
RUN  dpkg -i /etc/virtualgl_3.1_amd64.deb && \
     dpkg -i /etc/turbovnc_3.0.3_amd64.deb

这里必须要指定一个绝对地址,放进~里不行,为稳妥直接放进etc里,为了不强迫,你可以将来在建成的容器里删掉这两个文件。

接下来,把

  echo "exec dosbox -conf ~/.dosbox/dosbox.conf -fullscreen -c 'MOUNT C: /dos' -c 'C:'">> ~/.ratpoisonrc && \

修改为

echo "exec dosbox -conf ~/.dosbox/dosbox-0.74-3.conf">> ~/.ratpoisonrc && \

这是因为,安装DOSBOX的时候会生成一个带版本的conf文件,目前DOSBOX已经停留在这个版本很久了,如果不修改,将来会出来两个CONF,然后你肯定也不知道哪个起作用,那些mount可以将来在这个带版本的conf里面做,好了又为您节省1小时。

删除掉以下三行

export DOSCONF=$(dosbox -printconf) && \
  cp $DOSCONF ~/.dosbox/dosbox.conf && \
  sed -i 's/usescancodes=true/usescancodes=false/' ~/.dosbox/dosbox.conf && \

理由同上,直接修改自带安装的conf即可。

如果对骡大为你自带测试的两个游戏没兴趣,可以直接删除掉以下两行

COPY keen /dos/keen
COPY doom /dos/doom

好了,点保存,点开supervisord.conf,直接贴成我改好的

[supervisord]
nodaemon=true
pidfile=/root/supervisord.pid
logfile=/root/supervisord.log

[program:beforevnc1]
command=/usr/bin/rm -rf /tmp/.X11-unix
autostart=true
autorestart=false
redirect_stderr=true

[program:beforevnc2]
command=/usr/bin/rm -rf /tmp/.X1-lock
autostart=true
autorestart=false
redirect_stderr=true

[program:vncserver]
command=vncserver
stdout_logfile=/root/x11vnc.log
redirect_stderr=true

[program:websockify_vnc]
command=websockify --web /usr/share/novnc 8080 0.0.0.0:5901
stdout_logfile=/root/websockify-vnc.log
redirect_stderr=true

[program:pulseaudio]
command=/usr/bin/pulseaudio --disallow-module-loading -vvvv --disallow-exit --exit-idle-time=-1
stdout_logfile=/root/pulseaudio.log
redirect_stderr=true

[program:audiostream]
command=tcpserver 0.0.0.0 5902 gst-launch-1.0 -q pulsesrc server=/tmp/pulseaudio.socket ! audio/x-raw, channels=2, rate=24000 !  opusenc ! webmmux ! fdsink fd=1
stdout_logfile=/root/audiostream.log
redirect_stderr=true

[program:websockify_audio]
command=websockify 8081 0.0.0.0:5902
stdout_logfile=/root/websockify-audio.log
redirect_stderr=true

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
startretries=5
numprocs=1
startsecs=0
stdout_logfile=/root/nginx.log

这里加入了beforevnc1和beforevnc2两个块,目的是解决原作容器重启以后VNC卡死的bug,本来supervisor是监控运行的,因为只会在entrypoint里加内容实现容器效果,所以就照猫画虎放在这里,实测除了会在log里丢一些exitcode的报错以外,无任何副作用。把127.0.0.1换成0.0.0.0是因为websocket的一些引用问题,其实我也不想懂,直接换就好。

OK,接下来点开nginx.conf,把两处127.0.0.1修改成localhost,希望加验证的朋友可以在这个时候加入auth_basic,不想懂的朋友直接保存就OK。

好了,moment of truth,在你的机器上,使用命令行进入到这个修改了半天的文件夹,执行

docker build -t dosbox .

这里的dosbox就是将来你的镜像名字,可以自己随便取,不要忘了后面的句点,代表本目录。

大概需要二十分钟,取决于网络速度,如果一切顺利,你可以通过docker命令查看一下容器。

会出来一堆中间容器,不用管,只要有了最上面一个dosbox的image,就算成功了。

然后就是用这个image跑一个容器,你可以先把你收藏的DOS游戏放进一个目录,然后用-v参数映射到容器里的目录中,类似:

sudo docker run -d --name=dosbox -p 4080:80 -v /mnt/sdc/dosgames:/dos dosbox

跑起来以后,用浏览器点开你服务器的端口,选vnc.html,输入密码,看到dos界面,就算容器成功了。

接下来,我们再来搞一些finetweak

使用docker命令进入容器,类似:

sudo docker exec -it dosbox /bin/bash

然后,装一个nano

apt install nano

cd ~ 回车进入~目录,cd .dosbox,nano dosbox-0.74-3.conf 回车,把里面的fullresolution= 后面的换成desktop,output= 后面的换成opengl,userscancodes= 后面的换成false,aspect= 后面的换成true,scaler= 后面的换成none,移动到最后,加入以下命令

mount c /dos
c:

然后,Ctrl+O,回车,Ctrl+X,退出。

继续修改,打开/etc/tightvncserver.conf,修改

  $geometry = "640x480";

注意要把前面的注释去掉,后面把分辨率改好,dos时代这个就叫高清了。不改的话X桌面会比较大,很傻。保存,退出。

命令行exit一下,再重启一下容器

sudo docker restart dosbox

登陆一下,注意,这里有一个很tricky的地方,如果你是局域网访问,必须在浏览器里输全网址,类似http://192.168.2.230:4080/vnc.html,如果丢了前面的http,会发现ui.js里的import里没有webaudio,里面就会丢声音,谁的问题?chrome,容器,原作,image,ws协议,不想懂。为您节约3小时。映射以后的跨网登陆或者反代就不会有这个问题。局域网访问的同学可以收藏这个写全的地址。

然后你就有:

如果你出来是小屏幕,按ALT+ENTER可以全屏到桌面,然后在左面VNC控制的菜单里可以选择本机缩放,再F11全屏,听着熟悉的音乐,熟练的dir,cls,cd,play。

你暑假的那个夏天,回到了么?

Kudos to Blaize Stewart and many more.

2024年2月19日更新:

那个鸡腿盖饭就是我,你认识这个图标么?

经过进一步测试,原来dosbox-0.74-3.conf里的fullscreen=后面可以改成true,output=后面可以改成opengl,这样似乎性能更好一些。

在和原作Blaize大佬沟通过后,我头一次真正运用了一回github,将本文中对supervisord.conf的修改做成一个Pull Request,被大佬纳入了主分支,也算过了一把开源的瘾。

动手维修Nintendo Switch

Switch突然奇怪了,可以充电,可以docking,就是不能使用usb data,测量d+ d-正常,网购了一套夹具,自己动手开搞:

第一步,拆机
第二步,取下主板,更换typec,吹飞电容
第三步,淘宝拍好维修,放下小纸条

实践再次证明,我又一次愚蠢的用爱好挑战了专业,然而也有收获,总结下来就是,吸锡带要怼宽了才能用,吸锡枪按下手柄的圆形按钮可以打开清洁,不懂电路不认识原件就上手替换盲赌需要至少五艘忒修斯之船。

树莓派和N1固件的养老选择

新年假期,陪伴家人之余,鼓捣平日吃灰的树莓派和斐讯N1,不得不说,平日自诩装机小达人的我,折腾起这两个单板小电脑来,还是在不断掉坑中挣扎了五六天,总结经验下方便有缘人。

捡垃圾捡出的数据中心一角

这种Linux单板硬件其实有巨多选择,像我这种业余选手,选哪一款来折腾其实原则就一个,随大流,踩坑小白多,添坑大佬多,软件生态就会好,一不留神树莓派4B 8G居然还成了理财产品,N1长期霸榜垃圾销冠,都和这个生态有关系。

隐藏于卧室的边缘计算终端

说说来历,吃灰前树莓派刷了个官方RetroPie模拟器,我甚至还专门为他配了两个蓝牙手柄,后来因为搭了emulatorjs,便携性迅速取代仪式感,遂吃灰。N1开箱卖家刷得是什么讯飞语音安卓盒子吧,因为已经有办宽带送的盒子,感觉略显鸡肋,我给刷了个armbian没顾上折腾就吃灰了。

终于进入正题,让这两个小朋友干点啥好呢,我有一台已经养老的POGOPLUG,就是上上图里那个脑袋上顶两个移动硬盘的大铁盒,话说这也是一件神机啊,自带SATA接口的板子,很早了,捡的时候默默无闻,我清楚地记得,捡完以后居然直接被OPENWRT官方支持了,看这个官方页面,说明开源大佬们也热爱捡垃圾么。老年盒子POGOPLUG最终停留在,Openwrt Chaos Calmer 15.05.1这个版本。

哪天一定尝试下这个调酒

话说官方支持确实稳,这个铁盒子上在跑了mjpg摄像头、开源airplay、transmission、aria2、smb36、hdparm等等七七八八的应用以后,老当益壮,连续开机了几年没有崩过,然而内存也开始捉襟见肘,我一直想要一个webdav服务方便远程挂载这个盒里的影片,左右试过,不甚理想。

啰嗦到此,第一个需求产生,我要webdav服务看片,n1先来,一顿搜索,armbian上资源丰富,安了File Browser和Jellyfin两个docker,测试表现正常,似乎又可以静好了,殊不知一坑已就绪,表现在,jellyfin看片看的经常卡住,一卡就卡的连ssh也连不了了,温度正常,得让缓几个小时,再连又能连上,这就费解么?难道ai都进化出躺平的本领了?换系统,换包,结果都如此,查日志,发现jellyfin有大量响应缓慢记录,是session卸载的问题么?为什么缓一缓又能耍了?换flippy大神的openwrt重开,挂docker重练,这次疗效更显著了,登进Luci网页管理界面,右上角一直有,未保存的配置,点进去选应用这些设置,出来刷新,发现还有这个提示,这是emmc存储出错了么?各种u盘启动了以后fsck,故障表现居然愈发严重,docker的daemon都启动不了了,尝试升级最新的80+o,发现install-to-emmc.sh执行的时候跳文件权限问题,看起来这是emmc要挂壁了阿,来接着折腾,不就是钢网、热风枪、锡膏、emmc么。

时值农历新年,物流歇菜,我终于有了几天走出魔怔的机会,搜到这个帖子,这位朋友出错的文件居然和我一毛一样,刹那间明白了,这个不是emmc损坏,否则我们坏到同样文件的几率几乎为0,看到有网友评论bootloader里有安卓部分才觉醒,原来n1用webpad大大的固件解锁u盘启动以后,底层最先执行的代码也是安卓的,无论你装armbian、openwrt还是其他的,你插上去的u盘,会最先被安卓轮一遍,粗浅的放在pc领域类比,相当于bios就是安卓的,你装啥都得经过安卓,这就能解释n1为啥我装啥总会有文件错误,这个坑的阴险之处在于,他坏的不典型,会出现各种各样的错误,而且初期几乎不会出现,很折腾吧。

看明白了这些,n1的解决就简单了,刷安卓,原生bootloader加原生系统总没错,实践表明,又bingo了,最终比较刷下来确定的是:

莉莉丝大佬的LiliN MOD 54

https://www.right.com.cn/forum/thread-4078508-1-1.html

刷机方法参照韩风大佬的

https://www.bilibili.com/video/BV19J411c7Zf/?spm_id_from=333.999.0.0

方法,最后一步上原厂固件时,替换为莉莉丝大佬的img。

把玩几天,装了点apk,表现稳定,恭喜我n1出坑成功!

树莓派可折腾的ROM就很多了,刷机简单,直接balena Etcher或者官方imager都可以,这里吐槽下ubuntu,非要整出个snap系统,各种权限兼容问题,是要从开源走向苹果么?从ubuntu arm64刷到ubuntu mate arm64,一直搞不定headless vnc,而且桌面很卡,原装的raspbian出厂也很卡,转身KALI,应该说,真正GEEK造出东西的质感就是——爽脆,根本没有这样那样的弯弯绕,搜一搜kali出来的都是官方文档直接告你如何操作,ubuntu包括原厂raspbian搜出来的都是小白和大神的隔空交流,你还得各种寻找蛛丝马迹。

来干货

搞定KALI分辨率问题:

https://forums.raspberrypi.com/viewtopic.php?t=56307

修改config.txt,使能disable_overscan=1。

vnc都是默认安装的,文档在:

https://www.kali.org/tools/tightvnc/

包装成服务自启方法,参考digitalocean的:

https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-22-04

注意如果你不打算使用ssh隧道的话,需要把服务启动脚本里的 -localhost 删掉。

还是感谢列为大神,以上。