特弗莱彻

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

模式解释器实践

上一篇文章中,我们研究了解释器模式的理论,了解了 AST 树是什么以及如何抽象终结符和非终结符表达式。这次,让我们抛开理论,看看如何将这种模式应用到我们每天都在使用的严肃商业项目中!

剧透:您现在可能正在使用解释器模式,只需在浏览器中阅读此文本即可!

业界使用此模式的最引人注目、也许也是最重要的示例之一是 JavaScript。这种语言最初是“在膝盖上”创建的,如今,由于解释的概念,它可以在数十亿台设备上运行。

改变互联网的 10 天

JavaScript 的历史充满了传奇。 1995 年,Brendan Eich 在 Netscape Communications 工作时,接到的任务是创建一种可以直接在浏览器 (Netscape Navigator) 中运行的简单脚本语言,以使网页具有交互性。管理层想要一种类似于当时超级流行的 Java 语法的东西,但不是针对专业工程师,而是针对网页设计师。

Eich 仅用了10 天来编写该语言的第一个原型,该语言当时被称为 Mocha(然后是 LiveScript,出于营销原因才称为 JavaScript)。这种热潮并非偶然:微软紧随其后,同时也在积极准备自己的脚本语言 VBScript,以便嵌入 Internet Explorer 浏览器中。 Netscape 迫切需要发布回应,以免在迫在眉睫的浏览器战争中落败。

根本没有时间将复杂的编译器编写成机器代码。对于 Eich 来说,显而易见且最快的解决方案是经典解释器的架构。

第一个解释器(SpiderMonkey)的工作方式如下:

  1. 它从页面读取脚本的文本源代码。
  2. 词法分析器将文本分解为标记。
  3. 解析器构建了一个抽象语法树(AST)。就解释器模式而言,这棵树由终端表达式(字符串,数字如42)和非终端(函数调用,语句如If、While)组成。
  4. 然后虚拟机一步步“遍历”这棵树,在每个节点执行嵌入其中的指令(调用类似于 Interpret() 的方法)。

上下文和对象

还记得在经典实现中我们必须传递给 Interpret(Context context) 方法的 Context 对象吗?解释器需要它来存储当前的内存状态。

就 JavaScript 而言,顶层上下文的角色由全局对象(例如浏览器中的窗口)扮演。例如,当您的 AST 节点尝试通过 document.write(“Hello”) 将文本写入屏幕时,解释器会访问其上下文(文档对象)并调用所需的内部浏览器 API。

多亏了解释器,JavaScript 才能够如此轻松地与 DOM(文档对象模型)进行交互 – 这些都只是上下文中可由树节点访问的对象。

解释器的演变:JIT 编译

从历史上看,浏览器中的 JS 长期以来一直是“纯粹”的解释器。而这有一个很大的缺点——速度慢。每次执行脚本时解析树并缓慢遍历每个节点会减慢复杂的 Web 应用程序的速度。

随着 2008 年 Google V8 引擎(内置于 Chrome 中)的出现,一场革命发生了。工程师们意识到,对于现代网络来说,一个解释器是不够的。引擎变得更加复杂:它仍然构建 AST 树,但现在使用 JIT(即时)编译

现代 JS 引擎(V8、SpiderMonkey)的工作方式就像一个复杂的管道:

  1. 快速而愚蠢的基本解释器立即开始执行您的 JS 代码,甚至无需等待它编译(经典模式在这里仍然有效)。
  2. 同时,引擎会监控代码的“热门”部分(被调用数千次的循环或函数)。
  3. 这些部分由 JIT 编译器直接编译为优化的机器代码,绕过缓慢的解释器。

正是解释器的即时启动和编译的计算能力的结合让 JavaScript 占领了世界,成为服务器 (Node.js) 和移动应用程序 (React Native) 的语言。

游戏行业的翻译

尽管 C++ 在重型计算领域占据主导地位,但解释器模式仍然是游戏开发中用于创建游戏逻辑的行业标准。为了什么?这样游戏设计师就可以制作游戏,而无需“放弃”引擎或需要不断重新编译引擎的风险。

一个很好的历史例子是UnrealScript – 虚幻竞技场和战争机器游戏的逻辑是在虚幻引擎1、2和3中编写的语言。文本被编译成紧凑的抽象机器字节码,然后由引擎的虚拟机逐步(解释)。

可视化图形脚本(蓝图)

如今,文本已被可视化编程所取代 – 虚幻引擎 4 和 5 中的蓝图系统。

如果您曾经在虚幻引擎中打开过蓝图,您就会看到很多通过电线连接的节点。从架构上来说,整个蓝图图是绘制在屏幕上的巨大抽象语法树 (AST)

  1. 终端表达式:常量节点。例如,仅存储数字 42 或字符串的节点。它们在解释时返回特定值。
  2. 非终止表达式:计算节点(添加)或流控制节点(分支)。它们具有参数输入,解释器首先对其进行递归计算,然后将结果作为输出引脚生成。

而上下文在这里的作用是由特定游戏对象(Actor)实例的记忆来扮演的。解释器机器安全地“行走”通过该图,请求数据并执行转换。

解释器还用在什么地方?

解释器模式几乎可以在任何需要执行动态指令的复杂系统中找到。以下只是商业软件中的一些示例:

  • 解释型编程语言(Python、Ruby、PHP)。它们的整个运行时基于经典模式。例如,CPython 参考实现首先将您的 .py 脚本解析为 AST,将其编译为字节码,然后一个巨大的虚拟机(计算循环)逐步解释该字节码。
  • Java 虚拟机 (JVM)。 最初,Java 代码不是编译成机器指令,而是编译成字节码。当您运行应用程序时,JVM 充当解释器(尽管使用积极的 JIT 编译,就像在 V8 中一样)。
  • 数据库和 SQL 当您在 PostgreSQL 或 MySQL 中发出 SQL 查询(SELECT * FROM users)时,数据库引擎充当解释器。它执行词法分析,构建 AST 查询树,生成执行计划,然后通过迭代表的行来逐字“解释”该计划。
  • 正则表达式 (RegEx)。任何正则表达式引擎都会在内部将字符串模式(例如 ^\d{3}-\d{2}$)解析为状态图 (NFA/DFA 自动机),然后内部解释器会通过该状态图,将每个输入字符与该图的顶点进行匹配。
  • Unity Shader Graph / 虚幻材质编辑器 – 将视觉节点解释为模块化着色器代码 (GLSL/HLSL)。
  • Blender 几何节点 – 解释数学和几何运算以按程序实时生成 3D 模型。

总计

解释器模式早已超出了“编写自己的计算器”的范围。这是最有力的行业标准。从每天在浏览器幕后执行数十亿字节代码的 JavaScript 引擎,到无需 C++ 知识即可构建复杂逻辑的游戏设计者,解释器仍然是现代 IT 开发中最重要的架构概念之一。

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

该项目仍在继续发展,我欢迎任何反馈!

火焰钢:死亡面具2

在昏暗、霓虹灯闪烁的数字地下世界深处,新的挑战正在等待着。我们很高兴能够拉开Flame Steel: Death Mask 2的帷幕,这是一款融合了复古赛博朋克美学与现代实时游戏玩法的多人 3D 地下城探索游戏。

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

想象一下在程序生成的迷宫中醒来,其中每个影子都可能是另一个玩家或敌对的“过滤器”实体。 Flame Steel: Death Mask 2 让您扮演探索者的角色,在基于 Flame Steel Engine 2 和 Three.js 构建的世界中遨游。

该游戏目前正处于开发的早期阶段,但核心体验已经上线并可供探索。

🚀 主要功能

  • 多人探索:网格中你并不孤单。当您在迷宫般的走廊中航行时,可以实时看到其他玩家。
  • 程序地下城:没有两次运行是相同的。服务器生成充满神秘和危险的新地图。
  • 终端:对于那些更喜欢“实际操作”方法的人来说,集成的命令行界面允许您直接与系统交互 – 执行高级操作、调试或只是与其他搜索者聊天。
  • 战斗与战斗生存:与过滤器对抗以赚取比特,然后使用这些比特来解锁宝箱并升级您的统计数据。关注您的健康;生存没有保障。
  • 复古赛博朋克美学:高对比度的视觉效果和坚韧的氛围,向经典赛博朋克时代致敬。

🛠️面具背后的技术

该游戏专为浏览器而构建,利用:

  • 前端:Vanilla JavaScript 和 Three.js,可实现流畅的 3D 渲染。
  • 后端:Node.js 和 WebSockets (ws),可实现闪电般快速的多人游戏同步。
  • 基础设施:用于数据持久化的 MongoDB 和用于实时空间索引的 Redis。

🗺️下一步是什么?

我们才刚刚开始。作为抢先体验项目,死亡面具 2 将收到频繁的更新,包括:

  • 新的实体类型和复杂的战斗机制。
  • 更深入的传说和环境故事。
  • 增强的终端命令和社交功能。
  • 视觉和性能优化。

🔗加入网格

想测试一下你的勇气吗?立即输入您的代号并初始化您的身份:

👉 玩《火焰钢:死亡面具 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

覆盖者

Coverseer – 使用法学硕士的智能过程观察员

Coverseer是一个Python CLI工具,用于智能监控和自动重启进程。与经典的看门狗解决方案不同,它使用 LLM 模型分析应用程序的文本输出,并根据上下文(而不仅仅是退出代码)做出决策。

该项目是开源的,可在 GitHub 上获取:
https://github.com/demensdeum/coverseer

什么是 Coverser

Coverer启动指定的进程,持续监控其stdout和stderr,将最新的输出块提供给本地LLM(通过Ollama),并确定进程是否处于正确的运行状态。

如果模型检测到错误、冻结或不正确的行为,Covererer 会自动终止该过程并再次启动。

主要功能

  • 输出的上下文分析 – 不检查退出代码,而是使用 LLM 进行日志分析
  • 自动重新启动 – 当检测到问题或异常终止时重新启动进程
  • 使用本地模型 – 使用 Ollama,无需将数据传输到外部服务
  • 详细记录 – 记录所有操作和决策以供后续诊断
  • 独立执行 – 可以打包成单个可执行文件(例如 .exe)

它是如何工作的

  1. Coverseer 运行通过 CLI 传递的命令
  2. 收集并缓冲进程的文本输出
  3. 将最后几行发送到 LLM 模型
  4. 获取进程状态的语义评估
  5. 如有必要,终止并重新启动该进程

这种方法使您能够识别标准监控工具无法检测到的问题。

要求

  • Python 3.12 或更高版本
  • Ollama 已安装并正在运行
  • 已加载模型gemma3:4b-it-qat
  • Python 依赖项:请求ollama-call

使用示例

<代码>
python covereer.py“这里是你的命令”

例如,观察 Ollama 模型加载:

<代码>
python coverseer.py “ollama pull gemma3:4b-it-qat”

Coverer 将分析命令输出并自动响应故障或错误。

实际应用

Coverer 在标准监管机制不足的场景中特别有用:

  • CI/CD 管道和自动构建
  • 后台服务和代理
  • 实验性或不稳定的过程
  • 具有大量文本日志的工具
  • 自我修复非常重要的开发环境

为什么法学硕士方法更有效

经典的监控系统对症状做出反应。覆盖者分析行为。即使在流程正式继续运行的情况下,LLM 模型也能够识别错误、警告、重复失败和逻辑死胡同。

这使得监控更加准确并减少误报的数量。

结论

Coverer 是 LLM 在 DevOps 和自动化任务中实际应用的一个明显例子。它扩展了对过程监控的传统理解,并提供了更智能、基于上下文的方法。

该项目对于那些正在尝试人工智能工具并寻找在不使基础设施复杂化的情况下提高系统稳定性的方法的开发人员特别感兴趣。

火焰钢:火星矿工

《Flame Steel: Mars Miners》是一款战术策略游戏,节奏不寻常,强调决策而不是反应。游戏发生在火星上,玩家面对有限的信息和来自对手的持续压力,争夺资源和领土的控制权。

游戏玩法基于构成探险基础设施的枢纽站的建设。节点可让您提取资源、扩大影响范围并建立后勤。每个位置都很重要:一个错误可能会打开敌人通往关键区域的道路或剥夺你的战略优势。

比赛节奏刻意控制且激烈。它介于国际象棋、围棋和海战之间:定位、预测对手的行动以及应对不确定性的能力在这里很重要。部分地图和敌人的意图仍然是隐藏的,因此成功不仅取决于计算,还取决于对局势的解读。

《火焰钢:火星矿工》支持在线游戏,这使得每款游戏都独一无二——策略不断发展,元数据正在形成。该游戏正处于开发的早期阶段,这就是它的优势:玩家有机会成为第一个进入新的非标准项目、影响其开发并发现不复制该类型常见模板的机制的人。

如果您对具有深度、实验性设计和强调思考的战术游戏感兴趣,那么《Flame Steel:火星矿工》现在就值得一试。

游戏规则

* 比赛场地由多个单元格组成,玩家将其物品一一放置在其上。每回合玩家可以执行一个建造动作。

* 只允许建造两种类型的物体:枢纽站和矿井。任何构造都只能在垂直或水平位于现有玩家节点旁边的一个空闲单元上进行。不允许对角放置。

* 枢纽站构成领土控制的基础并作为扩展点。地雷按照同样的规则放置,但算作资源对象,直接影响队伍的最终结果。

* 如果玩家在垂直或水平方向上建立了一条连续的节点站线,那么这条线就会自动变成武器。该武器可以攻击敌人并摧毁其基础设施。

* 要开枪,玩家选择一个属于他的枪的单元格并指向场上的任何敌方节点站。选定的敌方节点站被摧毁并从比赛场地中移除。地雷不能被直接攻击——只能通过破坏提供访问地雷的节点来攻击。

* 比赛持续到规定的比赛结束。获胜者是此时比赛场上拥有最多资源矿的玩家。在平等的情况下,决定因素可能是领土控制或游戏模式决定的附加条件。

https://mediumdemens.vps.webdock.cloud/mars-miners

反重力

几天后,在 Antigravity 的帮助下,我将 Masonry-AR 后端从 PHP + MySQL 转移到 Node.js + MongoDB + Redis -> Docker。 AI 的能力确实令人惊叹,我记得 2022 年我通过 ChatGPT 在shadertoy.com 上编写了最简单的着色器,看起来这个玩具无法做任何更高的事情。
https://www.shadertoy.com/view/cs2SWm

四年后,我看到了如何在大约 10 个提示中,毫不费力地将我的项目从一个后台平台转移到另一个后台平台,并添加了容器化。
https://mediumdemens.vps.webdock.cloud/masonry-ar/

酷,真的酷。

包板

KabanBoard 是一个开源 Web 应用程序,用于以看板格式管理任务。该项目专注于简单、易于理解的架构以及针对团队或个人开发人员的特定任务进行修改的可能性。

该解决方案适用于小型项目、内部团队流程,或作为您自己产品的基础,而无需与第三方 SaaS 服务绑定。

项目存储库可在 GitHub 上找到:
https://github.com/demensdeum/KabanBoard

主要功能

KabanBoard 实现了一组用于使用看板的基本且实用的功能。

  • 为不同的项目创建多个看板
  • 包含任务状态的列结构
  • 能够编辑和删除的任务卡
  • 在列之间移动任务(拖放)
  • 卡片的颜色编码
  • 深色界面主题

该功能不会超载,并且专注于日常工作任务。

使用的技术

该项目建立在一个通用且易于理解的堆栈上。

  • 前端:Vue 3、Vite
  • 后端: Node.js、Express
  • 数据存储:MongoDB

客户端和服务器部分是分离的,这简化了项目的支持和进一步开发。

项目部署

要在本地运行,您将需要一个标准环境。

  • Node.js
  • MongoDB(本地或通过云)

项目可以通过npm正常模式启动,也可以使用Docker启动,方便在测试或内部环境中快速部署。

实际应用

KabanBoard可用于不同的场景。

  • 内部任务管理工具
  • 定制看板解决方案的基础
  • SPA架构研究培训项目
  • 宠物项目或作品集的起点

结论

KabanBoard 是使用看板的简洁实用的解决方案。该项目并不打算取代大型企业系统,而是非常适合小型团队、个人使用和针对特定任务的进一步开发。

戈菲斯

Gofis 是一个轻量级的命令行工具,用于快速搜索文件系统中的文件。
它是用 Go 编写的,大量使用并行性(goroutines),这使得它特别高效
处理大型目录和项目时。

该项目可在 GitHub 上获取:
https://github.com/demensdeum/gofis

🧠Gofis 是什么

Gofis 是一个 CLI 实用程序,用于按名称、扩展名或正则表达式搜索文件。
与 find 等经典工具不同,gofis 的设计初衷是
重点是速度、可读输出和并行目录处理。

该项目在MIT许可下分发,可以免费使用
用于个人和商业目的。

⚙️ 主要功能

  • 使用 goroutine 并行目录遍历
  • 按文件名和正则表达式搜索
  • 按扩展名过滤
  • 忽略繁重的目录(.git、node_modules、vendor)
  • 人类可读的文件大小输出
  • 最小的依赖性和快速构建

🚀安装

需要安装 Go 才能工作。

git clone https://github.com/demensdeum/gofis
cd gofis
go build -o gofis main.go

构建后,二进制文件可以直接使用。

发布页面上还有适用于现代 Windows 版本的独立版本:
https://github.com/demensdeum/gofis/releases/

🔍使用示例

按名称搜索文件:

./gofis -n "config" -e ".yaml" -p ./src

快速定位搜索:

./gofis "main" "./projects" 50

使用正则表达式搜索:

./gofis "^.*\.ini$" "/"

🧩 它是如何工作的

Gofis 基于 Go 的竞争模型:

  • 每个目录都在单独的 goroutine 中处理
  • 使用信号量限制活动任务的数量
  • 频道用于传输搜索结果

这种方法可以有效利用 CPU 资源
并显着加快大型文件树的搜索速度。

👨‍💻Gofis适合谁?

  • 使用大型存储库的开发人员
  • DevOps 和系统管理员
  • 需要从终端快速搜索的用户
  • 对于那些学习 Go 中并发的实际用途的人

📌结论

Gofis 是一个简单但有效的工具,只做一件事,而且做得很好。
如果您经常在大型项目中搜索文件并且看重速度,
这个 CLI 工具绝对值得一看。

乌拉马卡尔

如果您使用 Ollama 并且不想每次都编写自己的 API 包装器,
ollama_call 项目显着简化了工作。

这是一个小型 Python 库,允许您使用一个函数向本地 LLM 发送请求
并立即收到响应,包括 JSON 格式。

安装

pip install ollama-call

为什么需要它

  • 使用模型的最少代码;
  • 结构化 JSON 响应以供进一步处理;
  • 方便快速制作原型和 MVP;
  • 如有需要,支持流式输出。

使用示例

from ollama_call import ollama_call

response = ollama_call(
    user_prompt="Hello, how are you?",
    format="json",
    model="gemma3:12b"
)

print(response)

当它特别有用时

  • 您在 Ollama 之上编写脚本或服务;
  • 需要可预测的响应格式;
  • 不想连接重型框架。

总计

ollama_call 是一个轻量级且清晰的包装器,用于使用 Python 中的 Ollama。
如果简单性和快速结果很重要,那么这是一个不错的选择。

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

SFAP:现代数据采集和处理的模块化框架

在自动化和人工智能积极发展的背景下,有效收集、
清理和转换数据变得至关重要。大多数解决方案只是关闭
这个过程的各个阶段,需要复杂的集成和支持。

SFAP(Seek·Filter·Adapt·Publish)是Python的一个开源项目,
它提供了一种整体且可扩展的方法来处理数据生命周期各个阶段的数据:
从寻找来源到发布最终结果。

什么是 SFAP

SFAP 是一个围绕数据处理管道的清晰概念构建的异步框架。
每个阶段在逻辑上都是独立的,并且可以独立扩展或替换。

该项目基于责任链架构模式,它提供:

  • 管道配置灵活性;
  • 各个阶段的简单测试;
  • 高负载的可扩展性;
  • 组件之间的职责清晰分离。

管道的主要阶段

Seek – 数据搜索

在此阶段,发现数据源:网页、API、文件存储
或其他信息流。 SFAP 可以轻松连接新来源而无需更改
系统的其余部分。

Filter – 过滤

过滤旨在消除噪音:不相关的内容、重复内容、技术元素
和低质量的数据。这对于后续处理步骤至关重要。

Adapt – 适配和处理

适应阶段负责数据转换:标准化、结构化、
语义处理以及与人工智能模型(包括生成模型)的集成。

发布 – 发布

最后阶段,数据以目标格式发布:数据库、API、文件、外部服务
或内容平台。 SFAP 不限制结果的交付方式。

该项目的主要特点

  • 基于asyncio的异步架构
  • 模块化和可扩展性
  • 支持复杂的处理管道
  • 准备好与 AI/LLM 解决方案集成
  • 适合高负载系统

实际用例

  • 新闻来源的汇总和分析
  • 准备机器学习数据集
  • 自动化内容管道
  • 清理和标准化大型数据流
  • 整合来自异构源的数据

SFAP 入门

您需要开始的是:

  1. 克隆项目存储库;
  2. 安装 Python 依赖项;
  3. 定义您自己的管道步骤;
  4. 启动异步数据处理进程。

该项目很容易适应特定的业务任务,并且可以随着系统的增长而增长,
而不变成一个整体。

结论

SFAP 不仅仅是一个解析器或数据收集器,而且是一个成熟的构建框架
现代数据管道系统。适合关注的开发者和团队
可扩展、架构简洁且数据就绪。
项目源代码可在 GitHub 上获取:
https://github.com/demensdeum/SFAP

Flut数据流

一个 Flutter 应用程序,可将任何文件转换为一系列机器可读代码(QR 和 DataMatrix),以便在设备之间进行高速数据流。

特点
* 双重编码:将每个数据块同时表示为 QR 码和 DataMatrix 码。
*高速流媒体:支持自动切换间隔高达330ms。
* 智能分块:自动将文件分割成自定义块(默认值:512 字节)。
* 详细扫描器:实时读取ASCII码以进行调试和即时反馈。
* 自动恢复:立即恢复文件并将其保存到您的下载目录。
* 系统集成:完成后使用默认系统应用程序自动打开保存的文件。

https://github.com/demensdeum/FlutDataStream

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

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

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

“虚假症状”的陷阱

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

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

它在现实中是如何运作的

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

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

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

<小时/>

击败错误的算法

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

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

错误时刻的“照片”

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

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

<小时/>

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

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

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

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

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

<小时/>

当逻辑失败时:内存问题

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

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

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

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

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

摘要

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

费拉尔

Ferral 是一种高级、多范式编程语言,专为从大型语言模型 (LLM) 生成代码而设计。虽然传统语言在设计时考虑了人体工程学,但 Ferral 针对大型语言模型 (LLM) 的推理、标记化和推理逻辑进行了优化。

该名称由两个 R 拼写而成,表明针对人工智能生成代码的不可预测性的一种“重新想象”方法。

https://github.com/demensdeum/ferral

DemensDeum 编码挑战#2

我正在开始 Demensdeum 编码挑战#2:
1. 您需要对 Web 应用程序进行 vibecode,以显示用户区域中的聚会/活动列表。
2、数据源可以是前端的网页抓取,也可以是本地/远程数据库。
3. 仅在地图上显示今天的活动/聚会。
4. 您可以更改搜索半径。
5. 作为一系列文本提示提交,这些提示可以在免费代码生成器(例如 Google AI Studio)中重现。
6. 应该可以在 iOS、Android、PC 上运行
7. 最佳设计获胜
8. 通过点击地图上的事件来显示有关该事件的详细信息。
9. 用手指或鼠标缩放地图。
10. 获奖者由评审团选出(写信给我参加评审团)
11.奖品200 USDT
12. 截止日期:7月1日。

过去的 DemensDeum 编码挑战赛#1 的获胜者
https://demensdeum.com/blog/ru/2025/06/03/demensdeum-code-challenge-1-winner/

Masonry-AR 更新

Masonry-AR 游戏中添加了用加密货币购买硬币的功能!只需 1 美元即可获得 5000 MOS。游戏中还添加了推荐链接;好友每购买一次,推荐人即可获得 50,000 MOS。共济会维基百科中有详细信息。还添加了自动行走模式:当无法访问 GPS 模块时,梅森开始自动从世界首都之一行走,仅向前行走。

游戏链接:
https://demensdeum.com/demos/masonry-ar/client/

驴行者

《Donkey Adept》是一部令人惊叹的、令人兴奋的像素化超现实主义作品。中间是一个穿着黑色皮夹克的人物,他的头是一台燃烧着、充满静电的电视,长着火热的驴耳朵。人物手持强大的灯笼,充当在喧嚣中寻找真相的孤独哨兵。这是对媒体、疯狂和对光明的不懈追求的激烈复古式冥想。

https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/5

立方体艺术项目2在线

在线遇到Cube Art Project 2 – 轻巧,快速且完全重写的电台时间表,该编辑直接在浏览器中工作。现在有可能共同创造力!

这不仅是一种工具,而且是对颜色,几何形状和冥想的3D创建的实验,您可以与朋友联系。该项目是在纯JavaScript上创建的,没有框架和WebAssembly,展示了WebGL和Shaaders的功能。

新:多人游戏!实时与其他用户合作。所有更改,立方体的添加和着色都会立即同步,使您可以一起创建站杰作。

控制:
– WASD-移动相机
– 鼠标 – 旋转
-GUI-颜色设置

在线的:
https://demensdeum.com/software/cube-art-project-2-online/

Github上的资料:
https://github.com/demensdeum/cube-art-project-2-online

该项目使用trix.js在纯JavaScript上编写。
没有框架,没有收藏家,没有WebAssembly-只有WebGL,着色器和对像素几何的一点爱。

Donki Hills Steam

唐基·希尔斯(Donki Hills)是一款喜剧恐怖游戏,在第一人称中是一种令人兴奋的叙事经历,并以意想不到的幽默感使玩家深入秘密。该游戏由Demensdeum在虚幻引擎上开发和出版,可让您控制一个普通人詹姆斯(James),他的生活在他的在线熟人玛丽亚(Maria)的神秘失踪之后,他的生活发生了不寻常的转变。他唯一的线索是一张照片,暗示着一个僻静的俄罗斯村庄,名为《宁静唐基》,位于诺瓦西比尔斯克附近。詹姆斯以不可动摇的联系和迫切需要答案的需求(可能有几次紧张的笑声)开车,詹姆斯继续史诗般的旅程,揭示了玛丽消失的真相。

该游戏可在Steam上使用:
https://store.steampowered.com/app/3476390/Donki_Hills/

编程中的熵

[补充]

编程中的熵是一种强大但通常不起眼的力,它决定了软件行为的可变性和不可预测性。从简单的错误到复杂的孙子,熵是我们的程序并不总是按照我们期望的。

软件中的熵是什么?

软件中的熵是算法意外结果的量度。用户将1STTI结果视为错误或错误,但是从机器的角度来看,该算法完全执行了程序员在其中放置的指令。出乎意料的行为是由于输入数据,系统条件和交互的大量可能组合而产生的。

熵的原因:

*改变状态:当对象可以更改其内部数据时,其工作的结果将取决于其使用的整个历史记录。

*算法的复杂性:随着程序的增长,执行代码的可能方法的数量呈指数增长,从而使所有结果的预测几乎不可能。

*外部因素:操作系统,其他程序,网络延迟 – 所有这些都会影响您的代码执行,从而创建其他可变性来源。

熵的原因:

*改变状态:当对象可以更改其内部数据时,其工作的结果将取决于其使用的整个历史记录。

*算法的复杂性:随着程序的增长,执行代码的可能方法的数量呈指数增长,从而使所有结果的预测几乎不可能。

*外部因素:操作系统,其他程序,网络延迟 – 所有这些都会影响您的代码执行,从而创建其他可变性来源。

全局变量作为熵的来源

(1973年)W.A. Wulf和M. Shaw在他的作品《全球变量造成的有害》中表明,全球变量是无法预测的行为的主要来源之一。它们创造了难以跟踪和控制的隐性成瘾和副作用,这是熵的经典表现。

莱曼和熵的定律

软件系统不断增长的复杂性的想法完美地制定了曼尼·莱曼(Manny Leman)的软件进化定律。其中两个直接反映了熵的概念:

使用的计算机程序将进行修改。该声明表明该软件不是静态的。它的生活,发展和变化以满足新的要求和环境。该计划生命的每个新“圆”都是熵的潜在来源。

当修改计算机程序时,其复杂性会增加,只要没有人阻止这一点。该定律是熵的直接结果。没有针对性的复杂性管理工作,每个新修改都会在系统中引入其他可变性和不可预测性。有一些新的依赖性,条件和副作用增加了虫子和毫无意义的行为的可能性。

AI和LLM世界中的熵:不可预测的代码

在人工智能和大语言模型(LLM)领域,熵特别敏锐,因为在这里我们正在处理非范围的算法。与传统程序不同,同一访问总是以相同的方式出路,LLM可以给出相同请求的不同答案。

这造成了一个巨大的问题:只能在使用作者的一组有限的输入数据集上确认该算法的正确性。但是,当使用未知输入数据(用户的请求)时,模型的行为变得不可预测。

llm 中的熵示例

创新的词汇和种族主义陈述:聊天机器人(例如Microsoft的Tay或XII的Grok)的已知案例,经过互联网的数据培训后,开始产生进攻或种族主义陈述。这是熵的结果:未知输入数据与大量训练样本结合使用导致不可预测和不正确的行为。

非法上诉:当神经网络开始发布侵犯版权或道德规范的内容时,就会出现此类问题。

游戏中的AI BOTA:在游戏中引入AI字符,例如在Fortnite中学习的可能性,导致了这样一个事实,即必须关闭AI机器人并添加以跟踪活动的正确性,以防止LLM Bot的非法行动。

技术债务:缺陷累计利息

书面代码和绕过解决方案不良
技术职责是一种有意识或无意识的妥协,在这种责任中,优先考虑迅速交付损害了长期支持和质量。快速更正和无证件旁路解决方案,通常在短时间内实施,累积,形成“雷区”。这使得代码基础甚至对微小变化非常敏感,因为很难将故意旁路解决方案与实际错误逻辑区分开,这会导致意外回归和错误数量增加。

这证明了技术义务对错误的传播和算法的完整性的直接,累积效应,其中每种当前减少所采用的每次减少都会导致将来更加复杂和频繁地误差。

测试不足及其累积效应

当未仔细测试软件系统时,它们更容易受到错误和意外行为的影响。这种不足使错误会随着时间的流逝而累积,创建一个难以支持的系统,并且非常容易受到更多错误的影响。从一开始就忽略测试不仅会增加技术债务,而且还直接有助于增加错误的数量。软件熵中的“窗户理论”表明,微不足道的,忽略的错误或设计问题会随着时间的流逝而累积,并导致更严重的问题并降低软件质量。

这建立了直接的因果关系:缺乏测试会导致错误的积累,从而导致熵的增加,从而导致更复杂和频繁的错误,直接影响算法的正确性和可靠性。

缺乏文档和信息筒仓

开发软件时通常会忽略正确的文档,这会导致有关系统如何工作以及如何支持该软件的分散或知识。这迫使开发人员“支持”进行更改的系统,大大增加了误解的可能性和不正确的修改,这直接导致错误。由于关键信息没有可用或误导性,因此它还严重使新开发人员的适应性变得复杂。

程序熵的发生是由于“缺乏知识”和“一般假设与现有系统的实际行为之间的差异”。这是一个更深层次的组织观察:熵不仅在代码层面,而且在知识层面上表现出来。这些非正式的隐性知识是脆弱的,很容易丢失(例如,离开团队成员时),这在试图修改时直接导致错误,尤其是团队的新成员,从而危害了算法逻辑的完整性,因为其主要假设停止了。

不一致的发展方法和所有权损失

人为因素是软件熵的重要,通常被低估的驱动因子。开发人员之间的各种技能,编码和质量期望会导致源代码中的不一致和偏差。缺乏用于覆盖,代码审查,测试和文档的标准化过程加剧了此问题。此外,当几个命令拥有代码的一部分或没有人拥有的一部分时,代码的不稳定代码不稳定,导致衰减的忽视和增加,这会导致复制组件以不同的方式执行相同功能,从而扩散错误。

这表明熵不仅是一个技术问题,而且是社会技术,深深植根于组织动态和人类行为。由于不一致的做法和零散的财产而引起的“集体不一致”直接导致不一致和缺陷,这使得系统无法预测和难以控制,这极大地影响了算法的完整性。

互连系统中的级联故障

现代软件系统通常很复杂,并且非常相互联系。在这样的系统中,当拒绝一个组件会导致其他故障的链反应时,高度的复杂性和密切相关的组件会增加级联故障的可能性。这种现象加剧了算法的错误和不当行为的影响,将局部问题变成系统性风险。此类系统中算法的结果变得非常容易受到远离其直接执行途径的失败的影响,这导致了广泛的结果。

建筑复杂性,熵的直接表现,可以将孤立的算法错误转变为大型系统故障,使总体系统不可靠,并且其输出数据是不可靠的。这强调了建筑稳定性的需求,以遏制熵效应的传播。

最新的例子之一是,由于2024年更新防病毒软件后出现了蓝色死亡屏幕,美国和欧洲机场的众所周知停止,Antivirus算法的错误结果和操作系统导致了世界空中交通。

实例

示例1:Unicode和Byte限制性中的熵

让我们看一个带有文本字段的简单示例,该示例受32个字节限制。

带有ASCII(低熵)的方案

如果字段仅接受ASCII符号,则每个符号为1个字节。因此,恰好将32个字符放在现场。任何其他符号都不会被接受。

@startuml
ASCII的标题示例(低熵)
演员用户
参与者“ Textfield”

用户 – > textfield:介绍32个符号ASCII
Textfield-> Textfield:检查长度(32个字节)
请注意
一切都很好。
结尾
textfield->用户:acceps输入
@Enduml

带有UTF-8(高熵)的方案:

现在,我们80年代的程序落在2025年。当字段占用UTF-8时,每个符号可以占据1到4个字节。如果用户引入了超过32个字节的线路,则系统可能会错误地剪切。例如,表情符号占4个字节。如果修剪发生在符号内,那么我们会得到一个“破碎”符号。

@startuml
带有UTF-8的标题示例(高熵)
演员用户
参与者“ Textfield”

用户 – > textfield:介绍“ hi”(37字节)
textfield-> textfield:剪切最多32个字节
请注意
突然!象征
通过字节切割。
结尾
Textfield->用户:显示“ HI”
请注意
不正确的符号。
结尾
@Enduml

在这里,熵表现为以下事实:不同输入数据的相同修剪操作会导致不可预测和不正确的结果。

示例2:CSS中的熵和浏览器的不兼容

即使在看似稳定的技术(例如CSS)中,由于对标准的解释不同,也可能发生熵。

想象开发人员已应用用户当选:无;到所有元素关闭文本输出。

浏览器10(旧逻辑)

浏览器10对输入字段有例外。因此,尽管有标志,但用户可以输入数据。

@startuml
标题浏览器10
演员用户
参与者“浏览器10”作为浏览器10

用户 – >浏览器10:输入输入
浏览器10->浏览器10:检查CSS
请注意
– 用户 – 当选:无;
忽略输入
结尾
浏览器10->用户:允许输入
@Enduml

浏览器11(新逻辑)

新浏览器的开发人员决定严格遵循规格,将规则应用于所有元素,无一例外。

@startuml
标题浏览器11
演员用户
参与者“浏览器11”作为浏览器11

用户 – >浏览器11:输入输入
浏览器11->浏览器11:检查CSS
请注意
– 用户 – 当选:无;
应用于所有元素,包括输入
结尾
浏览器11->用户:拒绝输入
请注意
用户无能为力
类型。
结尾
@Enduml

这个熵的经典示例 – 相同的规则根据“系统”(浏览器的版本)导致不同的结果。

示例3:由于含糊不清的TK

模棱两可的技术任务(TK)是熵的另一种强大来源。当两个开发人员鲍勃和爱丽丝以不同的方式理解相同的要求时,这会导致不兼容的实现。

TK:“要实现斐波那契数的生成器。为了优化,必须将生成数字的列表捕获在发电机内。”

鲍勃的心理模型(条件变化的OOP)
鲍勃(Bob)专注于“清单…必须被拖延”一词。他实施了一个存储相同状态(自我序列)的类,并随着每次呼叫而增加。

    def __init__(self):
        self.sequence = [0, 1]

    def generate(self, n):
        if n <= len(self.sequence):
            return self.sequence

        while len(self.sequence) < n:
            next_num = self.sequence[-1] + self.sequence[-2]
            self.sequence.append(next_num)

        return self.sequence

爱丽丝的心理模型(功能方法)

爱丽丝专注于“返回序列”一词。她编写了一个纯净的功能,每次都将新列表返回,仅使用缓存作为内部优化。

    sequence = [0, 1]
    if n <= 2:
        return sequence[:n]

    while len(sequence) < n:
        next_num = sequence[-1] + sequence[-2]
        sequence.append(next_num)

    return sequence

当爱丽丝开始使用BOB生成器时,她希望生成(5)将始终返回5个数字。但是,如果在此BOB在同一对象处称为生成(8),Alice将收到8个数字。

底线:熵是心理模型的结果。 BOB实施中的可变状态使该系统无法预测为Alice,该系统正在等待纯粹功能的行为。

熵和多势:种族和祖父的状况

在多流动的编程中,熵特别表现出来。同时执行几个流,并且其实现过程是不可预测的。当结果取决于哪个流是第一个访问公共资源的流时,这可能会导致比赛条件。极端情况是祖父,当两个或两个以上的溪流互相等待,并且程序冻结。

Dedlok解决方案的示例:

当两个或多个流相互阻止,等待资源发布时,DEDLOK的问题就会出现。解决方案是建立一个单一的,固定的程序来夺取资源,例如,通过增加ID来阻止它们。这不包括循环期望,可以防止僵局。

@startuml
标题解决方案:统一阻止程序
参与者“流1”为线程1
参与者“流2”为thread2
参与者“为”帐户
参与者“帐户b”作为帐户

thread1-> accounta:阻止帐户
注意螺纹1
规则如下:
块ID
结尾
thread2->帐户:等待帐户A将被释放
请注意thread2
规则如下:
等待锁定
结尾
thread1-> accountb:块帐户b
thread1->帐户:释放帐户
thread1-> accountb:发行得分b
注意螺纹1
交易完成
结尾
thread2-> accounta:阻止帐户
thread2-> accountb:块帐户b
请注意thread2
交易结束
结尾
@Enduml

这种方法 - 订购的阻塞(锁定订购) - 是防止并行编程中的Deadlles的基本策略。

太好了,让我们分析使用画布上的示例在OOP方法中可变状态增加熵,并将其与纯函数进行比较。

问题:改变条件和熵

当对象具有变化状态时,其行为就会变得不可预测。调用相同方法的结果不仅取决于其参数,还取决于与此对象的整个互动历史。这将熵进入系统。

考虑在画布上绘制矩形的两种方法:一个以可变条件的OOP风格,另一种具有纯函数的功能。

1。OOP方法:具有可变状态的课程
在这里,我们创建一个光标类,该类存储其内部状态,在这种情况下为颜色。 Draw方法将使用此条件绘制矩形。

  constructor(initialColor) {
    // Внутреннее состояние объекта, которое может меняться
    this.color = initialColor;
  }

  // Метод для изменения состояния
  setColor(newColor) {
    this.color = newColor;
  }

  // Метод с побочным эффектом: он использует внутреннее состояние
  draw(ctx, rect) {
    ctx.fillStyle = this.color;
    ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
  }
}

// Использование
const myCursor = new Cursor('red');
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

myCursor.draw(ctx, rectA); // Используется начальный цвет: red
myCursor.setColor('blue'); // Изменяем состояние курсора
myCursor.draw(ctx, rectB); // Используется новое состояние: blue

OOP方法的UML图:

该图清楚地表明,尽管其参数可能不会改变,但Draw方法的呼声给出了不同的结果。这是由于一个单独的setColor调用,它改变了对象的内部状态。这是可变状态下熵的经典表现。

title ООП-подход
actor "Программист" as Programmer
participant "Класс Cursor" as Cursor
participant "Canvas" as Canvas

Programmer -> Cursor: Создает new Cursor('red')
note left
  - Инициализирует состояние
    с цветом 'red'.
end note
Programmer -> Cursor: draw(ctx, rectA)
note right
  - Метод draw использует
    внутреннее состояние
    объекта (цвет).
end note
Cursor -> Canvas: Рисует 'red' прямоугольник
Programmer -> Cursor: setColor('blue')
note left
  - Изменяет внутреннее состояние!
  - Это побочный эффект.
end note
Programmer -> Cursor: draw(ctx, rectB)
note right
  - Тот же метод draw,
    но с другим результатом
    из-за измененного состояния.
end note
Cursor -> Canvas: Рисует 'blue' прямоугольник
@enduml

2。功能方法:纯粹的功能

在这里,我们使用纯函数。它的任务是简单地使用传输到其的所有必要数据绘制矩形。她没有任何条件,她的挑战不会影响边界之外的任何事情。

  // Функция принимает все необходимые данные как аргументы
  ctx.fillStyle = color;
  ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
}

// Использование
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

drawRectangle(ctx, rectA, 'red'); // Рисуем первый прямоугольник
drawRectangle(ctx, rectB, 'blue'); // Рисуем второй прямоугольник

功能方法的UML图:

该图显示drawRectangle函数始终具有外部颜色。她的行为完全取决于输入参数,这使其干净并且具有低水平的熵。

@startuml
标题功能方法
演员“程序员”作为程序员
参与者“功能\ n drawRectangle”作为drawfunc
参与者“画布”作为画布

程序员 - > drawfunc:drawredreWerctangle(ctx,recta,'red')
请注意
- 致电参数:
-CTX
- 直肠(坐标)
- “红色”(颜色)
- 功能没有条件。
结尾

drawfunc->画布:带有颜色“红色”的洪水
程序员 - > drawfunc:drawredreWerctangle(ctx,rectb,'blue')
请注意
- 致电新参数:
-CTX
-RECTB(坐标)
- '蓝色'(颜色)
结尾
drawfunc->画布:带有颜色“蓝色”的洪水
@Enduml

在具有纯函数的示例中,由于该功能没有条件,因此行为是完全可预测的。所有工作的信息都是通过争论传递的,这使其孤立且安全。在带有可变状态的Draw方法行为的OOP方法中,与对象的互动的整个历史可能会影响,这引入了熵并使代码降低了可靠。

模块化设计和体系结构:隔离,可检验性和RE-使用

将复杂系统分为较小,独立,自给自足的模块,简化了设计,开发,测试和维护。每个模块都会处理某些功能,并通过明确定义的界面进行交互,从而减少了相互依赖性并有助于责任分离。这种方法可提高可读性,简化维护,促进并行开发,并通过隔离问题来简化测试和调试。至关重要的是,这会减少错误的“失败半径”,阻止在单独的模块中阻碍缺陷并防止级联故障。微服务体系结构是一种强大的方式实现。

模块化不仅是组织代码的一种方式,而且是一种包含缺陷和稳定性提高的基本方法。限制误差在一个模块中的影响,模态增加了系统对熵衰减的总体稳定性,确保一个拒绝点不会损害整个应用程序的正确性。这使团队可以专注于系统的较小,更受控的部分,从而导致更彻底的测试和更快的检测和纠正错误。

纯代码的实践:可靠性的亲吻,干燥和坚实的原则

亲吻(保持简单,愚蠢):
这种设计理念代表简单和清晰,积极避免不必要的复杂性。简单的代码本质上更容易阅读,理解和修改,这直接导致倾向的趋势和改善支持的趋势。复杂性清楚地定义为错误的营养环境。

KISS不仅是一种审美偏好,而且是故意的设计选择,它减少了错误的攻击表面,并使代码对未来的变化更具抵抗力,从而保持了算法的正确性和可预测性。这是在详细的代码级别上反对熵的主动措施。

干燥(Donat重复自己):
该干燥原则旨在减少信息的重复和代码的重复,用抽象替换或使用数据归一化。其主要立场是“每个知识的片段都应在系统中具有一个单一的,明确的,权威的代表。”这种方法消除了冗余,从而减少了不一致的情况,并防止了错误的传播或在重复的逻辑的几个副本中的不一致校正。它还简化了代码库的支持和调试。

代码的重复导致不一致的变化,这又导致错误。 Dry可以防止这种情况,从而为逻辑和数据提供了一个真实的来源,这直接有助于算法的正确性,确保一般逻辑在整个系统中均匀且可预测地行为,以防止稀薄,难以输入错误。

固体原理

该助记符的首字母缩写提出了五个基本设计原则(统一责任,开放性/亲密性,替代liskin,界面的分离,依赖性倒置),这对于创建面向对象的项目至关重要,这些项目清晰,灵活和支持。遵守固体软件实体变得更容易支持和适应,从而导致较少的错误和更快的开发周期。他们通过简化服务(SRP)来实现这一目标,确保可扩展的添加功能无需修改(OCP),确保行为一致性(LSP),最小化相干性(ISP)并增加了由于抽象(DIP)而提高灵活性。

坚实的原理为结构完整性提供了一种整体方法,这使得系统本质上更能抵抗变化的特技效应。促进模块化,分离和明确的责任,它们可以防止层叠错误并保留算法的正确性,即使系统是不断进化的,它是对抗熵的基本措施。

熵和域驱动设计(DDD)

域驱动的设计(DDD)不仅是一种理念,而且是一种成熟的方法,它提供了将应用程序分解为域中的特定模式,这使您可以有效地控制复杂性和战斗熵。 DDD有助于将混乱的系统变成一组可预测的孤立组件。

四个设计的帮派模式作为单个概念设备

“设计模式:可重复使用的对象软件的元素”(1994年),由“四个团伙”(GOF)(GOF)撰写,为典型问题提供了一系列可靠的解决方案。这些模式是打击熵的绝佳工具,因为它们创建了结构化,可预测和受控的系统。

模式的关键影响之一是创建单个概念设备。当一个团队中的开发人员谈论“工厂”或“孤独者”时,他的同事立即了解我们在谈论哪种代码。这大大减少了通信的熵,因为:

歧义降低:模式具有清晰的名称和描述,这些名称和描述不包括不同的解释,如鲍勃和爱丽丝的示例中。

加速加速:新团队成员被倒入该项目,因为他们不需要猜测复杂结构背后的逻辑。

重构的促进:如果您需要根据模式更改系统的部分,则开发人员已经知道它是如何布置的,并且可以安全地修改哪些零件。

GOF模式及其对熵的影响的例子:

模式“策略”:允许您封装单个类中的各种算法并使它们可互换。这会减少熵,因为它使您可以在不更改其主代码的情况下更改系统的行为。

模式“命令”(命令):Inkapsul将方法的方法归为对象。这使您可以推迟执行,将命令放入队列或取消它们。模式减少了熵,因为它将团队的发件人与接收者分开,使其独立。

观察者模式(观察者):确定“一对多”的依赖性,其中一个对象状态的变化会自动通知所有依赖它。这有助于控制副作用,使其显而易见,可预测,而不是混乱和隐藏。

模式“工厂方法”:定义用于创建对象的接口,但允许子类决定要建立哪个类。这会减少熵,因为它使您可以灵活地创建对象而无需了解特定类,从而降低连接性。

这些模式可帮助程序员创建更可预测的,测试和受控的系统,从而减少熵,这不可避免地发生在复杂的项目中。

DDD控制熵的关键模式

有限的上下文:这种模式是DDD基础。它提供了将大型系统分为小的自主零件。每个上下文都有自己的模型,术语词典(普遍语言)和逻辑。这会产生严格的边界,以防止变化和副作用的传播。例如,在一个有限的上下文中进行更改,例如,在“订单的上下文”中不会影响“交付上下文”。

聚合(聚合):该单元是相关对象的群集(例如,“顺序”,“顺序”线),被认为是整体。该单元具有一个根对象(聚集根),这是所有更改的唯一入口点。这提供了一致性,并确保单位状态始终保持不可或缺。通过仅通过其根对象更改单元,我们控制条件发生变化的方式和何时会大大降低熵。

域服务:对于不属于主题区域任何特定对象的操作(例如,在帐户之间的货币转移),DDD建议使用域服务。它们协调几个单元或对象之间的动作,但不要保持状况本身。这使逻辑更加透明和可预测。

DDD提供了使用事件的主题区域(域事件)的事件(域事件):而不是来自不同上下文的直接调用方法。当某种情况下发生重要的事情时,他会“发布”该事件。其他上下文可以订阅此事件并响应它。这会在组件之间产生微弱的联系,这使系统更具可扩展性和对变化的抵抗力。

DDD帮助控制熵,创建清晰的边界,严格的规则和孤立的组件。这将一个复杂的,令人困惑的系统变成了一组独立的,受控的部分,每个部分都有自己的“法律”和可预测的行为。

复杂而活泼的文档

维护有关代码更改,设计解决方案,架构图和用户手册的详细和相关文档至关重要。这种“实时文档”有助于开发人员了解系统的复杂性,跟踪更改并正确进行未来的修改或正确的错误。它大大减少了在“重新打开”或系统的反向设计上所花费的时间,这是常见的错误来源。

程序熵的发生是由于“缺乏知识”和“一般假设与现有系统的实际行为之间的差异”。该文档不仅是指导,而且是

维护知识的关键机制,直接与“知识的熵”作斗争。通过明确和负担得起的隐性知识,它减少了误解以及由于对算法或系统交互行为的错误假设而犯错误的可能性,从而保护了功能正确性。

严格的测试和持续质量保证

自动测试:模块化,集成,系统和回归测试
自动测试是一种不可或缺的工具,可软化软件熵并防止错误。它允许尽早发现问题,确保代码更改不会违反现有功能,并提供快速,一致的反馈。关键类型包括模块化测试(用于隔离组件),集成测试(用于模块之间的交互),系统测试(用于完整集成系统)和回归测试(以确保新更改不会导致旧错误的重复出现)。自动测试大大降低了人为因素并提高了可靠性。

自动测试是防止隐藏缺陷积累的主要保护。它积极地将发现错误的发现转移到了开发周期中,这意味着当校正是最便宜和最简单的问题时发现问题,从而阻止了它们对熵昏迷的影响的贡献。这直接影响算法的正确性,不断检查几个详细级别的预期行为。

通过测试开发(TDD):在检测错误时向左移动

通过测试开发(TDD)是软件开发的过程,其中包括在编写代码本身之前为代码编写测试。这个迭代的循环“反射”可促进快速反馈,从而可以尽早发现错误,并大大降低了后来发展阶段的复杂问题的风险。结果表明,TDD导致较小的错误和代码的最佳质量,很好地协调了干燥的理念(Donat重复自己)。 IBM和Microsoft的经验研究表明,TDD可以将误差密度降低到令人印象深刻的40-90%。测试示例还用作实时文档。

TDD充当主动质量控制,直接构建在开发过程中。强迫开发人员在实施之前确定预期行为,它最大程度地降低了逻辑错误的引入,并确保有目的创建代码以符合要求,从而直接提高算法的正确性和可预测性。

连续集成和交付(CI/CD):早期反馈和稳定版本
CI/CD实践对于现代软件开发至关重要,有助于确定早期阶段的错误,加速开发并确保不间断的部署过程。将小型代码软件包经常集成到中央存储库中,可以通过自动组件和测试来尽早发现错误并持续改进代码质量。此过程提供了快速的反馈,使开发人员能够快速有效地消除问题,并显着提高代码的稳定性,从而阻止了未经验证或不稳定代码的积累。

CI/CD传送带起减少熵的连续机制。通过自动化集成和测试,它们可以防止集成问题的积累,提供不断发展的条件并提供回归的立即可见性。这种系统和自动化的方法直接抵消了连续变化,维持算法的稳定性并防止错误在整个系统中的传播的疾病。

技术债务的系统管理

增强重构:战略代码改进

重构是重组现有代码以改善其内部结构而不改变其外部行为的过程。这是打击软件腐烂和降低复杂性的直接手段。尽管重构通常被认为是减少错误数量的一种方法,但重要的是要承认,某些折射可以无意中造成新的错误,这需要严格的测试。但是,研究通常证实,折射的代码少于错误,而不是未经培训。将债务管理集成到当前发展过程中并且没有推迟的重构对防止技术债务的指数积累至关重要。

重构是一项故意减少熵,主动代码重组以使其对变化更具抵抗力的行动,从而减少了未来错误的可能性并提高了算法的清晰度。这将反应性的灭火变成了对结构健康的积极管理。

技术债务的积压:资源的优先和分配

维护当前的技术债务是系统管理和消除技术债务的关键实践。该积压是确定的技术义务和需要改进领域的要素的全面登记,确保不会忽略这些问题。它使项目经理可以根据其影响力和潜在风险的严重性来确定债务要素的优先级。在项目期间,Bablog的整合确保了重构,错误校正和代码清洁是项目日常管理的常规部分,从而降低了长期还款成本。

技术债务的Baclog将一个抽象的,越来越多的问题变成了一组受控的,有效的任务。这种系统的方法使组织能够在新功能的发展和质量投资之间采取合理的折衷,从而阻止了不明显的债务积累,这可能会导致关键错误或算法生产率的降解。它提供了对关键熵功率的可见性和控制。

静态和动态代码分析:问题的主动识别

静态分析

该技术包括对源代码的分析,而无需实施,以确定诸如错误,代码气味,安全漏洞和编码标准受损的问题。它是“第一线保护”,在开发周期的早期阶段确定问题,改善了代码的整体质量并通过在执行过程中出现在错误之前,通过识别出有问题的模板来减少技术债务。

静态分析充当自动化的“代码质量警察”。在执行之前识别潜在问题(包括影响算法逻辑的问题),它以错误或建筑缺点的形式防止其表现。这是确保编码标准并确定有助于软件熵的常见错误的可扩展方法。

动态分析

此方法在执行过程中评估软件行为,提供有关仅在执行过程中表现出的问题的宝贵信息。它在执行过程中出色地发现了错误,例如记忆泄漏,比赛状况和零指针的排除以及性能和安全性脆弱性的狭窄位置。

动态分析对于在执行过程中识别行为劣势至关重要,这无法通过静态分析检测到。静态分析和动态分析的结合确保了对代码的结构和行为的全面概念,从而使团队能够在出现严重问题之前识别出缺陷。

监视生产和事件办公室

APM(应用程序性能监控):
APM工具旨在监视和优化应用程序性能。它们有助于识别和诊断性能的复杂问题,并检测错误的根本原因,从而减少停机时间和退化的收入损失。 APM系统监视各种指标,例如响应时间,资源和误差频率的使用,提供实时信息,这使您可以在影响用户之前主动解决问题。

APM工具对问题和维持服务水平的主动解决方案批评。它们在生产环境中提供了深厚的可见性,使团队能够快速识别并消除可能影响正确的算法或导致错误的问题,从而最大程度地减少停机时间并改善用户体验。

可观察性(日志,指标,示踪剂):

可观察性是指根据其输出数据和资产之间的相互作用来分析和测量系统内部状态的能力。可观察性的三个主要支柱是指标(有关生产力和资源使用的定量数据),日志(事件的详细时间记录)和跟踪(跟踪通过系统组件的请求流)。他们共同帮助识别和解决问题,提供对系统行为的全面理解。可观察性超出了传统的监控,有助于理解“未知未知”,并改善了应用程序的无问题应用。

可观察性使团队可以灵活地研究正在发生的事情,并迅速确定他们可能没有预见的问题的根本原因。这提供了对系统行为的更深入,灵活和主动的理解,使团队能够快速识别和消除不可预见的问题并保持应用程序的高度可访问性。

根本原因(RCA)分析

根本原因(RCA)的分析是一个基于数据的结构化过程,该数据揭示了系统或过程中问题的基本原因,从而使组织能够实施有效的长期解决方案,而不仅仅是消除症状。它包括对问题的定义,相关数据的收集和分析(例如,指标,日志,临时量表),使用诸如“为什么”和Ishikawa图的工具确定因果关系和相关因素,以及纠正措施的开发和实施。 RCA对于防止问题和事件的培训至关重要。

RCA对于长期预防问题和事件培训至关重要。系统地识别和消除主要原因,不仅症状,组织还可以防止错误和算法失败的发生,从而降低了系统的整体系统并提高其可靠性。

灵活的方法和团队实践

敏捷中的错误管理:

在敏捷环境中,错误管理至关重要,建议在冲刺中分配时间以纠正它们。错误应记录在产品的单个产品中,并与相应的历史记录相关联,以促进根本原因的分析并改善随后的冲刺中的代码。团队应努力尽快纠正错误,最好是在当前的冲刺中,以防止其积累。错误统计数据的收集(已解决的数量,注册的数量,用于更正的时间)有助于了解代码质量并改善过程。

这强调了立即纠正的重要性,对根本原因的分析和持续改进。灵活的方法为主动控制错误提供了一个框架,以防止其对系统熵的贡献,并通过持续的验证和适应来保持算法的正确性。

devops 练习

DevOps实践有助于减少软件缺陷并通过多种关键方法提高质量。其中包括发展合作文化和毫无疑问的交流文化,采用持续整合和交付(CI/CD),自动测试的配置,将注意力集中在观察力和指标上,避免手工工作,包括在开发周期的早期阶段的安全性和事件上的培训。这些实践减少了错误的数量,提高质量并有助于不断改进。

DevOps通过自动化,快速反馈和普遍责任文化有助于持续改善和减少熵。整合开发和操作的过程,DevOps创建了一个环境,在该环境中,可以快速检测和消除问题,从而阻止其系统的积累和降解,从而直接支持算法的完整性。

结论

程序熵是不可避免的力量,它不断努力降级软件系统,尤其是在算法和错误的正确性下。这不仅是身体上的衰老,而且是代码,其环境和人为因素之间不断造成混乱的动态互动。这种衰减的主要驱动力包括越来越复杂,技术债务的积累,文档不足,外部环境不断变化以及不一致的开发方法。这些因素直接导致算法工作的结果不正确,可预测性丧失以及可能通过互连系统散布的错误数量增加。

与软件熵的斗争需要一种多方面,连续和主动的方法。仅仅纠正错误时,这还不够;有必要系统地消除生成它们的主要原因。采用模块化设计,清洁代码(亲吻,干燥,实心)和复杂文档的原理对于创建稳定的系统至关重要,这些系统本质上不太容易受到熵的影响。严格的自动测试,通过测试(TDD)开发(TDD)和连续集成/交付(CI/CD)起到了早期检测和预防缺陷的关键机制,不断检查和稳定代码库。

此外,通过偶然的重构和技术债务的障碍者以及使用静态和动态代码分析工具的系统债务的系统管理,使组织能够在导致关键失败之前积极识别和消除问题领域。最后,在APM工具和可观察性平台的帮助下,可靠的生产监控,结合对根本原因和灵活团队实践的纪律分析,可确保对新兴问题的快速响应,并创建持续的改进周期。

最终,确保算法的完整性并最大程度地减少软件熵条件下的错误 - 这不是一个时间的努力,而是在动态且不断变化的环境中保持秩序的持续义务。采用这些策略,组织可以显着提高其软件系统的可靠性,可预测性和耐用性,从而确保算法能够按计划进行,即使它们的发展也是如此。

实际上没有福尔马林的框图

框图是一种视觉工具,有助于将复杂的算法转变为可理解且结构化的动作序列。从编程到业务流程管理,它们是一种可视化,分析和优化最复杂系统的通用语言。

想象一下一张地图,而不是道路是逻辑,而不是城市 – 行动。这是一个框图 – 在最令人困惑的过程中导航的必不可少的工具。

示例1:简化的游戏启动方案
要了解工作原理,让我们提出一个简单的游戏发布计划。

当一切都没有失败时,该方案显示了完美的脚本。但是在现实生活中,一切都更加复杂。

示例2:扩展的方案用于使用数据加载开始游戏
现代游戏通常需要互联网连接才能下载用户数据,保存或设置。让我们将这些步骤添加到我们的计划中。

该方案已经更现实,但是如果出现问题,会发生什么?

怎么样:一款“破产”的游戏,失去了互联网

在项目开始时,开发人员无法考虑所有可能的情况。例如,他们专注于游戏的主要逻辑,并且不认为如果玩家具有互联网连接会发生什么。

在这种情况下,其代码的框图看起来像这样:

在这种情况下,该游戏在等待数据的阶段冻结了,而不是由于缺乏连接而无法收到的数据,而不是发出错误或关闭。这导致了“黑屏”并冻结了应用程序。

如何变成:用户投诉纠正

在许多用户对徘徊的投诉之后,开发人员团队意识到我们需要纠正错误。他们通过添加错误处理单元来更改代码,该单元允许应用程序正确响应缺乏连接。

这就是校正的框图的外观,其中两个方案都被考虑:

借助这种方法,游戏现在正确地通知了用户有关问题的信息,在某些情况下,它甚至可以进入离线模式,从而使您可以继续游戏。这是一个很好的例子,说明了为什么框图如此重要:他们使开发人员不仅考虑了理想的执行方式,而且还考虑了所有可能的失败,从而使最终产品更加稳定和可靠。

不确定的行为

悬挂和错误只是该程序不可预测行为的一个例子。在编程中,存在一个不确定行为(不确定的行为)的概念 – 这是语言标准无法描述程序在某种情况下应如何行为的情况。

这可能会导致任何事情:从撤回的随机“垃圾”到程序的失败甚至严重的安全漏洞。例如,使用内存时,通常会发生不确定的行为。

语言C的一个示例:

想象一下,开发人员将线路复制到缓冲区中,但忘了添加到零符号(`\ 0`)的端,该符号标记了线路的末端。

这就是代码的样子:

#include 

int main() {
char buffer[5];
char* my_string = "hello";

memcpy(buffer, my_string, 5);

printf("%s\n", buffer);
return 0;
}

预期结果:“你好”
真正的结果是不可预测的。

为什么会发生这种情况?使用指定符的“ printf”函数期望该行以零符号结束。如果他不是,她将继续阅读突出显示的缓冲区之外的记忆。

这是此过程的框图,并具有两个可能的结果:

这是一个明显的例子,说明了框图如此重要的原因:它们使开发人员不仅考虑了理想的执行方式,而且还考虑了所有可能的失败,包括如此低级的问题,使最终产品更加稳定和可靠。

LLM Fine-Tune

当前,所有流行的LLM服务提供商都使用JSONL文件进行微调,该文件描述了模型的输入和输出,例如Gemini,OpenAI,格式略有不同。

在下载了专门成立的JSONL文件后,开始指定数据集上LLM模型的专业化过程开始,对于所有当前众所周知的LLM提供商,这项服务已支付。

对于使用Ollama在本地计算机上进行微调,我建议依靠YouTube频道技术的详细视频,并以最简单的方式微调LLM,并与Alloma一起使用Alloma:
https://www.youtube.com/watch?v=pTaSDVz0gok

jupyter笔记本电脑的一个示例,并从所有电报消息的导出中准备JSONL数据集并启动本地微调过程:
https://github.com/demensdeum/llm-train-example

反应本地简短评论

React Native已将自己确立为跨平台开发移动和Web应用程序的强大工具。它允许您使用JavaScript/tyspript上的单个代码库来为Android和iOS创建本机应用程序,以及Web应用程序。

建筑与开发的基础

React国家体系结构基于JavaScript/Typescript的本机绑定。这意味着该应用程序中的基本业务逻辑和应用程序是在JavaScript或Typescript上编写的。当需要访问特定的本地功能(例如,设备或GPS摄像机)时,使用这些本机绑定,这使您可以调用iOS的Swift/Objective-C上写的代码或用于Android的Java/Kotlin。

重要的是要注意,最终的平台可能在功能上有所不同。例如,根据平台的本机功能,某些功能仅适用于Android和iOS,但不能用于Web,反之亦然。

配置和更新
本机绑定的配置是通过插件密钥进行的。对于稳定且安全的开发,使用最新版本的React本机组件并始终转向当前文档至关重要。这有助于避免兼容性问题,并使用最新更新的所有优势。

开发和优化的功能

React Native可以为特定平台生成产生的项目(例如,Android和iOS文件夹)。这使开发人员在必要时可以手动修补结果项目的文件,以进行精细的优化或特定的设置,这对于需要单独的性能方法的复杂应用程序特别有用。

对于典型和简单的应用程序,通常将Expo Bandle与内置的本机绑定使用通常足够。但是,如果应用程序具有复杂的功能或需要进行深度自定义,建议使用React Antive自定义组件。

开发和更新的饮食性

React Antial的关键优势之一是在开发过程中对Typescript/JavaScript代码进行热重载支持。这大大加速了开发过程,因为代码更改在应用程序中立即显示,从而使开发人员可以实时查看结果。

React Native还支持“静音更新)绕过Google Play和Apple App Store的过程,但这仅适用于Typescript/JavaScript代码。这使您可以快速发布错误或小型功能更新,而无需通过应用程序商店进行完整的出版物。

重要的是要了解TS/JS代码是使用指纹在特定版本的本机依赖版本上包裹的,这确保了JavaScript/Typescript部分与应用程序的本机部分之间的协调。

在开发中使用LLM

尽管使用LLM(大型语言模型)的CodheCeneration是可能的,但由于对模型的培训可能过时的数据集,其适用性并不总是很高。这意味着生成的代码可能与最新版本的反应本机或最佳实践对应。

React Native继续开发,为开发人员提供了一种灵活而有效的方法来创建跨平台应用程序。它结合了开发速度和访问本地功能的可能性,使其成为许多项目的吸引人选择。