<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jasl (Jasl)</title>
    <link>https://ruby-china.org/jasl</link>
    <description>Ass♂we♂can</description>
    <language>en-us</language>
    <item>
      <title>[成都][7-5,6] RubyConf China 2025 售票开始</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;其实售票链接已经准备好一个月了，各种工作生活原因搞得每天都很狼狈&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;时间：2025 年 7 月 5 日 - 7 月 6 日&lt;/p&gt;

&lt;p&gt;地点：成都华尔道夫酒店&lt;/p&gt;

&lt;p&gt;购票链接： &lt;a href="https://www.huodongxing.com/event/9807184772300" rel="nofollow" target="_blank"&gt;https://www.huodongxing.com/event/9807184772300&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;购票小程序： &lt;img src="https://l.ruby-china.com/photo/jasl/0a0c2ab5-6304-4499-a231-289c6a4a802e.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="日程安排"&gt;日程安排&lt;/h2&gt;
&lt;p&gt;第一天&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8:30 — 9:00 签到&lt;/li&gt;
&lt;li&gt;9:00 — 9:50 李亚飞 - Rails With 100% Vibe AI Coding&lt;/li&gt;
&lt;li&gt;10:00 — 10:50 袁晓峰 - TestProf 在 GitLab 的最佳实践&lt;/li&gt;
&lt;li&gt;11:00 — 11:50 宋学江 - 基于 Ruby Liquid 的 Headless CMS 内容平台构建&lt;/li&gt;
&lt;li&gt;11:50 — 13:30 午餐（自助餐）&lt;/li&gt;
&lt;li&gt;13:30 — 14:20 庄表伟 - Ruby 语言的 AI 实战 — 从框架到应用&lt;/li&gt;
&lt;li&gt;14:30 — 15:20 江伟业 - Ruby 创业公司的极简增长模式：基于 Hotwire Turbo 和 Stimulus 构建全球化社交电商平台&lt;/li&gt;
&lt;li&gt;15:20 — 16:00 茶歇&lt;/li&gt;
&lt;li&gt;16:00 — 16:50 丁盛豪 - Ruby 服务器 I/O Profiling 与优化&lt;/li&gt;
&lt;li&gt;17:00 — 17:50 吕戈 — 主题演讲&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;第二天&lt;/p&gt;

&lt;p&gt;TBD&lt;/p&gt;
&lt;h2 id="售票"&gt;售票&lt;/h2&gt;
&lt;p&gt;票价和往届类似：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;早鸟票（不含发票）368 元&lt;/li&gt;
&lt;li&gt;普通票（不含发票）428 元&lt;/li&gt;
&lt;li&gt;普通票（含发票）468 元&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;学生票（不含发票）328 元&lt;/li&gt;
&lt;li&gt;周六单日票（不含发票）288 元&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;普通票（带发票）总共购买超过三张后，算作团体参加，请把订单号和公司的 Logo 及公司网站地址邮件发送给我（我的邮箱见本帖最后），我会把您公司放入感谢名单（如果您的公司能够赞助大会，也可以算入赞助金额中）。&lt;/p&gt;
&lt;h3 id="关于退票"&gt;关于退票&lt;/h3&gt;
&lt;p&gt;在大会召开一周前，允许自由退票，之后会将购票的所得款项支付给酒店，故停止支持退票，请理解！&lt;/p&gt;
&lt;h3 id="咨询"&gt;咨询&lt;/h3&gt;
&lt;p&gt;邮件联系：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;alexanderjiangjunyin@gmail.com&lt;/li&gt;
&lt;li&gt;jasl9187@hotmail.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;或者从往届微信群找 jasl、junyin&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Thu, 22 May 2025 23:35:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/44171</link>
      <guid>https://ruby-china.org/topics/44171</guid>
    </item>
    <item>
      <title>[成都][7-5,6]RubyConf China 2025 主题征集</title>
      <description>&lt;p&gt;时间：2025 年 7 月 5 日 - 7 月 6 日&lt;/p&gt;

&lt;p&gt;地点：成都华尔道夫酒店&lt;/p&gt;

&lt;p&gt;讲师征集表单：&lt;a href="https://jsj.top/f/YXjCd1" rel="nofollow" target="_blank"&gt;https://jsj.top/f/YXjCd1&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="关于 Ruby China 和 RubyConf China"&gt;关于 Ruby China 和 RubyConf China&lt;/h2&gt;
&lt;p&gt;Ruby China 社区是中国最大的、水平最高的的 Ruby 交流社区，已经吸收了国内大半部分从事 Ruby 技术开发的人士和爱好者，并且维护了国内最大的 RubyGems 源。此外，Ruby China 社区各地热心的组织者们会定期举办地区级别的小型分享交流会。&lt;/p&gt;

&lt;p&gt;RubyConf China 则是由 Ruby China 社区官方以公开、非盈利形式组织的一年一度的技术交流大会，我们会邀请国内的明星开发者、知名项目/团队的负责人、海外技术专家来分享 Ruby 和相关领域的最新成果、经验总结。&lt;/p&gt;

&lt;p&gt;RubyConf China 自 2009 年始至 2024 年已成功举办十四届，也是中国大陆唯一的 Ruby 技术交流会议，组织者都是各公司的一线开发者。&lt;/p&gt;

&lt;p&gt;往届大会的情况可以通过 Ruby China 社区的 RubyConf 节点（&lt;a href="https://ruby-china.org/topics/node51" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/node51&lt;/a&gt;）了解。&lt;/p&gt;
&lt;h2 id="RubyConf China 2025 的计划"&gt;RubyConf China 2025 的计划&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;第十五届&lt;/strong&gt; RubyConf China 预计将于 &lt;strong&gt;2025 年 7 月 5 日 - 7 月 6 日&lt;/strong&gt; 在 &lt;strong&gt;成都华尔道夫酒店&lt;/strong&gt; 举办。&lt;/p&gt;

&lt;p&gt;大会再一次回到蓉城成都，在当地最高级的酒店欢迎大家的到来。
会议日程沿用 2024 年：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;主题分享为一天（周六），预计 7 场&lt;/li&gt;
&lt;li&gt;第二天为氛围轻松的快速演讲&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="主题征集"&gt;主题征集&lt;/h2&gt;
&lt;p&gt;同往届一样，我们欢迎各种类型与 Ruby 相关的话题，也欢迎投递具有启发性与技术前沿相关的技术分享，投稿截止日期暂定五月中旬。&lt;/p&gt;

&lt;p&gt;讲师征集表单：&lt;a href="https://jsj.top/f/YXjCd1" rel="nofollow" target="_blank"&gt;https://jsj.top/f/YXjCd1&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 19 Mar 2025 18:25:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/44103</link>
      <guid>https://ruby-china.org/topics/44103</guid>
    </item>
    <item>
      <title>[广州][11-30] RubyConf China 2024 售票开始</title>
      <description>&lt;p&gt;时间：2024 年 11 月 30 日 - 12 月 1 日&lt;/p&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/jasl/3524990d-b3ac-40c9-95f0-827bdf832959.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="日程安排"&gt;日程安排&lt;/h2&gt;
&lt;p&gt;第一天&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8:30 — 9:00 签到&lt;/li&gt;
&lt;li&gt;9:00 — 9:50 陈金洲 — Rails + Next.js：一种提升开发者和用户体验的开发架构范式&lt;/li&gt;
&lt;li&gt;10:00 — 10:50 李亚飞 — 十倍性能提升，原生 Ruby 异步编程机制的思考与应用&lt;/li&gt;
&lt;li&gt;11:00 — 11:50 Mike — SDB: a New Ruby Stack Profiling Tool&lt;/li&gt;
&lt;li&gt;11:50 — 13:30 午餐（自助餐）&lt;/li&gt;
&lt;li&gt;13:30 — 14:20 袁晓峰 — 下一个十年的 Modern Monolith&lt;/li&gt;
&lt;li&gt;14:30 — 15:20 李枫 — Metasploit 与 Ruby&lt;/li&gt;
&lt;li&gt;15:20 — 16:00 茶歇&lt;/li&gt;
&lt;li&gt;16:00 — 16:50 楠木 — 语音 chatbot 对 Workstream 业务的意义&lt;/li&gt;
&lt;li&gt;17:00 — 17:50 丁盛豪 — 主题演讲&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;第二天&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9:00 — 10:00 早茶（自助餐）&lt;/li&gt;
&lt;li&gt;10:00 — 10:30 过纯中 — 二次开发对飙 Jira, Asana, Trello, Monday, Wrike 的开源项目管理工具 OpenProject&lt;/li&gt;
&lt;li&gt;10:30 — 11:00 Hjiangwen — Troubleshoot Production Issue in Web Application&lt;/li&gt;
&lt;li&gt;11:00 — 11:30 早茶（自助餐）&lt;/li&gt;
&lt;li&gt;11:30 — 12:00 theblock24block — Ruby profiler 大盘点、Vernier 原理与应用&lt;/li&gt;
&lt;li&gt;12:00 — 12:30 Hegwin — 元编程在测试框架里的应用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参会微信群"&gt;参会微信群&lt;/h2&gt;
&lt;p&gt;TBD&lt;/p&gt;
&lt;h2 id="售票"&gt;售票&lt;/h2&gt;
&lt;p&gt;票价和往届类似：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;超级早鸟票（不含发票）358 元&lt;/li&gt;
&lt;li&gt;早鸟票（不含发票）408 元&lt;/li&gt;
&lt;li&gt;普通票（含发票）468 元&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;学生票（不含发票）328 元&lt;/li&gt;
&lt;li&gt;周六单日票（不含发票）288 元&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;普通票（带发票）总共购买超过三张后，算作团体参加，请把订单号和公司的 Logo 及公司网站地址邮件发送给我（我的邮箱见本帖最后），我会把您公司放入感谢名单（如果您的公司能够赞助大会，也可以算入赞助金额中）。&lt;/p&gt;
&lt;h3 id="关于退票"&gt;关于退票&lt;/h3&gt;
&lt;p&gt;在大会召开一周前，允许自由退票，之后会将购票的所得款项支付给酒店，故停止支持退票，请理解！&lt;/p&gt;

&lt;p&gt;退票方式为：多会小程序中可以看到购票的订单，然后退票即可&lt;/p&gt;
&lt;h3 id="咨询"&gt;咨询&lt;/h3&gt;
&lt;p&gt;邮件联系：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;alexanderjiangjunyin@gmail.com&lt;/li&gt;
&lt;li&gt;jasl9187@hotmail.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;或者从往届微信群找 jasl、junyin&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Tue, 24 Sep 2024 01:53:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/43890</link>
      <guid>https://ruby-china.org/topics/43890</guid>
    </item>
    <item>
      <title>RubyConf China 2024 主题征集</title>
      <description>&lt;p&gt;时间：2024 年 11 月 30 日 - 12 月 1 日&lt;/p&gt;

&lt;p&gt;地点：广州康莱德酒店&lt;/p&gt;

&lt;p&gt;活动介绍：TBD&lt;/p&gt;

&lt;p&gt;官网：TBD&lt;/p&gt;

&lt;p&gt;讲师征集表单：&lt;a href="https://jsj.top/f/BhzCS1" rel="nofollow" target="_blank"&gt;https://jsj.top/f/BhzCS1&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="关于 Ruby China 和 RubyConf China"&gt;关于 Ruby China 和 RubyConf China&lt;/h2&gt;
&lt;p&gt;Ruby China 社区是中国最大的、水平最高的的 Ruby 交流社区，已经吸收了国内大半部分从事 Ruby 技术开发的人士和爱好者，并且维护了国内最大的 RubyGems 源。此外，Ruby China 社区各地热心的组织者们会定期举办地区级别的小型分享交流会。&lt;/p&gt;

&lt;p&gt;RubyConf China 则是由 Ruby China 社区官方以公开、非盈利形式组织的一年一度的技术交流大会，我们会邀请国内的明星开发者、知名项目/团队的负责人、海外技术专家来分享 Ruby 和相关领域的最新成果、经验总结。&lt;/p&gt;

&lt;p&gt;RubyConf China 自 2009 年始至 2023 年已成功举办十三届，也是中国大陆唯一的 Ruby 技术交流会议，组织者都是各公司的一线开发者。&lt;/p&gt;

&lt;p&gt;往届大会的情况可以通过 Ruby China 社区的 RubyConf 节点（&lt;a href="https://ruby-china.org/topics/node51" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/node51&lt;/a&gt;）了解。&lt;/p&gt;
&lt;h2 id="RubyConf China 2024 的计划"&gt;RubyConf China 2024 的计划&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;第十四届&lt;/strong&gt; RubyConf China 预计将于 &lt;strong&gt;2024 年 11 月 30 日 - 12 月 1 日&lt;/strong&gt; 在 &lt;strong&gt;广州康莱德酒店&lt;/strong&gt; 举办。&lt;/p&gt;

&lt;p&gt;往届通常是两天十四场左右的技术分享，会议内容较多。
今年，大会来到了全球城市、重要的国际商贸中心、对外交往中心和综合交通枢纽、南方国际航运中心、岭南文化的发源地和兴盛地、大吃省省会、美食之都的 &lt;strong&gt;广州&lt;/strong&gt;，
希望大家也能感受下广州的文（mei）化（shi）生（yu）活（le），所以在会议日程上做了一些调整：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;主题分享为一天（周六），预计 7 场&lt;/li&gt;
&lt;li&gt;在大会第二天，我们会组织一些活动，自愿参加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="主题征集"&gt;主题征集&lt;/h2&gt;
&lt;p&gt;同往届一样，我们欢迎各种类型与 Ruby 相关的话题，也欢迎投递具有启发性与技术前沿相关的技术分享，投稿截止日期暂定八月中旬。&lt;/p&gt;

&lt;p&gt;讲师征集表单：&lt;a href="https://jsj.top/f/BhzCS1" rel="nofollow" target="_blank"&gt;https://jsj.top/f/BhzCS1&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 17 Jul 2024 22:43:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/43813</link>
      <guid>https://ruby-china.org/topics/43813</guid>
    </item>
    <item>
      <title>RubyConf China 2023 PPT 和照片</title>
      <description>&lt;p&gt;OneDrive 网盘链接： &lt;a href="https://1drv.ms/f/s!AipA6eXBza6KhoAJvMLiB2LxFqyrlg?e=14SDpG" rel="nofollow" target="_blank"&gt;https://1drv.ms/f/s!AipA6eXBza6KhoAJvMLiB2LxFqyrlg?e=14SDpG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;现场照片：&lt;a href="https://as.alltuu.com/album/1545624408/" rel="nofollow" target="_blank"&gt;https://as.alltuu.com/album/1545624408/&lt;/a&gt; （未来有可能失效，请尽快保存）&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Tue, 22 Aug 2023 00:45:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/43286</link>
      <guid>https://ruby-china.org/topics/43286</guid>
    </item>
    <item>
      <title>RubyConf China 2023 主题介绍</title>
      <description>&lt;p&gt;时间：2023 年 8 月 19 日 - 20 日&lt;/p&gt;

&lt;p&gt;地点：上海明天广场 JW 万豪酒店&lt;/p&gt;

&lt;p&gt;活动介绍：&lt;a href="https://ruby-china.org/topics/43079" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/43079&lt;/a&gt;
官网：&lt;a href="https://rubyconfchina2023.mysxl.cn/" rel="nofollow" target="_blank"&gt;https://rubyconfchina2023.mysxl.cn/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="TBD"&gt;TBD&lt;/h3&gt;
&lt;p&gt;Matz&lt;/p&gt;
&lt;h3 id="Rails 应用安全与 rack-security"&gt;Rails 应用安全与 rack-security&lt;/h3&gt;
&lt;p&gt;李玮 AI 小李&lt;/p&gt;

&lt;p&gt;如何参考 OWASP TOP 10 的建议进行 Rails 项目的安全开发，以及 Rails 的安全加固方案与 rack-security。&lt;/p&gt;
&lt;h3 id="Rust 重铸 Ruby"&gt;Rust 重铸 Ruby&lt;/h3&gt;
&lt;p&gt;张汉东&lt;/p&gt;

&lt;p&gt;一部分是介绍 artichoke，另一部分介绍 shopify 如何用 rust 重写 yjit（第三方视角），通过这两部分内容让大家了解 ruby 生态中发生的一些“锈化”。&lt;/p&gt;
&lt;h3 id="Rails ActionCable 的性能压测与实战经验分享"&gt;Rails ActionCable 的性能压测与实战经验分享&lt;/h3&gt;
&lt;p&gt;李亚飞 &lt;a href="/lyfi2003" class="user-mention" title="@lyfi2003"&gt;&lt;i&gt;@&lt;/i&gt;lyfi2003&lt;/a&gt; ShowMeBug&lt;/p&gt;

&lt;p&gt;主要分享 ShowMeBug 发展过程中性能相关的经验与总结&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ActionCable 链接测试的技巧与方法&lt;/li&gt;
&lt;li&gt;ActionCable 实际并发能力与总结&lt;/li&gt;
&lt;li&gt;Puma 最优的配置&lt;/li&gt;
&lt;li&gt;调优性能的本质原则&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="React 18 &amp;amp; Rails 7.1，全栈三个月开发绩效系统"&gt;React 18 &amp;amp; Rails 7.1，全栈三个月开发绩效系统&lt;/h3&gt;
&lt;p&gt;过纯中 &lt;a href="/ericguo" class="user-mention" title="@ericguo"&gt;&lt;i&gt;@&lt;/i&gt;ericguo&lt;/a&gt; 上海天华建筑设计有限公司&lt;/p&gt;

&lt;p&gt;厌倦了千篇一律的 AntD+Spring boot，回归一人快速开发 Web 企业应用的快感，过纯中将演示如何用 Rails 的 coreui-rails-starter 模版（演讲后立刻开源）开发一个 SaaS 版本的企业内部绩效考核系统的 self-hosting 平替。演讲将着重介绍如何发挥 Rails 的快速开发能力和 React 的复杂用户 UI 界面开发能力，做到又快又好。&lt;/p&gt;
&lt;h3 id="玩转 AST，构建自己的代码分析和代码重写工具"&gt;玩转 AST，构建自己的代码分析和代码重写工具&lt;/h3&gt;
&lt;p&gt;黄志敏 &lt;a href="/flyerhzm" class="user-mention" title="@flyerhzm"&gt;&lt;i&gt;@&lt;/i&gt;flyerhzm&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;想知道 linter 和 formatter 工具是如何工作的吗？想学习如何自己写一个代码分析和代码重写的工具吗？我将分享我在开发 rails_best_practices 和 synvert 的经验，帮助你快速入门 linter 工具的开发，同时我会介绍如何基于 synvert 来快速实现你自己的代码分析和代码重写。&lt;/p&gt;
&lt;h3 id="Toggle Everything in Rails"&gt;Toggle Everything in Rails&lt;/h3&gt;
&lt;p&gt;周艺 &lt;a href="/IChou" class="user-mention" title="@IChou"&gt;&lt;i&gt;@&lt;/i&gt;IChou&lt;/a&gt; 金数据&lt;/p&gt;

&lt;p&gt;Feature Toggle，为敏捷而生的新特性发布管理方式，简单是它最大的特点。
但，再简单的方式，长期实践下来总会有一些新的体会。
本分享将从金数据使用 Feature Toggle 十年来的故事和事故里，为大家剖析各种挑战，再带大家计一套可以再战 10 年的方案。&lt;/p&gt;
&lt;h3 id="浅析领域驱动设计在极狐（GitLab）的技术实践"&gt;浅析领域驱动设计在极狐（GitLab）的技术实践&lt;/h3&gt;
&lt;p&gt;袁晓峰 &lt;a href="/apexy" class="user-mention" title="@apexy"&gt;&lt;i&gt;@&lt;/i&gt;apexy&lt;/a&gt; 极狐（GitLab）&lt;/p&gt;

&lt;p&gt;领域驱动设计原则如何应用到大型 Rails 项目上，使其既务实于 Rails 的技术特点，又保持良好的可维护性，而不至于教条主义？这个主题介绍了极狐（GitLab)）的 Rails 项目涉及领域驱动设计的一些技术实践方式。&lt;/p&gt;
&lt;h3 id="Queryx: 将ActiveRecord 移植到其他编程语言的一次新尝试"&gt;Queryx: 将 ActiveRecord 移植到其他编程语言的一次新尝试&lt;/h3&gt;
&lt;p&gt;&lt;a href="/wangzuo" class="user-mention" title="@wangzuo"&gt;&lt;i&gt;@&lt;/i&gt;wangzuo&lt;/a&gt; 深圳速速菜头&lt;/p&gt;

&lt;p&gt;ActiveRecord 是 Rails 生态系统中最重要的组件之一，随着 Rails 的发展不断改进。ActiveRecord 的接口设计经过时间的考验，并且与 Rails 社区注重产品快速交付的风格保持一致。我们在 Go 语言中采用代码生成的方式，试图实现 ActiveRecord 的方法，并提供了一整套数据库管理的开发流程，同时开源了这个项目 &lt;a href="https://github.com/swiftcarrot/queryx" rel="nofollow" target="_blank"&gt;https://github.com/swiftcarrot/queryx&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="Conversational AI赋能下一代互联网应用"&gt;Conversational AI 赋能下一代互联网应用&lt;/h3&gt;
&lt;p&gt;王若愚 Workstream&lt;/p&gt;

&lt;p&gt;ChatGPT 的发布让 NLP 长久以来的技术理想真正得以落地到真实的应用中。本次分享将介绍 Workstream 如何理解 Conversational AI 带来的交互变革，并在 2 个月内落地具体的应用。通过服务真实用户，Workstream 如何理解 AI + 互联网应用带来的新工程挑战。&lt;/p&gt;
&lt;h3 id="Ruby十年@华为"&gt;Ruby 十年@华为&lt;/h3&gt;
&lt;p&gt;胡智勇 &lt;a href="/hutusi" class="user-mention" title="@hutusi"&gt;&lt;i&gt;@&lt;/i&gt;hutusi&lt;/a&gt; 华为&lt;/p&gt;

&lt;p&gt;介绍 Ruby 在华为的应用情况和历史，以一个典型的 Ruby 项目（代码仓）为例，介绍 Ruby 所遇到的挑战和应对方案，再谈一下 Ruby 在大企可能的发展和机遇。&lt;/p&gt;
&lt;h3 id="Solargraph Rails 使用分享与 DAP 断点调试"&gt;Solargraph Rails 使用分享与 DAP 断点调试&lt;/h3&gt;
&lt;p&gt;&lt;a href="/xinyifly" class="user-mention" title="@xinyifly"&gt;&lt;i&gt;@&lt;/i&gt;xinyifly&lt;/a&gt; 青岛伊利诺斯电气&lt;/p&gt;

&lt;p&gt;对代码的信心就像检查作业，当我们借助流程和工具的帮助，做到一遍写完就不必回头担心、反复检查的时候，开发效率将会是一个水到渠成的提升。&lt;/p&gt;
&lt;h3 id="基于大语言模型的可视化数据分析"&gt;基于大语言模型的可视化数据分析&lt;/h3&gt;
&lt;p&gt;靳晓明 Ekohe&lt;/p&gt;

&lt;p&gt;本次演讲主要介绍大语言模型的原理、以及在数据分析与可视化中的创新应用与案例，使用 GPT 模型辅助实现 ruby on rails 数据仓储项目的数据分析及可视化。&lt;/p&gt;
&lt;h2 id="日程安排"&gt;日程安排&lt;/h2&gt;
&lt;p&gt;2023.8.19（周六）Day 1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;09:00 - 09:50 Matz - （录播）Keynote Talk&lt;/li&gt;
&lt;li&gt;10:00 - 10:50 黄志敏 - 玩转 AST，构建自己的代码分析和代码重写工具&lt;/li&gt;
&lt;li&gt;11:00 - 11:50 李亚飞 - Rails ActionCable 的性能压测与实战经验分享&lt;/li&gt;
&lt;li&gt;12:00 - 13:30 午间休息&lt;/li&gt;
&lt;li&gt;13:30 - 14:20 李玮 - Rails 应用安全与 rack - security&lt;/li&gt;
&lt;li&gt;14:30 - 15:20 袁晓峰 - 浅析领域驱动设计在极狐 (GitLab) 的技术实践&lt;/li&gt;
&lt;li&gt;15:30 - 16:20 王若愚 - Conversational Al 赋能下一代互联网应用&lt;/li&gt;
&lt;li&gt;16:30 - 17:20 胡智勇 - Ruby 十年 @ 华为&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2023.8.20（周日）Day 2&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;09:00 - 09:50 王左 - 从移植 Active Record 中学到的几件事&lt;/li&gt;
&lt;li&gt;10:00 - 10:50 过纯中 - React 18 &amp;amp; Rails 7.1，全栈三个月开发绩效系统&lt;/li&gt;
&lt;li&gt;11:00 - 11:50 张汉东 - Rust 重铸 Ruby&lt;/li&gt;
&lt;li&gt;12:00 - 13:30 午间休息&lt;/li&gt;
&lt;li&gt;13:30 - 14:20 周小虫 - Toggle Everything in Ruby&lt;/li&gt;
&lt;li&gt;14:30 - 15:20 陈泽宇 - 用 Solargraph 和 DAP 提升 Rails 开发信心&lt;/li&gt;
&lt;li&gt;15:30 - 16:20 靳晓明 - 基于大语言模型的可视化数据分析&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 28 Jun 2023 17:00:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/43202</link>
      <guid>https://ruby-china.org/topics/43202</guid>
    </item>
    <item>
      <title>[上海][8-19,20] RubyConf China 2023 售票开始</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/jasl/15efc96f-46ef-44e8-879b-2a7942d93916.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;时间：2023 年 8 月 19 日 - 20 日&lt;/p&gt;

&lt;p&gt;地点：上海明天广场 JW 万豪酒店&lt;/p&gt;

&lt;p&gt;官网：&lt;a href="https://rubyconfchina2023.mysxl.cn/" rel="nofollow" target="_blank"&gt;https://rubyconfchina2023.mysxl.cn/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;购票：微信扫码进入小程序购票（PS：&lt;del&gt;正在申请服务号支持网页支付，未来可能也会支持支付宝，但是目前只能走微信小程序了&lt;/del&gt;）&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/jasl/5a6733e9-5b80-4448-b34f-c372818c5ddf.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;三年没出门，我想死你们啦&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;其实这一场大会原定于 2021 年举办，一拖再拖拖到了 2023 年... 三年来大环境发生了很多变化，但因 Ruby 语言结下的缘份不会断连，又到了叙旧畅谈的时候了。&lt;/p&gt;

&lt;p&gt;和往年一样，两天 12 场左右的技术演讲，分享成功的 Ruby 的项目经验、技巧、以及前沿的新东西，参会者也都是在微信/QQ/飞书群里、论坛上有交流过但可能现实没见过的同行，以及对 Ruby 语言和社区感兴趣的新朋友。在向讲师学习的同时，也来享受一下 JW 万豪酒店的自助午餐，还有晚上的自由组队大冒险～&lt;/p&gt;

&lt;p&gt;主题介绍：&lt;a href="https://ruby-china.org/topics/43202" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/43202&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="日程安排"&gt;日程安排&lt;/h2&gt;
&lt;p&gt;2023.8.19（周六）Day 1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;09:00 - 09:50 Matz - （录播）Keynote Talk&lt;/li&gt;
&lt;li&gt;10:00 - 10:50 黄志敏 - 玩转 AST，构建自己的代码分析和代码重写工具&lt;/li&gt;
&lt;li&gt;11:00 - 11:50 李亚飞 - Rails ActionCable 的性能压测与实战经验分享&lt;/li&gt;
&lt;li&gt;12:00 - 13:30 午间休息&lt;/li&gt;
&lt;li&gt;13:30 - 14:20 李玮 - Rails 应用安全与 rack - security&lt;/li&gt;
&lt;li&gt;14:30 - 15:20 袁晓峰 - 浅析领域驱动设计在极狐 (GitLab) 的技术实践&lt;/li&gt;
&lt;li&gt;15:20 - 15:50 茶歇&lt;/li&gt;
&lt;li&gt;15:50 - 16:40 王若愚 - Conversational Al 赋能下一代互联网应用&lt;/li&gt;
&lt;li&gt;16:50 - 17:40 胡智勇 - Ruby 十年 @ 华为&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2023.8.20（周日）Day 2&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;09:00 - 09:50 王左 - 从移植 Active Record 中学到的几件事&lt;/li&gt;
&lt;li&gt;10:00 - 10:50 过纯中 - React 18 &amp;amp; Rails 7.1，全栈三个月开发绩效系统&lt;/li&gt;
&lt;li&gt;11:00 - 11:50 张汉东 - Rust 重铸 Ruby&lt;/li&gt;
&lt;li&gt;12:00 - 13:30 午间休息&lt;/li&gt;
&lt;li&gt;13:30 - 14:20 周小虫 - Toggle Everything in Ruby&lt;/li&gt;
&lt;li&gt;14:30 - 15:20 陈泽宇 - 用 Solargraph 和 DAP 提升 Rails 开发信心&lt;/li&gt;
&lt;li&gt;15:20 - 15:50 茶歇&lt;/li&gt;
&lt;li&gt;15:50 - 16:40 靳晓明 - 基于大语言模型的可视化数据分析&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参会微信群"&gt;参会微信群&lt;/h2&gt;
&lt;p&gt;购票后每隔一段时间会有工作人员联系入群（已过 100 人没法自由拉人加入），如果有朋友在往届群或者已经在新群了，可以互帮直接拉一下。&lt;/p&gt;
&lt;h2 id="售票"&gt;售票&lt;/h2&gt;
&lt;p&gt;票价和往届类似：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;早鸟票（不含发票）348 元&lt;/li&gt;
&lt;li&gt;普通票（不含发票）398 元&lt;/li&gt;
&lt;li&gt;全价票（带发票）458 元&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;全价票（带发票）总共购买超过三张后，算作团体参加，请把订单号和公司的 Logo 及公司网站地址邮件发送给我（我的邮箱见本帖最后），我会把您公司放入感谢名单（如果您的公司能够赞助大会，也可以算入赞助金额中）。&lt;/p&gt;
&lt;h3 id="关于退票"&gt;关于退票&lt;/h3&gt;
&lt;p&gt;在大会召开一周前，允许自由退票，之后会将购票的所得款项支付给酒店，故停止支持退票，请理解！&lt;/p&gt;

&lt;p&gt;退票方式为：多会小程序中可以看到购票的订单，然后退票即可&lt;/p&gt;
&lt;h3 id="咨询"&gt;咨询&lt;/h3&gt;
&lt;p&gt;邮件联系：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;alexanderjiangjunyin@gmail.com&lt;/li&gt;
&lt;li&gt;jasl9187@hotmail.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;或者从往届微信群找 jasl、junyin&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Tue, 16 May 2023 18:13:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/43079</link>
      <guid>https://ruby-china.org/topics/43079</guid>
    </item>
    <item>
      <title>RubyConf China 2023 讲师征集</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;同志们，好久不见！ &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;第十三届 RubyConf China 预计将于 2023 年 8 月 19 日 - 20 日在上海明天广场 JW 万豪酒店举办。&lt;/p&gt;

&lt;p&gt;RubyConf China 的话题非常开放，虽然我们的主题都围绕 Ruby 语言相关（前沿、经验、文化等），同时也接受前沿技术以及其他语言（Elixir、Rust...）等话题。&lt;/p&gt;

&lt;p&gt;本届大会预计演讲数量为 12-14 场（每场 45 分钟）。&lt;/p&gt;

&lt;p&gt;报名链接：&lt;a href="https://jinshuju.net/f/Ojasgw" rel="nofollow" target="_blank"&gt;https://jinshuju.net/f/Ojasgw&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="注意事项："&gt;注意事项：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;投稿截止日期为 2023 年 7 月 1 日&lt;/li&gt;
&lt;li&gt;演讲长度为 45-50 分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="讲师权益 (Benefits)："&gt;讲师权益 (Benefits)：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;免费纪念品一套（T-shirt 等）&lt;/li&gt;
&lt;li&gt;免费 RubyConf China 2023 门票一张&lt;/li&gt;
&lt;li&gt;提供往返路费报销（上限 2000 元）以及 2 天的酒店住宿&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;主办方将通过您填写的邮箱、联系方式中的渠道与您沟通&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>jasl</author>
      <pubDate>Mon, 08 May 2023 05:58:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/43059</link>
      <guid>https://ruby-china.org/topics/43059</guid>
    </item>
    <item>
      <title>Install Ruby on Apple Silicon</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;发布会当天就订了港版 M1 Mac Mini 16G，其实上周就送到手里了，不过因为这周二开了 WOW 9.0 所以赶工工作加肝游戏就一直没去玩他&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;很多人问我 M1 Mac Mini 上跑 Ruby 效果咋样，抽空试了一下，记录一个流水账&lt;/p&gt;
&lt;h2 id="第一观感"&gt;第一观感&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;扩展性很差，eGPU 不支持，双显示器只有 Mac Mini 支持并且一定要一个接到 HDMI，另一个接 USBC

&lt;ul&gt;
&lt;li&gt;亲测 HDMI 接口挑线，手头的飞利浦的 HDMI 线点不亮屏幕&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;听到很多人反馈蓝牙有问题，频繁无故断开&lt;/li&gt;
&lt;li&gt;听到很多人反馈一周内有零星死机&lt;/li&gt;
&lt;li&gt;Bug Sir 在 1080P 显示器上的视觉体验已经糟糕到不忍直视了&lt;/li&gt;
&lt;li&gt;折腾的时候 UI 的小毛病不少，在 x86 MBP 上完全没有遇到过&lt;/li&gt;
&lt;li&gt;网上各种评测讲的什么这么用再那么用用了好久好久一摸机器还是冷的，我不知道他们怎么搞的，我自己升级一下系统（预装 11.0，升级到 11.0.1），外壳就温热了，要知道 Mac Mini 的散热片和风扇比 MBP 不知道高到哪里去了&lt;/li&gt;
&lt;li&gt;程序员需要的各种作案工具基本上都还没有移植，虽然几乎所有的在 Rosetta 模式下都可以完美运行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="M1 macOS 对于开发者的现状"&gt;M1 macOS 对于开发者的现状&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;内置了 Ruby 2.6.3、Python 2.7、Python 3.8.2、PHP 7.3.22、Perl 5.18 5.28 5.30 (为啥要带这么多个版本？）

&lt;ul&gt;
&lt;li&gt;当初说 macOS 11 要移除所有脚本语言解释器的，看样子还是怂了&lt;/li&gt;
&lt;li&gt;Python 2.7 已经 EOL 了，苹果这次良心了一把，不知道拯救了多少老程序&lt;/li&gt;
&lt;li&gt;PHP 和 Python 2.7 运行时会附带一行 &lt;code&gt;WARNING: PHP is not recommended\nPHP is included in macOS for compatibility with legacy software.\nFuture versions of macOS will not include PHP.&lt;/code&gt; Ruby、Python 3 和 Perl 没有&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenJDK 还没有移植完成，据说 JDK 16 会带 M1 的支持，目前 Java 相关的只能 Rosetta 了，据说运行完美&lt;/li&gt;
&lt;li&gt;Go 还没有移植完成，1.16 会带 M1 支持，明年初的事情了，目前也是 Rosetta，据说也是运行完美&lt;/li&gt;
&lt;li&gt;Python3 虽然自带且版本时髦，但 &lt;strong&gt;目前（发帖的时间）&lt;/strong&gt; 还没法自行编译，numpy 也还跑不起来&lt;/li&gt;
&lt;li&gt;NodeJS 15.3.0 已经支持 M1 了&lt;/li&gt;
&lt;li&gt;Rust 目前对 M1 是 tier2 支持，是可以运行的，官方也还在跟踪 Apple Silicon 相关的问题，好消息是 rustup 刚宣布支持 M1 macOS 了&lt;/li&gt;
&lt;li&gt;GCC 不支持 M1，而且一时半会出不来，最快要明年年中&lt;/li&gt;
&lt;li&gt;OpenSSL 因为支持 iOS 所以其实也是支持 M1 的，但是缺少 M1 的 target（arm64-darwin20），所以编译不了，但有 patch 可用&lt;/li&gt;
&lt;li&gt;Ruby（推测 Python 也会）很多（直接或者间接）依赖了外部 C 库（比如 sassc）不能用是因为 macOS 的 arm64 的 ffi 调用协定不同于 linux 的 aarch64，这个已经有补丁了，但是仍未合并，ffi gem 会做 workaround，但目前也没有合并&lt;/li&gt;
&lt;li&gt;Homebrew 的安装脚本阻止原生 ARM 模式的安装，推荐在 Rosetta 下使用

&lt;ul&gt;
&lt;li&gt;其实 Homebrew 用到的 gem 的 M1 兼容问题都已经解决了&lt;/li&gt;
&lt;li&gt;一个重要原因是 Homebrew 团队在犹豫是不是要修改默认的安装路径和其他的一些杂事（Rosetta 和 Native 共存需要谨慎处理，否则会产生冲突）&lt;/li&gt;
&lt;li&gt;目前还没有提供 M1 环境的 CI 服务，所以没有环境供自动化测试...&lt;/li&gt;
&lt;li&gt;最大的问题在于上述语言、编译器、关键依赖还没移植，导致无包可用&lt;/li&gt;
&lt;li&gt;详情可以关注 &lt;a href="https://github.com/Homebrew/brew/issues/7857" rel="nofollow" target="_blank"&gt;https://github.com/Homebrew/brew/issues/7857&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Docker 目前不支持，长期来看也是最麻烦的

&lt;ul&gt;
&lt;li&gt;参见 &lt;a href="https://www.docker.com/blog/apple-silicon-m1-chips-and-docker/" rel="nofollow" target="_blank"&gt;https://www.docker.com/blog/apple-silicon-m1-chips-and-docker/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docker images 是有架构之分的，Doker 由于底层是虚拟机，所以 Rosetta 并不能对 Docker image 起作用，兼容后很可能只能使用 aarch64 的 image&lt;/li&gt;
&lt;li&gt;这对于在 mac 开发机上打包镜像给生产使用的人来说就是彻底灾难了&lt;/li&gt;
&lt;li&gt;Parallels Desktop 明确提到在做能模拟运行 x86 的虚拟机（发布时间不明），那么或许可以切换 Docker 使用的虚拟机到 PD 来支持运行 x86 架构 image，花钱消灾也是好主意&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;很多库其实可以编译，但是因为不能识别自己所处的环境而无法编译

&lt;ul&gt;
&lt;li&gt;有意思的各家对于 ARM macOS 的 target 到底叫什么意见还不统一&lt;/li&gt;
&lt;li&gt;llvm 的 target 叫 arm64-apple-darwin20.1.0&lt;/li&gt;
&lt;li&gt;ruby 叫 arm64-darwin20&lt;/li&gt;
&lt;li&gt;rust 叫 aarch64-apple-darwin&lt;/li&gt;
&lt;li&gt;node 叫 darwin-arm64&lt;/li&gt;
&lt;li&gt;苹果自己的命名叫 arm64，M1/A14 是 ARMV8.4-A 的基础上增加了 8.5 和 8.6 部分指令的缝合怪&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;根据 Homebrew 的报告，PostgreSQL 最新版完美适配 M1，MySQL 可以用但有小问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装 Ruby"&gt;安装 Ruby&lt;/h2&gt;&lt;h3 id="安装 rbenv"&gt;安装 rbenv&lt;/h3&gt;
&lt;p&gt;我其实一直用 rvm 的，但是由于 rvm 在 macOS 上依赖 Hombrew，所以这里必须使用 rbenv 了。&lt;/p&gt;

&lt;p&gt;需要使用安装脚本安装（而不是推荐的 Homebrew 安装）&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;然后添加环境变量到  &lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="$PATH:$HOME/.rbenv/bin:$HOME/.rbenv/shims"
eval "$(rbenv init -)"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后可以跑一下&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;看看有没有问题，有的话根据提示修一下&lt;/p&gt;

&lt;p&gt;重开 shell&lt;/p&gt;
&lt;h3 id="Hack ruby-build"&gt;Hack ruby-build&lt;/h3&gt;
&lt;p&gt;rbenv 实际是使用 ruby-build 这个 Ruby 的官方编译脚本来编译 Ruby 的，
我们之所以要 hack 是因为 Ruby 依赖 OpenSSL，需要在安装过程中编译 OpenSSL 之前把补丁打上去。&lt;/p&gt;

&lt;p&gt;参考 &lt;a href="https://github.com/rbenv/ruby-build/issues/1456#issuecomment-670051168" rel="nofollow" target="_blank"&gt;https://github.com/rbenv/ruby-build/issues/1456#issuecomment-670051168&lt;/a&gt; 即可，FFI 的问题因为已经解决了，所以只需要这个评论的 OpenSSL 部分&lt;/p&gt;

&lt;p&gt;ruby-build 的位置在 &lt;code&gt;~/.rbenv/plugins/ruby-build/bin/ruby-build&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="安装 autoconf"&gt;安装 autoconf&lt;/h3&gt;
&lt;p&gt;如果是安装 3.0.0-dev 版本的话，还需要 autoconf，由于 Homebrew 暂不可用的缘故，需要自己动手，丰衣足食了&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl http://mirror.team-cymru.com/gnu/autoconf/autoconf-latest.tar.gz --output autoconf-latest.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tar zxvf autoconf-latest.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd autoconf-latest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./configure --prefix=$HOME/opt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;我不喜欢让自己编译的程序污染系统目录如 &lt;code&gt;/usr&lt;/code&gt;，所以我在自己的 Home 下创建了 &lt;code&gt;opt&lt;/code&gt; 目录，存放自己编译的程序，这里还需要把 &lt;code&gt;~/opt/bin&lt;/code&gt; 这个 PATH 添加到 &lt;code&gt;.zshrc&lt;/code&gt; 去，追加 &lt;code&gt;export PATH="$PATH:$HOME/opt/bin"&lt;/code&gt; 即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="编译、安装 Ruby"&gt;编译、安装 Ruby&lt;/h3&gt;
&lt;p&gt;万事俱备后 &lt;code&gt;rbenv install 3.0.0-dev&lt;/code&gt; 即可，装好可以 &lt;code&gt;rbenv global 3.0.0-dev&lt;/code&gt; 切换 ruby 相关命令到刚装好的版本去&lt;/p&gt;
&lt;h2 id="arm64-darwin20 Ruby 的性能表现"&gt;arm64-darwin20 Ruby 的性能表现&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;注意，Apple M1 是 TDP 不超过 28w 的低功耗场景的 CPU&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我们使用 Ruby 3x3 的测试项目 &lt;a href="https://github.com/mame/optcarrot" rel="nofollow" target="_blank"&gt;https://github.com/mame/optcarrot&lt;/a&gt; 来试试看
（该项目在 Ruby 2.0 时 FPS 为 20 左右，3x3 的目标即是做到 FPS 60）&lt;/p&gt;

&lt;p&gt;不开 JIT 的情况&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [arm64-darwin20]
fps: 62.54343294150454
checksum: 59662
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ruby 3x3 超额完成任务！&lt;/p&gt;

&lt;p&gt;开了 JIT&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes --opt
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [arm64-darwin20]
fps: 131.9125859620421
checksum: 59662
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对比我的 2019 MBP 16 寸顶配 2.3 GHz 8-Core Intel Core i9，这是一款 TDP 45w 的 CPU&lt;/p&gt;

&lt;p&gt;不开 JIT 的情况&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [x86_64-darwin20]
jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [x86_64-darwin20]
fps: 46.387448578077674
checksum: 59662
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ruby 3x3 挑战失败&lt;/p&gt;

&lt;p&gt;开了 JIT&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes --opt
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [x86_64-darwin20]
fps: 144.38348249123476
checksum: 59662
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再对比 Dell Precision 7530 移动工作站，Xeon E-2186M 6 核至强、12M 高速缓存、2.90GHz 高达 4.60GHz Turbo、45 W、博锐，这款笔记本的特点就是有三倍 MBP 厚！散热和供电相比 MBP 更充分，根据评测 CPU 的 TDP 可以提升到 65W&lt;/p&gt;

&lt;p&gt;不开 JIT 的情况&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jasl@jasl-precision-7530:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes
ruby 3.0.0dev (2020-12-02T17:42:02Z master 9e73177d53) [x86_64-linux]
fps: 47.55813269580448
checksum: 59662
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开了 JIT&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jasl@jasl-precision-7530:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes --opt
ruby 3.0.0dev (2020-12-02T17:42:02Z master 9e73177d53) [x86_64-linux]
fps: 146.70990328870877
checksum: 59662
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;由于 Apple M1 的资料太少，我只有一个浅显的结论，Apple M1 的设计对于解释型语言非常友好（但是是怎么做到的呢？）&lt;/p&gt;

&lt;p&gt;个人感觉如果有 M1x，那么单核性能应该也就是这样差不多的水平了，首先 macOS 的 CPU 调度算法下能效核心和性能核心不能同时启用，所以理解成这是一个 4 核 CPU 似乎也没问题，这样下来核心数就跟 Intel、AMD 有差距了，此外外围太弱，PCIe 通道数量、MMIO bar 大小（树莓派和 M1 不支持 eGPU 的原因就是这个太小）、USB/雷电 接口数量、多显示器支持、内存大小等等...&lt;/p&gt;

&lt;p&gt;不知道 Intel、AMD 和其他 ARM CPU 厂商会不会借鉴一些 M1 的设计理念，如果会的话，是不是解释型语言的性能表现普遍会有改善？&lt;/p&gt;

&lt;p&gt;TODO：队长希望我测测 Sinatra 的表现，没送到嘴边的测试程序就懒得跑了。。。我要继续肝魔兽。。。&lt;/p&gt;
&lt;h2 id="运行 Rails 的 tips"&gt;运行 Rails 的 tips&lt;/h2&gt;
&lt;p&gt;手头的应用没依赖什么特殊的 C 扩展 gem，有这么几点注意一下就可以完美运行起来了&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nokogiri 可以加 &lt;code&gt;--use-system-libraries&lt;/code&gt; 来安装&lt;/li&gt;
&lt;li&gt;Gemfile 里加 &lt;code&gt;gem "ffi", github: "felipecsl/ffi", submodules: true&lt;/code&gt; 官方发新版前，暂时用这个 fork&lt;/li&gt;
&lt;li&gt;使用 nodenv 编译 NodeJS 15.3.0&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>jasl</author>
      <pubDate>Sat, 28 Nov 2020 09:30:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/40639</link>
      <guid>https://ruby-china.org/topics/40639</guid>
    </item>
    <item>
      <title>RubyConf China 2020 SSR 参会指南</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;线上办会似乎是今年的新时尚，RubyConf China 也不能免俗，经过三个月的低调筹备，本周六日就要正式举办了。&lt;/p&gt;

&lt;p&gt;小提醒：点击目录可以快速跳转&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;时间：2020 年 8 月 15 日 - 16 日&lt;/p&gt;

&lt;p&gt;地点：&lt;a href="http://rubyconfchina.org" rel="nofollow" target="_blank"&gt;http://rubyconfchina.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;人物：Matz 领衔的讲师团、Rubyists、社区的老朋友们、对 Ruby 好奇的新朋友、在看帖子的你&lt;/p&gt;

&lt;p&gt;费用：免费&lt;/p&gt;

&lt;p&gt;参加方式：周六早上 9 点前打开 &lt;a href="http://rubyconfchina.org" rel="nofollow" target="_blank" title=""&gt;官网&lt;/a&gt;，点击“直播间”进入。&lt;/p&gt;
&lt;h3 id="Highlight"&gt;Highlight&lt;/h3&gt;
&lt;p&gt;大会采用 录播+QA 互动 的形式。&lt;/p&gt;

&lt;p&gt;虽然无法线下面基是巨大遗憾，但很荣幸的我们邀请到了几位定于今年圣诞节发布的期待已久的 Ruby 3.0 的关键特性的开发者来大会做客：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matz：Ruby 语言作者，将宏观的介绍 Ruby 3.0 以及 Ruby 语言的未来。&lt;/li&gt;
&lt;li&gt;国分崇志（k0kubun）：负责 JIT，亲自介绍 Ruby JIT 相关的技术内幕和进展。&lt;/li&gt;
&lt;li&gt;Samuel Williams（ioquatix）：负责 &lt;a href="https://bugs.ruby-lang.org/issues/16786" rel="nofollow" target="_blank" title=""&gt;轻量级调度器&lt;/a&gt;（有望突破性提升 Ruby 的 IO 性能），亲自介绍相关的技术内幕和进展。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为了参会者更好的理解这几场重要演讲，大会的志愿者们提前听译准备了中文字幕！&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;作为前大会组织者我非常激动，我提前看了 k0kubun 的分享，是独家的全新内容，在 &lt;a href="/dsh0416" class="user-mention" title="@dsh0416"&gt;&lt;i&gt;@&lt;/i&gt;dsh0416&lt;/a&gt; 的努力协调下，RubyConf China 在内容上第一次领先了其他地区的 Ruby 会议！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="周边商城"&gt;周边商城&lt;/h3&gt;
&lt;p&gt;每年不同图案的纪念衫已经成为了 RubyConf China 文化的一部分（特别感谢 &lt;a href="/cassiuschen" class="user-mention" title="@cassiuschen"&gt;&lt;i&gt;@&lt;/i&gt;cassiuschen&lt;/a&gt; 的无穷灵感）。&lt;/p&gt;

&lt;p&gt;由于本届大会免费，就不能像往届一样赠送纪念了，我们决定挑战一个刺激的，这次大会准备了若干款式的 T 恤和卫衣，还有帽子、购物袋作为周边！&lt;/p&gt;

&lt;p&gt;仍然交给往届的合作方 T 社 负责生产，由 友好速搭 负责销售平台的技术和运营工作，值得一提这两家也都是使用 Ruby 技术的公司，是社区的骄傲～（提供大会官网服务的上线了也是！）&lt;/p&gt;

&lt;p&gt;商品定价为公益性质，产生的微小盈利将用于支持 RubyChina 社区运作。&lt;/p&gt;

&lt;p&gt;总之，大家记得去 &lt;a href="https://rubyconfstore.wodavip.com" rel="nofollow" target="_blank"&gt;https://rubyconfstore.wodavip.com&lt;/a&gt; 捧场～&lt;/p&gt;
&lt;h3 id="有奖互动"&gt;有奖互动&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;由衷的感谢大会的赞助商们，除了帮助大会能够成行，还提供了各种精美礼品。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;在收听分享过程中可以随时在微信群、Gitter、Telegram 上提出问题，大会的工作人员会将问题整理，在 QA 环节有请讲师解答，被选中的提问者都将获得由赞助商赞助的礼品。&lt;/p&gt;

&lt;p&gt;此外，本次大会有请到了 matz、k0kubun、ioquatix 三位 Ruby core dev，他们将要在大会上分享的内容不能剧透，但是，来都来了，关于 Ruby 3.0 或者其他技术问题，不好好问问怎么行呢？&lt;strong&gt;如果你对他们负责的领域有问题，请直接回复在帖子下方，我们会从中整理、挑选后请这几位讲师来作答。&lt;/strong&gt;&lt;/p&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;RubyChina 赞助的纪念 T 恤&lt;/li&gt;
&lt;li&gt;UCloud、金数据赞助的代金券&lt;/li&gt;
&lt;li&gt;JetBrains 赞助的 RubyMine 一年的订阅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;注：每种奖品数量有限，送完即止&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="日程/宣传海报"&gt;日程/宣传海报&lt;/h3&gt;
&lt;p&gt;希望大家帮忙转发～&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/42fe2dc0-491a-46a1-9629-521ebb9fd97c.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="录像"&gt;录像&lt;/h3&gt;
&lt;p&gt;大会结束后会将录像上传到 YouTube，由于一些不可抗原因，国内的视频平台会更晚一点上传。&lt;/p&gt;
&lt;h3 id="其他"&gt;其他&lt;/h3&gt;
&lt;p&gt;如果有问题或者其他需要补充的内容，请提醒我&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Thu, 13 Aug 2020 05:23:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/40272</link>
      <guid>https://ruby-china.org/topics/40272</guid>
    </item>
    <item>
      <title>为 FlowCore 添加了高层工作流抽象</title>
      <description>&lt;p&gt;接 &lt;a href="https://ruby-china.org/topics/39520" title=""&gt;FlowCore - SaaS 快速开发套件之工作流引擎&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FlowCore 发布之后，我着手做一个 BPM/OA 的 Gem，也就是之前提的 FlowKit，做的过程中发现了一些问题非常卡手，所以我决定根据实践过程中的问题改进一下。&lt;/p&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;p&gt;我发现在 PetriNet 这一层并不容易解决这些问题，并且我和一些人沟通的过程中发现理解 PetriNet 概念并不容易，所以我希望能够尽可能的屏蔽他，于是我引入了一层新的抽象 —— Pipeline。&lt;/p&gt;

&lt;p&gt;当然这并不是我否定了 PetriNet，
Pipeline 和 PetriNet 的关系类似 ActiveRecord 和 Arel，AR 的查询界面实际上是对 Arel 的包装，为了易用性并没有充分暴露 Arel 的全部功能，绝大多数情况下 AR 提供的功能足矣，极端复杂的情况下可以绕过 AR 直接使用 Arel，但是此时要自行承担风险。&lt;/p&gt;

&lt;p&gt;Pipeline 牺牲了一些表达能力下换来了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;简化概念，只有&lt;code&gt;步骤（Step）&lt;/code&gt;一种元素&lt;/li&gt;
&lt;li&gt;易于实现可视化编辑器&lt;/li&gt;
&lt;li&gt;易于验证，绝大多数情况下 Pipeline 的定义都是合法的&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;编辑好的 Pipeline 可以被编译成 PetriNet，用于真正的执行。&lt;/p&gt;

&lt;p&gt;我以组织大会拉赞助的流程（实际不是这样子的哈～）为例：&lt;/p&gt;

&lt;p&gt;编辑器（使用 GraphViz 绘制出来的）：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/7aa2a677-c61a-4328-b132-378e3a453578.jpg!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/2020/1b49f5b9-560c-45be-ad85-2113bfea5300.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;最终会编译到 PetriNet&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/ad8ec09e-711c-4259-8499-6b3425887b2a.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;很直观吧？也不用了解 PetriNet 的那些规则了。&lt;/p&gt;

&lt;p&gt;Pipeline 的步骤（&lt;code&gt;Step&lt;/code&gt;）被设计成可利用 STI 扩展的，但是核心有五种步骤类型：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;任务（&lt;code&gt;Task&lt;/code&gt;）：执行业务逻辑的节点&lt;/li&gt;
&lt;li&gt;排他性分支（&lt;code&gt;Exclusive Choice&lt;/code&gt;）：类似编程语言的 &lt;code&gt;if...elsif...else&lt;/code&gt;，如果有满足条件的分支则跳入，否则会进入默认分支，圆角矩形为分支，分支可附着条件（&lt;code&gt;Guard&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;并行分支（&lt;code&gt;Parallel Split&lt;/code&gt;）：同时执行多个分支的逻辑，当所有分支的步骤都执行完后，才会继续&lt;/li&gt;
&lt;li&gt;跳转（&lt;code&gt;Redirection&lt;/code&gt;）：跳转到其他节点，实现类似驳回后订正然后重新提交的流程。&lt;/li&gt;
&lt;li&gt;结束（&lt;code&gt;End&lt;/code&gt;）：跳转到结束流程&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;只有 &lt;code&gt;跳转&lt;/code&gt; 有特别规则：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;流程主干不能有跳转步骤，否则流程就永远不可能结束了&lt;/li&gt;
&lt;li&gt;不能跳转到同一个分支下的其他步骤，否则就会产生死循环或者死节点&lt;/li&gt;
&lt;li&gt;有一些步骤类型被标记为屏障（&lt;code&gt;barrier_step&lt;/code&gt;，当前只有 &lt;code&gt;并行分支&lt;/code&gt; 是），不能跳转到屏障外的步骤去，否则业务上就说不通了&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当然也不用特别记，这些规则实现在代码里了，包括在配置界面上也只能选择有效的步骤进行。&lt;/p&gt;

&lt;p&gt;我已经翻新了 Dummy 应用，把半成品 FlowKit 塞了进去，可以玩玩，但是还有很多工作没完成，后边要准备 RubyConf 了，所以先把最近的成果放出来。&lt;/p&gt;

&lt;p&gt;我主要是想把想法先给实现出来然后验证，做到一半发现一些开始的设计可能有问题，
如果有兴趣研究或者采用的话，我有一些地方需要帮助：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据库表设计需要优化&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pipeline 由 &lt;code&gt;Pipeline&lt;/code&gt;、&lt;code&gt;Step&lt;/code&gt;、&lt;code&gt;Branch&lt;/code&gt; 三个模型组成，大致可描述为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Step&lt;/code&gt; （多分支步骤）可以有多个 &lt;code&gt;Branches&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Step&lt;/code&gt; (如果在一个分支内）属于一个 &lt;code&gt;Branch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Branch&lt;/code&gt; 有多个 &lt;code&gt;Steps&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Step&lt;/code&gt; 自身也是一个树状结构，使用 &lt;code&gt;ancestry&lt;/code&gt; gem 维护&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Step&lt;/code&gt; 的顺序由 &lt;code&gt;acts_as_list&lt;/code&gt; 维护&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;表的设计以及查询的使用应该有优化空间&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;编译到 PetriNet 的代码有很大优化空间&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;入口代码：&lt;a href="https://github.com/rails-engine/flow_core/blob/master/app/models/flow_core/pipeline.rb#L21" rel="nofollow" target="_blank"&gt;https://github.com/rails-engine/flow_core/blob/master/app/models/flow_core/pipeline.rb#L21&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这段代码我测试过，虽然正确工作（几乎吧），但是我自己并不满意。&lt;/p&gt;

&lt;p&gt;困难点在于，&lt;code&gt;Step&lt;/code&gt; 编译出来的 PetriNet 片段，结尾有可能是 &lt;code&gt;Place&lt;/code&gt; 或者 &lt;code&gt;Transition&lt;/code&gt;，同时 &lt;code&gt;Step&lt;/code&gt; 跟 &lt;code&gt;Step&lt;/code&gt; 产生的 PetriNet 片段要连接，这里就有很多种可能的情况要处理了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;处理步骤的移动&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;比如 跳转节点 的移动是有规则的，所以得提供个 &lt;code&gt;move&lt;/code&gt; 方法去处理移动，以及暴露可以移动到哪些步骤的前或后 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GraphViz 的可视化排版并不美观，绘制代码比较乱&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;代码在：&lt;a href="https://github.com/rails-engine/flow_core/blob/master/test/dummy/app/overrides/models/flow_core/pipeline_override.rb" rel="nofollow" target="_blank"&gt;https://github.com/rails-engine/flow_core/blob/master/test/dummy/app/overrides/models/flow_core/pipeline_override.rb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我使用 GraphViz 主要是因为不会写前端...而且前端工作量太大&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;其他我没想到的点&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;欢迎给出意见或者问题...&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Mon, 25 May 2020 08:01:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/39896</link>
      <guid>https://ruby-china.org/topics/39896</guid>
    </item>
    <item>
      <title>Ruby 刚和热点擦肩而过。。。</title>
      <description>&lt;p&gt;昨天老婆给我讲了肖战八卦，这人我是完全没听过...事儿...我也是听她讲才知道，顺手搜了一下那个网站&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zh.wikipedia.org/wiki/AO3%E4%BD%9C%E5%93%81%E5%BA%93" rel="nofollow" target="_blank"&gt;https://zh.wikipedia.org/wiki/AO3%E4%BD%9C%E5%93%81%E5%BA%93&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;看到这么一句&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AO3 作品库的开源代码几乎完全由志愿者在 Ruby on Rails 网站应用框架中编写。该站点的开发人员允许用户通过 Trello 板提交对站点功能的需求。[4]AO3 作品库当前拥有大约 700 名志愿者。[8]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;要素察觉：Rails、开源模式开发、代码托管 Github（ &lt;a href="https://github.com/otwcode/otwarchive" rel="nofollow" target="_blank"&gt;https://github.com/otwcode/otwarchive&lt;/a&gt; ）&lt;/p&gt;

&lt;p&gt;这可真潮&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Mon, 02 Mar 2020 22:16:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/39554</link>
      <guid>https://ruby-china.org/topics/39554</guid>
    </item>
    <item>
      <title>FlowCore - SaaS 快速开发套件之工作流引擎</title>
      <description>&lt;p&gt;项目地址：&lt;a href="https://github.com/rails-engine/flow_core" rel="nofollow" target="_blank"&gt;https://github.com/rails-engine/flow_core&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;由于 Ruby/Rails 在这个领域没有很好的积累，导致在这些场景下，语言和技术本身的高生产力的优点也就无法得到释放。&lt;/p&gt;

&lt;p&gt;我要来补上这一块。&lt;/p&gt;

&lt;p&gt;大约一年半前，我写了 &lt;a href="https://ruby-china.org/topics/37555" title=""&gt;WorkflowCore&lt;/a&gt;，后来我用这个 Gem 实施了几个项目，也发现了一些问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;错误的理解了 PetriNet&lt;/li&gt;
&lt;li&gt;对于国内 BPM（OA）项目对于流程特殊需求（如复杂的指派规则）缺乏经验&lt;/li&gt;
&lt;li&gt;设计过于简陋，没有屏蔽细节，只能说是经验分享而不能成为一个可使用的 Gem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;春节期间，成功的鼓（fu）动（you）了 &lt;a href="/hooopo" class="user-mention" title="@hooopo"&gt;&lt;i&gt;@&lt;/i&gt;hooopo&lt;/a&gt;  一起学习 PetriNet（主要是让高材生学完教我 &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; ）和工作流引擎的设计思路，重新完成了一个版本。
炮哥的版本已经先发了，我们基本使用了相同的 PetriNet 的表结构设计，但是在上层的设计有很大的差异，方便交流，我还是把这个版本完成了。
当然我对我的版本有充分自信！&lt;/p&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;&lt;h3 id="基于 ActiveRecord，不限制数据库"&gt;基于 ActiveRecord，不限制数据库&lt;/h3&gt;
&lt;p&gt;数据模型全部是标准的 AR 模型，没有也不需要用到任何数据库特殊功能，所以对数据库没有限制&lt;/p&gt;
&lt;h3 id="容易扩展和魔改"&gt;容易扩展和魔改&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;这可能是我在去年体会最深的一点... 帮某公司实施了一套 OA，投产前提出一系列黑人问号的流转要求，听上去又很合理（光指派就加了根据表单数据指定发起人，根据发起人所在部门指定特定级别的领导等等），又让我想到谈需求的时候甲方就提了一堆流转规则，我到家查了查发现是 Jaba 那边 Activiti 也要魔改才能解决的... 还好 WorkflowCore 原理简单解决这些需求并不会让代码变脏&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;体现在几点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;跟业务有相关性的模型都提前添加了 &lt;code&gt;type&lt;/code&gt; 字段，也就是说可以也鼓励通过 Rails 标准的 单表继承（STI）方法来扩展&lt;/li&gt;
&lt;li&gt;官方指南 &lt;a href="https://guides.rubyonrails.org/engines.html#improving-engine-functionality" rel="nofollow" target="_blank" title=""&gt;Improving engine functionality - Getting Started with Engines&lt;/a&gt; 提到增强 Engine 功能的技巧同样可用&lt;/li&gt;
&lt;li&gt;充分的提供了各种钩子&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="基于 Petri-net"&gt;基于 Petri-net&lt;/h3&gt;
&lt;p&gt;虽然 Petri-net 流派这些年式微了，这种方法也确实比较底层，不如 BPMN 或者类似的基于活动（Activity-based）的方案直观容易被理解，但另一方面是他的表达能力更强，掌握仅有的几条规则后，就可以表达非常复杂的流转了。&lt;/p&gt;

&lt;p&gt;Petri-net 可以被映射到 Activity 去，这个在我的后续计划里，搞定会容易实现拖拉拽编辑器&lt;/p&gt;
&lt;h3 id="定义检查"&gt;定义检查&lt;/h3&gt;
&lt;p&gt;工作流可以创建实例前需要经过验证，FlowCore 提供了相关的约束和基础设施。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;目前只做了一些基础检查，比如图的连通性，实际这个问题非常复杂，请 &lt;a href="/luikore" class="user-mention" title="@luikore"&gt;&lt;i&gt;@&lt;/i&gt;luikore&lt;/a&gt; 帮忙了，&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="工作流调度将应用端和引擎内部隔离，屏蔽了内部细节"&gt;工作流调度将应用端和引擎内部隔离，屏蔽了内部细节&lt;/h3&gt;
&lt;p&gt;在调度过程中，工作流引擎内部要维护比较复杂的状态，通过 Rails 多态关联和一些基本的 OOP 技巧，
内部的状态管理不会泄漏到应用端实现的用户任务上。&lt;/p&gt;
&lt;h3 id="提供了异常状态和暂停的支持"&gt;提供了异常状态和暂停的支持&lt;/h3&gt;
&lt;p&gt;工作流在运行过程中，是存在可能性如用户状态的变化，使得工作流流转下去的前提被破坏，
导致流转被卡住，FlowCore 提供了将当前任务设置为异常的功能，这样可以保存现场，同时给方便提供给用户友善的提示。&lt;/p&gt;

&lt;p&gt;暂停流转在非交互流转上可能会用到，同样提供了支持。&lt;/p&gt;
&lt;h3 id="提供 DSL 来部署流程"&gt;提供 DSL 来部署流程&lt;/h3&gt;
&lt;p&gt;来自 &lt;a href="/dsh0416" class="user-mention" title="@dsh0416"&gt;&lt;i&gt;@&lt;/i&gt;dsh0416&lt;/a&gt; 的贡献，赞美队长，我做了一些改动。&lt;/p&gt;

&lt;p&gt;大概长这样：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FlowCore&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Definition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Timed split"&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;net&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_place&lt;/span&gt; &lt;span class="ss"&gt;:start&lt;/span&gt;
  &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end_place&lt;/span&gt; &lt;span class="ss"&gt;:end&lt;/span&gt;

  &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transition&lt;/span&gt; &lt;span class="ss"&gt;:t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;input: :start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;output: :p&lt;/span&gt;
  &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transition&lt;/span&gt; &lt;span class="ss"&gt;:t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;input: :p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;output: :end&lt;/span&gt;
  &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transition&lt;/span&gt; &lt;span class="ss"&gt;:t3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;input: :start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;output: :end&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;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_trigger&lt;/span&gt; &lt;span class="no"&gt;TransitionTriggers&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Timer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;countdown_in_seconds: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deploy!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;清爽！&lt;/p&gt;
&lt;h2 id="和 Hooopo 的 PetriFlow 的差别"&gt;和 Hooopo 的 &lt;a href="https://github.com/hooopo/petri_flow" rel="nofollow" target="_blank" title=""&gt;PetriFlow&lt;/a&gt; 的差别&lt;/h2&gt;
&lt;p&gt;最本质的区别在于，FlowCore 只解决工作流最本质的问题：&lt;strong&gt;定义和调度&lt;/strong&gt;，
PetriFlow 则把指派、表单、分支条件判断等全部实现了。&lt;/p&gt;

&lt;p&gt;我不是很赞同这个观点，这种贴近业务的功能，我最大的担心就是简单需求太复杂，奇葩场景不够用，
此外增加了 Gem 本身的复杂度。&lt;/p&gt;

&lt;p&gt;但这些问题确实是要解决的，我的做法是核心提供够用的扩展机制，
之后我会在 FlowCore 之上实现一个 FlowKit 来实现这些功能，
如果 FlowKit 里提供的不能满足需要，可以继承或者利用基础设施开发自己的，
通过分层来解决问题。&lt;/p&gt;
&lt;h2 id="Dummy App"&gt;Dummy App&lt;/h2&gt;
&lt;p&gt;作为最基本的演示，项目里包含了一个 Dummy app，里面演示了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;列出工作流定义，可视化，Trigger 配置&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;p&gt;启动方法参考 repo 里的说明，注意需要安装 &lt;code&gt;graphviz&lt;/code&gt;（支持流程图可视化用的），没有会报错&lt;/p&gt;
&lt;h2 id="架构"&gt;架构&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/49f313b6-8ef7-4ef7-9e19-a82818790c54.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;最底下一层 PetriNet 和 Scheduling 的实现基本来自 &lt;a href="https://www.tonymarston.net/php-mysql/workflow.html" rel="nofollow" target="_blank"&gt;https://www.tonymarston.net/php-mysql/workflow.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;中间的抽象层是需要集成的应用实现的部分：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ArcGuard：Arc 是 Transition 到 Place 的连线，ArcGuard 决定连线是否可走，比如 &lt;code&gt;请假时间 &amp;gt; 10 天&lt;/code&gt; 则放行之类的逻辑&lt;/li&gt;
&lt;li&gt;TransitionTrigger：一个 Transition 可以关联一个 Trigger，Trigger 就是负责真正业务的对象啦，它存储业务规则配置，还有在指定的时机去执行业务逻辑&lt;/li&gt;
&lt;li&gt;TaskExecutable：这是一个 mixin，引入的应用端的 Model 便可以关联到工作流引擎的 Task 去（可以视为子任务或者依赖任务），由 Trigger 负责创建，TaskExecutable 完成后，工作流的 Task 才可完成，并继续流程。这个是用来实现如审批任务的&lt;/li&gt;
&lt;li&gt;TransitionCallback：一个 Transition 可以关联多个 Callback，在 Callback 指定的时间点会被调用，解决发送通知之类的与具体业务无关的逻辑（这里还是可以拿到 Task 对象，所以根据 Task 内部有不同逻辑也是可以的）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FlowKit 是计划中的项目，因为 FlowCore 并不解决真实业务的需求，这些将在 FlowKit 里实现（应该会覆盖 PetriFlow 和我之前 WorkflowCore 的所有功能），
对于非常复杂的功能，我可能考虑卖 Pro 版&lt;/p&gt;
&lt;h2 id="工作流实例的生命周期"&gt;工作流实例的生命周期&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/8e0711ef-5a2f-4187-bb06-a8a9b0aaf4a0.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="用法"&gt;用法&lt;/h2&gt;&lt;h3 id="集成"&gt;集成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;添加 &lt;code&gt;gem "flow_core"&lt;/code&gt;到 &lt;code&gt;Gemfile&lt;/code&gt;，运行 &lt;code&gt;bundle&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;rails flow_core_engine:install:migrations&lt;/code&gt; 创建需要的 migration，运行 &lt;code&gt;rails db:migrate&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="定义和部署工作流"&gt;定义和部署工作流&lt;/h3&gt;
&lt;p&gt;目前提供了 DSL 来创建，代码可以参考
 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/db/seeds.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/db/seeds.rb&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;更复杂的例子可以参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/internal_workflow.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/internal_workflow.rb&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="运行工作流"&gt;运行工作流&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;workflow.create_instance!&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="实现 ArcGuard"&gt;实现 ArcGuard&lt;/h3&gt;
&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/arc_guards/dentaku.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/arc_guards/dentaku.rb&lt;/a&gt; 
这里实现了一个使用 &lt;a href="https://github.com/rubysolo/dentaku" rel="nofollow" target="_blank" title=""&gt;Dentaku&lt;/a&gt; 做表达式判断的例子&lt;/p&gt;
&lt;h3 id="实现 TransitionTrigger"&gt;实现 TransitionTrigger&lt;/h3&gt;
&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/transition_triggers/timer.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/transition_triggers/timer.rb&lt;/a&gt; 实现一个定时器任务（可以用来实现超时过期这样的流转）&lt;/p&gt;

&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/transition_triggers/user_task.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/transition_triggers/user_task.rb&lt;/a&gt; 实现了一个简单的用户任务和指派功能&lt;/p&gt;
&lt;h3 id="实现 TransitionCallback"&gt;实现 TransitionCallback&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/transition_callbacks/notification.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/transition_callbacks/notification.rb&lt;/a&gt; 实现了一个简单的任务创建后给处理人发送通知的 Callback&lt;/p&gt;
&lt;h3 id="实现 TaskExecutable"&gt;实现 TaskExecutable&lt;/h3&gt;
&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/user_task.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/user_task.rb&lt;/a&gt; 实现的简单的用户任务，&lt;/p&gt;

&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/approval_task.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/approval_task.rb&lt;/a&gt; 实现的审批任务，完成时设置变量给 Task，以便 ArcGuard 使用&lt;/p&gt;
&lt;h3 id="扩展 Workflow"&gt;扩展 Workflow&lt;/h3&gt;
&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/models/internal_workflow.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/models/internal_workflow.rb&lt;/a&gt; 在 Workflow 模型上利用 STI 创造了 InternalWorkflow 这一子类。&lt;/p&gt;

&lt;p&gt;参考 &lt;a href="https://github.com/rails-engine/flow_core/tree/master/test/dummy/app/overrides/models/flow_core/workflow_override.rb" rel="nofollow" target="_blank" title=""&gt;test/dummy/app/overrides/models/flow_core/workflow_override.rb&lt;/a&gt; 利用标准的 Rails 技巧增强 Workflow 的功能，这里是添加了生成可视化流程图。&lt;/p&gt;
&lt;h2 id="PetriNet 规则入门"&gt;PetriNet 规则入门&lt;/h2&gt;
&lt;p&gt;PetriNet 只有五条规则，掌握后就可以表达几乎所有的  &lt;a href="http://workflowpatterns.com/" rel="nofollow" target="_blank" title=""&gt;Workflow pattern&lt;/a&gt; 也就是人们总结出来的所有可能的流转方式&lt;/p&gt;
&lt;h3 id="AND split"&gt;AND split&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/e8dbf50a-0700-4e63-b0e7-d963811137ab.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;注意连线上没有 Guard，这种情况下，当迁移执行完会产生两个 Token 到两个 Place 去，也就是说实现了并发流程。&lt;/p&gt;

&lt;p&gt;例子：组织活动，物资组采购物资、场务组安排活动流程、志愿者组安排工作人员部署，这三个流程是同时进行的&lt;/p&gt;
&lt;h3 id="And join"&gt;And join&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/ec7369eb-741a-4e78-9cd1-dc081bc895b6.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;搭配 And split 使用，意思是，当图中两个 Place 上边都有 Token 后，才可以继续。&lt;/p&gt;

&lt;p&gt;例子：接 And join 的例子，三个流程都执行完，才能进入彩排&lt;/p&gt;

&lt;p&gt;这个是最需要注意的，多个驳回应该指向一个已驳回 Place，而不是分别 组长驳回、HR 驳回... 否则就会卡住&lt;/p&gt;
&lt;h3 id="Explicit OR split"&gt;Explicit OR split&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/5837cb95-a7d5-459d-99fb-a7bd6acd8d85.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;没啥好说的，根据条件走不同的分支&lt;/p&gt;
&lt;h3 id="Implicit OR split"&gt;Implicit OR split&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/1c61b742-5009-43f6-b772-c560a20de943.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;简单的理解就是，两个分支都会走，谁先完成就干掉没完成的，最典型的用途就是超时处理&lt;/p&gt;
&lt;h3 id="OR join (explicit and implicit)"&gt;OR join (explicit and implicit)&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/777fb3f0-a5f8-4dfe-803f-5e14c765965f.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;没啥好说的，通常是配合 Explicit OR split 使用&lt;/p&gt;
&lt;h3 id="典型的流程图"&gt;典型的流程图&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/83d7686d-22c2-4422-8ebd-c7bed96b369a.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="最后"&gt;最后&lt;/h2&gt;
&lt;p&gt;MRGA !!!&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Thu, 20 Feb 2020 01:38:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/39520</link>
      <guid>https://ruby-china.org/topics/39520</guid>
    </item>
    <item>
      <title>RubyConf China 2019 - Elixir 容器化部署</title>
      <description>&lt;p&gt;Elixir 容器化部署 by 周辉庆&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;介绍我们的项目，是如何一步步从常规部署方式，走向容器化部署。涉及容器化之前的部署方式、容器化之 docker、更进一步的 docker-compose、CI / CD Pipeline 集成、CI / CD Pipeline 多环境、CI / CD Pipeline 的优化、Docker Swarm 等内容&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YouTube &lt;/p&gt;

&lt;p&gt;Slide &lt;a href="https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/Elixir%20%20-%20%E5%91%A8%E8%BE%89%E5%BA%86.pdf" rel="nofollow" target="_blank"&gt;https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/Elixir%20%20-%20周辉庆.pdf&lt;/a&gt;容器化部署&lt;/p&gt;

&lt;p&gt;播放列表 &lt;a href="https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7" rel="nofollow" target="_blank"&gt;https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 28 Aug 2019 03:27:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/38989</link>
      <guid>https://ruby-china.org/topics/38989</guid>
    </item>
    <item>
      <title>RubyConf China 2019 - 保障基于 Rails 的 SaaS 应用的 SLA</title>
      <description>&lt;p&gt;保障基于 Rails 的 SaaS 应用的 SLA by 冯智超&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SLA 是 Rails 应用服务的重要指标，监控和报警是保障 SLA 必不可少的环境。本 session 结合金数据在 SLA 上的实践，在 Rails 系统云上监控和报警总结了一些经验和教训。包含：基础设施监控、服务监控、后台任务监控、业务监控、风险监控、报警和响应等。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YouTube &lt;/p&gt;

&lt;p&gt;Slide &lt;a href="https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/%E4%BF%9D%E9%9A%9C%E5%9F%BA%E4%BA%8E%20Rails%20%E7%9A%84%20SaaS%20%E5%BA%94%E7%94%A8%E7%9A%84%20SLA%20-%20%E5%86%AF%E6%99%BA%E8%B6%85.pdf" rel="nofollow" target="_blank"&gt;https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/%E4%BF%9D%E9%9A%9C%E5%9F%BA%E4%BA%8E%20Rails%20%E7%9A%84%20SaaS%20%E5%BA%94%E7%94%A8%E7%9A%84%20SLA%20-%20%E5%86%AF%E6%99%BA%E8%B6%85.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;播放列表 &lt;a href="https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7" rel="nofollow" target="_blank"&gt;https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 28 Aug 2019 03:26:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/38988</link>
      <guid>https://ruby-china.org/topics/38988</guid>
    </item>
    <item>
      <title>RubyConf China 2019 - 从 Assets Pipeline 到 Webpack，Rails 6 的新前端方案们</title>
      <description>&lt;p&gt;从 Assets Pipeline 到 Webpack，Rails 6 的新前端方案们 by 过纯中&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;从 Rails 5.1 开始 Webpack 逐渐替换 Assets Pipeline，本演讲从实际使用角度分享一些实际使用 Webpacker 的经验，以及一些常用前端的集成经验。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YouTube &lt;/p&gt;

&lt;p&gt;Slide &lt;a href="https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/%E4%BB%8E%20Assets%20Pipeline%20%E5%88%B0%20Webpack%EF%BC%8CRails%206%20%E7%9A%84%E6%96%B0%E5%89%8D%E7%AB%AF%E6%96%B9%E6%A1%88%E4%BB%AC%20-%20%E8%BF%87%E7%BA%AF%E4%B8%AD.pdf" rel="nofollow" target="_blank"&gt;https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/%E4%BB%8E%20Assets%20Pipeline%20%E5%88%B0%20Webpack%EF%BC%8CRails%206%20%E7%9A%84%E6%96%B0%E5%89%8D%E7%AB%AF%E6%96%B9%E6%A1%88%E4%BB%AC%20-%20%E8%BF%87%E7%BA%AF%E4%B8%AD.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;播放列表 &lt;a href="https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7" rel="nofollow" target="_blank"&gt;https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 28 Aug 2019 03:24:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/38987</link>
      <guid>https://ruby-china.org/topics/38987</guid>
    </item>
    <item>
      <title>RubyConf China 2019 - 在分发过程中保护 Ruby 代码版权</title>
      <description>&lt;p&gt;在分发过程中保护 Ruby 代码版权 by 东仙队长&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;如同所有解释型语言一样，Ruby 项目的源码在分发过程中很容易被阅读。如果产品需要提供自托管部署，便很难保护项目的版权。本 Talk 将总结现有的保护源码的方式，并尝试引入一些新的技巧来保护源代码的版权。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YouTube&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/bI8bsKjiV9w" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Slide &lt;/p&gt;

&lt;p&gt;播放列表 &lt;a href="https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7" rel="nofollow" target="_blank"&gt;https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 28 Aug 2019 03:23:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/38986</link>
      <guid>https://ruby-china.org/topics/38986</guid>
    </item>
    <item>
      <title>RubyConf China 2019 - PostgreSQL 11 与 12 用户最关心的特性解读</title>
      <description>&lt;p&gt;PostgreSQL 11 与 12 用户最关心的特性解读 by 德哥&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;解读 PostgreSQL 最新版本 11 与 12 的新特性、为什么 PG 可以蝉联两届 dbengine 年度数据库、为什么 PG 是最适合去 O 的企业级开源数据库。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YouTube &lt;/p&gt;

&lt;p&gt;Slide &lt;a href="https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/PostgreSQL%2011%20%E4%B8%8E%2012%20%E7%94%A8%E6%88%B7%E6%9C%80%E5%85%B3%E5%BF%83%E7%9A%84%E7%89%B9%E6%80%A7%E8%A7%A3%E8%AF%BB%20-%20%E5%BE%B7%E5%93%A5.pdf" rel="nofollow" target="_blank"&gt;https://github.com/ruby-china/RubyConfChina2019Slides/blob/master/PostgreSQL%2011%20%E4%B8%8E%2012%20%E7%94%A8%E6%88%B7%E6%9C%80%E5%85%B3%E5%BF%83%E7%9A%84%E7%89%B9%E6%80%A7%E8%A7%A3%E8%AF%BB%20-%20%E5%BE%B7%E5%93%A5.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;播放列表 &lt;a href="https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7" rel="nofollow" target="_blank"&gt;https://www.youtube.com/playlist?list=PLTUHmtFhYC6gTwE8cXJdcEXFQOA5GfYJ7&lt;/a&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Wed, 28 Aug 2019 03:20:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/38985</link>
      <guid>https://ruby-china.org/topics/38985</guid>
    </item>
    <item>
      <title> [上海][8-24,25] RubyConf China 2019 参会指南</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;对于上海不是很熟悉，有错误的麻烦指出我更正，另外有什么希望补充的请提&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;本周六（2019 年 8 月 24 日），大会就要正式召开了，犹豫的同学不用犹豫了，速速购票参加！&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;时间：2019 年 8 月 24 日 - 25 日&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;地点：上海市杨浦区佳木斯路 777 号 小南国花园酒店&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;购票链接：&lt;a href="https://wx.duohui.co/event/7691" rel="nofollow" target="_blank"&gt;https://wx.duohui.co/event/7691&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="关于地点和交通"&gt;关于地点和交通&lt;/h2&gt;
&lt;p&gt;最近的地铁站是 &lt;strong&gt;8 号线 黄兴公园站&lt;/strong&gt;，出地铁走路五分钟左右即可，对于从外地过来的参会者，虹桥和浦东都可，交通上都是地铁转一趟，据说虹桥更近。&lt;/p&gt;
&lt;h2 id="活动时间"&gt;活动时间&lt;/h2&gt;
&lt;p&gt;周六：8:00 - 9:00，因为早上有 Matz 的开场演讲，请大家尽量准时&lt;/p&gt;

&lt;p&gt;周日：8:30 - 9:15，玩累了多睡会，&lt;strong&gt;早上我在会场外会摆放好一些饼干蛋糕，来不及吃早饭可以直接来会场简单填填肚子&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;两天下午都是 5 点左右结束。&lt;/p&gt;
&lt;h2 id="日程安排"&gt;日程安排&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://ruby-china.org/topics/38696" title=""&gt;讲师和主题介绍&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Day 1 上午&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;08:00 - 09:00 入场&lt;/li&gt;
&lt;li&gt;09:00 - 09:15 开场&lt;/li&gt;
&lt;li&gt;09:30 - 11:00 The future of Ruby&lt;/li&gt;
&lt;li&gt;11:00 - 11:45 在分发过程中保护 Ruby 代码版权 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Day 1 下午&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;13:30 - 14:15 Leadership Master Class: Adaptable Human&lt;/li&gt;
&lt;li&gt;14:25 - 15:15 PostgreSQL 11 与 12 用户最关心的特性解读&lt;/li&gt;
&lt;li&gt;15:15 - 15:45 茶歇&lt;/li&gt;
&lt;li&gt;15:45 - 16:30 薄荷 Rails 事务处理实践&lt;/li&gt;
&lt;li&gt;16:40 - 17:15 保障基于 Rails 的 SaaS 应用的 SLA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Day 2 上午&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;08:30 - 09:00 入场&lt;/li&gt;
&lt;li&gt;09:30 - 10:15 为 五年陈酿 20 万行 Ruby 代码的云端革新经验&lt;/li&gt;
&lt;li&gt;10:25 - 11:05 如何用 Rails 支撑一个千万用户的区块链钱包服务&lt;/li&gt;
&lt;li&gt;11:15 - 12:05 Elixir 容器化部署 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Day 2 下午&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;13:30 - 14:15 从 Assets Pipeline 到 Webpack，Rails 6 的新前端方案们&lt;/li&gt;
&lt;li&gt;14:25 - 15:10 Ruby 项目秒级报表生成篇&lt;/li&gt;
&lt;li&gt;15:10 - 15:30 茶歇&lt;/li&gt;
&lt;li&gt;15:30 - 16:15 Ruby 实现 GraphQL 入门和实践&lt;/li&gt;
&lt;li&gt;16:15 - 17:00 Bootstrapping a New Language with Ruby&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="夜生活"&gt;夜生活&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/b774fb12-df20-42a0-89bc-f5856d80614e.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;还请上海的朋友们踊跃介绍可玩的地方~&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Tue, 20 Aug 2019 14:36:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/38959</link>
      <guid>https://ruby-china.org/topics/38959</guid>
    </item>
    <item>
      <title>Rails 6.0 正式发布</title>
      <description>&lt;p&gt;官方博文：&lt;a href="https://weblog.rubyonrails.org/2019/8/15/Rails-6-0-final-release/" rel="nofollow" target="_blank"&gt;https://weblog.rubyonrails.org/2019/8/15/Rails-6-0-final-release/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;延误了三个月，终于发出来了。&lt;/p&gt;

&lt;p&gt;从我的角度看，这个版本可以说是 Shopify、GitHub 成立专门 Rails 开发团队并和 Rails 核心团队磨合的产物，这两家公司的一些开发者都直接加入了 Rails 核心团队。&lt;/p&gt;

&lt;p&gt;Basecamp 实现了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action Mailbox：用于监听邮箱，处理收到的邮件，用来解决如可直接回复 GitHub 的 Issue 邮件来追加评论到 Issue 讨论的场景。&lt;/li&gt;
&lt;li&gt;Action Text：一套富文本编辑器方案，解决了跟 Rails 的其他组件（如 Active Storage）适配和持久化问题。&lt;/li&gt;
&lt;li&gt;Webpacker 成为默认前端打包方案，Sprockets 开始软着陆，未来很可能会被彻底废弃&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;包括 5.2 的 Active Storage，Basecamp 从自身项目抽出来各种预制组件（就是 Rails Engine），业务层的东西众口难调，如果不满足作为参考实现也很好，这些值得抽取成 Engine 的通常都是比较复杂的组件。
这个思路完全没有问题，PHP 的 Laravel 我感觉生态比 Rails 还好，收费的高质量组件、免费 + 收费模式的、开源都有。&lt;/p&gt;

&lt;p&gt;GitHub 贡献了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多数据库支持，不仅可以编程方式指定，还可以通过 &lt;code&gt;Resolver&lt;/code&gt; 通过规则自动化选择&lt;/li&gt;
&lt;li&gt;并行化测试，减少测试的运行时间，间接提高了 CI、CD 的效率&lt;/li&gt;
&lt;li&gt;显示每个请求的对象创建数，对于 Profiling 有很大帮助&lt;/li&gt;
&lt;li&gt;新的 Action View 架构，减少对象分配、提升性能。这块还有后续，通过预编译等黑科技进一步提升性能&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shopify 贡献了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对一些细节进行重构，比如重构了 ActiveRecord 保存验证错误的容器 &lt;code&gt;Errors&lt;/code&gt;，设计更合理&lt;/li&gt;
&lt;li&gt;性能提升、性能提升、性能提升&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其他贡献者贡献了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;来自 Stripe 的开发者贡献了批量插入、更新！&lt;/li&gt;
&lt;li&gt;新的文件加载算法 Zeitwerk，避免巨型项目中会遇到的边界问题&lt;/li&gt;
&lt;li&gt;性能提升、性能提升、性能提升&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对于性能提升多说一句，除开重构逻辑，一个优化方向是减少对象创建，在某些逻辑上可以获得 2-3 倍的性能提升（根据 PR 中附带的 benchmark）。&lt;/p&gt;

&lt;p&gt;通过观察 Rails 6 的各方贡献也可以看到不同厂商的诉求，大厂直接投入精力对 Ruby 和 Rails 进行直接的贡献可以说是重大利好，这在过去是完全没有的。&lt;/p&gt;

&lt;p&gt;另，Rails 5.1 引入了平滑升级机制，理论上 Rails 本体的升级可以完全无痛，但是由于新的文件加载算法 Zeitwerk 的行为与老版本的有一定差异，所以可能重新组织文件和类名，或者直接切换到 &lt;code&gt;classic&lt;/code&gt; 模式&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/667dc52d-4ae2-45a2-a233-d7eb13376b61.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jasl</author>
      <pubDate>Sat, 17 Aug 2019 02:41:50 +0800</pubDate>
      <link>https://ruby-china.org/topics/38949</link>
      <guid>https://ruby-china.org/topics/38949</guid>
    </item>
  </channel>
</rss>
