<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>rocLv (rocLv)</title>
    <link>https://ruby-china.org/rocLv</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>为了庆祝【RubyConf China 2024】特意把之前的 Rails 高级程序员的课程做了免费发布</title>
      <description>&lt;p&gt;如题。&lt;/p&gt;

&lt;p&gt;感谢之前的学员，谢谢你们的付出，金钱和时间的。&lt;/p&gt;

&lt;p&gt;希望公开这些课程，可以帮助大家走的更远，这大概就是分享的意义。&lt;/p&gt;

&lt;p&gt;目前公开的课程包括元编程、Rebuilding Rails、Rails 源码解读。&lt;/p&gt;

&lt;p&gt;后续也会继续开放其他架构课程、设计模式课程。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/83bcf5f0-146d-49ab-8609-1e67db59bc58.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;红色框的是已经开放了的，其他的陆续上传中。&lt;/p&gt;

&lt;p&gt;视频观看地址：&lt;a href="https://space.bilibili.com/95262426" rel="nofollow" target="_blank" title=""&gt;https://space.bilibili.com/95262426&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;太多了就不一一贴上来了。&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Wed, 23 Oct 2024 17:52:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/43928</link>
      <guid>https://ruby-china.org/topics/43928</guid>
    </item>
    <item>
      <title>如果有足够的资金让大家去创业，你们会干啥呢？</title>
      <description>&lt;p&gt;如题&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Fri, 01 Dec 2023 09:21:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/43492</link>
      <guid>https://ruby-china.org/topics/43492</guid>
    </item>
    <item>
      <title>【TGeek.cn】举办第四期【Build Your Own Ruby on Rails 高级研修班】以及【首期云原生高级工程师研修班】啦</title>
      <description>&lt;p&gt;自从上次参加了 2023 年的 Ruby China Conf，见到了不少熟面孔，也见到了不少生面孔，总有种 Ruby 社区后继有人的感觉 &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;为了进一步促进 Ruby 社区的发展，一方面我们准备推出一些基于 Ruby 3.2 的基础课程（新人建议从 2.7 左右的版本学起，等掌握了基础知识再学习新的一些特性），另一方面也准备推出一些免费的 Ruby on Rails 的 Web 开发初级课程。&lt;/p&gt;

&lt;p&gt;随着 ChatGPT 的大火，好像初级程序员和专家程序员之间的鸿沟可以用 ChatGPT 来填起来，然而，也许令很多人失望的事，如果你是专家级程序员，那么 ChatGPT 就是专家助理，如果你是初级程序员，那么 ChatGPT 能帮你的也很少。&lt;/p&gt;

&lt;p&gt;因为，你问的问题，取决于你的眼界。&lt;/p&gt;

&lt;p&gt;那么，我们是如何在新的时代，来改造我们的课程的呢？&lt;/p&gt;

&lt;p&gt;随着 ChatGPT 的普及，我们也在思考什么是 ChatGPT 能带来的，什么是 ChatGPT 所不能带来的？&lt;/p&gt;

&lt;p&gt;ChatGPT 可以给我们几乎任意的专业答案，前提是我们需要问的正确。
ChatGPT 也可能给我们一些看似正确，却是胡扯的答案，这需要我们能甄别。&lt;/p&gt;

&lt;p&gt;那么，对于第一个问题，我们需要掌握的就是某个方向知识的边界。以 Rails 开发来讲，我们需要知道 Rails 可以做什么，不可以做什么。
对于第二个问题，我们需要熟练的掌握我们的技能。
也就是说，我们依然要成为专家，才能让 ChatGPT 成为专家级助理。&lt;/p&gt;

&lt;p&gt;那么，ChatGPT 在辅助编程的价值在哪里呢？我觉得以下几个方面都是 ChatGPT 的强项。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ChatGPT 可以让我们从具体的 API 中释放出来，我们不需要再牢记，或者查看 API 的接口文档。
比如，我们需要写一个微信支付的接口，之前我们需要看微信支付的 API 文档，需要看 相关 Gem 包的文档，但是，现在我们完全可以抛给 ChatGPT：&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;把我们从无聊的工作中解放出来。
比如，我们需要根据第三方的接口，创建 Migration，创建 Model 等，我们完全可以把这些工作交给 ChatGPT。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;自动生成某些代码。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;对于那些高级程序员来说，ChatGPT 也可以帮我们解释代码，帮助我们熟悉源代码等。&lt;/p&gt;

&lt;p&gt;从目前来说，希望 ChatGPT 具备某种框架级别、系统级别的能力，还需要我们付出很大的努力。
比如说，让 ChatGPT 生成一个 MVC 的框架，注定需要我们一步步的去引导。
而引导的这个能力，就是我们应该具备的专家级的能力。&lt;/p&gt;

&lt;p&gt;我们的课程，与以往不同的是，更多的关注于 Rails 整体架构设计的理念、软件分层的理念等一些相对比较抽象的概念。
对于具体代码的理解，我们会尝试使用 ChatGPT，授之以渔，而不是授至以鱼。&lt;/p&gt;
&lt;h2 id="Build Your Own Ruby on Rails 高级研修班 【60课时】【3999元】"&gt;Build Your Own Ruby on Rails 高级研修班【60 课时】【3999 元】&lt;/h2&gt;&lt;h3 id="Ruby进阶"&gt;Ruby 进阶&lt;/h3&gt;&lt;h4 id="温习基础"&gt;温习基础&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;基础数据类型&lt;/li&gt;
&lt;li&gt;判定&lt;/li&gt;
&lt;li&gt;循环&lt;/li&gt;
&lt;li&gt;字符串&lt;/li&gt;
&lt;li&gt;数组&lt;/li&gt;
&lt;li&gt;Hash&lt;/li&gt;
&lt;li&gt;正则表达式&lt;/li&gt;
&lt;li&gt;模组&lt;/li&gt;
&lt;li&gt;异常&lt;/li&gt;
&lt;li&gt;线程&lt;/li&gt;
&lt;li&gt;手写一个 Web Server&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Ruby元编程"&gt;Ruby 元编程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Object 模型&lt;/li&gt;
&lt;li&gt;Method 迷途&lt;/li&gt;
&lt;li&gt;代码块 - 精妙的设计&lt;/li&gt;
&lt;li&gt;Eigenclass&lt;/li&gt;
&lt;li&gt;编写一种领域专属语言&lt;/li&gt;
&lt;li&gt;元编程 on Rails&lt;/li&gt;
&lt;li&gt;安全元编程&lt;/li&gt;
&lt;li&gt;元编程实战&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Ruby 清洁代码"&gt;Ruby 清洁代码&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;代码规范&lt;/li&gt;
&lt;li&gt;常用的 Ruby 代码清洁之道&lt;/li&gt;
&lt;li&gt;快速地改善代码质量的 20 条编程规范&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Ruby 面向对象编程"&gt;Ruby 面向对象编程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;面向对象基础&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;封装&lt;/li&gt;
&lt;li&gt;抽象&lt;/li&gt;
&lt;li&gt;继承&lt;/li&gt;
&lt;li&gt;多重继承&lt;/li&gt;
&lt;li&gt;多态&lt;/li&gt;
&lt;li&gt;钩子方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面向对象五大原则 SOLID&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;单一原则&lt;/li&gt;
&lt;li&gt;开闭原则&lt;/li&gt;
&lt;li&gt;李氏替换原则&lt;/li&gt;
&lt;li&gt;接口隔离原则&lt;/li&gt;
&lt;li&gt;依赖注入原则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其他设计原则&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KISS&lt;/li&gt;
&lt;li&gt;DRY&lt;/li&gt;
&lt;li&gt;YANG&lt;/li&gt;
&lt;li&gt;LOD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面向对象实战&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如何通过封装、抽象、模块化、中间层等解耦代码&lt;/li&gt;
&lt;li&gt;面向对象、设计原则、编程规范、重构技巧的核心要点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Ruby 设计模式"&gt;Ruby 设计模式&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;模式的模式&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建型模式（Creational Pattern）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;单例模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;li&gt;懒加载的双重检测与饿汉式&lt;/li&gt;
&lt;li&gt;单例模式的替代方案&lt;/li&gt;
&lt;li&gt;多例模式&lt;/li&gt;
&lt;li&gt;分布式单例模式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工厂模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;抽象工厂模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建造者模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;构造函数&lt;/li&gt;
&lt;li&gt;set 方法&lt;/li&gt;
&lt;li&gt;建造者模式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;原型模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如何快速克隆 Hash&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结构型模式（Structural Pattern)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;适配器模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;代理、适配器、桥接和装饰模式的区别&lt;/li&gt;
&lt;li&gt;Rails 中的适配器案例&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;装饰者模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代理模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;li&gt;在 Rails 中的应用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外观模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;桥接模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;组合模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;享元模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行为型模式（Behavioral Pattern）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;策略模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如何避免嵌套的 if-else/switch 分支&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模板方法模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模板模式在开源框架中的应用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;观察者模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;详解不同场景下观察者模式的实现&lt;/li&gt;
&lt;li&gt;如何实现一个异步非阻塞的框架&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;迭代器模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;责任链模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;实现一个恶意拦截网关&lt;/li&gt;
&lt;li&gt;Rails 中的实现&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;命令模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;利用命令模式实现一个手游后端架构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;备忘录模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对于大对象的备份和恢复，如何优化内存和时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;状态模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;访问者模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中介者模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;理论介绍&lt;/li&gt;
&lt;li&gt;实际应用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解释器模式&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;如何设计实现一个自定义接口告警规则功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ruby on Rails 中的设计模式&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;用设计模式重构 Rails app&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="Rails 高阶"&gt;Rails 高阶&lt;/h3&gt;&lt;h4 id="手把手构建mini rails"&gt;手把手构建 mini rails&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;为什么要重复造轮子？&lt;/li&gt;
&lt;li&gt;环境安装&lt;/li&gt;
&lt;li&gt;创建 Controller&lt;/li&gt;
&lt;li&gt;实现 Rails 的自动加载&lt;/li&gt;
&lt;li&gt;渲染视图&lt;/li&gt;
&lt;li&gt;基础版的 Model&lt;/li&gt;
&lt;li&gt;处理请求和响应&lt;/li&gt;
&lt;li&gt;最小的 ORM&lt;/li&gt;
&lt;li&gt;Rack 中间件&lt;/li&gt;
&lt;li&gt;实现路由功能&lt;/li&gt;
&lt;li&gt;实现一个 WebServer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Rails 源码导读"&gt;Rails 源码导读&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Rails 总体架构设计&lt;/li&gt;
&lt;li&gt;ActiveRecord 源码导读&lt;/li&gt;
&lt;li&gt;ActiveSupport 源码导读&lt;/li&gt;
&lt;li&gt;Raities 源码导读&lt;/li&gt;
&lt;li&gt;ActionController 源码导读&lt;/li&gt;
&lt;li&gt;ActionDispatch 源码导读&lt;/li&gt;
&lt;li&gt;ActionView 源码导读&lt;/li&gt;
&lt;li&gt;ActionCable 源码导读&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Rails App 性能优化"&gt;Rails App 性能优化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Ruby-Prof 和 Stackprof 的用法&lt;/li&gt;
&lt;li&gt;rack-mini-profiler&lt;/li&gt;
&lt;li&gt;Ruby 内存分析&lt;/li&gt;
&lt;li&gt;Ruby 性能测试&lt;/li&gt;
&lt;li&gt;Rails App 性能监控&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前端性能优化&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;前端性能分析&lt;/li&gt;
&lt;li&gt;优化 Head tag&lt;/li&gt;
&lt;li&gt;Turolinks&lt;/li&gt;
&lt;li&gt;Webfont&lt;/li&gt;
&lt;li&gt;CDN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTTP 2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缓存&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;服务器缓存&lt;/li&gt;
&lt;li&gt;前端缓存&lt;/li&gt;
&lt;li&gt;Rails 缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;内存泄露&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;常见的 ActiveRecord 的陷阱&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;优化 Rails 框架&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;优化 SSL 连接&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;重构 Rails App 的 12 种方法&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="组织影响力"&gt;组织影响力&lt;/h3&gt;&lt;h4 id="架构师组织影响力打造篇"&gt;架构师组织影响力打造篇&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;程序员的个人成长之路&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;从小白到专家没你想的那么难&lt;/li&gt;
&lt;li&gt;从工程师到技术总监的修炼心法&lt;/li&gt;
&lt;li&gt;溯源学习法：为什么有些人看起来什么都懂&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;技术人员的性格培养&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如何打造行业影响力&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面试指南&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;* 技术成长之路&lt;/li&gt;
&lt;li&gt;* 如何避免 35 岁困境&lt;/li&gt;
&lt;li&gt;出色的简历&lt;/li&gt;
&lt;li&gt;如何谈薪资&lt;/li&gt;
&lt;li&gt;面试辅导&lt;/li&gt;
&lt;li&gt;* 面试技术指导&lt;/li&gt;
&lt;li&gt;* 如何和 HR 谈薪（薪资并不总是和技术匹配）&lt;/li&gt;
&lt;li&gt;* 一对一模拟面试&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="你可以获得什么"&gt;你可以获得什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;全面夯实 Ruby 基础，特别是元编程基础知识&lt;/li&gt;
&lt;li&gt;掌握如何写出清洁代码&lt;/li&gt;
&lt;li&gt;掌握设计模式&lt;/li&gt;
&lt;li&gt;掌握 Rails 框架底层原理&lt;/li&gt;
&lt;li&gt;可以自己探索 Rails 底层框架原理&lt;/li&gt;
&lt;li&gt;掌握 Rails 应用程序性能调优&lt;/li&gt;
&lt;li&gt;良好的职业规划&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-----------------------------------------------------------------  Istio -----------------------------------------------------------------------&lt;/p&gt;
&lt;h2 id="Istio 管理员认证高级研修班 【40课时】【2999元】"&gt;Istio 管理员认证高级研修班【40 课时】【2999 元】&lt;/h2&gt;&lt;h3 id="服务网格基础"&gt;服务网格基础&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;微服务架构&lt;/li&gt;
&lt;li&gt;服务网格概述&lt;/li&gt;
&lt;li&gt;介绍 Istio&lt;/li&gt;
&lt;li&gt;测验：服务网格和 Istio 概述&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="Istio 架构及原理"&gt;Istio 架构及原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;  Istio 架构及原理&lt;/li&gt;
&lt;li&gt; Istio 服务模型&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Istio 服务组件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; 控制面组件&lt;/li&gt;
&lt;li&gt; 数据面组件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;实验 1：安装 Istio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;测验：安装 Istio&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="流量治理原理与实战"&gt;流量治理原理与实战&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;负载均衡&lt;/li&gt;
&lt;li&gt;服务熔断&lt;/li&gt;
&lt;li&gt;故障注入&lt;/li&gt;
&lt;li&gt;灰度发布&lt;/li&gt;
&lt;li&gt;故障转移&lt;/li&gt;
&lt;li&gt;VitualService（虚拟服务）&lt;/li&gt;
&lt;li&gt;DestinationRule（目标规则）&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;li&gt;ServiceEntry&lt;/li&gt;
&lt;li&gt;WorkloadEntry&lt;/li&gt;
&lt;li&gt;WorkloadGroup&lt;/li&gt;
&lt;li&gt;Sidecar&lt;/li&gt;
&lt;li&gt;EnvoyFilter&lt;/li&gt;
&lt;li&gt;WasmPlugin&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;流量治理实战&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;负载均衡&lt;/li&gt;
&lt;li&gt;地域负载均衡&lt;/li&gt;
&lt;li&gt;会话保持&lt;/li&gt;
&lt;li&gt;限流&lt;/li&gt;
&lt;li&gt;熔断与服务隔离&lt;/li&gt;
&lt;li&gt;流量镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="可观测性和策略控制的原理和实战"&gt;可观测性和策略控制的原理和实战&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可观测性原理&lt;/li&gt;
&lt;li&gt;Istio 指标和调用链采集&lt;/li&gt;
&lt;li&gt;Istio 限流&lt;/li&gt;
&lt;li&gt;元数据交换&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可观测性实战&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;指标配置&lt;/li&gt;
&lt;li&gt;指标采集：Prometheus&lt;/li&gt;
&lt;li&gt;指标管理：Grafana&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;服务网格应用拓扑&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="服务安全原理和实战"&gt;服务安全原理和实战&lt;/h3&gt;&lt;h3 id="服务网格数据面代理 Sidecar"&gt;服务网格数据面代理 Sidecar&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sidecar 透明注入原理&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sidecar 流量拦截原理&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iptables&lt;/li&gt;
&lt;li&gt;Sidecar Redirect&lt;/li&gt;
&lt;li&gt;Sidecar  TProxy&lt;/li&gt;
&lt;li&gt;Ingress 网关模式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="多集群服务治理"&gt;多集群服务治理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Istio 多集群服务治理&lt;/li&gt;
&lt;li&gt;多集群服务网格模型&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我们的优势"&gt;我们的优势&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;首次全面引入 ChatGPT 辅助学习&lt;/li&gt;
&lt;li&gt;企业级线上实验实战环境&lt;/li&gt;
&lt;li&gt;一线资深实战经验&lt;/li&gt;
&lt;li&gt;企业最佳实践&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="你可以获得什么"&gt;你可以获得什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;全面掌握云原生相关知识&lt;/li&gt;
&lt;li&gt;轻松通过 Linux 基金会 Istio 管理员认证&lt;/li&gt;
&lt;li&gt;云原生架构师认证&lt;/li&gt;
&lt;li&gt;云原生时代核心竞争力&lt;/li&gt;
&lt;li&gt;成为第一批&lt;strong&gt;Istio 管理员认证&lt;/strong&gt;的程序员&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="课程报价："&gt;课程报价：&lt;/h2&gt;
&lt;p&gt;套餐一：两门课程原价 3999 + 2999 = 7999 元 早鸟价 5999 元&lt;/p&gt;

&lt;p&gt;套餐二：Build Your Own Ruby on Rails 高级研修班 原价 3999 元 早鸟价 2999 元&lt;/p&gt;

&lt;p&gt;套餐三：Istio 管理员认证高级研修班 原价 2999 元 早鸟价 1999 元&lt;/p&gt;
&lt;h2 id="上课时间："&gt;上课时间：&lt;/h2&gt;
&lt;p&gt;Rails 高级研修班：小鹅通  开课时间：12 月 2 日（星期六）20:00；每周二、周六晚 20:00 - 22:00
Istio 认证 高级研修班：小鹅通  12 月 15 日（星期六）20:00；每周一、周四晚 20:00 - 22:00&lt;/p&gt;
&lt;h3 id="联系方式：wangqsh999@icloud.com 或 V： rocwar"&gt;联系方式：wangqsh999@icloud.com 或 V：rocwar&lt;/h3&gt;
&lt;p&gt;报名链接： &lt;a href="https://jinshuju.net/f/WKyksH" rel="nofollow" target="_blank"&gt;https://jinshuju.net/f/WKyksH&lt;/a&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Fri, 03 Nov 2023 16:44:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/43448</link>
      <guid>https://ruby-china.org/topics/43448</guid>
    </item>
    <item>
      <title>【开发工具】初学者的一个利器 APPMAP 介绍</title>
      <description>&lt;p&gt;最近又有点宠宠欲动，想重新开一个课程，于是就去寻找一些好的教学辅助工具。&lt;/p&gt;

&lt;p&gt;这不，一下就发现了一个非常好的工具： &lt;a href="https://appmap.io/docs/reference/jetbrains.html#start-with-appmap-for-ruby" rel="nofollow" target="_blank" title=""&gt;AppMap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这个工具的使用也非常简单。&lt;/p&gt;

&lt;p&gt;首先在&lt;code&gt;Gemfile&lt;/code&gt; 文件里面添加：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:development&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'appmap'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bundle 安装后，用&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ DISABLE_SPRING=true rails server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动即可。&lt;/p&gt;

&lt;p&gt;启动后界面如下：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/038b1d09-6b96-4bbc-8264-a8953b48b97f.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;和平常相比，多了&lt;code&gt;AppMap&lt;/code&gt; 字样的输出。&lt;/p&gt;

&lt;p&gt;为了展示请求的时序图，我们还需要在 &lt;a href="https://code.visualstudio.com/" rel="nofollow" target="_blank" title=""&gt;Visual Code&lt;/a&gt; 中安装  &lt;a href="https://appmap.io/" rel="nofollow" target="_blank" title=""&gt;AppMap&lt;/a&gt; 扩展。&lt;/p&gt;

&lt;p&gt;安装完后，会记录每一个请求：
&lt;img src="https://l.ruby-china.com/photo/rocLv/29682cbd-f04a-4595-b881-913abe226cee.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;点击上面的每个链接，都可以得到一个时序图、火焰图、依赖图、跟踪图：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/d5375b1f-82f0-4bbc-b173-1b8e19efa495.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/1cc7a891-8977-4fd7-b76a-76b9b79bd95d.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/7d9eff69-a4e1-4f62-9424-c929e23ce1f4.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/224bf7cc-4c31-4e56-8904-0bb31d4f1bf3.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;最牛的地方在于，每个方法都可以点击进去，查看相应的代码。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/ca821624-942d-4717-9ce8-f122a56ca0aa.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;欢迎大家一起来探索~&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Wed, 01 Nov 2023 17:38:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/43436</link>
      <guid>https://ruby-china.org/topics/43436</guid>
    </item>
    <item>
      <title>Rails 7.1【发布】：Dockerfiles、BYO 身份验证、更多异步查询等！</title>
      <description>&lt;p&gt;&lt;a href="https://rubyonrails.org/world" rel="nofollow" target="_blank" title=""&gt;Rails World&lt;/a&gt;刚刚开始，我们将亲自与社区欢聚一堂，庆祝 Rails 20 周年和 Rails 7.1 的发布。&lt;/p&gt;

&lt;p&gt;自 Rails 7.0 以来，此版本已由&lt;a href="https://contributors.rubyonrails.org/releases/7-1-0/contributors" rel="nofollow" target="_blank" title=""&gt;800 多名贡献者&lt;/a&gt;做出了&lt;a href="https://github.com/rails/rails/compare/v7.0.8...7-1-stable" rel="nofollow" target="_blank" title=""&gt;5000 多次提交&lt;/a&gt;，因此它包含了新功能和改进。&lt;a href="https://contributors.rubyonrails.org/releases/7-1-0/contributors" rel="nofollow" target="_blank" title=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="新应用程序的 Dockerfile"&gt;新应用程序的 Dockerfile&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kamal-deploy.org" rel="nofollow" target="_blank" title=""&gt;当您运行 .Rails 时，Rails 现在将生成使用 Kamal&lt;/a&gt;或任何其他基于 Docker 的部署设置部署应用程序所需的所有 Dockerfile &lt;code&gt;rails new&lt;/code&gt;。这些 Dockerfile 经过调整，适合生产使用，具有适当的缓存层、多阶段构建以最小化图像大小，以及无论您是否使用 JavaScript 构建环境所需的所有依赖项。&lt;/p&gt;
&lt;h2 id="构建您自己的身份验证改进"&gt;构建您自己的身份验证改进&lt;/h2&gt;
&lt;p&gt;作为补充&lt;code&gt;has_secure_password&lt;/code&gt;，Rails 7.1 带来了新功能来帮助开发人员构建自己的身份验证系统。&lt;/p&gt;

&lt;p&gt;首先，&lt;a href="https://edgeapi.rubyonrails.org/classes/ActiveRecord/Normalization/ClassMethods.html#method-i-normalizes" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;normalizes&lt;/code&gt;&lt;/a&gt; 声明属性规范化。这对于在将属性保存到数据库之前规范化属性很有用：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User &amp;lt; ApplicationRecord
  normalizes :email, with: -&amp;gt; email { email.strip.downcase }
end

user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email                  # =&amp;gt; "cruise-control@example.com"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其次，&lt;a href="https://edgeapi.rubyonrails.org/classes/ActiveRecord/SecurePassword/ClassMethods.html#method-i-authenticate_by" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;authenticate_by&lt;/code&gt;&lt;/a&gt; 当用户在控制器中进行身份验证时，可以防止常见的定时攻击：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User.authenticate_by(email: "rafael@rubyonrails.org", password: "railsrocks")
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第三，&lt;a href="https://edgeapi.rubyonrails.org/classes/ActiveRecord/TokenFor/ClassMethods.html#method-i-generates_token_for" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;generates_token_for&lt;/code&gt;&lt;/a&gt; 可用于实现密码重置、电子邮件确认以及其他需要一次性令牌的功能：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User &amp;lt; ApplicationRecord
  has_secure_password

  generates_token_for :password_reset, expires_in: 15.minutes do
    # Last 10 characters of password salt, which changes when password is updated:
    password_salt&amp;amp;.last(10)
  end
end

user = User.first

token = user.generate_token_for(:password_reset)
User.find_by_token_for(:password_reset, token) # =&amp;gt; user
# 16 minutes later...
User.find_by_token_for(:password_reset, token) # =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，&lt;a href="https://edgeapi.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;has_secure_password&lt;/code&gt;&lt;/a&gt; 现在可以在更新密码时自动验证当前密码。这对于检查尝试更新密码的用户是否知道当前密码非常有用：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Schema: User(name:string, password_digest:string)
class User &amp;lt; ActiveRecord::Base
  has_secure_password
end

user = User.new(name: "rafael", password: "railsrocks", password_confirmation: "railsrocks")
user.save                                                                      # =&amp;gt; true
user.update(password: "pwn3d", password_challenge: "")                         # =&amp;gt; false, challenge doesn't authenticate
user.update(password: "railsGetsEvenBetter", password_challenge: "railsrocks") # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Active Record 的更多异步查询"&gt;Active Record 的更多异步查询&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/rails/rails/pull/44446" rel="nofollow" target="_blank" title=""&gt;Active Record 中对异步查询的支持&lt;/a&gt;得到了极大的扩展。这使得并行运行多个缓慢的查询变得更容易，尤其是那些专注于计算的查询，同时允许继续处理请求。有用于异步聚合的新方法（例如&lt;code&gt;count&lt;/code&gt;、&lt;code&gt;sum&lt;/code&gt;等）、返回单个记录的方法以及除 之外的任何方法&lt;code&gt;Relation&lt;/code&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;async_count&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_sum&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_minimum&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_maximum&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_average&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_pluck&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_pick&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_ids&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_find_by_sql&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;async_count_by_sql&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="对 Trilogy MySQL 适配器的内置支持"&gt;对 Trilogy MySQL 适配器的内置支持&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.blog/2022-08-25-introducing-trilogy-a-new-database-adapter-for-ruby-on-rails/" rel="nofollow" target="_blank" title=""&gt;Trilogy&lt;/a&gt;是一个用于 Rails 的新 MySQL 数据库适配器，由 GitHub 创建，旨在改进现有 mysql2 选项的性能、灵活性和嵌入简易性。它在 GitHub 和 Shopify 的生产环境中运行，现在作为一个选项在 Rails 中提供开箱即用的支持。从 Rails 的下一个主要版本开始，它可能会成为新的默认值。&lt;/p&gt;
&lt;h2 id="Active Record 中对复合主键的支持"&gt;Active Record 中对复合主键的支持&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://shopify.engineering/how-to-introduce-composite-primary-keys-in-rails" rel="nofollow" target="_blank" title=""&gt;Shopify 通过切换到复合主键，&lt;/a&gt;将针对最大表的常见查询的性能提高了 5-6 倍，并将慢速查询的数量减少了 80% 。代价是插入可能会明显变慢，但对于读取次数多于写入次数的非常大的表来说，这可能是一个巨大的改进。这项工作已被提取为对 Active Record 中复合主键的完全支持。&lt;/p&gt;
&lt;h2 id="将大量作业排队perform_all_later"&gt;将大量作业排队&lt;code&gt;perform_all_later&lt;/code&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://edgeapi.rubyonrails.org/classes/ActiveJob.html#method-c-perform_all_later" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;perform_all_later&lt;/code&gt;添加 Active Job 中的方法&lt;/a&gt;是为了简化同时对大量作业进行排队的过程。这个强大的附加功能使您可以有效地对作业进行排队，而无需触发回调。当您需要一次将一批作业排入队列时，这特别有用，从而减少多次往返队列数据存储的开销。&lt;/p&gt;
&lt;h2 id="介绍config.autoload_lib和config.autoload_lib_once增强自动加载"&gt;介绍&lt;code&gt;config.autoload_lib&lt;/code&gt;和&lt;code&gt;config.autoload_lib_once&lt;/code&gt;增强自动加载&lt;/h2&gt;
&lt;p&gt;引入了一种&lt;a href="https://edgeapi.rubyonrails.org/classes/Rails/Application/Configuration.html#method-i-autoload_lib" rel="nofollow" target="_blank" title=""&gt;新的配置方法。&lt;code&gt;config.autoload_lib(ignore:)&lt;/code&gt;&lt;/a&gt;此方法用于通过包含 &lt;code&gt;lib&lt;/code&gt;目录来增强应用程序的自动加载路径，默认情况下不包含该目录。此外，&lt;code&gt;config.autoload_lib(ignore: %w(assets tasks))&lt;/code&gt; 它是为新应用程序生成的。（此功能不适用于引擎。）&lt;/p&gt;
&lt;h2 id="支持包子"&gt;支持包子&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://bun.sh/" rel="nofollow" target="_blank" title=""&gt;您现在可以使用 Bun&lt;/a&gt;作为 JavaScript 运行时来生成新应用程序。为此，您可以将该&lt;code&gt;--javascript=bun&lt;/code&gt;选项传递给&lt;code&gt;rails new&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="庆祝本次发布并展望下一个版本"&gt;庆祝本次发布并展望下一个版本&lt;/h2&gt;
&lt;p&gt;Rails 7.1 已经发布，但我们已经在考虑下一个版本。我们将在 Rails World 上分享我们的一些想法，并且我们将亲自与社区互动，讨论想法并收集一些反馈。&lt;/p&gt;

&lt;p&gt;我们期待接下来发生的事情，希望您也是如此！&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Mon, 09 Oct 2023 14:30:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/43375</link>
      <guid>https://ruby-china.org/topics/43375</guid>
    </item>
    <item>
      <title>如何创建自己的 Mini MVC 框架（如何无框架写个 Web App）</title>
      <description>&lt;p&gt;我们都知道 Rails、Grape 等等都是 Rack App 框架。&lt;/p&gt;

&lt;p&gt;所谓 Rack App 是指遵循了 Rack 协议的 App，其中最主要的，或者最容易理解的一点就是，他们有共同的入口点：即 &lt;code&gt;config.ru&lt;/code&gt; 文件。&lt;/p&gt;

&lt;p&gt;其中，对于 &lt;code&gt;config.ru&lt;/code&gt; 的规定是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;run&lt;/code&gt; 命令后面加一个可以响应 &lt;code&gt;call&lt;/code&gt; 方法的一个实例&lt;/li&gt;
&lt;li&gt; 这个 &lt;code&gt;call&lt;/code&gt; 方法需要返回一个数组，其中，第一个为 HTTP 状态码，第二个为 Hash 组成的，代表 HTTP 协议中的 Headers，第三个是个字符串数组，数据个数为 1。
示例：&lt;code&gt;[200, { 'Content-Type' =&amp;gt; 'application/json'}, ["I am html body"]]&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;对于 Ruby 来说，具有&lt;code&gt;call&lt;/code&gt; 这个方法的默认的就有 Proc, proc, lambda 等等，当然也可以自己声明。&lt;/p&gt;

&lt;p&gt;依据上面这些基础知识，我们可以实现一个所谓的 Web App：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.ru&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'text/html'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候我们在这个文件所在的目录下运行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rackup &lt;span class="nt"&gt;-p&lt;/span&gt; 300
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们就能在浏览器里面查看了： &lt;a href="http://localhost:3000" rel="nofollow" target="_blank"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;到目前来说，我们算是可以实现一个简单的 Web APP 了。&lt;/p&gt;

&lt;p&gt;那么我们如何实现一个 MVC 分层的 Web App 呢？&lt;/p&gt;

&lt;p&gt;首先，我们可以按照 Rails 框架的思路，做一个分层：
数据库我们用 Sqlite 3，&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/model/user.rb&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
  &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
    &lt;span class="vi"&gt;@email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
    &lt;span class="vi"&gt;@users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SQLite3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="s2"&gt;"toyapp.db"&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'select * from users where 1 = 1 limit 1;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="vi"&gt;@users&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="vi"&gt;@users&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;#method_missing&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;View 层我们用 ERB 来实现：&lt;/p&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;# index.html.erb
&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  name: &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@user.name&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;
  email: &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@user.email&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Controller 层，我们简单的模仿 Rails：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsersController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
    &lt;span class="vi"&gt;@user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@user&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"./index.html.erb"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ERB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 通过 binding 切换作用域&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们通过 Application 可以把这些串起来：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# env 参数是 Rack 默认会传过来的，其中包含了一个请求常见的信息&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'text/html'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;UsersController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们通过 Rack 来运行我们的 App：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.ru&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="no"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，我们可以来试试我们的 Web APP&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rackup &lt;span class="nt"&gt;-p&lt;/span&gt; 3000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/10b52630-a7fb-4354-a3ff-df6e8444d27c.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;源码地址：&lt;a href="https://github.com/rocLv/no-framework-app.git" rel="nofollow" target="_blank" title=""&gt;https://github.com/rocLv/no-framework-app.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;感兴趣的也可以找我来索要视频录像，视频剪辑好以后会发布在这。&lt;/p&gt;

&lt;p&gt;这是我们&lt;a href="https://ruby-china.org/topics/42734" title=""&gt;全栈程序员&lt;/a&gt; 的其中一节课，目前还有 4 个名额开放，有兴趣的可以赶快来报名吧。&lt;/p&gt;

&lt;p&gt;我们希望这次训练营结束以后，可以覆盖平常常见的开发场景。&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Wed, 30 Nov 2022 10:41:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/42771</link>
      <guid>https://ruby-china.org/topics/42771</guid>
    </item>
    <item>
      <title>【TGeek.cn】正式上线以及《招收》首批【初级全栈程序员】和首期【Ruby on Rails 中高级程序员训练营】</title>
      <description>&lt;p&gt;自从上次&lt;a href="https://ruby-china.org/topics/42509" title=""&gt;发帖&lt;/a&gt;招生以来，不觉过去 4 个月整。&lt;/p&gt;

&lt;p&gt;很开心，经过艰难的调试，&lt;a href="https://tgeek.cn" rel="nofollow" target="_blank" title=""&gt;tgeek.cn&lt;/a&gt; 终于正式上线了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BiliBili&lt;/strong&gt;&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1c24y127Tb" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;/&lt;/p&gt;

&lt;p&gt;这里把网站的技术栈简单和大家分享一下：&lt;/p&gt;

&lt;p&gt;整个网站基于 Spring Cloud Alibaba + Ruby on Rails 7 构建，官网前端采用的是基于 React 的框架，实验室前端采用的是 Vue。&lt;/p&gt;

&lt;p&gt;注册中心采用的是 Nacos，负载均衡采用的是 Ribbon，限流采用的是 Sentinel。&lt;/p&gt;

&lt;p&gt;后端分为会员认证，课程学习，实验室 API，websocket。&lt;/p&gt;

&lt;p&gt;其中会员认证部分采用的是 Ruby on Rails 7，课程信息等也是基于 Rails 7，部分后台采用的是 Spring Boot。&lt;/p&gt;

&lt;p&gt;微服务开发既带来了便利，也带来了一些不便。&lt;/p&gt;

&lt;p&gt;便利主要展现在重复功能开发明显减少，比如说用户认证，短信服务，支付服务等等，直接调用之前的微服务即可，如果不是采用微服务，多个应用必然带来很多重复开发工作。&lt;/p&gt;

&lt;p&gt;微服务开发带来的不便在于调试路径变长，这时候对于开发人员排错的能力要求更高一些，有时候排错的时间确实也长了不少。&lt;/p&gt;
&lt;h2 id="关于 TGeek.cn"&gt;关于 TGeek.cn&lt;/h2&gt;
&lt;p&gt;最早是想复制 &lt;a href="https://www.katacoda.com/" rel="nofollow" target="_blank" title=""&gt;katacoda/&lt;/a&gt;, 之前在这个网站学习了 Docker，Kubernetes，Istio，Envoy 等等，没想到被 Oreily 收购了以后，最近竟然下线了。&lt;/p&gt;

&lt;p&gt;我希望 [TGeek.cn] 将来能变成一个程序员自主学习的园地。目前的话，准备以 Ruby 社区为起点，大家可以在这个平台来自主学习 Ruby 或 Rails。&lt;/p&gt;

&lt;p&gt;目前还没有视频，后期会逐步增加视频。&lt;/p&gt;
&lt;h2 id="关于盈利模式"&gt;关于盈利模式&lt;/h2&gt;
&lt;p&gt;目前的想法是静态内容，甚至包括视频录像不收费，只是如果要使用实验环境时需要收费。&lt;/p&gt;

&lt;p&gt;或者说会员可以使用实验环境。&lt;/p&gt;

&lt;p&gt;其实还是增值服务的事情。&lt;/p&gt;

&lt;p&gt;目前准备收费模式向腾讯会员这些平台看齐，也就是每月 30 元左右。&lt;/p&gt;
&lt;h2 id="路线图"&gt;路线图&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自产内容&lt;/li&gt;
&lt;li&gt;平台化，支持教育 KOL 入驻&lt;/li&gt;
&lt;li&gt;增加互动社区&lt;/li&gt;
&lt;li&gt;付费咨询&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;大家有什么好的建议，也可以提供，采纳后送课程。&lt;/p&gt;

&lt;p&gt;---------------------------------------------------- 分割线  ---------------------------------------------------&lt;/p&gt;

&lt;p&gt;自从上次&lt;a href="https://ruby-china.org/topics/42509" title=""&gt;发帖&lt;/a&gt;招生以来，不觉过去 4 个月整。&lt;/p&gt;

&lt;p&gt;期间有不少同学，踊跃报名，踊跃咨询。&lt;/p&gt;

&lt;p&gt;根据咨询的情况，有一大部分是 Ruby 初学者，部分比较资深的，为此本次我尝试分成两个阶段来上课。&lt;/p&gt;
&lt;h2 id="初级全栈Ruby程序员训练营课程【原价3699元，双11价2699元】"&gt;初级全栈 Ruby 程序员训练营课程【&lt;del&gt;原价 3699 元&lt;/del&gt;，双 11 价 2699 元】&lt;/h2&gt;&lt;h4 id="上课方式：每周两次直播【4课时】 + tgeek.cn 课后练习"&gt;上课方式：每周两次直播【4 课时】 + tgeek.cn 课后练习&lt;/h4&gt;&lt;h4 id="课程礼包：初级全栈Ruby程序员训练营课程套票一张 + 价值360元的tgeek.cn 会员一年 + 课后答疑 + 就职内推"&gt;课程礼包：初级全栈 Ruby 程序员训练营课程套票一张 + 价值 360 元的 tgeek.cn 会员一年 + 课后答疑 + 就职内推&lt;/h4&gt;&lt;h4 id="开课时间：11月18日 晚8点"&gt;开课时间：11 月 18 日 晚 8 点&lt;/h4&gt;
&lt;p&gt;对课程感兴趣的，可以随时和我联系哦。&lt;/p&gt;

&lt;p&gt;对成长迷茫的，也可以加我交流一下 v：rocwar&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/9b6b6a77-de6e-4072-8c1e-63b9acf5633d.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;------------------------------------------------------------- 分割线  -------------------------------------------------------------&lt;/p&gt;
&lt;h2 id="第一期Ruby中高级程序员训练营【原价3699元，双11价1999元】"&gt;第一期 Ruby 中高级程序员训练营【&lt;del&gt;原价 3699 元&lt;/del&gt;，双 11 价 1999 元】&lt;/h2&gt;
&lt;p&gt;两个部分的课时数为 &lt;strong&gt;80&lt;/strong&gt; 个课时，和之前的课相比就是课时数几乎增加了一倍，其中理论部分为&lt;strong&gt;40&lt;/strong&gt; 个课时，增加了实操 &lt;strong&gt;40&lt;/strong&gt; 个课时，希望有恒心，有毅力的同学加入。&lt;/p&gt;

&lt;p&gt;我们为学员提供了一个在线的免费学习平台，一年不限时使用。&lt;/p&gt;

&lt;p&gt;学的好的，有机会免费申请《Ruby 百万架构师培训》。&lt;/p&gt;

&lt;p&gt;我们用增加了一倍的课时数来与大家一期陪跑，争取课程结束的时候，能达到可以应用、转化的级别。&lt;/p&gt;
&lt;h2 id="Rails 中高级程序员培训大纲"&gt;Rails 中高级程序员培训大纲&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/1a371dd5-7097-4145-ac3e-288dbd7cf534.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="费用"&gt;费用&lt;/h2&gt;&lt;h3 id="1. 原价 3999元， 早鸟票1999元"&gt;1. 原价 3999 元，早鸟票 1999 元&lt;/h3&gt;&lt;h4 id="上课方式：每周两次直播【4课时】 + tgeek.cn 课后练习"&gt;上课方式：每周两次直播【4 课时】 + tgeek.cn 课后练习&lt;/h4&gt;&lt;h4 id="课程礼包：Ruby 中高级程序员训练营课程套票一张 + 价值360元的tgeek.cn 会员一年 + 课后答疑 + 就职内推"&gt;课程礼包：Ruby 中高级程序员训练营课程套票一张 + 价值 360 元的 tgeek.cn 会员一年 + 课后答疑 + 就职内推&lt;/h4&gt;&lt;h4 id="开课时间：11月19日 晚8点"&gt;开课时间：11 月 19 日 晚 8 点&lt;/h4&gt;
&lt;p&gt;报名链接： &lt;a href="https://jinshuju.net/f/tAW5uw" rel="nofollow" target="_blank" title=""&gt;https://jinshuju.net/f/tAW5uw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;之前报名的同学，我会陆续和大家取得联系，大家也可以主动和我联系哦。 &lt;/p&gt;

&lt;p&gt;对课程感兴趣的，可以随时和我联系哦。&lt;/p&gt;
&lt;h2 id="套票  选两门课程，更可再优惠 1000元，只需要 3699 元！"&gt;套票  选两门课程，更可再优惠 1000 元，只需要 3699 元！&lt;/h2&gt;
&lt;p&gt;对成长迷茫的，也可以加我交流一下  v：rocwar&lt;/p&gt;

&lt;p&gt;之前的&lt;a href="https://space.bilibili.com/95262426/" rel="nofollow" target="_blank" title=""&gt;公开课&lt;/a&gt;：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/f67e6cdf-a91b-4a78-91dd-3cbc3413a1f3.png!large" width="500px" alt=""&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Thu, 10 Nov 2022 16:19:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/42734</link>
      <guid>https://ruby-china.org/topics/42734</guid>
    </item>
    <item>
      <title>阿里云的 Ruby Gem 源又可用了</title>
      <description>&lt;h3 id="简介"&gt;简介&lt;/h3&gt;
&lt;p&gt;Rubygems 仓库镜像&lt;/p&gt;

&lt;p&gt;下载地址： &lt;a href="https://mirrors.aliyun.com/rubygems/" rel="nofollow" target="_blank" title=""&gt;https://mirrors.aliyun.com/rubygems/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="配置方法"&gt;配置方法&lt;/h3&gt;
&lt;p&gt;查找默认源&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem sources

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;移除默认源&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
gem sources --remove https://rubygems.org/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加新源&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem sources -a https://mirrors.aliyun.com/rubygems/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;相关链接
官方主页：&lt;a href="https://rubygems.org/" rel="nofollow" target="_blank"&gt;https://rubygems.org/&lt;/a&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Sat, 29 Oct 2022 10:31:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/42713</link>
      <guid>https://ruby-china.org/topics/42713</guid>
    </item>
    <item>
      <title>第一期 Ruby on Rails 中高级程序员训练营招生啦</title>
      <description>&lt;p&gt;今年，我几乎下定决心独自创业。&lt;/p&gt;

&lt;p&gt;之所以说『几乎』是因为，从年初到如今，无不在时刻动摇当中。&lt;/p&gt;

&lt;p&gt;希望本无所谓有，希望本无所谓无。正是这些可有可无的希望，支撑我创业的梦想。&lt;/p&gt;

&lt;p&gt;『企业级 Ruby 架构师培训』已经两期了，第二期还在继续当中。&lt;/p&gt;

&lt;p&gt;第一期高估了部分学员的学习能力，几乎每节课都是干货，但是学员能学习利用的比较少。&lt;/p&gt;

&lt;p&gt;第二期我特意放慢了速度，增加了在课堂上的互动，也感谢积极配合的&lt;a href="/Shin" class="user-mention" title="@Shin"&gt;&lt;i&gt;@&lt;/i&gt;Shin&lt;/a&gt;等等，目前为止我感觉效果不错。&lt;/p&gt;

&lt;p&gt;首先，中国有句古话，授人以鱼不如授人以渔。我这次强调了学习的方法，然后再通过学习的方法引领大家去学习内容。&lt;/p&gt;

&lt;p&gt;前段时间，我们一起重建了一个 mini 版的 Rails（以 Rebuilding Rails 这本书为教程基础），然后通读了 &lt;code&gt;Ruby on Rails&lt;/code&gt; 中 ActiveRecord、ActiveModel、ActionPack、ActionView 的源码，也教会 了大家如何去查看、调试源码。&lt;/p&gt;

&lt;p&gt;因为有了上一期的经验，所以这期我自身对 &lt;code&gt;rails&lt;/code&gt; 理解也更深了一些，我更加能够从一个总体的高度去看 &lt;code&gt;Ruby on Rails&lt;/code&gt; 的整体架构设计，所以发现&lt;code&gt;Rebuilding Rails&lt;/code&gt; 真的是遵循了 Rails 的模式，去编写的一个 mini 框架。&lt;/p&gt;

&lt;p&gt;这次，我们放慢了速度，感受到大家的进步，与此同时，我也担心后续微服务相关的课程，是否大家能够在没有入门的情况下能消化吸收？&lt;/p&gt;

&lt;p&gt;这期我准备把课程分为两个部分，一个部分是《中高级 Rails 程序员培训》，一个部分是《Ruby 百万架构师培训》。&lt;/p&gt;

&lt;p&gt;两个部分的课时数为 &lt;strong&gt;80&lt;/strong&gt; 个课时，和之前的课相比就是课时数几乎增加了一倍，其中理论部分为&lt;strong&gt;40&lt;/strong&gt; 个课时，增加了实操 &lt;strong&gt;40&lt;/strong&gt; 个课时，希望有恒心，有毅力的同学加入。&lt;/p&gt;

&lt;p&gt;我们为学员提供了一个在线的免费学习平台，一年不限时使用。&lt;/p&gt;

&lt;p&gt;学的好的，有机会免费申请《Ruby 百万架构师培训》。&lt;/p&gt;

&lt;p&gt;我们用增加了一倍的课时数来与大家一期陪跑，争取课程结束的时候，能达到可以应用、转化的级别。&lt;/p&gt;
&lt;h2 id="Rails 中高级程序员培训大纲"&gt;Rails 中高级程序员培训大纲&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/1a371dd5-7097-4145-ac3e-288dbd7cf534.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="费用"&gt;费用&lt;/h2&gt;&lt;h3 id="1. 原价 3999元， 早鸟票1999元（早鸟票截止日期：7月31日）"&gt;1. 原价 3999 元，早鸟票 1999 元（早鸟票截止日期：7 月 31 日）&lt;/h3&gt;
&lt;p&gt;报名链接： &lt;a href="https://jinshuju.net/f/tAW5uw" rel="nofollow" target="_blank" title=""&gt;https://jinshuju.net/f/tAW5uw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;对课程感兴趣的，可以随时和我联系哦。&lt;/p&gt;

&lt;p&gt;对成长迷茫的，也可以加我交流一下  v：rocwar&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Mon, 11 Jul 2022 13:21:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/42509</link>
      <guid>https://ruby-china.org/topics/42509</guid>
    </item>
    <item>
      <title>一些奇怪的 Ruby 行为</title>
      <description>&lt;p&gt;最近因为给大家分享一些 Ruby 基础的内容，也有一些 Ruby 元编程的东西。然后发现了一些比较“奇怪”的 ruby 行为。&lt;/p&gt;

&lt;p&gt;比如说下面这个：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_one&lt;/span&gt;
       &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_two&lt;/span&gt;
       &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果我们直接调用：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;method_two&lt;/span&gt; 

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;则会报错： &lt;code&gt;undefined method&lt;/code&gt;method_two' for #&lt;a rel="nofollow" target="_blank"&gt;Foo:0x00007fbe4ac1f5d8&lt;/a&gt; (NoMethodError)`&lt;/p&gt;

&lt;p&gt;此时我们执行：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会返回：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:method_one&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是我们一旦执行一下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;method_one&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时我们再执行&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么返回的就是：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[:method_one,  :method_two]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虽然行为有点怪异，不过如果按照 Ruby 设计的理念，其实也很好解释：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;def&lt;/code&gt; 是用来定义一个实例方法，&lt;code&gt;def method_one&lt;/code&gt; 这里在定义的时候并没有执行，&lt;code&gt;method_one&lt;/code&gt; 必须要有一个实例调用后才会执行，
所以此时并没有&lt;code&gt;method_two&lt;/code&gt;这个方法。&lt;/p&gt;

&lt;p&gt;对于类方法来说也一样。&lt;/p&gt;

&lt;p&gt;是不是挺有趣的？大家有没有其他的类似的一起分享一下？&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Thu, 19 May 2022 11:10:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/42407</link>
      <guid>https://ruby-china.org/topics/42407</guid>
    </item>
    <item>
      <title>【视频地址更新】如何在 Kubernetes 集群上从零部署 Rails APP？</title>
      <description>&lt;h2 id="今晚分享主题："&gt;今晚分享主题：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt; Kubernetes 快速入门&lt;/li&gt;
&lt;li&gt;Kubernetes 组件介绍&lt;/li&gt;
&lt;li&gt;如何在 Kubernetes 集群上从零部署 Rails App？ （实操）&lt;/li&gt;
&lt;li&gt;如何手动扩容（实操）&lt;/li&gt;
&lt;li&gt;如何自动扩容（实操）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;为什么要学习云原生（Kubernetes）？因为这是未来。&lt;/p&gt;

&lt;p&gt;为什么要学习云原生（Kubernetes）？因为工资高啊。&lt;/p&gt;

&lt;p&gt;为什么要学习云原生（Kubernetes）？因为太 TM 方便了。&lt;/p&gt;

&lt;p&gt;------- 我是内容分割线 -------&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BiliBili&lt;/strong&gt;
&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1uv411B7MK" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Sun, 24 Apr 2022 09:22:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/42337</link>
      <guid>https://ruby-china.org/topics/42337</guid>
    </item>
    <item>
      <title>[今夜不翻车系列三 20:00] Ruby 微服务架构设计以及百万并发 App 架构演进</title>
      <description>&lt;p&gt;今天分享的内容：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;从单体到微服务需要解决那些问题？&lt;/li&gt;
&lt;li&gt;CAP 和 BASE 理论模型&lt;/li&gt;
&lt;li&gt;百万并发架构演进案例&lt;/li&gt;
&lt;li&gt;百万并发网络架构演进&lt;/li&gt;
&lt;li&gt;Ruby 企业级架构师课程介绍&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;会议地址：&lt;a href="https://meeting.tencent.com/dw/tZZvruhcNYq1" rel="nofollow" target="_blank"&gt;https://meeting.tencent.com/dw/tZZvruhcNYq1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;强生 邀请您参加腾讯会议网络研讨会 (Webinar)
会议主题：Ruby 微服务架构设计以及百万并发 App 架构演进
会议时间：2022/04/22 20:00-21:30 (GMT+08:00) 中国标准时间 - 北京&lt;/p&gt;

&lt;p&gt;点击专属链接入会，或添加至会议列表：
&lt;a href="https://meeting.tencent.com/dw/tZZvruhcNYq1" rel="nofollow" target="_blank"&gt;https://meeting.tencent.com/dw/tZZvruhcNYq1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#腾讯会议：964-344-747&lt;/p&gt;

&lt;p&gt;会议时间：今晚（04/22）20:00-21:30&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Fri, 22 Apr 2022 11:20:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/42334</link>
      <guid>https://ruby-china.org/topics/42334</guid>
    </item>
    <item>
      <title>【今晚不翻车 20 点不见不散】如何不用框架用 Ruby 写 Web APP？</title>
      <description>&lt;p&gt;前天做了一次分享，展示的很好，结果半路翻了一下车。。。&lt;/p&gt;

&lt;p&gt;分享结束后，我又运行了一下代码，没毛病。。。好吧，暂且归为环境的问题&lt;/p&gt;

&lt;p&gt;今晚 20 点准备给大家做第二次分享，《Ruby on Rails 源码框架导读》&lt;/p&gt;

&lt;p&gt;我们首先不用任何框架，直接用 &lt;code&gt;Rack&lt;/code&gt; 、&lt;code&gt;erubi&lt;/code&gt;、&lt;code&gt;sqlite3&lt;/code&gt; 构建一个 Web app。&lt;/p&gt;

&lt;p&gt;本着不作不死的精神，今晚我又准备现场撸代码了&lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;代码先贴在这里：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.ru&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"erubi"&lt;/span&gt;
&lt;span class="vg"&gt;$LOAD_PATH&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Simp&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Content-Type"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"REQUEST_PATH"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="no"&gt;Erubi&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.html.erb"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;src&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render_400&lt;/span&gt;
      &lt;span class="s2"&gt;"Oops, the page you visited is not exist."&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;root_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/Users/i/Code/iClean/P7RubyTraining/webapp'&lt;/span&gt;
      &lt;span class="n"&gt;file_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;file_name&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exist?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.html.erb"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="n"&gt;file_name&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;render_400&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="no"&gt;Simp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Application&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;index 页面代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# index.html.erb&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;%&lt;/span&gt;
&lt;span class="vg"&gt;$LOAD_PATH&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'model'&lt;/span&gt;
&lt;span class="vi"&gt;@students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="vi"&gt;@students&lt;/span&gt;
&lt;span class="sx"&gt;%&amp;gt;
&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;Simp&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/td&amp;gt;
        &amp;lt;td&amp;gt;Email&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;Grade&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/td&amp;gt;
        &amp;lt;td&amp;gt;Blog&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/tr&amp;gt;

    &amp;lt;% @students.each do |student| %&amp;gt;
      &amp;lt;tr&amp;gt;
       &amp;lt;td&amp;gt;&amp;lt;%= student['name'] %&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= student['email'] %&amp;gt;&amp;lt;/td&amp;gt;
       &amp;lt;td&amp;gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'grade'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/td&amp;gt;
       &amp;lt;td&amp;gt;&amp;lt;%= student['blog'] %&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/tr&amp;gt;
    &amp;lt;% end %&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/body&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# model.rb&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sqlite3'&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt;
  &lt;span class="c1"&gt;# Open a database&lt;/span&gt;
  &lt;span class="no"&gt;DB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SQLite3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="s2"&gt;"test.db"&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
    &lt;span class="vi"&gt;@students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;"select * from students"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
      &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'grade'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'blog'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;
      &lt;span class="vi"&gt;@students&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="vi"&gt;@students&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在运行前记得先生成数据库：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"sqlite3"&lt;/span&gt;

&lt;span class="c1"&gt;# Open a database&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SQLite3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="s2"&gt;"test.db"&lt;/span&gt;

&lt;span class="c1"&gt;# Create a table&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;SQL&lt;/span&gt;&lt;span class="sh"&gt;
  create table numbers (
    name varchar(30),
    val int
  );
&lt;/span&gt;&lt;span class="no"&gt;SQL&lt;/span&gt;

&lt;span class="c1"&gt;# Execute a few inserts&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"one"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"two"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"insert into numbers values ( ?, ? )"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Find a few rows&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;"select * from numbers"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Create another table with multiple columns&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;SQL&lt;/span&gt;&lt;span class="sh"&gt;
  create table students (
    name varchar(50),
    email varchar(50),
    grade varchar(5),
    blog varchar(50)
  );
&lt;/span&gt;&lt;span class="no"&gt;SQL&lt;/span&gt;

&lt;span class="c1"&gt;# Execute inserts with parameter markers&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"INSERT INTO students (name, email, grade, blog) 
            VALUES (?, ?, ?, ?)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Jane"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"me@janedoe.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"http://blog.janedoe.com"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;"select * from students"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在根目录下面运行：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rackup&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个不需要框架的 Web app 就搭建完成啦。&lt;/p&gt;

&lt;p&gt;这样直接写过 Web app 的估计年龄都差不多 38+ 了吧，我大概猜。&lt;/p&gt;

&lt;p&gt;接下来我们会分享一下什么是 MVC。&lt;/p&gt;

&lt;p&gt;只有懂得了这个，真正理解它们的分工才能够举一反三的做好大型软件项目的目录结构设计。&lt;/p&gt;

&lt;p&gt;最后，进入正题，我们来分享一下 Rails 框架的组成，以及它们是怎么组合在一起的。&lt;/p&gt;

&lt;p&gt;另外，我们也会简单介绍一下怎么读源码，让不听课的同学也能自己探索。&lt;/p&gt;

&lt;p&gt;感兴趣的朋友可以点击以下链接参会哦：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://meeting.tencent.com/dw/511p6O1AKTdx" rel="nofollow" target="_blank" title=""&gt;今晚（星期三）20 点 腾讯会议&lt;/a&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Wed, 20 Apr 2022 13:29:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/42327</link>
      <guid>https://ruby-china.org/topics/42327</guid>
    </item>
    <item>
      <title>《第二期 Ruby 企业级架构师培训》招生说明会以及系列讲座【4.18 4.20 4.22 4.23 4.25 每晚八点不见不散】</title>
      <description>&lt;p&gt;&lt;a href="https://ruby-china.org/topics/42309" title=""&gt;《第二期 Ruby 企业级架构师培训》招生啦&lt;/a&gt; 发表之后有挺多来咨询的，也有几个直接报名的，不甚感激~&lt;/p&gt;

&lt;p&gt;为了更好的让大家理解课程的设计，以及让大家感受一下讲师的讲解的难易程度，自己掌握的程度，特意增加 &lt;strong&gt;五次公开课&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;不想报名的，如果觉得对课题感兴趣，也可以来听听。权当线上的 Hotwire。&lt;/p&gt;
&lt;h2 id="会议日程"&gt;会议日程&lt;/h2&gt;&lt;h3 id="4.18（星期一） 20：00    《Ruby元编程快闪》"&gt;4.18（星期一）20:00《Ruby 元编程快闪》&lt;/h3&gt;
&lt;p&gt;通过两个小时的时间，我们快速介绍或回顾 Ruby 元编程中的内容。&lt;/p&gt;

&lt;p&gt;本课的目标在于为大家介绍 Ruby 元编程的相关内容，理解所谓的&lt;code&gt;反射&lt;/code&gt;等这些令人费解的词语。&lt;/p&gt;

&lt;p&gt;另外，我们会介绍 Ruby 元编程在 Rails 中的广泛应用，以及各种语言的 MVC 框架的实现目标和手段。&lt;/p&gt;
&lt;h3 id="4.20（星期三） 20：00   《Ruby on Rails框架源码概览》"&gt;4.20（星期三）20:00《Ruby on Rails 框架源码概览》&lt;/h3&gt;
&lt;p&gt;通过两个小时的讲解，希望大家能对 &lt;code&gt;Ruby on Rails&lt;/code&gt; 框架的整体设计有个了解，&lt;/p&gt;

&lt;p&gt;我们也会重点关注&lt;code&gt;Rails&lt;/code&gt; 框架的设计思想，文件的结构等。&lt;/p&gt;

&lt;p&gt;通过两个小时的学习，你将具备自己学习和理解  &lt;code&gt;Rails&lt;/code&gt; 源码的初步能力。&lt;/p&gt;
&lt;h3 id="4.22 (星期五) 20：00   《Ruby微服务架构设计》"&gt;4.22 (星期五) 20:00《Ruby 微服务架构设计》&lt;/h3&gt;
&lt;p&gt;通过两个小时的学习，你将学习到单体架构和微服务架构的优缺点以及如何依托现有的开源产品去构建 Ruby 微服务架构。&lt;/p&gt;

&lt;p&gt;当然，你也会学习到微服务架构中包含的模块，以及它们之间是如何协作的。&lt;/p&gt;

&lt;p&gt;通过这次学习，你可以自己搭建属于你的微服务架构。&lt;/p&gt;
&lt;h3 id="4.23 （星期六） 20：00   《基于Kubernetes实现Ruby on Rails App的部署和动态扩缩容》"&gt;4.23（星期六）20:00《基于 Kubernetes 实现 Ruby on Rails App 的部署和动态扩缩容》&lt;/h3&gt;
&lt;p&gt;各地的核酸码纷纷挂掉，如何才能保证你的核酸码不会挂？&lt;/p&gt;

&lt;p&gt;通过这次学习，你可以基本了解 Kubernetes 的操作，了解的 Kubernetes 可以做到的，以及无法做到的。&lt;/p&gt;

&lt;p&gt;当然，如果时间允许，我们也会简单的提及 Service Mesh 架构。&lt;/p&gt;
&lt;h3 id="4.24 （星期日）20：00   《大型Rails App工程架构和编码规范》"&gt;4.24（星期日）20:00《大型 Rails App 工程架构和编码规范》&lt;/h3&gt;
&lt;p&gt;如何有效的开发，是所有架构一直在解决的问题。这种架构包含组织架构和软件代码架构。如何高效的管理组织，如何高效的组织软件代码架构，本次分享试图根据我的实践，为大家提供一个参考。&lt;/p&gt;
&lt;h3 id="会议地址 1 (1、 2、 3、5 次分享的链接)："&gt;会议地址 1 (1、2、3、5 次分享的链接)：&lt;/h3&gt;
&lt;p&gt;会议时间：2022/04/18 20:00-22:00 北京&lt;/p&gt;

&lt;p&gt;重复周期：2022/04/18-2022/04/24 20:00-22:00, 每 2 天&lt;/p&gt;

&lt;p&gt;&lt;a href="https://meeting.tencent.com/dw/511p6O1AKTdx" rel="nofollow" target="_blank" title=""&gt;点击链接入会，或添加至会议列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#腾讯会议：358-9095-7072&lt;/p&gt;
&lt;h3 id="会议地址 2："&gt;会议地址 2：&lt;/h3&gt;
&lt;p&gt;会议主题：基于 Kubernetes 实现 Rails App 的动态扩缩容
会议时间：2022/04/23 20:00-22:00 北京&lt;/p&gt;

&lt;p&gt;&lt;a href="https://meeting.tencent.com/dm/j3rPtm2Ix3pQ" rel="nofollow" target="_blank" title=""&gt;点击链接入会，或添加至会议列表：&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#腾讯会议：696-188-363&lt;/p&gt;

&lt;p&gt;不管我们怎么怀念，单体时代已经过去了。&lt;/p&gt;

&lt;p&gt;惟希望通过一点微薄之力，推动 Ruby 社区微服务或 Service Mesh 架构下的发展。&lt;/p&gt;

&lt;p&gt;我个人认为，云原生将会是未来。&lt;/p&gt;

&lt;p&gt;微服务之于架构，类似于虚拟机之于基础设施；&lt;/p&gt;

&lt;p&gt;Service Mesh 或云原生架构之于架构，类似于容器之于基础设施，这也是大厂抢先转向云原生方向的动机。&lt;/p&gt;

&lt;p&gt;Service Mesh 相比于微服务架构，耦合性更低，更有利于团队协作。&lt;/p&gt;

&lt;p&gt;基于 Service Mesh 架构，对异构的语言、框架都会有更高的容忍度和兼容度。&lt;/p&gt;

&lt;p&gt;加入这场架构变革，有利于 Ruby 社区的发展~&lt;/p&gt;

&lt;p&gt;（个人浅见，权当抛砖引玉）&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Mon, 18 Apr 2022 10:00:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/42315</link>
      <guid>https://ruby-china.org/topics/42315</guid>
    </item>
    <item>
      <title>《第二期 Ruby 企业级架构师培训》招生啦</title>
      <description>&lt;p&gt;之前的一期可以看这里 &lt;a href="https://ruby-china.org/topics/41519" title=""&gt;Ruby 企业级架构师培训（实验班）暨 Rails on Cloud 开源 Contributer 招募&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;第一期结业感受可以看这里：&lt;a href="https://ruby-china.org/topics/42152" title=""&gt;首期 Ruby 架构师培训结业以及我的一些感受&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="课程设计理念"&gt;课程设计理念&lt;/h2&gt;&lt;h3 id="夯实基础"&gt;夯实基础&lt;/h3&gt;
&lt;p&gt;基础决定了能走多高，所以我们先要夯实基础。
   基础部分，不仅帮大家快速回顾 Ruby 语法，而且重点讲解元编程相关内容，以及着重让大家理解真正的面向对象编程。&lt;/p&gt;
&lt;h3 id="与其学架构，不如学模式"&gt;与其学架构，不如学模式&lt;/h3&gt;
&lt;p&gt;如果说我看了很多技术博客，非要从其中选择一篇对我影响最深的博客的话，我觉得这篇《与其学架构，不如学模式》对我影响是最深的。&lt;/p&gt;

&lt;p&gt;无论是前端和后端，都有很多层出不穷的框架，但是设计模式就那么多，而且常用的更少。&lt;/p&gt;

&lt;p&gt;所以我们会结合实际，讲透设计模式。&lt;/p&gt;

&lt;p&gt;我们不仅去讲，而且会去 Rails 框架中寻找使用了这些设计模式的地方，给大家把原理讲清澈。&lt;/p&gt;
&lt;h3 id="手动写一个Ruby on Rails 以及Rails源码导读"&gt;手动写一个 Ruby on Rails 以及 Rails 源码导读&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/8f472fd1-c828-4fee-b31c-a27afa3e90af.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这正是我们手动构建一个 Ruby on Rails 框架的理由。&lt;/p&gt;
&lt;h3 id="Rails性能优化"&gt;Rails 性能优化&lt;/h3&gt;
&lt;p&gt;通过本篇章，我们深入理解服务器运维，HTTP 1.1, HTTP 2 等，深入理解缓存，深入理解网络。因为这些是我们性能优化的基础。&lt;/p&gt;
&lt;h3 id="云原生"&gt;云原生&lt;/h3&gt;
&lt;p&gt;这是上期没有的，这期决定增加一下。&lt;/p&gt;

&lt;p&gt;我个人觉得微服务将会走向末路，云原生才是未来。&lt;/p&gt;

&lt;p&gt;我们从服务器运维的角度可以看看，从实体机到虚拟机，从虚拟机到容器，这个趋势就是越来越轻。&lt;/p&gt;

&lt;p&gt;那么从架构的选择来说，微服务与 Service Mesh 来说，Service Mesh 自由度更高，耦合度更低，所以我觉得云原生将是一个大的趋势。&lt;/p&gt;

&lt;p&gt;现在大厂已经基本都把架构从微服务架构转移至云原生了。&lt;/p&gt;
&lt;h3 id="微服务基础"&gt;微服务基础&lt;/h3&gt;
&lt;p&gt;无论是微服务还是 Service Mesh 都是因为单体无法解决高并发、高可用、高性能这些问题而引发的拆解。&lt;/p&gt;

&lt;p&gt;微服务也好，Service Mesh 也好，基础要解决的问题没有变，解决问题的手段变了而已。&lt;/p&gt;

&lt;p&gt;学好微服务基础，有利于我们做好架构，做好应用开发。&lt;/p&gt;
&lt;h2 id="课程思维导图"&gt;课程思维导图&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/f0079b5e-05de-4d0a-b77e-3e26e8b3de8b.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="上期学员评价"&gt;上期学员评价&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/a90b1b69-06b6-416d-9977-97ef6eb5733a.png" width="300px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/af428572-40ae-48ef-b5b8-a0ad5a3d609f.png" width="300px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/fbb7096b-7914-404a-be4b-b5c48bab4d72.png" width="300px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/b8ea5f8c-cd62-4244-9522-e19d8a0a92bc.png" width="300px" alt=""&gt;&lt;/p&gt;
&lt;h2 id="课程费用"&gt;课程费用&lt;/h2&gt;
&lt;p&gt;本期课程因为相对更加成熟，再加上增加了一部分新内容，因此定价为 4999 元。&lt;/p&gt;
&lt;h3 id="前10名享受早鸟价： 4199元"&gt;前 10 名享受早鸟价：4199 元&lt;/h3&gt;&lt;h2 id="本期课程开课时间"&gt;本期课程开课时间&lt;/h2&gt;
&lt;p&gt;开课时间为 5 月 6 日晚 20 点。&lt;/p&gt;

&lt;p&gt;上课时间暂定为每周二晚 8 点 -10 点
                   和每周五晚 8 点 -10 点&lt;/p&gt;

&lt;p&gt;每晚两个课时，每个课时不低于 45 分钟。&lt;/p&gt;
&lt;h2 id="退款"&gt;退款&lt;/h2&gt;
&lt;p&gt;课程开课前三节课 100% 原路返还，从第四节课开始按照总课程 80 课时，减去所听课时，退回剩余的。&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Fri, 15 Apr 2022 13:53:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/42309</link>
      <guid>https://ruby-china.org/topics/42309</guid>
    </item>
    <item>
      <title>首期 Ruby 架构师培训结业以及我的一些感受</title>
      <description>&lt;p&gt;历时近 5 个月的首期 Ruby 架构师培训昨晚终于完成了结营仪式，算是划上了一个完美的句号。&lt;/p&gt;

&lt;p&gt;在这里我也分享一下一些得失。&lt;/p&gt;

&lt;p&gt;原计划约 40 个课时，20 次（每次两个课时）的培训，最终上了 100 多个课时，55 次左右的培训。&lt;/p&gt;

&lt;p&gt;正如开课时候，有些人说的一样，“这么多内容，不像是一个课程，是一个学位。” &lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/391ff4e9-93b8-4739-ae92-0864970aa784.png" height="50px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;事实上也是这样。&lt;/p&gt;

&lt;p&gt;最初设计课程的时候，希望学员能够跟上课程的进度，逐步从初中级成长至中高级，后来发现其实还是有些理想化。&lt;/p&gt;

&lt;p&gt;学习分三步，学和练习，这两步是传统的教育认为的，我通过自己的学习，我感觉需要再加一个总结。&lt;/p&gt;

&lt;p&gt;学员从课堂上学到的东西，更多的是泛泛而谈的内容。&lt;/p&gt;

&lt;p&gt;要进一步的掌握知识，必然要通过练习，这也是经验的重要性。&lt;/p&gt;

&lt;p&gt;套用现在的流行语，如何将知识“锁死”？我觉得学习的终极武器就是通过自己的语言组织起来，形式上比如翻讲老师的内容，记录博客等等。&lt;/p&gt;

&lt;p&gt;由于时间的关系，如何在这个高强度的训练中提高自己，对学员来说是个非常高的挑战。&lt;/p&gt;

&lt;p&gt;我们这一期做的好的是，大家基本都坚持下来了，包括我自身做的不好的地方是，实践的内容太少了。&lt;/p&gt;

&lt;p&gt;前期的课程，如元编程、Rebuilding Rails、Rails 源码导读很多会现场编程教学，所以效果会好很多。&lt;/p&gt;

&lt;p&gt;后期讲架构的内容，偏理论，而且没有配合的实践内容，所以效果差一些，这个是需要加强的部分。&lt;/p&gt;

&lt;p&gt;简单说说吧，结营的时候我还略有点伤感，毕竟对我来说也是一段美妙的旅程。&lt;/p&gt;

&lt;p&gt;做了这么一次“学位级”的分享，我想真正收获最大的可能是我自己。&lt;/p&gt;

&lt;p&gt;通过这次分享，梳理了我的知识体系。&lt;/p&gt;

&lt;p&gt;不足的地方也很明显，由于个人的原因，没有时间一起带大家写一个 Rails Cloud 出来，还是非常遗憾的。&lt;/p&gt;

&lt;p&gt;我也希望在接下来的时间里，能继续完成我这个梦想。&lt;/p&gt;

&lt;p&gt;最后，感谢所有参与的学员，也感谢 Ruby China 的前辈，很多学员都是来自 Ruby China。&lt;/p&gt;

&lt;p&gt;祝我们一起能把社区建设的更好。&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Mon, 21 Feb 2022 08:25:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/42152</link>
      <guid>https://ruby-china.org/topics/42152</guid>
    </item>
    <item>
      <title>Action Dispatch 源码解读</title>
      <description>&lt;p&gt;&lt;a href="https://youtu.be/Ah2EpJ-uBck" rel="nofollow" target="_blank" title=""&gt;Youtube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bilibili.com/video/BV1Hq4y1A7rv/" rel="nofollow" target="_blank" title=""&gt;BiliBili&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BiliBili&lt;/strong&gt;&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1Hq4y1A7rv" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Fri, 14 Jan 2022 19:41:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/42080</link>
      <guid>https://ruby-china.org/topics/42080</guid>
    </item>
    <item>
      <title>今晚 (10.12) 分享大型 Rails App 重构的 20+ 种姿势</title>
      <description>&lt;p&gt;强生 邀请您参加腾讯会议&lt;/p&gt;

&lt;p&gt;会议主题：分享大型 Rails App 重构的 20+ 种姿势&lt;/p&gt;

&lt;p&gt;会议时间：2021/10/12 20:00-22:00 (GMT+08:00) 中国标准时间 - 北京&lt;/p&gt;

&lt;p&gt;点击&lt;a href="https://meeting.tencent.com/dm/wGial14iWdJd" rel="nofollow" target="_blank" title=""&gt;链接&lt;/a&gt;入会，或添加至会议列表：
&lt;a href="https://meeting.tencent.com/dm/wGial14iWdJd" rel="nofollow" target="_blank"&gt;https://meeting.tencent.com/dm/wGial14iWdJd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;会议 ID：381 671 327&lt;/p&gt;

&lt;p&gt;面向听众：初学者或者对重构 Rails App 感兴趣的同学&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Tue, 12 Oct 2021 10:52:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/41757</link>
      <guid>https://ruby-china.org/topics/41757</guid>
    </item>
    <item>
      <title>YJIT 把 ActiveRecord 的速度提升了 1.37 倍</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/Shopify/yjit" rel="nofollow" target="_blank" title=""&gt;YJIT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;YJIT optimizes a number of common benchmarks well. Here are some results compared to the CRuby interpreter without MJIT, current as of Sept 2021:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;activerecord: 1.37x&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;jekyll: 1.12x&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;liquid-render: 1.27x&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mail gem: 1.09x&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;psych-load: 1.29x&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kokubun's railsbench: 1.16x&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;optcarrot: 1.68x&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chris Seaton's lee benchmark: 1.41x&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code for these benchmarks can be found at &lt;a href="https://github.com/Shopify/yjit-bench" rel="nofollow" target="_blank"&gt;https://github.com/Shopify/yjit-bench&lt;/a&gt; under "benchmarks".&lt;/p&gt;

&lt;p&gt;貌似 Matz 同意合并了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/64d6fea3-6c04-4c99-bda8-42b92946b690.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;目前只支持 x86 平台，后续会支持 Arm 平台。对于不支持的指令或平台会回退到 CRuby&lt;/p&gt;

&lt;p&gt;Github 和 Shopify 已经在生产上使用了，跑完测试后貌似并没有出现什么问题。&lt;/p&gt;

&lt;p&gt;大家可以试用一下~&lt;/p&gt;

&lt;p&gt;相关的资料：
&lt;a href="https://pointersgonewild.com/2021/06/02/yjit-building-a-new-jit-compiler-inside-cruby/" rel="nofollow" target="_blank" title=""&gt;YJIT: Building a New JIT Compiler Inside CRuby&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=vucLAqv7qpc" rel="nofollow" target="_blank" title=""&gt;YJIT: Building a New JIT Compiler Inside CRuby&lt;/a&gt;&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Wed, 29 Sep 2021 09:25:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/41726</link>
      <guid>https://ruby-china.org/topics/41726</guid>
    </item>
    <item>
      <title>如何读 Ruby on Rails 源码</title>
      <description>&lt;p&gt;最近因为开了一个&lt;a href="https://ruby-china.org/topics/41519" title=""&gt;企业级 Ruby 架构师训练营&lt;/a&gt;，其中有几个章节是专门讲&lt;code&gt;Ruby on Rails源码&lt;/code&gt;的。&lt;/p&gt;

&lt;p&gt;虽然之前也经常翻阅，不过因为是讲课，必须保证讲的是正确的，还需要有比较顺畅的思路。&lt;/p&gt;

&lt;p&gt;闲话少续，咱们开始正题。&lt;/p&gt;

&lt;p&gt;要读 Rails 源码首先需要扎实的&lt;code&gt;元编程&lt;/code&gt;基础，这里推荐大家读一下&lt;code&gt;Ruby元编程&lt;/code&gt;这本书。&lt;/p&gt;

&lt;p&gt;具备了这个基础后，接下来找个正确的姿势来读源码就不会觉得很难了。&lt;/p&gt;

&lt;p&gt;众所周知，Rails 框架是由多个 Gem 组成的，比如&lt;code&gt;ActiveRecord&lt;/code&gt;, &lt;code&gt;ActionController&lt;/code&gt;, &lt;code&gt;ActionDispatch&lt;/code&gt;等，然后通过&lt;code&gt;railties&lt;/code&gt; 这个 Gem 把它们组合起来。&lt;/p&gt;

&lt;p&gt;我们在学习源码的过程中，可以直接把&lt;code&gt;Rails&lt;/code&gt;的 Github 仓库克隆下来，然后创建一个简单 DemoAPP，在 DemoAPP 中的&lt;code&gt;Gemfile&lt;/code&gt; 文件里，把&lt;code&gt;gem rails&lt;/code&gt; 指向本地：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Gemfile&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;path: &lt;/span&gt;&lt;span class="s1"&gt;'your_rails_path/rails'&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样，我们就可以方便的测试&lt;code&gt;rails&lt;/code&gt; 了。&lt;/p&gt;

&lt;p&gt;如果我们直接的，漫无目的的去看源码，可能收效比较小。&lt;/p&gt;

&lt;p&gt;那么，什么才是正确的看源码打开姿势呢？&lt;/p&gt;

&lt;p&gt;我个人的习惯是这样的：&lt;/p&gt;

&lt;p&gt;首先，以 &lt;code&gt;ActionDispatch&lt;/code&gt; 为例，我们先了解一下它的主要功能，&lt;code&gt;ActionDispatch&lt;/code&gt; 主要是用来处理 Rails 中的路由的。&lt;/p&gt;

&lt;p&gt;那么我们怎么样去看源码呢？&lt;/p&gt;

&lt;p&gt;我们需要先从宏观上认识一下整个的流程，这时候可以先去网上找找相关的资料。&lt;/p&gt;

&lt;p&gt;比如说，我通过谷歌搜索&lt;code&gt;ActionDispatch source code&lt;/code&gt;得到了一下结果：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ruby-china.org/topics/38195" title=""&gt;Learn Rails 5 by Reading Source Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/rubyinside/a-deep-dive-into-routing-and-controller-dispatch-in-rails-8bf58c2cf3b5" rel="nofollow" target="_blank" title=""&gt;A Deep Dive into Routing and Controller Dispatch in Rails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/231-routing-walkthrough?view=asciicast" rel="nofollow" target="_blank" title=""&gt;Routing Walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;等等。&lt;/p&gt;

&lt;p&gt;非常幸运地，我找到了这篇文章：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/7f22eda2-9ccc-4605-b19b-da43f4cd88ee.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这样，我对整个 Gem &lt;code&gt;ActionDispatch&lt;/code&gt; 有了一个宏观的认识。&lt;/p&gt;

&lt;p&gt;这时，我在 DemoAPP 里面，新建了一条路由：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/routes.rb&lt;/span&gt;

&lt;span class="n"&gt;byebug&lt;/span&gt;
&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s2"&gt;"home/index"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候，由于 Ruby 语言的特性，我们通过&lt;code&gt;byebug&lt;/code&gt;并不能逐步地跟踪下去。&lt;/p&gt;

&lt;p&gt;所以，我们需要在&lt;code&gt;rails&lt;/code&gt; 的 &lt;code&gt;actiondispatch&lt;/code&gt; 文件里，找到相应的文件，在它访问地方法里，恰当地加入&lt;code&gt;byebug&lt;/code&gt;，或者&lt;code&gt;binding.pry&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;下图是我设置的位置：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/rocLv/4a2a2119-dc58-481b-9061-457ae1336f30.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如果在调试的过程中，发现跳过一些自己希望关注的点，可以再在这个链路上，查找到相应的方法，然后找一个合适的位置设置断点。&lt;/p&gt;

&lt;p&gt;通过这样的方式，基本可以掌握整体。&lt;/p&gt;

&lt;p&gt;接下来，就可以深入文件内部去看了。&lt;/p&gt;

&lt;p&gt;比如说文件的组织方式，rails 中一般都会有一个统一的文件，比如&lt;code&gt;action_dispatch.rb&lt;/code&gt;，它起到一个索引的作用，把各种 module 串起来去，把相应的文件通过&lt;code&gt;autoload&lt;/code&gt; 加载进来。&lt;/p&gt;

&lt;p&gt;然后会有一个对应的&lt;code&gt;action_dispatch&lt;/code&gt; 文件夹。文件夹中的内容，会通过&lt;code&gt;autoload&lt;/code&gt; 方法，被加载进来。&lt;/p&gt;

&lt;p&gt;需要特别注意的是，很多 Ruby 默认的方法，Rails 都做了重新定义，比如&lt;code&gt;delegate&lt;/code&gt;, &lt;code&gt;autoload&lt;/code&gt;, 这点在读源码的时候要特别注意。&lt;/p&gt;

&lt;p&gt;在读源码前，可以先看看&lt;code&gt;active_support/core_ext&lt;/code&gt; 文件夹下面的内容，特别是&lt;code&gt;kernel.rb&lt;/code&gt;，&lt;code&gt;module.rb&lt;/code&gt; 里面的内容。&lt;/p&gt;

&lt;p&gt;以上就是我看源码的一些心得，希望对新手有些帮助。&lt;/p&gt;</description>
      <author>rocLv</author>
      <pubDate>Mon, 27 Sep 2021 21:32:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/41722</link>
      <guid>https://ruby-china.org/topics/41722</guid>
    </item>
  </channel>
</rss>
