Author: demensdeum

  • 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_pickerimage 用于在填充时处理像素、ffmpeg_wasm 用于在浏览器中导出视频。

    架构

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

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

    I/O 函数(saveStrokesloadStrokescapturePng 等)可注入 – 它们可以在测试期间用模拟替换。该项目有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 温度和限制:执行速度和负载分布可能取决于硬件的物理状态。在巨大的模型中,这些微观差异会累积,并可能导致在输出时选择不同的标记。
    • 动态批处理:在云端,您的请求会与其他请求合并。不同的批量大小会改变内核中的计算数学。

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

    <小时/>

    当逻辑失败时:内存问题

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

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

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

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

    • 多线程编程模式:清晰的同步消除了竞争条件。
    • 线程安全语言:编译时保证内存安全的工具:
      • 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 Codergemma3: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