跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

sunrisepeakS

sunrisepeak

@sunrisepeak
d2learn-dev
关于
帖子
183
主题
37
群组
1
粉丝
2
关注
3

帖子

最新 最佳 有争议的

  • 现代C++项目开发初识——记项目Orignal大改造
    sunrisepeakS sunrisepeak

    感觉关于项目相关的工程 (软件工程) 方面的东西是挺重要的

    • 目录结构
    • 单元测试
    • 文档
    • 构建
    • ...

    了解这些后。要自己开发项目或要去使用/阅读一些其他项目, 就能很快上手并理解很多项目的结构以及他们为什么那么做

    (有时间感觉可以尝试把文章的一些内容 录成视频分享到视频平台, 应该会有不少人感兴趣)


  • MIT这个非常宽松的开源协议究竟保留了什么?
    sunrisepeakS sunrisepeak

    @Littlefean 在 MIT这个非常宽松的开源协议究竟保留了什么? 中说:

    如果把游戏引擎的runtime打包到游戏里的时候一般就要包含了这部分的MIT协议。

    但这个回答是被动的,它是否需要开发者主动在“关于界面”或“开发者界面”里提出使用了这个引擎作为技术支持?

    一般来说是不强制要求在界面特别显示, 但是一般建议是在关于中提到。 但似乎这就是属于 "宽松" 区域, 但如果是一个要发行的商业软件, 一般默认尽可能的在关于进行标识比较好


  • 视频链接展开测试
    sunrisepeakS sunrisepeak

    @Sunrisepeak-0 在 视频链接展开测试 中说:

    哈喽👋哈喽哈喽

    引用


  • d2ds动画: 二维数组内部布局与局部性原理 - 动画代码
    sunrisepeakS sunrisepeak

    动画代码: https://github.com/d2learn/d2ds/blob/main/videos/array/two_dim_array.py
    动画视频: https://www.bilibili.com/video/BV1bQRvY4EDt


    5bdff4ca-714a-4207-9861-465ed10c1e11-image.png


  • 关于rt-thread task_struct结构体的疑惑
    sunrisepeakS sunrisepeak

    @sky-littlestar 在 关于rt-thread task_struct结构体的疑惑 中说:

    但是一些函数却以此作为类型传参数,task_struct的定义应该怎么找
    找不到使用的地方感觉可以找一找实际的函数中是怎么使用的反推结构里面的成员, 也有可能结构是不公开的


  • 开源的好处与坏处分析总结
    sunrisepeakS sunrisepeak

    关于这个idea和想法方面当时也有想到, 感觉有很多想法/理论都是在交流和碰撞上不断成熟起来的
    image.png


  • 视频链接展开测试
    sunrisepeakS sunrisepeak

    https://www.bilibili.com/video/BV1Mg4y1e713


  • xlings: 跨平台一键安装功能设计与思考 - 多编程环境搭建、工具软件安装、项目依赖管理
    sunrisepeakS sunrisepeak

    在前段时间开源了一个开发者命令行工具xlings, 收到了一些关注和反馈, 并且最近也对其中的一键安装功能做了进步增强。希望不仅可以帮助初学者快速的搭建编程环境, 也能用于项目开发者来管理复杂项目的开发环境依赖和一键搭建配置支持

    下面就从 最小功能实现、递归依赖安装、项目依赖管理循序渐进的介绍一下这个功能的设计和思考

    e39f59bf-5006-4ee1-8d34-8f36104417f2-image.png

    注: 这个软件和功能目前依然处于比较前期的探索和开发中

    一、最小功能实现 - 接口规范

    1.1 接口设计视角

    对于安装一个软件或编程环境大概可以划分成3个步骤: 下载 - 安装 - 配置

    95355e31-b6bd-4402-9253-cdf3a9094bae-image.png

    并且为了避免重复安装和显示软件的信息, 用top-down的思想,大概核心的接口设计如下:

    function support()
    -- ...
    end
    
    function installed()
    -- ...
    end
    
    function install()
    -- ...
    end
    
    function config()
    -- ...
    end
    
    function info()
    -- ...
    end
    

    其中support接口用来标识当前系统是否支持, info接口是用于获取软件的基础信息

    function support()
        return {
            windows = true,
            linux = true,
            macosx = false
        }
    end
    
    function info()
        return {
            name     = "vscode",
            homepage = "https://code.visualstudio.com",
            author   = "https://github.com/microsoft/vscode/graphs/contributors",
            licenses = "MIT",
            github   = "https://github.com/microsoft/vscode",
            docs     = "https://code.visualstudio.com/docs",
            profile  = "Visual Studio Code",
        }
    end
    

    1.2 接口实现视角

    从对于单一软件或环境接口实现视角来看, 有点类似很多项目中的一键安装/配置脚本

    但区别是xlings的安装实现上是符合一个接口规范的, 这样才能为后面的复用提供可能性。并且使用者可以不用关心实现细节, 通过标准接口就可以使用对应的模块。

    function installed()
        return try {
            function()
                if os.host() == "windows" and (os.getenv("USERNAME") or ""):lower() == "administrator" then
                    return os.isfile("C:\\Program Files\\Microsoft VS Code\\Code.exe")
                else
                    -- os.exec("code --version") - windows cmd not support?
                    common.xlings_exec("code --version") -- for windows
                end
                return true
            end, catch {
                function(e)
                    return false
                end
            }
        }
    end
    
    function install()
        print("[xlings]: Installing vscode...")
    
        local url = vscode_url[os.host()]
        -- only windows administrator
        local use_winget_sys = (os.getenv("USERNAME") or ""):lower() == "administrator"
    
        if not os.isfile(vscode_file) and not use_winget_sys then
            common.xlings_download(url, vscode_file)
        end
    
        return try {
            function ()
                if os.host() == "windows" then
                    print("[xlings]: runninng vscode installer, it may take some minutes...")
                    if use_winget_sys then
                        os.exec("winget install vscode --scope machine")
                    else
                        common.xlings_exec(vscode_file .. " /verysilent /suppressmsgboxes /mergetasks=!runcode")
                    end
                elseif os.host() == "linux" then
                    os.exec("sudo dpkg -i " .. vscode_file)
                elseif os.host() == "macosx" then
                    -- TODO: install vscode on macosx
                end
    
                return true
            end, catch {
                function (e)
                    os.tryrm(vscode_file)
                    return false
                end
            }
        }
    end
    

    二、递归安装依赖 - 复用&依赖图

    通过上面的接口规范化后, 实现软件依赖的自动递归安装和复用就相对简单了。只需要再增加一个用于描述依赖的接口

    function deps() -- pnpm
        return {
            windows = {
                "npm"
            },
            linux = {
                "npm"
            },
            macosx = {
                "npm" 
            }
        }
    end
    

    以pnpm的实现为例, 只需要通过依赖描述添加npm, 而不需要关心npm是否安装。当执行pnpm安装的时候会自动的递归检查依赖并安装。从单个软件的依赖链来看像一个不严谨的树形结构, 如果绘制所有软件和依赖会是一个依赖图, 并且节点是可以复用的 -- 软件安装复用

    294e3f7e-3dd6-42a8-b75b-e87a27688abf-image.png

    三、项目依赖管理 - 快速搭建项目开发环境

    很多人在拿到一个不怎么熟悉的项目的时候, 往往要成功的去构建或运行这个项目要花不少时间去解决这个软件或库的依赖问题。所以xlings有了基础软件的安装功能, 就自然而然的想到当把一个项目从github上clone下来的时候能不能通过一行命令就自动配置好开发这个项目所需要的环境

    在有上面的基础后, 就可以通过一个简单的依赖描述文件来描述一个项目依赖。xlings只需要通过加载这个依赖文件, 然后通过解析出依赖项, 按照递归的方式逐个安装,就可以实现一键配置好一个项目的开发环境。

    config.xlings配置文件示例

    xname = "ProjectName"
    xdeps = {
        rust = "",
        python = "3.12",
        vs = "2022",
        nodejs = "",
        vscode = "",
        ...
        -- postprocess cmds
        xppcmds = {
            "cmd1",
            "cmd2",
        }
    }
    

    在配置文件中通过xdeps来描述项目的直接依赖, 并且可以通过其中的xppcmds项来自定义安装项目依赖后的后处理命令

    四、统一的软件版本管理

    目前xlings的下一步是期望能实现基于场景记忆的版本管理。例如当在一个特定的项目文件夹下 会使用不同的软件版本, 只不过这个还在规划中...

    Other

    • xlings论坛
    • xlings开源仓库

  • 项目想法: mcpp-start: 完全0基础的现代C++社区教程项目 - 想法讨论
    sunrisepeakS sunrisepeak

    项目难度/属性

    • 0基础入门级教程
    • d2mcpp 前置教程 / 消除上手难度

    面向人群

    • 编程初学者 / C++编程初学者/爱好者

    目标(初步

    • 了解C++发展/背景及相关行业
    • 熟悉基础的编程概念和思想, 以及对应在C++中的实现和具体形式
    • C++相关工具链及环境
    • 了解/实现一个最小C++工程(构建工具, 项目结构, 外部库引用, 测试...

    如果你是一个C++初学者, 对上手d2mcpp项目, 感觉有些吃力, 可以反馈一些关于对入门级教程项目的一些想法

    • 例如: 你期望一个入门级的C++教程项目, 有哪些方面/性质, 能让自己更容易学习和上手?

    欢迎大家评论区交流讨论, 来帮助我们调整和优化项目的开发和设计...


  • 开源的好处与坏处分析总结
    sunrisepeakS sunrisepeak

    @Littlefean 可以搞赞助 vue 好像就这么发展的。但是mit使用好像并不需要手动授权好像


  • 视频链接展开测试
    sunrisepeakS sunrisepeak

    https://github.com/d2learn/xlings


  • 项目想法: mcpp-start: 完全0基础的现代C++社区教程项目 - 想法讨论
    sunrisepeakS sunrisepeak

    @Yozi 在 项目想法: mcpp-start: 完全0基础的现代C++社区教程项目 - 想法讨论 中说:

    比如一个小型游戏:我自己学 Rust 时就拿“穿越火线”当主题,用游戏机制去类比代码概念——背包像数组/容器、武器像结构体、状态切换像枚举/状态机……会特别好理解

    这是一个好的建议, 用一个具体可感知的目标/项目, 然后把项目拆解 和 基础知识对应 可能是一个比较好的切人点

    只不过, 可能项目要选一个简单一点的 (或许实现一个简单的Agent例子不错), 穿越火线 这种对应应该是有一些编程基础, 然后需要做个项目, 把技能和应用建立联系, 感觉和我们现在在策划的 模块化实现 Mini STL 标准类似

    对于初学者 或 几乎没有接触过编程的同学

    • 兴趣 & 结果可感知
    • 发展及行业应用
    • 编程概念 & C++中对应的实现

    感觉可能 一半代码 + 一半C++相关的人文 才能坚持下去


  • 如何设计一套基于图论的 项目进度管理功能
    sunrisepeakS sunrisepeak

    @Littlefean 在 如何设计一套基于图论的 项目进度管理功能 中说:

    可以估算完成整个流程的最小时间,最大时间,平均时间。

    可以高亮关键路径


  • 视频链接展开测试
    sunrisepeakS sunrisepeak

    https://www.youtube.com/embed/fcbqFNC4DDQ?si=13FFNMV1wRzi-KF1


  • mcpp-sytle-ref: 现代C++编码/项目风格参考 | Modern/Module C++ Style Reference
    sunrisepeakS sunrisepeak

    写了一个现代C++模块化的编码/项目风格参考文档, 附有项目/代码示例, 欢迎交流


    简介

    cd01c9a0-0731-4679-a0e8-ba2a52293edc-image.png

    目录

    81b1e6f9-deb4-4fa4-8bd1-23a9233007d2-image.png


    仓库地址: https://github.com/mcpp-community/mcpp-style-ref


  • 使用AI代理游玩所有任天堂NES游戏(红白机)详细教程----基于gym-retro、pygame、stable-baselines3
    sunrisepeakS sunrisepeak

    @tiansongyu 在 使用AI代理游玩所有任天堂NES游戏(红白机)详细教程----基于gym-retro、pygame、stable-baselines3 中说:

    示例图片 2

    这个中间的游戏 很经典的对站游戏。里面的 能发地波的忍者 和 哪个龙的 大鹏展翅 记忆深刻


  • 如何使用ImGui中的DrawList制动一个动画控件? - Loading动画控件
    sunrisepeakS sunrisepeak

    基本介绍

    控件效果

    一个滑动块来回运动的加载动画控件

    hanim-loading.gif

    控件接口

    static void Loading(
        const char *text, HVec2 pos, HVec2 wh,
        unsigned int frameNums = 120,
        ImVec4 color = ImVec4(0.9, 0.9, 0.9, 0.5),
        ImVec4 background = ImVec4(0.2, 0.6, 0.9, 1)
    )
    
    • text: 控件文本
    • pos: 控件(左上角)位置
    • wh: 控件的宽和高
    • frameNums: 控件滑动块移动动画单趟的帧数
    • color: 滑动块的颜色
    • background: 控件的底色/背景色

    控件元素与动画

    基本元素

    • 一个矩形背景
    • 一个文本
    • 一个与背景等高的滑动块

    动画

    • 往返运动 的位移动画

    设计与实现

    基本元素

    矩形背景

    // Canvas()指向当前窗口区域
    // draw bg
    Canvas().addRectFilled(pos, pos + wh, ImColor(background));
    

    使用pos作为左上顶点, pos + wh 作为右下顶点, background做为填充色绘制背景矩形

    文本

    // draw text
    ImVec2 textSize = ImGui::CalcTextSize(text);
    auto textPos = pos + HVec2{(wh.x - textSize.x) / 2, (wh.y - textSize.y) / 2};
    ImGui::SetCursorPosX(textPos.x);
    ImGui::SetCursorPosY(textPos.y);
    ImGui::Text(text);
    

    使用ImGui::CalcTextSize获取文本的大小(包围盒的W和H), 用控件(背景矩形)的wh计算出文本的相对坐标, 再加上控件坐标pos, 得到最终的文本坐标textPos

    image.png

    获取文本坐标后, 使用ImGui::SetCursorPosX 和 ImGui::SetCursorPosY 设置文本控件坐标, 再使用ImGui::Text进行显示(绘制)

    滑动块

    float blockWidth = wh.x * 0.2;
    //....
    Canvas().addRectFilled(pos, pos + HVec2{blockWidth, wh.y}, ImColor(color));
    

    它和背景一样使用addRectFilled绘制一个与背景矩形等高,且宽度为0.2倍(blockWidth)的小的填充矩形, 但是这里滑动块的pos需要动态更新, 下面将介绍动态更新方法。

    位移动画与滑动块

    auto anim = HEngine::AManager::registerAnimate<hanim::Move>(
        pos, pos + HVec2{wh.x - blockWidth, 0},
        HAnimate::Config {
            .playType = hanim::HAnimate::PlayType::RT,
            .frameNums = frameNums
        }
    );
    

    使用HEngine::AManager::registerAnimate注册一个移动动画, 从pos 到 pos + HVec2{wh.x - blockWidth, 0}; 高度保持不变, 水平移动距离为控件的宽减去滑动块的宽度。

    image (2).png

    同时把动画的播放类型配置为PlayType::RT,实现目标对象的往返运动

    if (auto animPtr = anim.lock()) {
        HEngine::PlayFrame(
            *animPtr,
            [ & ](int type, const hanim::IAFrame &frame) {
                auto pos = HVec2{frame.data[0], frame.data[1]};
                Canvas().addRectFilled(pos, pos + HVec2{blockWidth, wh.y}, ImColor(color));
            }
        );
    }
    

    这里使用HEngine::PlayFrame把动画和滑动块进行结合, 生成按帧播放的动画

    其中, *animPtr 为前面创建的移动动画, [ & ](int type, const hanim::IAFrame &frame) {...} 为具体要渲染的对象, 根据每一帧到lambda表达式的插值动画数据实现动态的更新滑动块的坐标, 进而形成滑动块往返运动的效果

    综合上面的代码, 就可以得到一个简单动画控件Loading的实现了


    示例代码: https://github.com/Sunrisepeak/Hanim/blob/main/old_project/ImGui.hanim.hpp


  • [Features]: 工具汇总页(分类 + 图标 + 简介): 把常用的工具进行汇总, 添加 在线工具页面
    sunrisepeakS sunrisepeak

    @Littlefean 在 [Features]: 工具汇总页(分类 + 图标 + 简介): 把常用的工具进行汇总, 添加 在线工具页面 中说:

    https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type Something
    大型字符画编辑器,可以用于控制台上输出一个超大英文单词欢迎信息

    这个不错 之前都是让 gpt来绘制 大的字母

    1a30d104-1c2c-4b28-83e7-87e2a1809a3e-image.png


  • 如何使用ImGui中的DrawList制动一个动画控件? - Loading动画控件
    sunrisepeakS sunrisepeak

    @sky-littlestar

    https://github.com/Sunrisepeak/Hanim/blob/main/old_project/ImGui.hanim.hpp 这个里有具体实现

    动画数据是用相对坐标生成的(假设开始是(0, 0)), 渲染的时候根据父窗口做平移


  • 论坛指南 - 一个以 [知识/技术、项目、公开课、创意想法等主题 + 开源理念为导向] 的社区论坛
    sunrisepeakS sunrisepeak

    English


    简介及背景

    一个以 [知识/技术、项目、公开课、创意想法等主题 + 开源理念为导向] 的社区论坛

    为什么搭建这样的论坛?

    • 1 现在很多平台都在往大而全和泛娱乐的方向去发展, 导致内容量巨增加, 但同时特定主题的内容密度也在下降
    • 2 中文平台里和开源相关的论坛相对比较少, 内容零散的分布在各个平台, 缺乏共同的交流分享平台
    • 3 提供一个关于 开源理念 | 开源协议 | 开源项目 | 开源社区 | 开源与商业 | 开源的可持续发展 等相关话题交流探讨的平台

    主要版块和主题

    综合讨论版块

    • 暂时没有相关话题版块的内容贴一般发布到这个版块

    04473257-cc22-456b-b3e9-cfeed513a14a-image.png

    公开课版块

    • 发布各种公开课相关的内容及讨论
    • 课程/教程项目的开发者, 创建对应的讨论版块

    6ae992b8-d831-4a8d-8bbd-e00b4cb4b067-image.png

    开源版块

    • 开源软件 | 开源社区 | 开源理念 | 开源与商业 | 开源可持续发展 等相关话题的交流讨论
    • 开源项目开发者, 创建对应项目的讨论版块

    cf3aa71e-2fda-44cf-b016-6cea0876bb51-image.png

    d2learn开源

    • d2learn社区/开源组做的相关开源内容的探索

    04970ff0-56fb-4f7b-8f2f-a2ce42747315-image.png

    论坛反馈&社区共建

    • 反馈论坛相关问题及建议
    • 论坛的可持续发展等话题的交流探讨

    ca1f43d9-162a-4a5d-9e3a-1dc7878f926a-image.png


    功能性角度

    • 开源爱好者进行交流讨论的平台
    • 开源项目/公开课及教程开发者们, 创建项目的讨论/交流版块
    • 开源本身相关话题(例: 开源项目的可持续发展)交流和探讨的平台
    • 其他

    论坛理念和限制

    理念和导向

    • 专注于技术、知识、创意和开源领域,避免泛娱乐化
    • 专业向的内容和偏理性的讨论, 避免刻意的情绪化内容

    论坛行为规范

    鼓励的行为

    • 使用包容性的语言
    • 尊重不同的观点和经历
    • 优雅地接受建设性批评

    禁止/限制

    • 挑衅、侮辱性/贬损性评论及人身攻击等

    注册及版块创建

    注册方式

    • github: 直接使用github进行sso单点登陆
    • 邮件邀请注册: 已经注册且完成邮箱验证的用户可以在用户界面邀请其他人注册

    个人博客和子版块创建

    • 申请模板

    其他

    • https://d2learn.org
    • https://github.com/d2learn
    • 即时交流群(Q): 167535744

    注: 论坛还处于初步, 有什么好的想法和建议欢迎进行回复交流

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
d2learn forums Powered by NodeBB
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组