<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[d2learn开源]]></title><description><![CDATA[d2learn开源组 - [开源主页](https:&#x2F;&#x2F;github.com&#x2F;d2learn)]]></description><link>http://forum.d2learn.org/category/13</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 22:04:04 GMT</lastBuildDate><atom:link href="http://forum.d2learn.org/category/13.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Nov 2024 15:19:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[xlings: 跨平台一键安装功能设计与思考 - 多编程环境搭建、工具软件安装、项目依赖管理]]></title><description><![CDATA[<p dir="auto">在前段时间开源了一个开发者命令行工具<a href="https://github.com/d2learn/xlings" rel="nofollow ugc">xlings</a>, 收到了一些关注和反馈, 并且最近也对其中的<strong>一键安装功能</strong>做了进步增强。希望不仅可以帮助初学者快速的搭建编程环境, 也能用于<strong>项目开发者来管理复杂项目的开发环境依赖和一键搭建配置支持</strong></p>
<p dir="auto">下面就从 <strong>最小功能实现、递归依赖安装、项目依赖管理</strong>循序渐进的介绍一下这个功能的设计和思考</p>
<p dir="auto"><img src="/assets/uploads/files/1732634270059-e39f59bf-5006-4ee1-8d34-8f36104417f2-image.png" alt="e39f59bf-5006-4ee1-8d34-8f36104417f2-image.png" class=" img-fluid img-markdown" /></p>
<blockquote>
<p dir="auto">注:  这个软件和功能目前依然处于比较前期的探索和开发中</p>
</blockquote>
<h2>一、最小功能实现 - 接口规范</h2>
<h3>1.1 接口设计视角</h3>
<p dir="auto">对于安装一个软件或编程环境大概可以划分成3个步骤: <strong>下载 - 安装 - 配置</strong></p>
<p dir="auto"><img src="/assets/uploads/files/1732634323896-95355e31-b6bd-4402-9253-cdf3a9094bae-image.png" alt="95355e31-b6bd-4402-9253-cdf3a9094bae-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">并且为了避免重复安装和显示软件的信息, 用top-down的思想，大概核心的接口设计如下:</p>
<pre><code class="language-lua">function support()
-- ...
end

function installed()
-- ...
end

function install()
-- ...
end

function config()
-- ...
end

function info()
-- ...
end
</code></pre>
<p dir="auto">其中support接口用来标识当前系统是否支持, info接口是用于获取软件的基础信息</p>
<pre><code class="language-lua">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
</code></pre>
<h3>1.2 接口实现视角</h3>
<p dir="auto">从对于单一软件或环境接口实现视角来看, 有点类似很多项目中的一键安装/配置脚本</p>
<p dir="auto">但区别是xlings的安装实现上是<strong>符合一个接口规范</strong>的, 这样才能<strong>为后面的复用提供可能性</strong>。并且使用者可以不用关心实现细节, 通过标准接口就可以使用对应的模块。</p>
<pre><code class="language-lua">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
</code></pre>
<h2>二、递归安装依赖 - 复用&amp;依赖图</h2>
<p dir="auto">通过上面的接口规范化后, 实现软件依赖的自动递归安装和复用就相对简单了。只需要再增加一个用于描述依赖的接口</p>
<pre><code class="language-lua">function deps() -- pnpm
    return {
        windows = {
            "npm"
        },
        linux = {
            "npm"
        },
        macosx = {
            "npm" 
        }
    }
end
</code></pre>
<p dir="auto">以pnpm的实现为例, 只需要通过依赖描述添加npm, 而不需要关心npm是否安装。当执行pnpm安装的时候会自动的递归检查依赖并安装。从单个软件的依赖链来看像一个不严谨的树形结构, 如果绘制所有软件和依赖会是一个依赖图, 并且节点是可以复用的 -- <strong>软件安装复用</strong></p>
<p dir="auto"><img src="/assets/uploads/files/1732634285394-294e3f7e-3dd6-42a8-b75b-e87a27688abf-image.png" alt="294e3f7e-3dd6-42a8-b75b-e87a27688abf-image.png" class=" img-fluid img-markdown" /></p>
<h2>三、项目依赖管理 - 快速搭建项目开发环境</h2>
<p dir="auto">很多人在拿到一个不怎么熟悉的项目的时候, 往往要成功的去构建或运行这个项目要花不少时间去解决这个软件或库的依赖问题。所以xlings有了基础软件的安装功能, 就自然而然的想到当把一个项目从github上clone下来的时候能不能通过一行命令就自动配置好开发这个项目所需要的环境</p>
<p dir="auto">在有上面的基础后, 就可以通过一个简单的依赖描述文件来描述一个项目依赖。xlings只需要通过加载这个依赖文件, 然后通过解析出依赖项, 按照递归的方式逐个安装，就可以实现一键配置好一个项目的开发环境。</p>
<p dir="auto"><strong>config.xlings配置文件示例</strong></p>
<pre><code class="language-lua">xname = "ProjectName"
xdeps = {
    rust = "",
    python = "3.12",
    vs = "2022",
    nodejs = "",
    vscode = "",
    ...
    -- postprocess cmds
    xppcmds = {
        "cmd1",
        "cmd2",
    }
}
</code></pre>
<p dir="auto">在配置文件中<strong>通过xdeps来描述项目的直接依赖</strong>, 并且可以通过其中的xppcmds项来自定义安装项目依赖后的后处理命令</p>
<h2>四、统一的软件版本管理</h2>
<p dir="auto">目前xlings的下一步是期望能实现基于场景记忆的版本管理。例如当在一个特定的项目文件夹下 会使用不同的软件版本, 只不过这个还在规划中...</p>
<h2>Other</h2>
<ul>
<li><a href="https://forum.d2learn.org/category/9/xlings" rel="nofollow ugc">xlings论坛</a></li>
<li><a href="https://github.com/d2learn/xlings" rel="nofollow ugc">xlings开源仓库</a></li>
</ul>
]]></description><link>http://forum.d2learn.org/topic/48/xlings-跨平台一键安装功能设计与思考-多编程环境搭建-工具软件安装-项目依赖管理</link><guid isPermaLink="true">http://forum.d2learn.org/topic/48/xlings-跨平台一键安装功能设计与思考-多编程环境搭建-工具软件安装-项目依赖管理</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Tue, 26 Nov 2024 15:19:40 GMT</pubDate></item><item><title><![CDATA[xlings: 一个用于编程开发、学习和课程搭建的开发者工具 ️]]></title><description><![CDATA[<h2>0.背景</h2>
<p dir="auto"><a href="https://d2learn.org/xlings" rel="nofollow ugc"><strong>xlings</strong></a>最初是受[Rust社区的rustlings、国内外知名公开课的形式(mit6.1810/d2l/rcore...)]的启发, 加上从学习者和内容创作者(教程开发者)两个方向的思考下。在xmake构建工具的基础上(类似插件的形式)开发的一个项目 - [支持Windows和Linux] - 本文就简单聊一聊 学习者功能介绍、创作者功能介绍、现状和发展</p>
<p dir="auto"><img src="/assets/uploads/files/1731932261664-d2learn-xlings.0.png" alt="d2learn-xlings.0.png" class=" img-fluid img-markdown" /></p>
<h2>1.通用功能 - 编程学习</h2>
<h3>软件安装和环境搭建</h3>
<p dir="auto">xlings中集成了一些常用的环境/软件的<strong>一键安装和配置</strong>, 并且支持扩展。这个功能可以帮助编程初学者方便的配置好开发环境和安装相关的软件, 同时也能帮助资深开发者避免常用环境的重复搭建的时间。通过install命令可以查看支持的软件和环境</p>
<p dir="auto"><img src="/assets/uploads/files/1731932317098-d2learn-xlings.1.png" alt="d2learn-xlings.1.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">在install命令后面加上对应的环境和软件xlings就能自动下载相关依赖然后安装并配置</p>
<p dir="auto">例如安装Python环境</p>
<pre><code class="language-bash">xlings install python
</code></pre>
<p dir="auto">安装vscode</p>
<pre><code class="language-bash">xlings install vscode
</code></pre>
<h3>多编程语言支持和实时编译运行</h3>
<p dir="auto">xlings中的run功能可以运行一个代码文件, 并且自动检测代码类型和然后使用相关编译器/解释器运行代码。如果没有相关环境xlings会自动安装相关的依赖，后期可能增强这个功能, 例如: 把Python运行中缺少库也自动进行安装</p>
<p dir="auto">运行C++代码</p>
<pre><code class="language-bash">xlings run main.cpp
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1731932348767-d2learn-xlings.2-resized.png" alt="d2learn-xlings.2.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">运行C和Python代码也是类似run命令后加对应的代码文件</p>
<pre><code class="language-bash">xlings run main.c
</code></pre>
<pre><code class="language-bash">xlings run main.py
</code></pre>
<p dir="auto">在这个基础上还有一个动态编译运行的功能, 可以避免多次"修改代码再运行验证"这个重复过程。xlings可以实时的检测代码的变化, 在你修改代码后会自动的重新编译再运行</p>
<h2>AI代码提示</h2>
<p dir="auto">xlings再代码编译运行的时候接入了大模型错误分析和自定义后端大模型的功能。如果编译程序报错的时候, 大模型可以对报错信息进行分析然后给出对应的提示</p>
<p dir="auto"><img src="/assets/uploads/files/1731932358164-d2learn-xlings.3.png" alt="d2learn-xlings.3.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">从上面AI给出的提示可以看出来, 他来带了一个调皮可爱的风格。这是应该我们可以通过配置文件给大模型设定角色和风格, 如果你把他设置成一个代码练习两年半的抽象艺术家, 那么他就会用抽象风格给你提示。如果你把他设置成一个严肃且脾气暴躁的性格，当代码出错的时他甚至可能会批评你。这个功能可以让编程学习的时候多一点乐趣, 少一点枯燥乏味</p>
<p dir="auto">本地大模型配置文件示例 - config.llm.xlings</p>
<pre><code class="language-lua">xlings_llm_id = "tongyi"
xlings_llm_key = "sk-xxx"
xlings_llm_system_bg = &lsqb;&lsqb;
背景: 你是一个代码专家
任务: 对编译器/解释器输出的错误进行相关内容的提示和建议
输出要求: 用时而可爱、时而傲娇、时而生气的方式回答, 并且每次回答不超过100字
示例:
    输入: error：未定义变量。
    输出: 哎呀，小变量迷路啦！检查一下变量名是不是写错了呢?🎈
    输入: 错误：未定义变量。
    输出: 哼，变量都找不到！快去检查你的拼写吧，本天才才不会轻易原谅呢！🌟
    输入: Hello World
    输出: 哇哦, 程序成功运行了, 点赞!
&rsqb;&rsqb;
</code></pre>
<h2>2.课程/教程搭建</h2>
<h3>项目基础结构和模板生成</h3>
<p dir="auto">xlings提供了一个init命令, 结合配置文件可以用来生成一个类[Book + Code + Video + X]结构的教程项目。例如,再本地文件夹中创建一个xlings的配置文件</p>
<p dir="auto"><strong>config.xlings</strong></p>
<pre><code class="language-lua">xlings_name = "learn-stl"
xlings_lang = "cpp"
</code></pre>
<p dir="auto">其中xlings_name是练习代码的名字, xlings_lang是项目使用的语言。然后在配置文件所在的目录运行init命令就可以生成一个基础项目结构</p>
<pre><code class="language-bash">speak@speak-pc:~/test/xlings/my_project$ xlings init
-mdbook
mdbook v0.4.40
2024-10-29 01:09:37 [INFO] (mdbook::book::init): Creating a new book with stub content

All done, no errors...
2024-10-29 01:09:37 [INFO] (mdbook::book): Book building has started
2024-10-29 01:09:37 [WARN] (mdbook::preprocess::cmd): The command wasn't found, is the "foo" preprocessor installed?
2024-10-29 01:09:37 [WARN] (mdbook::preprocess::cmd): 	Command: mdbook-foo
2024-10-29 01:09:37 [INFO] (mdbook::book): Running the html backend
2024-10-29 01:09:37 [INFO] (mdbook): Opening web browser
[xlings]: ../learn-stl/exercises/cpplings.hpp - ok
[xlings]: ../learn-stl/tests/cpplings.cpp - ok
[xlings]: ../learn-stl/xmake.lua - ok
warning: includes("../learn-stl") cannot find any files!
speak@speak-pc:~/test/xlings/my_project$ 
</code></pre>
<p dir="auto">项目结构</p>
<pre><code class="language-bash">.
├── book
│   ├── book.toml
│   └── src
│       ├── chapter_1.md
│       └── SUMMARY.md
├── config.xlings
└── learn-stl
    ├── exercises
    │   └── cpplings.hpp
    ├── tests
    │   └── cpplings.cpp
    └── xmake.lua
</code></pre>
<p dir="auto"><strong>book目录:</strong> 是用于存放项目的markdown文档, 使用xlings book(调用mdbook)可以把文档在浏览器打开, 也可以部署到Github上作为在线的电子书</p>
<p dir="auto"><strong>learn-stl目录:</strong> 用于存放项目对应的练习代码, 可以被xlings加载识别用于练习代码自动化检测</p>
<p dir="auto"><strong>config.xlings:</strong> 项目的配置文件, 可以在这里添加项目依赖这样xlings能自动安装项目所需要的环境</p>
<h3>练习代码自动化检测</h3>
<p dir="auto">xlings把练习代码的自动化检测功能从单一教程项目抽象了。这样只要项目按照一定的格式设计练习代码都可以被xlings识别实现自动定位代码文件、实时检测当前练习的状态, 以及练习完成时可以自动跳转到下一个练习等功能。通过运行在对应项目中运行<code>xlings checker</code>或<code>xlings xlings_name</code>就可以加载代码开启练习代码的自动化检测, 例如<a href="https://github.com/d2learn/d2ds" rel="nofollow ugc">d2ds动手写数据结构</a>的项目</p>
<pre><code class="language-bash">xlings dslings # dslings是d2ds项目配置文件中设置的别名
</code></pre>
<p dir="auto">运行效果</p>
<p dir="auto"><img src="https://pic2.zhimg.com/v2-54e3cdf2d23f32edf02d3849a20baa21_1440w.jpg" alt="" class=" img-fluid img-markdown" /></p>
<p dir="auto">最上面显示练习进度信息和当前练习的状态, 后面就是编译信息以及AI提示。自动检测程序会"实时检测"这个练习, 当你成功完整并通过检测, xlings就会自动进入下一个练习并打开对应的代码文件</p>
<h3>drepo项目管理</h3>
<p dir="auto">作为一个课程/教程搭建工具, 为了方便课程资源的管理以及学习者获取课程/教程资源。xlings还开发了一个可以发布项目的模块, 这样就能很方便的使用xlings获取对应项目的资源</p>
<pre><code class="language-bash">speak@speak-pc:~/test$ xlings drepo # 可以列出已经发布的项目

	drepo lists

--- d2python ---
name	: d2python
tags	: python
url	: https://github.com/d2learn/d2python
git	: git@github.com:d2learn/d2python.git
profile	: 动手学d2python项目
--- d2x ---
name	: d2x
tags	: template
url	: https://github.com/d2learn
git	: git@github.com:d2learn/xlings.git
profile	: drepo的模板配置文件
--- xlings ---
name	: xlings
tags	: tools, build, auto-exercises, pkg-manager
url	: https://github.com/d2learn/xlings
git	: git@github.com:d2learn/xlings.git
profile	: 技术、实验、练习、自学类项目, 快速构建和管理工具
--- d2ds ---
name	: d2ds
tags	: c++, data-structures
url	: https://github.com/d2learn/d2ds
git	: git@github.com:d2learn/d2ds.git
profile	: 强调动手实践的数据结构学习项目，其中包含在线书籍、公开课、练习代码等子项目
--- d2cpp ---
name	: d2cpp
tags	: c++
url	: https://github.com/d2learn/d2cpp
git	: git@github.com:d2learn/d2cpp.git
profile	: 动手学C++项目

	run xlings drepo [drepo_name] to download


</code></pre>
<p dir="auto">在<code>xlings drepo</code>后面加上项目名就可以下载对应的项目。例如下载d2ds项目</p>
<pre><code class="language-bash">xlings drepo d2ds
</code></pre>
<h2>3.现状和发展</h2>
<p dir="auto">目前项目还是属于比较早期的阶段, 有了核心的功能及想法, 但部分功能目前的实现方案还是比较简单或者说是简陋的。例如，像drepo模块, 当前基本还是依赖与git服务, 且没有在线可以预览项目的站点。</p>
<p dir="auto">发展方向上, 基本算比较清晰的。两个视角: 学习者 和 内容创作者(课程/教程), 从两个方面做一些实际&amp;实用的功能最终达到一个相互作用发展的效果</p>
<h2>4.相关链接</h2>
<p dir="auto"><a href="https://github.com/d2learn/xlings" rel="nofollow ugc">xlings开源</a></p>
<p dir="auto"><a href="https://d2learn.org" rel="nofollow ugc">d2learn官网</a></p>
<p dir="auto"><a href="https://forum.d2learn.org" rel="nofollow ugc">d2learn论坛</a></p>
]]></description><link>http://forum.d2learn.org/topic/37/xlings-一个用于编程开发-学习和课程搭建的开发者工具</link><guid isPermaLink="true">http://forum.d2learn.org/topic/37/xlings-一个用于编程开发-学习和课程搭建的开发者工具</guid><dc:creator><![CDATA[d2learn-dev]]></dc:creator><pubDate>Mon, 18 Nov 2024 12:26:00 GMT</pubDate></item><item><title><![CDATA[D2Learn Opensource - 简介]]></title><description><![CDATA[<h1>D2Learn Opensource</h1>
<p dir="auto">一个技术知识分享、学习、交流的开源社区。社区以<strong>d2learn动手学</strong>(从实践出发)为理念和<strong>BOOK + CODE + VIDEO + X</strong>的结构, 进行各种技术教程、代码实验、课程教学等相关项目的开发。并对这套框架进行抽象和汇总形成了基础工具<a href="https://github.com/d2learn/xlings" rel="nofollow ugc"><strong>xlings</strong></a>, 来支撑<strong>类d2x项目</strong>的快速搭建和管理, 提供:<strong>练习代码自动检测、AI智能提示引导、常用技术软件/工具便捷下载、项目模板、项目包管理、Markdown书籍</strong>等通用功能</p>
<h3><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f415.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--dog2" style="height:23px;width:auto;vertical-align:middle" title=":dog2:" alt="🐕" /> 近期活跃项目</h3>
<ul>
<li><a href="https://github.com/d2learn/xlings" rel="nofollow ugc">xlings</a> : 一个用于技术学习、软件安装、教程教学类项目搭建和管理的基础工具</li>
<li><a>d2ds</a> : 动手学数据结构项目</li>
<li><a href="https://github.com/d2learn/d2python" rel="nofollow ugc">d2python</a> : 动手学Python项目</li>
</ul>
<h3><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f465.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--busts_in_silhouette" style="height:23px;width:auto;vertical-align:middle" title=":busts_in_silhouette:" alt="👥" /> 参与社区讨论和贡献</h3>
<p dir="auto"><strong>论坛/交流</strong></p>
<ul>
<li>即时交流群(Q): 167535744</li>
<li>各项目issues: 对应项目的问题/Bug反馈、功能请求</li>
<li><a href="https://github.com/orgs/d2learn/discussions" rel="nofollow ugc">d2learn综合社区</a>: 代码/经验分享、社区发展、想法交流等社区相关问题</li>
</ul>
<p dir="auto"><strong>参与开发和维护</strong></p>
<ul>
<li>解答社区中用户的问题</li>
<li>修复项目Bug, 完善项目文档</li>
<li>参与新功能和新模块的开发</li>
<li>创建新的<strong>类d2x</strong>项目</li>
</ul>
<blockquote>
<p dir="auto">如果你有好的项目想法, 欢迎和社区维护者进行交流讨论哦 <img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44b.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--wave" style="height:23px;width:auto;vertical-align:middle" title=":wave:" alt="👋" /></p>
</blockquote>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f393.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--mortar_board" style="height:23px;width:auto;vertical-align:middle" title=":mortar_board:" alt="🎓" /> <a href="https://d2learn.github.io/courses" rel="nofollow ugc">课程主页</a> - <img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4c4.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--page_facing_up" style="height:23px;width:auto;vertical-align:middle" title=":page_facing_up:" alt="📄" /> <a href="https://d2learn.github.io/docs" rel="nofollow ugc">社区文档</a> - <img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f465.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--busts_in_silhouette" style="height:23px;width:auto;vertical-align:middle" title=":busts_in_silhouette:" alt="👥" /> <a href="https://forum.d2learn.org" rel="nofollow ugc">社区论坛</a> -  <img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f41b.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--bug" style="height:23px;width:auto;vertical-align:middle" title=":bug:" alt="🐛" /> <a href="https://github.com/orgs/d2learn/projects/1/views/1" rel="nofollow ugc">issues看板</a> -  <img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f680.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--rocket" style="height:23px;width:auto;vertical-align:middle" title=":rocket:" alt="🚀" /> <a href="https://github.com/orgs/d2learn/projects/2/views/1" rel="nofollow ugc">项目开发看板</a></th>
</tr>
</thead>
</table>
]]></description><link>http://forum.d2learn.org/topic/14/d2learn-opensource-简介</link><guid isPermaLink="true">http://forum.d2learn.org/topic/14/d2learn-opensource-简介</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Mon, 07 Oct 2024 06:23:43 GMT</pubDate></item></channel></rss>