<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>canonpd (东哥-clwy.cn)</title>
    <link>https://ruby-china.org/canonpd</link>
    <description>长乐未央</description>
    <language>en-us</language>
    <item>
      <title>Omarchy 成功运行在 Surface Pro 7 上</title>
      <description>&lt;p&gt;Omarchy 是 DHH 新作，运行在 Arch Linux 上。机器使用 Surface Pro 7，i5 CPU、8G 内存，128G 硬盘。&lt;/p&gt;

&lt;p&gt;依照&lt;a href="https://learn.omacom.io/2/the-omarchy-manual/50/getting-started" rel="nofollow" target="_blank" title=""&gt;官方文档&lt;/a&gt;安装，基本没有坑。但是注意，全程要有&lt;code&gt;非常通畅的网络（你懂的）&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;装好后，只有触摸屏不能用。其他包括音量热键、亮度热键、外接屏幕，无需额外驱动，全都是好的。&lt;/p&gt;

&lt;p&gt;内存占用非常少，开机 1.5G。而 Win 10 开机占用是 4G 以上。现在这机器，拿来做开发应该是极好的。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/b2f8a422-e4b4-4eec-b225-9fe5a05ccf60.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/canonpd/d94f4333-f0b0-47e5-a1c9-8665dd005d12.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/canonpd/f820273d-4a74-4f0b-af07-d09ab44b1db0.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/canonpd/2914f0c3-11dc-44fd-b41b-72e35dfe67f2.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Sun, 24 Aug 2025 02:14:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/44250</link>
      <guid>https://ruby-china.org/topics/44250</guid>
    </item>
    <item>
      <title>录了套 Node 课程发到 B 站了，请投币给我哦</title>
      <description>&lt;p&gt;【Node.js 零基础到项目实战 Express+MySQL+Sequelize 实作 API】&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=1HE42157zV" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Node 开发有很多地方与 Rails 开发非常像，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restful 路由&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;p&gt;课程目录：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;课程介绍&lt;/li&gt;
&lt;li&gt;使用 nvm 安装 Node.js&lt;/li&gt;
&lt;li&gt;编辑器与创建 Express 项目&lt;/li&gt;
&lt;li&gt;项目结构与代码解析&lt;/li&gt;
&lt;li&gt;使用 Docker 运行 MySQL&lt;/li&gt;
&lt;li&gt;创建数据库与数据表&lt;/li&gt;
&lt;li&gt;常用 SQL 语句之：增加、修改、删除篇&lt;/li&gt;
&lt;li&gt;常用 SQL 语句之：查询篇&lt;/li&gt;
&lt;li&gt;使用 Sequelize ORM&lt;/li&gt;
&lt;li&gt;模型、迁移与种子&lt;/li&gt;
&lt;li&gt;接口 1：查询文章列表&lt;/li&gt;
&lt;li&gt;接口 2：查询文章详情&lt;/li&gt;
&lt;li&gt;Apifox 的使用&lt;/li&gt;
&lt;li&gt;接口 3：创建文章&lt;/li&gt;
&lt;li&gt;接口 4：删除文章&lt;/li&gt;
&lt;li&gt;接口 5：更新文章&lt;/li&gt;
&lt;li&gt;接口 6：模糊搜索&lt;/li&gt;
&lt;li&gt;接口 7：数据分页&lt;/li&gt;
&lt;li&gt;问题 1：白名单过滤表单数据&lt;/li&gt;
&lt;li&gt;问题 2：验证表单数据&lt;/li&gt;
&lt;li&gt;终极版：增删改查（封装响应，优化代码）&lt;/li&gt;
&lt;li&gt;暂停！中场大复习&lt;/li&gt;
&lt;li&gt;实战数据库设计&lt;/li&gt;
&lt;li&gt;MySQL Workbench 的使用&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;后台：使用 bcryptjs 加密数据&lt;/li&gt;
&lt;li&gt;后台：课程接口（关联模型）&lt;/li&gt;
&lt;li&gt;后台：章节接口（关联模型）&lt;/li&gt;
&lt;li&gt;后台：Echarts 数据统计接口&lt;/li&gt;
&lt;li&gt;后台：jwt 实现管理员登录&lt;/li&gt;
&lt;li&gt;后台：使用中间件，认证接口&lt;/li&gt;
&lt;li&gt;前台 1：首页、分类、课程接口&lt;/li&gt;
&lt;li&gt;前台 2：章节、文章、系统信息、搜索接口&lt;/li&gt;
&lt;li&gt;前台 3：用户注册、登录、认证接口&lt;/li&gt;
&lt;li&gt;前台 4：与用户相关的接口&lt;/li&gt;
&lt;li&gt;前台 5：点赞接口（多对多关联）&lt;/li&gt;
&lt;li&gt;CORS 处理跨域&lt;/li&gt;
&lt;li&gt;大功告成，课程答疑&lt;/li&gt;
&lt;li&gt;部署：上线前的准备工作&lt;/li&gt;
&lt;li&gt;部署：服务器与域名&lt;/li&gt;
&lt;li&gt;部署：使用 SSH 远程连接服务器&lt;/li&gt;
&lt;li&gt;部署：使用宝塔面板，安装 Nginx、MySQL 和 Node.js&lt;/li&gt;
&lt;li&gt;部署：上传项目代码 &amp;amp; 配置数据库&lt;/li&gt;
&lt;li&gt;部署：使用 PM2 部署项目&lt;/li&gt;
&lt;li&gt;进阶：课程介绍&lt;/li&gt;
&lt;li&gt;进阶：使用 http-errors 处理状态码&lt;/li&gt;
&lt;li&gt;进阶：使用 Multer 上传图片到阿里云 OSS&lt;/li&gt;
&lt;li&gt;进阶：附件管理接口&lt;/li&gt;
&lt;li&gt;进阶：直传阿里云 OSS&lt;/li&gt;
&lt;li&gt;进阶：自动备份数据库到阿里云 OSS&lt;/li&gt;
&lt;li&gt;进阶：一对多关联的 Bug&lt;/li&gt;
&lt;li&gt;进阶：使用 Promise.all 并行查询&lt;/li&gt;
&lt;li&gt;进阶：软删除和多选操作&lt;/li&gt;
&lt;li&gt;进阶：使用 Redis 缓存&lt;/li&gt;
&lt;li&gt;进阶：Redis 缓存策略（上）&lt;/li&gt;
&lt;li&gt;进阶：Redis 缓存策略（下）&lt;/li&gt;
&lt;li&gt;进阶：图形验证码&lt;/li&gt;
&lt;li&gt;进阶：发送邮件&lt;/li&gt;
&lt;li&gt;进阶：RabbitMQ 消息队列（上）&lt;/li&gt;
&lt;li&gt;进阶：RabbitMQ 消息队列（下）&lt;/li&gt;
&lt;li&gt;进阶：使用 Winston 记录日志&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;/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;进阶：使用 WebSocket 推送订单信息&lt;/li&gt;
&lt;li&gt;进阶：微信登录&lt;/li&gt;
&lt;li&gt;进阶：微信支付&lt;/li&gt;
&lt;li&gt;进阶：拆分路由文件&lt;/li&gt;
&lt;li&gt;进阶：meilisearch 搜索引擎&lt;/li&gt;
&lt;li&gt;其他：无限级树状结构&lt;/li&gt;
&lt;li&gt;其他：格式化代码&lt;/li&gt;
&lt;li&gt;其他：使用 SQL Server&lt;/li&gt;
&lt;li&gt;其他：使用 PostgreSQL&lt;/li&gt;
&lt;li&gt;其他：使用 Prisma ORM&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>canonpd</author>
      <pubDate>Thu, 02 Jan 2025 12:39:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/43999</link>
      <guid>https://ruby-china.org/topics/43999</guid>
    </item>
    <item>
      <title>写了个小工具，免安装 Ruby &amp; Rails 开发环境，一键创建项目。</title>
      <description>&lt;h2 id="项目地址：https://github.com/clwy-cn/rails-docked"&gt;项目地址：&lt;a href="https://github.com/clwy-cn/rails-docked" rel="nofollow" target="_blank"&gt;https://github.com/clwy-cn/rails-docked&lt;/a&gt;
&lt;/h2&gt;&lt;h2 id="Rails Docked"&gt;Rails Docked&lt;/h2&gt;
&lt;p&gt;一个基于 Docker 的 Rails 开发环境，让你在任何操作系统上都能轻松开发 Rails 应用。&lt;/p&gt;
&lt;h2 id="为什么选择 Rails Docked？"&gt;为什么选择 Rails Docked？&lt;/h2&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;🎯 支持所有主流操作系统（Windows / macOS / Linux）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;安装 &lt;code&gt;Rails&lt;/code&gt; 开发环境，对于新手来说，非常棘手：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在中国大陆，由于网络环境不够友好，导致安装 &lt;code&gt;Ruby&lt;/code&gt; 和 &lt;code&gt;RubyGems&lt;/code&gt; 非常困难。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Rails&lt;/code&gt; 项目开发中，经常需要安装一些由 &lt;code&gt;C&lt;/code&gt; 或 &lt;code&gt;Rust&lt;/code&gt; 等语言开发的 &lt;code&gt;Gem&lt;/code&gt; 包。这些包在 &lt;code&gt;Windows&lt;/code&gt; 中编译安装非常困难。&lt;/li&gt;
&lt;li&gt;对于一些老旧 &lt;code&gt;macOS&lt;/code&gt;，无法使用 &lt;code&gt;Homebrew&lt;/code&gt; 正确安装第三方依赖。例如 &lt;a href="https://guides.rubyonrails.org/active_storage_overview.html" rel="nofollow" target="_blank" title=""&gt;Active Storage&lt;/a&gt; 中所需要的图片分析工具 &lt;a href="https://github.com/libvips/libvips" rel="nofollow" target="_blank" title=""&gt;vips&lt;/a&gt;，在 &lt;code&gt;macOS Monterey&lt;/code&gt; 上已无法正确安装了。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为了让大家无论使用什么操作系统的电脑，都能简单、顺利的开发 &lt;code&gt;Ruby On Rails&lt;/code&gt; 应用，于是有了 &lt;code&gt;Rails Docked&lt;/code&gt; 这个项目。其中，主要参考了 &lt;a href="https://github.com/rails/docked" rel="nofollow" target="_blank" title=""&gt;Docked Rails CLI&lt;/a&gt; 的相关配置。&lt;/p&gt;
&lt;h2 id="环境说明"&gt;环境说明&lt;/h2&gt;
&lt;p&gt;预置环境包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby 3.4.1（默认开启 YJIT）&lt;/li&gt;
&lt;li&gt;Rails 8.0.1&lt;/li&gt;
&lt;li&gt;Node 22.12.0 + Yarn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;预置镜像源包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apt 命令：阿里云镜像源&lt;/li&gt;
&lt;li&gt;Ruby Gem：Ruby China 镜像源&lt;/li&gt;
&lt;li&gt;npm / Yarn：中国镜像源&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/039ff7f5-cf4e-4200-a9c7-284cdc3541ad.png!large" width="796px" alt=""&gt;&lt;/p&gt;
&lt;h2 id="安装 Docker"&gt;安装 Docker&lt;/h2&gt;
&lt;p&gt;首先需要先安装 &lt;a href="https://www.docker.com/products/docker-desktop/" rel="nofollow" target="_blank" title=""&gt;Docker&lt;/a&gt;。如在安装过程出现了问题（常见于 Windows），请参考 &lt;a href="https://clwy.cn/chapters/fullstack-node-mysql" rel="nofollow" target="_blank" title=""&gt;Docker 安装教程&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="创建 Docker 卷"&gt;创建 Docker 卷&lt;/h2&gt;
&lt;p&gt;创建一个名为 &lt;code&gt;ruby-bundle-cache&lt;/code&gt; 的卷，用于保存 &lt;code&gt;Ruby&lt;/code&gt; 项目的依赖包。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create ruby-bundle-cache
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="创建项目"&gt;创建项目&lt;/h2&gt;&lt;h3 id="macOS、Linux 系统"&gt;macOS、Linux 系统&lt;/h3&gt;
&lt;p&gt;创建一个名为 &lt;code&gt;docked&lt;/code&gt; 的别名：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;docked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'docker run --rm -it \
 -v ${PWD}:/rails \
 -v ruby-bundle-cache:/bundle \
 -p 3000:3000 \
 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;rails&lt;/code&gt; 项目：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docked rails new weblog &lt;span class="nt"&gt;-d&lt;/span&gt; postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Windows 系统"&gt;Windows 系统&lt;/h3&gt;
&lt;p&gt;使用&lt;code&gt;PowerShell&lt;/code&gt;，创建一个名为 &lt;code&gt;docked&lt;/code&gt; 的别名：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Function docked &lt;span class="o"&gt;{&lt;/span&gt; docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:/rails &lt;span class="nt"&gt;-v&lt;/span&gt; ruby-bundle-cache:/bundle &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked &lt;span class="nv"&gt;$args&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;pre class="highlight shell"&gt;&lt;code&gt;docked rails new weblog &lt;span class="nt"&gt;-d&lt;/span&gt; postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="使用 Docker Compose 配置容器"&gt;使用 Docker Compose 配置容器&lt;/h2&gt;
&lt;p&gt;建好后，用编辑器打开 &lt;code&gt;weblog&lt;/code&gt; 项目。在项目根目录下，增加 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件，并添加如下内容：&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked"&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/rails&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ruby-bundle-cache:/bundle&lt;/span&gt;
    &lt;span class="na"&gt;tty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;stdin_open&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tail"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-f"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/dev/null"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;postgresql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:17&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_HOST_AUTH_METHOD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;trust&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/pgdata:/var/lib/postgresql/data&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7.4&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379:6379"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/redis:/data&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ruby-bundle-cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL 17&lt;/li&gt;
&lt;li&gt;Redis 7.4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="修改数据库连接"&gt;修改数据库连接&lt;/h2&gt;
&lt;p&gt;修改项目中的 &lt;code&gt;config/database.yml&lt;/code&gt; 文件，增加如下数据库配置信息，这样才能连接到容器中的数据库：&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;default&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="启动项目"&gt;启动项目&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;启动容器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;weblog
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;进入容器&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose &lt;span class="nb"&gt;exec &lt;/span&gt;web bash
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;安装 Ruby Gems&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;创建数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails db:create
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用脚手架，自动生成增删改查功能（可选）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 创建路由、模型和迁移文件&lt;/span&gt;
rails generate scaffold post title:string body:text

&lt;span class="c"&gt;# 迁移数据库&lt;/span&gt;
rails db:migrate
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;启动服务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待服务顺利启动后，请访问 &lt;a href="http://localhost:3000/posts" rel="nofollow" target="_blank" title=""&gt;http://localhost:3000/posts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/51cbd97f-006e-427f-bb9e-d08b376d1f62.png!large" width="796px" alt=""&gt;&lt;/p&gt;
&lt;h2 id="常见问题"&gt;常见问题&lt;/h2&gt;&lt;h3 id="1. 如何更新"&gt;1. 如何更新&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. 如何使用 MySQL 数据库？"&gt;2. 如何使用 MySQL 数据库？&lt;/h3&gt;
&lt;p&gt;如果需要使用 &lt;code&gt;MySQL&lt;/code&gt; 替代 &lt;code&gt;PostgreSQL&lt;/code&gt;，在创建项目时使用 &lt;code&gt;-d mysql&lt;/code&gt; 参数，例如&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docked rails new weblog &lt;span class="nt"&gt;-d&lt;/span&gt; mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并相应修改 &lt;code&gt;docker-compose.yml&lt;/code&gt; 中的数据库配置，例如：&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked"&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/rails&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ruby-bundle-cache:/bundle&lt;/span&gt;
    &lt;span class="na"&gt;tty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;stdin_open&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tail"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-f"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/dev/null"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.3&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306:3306"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ALLOW_EMPTY_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/mysql:/var/lib/mysql&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7.4&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379:6379"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/redis:/data&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ruby-bundle-cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时需要修改 &lt;code&gt;config/database.yml&lt;/code&gt; 中的数据库配置：&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;default&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. 容器启动失败怎么办？"&gt;2. 容器启动失败怎么办？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查端口是否被占用&lt;/li&gt;
&lt;li&gt;确保 Docker 服务正在运行&lt;/li&gt;
&lt;li&gt;查看容器日志：&lt;code&gt;docker-compose logs&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3. macOS、Linux下如何设置 docked 别名？"&gt;3. macOS、Linux 下如何设置 docked 别名？&lt;/h3&gt;
&lt;p&gt;在 macOS 和 Linux 系统中，可以通过以下方式设置别名：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 编辑配置文件（根据你使用的 shell 选择合适的文件）&lt;/span&gt;
&lt;span class="c"&gt;# 如果使用 bash，编辑 ~/.bashrc&lt;/span&gt;
&lt;span class="c"&gt;# 如果使用 zsh，编辑 ~/.zshrc&lt;/span&gt;

&lt;span class="c"&gt;# 在配置文件中添加以下内容&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;docked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'docker run --rm -it \
 -v ${PWD}:/rails \
 -v ruby-bundle-cache:/bundle \
 -p 3000:3000 \
 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked'&lt;/span&gt;

&lt;span class="c"&gt;# 使配置生效&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc  &lt;span class="c"&gt;# 如果使用 bash&lt;/span&gt;
&lt;span class="c"&gt;# 或&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc   &lt;span class="c"&gt;# 如果使用 zsh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="3. Windows 下如何设置 docked 别名？"&gt;3. Windows 下如何设置 docked 别名？&lt;/h3&gt;
&lt;p&gt;在 Windows 系统中，可以通过以下方式设置 &lt;code&gt;PowerShell&lt;/code&gt; 别名：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 查看 PowerShell 配置文件的路径&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt;
&lt;span class="c"&gt;# 输出类似：C:\Users\用户名\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1&lt;/span&gt;

&lt;span class="c"&gt;# 如果该文件不存在，可以使用命令创建&lt;/span&gt;
New-Item &lt;span class="nt"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="nt"&gt;-Type&lt;/span&gt; File &lt;span class="nt"&gt;-Force&lt;/span&gt;

&lt;span class="c"&gt;# 用你喜欢的编辑器打开该文件，添加以下内容&lt;/span&gt;
Function docked &lt;span class="o"&gt;{&lt;/span&gt; docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:/rails &lt;span class="nt"&gt;-v&lt;/span&gt; ruby-bundle-cache:/bundle &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked &lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：在运行 &lt;code&gt;docked rails new xxx&lt;/code&gt; 命令时，有可能碰到提示：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;无法加载文件 C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\用&lt;/span&gt;户名&lt;span class="se"&gt;\D&lt;/span&gt;ocuments&lt;span class="se"&gt;\W&lt;/span&gt;indowsPowerShell&lt;span class="se"&gt;\M&lt;/span&gt;icrosoft.PowerShell_profile.ps1，因为在此系统上禁止运行脚本。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果碰到这个错误，需要用&lt;code&gt;管理员身份&lt;/code&gt;打开 &lt;code&gt;PowerShell&lt;/code&gt;，然后运行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned
&lt;span class="c"&gt;# 接着按 A 键继续&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="许可证"&gt;许可证&lt;/h2&gt;
&lt;p&gt;本项目采用 &lt;a href="https://opensource.org/licenses/MIT" rel="nofollow" target="_blank" title=""&gt;MIT 许可证&lt;/a&gt;。&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Tue, 31 Dec 2024 17:27:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/43995</link>
      <guid>https://ruby-china.org/topics/43995</guid>
    </item>
    <item>
      <title>想不到 DHH 与我一样如此坚定的讨厌 Java</title>
      <description>&lt;p&gt;昨晚翻了一下 DHH 发的推特，居然突然发现 DHH 与我一样如此坚定的讨厌 Java。&lt;br&gt;
我坚定的讨厌 Java 已经很久了，可以参考我五年前写的帖子&lt;a href="https://ruby-china.org/topics/35326" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/35326&lt;/a&gt;。&lt;br&gt;
这里面有一些观点在如今市场行情已经不适用了，但我对 Java 的讨厌一如既往从未改变。&lt;br&gt;
我曾经在网上与一个 Java 的拥趸对骂了一个月，就连 ruby-china 的这个帖子下面也有骂我的，这实在是让我疲劳了，我迫不得已关闭了帖子。&lt;/p&gt;

&lt;p&gt;拥有好品味的永远是少数人。&lt;br&gt;
但很人在垃圾堆生活惯了，只能习惯于与垃圾一起生活。当你告诉他与垃圾一起生活不好时，他就会跳起来骂你。&lt;/p&gt;

&lt;p&gt;这东西就像找对象一样。&lt;br&gt;
我永远不可能把 Java 当做终身学习研究的东西，因为我从心底就厌恶它。&lt;br&gt;
就像找了一个一见面就嫌弃的对象，它一张嘴就让我就想吐，虽然偶尔忍一下也无所谓了。&lt;br&gt;
但一辈子的话，这日子根本就没法过了。&lt;/p&gt;

&lt;p&gt;但我愿意把 Ruby 作为终身研究学习的东西，我甚至愿意慢慢剥下她美丽的轻纱，对她的底层的源码都很感兴趣。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;写 Java 的时候，我感觉我在监狱中坐牢&lt;/li&gt;
&lt;li&gt;写 Ruby 的时候，我感觉我在有溪水流过、鸟语花香的魔法森林中冒险&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/de90a224-346d-4332-aef2-9a064ce97ec9.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/74870c5d-a926-493e-8819-1a52812b28a9.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/fcfcc492-7f18-42d2-8e67-cf1fc1d67a4c.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/c1b105d0-3a3c-44a2-9521-c053632137a8.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/d38c2240-f917-44b5-bc21-1fcb8ad23fee.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/11f9ee73-74e0-4c86-b707-26e49ab5fc18.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/02dfef2b-adef-477a-9f8f-415afd9c6c03.png!large" width="371px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;我知道这个帖子发出来，必然有人要骂我。&lt;br&gt;
如果你在这里支持我，我感谢你，大家真是志同道合的好兄弟。&lt;br&gt;
但如果你在这个帖子骂我，我是不会理你的，我已经一把年纪（36 岁），心平气和的不屑于回应这些了。&lt;br&gt;&lt;/p&gt;

&lt;p&gt;这世界从不缺随波逐流的人，但太缺像我这样爱恨分明还敢说的人了。&lt;br&gt;
我相信多一些像我这样的人，国内的开发业界会发展的更好。&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Mon, 13 Feb 2023 09:04:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/42872</link>
      <guid>https://ruby-china.org/topics/42872</guid>
    </item>
    <item>
      <title>macOS 下正确安装 Ruby 3.2.2 + YJIT 步骤</title>
      <description>&lt;p&gt;前置条件，确保你已经安装了 rbenv 和 ruby-build&lt;/p&gt;
&lt;h2 id="一、安装rust"&gt;一、安装 rust&lt;/h2&gt;
&lt;p&gt;Ruby 官网&lt;a href="https://www.ruby-lang.org/zh_cn/news/2022/12/25/ruby-3-2-0-released/" rel="nofollow" target="_blank" title=""&gt;《Ruby 3.2.0 已发布》&lt;/a&gt;明确说了，为了确保 YJIT 被编译入 CRuby，必须确认安装了 rustc &amp;gt;= 1.58.0&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看版本，确定安装成功&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  rustc &lt;span class="nt"&gt;--version&lt;/span&gt; 
rustc 1.67.0 &lt;span class="o"&gt;(&lt;/span&gt;fc594f156 2023-01-24&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="二、更新 Ruby build"&gt;二、更新 Ruby build&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  brew update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew upgrade ruby-build
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="三、安装 Ruby 3.2.2所需依赖"&gt;三、安装 Ruby 3.2.2 所需依赖&lt;/h2&gt;
&lt;p&gt;如果未安装，在安装 Ruby 3.2.2 的过程中，会提示错误 &lt;code&gt;cannot load such file -- psych&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;libyaml
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="四、安装带YJIT 的 Ruby 3.2.2"&gt;四、安装带 YJIT 的 Ruby 3.2.2&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  &lt;span class="nv"&gt;RUBY_CONFIGURE_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--enable-yjit"&lt;/span&gt; rbenv &lt;span class="nb"&gt;install &lt;/span&gt;3.2.2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;装完后，别忘记了设置为全局使用，并且 rehash&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  rbenv global 3.2.2
➜  rbenv rehash
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="五、检查是否安装成功"&gt;五、检查是否安装成功&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  ruby &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--yjit&lt;/span&gt;
ruby 3.2.2 &lt;span class="o"&gt;(&lt;/span&gt;2022-12-25 revision a528908271&lt;span class="o"&gt;)&lt;/span&gt; +YJIT &lt;span class="o"&gt;[&lt;/span&gt;x86_64-darwin21]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="五、开启YJIT"&gt;五、开启 YJIT&lt;/h2&gt;
&lt;p&gt;就算安装成功了，默认也是没有开启的，需要在环境中增加配置。
你可以配置到&lt;code&gt;.bash_profile&lt;/code&gt; 或者 &lt;code&gt;.zshrc&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;RUBY_YJIT_ENABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启命令行后，进入 irb，测试是否成功开启&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  irb           
irb&lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt;:001:0&amp;gt;  RubyVM::YJIT.enabled?
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/92e6ba0c-ca2b-467d-9ed4-4c003414b823.png!large" width="360px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;到此结束，愉快的玩耍吧。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ruby-lang.org/zh_cn/news/2022/12/25/ruby-3-2-0-released/" rel="nofollow" target="_blank"&gt;https://www.ruby-lang.org/zh_cn/news/2022/12/25/ruby-3-2-0-released/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/wizardhealth/install-ruby-320-with-yjit-3mmo" rel="nofollow" target="_blank"&gt;https://dev.to/wizardhealth/install-ruby-320-with-yjit-3mmo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruby-china.org/topics/42801" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/42801&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>canonpd</author>
      <pubDate>Sat, 28 Jan 2023 09:03:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/42845</link>
      <guid>https://ruby-china.org/topics/42845</guid>
    </item>
    <item>
      <title>jitouch 在 macOS 12 Monterey 下重编译兼容版本</title>
      <description>&lt;p&gt;我个人深度使用 jitouch，没有这个感觉 Macbook pro 的整个触摸板都废掉了。
升级到 Monterey 系统后，jitouch 直接挂掉。但是其他类似的软件，就没有一个比 jitouch 好用的。&lt;/p&gt;

&lt;p&gt;我参考了&lt;a href="https://github.com/sukolsak/jitouch" rel="nofollow" target="_blank" title=""&gt;Github&lt;/a&gt;的 PR，修改了相关代码，重新编译了支持 macOS 12 的 jitouch。
我的 Intel 老 Macbook Pro 已经非常顺利的运行起来了。
修改代码的相关内容，在理论上也支持 M1 芯片，但我个人没有 M1 系列设备无法测试。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/c9161111-e223-4aca-b461-3f6763fd8ab6.png!large" width="586px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/d8ba882c-f25b-49fe-b2c7-1fc0c673abfc.png!large" width="668px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;现在将我重新编译的发布上来，有需要的朋友请自取。&lt;/p&gt;

&lt;p&gt;链接：&lt;a href="https://pan.baidu.com/s/1_z_fOS6rTlUEy-NYVMWuOw" rel="nofollow" target="_blank"&gt;https://pan.baidu.com/s/1_z_fOS6rTlUEy-NYVMWuOw&lt;/a&gt; 提取码：42od &lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Sat, 13 Nov 2021 01:42:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/41878</link>
      <guid>https://ruby-china.org/topics/41878</guid>
    </item>
    <item>
      <title>编辑器解析 markdown 时候，normalize_mention_filter.rb 有问题</title>
      <description>&lt;p&gt;例如有以下代码：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/b34f1812-b4e6-403f-9637-b462eac05ec7.png!large" width="323px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;保存后变成了&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@admin_blue.context_processor&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;view_share&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_admin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;am-active&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; 感觉正则是不是有问题？或者说在代码段中，是否不应该实现 mention 功能&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Wed, 24 Feb 2021 10:18:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/40946</link>
      <guid>https://ruby-china.org/topics/40946</guid>
    </item>
    <item>
      <title>M1 芯片 Mac 可以开发 Rails 吗？</title>
      <description>&lt;p&gt;目前最想知道的情况是，&lt;/p&gt;

&lt;p&gt;一、安装 Ruby 本身是否有问题？
二、安装 Rails 相关的各种依赖包是否有问题？
三、安装 Postgresql 是否有问题？&lt;/p&gt;

&lt;p&gt;Docker 目前已知不可用，所不能考虑这条路。&lt;/p&gt;

&lt;p&gt;有没有朋友买了？请告知下情况&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Mon, 23 Nov 2020 13:58:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/40602</link>
      <guid>https://ruby-china.org/topics/40602</guid>
    </item>
    <item>
      <title>想知道 Ruby China 目前服务器配置情况</title>
      <description>&lt;p&gt;公司现在想新买个服务器，想知道下 Ruby China 目前服务器硬件配置情况，好做个参考。&lt;/p&gt;

&lt;p&gt;然后请问下大家，是搞一台强劲的好？还是多台配置一般的做负载均衡更好？&lt;/p&gt;

&lt;p&gt;目前公司主项目用的 4 核心 8G 的。在考虑是再买一台 4 核 8G？还是直接升级到 8 核 16G 的好？阿里云送了券，快到期了，不买也要浪费了。&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Fri, 17 Jul 2020 12:15:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/40162</link>
      <guid>https://ruby-china.org/topics/40162</guid>
    </item>
    <item>
      <title>Stimulus 中文文档翻译</title>
      <description>&lt;h2 id="Stimulus是什么？"&gt;Stimulus 是什么？&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/5fec26ae-674b-4bbb-8e1e-4a3d087624a1.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Stimulus 是为&lt;em&gt;已经存在的 HTMl 页面&lt;/em&gt;准备的一个摩登 JavaScript 框架。&lt;/p&gt;

&lt;p&gt;Stimulus 是一个有适当野心的 JavaScript 框架。事实上，它并没有试图占据你的整个前端，他完全不关心如何渲染 HTML。相反，它的设计目的是用足够的行为增强 HTML，使其闪闪发光。Stimulus 与 Turbolinks 完美地结合，以最小的工作量为快速、引人注目的应用程序开发，提供完整的解决方案。&lt;/p&gt;
&lt;h2 id="为什么你需要Stimulus？"&gt;为什么你需要 Stimulus？&lt;/h2&gt;
&lt;p&gt;Rails 的作者 DHH 的作者，在&lt;a href="/guide/documents/stimulus/1-1-1/origin" title=""&gt;序言：Stimulus 的起源&lt;/a&gt;中的有一段文字，让我体会深刻：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这是一种非常不同的模式。一种我确定许多已经习惯了用现代框架工作的经验丰富的 JavaScript 开发者会嘲笑的模式。随便吧，嘲笑就嘲笑吧。&lt;strong&gt;如果你享受复杂框架，例如 React + Redux 的复杂性和维护它们所需要投入的努力，那么你可能不会对 Turbolinks+Stimulus 感兴趣。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;相反，如果你对正在使用的这些现代技术所带来的强烈复杂性和应用程序分离性感到非常不满，那么你应该会在我们的方案中找到解决之道。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;如果你使用 Ruby On Rails，那么你一定要试试 Stimulus 框架。&lt;/li&gt;
&lt;li&gt;如果你不用 Rails，在用其他框架开发前端的时候，你依然值得尝试 Stimulus。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;换一种思路吧，不要眼中只有 React、Vue，世界上新东西还多的是。对我个人而言，这是我认为更轻量、更好用的前端框架。目前&lt;a href="https://clwy.cn" rel="nofollow" target="_blank" title=""&gt;长乐未央&lt;/a&gt;站点中，所有 JavaScript 均基于 Stimulus 构建。&lt;/p&gt;
&lt;h2 id="翻译进度"&gt;翻译进度&lt;/h2&gt;
&lt;p&gt;文档所有章节已翻译完成！&lt;/p&gt;

&lt;p&gt;译者：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;序言部分：&lt;a href="https://www.infoq.cn/article/stimulus-modest-javascript-framework/?utm_medium=hao.caibaojian.com&amp;amp;utm_source=hao.caibaojian.com" rel="nofollow" target="_blank" title=""&gt;张健欣&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;正文部分 6 个章节：&lt;a href="https://clwy.cn/teachers/aaron" rel="nofollow" target="_blank" title=""&gt;刘东&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="章节"&gt;章节&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus" rel="nofollow" target="_blank" title=""&gt;文档首页&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/origin" rel="nofollow" target="_blank" title=""&gt;序言：Stimulus 的起源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/introduction" rel="nofollow" target="_blank" title=""&gt;1：介绍&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/hello-stimulus" rel="nofollow" target="_blank" title=""&gt;2：你好，Stimulus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/building-something-real" rel="nofollow" target="_blank" title=""&gt;3：做点真实的东西&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/managing-state" rel="nofollow" target="_blank" title=""&gt;4：状态管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/working-with-external-resources" rel="nofollow" target="_blank" title=""&gt;5：使用外部资源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clwy.cn/guide/documents/stimulus/1-1-1/installing" rel="nofollow" target="_blank" title=""&gt;6：在你自己的应用程序中安装&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>canonpd</author>
      <pubDate>Thu, 28 May 2020 15:46:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/39911</link>
      <guid>https://ruby-china.org/topics/39911</guid>
    </item>
    <item>
      <title>如何能获取到 Rails 引擎的名字？</title>
      <description>&lt;p&gt;我们项目由多个 Rails 引擎组成。需要针对不同引擎做样式。因为控制器 - 方法，不同引擎中有同名的，所以想再加上引擎名字。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;%= "&lt;/span&gt;&lt;span class="c1"&gt;#{controller_name}-#{action_name}" %&amp;gt;"&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;controller_name 能获取到当前控制器名，action_name 能获取到当前方法名。
有什么方法能直接获取到当前引擎的名字呢？&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Fri, 15 May 2020 17:20:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/39871</link>
      <guid>https://ruby-china.org/topics/39871</guid>
    </item>
    <item>
      <title>我想问下，酷站里网站的图标是怎么存储的？</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/105817ea-9a5a-4759-af66-ffe01a6788c6.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;数据库中，没看到存储，也不需要提交。只有这么一段代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;favicon_url&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;
  &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"www."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"https://favicon.ruby-china.com/ip2/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.ico"&lt;/span&gt;
&lt;span class="k"&gt;rescue&lt;/span&gt;
  &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我想知道，这些图标，是如何实现存入 &lt;code&gt;favicon.ruby-china.com&lt;/code&gt; 中的？&lt;/p&gt;

&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; &lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Mon, 11 May 2020 11:17:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/39853</link>
      <guid>https://ruby-china.org/topics/39853</guid>
    </item>
    <item>
      <title>ActionText 读取时会自动加上 布局模板</title>
      <description>&lt;p&gt;我的项目使用了 &lt;code&gt;ActionText&lt;/code&gt;，但我没用 &lt;code&gt;Trix&lt;/code&gt; 编辑器，我的编辑器是我参照 Github，自己定制 Markdown 编辑器。&lt;/p&gt;

&lt;p&gt;现在有一个问题，当我做编辑的时候，使用如下代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= form.text_area :body %&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;他会自动渲染这个模板 &lt;code&gt;actiontext-6.0.2.1/app/views/action_text/content/_layout.html.erb&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"trix-content"&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="sx"&gt;%= render_action_text_content(content) %&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导致我读出来的内容，全部都有了多余的标签。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/8379bc71-3d9f-474e-a210-f25c09a32a07.png!large" width="800px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; 请问下，在做 &lt;code&gt;Bluedoc&lt;/code&gt; 的时候，你是否也碰到了这个问题，是怎么解决的？&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Tue, 28 Jan 2020 01:59:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/39467</link>
      <guid>https://ruby-china.org/topics/39467</guid>
    </item>
    <item>
      <title>rails 6 webpacker 慢的要死</title>
      <description>&lt;p&gt;rails 6 一出来就第一时间将项目升级了。公司项目现在使用的是 &lt;code&gt;6.0.0.rc1&lt;/code&gt; 版本。6 最大的区别，就是改用了 &lt;code&gt;webpacker&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;用了这个，虽然 yarn 装包方便了。但这个玩意，每次改个 js 代码，刷新 2~3 秒才出来。这么慢，咋玩？严重影响开发体验，我的机器配置也不差，开发怎么都够了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/4ffc7332-c5c4-4a4b-a91f-3943a20950f8.png!large" width="600px" alt=""&gt;&lt;/p&gt;

&lt;p&gt;就这玩意，死慢死慢的。。。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/7d3abe32-f9db-4040-a4b7-1be544eece80.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;平常开发，自己用 &lt;code&gt;webapck&lt;/code&gt; 写 vue、react，也没有这么慢啊。&lt;/p&gt;

&lt;p&gt;请教下各位，你们用 &lt;code&gt;webpacker&lt;/code&gt; 这玩意的时候，不觉得慢吗？有没有好的解决方法，还是只能忍受？&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Tue, 25 Jun 2019 11:30:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/38740</link>
      <guid>https://ruby-china.org/topics/38740</guid>
    </item>
    <item>
      <title>Ruby China 站点，不搭梯子，recaptcha 无法显示，无法注册了</title>
      <description>&lt;p&gt;我注意到 ruby china 为了防止攻击，将注册验证码换成 recaptcha 了。
但用这个有严重的问题，不开 vpn，就完全无法使用。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/5ae4263a-4627-4859-b259-4ddd4d6b3d71.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2019/cdcf4951-36c0-424b-a97f-a2a278bff6d4.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;考虑国内用户，是否还是老办法，rucaptcha + 限制 ip 得了？另外我注意到了，homeland 中限制 ip 的代码。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sign_up_count&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置的缓存，是否应该加个有效期更好一些。避免 redis，存在大量无用数据&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sign_up_count&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="ss"&gt;:expires_in&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="nf"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; &lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Sat, 27 Apr 2019 09:43:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/38457</link>
      <guid>https://ruby-china.org/topics/38457</guid>
    </item>
    <item>
      <title>Mina + Rails 5.2 自动化部署</title>
      <description>&lt;p&gt;&lt;a href="https://itfun.tv/news/48" rel="nofollow" target="_blank" title=""&gt;原文地址 https://itfun.tv/news/48&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Mina&lt;/code&gt;的部署流程比&lt;code&gt;Capistrano&lt;/code&gt;要简单容易很多，碰到的问题也少很多。我两个对比后，给你的建议是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;如果你的项目比较大，需要多台服务器，推荐&lt;code&gt;Capistrano&lt;/code&gt;。项目比较小，那么推荐&lt;code&gt;Mina&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我现在开发的项目，还是一个非常小的项目。只需要一台配置很一般的服务器就足够运行了。本打算选 Mina 的，但听了管理员的建议，正式项目，还是打算用 Cap 部署了。就算为将来增加服务器考虑，Cap 是个不错的选择。&lt;/p&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;这里就不重复说明，&lt;code&gt;Rails建项目&lt;/code&gt;、&lt;code&gt;rbenv&lt;/code&gt;、&lt;code&gt;Git&lt;/code&gt;、&lt;code&gt;SSH秘钥&lt;/code&gt;、&lt;code&gt;Nginx&lt;/code&gt;、&lt;code&gt;Passenger&lt;/code&gt;、&lt;code&gt;MySQL&lt;/code&gt;等相关的配置了。如果你完全是新手，可以看我上一篇 &lt;a href="https://ruby-china.org/topics/36899" title=""&gt;「Capistrano + Rails 5.2 自动化部署」&lt;/a&gt;，里面有详细的基础部署流程。这些流程在&lt;code&gt;Mina&lt;/code&gt;部署中，几乎完全一模一样。不一样的地方，下面流程中会单独指出。&lt;/p&gt;
&lt;h2 id="一、安装Mina"&gt;一、安装 Mina&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 本地命令行&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;mina&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="二、创建Mina的配置文件"&gt;二、创建 Mina 的配置文件&lt;/h2&gt;
&lt;p&gt;先&lt;code&gt;cd&lt;/code&gt;进入自己的&lt;code&gt;Rails&lt;/code&gt;项目目录&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mina init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会生成&lt;code&gt;config/deploy.rb&lt;/code&gt;这个配置文件。要做的就是对这个文件做一些配置。具体配置如下&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 需要引入的插件&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mina/rails'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mina/git'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mina/rbenv'&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:application_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'itfun.tv'&lt;/span&gt;       &lt;span class="c1"&gt;# 项目名称&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'114.67.72.94'&lt;/span&gt;             &lt;span class="c1"&gt;# 服务器域名或ip &lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:deploy_to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/home/deploy/deployment'&lt;/span&gt;    &lt;span class="c1"&gt;# 项目部署在服务器的什么地方&lt;/span&gt;

&lt;span class="c1"&gt;#Git仓库地址&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'git@git.coding.net:aaronryuu/deployment.git'&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:branch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'master'&lt;/span&gt;                   &lt;span class="c1"&gt;# Git的分支&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'deploy'&lt;/span&gt;                     &lt;span class="c1"&gt;# SSH连接服务器的用户名&lt;/span&gt;

&lt;span class="c1"&gt;# 使用本地的`SSH秘钥`去服务器执行`git pull`，这样`Git`上就不用设置`部署公钥`。&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:forward_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;                

&lt;span class="c1"&gt;# 一些公共的文件&lt;/span&gt;
&lt;span class="c1"&gt;# 如果你使用的Rails 5.2以下版本，将`config/master.key`，改为`config/secrets.yml`&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:shared_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:shared_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'config/database.yml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'config/master.key'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 对rbenv的支持&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:remote_environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'rbenv:load'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;                     
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="三、服务器生成Mina的相关目录"&gt;三、服务器生成 Mina 的相关目录&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 本地&lt;/span&gt;
mina setup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后你需要&lt;code&gt;SSH&lt;/code&gt;到服务器上，在&lt;code&gt;~/deployment/shared/config&lt;/code&gt;目录中，新建以下两个文件&lt;/p&gt;
&lt;h3 id="1. database.yml"&gt;1. database.yml&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/deployment/shared/config
vim database.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据自己实际项目，填上数据库配置的相关内容。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;production:
  adapter: mysql2
  pool: 25
  encoding: utf8mb4
  database: deployment_production
  host: localhost
  username: root
  password: itfun
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. master.key"&gt;2. master.key&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;vim master.key
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将自己本地&lt;code&gt;Rails&lt;/code&gt;项目&lt;code&gt;config/master.key&lt;/code&gt;中的内容，复制进去。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tips: 如果是&lt;code&gt;Rails 5.2&lt;/code&gt;以下版本，这里改成 &lt;code&gt;config/secrets.yml&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="四、正式部署"&gt;四、正式部署&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 本地&lt;/span&gt;
mina deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成了，没有更多了~&lt;/p&gt;
&lt;h2 id="五、Mina对Sidekiq的支持"&gt;五、Mina 对 Sidekiq 的支持&lt;/h2&gt;&lt;h3 id="1. 先安装"&gt;1. 先安装&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 本地&lt;/span&gt;
gem &lt;span class="nb"&gt;install &lt;/span&gt;mina-sidekiq
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;redis-server
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. config/deploy.rb添加相关配置"&gt;2. config/deploy.rb添加相关配置&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 引入插件&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mina_sidekiq/tasks'&lt;/span&gt;


&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:setup&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# sidekiq 存放 pid文件 和 log文件 的路径&lt;/span&gt;
  &lt;span class="c1"&gt;# 跑 mina setup 时，服务器会自动生成这些目录&lt;/span&gt;
  &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="sx"&gt;%(mkdir -p "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:deploy_to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/pids/")&lt;/span&gt;
  &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="sx"&gt;%(mkdir -p "&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:deploy_to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sx"&gt;/shared/log/")&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# 跑 mina deploy 时，会先停止 sidekiq 再重新启动。&lt;/span&gt;
&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:deploy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;deploy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'git:clone'&lt;/span&gt;

    &lt;span class="c1"&gt;# 停止 sidekiq&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'sidekiq:quiet'&lt;/span&gt;
    &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'deploy:link_shared_paths'&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="ss"&gt;:launch&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="o"&gt;...&lt;/span&gt;

      &lt;span class="c1"&gt;# 重启 sidekiq&lt;/span&gt;
      &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="ss"&gt;:'sidekiq:restart'&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;h3 id="3. 部署"&gt;3. 部署&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 本地&lt;/span&gt;
mina setup
mina deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我在部署时，出现了一个错误，提示我&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle: &lt;span class="nb"&gt;command &lt;/span&gt;not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查了&lt;code&gt;GitHub&lt;/code&gt;的&lt;code&gt;Issues&lt;/code&gt;后发现是&lt;code&gt;rbenv&lt;/code&gt;配置的问题&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
vim ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 将文件最底部的这两行代码，挪到文件最上面，一定要在 case 语句的上面就行。&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.rbenv/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;rbenv init -&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# If not running interactively, don't do anything&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$-&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;i&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
      &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&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="c"&gt;# 本地&lt;/span&gt;
mina setup
mina deploy
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>canonpd</author>
      <pubDate>Wed, 06 Jun 2018 10:53:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/36910</link>
      <guid>https://ruby-china.org/topics/36910</guid>
    </item>
    <item>
      <title>Capistrano + Rails 5.2 自动化部署</title>
      <description>&lt;p&gt;&lt;a href="https://clwy.cn" rel="nofollow" target="_blank" title=""&gt;原文地址 https://clwy.cn&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;相关文章 &lt;a href="https://ruby-china.org/topics/36910" title=""&gt;「Mina + Rails 5.2 自动化部署」&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;2018-10-28 日更新：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;文章中，统一改为&lt;code&gt;master.key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ruby 版本更新为 2.5.3&lt;/li&gt;
&lt;li&gt;添加了 Sidekiq 相关内容&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&lt;h3 id="1. 为什么要用它？"&gt;1. 为什么要用它？&lt;/h3&gt;
&lt;p&gt;这是一个一劳永逸的工作，有了它。你不用每次版本更新都去服务器上 git pull，不用 bundle install，也不用跑 touch tmp/restart.txt之类的命令，更不需要还在用FTP上传代码了。每次新版本更新，只需要在你本机，运行一条cap production deploy 命令。服务器就会自动 git pull 远程仓库的最新代码，并自动完成一系列部署相关的操作。&lt;/p&gt;
&lt;h3 id="2. 环境"&gt;2. 环境&lt;/h3&gt;
&lt;p&gt;这是一个一劳永逸的工作，有了它。你不用每次版本更新都去服务器上&lt;code&gt;git pull&lt;/code&gt;，也不用跑 &lt;code&gt;touch tmp/restart.txt&lt;/code&gt;之类的命令，更不需要还在用&lt;code&gt;FTP&lt;/code&gt;上传代码了。&lt;/p&gt;

&lt;p&gt;每次新版本更新，只需要在你本机，运行一条&lt;code&gt;cap production deploy&lt;/code&gt;命令。服务器就会自动&lt;code&gt;git pull&lt;/code&gt;远程仓库的最新代码，并且完成相关的一系列操作。&lt;/p&gt;
&lt;h2 id="环境"&gt;环境&lt;/h2&gt;
&lt;p&gt;网上诸多&lt;code&gt;Capistrano&lt;/code&gt;都已经过时了，部署中因为版本原因会出现一大堆错误，于是我重新整理了完整的流程。只要你不是完全的&lt;code&gt;Linux小白&lt;/code&gt;，稍微对这方面有一点了解，相信你参照我写的流程，都能自己部署出来了。&lt;/p&gt;

&lt;p&gt;流程中，所采用的服务器环境如下：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;服务器系统：我选用的服务器系统是 &lt;code&gt;Ubuntu Server 16.04&lt;/code&gt;，如果你是其他系统，流程可能会有部分不一样。如果你用&lt;code&gt;Rails&lt;/code&gt;，那么我只推荐这一个服务器操作系统，坑少、易解决。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Rails&lt;/code&gt;版本：我所使用的&lt;code&gt;Rails&lt;/code&gt;版本是&lt;code&gt;5.2&lt;/code&gt;。如果你用的老版本&lt;code&gt;Rails&lt;/code&gt;，会有一些不一样的地方，哪里需要注意的，文里也有说明。&lt;/li&gt;
&lt;li&gt;数据库：&lt;code&gt;MySQL 5.7&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;其他：再就是用了&lt;code&gt;Nginx&lt;/code&gt; 和 &lt;code&gt;Passenger&lt;/code&gt;了。还介绍了&lt;code&gt;SSH秘钥&lt;/code&gt;和&lt;code&gt;Git使用&lt;/code&gt;的基础知识。&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Tips: 需要注意的是，有的命令要在服务器上运行，有的是在你电脑本地运行的。注释里都有说明，请务必不要搞错了~！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="一、新建用户"&gt;一、新建用户&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="c"&gt;# `--ingroup sudo`是说，新建的用户直接就有执行`sudo`命令的权限。&lt;/span&gt;
adduser deploy &lt;span class="nt"&gt;--ingroup&lt;/span&gt; &lt;span class="nb"&gt;sudo&lt;/span&gt;
&lt;span class="c"&gt;# 输入新密码。&lt;/span&gt;
&lt;span class="c"&gt;# 问其他的Full Name之类的，你可以填写，也可以不填，直接回车。&lt;/span&gt;

&lt;span class="c"&gt;# 切换到deploy用户&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su deploy

&lt;span class="c"&gt;# 进入`家`目录&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="二、使用秘钥登录服务器"&gt;二、使用秘钥登录服务器&lt;/h2&gt;
&lt;p&gt;很多云服务器，大部分默认都是使用账号密码登录的。这样做非常不安全，所以你需要改为&lt;code&gt;SSH秘钥&lt;/code&gt;登录。如果你想改为秘钥登录，一种是直接在云主机管理界面，上传自己的秘钥。另一种通用方法，就是我下面的操作了。&lt;/p&gt;

&lt;p&gt;相信玩&lt;code&gt;Ruby On Rails&lt;/code&gt;的基本都是&lt;code&gt;Mac OS&lt;/code&gt;用户了。以下演示都以&lt;code&gt;Mac&lt;/code&gt;机为例子操作。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Mac 本地
ssh-keygen -t rsa
# 如果不需要加密，就直接全部回车。需要加密，就自己填写密码

cat ~/.ssh/id_rsa.pub
# 会出现一段文字，复制下来
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 服务器上
ssh-keygen -t rsa
# 依然全部直接回车

vi /home/deploy/.ssh/authorized_keys
# 将刚才Mac本地命令行中，复制的那一段文字，粘贴进去，然后按:wq保存离开

chmod 644 /home/deploy/.ssh/authorized_keys
sudo service ssh restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在你再用&lt;code&gt;SSH&lt;/code&gt;连服务器，直接&lt;code&gt;ssh deploy@你的ip&lt;/code&gt;，不再需要输入密码了。&lt;/p&gt;
&lt;h2 id="三、禁用密码登录（可选）"&gt;三、禁用密码登录（可选）&lt;/h2&gt;
&lt;p&gt;用密码登录服务器，并不是一个安全的选择。最好方法是直接禁用密码登录，改为必须使用&lt;code&gt;SSH秘钥&lt;/code&gt;登录。当然这一步是可选的，和我们学习&lt;code&gt;Capistrano&lt;/code&gt;并没有什么关系。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;vi /etc/ssh/sshd_config

&lt;span class="c"&gt;# 将`PasswordAuthentication yes` 修改成 `PasswordAuthentication no`&lt;/span&gt;
&lt;span class="c"&gt;# :wq退出后&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;service ssh restart
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="四、服务器基础准备工作"&gt;四、服务器基础准备工作&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="c"&gt;# 确认一下，当前用户依然是deploy。如果不是，先sudo su deploy&lt;/span&gt;

&lt;span class="c"&gt;# 更新&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg-reconfigure tzdata
&lt;span class="c"&gt;# 选择时区 Time zone=&amp;gt;Asia=&amp;gt;Shanghai&lt;/span&gt;

&lt;span class="c"&gt;# 安装Rails所必须的各种常见依赖&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; build-essential git-core bison openssl libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3  autoconf libc6-dev libpcre3-dev curl libcurl4-nss-dev libxml2-dev libxslt-dev imagemagick nodejs libffi-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Ubuntu 16.04&lt;/code&gt; 的 &lt;code&gt;apt-get install&lt;/code&gt; 默认只支持 &lt;code&gt;Ruby 2.3&lt;/code&gt;。对新版本&lt;code&gt;Rails 5.2&lt;/code&gt;来说，已经无法运行了。所以我们选择使用 &lt;code&gt;rbenv&lt;/code&gt; 来安装 &lt;code&gt;Ruby&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="五、使用rbenv安装Ruby"&gt;五、使用 rbenv 安装 Ruby&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.rbenv/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;rbenv&lt;/code&gt;需要&lt;code&gt;ruby-build&lt;/code&gt;，才能安装&lt;code&gt;ruby&lt;/code&gt;。所以现在来安装它。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
echo 'eval "$(rbenv init -)"' &amp;gt;&amp;gt; ~/.bashrc
source ~/.bashrc

# 看一下，现在可安装的Ruby版本
rbenv install -l
# 我写文章这个时间，最新的是2.5.3

rbenv install 2.5.3

# 设置成全局默认使用
rbenv global 2.5.3

# 看一下是否装成功
ruby -v

# 使用Ruby China的RubyGems（境外服务器请略过）
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
# 确保只有 gems.ruby-china.com

# 接着安装 bundler gem
gem install bundler

# 同样使用gems.ruby-china.com
bundle config mirror.https://rubygems.org https://gems.ruby-china.com
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="六、安装MySQL"&gt;六、安装 MySQL&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;mysql-common mysql-client libmysqlclient-dev mysql-server
&lt;span class="c"&gt;# 安装过程中，会让你输入密码。自己记好了哦！&lt;/span&gt;

&lt;span class="c"&gt;# 新建一个数据库，其中deployment是你数据库的名字，可根据需求自行修改&lt;/span&gt;
mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
CREATE DATABASE deployment_production CHARACTER SET utf8mb4&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# 退出 mysql console&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="七、安装 Nginx + Passenger"&gt;七、安装 Nginx + Passenger&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key adv &lt;span class="nt"&gt;--keyserver&lt;/span&gt; hkp://keyserver.ubuntu.com:80 &lt;span class="nt"&gt;--recv-keys&lt;/span&gt; 561F9B9CAC40B2F7

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https ca-certificates

&lt;span class="c"&gt;# 添加 APT 仓库地址&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main &amp;gt; /etc/apt/sources.list.d/passenger.list'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update

&lt;span class="c"&gt;# 安装 Passenger + Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx-extras passenger
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="八、注册Coding账号"&gt;八、注册 Coding 账号&lt;/h2&gt;
&lt;p&gt;你这里使用&lt;code&gt;GitHub&lt;/code&gt;、&lt;code&gt;Coding&lt;/code&gt;、&lt;code&gt;码云&lt;/code&gt;哪个都行。我这里以&lt;code&gt;Coding&lt;/code&gt;为例子演示，之所以用&lt;code&gt;Coding&lt;/code&gt;，是考虑到国内企业付费用&lt;code&gt;GitHub&lt;/code&gt;的比较少。没用&lt;code&gt;码云&lt;/code&gt;，是因为页面没有&lt;code&gt;Coding&lt;/code&gt;的好看，这个&lt;code&gt;很重要&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Coding&lt;/code&gt;的注册地址&lt;a href="https://coding.net" rel="nofollow" target="_blank" title=""&gt;https://coding.net&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="九、Git设置SSH公钥"&gt;九、Git 设置 SSH 公钥&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/045786e3f81a9ea92e0deaa46ada61da.jpg" title="" alt="Git设置SSH公钥"&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac 本地&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;span class="c"&gt;# 会出现一段文字，复制下来，粘贴到下面`公钥内容`中，选择`永久有效`。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/748322c7bdd52b67a0e1ce50abaf377b.jpg" title="" alt="Git设置SSH公钥"&gt;
这样你在使用&lt;code&gt;Git&lt;/code&gt;的时候，就不需要每次输入账号密码了，直接用&lt;code&gt;SSH&lt;/code&gt;秘钥。&lt;/p&gt;
&lt;h2 id="十、新建一个Git项目"&gt;十、新建一个 Git 项目&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/a9b531401a9fbaf59c5b7cd39fa5f479.jpg" title="" alt="新建一个Git项目"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/e34b0754401b7ffd6965e4336c8b9219.jpg" title="" alt="新建一个Git项目"&gt;&lt;/p&gt;

&lt;p&gt;点击&lt;code&gt;代码浏览&lt;/code&gt;后，选择&lt;code&gt;SSH&lt;/code&gt;方式，点击复制按钮。&lt;/p&gt;
&lt;h2 id="十一、新建一个Rails项目"&gt;十一、新建一个 Rails 项目&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac 本地&lt;/span&gt;
&lt;span class="c"&gt;# 如果你已经有开发好的项目，这一步请直接略过。&lt;/span&gt;

&lt;span class="c"&gt;# 新建一个目录，存放rails项目&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Developer/Rails

&lt;span class="c"&gt;# 新建一个Rails项目，默认使用MySQL数据库&lt;/span&gt;
rails new deployment &lt;span class="nt"&gt;-d&lt;/span&gt; mysql
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="十二、修改gemfile，安装Capistrano以及插件"&gt;十二、修改 gemfile，安装 Capistrano 以及插件&lt;/h2&gt;
&lt;p&gt;到&lt;code&gt;gemfile&lt;/code&gt;的&lt;code&gt;group :development&lt;/code&gt;中，添加如下代码，这些都是&lt;code&gt;capistrano&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="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="c1"&gt;# 其中`capistrano-rails`包含了以下三个插件。&lt;/span&gt;
  &lt;span class="c1"&gt;# gem 'capistrano/bundler'&lt;/span&gt;
  &lt;span class="c1"&gt;# gem 'capistrano/rails/assets'&lt;/span&gt;
  &lt;span class="c1"&gt;# gem 'capistrano/rails/migrations'&lt;/span&gt;
  &lt;span class="c1"&gt;# 你也可以分别一个个加进去，但是何必呢？这些基本都是`rails`部署必须的。&lt;/span&gt;
  &lt;span class="c1"&gt;# 直接用`gem 'capistrano-rails'`这一个就好了。&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-rails'&lt;/span&gt;

  &lt;span class="c1"&gt;# 对`passenger`与`rbenv`的支持&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-passenger'&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-rbenv'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 改完后，Mac 本地，命令行进入自己项目中&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Developer/Rails/deployment
bundle &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="十三、将代码推送到Git远程仓库"&gt;十三、将代码推送到 Git 远程仓库&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Mac&lt;/code&gt;上的&lt;code&gt;Git&lt;/code&gt;客户端，常用的有两个。一个是需要收费的&lt;code&gt;Tower&lt;/code&gt;，另个一是免费的&lt;code&gt;SourceTree&lt;/code&gt;。其实用起来差别不大，只是我个人&lt;code&gt;Tower&lt;/code&gt;用的比较顺手，于是直接购买了。当然你也可以不装任何客户端，直接用命令。&lt;/p&gt;

&lt;p&gt;我们现在为了演示方便，直接用就用命令行操作&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 确认命令行当前的路径，在刚才新建的项目中&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"初次提交"&lt;/span&gt;
&lt;span class="c"&gt;# 将下面的地址换成自己刚复制的&lt;/span&gt;
git remote add origin git@git.coding.net:aaronryuu/deployment.git
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;去&lt;code&gt;coding&lt;/code&gt;刷新页面，代码都已经提交上去了
&lt;img src="http://images.itfun.tv/photo/2018/a03876edd5bf0a195fc0d0d4d7fa1c9f.jpg-large" title="Coding保存代码" alt="Coding Push"&gt;&lt;/p&gt;
&lt;h2 id="十四、配置Capistrano"&gt;十四、配置 Capistrano&lt;/h2&gt;&lt;h3 id="1. 生成capistrano的相关配置文件。"&gt;1. 生成 capistrano 的相关配置文件。&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Mac本地运行
cap install
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. 编辑 Capfile（项目的根目录下）"&gt;2. 编辑 Capfile（项目的根目录下）&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 加上这行&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"capistrano/rails"&lt;/span&gt;

&lt;span class="c1"&gt;# 去掉这两行前面的`#`号 &lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"capistrano/rbenv"&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"capistrano/passenger"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他配置可保持默认。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/68cf5eff320b1eea5b8d52080fd1622d.jpg" title="" alt="配置Capistrano"&gt;&lt;/p&gt;
&lt;h3 id="3. 编辑 config/deploy.rb"&gt;3. 编辑 config/deploy.rb&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 最顶上加这行，注意是「`」号而不是单引号「'」
# 如果你对ssh-add有兴趣，你可以去读这一篇。https://ihower.tw/blog/archives/7837
`ssh-add`

# 项目名称
set :application, "deployment"

# git仓库地址
set :repo_url, "git@git.coding.net:aaronryuu/deployment.git"

# 需要部署到服务器的位置
set :deploy_to, "/home/deploy/deployment"

# 去掉注释，并加上 "config/master.key"
append :linked_files, "config/database.yml", "config/master.key"

# 去掉注释
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system'
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意了：我这里是&lt;code&gt;Rails 5.2&lt;/code&gt;的部署，这个版本开始，&lt;code&gt;config/secrets.yml&lt;/code&gt;变成了&lt;code&gt;config/master.key&lt;/code&gt;。所以，如果你的项目&lt;code&gt;Rails&lt;/code&gt;版本低于&lt;code&gt;5.2&lt;/code&gt;，那这里应该是&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;append&lt;/span&gt; &lt;span class="ss"&gt;:linked_files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'config/database.yml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'config/master.key'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果这里不正确处理，后面部署可能会碰到这个错误！&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ArgumentError: Missing &lt;span class="sb"&gt;`&lt;/span&gt;secret_key_base&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; environment, &lt;span class="nb"&gt;set &lt;/span&gt;this string with &lt;span class="sb"&gt;`&lt;/span&gt;rails credentials:edit&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/1deed707238cd08faee487bd259f0b25.jpg" title="" alt="配置Capistrano"&gt;&lt;/p&gt;
&lt;h3 id="4. 编辑config/deploy/production.rb"&gt;4. 编辑 config/deploy/production.rb&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 改成你自己的ip&lt;/span&gt;
server &lt;span class="s2"&gt;"114.67.72.94"&lt;/span&gt;, user: &lt;span class="s2"&gt;"deploy"&lt;/span&gt;, roles: %w&lt;span class="o"&gt;{&lt;/span&gt;app db web&lt;span class="o"&gt;}&lt;/span&gt;, my_property: :my_value

&lt;span class="nb"&gt;set&lt;/span&gt; :ssh_options, &lt;span class="o"&gt;{&lt;/span&gt;
  keys: %w&lt;span class="o"&gt;(&lt;/span&gt;~/.ssh/id_rsa&lt;span class="o"&gt;)&lt;/span&gt;,
  forward_agent: &lt;span class="nb"&gt;true&lt;/span&gt;,
  auth_methods: %w&lt;span class="o"&gt;(&lt;/span&gt;publickey&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/94917aeef217dcc9c080afabb49845f3.jpg" title="" alt=""&gt;
&lt;img src="http://images.itfun.tv/photo/2018/a52e284e29908441f83f478f980b52fc.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="5. 尝试报错"&gt;5. 尝试报错&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac 本地执行&lt;/span&gt;
cap production deploy:check
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现错误&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ERROR linked file /home/deploy/deployment/shared/config/database.yml does not exist on 114.67.72.94
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解决方法，是需要手动到服务器上，建&lt;code&gt;config/database.yml&lt;/code&gt;，&lt;code&gt;config/secrets.yml&lt;/code&gt;这两个文件，并做好配置。&lt;/p&gt;

&lt;p&gt;服务器上，会出现&lt;code&gt;releases&lt;/code&gt;和&lt;code&gt;shared&lt;/code&gt;两个目录。&lt;code&gt;releases&lt;/code&gt;是每次部署的文件，&lt;code&gt;shared&lt;/code&gt;目录则是一些公用的配置文件。那么我们现在就去&lt;code&gt;shared&lt;/code&gt;目录中，添加这两个公用的配置文件。&lt;/p&gt;
&lt;h3 id="6. 新建database.yml文件"&gt;6. 新建 database.yml 文件&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/deployment/shared/config
vim database.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;里面填写以下内容，当然，将&lt;code&gt;password&lt;/code&gt;换成刚才装&lt;code&gt;MySQL&lt;/code&gt;时自己填写的密码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;production:
  adapter: &lt;/span&gt;&lt;span class="n"&gt;mysql2&lt;/span&gt;
  &lt;span class="ss"&gt;pool: &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;
  &lt;span class="ss"&gt;encoding: &lt;/span&gt;&lt;span class="n"&gt;utf8mb4&lt;/span&gt;
  &lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="n"&gt;deployment_production&lt;/span&gt;
  &lt;span class="ss"&gt;host: &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
  &lt;span class="ss"&gt;username: &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
  &lt;span class="ss"&gt;password: &lt;/span&gt;&lt;span class="n"&gt;itfun&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="7. 新建master.key文件"&gt;7. 新建 master.key 文件&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;vim master.key
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后将自己本地项目&lt;code&gt;config/master.key&lt;/code&gt;中的内容，复制进去。&lt;/p&gt;
&lt;h3 id="8. 再试一次"&gt;8. 再试一次&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac 本地执行&lt;/span&gt;
cap production deploy:check
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这次就没有报错了。&lt;/p&gt;
&lt;h2 id="十五、正式部署"&gt;十五、正式部署&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac 本地&lt;/span&gt;
cap production deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次会比较慢，请耐心等待。这条命令，还会在服务器上建立一个叫&lt;code&gt;current&lt;/code&gt;的目录，用&lt;code&gt;symbolic link&lt;/code&gt;指向&lt;code&gt;releases&lt;/code&gt;目录下最新的版本。&lt;/p&gt;
&lt;h2 id="十六、配置nginx"&gt;十六、配置 nginx&lt;/h2&gt;&lt;h3 id="1. 配置nginx支持passenger"&gt;1. 配置 nginx 支持 passenger&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/nginx/nginx.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 在此文件最顶部加上&lt;/span&gt;
&lt;span class="nb"&gt;env &lt;/span&gt;PATH&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# ...&lt;/span&gt;

&lt;span class="c"&gt;# 去掉这一行的注释&lt;/span&gt;
include /etc/nginx/passenger.conf&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. 新增一个项目配置"&gt;2. 新增一个项目配置&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/nginx/sites-enabled/deployment.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
  listen 80&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;# 如果你有域名，并做好了域名解析，直接填域名。&lt;/span&gt;
  server_name 114.67.72.94&lt;span class="p"&gt;;&lt;/span&gt; 

  root /home/deploy/deployment/current/public&lt;span class="p"&gt;;&lt;/span&gt;

  passenger_enabled on&lt;span class="p"&gt;;&lt;/span&gt;

  passenger_min_instances 1&lt;span class="p"&gt;;&lt;/span&gt;

  location ~ ^/assets/ &lt;span class="o"&gt;{&lt;/span&gt;
    expires 1y&lt;span class="p"&gt;;&lt;/span&gt;
    add_header Cache-Control public&lt;span class="p"&gt;;&lt;/span&gt;
    add_header ETag &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 重启nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;service nginx restart
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="十七、尝试访问项目"&gt;十七、尝试访问项目&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/0654257d63d95bb988a6dc5a3108cc18.jpg" title="" alt="Rails部署报错"&gt;&lt;/p&gt;

&lt;p&gt;这是其实是有由两个原因造成的。
第一、因为我们项目，目前还连首页都没有。
第二、&lt;code&gt;Passanger&lt;/code&gt;需要指定使用的&lt;code&gt;Ruby&lt;/code&gt;路径。查资料了解到，如果是&lt;code&gt;apt-get&lt;/code&gt;安装的&lt;code&gt;Ruby&lt;/code&gt;则没有这个问题。如果和我一样，用&lt;code&gt;rbenv&lt;/code&gt;安装的，则需要手动指定&lt;code&gt;Ruby&lt;/code&gt;路径。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tips: 如果部署中，你还碰到了其他问题。你可以看一下&lt;code&gt;Nginx 错误日志&lt;/code&gt;中，是否有相关提示。路径在&lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="1. Rails的首页"&gt;1. Rails 的首页&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;config/routes.rb&lt;/code&gt;中，添加&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="s1"&gt;'home#index'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac本地&lt;/span&gt;
rails g controller home
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑&lt;code&gt;app/controllers/home_controller.rb&lt;/code&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;HomeController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
     &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;plain: &lt;/span&gt;&lt;span class="s2"&gt;"Capistrano 自动化部署"&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 shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac本地，先确认现在命令行，是在项目目录中。&lt;/span&gt;
&lt;span class="c"&gt;# 提交到git&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"新增首页"&lt;/span&gt;
git push

&lt;span class="c"&gt;# 重新部署&lt;/span&gt;
cap production deploy
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. 设置passanger，使用指定的 Ruby 版本"&gt;2. 设置 passanger，使用指定的 Ruby 版本&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="c"&gt;# 先看一下ruby所在的路径&lt;/span&gt;
which ruby
&lt;span class="nb"&gt;sudo &lt;/span&gt;vim /etc/nginx/passenger.conf
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 屏蔽掉默认配置，添加自己的ruby路径&lt;/span&gt;
&lt;span class="c"&gt;#passenger_ruby /usr/bin/passenger_free_ruby;&lt;/span&gt;
passenger_ruby /home/deploy/.rbenv/shims/ruby&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 重启nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;service nginx restart
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="十八、成功"&gt;十八、成功&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://images.itfun.tv/photo/2018/673567dfbccc564d498d5a09ed913a3a.jpg" title="" alt="成功"&gt;&lt;/p&gt;
&lt;h2 id="十九、Capistrano对Sidekiq的支持"&gt;十九、Capistrano 对 Sidekiq 的支持&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Sidekiq&lt;/code&gt;需要&lt;code&gt;Redis&lt;/code&gt;，所以先去服务器上安装好。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 服务器上&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;redis-server
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Mac本地&lt;/span&gt;
&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:development&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;

 &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'capistrano-sidekiq'&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 shell"&gt;&lt;code&gt;bundle
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Capfile&lt;/code&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="s1"&gt;'capistrano/sidekiq'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新部署完事~&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cap production deploy
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>canonpd</author>
      <pubDate>Tue, 05 Jun 2018 10:27:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/36899</link>
      <guid>https://ruby-china.org/topics/36899</guid>
    </item>
    <item>
      <title>年纪大了是否还可以学编程？IT 真的就是青春饭？</title>
      <description>&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;h2 id="为何程序员难以看到大龄的？"&gt;为何程序员难以看到大龄的？&lt;/h2&gt;
&lt;p&gt;再说年龄大的问题，我觉得本身国内程序界就没发展几年。没听过一个笑话吗？至今 90 后程序员还无一人活到 30 岁！哪里来的那么多大龄人员。国内年龄大的最早的一批程序员，基本都自己当老板或者进入管理岗位了。&lt;/p&gt;

&lt;p&gt;至于说年纪大了，精力不够我觉得更是扯淡。就怕不是精力不够，而是自己生活过的舒服了，懒惰了，在公司里就只想混日子。&lt;/p&gt;
&lt;h2 id="我的情况"&gt;我的情况&lt;/h2&gt;
&lt;p&gt;我再说一下我个人情况，我至今已经写了 11 年的程序了，基本算是绝对的大龄程序员了。我至今依然每天都写代码。如果说有事情几天不写代码，我心里都是痒痒的，不写一下就不痛快。我并没有感觉到任何精力不足，或者学习能力下降。&lt;/p&gt;
&lt;h2 id="我的计划"&gt;我的计划&lt;/h2&gt;
&lt;p&gt;个人计划是在 40 岁前，达到财务自由。到时候我可能不再经常在写代码了。不是别的原因，只是我还有其他兴趣爱好。&lt;/p&gt;

&lt;p&gt;编程、音乐、旅行、美食都是我的兴趣。40 之前好好拼搏一把，40 之后，我打算花更多的经历去搞音乐去，弹弹琴，写写曲。有空闲就带着妻子全世界旅行去。&lt;/p&gt;

&lt;p&gt;不是说，人生不是只有编程，还有诗和远方嘛。&lt;/p&gt;
&lt;h2 id="什么时候该转行"&gt;什么时候该转行&lt;/h2&gt;
&lt;p&gt;我觉得人不应该给自己找借口，找借口的都是失败者。
如果有一天你觉得自己对编程不再爱了，我会劝你赶紧转行。但如果是其他借口（精力不足什么的），我只能觉得你这辈子也就这样了，恐怕干啥都是一事无成。&lt;/p&gt;
&lt;h2 id="我再举一些例子"&gt;我再举一些例子&lt;/h2&gt;
&lt;p&gt;Linus Benedict Torvalds，出生于 1969 年，Linux 的作者&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/48c3a9cf-66a1-4a50-9ec3-f8d653e3bf24.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;松本行弘，出生于 1965 年，Ruby 语言的作者&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/04330c7d-51ba-4cd4-b38c-cd6e019cfd33.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Guido van Rossum，出生于 1956 年，Python 语言的作者。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/bfe2214d-fa75-4032-9c0d-a218bf4f3ada.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;你们看这些老人家，哪个到了这个年纪，还不是继续在写代码？
我有一句话，送给还在犹豫的各位：&lt;code&gt;现在总比将来早&lt;/code&gt;。只要对这行感兴趣，什么时候都不晚。&lt;/p&gt;

&lt;p&gt;最后再说一个我非常佩服的先祖，&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/canonpd/48ed8b5d-b5a6-4a57-948e-a289bf623c61.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;在他那个年代，49 岁是当时人们的平均寿命。此人 47 岁之前一直在混日子，绝对标准的混混，啃老族。他 47 岁才开始创业。按当时的平均寿命，说白了都没两年好活的了。他干的还是最难的事业，造反。刚开始创业也干不过别人，被人追着屁股打，老婆、孩子、老爹都保不住。后来一朝成功，创业 7 年后，在 54 岁登极为帝。&lt;/p&gt;

&lt;p&gt;而现在我认识的一些朋友，年龄仅仅不过 30 而已，人生还有的是大好年华。就开始整天自怨自艾了，一点点挫折，就感觉人生毫无希望。你看看上面的例子，我就问你羞不羞。&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Tue, 27 Mar 2018 13:25:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/35338</link>
      <guid>https://ruby-china.org/topics/35338</guid>
    </item>
    <item>
      <title>PHP、Java、Python、Ruby 到底应该学哪一个？</title>
      <description>&lt;p&gt;以下观点，仅仅代表我个人观点，有一些地方可能个人感情色彩比较重。
如果你支持我，我会回复。
如果你要来骂我，我不理你。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itfun.tv/news/11" rel="nofollow" target="_blank" title=""&gt;原文地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="先看一些统计数据"&gt;先看一些统计数据&lt;/h2&gt;&lt;h3 id="1. 实际份额"&gt;1. 实际份额&lt;/h3&gt;
&lt;p&gt;每天统计的全球网站，所使用的 Web 服务端语言份额。&lt;a href="https://w3techs.com/technologies/overview/programming_language/all" rel="nofollow" target="_blank" title=""&gt;点此链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://images.itfun.tv/photo/2018/67c2bca38350cb80474abc18848345d1.jpg-large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="2. 全球50名网站所使用的语言"&gt;2. 全球 50 名网站所使用的语言&lt;/h3&gt;
&lt;p&gt;经常会听到某某论调，&lt;code&gt;Java&lt;/code&gt;适合开发大型项目，&lt;code&gt;PHP&lt;/code&gt;、&lt;code&gt;Ruby&lt;/code&gt;等适合开发中小项目。事实真是如此吗？一个大型项目，往往都是多种语言一起开发的。以下统计的是此站点使用的主要语言。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://images.itfun.tv/photo/2018/5aa9ee7fc75781249892b05520757ca8.jpg-large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://images.itfun.tv/photo/2018/1d3ff875697f4c3f319c1ca0191503b2.jpg-large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://images.itfun.tv/photo/2018/4d5a1be99f83f79cd53c3dc0162ad186.jpg-large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这个统计数据并不是今年最新的，有一些变化。
虽然是几年前的统计，&lt;code&gt;但不要再跟我说没有参考价值了&lt;/code&gt;，一个大型项目想换语言是很困难的事情，你如果知道其他变化欢迎补充。
目前我已知的一些变化是：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;淘宝的前端由PHP转向了Node.js。
Java的Paypal和Linkedin转向了Node.js。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前&lt;code&gt;Java&lt;/code&gt;在列表中&lt;code&gt;前50名&lt;/code&gt;的网站里，仅仅剩下&lt;code&gt;3家&lt;/code&gt;而已。&lt;/p&gt;
&lt;h3 id="3. Tiobe 编程语言排行榜"&gt;3. Tiobe 编程语言排行榜&lt;/h3&gt;
&lt;p&gt;需要搞清楚的是，这个排行榜是怎么来的？他是根据搜索引擎的搜索量来的，跟实际项目份额一点关系都没有。那你是关心搜哪个多，还是更关心企业用哪个多呢？&lt;/p&gt;

&lt;p&gt;&lt;img src="https://images.itfun.tv/photo/2018/ac176d22df14bd67ceed392dca50e7fb.jpg-large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="PHP"&gt;PHP&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;PHP&lt;/code&gt;的特点，&lt;code&gt;简单粗暴&lt;/code&gt;。不过就是这样的简单粗暴，却能让你快速的完成项目。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PHP&lt;/code&gt;过去的代码非常混乱，各种奇葩代码层出不穷，一人一个搞法。不过这种情况，在有了&lt;code&gt;Laravel&lt;/code&gt;框架和&lt;code&gt;Composer&lt;/code&gt;包管理器后有了非常大的进步。&lt;/p&gt;

&lt;p&gt;现今的&lt;code&gt;PHP&lt;/code&gt;，基本发展还是不错。使用了这些新技术后，代码的结构和规范都得到了最大的保障。我觉得它目前依然是一个很好的工作的语言，就业需求也依旧旺盛。&lt;/p&gt;

&lt;p&gt;比较大的一个问题是，经过各种培训机构教出来的 PHP 新手比较多，这些往往是没有自己独立完整企业项目能力的。而一去了就能自己独当一面，独立完成各种企业需求的人却比较稀缺。&lt;/p&gt;
&lt;h2 id="Java"&gt;Java&lt;/h2&gt;
&lt;p&gt;我毫不掩饰的说，&lt;code&gt;Java&lt;/code&gt;是我个人最讨厌的语言，没有之一。&lt;/p&gt;

&lt;p&gt;有的语言会给你最大的自由，你就是上帝，你想怎样都可以随心所欲。而有的语言，觉得用户都是傻 X。给你一个牢房，让你用起来感觉自己是犯人，做什么都必须在限制的牢房里。&lt;code&gt;Java&lt;/code&gt;明显就是后者，它非常善于把简单的事情变得复杂，并且加上一堆条条框框让你非常的难受。&lt;/p&gt;

&lt;p&gt;基本上说&lt;code&gt;Java&lt;/code&gt;好的人，就三类。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;第一种，书呆子。
第二种，坐井观天，只用过&lt;code&gt;Java&lt;/code&gt;，根本没用过其他优秀语言的人。我敢肯定说他没用过&lt;code&gt;Ruby&lt;/code&gt;这类人性化的语言。
第三种，听别人说的，自己根本什么都不了解。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;以下内容，摘要自硅谷创业之父，&lt;code&gt;Paul Graham&lt;/code&gt;的&lt;code&gt;黑客与画家&lt;/code&gt;一书&lt;/p&gt;
&lt;h3 id="第一段"&gt;第一段&lt;/h3&gt;
&lt;p&gt;有人写信说：“你怎么能说&lt;code&gt;Java&lt;/code&gt;不会成功呢？它已经成功了。”我觉得这要看你的成功标准是什么。
如果标准是相关书籍的出版量，或者是相信学会&lt;code&gt;Java&lt;/code&gt;就能找到工作的大学生数量，那么&lt;code&gt;Java&lt;/code&gt;确实已经成功了。
当我说&lt;code&gt;Java&lt;/code&gt;不会成功时，我的意思是它和&lt;code&gt;Cobol&lt;/code&gt;一样，进化之路已经走到了尽头。&lt;/p&gt;
&lt;h3 id="第二段"&gt;第二段&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hello-world&lt;/code&gt;程序的唯一作用就是显示出“Hello, world!”这句话。使用&lt;code&gt;Java&lt;/code&gt;语言，你需要这样写：&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hello&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你从来没有接触过编程，看到上面的代码可能会很奇怪，让计算机显示一句话为什么要搞得这么复杂？
有意思的是，资深程序员的反应与你一样。&lt;/p&gt;
&lt;h3 id="第三段"&gt;第三段&lt;/h3&gt;
&lt;p&gt;最不用担心的竞争对手就是那些要求应聘者具有&lt;code&gt;Oracle&lt;/code&gt;数据库经验的公司，你永远不必担心他们。
如果是招聘&lt;code&gt;C++&lt;/code&gt;或&lt;code&gt;Java&lt;/code&gt;程序员的公司，对你也不会构成威胁。
如果他们招聘&lt;code&gt;Perl&lt;/code&gt;或&lt;code&gt;Python&lt;/code&gt;程序员，就稍微有点威胁了。至少这听起来像一家技术公司，并且由黑客控制。
如果我有幸见到一家招聘&lt;code&gt;Lisp&lt;/code&gt;黑客的公司，就会真的感到如临大敌。&lt;/p&gt;

&lt;p&gt;我个人观点，与此书作者一致。如果你只是想去找个普通的企业混口饭吃，&lt;code&gt;Java&lt;/code&gt;是一个选择。如果你是一个富有创新精神的黑客，我相信你是绝对不会选择这门语言的。&lt;/p&gt;

&lt;p&gt;另外非常不推荐再去搞安卓开发了，目前行情是开发者严重过剩。已经过了当年&lt;code&gt;ios&lt;/code&gt;、&lt;code&gt;安卓&lt;/code&gt;开发非常火爆的年代了。用户不愿意在手机上安装一大堆不常用的&lt;code&gt;App&lt;/code&gt;，另一个开发&lt;code&gt;App&lt;/code&gt;的成本本身也比较大。很多企业开始转向微信的公众号、小程序开发。&lt;/p&gt;
&lt;h2 id="Python"&gt;Python&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Python&lt;/code&gt;应该是目前炒作做厉害的语言。我想说的是，真的只是各个培训机构的炒作而已。我过去自己长期用&lt;code&gt;Python&lt;/code&gt;的&lt;code&gt;Web.py&lt;/code&gt;框架开发项目。然而&lt;code&gt;Web&lt;/code&gt;方向上&lt;code&gt;Python&lt;/code&gt;一个比较完美的框架都没有。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Web.py&lt;/code&gt;，是一个好东西，然而作者仙去了。
&lt;code&gt;Django&lt;/code&gt;，用起来和&lt;code&gt;Rails&lt;/code&gt;、&lt;code&gt;Laravel&lt;/code&gt;比，太难用了。
&lt;code&gt;Tornado&lt;/code&gt;，性能高，可是严重缺轮子。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;国内&lt;code&gt;Python&lt;/code&gt;两大站点，一个豆瓣、一个知乎。除此外，你基本找不到其他有一定知名度的站点了。知乎目前主程序还要开始往&lt;code&gt;Golang&lt;/code&gt;上迁移。&lt;/p&gt;

&lt;p&gt;另外&lt;code&gt;Python&lt;/code&gt;的&lt;code&gt;大数据&lt;/code&gt;、&lt;code&gt;人工智能&lt;/code&gt;等等，我劝你清醒一点。一般搞开发的公司不需要做这个，需要做这个的公司不会要你。尤其是&lt;code&gt;人工智能&lt;/code&gt;，不是名校的研、博，或者有一定业界知名度的人士，你想都不要想。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Python&lt;/code&gt;的爬虫，我觉得也不是什么公司都需要的。正常自己开发运营的公司，用到的点也不多。&lt;/p&gt;

&lt;p&gt;我觉得可能你学完后，就业最大可能的方向就是去搞服务器运维了。&lt;/p&gt;
&lt;h2 id="Ruby"&gt;Ruby&lt;/h2&gt;
&lt;p&gt;毫无疑问，这是我个人最喜爱的语言，没有之一。语言本身的各种优点，人性化都让我深深喜爱。我自己公司的项目，我也选择了使用&lt;code&gt;Ruby On Rails&lt;/code&gt;来开发，有兴趣的可以了解我在 ruby china 的另一篇帖子，&lt;a href="https://ruby-china.org/topics/35298" title=""&gt;展示一下自己的第一个 Rails 作品&lt;/a&gt;。各种完善便利我就不一一道来了。&lt;/p&gt;

&lt;p&gt;那我主要想要谈的是&lt;code&gt;Ruby&lt;/code&gt;的就业问题。在我所在的武汉这种城市，用&lt;code&gt;Ruby&lt;/code&gt;做开发的公司，包括我，大概 4~5 家。满眼看下去，净是&lt;code&gt;PHP&lt;/code&gt;、&lt;code&gt;Java&lt;/code&gt;。你能在这种城市找到合适的&lt;code&gt;Ruby&lt;/code&gt;工作，算我佩服。
但是如果你去一线城市，那就不一样了，这种机会就要多的多。&lt;/p&gt;

&lt;p&gt;意见就是，如果你在一线城市，学&lt;code&gt;Ruby&lt;/code&gt;是一个很好想法。如果是二线就算了，不要到时候饭都没有吃的。&lt;/p&gt;
&lt;h2 id="我的学习经历"&gt;我的学习经历&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;PHP&lt;/code&gt;是我吃饭的家伙。不过我给我自己的女儿取英文名叫&lt;code&gt;Ruby&lt;/code&gt;，儿子取英文名叫&lt;code&gt;Python&lt;/code&gt;。家里的垃圾桶就叫&lt;code&gt;Java&lt;/code&gt;。你就该知道我对他们的看法了。&lt;/p&gt;

&lt;p&gt;我个人是先学了&lt;code&gt;PHP&lt;/code&gt;，并一直以此为生。后来自学了&lt;code&gt;Java&lt;/code&gt;，不过感觉&lt;code&gt;Java&lt;/code&gt;的各种理念与我自由的内心实在不合，于是反而变得非常烦此语言。再后来又自学了&lt;code&gt;Python&lt;/code&gt;，并用他做了一些项目。最后接触的是&lt;code&gt;Ruby&lt;/code&gt;，也是我最喜欢的了。&lt;/p&gt;
&lt;h2 id="我的推荐"&gt;我的推荐&lt;/h2&gt;
&lt;p&gt;如果你现在急着就业，那么&lt;code&gt;PHP&lt;/code&gt;是一个比较好的选择。你可以和我一样，先由&lt;code&gt;PHP&lt;/code&gt;入行，等这一门语言自己觉得能力没有任何问题了，再去学习其他的语言，开阔自己的眼界。&lt;/p&gt;

&lt;p&gt;如果你在一线城市，&lt;code&gt;Ruby&lt;/code&gt;也是很好的选择，二线城市请慎重。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Python&lt;/code&gt;我也比较喜欢，只是目前我没有怎么用它，主要做的都是&lt;code&gt;PHP&lt;/code&gt;和&lt;code&gt;Ruby&lt;/code&gt;的开发工作。你如果想从事运维工作，可以选择这个。&lt;code&gt;Python&lt;/code&gt;的其他方向劝你慎重。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;最后做一个总结，前三句话来自网络，最后一句是我自己加上的。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;假如你想帮他尽快找个活儿，赚到钱，推荐&lt;code&gt;PHP&lt;/code&gt;。
假如你想让他成为一个高效工程师，推荐&lt;code&gt;Python&lt;/code&gt;。
假如你想让他爱上他的工作，推荐&lt;code&gt;Ruby&lt;/code&gt;。
假如你想让他自己跟自己过不去，就当一个书呆子，推荐&lt;code&gt;Java&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;套用一句经典的广告：&lt;code&gt;别看广告，看疗效&lt;/code&gt;。
到底好不好，别要一味听网络宣传。只有自己去分析下真实的数据，自己都体验一下，你才知道到底哪个好，哪个适合自己。&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Mon, 26 Mar 2018 16:06:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/35326</link>
      <guid>https://ruby-china.org/topics/35326</guid>
    </item>
    <item>
      <title>展示一下自己的第一个 Rails 作品 - clwy.cn</title>
      <description>&lt;p&gt;先发一下网址了：&lt;a href="https://clwy.cn" rel="nofollow" target="_blank" title=""&gt;长乐未央&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="我的开发之路"&gt;我的开发之路&lt;/h2&gt;
&lt;p&gt;我自己最初以前一直是写&lt;code&gt;PHP&lt;/code&gt;和&lt;code&gt;前端&lt;/code&gt;的，现在武汉，自己开了一家 PHP 和前端的培训公司，基本就靠这两个为生。&lt;/p&gt;

&lt;p&gt;后来觉得 PHP 写腻了，又换&lt;code&gt;Python&lt;/code&gt;玩了挺长一段时间，当时主要使用的是&lt;a href="http://webpy.org/" rel="nofollow" target="_blank" title=""&gt;Web.py&lt;/a&gt;，可惜的是&lt;code&gt;Aaron Swartz&lt;/code&gt;不在后，这框架就前景堪忧了。其他的&lt;code&gt;Django&lt;/code&gt;之类的又觉得太难用，&lt;code&gt;SQLAlchemy&lt;/code&gt;也感觉非常复杂。&lt;/p&gt;

&lt;p&gt;对 Ruby 一直很感兴趣，觉得语法上很多和&lt;code&gt;Python&lt;/code&gt;相似的地方。于是就花时间学习了下。不学还好，学了后，我连&lt;code&gt;Python&lt;/code&gt;看都不想看了。。。。于是现在它被我彻底打入冷宫了。&lt;/p&gt;

&lt;p&gt;目前平常工作，在办公室就是&lt;code&gt;PHP&lt;/code&gt;，回家后自己搞就是&lt;code&gt;Ruby&lt;/code&gt;了。虽然要靠&lt;code&gt;PHP&lt;/code&gt;吃饭，然而&lt;code&gt;Ruby&lt;/code&gt;却更是我心头好。&lt;/p&gt;

&lt;p&gt;至于&lt;code&gt;Elixir&lt;/code&gt;我也尝试过，目前还感觉不是太完善，缺的轮子太多。就不多发表意见了。&lt;/p&gt;

&lt;p&gt;对我来说：
写&lt;code&gt;PHP&lt;/code&gt;，是吃饭的家伙，如鱼得水，随心所欲。
写&lt;code&gt;Python&lt;/code&gt;，感觉就像是有个高效、简练的秘书帮我办事。
写&lt;code&gt;Ruby&lt;/code&gt;，感觉是找了个最贴心的的小情人。&lt;/p&gt;
&lt;h2 id="长乐未央是干嘛的？"&gt;长乐未央是干嘛的？&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://clwy.cn" rel="nofollow" target="_blank" title=""&gt;clwy.cn&lt;/a&gt;是我正式用&lt;code&gt;Ruby On Rails&lt;/code&gt;开发的第一个比较完整的项目（以前的一些小练习就不算了）。这里对开发中所使用的一些技术和大家探讨一下，欢迎老手吐槽，新手借鉴。&lt;/p&gt;

&lt;p&gt;因为我自己是在武汉搞&lt;code&gt;PHP&lt;/code&gt;和&lt;code&gt;前端&lt;/code&gt;培训的嘛，于是想搞一个在线教育的平台。学生或者其他同学，可以通过它来在线学习一些知识。里面现在放的都是我自己录制的一些课程视频。目前能看的主要是&lt;code&gt;Mac OS&lt;/code&gt;、&lt;code&gt;Laravel框架&lt;/code&gt;、&lt;code&gt;Workerman&lt;/code&gt;的一些课程，其他一些课程再陆续录制推出了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/84dd648e-3f5e-45f0-b015-5d4d3b99ce62.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;上面自己做的课程中的配图，感觉&lt;code&gt;Laravel&lt;/code&gt;基本就是各种模仿&lt;code&gt;Rails&lt;/code&gt;，而且是模仿的最像的一个，于是&lt;code&gt;Laravel&lt;/code&gt;我也用的挺舒服的，主要教学生也都是这个框架了。于是我就搞了这么一套课程。把&lt;code&gt;Rails&lt;/code&gt;和&lt;code&gt;Laravel&lt;/code&gt;都介绍了一下。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/f4659491-40bc-4757-b3c5-8784b863a11f.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="使用的技术"&gt;使用的技术&lt;/h2&gt;&lt;h3 id="1、UI设计"&gt;1、UI 设计&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/adf1f675-2d1e-42de-8f6d-0eae9a5f31c5.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;很多人第一眼看到，会觉得整站风格感觉很还不错。但是不好意思，我个人并不会做设计，我只觉得自己审美还算可以。。。设计是我到处抄的，不过各种功能代码都是自己写的了。&lt;/p&gt;
&lt;h3 id="2、Turbolinks"&gt;2、Turbolinks&lt;/h3&gt;
&lt;p&gt;站点使用了&lt;code&gt;Turbolinks&lt;/code&gt;，虽然开发时候，碰到了各种难以解决的奇怪 js 问题，不过多次调试下，最终还是完美解决了。
带来最大的好处，一个是整站无刷新了，体验好。再一个因为自带缓存的能力，所以页面加载速度非常快。
第一个需要注意的是，把以前 jQuery 天天写的&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&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 javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;turbolinks:load&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&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;另一个需要注意的是，整合部分 jQuery 插件的时候，可能还是会出现问题。那么你可以尝试&lt;code&gt;head&lt;/code&gt;标签里加上如下代码，这个问题一般插件的 Readme 里都有相关说明。&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"turbolinks-cache-control"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"no-cache"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="3、缓存"&gt;3、缓存&lt;/h3&gt;
&lt;p&gt;缓存，主要参考了&lt;code&gt;huacnlee&lt;/code&gt;的&lt;a href="https://ruby-china.org/topics/19436" title=""&gt;Cache 在 Ruby China 里面的应用&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我觉得此文非常有学习价值，学习后我给前台大量加上了&lt;code&gt;Fragment Cache&lt;/code&gt;，目前我自己测试的，基本&lt;a href="https://clwy.cn" rel="nofollow" target="_blank" title=""&gt;长乐未央&lt;/a&gt;的每个页面响应时间都在 30~50ms 之间。&lt;/p&gt;
&lt;h3 id="4、图片、视频"&gt;4、图片、视频&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/46976239-6b7c-466d-91a0-3dab3b25e9ae.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这些静态资源全部统一放在了&lt;code&gt;七牛云&lt;/code&gt;上。项目后台的上传图片，使用的是&lt;a href="https://github.com/carrierwaveuploader/carrierwave/" rel="nofollow" target="_blank" title=""&gt;carrierwave&lt;/a&gt; + &lt;a href="https://github.com/huobazi/carrierwave-qiniu/" rel="nofollow" target="_blank" title=""&gt;carrierwave-qiniu&lt;/a&gt;开发的。基本没什么需要注意的，看&lt;code&gt;Github&lt;/code&gt;的文档照着搞就行了。&lt;/p&gt;

&lt;p&gt;视频上传，因为比较大，于是我直接在七牛后台上传了。&lt;/p&gt;
&lt;h3 id="5、用户模块"&gt;5、用户模块&lt;/h3&gt;
&lt;p&gt;用户的登录注册，使用了&lt;a href="https://github.com/plataformatec/devise/" rel="nofollow" target="_blank" title=""&gt;devise&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;异步发邮件使用了&lt;a href="https://github.com/mhfs/devise-async/" rel="nofollow" target="_blank" title=""&gt;devise-async&lt;/a&gt; + &lt;a href="https://github.com/mperham/sidekiq/" rel="nofollow" target="_blank" title=""&gt;sidekiq&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/d46161b4-0eb1-4138-b2f6-1fab9b3f28d7.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;第三方的&lt;code&gt;QQ&lt;/code&gt;和&lt;code&gt;Github&lt;/code&gt;登录，使用的是&lt;a href="https://github.com/beenhero/omniauth-qq/" rel="nofollow" target="_blank" title=""&gt;omniauth-qq&lt;/a&gt;、&lt;a href="https://github.com/intridea/omniauth-github/" rel="nofollow" target="_blank" title=""&gt;omniauth-github&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/a149dcb2-050c-43f8-9107-f52d4e9211ad.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="6、markdown"&gt;6、markdown&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/eecc047b-c23e-4653-a47f-45c2637e59a6.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;课程的资料部分都是用了的是&lt;code&gt;markdown&lt;/code&gt;书写，使用的是&lt;a href="https://github.com/vmg/redcarpet/" rel="nofollow" target="_blank" title=""&gt;redcarpet&lt;/a&gt; + &lt;a href="https://github.com/tmm1/pygments.rb/" rel="nofollow" target="_blank" title=""&gt;pygments.rb&lt;/a&gt;这两个 gem。&lt;/p&gt;
&lt;h3 id="7、省市区三级联动"&gt;7、省市区三级联动&lt;/h3&gt;
&lt;p&gt;用户修改资料部分，有一个省市区的选择，我使用了&lt;a href="https://github.com/saberma/china_city/" rel="nofollow" target="_blank" title=""&gt;china_city&lt;/a&gt;，他的数据来自于淘宝。能精确到每一个街道，使用简单方便，非常推荐了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/96405ece-b628-4364-812e-f2dc555a8a06.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="8、表单"&gt;8、表单&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/e4c717ec-96f0-4965-ac0c-202512421af2.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;表单部分，全部都是&lt;a href="https://github.com/plataformatec/simple_form/" rel="nofollow" target="_blank" title=""&gt;simple_form&lt;/a&gt;了，这个没啥好说的了。&lt;/p&gt;
&lt;h3 id="9、进度条"&gt;9、进度条&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/ad1f865a-7788-405c-a9bd-b68853c3bb5e.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;不同页面跳转，顶部出现的红色进度条，用的是&lt;a href="https://github.com/caarlos0-graveyard/nprogress-rails" rel="nofollow" target="_blank" title=""&gt;nprogress-rails&lt;/a&gt;。文档里都给好调用方式了，直接拿过来用就行。&lt;/p&gt;
&lt;h3 id="10、点赞、关注、购买课程"&gt;10、点赞、关注、购买课程&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/0fef023a-f23d-4f47-86f0-172a18ddd7d5.jpg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/c3639d43-605c-4d48-a528-23f18b148fc4.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这些功能，统一使用了&lt;code&gt;huacnlee&lt;/code&gt;发布的 &lt;a href="https://ruby-china.org/topics/32262" title=""&gt;action-store&lt;/a&gt;，用起来真是非常方便啊，凡是这种类似的需求，你都可以用这个。强列推荐！&lt;/p&gt;
&lt;h3 id="11、数据分页"&gt;11、数据分页&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/e6e6b568-e250-49c3-8b4f-2b0c2fedb1b0.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;不用说了，就是它&lt;a href="https://github.com/kaminari/kaminari/" rel="nofollow" target="_blank" title=""&gt;kaminari&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="12、系统的配置信息"&gt;12、系统的配置信息&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/7b9caf2b-43f8-421d-a76a-466d140d4199.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;参考了&lt;code&gt;homeland&lt;/code&gt;的源码，发现了这么个好东西，还是&lt;code&gt;huacnlee&lt;/code&gt;发布的&lt;a href="https://github.com/huacnlee/rails-settings-cached/" rel="nofollow" target="_blank" title=""&gt;rails-settings-cached&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="13、数据可视化（个人中心）"&gt;13、数据可视化（个人中心）&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/86bbd741-1301-4b92-9105-8e3bcff51f58.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;使用了&lt;a href="https://github.com/logical42/d3_rails/" rel="nofollow" target="_blank" title=""&gt;d3_rails&lt;/a&gt; + &lt;a href="https://github.com/SunnyLi/c3-rails/" rel="nofollow" target="_blank" title=""&gt;c3-rails&lt;/a&gt;，这个我觉得没有百度的&lt;a href="http://echarts.baidu.com/" rel="nofollow" target="_blank" title=""&gt;echarts&lt;/a&gt;用起来容易，我改这个的时候很花费了一点时间。&lt;/p&gt;
&lt;h3 id="14、验证码"&gt;14、验证码&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/3e1c62fc-e411-48b8-a282-241ce14ca782.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;地球人都在用的，依然是&lt;code&gt;huacnlee&lt;/code&gt;发布的&lt;a href="https://ruby-china.org/topics/32192" title=""&gt;rucaptcha&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="15、支付"&gt;15、支付&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/527dd592-9a8e-424e-8cbf-3dad1b5d806f.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;课程、会员的购买支付，我用了&lt;code&gt;chloerei&lt;/code&gt;的 &lt;a href="https://github.com/chloerei/alipay/blob/master/doc/quick_start_cn.md" rel="nofollow" target="_blank" title=""&gt;alipay&lt;/a&gt; + &lt;a href="https://github.com/bkeepers/dotenv/" rel="nofollow" target="_blank" title=""&gt;dotenv-rails&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="16、聊天"&gt;16、聊天&lt;/h3&gt;
&lt;p&gt;课程的实时聊天、推送信息功能也开发了，调试的还有一点 bug，暂时还没有正式发布。使用的是&lt;code&gt;Action Cabel&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;其中&lt;code&gt;@&lt;/code&gt;多个用户，用到了&lt;a href="https://ruby-china.org/topics/29562" title=""&gt;bulk_insert&lt;/a&gt;，批量插入数据库。&lt;/p&gt;

&lt;p&gt;通知信息的提示，使用的是 &lt;a href="https://github.com/rails-engine/notifications" rel="nofollow" target="_blank" title=""&gt;notifications&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="17、移动端"&gt;17、移动端&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/e6aa77e8-0da3-4d1a-a300-d4fa5220cd6f.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;我选择的方案是，同一个地址，PC 访问就是 PC 的界面，手机访问就是手机的界面。并没有去搞另一个叫&lt;code&gt;m.clwy.cn&lt;/code&gt;的 url。采用的技术是&lt;code&gt;Action Pack Variants&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;application_controller&lt;/code&gt;中，加上如下代码，判断设备的类型。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;before_action&lt;/span&gt; &lt;span class="ss"&gt;:detect_browser&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_browser&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_agent&lt;/span&gt;
      &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/iPad/i&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:tablet&lt;/span&gt;
      &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/iPhone/i&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:mobile&lt;/span&gt;
      &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/Android/i&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="sr"&gt;/mobile/i&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:mobile&lt;/span&gt;
      &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/Android/i&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:tablet&lt;/span&gt;
      &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/Windows Phone/i&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:mobile&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:desktop&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;code&gt;@new_courses&lt;/code&gt;。如果不写这个，那公共部分的数据就都会发送给&lt;code&gt;view&lt;/code&gt;，例如&lt;code&gt;@course&lt;/code&gt;。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#当前课程&lt;/span&gt;
&lt;span class="vi"&gt;@course&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:photo&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:tags&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;#最新课程&lt;/span&gt;
&lt;span class="vi"&gt;@new_courses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:photo&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;published&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recent&lt;/span&gt;

&lt;span class="n"&gt;respond_to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;desktop&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="vi"&gt;@new_courses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@new_courses.limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mobile&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="vi"&gt;@new_courses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@new_courses.limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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;&lt;code&gt;view&lt;/code&gt;部分，也会自动加载不同的&lt;code&gt;html&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/courses/show.html.erb
app/views/courses/show.html+mobile.erb
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="18、视频播放"&gt;18、视频播放&lt;/h3&gt;
&lt;p&gt;用的就是&lt;a href="http://videojs.com/" rel="nofollow" target="_blank" title=""&gt;video.js&lt;/a&gt;啊，他的一些定制功能开发我暂时还没时间处理。目前能播放就行了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/105d1332-6bf0-4beb-8e6f-44c9365fb5c0.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;项目用到的技术大概就上面这些了，欢迎大家和我讨论。
也希望上面的介绍能对&lt;code&gt;Rails&lt;/code&gt;新同学有一些帮助。
项目里如果哪里感觉不合理，也欢迎提建议给我。&lt;/p&gt;</description>
      <author>canonpd</author>
      <pubDate>Thu, 22 Mar 2018 18:30:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/35298</link>
      <guid>https://ruby-china.org/topics/35298</guid>
    </item>
  </channel>
</rss>
