<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Zero</title><description>No description</description><link>https://nyanners.moe/</link><language>zh_CN</language><image><url>https://nyanners.moe//favicon/avatar-540.avif</url><title>Zero</title><link>https://nyanners.moe/</link></image><follow_challenge><feedId>57338290732168192</feedId><userId>57337421484469248</userId></follow_challenge><item><title>别再手动配环境了——我写了个工具叫 rig</title><link>https://nyanners.moe/rig-dev-env-setup.html</link><guid isPermaLink="true">https://nyanners.moe/rig-dev-env-setup.html</guid><description>一个跨平台的开发环境自动化配置工具，支持 5 大 OS、15+ 组件、AI 编程助手一键部署，还能导出配置到新机器上秒级复现。</description><pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;每次拿到一台新机器，我都会经历同样的折磨：装 zsh、配 Oh My Zsh、装 nvm、装 Docker、配 Git、装一堆 CLI 工具……如果是 Ubuntu 还好，换成 CentOS 包名就不一样了，到了 macOS 又是另一套。云服务器、本地开发机、WSL、CI runner——每台机器都要重新来一遍。&lt;/p&gt;
&lt;p&gt;我受够了。&lt;/p&gt;
&lt;p&gt;所以我写了 &lt;a href=&quot;https://github.com/X-Zero-L/rig&quot;&gt;rig&lt;/a&gt;：一行命令，把开发环境从零配到能干活。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;demo.gif&quot; alt=&quot;rig 安装演示&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;它能干什么&lt;/h2&gt;
&lt;p&gt;简单说，rig 是一个纯 Bash 写的开发环境配置框架。你只需要一行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/X-Zero-L/rig/master/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后它会弹出一个交互式菜单，让你选要装哪些东西。&lt;/p&gt;
&lt;p&gt;目前支持 &lt;strong&gt;15+ 个组件&lt;/strong&gt;，覆盖日常开发的方方面面：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;基础环境&lt;/td&gt;
&lt;td&gt;zsh + Oh My Zsh + Starship 提示符、Tmux + Catppuccin 主题、Git 配置、常用工具（ripgrep, fd, bat, jq, gh）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;语言运行时&lt;/td&gt;
&lt;td&gt;Node.js (nvm)、Python (uv)、Go (goenv)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;基础设施&lt;/td&gt;
&lt;td&gt;Docker + Compose、SSH 加固、Tailscale、Clash 代理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 编程助手&lt;/td&gt;
&lt;td&gt;Claude Code、Codex CLI、Gemini CLI、Agent Skills&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对，你没看错——&lt;strong&gt;AI 编程工具也管装&lt;/strong&gt;。Claude Code 的 API Key、Codex 的模型配置、Gemini CLI 的初始化，全部自动搞定。&lt;/p&gt;
&lt;h2&gt;为什么不用 Ansible&lt;/h2&gt;
&lt;p&gt;这个问题我被问过好多次。Ansible 当然强大，但它的定位是管理成百上千台服务器的。我的需求没那么复杂：我就是想在一台新机器上快速把开发环境拉起来。&lt;/p&gt;
&lt;p&gt;rig 的设计哲学是 &lt;strong&gt;零依赖、零学习成本&lt;/strong&gt;。它只需要 curl、git 和 sudo——这三样东西几乎所有 Linux/macOS 系统都自带。不需要 Python，不需要 YAML playbook，不需要 inventory 文件。&lt;/p&gt;
&lt;p&gt;而且 rig 天然幂等：已经装好的组件会自动跳过，配置文件只做增量更新。你可以放心地反复跑，不会把环境搞乱。&lt;/p&gt;
&lt;h2&gt;跨平台是认真的&lt;/h2&gt;
&lt;p&gt;rig 不是那种&quot;我在 Ubuntu 上写的脚本碰巧在 Fedora 也能跑&quot;的项目。它在底层做了完整的抽象：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;OS 检测层 (os-detect.sh)
    ↓
包名映射层 (pkg-maps.sh)    ← 同一个工具在不同发行版的包名不同
    ↓
包管理器抽象层 (pkg-manager.sh)   ← apt / dnf / yum / pacman / brew
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;举个例子，&lt;code&gt;fd&lt;/code&gt; 这个工具在 Debian/Ubuntu 上叫 &lt;code&gt;fd-find&lt;/code&gt;，在 Arch 上叫 &lt;code&gt;fd&lt;/code&gt;，在 macOS 上又叫 &lt;code&gt;fd&lt;/code&gt;。rig 在 &lt;code&gt;pkg-maps.sh&lt;/code&gt; 里维护了一张映射表，你不需要关心这些差异。&lt;/p&gt;
&lt;p&gt;目前覆盖的平台：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian / Ubuntu (apt)&lt;/li&gt;
&lt;li&gt;CentOS / RHEL (yum/dnf)&lt;/li&gt;
&lt;li&gt;Fedora (dnf / dnf5)&lt;/li&gt;
&lt;li&gt;Arch Linux (pacman)&lt;/li&gt;
&lt;li&gt;macOS (Homebrew)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;装完之后跑一下 &lt;code&gt;rig status&lt;/code&gt;，就能看到所有组件的安装状态和版本：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;2.png&quot; alt=&quot;rig status 输出&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;预设模式&lt;/h2&gt;
&lt;p&gt;不想一个个选？rig 内置了四套预设方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;minimal&lt;/strong&gt; —— Shell + 常用工具 + Git，最轻量的基础环境&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;agent&lt;/strong&gt; —— 完整的 AI 编程助手栈（Claude Code + Codex + Gemini + Skills）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;devops&lt;/strong&gt; —— Docker + SSH + Tailscale + 基础设施工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fullstack&lt;/strong&gt; —— 上面全都要&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 直接装 AI 编程全家桶
rig install --preset agent

# 或者在 curl 安装时指定
curl -fsSL https://raw.githubusercontent.com/X-Zero-L/rig/master/install.sh | bash -s -- --preset fullstack
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;3.png&quot; alt=&quot;rig install 预设选择菜单&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;配置导出 / 导入&lt;/h2&gt;
&lt;p&gt;这是我最喜欢的功能。跑一句 &lt;code&gt;rig export&lt;/code&gt;，它会生成两个文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rig-config.json&lt;/code&gt; —— 所有组件的配置（安全，可以放进 Git）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;secrets.env&lt;/code&gt; —— API Key 之类的敏感信息（权限 600，自动 gitignore）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;拿到新机器后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rig import ~/.rig/rig-config.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;整套环境就回来了。重装系统、换新机器，都不用再从头配起。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;4.png&quot; alt=&quot;rig export 导出配置&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安全设计&lt;/h2&gt;
&lt;p&gt;写这种自动化工具，安全问题我是认真对待的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;幂等操作&lt;/strong&gt; —— 重复执行不会破坏已有配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖检查&lt;/strong&gt; —— 卸载组件时会检查是否有其他组件依赖它&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置备份&lt;/strong&gt; —— 卸载前自动备份配置文件（&lt;code&gt;.rig-backup&lt;/code&gt; 后缀）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据保护&lt;/strong&gt; —— 删除 Docker 等组件时会提示是否清理用户数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代理验证&lt;/strong&gt; —— GitHub 代理只允许 HTTPS，防止中间人攻击&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;国内用户友好&lt;/h2&gt;
&lt;p&gt;在国内网络环境下，rig 也考虑到了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 通过代理安装
curl -fsSL https://raw.githubusercontent.com/X-Zero-L/rig/master/install.sh | bash -s -- --gh-proxy https://gh-proxy.org

# 或者用短链接
curl -fsSL https://z.ls/rig | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Docker 镜像源、npm 镜像、GitHub 加速代理都可以通过环境变量配置，不需要装完之后再手动改一堆配置文件。&lt;/p&gt;
&lt;h2&gt;装完之后长什么样&lt;/h2&gt;
&lt;p&gt;一套完整的 rig 配置装完之后，你会得到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;zsh + Oh My Zsh&lt;/strong&gt; 带自动补全、语法高亮、历史搜索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Starship 提示符&lt;/strong&gt; + Catppuccin Mocha 主题，好看且信息丰富&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tmux&lt;/strong&gt; 带 Catppuccin 状态栏和 vim 风格导航&lt;/li&gt;
&lt;li&gt;一堆开箱即用的现代 CLI 工具：&lt;code&gt;rg&lt;/code&gt; 替代 &lt;code&gt;grep&lt;/code&gt;、&lt;code&gt;fd&lt;/code&gt; 替代 &lt;code&gt;find&lt;/code&gt;、&lt;code&gt;bat&lt;/code&gt; 替代 &lt;code&gt;cat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Docker 已配好镜像源和日志轮转&lt;/li&gt;
&lt;li&gt;AI 编程助手随时待命&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;5.png&quot; alt=&quot;Starship 提示符效果&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;试试看&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 最简单的方式
curl -fsSL https://raw.githubusercontent.com/X-Zero-L/rig/master/install.sh | bash

# 国内用户
curl -fsSL https://z.ls/rig | bash

# 全自动安装（非交互）
curl -fsSL https://raw.githubusercontent.com/X-Zero-L/rig/master/install.sh | bash -s -- --all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;项目开源在 GitHub：&lt;a href=&quot;https://github.com/X-Zero-L/rig&quot;&gt;X-Zero-L/rig&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有问题或者建议欢迎开 Issue，觉得有用的话给个 Star 就是最大的支持。&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;声明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文借助 Claude Opus 4.6 润色。当然，脚本也是 😀&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>category:Linux</category><category>tag:Linux</category><category>tag:macOS</category><category>tag:DevOps</category><category>tag:开发工具</category><category>tag:开源</category></item><item><title>为使用 Ollama 部署的 DeepSeek V3 启用函数调用功能</title><link>https://nyanners.moe/deepseek-v3-function-calling-with-ollama.html</link><guid isPermaLink="true">https://nyanners.moe/deepseek-v3-function-calling-with-ollama.html</guid><description>通过自定义 Ollama Modelfile 使 DeepSeek V3 支持函数调用</description><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;引言&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ollama.com/library/deepseek-v3&quot;&gt;DeepSeek V3&lt;/a&gt; 是一个强大的开源语言模型，而&lt;a href=&quot;https://ollama.com&quot;&gt;Ollama&lt;/a&gt;则提供了便捷的本地部署方案。本文将介绍如何通过自定义&lt;code&gt;Modelfile&lt;/code&gt;为&lt;code&gt;DeepSeek V3&lt;/code&gt;添加函数调用功能，从而支持一些常见的&lt;code&gt;agent&lt;/code&gt;框架。&lt;/p&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 确保已经安装了 Ollama
ollama --version

# 拉取 DeepSeek V3 模型
ollama pull deepseek-v3
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;自定义 Modelfile&lt;/h2&gt;
&lt;p&gt;创建一个新的 Modelfile&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vim deepseek-v3t.modelfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把以下内容复制进去：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM deepseek-v3:latest
TEMPLATE &quot;&quot;&quot;{{- if .Messages }}
{{- if or .System .Tools }}
{{- if .System }}
{{ .System }}
{{- end }}
{{- if .Tools }}
{{- end }}
{{- end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 }}
{{- if eq .Role &quot;user&quot; }}&amp;lt;｜User｜&amp;gt;
{{- if and $.Tools $last }}
Given the following functions, please respond with a JSON for a function call with its proper arguments that best answers the given prompt.
Respond in the format {&quot;name&quot;: function name, &quot;parameters&quot;: dictionary of argument name and its value}. Do not use variables.
{{ $.Tools }}
{{- end }}
{{ .Content }}
{{- if $last }}&amp;lt;｜Assistant｜&amp;gt;{{ end }}
{{- else if eq .Role &quot;assistant&quot; }}
&amp;lt;｜Assistant｜&amp;gt;
{{- if .ToolCalls }}
&amp;lt;｜tool▁calls▁begin｜&amp;gt;
{{- range .ToolCalls }}
&amp;lt;｜tool▁call▁begin｜&amp;gt;
{&quot;name&quot;: &quot;{{ .Function.Name }}&quot;, &quot;parameters&quot;: {{ .Function.Arguments }}}
&amp;lt;｜tool▁call▁end｜&amp;gt;
{{- end }}
&amp;lt;｜tool▁calls▁end｜&amp;gt;
{{- else }}
{{ .Content }}
{{- if not $last }}&amp;lt;｜end▁of▁sentence｜&amp;gt;{{- end }}
{{- end }}
{{- else if eq .Role &quot;tool&quot; }}
&amp;lt;｜tool▁outputs▁begin｜&amp;gt;
&amp;lt;｜tool▁output▁begin｜&amp;gt;
{{ .Content }}
&amp;lt;｜tool▁output▁end｜&amp;gt;
&amp;lt;｜tool▁outputs▁end｜&amp;gt;
{{- if and $last (ne .Role &quot;assistant&quot;) }}&amp;lt;｜Assistant｜&amp;gt;{{- end }}
{{- end }}
{{- end }}
{{- else }}
{{- if .System }}
{{ .System }}
{{- end }}
{{- if .Prompt }}
&amp;lt;｜User｜&amp;gt;
{{ .Prompt }}
{{- end }}
&amp;lt;｜Assistant｜&amp;gt;
{{ .Response }}
{{- if .Response }}{{ end }}
{{- end }}&quot;&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用自定义 Modelfile&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ollama create deepseek-v3t -f deepseek-v3t.modelfile
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用示例&lt;/h2&gt;
&lt;p&gt;任选一个你喜欢的&lt;code&gt;agent&lt;/code&gt;框架，调用 openai 兼容的 sdk，就可以直接使用了。
这里以&lt;a href=&quot;https://github.com/pydantic/pydantic-ai&quot;&gt;pydantic-ai&lt;/a&gt;为例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from openai import AsyncOpenAI
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIModel

openai_client = AsyncOpenAI(
    api_key=&quot;test&quot;,
    base_url=&quot;http://localhost:11434/v1&quot;,
)
# 如果你创建的模型名称不是 deepseek-v3t，需要自己修改
model = OpenAIModel(&quot;deepseek-v3t&quot;, openai_client=openai_client)

agent = Agent(
    model
)

# 为 agent 添加一个工具函数
@agent.tool
async def get_time():
    import datetime
    return f&quot;Current time is {datetime.datetime.now()}&quot;

async def main():
    response = await agent.run(&quot;What time is it?&quot;)
    print(response)

if __name__ == &quot;__main__&quot;:
    import asyncio
    asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要这个代码可以运行，那就说明你已经成功为&lt;code&gt;DeepSeek V3&lt;/code&gt;添加了函数调用功能，即使他没调用你给的工具函数&lt;/p&gt;
&lt;h2&gt;其他&lt;/h2&gt;
&lt;h3&gt;解决闪退问题&lt;/h3&gt;
&lt;p&gt;由于&lt;code&gt;DeepSeek&lt;/code&gt;系列模型不支持&lt;code&gt;K-shift&lt;/code&gt;，当上下文达到一定长度时，会导致&lt;code&gt;ollama&lt;/code&gt;闪退。目前&lt;code&gt;ollama&lt;/code&gt;官方还没给出一个比较好的解决方案，这个问题暂时可以通过编辑&lt;code&gt;Modelfile&lt;/code&gt;来规避，你只需要在 Modelfile 中添加下面这两行即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PARAMETER num_ctx 24576
PARAMETER num_predict 8192
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改后的完整 Modelfile 如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM deepseek-v3:latest
PARAMETER num_ctx 24576
PARAMETER num_predict 8192
TEMPLATE &quot;&quot;&quot;{{- if .Messages }}
{{- if or .System .Tools }}
{{- if .System }}
{{ .System }}
{{- end }}
{{- if .Tools }}
{{- end }}
{{- end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 }}
{{- if eq .Role &quot;user&quot; }}&amp;lt;｜User｜&amp;gt;
{{- if and $.Tools $last }}
Given the following functions, please respond with a JSON for a function call with its proper arguments that best answers the given prompt.
Respond in the format {&quot;name&quot;: function name, &quot;parameters&quot;: dictionary of argument name and its value}. Do not use variables.
{{ $.Tools }}
{{- end }}
{{ .Content }}
{{- if $last }}&amp;lt;｜Assistant｜&amp;gt;{{ end }}
{{- else if eq .Role &quot;assistant&quot; }}
&amp;lt;｜Assistant｜&amp;gt;
{{- if .ToolCalls }}
&amp;lt;｜tool▁calls▁begin｜&amp;gt;
{{- range .ToolCalls }}
&amp;lt;｜tool▁call▁begin｜&amp;gt;
{&quot;name&quot;: &quot;{{ .Function.Name }}&quot;, &quot;parameters&quot;: {{ .Function.Arguments }}}
&amp;lt;｜tool▁call▁end｜&amp;gt;
{{- end }}
&amp;lt;｜tool▁calls▁end｜&amp;gt;
{{- else }}
{{ .Content }}
{{- if not $last }}&amp;lt;｜end▁of▁sentence｜&amp;gt;{{- end }}
{{- end }}
{{- else if eq .Role &quot;tool&quot; }}
&amp;lt;｜tool▁outputs▁begin｜&amp;gt;
&amp;lt;｜tool▁output▁begin｜&amp;gt;
{{ .Content }}
&amp;lt;｜tool▁output▁end｜&amp;gt;
&amp;lt;｜tool▁outputs▁end｜&amp;gt;
{{- if and $last (ne .Role &quot;assistant&quot;) }}&amp;lt;｜Assistant｜&amp;gt;{{- end }}
{{- end }}
{{- end }}
{{- else }}
{{- if .System }}
{{ .System }}
{{- end }}
{{- if .Prompt }}
&amp;lt;｜User｜&amp;gt;
{{ .Prompt }}
{{- end }}
&amp;lt;｜Assistant｜&amp;gt;
{{ .Response }}
{{- if .Response }}{{ end }}
{{- end }}&quot;&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后根据上文给出的命令重新创建模型即可。&lt;/p&gt;
&lt;h3&gt;DeepSeek R1 也适用吗？&lt;/h3&gt;
&lt;p&gt;理论上，添加了这个模板之后&lt;code&gt;DeepSeek R1&lt;/code&gt;也可以有工具调用的能力，但是由于模型默认输出的&lt;code&gt;&amp;lt;think&amp;gt;xxx&amp;lt;/think&amp;gt;&lt;/code&gt;标签，不一定和常见的&lt;code&gt;agent&lt;/code&gt;框架兼容，所以可能需要一些额外的处理，我也没有测试过，如果你有兴趣，可以试试看。&lt;/p&gt;
&lt;h2&gt;相关资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ollama.com&quot;&gt;Ollama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ollama.com/library/deepseek-v3&quot;&gt;DeepSeek V3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pydantic/pydantic-ai&quot;&gt;pydantic-ai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>category:AI</category><category>tag:DeepSeek</category><category>tag:Ollama</category><category>tag:LLM</category><category>tag:Function Calling</category><category>tag:Tools</category><category>tag:AI</category></item><item><title>解决RK3588用Redroid运行碧蓝航线出现闪退的问题</title><link>https://nyanners.moe/fix-rk3588-redroid-azur-lane-crash.html</link><guid isPermaLink="true">https://nyanners.moe/fix-rk3588-redroid-azur-lane-crash.html</guid><description>简单点说，内核设置CONFIG_ARM64_VA_BITS=39，重新编译并启用新内核即可解决</description><pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;首先，要感谢&lt;a href=&quot;https://github.com/CNflysky&quot;&gt;@CNflysky&lt;/a&gt;大佬，具体见&lt;a href=&quot;https://github.com/CNflysky/redroid-rk3588/issues/3&quot;&gt;该issue&lt;/a&gt;。&lt;/p&gt;
&lt;h1&gt;对于 &lt;code&gt;armbian&lt;/code&gt; 系统（内核5.10.160），可直接使用上述&lt;a href=&quot;https://github.com/CNflysky/redroid-rk3588/issues/3&quot;&gt;issue&lt;/a&gt;中&lt;a href=&quot;https://github.com/CNflysky&quot;&gt;@CNflysky&lt;/a&gt;编译好的内核deb包&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;卸载旧内核&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpkg -l | grep linux-image
dpkg -l | grep linux-headers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据输出找到旧版本号，执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get remove --purge linux-image-xxx
apt-get remove --purge linux-headers-xxx
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;下载并安装新内核&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /tmp/azur-lane-fix
cd /tmp/azur-lane-fix
wget https://github.com/user-attachments/files/16227927/linux-image-5.10.160-rockchip-rk3588_5.10.160-rockchip-rk3588-1_arm64.zip
wget https://github.com/user-attachments/files/16227929/linux-headers-5.10.160-rockchip-rk3588_5.10.160-rockchip-rk3588-1_arm64.zip
unzip *.zip
dpkg -i *.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重启系统&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;如果使用的是 &lt;a href=&quot;https://github.com/Joshua-Riek/ubuntu-rockchip&quot;&gt;ubuntu-rockchip&lt;/a&gt; 的 &lt;code&gt;22.04&lt;/code&gt;版本，可以使用我编译好的内核包&lt;/h1&gt;
&lt;p&gt;注意，如果你现有的内核版本比我这里的高，按评论区所说，降级内核后无法开机，对于内核版本更高的系统，请考虑使用这个链接: https://share.nyanners.moe/ubuntu-rockchip-5.10.0-1012-kernel.zip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;卸载旧内核的步骤不再赘述&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;下载并安装新内核&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /tmp/azur-lane-fix
cd /tmp/azur-lane-fix
wget -O ubuntu-rochship-5.10.0-1010-kernel.zip https://share.nyanners.moe/ubuntu-rochship-5.10.0-1010-kernel.zip
unzip ubuntu-rochship-5.10.0-1010-kernel.zip
dpkg -i *.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重启&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;冻结内核更新&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-mark hold linux-rockchip linux-image-rockchip linux-headers-rockchip linux-tools-rockchip
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;如果你使用的是其他系统，那么只好自己编译内核了^_^&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;获取内核源码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进入源码目录&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装依赖&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置内核&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;make menuconfig # 当然，你也可以直接修改.config文件
&lt;/code&gt;&lt;/pre&gt;
在&lt;code&gt;Kernel Features&lt;/code&gt; &amp;gt; &lt;code&gt;Virtual address space bits&lt;/code&gt;中设置为&lt;code&gt;39 bits&lt;/code&gt;，然后保存退出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译安装&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重启&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;1.png&quot; alt=&quot;config menu&quot; /&gt;
&lt;img src=&quot;2.png&quot; alt=&quot;Kernel Features&quot; /&gt;
&lt;img src=&quot;3.png&quot; alt=&quot;39 bits&quot; /&gt;
&lt;img src=&quot;4.png&quot; alt=&quot;save&amp;amp;exit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特别地&lt;/strong&gt;（已过时，建议直接修改https://github.com/Joshua-Riek/linux-rockchip/blob/noble/debian.rockchip/config/config.common.ubuntu 该文件对应的值而不是使用make menuconfig）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果你使用的是&lt;a href=&quot;https://github.com/Joshua-Riek/ubuntu-rockchip&quot;&gt;ubuntu-rockchip&lt;/a&gt;的24.04版本，同作者项目下的&lt;a href=&quot;https://github.com/Joshua-Riek/linux-rockchip&quot;&gt;linux-rockchip&lt;/a&gt;即为内核源码。然后你只需设置&lt;code&gt;CONFIG_ARM64_VA_BITS=39&lt;/code&gt;，执行&lt;code&gt;build-kernel.sh&lt;/code&gt;脚本：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 安装所需依赖
sudo apt-get install -y build-essential gcc-aarch64-linux-gnu bison \
qemu-user-static qemu-system-arm qemu-efi u-boot-tools binfmt-support \
debootstrap flex libssl-dev bc rsync kmod cpio xz-utils fakeroot parted \
udev dosfstools uuid-runtime git-lfs device-tree-compiler python2 python3 \
python-is-python3 fdisk bc debhelper python3-pyelftools python3-setuptools \
python3-distutils python3-pkg-resources swig libfdt-dev libpython3-dev

# 设置CONFIG_ARM64_VA_BITS=39
cd /path/to/ubuntu-rockchip/build
git clone https://github.com/Joshua-Riek/linux-rockchip -b noble --depth 2
cd linux-rockchip
make menuconfig # 然后 `Kernel Features` -&amp;gt; `Virtual address space bits` -&amp;gt; `39`
# 然后保存

# 编译内核
cd /path/to/ubuntu-rockchip
export SUITE=noble
./scripts/build-kernel.sh

# 等待一段可能很长的时间^_^

# 卸载旧内核，略

# 安装内核
dpkg -i ./build/*.deb

# 重启
reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;务必根据最新文档和仓库更新进行操作，因为本文内容可能已过时。更多详细信息，请参考&lt;a href=&quot;https://github.com/Joshua-Riek/ubuntu-rockchip/wiki&quot;&gt;ubuntu-rockchip Wiki&lt;/a&gt;。最后，请确保在操作前备份重要数据，并根据实际情况调整步骤。&lt;/p&gt;
&lt;h1&gt;写在最后&lt;/h1&gt;
&lt;p&gt;我猜你一定还想要顺便运行&lt;code&gt;Alas&lt;/code&gt;对吧？
这里最简单的方式是使用别人build好的&lt;code&gt;Alas&lt;/code&gt;镜像：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;创建docker-compose.yaml&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /opt/alas
cd /opt/alas
cat &amp;lt;&amp;lt; EOT &amp;gt; docker-compose.yaml
version: &apos;3.7&apos;
services:
    ALAS:
      ports:
         - 22267:22267
         - 22268:22268
      volumes:
         - &apos;./AzurLaneAutoScript:/app/AzurLaneAutoScript:rw&apos;
         - &apos;./MAA:/app/MAA:rw&apos;
         - &apos;/etc/localtime:/etc/localtime:ro&apos;
      container_name: alas
      restart: always
      image: crestfallmax/azurlaneautoscript:v0.1
EOT
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;拉取alas的源码&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/LmeSzinc/AzurLaneAutoScript.git
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;应用docker版配置文件&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cp AzurLaneAutoScript/config/deploy.template-docker-cn.yaml AzurLaneAutoScript/config/deploy.yaml
vim AzurLaneAutoScript/config/deploy.yaml # 根据实际情况修改
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;启动&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;打开浏览器，访问&lt;code&gt;http://&amp;lt;你的设备IP&amp;gt;:22267&lt;/code&gt;，然后进行配置&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在你一切设置完毕后，可以修改&lt;code&gt;docker-compose.yaml&lt;/code&gt;文件，覆写&lt;code&gt;command&lt;/code&gt;字段，以便在容器启动时alas自动运行&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;command: [&quot;python&quot;, &quot;gui.py&quot; , &quot;--run&quot;, &quot;alas&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完整的&lt;code&gt;docker-compose.yaml&lt;/code&gt;文件如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOT &amp;gt; docker-compose.yaml
version: &apos;3.7&apos;
services:
    ALAS:
      ports:
         - 22267:22267
      volumes:
         - &apos;./AzurLaneAutoScript:/app/AzurLaneAutoScript:rw&apos;
         - &apos;/etc/localtime:/etc/localtime:ro&apos;
      container_name: alas
      restart: always
      image: crestfallmax/azurlaneautoscript:v0.1
      command: [&quot;python&quot;, &quot;gui.py&quot; , &quot;--run&quot;, &quot;alas&quot;]
EOT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在修改完成后，执行&lt;code&gt;docker-compose up -d&lt;/code&gt;即可。&lt;/p&gt;
&lt;h2&gt;备注&lt;/h2&gt;
&lt;p&gt;该镜像的作者似乎修改了自己的github用户名（或者和他的dockerhub用户名不是同一个），所以我无法提供他的github主页链接，但是你可以在&lt;a href=&quot;https://hub.docker.com/r/crestfallmax/azurlaneautoscript&quot;&gt;dockerhub&lt;/a&gt;上找到他的镜像。&lt;/p&gt;
</content:encoded><category>category:RK3588</category><category>tag:RK3588</category><category>tag:Redroid</category><category>tag:碧蓝航线</category><category>tag:Azur Lane</category></item><item><title>Docker配置代理(pull/run/build)</title><link>https://nyanners.moe/docker-proxy.html</link><guid isPermaLink="true">https://nyanners.moe/docker-proxy.html</guid><description>docker分别在pull镜像，运行容器，构建镜像时使用代理的方法</description><pubDate>Tue, 02 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;配置pull镜像时使用的代理&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;docker pull&lt;/code&gt;由&lt;code&gt;dockerd&lt;/code&gt;进程发起，而&lt;code&gt;dockerd&lt;/code&gt;进程是一个后台进程，不会读取当前用户的环境变量，所以我们需要在&lt;code&gt;/etc/systemd/system/docker.service.d/http-proxy.conf&lt;/code&gt;中配置代理。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /etc/systemd/system/docker.service.d
cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment=&quot;HTTP_PROXY=http://127.0.0.1:7890/&quot; # 改成你自己的代理地址
Environment=&quot;HTTPS_PROXY=http://127.0.0.1:7890/&quot;
Environment=&quot;NO_PROXY=localhost,127.0.0.1,.example.com&quot;
EOF
systemctl daemon-reload
systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置容器运行时使用的代理&lt;/h2&gt;
&lt;p&gt;容器运行时使用的代理配置在&lt;code&gt;~/.docker/config.json&lt;/code&gt;中，如果没有该文件，可以手动创建。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/.docker
cat &amp;lt;&amp;lt;EOF &amp;gt; ~/.docker/config.json
{
 &quot;proxies&quot;:
 {
   &quot;default&quot;:
   {
     &quot;httpProxy&quot;: &quot;http://127.0.0.1:7890/&quot;, # 改成你自己的代理地址
     &quot;httpsProxy&quot;: &quot;http://127.0.0.1:7890/&quot;,
     &quot;noProxy&quot;: &quot;localhost,127.0.0.0/8,.example.com,172.128.2.0/24&quot; # 如果你的容器之间使用了内网通信，例如172.x.x.x/24，也需要加入到noProxy中
   }
 }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置构建镜像时使用的代理&lt;/h2&gt;
&lt;p&gt;在Dockerfile中配置代理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM debian:latest
ENV http_proxy http://192.168.8.110:7890
ENV https_proxy http://192.168.8.110:7890
... # 其他配置
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>category:Docker</category><category>tag:Docker</category><category>tag:代理</category><category>tag:proxy</category></item><item><title>RK3588+GPU Redroid+StarRailCopilot实现星穹铁道自动化</title><link>https://nyanners.moe/rk3588-orangep5plus-starrailcopilot.html</link><guid isPermaLink="true">https://nyanners.moe/rk3588-orangep5plus-starrailcopilot.html</guid><description>RK3588+GPU Redroid+StarRailCopilot实现星穹铁道自动化</description><pubDate>Fri, 01 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;RK3588+GPU Redroid+StarRailCopilot实现星穹铁道自动化&lt;/p&gt;
&lt;h2&gt;环境准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安装好内核版本为&lt;code&gt;5.10.160&lt;/code&gt;的系统的任意品牌RK3588开发板（性价比可选&lt;a href=&quot;http://www.orangepi.cn/index.html&quot;&gt;OrangePi 5 Plus&lt;/a&gt;）
&lt;ul&gt;
&lt;li&gt;系统推荐使用&lt;a href=&quot;https://github.com/Joshua-Riek/ubuntu-rockchip&quot;&gt;ubuntu-rockchip&lt;/a&gt;（注意，要安装22.04版本）,该版镜像默认安装了redroid所需模块, 桌面版镜像自带了mali驱动，服务器版镜像需要自行安装&lt;code&gt;mali驱动&lt;/code&gt;&lt;a href=&quot;https://static.nyanners.moe/files/mali_csffw.bin&quot;&gt;mali_csffw.bin&lt;/a&gt;到/lib/firmware下&lt;img src=&quot;1.png&quot; alt=&quot;mali_csffw&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如果使用其他系统镜像，如缺少&lt;code&gt;binder_linux&lt;/code&gt;和&lt;code&gt;ashmem_linux&lt;/code&gt;模块，请自行解决&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;操作方式可以是ssh，串口，或者直接连接显示器与键盘+鼠标&lt;/li&gt;
&lt;li&gt;接下来的安装过程假定你处于root用户下，如果不是，请在命令前加上&lt;code&gt;sudo&lt;/code&gt;或者直接使用&lt;code&gt;sudo -i&lt;/code&gt;切换到root用户&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装docker&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://get.docker.com | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行Redroid容器&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /opt/starrail_redroid
cd /opt/starrail_redroid
cat &amp;lt;&amp;lt; EOT &amp;gt; docker-compose.yaml
version: &apos;3&apos;
services:
  starrail_redroid:
    image: registry.cn-shanghai.aliyuncs.com/docker_if/redroid-rk3588:12.0.0-latest
    container_name: starrail_redroid
    privileged: true
    restart: always
    stdin_open: true
    tty: true
    volumes:
      - ./data:/data
      - /dev/mali0:/dev/mali0
    ports:
      - 5555:5555 # 这里左边的端口可以自行修改，右边的端口不要动
    command:
      - androidboot.redroid_gpu_mode=mali
      - androidboot.redroid_height=720
      - androidboot.redroid_width=1280
      - androidboot.redroid_dpi=240 # 保持与src开发环境一致（否则养成规划界面的ui会不一样，无法正常使用）
EOT
docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意，该redroid镜像的作者已经更新了镜像，这里使用的应该仍是旧版本镜像，但已经足够使用，如果有其他需要直接访问镜像作者的仓库：&lt;a href=&quot;https://github.com/CNflysky/redroid-rk3588&quot;&gt;CNflysky|redroid-rk3588&lt;/a&gt;，根据README中的说明进行操作即可。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;执行完上述命令后，稍等片刻（1~2分钟），然后使用scrcpy连接到该设备&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb connect &amp;lt;你的设备IP&amp;gt;:5555
scrcpy -s &amp;lt;你的设备IP&amp;gt;:5555
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不出意外的话，你应该会直接进入系统，接下来只需进行星穹铁道的安装，你可以通过&lt;code&gt;adb install&lt;/code&gt;命令安装&lt;code&gt;apk&lt;/code&gt;文件，例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adb -s &amp;lt;你的设备IP&amp;gt;:5555 install /path/to/StarRailCopilot.apk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可直接往&lt;code&gt;scrcpy&lt;/code&gt;窗口拖入&lt;code&gt;apk&lt;/code&gt;文件，或者任意其他方法安装。安装完成后，打开游戏进行更新，就可以先放在一边不管了（理论上这部分用过手机的人都会）
&lt;img src=&quot;redroid3.png&quot; alt=&quot;redroid3&quot; /&gt;
&lt;img src=&quot;redroid2.png&quot; alt=&quot;redroid2&quot; /&gt;
如果出现了意外，例如你迟迟无法连接到设备，大概率是你没有安装&lt;code&gt;mali驱动&lt;/code&gt;，请到环境准备中的链接下载并安装&lt;code&gt;mali驱动&lt;/code&gt;，然后&lt;code&gt;docker compose down&lt;/code&gt;删除容器，重新执行&lt;code&gt;docker compose up -d&lt;/code&gt;即可&lt;/p&gt;
&lt;h2&gt;安装StarRailCopilot&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/LmeSzinc/StarRailCopilot.git /opt/StarRailCopilot
cd /opt/StarRailCopilot
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;编辑配置文件，将其中若干指定了可执行文件路径的配置项进行修改&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cp config/deploy.template-cn.yaml config/deploy.yaml
vim config/deploy.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;4.png&quot; alt=&quot;deploy1&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;3.png&quot; alt=&quot;deploy2&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOT &amp;gt; Dockerfile
FROM python:3.10.10

WORKDIR /app

COPY . /app

RUN echo &quot;\
deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib\n\
deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib\n\
deb https://mirrors.aliyun.com/debian-security/ bullseye-security main\n\
deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main\n\
deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\n\
deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\n\
deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\n\
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib&quot; \
&amp;gt; /etc/apt/sources.list

RUN apt update &amp;amp;&amp;amp; apt install -y python3-dev git adb python3-opencv
RUN pip install --upgrade pip setuptools
RUN pip install --no-cache-dir -r requirements.txt

CMD [ &quot;python&quot;, &quot;gui.py&quot; ]
EOT
cat &amp;lt;&amp;lt; EOT &amp;gt; docker-compose.yaml
version: &quot;3&quot;

services:
  src:
    build: .
    container_name: src
    restart: always
    ports:
      - &quot;22367:22367&quot;
    volumes:
      - &apos;.:/app&apos;
      - &apos;/etc/localtime:/etc/localtime:ro&apos;

EOT
docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动后，浏览器打开&lt;code&gt;http://&amp;lt;你的设备IP&amp;gt;:22367&lt;/code&gt;，即可进入StarRailCopilot的Web界面进行操作，设备Serial即为&lt;code&gt;&amp;lt;你的设备IP&amp;gt;:5555&lt;/code&gt;（如果你没有修改的话）
更多使用说明请参考&lt;a href=&quot;https://github.com/LmeSzinc/StarRailCopilot&quot;&gt;StarRailCopilot&lt;/a&gt;
&lt;img src=&quot;2.png&quot; alt=&quot;starrailcopilot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在你一切设置完毕后，可以修改&lt;code&gt;docker-compose.yaml&lt;/code&gt;文件，覆写&lt;code&gt;command&lt;/code&gt;字段，以便在容器启动时src自动运行
在src服务下添加&lt;code&gt;command&lt;/code&gt;字段，然后&lt;code&gt;docker compose up -d&lt;/code&gt;即可，如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;command: [&quot;python&quot;, &quot;gui.py&quot;, &quot;--run&quot;, &quot;src&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完整的&lt;code&gt;docker-compose.yaml&lt;/code&gt;文件如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOT &amp;gt; docker-compose.yaml
services:
  src:
    build: .
    container_name: src
    restart: always
    ports:
      - &quot;22367:22367&quot;
    volumes:
      - &apos;.:/app&apos;
      - &apos;/etc/localtime:/etc/localtime:ro&apos;
    command: [&quot;python&quot;, &quot;gui.py&quot;, &quot;--run&quot;, &quot;src&quot;]
EOT
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;补充&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以上两个docker-compose.yaml中的service可以合并到一起，在项目上层文件夹编写docker-compose和Dockerfile文件，然后使用&lt;code&gt;docker compose up -d&lt;/code&gt;启动即可，有兴趣的朋友可以自行尝试&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;附录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://static.nyanners.moe/files/mali_csffw.bin&quot;&gt;mali驱动(mali_csffw.bin)下载&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;所使用的redroid镜像作者：&lt;a href=&quot;https://github.com/CNflysky&quot;&gt;CNflysky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LmeSzinc/StarRailCopilot&quot;&gt;StarRailCopilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Joshua-Riek/ubuntu-rockchip&quot;&gt;系统镜像：ubuntu-rockchip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Genymobile/scrcpy&quot;&gt;scrcpy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/barry-ran/QtScrcpy&quot;&gt;QtScrcpy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/remote-android/redroid-doc&quot;&gt;Redroid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/compose/compose-file/compose-file-v3/&quot;&gt;docker compose语法参考文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/builder/&quot;&gt;Dockerfile语法参考文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>category:RK3588</category><category>tag:Linux</category><category>tag:RK3588</category><category>tag:OrangePi5Plus</category><category>tag:Redroid</category><category>tag:StarRailCopilot</category><category>tag:星穹铁道</category></item><item><title>Caddy简明安装&amp;配置教程</title><link>https://nyanners.moe/caddy-ez-guide.html</link><guid isPermaLink="true">https://nyanners.moe/caddy-ez-guide.html</guid><description>年轻人的第一款web服务器Caddy，简单易用，支持自动申请证书，自动更新证书</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;年轻人的第一款web服务器Caddy，简单易用，支持自动申请证书，自动更新证书，妈妈再也不用担心我不会配置https了！&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;h3&gt;Debian系安装（Debian/Ubuntu/Raspbian等）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos; | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CentOS系安装（CentOS/Fedora/RedHat等）&lt;/h3&gt;
&lt;h4&gt;Fedora 或 RHEL/CentOS 8&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;dnf install &apos;dnf-command(copr)&apos;
dnf copr enable @caddy/caddy
dnf install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;RHEL/CentOS 7&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Arch系安装（Arch/Manjaro/Parabola等）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pacman -Syu caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker pull caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Homebrew(MacOS)安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;brew install caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自行编译安装&lt;/h3&gt;
&lt;h3&gt;安装Go&lt;/h3&gt;
&lt;p&gt;自行访问&lt;a href=&quot;https://go.dev/doc/install&quot;&gt;Go官网&lt;/a&gt;根据指引进行安装&lt;/p&gt;
&lt;h3&gt;编译安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/caddyserver/caddy.git
cd caddy/cmd/caddy
go build
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;caddy run
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;基本配置&lt;/h2&gt;
&lt;p&gt;在你喜欢的位置新建一个Caddyfile文件，或使用默认的Caddyfile文件（linux系默认为/etc/caddy/Caddyfile）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vim Caddyfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假设你的域名为example.com，你在127.0.0.1:8080上运行了一个web服务，且你已经把域名解析到了你的服务器上，你想要通过example.com访问你的web服务，那么你的Caddyfile应该是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy http://127.0.0.1:8080
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来使用caddy reload命令重载配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;caddy reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在你就可以通过example.com访问你的web服务了，并且caddy已经为你申请了证书，默认启用了https，此时已经满足了大部分人的需求了，如果这不是你想要的，可以继续往下看。&lt;/p&gt;
&lt;h2&gt;额外配置&lt;/h2&gt;
&lt;h3&gt;为你的网站启用gzip&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    encode gzip
    reverse_proxy http://127.0.0.1:8080
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你还想更进一步，请查阅&lt;a href=&quot;https://caddyserver.com/docs/caddyfile/directives/encode&quot;&gt;Caddy官方文档&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;访问你的静态网页&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    root * /var/www/html
    file_server
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;从端口转发&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:80 {
    reverse_proxy localhost:8080
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;不启用https&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com:80 {
    reverse_proxy http://127.0.0.1:8080
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;添加日志&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy http://127.0.0.1:8080
    log {
        output file /var/log/caddy/access.log
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;部署php网站&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    root * /var/www/html
    php_fastcgi unix//run/php/php-version-fpm.sock
    file_server
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;代理到指定路径&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    reverse_proxy /api/* http://127.0.0.1:8080
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重定向&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;example.com {
    redir https://www.example.com{uri}
}

www.example.com {
    reverse_proxy http://127.0.0.1:8080
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果这些都不是你想要的，那么请查阅&lt;a href=&quot;https://caddyserver.com/docs&quot;&gt;Caddy官方文档&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>category:caddy</category><category>tag:caddy</category><category>tag:反代</category><category>tag:https</category><category>tag:nginx</category></item><item><title>Poetry配置国内pypi镜像</title><link>https://nyanners.moe/poetry-pip-mirror.html</link><guid isPermaLink="true">https://nyanners.moe/poetry-pip-mirror.html</guid><description>为Poetry配置国内pypi镜像,加速依赖包的下载</description><pubDate>Tue, 27 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为 &lt;code&gt;Poetry&lt;/code&gt; 配置国内pypi镜像,加速python依赖包的下载&lt;/p&gt;
&lt;h2&gt;打开配置文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;vim ./pyproject.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;添加配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;[[tool.poetry.source]]
name = &quot;aliyun&quot;
url = &quot;https://mirrors.aliyun.com/pypi/simple&quot;
default = true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;其他镜像源&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;豆瓣 https://pypi.doubanio.com/simple/
网易 https://mirrors.163.com/pypi/simple/
清华 https://pypi.tuna.tsinghua.edu.cn/simple/
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>category:Python</category><category>tag:Python</category><category>tag:Poetry</category><category>tag:pip</category><category>tag:镜像</category></item><item><title>为oh-my-zsh配置powerlevel10k主题</title><link>https://nyanners.moe/p10k.html</link><guid isPermaLink="true">https://nyanners.moe/p10k.html</guid><description>为oh-my-zsh配置powerlevel10k主题</description><pubDate>Mon, 08 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;默认你已经安装了oh-my-zsh&lt;/h2&gt;
&lt;p&gt;这是安装oh-my-zsh的教程：&lt;a href=&quot;/oh-my-zsh&quot;&gt;oh-my-zsh的安装与配置&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;安装powerlevel10k主题&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置主题&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;vim ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将&lt;code&gt;ZSH_THEME&lt;/code&gt;的值改为&lt;code&gt;powerlevel10k/powerlevel10k&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ZSH_THEME=&quot;powerlevel10k/powerlevel10k&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使配置生效&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;source ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后会出现配置向导，按照向导进行配置即可完成powerlevel10k的配置，此时已满足基本需求，更多配置请参考&lt;a href=&quot;https://github.com/romkatv/powerlevel10k&quot;&gt;官方github&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>category:Linux</category><category>tag:Linux</category><category>tag:Shell</category><category>tag:zsh</category><category>tag:oh-my-zsh</category><category>tag:powerlevel10k</category><category>tag:p10k</category></item><item><title>oh-my-zsh的安装与配置</title><link>https://nyanners.moe/oh-my-zsh.html</link><guid isPermaLink="true">https://nyanners.moe/oh-my-zsh.html</guid><description>为你的终端配置一个更好用的shell</description><pubDate>Mon, 08 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为你的终端配置一个更好用的shell&lt;/p&gt;
&lt;h2&gt;安装前置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install zsh git curl wget vim -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装oh-my-zsh&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sh -c &quot;$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装插件&lt;/h2&gt;
&lt;h3&gt;zsh-autosuggestions&lt;/h3&gt;
&lt;p&gt;自动补全插件，可以根据历史命令自动补全&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;zsh-syntax-highlighting&lt;/h3&gt;
&lt;p&gt;语法高亮插件，当命令错误时会显示红色&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;z&lt;/h3&gt;
&lt;p&gt;目录跳转插件，可以根据历史访问频率跳转到指定目录，&lt;code&gt;oh-my-zsh&lt;/code&gt;自带&lt;/p&gt;
&lt;h2&gt;使用插件&lt;/h2&gt;
&lt;h3&gt;打开配置文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;vim ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修改配置&lt;/h3&gt;
&lt;p&gt;找到&lt;code&gt;plugins&lt;/code&gt;行，添加插件名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plugins=(
    ... # 其他插件
    git
    zsh-autosuggestions
    zsh-syntax-highlighting
    z
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修改主题&lt;/h3&gt;
&lt;p&gt;具体主题可以在&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot;&gt;这里&lt;/a&gt;查看&lt;/p&gt;
&lt;p&gt;也可安装&lt;a href=&quot;/p10k&quot;&gt;p10k&lt;/a&gt;主题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ZSH_THEME=&quot;random&quot; # 随机主题
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使配置生效&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;source ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>category:Linux</category><category>tag:Linux</category><category>tag:Shell</category><category>tag:zsh</category><category>tag:oh-my-zsh</category></item></channel></rss>