• 学前端直接入 Next.js 啊,结合国内情况,考虑到小程序之类的支持,Rails 只提供 API 也还好啦。完美的前后端同构方案我目前是还没了解到。

  • rbs 将给 ruby 带来质的改变 at 2021年07月14日

    RBS & Solagraph

    看不出来为何使用编辑器=拒绝 RBS,Matz 在 19 年的 RubyConf China 都点名 Solargraph 了。

    我现在就用 Emacs+TIDE 写 TypeScript

  • 报名

  • 我没注意看到 5 个名额 😂

  • 另外墙裂推荐已经免费了的 Terraform Cloud 存储 remote state

  • 可以以 TF_VAR_name 这种形式的环境变量给变量设置值, .tfvars 文件可以不用放进版本库。 TF_VAR_name

    .tfvars 的一个使用场景就是把测试环境工作目录下的 .tf 文件全部复制到生产环境,改改 .tfvars ,就能搭建出一致的生产环境了。

  • 用过,推荐

  • W3Schools 有个 Demo 你可以试一下。

    把中间那行改成

    $.ajax({url: "demo_ajax_script.js", dataType: "script", success: function (result) { console.log(result) }});
    

    就可以在控制台看到效果了,success 的 result 是 response body 的纯文本表示。

    尤其注意的是,浏览器已经把 success 的 response body 当作 JavaScript 代码执行过一次了。

  • Rails 连接数据库出错 at 2021年05月12日

    我复制了你的 database.yml ,没有问题,可以正常创建数据库。(我把 socket: /tmp/mysql.sock 改成 host: 了)

    正如楼上所说,检查一下 DATABASE_URL 环境变量吧。

  • Elixir 进展和学习 at 2021年04月30日

    ThinkPHP 3.2.3 啊我大学里的青春 😂

    因为 ThinkPHP 了解到 Laravel,又从 Laravel 了解到 Rails 😆

  • Ruby 值得一学 at 2021年04月28日

    非宁静无以致远

  • CloudFormation 试用过一下,太繁琐了,而且 AWS 限定。

    这样建议吧:学习 CloudFormation 的时间,可以用来学好几个 Terraform 了,不妨先熟悉一下 Terraform,学习成本极低,配置简洁,表意明确。

    就以我了解的 DevOps 团队来说,都是用 Terraform,没有用 CloudFormation 的。

    (小声:如果 Terraform 不成功,为啥连国内的阿里云都铁了头要支持 😏 https://github.com/aliyun/terraform-provider-alicloud https://api.aliyun.com/#/cli?tool=Terraform

  • 用一次 Terraform 当运维都快乐了 😆

  • 因为都是追求 程序员幸福最大化 的人 😆

  • 利用好元编程重构下代码 at 2021年04月20日

    我也想写成 Immutable 的,只是没打算投入更多时间。因为非 Immutable,特地没有写成链式的。private 你也提到了,把我对这段代码的顾虑都说出来了哈哈。

  • 利用好元编程重构下代码 at 2021年04月08日

    拿走不谢

    spec/vip_money_spec.rb

    require 'rspec/mocks'
    require 'vip_money'
    
    RSpec.describe 'vip_money' do
      subject { vip_money }
    
      let(:sale) do
        {
          month: {
            money: 1600, original_money: 2000, unit: 2000, discount: 0.8,
            saving: 0.2, saving_money: 400
          },
          quarter: {
            money: 4000, original_money: 6000, unit: 1666.67, discount: 0.67,
            saving: 0.33, saving_money: 2000
          },
          semi_annual: {
            money: 6400, original_money: 12_000, unit: 1333.34, discount: 0.54,
            saving: 0.46, saving_money: 5600
          },
          year: {
            money: 11_200, original_money: 24_000, unit: 1166.67, discount: 0.47,
            saving: 0.53, saving_money: 12_800
          }
        }
      end
    
      before do
        stub_const('Order::TYPE_MONEY', [2000, 5000, 8000, 14_000])
        allow(self).to receive(:test_money_discount).and_return(0.8)
      end
    
      it { is_expected.to eq sale }
    end
    

    lib/vip_money.rb

    require 'active_support/all'
    require 'order'
    require 'sale_detail'
    require 'test_money_discount'
    
    def vip_money
      month_money, quarter_money, semi_annual_money, year_money = Order::TYPE_MONEY
      user_discount = test_money_discount
    
      sale_detail = SaleDetail.new(month_money, user_discount)
    
      %i[month quarter semi_annual year].index_with do |period|
        sale_detail.send("by_#{period}!", binding.local_variable_get("#{period}_money"))
        sale_detail.attributes
      end
    end
    

    lib/order.rb

    class Order
      TYPE_MONEY = [2000, 5000, 8000, 14_000].freeze
    end
    

    lib/sale_detail.rb

    require 'bigdecimal'
    require 'active_support/all'
    
    class SaleDetail
      attr_reader :monthly, :user_discount, :price, :months
    
      def initialize(monthly, user_discount)
        @monthly = BigDecimal(monthly.to_s)
        @user_discount = BigDecimal(user_discount.to_s)
      end
    
      def attributes
        {
          money: total.ceil(2),
          original_money: original.ceil(2),
          unit: unit.ceil(2),
          discount: discount.ceil(2),
          saving: saving.floor(2),
          saving_money: saved.floor(2)
        }
      end
    
      def by_month!(price, months = 1)
        @months = months
        @price = BigDecimal(price.to_s)
      end
    
      def by_quarter!(price)
        by_month!(price, 3)
      end
    
      def by_semi_annual!(price)
        by_month!(price, 6)
      end
    
      def by_year!(price)
        by_month!(price, 12)
      end
    
      def total
        price * user_discount
      end
    
      def original
        monthly * months
      end
    
      def unit
        price / months
      end
    
      def discount
        total / original
      end
    
      def saving
        1 - discount
      end
    
      def saved
        original - total
      end
    end
    

    lib/test_money_discount.rb

    def test_money_discount
      0.8
    end
    
  • 利用好元编程重构下代码 at 2021年04月08日

    考虑提炼值对象,利用多态重构一下?

  • 8G 内存实在不够,主要是前端项目和浏览器费内存,再买开发机内存 16G 起步,XPS 9360 不能加内存难受。

  • GNU Emacs + Solargraph

  • Rails 6.1 升级记录 at 2020年12月16日

    可以尝试一下。我开发环境一堆 worker,用 foreman 一键就全启动了。生产环境用 capistrano-foreman 可以给所有的 worker 生成 systemd 服务。

  • Rails 6.1 升级记录 at 2020年12月15日

    另外不尝试一下 capistrano-foreman 么?

  • Rails 6.1 升级记录 at 2020年12月15日

    Delegated Types 👍

  • Matz 说令人痛心的是,Ruby 也是因为在国外先流行起来,才开始在发源地日本流行的 😂

  • XX 过多导致视觉模糊。

  • 感谢各位回复,了解了一下大家更新数据表的常规思路。

  • 这个场景做到了兼容旧版数据库确实不需要停机

  • 总结来看,这样的一次发布会包含两个 migration 和一个数据更新。

    post 不包含 user_id 的旧业务逻辑

    • migration 1:posts 添加 user_id (nullable, default null)(以及创建 users 表)
    • 执行更新脚本:把所有 posts 的 user_id 更新到一致状态

    post 包含 user_id 的新业务逻辑

    • migration 2:posts 的 user_id 去掉 nullable 和 default null

    执行更新脚本之前,到 post 包含 user_id 的新业务逻辑发布的这段时间,为了防止空 user_id 的新 post 产生,需要停机,我这样理解对吗?

  • https://guides.rubygems.org/make-your-own-gem/

    这个流程走一遍就知道了,其本按类和嵌套关系组织。

  • t.references :operator, foreign_key: { to_table: :users }
    t.references :reviewer, foreign_key: { to_table: :users }
    
  • 牛逼!