Author: demensdeum

  • AirLLM:弱显卡上的大型语言模型

    通常,运行具有 700 亿个参数的大型语言模型需要数十 GB 的视频内存。 AirLLM 更冷静地处理这个问题,并提供了一种不同的方式:这样的模型可以在只有 4 GB 内存的显卡上运行,并且不需要量化、蒸馏和修剪。在这篇文章中,我将尝试不慌不忙地告诉您 AirLLM 是如何工作的,如何使用它,并且我将分享我的小项目 AirLLM-experiments,这使得使用这个库更加方便。

    什么是 AirLLM

    AirLLM 是由 Gavin Li 编写的大型语言模型推理开源库。它的想法简单而优雅:该库一次仅将一层加载到 GPU 上,而不是将所有模型权重一次存储在视频内存中。权重以切分成层的分片的形式存储在磁盘上,在生成过程中,每层依次加载、处理和卸载。

    由此可见,所需的视频内存量并不取决于模型的整体大小,而是取决于其中一层的大小。这就是为什么 70B 型号适合 4 GB,671B 上的 DeepSeek-V3 适合约 12 GB,而 Qwen3-235B 适合约 3 GB。但模型本身的大小主要受磁盘空间的限制,而不是显卡的功能。

    这些内存节省是以速度为代价的:生成每个令牌时都会从磁盘读取每个层,因此输出很慢,每个令牌大约需要几秒。因此,AirLLM 不再是快速互动聊天,而是甚至能够启动不适合硬件的模型。

    安装

    该库是使用常用命令从 PyPI 安装的:

    pip install airllm
    

    首次启动时,模型将从 Hugging Face 下载并分解为图层。此过程很慢并且占用大量磁盘空间,因此您应该提前准备好可用空间。如果需要,您可以启用 4 位或 8 位压缩 – 然后将块量化应用于权重,这将使从磁盘加载图层的速度提高约三倍,并且精度会损失很多。

    基本示例

    您使用 AirLLM 的方式与使用 Transformer 中的常规模型几乎相同。在Hugging Face上输入一次模型ID就足够了,然后一切就会很熟悉了:

    from airllm import AutoModel
    
    MAX_LENGTH = 128
    model = AutoModel.from_pretrained("Qwen/Qwen3-32B")
    
    input_text = ['What is the capital of United States?']
    
    input_tokens = model.tokenizer(
        input_text,
        return_tensors="pt",
        return_attention_mask=False,
        truncation=True,
        max_length=MAX_LENGTH,
        padding=False)
    
    generation_output = model.generate(
        input_tokens['input_ids'].cuda(),
        max_new_tokens=20,
        use_cache=True,
        return_dict_in_generate=True)
    
    print(model.tokenizer.decode(generation_output.sequences[0]))
    

    AutoModel 类本身决定模型类型,因此同一行可用于 Llama、Qwen 和 DeepSeek。如果你采用像 DeepSeek-V3 这样具有 671B 参数的模型,它也将适合大约 12 GB 的视频内存 – 这在很大程度上使该项目具有吸引力。

    在 macOS 上启动

    AirLLM 不仅可以在 CUDA 上运行,还可以在 Apple Silicon 上运行。在 macOS 上,它使用 MLX 后端,因此需要安装 mlx 和 torch,并且仅支持 Apple 芯片。还有一个小限制:MLX 实现仅支持类似 Llama 的架构,因此 Qwen 和类似型号无法以这种方式在 MacBook 上启动。

    使用示例

    AirLLM 实验是两个小型交互式控制台实用程序,用于在本地运行大型语言模型。它们无需每次都编写相同的代码来加载模型和组织聊天。

    第一个工具airllm-lib-usage.py直接在当前Python进程中运行AirLLM库。它显示总目录中模型的编号列表,如有必要,它会安装缺少的依赖项并打开聊天会话。 MLX运行时在macOS上使用,torch在其他平台上使用。

    第二个工具是airllm-openai-server-client.py,可帮助您使用airllm-openai-server服务器,该服务器在Docker中运行并提供与OpenAI兼容的API。当您第一次启动它时,该实用程序会要求设置、收集图像、拾取容器并向正在运行的服务器打开流式聊天。当重复启动时,它会找到一个现有的容器并简单地重用它,并将模型缓存存储在单独的 Docker 卷中,以免再次下载模型。

    可用模型的列表包含在公共模块 model_catalog.py 中,因此这两个工具都可以使用同一组模型。聊天命令也很常见:/help、/clear、/exit。源代码和说明位于存储库中:

    https://github.com/zefir1990/AirLLM-experiments

    需要注意什么

    第一个响应可能需要几分钟的时间来准备:首先,AirLLM 下载模型并将其分层,然后才开始生成。此外,速度仍然很低——这是为了节省内存而故意做出的妥协。对于像 meta-llama 这样的门控模型,您需要接受 Hugging Face 上的条款并传递访问令牌。最好不要删除下载的模型和分片的缓存,否则所有内容都必须重新下载。

    链接

    https://github.com/lyogavin/airllm
    https://github.com/mkamranr/airllm-openai-server
    https://github.com/zefir1990/AirLLM-experiments
    https://pypi.org/project/airllm/
    https://huggingface.co/

    来源

    https://github.com/lyogavin/airllm
    https://github.com/zefir1990/AirLLM-experiments

  • 安装 OpenCode 并连接 DeepSeek

    OpenCode 是一个位于终端中的开放编程代理。它可以读取项目文件、编辑代码、运行命令和测试、搜索存储库并使用 git – 与 Claude Code 和其他控制台代理所做的事情大致相同。主要区别在于 OpenCode 不依赖于一个模型提供者:可以通过它连接数十个提供者,包括 DeepSeek。在这篇文章中,我将描述安装代理并将 DeepSeek 连接到它。

    你需要什么

    你只需要做两件事就可以工作:

    • 现代终端。 WezTerm、Alacritty、Ghostty、Kitty 或任何其他终端都可以。
    • 提供商的 API 密钥。在我们的示例中为 DeepSeek。

    如果您使用标准安装脚本安装代理,则不需要 Node.js – 二进制文件已准备好。

    安装

    最简单的方法是官方安装脚本:

    curl -fsSL https://opencode.ai/install | bash
    

    它将检测平台本身并将可执行文件放入 PATH 中。安装后,您应该检查一切是否就位:

    opencode --version
    

    如果命令显示版本,则安装成功。

    使用其他方法安装

    如果您更喜欢包管理器,有多种选择。通过 Node.js:

    npm install -g opencode-ai
    

    Bun、pnpm 和 Yarn 也可以做同样的事情:

    bun install -g opencode-ai
    pnpm install -g opencode-ai
    yarn global add opencode-ai
    

    macOS 和 Linux 有 Homebrew。请注意:这是开发人员推荐的公式,而不是官方公式 – 它更新频率较低:

    brew install anomalyco/tap/opencode
    

    在 Arch Linux 上:

    sudo pacman -S opencode
    paru -S opencode-bin
    

    第一个命令从存储库安装稳定版本,第二个命令从 AUR 安装最新版本。

    在 Windows 上安装

    在 Windows 中,建议通过 WSL 工作:这样性能更高,并且与代理功能的兼容性更完整。但也有本地方法。通过 Chocolatey、Scoop 或 npm:

    choco install opencode
    scoop install opencode
    npm install -g opencode-ai
    

    还有一个通过 Mise 以及 Docker 容器的选项:

    mise use -g github:anomalyco/opencode
    docker run -it --rm ghcr.io/anomalyco/opencode
    

    最后,完成的二进制文件始终可以从 GitHub 上的发布页面获取。

    DeepSeek 键

    密钥在您的 DeepSeek 个人帐户中创建。转到 platform.deepseek.com,打开包含 API 密钥的部分,然后单击“创建新密钥”。最好立即保存结果字符串:它只会显示一次。

    DeepSeek 连接

    然后一切都在代理本身内部完成。在终端中启动 OpenCode:

    opencode
    

    在界面中我们执行连接命令:

    /connect
    

    在打开的提供商列表中,查找 DeepSeek,选择它并插入 API 密钥。以这种方式添加的密钥将保存到文件中:

    ~/.local/share/opencode/auth.json
    

    连接后,剩下的就是使用以下命令选择模型:

    /models
    

    DeepSeek 型号将出现在列表中,包括 deepseek-v4-pro、deepseek-flash 和 deepseek-v4-flash。对于存储库中的日常工作,闪存选项就足够了;对于复杂的任务,切换到专业版是有意义的。

    通过config进行配置

    如果您不想通过 master 存储密钥或需要设置自己的 API 地址,则直接在 opencode.json 配置文件中描述提供程序:

    {
      "$schema": "https://opencode.ai/config.json",
      "provider": {
        "deepseek": {
          "options": {
            "baseURL": "https://api.deepseek.com"
          }
        }
      }
    }
    

    如果您通过代理或您自己的网关,则 baseURL 字段非常有用。在这种情况下,将密钥本身传输到环境变量会很方便:

    export DEEPSEEK_API_KEY=ваш_ключ_deepseek
    opencode
    

    此选项适用于 CI 和一次性启动:密钥最终不会存储在存储中,而是仅存在于流程环境中。

    项目中首次启动

    转到项目目录并启动代理:

    cd ваш_проект
    opencode
    

    第一步是初始化它:

    /init
    

    OpenCode 将分析项目结构并创建一个文件 AGENTS.md – 代理指令的模拟。该文件值得提交到 git:它可以帮助代理理解项目中采用的约定和模式。

    如何使用

    这项工作的结构与其他代理的结构大致相同。您应该立即了解的一些技巧:

    • 规划模式。Tab 键可在规划模式和装配模式之间切换代理。第一个,他只是建议如何解决问题,并没有改变任何东西 – 在做出改变之前检查想法很方便。
    • 文件链接。@ 键可打开项目文件的模糊搜索,以将特定文件传输到上下文中的代理。
    • 回滚更改。/undo命令撤消最后的编辑并返回原始请求,/redo将它们返回。您可以连续回滚多个步骤。
    • 共享对话。/share 命令创建当前对话的链接并将其复制到剪贴板。默认情况下,对话不会在任何地方发布。

    对于简单的更改,您不必切换到计划模式,而是立即描述需要做什么并通过@指定文件。

    需要注意什么

    几个实际要点。 OpenCode 不需要订阅:您在花费代币时直接向提供商付款,因此 DeepSeek 的长时间会话可以预见比顶级模型便宜。密钥本地存储在 auth.json 中 – 这在共享计算机上值得考虑,但对于其他人的环境,环境变量更可靠。

    还有一件事:不同类别的模型之间复杂架构问题的答案质量有所不同,因此对于设计而言,采用更强大的模型是有意义的,而将例程交给快速且廉价的模型。

    链接

    https://opencode.ai/
    https://opencode.ai/docs/
    https://opencode.ai/docs/providers/
    https://github.com/anomalyco/opencode
    https://platform.deepseek.com/api_keys
    https://api-docs.deepseek.com

    来源

    https://opencode.ai/docs/
    https://opencode.ai/docs/providers/#deepseek
    https://github.com/anomalyco/opencode/releases
    https://models.dev/

  • 在配备 M2 处理器的 MacBook 上安装 Asahi Linux

    在配备 Apple Silicon 处理器的 Mac 上,您无法以通常的方式安装 Linux:这里不可能从闪存驱动器启动,而且启动加载程序是由 Apple 签名的。 Asahi Linux 项目致力于解决这个问题 – 其参与者使用逆向工程使 M1 和 M2 硬件在常规 Linux 下工作。现在该项目的旗舰发行版是 Fedora Asahi Remix,它在 M2 上运行得非常可靠。在这篇文章中,我将逐步描述安装过程。

    什么是 Asahi Linux

    该项目始于 2020 年,当时苹果改用自己的芯片,并随之而来的是封闭式启动方案:该设备仅运行苹果签名的代码。 Asahi Linux 参与者编写了他们的 m1n1 引导加载程序,并在其之上编写了 U-Boot 和 UEFI 环境。接下来,加载最常见的 ARM64 系统,但带有 linux-asahi 内核,其中添加了非标准 Apple 硬件的驱动程序:GPU、视频、声音、相机单元。

    实际上,它看起来像这样:您从 macOS 运行安装程序,它对磁盘进行分区,安装引导链和系统。 macOS 保持不变,您可以在打开时获得双重启动并选择您的系统。

    要求

    • 采用 M2 芯片的 Mac – MacBook Air、MacBook Pro 13 英寸,以及配备 M2 Pro 和 M2 Max 的 14 英寸和 16 英寸。还支持 M1 汽车。
    • 当前的 macOS。安装程序需要最新版本的系统,因此请在开始之前进行更新。
    • 可用空间。至少约 30 GB,舒适 – 100 GB 或更多。该空间与 APFS 容器隔离,不会自行恢复。
    • macOS 管理员密码。在分区期间和首次启动进入恢复模式时都需要它。
    • 备份。磁盘分区是一项最好从全新备份开始的操作。

    第 1 步.备份和更新

    通过时间机器或任何其他方法制作副本。将 macOS 更新到可用的最新版本并重新启动。如果启用了 FileVault,则在恢复模式的启动阶段仍需要密码 – 安装程序需要解锁驱动器。

    第 2 步:启动安装程序

    在 macOS 上打开终端并运行一个命令:

    curl https://alx.sh | sh
    

    这是该项目的官方安装程序。它会自行下载,检查您的 Mac 型号并提供选择发行版的机会。还有一个直接用于 Fedora 的选项:

    curl https://fedora-asahi-remix.org/install | sh
    

    第一个选项更好:它显示当前可用的系统,并且还提供桌面选择。

    步骤3.磁盘分区

    安装程序将要求输入管理员密码并显示当前布局。然后对话如下所示:

    • 按 r 调整 macOS 分区的大小。
    • 输入新 Linux 分区的大小。它可以以千兆字节为单位,也可以是磁盘的百分比,或者您可以写入 min – 那么最小的可能部分将被切断。
    • 用字母y确认标记。这一步最长:系统物理移动APFS容器中的数据;在大磁盘上,这需要几分钟。
    • 按 f 将安装程序指向新创建的空闲分区。

    了解正在发生的事情很重要:Linux 没有安装在 APFS 内部,而是安装在旁边的单独分区上。这就是为什么 macOS 保持不变,回滚减少为删除此部分。

    第 4 步:选择发行版和桌面

    接下来,安装程序将提供系统和桌面环境。 Fedora Asahi Remix 默认附带 KDE Plasma – 它是最先接收更新的旗舰选项。另一种选择是 GNOME,它的感觉更接近 macOS。如果您不需要图形环境,还有一个最小图像。

    步骤 5. 首次在恢复模式下启动

    分区后,安装程序将提示您继续,然后 Mac 将关闭。这是最不寻常的部分:

    • 等待至少 25 秒 – 这是 Apple 进入恢复模式的要求。
    • 按住电源按钮,直到出现启动选项。
    • 选择安装卷并输入您的 macOS 密码。

    在此步骤中,引导链安装在服务分区:m1n1、U-Boot 和 UEFI 环境中。然后机器将再次重新启动 – 再次按住电源按钮并选择新卷,这次进入系统。将会有多次这样的重启,每次都需要手动选择:默认情况下,Mac 会继续加载 macOS。

    第6步.安装系统

    接下来,初始设置向导启动:系统名称、用户、密码、时区、键盘布局。之后,安装本身开始,并且它已经来自互联网 – 您将需要稳定的连接,并且需要十五分钟到半小时的时间。

    安装完成后,重新启动并从启动菜单中选择 Linux。当您首次登录时,系统会提示您完成设置和更新。

    什么有效,什么无效

    在安装之前,你应该清醒地评估你会损失什么。在M2笔记本上情况如下:

    作品:

    • Wi-Fi 和蓝牙 – 无限制。
    • 集成屏幕和图形 – 硬件加速,包括 OpenGL 和 Vulkan。
    • MacBook Air 和 MacBook Pro 上的网络摄像头、麦克风和扬声器。
    • 睡眠模式 – 正常工作。
    • 硬件视频解码 – 播放器不加载处理器。
    • USB 端口,包括通过 Thunderbolt 连接器的 USB 2 和 USB 3。

    不起作用或部分起作用:

    • 触摸 ID。指纹在 Linux 中不可用 – 使用密码登录。
    • Thunderbolt (USB4)。状态 – 正在开发中。不幸的是,专门需要 Thunderbolt 的设备将无法工作。
    • 通过 USB-C 的外部显示器。 DisplayPort Alt 模式也正在运行。 M2 笔记本电脑没有 HDMI 端口,因此无法连接外部屏幕。配备 M2 Pro 和 M2 Max 的型号具有 HDMI,并且可以正常工作。 USB-C 的解决方法位于下面的 Fairydust 核心部分。
    • 硬件视频编码已在计划中,解码已到位。

    简而言之,它是一个非常适合处理代码、终端、浏览器和本地模型的系统,但不适用于外部显示器底座。

    通过 Fairydust 核心的外部监视器

    USB-C 图像输出可在 Asahi Linux 团队的实验性 Fairydust 内核分支中使用。手动组装需要很长时间,因此使用 asahi-fairydust-display 项目中的包装器脚本更容易:

    git clone https://github.com/bharambetejas/asahi-fairydust-display
    cd asahi-fairydust-display
    chmod +x asahi-fairydust-build.sh
    ./asahi-fairydust-build.sh
    

    该脚本克隆 Fairydust 分支,配置并组装内核,将其放置在标准内核旁边并编辑 GRUB。您需要 15 GB 可用空间、USB-C → HDMI 或 DisplayPort 适配器以及 60-90 分钟的组装时间。重新启动后,在 GRUB 中选择标记为 -fairydust 的内核,并将适配器插入最前面的 USB-C 端口。

    下载后检查:

    uname -r
    glxinfo | grep "OpenGL renderer"
    xrandr
    

    第一个命令应显示带有后缀 -fairydust 的版本,第二个命令应显示 Apple M2,而不是 llvmpipe,第三个命令应显示连接的 DP-1 输出。

    预订。该分支是实验性的,不受官方支持。输出仅通过一个 USB-C 端口工作,并且并不总是能够承受热插拔 – 在已插入适配器的情况下重新启动会更安全。该脚本不会自动配置显示:其中相应的步骤被禁用,因为它导致了 Wayland 上的登录循环。通过 dnf 更新库存内核会重新排列 /boot/dtb 符号链接,这就是输出可能默默停止工作的原因 – 然后必须重复构建。

    标准内核不受影响:要返回,只需在 GRUB 菜单中选择它即可。

    外部驱动器而不是升级

    这是好的一面。 MacBook 无法升级:内存和存储设备焊接在主板上,容量在购买时就选定了。在 macOS 中,外部驱动器仍然是外部的 – 系统和应用程序无法真正转移到它。

    在 Linux 中,这一限制被消除:通过 USB 的外部 SSD 是常规块设备,任何挂载点都可以通过 /etc/fstab 传输到它。如果您想转移您的主目录、Steam 库、虚拟机映像或本地模型,请这样做。事实证明,这正是这款车所没有的升级。

    看起来像这样。首先,查看所需分区的UUID:

    lsblk -f
    sudo blkid
    

    然后将行添加到 /etc/fstab:

    UUID=ваш-uuid  /home  ext4  defaults,nofail  0  2
    

    传输本身是通过复制完成的:将数据移动到外部驱动器,然后将其安装在所需的位置。通常情况下,并不是整个 /home 都会以这种方式被拿走,而是个别的重型目录 – 这样风险就会更小。

    有几点需要注意。选项中值得设置nofail参数:没有它,如果磁盘未连接,系统将无法启动。 USB驱动器的速度仍然低于内置NVMe,因此最好在内部磁盘上留出空间以供频繁的I/O操作。并且在移动安装有目录的磁盘时无需拉出磁盘 – 首先卸载它。

    如何在系统之间切换

    当您打开它时,按住电源按钮 – 将出现启动菜单,其中包含 macOS 和 Linux。您可以选择macOS中的默认系统:“系统偏好设置”→“常规”→“系统磁盘”。 Linux也有相应的设置,这样就可以在没有终端的情况下进行双向切换。

    链接

    https://asahilinux.org/fedora/
    https://asahilinux.org/docs/
    https://asahilinux.org/docs/platform/feature-support/m2/
    https://fedoraproject.org/asahi-remix
    https://github.com/bharambetejas/asahi-fairydust-display
    https://github.com/AsahiLinux/linux/tree/fairydust

    来源

    https://asahilinux.org/docs/platform/feature-support/m2/
    https://discussion.fedoraproject.org/t/fedora-asahi-remix-installation-guide/
    https://github.com/AsahiLinux/docs
    https://github.com/bharambetejas/asahi-fairydust-display/blob/main/README.md
    https://github.com/bharambetejas/asahi-fairydust-display/blob/main/asahi-fairydust-build.sh

  • 在 ARM Mac 上安装带有来宾添加的 VirtualBox

    有关在具有 ARM64 处理器的 Mac 上的 VirtualBox 中安装 Ubuntu Server 并连接 Guest Additions 的说明。

    安装 VirtualBox

    下载 VirtualBox 的 ARM64 版本,安装映像并将 VirtualBox.app 传输到应用程序。

    配置虚拟机

    我们创建一台新机器,指定Linux类型和Ubuntu版本(64位ARM)。在设置中我们设置:

    • TPM – 禁用
    • UEFI – 禁用
    • RAM – 4096 MB。
    • 图形控制器 – VMSVGA(用于 VBoxLinuxAdditions)。
    • 处理器 – 4 核。

    安装 Ubuntu 服务器

    将 ARM64 的 Ubuntu Server ISO 映像挂载到 CD-ROM 驱动器中。在下载部分,将光驱放在列表中的第一位。我们启动机器并安装 Ubuntu Server。

    安装 xubuntu-desktop

    安装XFCE图形环境:

    sudo apt update
    sudo apt install -y xubuntu-desktop
    

    在登录管理器选择对话框中,选择 lightdm。

    重新启动访客系统:

    sudo reboot
    

    来宾添加

    首次启动后,安装用于构建内核模块的软件包:

    sudo apt update
    sudo apt install -y build-essential linux-headers-$(uname -r)
    

    我们通过 VirtualBox 菜单安装带有 Guest Additions 的磁盘:Devices → Mount Guest Additions 磁盘映像。该磁盘将出现在 guest 虚拟机内的 /media/$USER 目录中。

    在 Xubuntu 中打开终端,进入挂载磁盘的目录并运行安装程序:

    cd /media/$USER/*
    sudo ./VBoxLinuxAdditions-arm64.run
    

    重新启动访客系统:

    sudo reboot
    

    安装后应该如何工作

    我们检查内核模块是否已加载:

    lsmod | grep vbox
    

    输出应包括 vboxguest 和 vboxsf。

    在计算机属性中添加共享文件夹并将其安装在来宾中:

    sudo mkdir -p /media/sf_shared
    sudo mount -t vboxsf shared /media/sf_shared
    

    工作特点:

    • 共享文件夹 – 主机目录通过 vboxsf 在来宾中可见。
    • 共享剪贴板 – 在主机和访客之间复制文本。
    • 鼠标集成 – 光标自由延伸到机器窗口之外。
    • 自动更改分辨率 – 访客屏幕会根据窗口大小进行调整。
    • 时间同步 – 客人的时间调整为主人的时间。

    来源

    https://www.virtualbox.org/manual/topics/guestadditions.html
    https://forums.virtualbox.org/viewtopic.php?t=112886

  • 如何将 DeepSeek 连接到 Claude Code

    Claude Code 是 Anthropic 的控制台代理,可以读取项目文件、编辑代码、运行命令和测试、搜索存储库以及使用 git。使用它时的主要不便之处在于成本:具有大量上下文的长时间会话很快就会耗尽订阅预算。

    有一个解决方案。 DeepSeek 提供与 Anthropic API 兼容的端点。更改基地址和令牌就足够了,Claude Code 将开始在 DeepSeek 模型上工作,无需任何重新安装或修补。在这篇文章中,我将描述如何在 macOS、Linux 和 Windows 上进行设置。

    为什么需要这个

    原因可能不同:
    – 价格。 DeepSeek 模型明显比 Claude 便宜,并且对于日常代理任务 – 导航项目、较小的编辑、运行测试 – 并不总是需要最高的质量。
    – 可用性。如果您没有订阅或由于某种原因无法使用 Anthropic 卡付款,DeepSeek 将成为一个可行的选择。
    – 实验。比较不同的模型如何在相同的环境中处理相同的代码库是很有趣的。

    你需要什么

    您需要安装 Claude Code 和 DeepSeek API 密钥。如果尚未安装 Claude Code,则顺序如下:
    1. 安装 Node.js 18 或更高版本。在 Windows 上,您还需要 Git for Windows。
    2. 使用以下命令安装 Claude Code 本身。
    3. 检查安装情况。

    npm install -g @anthropic-ai/claude-code
    claude --version
    

    如果显示版本,则说明安装成功。 API 密钥是在您的 DeepSeek 个人帐户的密钥页面上创建的。

    通过环境变量进行配置

    所有集成都归结为环境变量。对于 macOS 和 Linux,它看起来像这样:

    export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
    export ANTHROPIC_AUTH_TOKEN=ваш_ключ_deepseek
    
    export ANTHROPIC_MODEL=deepseek-flash[1m]
    export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-flash[1m]
    export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-flash[1m]
    export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-flash
    export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-flash
    
    export CLAUDE_CODE_EFFORT_LEVEL=max
    export CLAUDE_CODE_AUTO_COMPACT_WINDOW=786432
    

    对于 Windows 中的 PowerShell,语法不同,但变量名称相同:

    $env:ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"
    $env:ANTHROPIC_AUTH_TOKEN="ваш_ключ_deepseek"
    $env:ANTHROPIC_MODEL="deepseek-flash[1m]"
    

    让我们弄清楚这里是什么。 `ANTHROPIC_BASE_URL` 变量将请求从 Anthropic 服务器重定向到 DeepSeek。 `ANTHROPIC_AUTH_TOKEN` 替换您的密钥。其余变量决定哪个模型用于哪个角色。有些模型带有“[1m]”后缀 – 这是一个具有大约一百万个令牌的上下文窗口的选项,它允许代理一次保存更多的项目文件。因此,“CLAUDE_CODE_AUTO_COMPACT_WINDOW”被设置为该窗口的大小,以便自动历史压缩不会过早起作用。

    不用每次都手动导出变量,而是将它们注册到Claude Code配置中,很方便。然后启动时将自动获取设置。

    {
      "env": {
        "ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic",
        "ANTHROPIC_AUTH_TOKEN": "ваш_ключ_deepseek",
        "ANTHROPIC_MODEL": "deepseek-flash[1m]",
        "ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-flash",
        "CLAUDE_CODE_SUBAGENT_MODEL": "deepseek-flash"
      }
    }
    

    之后,进入项目目录并运行代理:

    cd ваш_проект
    claude
    

    VS Code 中的克劳德代码

    Claude Code 不仅可以在终端中使用,还可以作为 VS Code 的扩展。它以正常方式安装:使用 Cmd+Shift+X 打开扩展面板,找到“Claude Code”并单击安装。扩展是由 Anthropic 本身产生的。

    该扩展包含自己的 CLI 副本,并且它读取与终端版本相同的 ~/.claude/settings.json 文件。上一节中的设置也适用于此处 – 但有一个警告,这通常会导致混乱。

    启动前进行输入验证

    在开始之前,扩展程序会检查其自己的“claudeCode.environmentVariables”设置中的凭据,而不是来自 settings.json 中的凭据。 settings.json 中的值到达正在运行的进程 – 也就是说,API 地址和选定的模型被正确拾取 – 但它们没有通过扩展程序自己的登录检查。如果您看到登录屏幕,即使终端中的一切都已正常工作,这就是原因。

    这可以通过 VS Code 设置中的几行来解决:复制“claudeCode.environmentVariables”中的变量并禁用登录请求。

    {
      "claudeCode.environmentVariables": [
        { "name": "ANTHROPIC_BASE_URL", "value": "https://api.deepseek.com/anthropic" },
        { "name": "ANTHROPIC_AUTH_TOKEN", "value": "ваш_ключ_deepseek" },
        { "name": "ANTHROPIC_MODEL", "value": "deepseek-flash[1m]" }
      ],
      "claudeCode.disableLoginPrompt": true
    }
    

    macOS 细微差别

    如果从 Dock 或 Finder 启动 VS Code,它不会从 ~/.zshrc 继承环境变量。这是标准 macOS 行为,Claude 代码文档中对此进行了专门讨论。也就是说,在你的 shell 中为扩展使用 `export ANTHROPIC_BASE_URL=…` 根本不起作用 – 这个变量不会在它的环境中。

    由此可以得出两个结论。首先,claudeCode.environmentVariables中的设置比shell变量更可靠。其次,如果您仍然喜欢 shell,请从终端启动编辑器,其中变量已导出:

    code .
    

    什么不起作用

    在第三方提供商上,某些扩展功能不可用,因为它们需要 claude.ai 帐户:
    – 云会话将没有计划使用栏、语音输入和 Web 选项卡;
    – 注销命令不显示在菜单中;
    – `/usage` 将显示当前会话的消耗和代币数量,而不是计划限制;
    – 如果基地址不是 Anthropic,则远程控制不起作用。

    这是预期行为,并不表示安装失败。

    另外,我想补充一点,JetBrains 有自己的插件,但设计不同:它不包含内置 CLI,但启动已安装在集成终端中的插件。没有环境变量的设置,因此您应该使用已导出的变量从终端启动 IDE。

    DeepSeek 如何理解 Claude 模型名称

    Claude Code 在内部引用诸如 claude-opus、claude-sonnet 和 claude-haiku 等名称的模型。 DeepSeek 拦截这些名称并用自己的名称替换它们:
    – 以 claude-opus 开头的所有内容都会转到 deepseek-v4-pro;
    – 以 claude-sonnet 或 claude-haiku 开头的所有内容都会转到 deepseek-flash;
    – 未知型号名称也简化为deepseek-flash。

    这意味着即使没有明确指定模型,集成也将发挥作用 – 但最好明确控制哪些模型以及以什么费率来满足请求。这就是为什么在上面的设置中所有角色都是手动编写的。

    需要注意什么

    兼容性不完整,您应该提前了解这一点。 DeepSeek 简单地忽略了 Anthropic API 的一些功能:

    – 缓存提示。 不支持 `cache_control` 字段。 Claude Code 主动使用缓存,以免重复发送相同的上下文而付出过多的代价。这种情况在这里不会发生,因此长时间会话的价格比您对每个代币价格的预期要高。定期开始新的对话,而不是无休止地继续旧的对话。
    – 思考预算。 支持“thinking”参数,但忽略其中的“budget_tokens”。
    – 杂项。 `top_k`、`service_tier`、`container` 字段以及来自 API 的 MCP 服务器连接也将被忽略。
    – MCP。 尽管代理的常用工具(读取文件、编辑、运行命令、搜索)功能正常,但 DeepSeek 端的内置 MCP 服务器机制不起作用。

    另外,值得一提的是代理。社区中有像“ds-cc-proxy”这样的项目,它们放置在 Claude Code 和 DeepSeek 之间,承担消除轻微不兼容性的任务,以及将主会话和子代理分离到不同的模型中。如果标准设置表现不稳定,这样的中间层可以提供帮助。

    克劳德代码路由器

    上述方法将一个模型应用于所有任务。但代理所做的事情却截然不同:他了解项目的结构,纠正一些小问题,有时还解决一个真正复杂的问题。不同类型的工作应该使用不同的模型是合乎逻辑的。这正是 claude-code-router (CCR) 可以做的事情 – 一个位于 Claude Code 和模型提供者之间的本地网关。

    它给出了什么

    – 按规则路由。您可以设置哪个模型服务于主会话,哪个模型服务于后台任务,哪个模型服务于调度模式。仅在进行复杂推理时才使用昂贵的模型,并将例程交给廉价的模型是有意义的。
    – 备份选项。如果提供程序返回错误,则请求将转到链中的下一个模型,而不是删除会话。
    – 可观察性。界面显示请求日志、延迟、令牌消耗和成本 – 您只能通过直接连接来猜测。
    – 多个代理的一个地址。提供商、密钥和规则位于一处,客户端连接到一个本地地址。

    首先关于版本 – 这很重要

    这里值得警告,因为它会节省您的时间。 CCR 在其历史上经过了大幅重新设计,您在搜索中找到的几乎所有文章都描述了过时的版本。

    在旧版本中,配置位于文件 ~/.claude-code-router/config.json 中,其中包含 Providers 和 Router 块,并且所有内容都是使用“ccr code”命令启动的。现在不再那样了。当前版本 (3.x) 将设置存储在 SQLite 数据库中,并通过 Web 界面进行管理。如果还没有数据库,旧的 config.json 将被读取一次作为迁移源 – 之后,对其进行编辑不会影响任何内容。

    也就是说,如果您在互联网上找到了有关编辑 config.json 和“ccr code”命令的说明,但没有任何效果,那么您正在编辑一个不再有人读取的文件。这不是你的错。

    安装

    您将需要 Node.js 22 或更高版本。

    npm install -g @musistudio/claude-code-router
    ccr ui
    

    `ccr ui` 命令在后台启动服务并在浏览器中打开管理界面。了解其他命令很有用:“ccr start”启动服务,“ccr stop”停止服务,“ccrserve”在前台工作,当您需要查看日志时很方便。

    默认情况下,管理接口位于端口 3458 上,模型的网关本身位于端口 3456 上。

    设置

    一切都在 Web 界面中完成,无需手动编辑文件:
    1. 在 Providers 部分中,添加 DeepSeek 提供程序并指定其密钥。请注意:此处需要直到聊天/完成点的完整地址,而不仅仅是域名。
    2. 在“模型”部分中,描述此模型是什么 – 该描述有助于路由。
    3. 在代理配置部分,设置默认模型。
    4. 在“路由”部分中,配置规则:哪个模型响应哪个请求。
    5. 在 API 密钥页面上,创建 CCR 客户端密钥 – 这是 Claude Code 将使用的密钥,而不是 DeepSeek 密钥。

    之后,剩下的就是将 Claude Code 发送到网关:指定界面中显示的网关地址作为基地址,并将 CCR 客户端密钥作为令牌。

    一件好事:如果逻辑比比较一个字段更复杂,路由规则不仅可以使用字段编写,还可以使用 JavaScript 脚本编写。

    值得使用吗

    将 DeepSeek 连接到 Claude Code 主要是一种在不放弃方便的代理环境的情况下降低成本的方法。您可以获得相同的界面、相同的工具和相同的工作流程,但模型不同。设置需要几分钟,并且是完全可逆的:只需删除环境变量即可返回人类模型。

    局限性也很明显:没有提示缓存、API 字段兼容性不完全、对于复杂的架构任务,模型的质量可能会有所不同。对于存储库中的日常工作 – 导航、重构、运行测试 – 这已经足够了。

    示例:Oni 扩展

    这种组合的一个活生生的例子是我的项目 Oni-Extended,它是 Apple Silicon 游戏 Oni(Bungie,2001)移植版的一个分支。游戏源代码是用C语言编写的,已经存在了二十多年;其中从未进行过任何测试,文件大小以数万行为单位。然而,新功能已通过 DeepSeek 的 Claude Code 添加到该项目中:通过 F5/F9 快速保存和加载、按键保持块以及禁用损坏的 -nodamage 启动标志。

    这很好地说明了上面所说的内容。所有任务都与大型存储库中的日常工作相关 – 代理检查其他人的代码,找到模块之间的联系并测试假设,而不是从头开始设计架构。尽管结果是通过项目自己的基础设施(装配、水平运行台和离线测试)进行验证的,但 DeepSeek 上此类会话的成本明显低于 Anthropic 模型。

    链接

    https://platform.deepseek.com/api_keys
    https://api-docs.deepseek.com
    https://docs.anthropic.com/en/docs/claude-code
    https://github.com/anthropics/claude-code
    https://github.com/musistudio/claude-code-router
    https://ccrdesk.top/en/guides/cli/
    https://github.com/zefir1990/Oni-Extended

    来源

    https://api-docs.deepseek.com/guides/anthropic_api
    https://api-docs.deepseek.com/quick_start/agent_integrations/claude_code
    https://ccrdesk.top/en/routing/
    https://code.claude.com/docs/en/vs-code

  • maimat:批量图像压缩和调整大小

    maimat(海量图像处理工具)是一款开源工具,专为批量图像处理而设计:调整大小和压缩。该应用程序是用 Python 3.10+ 编写的,并使用 ImageMagick 作为处理引擎。

    链接

    https://github.com/zefir1990/maimat

  • 《Donki Hills》正式登陆 Steam 已有一年多了!

    《Donki Hills》已经在 Steam 上发布一年多了!

    整整一年前,该项目出现在 Steam 页面上,从那时起,这款游戏已经取得了长足的进步。在此期间,我们进行了许多尝试、改变和探索,寻找Donki Hills应该发展的方向。

    游戏玩法的开发工作仍在继续,现在该项目正在逐渐显现出它的真面目。 《Donki Hills》开始变成它的初衷——喜剧第一人称 Roguelike 模仿生存恐怖游戏。

    这是一场恐怖与幽默、探索和意想不到的情况相遇的奇怪冒险。你必须前往城市,寻找物品,解开谜语,并逐渐揭开通往玛丽亚的秘密。

    以下是原型的下一次游戏测试的最新屏幕截图。这还不是游戏的最终外观,但你已经可以感受到城市的氛围以及项目的前进方向。

    很想听听您的反应! 👀
    你觉得新方向怎么样?您对比赛的氛围和理念有何印象?

    感谢所有将 Donki Hills 添加到愿望清单、关注开发并支持该项目的人❤️

    前方还有许多实验、新机制和奇怪的冒险。

    https://store.steampowered.com/app/3476390/Donki_Hills/

  • 绕过游戏笔记本电脑处理器上的节流

    现代游戏笔记本电脑制造商经常配置系统,使处理器在负载下升温至 90 摄氏度,甚至达到 100 摄氏度。这个问题在夏季运行要求较高的游戏或繁重的工作任务时尤其严重。

    由于过热,会激活节流(重置处理器频率以防止物理损坏),这会导致性能急剧下降、冻结和 FPS 下降。解决过热问题的方法有很多(从使用散热垫到降压),但在本文中,我将介绍与 Windows 11 及早期版本的操作系统相关的最简单、最快的方法。

    方法是通过电源设置来限制处理器的最大状态:

    1. 通过 Windows 搜索或控制面板打开电源选项。
    2. 在活动电源计划中,转到更改其他参数的部分。
    3. 找到处理器电源管理分支。
    4. 展开最大处理器状态选项。
    5. 对于已插入,将值从 100% 更改为 80% 或更低。

    应用这些设置后,处理器将不再自动超频到产生过多热量的极端频率。虽然最大峰值性能会下降约20%,但处理器不会再过热。对于系统来说,在没有节流的情况下以降低的频率稳定运行比在 100 度以下的温度下因过热而导致性能持续急剧跳跃要好得多,也更舒适。

    每台笔记本电脑都是独一无二的,因此我建议用户进行试验并找到最佳平衡(百分比),以提供所需的性能而不会过热。

  • Aleka 是一款基于 Flutter 构建的跨平台绘图应用

    Aleka 是一款用 Flutter 编写的轻量级、快速绘图应用程序。它适用于任何地方:浏览器、桌面(Windows、macOS、Linux)和移动设备(iOS、Android)。

    引擎盖下是纯粹的 Dart、Material 3 和对细节的关注。

    机会

    • 手绘图:通过二次贝塞尔插值实现平滑笔画。
    • 15 种颜色的调色板:通过视觉指示快速选择。
    • 画笔大小:可使用滑块在 1 到 30 像素之间进行调整。
    • 撤消:后退一步。
    • 清除画布:只需单击一下即可。
    • 洪水填充:具有平滑边缘容差的 BFS。
    • 保存:格式.aleka (JSON)。
    • 加载:打开之前保存的绘图并继续。
    • PNG 导出: 以 3 倍分辨率捕获画布。
    • 🎬 动画模式: 带时间轴的逐帧动画:
      • 添加和删除框架,每个框架都有自己的设计。
      • 帧持续时间从 50 毫秒到 5 秒。
      • 更改 FPS:6、8、12、15、24、30 或 60。
      • 导出为 MP4(通过桌面上的 ffmpeg、浏览器中的 ffmpeg.wasm)。
    • 深色和浅色主题:材质3,遵循系统。

    为什么要颤动?

    Flutter 允许您为六个平台编写一个应用程序,而无需重复代码。 Aleka 仅使用 Dart 和 Flutter SDK 的本机功能以及最少的第三方依赖项:file_picker、image 用于在填充时处理像素、ffmpeg_wasm 用于在浏览器中导出视频。

    架构

    该项目遵循简洁架构和 SOLID 的原则:

    • PaintCanvasController – 通过侦听器/观察者模式控制笔划和填充的状态。
    • PaintToolbar – 调色板、滑块和按钮的 UI 组件。
    • AlekaFile – JSON、PNG 捕获中的序列化/反序列化。
    • MovieController – 帧和动画状态的模型。
    • VideoExport – 封装 MP4 编码逻辑(桌面/网络)。

    I/O 函数(saveStrokes、loadStrokes、capturePng 等)可注入 – 它们可以在测试期间用模拟替换。该项目有79个测试:检查序列化、取消、加载/保存、PNG和视频导出、帧模型和时间轴。

    文件格式.aleka

    .aleka 文件是可读的 JSON,可以在任何文本编辑器中打开:

      "aleka": "1.0",
      "strokes": [
        {
          "color": 4278190080,
          "strokeWidth": 3.0,
          "points": [[100.0, 200.0], [150.0, 250.0]]
        }
      ]
    }
    

    每个笔划存储一种颜色 (ARGB32)、粗细和点数组。该格式由 aleka 字段进行版本控制。

    动画模式

    主要功能之一是内置的逐帧动画编辑器。您绘制一个框架,添加一个新框架,绘制下一个框架,依此类推。时间线显示缩略图并允许您更改帧的顺序和持续时间。完成的动画可以导出为 MP4。

    导出算法迭代所有帧,通过 RepaintBoundary 捕获它们,收集 PNG 字节并将它们传输到编码器。在桌面上,调用系统 ffmpeg,在浏览器中,使用 ffmpeg.wasm – ffmpeg 到 WebAssembly 的成熟端口,直接在浏览器沙箱中工作。

    洪水填充

    填充实现使用宽度优先搜索 (BFS) 和颜色容差 (_kFillTolerance = 1000)。这使您可以正确处理笔画的平滑边缘 – 填充不会超出轮廓,但会捕获边框上的半透明像素。对于空画布,将创建实心填充,无需进行不必要的计算。

    尝试

    Aleka 可在网络上使用并作为本机应用程序使用:

    demensdeum.com/software/aleka/

    源代码在 MIT 许可证下开放:

    github.com/demensdeum/Aleka

  • 妈妈日历 – 跨平台提醒应用程序

    Mama Calendar 是一个用 React Native (Expo) 编写的跨平台事件和提醒应用程序,具有两个后端实现:Node.js + MongoDB 和 PHP + MariaDB。

    该应用程序允许您创建带有表情符号分类的事件,选择重复类型(一次、每年、每月、每周、每天),并在单独的“重要事件”选项卡中查看接下来 3 天的重要事件。

    技术栈

    前端是通过带有 TypeScript 的 Expo SDK 57 用 React Native 0.86 编写的,用于导航的 Expo Router 和用于动画的 react-native-reanimated 。 Expo-symbols 用于图标(iOS 上的 SF 符号,Android/Web 上的 Material 图标)。

    后端有两个版本实现:

    • Node.js: Express 4、通过本机驱动程序的 MongoDB 8、使用 scrypt + salt 的自定义身份验证、手动令牌管理。 Docker Compose 会启动客户端 (nginx)、服务器和 MongoDB。
    • PHP: 无框架的 PHP 8.2、PDO + MariaDB 11、用于密码散列的 bcrypt、您自己的路由器以及通过 Composer 自动加载的 PSR-4。

    应用功能

    • 注册和授权:带有用户名/密码和不记名令牌的简单系统
    • CRUD 事件:创建、查看、编辑和删除包含日期、表情符号和重复类型的事件
    • 智能过滤:“重要事件”选项卡显示未来 3 天的事件,并考虑重复规则。例如,年度事件显示最近的年度事件、每月 – 按月中的日期、每周 – 按星期的日期
    • 表情符号选择器: 20 个预设表情符号,用于对事件进行快速分类
    • 突出显示今天的活动:今天的活动以红色背景突出显示 (#B71C1C)
    • 深色主题:自动检测系统配色方案,并使用单独的浅色和深色主题调色板
    • 国际化:通过 React Context 实现俄语和英语
    • Анимации: анимированный сплэш-скрин с Keyframe API и упругой интерполяцией, анимированная иконка приложения с вращающимся свечением
    • 管理端点:管理用户、令牌并通过主令牌清除数据库

    为什么有两个后端实现?

    Node.js 版本是主要版本,但 PHP 版本作为更经典托管的替代方案存在。 API 完全相同,允许您在不更改客户端代码的情况下在它们之间进行切换。

    基础设施

    整个堆栈是通过 Docker Compose 构建的:客户端通过多阶段构建(Expo export → nginx alpine)进行组装,服务器位于 Node.js、MongoDB 8 上。对于 PHP 版本,有一个单独的包含 MariaDB 11 和 phpunit 的 compose 文件用于测试。

    Web 版本的组装由 PowerShell 脚本自动完成,该脚本会在 expo 导出 之前修补 API_URL,并在之后恢复原始版本。

    输出

    Mama Calendar 是一款功能齐全的跨平台应用程序,涵盖整个周期:从 React Native 上的移动和 Web 前端到两个服务器端选项。该项目因其架构、现代 Expo SDK 功能的使用和双后端实现而有趣。

    链接

    https://github.com/zefir1990/Mama-Calendar
    https://demensdeum.com/software/mama-calendar/events

  • 将 Surreal Engine C++ 移植到 WebAssembly

    在这篇文章中,我将描述如何将 Surreal Engine 游戏引擎移植到 WebAssembly。
    https://demensdeum.com/demos/SurrealEngine/”
    超现实引擎–一个游戏引擎,实现了Unreal Engine 1的大部分功能,著名的游戏都使用这个引擎–虚幻竞技场 99、虚幻、杀出重围、不朽。它指的是主要在单线程执行环境中工作的经典引擎。
    我最初的想法是承担一个我无法在任何合理的时间范围内完成的项目,从而向我的 Twitch 粉丝展示即使我也无法完成的项目。在我的第一次直播中,我突然意识到使用 Emscripten 将 Surreal Engine C++ 移植到 WebAssembly 的任务是可行的。

    一个月后,我可以在 WebAssembly 上演示我的前叉和引擎组装:
    https://demensdeum.com/demos/SurrealEngine/
    与原始版本一样,控制是使用键盘箭头进行的。接下来,我计划将其调整为移动控制 (tachi),添加正确的光照和 Unreal Tournament 99 渲染的其他图形功能。

    从哪里开始?

    我想说的第一件事是,任何项目都可以使用 Emscripten 从 C++ 移植到 WebAssembly,唯一的问题是功能有多完整。选择一个其库端口已可用于 Emscripten 的项目;就 Surreal Engine 而言,您非常幸运,因为该引擎使用了 SDL 2、OpenAL –图书馆。它们都被移植到 Emscripten。不过,Vulkan 用作图形 API,目前还无法用于 HTML5,实现 WebGPU 的工作正在进行中,但也处于草案阶段,而且在完全标准化后,从 Vulkan 到 WebGPU 的进一步移植会有多简单也不得而知。因此,我必须为 Surreal Engine 编写自己的基本 OpenGL-ES / WebGL 渲染器。

    构建项目

    在 Surreal Engine 中构建系统 – CMake,这也简化了移植,因为 Emscripten 提供了其本机构建器emcmake,emmake。
    Surreal Engine 端口基于我最新的 WebGL/OpenGL ES 和 C++ 游戏代码,称为 Death-Mask,因此开发更加简单,我随身携带了所有必要的构建标志和代码示例。
    CMakeLists.txt 中最重要的一点是 Emscripten 的构建标志,下面是项目文件中的示例:

    set(CMAKE_CXX_FLAGS "-s MIN_WEBGL_VERSION=2 
    -s MAX_WEBGL_VERSION=2 
    -s EXCEPTION_DEBUG 
    -fexceptions 
    --preload-file UnrealTournament/ 
    --preload-file SurrealEngine.pk3 
    --bind 
    --use-preload-plugins 
    -Wall 
    -Wextra 
    -Werror=return-type 
    -s USE_SDL=2 
    -s ASSERTIONS=1 
    -w 
    -g4 
    -s DISABLE_EXCEPTION_CATCHING=0 
    -O3 
    --no-heap-copy 
    -s ALLOW_MEMORY_GROWTH=1 
    -s EXIT_RUNTIME=1")
    

    构建脚本本身:

    clear
    emmake make -j 16
    cp SurrealEngine.data /srv/http/SurrealEngine/SurrealEngine.data
    cp SurrealEngine.js /srv/http/SurrealEngine/SurrealEngine.js
    cp SurrealEngine.wasm /srv/http/SurrealEngine/SurrealEngine.wasm
    cp ../buildScripts/Emscripten/index.html /srv/http/SurrealEngine/index.html
    

    接下来,让我们准备 index.html,其中包括项目文件系统预加载器。为了上传到网络,我使用了 Unreal Tournament Demo 版本 338。正如您从 CMake 文件中看到的,解压后的游戏文件夹已添加到构建目录中,并作为 Emscripten 的预加载文件进行链接。

    主要代码更改

    然后我们必须改变游戏的游戏循环,不能无限循环,这会导致浏览器冻结,而是需要使用 emscripten_set_main_loop,我在 2017 年的笔记中写过这个功能“将 SDL C++ 游戏移植到 HTML5 (Emscripten)”
    我们将退出 while 循环的代码更改为 if,然后在全局范围内显示包含游戏循环的游戏引擎的主类,并编写一个将从全局对象调用游戏循环步骤的全局函数:

    #if __EMSCRIPTEN__
    #include <emscripten.h>
    Engine *EMSCRIPTEN_GLOBAL_GAME_ENGINE = nullptr;
    void emscripten_game_loop_step() {
    	EMSCRIPTEN_GLOBAL_GAME_ENGINE->Run();
    }
    #endif
    

    之后,您需要确保应用程序中没有后台线程;如果有,那么准备重写它们以进行单线程执行,或者使用 Emscripten 中的 phtread 库。
    Surreal Engine 中的后台线程用于播放音乐,数据来自主引擎线程,有关当前曲目、是否需要播放音乐或缺少音乐,然后后台线程通过互斥体接收新状态并开始播放新音乐或暂停。后台线程还用于在播放期间缓冲音乐。
    我尝试使用 pthread 为 Emscripten 构建 Surreal Engine,但没有成功,因为 SDL2 和 OpenAL 端口是在没有 pthread 支持的情况下构建的,而且我不想为了音乐而重建它们。因此,我使用循环将背景音乐流的功能转移到单线程执行。通过从 C++ 代码中删除 pthread 调用,我将缓冲和音乐播放移至主线程,这样就不会出现延迟,我将缓冲区增加了几秒钟。
    接下来我将描述图形和声音的具体实现。

    不支持 Vulkan!

    是的,HTML5 不支持 Vulkan,尽管所有营销手册都将跨平台和广泛的平台支持作为 Vulkan 的主要优势。因此,我必须为简化的 OpenGL 类型编写自己的基本图形渲染器 – ES,它用在移动设备上,有时它不包含现代OpenGL的时尚功能,但它很好地移植到WebGL,这正是Emscripten实现的。写了基本的tile渲染,bsp渲染,最简单的GUI显示,渲染模型+贴图,两周就完成了。这也许是该项目中最困难的部分。实现超现实引擎渲染的全部功能还有很多工作要做,因此欢迎读者以代码和拉取请求的形式提供任何帮助。

    支持 OpenAL!

    幸运的是,Surreal Engine 使用 OpenAL 进行音频输出。在 OpenAL 中编写了一个简单的 hello world 并使用 Emscripten 在 WebAssembly 中将其组装后,我清楚地意识到一切是多么简单,然后我开始移植声音。
    经过几个小时的调试,我们发现 Emscripten 的 OpenAL 实现存在几个错误,例如,在初始化读取单声道通道数时,该方法返回无限数,在尝试初始化无限大小的向量后,C++ 崩溃并出现异常 vector::length_error。
    我们通过将单声道数量硬编码为 2048 来解决这个问题:

    		alcGetIntegerv(alDevice, ALC_MONO_SOURCES, 1, &monoSources);
    		alcGetIntegerv(alDevice, ALC_STEREO_SOURCES, 1, &stereoSources);
    
    #if __EMSCRIPTEN__
    		monoSources = 2048; // for some reason Emscripten's OpenAL gives infinite monoSources count, bug?
    #endif
    
    

    有网络吗?

    Surreal Engine目前不支持在线游戏,支持与机器人一起玩,但我们需要有人为这些机器人编写AI。理论上,你可以使用Websockets在WebAssembly/Emscripten上实现网络游戏。

    结论

    总之,我想说,由于使用了 Emscripten 移植的库,以及我过去在 Emscripten 上使用 C++ 为 WebAssembly 实现游戏的经验,Surreal Engine 的移植非常顺利。以下是有关该主题的知识来源和存储库的链接。
    M-M-M-杀死怪物!
    另外,如果您想帮助该项目,最好使用 WebGL/OpenGL ES 渲染代码,请在 Telegram 中给我写信:
    https://t.me/demenscave

    链接

    https://demensdeum.com/demos/SurrealEngine/

    https://github.com/demensdeum/SurrealEngine-Emscripten

    https://github.com/dpjudas/SurrealEngine

  • 通过 Chisel 在客户端之间进行端口转发:没有 L3 的精简隧道

    当两个设备位于 NAT 或严格的防火墙后面并且无法直接“看到”对方时,VPN 似乎是标准解决方案。但成熟的 L3 隧道(如 WireGuard 或 OpenVPN)通常是多余的:它需要 root 权限、设置虚拟接口,并且可能与现有路由冲突。

    在这种情况下,使用 Chisel 会很方便 – 一种在 HTTP 之上运行并使用 WebSocket 进行数据传输的 TCP/UDP 隧道。在这篇文章中,我将展示如何通过中间服务器将端口从一个客户端“转发”到另一个客户端。

    它是如何工作的?

    想象一下这种情况:您有 客户端 A(例如,您的家庭服务器)、客户端 B(您的工作笔记本电脑)和具有公共 IP 地址的 VPS。客户端A和B可以访问VPS,但不能互相访问。

    转发方案将如下所示:
    1. 客户端 A 连接到 VPS 并在服务器上打开“反向”端口。现在,到达服务器端口 X 的所有内容都会转到客户端 A 的端口 Y。
    2. 客户端 B 连接到 VPS 并将端口 Z 从其本地计算机转发到服务器的端口 X。
    3. 结果,客户端 B 访问 localhost:Z 并最终到达 客户端 A:Y。

    当与 VPS 的通信未实现 L3 层或无法在客户端之间配置路由时,此方法是解决方案之一。我们专门从事应用程序和端口级别的工作。

    第 1 步:启动服务器

    在您的 VPS 上,只需在服务器模式下运行 Chisel 即可。需要 --reverse 标志来允许客户端打开服务器端的端口。

    chisel server --port 8080 --reverse
    

    第 2 步:连接客户端 A(源)

    假设客户 A 希望在端口 3000 上开放对其本地 Web 服务器的访问。他连接到 VPS 并说:“在服务器上保留端口 2000,并将其转发给我到 3000。”

    chisel client vps-ip:8080 R:2000:127.0.0.1:3000
    

    现在,VPS 上的端口 2000(在环回接口上)通向客户端 A。

    第 3 步:连接客户端 B(消费者)

    现在客户端B想要访问这个资源。它连接到同一个VPS并将其本地端口8080转发到服务器的端口2000。

    chisel client vps-ip:8080 8080:127.0.0.1:2000
    

    准备好!现在,当您在客户端 B 上打开 http://localhost:8080 时,您将看到该服务在客户端 A 上运行。

    安全性和细微差别

    Chisel 支持通过 --auth 标志进行身份验证,在通过公共服务器工作时强烈建议这样做。您还可以使用 TLS 证书来加密流量。

    这种方法的主要优点是不需要 TUN/TAP 设备和复杂的路由表。这是一个精简的隧道,只做一件事:通过 WebSocket 连接绑定端口。如果您将 Chisel 配置为通过端口 443 工作,这甚至可以通过公司代理工作。

    输出

    Chisel 是用于特定网络任务的实用程序。当您需要在隔离节点之间转发端口而不设置成熟的 VPN 时,通过中继服务器的正向和反向隧道组合是完全可行的解决方案。

    链接

    https://github.com/jpillora/chisel

  • 为什么我无法修复该错误?

    您花费数小时编写代码,进行假设,调整条件,但错误仍然重现。听起来很熟悉吗?这种沮丧的状态通常被称为“幽灵狩猎”。该程序似乎过着自己的生活,忽略您的更正。

    造成这种情况的最常见且最烦人的原因之一是在应用程序中完全错误的位置寻找错误。

    “虚假症状”的陷阱

    当我们看到错误时,我们的注意力就会被吸引到它“出问题”的地方。但在复杂的系统中,发生错误(崩溃或不正确的值)只是一长串事件的结束。当你试图修复结局时,你是在对抗症状,而不是疾病。

    这就是流程图概念的用武之地。

    它在现实中是如何运作的

    当然,没必要每次都直接在纸上画(画)出流程图,但将其放在脑子里或手边作为架构指南很重要。流程图允许您将应用程序的操作可视化为结果树。

    在不理解这个结构的情况下,开发者常常是在黑暗中摸索。想象一下这种情况:您在一个条件分支中编辑逻辑,而应用程序(由于一组特定参数)转到您甚至没有想到的完全不同的分支。

    <块引用>
    结果:您花费数小时对算法的一个部分进行“完美”代码修复,当然,这对解决算法实际失败的另一部分的问题没有任何作用。

    <小时/>

    击败错误的算法

    要停止敲打紧闭的门,您需要改变诊断方法:

    • 在结果树中查找状态:在编写代码之前,您需要准确确定应用程序所采取的路径。逻辑在什么时候出现了错误?哪个具体状态(状态)导致了该问题?
    • 复制成功率为 80%:这通常由测试人员和自动化测试完成。如果bug是“浮动”的,则开发参与过程中共同寻找条件。
    • 使用尽可能多的信息:日志、操作系统版本、设备参数、连接类型(Wi-Fi/5G)甚至特定的电信运营商对于本地化都很重要。

    错误时刻的“照片”

    理想情况下,要修复它,您需要在重现错误时获取应用程序的完整状态。交互日志也非常重要:它们不仅显示最终点,还显示整个用户路径(失败之前执行了哪些操作)。这有助于理解如何再次重新创建类似的状态。

    未来提示:如果您遇到复杂的情况,请在这部分代码中添加扩展的调试日志记录信息,以防这种情况再次发生。

    <小时/>

    人工智能时代“难以捉摸”的状态问题

    在使用LLM(大型语言模型)的现代系统中,经典决定论(“一个输入,一个输出”)经常被违反。您可以传递完全相同的输入数据,但会得到不同的结果。

    发生这种情况是由于现代生产系统的非决定论:

    • GPU 并行性:GPU 浮点运算并不总是关联的。由于线程并行执行,数字相加的顺序可能会略有变化,这可能会影响结果。
    • GPU 温度和限制:执行速度和负载分布可能取决于硬件的物理状态。在巨大的模型中,这些微观差异会累积,并可能导致在输出时选择不同的标记。
    • 动态批处理:在云端,您的请求会与其他请求合并。不同的批量大小会改变内核中的计算数学。

    在这样的条件下,再现“同样的状态”几乎是不可能的。只有统计测试方法才能拯救您。

    <小时/>

    当逻辑失败时:内存问题

    如果您使用“不安全”语言(C 或 C++),该错误可能会因内存损坏而发生。

    这些是最严重的情况:一个模块中的错误可能会“覆盖”另一个模块中的数据。这会导致完全无法解释的孤立故障,无法使用正常的应用程序逻辑进行追踪。

    如何在架构层面保护自己?

    为了避免这种“神秘”的错误,您应该使用现代方法:

    • 多线程编程模式:清晰的同步消除了竞争条件。
    • 线程安全语言:编译时保证内存安全的工具:
      • Rust:所有权系统消除了内存错误。
      • Swift 6 并发:强大的数据隔离检查。
      • Erlang:通过参与者模型完成进程隔离。

    摘要

    修复错误并不是要编写新代码,而是要了解旧代码是如何工作的。请记住:您可能会浪费时间编辑管理层根本不接触的分支。记录系统状态,考虑AI非确定性因素,选择安全工具。

  • 为什么文档是你最好的朋友

    (以及如何创建在更新后继续有效的解决方案)

    “应用程序只能使用公共 API,并且必须在当前发布的操作系统上运行。”苹果应用程序审查指南

    如果您曾经开始使用新框架并发现自己在想:“现在我自己就能理解所有内容,阅读文档太长了”,那么您绝对不是一个人。我们中的许多人都有一种天生的调查本能:先尝试,然后再查看说明。这是完全正常的。

    然而,在这个阶段,很容易得意忘形,最终陷入代码运行良好但可能依赖于系统的非明显功能的情况。

    为什么有时仅仅“自己解决”还不够?

    框架,尤其是封闭框架,是复杂的、多层的系统。它们经常隐藏内部逻辑和优化:

    * 公共文档中没有描述;
    * 不保证该行为将来会维持;
    * 可能会随着新版本的发布而改变;
    * 可能包含开发人员已知但尚未修复的功能。

    当我们凭直觉行事时,存在根据随机观察而不是根据记录的规则构建架构的风险。这可以使代码对更新更加敏感。

    文档不是限制,而是可靠的支持

    框架开发人员创建手册来帮助我们。在文档中执行操作,我们得到:

    * 稳定;
    * 支持;
    * 可预测的系统行为。

    如果超出这些限制,我们就会承担额外的风险,并且维护此类代码会变得更加困难。

    实验?当然。但要了解边界。
    好奇心是开发人员的一大特质。探索和尝试新事物是绝对必要的。但这里有一个小小的愿望:

    最舒适的实验方法是依赖最佳实践。

    该文档是一张地图,显示哪些路径最安全并受到创建者的支持。

    外部观点:专家建议

    我们经常向经验丰富的同事学习:

    *他们开设有用的课程,
    * 在会议上发言,
    * 写精彩的书籍和博客,
    * 分享他们独特的愿景。

    他们中的许多人分享了真正宝贵的经验。但值得记住的是:如果作者的方法与官方文档相矛盾,它们可能会变得脆弱。

    有时,这种“经验模式”:

    * 仅适用于特定版本的框架;
    * 对更新敏感;
    * 在异常情况下可能会出现不可预测的行为。

    向社区学习是伟大且有益的。但任何建议,即使是最权威的建议,都应该仔细检查官方手册。

    关于 SOLID 的一些知识

    SOLID 原则中的三个想法完美地补充了这种方法:

    * 开放/封闭原则:尝试通过公共 API 扩展行为,如果可能,不依赖隐藏的实现。
    * 里氏替代原则:依赖合同,而不是具体执行。否则,幕后的变化可能会导致意想不到的困难。
    * 依赖倒置:建立对抽象的依赖,而不是细节。

    在实践中,这意味着与框架的内部、未记录的细节相关联会使系统变得脆弱。
    基于公共接口和合约,我们得到:

    * 更好地将代码与框架的更改隔离;
    * 易于测试;
    * 架构的可预测性和可靠性。

    如果出现错误怎么办?

    也有这样的情况,一切都按照规则去做,但结果却没有达到预期。框架不断发展,但并不总是完美的。在这种情况下:

    * 构建一个重现问题的最小示例。
    * 确保仅使用记录的 API。
    * 发送错误报告 – 开发团队一定会感谢您的工作并尽力提供帮助。

    如果该示例依赖于解决方法,那么开发人员提供支持将会更加困难。

    如何充分利用框架

    *请参阅文档。
    * 遵循作者的指南和建议。
    * 在所描述的功能范围内进行实验。
    * 检查来自互联网和官方来源的建议。
    * 本地化错误,同时尊重框架契约。

    结论

    框架是强大的工具,有自己的游戏规则。如果忘记它们,我们的代码就会变得过于脆弱。但我们都希望创建的产品能长久存在,而不是在每次小更新后都需要紧急修正。

    手册和文档是极好的支持,有助于创建真正可靠的解决方案。

    来源

    https://developer.apple.com/app-store/review/guidelines/
    https://en.wikipedia.org/wiki/SOLID
    https://en.wikipedia.org/wiki/API
    https://en.wikipedia.org/wiki/RTFM

  • 在 Linux 上构建适用于 iOS 的 C++ SDL 应用程序

    在这篇文章中,我将描述在 Linux 上为 iOS 构建 C++ SDL 应用程序的过程,在没有付费 Apple Developer 订阅的情况下签署 ipa 存档,以及使用 macOS 在没有越狱的情况下将其安装在干净的设备 (iPad) 上。

    首先,让我们安装 Linux 的构建工具链:
    https://github.com/tpoechtrager/cctools-port

    需要从存储库下载工具链,然后按照Godot Engine网站上的说明完成安装:
    https://docs.godotengine.org/ru/latest/development/compiling/cross-compiling_for_ios_on_linux.html

    目前,您需要下载 Xcode dmg 并从那里复制 sdk 来构建 cctools-port。此阶段在 macOS 上更容易完成;只需从已安装的 Xcode 中复制必要的 sdk 文件即可。成功组装后,终端将包含交叉编译器工具链的路径。
    接下来,您可以开始构建适用于 iOS 的 SDL 应用程序。让我们打开 cmake 并添加必要的更改来构建 C++ 代码:

    SET(CMAKE_SYSTEM_NAME Darwin)
    SET(CMAKE_C_COMPILER arm-apple-darwin11-clang)
    SET(CMAKE_CXX_COMPILER arm-apple-darwin11-clang++)
    SET(CMAKE_LINKER arm-apple-darwin11-ld)
    
    

    现在您可以使用 cmake 和 make 进行编译,但不要忘记将 $PATH 添加到交叉编译器工具链:

    
    PATH=$PATH:~/Sources/cctools-port/usage_examples/ios_toolchain/target/bin
    
    

    为了与框架和SDL正确链接,我们将它们编写在cmake中,例如游戏Space Jaguar的依赖项:

    
    target_link_libraries(
    ${FSEGT_PROJECT_NAME}
    ${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/libclang_rt.ios.a
    ${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/libSDL2.a
    ${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/libSDL2_mixer.a
    ${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/libSDL2_image.a
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/CoreServices.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/ImageIO.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/Metal.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/AVFoundation.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/GameController.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/CoreMotion.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/CoreGraphics.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/AudioToolbox.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/CoreAudio.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/QuartzCore.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/OpenGLES.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/UIKit.framework"
    "${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}/scripts/buildScripts/ios/resources/libs/Foundation.framework"
    )
    
    

    就我而言,SDL、SDL_Image、SDL_mixer 库预先在 macOS 上的 Xcode 中编译以进行静态链接;从 Xcode 复制的框架。还添加了 libclang_rt.ios.a 库,其中包括特定于 iOS 的运行时调用,例如 isOSVersionAtLeast。包含一个用于 OpenGL ES 的宏,禁用移动版本中不支持的功能,类似于 Android。
    解决所有构建问题后,您应该获得 ARM 的已组装二进制文件。接下来,让我们考虑在没有越狱的设备上运行组装的二进制文件。
    在 macOS 上,安装 Xcode,在 Apple 门户上注册,无需支付开发者计划费用。在Xcode中添加帐户->首选项->帐户、创建空白应用程序并在真实设备上构建。在组装过程中,设备将被添加到您的免费​​开发者帐户中。组装并启动后,需要构建存档;为此,请选择通用 iOS 设备和产品 ->档案。构建存档后,从中提取embedded.mobileprovision和PkgInfo文件。从设备的构建日志中,找到具有正确签名密钥的 codesign 行、扩展名为 app.xcent 的授权文件的路径,将其复制。
    从存档中复制 .app 文件夹,将存档中的二进制文件替换为 Linux 中交叉编译器编译的二进制文件(例如 SpaceJaguar.app/SpaceJaguar),然后将必要的资源添加到 .app 中,检查存档中 .app 中的 PkgInfo 和Embedded.mobileprovision 文件的完整性,必要时再次复制。我们使用协同设计命令 – 重新签名 .app codesign 需要一个用于签名的输入密钥、权利文件的路径(可以使用 .plist 扩展名重命名)
    重新签名后,创建一个 Payload 文件夹,将扩展名为 .app 的文件夹移至此处,在根目录中创建一个包含 Payload 的 zip 存档,并使用 .ipa 扩展名重命名该存档。之后,在 Xcode 中,打开设备列表并将新的 ipa 拖放到设备的应用程序列表中;通过 Apple Configurator 2 安装不适用于此方法。如果重新签名正确完成,则具有新二进制文件的应用程序将安装在具有 7 天证书的 iOS 设备(例如 iPad)上,这对于测试期来说足够了。

    来源

    https://github.com/tpoechtrager/cctools-port

    https://docs.godotengine.org/ru/latest/development/compiling/cross-compiling_for_ios_on_linux.html

    https://jonnyzzz.com/blog/2018/06/13/link-error-3/

    https://stackoverflow.com/questions/6896029/re-sign-ipa-iphone

    https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html

  • 在 Ubuntu MinGW CMake 下构建 Windows

    在这篇文章中,我将描述在 Ubuntu 上使用 MinGW32 工具链为 Windows 构建库和应用程序的过程。
    安装wine、mingw:

    sudo apt-get install wine mingw-w64
    

    之后,您就可以为 Windows 构建 C/C++ 应用程序了:

    # C
    i686-w64-mingw32-gcc helloWorld.c -o helloWorld32.exe      # 32-bit
    x86_64-w64-mingw32-gcc helloWorld.c -o helloWorld64.exe    # 64-bit
     
    # C++
    i686-w64-mingw32-g++ helloWorld.cc -o helloWorld32.exe     # 32-bit
    x86_64-w64-mingw32-g++ helloWorld.cc -o helloWorld64.exe   # 64-bit
    

    可以使用wine检查收集到的exe。
    接下来,让我们看看对 CMake 构建、CMakeLists.txt 文件的更改,将 MinGW 特定的内容添加到构建文件中:

    if (MINGW32)
    set(CMAKE_SYSTEM_NAME Windows)
    SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
    SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
    SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
    set(CMAKE_RANLIB i686-w64-mingw32-ranlib)
    endif()
    
    // для сборки shared dll
    elseif (MINGW32)
    add_library(FlameSteelEngineGameToolkit.dll SHARED ${SOURCE_FILES})
    else()
    
    // обязательно линкуем со всеми зависимостями
    if (MINGW32)
    target_link_libraries(
                            FlameSteelEngineGameToolkit.dll 
                            -static-libgcc
                            -static-libstdc++
                            SDL2 
                            SDL2_mixer 
                            /home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelCore/FlameSteelCore.dll
                            /home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelBattleHorn/FlameSteelBattleHorn.dll
                            /home/demensdeum/Sources/cube-art-project-bootstrap/FlameSteelFramework/FlameSteelCommonTraits/FlameSteelCommonTraits.dll)
    
    set_target_properties(FlameSteelEngineGameToolkit.dll PROPERTIES
            PREFIX ""
            SUFFIX ""
            LINK_FLAGS "-Wl,--add-stdcall-alias"
            POSITION_INDEPENDENT_CODE 0 # this is to avoid MinGW warning; 
            # MinGW generates position-independent-code for DLL by default
    )
    else()
    

    我们收集:

    cmake -DMINGW32=1 .
    make
    

    输出将是 dll 或 exe,具体取决于您收集的内容。对于一个工作示例,您可以查看新的 Cube-Art-Project 及其库的存储库:
    https://gitlab.com/demensdeum/cube-art-project

    https://gitlab.com/demensdeum/FlameSteelEngineGameToolkitFSGL

    https://gitlab.com/demensdeum/cube-art-project-bootstrap

    来源
    https://arrayfire.com/cross-compile-to-windows-from-linux/

  • 为 Ubuntu OSXCross CMake 构建 macOS 应用程序

    在这篇文章中,我将描述如何使用 CMake 和 osxcross 在 Ubuntu 构建机器上为 macOS 构建跨平台 C++ 应用程序。
    首先,安装osxcross工具链:
    https://github.com/tpoechtrager/osxcross
    安装分 3 个阶段进行,下载依赖项:

    cd tools
    ./get_dependencies.sh
    

    从Apple官方网站下载XCode.xip,然后从XCode下载SDK:

    ./gen_sdk_package_pbzx.sh /media/demensdeum/2CE62A79E62A4404/LinuxSupportStorage/xcode111.xip
    

    希望您阅读最后一步中的 XCode 许可协议?接下来,使用所需的前缀构建工具链:

    INSTALLPREFIX=/home/demensdeum/Apps/osxcross ./build.sh 
    

    现在您可以使用上一步的前缀目录中的 osxcross。让我们为 CMake 添加一个新的构建宏并编写所有必要的内容:

    if (OSXCROSS)
    SET(CMAKE_SYSTEM_NAME Darwin)
    SET(CMAKE_C_COMPILER o64-clang)
    SET(CMAKE_CXX_COMPILER o64-clang++)
    SET(CMAKE_C_COMPILER_AR x86_64-apple-darwin19-ar)
    SET(CMAKE_CXX_COMPILER_AR x86_64-apple-darwin19-ar)
    SET(CMAKE_LINKER x86_64-apple-darwin19-ld)
    SET(ENV{OSXCROSS_MP_INC} 1)
    endif()
    

    动态链接对我来说并不成功,因此我们静态导出库:

    if (OSXCROSS)
    add_library(FlameSteelCore STATIC ${SOURCE_FILES})
    else()
    

    接下来,您可能会面临这样的情况:您没有 osxcross 所需的库,我在使用 SDL2 时遇到过这种情况。 osxcross 支持现成的库包 – macports。例如,安装 SDL2-mixer:

    osxcross-macports -v install libsdl2_mixer
    

    之后,您可以像平常一样在 cmake-make 链接中开始构建库/应用程序,如果需要,不要忘记指定库的静态链接。

    手动组装库

    目前,我遇到了静态链接时库归档不正确的问题;构建最终应用程序时,我收到错误:

    file was built for archive which is not the architecture being linked (x86_64)
    

    与此票证非常相似,我们设法实现了一种解决方法,使构建正确完成。让我们解压缩静态库并使用 osxcross 存档器重新构建它:

    ar x ../libFlameSteelCore.a
    rm ../libFlameSteelCore.a
    x86_64-apple-darwin19-ar rcs ../libFlameSteelCore.a *.o
    

    另外,我个人考虑的问题之一是缺乏在 Ubuntu 上直接运行 macOS 应用程序的能力(至少部分功能)。当然,有一个项目 darling,但支持仍然有很多不足之处。

    来源

    https://github.com/tpoechtrager/osxcross

  • 本地图像生成:ComfyUI 和 FLUX 模型

    如今,您不必依赖云服务:您可以完全在自己的硬件上生成高质量的图像。在这篇文章中,我将描述如何使用 ComfyUI 在计算机上本地运行现代 FLUX 模型。

    ComfyUI 采用基于节点的架构。这使您能够:
    – 完全控制生成的每个阶段。
    – 轻松共享现成的“工作流程”

    FLUX是大型模型,因此硬件要求比SD 1.5或SDXL更高:
    – 显卡 (GPU): Nvidia RTX,具有 12 GB VRAM 或更高(为了舒适工作)。如果您有 8 GB 或更少,则必须使用量化版本(GGUF 或 NF4)。
    – 随机存取存储器 (RAM): 至少 16 GB(最好 32 GB 及以上)。
    – 磁盘空间: 模型和组件大约需要 20–50 GB。

    启动 FLUX 最简单的方法是使用现成的模板。只需在工作流程窗口中搜索 Flux Text to Image 并安装即可。

    在“Text to Image (Flux.1 Dev)”节点中用英文编写提示,选择分辨率(FLUX 适用于 1024×1024 甚至更高),然后按 RUN。

    第一代可能需要一些时间,因为模型将加载到显卡内存中。

    https://github.com/comfyanonymous/ComfyUI

  • 本地 Vibe 编码:LM Studio、VS Code 和 Continue

    如果您希望使用神经网络来帮助编写代码(所谓的 Vibe 编码),并且您有一台相当强大的计算机,例如配备 Nvidia RTX 显卡,那么您可以在您的计算机上完全免费地部署整个环境。这解决了付费订阅的问题,并允许您安全地处理 NDA 下的项目,因为您的代码不会发送到任何地方。在这篇文章中,我将描述如何组装 LM Studio、VS Code 和 Continue 扩展的本地包。

    本地 Vibe 编码工具

    为了舒适的工作,我们需要三个主要组件:
    – LM ​​Studio: 用于下载和运行本地 LLM 的便捷应用程序。它承担了使用 GGUF 模型的所有复杂性,并建立了一个与 OpenAI API 兼容的本地服务器。
    – VS Code: 流行且熟悉的代码编辑器。
    – 继续: VS Code 扩展,将神经网络直接集成到工作环境中。允许您聊天、突出显示代码以进行重构,并支持自动完成。

    硬件要求

    本地语言模型是内存密集型的:
    – 显卡 (GPU): Nvidia,配备 8 GB VRAM 或更高(可轻松处理具有 7-80 亿个参数的模型)。较重的型号将需要 16 GB 的 VRAM。
    – 磁盘空间:约500 GB用于存储各种下载的模型。

    配置链接

    设置过程非常简单,不需要在终端中进行复杂的操作:
    1.下载并安装LM Studio。使用内置搜索查找轻量级模型,例如 Qwen Coder 或 gemma3:12b。
    2. 在 LM Studio 中,转到“本地服务器”选项卡并单击“启动服务器”。默认情况下,它将从“http://localhost:1234/v1”启动。
    3. 打开 VS Code 并从插件商店安装 Continue 扩展。
    4. 打开“继续”配置文件并添加新模型,指定“openai”提供程序以及 LM Studio 中的本地服务器地址。

    然后,您可以直接在“继续”侧栏中与当地的法学硕士进行交流,询问有关您的代码的问题,并生成新的组件。

    为什么会这样?

    正如我之前所写,法学硕士在扁平结构和 WET(将所有内容写入两次)代码方面做得更好。在设计复杂的架构时,局部参数模型可能不如 GPT-4 这样的巨头,但它们完全能够生成样板代码、重构简单功能和快速原型设计。

    此外,通过本地 Vibe 编码,您的代码永远不会离开机器。这使得这种组合非常适合企业发展和处理敏感数据。

    输出

    局部神经网络无法完全取代程序员或设计复杂的系统。然而,LM Studio + VS Code +Continue 的组合提供了独立于云服务的能力并维护了隐私。如果您愿意忍受小模型的限制并独立控制项目架构,那么这是一个用于日常任务的完全可用的辅助工具。

    链接

    https://code.visualstudio.com/
    https://lmstudio.ai/
    https://continue.dev/

    来源

    https://youtu.be/IqqCwhG46jY
    https://www.youtube.com/watch?v=7AImkA96mE8

  • 本地视频生成:ComfyUI 和 LTX-2.3

    以前,使用神经网络创建视频是 Runway 或 Luma 等云服务的特权。如今,如果您拥有现代 Nvidia 显卡,您就可以直接在计算机上生成高质量视频。在这篇文章中,我将告诉您如何使用 ComfyUI 和有效的 LTX-2.3 模型设置本地视频生成。

    视频生成工具

    对于工作,我们需要:
    – ComfyUI:强大的界面,采用基于节点的架构,允许您灵活地自定义生成过程。
    – LTX-2.3: Lightricks 的现代型号,经过优化,可以以相对适中的视频内存要求创建流畅且详细的视频。

    硬件要求

    生成视频是一个比处理图像更加消耗资源的过程:
    – 显卡 (GPU): 具有 8 GB VRAM 的 Nvidia RTX 是 768×512 分辨率的最低要求。为了舒适的操作和更高的分辨率,非常需要 16-24 GB 的 VRAM。
    – 随机存取存储器 (RAM): 至少 32 GB。下载时视频模型和 VAE 会占用大量空间。
    – 磁盘空间: 模型本身和相关组件约 500 GB。

    设置和启动

    ComfyUI中启动LTX-2.3的流程如下:
    1. 更新ComfyUI:该模型相对较新,因此请确保您安装了最新版本的界面。
    2. 安装工作流程:最简单的方法是找到现成的 LTX Video JSON 模板。该模型需要特定的节点来处理视频潜在空间。
    3. 提示和参数:用英文输入场景描述。请注意,LTX-2.3 能够很好地理解运动(例如“摄像机绕轨道运行”、“快速运动”)。

    为什么选择LTX-2.3?

    LTX-2.3 之所以引人注目,是因为它提供的结果与专有云服务相当,但在本地运行。这给你:
    – 完全隐私:您的提示和生成的视频不会发送到其他人的服务器。
    – 控制:您可以尝试帧速率 (FPS)、分辨率和提示强度,而无需为每次尝试付费。

    本地视频生成仍在积极开发中,LTX-2.3 是进入“家庭好莱坞”世界的绝佳入口。

    链接

    https://github.com/comfyanonymous/ComfyUI
    https://huggingface.co/Lightricks/LTX-Video

  • 本地音乐生成:ComfyUI 和 ACE-Step-1.5 模型

    如今,您不必依赖云服务来创建内容:您可以完全在自己的硬件上生成高质量的音乐。在这篇文章中,我将描述如何使用 ComfyUI 在计算机上本地运行现代 ACE-Step-1.5 模型。

    ComfyUI 采用基于节点的架构。这使您能够:
    – 完全控制音频生成的每个阶段。
    – 轻松共享现成的“工作流程”。

    ACE-Step-1.5 是一种高级音乐生成模型,需要大量计算资源。其硬件要求比许多简单的合成器要高:
    – 显卡 (GPU): Nvidia RTX,具有 8 GB VRAM 或更高(建议 12 GB+),可实现舒适的高品质工作。
    – 随机存取存储器 (RAM): 至少 16 GB(最好 32 GB 及以上)。
    – 处理器(CPU):现代多核处理器,对 AVX/CUDA 计算有良好的支持。
    – 磁盘空间: 模型和组件大约需要 20–50 GB。

    运行 ACE-Step-1.5 最简单的方法是使用现成的音频生成模板。只需在工作流程窗口中搜索音乐文本到音频并安装即可。

    在“提示输入”节点中编写描述流派和情绪的提示(例如,“带有重低音的令人振奋的合成波曲目”)。指定所需的持续时间并按运行。
    第一代可能需要一些时间,因为模型将被加载到显卡内存中并处理复杂的声学模式。

    https://github.com/comfyanonymous/ComfyUI
    https://www.youtube.com/watch?v=UAlLD5fS7-c

  • 使用 ollama 的局部神经网络

    如果您希望推出像 ChatGPT 这样的东西,并且您有一台相当强大的计算机,例如配备 Nvidia RTX 显卡,那么您可以运行 ollama 项目,该项目将允许您在本地计算机上使用现成的 LLM 模型之一,而且完全免费。 ollama 提供了与 LLM 模型进行通信的能力,以 ChatGPT 的方式进行;同样在最新版本中,还宣布了读取图像并将输出数据格式化为 json 格式的功能。

    我还在配备 Apple M2 处理器的 MacBook 上运行了该项目,并且我知道 AMD 最新型号的显卡受到支持。

    要在 macOS 上安装,请访问 ollama 网站:
    https://ollama.com/download/mac

    单击“下载 macOS”,您将下载 ollama-darwin.zip 形式的存档,存档内有 Ollama.app,需要将其复制到“应用程序”。之后,启动 Ollama.app,安装过程很可能会在第一次启动时发生。之后,在托盘中您可以看到 ollama 图标,该托盘位于时钟旁边的右上角。

    之后,启动常规 macOS 终端,然后键入命令来下载、安装并运行任何 ollama 模型。可用模型、描述及其特征的列表可以在 ollama 网站上查看:
    https://ollama.com/search

    如果启动时不适合您的显卡,请选择参数最少的型号。

    例如,启动 llama3.1:latest 模型的命令:

    ollama run llama3.1:latest
    

    Windows 和 Linux 的安装通常是相似的,在一种情况下,会有一个 ollama 安装程序,并通过 Powershell 进一步使用它。
    对于 Linux,安装是使用脚本完成的,但我建议使用特定包管理器的版本。在 Linux 上,还可以通过常规 bash 终端启动 ollama。

    来源
    https://www.youtube.com/watch?v=Wjrdr0NU4Sk
    https://ollama.com

  • 使用 ffmpeg 实现视频稳定

    如果您想稳定视频并消除相机抖动,“ffmpeg”工具提供了强大的解决方案。借助内置过滤器“vidstabdetect”和“vidstabtransform”,您无需使用复杂的视频编辑器即可获得专业的效果。

    准备工作

    在开始之前,请确保您的“ffmpeg”支持“vidstab”库。在 Linux 上,您可以使用以下命令进行检查:

    bash  
    ffmpeg -filters | grep vidstab  
    

    如果未安装该库,您可以添加它:

    sudo apt install ffmpeg libvidstab-dev  
    

    通过brew安装macOS:

    brew install libvidstab
    brew install ffmpeg
    

    现在让我们继续该过程。

    第 1 步:运动分析

    首先,您需要分析视频的运动并创建带有稳定参数的文件。

    ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 transfile=transforms.trf -f null -  
    

    参数:

    抖动:视频抖动级别(默认为 5,对于更复杂的情况可以增加到 10)。
    精度:分析精度(默认15)。
    transfile:保存运动参数的文件名。

    第 2 步:应用稳定化

    现在您可以使用转换文件应用稳定性:

    ffmpeg -i input.mp4 -vf vidstabtransform=input=transforms.trf:zoom=5 output.mp4
    

    参数:

    input:指向带有转换参数的文件(在第一步中创建)。
    缩放:用于消除黑边的缩放系数(例如 5 – 自动缩放直至消除伪像)。

  • 图灵计算机

    我向您展示 1936 年艾伦·图灵 (Alan Turing) 文章《论可计算数与解决问题的应用》第一页的译文。第一章包含对计算机的描述,后来成为现代计算的基础。

    这篇文章的完整翻译和解释可以在美国普及者 Charles Petzold 的著作《阅读图灵:图灵关于可计算性和图灵机的历史文章的旅程》(ISBN 978-5-97060-231-7, 978-0-470-22905-7)中阅读。

    原文:
    https://www.astro.puc.cl/~rparra/tools/PAPERS/turing_1936.pdf

    论可计算数及其在解决问题中的应用

    图灵

    [1936 年 5 月 28 日收稿 – 1936 年 11 月 12 日阅读]

    “可计算”数可以简单地描述为实数,其小数形式的表达可以通过有限多种方式计算。尽管乍一看本文将数字视为可计算的,但定义和探索整数变量、实数变量、可计算变量、可计算谓词等的可计算函数几乎同样容易。然而,与这些可计算对象相关的基本问题在每种情况下都是相同的。为了详细考虑,我选择可计算数字作为可计算对象,因为考虑它们的方法是最不麻烦的。我希望尽快描述可计算数与可计算函数的关系等等。同时,将在以可计算数表示的实变量函数理论领域进行研究。根据我的定义,如果一个实数的十进制表示可以由机器编写,那么它就是可计算的。

    在第 9 段和第 10 段中,我给出了一些论据来表明可计算数包括所有自然被认为是可计算的数。特别是,我证明了一些大类数字是可计算的。例如,它们包括所有代数数的实部、贝塞尔函数零点的实部、数字 π、e 等。然而,可计算数并不包括所有可定义数,如以下不可计算的可定义数示例所示。

    尽管可计算数的类别非常大并且在许多方面与实数的类别相似,但它仍然是可枚举的。在第 8 节中,我考虑了某些看似相反的论点。当其中一个论证得到正确应用时,乍一看,得出的结论与哥德尔*的结论相似。这些结果具有极其重要的应用。特别是,如下所示(§11),解析问题无法有解。

    在最近的一篇文章中,Alonzo Church 介绍了“有效可计算性”的想法,这与我的“可计算性”的想法相当,但定义完全不同。关于解决问题,丘奇也得出了类似的结论。本文附录中给出了“可计算性”和“有效可计算”等价性的证明。

    1. 电脑

    我们已经说过,可计算数是那些小数位可以用有限方法计算的数。这里需要一个更清晰的定义。在我们到达第 9 节之前,本文不会真正尝试证明此处给出的定义的合理性。现在,我只想指出,(逻辑)基本原理是人类的记忆必然是有限的。

    让我们将计算实数的人与只能满足有限数量的条件 q1, q2, …, qR 的机器进行比较;我们将这些条件称为“m 配置”。这台(即如此定义的)机器配备有“胶带”(类似于纸)。穿过机器的皮带被分成几段。我们称它们为“正方形”。每个这样的方块都可以包含某种“符号”。在任何时刻,只有一个这样的正方形,比如第 r 个,包含“在这台机器中”的符号。我们将这样的正方形称为“扫描符号”。可以说,“扫描字符”是机器“直接感知”的唯一字符。然而,通过改变它的 m 配置,机器可以有效地记住它之前“看到”(扫描过)的一些字符。机器在任何时刻可能的行为由 m 配置 qn 和扫描的符号***决定。我们称这对符号 qn 为“配置”。这样指定的配置决定了给定机器的可能行为。在其中所扫描的方块是空白的(即,不包含字符)的一些配置中,机器在所扫描的方块上写入新字符,而在这些配置的另一些中,它擦除所扫描的字符。这台机器也能够移动来扫描另一个方格,但这样它只能移动到右侧或左侧的相邻方格。除了这些操作之外,还可以更改机器的 m 配置。在这种情况下,一些写入的字符将形成一个数字序列,这是正在计算的实数的小数部分。其余的无非是为了“帮助记忆”而做的不准确的标记。在这种情况下,只能擦除上述不准确的标记。

    我声称这里考虑的操作包括计算中使用的所有操作。对于了解机器理论的读者来说,这种说法的基本原理更容易理解。因此,在下一节中,我将在理解“机器”、“磁带”、“扫描”等术语的基础上继续发展相关理论。

    *哥德尔“论数学原理中形式上不可判定的句子(由怀特海和罗素于 1910 年、1912 年和 1913 年出版)和相关系统,第一部分”,《数学杂志》。物理学,德国月刊第 38 期(1931 年,第 173-198 页。
    ** Alonzo Church,“初等数论中的不可判定问题”,American J. of Math.,第 58 期(1936 年),第 345-363 页。
    *** Alonzo Church,“关于解决问题的注释”,J. of Symbolic Logic,第 1 期(1936 年),第 40-41 页

  • 唐基山

    《Donki Hills》是一款第一人称恐怖喜剧冒险游戏,带领玩家经历一个结合了悬念和意想不到的幽默的神秘故事。
    主角詹姆斯去寻找他的网友玛​​丽亚,但她和玛丽亚的联系突然中断了。唯一的证据是一张随机照片,指向新西伯利亚地区偏远的顿基山村庄。在追查真相的欲望驱使下,詹姆斯开始了自己的调查,以查明玛丽亚失踪的全部情况。

    该游戏已在 Steam 上发售:
    https://store.steampowered.com/app/3476390/Donki_Hills/

  • 砖石增强现实

    Masonry AR 是一款基于位置的多人增强现实 (AR) 游戏,让您沉浸在秘密社团的世界中。探索你所在城市的街道,收集共济会知识书籍,建立你自己的小屋,并争夺对现实世界地图的影响力。

    主要功能

    • 基于地理位置的游戏:使用设备的 GPS 在现实世界中移动,寻找秘密书籍和资源。
    • 自动行走模式:如果 GPS 访问受到限制,您可以通过选择世界上的首都之一作为起点来启动自动行走模式。
    • 创建小屋:在真实地图上建立共济会小屋并扩大您的组织的影响力。
    • 游戏内经济:赚取游戏内货币 (MOS)、开拓领地并与朋友分享推荐链接。
    • 跨平台:由于采用了基于 Three.js 渲染的 Flame Steel Engine 2 游戏引擎,该游戏可以直接在移动设备和 PC 上的网络浏览器中运行。

    玩:
    https://demensdeum.com/games/masonry-ar/client/

    GitHub:
    https://github.com/zefir1990/Masonry-AR

  • 特弗莱彻


    Teflecher 是一款快速、交互式、跨平台的测验应用程序,构建于 Kotlin Multiplatform (KMP) 和 Compose Multiplatform 之上。它允许用户直观地从本地 JSON 文件或远程 URL 加载测验、回答多项选择题、查看正确答案的即时反馈并跟踪结果。

    网址:
    https://demensdeum.com/software/teflecher/

    GitHub:
    https://github.com/zefir1990/teflecher

    也是基于 Ionic + Capacitor 技术的 Teflecher Editor 格式的测验编辑器

    网址:
    https://demensdeum.com/software/teflecher-editor/

    GitHub:
    https://github.com/zefir1990/teflecher-editor

  • 幽灵联系人


    Ghost Contacts 是一个简单的 Web 应用程序,旨在隐藏标准系统 API 和电话簿中的联系人。所有信息仅存储在您的浏览器本地,不会传输到外部服务器。

    主要功能

    • 从系统 API 中隐藏:您的联系人不会与标准系统联系人 API 和设备电话簿同步。
    • 紧急密码:特殊密码,输入后,整个联系人数据库将立即且不可撤销地删除。
    • 导入和导出:通过 CSV 文件方便地传输联系人数据库以创建备份副本。

    网上申请:
    https://demensdeum.com/software/ghost-contacts/

    GitHub:
    https://github.com/demensdeum/GhostContacts

  • 立方体艺术项目2

    欢迎来到Cube Art Project 2 – 一个冥想的 3D 画布,您可以在其中尽情发挥您的想象力。创建体素绘画、尝试颜色并在浏览器中将独特的 3D 模型变为现实。

    什么是魔方艺术项目 2?

    这是一款创意游戏,可将您的屏幕变成用于 3D 绘画的交互式画布。在你面前的是一个干净的三维空间,准备好充满你的想法、形状和明亮的色彩。

    主要功能

    • 3D 绘图:一种轻松的创作过程,专注于创建体素艺术和 3D 几何。
    • 颜色选择器:使用方便的 RGB 滑块微调每个块的色调。
    • 移动自由:通过便捷的相机控制从任何角度探索您的画作。
    • 画布保存:将您的作品保存到文件中并随时返回绘图,或与他人分享您的作品。

    管理

    • WASD – 相机移动
    • 鼠标 – 相机旋转和检查
    • 界面 (GUI) – 颜色选择和调整

    玩:
    https://demensdeum.com/software/cube-art-project-2/

    GitHub:
    https://github.com/zefir1990/cube-art-project-2

  • Raiden Video Ripper

    Raiden Video Ripper 是一个专为视频编辑和格式转换而设计的开源项目。它是使用 Qt 6 (Qt Creator) 创建的,允许您编辑视频并将其转换为 MP4、GIF 和 WebM 格式。您还可以从视频中提取音频并将其转换为 MP3 格式。

    微软商店:
    https://apps.microsoft.com/detail/9nvzjs98smgc

    GitHub:
    https://github.com/demensdeum/RaidenVideoRipper/releases

  • 火星矿工

    在这颗红色星球的恶劣条件下,每一秒、每一个区域都至关重要。我们很高兴推出火星矿工,这是一款回合制策略游戏,您可以在其中为殖民地的生存和宝贵的火星资源的控制权而战。

    什么是火星矿工?

    在火星矿工中,您控制着火星上的一家采矿公司。你的任务是建立基地,占领资源区,并在面对人工智能或其他玩家的激烈竞争时协调自主采矿单位的行动。

    主要功能

    • 战术策略:规划你的基地的发展和占领领土,提前计算对手的行动。
    • 自主单元:协调采矿机器人的行动并自定义其逻辑,以实现最高效率。
    • 多种模式:在单人训练场磨练你的技能,或在多人模式中与其他殖民者竞争。
    • 高级人工智能:与不会原谅战术错误的智能自动机争夺资源。

    玩火星矿工

  • 火焰钢:死亡面具2

    在充满冷光的工业巨型建筑的无尽走廊中,新的挑战正在等待着您。我们很高兴推出Flame Steel: Death Mask 2,这是一款结合了经典美学与现代实时游戏玩法的 3D 地下城探索游戏。

    什么是《火焰钢:死亡面具 2》?

    想象一下在一个程序生成的迷宫中醒来,其中每个回合都可能潜伏着一个名为“过滤器”的敌对实体。在Flame Steel: Death Mask 2中,您将扮演探索者的角色,探索基于 Flame Steel 引擎 2(使用 Three.js 图形渲染)构建的世界。

    主要功能

    • 程序地下城:每次尝试都是独一无二的。服务器创建充满秘密和危险的新地图。
    • 终端:对于那些喜欢完全控制的用户,内置命令行界面允许您直接与系统交互:执行高级操作、调试或发送命令。
    • 战斗和生存:与过滤器战斗以赚取比特,然后使用它们打开宝箱并提高您的统计数据。注意您的健康 – 生存并不能得到保证。
    • 工业美学:巨型巨型结构的高对比度可视化和无菌氛围。

    面具背后的技术

    该游戏是为浏览器创建的并使用:

    • 前端:纯 JavaScript 和 Flame Steel Engine 2(带有 Three.js 图形渲染器),可实现流畅的 3D 渲染。
    • 后端:用于运行服务器端的 Node.js。
    • 基础设施:用于持久数据存储的 MongoDB 和用于实时空间索引的 Redis

    玩《火焰钢:死亡面具 2》

  • 乌什基广播电台

    Ushki-Radio 是一款用于在线广播的跨平台广播播放器,专注于简单性和聆听乐趣。没有不必要的功能,没有超载的接口 – 只需打开它并聆听即可。


    https://demensdeum.com/software/ushki-radio

    该项目使用开源广播浏览器,使来自世界各地的数千个广播电台可以在应用程序中使用。您可以按名称、流派或受欢迎程度搜索它们,将它们添加到您的收藏夹并快速返回您最喜欢的电台。

    Ushki-Radio 非常适合背景广播播放器的角色:它会记住最后一个电台,允许您控制音量并且不需要复杂的设置。界面简洁易懂 – 一切都经过精心设计,不会分散音乐、对话和广播的注意力。

    从技术上讲,该项目是基于 React Native 和 Expo 构建的,因此它既可以在浏览器中运行,也可以作为本机应用程序运行。在底层,expo-av 用于播放音频,用户设置存储在本地。支持多种语言,包括俄语和英语。

    Ushki-Radio 是现代互联网广播播放器的一个很好的例子:开放、轻量级、可扩展并且主要以听众为中心。该项目根据 MIT 许可证分发,非常适合个人使用,也可以作为您自己的音频应用实验的基础。

    GitHub:
    https://github.com/demensdeum/Ushki-Radio

    谷歌播放:
    https://play.google.com/store/apps/details?id=com.demensdeum.ushkiradio

  • Glazki TV:互联网电视的现代播放器

    Glazki TV 是一款现代、高性能的互联网电视 (IPTV) 播放器,建立在 React Native 和 Expo 的基础上。该项目注重易用性和速度,为在移动设备和浏览器中观看 IPTV 频道提供便捷的界面。

    主要功能

    • 频道浏览:浏览数千个频道,并进行分类以便于导航。
    • 搜索:按名称快速查找您需要的频道。
    • 收藏夹:保存您喜爱的频道以便快速访问(数据保存在本地)。
    • 深层链接:共享自动打开频道的直接链接。
    • 主题支持:界面自动适应系统深色或浅色主题。
    • 网络支持:播放器在浏览器中具有 URL 同步功能。

    技术栈

    该项目基于现代开发工具:

    • 框架: React Native + Expo
    • Video Player: expo-video (замена устаревшему expo-av)
    • UI 工具包:react-native-paper
    • 播放列表解析器: iptv-playlist-parser

    网页版:
    https://demensdeum.com/software/glazki-tv/

    谷歌播放版本:
    https://play.google.com/store/apps/details?id=com.demensdeum.glazkitv

  • 泽菲尔1990


    Zefir1990 – Ilia Prokhorov,我是一名拥有超过 15 年商业开发经验的开发人员。 Demens Deum 工作室的创始人,该工作室为移动、网络和桌面系统开发游戏和应用程序。 Android 2上的第一款3D OpenGL ES 2游戏Mad Racer于2010年发布,他是该项目的程序员和游戏设计师,他还参与了作曲家Anton Dmitriev(coolspotdreamer)的开发,在游戏成功推出后他从事全职定制开发和合同项目开发。客户包括迪卡侬、花花公子、Fitbit。

    我也是软件开发、游戏、设计模式、算法、人工智能方面文章的作者,我计划写一本关于软件熵的书。

    首选编程语言:ASM、C、C++、ObjC、Python、Kotlin、Swift、Java、Rust、Go、TypeScript、JavaScript、C#、Dart、PHP。

    LinkedIn:linkedin.com/in/zefir1990
    GitHub:github.com/zefir1990
    电报:t.me/zefir1990
    电子邮件:ceo@demensdeum.com
    抽搐:twitch.tv/zefir1990
    YouTube:youtube.com/zefir1990

DemensDeum
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.