<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://www.didispace.com/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <atom:link href="https://www.didispace.com/rss.xml" rel="self" type="application/rss+xml"/>
    <title>程序猿DD</title>
    <link>https://www.didispace.com/</link>
    <description>记录关于我的开发学习、实践经验、工具分享、日常思考等内容</description>
    <language>zh-CN</language>
    <pubDate>Sun, 17 Aug 2025 10:19:28 GMT</pubDate>
    <lastBuildDate>Sun, 17 Aug 2025 10:19:28 GMT</lastBuildDate>
    <generator>vuepress-plugin-feed2</generator>
    <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
    <category>技术学习</category>
    <category>独立开发日志</category>
    <category>安装大全</category>
    <category>Java</category>
    <category>前沿资讯</category>
    <category>日常记录</category>
    <category>技术科普</category>
    <category>资源推荐</category>
    <category>程序人生</category>
    <item>
      <title>博客系统更新，后续主要更新到新站点：didispace.com</title>
      <link>https://www.didispace.com/article/news.html</link>
      <guid>https://www.didispace.com/article/news.html</guid>
      <source url="https://www.didispace.com/rss.xml">博客系统更新，后续主要更新到新站点：didispace.com</source>
      <description>博客系统更新，后续主要更新到新站点：didispace.com 本站暂停更新，后续内容均在 https://didispace.com更新，欢迎收藏。</description>
      <pubDate>Sun, 17 Aug 2025 12:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 博客系统更新，后续主要更新到新站点：didispace.com</h1>
<p>本站暂停更新，后续内容均在 <a href="https://didispace.com" target="_blank" rel="noopener noreferrer">https://didispace.com</a>更新，欢迎收藏。</p>
]]></content:encoded>
    </item>
    <item>
      <title>告别微服务，迎接SCS（Self-Contained Systems）？新概念还是炒冷饭？</title>
      <link>https://www.didispace.com/article/20250616-scs.html</link>
      <guid>https://www.didispace.com/article/20250616-scs.html</guid>
      <source url="https://www.didispace.com/rss.xml">告别微服务，迎接SCS（Self-Contained Systems）？新概念还是炒冷饭？</source>
      <description>告别微服务，迎接SCS（Self-Contained Systems）？新概念还是炒冷饭？ 最近看了 Simon Martinelli 在 Spring I/O 2025 的演讲：《Say Goodbye to Microservices, Say Hello to Self-Contained Systems》，其中提到了大家在微服务实践过程中的痛点，并引出了新的解决方案：Self-Contained Systems。看到标题，DD还是挺激动的，感觉是个新鲜知识，但是进一步了解之后，又有一些其他感触，跟大家聊一聊。</description>
      <category>技术学习</category>
      <pubDate>Mon, 16 Jun 2025 01:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 告别微服务，迎接SCS（Self-Contained Systems）？新概念还是炒冷饭？</h1>
<p>最近看了 Simon Martinelli 在 Spring I/O 2025 的演讲：<a href="https://www.youtube.com/watch?v=jdxxgHcAjf8" target="_blank" rel="noopener noreferrer">《Say Goodbye to Microservices, Say Hello to Self-Contained Systems》</a>，其中提到了大家在微服务实践过程中的痛点，并引出了新的解决方案：<strong>Self-Contained Systems</strong>。看到标题，DD还是挺激动的，感觉是个新鲜知识，但是进一步了解之后，又有一些其他感触，跟大家聊一聊。</p>
<h2> 什么是 SCS（Self-Contained Systems）</h2>
<p>对于微服务，相信大家都已经不陌生了，那什么是 SCS（Self-Contained Systems）呢？</p>
<p>SCS是一种将大型系统的功能分离为许多独立协作系统的架构方法。其具备以下特点：</p>
<ul>
<li><strong>自治</strong>：每个SCS都是一个自治的Web应用程序。对于SCS的领域而言，所有数据、处理数据的逻辑以及渲染Web界面的所有代码都包含在SCS内部。一个SCS可以独立完成其主要用例，无需依赖其他系统的可用性。</li>
<li><strong>单一团队</strong>：每个SCS由一个团队负责。这并不意味着只有一个团队可以修改代码，但负责的团队对代码库的内容拥有最终决定权，例如通过合并拉取请求（pull-requests）。</li>
<li><strong>异步依赖关系</strong>：与其他SCS或第三方系统的通信尽可能采用异步方式。具体来说，其他SCS或外部系统不应在SCS自身的请求/响应周期内被同步访问。这实现了系统解耦，减少了故障影响，从而支持自治性。目标是实现时间上的解耦：即使其他SCS暂时离线，SCS也应能正常工作。即使技术层面的通信是同步的，也可以通过数据复制或请求缓冲等方式实现这一点。</li>
<li><strong>API是可选</strong>：SCS可以有一个可选的服务API。由于SCS拥有自己的Web UI，它可以直接与用户交互，而无需通过UI服务。不过，为移动客户端或其他SCS提供API可能仍然有用。</li>
<li><strong>自有数据与逻辑</strong>：每个SCS必须包含数据和逻辑。要真正实现任何有意义的功能，两者都是必需的。SCS应自行实现功能，因此必须同时包含这两部分。</li>
<li><strong>自有UI</strong>：SCS必须通过自己的UI让最终用户能够使用其功能。因此，SCS不应与其他SCS共享UI。SCS之间可能仍有相互链接，但异步集成意味着即使另一个SCS的UI不可用，当前SCS仍应能正常工作。</li>
<li><strong>无共享业务逻辑</strong>：为避免紧密耦合，SCS不应与其他SCS共享业务代码。为某个SCS创建拉取请求或使用通用库（如数据库驱动程序或OAuth客户端）可能是可行的。</li>
<li><strong>极少共享基础设施</strong>：为使SCS更健壮并改善解耦，可以最大限度地减少共享基础设施的使用。例如，共享数据库会使SCS的故障安全性和可扩展性依赖于中央数据库。不过，出于成本等考虑，为每个SCS使用具有独立模式或数据模型的共享数据库可能是一种有效的替代方案。</li>
</ul>
<h2> SCS 与 微服务的比较</h2>
<p>以下是官网的原文比较说明：</p>
<blockquote>
<p>SCS 方法与微服务有许多共同的概念，包括通过独立可部署单元来实施隔离、组织边界与架构边界的对齐、对技术选择多样性的支持，以及无集中式基础设施等理念。如果您愿意将这些视为微服务的核心，那么可以将 SCS 视为微服务的一种特殊化形式。但与许多人所认为的微服务关键属性的其他方面相比，两者存在一些重要差异：</p>
<ul>
<li>微服务的规模可能比 SCS 更小。一个 SCS 的规模可能大到足以让一个团队持续忙碌，并提供更具意义的业务价值。</li>
<li>SCS 的数量通常比微服务少。一个逻辑系统（如电商平台）可能包含 5 到 25 个 SCS（例如用于计费、订单处理等），而一个电商平台可能包含数百个微服务。</li>
<li>理想情况下，SCS 之间不应相互通信，而微服务之间的通信则是被允许的。</li>
<li>SCS 拥有用户界面（UI），而微服务可能将 UI 与逻辑分离为独立的服务。不过，某些微服务的定义也将 UI 包含在微服务中。</li>
<li>SCS 更倾向于在 UI 层进行集成，而微服务通常专注于在逻辑层进行集成（当然，某些微服务的定义也允许在 UI 层集成）。</li>
</ul>
<p>当然，SCS 也可以进一步拆分，使其由微服务组成（尤其是在业务逻辑层面）。在这种情况下，这可以视为一种特定的微架构方法。</p>
<p>SCS 显然专注于大型项目和多团队拆分，而微服务则可用于其他目的：小团队甚至单个开发者经常使用微服务，例如为了更轻松地实现持续交付、构建更健壮的系统，或对每个微服务进行独立扩展。因此，微服务的用途更为广泛，而 SCS 则专门解决大型项目的架构和组织管理问题。</p>
</blockquote>
<p>结合：<a href="https://www.youtube.com/watch?v=jdxxgHcAjf8" target="_blank" rel="noopener noreferrer">《Say Goodbye to Microservices, Say Hello to Self-Contained Systems》</a>演讲内容，做了一下整理：</p>
<table>
<thead>
<tr>
<th><strong>比较维度</strong></th>
<th><strong>微服务（Microservices）</strong></th>
<th><strong>SCS（重点中心系统）</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>拆分粒度</strong></td>
<td>单个服务粒度更小，聚焦单一功能，代码量通常较少。</td>
<td>服务规模更大，承载完整业务模块，需团队协作开发。</td>
</tr>
<tr>
<td><strong>服务数量</strong></td>
<td>系统中服务数量众多（如电商平台可能包含数百个）。</td>
<td>服务数量较少（如电商平台通常为5-25个）。</td>
</tr>
<tr>
<td><strong>通信机制</strong></td>
<td>允许服务间通过API、消息队列等直接通信。</td>
<td>理想情况下避免服务间直接通信，强调独立性。</td>
</tr>
<tr>
<td><strong>UI处理</strong></td>
<td>部分定义中UI与逻辑分离（如独立前端服务），也有定义包含UI。</td>
<td>每个SCS通常包含独立UI，形成完整业务单元。</td>
</tr>
<tr>
<td><strong>集成方式</strong></td>
<td>主要通过逻辑层（如API接口）实现服务集成。</td>
<td>更倾向于在UI层（如前端界面）进行集成。</td>
</tr>
<tr>
<td><strong>应用场景</strong></td>
<td>适用于小团队、个人开发，或追求持续交付、独立扩展的场景。</td>
<td>专注于大型项目，解决多团队协作的架构与组织管理问题。</td>
</tr>
</tbody>
</table>
<h2> 小结</h2>
<p>在总结完SCS与微服务的比较之后，我的第一感觉是SCS更像是以前我们常说的SOA，他们都有这些特点：</p>
<ul>
<li>服务规模比微服务更大</li>
<li>服务数量比微服务少</li>
<li>通信主要采用异步（企业总线）</li>
<li>有自己独立的UI，完整的业务，比如：OA系统、财务系统等专业系统</li>
<li>集成方式，比如：前端集成组件、一段JS代码等</li>
</ul>
<p>所以，个人感觉这里所说的SCS更像迎合目前微服务实践痛点的冷饭热炒？还是缺乏深入探究没有掌握其精髓？不知道您对SCS是怎么看的呢？欢迎评论区一起聊聊！</p>
<h2> 参考资料</h2>
<ul>
<li>https://www.youtube.com/watch?v=jdxxgHcAjf8</li>
<li>https://scs-architecture.org/index.html</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>撸了个免费小功能“有声书创作”：一键将小说内容拆解成配音脚本和有声书</title>
      <link>https://www.didispace.com/article/20250603-solo-transduck-audiobook.html</link>
      <guid>https://www.didispace.com/article/20250603-solo-transduck-audiobook.html</guid>
      <source url="https://www.didispace.com/rss.xml">撸了个免费小功能“有声书创作”：一键将小说内容拆解成配音脚本和有声书</source>
      <description>撸了个免费小功能“有声书创作”：一键将小说内容拆解成配音脚本和有声书 前段时间做了个播客创作的功能，有用户提出能不能弄个做有声书的，主要用来做小说的播讲。这次趁端午假期，抽空就给TransDuck撸了个新功能：有声书创作 该功能主要通过LLM对有声书内容进行解析，生成配音分角色配音脚本，然后在利用TTS根据脚本为不同的片段进行配音，实现从小说文本到有声书音频的快速创作流程。</description>
      <category>独立开发日志</category>
      <pubDate>Tue, 03 Jun 2025 08:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 撸了个免费小功能“有声书创作”：一键将小说内容拆解成配音脚本和有声书</h1>
<p>前段时间做了个播客创作的功能，有用户提出能不能弄个做有声书的，主要用来做小说的播讲。这次趁端午假期，抽空就给TransDuck撸了个新功能：<strong>有声书创作</strong></p>
<p><img src="https://static.didispace.com/images3/d898610dca09335a9ca61fc2853bb0d3.png" alt=""></p>
<p>该功能主要通过LLM对有声书内容进行解析，生成配音分角色配音脚本，然后在利用TTS根据脚本为不同的片段进行配音，实现从小说文本到有声书音频的快速创作流程。</p>
<p>下面演示下功能实现：</p>
<ol>
<li>进入“有声书创作”功能，可以看到一个输入文本内容的界面</li>
</ol>
<p><img src="https://static.didispace.com/images3/19cac099d042b0292f1fb8707c40a68c.png" alt=""></p>
<ol start="2">
<li>如果已经有要创作的内容，那么直接可以复制一段进来。这里我直接复制了一段由DeepSeek创作的恐怖小说，然后点击“生成脚本”按钮，等待脚本生成完成。可以看到如下界面：</li>
</ol>
<p><img src="https://static.didispace.com/images3/982a1d0fba40ffb31e1bc405562dc3ae.png" alt=""></p>
<p>一共三个部份：</p>
<ul>
<li>左侧为输入素材内容</li>
<li>中间是生成的标题、摘要（传播时候可以用来发到社交媒体）、配音脚本（根据不同角色拆分了朗读内容）</li>
<li>右侧配置设置，用户可以根据自己的喜好对配音脚本中的不同角色选择不同音色来进行配音</li>
</ul>
<p>功能相对来说不是太复杂，有这个需求的小伙伴可以直接访问<a href="https://transduck.com/" target="_blank" rel="noopener noreferrer">TransDuck</a>免费使用，有啥问题欢迎留言交流。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/d898610dca09335a9ca61fc2853bb0d3.png" type="image/png"/>
    </item>
    <item>
      <title>给免费的声音克隆和AI配音增加了方言支持和语气控制</title>
      <link>https://www.didispace.com/article/20250604-solo-transduck-voice-clone.html</link>
      <guid>https://www.didispace.com/article/20250604-solo-transduck-voice-clone.html</guid>
      <source url="https://www.didispace.com/rss.xml">给免费的声音克隆和AI配音增加了方言支持和语气控制</source>
      <description>给免费的声音克隆和AI配音增加了方言支持和语气控制 最近TransDuck的免费声音克隆和AI配音功能被大家用爆啦！感谢各位自来水疯狂安利！！ DD这里也是收到好多用户提的宝贵建议！所以，连夜肝了波更新！ 这次重点更新使用克隆音色进行AI配音时候的风格控制，目前支持以下三类控制： 中文方言：我们新增了对多种中文方言口音配音的支持，包括粤语、四川话、上海话、郑州话、长沙话、天津话、南京话、武汉话等。无论你是想为视频增添一些地方特色，还是需要用方言来表达特定的情感和场景，TransDuck 都能满足你。 说话风格：现在可以使用各种不同语气来配音啦，比如神秘、凶猛、恐惧、好奇、伤心、开心、惊讶等。通过这些丰富的语气，你能够让配音更加生动形象，为你的作品赋予更丰富的情感色彩，更好地吸引观众的注意力。 角色模仿：我们还实现了模仿一些特定角色来进行配音的功能，像机器人、忧郁的诗人、威严的古代将军等。这一功能可以帮助你轻松营造出不同的氛围和情境，让你的视频更具创意和个性。</description>
      <category>独立开发日志</category>
      <pubDate>Wed, 04 Jun 2025 01:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 给免费的声音克隆和AI配音增加了方言支持和语气控制</h1>
<p>最近<a href="https://transduck.com/" target="_blank" rel="noopener noreferrer">TransDuck的免费声音克隆和AI配音</a>功能被大家用爆啦！感谢各位自来水疯狂安利！！</p>
<p>DD这里也是收到好多用户提的宝贵建议！所以，连夜肝了波更新！</p>
<p>这次重点更新使用克隆音色进行AI配音时候的风格控制，目前支持以下三类控制：</p>
<ul>
<li>中文方言：我们新增了对多种中文方言口音配音的支持，包括粤语、四川话、上海话、郑州话、长沙话、天津话、南京话、武汉话等。无论你是想为视频增添一些地方特色，还是需要用方言来表达特定的情感和场景，TransDuck 都能满足你。</li>
<li>说话风格：现在可以使用各种不同语气来配音啦，比如神秘、凶猛、恐惧、好奇、伤心、开心、惊讶等。通过这些丰富的语气，你能够让配音更加生动形象，为你的作品赋予更丰富的情感色彩，更好地吸引观众的注意力。</li>
<li>角色模仿：我们还实现了模仿一些特定角色来进行配音的功能，像机器人、忧郁的诗人、威严的古代将军等。这一功能可以帮助你轻松营造出不同的氛围和情境，让你的视频更具创意和个性。</li>
</ul>
<p><img src="https://static.didispace.com/images3/5ce82eed3bacdc5b66334bb7b3e5a999.png" alt="声音克隆-细节控制"></p>
<p>有需要的小伙伴赶紧去<a href="https://transduck.com/" target="_blank" rel="noopener noreferrer">TransDuck</a>试试新功能，还有其他需求，还可以继续提功能建议～有啥问题也可以留言交流。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/5ce82eed3bacdc5b66334bb7b3e5a999.png" type="image/png"/>
    </item>
    <item>
      <title>使用SDKMAN安装Maven和Gradle</title>
      <link>https://www.didispace.com/installation-guide/dev-env/sdkman-maven-gradle.html</link>
      <guid>https://www.didispace.com/installation-guide/dev-env/sdkman-maven-gradle.html</guid>
      <source url="https://www.didispace.com/rss.xml">使用SDKMAN安装Maven和Gradle</source>
      <description>使用SDKMAN安装Maven和Gradle 之前在使用SDKMAN安装和管理多个JDK版本一文章介绍了如何用SDKMAN管理Java，对于Java开发者来说，还有一个非常重要的构建项目工具，那就是Maven。 之前因为一直用 IntelliJ IDEA 开发，Maven之类的构建工具一直用默认内置的，所以很久没手工安装了。 最近因为用Trea，在打开Java项目的时候，提示需要手工配置Maven，所以赶紧安装了一下，发现现在SDKMAN就可以快速安装。 所以这里记录一下，顺便完善下这个系列对于Java开发者的环境配置，具体如何安装Maven和Gradle。</description>
      <category>安装大全</category>
      <pubDate>Fri, 23 May 2025 02:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 使用SDKMAN安装Maven和Gradle</h1>
<p>之前在<a href="sdkman">使用SDKMAN安装和管理多个JDK版本</a>一文章介绍了如何用SDKMAN管理Java，对于Java开发者来说，还有一个非常重要的构建项目工具，那就是Maven。</p>
<p>之前因为一直用 IntelliJ IDEA 开发，Maven之类的构建工具一直用默认内置的，所以很久没手工安装了。</p>
<p>最近因为用Trea，在打开Java项目的时候，提示需要手工配置Maven，所以赶紧安装了一下，发现现在SDKMAN就可以快速安装。</p>
<p>所以这里记录一下，顺便完善下这个系列对于Java开发者的环境配置，具体如何安装Maven和Gradle。</p>
<blockquote>
<p>如果还没安装SDKMAN，那么先通过下面的命令安装sdkman:</p>
</blockquote>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><h2> 安装Maven</h2>
<p>安装超级简单，只需要执行下面的命令：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h2> 安装Gradle</h2>
<p>安装Gradle也很简单，只需要执行下面的命令：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>轻松完成！</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 ActiveJ ？</title>
      <link>https://www.didispace.com/article/20250521-activej.html</link>
      <guid>https://www.didispace.com/article/20250521-activej.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 ActiveJ ？</source>
      <description>什么是 ActiveJ ？ 1. 简介 ActiveJ 是一个轻量级的 Java 框架，适用于高性能应用。我们可以用它来创建启动速度快、内存占用小的极简和模块化应用。它提供了异步 I/O、依赖注入、高效序列化和响应式编程支持等特性。 在本教程中，我们将讨论 ActiveJ 的主要特性，包括其 Inspect 模块、强大的事件循环和高级网络功能。 2. 注入</description>
      <category>Java</category>
      <pubDate>Wed, 21 May 2025 08:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 ActiveJ ？</h1>
<h2> 1. 简介</h2>
<p><a href="https://activej.io/" target="_blank" rel="noopener noreferrer">ActiveJ</a> 是一个轻量级的 Java 框架，适用于高性能应用。我们可以用它来创建启动速度快、内存占用小的极简和模块化应用。它提供了异步 I/O、依赖注入、高效序列化和响应式编程支持等特性。</p>
<p>在本教程中，我们将讨论 ActiveJ 的主要特性，包括其 Inspect 模块、强大的事件循环和高级网络功能。</p>
<h2> 2. 注入</h2>
<p>我们从 <a href="https://activej.io/inject" target="_blank" rel="noopener noreferrer">ActiveJ Inject</a> 开始。<strong>它是一个轻量且性能优化的依赖注入库，可用于设置 bean 之间的依赖关系</strong>。让我们看看如何使用它。</p>
<h3> 2.1. 依赖</h3>
<p>让我们将 Active Inject <a href="https://mvnrepository.com/artifact/io.activej/activej-inject" target="_blank" rel="noopener noreferrer">依赖</a> 添加到项目中：</p>
<div class="language-xml line-numbers-mode" data-ext="xml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3> 2.2. 使用模块进行依赖注入</h3>
<p>让我们创建一个仓库 bean：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在我们的 <code>PersonRepository</code> 中，只指定了对 <code>DataSource</code> 实例的依赖。现在让我们创建一个服务类：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在 <code>PersonService</code> 类中，我们指定了对 <code>PersonRepository</code> 的依赖。</p>
<p>接下来，让我们创建一个 <code>PersonModule</code> 类，在其中配置所有 bean 之间的关系：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>我们继承了 <a href="https://github.com/activej/activej/blob/007785780e15d3f4938c14583a81185202566c44/core-inject/src/main/java/io/activej/inject/module/AbstractModule.java" target="_blank" rel="noopener noreferrer">AbstractModule</a> 类。此外，我们提供了 <code>PersonService</code>、<code>PersonRepository</code> 和 <code>DataSource</code> 的 bean，并配置了它们之间的关系。</strong></p>
<p>让我们测试依赖注入行为：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们创建了<code>PersonModule</code>类的实例。<strong>然后，使用<code>Injector</code>获取了<code>PersonService</code>实例。可以看到，所有依赖都已被注入。</strong></p>
<h2> 3. 异步 I/O</h2>
<p>**ActiveJ Async I/O 提供了高效编写异步流程的组件。**我们将通过 <a href="https://activej.io/async-io/promise" target="_blank" rel="noopener noreferrer">Promises</a> 和 <a href="https://activej.io/async-io/eventloop" target="_blank" rel="noopener noreferrer">Event Loop</a> 等关键元素来理解这一特性。</p>
<h3> 3.1. 依赖</h3>
<p>让我们添加<code>activej-promise</code>依赖：</p>
<div class="language-xml line-numbers-mode" data-ext="xml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3> 3.2. Promise</h3>
<p>让我们创建要用到的模型：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>现在，给<code>PersonRepository</code>类添加一些逻辑：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们添加了<code>findPerson()</code>方法，用于模拟按名称查找的过程。<strong>我们使用<code>Promises.delay()</code>延迟生成<code>Person</code>实例，结果被包装为<code>Promise</code>实例。</strong></p>
<p>接下来，创建服务层要生成的另一个模型：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p><code>VerifiedPerson</code>包含了人员信息和验证结果。</p>
<p>在<code>PersonService</code>类中添加业务逻辑：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在<code>findPersonNotes()</code>方法中，我们模拟获取人员备注的过程。结果同样用<code>Promise.of()</code>包装。</p>
<p>接下来，添加验证方法：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里我们模拟了验证流程，根据人员描述添加验证结果。</p>
<p>最后，整合所有操作，完成流程：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>在最终方法中，我们通过<code>Promise</code>类的<code>combine()</code>方法，将仓库的<code>findPerson()</code>和服务的<code>findPersonNotes()</code>两个 promise 合并。然后对模型进行验证，返回最终结果的`Promise_。</strong></p>
<h3> 3.3. 事件循环</h3>
<p>**ActiveJ 的 <a href="https://activej.io/async-io/eventloop" target="_blank" rel="noopener noreferrer">Eventloop</a> 在事件循环和线程中异步执行代码。**让我们看看如何用它来运行基于<code>Promise</code>的流程：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们从<code>PersonModule</code>获取了<code>PersonService_。然后用</code>Eventloop.create()<code>创建事件循环实例，并用</code>run()<code>方法启动。接着调用</code>findAndVerifyPerson()<code>方法。如果漏掉</code>run()_，<strong>此时会遇到如下异常：</strong></p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h2> 4. HTTP 服务器</h2>
<p>ActiveJ 的另一个强大特性是高性能异步 <a href="https://activej.io/http" target="_blank" rel="noopener noreferrer">HTTP 服务器</a>。</p>
<h3> 4.1. 依赖</h3>
<p>首先添加 ActiveJ HTTP 依赖：</p>
<div class="language-xml line-numbers-mode" data-ext="xml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>再添加 Jackson Databind&nbsp;依赖：</p>
<div class="language-xml line-numbers-mode" data-ext="xml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3> 4.2. REST 接口示例</h3>
<p>现在，让我们通过 HTTP 接口暴露<code>VerifiedPerson</code>流程。首先是<code>PersonController</code>类：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里我们实现了<code>AsyncServlet</code>接口并重写了<code>serve()</code>方法。在方法内部，获取<code>PersonService</code>的<code>findAndVerifyPerson()</code>结果。<strong>然后将其转为 JSON 并作为 HTTP 响应体返回，状态码为 200。异常情况单独映射，默认返回 500 状态码。</strong></p>
<p>将该控制器加入依赖注入上下文：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们将<code>PersonController</code>加入<code>PersonModule</code>并配置了其依赖。</p>
<p>最后，引入 HTTP 服务器代码：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们完成了<code>HttpServer</code>实例的搭建。然后用 <a href="https://github.com/activej/activej/blob/007785780e15d3f4938c14583a81185202566c44/core-http/src/main/java/io/activej/http/RoutingServlet.java" target="_blank" rel="noopener noreferrer"><em>RoutingServlet</em></a> 添加了 HTTP 路由映射。最后用<code>listen()</code>方法启动服务器，并准备了异步 HTTP 客户端。</p>
<p>现在调用接口并检查结果：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>我们调用了接口并异步获取了预期结果。为了在测试后停止服务器，调用了<code>Eventloop</code>的<code>breakEventloop()</code>方法终止执行。</strong></p>
<h2> 5. 总结</h2>
<p>本文介绍了 ActiveJ 框架的关键特性。借助这些特性，我们已经可以构建高效轻量的 Web 应用。当然，该框架还远不止于此。</p>
<p>我们还可以用它进行数据处理、分布式系统等多种场景。其模块化特性帮助我们避免项目臃肿，只引入必要组件。</p>
<p>感谢阅读！如果您学习过程中如遇困难？可以加入我们超高质量的<a href="https://www.didispace.com/jiaqun.html" target="_blank" rel="noopener noreferrer">技术交流群</a>，参与交流与讨论，更好的学习与进步！</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 SootUp ？</title>
      <link>https://www.didispace.com/article/20250522-sootup.html</link>
      <guid>https://www.didispace.com/article/20250522-sootup.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 SootUp ？</source>
      <description>什么是 SootUp ？ 1. 简介 在本文中，我们将介绍 SootUp 库。SootUp 是一个用于对 JVM 代码进行静态分析的库，可以分析原始源代码或已编译的 JVM 字节码。它是对 Soot 库的彻底重构，目标是更加模块化、可测试、可维护和易用。 2. 依赖 在使用 SootUp 之前，我们需要在构建中引入： &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.soot-oss&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sootup.core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.soot-oss&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sootup.java.core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.soot-oss&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sootup.java.sourcecode&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.soot-oss&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sootup.java.bytecode&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.soot-oss&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sootup.jimple.parser&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt;</description>
      <category>Java</category>
      <pubDate>Thu, 22 May 2025 08:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 SootUp ？</h1>
<h2> 1. 简介</h2>
<p>在本文中，我们将介绍 SootUp 库。SootUp 是一个用于对 JVM 代码进行静态分析的库，可以分析原始源代码或已编译的 JVM 字节码。它是对 Soot 库的彻底重构，目标是更加模块化、可测试、可维护和易用。</p>
<h2> 2. 依赖</h2>
<p>在使用 SootUp 之前，我们需要在构建中引入：</p>
<div class="language-xml line-numbers-mode" data-ext="xml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们这里有几个不同的依赖，它们的作用如下：</p>
<ul>
<li><code>org.soot-uss:sootup.core</code> 是核心库。</li>
<li><code>org.soot-uss:sootup.java.core</code> 是用于 Java 的核心模块。</li>
<li><code>org.soot-uss:sootup.java.sourcecode</code> 是用于分析 Java 源代码的模块。</li>
<li><code>org.soot-uss:sootup.java.bytecode</code> 是用于分析已编译 Java 字节码的模块。</li>
<li><code>org.soot-uss:sootup.jimple.parser</code> 是用于解析 Jimple（SootUp 用于表示 Java 的中间表示）的模块。</li>
</ul>
<p>很遗憾，目前没有 BOM 依赖可用，因此我们需要单独管理这些依赖的版本。</p>
<h2> 3. 什么是 Jimple</h2>
<p>SootUp 能够分析多种格式的代码，包括 Java 源代码、已编译的字节码，甚至 JVM 内部的类。</p>
<p>为此，它会将各种输入转换为一种名为 Jimple 的中间表示。</p>
<p>Jimple 的存在是为了以更易分析的方式，表达 Java 源代码或字节码能实现的所有功能。这意味着它在某些方面有意与原始输入不同。</p>
<p>JVM 字节码在访问某些值时采用基于栈的方式，这种方式对运行时非常高效，但对分析来说却很困难。Jimple 则将其转换为完全基于变量的方式，这样既能实现相同的功能，又更易于理解。</p>
<p>相反，Java 源代码虽然也是基于变量的，但其嵌套结构也让分析变得复杂。Jimple 会将其转换为扁平结构，便于工具分析。</p>
<p>Jimple 也可以作为一种我们可以直接读写的语言。例如，下面的 Java 源代码：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>可以被写成如下 Jimple 代码：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>虽然更为冗长，但功能完全一致。SootUp 提供了解析和生成 Jimple 代码的能力，便于我们在需要时以这种格式存储和转换代码。</p>
<p>无论原始代码来源如何，分析时都会被转换为这种结构。此时我们将操作如 <code>SootClass</code>、<code>SootField</code>、<code>SootMethod</code> 等类型，它们都直接对应这种中间表示。</p>
<h2> 4. 代码分析</h2>
<p>在使用 SootUp 做任何事情之前，首先需要分析一些代码。这需要创建合适的 <code>AnalysisInputLocation</code> 实例，并基于它构建一个 <code>JavaView</code>。</p>
<p>具体创建哪种 <code>AnalysisInputLocation</code>，取决于我们要分析的代码来源。</p>
<p>最简单但实际用处较少的方式，是分析 JVM 自身的类。可以通过 <code>JrtFileSystemAnalysisInputLocation</code> 类实现：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>更常用的是分析源码文件，可以用 <code>OTFCompileAnalysisInputLocation</code>：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>它还支持一次分析多个源码文件：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>也可以分析内存中的源码字符串：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>最后，还可以分析已编译的字节码。通过 <code>JavaClassPathAnalysisInputLocation</code>，可指向任何 classpath（包括 JAR 包或 class 文件目录）：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>此外还有其他标准方式，如直接解析 Jimple 表示、读取 Android APK 文件等。</p>
<p>拿到 <code>AnalysisInputLocation</code> 实例后，可以基于它创建 <code>JavaView</code>：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>这样就能访问输入中的所有类型信息。</p>
<h2> 5. 访问类</h2>
<p>在我们分析完代码并基于它构建了一个 <code>JavaView</code> 实例后，就可以开始访问代码的详细信息了，这首先从访问类开始。</p>
<p>如果我们已经知道要查找的具体类，可以直接通过全限定类名访问。SootUp 使用多种 <code>Signature</code> 类来描述我们想要访问的元素。在这里，我们需要一个 <code>ClassType</code> 实例。幸运的是，可以通过 SootUp 提供的 <code>IdentifierFactory</code>，利用全限定类名轻松生成：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>构建好 <code>ClassType</code> 实例后，就可以用它来访问该类的详细信息：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>也可以直接获取类，不存在时抛出异常：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>拿到 <code>SootClass</code> 实例后，可以用它来检查类的各种属性，例如可见性、是否为具体类或抽象类等：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>还可以遍历已解析的代码，比如访问父类或接口：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>注意，这些方法返回的是 <code>ClassType</code> 而不是 <code>SootClass</code> 实例，因为无法保证这些类的定义一定在当前视图中，仅能获取它们的名称。</p>
<h2> 6. 访问字段和方法</h2>
<p>除了类本身，还可以访问类的内容，比如字段和方法。</p>
<p>如果已经有了 <code>SootClass</code> 实例，可以直接查询其字段和方法：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>与类之间的导航不同，这里可以安全地返回字段或方法的完整表示，因为它们一定在当前视图中。</p>
<p>如果已知具体字段名，可以直接访问字段：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>访问方法稍微复杂一些，需要方法名和参数类型：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>如果方法有参数，需要通过 <code>IdentifierFactory</code> 提供参数类型的 <code>Type</code> 实例：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>这样可以在有重载方法时获取正确的实例。还可以列出所有同名重载方法：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>同样，拿到 <code>SootMethod</code> 或 <code>SootField</code> 实例后，可以进一步检查其属性：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><h2> 7. 分析方法体</h2>
<p>拿到 <code>SootMethod</code> 实例后，可以分析方法体本身，包括方法签名、局部变量和调用图。</p>
<p>首先需要获取方法体：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>有了方法体后，就可以访问方法体的所有细节。</p>
<h3> 7.1 访问局部变量</h3>
<p>首先可以访问方法内所有可用的局部变量：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>这会返回方法内所有可访问的变量。需要注意，这实际上是 Jimple 表示中的变量列表，因此会包含一些解析过程中生成的额外变量，且变量名可能与原始代码不同。</p>
<p>例如，下面的方法有 5 个局部变量：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这些变量包括：</p>
<ul>
<li><code>this</code></li>
<li><code>I1</code> —— 方法参数</li>
<li><code>I2</code> —— 变量“capitals”</li>
<li><code>$stack3</code> —— 指向 <code>System.out</code> 的局部变量</li>
<li><code>$stack4</code> —— 表示“Hello, ” + capitals 的局部变量</li>
</ul>
<p>其中 <code>$stack3</code> 和 <code>$stack4</code> 是 Jimple 生成的，并不直接出现在原始代码中。</p>
<h3> 7.2 访问方法语句图</h3>
<p>除了局部变量，还可以分析整个方法的语句图，即方法将执行的每条语句的详细信息：</p>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>这样可以获得方法将要执行的所有语句，顺序与实际执行一致。每个语句都实现了 <code>Stmt</code> 接口，代表方法可以执行的操作。</p>
<p>例如，前面的方法会生成如下结构：</p>
<p><img src="https://static.didispace.com/images3/44c6794fa8abe857ab7f5f85175dc548.png" alt="sootup callgraph"></p>
<p>看起来比我们实际写的代码多很多——实际上只有两行。这是因为这里展示的是 Jimple 的表示。我们可以逐步拆解其含义：</p>
<p>首先有两个 <code>JIdentityStmt</code>，分别代表传入方法的 <code>this</code> 和 <code>I1</code>（即第一个参数）。</p>
<p>接下来有三个 <code>JAssignStmt</code>，分别表示对变量的赋值：将 <code>I1.toUpperCase()</code> 的结果赋给 <code>I2</code>，将 <code>System.out</code> 赋给 <code>$stack3</code>，将“Hello, ” + <code>I2</code> 的结果赋给 <code>$stack4</code>。</p>
<p>之后是一个 <code>JInvokeStmt</code>，表示在 <code>$stack3</code> 上调用 <code>println()</code> 方法，并传入 <code>$stack4</code>。</p>
<p>最后是一个 <code>JReturnVoidStmt</code>，代表方法末尾的隐式返回。</p>
<p>这是一个没有分支和控制语句的简单方法，但可以清楚看到方法执行的每一步。对于 Java 应用中的任何操作，Jimple 都能完整表示。</p>
<h2> 8. 总结</h2>
<p>本文简要介绍了 SootUp。这个库还有很多强大的功能等待探索。下次需要分析 Java 代码时，不妨试试 SootUp 吧！</p>
<p>感谢阅读！如果您学习过程中如遇困难？可以加入我们超高质量的<a href="https://www.didispace.com/jiaqun.html" target="_blank" rel="noopener noreferrer">技术交流群</a>，参与交流与讨论，更好的学习与进步！</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/44c6794fa8abe857ab7f5f85175dc548.png" type="image/png"/>
    </item>
    <item>
      <title>如何为你的SaaS应用规划具备前瞻性的子域名结构</title>
      <link>https://www.didispace.com/article/20250520-how-to-select-a-future-proof-subdomain-structure-for-saas-web-app.html</link>
      <guid>https://www.didispace.com/article/20250520-how-to-select-a-future-proof-subdomain-structure-for-saas-web-app.html</guid>
      <source url="https://www.didispace.com/rss.xml">如何为你的SaaS应用规划具备前瞻性的子域名结构</source>
      <description>如何为你的SaaS应用规划具备前瞻性的子域名结构 你终于为你的新SaaS应用想好了名字并购买了域名，令人兴奋的时刻！ 你需要做的第一个技术决策之一，就是为各个Web属性选择合适的子域名。 你当然不想过早优化，但如果此时为不同的Web属性选择一组合理的子域名，将有助于你避免后续出现以下这些头疼的问题： 市场人员误操作导致应用路由出错 开发者修改导致营销站点样式混乱 管理复杂的重定向配置 应用架构中不得不引入反向代理 SEO受损</description>
      <category>技术学习</category>
      <pubDate>Tue, 20 May 2025 12:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 如何为你的SaaS应用规划具备前瞻性的子域名结构</h1>
<p>你终于为你的新SaaS应用想好了名字并购买了域名，令人兴奋的时刻！</p>
<p>你需要做的第一个技术决策之一，就是为各个Web属性选择合适的子域名。</p>
<p>你当然不想过早优化，但如果此时为不同的Web属性选择一组合理的子域名，将有助于你避免后续出现以下这些头疼的问题：</p>
<ul>
<li>市场人员误操作导致应用路由出错</li>
<li>开发者修改导致营销站点样式混乱</li>
<li>管理复杂的重定向配置</li>
<li>应用架构中不得不引入反向代理</li>
<li>SEO受损</li>
</ul>
<h2> 让Web应用与营销站点分离</h2>
<p>如果你是一个人既开发Web应用又负责撰写营销内容，可能会倾向于将两者放在同一个子域下。毕竟，这样可以共享CSS、Logo等资源，还能节省单独托管的费用。</p>
<p>但将来你可能会雇佣非技术的市场人员来添加或修改内容。为了让他们能独立高效地工作，你可能希望使用CMS（如Wordpress）。这通常需要独立的服务器，并且很可能与你开发Web应用所用的服务端技术（如Ruby/Rails、Nodejs/Express、Python/Django）不同。你也不希望在维护应用时影响到营销站点的可用性，或者因为修改应用的CSS规则而破坏营销站点的样式。</p>
<p>同一个子域还会让你无法选择用CDN托管静态营销网站，从而提升加载速度并降低托管成本。</p>
<h2> 为你的应用选择子域名</h2>
<p>最简单的选择就是用 <strong><code>app</code></strong>，它不会过于限定用途，即使Web应用未来扩展也不会受限。B2B和B2C用户对此都很熟悉，许多知名服务如<a href="https://www.youneedabudget.com" target="_blank" rel="noopener noreferrer">YNAB</a>、<a href="https://sendgrid.com/" target="_blank" rel="noopener noreferrer">Sendgrid</a>和<a href="https://optimizely.com" target="_blank" rel="noopener noreferrer">Optimizely</a>都采用了这种方式。它还很简短，用户浏览器中的URL会更易读。</p>
<p>其他常见选项包括：</p>
<ul>
<li><code>dashboard</code> —— <a href="https://stripe.com" target="_blank" rel="noopener noreferrer">Stripe</a>采用</li>
<li><code>manage</code> —— <a href="https://gocardless.com" target="_blank" rel="noopener noreferrer">GoCardless</a>采用</li>
<li><code>portal</code> —— Autochart采用</li>
<li><code>my</code> —— <a href="https://www.xero.com" target="_blank" rel="noopener noreferrer">Xero</a>采用</li>
<li><code>account</code> —— <a href="https://postmarkapp.com" target="_blank" rel="noopener noreferrer">Postmark</a>采用</li>
<li><code>secure</code> —— <a href="https://helpscout.net" target="_blank" rel="noopener noreferrer">HelpScout</a>采用（我个人不推荐，太技术化了）</li>
</ul>
<h2> 营销站点优先使用裸域名而非<code>www</code></h2>
<p>这一点比前面的建议更主观，<a href="http://www.greenhills.co.uk/2011/06/12/www-or-bare-domain.html" target="_blank" rel="noopener noreferrer">两种方式各有优劣</a>，无论是从用户体验还是技术配置角度。我的理由是，裸域名（又称apex或bare domain）对大多数用户来说“www”已经多余，而且在AWS Route 53和CloudFront上<a href="https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html" target="_blank" rel="noopener noreferrer">配置裸域名也很简单</a>（我常用的DNS和静态网站托管服务）。</p>
<p>无论你选择哪种方式，都要确保配置好站点的重定向，让两者互通。</p>
<h2> 让营销站点和博客共用同一子域</h2>
<p>我建议将博客作为营销站点的一部分，放在如<code>mydomain.com/blog/</code>这样的子目录下。市场人员通常会同时维护营销站点和博客。通过同一个CMS托管在同一站点，他们的工作会更高效。单一站点还能让品牌和站点布局（如统一的头部、导航和底部）集中管理。此外，分析配置会更简单，只需在Google Analytics和Google Search Console中配置一个Web属性。最后，SEO领域现在也推荐<a href="https://moz.com/learn/seo/domain%20" target="_blank" rel="noopener noreferrer">“优先使用子目录而非子域”</a>。</p>
<h2> API暂时与应用共用子域</h2>
<p>只有当你打算将API公开时，这个决策才真正重要。我认为在应用v1阶段，API不应对外开放，因为外部集成通常不是用户的核心需求。此时，API应为私有，仅供Web应用的AJAX调用。因此，除非API是应用的绝对核心（而仅仅是集成手段），建议首发时将其放在主应用的同一子域下。</p>
<p>如果将来需要对外开放API，可以考虑用独立的<code>api</code>子域。关于应用代码的架构（如单体应用中的模块，或微服务架构下的独立仓库），这超出了本文讨论范围。但如果Web应用和API是分开的微服务，就需要引入反向代理（如Nginx）来实现基于路径的请求路由。而采用不同子域时，路由直接由DNS层处理，更加简单。</p>
<h2> 为所有属性使用一张SSL证书</h2>
<p>如果你希望所有Web属性都支持HTTPS，只需配置一张SSL证书，并设置如下两个Subject Alternative Names：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>无需单独指定每个子域，通配符<code>*</code>已全部覆盖。但裸域名不在通配符范围内，所以需要单独列出。</p>
<h2> 总结</h2>
<p>遵循以下建议，你基本不会出错：</p>
<ul>
<li>使用裸域名 <code>mydomain.com</code> 作为营销网站</li>
<li>将博客作为营销网站的一部分，放在 <code>mydomain.com/blog/</code> 或 <code>mydomain.com/articles/</code> 路径下</li>
<li>将 <code>app.mydomain.com</code> 作为 Web 应用的子域名</li>
<li>将私有 API 部署在 <code>app.mydomain.com/api/v1/</code></li>
<li>如有需要再将公开 API 部署在 <code>api.mydomain.com/v1/</code></li>
<li>所有属性均使用 HTTPS</li>
</ul>
<blockquote>
<p>本文翻译自：https://serverlessfirst.com/how-to-select-a-future-proof-subdomain-structure-for-saas-web-app/</p>
</blockquote>
<p>感谢阅读！如果您学习过程中如遇困难？可以加入我们超高质量的<a href="https://www.didispace.com/jiaqun.html" target="_blank" rel="noopener noreferrer">技术交流群</a>，参与交流与讨论，更好的学习与进步！</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 RESTHeart？</title>
      <link>https://www.didispace.com/article/20250519-what-is-restheart.html</link>
      <guid>https://www.didispace.com/article/20250519-what-is-restheart.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 RESTHeart？</source>
      <description>什么是 RESTHeart？ 1. 简介 RESTHeart 是一个基于 Java 的框架，使我们能够快速在 MongoDB 之上构建 HTTP API。它使我们能够以最少的设置将 MongoDB 集合暴露为 REST 和 GraphQL API，同时仍然允许我们根据需要控制事物。</description>
      <category>技术学习</category>
      <pubDate>Mon, 19 May 2025 19:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 RESTHeart？</h1>
<h2> 1. 简介</h2>
<p><a href="https://restheart.org/" target="_blank" rel="noopener noreferrer">RESTHeart</a> 是一个基于 Java 的框架，使我们能够快速在 <a href="https://www.mongodb.com/" target="_blank" rel="noopener noreferrer">MongoDB</a> 之上构建 HTTP API。它使我们能够以最少的设置将 MongoDB 集合暴露为 REST 和 GraphQL API，同时仍然允许我们根据需要控制事物。</p>
<p>在本教程中，我们将快速了解 RESTHeart API 框架。</p>
<h2> 2. 什么是 RESTHeart？</h2>
<p>RESTHeart 提供了一个构建在 MongoDB 之上的开源 API 服务器。<strong>它会自动将我们的集合暴露为 REST 和 GraphQL 端点，使我们无需编写任何代码即可创建 API</strong>。</p>
<p>开箱即用，我们可以获得：</p>
<ul>
<li>通过 HTTP 和 GraphQL 实现完整的 CRUD 支持</li>
<li>基于角色的访问控制和身份验证</li>
<li>用于用户和角色管理的内置管理 API</li>
<li>通过 Java 插件或配置实现自定义行为的扩展点</li>
</ul>
<p>这为构建基于 HTTP 的 API 提供了一个零代码解决方案，从而实现了快速实施。在需要时，我们还可以集成自定义 Java 代码以实现开箱即用的额外功能。</p>
<h2> 3. 运行 RESTHeart</h2>
<p>如果想在本地运行 RESTHeart，我们需要安装 Java 21 或更高版本。此外，我们还需要下载 <a href="https://restheart.org/docs/setup#download" target="_blank" rel="noopener noreferrer">RESTHeart 发行版</a>。<strong>下载并解压后，我们可以通过运行 <em>restheart.jar</em> 立即启动服务</strong>：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在没有配置的情况下，它将尝试使用位于 127.0.0.1:27017 且不需要凭据的 MongoDB。</p>
<p>或者，可以使用提供的 Docker 镜像来运行 RESTHeart。这也使我们能够运行包含 MongoDB 的  Docker Compose 设置，因此它可以作为一个单独的堆栈启动。为此，我们需要一个 <code>docker-compose.yml</code> 文件：</p>
<div class="language-yaml line-numbers-mode" data-ext="yml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后我们可以使用 <code>docker compose</code> 启动服务，一切准备就绪：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>一切启动后，我们可以通过调用服务器上的 <code>/ping</code> 端点来测试设置：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>至此，我们已经拥有了一个功能齐全的服务。</p>
<h2> 4. 身份验证和用户</h2>
<p><strong>对我们的 RESTHeart 服务的大多数 API 调用都需要身份验证，RESTHeart 会自动处理</strong>。例如，如果我们向根资源发出未经身份验证的请求，那么我们将收到 HTTP <code>401 Unauthorized</code> 响应：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>默认情况下，<strong>用户记录都在我们的 MongoDB 数据库中的 <code>users</code> 集合中进行管理</strong>。如果我们针对空数据库启动 RESTHeart，则会自动创建此集合，并将单个 <code>admin</code> 用户添加到其中：</p>
<p><img src="https://static.didispace.com/images3/1d5a06fb39420f2a42b86e388a43d205.png" alt=""></p>
<p>虽然密码经过安全哈希处理且无法查看，但默认凭据由用户名 <code>admin</code> 和密码 <code>secret</code> 组成。我们现在可以使用这些凭据再次发出请求：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>现在可以正常工作，并且我们得到了预期的响应。</p>
<h2> 5. 使用 RESTHeart 进行 CRUD 操作</h2>
<p>RESTHeart 会自动暴露我们数据库中的 MongoDB 集合，以便我们可以通过标准的 REST 和 GraphQL API 以最少的努力来读取和操作它们。</p>
<h3> 5.1. REST API</h3>
<p><strong>RESTHeart 为每个集合暴露了一组具有标准 URL 模式的 REST API</strong>：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们还可以通过发送特殊请求来创建新集合。为此，我们直接向集合的端点发出 <em>PUT</em> 请求：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>一旦我们有了集合，<strong>让我们使用 <code>POST</code> 请求在其中创建一条新记录</strong>：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这不会返回实际记录，但它确实为我们提供了一个指向它的 <code>Location</code> 标头。这也可以直接在数据库中看到：</p>
<p><img src="https://static.didispace.com/images3/b72fd360c3aeeb5cab184f7acc6fb178.png" alt=""></p>
<p><strong>然后我们可以通过指定 ID 使用 <code>GET</code> 请求检索此记录</strong>：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>我们还可以通过对整个集合使用 <code>GET</code> 请求来选择整个集合</strong>：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>正如预期的那样，我们还可以使用 <code>PUT</code>、<code>PATCH</code> 和 <code>DELETE</code> 调用来更新和删除这些记录：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这些调用都不会返回结果，但如果我们再次查询，结果会立即可用。</p>
<h3> 5.2. GraphQL API</h3>
<p>除了 REST API，<strong>RESTHeart 还使我们能够通过 GraphQL API 暴露我们的数据</strong>。与 REST API 不同，这需要一些初始配置才能使一切按预期工作。</p>
<p>所有的 GraphQL API 都由 <code>gql-apps</code> 集合中的记录定义。所以我们首先需要创建这个集合：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>然后我们需要在此集合中创建一个特殊记录，其中包含我们的 GraphQL API 定义。要创建一个暴露我们一直在使用的 Posts 的 API，配置如下所示：</p>
<div class="language-json line-numbers-mode" data-ext="json"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>descriptor</code> 字段提供了一些 RESTHeart 用于管理 API 的定义。这里最重要的部分是 <code>uri</code> 字段，我们稍后会用到它。此处的 <code>schema</code> 字段是我们的 API 的完整 GraphQL 模式定义，以 GraphQL 模式定义语言 编写。<code>mappings</code> 字段告诉 RESTHeart 如何在 GraphQL API 和 MongoDB 集合之间进行映射。在这种情况下，我们定义了一个包含 <code>name</code> 和 <code>author</code> 字段的 <code>Post</code> 类型，以及一个包含 <code>posts</code> 字段的 <code>Query</code> 类型，该字段映射到我们数据库中的 <code>posts</code> 集合。</p>
<p>然后我们像以前一样创建此记录：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>完成此操作后，我们的 GraphQL API 就可以使用了。我们将 <code>uri</code> 字段设置为 <code>restheart-posts</code>，这意味着我们的 API 暴露在 <code>/graphql/restheart-posts</code> 上：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们可以立即看到这与我们的 REST API 管理的数据相同。</p>
<h2> 6. 总结</h2>
<p>在本文中，我们简要介绍了 RESTHeart 及其功能。使用此框架可以实现更多功能，因此下次您需要创建 HTTP API 时，它非常值得一看。</p>
<p>感谢阅读！如果您学习过程中如遇困难？可以加入我们超高质量的<a href="https://www.didispace.com/jiaqun.html" target="_blank" rel="noopener noreferrer">技术交流群</a>，参与交流与讨论，更好的学习与进步！</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/1d5a06fb39420f2a42b86e388a43d205.png" type="image/png"/>
    </item>
    <item>
      <title>实时技术方案对比：SSE vs WebSocket vs Long Polling</title>
      <link>https://www.didispace.com/article/20250516-sse-websocket-long-polling.html</link>
      <guid>https://www.didispace.com/article/20250516-sse-websocket-long-polling.html</guid>
      <source url="https://www.didispace.com/rss.xml">实时技术方案对比：SSE vs WebSocket vs Long Polling</source>
      <description>实时技术方案对比：SSE vs WebSocket vs Long Polling 早期网站仅展示静态内容，而如今我们更期望：实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢？三大经典技术各显神通： SSE（Server-Sent Events）：轻量级单向数据流 WebSocket：双向全双工通信 Long Polling（长轮询）：传统过渡方案</description>
      <category>技术学习</category>
      <pubDate>Fri, 16 May 2025 01:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 实时技术方案对比：SSE vs WebSocket vs Long Polling</h1>
<p>早期网站仅展示静态内容，而如今我们更期望：<strong>实时更新</strong>、<strong>即时聊天</strong>、<strong>通知推送</strong>和<strong>动态仪表盘</strong>。</p>
<p>那么要如何实现实时的用户体验呢？三大经典技术各显神通：</p>
<ul>
<li><strong>SSE（Server-Sent Events）</strong>：轻量级单向数据流</li>
<li><strong>WebSocket</strong>：双向全双工通信</li>
<li><strong>Long Polling（长轮询）</strong>：传统过渡方案</li>
</ul>
<p>假设目前有三个业务场景，需要实现数据实时更新：</p>
<ul>
<li><strong>股票交易仪表盘</strong></li>
<li><strong>即时聊天平台</strong></li>
<li><strong>实时新闻推送</strong></li>
</ul>
<p>面对这些需求，我们应该如何决策选择合适的方案呢？</p>
<p>下面让我们从<strong>架构、性能和扩展性</strong>角度一起探讨一下。</p>
<h2> 什么是长轮询？</h2>
<h3> 原理解析</h3>
<p>客户端持续询问服务器：</p>
<ul>
<li>"有更新吗？"</li>
<li>"没有"</li>
<li>"现在呢？"</li>
<li>"还是没有"</li>
<li>"现在呢？"</li>
<li>"有了！"</li>
</ul>
<p>就像在吃饭排队叫号的时候，站在店门口每隔5分钟询问是否到你一样，效率低下。</p>
<h3> Spring Boot实现（长轮询式REST端点）：</h3>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>✔ <strong>优点:</strong></p>
<ul>
<li>实现简单（标准REST）</li>
<li>兼容性最佳</li>
</ul>
<p>✘ <strong>缺点:</strong></p>
<ul>
<li>高延迟</li>
<li>资源浪费（大量空请求）</li>
<li>扩展性差</li>
</ul>
<h3> 适用场景</h3>
<p>当<strong>无法使用WebSocket或SSE</strong>且需要支持<strong>老旧浏览器或代理</strong>时使用，一般常见于大型企业的遗留系统中使用。</p>
<h2> 什么是SSE？</h2>
<h3> 原理解析</h3>
<p>客户端建立连接后：</p>
<ul>
<li>"持续监听中..."</li>
<li>服务器随时推送：</li>
<li>"新事件1"</li>
<li>"新事件2"</li>
<li>"连接保持"</li>
</ul>
<p>仅支持<strong>服务器到客户端</strong>的单向通信，适合实时数据流。</p>
<h3> Spring Boot实现（SSE端点）：</h3>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>✔ <strong>优点:</strong></p>
<ul>
<li>轻量（基于HTTP/1.1）</li>
<li>兼容多数代理</li>
<li>自动重连机制</li>
</ul>
<p>✘ <strong>缺点:</strong></p>
<ul>
<li>单向通信</li>
<li>部分环境支持有限</li>
<li>控制粒度较粗</li>
</ul>
<h3> 适用场景</h3>
<p>需要<strong>简单高效的服务器到客户端更新</strong>（如：股票行情、实时比分、状态仪表盘、监控系统等）。</p>
<h2> 什么是WebSocket？</h2>
<h3> 原理解析</h3>
<p>建立<strong>双向通道</strong>实现实时对话：</p>
<ul>
<li>服务器："Bob有新消息"</li>
<li>客户端："收到！...."</li>
</ul>
<p>类似对讲机的全双工通信模式。</p>
<h3> Spring Boot配置与实现</h3>
<div class="language-java line-numbers-mode" data-ext="java"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>✔ <strong>优点:</strong></p>
<ul>
<li>双向通信</li>
<li>低延迟</li>
<li>可通过消息中间件扩展</li>
</ul>
<p>✘ <strong>缺点:</strong></p>
<ul>
<li>代理兼容性问题</li>
<li>扩展复杂度高</li>
<li>需维持长连接</li>
</ul>
<h3> 适用场景</h3>
<p>适用于聊天室、游戏、协作应用等需要双向交互的场景。</p>
<h2> 小结</h2>
<p>最后，结合上面的分析，对于文章开头的业务场景，最终选型方案可以是：</p>
<ul>
<li><strong>股票交易仪表盘</strong>：SSE</li>
<li><strong>即时聊天平台</strong>：WebSocket</li>
<li><strong>实时新闻推送（遗留系统）</strong>：Long Polling</li>
</ul>
<p>当然，技术选型需<strong>因地制宜</strong>，具体还是要根据实际场景来选择最优方案！</p>
<p>感谢阅读！如果您学习过程中如遇困难？可以加入我们超高质量的<a href="https://www.didispace.com/jiaqun.html" target="_blank" rel="noopener noreferrer">技术交流群</a>，参与交流与讨论，更好的学习与进步！</p>
]]></content:encoded>
    </item>
    <item>
      <title>推荐4个极速提升编码效率的MCP服务器</title>
      <link>https://www.didispace.com/article/20250515-mcp-for-vibe-coding.html</link>
      <guid>https://www.didispace.com/article/20250515-mcp-for-vibe-coding.html</guid>
      <source url="https://www.didispace.com/rss.xml">推荐4个极速提升编码效率的MCP服务器</source>
      <description>推荐4个极速提升编码效率的MCP服务器 是时候通过MCP来提升生产力、最大化您的编码效率了！ 随着MCP协议被业界广泛认可，越来越多的MCP服务器被更大平台软件提供方所支持。开发者们是第一批从这些工具中获得效率收益的人，它们能借此重构编码工作流、自动化流程和团队协作机制。 本文将介绍 4 个最近DD有在使用，并且认为对于同为开发者的读者来说非常有用的MCP服务器，下面我会一一介绍并解释其核心特性、应用场景等内容。</description>
      <category>前沿资讯</category>
      <pubDate>Thu, 15 May 2025 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 推荐4个极速提升编码效率的MCP服务器</h1>
<p>是时候通过MCP来提升生产力、最大化您的编码效率了！</p>
<p>随着<a href="https://www.didispace.com/article/20250416-mcp-a2a.html" target="_blank" rel="noopener noreferrer">MCP协议</a>被业界广泛认可，越来越多的MCP服务器被更大平台软件提供方所支持。开发者们是第一批从这些工具中获得效率收益的人，它们能借此重构编码工作流、自动化流程和团队协作机制。</p>
<p>本文将介绍 4 个最近DD有在使用，并且认为对于同为开发者的读者来说非常有用的MCP服务器，下面我会一一介绍并解释其核心特性、应用场景等内容。</p>
<p>让我们开始吧！</p>
<h2> 什么是MCP服务器？</h2>
<p>在推荐之前，我们需要明确MCP的定义：<a href="https://www.didispace.com/article/20250416-mcp-a2a.html" target="_blank" rel="noopener noreferrer">Model Context Protocol（模型上下文协议）</a>。</p>
<p>MCP作为程序使不同系统的AI工具能够相互理解。MCP服务器充当桥梁，允许不同的AI应用和助手交换信息，就像Mac和Windows PC支持相互通信一样。这种标准通信方法消除了所有障碍，使用户能够轻松地将核心编码应用与文档系统和自动化控制设备相结合。最终结果是：系统使所有工具能够平稳协同工作，同时消除冗余复制和信息丢失。</p>
<h3> 为什么这很重要？</h3>
<ul>
<li>更快的工作流：由于不再需要在不同程序间跳转并丢失重要信息，您的工作流程将加速</li>
<li>更精准的AI：AI模型间的联系因处理正确信息而产生更准确的结果</li>
<li>可扩展性：当项目扩展时，可以通过可扩展性添加新工具</li>
</ul>
<h2> 为何MCP服务器是2025年的颠覆者</h2>
<p>人工智能的发展速度已变得极其迅猛。AI框架、API及工具每周都有新版本发布。除非您的工作流展现出变化的灵活性，否则跟上这种发展节奏似乎遥不可及。这正是MCP服务器的闪光点。</p>
<p><strong>您应该关注的原因：</strong></p>
<ul>
<li>MCP服务器执行所有繁琐操作，解放程序员专注于系统开发，从而提升工作效率</li>
<li>通过减少人为错误更易实现准确结果</li>
<li>MCP服务器使您能连接最新文档、API和设计系统，同时避免手动数据更新</li>
</ul>
<p>上个月，我的生产力因混乱的项目文件、爆炸式的团队沟通和杂乱的GitHub仓库而受损。仅集成包含文件系统、Slack和GitHub的几个MCP服务器，几小时内就提升了工作效率。系统集成因完美匹配而带来最大生产力——我的效率翻倍。</p>
<h2> 4个编程最好用的MCP服务器</h2>
<p>准备好升级编码体验了吗？下面是我一直在用的5款MCP服务器，它们能为您的工作流程带来显著提升！</p>
<h3> 1. 文档专家：Context 7</h3>
<p>Context7 是由 Upstash 团队开发的一款工具，旨在解决 LLMs（大语言模型）因依赖过时或通用信息导致的代码相关问题。它通过直接从源码获取最新的、版本特定的文档和代码示例，提升 AI 工具（如 Cursor、Claude 等）生成答案的准确性和实用性。</p>
<p>官方网站：<a href="https://context7.com/" target="_blank" rel="noopener noreferrer">https://context7.com/</a></p>
<p><img src="https://static.didispace.com/images3/104d53b877c4a84a2f23d8db0c6bd976.png" alt=""></p>
<p><strong>核心价值：</strong></p>
<ul>
<li>实时文档与代码：提供最新、与用户库版本严格匹配的官方文档和可运行代码示例。</li>
<li>减少 AI 幻觉：避免 LLMs 生成虚构或不可靠的代码，提升输出质量。</li>
<li>精准高效：仅提供简洁、相关的信息，无冗余内容。</li>
<li>免费与集成：支持个人免费使用，并可集成至 MCP 服务器及常用开发工具。</li>
</ul>
<p>有Context7和无Context7的对比：</p>
<table>
<thead>
<tr>
<th><strong>无 Context7</strong></th>
<th><strong>有 Context7</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>❌ 过时的训练数据文档</td>
<td>✅ 版本特定的最新文档</td>
</tr>
<tr>
<td>❌ 生成无效的虚构代码</td>
<td>✅ 官方源码的真实示例</td>
</tr>
<tr>
<td>❌ 通用答案，缺乏针对性</td>
<td>✅ 精准适配用户技术栈</td>
</tr>
<tr>
<td>❌ 需手动验证答案，耗时费力</td>
<td>✅ 减少与 LLM 的反复沟通成本</td>
</tr>
</tbody>
</table>
<p><strong>使用方法：</strong></p>
<p>通过Context 7向AI输入生成文档的请求，AI会自动拉取并集成到当前项目。该特性特别适用于新技术，可实现精准快速的编码。</p>
<p><strong>实际案例：</strong></p>
<p>创建Supabase用户表时，通过Context 7获取最新Supabase文档，让AI自动生成准确的SQL脚本。</p>
<h3> 2. 项目规划专家：Claude Task Master</h3>
<p>Claude Task Master是一个虚拟AI项目经理，它能将功能需求转化为产品需求文档（PRD）和AI执行的分步任务。</p>
<p>官方网站: <a href="https://www.task-master.dev/" target="_blank" rel="noopener noreferrer">https://www.task-master.dev/</a></p>
<p><img src="https://static.didispace.com/images3/09172b1a5ef7a512152165b55ae9e67e.png" alt=""></p>
<p><strong>核心价值：</strong></p>
<ul>
<li>将复杂项目拆解为可执行任务</li>
<li>创建任务时自动更新进度</li>
<li>支持制定高效计划、任务组织和进度监控</li>
</ul>
<p><strong>使用方法：</strong></p>
<p>提交功能需求给Claude Task Master，软件会分析各类任务并按复杂度展开组织，防止遗漏。</p>
<p><strong>实际案例：</strong></p>
<p>为AI提供精确战略计划而非笼统指令，可靠系统与减少意外问题的组合带来更好的稳定性。</p>
<h3> 3. 精准搜索利器：Exa Search</h3>
<p>该编程搜索工具帮助开发者检索实时数据统计，支持Bug修复和解决方案搜索。</p>
<p>官方网站：<a href="https://docs.exa.ai/examples/exa-mcp" target="_blank" rel="noopener noreferrer">https://docs.exa.ai/examples/exa-mcp</a></p>
<p><strong>核心价值：</strong></p>
<ul>
<li>准确获取可验证的项目信息</li>
<li>实现直接从工作流程发起的研究功能</li>
<li>减少开发者寻找解决方案的时间</li>
</ul>
<p><strong>使用方法：</strong></p>
<p>通过Exa Search验证信息、更新统计数据、解决复杂错误。系统会执行多重搜索直至定位合适信息，并将结果置入开发环境。</p>
<p><strong>实际案例：</strong></p>
<p>构建落地页时，Exa Search可提供真实统计数据替代错误或人造数据。</p>
<h3> 4. 专业设计工具：Magic UI MCP</h3>
<p>提供可直接集成到工作流的UI元素和设计模板。</p>
<p>官方网站: <a href="https://magicui.design/docs/mcp" target="_blank" rel="noopener noreferrer">https://magicui.design/docs/mcp</a></p>
<p><img src="https://static.didispace.com/images3/28b12a07df3a3b645d3ebbe4a3aacce3.png" alt=""></p>
<p><strong>核心价值：</strong></p>
<ul>
<li>即时获取专业应用界面设计方案</li>
<li>提供适应各种用例的组件库</li>
<li>通过优化设计建立用户信任</li>
</ul>
<p><strong>使用方法：</strong></p>
<p>浏览组件库选择所需元素，MCP自动集成。特别适用于落地页、仪表盘和完整应用界面。</p>
<p><strong>实际案例：</strong></p>
<p>无设计知识的用户也能快速创建专业落地页。</p>
<h2> 如何接入MCP服务器</h2>
<p>安装过程很简单，如果你第一次使用也基本就两步：</p>
<ul>
<li>打开AI客户端程序（Claude、Cursor等），进入MCP服务器设置</li>
</ul>
<p><img src="https://static.didispace.com/images3/056c47d2052ef7019ac8f9b7ddbe9c01.png" alt="Cursor示例"></p>
<ul>
<li>复制MCP服务器提供方或者MCP市场提供的MCP配置并黏贴到客户端的配置中</li>
</ul>
<p><img src="https://static.didispace.com/images3/76b14a6125915e6be5321cdc30b33cff.png" alt="Context7提供的配置"></p>
<h2> 小结</h2>
<p>MCP服务器通过自动化重复工作解放人力，使团队专注于创新。如果您还没有用上这些顶级MCP服务器，那么赶快试试，用它们来提升生产力吧！</p>
<p>如果您还有其他MCP服务器推荐，欢迎在评论区分享！</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/104d53b877c4a84a2f23d8db0c6bd976.png" type="image/png"/>
    </item>
    <item>
      <title>零基础4小时用腾讯云代码助手CodeBuddy做一款音视频处理软件</title>
      <link>https://www.didispace.com/article/20250512-codebuddy-transduck.html</link>
      <guid>https://www.didispace.com/article/20250512-codebuddy-transduck.html</guid>
      <source url="https://www.didispace.com/rss.xml">零基础4小时用腾讯云代码助手CodeBuddy做一款音视频处理软件</source>
      <description>零基础4小时用腾讯云代码助手CodeBuddy做一款音视频处理软件 朋友们，我最近不是一直在捣鼓小软件嘛！手头这个叫TransDuck的音视频处理工具刚有点小爆的趋势，反馈意见里也是收到不少关于SaaS版本的问题，比如： &amp;quot;翻译效果真的顶！但每次上传比较大的视频要等好久&amp;quot;（我：带宽太贵啦） &amp;quot;用网页校对和微调视频翻译像在摸鱼，能整个正经客户端吗？&amp;quot;（我：有道理，计划中）</description>
      <category>前沿资讯</category>
      <pubDate>Tue, 13 May 2025 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 零基础4小时用腾讯云代码助手CodeBuddy做一款音视频处理软件</h1>
<p>朋友们，我最近不是一直在捣鼓小软件嘛！手头这个叫<a href="https://transduck.com" target="_blank" rel="noopener noreferrer">TransDuck</a>的音视频处理工具刚有点小爆的趋势，反馈意见里也是收到不少关于SaaS版本的问题，比如：</p>
<ul>
<li>"翻译效果真的顶！但每次上传比较大的视频要等好久"（<strong>我：带宽太贵啦</strong>）</li>
<li>"用网页校对和微调视频翻译像在摸鱼，能整个正经客户端吗？"（<strong>我：有道理，计划中</strong>）</li>
</ul>
<p>对于SaaS软件来说，虽然用浏览器就能丝滑上手，但遇到动辄上百M、甚至几个G的视频，让用户疯狂上传下载确实不讲武德。我这小水管服务器被薅到冒火星不说，用户盯着进度条干等的体验也属实下头。</p>
<p>其实，在做SaaS版本之前，DD就有过对客户端应用的思考：本地计算省带宽、断网也能用、还能避开浏览器沙盒限制...但每次想到要开发的时候，就有开始纠结用PyQt？Electron？还是Tauri？会不会花了很多时间学了一个，结果做一半发现某些想法实现不了，花了很多时间的又白费啦？就这样反反复复纠结了好久，一点行动都没！</p>
<p>但是，最近突然想着可以行动起来了！由于最近使用AI编程的频率很高，感觉对于这些自己不熟悉的领域，或许让AI来做能够得到奇效？就算失败了，也不会像以前那样从零开始学框架再进行开发那么费时。</p>
<p>所以，马上决定来波极限挑战：</p>
<ul>
<li><strong>技能背景</strong>：熟悉后端开发、完全不会客户端开发</li>
<li><strong>辅助工具</strong>：腾讯云代码助手CodeBuddy</li>
<li><strong>挑战目标</strong>：实现一款跨平台的音视频处理客户端软件</li>
</ul>
<p>这篇实测就带大家看看，一个从未接触过客户端开发的程序员，怎么用新工具去扩展更多可能性。</p>
<h2> 准备工作</h2>
<ol>
<li>安装VS Code：https://code.visualstudio.com/</li>
<li>在VS Code的扩展中搜索“腾讯云代码助手CodeBuddy”并安装插件</li>
</ol>
<p><img src="https://static.didispace.com/images3/21cb9028c74d880716b5e2beb7f54e7c.png" alt=""></p>
<ol start="3">
<li>准备工程目录，新建一个文件夹，然后用VS Code打开</li>
</ol>
<p><img src="https://static.didispace.com/images3/154e2572d0fa7be04736dfe78ef82512.png" alt=""></p>
<ol start="4">
<li>对工程目录做一些规划，这里我新建了两个目录分别是：</li>
</ol>
<ul>
<li>docs：用来放各个不同版本的需求文档，先在这里编写，然后再给CodeBuddy去执行</li>
<li>example：用来存放一些用于测试的音频和视频</li>
</ul>
<h2> 需求编写</h2>
<ol>
<li>在docs目录下创建<code>0.1.0.md</code>文件</li>
<li>根据自己对第一个版本希望实现的功能、所要采用的技术栈、UI设计风格的要求等开发需求做详细的描述。比如，我这里写的要求：</li>
</ol>
<div class="language-markdown line-numbers-mode" data-ext="md"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2> 配置CodeBuddy</h2>
<p>在开始开发之前，按如下图所示，对CodeBuddy做一些配置：</p>
<p><img src="https://static.didispace.com/images3/98f8874cfdcffbc81cb1a22a02ce8dc1.png" alt=""></p>
<p>把“自动运行”和“自动修改文件”开启，这样在Craft模式中发消息之后，CodeBuddy会直接帮我们进行开发相关的操作，比如：运行命令、修改文件等。</p>
<h2> 开发过程</h2>
<ol>
<li>把编写的需求内容复制到CodeBuddy下方的输入框内，模型选择default，</li>
</ol>
<p><img src="https://static.didispace.com/images3/0883d3905bfc52d7dd729525f7b6ecd2.png" alt=""></p>
<p>按“回车”开始！如下图，CodeBuddy在对我们的输入思考之后，先扫描当前项目内容，检查项目状态，再根据项目状态<code>制定任务计划</code>：</p>
<p><img src="https://static.didispace.com/images3/33d7f74691e840ab820fb45f83ebb090.png" alt=""></p>
<p>在完成了计划制定之后，就马上开始执行了！如下图所示，由于项目是空的，所以CodeBuddy开始根据我们需求中写的技术栈要求和项目结构开始创建目录、初始化开发框架的项目结构等操作。</p>
<p><img src="https://static.didispace.com/images3/ba8eb5176cb1866ac55cf8bf926d0fcd.png" alt=""></p>
<p>这里我们只需要等待AI一步步做，如果有需要确认的，就操作一下，不然看着就行。当CodeBuddy完成当前任务之后，会做当前任务的总结，并且给出下一步的任务建议。</p>
<p><img src="https://static.didispace.com/images3/ac722a27ca5f8f39d96487647307f652.png" alt=""></p>
<p>这里，我们可以选择继续执行任务，也可以取消继续执行，执行其他任务，比如启动应用，看看是否可以跑起来。DD建议如果这一步做的任务很多，建议先跑一下，看看是否有报错，如果有报错就先及时处理一下。</p>
<p>由于DD从来没用过Tauri，也不知道如何运行程序，所以就让CodeBuddy帮我启动项目，看看是否有报错。于是CodeBuddy就开始执行命令启动应用（这里我也顺手学会了Tauri项目的启动^_^）。</p>
<p>如图所示，在执行过程中，CodeBuddy发现有报错信息，并且马上开始自动修复：</p>
<p><img src="https://static.didispace.com/images3/ba89c78f5a510cd57cee56c924089bdb.png" alt=""></p>
<p>再修复完问题之后，然后可以继续让CodeBuddy执行之前还没完成的任务，就这样不断重复：提交任务、启动应用、修复错误，逐步推进开发。</p>
<p>下面是DD这次实践的几个阶段过程和成果：</p>
<ol>
<li>初始化项目完成，初步实现界面布局</li>
</ol>
<p><img src="https://static.didispace.com/images3/f964ad5c71f7991263e4f8d217329cf6.png" alt=""></p>
<ol start="2">
<li>测试功能是否可用，是否有遗漏。这一步是耗时最多的，主要遇到不少错误，比如：</li>
</ol>
<ul>
<li>点击选择文件没有效果</li>
<li>输出格式组件是输入框，不好用</li>
<li>点击转换按钮不执行转换任务</li>
<li>转换结果输出后，点击打开不会跳转到对应目录</li>
</ul>
<p>遇到这些问题的时候，如果没有报错信息，就用语言描述告诉CodeBuddy，让AI去处理。如果有报错，就直接复制报错信息告诉CodeBuddy去处理。</p>
<p>这里DD卡了比较久一步是由于Tauri 2.0比较新，可能AI的知识不是很信，所以一开始生成的内容有不少错误，不过比较意外的是，经过多次尝试，最后它还是完成了错误的修复：</p>
<p><img src="https://static.didispace.com/images3/98a525519a02dbb674527283ccfaefbb.png" alt=""></p>
<ol start="3">
<li>在让AI辅助修复了所有问题，并让功能可用之后，对一些细节做优化，比如：</li>
</ol>
<ul>
<li>增加图标元素，让界面更和谐</li>
<li>优化输出格式的组件样式</li>
<li>增加“关于”信息</li>
<li>调整国际化语言选择的样式</li>
<li>处理进度条、处理结果的样式</li>
</ul>
<p><img src="https://static.didispace.com/images3/95623aa5a73518dab83f46aebeee201f.png" alt=""></p>
<h2> 注意事项</h2>
<p>在用CodeBuddy辅助编码或者处理错误的时候，特别要注意的一个点：不要一直用一个会话。</p>
<p>当一个会话处理较多内容之后，建议如下图点击“+”按钮新建会话来处理请求。</p>
<p><img src="https://static.didispace.com/images3/f1fdc988d2223cd67ec9fdda2036e163.png" alt=""></p>
<p>不然可能会一直处理好任务，甚至出来一些破坏现有代码的情况，比如会像下图这样给加入很多奇怪的内容：</p>
<p><img src="https://static.didispace.com/images3/de3b6f7d0f7cb7e64e67bb28da7db576.png" alt=""></p>
<h2> 其他能力</h2>
<p>CodeBuddy除了可以帮忙写代码之外，还能帮忙自动生成commit信息，只需要点击下图中的这个按钮即可：</p>
<p><img src="https://static.didispace.com/images3/0cca4dc15883f114655d3a11f0fb082d.png" alt=""></p>
<p>另外，MCP市场也是个不错的特性，你可以方便在这里安装外部服务来增强你的开发工作流：</p>
<p><img src="https://static.didispace.com/images3/1fe68e72c69d2d86dfb2a0b358b3b426.png" alt=""></p>
<h2> 小结</h2>
<p>这波挑战前前后后总共花了我大概4小时左右完成。如果按照以往的模式，先阅读Tauri的教程文档，搭建环境、调试、开发、测试，估计可能最快也要几天时间吧。这次通过CodeBuddy的辅助，大大缩短了学习和开发时间。</p>
<p>同时，在AI辅助编码的过程中，其实我也逐步地学习了Tauri框架的相关内容，根据AI给出的构建命令、执行命令、以及修复错误的过程，也是对Tauri在一步步的学习。这种体验还是非常棒的，除了完成任务，还能学习新技术。</p>
<p>最后，这里开发的工具将会以开源的方式提供，并且计划是持续维护的，后续会增加更多音频、视频的处理能力进来。</p>
<p>感兴趣的小伙伴也可以关注，觉得不错的话，可以帮忙点个Star，项目地址如下：</p>
<ul>
<li>GitHub：<a href="https://github.com/dyc87112/transduck-desktop" target="_blank" rel="noopener noreferrer">https://github.com/dyc87112/transduck-desktop</a></li>
</ul>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/21cb9028c74d880716b5e2beb7f54e7c.png" type="image/png"/>
    </item>
    <item>
      <title>MCP 与 A2A 协议的关系与如何协作的思考</title>
      <link>https://www.didispace.com/article/20250416-mcp-a2a.html</link>
      <guid>https://www.didispace.com/article/20250416-mcp-a2a.html</guid>
      <source url="https://www.didispace.com/rss.xml">MCP 与 A2A 协议的关系与如何协作的思考</source>
      <description>MCP 与 A2A 协议的关系与如何协作的思考 近期关于MCP协议的讨论非常热门，主要因为通过MCP协议通过标准化接口为 AI 应用与外部数据源建立统一交互通道，这使得大模型可以与外部数据源或工具进行交互，从而实现各种专业场景下的智能应用。关于如何实现MCP的架构，在上一篇《如何用Spring AI构建MCP Client-Server架构》中已经做了详细介绍。今天我们结合MCP协议聊一下最近另一个更新的协议：A2A（Agent2Agent）协议。</description>
      <category>前沿资讯</category>
      <pubDate>Wed, 16 Apr 2025 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> MCP 与 A2A 协议的关系与如何协作的思考</h1>
<p>近期关于MCP协议的讨论非常热门，主要因为通过MCP协议通过标准化接口为 AI 应用与外部数据源建立统一交互通道，这使得大模型可以与外部数据源或工具进行交互，从而实现各种专业场景下的智能应用。关于如何实现MCP的架构，在上一篇<a href="https://spring.didispace.com/article/spring-ai-mcp.html" target="_blank" rel="noopener noreferrer">《如何用Spring AI构建MCP Client-Server架构》</a>中已经做了详细介绍。今天我们结合MCP协议聊一下最近另一个更新的协议：A2A（Agent2Agent）协议。</p>
<h2> 什么是A2A，什么是MCP？</h2>
<p>MCP是由Anthropic提出并于2024年11月开源的通信协议，旨在标准化大型语言模型与外部数据源和工具的交互方式，为LLM提供上下文和工具支持。在MCP协议，一些专业工具、软件、系统都可以向大模型提供服务支持，这样用户在大模型交互的时候，就能支持更丰富的能力专业能力。</p>
<p>A2A也是一个开源通信协议，由谷歌推出，旨在为不同系统和平台中的智能体提供标准化的交互方式。智能体是能够执行特定任务的AI实体，A2A确保这些智能体通过一致的标准进行通信和协作，实现跨平台协同工作。A2A的目标是使多个AI Agent能够共同完成任务，而不直接分享它们的内部记忆、思维或工具。</p>
<h2> A2A与MCP的关系</h2>
<p>MCP和A2A都是用于当下AI平台中的通信协议，那他们有什么区别呢？A2A的推出是与MCP竞争还是互补呢？</p>
<p>下面这张图很好的诠释了他们之间的关系：</p>
<p><img src="https://static.didispace.com/images3/a8cc7561bc85b201cbe90e462729f45a.png" alt="A2A与MCP的关系"></p>
<p>从图中可以看出，MCP和A2A都是为了解决AI平台中的通信问题，但是MCP是针对大模型与外部数据源和工具的通信，而A2A是针对不同系统和平台中的智能体之间的通信。所以，他们并不是取代关系，而是互补与协作关系，MCP面向于专业工具提供了能力链接，而A2A则面向不同复杂场景的智能体提供了能力链接，可以用来联动多个不同的智能体来组建更复杂的AI系统。</p>
<h2> A2A与MCP的协作思考</h2>
<p>A2A和MCP可以通过互补协作的方式来构建多智能体系统，利用大模型+专业工具+智能体来提供强大的复杂功能。</p>
<p>那么它们要如何协作来实现呢？下面关于A2A和MCP的协作机制的一些思考：</p>
<h3> 角色分工</h3>
<ul>
<li>A2A：作为智能体间的通信协议，负责任务分配、状态同步和协作管理。A2A通过“Agent Card”发现智能体的能力，并协调多个智能体完成复杂任务。</li>
<li>MCP：作为工具和数据集成协议，为单个智能体提供访问外部资源（如数据库、API、知识库）或工具调用的能力，增强智能体的功能。</li>
</ul>
<h3> 工具调用</h3>
<ul>
<li>A2A可以调用MCP作为一种“工具服务”。例如，当一个智能体需要外部数据时，A2A将任务分配给该智能体，智能体通过MCP协议与外部资源交互，获取结果后通过A2A返回给其他智能体。</li>
<li>A2A的任务管理机制（支持异步任务和状态查询）与MCP的上下文提供能力结合，确保任务执行的连贯性和数据流畅性。</li>
</ul>
<h3> 任务管理</h3>
<ul>
<li>A2A管理任务从创建到完成的整个生命周期，包括任务分解、分配和结果汇总。</li>
<li>MCP在任务执行过程中，为智能体提供动态上下文（如系统提示、外部数据）或工具调用支持，确保任务所需的信息和功能实时可用。</li>
</ul>
<p>例如，A2A可以监控任务进度，而MCP处理智能体与外部系统的实时交互。</p>
<h3> 安全保障</h3>
<ul>
<li>A2A提供企业级认证和授权机制，确保智能体间通信的安全性。</li>
<li>MCP（最新版本）也支持认证改进，保障工具调用和数据访问的安全性。</li>
<li>两者结合时，A2A的通信安全机制可以覆盖MCP的工具调用，确保端到端的安全性。</li>
</ul>
<h2> 小结</h2>
<p>本文介绍了最近AI应用领域最热门的MCP和A2A协议概念并分析了它们之间的关系。同时展开做了一些构建AI应用系统的架构思考，目前还没有具体的实践，后续有具体应用会再继续分享。感谢阅读，欢迎留言交流。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/a8cc7561bc85b201cbe90e462729f45a.png" type="image/png"/>
    </item>
    <item>
      <title>没有Manus邀请码？试试免邀请码的MGX或者开源的OpenManus吧</title>
      <link>https://www.didispace.com/article/20250307-manus-mgx.html</link>
      <guid>https://www.didispace.com/article/20250307-manus-mgx.html</guid>
      <source url="https://www.didispace.com/rss.xml">没有Manus邀请码？试试免邀请码的MGX或者开源的OpenManus吧</source>
      <description>没有Manus邀请码？试试免邀请码的MGX或者开源的OpenManus吧 昨天DD以为阿里开源的QwQ-32B会刷爆全网，毕竟对标的是上一个热门项目deepseek-r1。但是，万万没想到，获得更多关注的居然是：Manus。 简单的从网上介绍信息了解了一下，感觉跟OpenAI一月发布Operator智能体有点像（也许很多人还不知道Operator，因为那段时间国内消息几乎被DeepSeek刷屏了，各种逆袭，各种碾压。。。感兴趣的还可以回头翻一翻了解一下），所以DD对Manus的初步认识是算不上炸裂或者颠覆式创新的。由于DD没有Manus的邀请码，没有切身的体会，就不做过多的评论了。如果读者有用过Operator，也用过Manus，欢迎留言区分享一下。</description>
      <category>前沿资讯</category>
      <pubDate>Fri, 07 Mar 2025 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 没有Manus邀请码？试试免邀请码的MGX或者开源的OpenManus吧</h1>
<p>昨天DD以为阿里开源的QwQ-32B会刷爆全网，毕竟对标的是上一个热门项目deepseek-r1。但是，万万没想到，获得更多关注的居然是：Manus。</p>
<p>简单的从网上介绍信息了解了一下，感觉跟OpenAI一月发布Operator智能体有点像（也许很多人还不知道Operator，因为那段时间国内消息几乎被DeepSeek刷屏了，各种逆袭，各种碾压。。。感兴趣的还可以回头翻一翻了解一下），所以DD对Manus的初步认识是算不上炸裂或者颠覆式创新的。由于DD没有Manus的邀请码，没有切身的体会，就不做过多的评论了。如果读者有用过Operator，也用过Manus，欢迎留言区分享一下。</p>
<p>言归正传，如果你跟DD一样，没有Manus邀请码，但又想体验类似的功能，那么可以试试其他产品，比如：<a href="https://mgx.dev/" target="_blank" rel="noopener noreferrer">MGX</a></p>
<p><img src="https://static.didispace.com/images3/077b1f0d22fcaaacaae9a87d9938e81b.png" alt=""></p>
<ul>
<li>官网地址：https://mgx.dev/</li>
</ul>
<p>使用起来很简单，直接注册登录，不需要邀请码，就可以体验了。如果没啥想法的话，可以用界面中几个预设的任务来快速体验，下面DD就带大家简单看看MGX的功能。</p>
<blockquote>
<p>另外，如果你是想自己构建一个类似的，那么也可以研究一下开源项目：<a href="https://github.com/mannaandpoem/OpenManus" target="_blank" rel="noopener noreferrer">OpenManus</a>，开源地址：https://github.com/mannaandpoem/OpenManus</p>
</blockquote>
<h2> 体验开发博客</h2>
<p>下面DD尝试让MGX来用Astro构建一个博客（Build a blog using Astro），MGX就如下图开始运作了。</p>
<p><img src="https://static.didispace.com/images3/f819ebb84222f4c17a3131a75103bf08.png" alt=""></p>
<p>可以看到MGX为这个任务生成了一个5人团队，其中包括：Team Leader、Engineer、Product Manager、Architect、Data Analyst（该任务激活了Team Leader、Engineer两个角色）。这些角色各司其职来在不同阶段完成不同的任务，已达成用户的需求。</p>
<p><img src="https://static.didispace.com/images3/afe53d00fcd7d05d433975f474b52bf6.png" alt=""></p>
<p>稍等片刻就可以看到效果了：</p>
<p><img src="https://static.didispace.com/images3/96dd63bc3444671a8d4506421fd22fad.png" alt=""></p>
<h2> 体验分析GitHub项目 + 开发网站</h2>
<p>再看一个分析GitHub项目更新内容并构建网站的任务：Search the updates of the MetaGPT project from the past three months and assign the engineer to create a promotional webpage based on the analysis.</p>
<p>在界面左侧栏可以看到各个角色的行为：</p>
<p><img src="https://static.didispace.com/images3/ab5c232dfc7e9331ff62b2bf3e396863.png" alt=""></p>
<p>这个任务相较构建博客的任务更为复杂，因为要打开GitHub项目区分析其内容，在运行过程中可以看到Data Analyst角色打开网页来分析数据的情况。下图是运行完成之后，这个角色的行为日志：</p>
<p><img src="https://static.didispace.com/images3/331c551a23192c8c8e40de8f2e81b8a0.png" alt=""></p>
<p>分析完成之后，Engineer用Data Analyst分析所得的数据构建了关于开源项目的网站：</p>
<p><img src="https://static.didispace.com/images3/66f6ab6d0e7180087da12bf5fd19513f.png" alt=""></p>
<h1> 小结</h1>
<p>是不是还挺好玩的？想做什么就输入让MGX去帮你解决，如果你有什么想去Manus尝试，但是苦于没邀请码，那么可以先试试这个<a href="https://mgx.dev/" target="_blank" rel="noopener noreferrer">MGX</a>。如果想自己构建，就看看开源项目<a href="https://github.com/mannaandpoem/OpenManus" target="_blank" rel="noopener noreferrer">OpenManus</a>。另外，如果你还知道其他类似的强大智能体应用欢迎留言区分享一下。</p>
<p>感谢阅读，如果本文对您有所帮助，欢迎点赞，转发，关注支持一下。如果有什么问题，欢迎评论区留言讨论。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/077b1f0d22fcaaacaae9a87d9938e81b.png" type="image/png"/>
    </item>
    <item>
      <title>阿里最新开源QwQ-32B，效果媲美deepseek-r1满血版，部署成本又又又降低了！</title>
      <link>https://www.didispace.com/article/open-aliyun-qwq32b.html</link>
      <guid>https://www.didispace.com/article/open-aliyun-qwq32b.html</guid>
      <source url="https://www.didispace.com/rss.xml">阿里最新开源QwQ-32B，效果媲美deepseek-r1满血版，部署成本又又又降低了！</source>
      <description>阿里最新开源QwQ-32B，效果媲美deepseek-r1满血版，部署成本又又又降低了！ 3月6日最新消息，阿里云通义千问官方宣布推出最新推理模型 QwQ-32B，这一模型仅有 32B 参数，但在效果上与拥有 671B 参数的 DeepSeek-R1 相媲美。如果你自己部署 DeepSeek-R1 但资源不够的话，又多了一个新的选择。 QwQ-32B 的独特之处不仅在于其参数规模和效果表现，还集成了与 Agent 相关的能力。这使得模型在使用工具时能够进行批判性思考，并依据环境反馈灵活调整推理过程，极大提升了模型的适应性与智能性。 目前，QwQ-32B 已上线 Hugging Face、ModelScope、Ollama等平台，具体链接如下：</description>
      <category>日常记录</category>
      <pubDate>Thu, 06 Mar 2025 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 阿里最新开源QwQ-32B，效果媲美deepseek-r1满血版，部署成本又又又降低了！</h1>
<p>3月6日最新消息，阿里云通义千问官方宣布推出最新推理模型 QwQ-32B，这一模型仅有 32B 参数，但在效果上与拥有 671B 参数的 DeepSeek-R1 相媲美。如果你自己部署 DeepSeek-R1 但资源不够的话，又多了一个新的选择。</p>
<p>QwQ-32B 的独特之处不仅在于其参数规模和效果表现，还集成了与 Agent 相关的能力。这使得模型在使用工具时能够进行批判性思考，并依据环境反馈灵活调整推理过程，极大提升了模型的适应性与智能性。</p>
<p>目前，QwQ-32B 已上线 Hugging Face、ModelScope、Ollama等平台，具体链接如下：</p>
<ul>
<li>https://huggingface.co/Qwen/QwQ-32B</li>
<li>https://modelscope.cn/models/Qwen/QwQ-32B</li>
<li>https://ollama.com/library/qwq</li>
</ul>
<p>QwQ-32B 采用 Apache 2.0 开源协议，为广大开发者提供了便捷的使用途径。用户也可通过 <a href="https://chat.qwen.ai/?models=Qwen2.5-Plus" target="_blank" rel="noopener noreferrer">Qwen Chat</a>直接体验其强大功能。</p>
<p>下图是其与其他热门模型的测试对比：</p>
<p><img src="https://static.didispace.com/images3/8b397272f9133d8bd4c1fde4f37fe083.png" alt=""></p>
<p>测试结果令人瞩目。在数学推理的 AIME24 评测集以及编程能力的 LiveCodeBench 测试中，QwQ-32B 表现与 DeepSeek-R1 相当，远超 o1-mini 及相同尺寸的 R1 蒸馏模型。在由 Meta 首席科学家杨立昆领衔的 “最难 LLMs 评测榜” LiveBench、谷歌等提出的指令遵循能力 IFEval 评测集、加州大学伯克利分校等提出的评估准确调用函数或工具方面的 BFCL 测试中，QwQ-32B 更是超越了 DeepSeek-R1，展现出全面的优势。</p>
<h2> 快速本地部署</h2>
<p>如果想要快速本地部署尝试，那就继续清楚Ollama，两条命令快速搞定。</p>
<ol>
<li>安装 Ollama</li>
</ol>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><blockquote>
<p>如果本地MacOS或者Windows开发环境使用的话，也可以从前往官网下载客户端版本：https://ollama.com/download</p>
</blockquote>
<ol start="2">
<li>启动 QwQ-32B</li>
</ol>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h2> Spring AI调用API集成</h2>
<p>由于这里使用了Ollama来启动QwQ-32B并提供服务，所以Java开发者可以使用使用Spring AI Ollama来集成模型能力到自己的应用中去。</p>
<p>具体如何集成在之前介绍集成DeepSeek-R1的时候介绍过了，方法类似，就是换个模型名称。如果还不会的话，可以参考之前的这篇文章<a href="https://spring.didispace.com/article/spring-ai-ollama-deepseek.html#%E4%BD%BF%E7%94%A8spring-boot-spring-ai" target="_blank" rel="noopener noreferrer">Spring AI + Ollama 实现 deepseek-r1 的API服务和调用</a>中使用Spring AI调API的部分。</p>
<p>感谢阅读！如果您也关注前沿AI和开发者相关资讯，欢迎点赞、关注支持一下。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/8b397272f9133d8bd4c1fde4f37fe083.png" type="image/png"/>
    </item>
    <item>
      <title>拒绝繁忙！免费使用 deepseek-r1:671B 参数满血模型</title>
      <link>https://www.didispace.com/article/free-deepseek-r1-671b.html</link>
      <guid>https://www.didispace.com/article/free-deepseek-r1-671b.html</guid>
      <source url="https://www.didispace.com/rss.xml">拒绝繁忙！免费使用 deepseek-r1:671B 参数满血模型</source>
      <description>拒绝繁忙！免费使用 deepseek-r1:671B 参数满血模型 相信大家都已经有体验过deepseek-r1的强大推理能力，由于其网页版本免费使用的原因，用户量激增、同时据传还遭受了大量的网络攻击，这使得过程不是很流程，经常收到类似下图的问题： 同时，API服务也已经暂停充值，之前的余额用完之后暂时也就不用调用了</description>
      <category>日常记录</category>
      <pubDate>Mon, 10 Feb 2025 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 拒绝繁忙！免费使用 deepseek-r1:671B 参数满血模型</h1>
<p>相信大家都已经有体验过deepseek-r1的强大推理能力，由于其网页版本免费使用的原因，用户量激增、同时据传还遭受了大量的网络攻击，这使得过程不是很流程，经常收到类似下图的问题：</p>
<p><img src="https://static.didispace.com/images3/33f8571c3af65927d2e7e19b0c3da05a.png" alt=""></p>
<p>同时，API服务也已经暂停充值，之前的余额用完之后暂时也就不用调用了</p>
<p><img src="https://static.didispace.com/images3/4ee1996dea4eb13a2d21c90123503c3b.png" alt=""></p>
<p>为了更流畅的使用对话或者API服务，我们可以考虑在自己机器上部署deepseek，如何部署以及如何提供API服务，年前DD在<a href="https://spring.didispace.com/article/spring-ai-ollama-deepseek.html" target="_blank" rel="noopener noreferrer">Spring AI + Ollama 实现 deepseek-r1 的API服务和调用</a>一文中分享过了，感兴趣的小伙伴可以参考一下。</p>
<p>虽然借助类似Ollama这样的工具可以帮我们快速的自己部署deepseek，但是由于我们个人的计算资源有限，在本地无法部署具备671b参数的deepseek-r1满血模型。大部分用户只能部署1.5b或7b参数呃蒸馏小参数版本，这使得本地部署之后，虽然使用不卡顿了，但推理效果大打折扣！</p>
<p>那么是否有方法来低成本的使用671b参数的满血模型呢？有的！下面就给大家介绍一个白嫖的671b参数满血模型的方法！</p>
<h1> 免费使用deepseek-r1:671B参数满血模型</h1>
<ol>
<li>先准备一个腾讯云账号，进入腾讯云知识引擎原子能力: <a href="https://console.cloud.tencent.com/lkeap" target="_blank" rel="noopener noreferrer">https://console.cloud.tencent.com/lkeap</a></li>
</ol>
<p>目前该产品的DeepSeek系列模型（包含671B参数的 deepseek-v3 和 deepseek-r1）正在免费限时提供服务：</p>
<p><img src="https://static.didispace.com/images3/589eff4f5cd8937cb68c676ddd619ff5.png" alt=""></p>
<ol start="2">
<li>点击“开通大模型知识引擎”</li>
</ol>
<p><img src="https://static.didispace.com/images3/7c252f35aee107d5d3e785f22ac8ffd2.png" alt=""></p>
<ol start="3">
<li>根据自身情况，选择调用方式去获取API KEY。如果自己写代码调用，两个都ok，选择自己喜欢的就行。如果是要对接类似这些Chat类客户端的话就选择OpenAI的API KEY。</li>
</ol>
<p><img src="https://static.didispace.com/images3/f3894b510e5296b5b201649806c04287.png" alt=""></p>
<p><strong>注意：创建完成后，记得保存好！</strong> 后续自己调API或者接入开源工具的时候需要配置使用。</p>
<h1> 使用OpenAI的SDK调用</h1>
<p>如果上面你选择了penai的api key，那么接下来就可以使用OpenAI的SDK去调用deepseek-r1:671B参数的模型了。</p>
<p>参考示例：</p>
<div class="language-python line-numbers-mode" data-ext="py"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h1> 使用Chat类客户端调用</h1>
<p>在拿到API KEY之后，就可以使用Chat类客户端去调用deepseek-r1:671B参数的模型了。</p>
<p>配置方法都差不多，主要几个关键元素：</p>
<ol>
<li>使用OpenAI的API调用方式</li>
<li>填入上面获取到的API KEY和腾讯云的API地址：<code>https://api.lkeap.cloud.tencent.com/v1</code></li>
<li>使用deepseek的模型名，比如：<code>deepseek-r1</code>、<code>deepseek-v3</code></li>
</ol>
<p><img src="https://static.didispace.com/images3/95e12ea2bec44c58bb46e6a8cb1b3ed8.png" alt=""></p>
<h1> 小结</h1>
<p>如果你最近对DeepSeek的使用需求较大，官方又经常服务繁忙的话，不妨尝试一下这种使用方式。目前这个入口可以免费使用到2025年2月25日23:59:59，后续付费价格也不贵，可以考虑可以长期使用或者当作官方的备用。</p>
<p><img src="https://static.didispace.com/images3/54fbf45ecd512a534e18d6fb41716c96.png" alt=""></p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/33f8571c3af65927d2e7e19b0c3da05a.png" type="image/png"/>
    </item>
    <item>
      <title>一图看懂6种API架构模式</title>
      <link>https://www.didispace.com/youtube/20230913-6-popular-api.html</link>
      <guid>https://www.didispace.com/youtube/20230913-6-popular-api.html</guid>
      <source url="https://www.didispace.com/rss.xml">一图看懂6种API架构模式</source>
      <description>一图看懂6种API架构模式 刚刚摸鱼刷了一会儿X，正好看到一张非常棒的动图，顺手给大家分享一下。 这张动图中包含6个简短的动画，分别总结了我们日常开发中最常见的6中API模式：</description>
      <category>技术科普</category>
      <pubDate>Wed, 13 Sep 2023 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 一图看懂6种API架构模式</h1>
<p>刚刚摸鱼刷了一会儿X，正好看到一张非常棒的动图，顺手给大家分享一下。</p>
<p>这张动图中包含6个简短的动画，分别总结了我们日常开发中最常见的6中API模式：</p>
<!-- more -->
<video width="800" height="800" controls="" autoplay="" loop="">
  <source src="/video/6-popular-api.mp4" type="video/mp4">
</video>
<blockquote>
<p>动图转自：https://twitter.com/AmigosCode/status/1701563810300006661</p>
</blockquote>
<p>图中所描述的6种API模式分别是：</p>
<ol>
<li><a href="/youtube/20230913-what-is-gRPC.html" target="blank">gRPC</a>：一种高性能、跨语言、易扩展的远程过程调用(RPC)框架，可用于分布式系统之间的通信。gRPC被广泛地应用于微服务体系结构中。</li>
<li>SOAP：一种比较古老的数据交换方式，常用于在Web服务实现中交换结构化信息的协议，以其严格的标准和基于XML的消息格式而闻名，不过现在新系统的应用已经不多了。</li>
<li><a href="/youtube/20230913-what-is-GraphQL.html" target="blank">GraphQL</a>：Facebook开源的一种新颖的架构模式，允许客户端只请求他们需要的数据，可以有效地减少数据的过度获取等问题。</li>
<li><a href="/youtube/20231016-what-is-webhook.html" target="blank">WebHook</a>：一种被动式的实时通信机制，其中应用程序向预定义的URL发送HTTP POST请求以通知并触发另一个系统中的操作。</li>
<li><a href="/youtube/20230912-why-rest-so-popular.html" target="blank">REST</a>：一种用于设计网络应用程序的架构风格，使用标准的HTTP方法(GET、POST、PUT、DELETE)来操作资源。</li>
<li><a href="/youtube/20230916-what-is-websocket.html" target="blank">WebSocket</a>：一种支持客户端和服务器之间通过单一、长期连接方式进行的双向实时通信协议，非常适合需要低延迟更新的应用程序，如：实时聊天、主动推送、游戏等领域。</li>
</ol>
<p>其中，<a href="/youtube/20230913-what-is-gRPC.html" target="blank">gRPC</a>、<a href="/youtube/20230913-what-is-GraphQL.html" target="blank">GraphQL</a>、<a href="/youtube/20230912-why-rest-so-popular.html" target="blank">REST</a>，<a href="/youtube/20230916-what-is-websocket.html" target="blank">WebSocket</a>，之前都有视频介绍。如果上面这个图看了无法理解的话，建议前往查看，都是几分钟的小视频，非常容易看懂。</p>
]]></content:encoded>
    </item>
    <item>
      <title>一个URL输入到浏览器之后，背后在发生什么？</title>
      <link>https://www.didispace.com/youtube/20230916-when-url-entered.html</link>
      <guid>https://www.didispace.com/youtube/20230916-when-url-entered.html</guid>
      <source url="https://www.didispace.com/rss.xml">一个URL输入到浏览器之后，背后在发生什么？</source>
      <description>一个URL输入到浏览器之后，背后在发生什么？ 平时浏览网站，我们都是在浏览器的地址栏中输入一个URL地址，然后回车，网站信息就展现出来了。 但是，您是否有想过，这样一个简单的操作背后都发生了什么吗？这个过程中又涉及到哪里知识内容呢？ 如果您也有这样的疑问，不妨看看下面这个视频，带你一探究竟！</description>
      <category>技术科普</category>
      <pubDate>Sat, 16 Sep 2023 16:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 一个URL输入到浏览器之后，背后在发生什么？</h1>
<p>平时浏览网站，我们都是在浏览器的地址栏中输入一个URL地址，然后回车，网站信息就展现出来了。</p>
<p>但是，您是否有想过，这样一个简单的操作背后都发生了什么吗？这个过程中又涉及到哪里知识内容呢？</p>
<p>如果您也有这样的疑问，不妨看看下面这个视频，带你一探究竟！</p>
<!-- more -->
<iframe src="//player.bilibili.com/player.html?aid=533512422&amp;bvid=BV1Tu411c7eL&amp;cid=1268961017&amp;p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="600px"> </iframe>
<p>该视频采用Chrome插件<a href="https://youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">Youtube中文配音</a>做了翻译+配音处理，如果您平时也有上油管看前沿视频的话，也可以装一个，可以有效的提高你的学习效率 ^_^。如果您不方便查看这些内容，也可以关注我的视频号「程序猿DD」和<a href="https://space.bilibili.com/396803537" target="_blank" rel="noopener noreferrer">B站</a>，我会分享日常看到的精华学习资料，感兴趣的小伙伴根据自己平时习惯选择订阅即可。</p>
]]></content:encoded>
    </item>
    <item>
      <title>推荐一个油管上有386万订阅者的IT学习频道：Edureka</title>
      <link>https://www.didispace.com/youtube/youtube-Edureka.html</link>
      <guid>https://www.didispace.com/youtube/youtube-Edureka.html</guid>
      <source url="https://www.didispace.com/rss.xml">推荐一个油管上有386万订阅者的IT学习频道：Edureka</source>
      <description>推荐一个油管上有386万订阅者的IT学习频道：Edureka ​自从开始搞YouTube中文配音以来，我们一直是7*24小时，夜以继日的在批量处理一些优质的学习资源，一方面是翻译，另一方面是配音。这样用户在打开的时候，就能获得经过我们优化的翻译和配音了。 这次我们刚刚处理完一个油管上非常火爆的​IT类学习频道：Edureka。 该频道内全是IT行业的免费学习视频，数量达到了1万个！所以，理所应当的，它拥有386万个订阅者：</description>
      <category>资源推荐</category>
      <pubDate>Fri, 13 Oct 2023 00:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 推荐一个油管上有386万订阅者的IT学习频道：Edureka</h1>
<p>​自从开始搞<a href="https://youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">YouTube中文配音</a>以来，我们一直是7*24小时，夜以继日的在批量处理一些优质的学习资源，一方面是翻译，另一方面是配音。这样用户在打开的时候，就能获得经过我们优化的翻译和配音了。</p>
<p>这次我们刚刚处理完一个油管上非常火爆的​IT类学习频道：<strong>Edureka</strong>。</p>
<p>该频道内全是IT行业的免费学习视频，数量达到了1万个！所以，理所应当的，它拥有386万个订阅者：</p>
<p><img src="https://static.didispace.com/images3/49006faacb243fe7ef1351930076131f.png" alt=""></p>
<p>不论你是要学Python、学AWS、学ChatGPT、学DevOps等等，只要你能想到的技术内容，里面基本都有涵盖！</p>
<p><img src="https://static.didispace.com/images3/f2a67ceef75252a5662386e85e1b32c3.png" alt=""></p>
<p>如果您正要学某一个技术，但还没找到免费的学习资料的话，不妨进来看看，我相信里面肯定有你需要的。</p>
<p>内容实在太多，DD这里就不废话了，直接给传送门：https://www.youtube.com/@edurekaIN</p>
<h2> 什么？你担心英文课程听不懂？</h2>
<p>千万不要忘记了，我们的Chrome插件：<a href="https://youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">YouTube中文配音</a>。 已经2023年了，现在的技术已经非常给力，虽然比起人工还会有一些些别扭，但是，对于以往的翻译和配音来说，已经有了质的飞跃。</p>
<p>趁这个学习知识的机会，不妨来试试吧～！</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/49006faacb243fe7ef1351930076131f.png" type="image/png"/>
    </item>
    <item>
      <title>YouTube中文配音插件被增长黑客的作者推荐了</title>
      <link>https://www.didispace.com/article/20230905-youtube-dubbing.html</link>
      <guid>https://www.didispace.com/article/20230905-youtube-dubbing.html</guid>
      <source url="https://www.didispace.com/rss.xml">YouTube中文配音插件被增长黑客的作者推荐了</source>
      <description>YouTube中文配音插件被增长黑客的作者推荐了 今天有网友传来了一个喜讯： 是的！《增长黑客：创业公司的用户与收入增长秘籍》一书的作者推荐了我们做的Chrome插件：Youtube中文配音。</description>
      <category>程序人生</category>
      <pubDate>Mon, 04 Sep 2023 22:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> YouTube中文配音插件被增长黑客的作者推荐了</h1>
<p>今天有网友传来了一个喜讯：</p>
<p><img src="https://static.didispace.com/images2/202309/20230905-youtube-dubbing/1693828557205.png" alt="Youtube Dubbing"></p>
<p>是的！<a href="https://union-click.jd.com/jdc?e=618%7Cpc%7C&amp;p=JF8BAQAJK1olXwQEU19VCk4WBF8IG10XXgUGXG4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYCUlxeC08fHDZNRwYlOmBKAQMYbApyZTNoRxhAX2drEiRYaEcbM244GVkRXQQKUVtdOHsXBF9adYOj696n5UKJosTCi_g4GmsVWg4AXV1UAEwXCm4OK1wVVDZXHAxUDksXAF84K1glWgYLQFgvSRkDBR04K1slXjYCVV5UAUIVAGsPGkcVXgAAUVpBCEwfAWYLElMWWQUFUG5fCUoTCl84Kzl9GURhUxkKbkJ_fydzUy9yFW1hLi4KDyUVYwldcyVuIWNkHBY_YClAXA04" target="_blank" rel="noopener noreferrer">《增长黑客：创业公司的用户与收入增长秘籍》</a>一书的作者推荐了我们做的Chrome插件：<a href="https://www.youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">Youtube中文配音</a>。</p>
<p>相信很多小伙伴已经通过之前那篇<a href="https://mp.weixin.qq.com/s/M2M2iEi0OSJ-5CJFNfrNSQ" target="_blank" rel="noopener noreferrer">《小工具高速增长，马斯克都入群提意见来了》</a>，知道我们正在做这个Chrome插件，并且通过视频也了解到当下自动翻译+配音的工作居然已经可以做到这么好了！</p>
<p>最近，由于一直有大佬和用户在使用之后，都自发的给我们做了转发推荐，也为我们带来了一波快速增长。在这次的增长过程中，我们发现了一些问题并及时做出了一些调整和修复。同时，还有一件更值得让我们高兴的事，那就是用户给我们反馈了更多有意思的想法，这些想法中的一部分在不久的将来也会成为了这款插件的重要特性。</p>
<p>高兴之余，又给大家录了个效果视频，正好能给昨天在<a href="https://mp.weixin.qq.com/s/OrfY-gIDfXPAFfHgBDB4LA" target="_blank" rel="noopener noreferrer">《前瞻｜Java 21 新特性 String Templates》</a>一文下面留言争论的读者一些参考，为什么古老的Java这么落后？看看这位国外的大佬怎么说！顺便一起体验下我们这款小巧又强大的插件吧！</p>
<iframe src="//player.bilibili.com/player.html?aid=275587912&amp;bvid=BV1yF41167Wf&amp;cid=1257252885&amp;page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="600px"> </iframe>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images2/202309/20230905-youtube-dubbing/1693828557205.png" type="image/png"/>
    </item>
    <item>
      <title>YouTube中文配音喜提10000用户，推荐一波干货频道！</title>
      <link>https://www.didispace.com/article/20230910-youtube-dubbing-10000.html</link>
      <guid>https://www.didispace.com/article/20230910-youtube-dubbing-10000.html</guid>
      <source url="https://www.didispace.com/rss.xml">YouTube中文配音喜提10000用户，推荐一波干货频道！</source>
      <description>YouTube中文配音喜提10000用户，推荐一波干货频道！ 终于，终于，突破 10000 用户啦！ 在最近收到的不少用户反馈问题中，我们发现不少用户对这款Chrome插件还有一些小误解，可能还是我们名字起的不够大气吧，虽然叫Youtube中文配音，但其实还有更多能力，比如： 不仅仅对英语视频，通过插件配置中选择源语言，可以对各种不同语言的视频进行转化。 不仅仅是中文配音，通过插件配置中选择目标语言，可以实现更多不同语言的配音 不仅仅是对字幕的朗读，当视频没有字幕或自动字幕不佳的时候，我们还能进一步优化，以达到更好的配音效果</description>
      <category>程序人生</category>
      <pubDate>Sun, 10 Sep 2023 16:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> YouTube中文配音喜提10000用户，推荐一波干货频道！</h1>
<p><img src="https://static.didispace.com/images2/202309/20230910-youtube-dubbing-10000/1694335848720.png" alt=""></p>
<p>终于，终于，突破 10000 用户啦！</p>
<p>在最近收到的不少用户反馈问题中，我们发现不少用户对这款Chrome插件还有一些小误解，可能还是我们名字起的不够大气吧，虽然叫Youtube中文配音，但其实还有更多能力，比如：</p>
<ul>
<li>不仅仅对英语视频，通过插件配置中选择源语言，可以对各种不同语言的视频进行转化。</li>
<li>不仅仅是中文配音，通过插件配置中选择目标语言，可以实现更多不同语言的配音</li>
<li>不仅仅是对字幕的朗读，当视频没有字幕或自动字幕不佳的时候，我们还能进一步优化，以达到更好的配音效果</li>
</ul>
<p>如果喜欢追前沿知识，亦或者观看原版视频，亦或者更全面的了解世界，但苦于外语不够给力。那么不妨试试我们的这款Chrome插件：Youtube中文配音（https://youtube-dubbing.com/），相信可以助你一臂之力！</p>
<p>下面是演示视频，可以直观的感受一下：</p>
<iframe src="//player.bilibili.com/player.html?aid=275587912&amp;bvid=BV1yF41167Wf&amp;cid=1257252885&amp;page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" width="100%" height="600px"> </iframe>
<p>这里再给大家推荐一批我关注的免费学习频道（这些我们都做了优化，效果极佳）</p>
<ul>
<li>https://www.youtube.com/@java ：Java官方频道，涵盖Java平台、OpenJDK和Java生态系统的最新学习内容，1000+视频，我们都做了优化！</li>
<li>https://www.youtube.com/@IBMTechnology ：该频道提供关于科技领域的大量教育内容：包括人工智能、自动化、网络安全、数据科学、DevOps、量子计算等各种前沿领域，目前有700+视频，我们都做了优化。</li>
<li>https://www.youtube.com/@SpringSourceDev ：专注分享Spring框架技术的频道，内含1300+视频，我们也都做了优化！</li>
<li>https://www.youtube.com/@DevoxxForever ： 各种技术大会中的干货内容，内含3000+视频，之前也转载过相关前沿演讲，非常值得追！</li>
<li>https://www.youtube.com/@mitocw ：这是MIT的免费公开课，内容涵盖面超广，已经包含7000+视频，里面一定有你感兴趣的话题！</li>
</ul>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images2/202309/20230910-youtube-dubbing-10000/1694335848720.png" type="image/png"/>
    </item>
    <item>
      <title>一招解决Vercel站点在国内无法访问的问题</title>
      <link>https://www.didispace.com/article/20230917-vercel-china-dns.html</link>
      <guid>https://www.didispace.com/article/20230917-vercel-china-dns.html</guid>
      <source url="https://www.didispace.com/rss.xml">一招解决Vercel站点在国内无法访问的问题</source>
      <description>一招解决Vercel站点在国内无法访问的问题 最近一直在公众号等渠道推我们的Chrome插件：Youtube中文配音，经常收到类似无法访问，网站挂掉的反馈： 其实，网站一直没关，只是一个静态站点，没那么容易挂的。只是Vercel部署的站点都被DNS污染了，导致网站在中国大陆是无法访问的。用户端处理的话，手工设置下DNS为8.8.8.8就可以访问。</description>
      <category>程序人生</category>
      <pubDate>Sun, 17 Sep 2023 14:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 一招解决Vercel站点在国内无法访问的问题</h1>
<p>最近一直在公众号等渠道推我们的Chrome插件：<a href="https://www.youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">Youtube中文配音</a>，经常收到类似无法访问，网站挂掉的反馈：</p>
<p><img src="https://static.didispace.com/images2/202309/20230914-vercel-china-dns/1694626955100.png" alt=""></p>
<p>其实，网站一直没关，只是一个静态站点，没那么容易挂的。只是Vercel部署的站点都被DNS污染了，导致网站在中国大陆是无法访问的。用户端处理的话，手工设置下DNS为<code>8.8.8.8</code>就可以访问。</p>
<p>由于本身这款插件的功能主要应用在YouTube，国内本身也看不了，所以之前一直没去处理这个问题。但最近因为有收到一些用户希望对国内平台有支持，所以官网对中国地区用户的访问还是需要解决的。</p>
<p>于是去查了一下文档，处理了一下这个问题。这里做个记录，如果您也碰到类似问题，可以参考着来处理。</p>
<h2> 原始配置</h2>
<p>在处理之前，先通过DNS污染检查，看看当前的情况：</p>
<p><img src="https://static.didispace.com/images2/202309/20230914-vercel-china-dns/1694626765611.png" alt="DNS污染情况"></p>
<p>先说明一下，优化之前的配置：</p>
<p>在Vercel上部署好静态站点之后，会获得哦一个自动分配的域名：</p>
<p><img src="https://static.didispace.com/images2/202309/20230914-vercel-china-dns/1694626809374.png" alt="自动分配的域名"></p>
<p>然后在域名解析里，增加<code>www</code>的<code>CNAME</code>配置到上面这个分配域名，就完成了。但这种情况下，中国大陆地区的用户就会出现访问不了的情况。</p>
<h2> 优化配置</h2>
<p>如何优化呢，根据官方文档的说明，只需要在做<code>CNAME</code>配置的时候，调整一下就可以了，不要把CNAME的记录值设置为自动分配的那个域名，而是使用<code>cname-china.vercel-dns.com</code>即可，具体如下：</p>
<p><img src="https://static.didispace.com/images2/202309/20230914-vercel-china-dns/1694626842377.png" alt="域名解析配置"></p>
<p>等待一段时间，再通过DNS污染检查，看看情况：</p>
<p><img src="https://static.didispace.com/images2/202309/20230914-vercel-china-dns/1694626888221.png" alt="DNS无污染"></p>
<p>完美，都绿色了！</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images2/202309/20230914-vercel-china-dns/1694626955100.png" type="image/png"/>
    </item>
    <item>
      <title>从零开始获取和使用免费的SSL证书保护您的网站</title>
      <link>https://www.didispace.com/article/20240426-zerossl.html</link>
      <guid>https://www.didispace.com/article/20240426-zerossl.html</guid>
      <source url="https://www.didispace.com/rss.xml">从零开始获取和使用免费的SSL证书保护您的网站</source>
      <description>从零开始获取和使用免费的SSL证书保护您的网站 如今，保护您的网站不仅是一项建议，而且是必要的。这就是SSL证书发挥作用的地方。它们对用户浏览器和网站之间传输的数据进行加密，确保隐私和安全。 在可用于获取SSL证书的各种选项中，受欢迎程度仅次于Let&amp;apos;s Encrypt，ZeroSSL是首选之一，特别是对于那些寻求免费且可靠的解决方案的人来说。 本文深入探讨了如何使用ZeroSSL的免费SSL证书来保护您的网站。 ZeroSSL 简介 ZeroSSL是一个免费的、自动化的、开放的证书颁发机构，提供SSL证书。它以其用户友好的SSL认证方法而闻名，即使是技术知识有限的人也可以访问它。</description>
      <category>资源推荐</category>
      <pubDate>Fri, 26 Apr 2024 13:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 从零开始获取和使用免费的SSL证书保护您的网站</h1>
<p>如今，保护您的网站不仅是一项建议，而且是必要的。这就是SSL证书发挥作用的地方。它们对用户浏览器和网站之间传输的数据进行加密，确保隐私和安全。</p>
<p>在可用于获取SSL证书的各种选项中，受欢迎程度仅次于Let's Encrypt，ZeroSSL是首选之一，特别是对于那些寻求免费且可靠的解决方案的人来说。</p>
<p>本文深入探讨了如何使用ZeroSSL的免费SSL证书来保护您的网站。</p>
<h2> ZeroSSL 简介</h2>
<p>ZeroSSL是一个免费的、自动化的、开放的证书颁发机构，提供SSL证书。它以其用户友好的SSL认证方法而闻名，即使是技术知识有限的人也可以访问它。</p>
<p>与 Let's Encrypt 类似，ZeroSSL 提供 90 天的免费证书，需要在到期前续订。但是，这两个平台之间存在一些差异，因此让我们快速提及它们。</p>
<h2> ZeroSSL vs Let's Encrypt</h2>
<p>Let's Encrypt 是免费 SSL 证书的热门选择。与ZeroSSL一样，它是自动化和开放的。主要区别在于它们的方法和附加功能。</p>
<p>Let's Encrypt 更适合自动化，并得到各种托管服务提供商的广泛支持，使其成为许多喜欢一劳永逸解决方案的用户的首选。</p>
<p>另一方面，ZeroSSL吸引了那些希望获得更用户友好的方法和额外支持的用户。与Let's Encrypt相比，ZeroSSL还为您提供：</p>
<ul>
<li>通过方便的用户界面管理证书</li>
<li>通过电子邮件提供域名验证</li>
<li>无速率限制</li>
<li>SSL监控</li>
<li>RESP API 支持</li>
</ul>
<p>最重要的是，虽然两者都提供免费的SSL证书，但ZeroSSL提供了延长有效期的付费选项和附加功能，这可能会使一些企业受益。</p>
<p>解释清楚后，让我们继续了解获取免费ZeroSSL证书所涉及的步骤。</p>
<h2> 实践操作</h2>
<h3> 1. 注册ZeroSSL</h3>
<p>您必须有一个注册帐户才能从ZeroSSL获得免费的SSL证书。因此，作为第一步，使用您喜欢的网络浏览器导航到 ZeroSSL 网站，然后单击<code>Get Free SSL</code>按钮。</p>
<p><img src="https://static.didispace.com/images3/b52769fb4636d527d3c89daccfd25359.png" alt="注册ZeroSSL "></p>
<p>通过输入有效的电子邮件地址，选择密码，然后点击“下一步”，从下一页注册免费计划。</p>
<p><img src="https://static.didispace.com/images3/f5da63bbbf046fc0213bd78cd9bdc975.png" alt="注册ZeroSSL "></p>
<h3> 2. 创建新的 SSL 证书</h3>
<p>注册完成之后，您将自动登录到仪表板。要开始颁发新的SSL证书，请单击<code>New Certificate</code>按钮。</p>
<p><img src="https://static.didispace.com/images3/9e357ca46b15e1a269142a710627d9aa.png" alt="创建新的 SSL 证书"></p>
<p>提供您需要免费SSL证书的域名。如果它是主域（如“didispace.com”）而不是子域（如“dev.didispace.com”），ZeroSSl默认会在证书中添加“www”前缀，这意味着它也将覆盖“www.didispace.com”。单击“下一步”按钮。</p>
<p><img src="https://static.didispace.com/images3/3fbe6474450603c0d3a96203a2e55856.png" alt="指定域名"></p>
<p>设置“90天证书”有效期，这是ZeroSSL的免费选项，然后单击“下一步”继续。</p>
<p><img src="https://static.didispace.com/images3/6fea7ce5f0883dc91d201af361e0b3b1.png" alt="选择SSL证书的有效期"></p>
<p>确保启用了“Auto-Generate CSR”选项。CSR 或证书签名请求是在申请 SSL/TLS 证书时提供给证书颁发机构 （CA） 的编码文本块。</p>
<p>它包含将包含在证书中的信息，例如组织的名称、域名、位置和国家/地区。CSR 还包含将包含在证书中的公钥，它与私钥一起生成，私钥必须保持安全且不得共享。</p>
<p>单击“下一步”按钮进入颁发免费SSL证书的最后一步。</p>
<p><img src="https://static.didispace.com/images3/7dbaf6ddda0c24e0d16ef6c3cd8b7bef.png" alt="将 &quot;自动生成 CSR &quot;设置为启用"></p>
<p>确保在下一个屏幕上选择了 "Free" 选项。按 "下一步 "按钮。</p>
<p><img src="https://static.didispace.com/images3/6358d7de211ae5fc3f2ae29654ec8a26.png" alt="创建新的 SSL 证书"></p>
<h3> 3. 验证域名所有权</h3>
<p>证书已经准备就绪，但在获得证书之前，必须对域名所有权进行验证。简单地说，域名所有权验证就像证明你是房子的主人一样。当你想证明一个网站的域名（就像互联网上的房屋地址）属于你时，你必须通过一个程序来证明。</p>
<p>ZeroSSL 提供三种验证方法：电子邮件、DNS 和 HTTP 文件上传。虽然 DNS 和 HTTP 文件上传需要服务器端配置，因此需要更多的专业技术知识，并使验证过程复杂化，但电子邮件验证是最快速、最简单的方法。</p>
<p>因此，我们将把它作为证明域名所有权的一个选项，请选择它。</p>
<p>您将看到五个常用标准用户名的列表，这些用户名通常与用于域管理的电子邮件地址相关联。这些用户名包括：</p>
<ul>
<li>admin@your-domain.name</li>
<li>administrator@your-domain.name</li>
<li>hostmaster@your-domain.name</li>
<li>postmaster@your-domain.name</li>
<li>webmaster@your-domain.name</li>
</ul>
<p>要成功通过验证，请确保您拥有访问与所选名称相关联的电子邮件帐户所需的凭证（用户名和密码）。选择后点击 "下一步 "按钮继续。</p>
<p><img src="https://static.didispace.com/images3/69d4651c2e0c0b367b6d1b56c31ddb94.png" alt="验证域名所有权 "></p>
<p>单击 "Verify Domain" 按钮后，系统会向指定的电子邮件地址发送一封电子邮件，其中包含一个链接和域名验证码。</p>
<p><img src="https://static.didispace.com/images3/dd9a3ffe9b1f9898f0483c86d6ea3db4.png" alt="验证域名所有权 "></p>
<p>邮件本身如下所示。将验证密钥复制到剪贴板，然后点击 "转到验证页面 "链接。</p>
<p><img src="https://static.didispace.com/images3/61d11de7835a6588e097a1223d690009.png" alt="验证域名所有权 "></p>
<p>您将被重定向到一个页面，在此进行验证。在提供的字段中输入您从电子邮件中复制的验证码，然后点击 "下一步"。</p>
<p><img src="https://static.didispace.com/images3/c7167a1f4c1527bd24a93bace1baf9b6.png" alt="验证域名所有权"></p>
<p>您应该会收到一条确认域名所有权验证成功的信息。现在您可以安全地关闭此窗口。</p>
<p><img src="https://static.didispace.com/images3/e97e7a144b0d082f594525023f1a72c8.png" alt="域验证成功"></p>
<h3> 4.服务器上安装 SSL 证书</h3>
<p>返回 ZeroSSL 页面，点击 "Refresh Status" 按钮。您将收到确认域名验证成功的通知。随后，会出现 "Install Certificate" 按钮。点击它。</p>
<p><img src="https://static.didispace.com/images3/4bd4689872b7fefc16622fa5b57a0aea.png" alt="在 Web 服务器上安装 SSL 证书"></p>
<p>要将SSL证书作为ZIP文件下载到您的计算机，请单击“下载证书（.zip）”。然后，按“下一步”按钮并暂时保持页面打开状态。</p>
<p><img src="https://static.didispace.com/images3/cedddbe526c6c99dd28b813b2a7b6052.png" alt=""></p>
<p>例如，使用 SCP 命令等工具将 ZeroSSL 证书复制到托管域网站的服务器。</p>
<p>在您喜欢的存储证书的位置创建一个文件夹。请记住将“your-domain.name”更改为域的实际名称。</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>然后将ZIP文件解压到以下目录：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>接下来，导航到该文件夹并列出其内容。它应包含以下三个文件：</p>
<ul>
<li>ca_bundle.crt</li>
<li>certificate.crt</li>
<li>private.key</li>
</ul>
<p><img src="https://static.didispace.com/images3/0717fb2c2e69dd914234d8a5988ee135.png" alt=""></p>
<p>您应该将“ca_bundle.crt”和“certificate.crt”合并到一个文件中，该文件将命名为“zerossl_combined.crt”。幸运的是，使用 cat 命令可以轻松完成此操作，如下所示：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>目前为止，一切都好！您现在必须配置 Web 服务器以使用新创建的 SSL 证书。以下是如何为两个最流行的 Web 服务器 Nginx 和 Apache 执行此操作。</p>
<h4> 在Nginx中配置SSL证书</h4>
<p>您需要在 Nginx 中为您的域配置虚拟主机（服务器块）。由于这超出了本指南的范围，如果您需要了解如何操作，如果您需要帮助，可以参考我们关于此主题的综合指南。</p>
<p>下面，我们展示了 Nginx 虚拟主机配置中必须存在的主要部分，以便 Web 服务器使用我们的新 SSL 证书，因为第一个服务器块用于将所有 HTTP 请求重定向到 HTTPS。</p>
<p>当然，不要忘记将“your-domain.name”部分替换为您的特定域。</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>最后，重启 Nginx 服务器。</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4> 在Apache中配置SSL证书</h4>
<p>要使Apache能够使用SSL证书，首先必须激活其SSL模块。您可以通过执行以下命令轻松完成此操作：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>然后，为您的域创建虚拟主机：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>并放入以下配置，再次记住将“your-domain.name”部分替换为当前部分：</p>
<div class="language-xml line-numbers-mode" data-ext="xml"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>保存文件。最后，启用新的虚拟域并重新启动 Apache Web 服务器：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><h3> 5. 测试您的 ZeroSSL 证书</h3>
<p>返回ZeroSSL网站，然后单击“Check Installation”按钮。</p>
<p><img src="https://static.didispace.com/images3/12788869474cc7bc4a28e4d608bee82d.png" alt=""></p>
<p>如果 Web 服务器上的 SSL 证书设置配置正确，您将看到一个绿色复选标记，指示“Installation Complete”。</p>
<p><img src="https://static.didispace.com/images3/1dcf463e344efe7ba5ba6b214860c7b5.png" alt=""></p>
<p>但是，如果您的配置出现问题，您将收到通知。</p>
<p><img src="https://static.didispace.com/images3/0dc09d2e153ebb70020430bc0d952ce0.png" alt=""></p>
<p>当然，最有效的验证方法是将浏览器定向到您的域。通过严格遵守本手册中的说明，您应该会收到令人垂涎的挂锁符号，表明您的网站拥有已正确设置的有效SSL证书。</p>
<p><img src="https://static.didispace.com/images3/af79a5939ce361a744e5afeff5527a53.png" alt=""></p>
<p>您的ZeroSSL网站帐户还使您能够轻松有效地管理SSL证书。</p>
<p><img src="https://static.didispace.com/images3/417df9ef37eb447cf846977c9dae099c.png" alt=""></p>
<h2> 总结</h2>
<p>ZeroSSL为网站所有者提供了一种用户友好且易于访问的方式，以使用免费的SSL证书来保护他们的在线状态。本综合指南详细介绍了从Web服务器上的ZeroSSL获取，验证和安装免费SSL证书的步骤。</p>
<blockquote>
<p>本文翻译自：https://linuxiac.com/zerossl-how-to-install-ssl-certificate/</p>
</blockquote>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/b52769fb4636d527d3c89daccfd25359.png" type="image/png"/>
    </item>
    <item>
      <title>产品优化差不多了，DD来带大家一起搞钱啦！！！</title>
      <link>https://www.didispace.com/article/20240530-youtube-dubbing-union.html</link>
      <guid>https://www.didispace.com/article/20240530-youtube-dubbing-union.html</guid>
      <source url="https://www.didispace.com/rss.xml">产品优化差不多了，DD来带大家一起搞钱啦！！！</source>
      <description>产品优化差不多了，DD来带大家一起搞钱啦！！！ 直接敲重点，今天给分享一个赚钱且能长期躺赚的机会！关注DD的小伙伴应该知道，最近一直在搞视频翻译类的产品，其中YouTube中文配音是其中最广受好评的产品，目前在Chrome插件市场评分高达4.6分。 经过大半年的迭代，现在的翻译质量和配音效果已经非常优秀，如果您没有体验过，可以通过下面的视频体验一下：</description>
      <category>程序人生</category>
      <pubDate>Thu, 30 May 2024 02:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 产品优化差不多了，DD来带大家一起搞钱啦！！！</h1>
<p>直接敲重点，今天给分享一个<strong>赚钱且能长期躺赚</strong>的机会！关注DD的小伙伴应该知道，最近一直在搞视频翻译类的产品，其中<strong>YouTube中文配音</strong>是其中最广受好评的产品，目前在Chrome插件市场评分高达4.6分。</p>
<p><img src="https://static.didispace.com/images3/5b6294d5b33ab8938fae01c6bb193bb4.png" alt=""></p>
<p>经过大半年的迭代，现在的翻译质量和配音效果已经非常优秀，如果您没有体验过，可以通过下面的视频体验一下：</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/5b6294d5b33ab8938fae01c6bb193bb4.png" type="image/png"/>
    </item>
    <item>
      <title>每日PR保持代码整洁自查表</title>
      <link>https://www.didispace.com/article/clean-code-cheat-sheet.html</link>
      <guid>https://www.didispace.com/article/clean-code-cheat-sheet.html</guid>
      <source url="https://www.didispace.com/rss.xml">每日PR保持代码整洁自查表</source>
      <description>每日PR保持代码整洁自查表 如今，公司对软件工程师（主要是高级工程师）最迫切的需求之一，是以迭代和增量的方式提供高质量的代码审查。 这意味着在每次 PR 审查中，开发人员被要求反复提高即将合并代码的质量。 在这篇文章中，我将尝试指出开发人员在进行重构或审查时应牢记的基本原则。 让我们逐个主题来看这些点： 1. 命名 有明确意图的命名：方法或变量名应该在查看代码实现之前就能解释其意图。 类名应该是名词或名词短语。 方法名应该是动词。 为每个概念选择一个词：get、retrieve、fetch 是相似的，选择一个统一使用它。 使用计算机科学术语：例如，AccountAdapter 对程序员来说意味着适配器模式，如果没有相关的计算机科学名称，则使用面向问题的名称。 使用可搜索的名称：在 IDE 中搜索特定短语会更容易。</description>
      <category>技术学习</category>
      <pubDate>Fri, 19 Jul 2024 00:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 每日PR保持代码整洁自查表</h1>
<p>如今，公司对软件工程师（主要是高级工程师）最迫切的需求之一，是以迭代和增量的方式提供高质量的代码审查。</p>
<p>这意味着在每次 PR 审查中，开发人员被要求反复提高即将合并代码的质量。</p>
<p>在这篇文章中，我将尝试指出开发人员在进行重构或审查时应牢记的基本原则。</p>
<p>让我们逐个主题来看这些点：</p>
<h2> 1. 命名</h2>
<ul>
<li>有明确意图的命名：方法或变量名应该在查看代码实现之前就能解释其意图。</li>
<li>类名应该是名词或名词短语。</li>
<li>方法名应该是动词。</li>
<li>为每个概念选择一个词：get、retrieve、fetch 是相似的，选择一个统一使用它。</li>
<li>使用计算机科学术语：例如，AccountAdapter 对程序员来说意味着适配器模式，如果没有相关的计算机科学名称，则使用面向问题的名称。</li>
<li>使用可搜索的名称：在 IDE 中搜索特定短语会更容易。</li>
</ul>
<h2> 2. 函数</h2>
<ul>
<li>函数应该小：函数越大，调试起来就越困难。</li>
<li>块和缩进应该整洁：用好 IDE 的代码格式化。</li>
<li>只做一件事：一个函数意味着一个任务。</li>
<li>每个函数一个抽象层次：函数应该足够小，以便在一个抽象层次的范围内实现。</li>
<li>从上到下阅读代码：应该应用逐步下降规则。嵌套函数应该在母函数之后，以便有像阅读书籍一样的感觉。</li>
<li>使用较少的输入：超过 3 个输入则很糟糕，这可能意味着函数在做不止一件事。</li>
<li>没有副作用：函数应该只做一件事，并且应该正确地做这件事，而不对其他状态产生不良影响。</li>
<li>没有重复：将频繁使用的代码片段集中在一个地方。</li>
</ul>
<h2> 3. 注释</h2>
<ul>
<li>尽量用代码表达意图：你的代码应该是自解释的，以至于读者不需要额外的注释。</li>
<li>好的注释：
<ul>
<li>法律注释</li>
<li>信息性注释</li>
<li>澄清晦涩的代码</li>
<li>警告后果</li>
<li>TODO注释</li>
</ul>
</li>
<li>坏的注释：
<ul>
<li>含糊不清</li>
<li>冗余注释</li>
<li>误导性注释</li>
<li>强制性注释</li>
<li>日志注释</li>
<li>噪音注释</li>
</ul>
</li>
</ul>
<h2> 4. 格式化</h2>
<ul>
<li>垂直格式化：类的大小最多 200-300 行代码。</li>
<li>报纸隐喻：类应该像报纸文章一样。</li>
<li>垂直开放性：类中变量/方法之间的垂直距离。</li>
<li>变量声明：类变量在构造函数之前，局部变量靠近其使用位置。</li>
<li>依赖的方法应该靠近其实现：以便轻松地从一个代码行跳到另一个代码行。</li>
<li>水平密度：避免需要滚动的长行。</li>
<li>团队规则：团队的一致性比干净的代码更重要。</li>
</ul>
<h2> 5. 对象和数据结构</h2>
<ul>
<li>数据/对象反对称性：
<ul>
<li>过程式代码（使用数据结构的代码）使得在不改变现有数据结构的情况下添加新函数变得容易。面向对象的代码则使得在不改变现有函数的情况下添加新类变得容易。</li>
<li>过程式代码使得添加新数据结构变得困难，因为所有函数都必须改变。面向对象的代码使得添加新函数变得困难，因为所有类都必须改变。</li>
</ul>
</li>
<li>迪米特法则：模块不应该知道它操作的对象的内部。</li>
<li>数据传输对象：具有公共变量且没有函数的类使得数据传输更容易，但可能存在安全问题。</li>
</ul>
<h2> 6. 错误处理</h2>
<ul>
<li>尽可能使用异常：而不是返回 null 或错误标志，抛出异常。</li>
<li>在异常中提供上下文：尝试制定良好的异常处理策略。</li>
<li>不要返回 null，不要传递 null。</li>
</ul>
<h2> 7. 单元测试</h2>
<ul>
<li>TDD 法则：
<ul>
<li>在编写失败的单元测试之前，不允许编写生产代码。</li>
<li>不允许编写超过失败所需的单元测试。</li>
<li>不允许编写超过通过当前失败的测试所需的生产代码。</li>
</ul>
</li>
<li>保持测试干净和可读。</li>
<li>每个测试/每个主题/每个概念一个断言。</li>
<li>测试应该是 F.I.R.S.T.：
<ul>
<li>快速</li>
<li>独立</li>
<li>可重复</li>
<li>自验证</li>
<li>及时</li>
</ul>
</li>
</ul>
<h2> 8. 类</h2>
<ul>
<li>封装：利用面向对象编程。</li>
<li>单一职责原则：每个类应该有一个单一的责任。</li>
<li>内聚性：函数操作的变量越多，它的内聚性就越强。</li>
<li>应使用极简主义方法。</li>
</ul>
<blockquote>
<p>本文翻译自：https://medium.com/@azeynalli1990/clean-code-cheat-sheet-for-senior-developers-in-daily-pr-reviews-6b77ee413469</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>还在为没机器练手搭集群而苦恼？快进来免费领机器了！</title>
      <link>https://www.didispace.com/article/cluster-construction-trainer.html</link>
      <guid>https://www.didispace.com/article/cluster-construction-trainer.html</guid>
      <source url="https://www.didispace.com/rss.xml">还在为没机器练手搭集群而苦恼？快进来免费领机器了！</source>
      <description>还在为没机器练手搭集群而苦恼？快进来免费领机器了！ 前几天，在我们的技术交流群里看到有小伙伴问：有没有练手搭建Redis集群的方式推荐： 这里不禁让我想到，对于各种集群和分布式基础设施的搭建，其实是每个开发者进阶时候都要经历的一个成长过程。但是，这里对于不少开发者来说，却又面临着一个现实问题：我没有足够的资源（主机或配置）去尝试和练习。</description>
      <category>资源推荐</category>
      <pubDate>Tue, 10 Oct 2023 08:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 还在为没机器练手搭集群而苦恼？快进来免费领机器了！</h1>
<p>前几天，在我们的技术交流群里看到有小伙伴问：有没有练手搭建Redis集群的方式推荐：</p>
<p><img src="https://static.didispace.com/images3/4ff512f57ffff1ff732f138e0c7d7774.png" alt=""></p>
<p>这里不禁让我想到，对于各种集群和分布式基础设施的搭建，其实是每个开发者进阶时候都要经历的一个成长过程。但是，这里对于不少开发者来说，却又面临着一个现实问题：<strong>我没有足够的资源（主机或配置）去尝试和练习</strong>。</p>
<p>最近，DD刚好看到阿里云有个可以免费领机器的活动，还挺适合正在学习这方面技术内容的小伙伴来领取做练手资源的。</p>
<h2> 如何领取</h2>
<p>这个免费领机器的机会，其实是阿里云ECS面向学生和个人开发者的免费试用活动。它的规则是每个月提供280元的抵扣额度（实例部分200元，公网流量80元），在此额度内，可在5个地域试用<strong>1-4台</strong>。</p>
<p><strong>划重点！！！<strong>这次的免费试用跟以前不一样了，是可以</strong>领多台</strong>的！</p>
<p>所以，我们只需要在免费额度之内，选择尽可能多的机器，就能满足我们练习搭建各种集群的需求了。</p>
<p><strong>领取入口</strong>：<a href="https://click.aliyun.com/m/1000380445/" target="_blank" rel="noopener noreferrer">https://click.aliyun.com/m/1000380445/</a></p>
<p>进入免费试用页面之后，按如图操作：</p>
<p><img src="https://static.didispace.com/images3/23f63aa0ddc1717c85714371b7de58ef.png" alt=""></p>
<p><img src="https://static.didispace.com/images3/fe1c790c0c77d527681d4f7bbc5f7667.png" alt=""></p>
<p>当然了，如果你不是想要搭建集群练手的话，也可以选择其他配置，只要符合控制每个月ECS的费用在200元、公网费用80元以内，就可以免费使用。</p>
<p>另外，这里告诉大家一个小秘籍：那就是不用的时候<strong>开启停机模式</strong>！！！能省则省，榨干每一分额度 ^_^</p>
<h2> 练手推荐</h2>
<p>如果您还是学生，或者平时参与的项目架构没那么复杂，不知道现阶段有哪些东西可以去学习，或者不知道应该按什么顺序去练手。那么，DD这里给大家一些建议，您可以跟着我下面的思路来尝试一下，这些内容都是后端开发推荐掌握的必备技能。</p>
<p>下面推荐的内容，我将以一个应用演进式发展的角度，来给大家梳理要学习的内容顺序，也让大家了解到每个技术的基本应用场景和引入时机。大家可以根据自己的情况选择性的去选择内容练手。</p>
<h3> 从0到1阶段</h3>
<p>通常来说，从0到1阶段，作为一个初创应用，没有什么处理上的压力，所以往往架构是非常简单的。一台服务器 + 一台数据库，基本就搞定了。如果你从来没有过这个体验，那么可以尝试一下下面的部署架构：</p>
<ul>
<li>一台机器搭建Nginx</li>
<li>两台台机器部署应用（双实例）</li>
<li>一台机器部署数据库。</li>
</ul>
<p>这里一个关键点在于Nginx的负载均衡配置，实现一个基础且有一定高可用雏形的部署架构。得益于两台服务器部署应用，又有Nginx做负载均衡，还能实现滚动发布，上线升级不影响用户使用。</p>
<h3> 从1到100阶段</h3>
<p>如果发展顺利，用户增长还不错，那么你们在做的产品需要进一波推广了。此时往往会碰到两个问题：</p>
<p>一个是应用服务器的负载增大，需要扩容应对更多请求。这个可以通过增加应用部署，配合Nginx负载均衡来扩容，如果你没有像从0到1阶段的那种结构来部署的话，这个时候这一步就一定要补上了。</p>
<p>其次，影响性能处理最大的瓶颈大概率出现在数据库。所以，很多时候，我们将在这个阶段引入数据库的一些高级用法，比如：</p>
<ul>
<li><a href="https://www.didispace.com/installation-guide/middleware/mysql-cluster-1.html" target="_blank" rel="noopener noreferrer">一主多从集群</a>：通过一主多从结构，实现读写分离，用更多的机器来分摊数据库的负载。</li>
<li><a href="https://www.didispace.com/installation-guide/middleware/mysql-cluster-2.html" target="_blank" rel="noopener noreferrer">多主多从集群</a>：通过多主多从结构，将业务数据分库处理。配合一些分库框架和中间件，实现更大量级的数据存储需求。</li>
</ul>
<h3> 从100到10000阶段</h3>
<p>随着业务的继续加速发展，数据访问层面的压力会越来越大。这个时候，我们往往都会开始引入缓存系统，来加速用户请求的响应。减少热点数据频繁的访问数据库，减少数据库的负载。所以，这个时候Redis往往就要登场了。缓存作为一个重要中间件，在上线的时候集群化部署肯定是需要的，所以下面这些，也建议大家可以尝试一下：</p>
<ul>
<li><a href="https://www.didispace.com/installation-guide/middleware/redis-master-slave.html" target="_blank" rel="noopener noreferrer">主从模式</a>：主从模式是Redis三种集群模式中最简单的，在主从复制中，数据库分为两类：主数据库(master)和从数据库(slave)。其中，主从复制有如下特点：
<ul>
<li>主数据库可以进行读写操作，当读写操作导致数据变化时会自动将数据同步给从数据库；</li>
<li>从数据库一般是只读的，并且接收主数据库同步过来的数据；</li>
<li>一个master可以拥有多个slave，但是一个slave只能对应一个master；</li>
<li>slave挂了不影响其他slave的读和master的读和写，重新启动后会将数据从master同步过来；</li>
<li>master挂了以后，不影响slave的读，但redis不再提供写服务，master重启后redis将重新对外提供写服务；</li>
<li>master挂了以后，不会在slave节点中重新选一个master；</li>
</ul>
</li>
<li><a href="https://www.didispace.com/installation-guide/middleware/redis-sentinel.html" target="_blank" rel="noopener noreferrer">哨兵模式</a>：主从模式的弊端就是不具备高可用性，当master挂掉以后，Redis将不能再对外提供写入操作，因此sentinel模式应运而生。sentinel中文含义为哨兵，顾名思义，它的作用就是监控redis集群的运行状况，此模式具有如下一些特点：
<ul>
<li>sentinel模式是建立在主从模式的基础上，如果只有一个Redis节点，sentinel就没有任何意义；</li>
<li>当master挂了以后，sentinel会在slave中选择一个做为master，并修改它们的配置文件，其他slave的配置文件也会被修改，比如slaveof属性会指向新的master；</li>
<li>当master重新启动后，它将不再是master，而是做为slave接收新的master的同步数据；</li>
<li>sentinel因为也是一个进程，所以有挂掉的可能，所以sentinel也会启动多个形成一个sentinel集群；</li>
<li>多sentinel配置的时候，sentinel之间也会自动监控；</li>
<li>当主从模式配置密码时，sentinel也会同步将配置信息修改到配置文件中；</li>
<li>一个sentinel或sentinel集群可以管理多个主从Redis，多个sentinel也可以监控同一个redis；</li>
<li>sentinel最好不要和Redis部署在同一台机器，不然Redis的服务器挂了以后，sentinel也可能会挂掉。</li>
</ul>
</li>
<li><a href="https://www.didispace.com/installation-guide/middleware/redis-cluster.html" target="_blank" rel="noopener noreferrer">集群模式</a>：Redis的哨兵模式基本已经可以实现高可用，读写分离 ，但是在这种模式下每台 Redis 服务器都存储相同的数据，很浪费内存，所以在 redis3.0上加入了Cluster 集群模式，实现了 Redis 的分布式存储，也就是说每台 Redis 节点上存储不同的内容。下面是Cluster 集群模式的一些特点：
<ul>
<li>Sentinel模式基本可以满足一般生产的需求，具备高可用性。但是当数据量过大到一台服务器存放不下的情况时，主从模式或sentinel模式就不能满足需求了，这个时候需要对存储的数据进行分片，将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题，将Redis的数据根据一定的规则分配到多台机器。</li>
<li>Cluster可以说是sentinel+主从模式的结合体，通过cluster可以实现主从和master重选功能，所以如果配置两个副本三个分片的话，就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的，当数据量过大时，可以新增机器进行扩容。</li>
<li>使用集群，只需要将redis配置文件中的cluster-enable配置打开即可，每个集群中至少需要三个主数据库才能正常运行，新增节点非常方便。</li>
</ul>
</li>
</ul>
<h3> 野蛮发展阶段</h3>
<p>接下来，如果业务发展一切顺利。这个时候，数据越来越多，业务需求也越来越多，参与的开发人员也越来越多。这个时候，上面的架构已经很难满足各类需求的快速迭代。于是又将引入各种有用的东西。所以，下面的东西也一样推荐掌握。</p>
<p><strong>数据异构</strong></p>
<p>现在的数据库世界，是一个百花齐放的阶段。没有一个数据库可以完美的解决所有问题，所以随着业务的发展，我们往往都需要引入各种不同的数据库来解决不同的业务需求。比如：引入Elasticsearch来解决搜索，引入InfluxDB解决时序类的统计等等。所以，对这方面感兴趣的话，可以尝试一下：</p>
<ul>
<li><a href="https://developer.aliyun.com/article/1131667" target="_blank" rel="noopener noreferrer">MongoDB集群搭建</a></li>
<li><a href="https://developer.aliyun.com/article/1326202" target="_blank" rel="noopener noreferrer">Elasticsearch集群搭建</a></li>
</ul>
<p><strong>基础设施</strong></p>
<p>随着团队的壮大，服务和系统越来越多。运维压力就会很大，所以一些分布式、微服务治理的工具也都可以引入来简化开发和运维。对这方面感兴趣的读者，也可以玩一下下面的搭建：</p>
<ul>
<li><a href="https://developer.aliyun.com/article/1327985" target="_blank" rel="noopener noreferrer">Nacos集群搭建</a></li>
<li><a href="https://developer.aliyun.com/article/176145" target="_blank" rel="noopener noreferrer">Consul集群搭建</a></li>
<li><a href="https://developer.aliyun.com/article/1323975" target="_blank" rel="noopener noreferrer">K8S集群搭建</a></li>
</ul>
<p>随着服务和系统的增多，它们之间的通信有不少场景是不需要同步实现的。很多时候，系统间通过异步来实现会更加可靠。所以，消息中间件的引入也是必须的。目前最常用的有下面这些，如果您没有练过手，也是非常推荐要掌握一下的：</p>
<ul>
<li><a href="https://developer.aliyun.com/article/1324352" target="_blank" rel="noopener noreferrer">RabbitMQ集群搭建</a></li>
<li><a href="https://developer.aliyun.com/article/1330196" target="_blank" rel="noopener noreferrer">Kafka集群搭建</a></li>
<li><a href="https://developer.aliyun.com/article/1325736" target="_blank" rel="noopener noreferrer">RocketMQ集群搭建</a></li>
</ul>
<p>上面DD主要介绍了一些我接触过的比较常用的内容。特定的业务还会有很多技术组件引入，如果上面没有包含的话，您也可以前往<a href="https://developer.aliyun.com/" target="_blank" rel="noopener noreferrer">阿里云开发者社区</a>搜索文章来尝试练手。如果您有什么集群搭建的内容推荐，也欢迎留言区补充~</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/4ff512f57ffff1ff732f138e0c7d7774.png" type="image/png"/>
    </item>
    <item>
      <title>快速清理已经上传到Git仓库的.DS_Store文件</title>
      <link>https://www.didispace.com/article/git-clear-ds-store.html</link>
      <guid>https://www.didispace.com/article/git-clear-ds-store.html</guid>
      <source url="https://www.didispace.com/rss.xml">快速清理已经上传到Git仓库的.DS_Store文件</source>
      <description>快速清理已经上传到Git仓库的.DS_Store文件 很久以前，发过这样一篇文章《Git全局忽略MacOS系统下的.DS_Store文件》，主要是针对MacOS用户，如何方便的在自己机器中免疫所有.DS_Store文件的误提交。如果有这个需求，且还没有搞过的读者可以通过上面这篇文章学习。 今天想要分享的是来自一个读者的私信：配置忽略.DS_Store文件是在没有提交过的前提下做的防范措施，那么如果已经把大量的.DS_Store文件提交了的话，要如何快速清理呢？这位读者还给我发了个他用的命令：</description>
      <category>日常记录</category>
      <pubDate>Mon, 04 Sep 2023 13:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 快速清理已经上传到Git仓库的.DS_Store文件</h1>
<p>很久以前，发过这样一篇文章<a href="https://www.didispace.com/oblog/git-ignore-macos-dsstore-file.html" target="_blank" rel="noopener noreferrer">《Git全局忽略MacOS系统下的.DS_Store文件》</a>，主要是针对MacOS用户，如何方便的在自己机器中免疫所有<code>.DS_Store</code>文件的误提交。如果有这个需求，且还没有搞过的读者可以通过上面这篇文章学习。</p>
<p>今天想要分享的是来自一个读者的私信：配置忽略<code>.DS_Store</code>文件是在没有提交过的前提下做的防范措施，那么如果已经把大量的<code>.DS_Store</code>文件提交了的话，要如何快速清理呢？这位读者还给我发了个他用的命令：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>问题是这个命令只能处理当前目录，对于已经跑了一段时间的仓库，每个文件夹下面已经到处都是了。一个个去执行太麻烦了。所以需要一个能遍历文件夹，并依次清除的实现。</p>
<p>这里就给大家分享一个快速清理的命令：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>只需要在要清理的Git项目目录下直接运行，就能处理所有的<code>.DS_Store</code>了，最后记得处理好之后，要提交哦～</p>
]]></content:encoded>
    </item>
    <item>
      <title>GitHub 2FA（双重身份验证）没有中国选项，怎么开启？</title>
      <link>https://www.didispace.com/article/github-enable-2fa.html</link>
      <guid>https://www.didispace.com/article/github-enable-2fa.html</guid>
      <source url="https://www.didispace.com/rss.xml">GitHub 2FA（双重身份验证）没有中国选项，怎么开启？</source>
      <description>GitHub 2FA（双重身份验证）没有中国选项，怎么开启？ 最近上GitHub一直都会弹出一个黄色框框，提示要开启2FA（two-factor authentication，即：双重身份验证）。 GitHub users are now required to enable two-factor authentication as an additional security measure. Your activity on GitHub includes you in this requirement. You will need to enable two-factor authentication on your account before October 06, 2023, or be restricted from account actions.</description>
      <category>日常记录</category>
      <pubDate>Mon, 25 Sep 2023 14:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> GitHub 2FA（双重身份验证）没有中国选项，怎么开启？</h1>
<p>最近上GitHub一直都会弹出一个黄色框框，提示要开启2FA（two-factor authentication，即：双重身份验证）。</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><img src="https://static.didispace.com/images3/c2b944784939a9d1a92d5ded16a3c315.png" alt=""></p>
<p>弹了很久，一直都没去处理，今天新血来潮想去掉这个东西。</p>
<p>但是，很扯淡的是，第一步就卡住了，国家选择里压根没中国：</p>
<p><img src="https://static.didispace.com/images3/32775559a4054359b1fdfd978a6b7f9a.png" alt=""></p>
<p>同时，这里居然有台湾？</p>
<p><img src="https://static.didispace.com/images3/be4104b22296cd5a5dfb067ff7be66b1.png" alt=""></p>
<p>看到网友有分享通过浏览器工具手工添加下面这段js来手工添加China选项来完成流程的</p>
<div class="language-javascript line-numbers-mode" data-ext="js"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>但DD试了一下，貌似短信都发不过来（可能之前可以吧）：</p>
<p><img src="https://static.didispace.com/images3/abe2a12543c650a5f5c34e3c1cbab414.png" alt=""></p>
<p>最后，还是通过身份验证App来完成了。你只需要点击页面底部这里进入：</p>
<p><img src="https://static.didispace.com/images3/b94dc0a069c7227d60e2fcba23b84862.png" alt=""></p>
<p>根据页面提示，使用<code>1Password</code>、<code>Authy</code>、<code>Microsoft Authenticator</code>等身份验证类App（DD这里用的<code>Microsoft Authenticator</code>）来扫下面的二维码</p>
<p><img src="https://static.didispace.com/images3/f1b82de3ecbe7f0f857d4792bccbdad6.png" alt=""></p>
<p>扫码后，上面这些身份验证App，都会产生一个一次性密码，直接输入上图中的底部输入框，然后继续就完成了。</p>
<p><img src="https://static.didispace.com/images3/845501193539a97e3d3426cd8b6cab5c.png" alt=""></p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/c2b944784939a9d1a92d5ded16a3c315.png" type="image/png"/>
    </item>
    <item>
      <title>Google发布最强AI模型：Gemini，整理了15个视频，一起来体验下它如何像人一样看、听、说！</title>
      <link>https://www.didispace.com/article/google-gemini-release.html</link>
      <guid>https://www.didispace.com/article/google-gemini-release.html</guid>
      <source url="https://www.didispace.com/rss.xml">Google发布最强AI模型：Gemini，整理了15个视频，一起来体验下它如何像人一样看、听、说！</source>
      <description>Google发布最强AI模型：Gemini，整理了15个视频，一起来体验下它如何像人一样看、听、说！ 昨天深夜，Googe发布了最新、最强的AI模型：Gemini（双子座），它可以像人一样地实现看、听、说。 真的有这么神么？DD看了一些国内的报道，觉得还不够过瘾。所以，直接去找了一下Google官方介绍，一共有15个视频。</description>
      <category>前沿资讯</category>
      <pubDate>Thu, 07 Dec 2023 20:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Google发布最强AI模型：Gemini，整理了15个视频，一起来体验下它如何像人一样看、听、说！</h1>
<p>昨天深夜，Googe发布了最新、最强的AI模型：<strong>Gemini</strong>（双子座），它可以像人一样地实现看、听、说。</p>
<p>真的有这么神么？DD看了一些国内的报道，觉得还不够过瘾。所以，直接去找了一下Google官方介绍，一共有15个视频。</p>
<p><img src="https://static.didispace.com/images3/b104f5f0b33b7864e8181358e9f2bbee.png" alt=""></p>
<p>随性直接全都下载下来，然后顺手做了翻译+配音，感兴趣的小伙伴可以继续往下看，直观的感受<strong>Gemini</strong>所拥有的强大能力！</p>
<h2> 1. Gemini：Google最新最强的AI模型</h2>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/b104f5f0b33b7864e8181358e9f2bbee.png" type="image/png"/>
    </item>
    <item>
      <title>Google发布开源大模型Gemma，网友辣评：国产大模型又有机会提升了</title>
      <link>https://www.didispace.com/article/google-gemma-opensource.html</link>
      <guid>https://www.didispace.com/article/google-gemma-opensource.html</guid>
      <source url="https://www.didispace.com/rss.xml">Google发布开源大模型Gemma，网友辣评：国产大模型又有机会提升了</source>
      <description>Google发布开源大模型Gemma，网友辣评：国产大模型又有机会提升了 就在昨晚，Google发布了最新的开源大语言模型：Gemma。该模型采用了与Google最强模型Gemini相同的技术基础。 目前开源的Gemma共提供两种规模的模型：2B（20亿参数）和7B（70亿参数）。 该模型的推出主要对标之前主流的开源大模型 Llama-2，从其提供的技术报告来看，Gemma展现了更卓越的性能，Gemma模型甚至可以直接运行在笔记本或台式机上。 而且在重要的基准测试方面，Gemma 7B甚至超越了其他体积更大的模型：</description>
      <category>前沿资讯</category>
      <pubDate>Thu, 22 Feb 2024 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Google发布开源大模型Gemma，网友辣评：国产大模型又有机会提升了</h1>
<p>就在昨晚，Google发布了最新的开源大语言模型：Gemma。该模型采用了与Google最强模型Gemini相同的技术基础。</p>
<p>目前开源的Gemma共提供两种规模的模型：2B（20亿参数）和7B（70亿参数）。</p>
<p>该模型的推出主要对标之前主流的开源大模型 Llama-2，从其提供的技术报告来看，Gemma展现了更卓越的性能，Gemma模型甚至可以直接运行在笔记本或台式机上。</p>
<p>而且在重要的基准测试方面，Gemma 7B甚至超越了其他体积更大的模型：</p>
<p><img src="https://static.didispace.com/images3/dc74e1ba0fdea35fa5b0a8b2dfb3cb67.png" alt=""></p>
<p>更多技术报告内容可从这里查阅：https://goo.gle/GemmaReport</p>
<p>如果您对Gemma感兴趣，现在可以通过 ai.google.dev/gemma 深入了解并获取快速入门指南。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/dc74e1ba0fdea35fa5b0a8b2dfb3cb67.png" type="image/png"/>
    </item>
    <item>
      <title>手把手教你本地运行Meta最新大模型：Llama3.1，惊奇发现他说自己是ChatGPT？</title>
      <link>https://www.didispace.com/article/how_to_use_llama3_1.html</link>
      <guid>https://www.didispace.com/article/how_to_use_llama3_1.html</guid>
      <source url="https://www.didispace.com/rss.xml">手把手教你本地运行Meta最新大模型：Llama3.1，惊奇发现他说自己是ChatGPT？</source>
      <description>手把手教你本地运行Meta最新大模型：Llama3.1，惊奇发现他说自己是ChatGPT？ 就在昨晚，Meta发布了可以与OpenAI掰手腕的最新开源大模型：Llama 3.1。 该模型共有三个版本： 8B 70B 405B 对于这次发布，Meta已经在超过150个涵盖广泛语言范围的基准数据集上评估了性能。此外，Meta还进行了广泛的人工评估，在现实场景中将Llama 3.1与竞争模型进行比较。Meta的实验评估表明：</description>
      <category>日常记录</category>
      <pubDate>Thu, 25 Jul 2024 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 手把手教你本地运行Meta最新大模型：Llama3.1，惊奇发现他说自己是ChatGPT？</h1>
<p>就在昨晚，Meta发布了可以与OpenAI掰手腕的最新开源大模型：Llama 3.1。</p>
<p><img src="https://static.didispace.com/images3/65f9aa061b8967b8a7ed11a9556cb67b.png" alt=""></p>
<p>该模型共有三个版本：</p>
<ul>
<li>8B</li>
<li>70B</li>
<li>405B</li>
</ul>
<p>对于这次发布，Meta已经在超过150个涵盖广泛语言范围的基准数据集上评估了性能。此外，Meta还进行了广泛的人工评估，在现实场景中将Llama 3.1与竞争模型进行比较。Meta的实验评估表明：</p>
<p>405B版本的评估数据与目前最强的GPT-4、GPT-4o和Claude 3.5 Sonnet相比具有不错的竞争力：</p>
<p><img src="https://static.didispace.com/images3/fd7f205d262dc50852db721e9b1dd592.png" alt=""></p>
<p>此外，8B和70B版本与具有相似参数规模的模型相比也有相同甚至更好的表现：</p>
<p><img src="https://static.didispace.com/images3/9c00e0d46b558e5d11d7783d4e413129.png" alt=""></p>
<h1> 使用 ollama 运行 Llama3.1</h1>
<p>下面就来尝个鲜，手把手在本地把Llama3.1的8B版本跑起来。只要跟着下面的步骤做，你不需要有任何技术背景，也能完成。</p>
<ol>
<li>安装 ollama</li>
</ol>
<p>前往官网下载最新的 Ollama：https://ollama.com/</p>
<p><img src="https://static.didispace.com/images3/05285180a78121b8d6a59dc118e72eaa.png" alt=""></p>
<ol start="2">
<li>
<p>下载完成之后，打开安装程序，并完成安装步骤。</p>
</li>
<li>
<p>打开终端，执行命令：<code>ollama run llama3.1</code></p>
</li>
</ol>
<p><img src="https://static.didispace.com/images3/64410e598dd9e6f72fea0de0c00ff100.png" alt=""></p>
<p>等待模型下载完成</p>
<ol start="4">
<li>完成模型下载，如下图所示：</li>
</ol>
<p><img src="https://static.didispace.com/images3/da28a5e5f5a4e85ff49f79755a5a9e45.png" alt=""></p>
<p>已经弹出提示：<code>Send a message</code>，可以与AI进行互动了。</p>
<ol start="5">
<li>测试一下，尝试让他教我学习Java？</li>
</ol>
<p><img src="https://static.didispace.com/images3/4f075b44795a9a3f7818b120fb7bd8dc.png" alt=""></p>
<h1> 彩蛋</h1>
<p>最后，常规操作，问一下你是谁：</p>
<p><img src="https://static.didispace.com/images3/335bf4b451f8ea322b259285c3fe079b.png" alt=""></p>
<p>啥情况？是ChatGPT？看到这里的小伙伴也试试看，也是一样的结果吗？有朋友知道为什么吗？知道的评论区求解。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/65f9aa061b8967b8a7ed11a9556cb67b.png" type="image/png"/>
    </item>
    <item>
      <title>10秒开服！隔壁奶奶都能搞定幻兽帕鲁、雾锁王国的开服指南</title>
      <link>https://www.didispace.com/article/palu-enshrouded-tencent-cloud.html</link>
      <guid>https://www.didispace.com/article/palu-enshrouded-tencent-cloud.html</guid>
      <source url="https://www.didispace.com/rss.xml">10秒开服！隔壁奶奶都能搞定幻兽帕鲁、雾锁王国的开服指南</source>
      <description>10秒开服！隔壁奶奶都能搞定幻兽帕鲁、雾锁王国的开服指南 最近《幻兽帕鲁》和《雾锁王国》非常火热，玩过的小伙伴们都说非常上头！有跟朋友对战需求的小伙伴们可以通过本文拥有一台高性价比的专用服务器，随时可以用来跟朋友一起玩游戏！ 敲重点！！！ 步骤非常简单，就算你不是程序员，也可以轻松完成！！ 目前很多云服务商和淘宝上都有类似的服务，但DD对比下来，腾讯云目前是最具性价比的，所以这里给大家推荐一下 开服步骤 选择游戏</description>
      <category>资源推荐</category>
      <pubDate>Sat, 03 Feb 2024 14:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 10秒开服！隔壁奶奶都能搞定幻兽帕鲁、雾锁王国的开服指南</h1>
<p>最近《幻兽帕鲁》和《雾锁王国》非常火热，玩过的小伙伴们都说非常上头！有跟朋友对战需求的小伙伴们可以通过本文拥有一台高性价比的专用服务器，随时可以用来跟朋友一起玩游戏！</p>
<p><strong>敲重点！！！</strong></p>
<ol>
<li>步骤非常简单，就算你不是程序员，也可以轻松完成！！</li>
<li>目前很多云服务商和淘宝上都有类似的服务，但DD对比下来，腾讯云目前是最具性价比的，所以这里给大家推荐一下</li>
</ol>
<h2> 开服步骤</h2>
<ol>
<li>选择游戏</li>
</ol>
<p>进入开服页面，入口链接：<a href="https://curl.qcloud.com/1mik3tYN" target="_blank" rel="noopener noreferrer">https://curl.qcloud.com/1mik3tYN</a></p>
<p><img src="https://static.didispace.com/images3/a4213564dbfd17f30229a5caf8ee01db.png" alt=""></p>
<p>根据你要玩的游戏，点击不同的专区，目前支持：《幻兽帕鲁》和《雾锁王国》</p>
<ol start="2">
<li>选择机器配置</li>
</ol>
<p>选择好游戏之后，下面会展现支持的规格（如下图所示），根据一起玩的人数来选择配置即可：</p>
<p><img src="https://static.didispace.com/images3/c9d6eeb82d943b5e7a2d6427543ff621.png" alt=""></p>
<p>如果您是腾讯云新用户，直接在前三个里选择就可以了。（提示：问周围的朋友搞个账号也不是不可以 ^_^）</p>
<ol start="3">
<li>根据游戏选择模版</li>
</ol>
<p>确定了需要的配置之后，根据下图1、2、3操作，部署你需要的游戏模版：</p>
<p><img src="https://static.didispace.com/images3/12f2ef5cb2f2ccde416a3930ae0b1331.png" alt=""></p>
<ol start="4">
<li>支付完成之后，点击“查看实例”</li>
</ol>
<p><img src="https://static.didispace.com/images3/d92bb1aee19123b7322ef17ecb335601.png" alt=""></p>
<p>可以看到实例在创建，稍等片刻就可完成部署。</p>
<p><img src="https://static.didispace.com/images3/6e7d39be5ea67ed044b96445eee119f9.png" alt=""></p>
<h2> 《幻兽帕鲁》如何使用</h2>
<p>《幻兽帕鲁》服务器完成部署之后，只需要复制实例的公网IP地址，具体如下红色箭头位置：</p>
<p><img src="https://static.didispace.com/images3/6e3e205fc771fae575dbebdc41cc3db4.png" alt=""></p>
<p>打开游戏客户端，选择<strong>加入多人游戏（专用服务器）</strong></p>
<p><img src="https://static.didispace.com/images3/2fc138784ea4cb5f263e42365c67ec11.png" alt=""></p>
<p>把刚刚获得的公网IP地址粘贴替换<code>127.0.0.1</code>（保留<code>:8211</code>），点击“联系”就可以开始玩了！</p>
<h2> 《雾锁王国》如何使用</h2>
<p>《雾锁王国》在部署完成后，在腾讯云控制台右上角找到站内信：</p>
<p><img src="https://static.didispace.com/images3/66c28143d0cc983698dd1997f8379b7b.png" alt=""></p>
<p>找到《雾锁王国》部署完成的提示，这里有服务器登录账号和密码，回到之前的实例卡片界面：</p>
<p><img src="https://static.didispace.com/images3/f3bb43551ed82610d466834cbab46b37.png" alt=""></p>
<p>使用站内信中获得账号密码登录，在桌面内找到<code>Enshrouded.txt</code>文件，里面有一个<code>服务器名称</code>，把它复制下来。</p>
<p>打开游戏客户端，选择<code>加入一局在线游戏</code></p>
<p><img src="https://static.didispace.com/images3/8f2c91f150d8fe885396f1a0f8b5a6fa.png" alt=""></p>
<p>搜索上面获得的服务器名称，就可以进入游戏啦</p>
<p><img src="https://static.didispace.com/images3/ba69ad1aa204f1c42b35f67e6afaf8ec.png" alt=""></p>
<h1> 小结</h1>
<p>这波游戏热潮，除了休闲娱乐之外，DD还在想，或许有玩家资源的小伙伴也可以考虑是否可以构建一个SaaS服务来提供更细粒度的资源出租服务，这样对于一些轻度使用的玩家是否会更加友好和经济，感兴趣的小伙伴可以试试～</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/a4213564dbfd17f30229a5caf8ee01db.png" type="image/png"/>
    </item>
    <item>
      <title>一个神器的项目：让 Python 在 HTML 中运行</title>
      <link>https://www.didispace.com/article/pyscript-alpha.html</link>
      <guid>https://www.didispace.com/article/pyscript-alpha.html</guid>
      <source url="https://www.didispace.com/rss.xml">一个神器的项目：让 Python 在 HTML 中运行</source>
      <description>一个神器的项目：让 Python 在 HTML 中运行 大家好，我是DD，已经是封闭在家的第51天了！ 最近一直在更新Java新特性（https://www.didispace.com/java-features/）和IDEA Tips（https://www.didispace.com/idea-tips/）两个原创专栏，其他方向内容的动态关注少了。昨天天晚上刷推的时候，瞄到了这个神奇的东西，觉得挺cool的，拿出来分享下：</description>
      <category>前沿资讯</category>
      <pubDate>Sun, 08 May 2022 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 一个神器的项目：让 Python 在 HTML 中运行</h1>
<p>大家好，我是DD，已经是封闭在家的第51天了！</p>
<p>最近一直在更新Java新特性（https://www.didispace.com/java-features/）和IDEA Tips（https://www.didispace.com/idea-tips/）两个原创专栏，其他方向内容的动态关注少了。昨天天晚上刷推的时候，瞄到了这个神奇的东西，觉得挺cool的，拿出来分享下：</p>
<p><img src="https://static.didispace.com/images/202205/pyscript-alpha/2022-05-09T135848.png" alt=""></p>
<p>相信你看到图，不用我说，你也猜到是啥了吧？<strong>html里可以跑python代码了</strong>！</p>
<p>看到好多Python公众号已经开始猛吹未来了，但乍看怎么觉得有点像JSP？或者一些模版引擎？是进步还是倒退呢？与其瞎想，不如仔细看看这个东东的能力吧！</p>
<p>根据官方介绍，这个名为<strong>PyScript</strong>的框架，其核心目标是为开发者提供在标准HTML中嵌入Python代码的能力，使用 Python调用JavaScript函数库，并以此实现利用Python创建Web应用的功能。</p>
<p>看到介绍里提到了调用JavaScript函数库的能力，看来跟JSP或者模版引擎还是有区别的。</p>
<h2> PyScript 快速体验</h2>
<p>官方给了一个例子，可以帮助我们观的感受这个开发框架的能力，不妨跟着DD看看，它能做啥吧！</p>
<p><strong>第一个案例，hello world</strong></p>
<p>代码很简单，就下面这几行。你只需要创建一个html文件，然后复制进去就可以了。</p>
<div class="language-html line-numbers-mode" data-ext="html"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>保存好之后，在浏览器里打开就能看到这样的页面了：</p>
<p><img src="https://static.didispace.com/images/202205/pyscript-alpha/2022-05-09T134415.png" alt=""></p>
<p>回头再看看这个html里的内容，三个核心内容：</p>
<ul>
<li>引入pyscript的样式文件：<code>&lt;link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" /&gt;</code></li>
<li>引入pyscript的脚本文件：<code>&lt;script defer src="https://pyscript.net/alpha/pyscript.js"&gt;&lt;/script&gt;</code></li>
<li><code>&lt;py-script&gt;</code>标签中写具体的python代码来输出Hello World</li>
</ul>
<blockquote>
<p>本文的两个案例代码我打包放在公众号了，需要的朋友可以关注公众号“程序猿DD”，回复：<strong>pyscript</strong> 获取。</p>
</blockquote>
<p><strong>第二个案例，数据定义 + 数据展示</strong></p>
<p>先创建一个<code>data.py</code>文件，然后加入前面的代码。功能很简单，就是随机生成（x，y）的坐标</p>
<div class="language-python line-numbers-mode" data-ext="py"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>再创建一个html文件，加入下面的代码</p>
<div class="language-html line-numbers-mode" data-ext="html"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里就稍微复杂一些了，除了hello world中的几个要点外，这里还有这几个要关注的地方：</p>
<ul>
<li><code>&lt;py-env&gt;</code>标签：这里声明要引入的包和要引入的文件（上面创建的<code>data.py</code>）</li>
<li><code>&lt;py-script output="plot"&gt;</code>：这里定义了要在<code>&lt;div id="plot"&gt;&lt;/div&gt;</code>中输出的内容，可以看到这里的逻辑都是用python写的</li>
</ul>
<p>这个页面的执行效果是这样的：</p>
<p><img src="https://static.didispace.com/images/202205/pyscript-alpha/2022-05-09T134400.png" alt=""></p>
<p>是不是很神奇呢？整个过程中都没有大家熟悉的cs、js内容，就完成了这样一个图的页面实现。</p>
<h2> 小结</h2>
<p>最后，谈谈在整个尝试过程中，给我的几个感受：</p>
<ol>
<li>开发体验上高度统一，对于python开发者来说，开发Web应用的门槛可以更低了</li>
<li>感觉性能上似乎有所不足，几个复杂的案例执行有点慢，开始以为是部分国外cdn的缘故，后来移到本地后，还是慢。这部分可能还需要进一步优化。</li>
</ol>
<p>这个开发框架目前还只是alpha版本，未来一定还会有更多特性与优化出来，总体上我觉得这个框架还是非常cool的，尤其对于刚学会Python，或者只会Python，但又想快速开发Web应用的小伙伴来说，可能将会是个不错的选择，那你觉得这个框架如何？未来会不会火？留言区聊聊吧！</p>
<blockquote>
<p>本文的两个案例代码我打包放在公众号了，需要的朋友可以关注公众号“程序猿DD”，回复：<strong>pyscript</strong> 获取。</p>
</blockquote>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images/202205/pyscript-alpha/2022-05-09T135848.png" type="image/png"/>
    </item>
    <item>
      <title>盘点 Udemy 上最受欢迎的免费编程课程（1）</title>
      <link>https://www.didispace.com/article/free-course-on-udemy-1.html</link>
      <guid>https://www.didispace.com/article/free-course-on-udemy-1.html</guid>
      <source url="https://www.didispace.com/rss.xml">盘点 Udemy 上最受欢迎的免费编程课程（1）</source>
      <description>盘点 Udemy 上最受欢迎的免费编程课程（1） 之前给大家推荐过一些油管上的免费学习资源，如果您还没有看过的话可以点击这里前往。 今天再给大家推荐一批Udemy上超高质量并且免费的编程课程，有需要的小伙伴可以学起来了。 1. JavaScript Essentials</description>
      <category>资源推荐</category>
      <pubDate>Wed, 21 Feb 2024 12:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 盘点 Udemy 上最受欢迎的免费编程课程（1）</h1>
<p>之前给大家推荐过一些油管上的免费学习资源，如果您还没有看过的话可以<a href="https://www.didispace.com/article/12-free-yb-channel.html" target="_blank" rel="noopener noreferrer">点击这里前往</a>。</p>
<p>今天再给大家推荐一批Udemy上超高质量并且免费的编程课程，有需要的小伙伴可以学起来了。</p>
<h2> 1. JavaScript Essentials</h2>
<p><img src="https://static.didispace.com/images3/9662081ce2441cb24acf03108cc87777.png" alt=""></p>
<p>第一门免费课程是：JavaScript Essentials。顾名思义，本课程旨在帮助您掌握 JavaScript 的基础知识。该课程涵盖基本的 API 并以一个迷你项目结束。这是一个相当小的课程，您仅需要花费6小时30分钟就可以学习完成。</p>
<p>通过这个教程您将学习的内容包括：编程基础知识、语言基础知识及其关键概念，以及JavaScript核心功能。当然，该课程也有一些进阶内容。所以，如果您有一定基础，但觉得基础不够扎实，那也是非常值得一看。</p>
<p>该课程由 Lorenz Tuton 授课，他在 Web 开发、图形设计方面经验丰富，擅长 HTML 和 CSS。 从他在 Udemy 上教授的 7 门课程来看。 截至目前，有近 40 万注册人数和超过 3 万个评分， 学生给这门课程打分 4.5 星（满分 5 星），属于同类最优质的免费教程了。</p>
<p>传送门：https://www.udemy.com/course/javascript-essentials/</p>
<h2> 2. React JS For Beginners</h2>
<p><img src="https://static.didispace.com/images3/fa0817bf1ca8f016269029aa11c20d9a.png" alt=""></p>
<p>这是在 React Js 分类中排名第二的，适合初学者的 React课程。本课程非常适合想要深入了解 React 的初学者，它将带你探索 React 是什么，并了解组件，函数式类型和基于类的类型等知识点。除此之外，您还将深入研究 React 中的状态管理等高级内容。</p>
<p>这个课程也是非常迷你，只需要大约2小时的时间即可完成学习。如果您已经有JavaScript基础，正准备上手 React Js，那么该课程非常适合你。</p>
<p>本课程由 Ashutosh Pawar 教授。 他在 Udemy 上有他的 17 门课程。目前，React.js 初学者免费课程已有超过 27,000 名注册者，评分超过 1K。本课程的总分是 4.6 分（满分 5 分）。</p>
<p>传送门：https://www.udemy.com/course/react-for-beginners-2022/</p>
<h2> 3. Practical PHP: Master the Basics and Code Dynamic Websites</h2>
<p><img src="https://static.didispace.com/images3/88449b890f77a69fbfb6a8cca28ad318.png" alt=""></p>
<p>这是一个适合初学者的PHP动态网站开发教程。观看该视频，你无需任何 PHP 经验，但对 HTML 和 CSS 有基本了解可能会对您有很大帮助。该课程一共有6个多小时，在这里你将学到：PHP基础知识和实用的PHP编码技巧。本课程将带创建各种动态 PHP 示例，并且在最后一部分中，将带你构建一个完整的动态餐厅网站。这对于很多有志于构建网站的开发者来说，非常实用。</p>
<p>该课程由 Brad Hussey 授课，他是一名网页设计师、创作者和营销顾问。同时，他在 Udemy 上教授 12 门课程。这门实用的 PHP 课程目前是该领域最受欢迎的。注册人数已超过 250,000 人，总体评分是 4.5 星（满分 5 星）</p>
<p>传送门：https://www.udemy.com/course/code-dynamic-websites/</p>
<h2> 4. Java Tutorial for Complete Beginners</h2>
<p><img src="https://static.didispace.com/images3/95404c13968b10a9319ecb91f5bcbe39.png" alt=""></p>
<p>这是一个适合Java初学者的教程，本课程将为你讲解所有 Java 基础知识。这个课程内容非常饱满，一共需要超过16个小时才能完成。该课程包含了：Java基础、Java核心编程、Java集合编程、Eclipse的使用、Debug技巧、面试技巧、Java 8的新功能（对于Java 8之后，Java 9 - 21的最新特性，DD给大家推荐我一直在连载的<a href="https://www.didispace.com/java-features/" target="_blank" rel="noopener noreferrer">Java 新特性专栏</a>，感兴趣的小伙伴欢迎收藏）、测试等基础和进阶内容。</p>
<p>该课程由 John Purcell 授课。他作为软件开发人员在大公司工作了 14 年。目前 John 在 Udemy 上教授 19 门课程。该课程也是这个分类中目前最受欢迎的课程。截至目前，已有近200万学生观看学习，还有近10万条评论，总体评分为 4.5 分（满分 5 分）。</p>
<p>传送门：https://www.udemy.com/course/java-tutorial/</p>
<h2> 5. Foundations of Front-End Web Development</h2>
<p><img src="https://static.didispace.com/images3/5214e4546513be5d22b3df37caf5522c.png" alt=""></p>
<p>前端 Web 开发的基础教程，该视频教程将带观众学习前端 Web 开发的所有知识。众所周时，Web开发的知识非常杂且多，所以该教程的伟大之处在于它从头开始教您前端 Web 开发的所有知识。如果刚接触Web开发，强烈推荐您优先学习这个课程。通过这个课程，您将学到：HTML 和 CSS 基础知识、 响应式 Web 开发、 JavaScript、AJAX、jQuery、Backbone.js 和 单元测试。</p>
<p>本课程的讲师是：David Molin，他是一名全栈软件开发人员，他作为开发人员已有二十多年的经验，现在提供培训和咨询服务。该课程是他在 Udemy 上教授的唯一课程，注册人数超过20万，有超过 10,000 条评论，总体评分为 4.4 分（满分 5 分）。</p>
<p>该课程的作者还承诺，完成该课程后，你在面试时会更加自信 ^_^</p>
<p>传送门：https://www.udemy.com/course/foundations-of-front-end-development/</p>
<p><strong>暂时先盘点这5个极佳的免费学习教程，后面又发现其他的继续推荐给大家。欢迎关注程序猿DD的博客、公众号，我会持续给大家分享开发者相关的内容。</strong></p>
<h2> 英语不好，工具来凑</h2>
<p>这些 Udemy 上教程真的非常优质，但是如果你因为英语不好而错过了这些免费的学习资料，那真的太可惜了！</p>
<p>这里DD再给大家推荐一款浏览器插件：<a href="https://www.youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">YouTube中文配音</a>，目前已经支持一键在线翻译 Udemy 上的视频了。最重要的是，该功能还是免费的！<strong>重要的事情说三遍：免费！免费！免费！</strong></p>
<p>所以，大家不用害怕这些英文资料，其实学起来很容易～</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/9662081ce2441cb24acf03108cc87777.png" type="image/png"/>
    </item>
    <item>
      <title>React Native 和 Flutter 怎么选</title>
      <link>https://www.didispace.com/youtube/framework-reactnative-flutter.html</link>
      <guid>https://www.didispace.com/youtube/framework-reactnative-flutter.html</guid>
      <source url="https://www.didispace.com/rss.xml">React Native 和 Flutter 怎么选</source>
      <description>React Native 和 Flutter 怎么选 React Native 和 Flutter 是跨平台应用开发框架的领导者，它们各有优势和局限的地方，所以它们都有存在和被选择的场景，这取决于开发者的项目需求、成本预算和团队能力。如果你是为了考虑就业，那么所处地区的岗位机会和薪资水平也都是考虑因素。 下面这个视频分别介绍了 React Native 和 Flutter 在各方面的对比，比如：编程语言、社区生态、文档质量、可扩展性、维护成本、性能对比等开发者关注的内容。</description>
      <category>技术科普</category>
      <pubDate>Sun, 18 Feb 2024 12:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> React Native 和 Flutter 怎么选</h1>
<p>React Native 和 Flutter 是跨平台应用开发框架的领导者，它们各有优势和局限的地方，所以它们都有存在和被选择的场景，这取决于开发者的项目需求、成本预算和团队能力。如果你是为了考虑就业，那么所处地区的岗位机会和薪资水平也都是考虑因素。</p>
<p>下面这个视频分别介绍了 React Native 和 Flutter 在各方面的对比，比如：编程语言、社区生态、文档质量、可扩展性、维护成本、性能对比等开发者关注的内容。</p>
]]></content:encoded>
    </item>
    <item>
      <title>有意思，我的GitHub账号值$23806.2，快来试试你的？</title>
      <link>https://www.didispace.com/article/estimate-github-worth-generator.html</link>
      <guid>https://www.didispace.com/article/estimate-github-worth-generator.html</guid>
      <source url="https://www.didispace.com/rss.xml">有意思，我的GitHub账号值$23806.2，快来试试你的？</source>
      <description>有意思，我的GitHub账号值$23806.2，快来试试你的？ 睡不着，看到一个有意思的网站：Estimate Github Worth Generator。 它可以用来估算 GitHub 账号的价值。马上试了一下，​我的账号估值：$23806.2 周五了，摸摸鱼，来试试吧。</description>
      <category>日常记录</category>
      <pubDate>Fri, 29 Dec 2023 03:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 有意思，我的GitHub账号值$23806.2，快来试试你的？</h1>
<p>睡不着，看到一个有意思的网站：<strong>Estimate Github Worth Generator</strong>。</p>
<p>它可以用来估算 GitHub 账号的价值。马上试了一下，​我的账号估值：<strong>$23806.2</strong></p>
<p><img src="https://static.didispace.com/images3/57300adc2c1281584c29c41c28dfb74b.png" alt=""></p>
<p>周五了，摸摸鱼，来试试吧。</p>
<p>操作很简单，点击<a href="https://github-worth.vercel.app/" target="_blank" rel="noopener noreferrer">Estimate Github Worth Generator</a>，进入网站。</p>
<p>具体如下图：</p>
<p><img src="https://static.didispace.com/images3/9f82720d9d41145a680c3c389c42b2cd.png" alt=""></p>
<p>在唯一的输入框中，输入您的GitHub账号，点击按钮<code>Generate Worth</code>按钮，就能获得文章开头的估值图片了。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/57300adc2c1281584c29c41c28dfb74b.png" type="image/png"/>
    </item>
    <item>
      <title>Git是如何工作的？</title>
      <link>https://www.didispace.com/youtube/how-git-work.html</link>
      <guid>https://www.didispace.com/youtube/how-git-work.html</guid>
      <source url="https://www.didispace.com/rss.xml">Git是如何工作的？</source>
      <description>Git是如何工作的？ Git乍一看似乎令人困惑，但理解一些关键概念会让它变得更加清晰。在下面这个视频中，我们将介绍基本的 Git 命令工作流程并消除一些常见的误解。</description>
      <category>技术科普</category>
      <pubDate>Thu, 30 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Git是如何工作的？</h1>
<p><code>Git</code>乍一看似乎令人困惑，但理解一些关键概念会让它变得更加清晰。在下面这个视频中，我们将介绍基本的 Git 命令工作流程并消除一些常见的误解。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/0a7bff600a59548dcefdecdc3a15c7f8.png" type="image/png"/>
    </item>
    <item>
      <title>快速认识什么是：Docker</title>
      <link>https://www.didispace.com/youtube/what-is-docker.html</link>
      <guid>https://www.didispace.com/youtube/what-is-docker.html</guid>
      <source url="https://www.didispace.com/rss.xml">快速认识什么是：Docker</source>
      <description>快速认识什么是：Docker Docker，一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢？ 今天就来一起学快速入门一下Docker吧！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</description>
      <category>技术科普</category>
      <pubDate>Fri, 24 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 快速认识什么是：Docker</h1>
<p>Docker，一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢？</p>
<p>今天就来一起学快速入门一下Docker吧！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/135c7d070c2266718faf87c4360d6481.png" type="image/png"/>
    </item>
    <item>
      <title>快速认识，后端王者语言：Java</title>
      <link>https://www.didispace.com/youtube/what-is-java.html</link>
      <guid>https://www.didispace.com/youtube/what-is-java.html</guid>
      <source url="https://www.didispace.com/rss.xml">快速认识，后端王者语言：Java</source>
      <description>快速认识，后端王者语言：Java Java作为最热门的开发语言之一，长居各类排行榜的前三。所以，就算你目前不是用Java开发，你应该了解Java语言的特点，能用来做什么，以备不时之需。您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助</description>
      <category>技术科普</category>
      <pubDate>Tue, 21 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 快速认识，后端王者语言：Java</h1>
<p>Java作为最热门的开发语言之一，长居各类排行榜的前三。所以，就算你目前不是用Java开发，你应该了解Java语言的特点，能用来做什么，以备不时之需。您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/eb0beaf6d491a378e1b40302f2be68d6.png" type="image/png"/>
    </item>
    <item>
      <title>快速认识，前端必学编程语言：JavaScript</title>
      <link>https://www.didispace.com/youtube/what-is-javascript.html</link>
      <guid>https://www.didispace.com/youtube/what-is-javascript.html</guid>
      <source url="https://www.didispace.com/rss.xml">快速认识，前端必学编程语言：JavaScript</source>
      <description>快速认识，前端必学编程语言：JavaScript JavaScript是构建Web应用必学的一门编程语言，也是最受开发者欢迎的热门语言之一。所以，如果您还不知道JavaScript的用处、特点的话，赶紧补充一下这块基础知识。您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</description>
      <category>技术科普</category>
      <pubDate>Sun, 03 Dec 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 快速认识，前端必学编程语言：JavaScript</h1>
<p>JavaScript是构建Web应用必学的一门编程语言，也是最受开发者欢迎的热门语言之一。所以，如果您还不知道JavaScript的用处、特点的话，赶紧补充一下这块基础知识。您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/fed0bd87b18fc617ac9e6b05b70dbd88.png" type="image/png"/>
    </item>
    <item>
      <title>快速认识什么是：Kubernetes</title>
      <link>https://www.didispace.com/youtube/what-is-kubernetes.html</link>
      <guid>https://www.didispace.com/youtube/what-is-kubernetes.html</guid>
      <source url="https://www.didispace.com/rss.xml">快速认识什么是：Kubernetes</source>
      <description>快速认识什么是：Kubernetes 每次谈到容器的时候，除了Docker之外，都会说起 Kubernetes，那么什么是 Kubernetes呢？ 今天就来一起学快速入门一下 Kubernetes 吧！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</description>
      <category>技术科普</category>
      <pubDate>Mon, 27 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 快速认识什么是：Kubernetes</h1>
<p>每次谈到容器的时候，除了Docker之外，都会说起 Kubernetes，那么什么是 Kubernetes呢？</p>
<p>今天就来一起学快速入门一下 Kubernetes 吧！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/545abba9ac95c707c1b9270e406bedbc.png" type="image/png"/>
    </item>
    <item>
      <title>快速认识，什么是机器学习</title>
      <link>https://www.didispace.com/youtube/what-is-machine-learning.html</link>
      <guid>https://www.didispace.com/youtube/what-is-machine-learning.html</guid>
      <source url="https://www.didispace.com/rss.xml">快速认识，什么是机器学习</source>
      <description>快速认识，什么是机器学习 随着ChatGPT的火热，越来越的人开始尝试学习AI相关的知识。其中，机器学习是无法逃开的一个概念，所以弄懂什么是机器学习很有必要。 今天就来一起学快速入门一下什么是机器学习！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</description>
      <category>技术科普</category>
      <pubDate>Sat, 25 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 快速认识，什么是机器学习</h1>
<p>随着ChatGPT的火热，越来越的人开始尝试学习AI相关的知识。其中，机器学习是无法逃开的一个概念，所以弄懂什么是机器学习很有必要。</p>
<p>今天就来一起学快速入门一下什么是机器学习！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/a8d0f1e21eb58aa4a5194666f699e6ba.png" type="image/png"/>
    </item>
    <item>
      <title>被吐槽最多但又大范围使用的的编程语言：PHP</title>
      <link>https://www.didispace.com/youtube/what-is-php.html</link>
      <guid>https://www.didispace.com/youtube/what-is-php.html</guid>
      <source url="https://www.didispace.com/rss.xml">被吐槽最多但又大范围使用的的编程语言：PHP</source>
      <description>被吐槽最多但又大范围使用的的编程语言：PHP PHP，一种动态的解释性脚本语言，用于在服务器上构建交互式网站。尽管现在很多开发者都讨厌它，并宣布它已经死了；但事实上，它仍然是后端 Web 开发最流行的语言之一。 今天就来一起认识一下这个饱受争议的编程语言！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助</description>
      <category>技术科普</category>
      <pubDate>Sat, 02 Dec 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 被吐槽最多但又大范围使用的的编程语言：PHP</h1>
<p>PHP，一种动态的解释性脚本语言，用于在服务器上构建交互式网站。尽管现在很多开发者都讨厌它，并宣布它已经死了；但事实上，它仍然是后端 Web 开发最流行的语言之一。</p>
<p><img src="https://static.didispace.com/images3/582db13acc91f5913eebe25de96a3db0.png" alt=""></p>
<p>今天就来一起认识一下这个饱受争议的编程语言！您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/582db13acc91f5913eebe25de96a3db0.png" type="image/png"/>
    </item>
    <item>
      <title>2分钟，快速认识热门编程语言：Python</title>
      <link>https://www.didispace.com/youtube/what-is-python.html</link>
      <guid>https://www.didispace.com/youtube/what-is-python.html</guid>
      <source url="https://www.didispace.com/rss.xml">2分钟，快速认识热门编程语言：Python</source>
      <description>2分钟，快速认识热门编程语言：Python Python，一种高级解释性编程语言。它可以说是世界上最流行的语言，因为它易于学习，而且对于严肃的项目来说很实用。 今天就来一起快速认识一下作为最热门编程语言之一的Python。您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。 它由 Guido van Rossum 创建并于 1991 年发布，他以 Monty Python 的 Flying Circus 命名它，这就是为什么您有时会在代码示例中找到垃圾邮件和鸡蛋，而不是 foo 和 bar。</description>
      <category>技术科普</category>
      <pubDate>Fri, 01 Dec 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 2分钟，快速认识热门编程语言：Python</h1>
<p>Python，一种高级解释性编程语言。它可以说是世界上最流行的语言，因为它易于学习，而且对于严肃的项目来说很实用。</p>
<p>今天就来一起快速认识一下作为最热门编程语言之一的Python。您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</p>
<p><img src="https://static.didispace.com/images3/f9278bc304f60cb4d19051e23f2b2281.png" alt=""></p>
<p>它由 Guido van Rossum 创建并于 1991 年发布，他以 Monty Python 的 Flying Circus 命名它，这就是为什么您有时会在代码示例中找到垃圾邮件和鸡蛋，而不是 foo 和 bar。</p>
<p>它通常用于构建服务器端应用程序，例如：使用 Django 框架的 Web 应用程序，它也是大数据分析和机器学习的首选语言。</p>
<p>许多学生选择 Python 来开始学习编码，因为正如 Python Zen 所概述的那样，它强调可读性。美丽胜于丑陋，显性胜于隐性。</p>
<p><img src="https://static.didispace.com/images3/4b6fbd8b54adccfd772f4e2620abe2c4.png" alt=""></p>
<p>Python非常简单，但避免了因施展魔法而导致歧义的诱惑。它的代码通常被组织到笔记本中，可以在其中执行各个单元，然后将其记录在同一位置。</p>
<p>我们目前使用的是该语言的第 3 版，您可以通过创建一个以<code>.py</code> 或 <code>.ipynb</code> 结尾的文件来开始编写代码。</p>
<p><img src="https://static.didispace.com/images3/969b923d5abe0791d8947a952d652444.png" alt=""></p>
<p>Python通过下面的方式来来创建变量：</p>
<p><img src="https://static.didispace.com/images3/7a66b420f6ceb79ebfb506a1c3ea36f3.png" alt=""></p>
<p>它是强类型的，这意味着值不会以意外的方式更改</p>
<p><img src="https://static.didispace.com/images3/d1c47cca603e6f3cacc0ac40f9ea566b.png" alt=""></p>
<p>但它是动态的，因此不需要类型注释。</p>
<p>语法非常高效，它允许您在一行上声明多个变量并使用文字语法定义元组、列表和字典。</p>
<p><img src="https://static.didispace.com/images3/0e9e428af578d74d7600780e26967114.png" alt=""></p>
<p><img src="https://static.didispace.com/images3/388947e533cc86244c57b9a066ca7f49.png" alt=""></p>
<p>在Python中，分号不是必需的，如果你使用它们，经验丰富的 Pythonista 会说你的代码不是 Pythonic。</p>
<p><img src="https://static.didispace.com/images3/70a6a008554ff7172c3af3df302cfd77.png" alt=""></p>
<p>Python 使用缩进来终止或确定一行代码的范围，而不是分号</p>
<p><img src="https://static.didispace.com/images3/4ff11a43a3dc35cad12dc5e42c7f6d54.png" alt=""></p>
<p>使用 <code>def</code> 关键字定义函数，然后缩进下一行（通常缩进四个空格）以定义函数体。然后，我们可以向其中添加一个 for 循环，并再缩进四个空格。</p>
<p><img src="https://static.didispace.com/images3/c96a0b4d20259a23ed423d31b3a16f70.png" alt=""></p>
<p>这消除了对许多其他语言中的花括号和分号的需要。</p>
<p>Python 是一种多范式语言。我们可以将函数式编程模式应用于使用 lambda 的匿名函数等。</p>
<p><img src="https://static.didispace.com/images3/e24483951047f4cc5d81d8794c2a3bc0.png" alt=""></p>
<p>它还使用对象作为数据的抽象，允许您使用类和继承等实现面向对象的模式。</p>
<p><img src="https://static.didispace.com/images3/1bd253078ff08f5d61fa9c96f01e95b8.png" alt=""></p>
<p>它还拥有庞大的第三方库生态系统，例如 TensorFlow 等深度学习框架，以及 OpenComputerVision 等许多高性能低级包的包装器，这些包通常与 pip 包管理器一起安装。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/f9278bc304f60cb4d19051e23f2b2281.png" type="image/png"/>
    </item>
    <item>
      <title>2分钟，快速认识什么是SQL</title>
      <link>https://www.didispace.com/youtube/what-is-sql.html</link>
      <guid>https://www.didispace.com/youtube/what-is-sql.html</guid>
      <source url="https://www.didispace.com/rss.xml">2分钟，快速认识什么是SQL</source>
      <description>2分钟，快速认识什么是SQL 结构化查询语言，简称SQL，它是与关系数据库管理系统通信的黄金标准语言。今天就来一起快速认识一下什么是SQL，您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。 您可能听说过 MySQL、Postgres、Microsoft SQL Server 和 Oracle 等数据库，所有这些数据库都基于 SQL，但有自己的微小变化。它最初是在 70 年代初开发的，用于修改和检索 IBM System R 数据库中的数据。到 1986 年，它被标准化为语法，至今在技术应用中仍然非常流行。</description>
      <category>技术科普</category>
      <pubDate>Fri, 01 Dec 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 2分钟，快速认识什么是SQL</h1>
<p>结构化查询语言，简称SQL，它是与关系数据库管理系统通信的黄金标准语言。今天就来一起快速认识一下什么是SQL，您可以通过以下的文字内容学习，也可以通过文末的视频学习，希望本文对您有所帮助。</p>
<p><img src="https://static.didispace.com/images3/9233ad25595d08d87026177fe24d13e1.png" alt=""></p>
<p>您可能听说过 MySQL、Postgres、Microsoft SQL Server 和 Oracle 等数据库，所有这些数据库都基于 SQL，但有自己的微小变化。它最初是在 70 年代初开发的，用于修改和检索 IBM System R 数据库中的数据。到 1986 年，它被标准化为语法，至今在技术应用中仍然非常流行。</p>
<p><img src="https://static.didispace.com/images3/49765aab06406e6fa82ad6f8dcbb53c4.png" alt=""></p>
<p>关系数据库将数据组织到表中，有点像 Excel 电子表格，其中列包含数据的属性或类型。</p>
<p><img src="https://static.didispace.com/images3/ee9caaeeff73c3d5058b74c7bad327ba.png" alt=""></p>
<p>每行代表一个单独的记录或数据点，具有自己的唯一 ID（称为主键）。</p>
<p><img src="https://static.didispace.com/images3/2866469cc61c97a1ebb374f9e9b60967.png" alt=""></p>
<p>我们可以通过从一行获取唯一 ID，并将其存储在不同表的不同行中称为外键的特殊列中来建立数据点之间的关系。</p>
<p><img src="https://static.didispace.com/images3/17fb8a548a77701d1a64b621371ea1eb.png" alt=""></p>
<p>在球队表中，球队ID是主键，但在球员表中，它是外键。</p>
<p><img src="https://static.didispace.com/images3/d65d188a26f5ec690c63fc832aae7365.png" alt=""></p>
<p>这个数据结构告诉我们的是，一名球员属于一个球队，而一个球队可以有多名球员。</p>
<p>我们在这里所做的是以最小的范式构建数据，以消除重复和冗余。现在，SQL 的作用不仅是读取、创建、更新和删除数据，而且还根据数据中嵌入的关系将数据连接在一起。</p>
<p>SQL语法由几个关键部分组成。如果我们一直缩小，我们就会有一个语句或一段代码来执行某些操作，例如：读取或写入数据库。</p>
<p>在语句中，我们有各种可以操作数据库的关键字。</p>
<p><code>SELECT</code> 可用于查询表中所需的列。列名和表名被称为标识符</p>
<p><img src="https://static.didispace.com/images3/cc0bc7e0ed2c70c123593dab8ebf2c1f.png" alt=""></p>
<p>但我们可能不需要表中的每一行，因此我们使用 WHERE 关键字过滤结果，以仅包含满足特定条件的记录。</p>
<p><img src="https://static.didispace.com/images3/434a06a7f4fcf362fa8ecad807fcaf3a.png" alt=""></p>
<p>这就像循环遍历表中的每一行，并且只返回查询中谓词计算结果为 true 的行。</p>
<p>然后，我们可以使用 JOIN 关键字连接来自完全不同的表的数据，方法是将该表上的主键与另一个表上的外键相匹配。</p>
<p><img src="https://static.didispace.com/images3/38a46a7087b86bc3b846edf641842377.png" alt=""></p>
<p>我们创建的是组成完整 SQL 语句的子句集合。我们现在可以在数百个支持 SQL 的不同数据库上执行此代码。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/9233ad25595d08d87026177fe24d13e1.png" type="image/png"/>
    </item>
    <item>
      <title>推荐12个免费的顶级学习频道</title>
      <link>https://www.didispace.com/article/12-free-yb-channel.html</link>
      <guid>https://www.didispace.com/article/12-free-yb-channel.html</guid>
      <source url="https://www.didispace.com/rss.xml">推荐12个免费的顶级学习频道</source>
      <description>推荐12个免费的顶级学习频道 YouTube是一个免费的学习资源，但是98%的人没有有效地利用它。 DD在x上看到有博主分享了12个顶级的频道，而且还是免费的资源。所以，必须得给大家推荐一下，与其把空闲时间放在抖音、微博这些没有营养、又充满负能量的地方，不如用这些知识来充实自己吧。 如果你担心这些英文视频没有中文字幕（确实没）而看不懂？也不用担心，顺手给大家推荐个Chrome插件YouTube中文配音，可以一键实现翻译 + 配音，让你更高效的学习这些免费课程。</description>
      <category>资源推荐</category>
      <pubDate>Wed, 22 Nov 2023 12:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 推荐12个免费的顶级学习频道</h1>
<p>YouTube是一个免费的学习资源，但是98%的人没有有效地利用它。</p>
<p>DD在x上看到有博主分享了12个顶级的频道，而且还是免费的资源。所以，必须得给大家推荐一下，与其把空闲时间放在抖音、微博这些没有营养、又充满负能量的地方，不如用这些知识来充实自己吧。</p>
<p>如果你担心这些英文视频没有中文字幕（确实没）而看不懂？也不用担心，顺手给大家推荐个Chrome插件<a href="https://youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">YouTube中文配音</a>，可以一键实现翻译 + 配音，让你更高效的学习这些免费课程。</p>
<p>如果您不方便查查看这些内容，也可以关注我的<a href="https://space.bilibili.com/396803537" target="_blank" rel="noopener noreferrer">B站</a>，我会将有趣的知识翻译好之后，发布到B站上，感兴趣的小伙伴根据自己平时习惯选择订阅即可。</p>
<h2> 1. Big Think</h2>
<p>Big Think发布各个领域的专业、教育性的专家驱动信息。</p>
<p>https://youtube.com/@bigthink/featured</p>
<p><img src="https://static.didispace.com/images3/774f7fe5f596443fdee35547d5ca942b.png" alt=""></p>
<h2> 2. Thomas Frank</h2>
<p>Thomas教你如何有效地学习和提高生产力。</p>
<p>https://youtube.com/@Thomasfrank/videos</p>
<p><img src="https://static.didispace.com/images3/22629ff4eb0f78bc33bc14b63c511555.png" alt=""></p>
<h2> 3. FreeCodeCamp</h2>
<p>FreeCodeCamp是学习如何免费编程的最佳在线资源。</p>
<p>学习Web开发、Python、JavaScript、SQL、C++等。</p>
<p>https://youtube.com/@freecodecamp/videos</p>
<p><img src="https://static.didispace.com/images3/6a4742db6a18a8d3a6a446bbab169d3b.png" alt=""></p>
<h2> 4. Tim Ferriss</h2>
<p>Tim谈论自我提升和健康，并定期与各行各业的杰出人士进行采访。</p>
<p>https://youtube.com/@timferriss/featured</p>
<p><img src="https://static.didispace.com/images3/1f3eef8294420c05081afe01a3e1aedc.png" alt=""></p>
<h2> 5. Matt D'Avella</h2>
<p>Matt D'Avella将教你如何停止拖延、培养新的习惯，并每天定时起床。</p>
<p>https://youtube.com/@MattDAvella</p>
<p><img src="https://static.didispace.com/images3/83d78b3a50f325ea2c606753c598914f.png" alt=""></p>
<h2> 6. Ali Abdaal</h2>
<p>Ali提供商业课程以及提高生产力和成为更好的内容创作者的技巧。</p>
<p>https://www.youtube.com/@aliabdaal/featured</p>
<p><img src="https://static.didispace.com/images3/f84b9508e7a9d6fd038119cbd4802bfa.png" alt=""></p>
<h2> 7. MIT OpenCourseWare</h2>
<p>该频道提供从实际MIT课程中提供的免费课程。你可以学习数学、科学、工程和其他学科。</p>
<p>https://youtube.com/@mitocw/videos</p>
<p><img src="https://static.didispace.com/images3/4ee02d7cb18104db897f70c014b5affb.png" alt=""></p>
<h2> 8. Nathaniel Drew</h2>
<p>Nathaniel Drew的视频专注于与其他人分享如何在数字时代创造心智清晰。</p>
<p>在我看来是最好的Youtube频道。</p>
<p>https://youtube.com/@nathanieldrew/videos</p>
<p><img src="https://static.didispace.com/images3/31f9e3d799fd02f0b65aae0e370ee169.png" alt=""></p>
<h2> 9. Iman Gadzhi</h2>
<p>你将从Iman Gadzhi身上学习如何创造更具适应性的心态、生活方式和业务。</p>
<p>一定要看看他关于冥想模式和多巴胺排毒的视频。</p>
<p>https://youtube.com/@ImanGadzhi/videos</p>
<p><img src="https://static.didispace.com/images3/336c31bfa2c26582cd199ab2f4b3bcad.png" alt=""></p>
<h2> 10. Stanford Graduate School of Business</h2>
<p>免费的讲座和演讲来自世界顶级商学院——斯坦福。</p>
<p>https://youtube.com/@stanfordgsb/videos</p>
<p><img src="https://static.didispace.com/images3/6eec25c774937d89b7fef30a5080b5d0.png" alt=""></p>
<h2> 11. Better ideas</h2>
<p>通过观看这个YouTube频道，你可以更好地理解你的缺乏生产力、疲劳和生活的意义。</p>
<p>https://youtube.com/@betterideas/videos</p>
<p><img src="https://static.didispace.com/images3/96347d0e06b641528c714b477ac2c213.png" alt=""></p>
<h2> 12. Crash course</h2>
<p>学习各种主题，包括生物学、历史等。</p>
<p>为了吸引观众，Crash course结合了历史视频、解释性说明和讽刺。</p>
<p>https://youtube.com/@crashcourse/videos</p>
<p><img src="https://static.didispace.com/images3/4d300366352b1876d5405b64bb0fa5f5.png" alt=""></p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/774f7fe5f596443fdee35547d5ca942b.png" type="image/png"/>
    </item>
    <item>
      <title>抽象有时候让代码更加糟糕</title>
      <link>https://www.didispace.com/youtube/abstract-maybe-worse.html</link>
      <guid>https://www.didispace.com/youtube/abstract-maybe-worse.html</guid>
      <source url="https://www.didispace.com/rss.xml">抽象有时候让代码更加糟糕</source>
      <description>抽象有时候让代码更加糟糕 抽象可以复用类似的逻辑，但你有想过抽象所带来的耦合效应吗？ 疯狂的抽象真的好吗？你是如何在抽象和耦合之间做平衡的呢？ 下面视频从抽象的好处到坏处，很好的说明了抽象与耦合的关系，一起来学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Sun, 19 Nov 2023 18:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 抽象有时候让代码更加糟糕</h1>
<p>抽象可以复用类似的逻辑，但你有想过抽象所带来的耦合效应吗？</p>
<p>疯狂的抽象真的好吗？你是如何在抽象和耦合之间做平衡的呢？</p>
<p>下面视频从抽象的好处到坏处，很好的说明了抽象与耦合的关系，一起来学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>写代码时候，如何命名参数、方法、类名等更好？</title>
      <link>https://www.didispace.com/youtube/naming-things-in-code.html</link>
      <guid>https://www.didispace.com/youtube/naming-things-in-code.html</guid>
      <source url="https://www.didispace.com/rss.xml">写代码时候，如何命名参数、方法、类名等更好？</source>
      <description>写代码时候，如何命名参数、方法、类名等更好？ 每天我们写代码的时候，面临作为的问题，就是给参数、方法、类等要素起名字。你平时都是按怎么样的规则来起名呢？ 下面的视频非常生动的介绍了一些什么样的命名是好的，什么样的命名是不好的，同时以详细的案例告诉你，为什么好，为什么不好。 一起来学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Mon, 20 Nov 2023 09:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 写代码时候，如何命名参数、方法、类名等更好？</h1>
<p>每天我们写代码的时候，面临作为的问题，就是给参数、方法、类等要素起名字。你平时都是按怎么样的规则来起名呢？</p>
<p>下面的视频非常生动的介绍了一些什么样的命名是好的，什么样的命名是不好的，同时以详细的案例告诉你，为什么好，为什么不好。</p>
<p>一起来学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>2分钟认识：什么是Nginx，用来做什么</title>
      <link>https://www.didispace.com/youtube/what-is-nginx.html</link>
      <guid>https://www.didispace.com/youtube/what-is-nginx.html</guid>
      <source url="https://www.didispace.com/rss.xml">2分钟认识：什么是Nginx，用来做什么</source>
      <description>2分钟认识：什么是Nginx，用来做什么 不论你是前端开发还是后端开发，Nginx都是逃不开的一个重要中间件。 如果您还不了解Nginx，那么至少通过下面的视频，2分钟了解一下，它可以用来做啥：</description>
      <category>技术科普</category>
      <pubDate>Fri, 17 Nov 2023 18:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 2分钟认识：什么是Nginx，用来做什么</h1>
<p>不论你是前端开发还是后端开发，Nginx都是逃不开的一个重要中间件。</p>
<p>如果您还不了解Nginx，那么至少通过下面的视频，2分钟了解一下，它可以用来做啥：</p>
]]></content:encoded>
    </item>
    <item>
      <title>除了MySQL之外，你最应该了解的数据库：PostgreSQL</title>
      <link>https://www.didispace.com/youtube/what-is-postgresql.html</link>
      <guid>https://www.didispace.com/youtube/what-is-postgresql.html</guid>
      <source url="https://www.didispace.com/rss.xml">除了MySQL之外，你最应该了解的数据库：PostgreSQL</source>
      <description>除了MySQL之外，你最应该了解的数据库：PostgreSQL 相信关注DD的读者里，对于MySQL熟悉的应该已经很多了。但是对于PostgreSQL数据库，国内还是有不少小伙伴不太熟悉。从流行度来说，PostgreSQL在国内也不及MySQL。但是，从功能上来说，PostgreSQL还是有很多场景要比MySQL用起来更加舒适了。 所以，如果你已经熟悉了MySQL之后，我非常推荐大家学习一下PostgreSQL，拥有一个在一些领域更有优势的数据库，这样当你碰到这些场景的时候，可以游刃有余的处理。 下面就通过视频来快速了解一下PostgreSQL数据库：</description>
      <category>技术科普</category>
      <pubDate>Sun, 19 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 除了MySQL之外，你最应该了解的数据库：PostgreSQL</h1>
<p>相信关注DD的读者里，对于MySQL熟悉的应该已经很多了。但是对于PostgreSQL数据库，国内还是有不少小伙伴不太熟悉。从流行度来说，PostgreSQL在国内也不及MySQL。但是，从功能上来说，PostgreSQL还是有很多场景要比MySQL用起来更加舒适了。</p>
<p>所以，如果你已经熟悉了MySQL之后，我非常推荐大家学习一下PostgreSQL，拥有一个在一些领域更有优势的数据库，这样当你碰到这些场景的时候，可以游刃有余的处理。</p>
<p>下面就通过视频来快速了解一下<strong>PostgreSQL数据库</strong>：</p>
]]></content:encoded>
    </item>
    <item>
      <title>CPU是如何工作的</title>
      <link>https://www.didispace.com/youtube/how-cpu-work.html</link>
      <guid>https://www.didispace.com/youtube/how-cpu-work.html</guid>
      <source url="https://www.didispace.com/rss.xml">CPU是如何工作的</source>
      <description>CPU是如何工作的 CPU是计算机的中央处理单元，由数十亿个微小的晶体管组成，通过执行指令集来运行应用程序，而苹果的M1芯片相较于英特尔的芯片在性能上表现更好。 那么CPU是如何工作的呢？下面我们一起通过视频来认识一下吧：</description>
      <category>技术科普</category>
      <pubDate>Mon, 13 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> CPU是如何工作的</h1>
<p>CPU是计算机的中央处理单元，由数十亿个微小的晶体管组成，通过执行指令集来运行应用程序，而苹果的M1芯片相较于英特尔的芯片在性能上表现更好。</p>
<p>那么CPU是如何工作的呢？下面我们一起通过视频来认识一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux文件目录结构</title>
      <link>https://www.didispace.com/youtube/linux-file-system.html</link>
      <guid>https://www.didispace.com/youtube/linux-file-system.html</guid>
      <source url="https://www.didispace.com/rss.xml">Linux文件目录结构</source>
      <description>Linux文件目录结构 今天一起通过下面的视频来直观的认识Linux文件系统的目录结构：</description>
      <category>技术科普</category>
      <pubDate>Sun, 12 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Linux文件目录结构</h1>
<p>今天一起通过下面的视频来直观的认识Linux文件系统的目录结构：</p>
]]></content:encoded>
    </item>
    <item>
      <title>挖矿的难度</title>
      <link>https://www.didispace.com/youtube/mining-difficulty.html</link>
      <guid>https://www.didispace.com/youtube/mining-difficulty.html</guid>
      <source url="https://www.didispace.com/rss.xml">挖矿的难度</source>
      <description>挖矿的难度 挖矿的困难度是通过调整计算工作量来确保每个新区块的平均产出时间约为10分钟，避免人们过分集中挖矿导致中心化的问题。 下面一起通过视频来学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Sat, 11 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 挖矿的难度</h1>
<p>挖矿的困难度是通过调整计算工作量来确保每个新区块的平均产出时间约为10分钟，避免人们过分集中挖矿导致中心化的问题。</p>
<p>下面一起通过视频来学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是比特币的分叉</title>
      <link>https://www.didispace.com/youtube/what-is-bitcoin-fork.html</link>
      <guid>https://www.didispace.com/youtube/what-is-bitcoin-fork.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是比特币的分叉</source>
      <description>什么是比特币的分叉 今天一起通过下面的视频来认识：什么是比特币的分叉</description>
      <category>技术科普</category>
      <pubDate>Tue, 14 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是比特币的分叉</h1>
<p>今天一起通过下面的视频来认识：什么是比特币的分叉</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是NFT</title>
      <link>https://www.didispace.com/youtube/what-is-nft.html</link>
      <guid>https://www.didispace.com/youtube/what-is-nft.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是NFT</source>
      <description>什么是NFT 今天一起通过下面的视频来认识：什么是NFT</description>
      <category>技术科普</category>
      <pubDate>Fri, 10 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是NFT</h1>
<p>今天一起通过下面的视频来认识：什么是NFT</p>
]]></content:encoded>
    </item>
    <item>
      <title>C语言，一个支撑世界运转的编程语言</title>
      <link>https://www.didispace.com/youtube/what-is-c.html</link>
      <guid>https://www.didispace.com/youtube/what-is-c.html</guid>
      <source url="https://www.didispace.com/rss.xml">C语言，一个支撑世界运转的编程语言</source>
      <description>C语言，一个支撑世界运转的编程语言 C语言，相信每个大学生基本都不陌生。作为一名通识课，大部分人都学过。但是大多数也就停留在了课堂上的那些if、else判断，for循环等枯燥的逻辑编写上。 C语言到底是怎样一种语言呢？它为什么被称为是支撑世界运转的编程语言呢？它都被用在哪里哪些地方呢？ 下面一起通过视频进一步了解吧：</description>
      <category>技术科普</category>
      <pubDate>Thu, 09 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> C语言，一个支撑世界运转的编程语言</h1>
<p>C语言，相信每个大学生基本都不陌生。作为一名通识课，大部分人都学过。但是大多数也就停留在了课堂上的那些if、else判断，for循环等枯燥的逻辑编写上。</p>
<p>C语言到底是怎样一种语言呢？它为什么被称为是支撑世界运转的编程语言呢？它都被用在哪里哪些地方呢？</p>
<p>下面一起通过视频进一步了解吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>C#语言，一个从模仿Java开始的编程语言</title>
      <link>https://www.didispace.com/youtube/what-is-csharp.html</link>
      <guid>https://www.didispace.com/youtube/what-is-csharp.html</guid>
      <source url="https://www.didispace.com/rss.xml">C#语言，一个从模仿Java开始的编程语言</source>
      <description>C#语言，一个从模仿Java开始的编程语言 C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源，跨平台)之上的高级程序设计语言。C#一开始的时候主要以模仿Java为主，所以看起来与Java有着惊人的相似；它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。 但是C#与Java也有着明显的不同，所以其同Java一样，有这一大批拥护者，也是世界上最受欢迎的编程语言之一。 更多关于C#的介绍，可以通过下面的视频进一步了解：</description>
      <category>技术科普</category>
      <pubDate>Thu, 09 Nov 2023 12:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> C#语言，一个从模仿Java开始的编程语言</h1>
<p>C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源，跨平台)之上的高级程序设计语言。C#一开始的时候主要以模仿Java为主，所以看起来与Java有着惊人的相似；它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。</p>
<p>但是C#与Java也有着明显的不同，所以其同Java一样，有这一大批拥护者，也是世界上最受欢迎的编程语言之一。</p>
<p>更多关于C#的介绍，可以通过下面的视频进一步了解：</p>
]]></content:encoded>
    </item>
    <item>
      <title>Dart：一个被Flutter带火的编程语言</title>
      <link>https://www.didispace.com/youtube/what-is-dart.html</link>
      <guid>https://www.didispace.com/youtube/what-is-dart.html</guid>
      <source url="https://www.didispace.com/rss.xml">Dart：一个被Flutter带火的编程语言</source>
      <description>Dart：一个被Flutter带火的编程语言 Dart是一个为全平台构建快速应用的客户端优化的编程语言，其实它很早就创立了，但是一直没有火起来了。 然而后来在谷歌推出的Flutter框架中采用了Dart之后，才有了很大的发展和应用。 那么Dart是怎么样的一种语言呢？为什么会被谷歌的Flutter选择呢？ 下面通过视频一起深入了解：</description>
      <category>技术科普</category>
      <pubDate>Thu, 09 Nov 2023 12:40:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Dart：一个被Flutter带火的编程语言</h1>
<p>Dart是一个为全平台构建快速应用的客户端优化的编程语言，其实它很早就创立了，但是一直没有火起来了。</p>
<p>然而后来在谷歌推出的Flutter框架中采用了Dart之后，才有了很大的发展和应用。</p>
<p>那么Dart是怎么样的一种语言呢？为什么会被谷歌的Flutter选择呢？</p>
<p>下面通过视频一起深入了解：</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kotlin，一个与Java兼容又具备更多能力的编程语言</title>
      <link>https://www.didispace.com/youtube/what-is-kotlin.html</link>
      <guid>https://www.didispace.com/youtube/what-is-kotlin.html</guid>
      <source url="https://www.didispace.com/rss.xml">Kotlin，一个与Java兼容又具备更多能力的编程语言</source>
      <description>Kotlin，一个与Java兼容又具备更多能力的编程语言 Kotlin 是一个基于 JVM 的新编程语言，由 JetBrains 开发。它可以编译成 Java 字节码，也可以编译成 JavaScript，方便在没有 JVM 的设备上运行。开发者可以使用Kotlin编写传统的Java应用，也可以用来编写Android应用。 Kotlin这几年的发展很快，越来越多的Java开发者在尝试使用Kotlin来完成日常工作，因为它的代码更简洁、编写起来更效率。 下面我们可以通过视频来更全面的了解一下Kotlin：</description>
      <category>技术科普</category>
      <pubDate>Thu, 09 Nov 2023 12:50:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Kotlin，一个与Java兼容又具备更多能力的编程语言</h1>
<p>Kotlin 是一个基于 JVM 的新编程语言，由 JetBrains 开发。它可以编译成 Java 字节码，也可以编译成 JavaScript，方便在没有 JVM 的设备上运行。开发者可以使用Kotlin编写传统的Java应用，也可以用来编写Android应用。</p>
<p>Kotlin这几年的发展很快，越来越多的Java开发者在尝试使用Kotlin来完成日常工作，因为它的代码更简洁、编写起来更效率。</p>
<p>下面我们可以通过视频来更全面的了解一下Kotlin：</p>
]]></content:encoded>
    </item>
    <item>
      <title>被称为21世纪的C语言的编程语言：Go</title>
      <link>https://www.didispace.com/youtube/what-is-go.html</link>
      <guid>https://www.didispace.com/youtube/what-is-go.html</guid>
      <source url="https://www.didispace.com/rss.xml">被称为21世纪的C语言的编程语言：Go</source>
      <description>被称为21世纪的C语言的编程语言：Go 第一次知道Go，记得是在学习Docker的时候。由于Go语言的性能接近C语言，所以被广泛应用在很多基础设施的建设上。 对于很多Java开发者来说，使用Go编写的各种工具，基本上都不陌生了。那么对于Go语言本身，相信很多还都不太了解。 所以，下面这里DD给大家推荐一个简单的视频，可以帮助大家快速了解Go语言的基本特性，可以应用在什么地方：</description>
      <category>技术科普</category>
      <pubDate>Wed, 08 Nov 2023 12:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 被称为21世纪的C语言的编程语言：Go</h1>
<p>第一次知道Go，记得是在学习Docker的时候。由于Go语言的性能接近C语言，所以被广泛应用在很多基础设施的建设上。</p>
<p>对于很多Java开发者来说，使用Go编写的各种工具，基本上都不陌生了。那么对于Go语言本身，相信很多还都不太了解。</p>
<p>所以，下面这里DD给大家推荐一个简单的视频，可以帮助大家快速了解Go语言的基本特性，可以应用在什么地方：</p>
]]></content:encoded>
    </item>
    <item>
      <title>当下最火热的编程语言：Rust</title>
      <link>https://www.didispace.com/youtube/what-is-rust.html</link>
      <guid>https://www.didispace.com/youtube/what-is-rust.html</guid>
      <source url="https://www.didispace.com/rss.xml">当下最火热的编程语言：Rust</source>
      <description>当下最火热的编程语言：Rust 说到Rust，总是让我想到Java之父曾经谈“哪些场景下，哪些语言更合适？”的问题时所提到的Rust与Java的选型。 他是这样说的：我尝试过很多语言，哪种更好主要取决于我想干什么。如果我正要编写低级设备驱动程序，那我可能倾向于选择 Rust。但如果需要编写的是用来为自动驾驶汽车建立复杂数据结构的大型导航系统，那我几乎肯定会选择 Java。在Java 之父看来，Rust 太过关注安全，这让它出了名的难学。Rust 解决问题的过程就像是证明定理，一步也不能出错。如果我们只需要编写一小段代码，用于某种固定不变的设备，那 Rust 的效果非常好。但如果大家需要构建一套具有高复杂度动态数据结构的大规模系统，那么 Rust 的使用难度就比较高了。他还表示，如果关注性能，Rust 或 Java 才是正确答案。另外，如果你需要的是只有 Rust 能够提供的那种致密、安全、严谨的特性，代码的编写体量不大，而且一旦出问题会造成严重后果，那 Rust 就是比较合适的选择。只能说某些场景下某些语言更合适。</description>
      <category>技术科普</category>
      <pubDate>Wed, 08 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 当下最火热的编程语言：Rust</h1>
<p>说到Rust，总是让我想到Java之父曾经谈“哪些场景下，哪些语言更合适？”的问题时所提到的Rust与Java的选型。</p>
<p>他是这样说的：我尝试过很多语言，哪种更好主要取决于我想干什么。如果我正要编写低级设备驱动程序，那我可能倾向于选择 Rust。但如果需要编写的是用来为自动驾驶汽车建立复杂数据结构的大型导航系统，那我几乎肯定会选择 Java。在Java 之父看来，Rust 太过关注安全，这让它出了名的难学。Rust 解决问题的过程就像是证明定理，一步也不能出错。如果我们只需要编写一小段代码，用于某种固定不变的设备，那 Rust 的效果非常好。但如果大家需要构建一套具有高复杂度动态数据结构的大规模系统，那么 Rust 的使用难度就比较高了。他还表示，如果关注性能，Rust 或 Java 才是正确答案。另外，如果你需要的是只有 Rust 能够提供的那种致密、安全、严谨的特性，代码的编写体量不大，而且一旦出问题会造成严重后果，那 Rust 就是比较合适的选择。只能说某些场景下某些语言更合适。</p>
<p>那么，Rust究竟是怎么样的一种编程语言呢？下面我们可以通过一个简单的视频来认识它：</p>
]]></content:encoded>
    </item>
    <item>
      <title>一次搞懂CPU、GPU、TPU、DPU、QPU</title>
      <link>https://www.didispace.com/youtube/cpu-gpu-tpu-dpu-qpu.html</link>
      <guid>https://www.didispace.com/youtube/cpu-gpu-tpu-dpu-qpu.html</guid>
      <source url="https://www.didispace.com/rss.xml">一次搞懂CPU、GPU、TPU、DPU、QPU</source>
      <description>一次搞懂CPU、GPU、TPU、DPU、QPU CPU和GPU相信你已经耳熟能详了，但是它们的区别是什么你知道吗？ 另外，TPU、DPU、QPU这些，你是否有听过吗？它们又都主要应用于什么场景呢？ 如果你想了解他们，下面这个8分钟视频，一定不要错过，一次性搞懂它们：</description>
      <category>技术科普</category>
      <pubDate>Mon, 06 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 一次搞懂CPU、GPU、TPU、DPU、QPU</h1>
<p>CPU和GPU相信你已经耳熟能详了，但是它们的区别是什么你知道吗？</p>
<p>另外，TPU、DPU、QPU这些，你是否有听过吗？它们又都主要应用于什么场景呢？</p>
<p>如果你想了解他们，下面这个8分钟视频，一定不要错过，一次性搞懂它们：</p>
]]></content:encoded>
    </item>
    <item>
      <title>工作量证明 vs 权益证明</title>
      <link>https://www.didispace.com/youtube/pow-vs-pos.html</link>
      <guid>https://www.didispace.com/youtube/pow-vs-pos.html</guid>
      <source url="https://www.didispace.com/rss.xml">工作量证明 vs 权益证明</source>
      <description>工作量证明 vs 权益证明 像比特币这样的加密货币，采用工作量证明算法的时候需要大量电力来保护网络，而权益证明算法作为一种替代方案，可以减少能源消耗并提高去中心化程度。 那么对于工作量证明和权益证明的原理、区别和优缺点，你是否理解了呢？ 下面这个视频将帮助你理解这两个重要概念：</description>
      <category>技术科普</category>
      <pubDate>Mon, 06 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 工作量证明 vs 权益证明</h1>
<p>像比特币这样的加密货币，采用工作量证明算法的时候需要大量电力来保护网络，而权益证明算法作为一种替代方案，可以减少能源消耗并提高去中心化程度。</p>
<p>那么对于工作量证明和权益证明的原理、区别和优缺点，你是否理解了呢？</p>
<p>下面这个视频将帮助你理解这两个重要概念：</p>
]]></content:encoded>
    </item>
    <item>
      <title>进程和线程的区别</title>
      <link>https://www.didispace.com/youtube/process-vs-thread.html</link>
      <guid>https://www.didispace.com/youtube/process-vs-thread.html</guid>
      <source url="https://www.didispace.com/rss.xml">进程和线程的区别</source>
      <description>进程和线程的区别 什么是进程？什么是线程？这是一个常见的面试题，很多人工作多年，还都解释不清。 最近看到一个视频，讲的非常清晰，如果你还迷迷糊糊，不知道如何回答的话。可以看看下面这个视频：</description>
      <category>技术科普</category>
      <pubDate>Sun, 05 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 进程和线程的区别</h1>
<p>什么是进程？什么是线程？这是一个常见的面试题，很多人工作多年，还都解释不清。</p>
<p>最近看到一个视频，讲的非常清晰，如果你还迷迷糊糊，不知道如何回答的话。可以看看下面这个视频：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 DevOps</title>
      <link>https://www.didispace.com/youtube/what-is-devops.html</link>
      <guid>https://www.didispace.com/youtube/what-is-devops.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 DevOps</source>
      <description>什么是 DevOps DevOps是这几年一直是技术领域比较火的关键词，同时基于此还衍生出了各种XxOps，比如：GitOps、AiOps。 从名称中我们大概可以了解其主要的核心思想： 解决运维问题 以什么手段解决 那么到底什么是DevOps呢？下面一起通过视频来学习吧：</description>
      <category>技术科普</category>
      <pubDate>Sat, 04 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 DevOps</h1>
<p>DevOps是这几年一直是技术领域比较火的关键词，同时基于此还衍生出了各种XxOps，比如：GitOps、AiOps。</p>
<p>从名称中我们大概可以了解其主要的核心思想：</p>
<ol>
<li>解决运维问题</li>
<li>以什么手段解决</li>
</ol>
<p>那么到底什么是DevOps呢？下面一起通过视频来学习吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是Zig？为什么被称为C的下一代替代语言？</title>
      <link>https://www.didispace.com/youtube/what-is-zig.html</link>
      <guid>https://www.didispace.com/youtube/what-is-zig.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是Zig？为什么被称为C的下一代替代语言？</source>
      <description>什么是Zig？为什么被称为C的下一代替代语言？ Zig是一种高性能系统编程语言。它在有2016年，由Andrew Kelly创立，并迅速发展成为世界上最受欢迎的新语言之一，被称为C的下一代替代语言。它与C语言一样，拥有体积小，运行速度快的特点。但Zig的标准库要比C更方便的管理内存，但它又不像Java、Go那样。 那么Zig到底有什么魔力得到快速的发展和认可呢？下面这个视频可以告诉你答案：</description>
      <category>技术科普</category>
      <pubDate>Tue, 07 Nov 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是Zig？为什么被称为C的下一代替代语言？</h1>
<p>Zig是一种高性能系统编程语言。它在有2016年，由Andrew Kelly创立，并迅速发展成为世界上最受欢迎的新语言之一，被称为C的下一代替代语言。它与C语言一样，拥有体积小，运行速度快的特点。但Zig的标准库要比C更方便的管理内存，但它又不像Java、Go那样。</p>
<p>那么Zig到底有什么魔力得到快速的发展和认可呢？下面这个视频可以告诉你答案：</p>
]]></content:encoded>
    </item>
    <item>
      <title>使用SDKMAN安装和管理多个JDK版本</title>
      <link>https://www.didispace.com/installation-guide/dev-env/sdkman.html</link>
      <guid>https://www.didispace.com/installation-guide/dev-env/sdkman.html</guid>
      <source url="https://www.didispace.com/rss.xml">使用SDKMAN安装和管理多个JDK版本</source>
      <description>使用SDKMAN安装和管理多个JDK版本 SDKMAN是一个轻量级、支持多平台的开源开发工具管理器，可以通过它安装任意主流发行版本（例如OpenJDK、Kona、GraalVM等等）的任意版本的JDK。 官方网站：https://sdkman.io/ 使用命令安装SDKMAN 通过下面的命令可以轻易安装sdkman: curl -s &amp;quot;https://get.sdkman.io&amp;quot; | bash source &amp;quot;$HOME/.sdkman/bin/sdkman-init.sh&amp;quot;</description>
      <category>安装大全</category>
      <pubDate>Thu, 02 Nov 2023 02:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 使用SDKMAN安装和管理多个JDK版本</h1>
<p>SDKMAN是一个轻量级、支持多平台的开源开发工具管理器，可以通过它安装任意主流发行版本（例如OpenJDK、Kona、GraalVM等等）的任意版本的JDK。</p>
<p>官方网站：https://sdkman.io/</p>
<h2> 使用命令安装SDKMAN</h2>
<p>通过下面的命令可以轻易安装sdkman:</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p>完成安装后，执行<code>sdk version</code>命令，验证是否安装成功。</p>
<h2> 管理Java版本</h2>
<p>下面是我们常用的管理命令。</p>
<h3> 查看Java版本</h3>
<p>下面的命令用来查看支持的JDK发行版本</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><img src="https://static.didispace.com/images3/e645e32717a114276236465aeb3982f8.png" alt=""></p>
<h3> JDK的安装与卸载</h3>
<p>通过<code>sdk list java</code>命令，查看支持的JDK时，可以看到最后一列<code>Identifier</code>，这一列内容是我们安装的时候要使用的。</p>
<p>具体安装命令如下（<code>$Identifier</code>替换上面<code>Identifier</code>列的名称）：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><blockquote>
<p>Tips：如果不输入$Identifier的话，会自动安装最新的稳定版本</p>
</blockquote>
<p>如果要卸载的话，也很简单，只需要执行下面的命令：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3> 设置默认JDK</h3>
<p>如果已经安装了多个JDK的时候，我们可以通过下面的命令来调整默认的JDK版本：</p>
<div class="language-bash line-numbers-mode" data-ext="sh"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3> 查看当前使用的JDK</h3>
<p>如果要查看当前在用那个JDK的话，可以使用命令：<code>sdk current</code>或者<code>sdk current java</code>。</p>
<h3> SDKMAN更新</h3>
<p>如果您在使用过程中，收到这样的提示：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>那么，可以执行下面的命令来更新一下解决：</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3> SDKMAN的配置</h3>
<p>SDKMAN还有一些基础配置，其配置文件位于：<code>~/.sdkman/etc/config</code>，一般不太修改。但如果碰到问题，可以在这里开启debug模式等功能。</p>
<div class="language-text line-numbers-mode" data-ext="text"><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2> Groovy、Scala支持</h2>
<p>SDKMAN除了支持Java之后，对于<code>groovy</code>、<code>scala</code>也有很好的支持。</p>
<p>使用起来也非常简单，只需要把用于Java的命令中的<code>java</code>换成<code>groovy</code>或者<code>scala</code>就可以了。</p>
<p>比如：</p>
<ul>
<li>查看支持的Groovy版本：<code>sdk list groovy</code></li>
<li>安装某个版本的Groovy：<code>sdk install groovy $Identifier</code></li>
<li>卸载某个版本的Groovy：<code>sdk uninstall groovy $Identifier</code></li>
</ul>
<p>我们正在连载<a href="https://www.didispace.com/installation-guide/" target="_blank" rel="noopener noreferrer">开发者安装大全</a>，主要整理与汇总开发者常用软件、编程环境、中间件等工具的安装使用方法，以指导开发者快速搭建自己需要的开发环境，欢迎关注、收藏、转发支持一下啊 ^_^</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/e645e32717a114276236465aeb3982f8.png" type="image/png"/>
    </item>
    <item>
      <title>每个开发者都应该知道的缓存系统</title>
      <link>https://www.didispace.com/youtube/20231028-you-need-know-cache-system.html</link>
      <guid>https://www.didispace.com/youtube/20231028-you-need-know-cache-system.html</guid>
      <source url="https://www.didispace.com/rss.xml">每个开发者都应该知道的缓存系统</source>
      <description>每个开发者都应该知道的缓存系统 缓存是现在计算系统中最常用的一种技术手段，它无处不在。 所以每个开发者都应该知道缓存的原理，以及各种不同场景下，我们可以使用的缓存。 如果您觉得你对缓存还不够了解，那么下面这个视频，可以带你一起回顾一下，缓存在各种系统中存在的形式和实现：</description>
      <category>技术科普</category>
      <pubDate>Sun, 29 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 每个开发者都应该知道的缓存系统</h1>
<p>缓存是现在计算系统中最常用的一种技术手段，它无处不在。</p>
<p>所以每个开发者都应该知道缓存的原理，以及各种不同场景下，我们可以使用的缓存。</p>
<p>如果您觉得你对缓存还不够了解，那么下面这个视频，可以带你一起回顾一下，缓存在各种系统中存在的形式和实现：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是htmx</title>
      <link>https://www.didispace.com/youtube/20231029-what-is-htmx.html</link>
      <guid>https://www.didispace.com/youtube/20231029-what-is-htmx.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是htmx</source>
      <description>什么是htmx html相信你一定知道，但是你知道什么是htmx吗？ 来，一起通过下面的视频，2分钟搞懂它！</description>
      <category>技术科普</category>
      <pubDate>Sun, 29 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是htmx</h1>
<p>html相信你一定知道，但是你知道什么是htmx吗？</p>
<p>来，一起通过下面的视频，2分钟搞懂它！</p>
]]></content:encoded>
    </item>
    <item>
      <title>Java、Python、C++区别在哪里</title>
      <link>https://www.didispace.com/youtube/20231030-diff-java-python-c__.html</link>
      <guid>https://www.didispace.com/youtube/20231030-diff-java-python-c__.html</guid>
      <source url="https://www.didispace.com/rss.xml">Java、Python、C++区别在哪里</source>
      <description>Java、Python、C++区别在哪里 对于Java、Python、C++这些面向对象的编程语言来说，有很多基础特性非常类似。 但是实际上，他们底层如何运行，有着很大的差距。这也使得他们拥有了不同的语言特性。 在不同的场景之下，它们各有优劣。 只有理解它们的真正优势，才能让开发者在面对业务问题的时候，选择能力最合适的语言，发挥其最大威力，将使得这项任务变的不那么困难。 那么接下来，就来一起学习一下Java、Python、C++这三者的主要区别吧：</description>
      <category>技术科普</category>
      <pubDate>Mon, 30 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Java、Python、C++区别在哪里</h1>
<p>对于Java、Python、C++这些面向对象的编程语言来说，有很多基础特性非常类似。</p>
<p>但是实际上，他们底层如何运行，有着很大的差距。这也使得他们拥有了不同的语言特性。</p>
<p>在不同的场景之下，它们各有优劣。</p>
<p>只有理解它们的真正优势，才能让开发者在面对业务问题的时候，选择能力最合适的语言，发挥其最大威力，将使得这项任务变的不那么困难。</p>
<p>那么接下来，就来一起学习一下Java、Python、C++这三者的主要区别吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是智能合约</title>
      <link>https://www.didispace.com/youtube/20231026-what-is-smart-contracts.html</link>
      <guid>https://www.didispace.com/youtube/20231026-what-is-smart-contracts.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是智能合约</source>
      <description>什么是智能合约 1996年，Nick Szabo发表了一篇名为《智能合约：数字自由市场的构建基石》的论文，它想使用分布式账本来存储合约，也就是现在所说的智能合约。它就跟现实世界中的合约一样，唯一的区别是智能合约是完全数字化的。智能合约实质上是被存储在区块链内的微小计算机程序。 那么它是如何工作的呢？如果您感兴趣的话，可以跟着下面这个视频一起学习一下：</description>
      <category>技术科普</category>
      <pubDate>Thu, 26 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是智能合约</h1>
<p>1996年，Nick Szabo发表了一篇名为《智能合约：数字自由市场的构建基石》的论文，它想使用分布式账本来存储合约，也就是现在所说的智能合约。它就跟现实世界中的合约一样，唯一的区别是智能合约是完全数字化的。智能合约实质上是被存储在区块链内的微小计算机程序。</p>
<p><img src="https://static.didispace.com/images3/c16a2b2fa354bc029aef060004cf0470.png" alt=""></p>
<p>那么它是如何工作的呢？如果您感兴趣的话，可以跟着下面这个视频一起学习一下：</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/c16a2b2fa354bc029aef060004cf0470.png" type="image/png"/>
    </item>
    <item>
      <title>什么是区块链</title>
      <link>https://www.didispace.com/youtube/20231025-what-is-blockchain.html</link>
      <guid>https://www.didispace.com/youtube/20231025-what-is-blockchain.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是区块链</source>
      <description>什么是区块链 什么是区块链？到今天，依然有很多人，甚至开发者都无法解释清楚。今天，希望这篇文章和视频，可以帮你一次搞清楚下面几个问题： 什么是区块链 它是如何工作的 解决什么问题 如何使用区块链 如果您有足够的时间和合适的环境，那么可以通过下面的视频学习一下：</description>
      <category>技术科普</category>
      <pubDate>Wed, 25 Oct 2023 19:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是区块链</h1>
<p>什么是区块链？到今天，依然有很多人，甚至开发者都无法解释清楚。今天，希望这篇文章和视频，可以帮你一次搞清楚下面几个问题：</p>
<ul>
<li>什么是区块链</li>
<li>它是如何工作的</li>
<li>解决什么问题</li>
<li>如何使用区块链</li>
</ul>
<p>如果您有足够的时间和合适的环境，那么可以通过下面的视频学习一下：</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/ad4caf3d3f94df594968fbb28746fc96.png" type="image/png"/>
    </item>
    <item>
      <title>ChatGPT是如何运作的</title>
      <link>https://www.didispace.com/youtube/20230912-how-chatgpt-work.html</link>
      <guid>https://www.didispace.com/youtube/20230912-how-chatgpt-work.html</guid>
      <source url="https://www.didispace.com/rss.xml">ChatGPT是如何运作的</source>
      <description>ChatGPT是如何运作的 ChatGPT是现在最为热门的聊天助手应用，它使用了一个大型语言模型(LLM)，即GPT-3.5。它通过大量的文本数据进行训练，以理解和生成人类语言。但是，你是否有了解过ChatGPT是如何运作的吗？ 下面我们就一起通过这个视频来一起认识一下。该视频中介绍了LLM的概念、ChatGPT如何将上下文注入模型、以及如何使用主要提示工程来指导模型，来实现对话式的预期。</description>
      <category>技术科普</category>
      <pubDate>Tue, 12 Sep 2023 14:50:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> ChatGPT是如何运作的</h1>
<p>ChatGPT是现在最为热门的聊天助手应用，它使用了一个大型语言模型(LLM)，即GPT-3.5。它通过大量的文本数据进行训练，以理解和生成人类语言。但是，你是否有了解过ChatGPT是如何运作的吗？</p>
<p>下面我们就一起通过这个视频来一起认识一下。该视频中介绍了LLM的概念、ChatGPT如何将上下文注入模型、以及如何使用主要提示工程来指导模型，来实现对话式的预期。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>什么是RESTful API</title>
      <link>https://www.didispace.com/youtube/20230912-why-rest-so-popular.html</link>
      <guid>https://www.didispace.com/youtube/20230912-why-rest-so-popular.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是RESTful API</source>
      <description>什么是RESTful API 最近因为一直在搞Youtube中文配音的原因，发现油管真的是个超级大宝藏。除了各种独到的观点之外，技术学习方面的内容真的是非常干货，最最关键的，大部分优质学习资料都是免费的！免费的同时，很多还都是最前沿的！ 可能很多小伙伴因为一些原因，无法看到这些技术内容，也无法使用我们的插件。所以，最近准备精选一些我订阅的，个人认为非常不错的优质内容通过配音之后，发到我的视频号（程序猿DD）和B站上面，方便大家学习。感兴趣的小伙伴根据自己平时习惯选择关注订阅即可。</description>
      <category>技术科普</category>
      <pubDate>Tue, 12 Sep 2023 13:50:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是RESTful API</h1>
<p>最近因为一直在搞<a href="https://www.youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">Youtube中文配音</a>的原因，发现油管真的是个超级大宝藏。除了各种独到的观点之外，技术学习方面的内容真的是非常干货，最最关键的，大部分优质学习资料都是免费的！免费的同时，很多还都是最前沿的！</p>
<p>可能很多小伙伴因为一些原因，无法看到这些技术内容，也无法使用我们的插件。所以，最近准备精选一些我订阅的，个人认为非常不错的优质内容通过配音之后，发到我的视频号（程序猿DD）和<a href="https://space.bilibili.com/396803537" target="_blank" rel="noopener noreferrer">B站</a>上面，方便大家学习。感兴趣的小伙伴根据自己平时习惯选择关注订阅即可。</p>
<p>今天先来第一篇：<a href="/youtube/20230912-why-rest-so-popular.html" target="blank">为什么REST风格的API那么流行？</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是GraphQL</title>
      <link>https://www.didispace.com/youtube/20230913-what-is-GraphQL.html</link>
      <guid>https://www.didispace.com/youtube/20230913-what-is-GraphQL.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是GraphQL</source>
      <description>什么是GraphQL 关于REST和gRPC，这两个非常流行的API实现模式已经都做了介绍。 接下来，我们再来学习另外一个新的API实现模式：GraphQL。这个由Facebook公司于2012年开发的新型API架构方式，虽然在国内一直不温不火，但个人认为GraphQL本身还是非常优秀的，只是在国内缺少一些基础知识的支撑和传播吧，推广的人少，用的人少，所以没有得到很大的认可。 下面我们就一起跟着视频来学习一下，如果您觉得GraphQL很优秀，不妨可以作为一名布道者，让这门技术发扬光大！</description>
      <category>技术科普</category>
      <pubDate>Wed, 13 Sep 2023 08:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是GraphQL</h1>
<p>关于<a href="/youtube/20230912-why-rest-so-popular.html" target="blank">REST</a>和<a href="/youtube/20230913-what-is-gRPC.html" target="blank">gRPC</a>，这两个非常流行的API实现模式已经都做了介绍。</p>
<p>接下来，我们再来学习另外一个新的API实现模式：<strong>GraphQL</strong>。这个由Facebook公司于2012年开发的新型API架构方式，虽然在国内一直不温不火，但个人认为GraphQL本身还是非常优秀的，只是在国内缺少一些基础知识的支撑和传播吧，推广的人少，用的人少，所以没有得到很大的认可。</p>
<p>下面我们就一起跟着视频来学习一下，如果您觉得<strong>GraphQL</strong>很优秀，不妨可以作为一名布道者，让这门技术发扬光大！</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>什么是gRPC？</title>
      <link>https://www.didispace.com/youtube/20230913-what-is-gRPC.html</link>
      <guid>https://www.didispace.com/youtube/20230913-what-is-gRPC.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是gRPC？</source>
      <description>什么是gRPC？ 昨天，我们介绍了什么是REST，相信你已经了解REST的各项特征，在应用上的优势，自然也明白它为什么受欢迎了吧？今天我们继续聊聊API的另外一种实现模式：gRPC。它是由Google发起的一个开源远程过程调用系统，基于HTTP/2协议传输，拥有跨语言、高性能、易扩展等优秀特性，也是一个被广泛应用的API设计框架。 下面我们就一起跟着视频来了解一下它吧：</description>
      <category>技术科普</category>
      <pubDate>Wed, 13 Sep 2023 01:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是gRPC？</h1>
<p>昨天，我们介绍了<a href="/youtube/20230912-why-rest-so-popular.html" target="blank">什么是REST</a>，相信你已经了解REST的各项特征，在应用上的优势，自然也明白它为什么受欢迎了吧？今天我们继续聊聊API的另外一种实现模式：<strong>gRPC</strong>。它是由Google发起的一个开源远程过程调用系统，基于HTTP/2协议传输，拥有跨语言、高性能、易扩展等优秀特性，也是一个被广泛应用的API设计框架。</p>
<p>下面我们就一起跟着视频来了解一下它吧：</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>什么是API网关</title>
      <link>https://www.didispace.com/youtube/20230915-api-gateway.html</link>
      <guid>https://www.didispace.com/youtube/20230915-api-gateway.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是API网关</source>
      <description>什么是API网关 在很久以前的Spring Cloud教程里，有介绍过API网关，当时大致讲了一下当没有API网关情况下的不足以及引入API网关的好处。 最近正好看到一个不错的科普视频，里面包含详细的动图说明，可以更直观地让你理解API网关引入前后的流量分发逻辑和路径。 下面就通过这个短短3分钟的视频来学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Fri, 15 Sep 2023 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是API网关</h1>
<p>在很久以前的Spring Cloud教程里，有介绍过<a href="https://blog.didispace.com/springcloud5/" target="_blank" rel="noopener noreferrer">API网关</a>，当时大致讲了一下当没有API网关情况下的不足以及引入API网关的好处。</p>
<p>最近正好看到一个不错的科普视频，里面包含详细的动图说明，可以更直观地让你理解API网关引入前后的流量分发逻辑和路径。</p>
<p>下面就通过这个短短3分钟的视频来学习一下吧：</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>HTTPS是如何运作的</title>
      <link>https://www.didispace.com/youtube/20230915-what-is-https.html</link>
      <guid>https://www.didispace.com/youtube/20230915-what-is-https.html</guid>
      <source url="https://www.didispace.com/rss.xml">HTTPS是如何运作的</source>
      <description>HTTPS是如何运作的 平时我们开发后端程序的时候，更多关注的是数据模型，业务逻辑，调试的时候也都采用HTTP传输协议，但实际上在面向用户的时候，即使调试时候用HTTP的服务，也都将采用HTTPS的通信协议进行。 HTTPS相较于HTTP，虽然名称上只是多了个S，但其实有很大的差别，其中还涉及一些新的概念名词，比如：SSL、TLS。 如果您对于HTTPS的原理还不够了解的话，这里正好看到一个不错的科普视频，里面包含详细的动图说明，可以更直观地让你理解HTTPS是如何运作的，还可以理解诸如SSL、TLS这些在HTTPS中的作用。 下面就通过这个短短5分钟的视频来学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Fri, 15 Sep 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> HTTPS是如何运作的</h1>
<p>平时我们开发后端程序的时候，更多关注的是数据模型，业务逻辑，调试的时候也都采用HTTP传输协议，但实际上在面向用户的时候，即使调试时候用HTTP的服务，也都将采用HTTPS的通信协议进行。</p>
<p>HTTPS相较于HTTP，虽然名称上只是多了个S，但其实有很大的差别，其中还涉及一些新的概念名词，比如：SSL、TLS。</p>
<p>如果您对于HTTPS的原理还不够了解的话，这里正好看到一个不错的科普视频，里面包含详细的动图说明，可以更直观地让你理解HTTPS是如何运作的，还可以理解诸如SSL、TLS这些在HTTPS中的作用。</p>
<p>下面就通过这个短短5分钟的视频来学习一下吧：</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>什么是WebSocket</title>
      <link>https://www.didispace.com/youtube/20230916-what-is-websocket.html</link>
      <guid>https://www.didispace.com/youtube/20230916-what-is-websocket.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是WebSocket</source>
      <description>什么是WebSocket 之前我们已经介绍了关于RESTful API的科普知识。有读者反馈想了解关于WebSocket的科普。 通过一番查找，下面这个视频目前看下来是容易看懂的。该视频通过一个实际场景（聊天），介绍了在RESTful API情况要如何去实现，这个时候有什么缺点，然后引出WebSocket的解决方案，通过对比各自的优缺点，来让您理解WebSocket的优势和应用场景。 如果您对WebSocket还不太了解的话，不妨观看一下这个视频吧：</description>
      <category>技术科普</category>
      <pubDate>Sat, 16 Sep 2023 16:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是WebSocket</h1>
<p>之前我们已经介绍了关于<a href="/youtube/20230912-why-rest-so-popular.html" target="blank">RESTful API</a>的科普知识。有读者反馈想了解关于WebSocket的科普。</p>
<p>通过一番查找，下面这个视频目前看下来是容易看懂的。该视频通过一个实际场景（聊天），介绍了在RESTful API情况要如何去实现，这个时候有什么缺点，然后引出WebSocket的解决方案，通过对比各自的优缺点，来让您理解WebSocket的优势和应用场景。</p>
<p>如果您对WebSocket还不太了解的话，不妨观看一下这个视频吧：</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>正向代理与反向代理</title>
      <link>https://www.didispace.com/youtube/20230923-forwar-proxy-reverse-proxy.html</link>
      <guid>https://www.didispace.com/youtube/20230923-forwar-proxy-reverse-proxy.html</guid>
      <source url="https://www.didispace.com/rss.xml">正向代理与反向代理</source>
      <description>正向代理与反向代理 代理（Proxy）这个词，相信每一个开发人员都不陌生。 作为一名Java开发人员，反向代理你一定接触过。因为我们启动了Spring Boot应用之后，通常都用用Nginx来为其做反向代理配置。 那么到底什么是反向代理？什么又是正向代理呢？它们的区别是什么？又都应该应用在什么场景呢？</description>
      <category>技术科普</category>
      <pubDate>Sat, 23 Sep 2023 12:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 正向代理与反向代理</h1>
<p>代理（Proxy）这个词，相信每一个开发人员都不陌生。</p>
<p>作为一名Java开发人员，反向代理你一定接触过。因为我们启动了Spring Boot应用之后，通常都用用Nginx来为其做反向代理配置。</p>
<p>那么到底什么是反向代理？什么又是正向代理呢？它们的区别是什么？又都应该应用在什么场景呢？</p>
<!-- more -->
<p>下面就一起跟着这个来自油管频道ByteByteGo的视频学习一下吧！</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是负载均衡</title>
      <link>https://www.didispace.com/youtube/20230923-top-6-loadbalance.html</link>
      <guid>https://www.didispace.com/youtube/20230923-top-6-loadbalance.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是负载均衡</source>
      <description>什么是负载均衡 不论是网站还是App，随着用户量的增加，都会面向一个同样的问题，就是用户请求的逐步增加。我们的服务器会遭受巨大的流量考验。 很多开发初学者会说：提高服务器的配置来应对就可以了。 这个思路并没有错。但是，服务器的性能是有上限的，当世界上最好的服务器都无法承载的时候，我们又该怎么办呢？ 下面，我们就来学习一个重要知识：负载均衡。</description>
      <category>技术科普</category>
      <pubDate>Sat, 23 Sep 2023 12:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是负载均衡</h1>
<p>不论是网站还是App，随着用户量的增加，都会面向一个同样的问题，就是用户请求的逐步增加。我们的服务器会遭受巨大的流量考验。</p>
<p>很多开发初学者会说：提高服务器的配置来应对就可以了。</p>
<p>这个思路并没有错。但是，服务器的性能是有上限的，当世界上最好的服务器都无法承载的时候，我们又该怎么办呢？</p>
<p>下面，我们就来学习一个重要知识：负载均衡。</p>
<!-- more -->
<p>以下视频来自油管频道ByteByteGo，原视频为英文，这里采用Chrome插件<a href="https://youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">Youtube中文配音</a>做了翻译+配音处理，以方便读者可以听中文看动画图示，更方便的理解技术内容。</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是云原生</title>
      <link>https://www.didispace.com/youtube/20230925-what-is-cloud-native.html</link>
      <guid>https://www.didispace.com/youtube/20230925-what-is-cloud-native.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是云原生</source>
      <description>什么是云原生 云原生是这几年一直都很火的热门技术方向。 关于云原生的理解，DD以前一直推荐大家要看的一篇文章是：云原生12要素。 这篇文章中，定义了云原生应用应该具备的特点，以指导大家在设计开发流程、技术选型以及系统架构上更适应往云计算平台上部署。同时，尽可能的降低本地环境、测试环境与云上环境的差异，以减少因环境产生的额外错误与为了适配做额外的工作。 最近，看到ByteByteGo上一个不错的介绍云原生的视频，所以拿过来做了翻译+配音，帮助读者更好的理解云原生。感兴趣的小伙伴可以看看：</description>
      <category>技术科普</category>
      <pubDate>Mon, 25 Sep 2023 10:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是云原生</h1>
<p><strong>云原生</strong>是这几年一直都很火的热门技术方向。</p>
<p>关于云原生的理解，<a href="https://www.didispace.com" target="_blank" rel="noopener noreferrer">DD</a>以前一直推荐大家要看的一篇文章是：<a href="https://www.didispace.com/oblog/12factor-zh-cn.html" target="_blank" rel="noopener noreferrer">云原生12要素</a>。</p>
<p>这篇文章中，定义了云原生应用应该具备的特点，以指导大家在设计开发流程、技术选型以及系统架构上更适应往云计算平台上部署。同时，尽可能的降低本地环境、测试环境与云上环境的差异，以减少因环境产生的额外错误与为了适配做额外的工作。</p>
<p>最近，看到ByteByteGo上一个不错的介绍云原生的视频，所以拿过来做了翻译+配音，帮助读者更好的理解云原生。感兴趣的小伙伴可以看看：</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>为什么Kafka那么快</title>
      <link>https://www.didispace.com/youtube/20230926-why-kafka-so-fast.html</link>
      <guid>https://www.didispace.com/youtube/20230926-why-kafka-so-fast.html</guid>
      <source url="https://www.didispace.com/rss.xml">为什么Kafka那么快</source>
      <description>为什么Kafka那么快 Kafka是LinkedIn开发的一款消息中间件，后与2011年捐赠给Apache基金会。Kafka凭借性能远超其他消息中间件的特性成为最为流行的消息中间件。它被广泛应用于各种业务系统、分布式框架和基础设施的建设中。 那么问题来了！ Kafka为什么会比其他消息中间件更快呢？ 如果您也有这样的疑问，那么一起通过下面的视频来了解其底层的奥秘吧！</description>
      <category>技术科普</category>
      <pubDate>Tue, 26 Sep 2023 15:30:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 为什么Kafka那么快</h1>
<p>Kafka是LinkedIn开发的一款消息中间件，后与2011年捐赠给Apache基金会。Kafka凭借性能远超其他消息中间件的特性成为最为流行的消息中间件。它被广泛应用于各种业务系统、分布式框架和基础设施的建设中。</p>
<p>那么问题来了！</p>
<p>Kafka为什么会比其他消息中间件更快呢？</p>
<p>如果您也有这样的疑问，那么一起通过下面的视频来了解其底层的奥秘吧！</p>
<!-- more -->
<p>以下视频来自油管频道ByteByteGo，原视频为英文，这里采用Chrome插件<a href="https://youtube-dubbing.com/" target="_blank" rel="noopener noreferrer">Youtube中文配音</a>做了翻译+配音处理，以方便读者可以听中文看动画图示，更方便的理解技术内容。</p>
]]></content:encoded>
    </item>
    <item>
      <title>用户隐私是如何通过Cookie泄漏的</title>
      <link>https://www.didispace.com/youtube/20230927-tracking-cookie.html</link>
      <guid>https://www.didispace.com/youtube/20230927-tracking-cookie.html</guid>
      <source url="https://www.didispace.com/rss.xml">用户隐私是如何通过Cookie泄漏的</source>
      <description>用户隐私是如何通过Cookie泄漏的 当你在A网站看一个商品的时候，切换到B网站，又给你推荐了类似的商品。 为什么其他网站会知道你感兴趣的商品呢？这里就涉及到今天要介绍的一个技术概念：Cookie。 下面我们一起跟着视频来了解Cookie的初衷、以及它是如何失控，使得用户隐私被滥用的。</description>
      <category>技术科普</category>
      <pubDate>Wed, 27 Sep 2023 01:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 用户隐私是如何通过Cookie泄漏的</h1>
<p>当你在A网站看一个商品的时候，切换到B网站，又给你推荐了类似的商品。</p>
<p>为什么其他网站会知道你感兴趣的商品呢？这里就涉及到今天要介绍的一个技术概念：Cookie。</p>
<p>下面我们一起跟着视频来了解Cookie的初衷、以及它是如何失控，使得用户隐私被滥用的。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>为什么Redis那么快？</title>
      <link>https://www.didispace.com/youtube/20231001-why-redis-so-fast.html</link>
      <guid>https://www.didispace.com/youtube/20231001-why-redis-so-fast.html</guid>
      <source url="https://www.didispace.com/rss.xml">为什么Redis那么快？</source>
      <description>为什么Redis那么快？ Redis作为当今最流行的内存数据库，已经成为服务端加速必备工具之一。 那么你是否有想过，为什么Redis那么快吗？为什么Redis采用单线程设计，但为什么反而获得更高的性能呢？ 下面一起通过视频来解答这些疑问：</description>
      <category>技术科普</category>
      <pubDate>Sun, 01 Oct 2023 01:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 为什么Redis那么快？</h1>
<p>Redis作为当今最流行的内存数据库，已经成为服务端加速必备工具之一。</p>
<p>那么你是否有想过，为什么Redis那么快吗？为什么Redis采用单线程设计，但为什么反而获得更高的性能呢？</p>
<p>下面一起通过视频来解答这些疑问：</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>Redis最常见的5种应用场景</title>
      <link>https://www.didispace.com/youtube/20231003-redis-top-5-case.html</link>
      <guid>https://www.didispace.com/youtube/20231003-redis-top-5-case.html</guid>
      <source url="https://www.didispace.com/rss.xml">Redis最常见的5种应用场景</source>
      <description>Redis最常见的5种应用场景 Redis作为当今最流行的内存数据库，已经成为服务端加速的必备工具之一。对于Redis为什么那么快？以及Redis采用单线程，但为什么反而获得更高的性能的疑问，在之前的Redis为什么那么快？一文中，已经有所介绍。 今天通过这篇，我们来了解一下Redis最常见的5种应用场景。</description>
      <category>技术科普</category>
      <pubDate>Tue, 03 Oct 2023 01:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Redis最常见的5种应用场景</h1>
<p>Redis作为当今最流行的内存数据库，已经成为服务端加速的必备工具之一。对于Redis为什么那么快？以及Redis采用单线程，但为什么反而获得更高的性能的疑问，在之前的<a href="/youtube/20231001-why-redis-so-fast.html" target="blank">Redis为什么那么快？</a>一文中，已经有所介绍。</p>
<p>今天通过这篇，我们来了解一下Redis最常见的5种应用场景。</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/f0fe984003c2b5e7c01e1611f3076faf.png" type="image/png"/>
    </item>
    <item>
      <title>Cookie、Session、Token的区别</title>
      <link>https://www.didispace.com/youtube/20231007-cookie-session-token.html</link>
      <guid>https://www.didispace.com/youtube/20231007-cookie-session-token.html</guid>
      <source url="https://www.didispace.com/rss.xml">Cookie、Session、Token的区别</source>
      <description>Cookie、Session、Token的区别 Cookie、Session、Token是Web开发中经常涉及到的三种概念。 之前我们通过《用户隐私是如何通过Cookie泄漏的》一文，了解了Cookie的起源、作用以及如何被互联网大厂们滥用而失控的。 那么，Session和Token又是啥呢？它们与Cookie的区别又是啥呢？ 这里DD给大家找了一个不错的讲解视频，该视频结合实际应用场景来解释了Cookie、Session、Token的使用，以直观的帮助大家理解它们的区别。</description>
      <category>技术科普</category>
      <pubDate>Sat, 07 Oct 2023 01:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Cookie、Session、Token的区别</h1>
<p>Cookie、Session、Token是Web开发中经常涉及到的三种概念。</p>
<p>之前我们通过<a href="/youtube/20230927-tracking-cookie.html" target="blank">《用户隐私是如何通过Cookie泄漏的》</a>一文，了解了Cookie的起源、作用以及如何被互联网大厂们滥用而失控的。</p>
<p>那么，Session和Token又是啥呢？它们与Cookie的区别又是啥呢？</p>
<p>这里DD给大家找了一个不错的讲解视频，该视频结合实际应用场景来解释了Cookie、Session、Token的使用，以直观的帮助大家理解它们的区别。</p>
<p>如果您觉得对这三者的理解还比较模糊的话，可以通过下面的视频学习，一次搞懂它：</p>
]]></content:encoded>
    </item>
    <item>
      <title>Docker 如今还有存在和学习价值吗？</title>
      <link>https://www.didispace.com/youtube/20231008-docker-is-still.html</link>
      <guid>https://www.didispace.com/youtube/20231008-docker-is-still.html</guid>
      <source url="https://www.didispace.com/rss.xml">Docker 如今还有存在和学习价值吗？</source>
      <description>Docker 如今还有存在和学习价值吗？ 曾经大火的Docker，把容器技术推上了主流。随后，基于容器技术的各种编排和管理解决方案开始了大混战。在经历了几年的百花齐放之后，Kubernetes脱颖而出。 如今，对于容器技术而言，大家基本都是都直接学Kubernetes了，那么Docker对于开发者来说，是否还有学习必要吗？其存在还有价值吗？ 下面，给大家分享一位国外博主的观点：</description>
      <category>技术科普</category>
      <pubDate>Sun, 08 Oct 2023 01:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> Docker 如今还有存在和学习价值吗？</h1>
<p>曾经大火的Docker，把容器技术推上了主流。随后，基于容器技术的各种编排和管理解决方案开始了大混战。在经历了几年的百花齐放之后，Kubernetes脱颖而出。</p>
<p>如今，对于容器技术而言，大家基本都是都直接学Kubernetes了，那么Docker对于开发者来说，是否还有学习必要吗？其存在还有价值吗？</p>
<p>下面，给大家分享一位国外博主的观点：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 Serverless</title>
      <link>https://www.didispace.com/youtube/20231009-what-is-serverless.html</link>
      <guid>https://www.didispace.com/youtube/20231009-what-is-serverless.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 Serverless</source>
      <description>什么是 Serverless Serverless是目前比较云服务中比较前沿且热门的一类产品，这个词在很多地方被翻译成：无服务器。 之前DD的不少文章也是关于Serverless的体验文章，比如： Serverless初体验：快速开发与部署一个Hello World 只是想虐下春丽，一不当心玩了下Serverless</description>
      <category>技术科普</category>
      <pubDate>Mon, 09 Oct 2023 01:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 Serverless</h1>
<p>Serverless是目前比较云服务中比较前沿且热门的一类产品，这个词在很多地方被翻译成：<strong>无服务器</strong>。</p>
<p>之前DD的不少文章也是关于Serverless的体验文章，比如：</p>
<ul>
<li><a href="https://www.didispace.com/oblog/aliyun-serverless-helloworld-202009.html" target="_blank" rel="noopener noreferrer">Serverless初体验：快速开发与部署一个Hello World</a></li>
<li><a href="https://www.didispace.com/oblog/20210804-serverless-start.html" target="_blank" rel="noopener noreferrer">只是想虐下春丽，一不当心玩了下Serverless</a></li>
</ul>
<p>也有一些关于Serverless的应用思考，比如：</p>
<ul>
<li><a href="https://www.didispace.com/oblog/aws-saas-serverless-2021.html" target="_blank" rel="noopener noreferrer">如何用Serverless让SaaS获得更灵活的租户隔离和更优的资源开销</a></li>
</ul>
<p>即使谈过一些，但相信还是有不少小伙伴，对于Serverless的理解，依然一知半解，尤其对于解释为<strong>无服务器</strong>的时候，更是觉得奇怪了。</p>
<p>为了彻底弄懂Serverless是啥，不妨在这里，你可以尝试用自己的语言，在留言描述一下：你对Serverless的认识。</p>
<p>然后，DD再给大家推荐一个学习视频，看看与你的理解是否一致：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是分布式跟踪</title>
      <link>https://www.didispace.com/youtube/20231013-what-is-trace.html</link>
      <guid>https://www.didispace.com/youtube/20231013-what-is-trace.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是分布式跟踪</source>
      <description>什么是分布式跟踪 如果您正在参与分布式架构或者微服务架构的项目的话，今天这个概念是必须要掌握的。因为它是分布式架构中必不可少的问题洞察手段，它可以帮助你把散落在各处的分布式系统内部依赖关系、性能瓶颈等原本不易观察的东西，变得更容易查看和分析。 那么具体什么是分布式跟踪，它是如何运作的呢？一起根据下面的视频来直观的了解一下吧：</description>
      <category>技术科普</category>
      <pubDate>Fri, 13 Oct 2023 14:01:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是分布式跟踪</h1>
<p>如果您正在参与分布式架构或者微服务架构的项目的话，今天这个概念是必须要掌握的。因为它是分布式架构中必不可少的问题洞察手段，它可以帮助你把散落在各处的分布式系统内部依赖关系、性能瓶颈等原本不易观察的东西，变得更容易查看和分析。</p>
<p>那么具体什么是分布式跟踪，它是如何运作的呢？一起根据下面的视频来直观的了解一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>HTTP从1到3，各版本更新了什么</title>
      <link>https://www.didispace.com/youtube/20231014-http-history.html</link>
      <guid>https://www.didispace.com/youtube/20231014-http-history.html</guid>
      <source url="https://www.didispace.com/rss.xml">HTTP从1到3，各版本更新了什么</source>
      <description>HTTP从1到3，各版本更新了什么 相信大部分关注DD的朋友，都是后端开发，都接触过HTTP接口的开发。但是，我发现有不少开发者，对于HTTP协议的基础知识还是非常欠缺的，所以最近打算整理一些HTTP相关的基础概念科普知识视频，以方便大家学习和了解，补齐大学时候没有认证学习的内容。 今天主要讲讲HTTP的版本，先尝试问自己几个问题： 你知道你在用的HTTP版本是多少吗？ HTTP已经经历了多少次版本迭代？ 每个版本都更新优化了什么内容？ 如果您对这个问题还有疑惑，那下面的视频一定不要错过，一次都搞懂它们吧：</description>
      <category>技术科普</category>
      <pubDate>Sat, 14 Oct 2023 01:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> HTTP从1到3，各版本更新了什么</h1>
<p>相信大部分关注DD的朋友，都是后端开发，都接触过HTTP接口的开发。但是，我发现有不少开发者，对于HTTP协议的基础知识还是非常欠缺的，所以最近打算整理一些HTTP相关的基础概念科普知识视频，以方便大家学习和了解，补齐大学时候没有认证学习的内容。</p>
<p>今天主要讲讲HTTP的版本，先尝试问自己几个问题：</p>
<ul>
<li>你知道你在用的HTTP版本是多少吗？</li>
<li>HTTP已经经历了多少次版本迭代？</li>
<li>每个版本都更新优化了什么内容？</li>
</ul>
<p>如果您对这个问题还有疑惑，那下面的视频一定不要错过，一次都搞懂它们吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 JWT</title>
      <link>https://www.didispace.com/youtube/20231014-what-is-jwt.html</link>
      <guid>https://www.didispace.com/youtube/20231014-what-is-jwt.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 JWT</source>
      <description>什么是 JWT JWT相信很多前后端开发都知道这个名词，全称：JSON Web Token。 一般被用来在身份提供者和服务提供者之间传递被认证用户的身份信息，以便于从资源服务器获取资源。 那么你是否真正理解JWT呢？ 不妨思考几个问题： JWT是否安全？ 什么数据不适合存？ 哪些场景不适合使用？ 如果心理没有明确答案的话，那再通过这个视频来学习一下吧。</description>
      <category>技术科普</category>
      <pubDate>Sat, 14 Oct 2023 00:10:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 JWT</h1>
<p>JWT相信很多前后端开发都知道这个名词，全称：JSON Web Token。</p>
<p>一般被用来在身份提供者和服务提供者之间传递被认证用户的身份信息，以便于从资源服务器获取资源。</p>
<p>那么你是否真正理解JWT呢？</p>
<p>不妨思考几个问题：</p>
<ul>
<li>JWT是否安全？</li>
<li>什么数据不适合存？</li>
<li>哪些场景不适合使用？</li>
</ul>
<p>如果心理没有明确答案的话，那再通过这个视频来学习一下吧。</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 OAuth 2.0</title>
      <link>https://www.didispace.com/youtube/20231014-what-is-oauth2.html</link>
      <guid>https://www.didispace.com/youtube/20231014-what-is-oauth2.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 OAuth 2.0</source>
      <description>什么是 OAuth 2.0 昨天分享了一个关于JWT的视频，有不少读者提议再介绍一下另外一个被广泛应用的东西：OAuth 2.0 DD看了就几个，目前看下来还是ByteByteGo的这个最为通俗易懂。所以，如果您还没弄懂这个概念的话，可以通过下面的视频来学习一下：</description>
      <category>技术科普</category>
      <pubDate>Sat, 14 Oct 2023 00:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 OAuth 2.0</h1>
<p>昨天分享了一个关于<a href="/youtube/20231014-what-is-jwt.html" target="blank">JWT</a>的视频，有不少读者提议再介绍一下另外一个被广泛应用的东西：OAuth 2.0</p>
<p>DD看了就几个，目前看下来还是ByteByteGo的这个最为通俗易懂。所以，如果您还没弄懂这个概念的话，可以通过下面的视频来学习一下：</p>
]]></content:encoded>
    </item>
    <item>
      <title>搞懂HTTP状态码，帮你更快排查问题原因</title>
      <link>https://www.didispace.com/youtube/20231015-http-status-code.html</link>
      <guid>https://www.didispace.com/youtube/20231015-http-status-code.html</guid>
      <source url="https://www.didispace.com/rss.xml">搞懂HTTP状态码，帮你更快排查问题原因</source>
      <description>搞懂HTTP状态码，帮你更快排查问题原因 当网站出于某种原因没能正常显示页面的时候，经常用户受到的是一个三位数的错误，比如：401、404、500等。 为什么经验老道的程序员可以根据此信息快速的定位问题，而有的程序员却要排查很久呢？ 究其原因还是对HTTP状态码的不熟悉，不了解每个错误码背后的含义。如果您了解了这些数字代表了啥，那么当出现错误的时候，你也能快速的想到该去排查什么问题。所以，如果您还不了解的话，赶紧补一下这块知识吧：</description>
      <category>技术科普</category>
      <pubDate>Sun, 15 Oct 2023 00:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 搞懂HTTP状态码，帮你更快排查问题原因</h1>
<p>当网站出于某种原因没能正常显示页面的时候，经常用户受到的是一个三位数的错误，比如：401、404、500等。</p>
<p><img src="https://static.didispace.com/images3/f5fc51f35e5cb6fcb58706e655a04984.png" alt=""></p>
<p>为什么经验老道的程序员可以根据此信息快速的定位问题，而有的程序员却要排查很久呢？</p>
<p>究其原因还是对HTTP状态码的不熟悉，不了解每个错误码背后的含义。如果您了解了这些数字代表了啥，那么当出现错误的时候，你也能快速的想到该去排查什么问题。所以，如果您还不了解的话，赶紧补一下这块知识吧：</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/f5fc51f35e5cb6fcb58706e655a04984.png" type="image/png"/>
    </item>
    <item>
      <title>什么是CDN，它是如何给网站加速的？</title>
      <link>https://www.didispace.com/youtube/20231015-what-is-cdn.html</link>
      <guid>https://www.didispace.com/youtube/20231015-what-is-cdn.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是CDN，它是如何给网站加速的？</source>
      <description>什么是CDN，它是如何给网站加速的？ 记得DD第一个网站是用WordPress搭的，由于成本有限，配置不是很高，所以一直都是卡卡的。后来折腾过好几回博客，从GitBook、Ghost、到Hexo，再到现在的VuePress，都采用了静态网站的形式部署。所以访问速度得到了质的飞跃。 虽然，采用静态页面部署之后，大部分访问者速度确实快了不少，但还是有些地区的访问者有时候反应慢的情况。于是，就引入了CDN来加速网站访问，解决了这个问题。后来就很少听到有读者反映网站访问速度慢了。 那么什么是CDN呢？它是如何实现网站加速的呢？如果您还不了解的话，一起跟着下面这个视频学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Sun, 15 Oct 2023 02:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是CDN，它是如何给网站加速的？</h1>
<p>记得DD第一个网站是用WordPress搭的，由于成本有限，配置不是很高，所以一直都是卡卡的。后来折腾过好几回博客，从GitBook、Ghost、到Hexo，再到现在的VuePress，都采用了静态网站的形式部署。所以访问速度得到了质的飞跃。</p>
<p>虽然，采用静态页面部署之后，大部分访问者速度确实快了不少，但还是有些地区的访问者有时候反应慢的情况。于是，就引入了CDN来加速网站访问，解决了这个问题。后来就很少听到有读者反映网站访问速度慢了。</p>
<p>那么什么是CDN呢？它是如何实现网站加速的呢？如果您还不了解的话，一起跟着下面这个视频学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是WebHook，如何实现？适用什么场景？</title>
      <link>https://www.didispace.com/youtube/20231016-what-is-webhook.html</link>
      <guid>https://www.didispace.com/youtube/20231016-what-is-webhook.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是WebHook，如何实现？适用什么场景？</source>
      <description>什么是WebHook，如何实现？适用什么场景？ 之前我们已经持续介绍了几种提供API服务的实现模式，包括： gRPC：一种高性能、跨语言、易扩展的远程过程调用(RPC)框架，可用于分布式系统之间的通信。gRPC被广泛地应用于微服务体系结构中。 GraphQL：Facebook开源的一种新颖的架构模式，允许客户端只请求他们需要的数据，可以有效地减少数据的过度获取等问题。 REST：一种用于设计网络应用程序的架构风格，使用标准的HTTP方法(GET、POST、PUT、DELETE)来操作资源。 WebSocket：一种支持客户端和服务器之间通过单一、长期连接方式进行的双向实时通信协议，非常适合需要低延迟更新的应用程序，如：实时聊天、主动推送、游戏等领域。</description>
      <category>技术科普</category>
      <pubDate>Mon, 16 Oct 2023 02:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是WebHook，如何实现？适用什么场景？</h1>
<p>之前我们已经持续介绍了几种提供API服务的实现模式，包括：</p>
<ol>
<li><a href="/youtube/20230913-what-is-gRPC.html" target="blank">gRPC</a>：一种高性能、跨语言、易扩展的远程过程调用(RPC)框架，可用于分布式系统之间的通信。gRPC被广泛地应用于微服务体系结构中。</li>
<li><a href="/youtube/20230913-what-is-GraphQL.html" target="blank">GraphQL</a>：Facebook开源的一种新颖的架构模式，允许客户端只请求他们需要的数据，可以有效地减少数据的过度获取等问题。</li>
<li><a href="/youtube/20230912-why-rest-so-popular.html" target="blank">REST</a>：一种用于设计网络应用程序的架构风格，使用标准的HTTP方法(GET、POST、PUT、DELETE)来操作资源。</li>
<li><a href="/youtube/20230916-what-is-websocket.html" target="blank">WebSocket</a>：一种支持客户端和服务器之间通过单一、长期连接方式进行的双向实时通信协议，非常适合需要低延迟更新的应用程序，如：实时聊天、主动推送、游戏等领域。</li>
</ol>
<p>今天，我们继续介绍另一种实现模式：<strong>WebHook</strong>。WebHook是一种被动式的实时通信机制，其中应用程序向预定义的URL发送HTTP POST请求以通知并触发另一个系统中的操作。</p>
<p>那么它是如何实现的？适用于哪些场景呢？下面一起跟着下面这个视频学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>免费WIFI背后的安全问题，你知道吗？</title>
      <link>https://www.didispace.com/youtube/20231020-free-wifi-is-no-secure.html</link>
      <guid>https://www.didispace.com/youtube/20231020-free-wifi-is-no-secure.html</guid>
      <source url="https://www.didispace.com/rss.xml">免费WIFI背后的安全问题，你知道吗？</source>
      <description>免费WIFI背后的安全问题，你知道吗？ 很多时候，我去到商场，咖啡店等公共场所时，经常能看到Free WIFI的标牌。 那么你是否会使用公共场所的免费WiFi吗？你是否知道免费WiFi背后所隐藏的安全问题吗？ 下面一起跟着下面这个视频学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Sat, 21 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 免费WIFI背后的安全问题，你知道吗？</h1>
<p>很多时候，我去到商场，咖啡店等公共场所时，经常能看到Free WIFI的标牌。</p>
<p><img src="https://static.didispace.com/images3/c785cf11155e20a6de0bc08d0ee3e7d0.png" alt=""></p>
<p>那么你是否会使用公共场所的免费WiFi吗？你是否知道免费WiFi背后所隐藏的安全问题吗？</p>
<p>下面一起跟着下面这个视频学习一下吧：</p>
]]></content:encoded>
      <enclosure url="https://static.didispace.com/images3/c785cf11155e20a6de0bc08d0ee3e7d0.png" type="image/png"/>
    </item>
    <item>
      <title>万维网之父力推的SOLID计划是什么？</title>
      <link>https://www.didispace.com/youtube/20231021-what-is-solid.html</link>
      <guid>https://www.didispace.com/youtube/20231021-what-is-solid.html</guid>
      <source url="https://www.didispace.com/rss.xml">万维网之父力推的SOLID计划是什么？</source>
      <description>万维网之父力推的SOLID计划是什么？ 近些年，我们不断地看到各种国内外科技公司屡次暴露用户隐私的问题，包括诸多知名公司也都深陷其中，这和用户的许多数据都在互联网巨头手中高度集中不无关系。 为此，互联网之父Tim Berners Lee公开发布文章，表示要通过一个开源项目SOLID来解决这一问题。那么是SOLID呢？ 下面一起跟着下面这个视频学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Sat, 21 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 万维网之父力推的SOLID计划是什么？</h1>
<p>近些年，我们不断地看到各种国内外科技公司屡次暴露用户隐私的问题，包括诸多知名公司也都深陷其中，这和用户的许多数据都在互联网巨头手中高度集中不无关系。</p>
<p>为此，互联网之父Tim Berners Lee公开发布文章，表示要通过一个开源项目SOLID来解决这一问题。那么是SOLID呢？</p>
<p>下面一起跟着下面这个视频学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>什么是 OSI 模型</title>
      <link>https://www.didispace.com/youtube/20231022-what-is-osi-model.html</link>
      <guid>https://www.didispace.com/youtube/20231022-what-is-osi-model.html</guid>
      <source url="https://www.didispace.com/rss.xml">什么是 OSI 模型</source>
      <description>什么是 OSI 模型 对于网络通信来说，相信很多开发者对与TCP/IP、HTTP这些协议已经非常熟悉了。 那么OSI这样的7层模型你是否了解呢？它与TCP/IP这样的4四层协议之间又有什么样的关系呢？ 下面一起跟着下面这个视频学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Sun, 22 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 什么是 OSI 模型</h1>
<p>对于网络通信来说，相信很多开发者对与TCP/IP、HTTP这些协议已经非常熟悉了。</p>
<p>那么OSI这样的7层模型你是否了解呢？它与TCP/IP这样的4四层协议之间又有什么样的关系呢？</p>
<p>下面一起跟着下面这个视频学习一下吧：</p>
]]></content:encoded>
    </item>
    <item>
      <title>身份认证方案对比：Session vs Token</title>
      <link>https://www.didispace.com/youtube/20231023-session-vs-token.html</link>
      <guid>https://www.didispace.com/youtube/20231023-session-vs-token.html</guid>
      <source url="https://www.didispace.com/rss.xml">身份认证方案对比：Session vs Token</source>
      <description>身份认证方案对比：Session vs Token 关于身份验证，之前介绍过几个了，比如： 什么是JWT 什么是OAuth 2.0 那么Session和Token之间的区别是什么呢？都有哪些优缺点，都适用于哪些场景呢？ 下面一起跟着下面这个视频学习一下吧：</description>
      <category>技术科普</category>
      <pubDate>Mon, 23 Oct 2023 12:20:00 GMT</pubDate>
      <content:encoded><![CDATA[<h1> 身份认证方案对比：Session vs Token</h1>
<p>关于身份验证，之前介绍过几个了，比如：</p>
<ul>
<li><a href="/youtube/20231014-what-is-jwt.html" target="blank">什么是JWT</a></li>
<li><a href="/youtube/20231014-what-is-oauth2.html" target="blank">什么是OAuth 2.0</a></li>
</ul>
<p>那么Session和Token之间的区别是什么呢？都有哪些优缺点，都适用于哪些场景呢？</p>
<p>下面一起跟着下面这个视频学习一下吧：</p>
]]></content:encoded>
    </item>
  </channel>
</rss>