• 使用 OpenWrt 默认的 DHCP 的话,可以直接使用设备 主机名.lan

  • 设置了 MALLOC_ARENA_MAX=2 ,使用 3.1.0-preview1 的时候我的 Rails 项目有一个常驻进程会持续内存泄漏,降级到 3.0.3 后这个现象就消失了。

    另外之前用 3.1.0-preview1 的时候我需要禁用 newrelic_rpm

    当时我需要添加 4 个 gem :

    gem 'digest', '~> 3.1.0.pre2', require: false
    gem 'net-imap', '~> 0.2.2', require: false
    gem 'net-pop', '~> 0.1.1', require: false
    gem 'net-smtp', '~> 0.3.0', require: false
    
  • mac 上 emacs 入门 at 2021年11月23日
  • foreman:export 会在服务器生成各个 foreman 任务相关的 systemd 配置。

    我的理解是, Rails 项目需要管理的进程除了 puma, sidekiq ,可能还会有一系列用户编写的常驻进程,以 Procfile 的方式提供启动指令(比如监听 MQTT/RabbitMQ 的 worker )

  • capistrano-foreman

    cap production foreman:export
    

    Capfile

    require 'capistrano/foreman'
    

    lib/capistrano/tasks/foreman.rake

    after 'deploy:finished' do
      invoke 'foreman:export'
      invoke 'foreman:restart'
    end
    

    拿走不谢 😏

  • 这段代码抛的异常是 Sequel::DatabaseErrorSQLite3::SQLException 不是 Sequel::DatabaseError 的父类,自然捕获不到。

  • rescue StandardError => e
      puts e.class # Sequel::DatabaseError
    end
    
    e.inspect # #<Sequel::DatabaseError: SQLite3::SQLException: table posts has no column named mail>
    
  • Fork 改 Gemfile 用 github:

  • 一共要选出 4 个人,可以先从 8 个人里把 2 个培训计算机的选出来,然后从剩下 6 个人里选出 1 个英语培训的,最后 5 个人里选出 1 个财务培训的。

  • 学前端直接入 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