• @wppurking

    那现在核心是 "让一人负责基础设施" 的部署, 小团队没有问题, 再大一点的团队可能会有基础设施的构建权限或者基础设施的变化的问题.

    多谢回复。

    是的,目前不到10个人,IAM权限没有分那么细,实际进行terraform plan限制成2个人来减少误操作。

    从安全问题考虑的话,我觉的主要是在IAM对开发人员的权限进行分配。

    比如一般的人员只可以执行获取resource的操作,无法删除,更改之类的

    这样一般开发人员即使terraform destroy,并且输入yes以后,也不会被拉出去祭天。。

    当然相应的开发就没那么方便了,如何取舍取决于你目前的团队

  • @wppurking

    Terraform Collaboration for Everyone 目前还没用过,还没感觉到使用的必要性(以后也许会)

    terraform apply目前是在sandbox构建以后,merge到mater,然后自动在CI上面进行

    也许有点多余了,让固定的一个人从本地执行也许就够了,毕竟更改不是那么频繁

    terraform destroy基本只在sandbox测试的时候用,production目前还没用到

  • 微服务好像喜欢这样? GCP + Kubernetes + Go + Other language

  • 需要子类实现的话,应该是protected吧

    class A
        protected
         def  priv_a
                 3
         end
    end
    
    class B   < A
        def priv_a
              5
        end
    end
    

    要实现类似JAVA之类的private,可以看下这个

    https://stackoverflow.com/questions/1565269/are-there-good-reasons-for-private-to-work-the-way-it-does-in-ruby/1565640#1565640

  • 源码有注释,开头和结尾必须都是数字才返回size

    Both the begin and the end of the Range must be Numeric, otherwise nil is returned.

    # rng.size                   -> num
    # 
    # Returns the number of elements in the range. Both the begin and the end of
    # the Range must be Numeric, otherwise nil is returned.
    # 
    #   (10..20).size    #=> 11
    #   ('a'..'z').size  #=> nil
    #   (-Float::INFINITY..Float::INFINITY).size #=> Infinity
    def size()
        #This is a stub, used for indexing
    end
    
  • 终于把cell gem删除了

    为了尽量少改动代码,扩展render partial来实现了类似的接口

    1. 添加一个helper

    # app/helpers/cell_helper.rb
    
    module CellHelper
      def cell(cell_name, options = {})
        cell_class = class_from_cell_name(cell_name)
        cell_class.new(self, options)
      end
    
      private
    
      def class_from_cell_name(name)
        "#{name}_cell".camelize.constantize
      end
    end
    

    2. 添加一个cell的base类

    # app/cells/cell_base.rb
    
    class CellBase
      attr_reader :context
    
      def initialize(context, options = {})
        @context = context
        @options = options
      end
    
      def call(method_name, options = {})
        send(method_name, options)
      end
    
      protected
    
      def render(options = {})
        locals = options.fetch(:locals, {})
        locals = locals.merge(cell: self)
        called_method_name = caller_locations(1, 1)[0].label
    
        context.render(
          partial: template_file_path(called_method_name, options),
          locals: locals
        )
      end
    
      def template_file_path(method_name, options)
        file_name = options[:file].present? ? options[:file] : method_name
    
        folder = self.class.to_s.underscore[0..-6]
        "#{folder}/#{file_name}"
      end
    end
    

    3. 让所有的cell类都继承CellBase

    class SampleCell < CellBase
    end
    

    4. 把xxx.erb文件改成_xxx.html.erb文件(partial file)

  • 如何给 Rails 做 health check at 2018年11月12日

    我们目前也使用AWS

    scaling 使用的是Auto Scaling,当CPU或者内存超过一定量的时候,就自动启动新的EC2 Instance

    health check 用的NewRelic Infrastructure来监视nginx,unicorn等进程,发现异常后发送到slack

    如果只是一时的大量请求,仅仅扩展web server就可以解决的话,用Auto Scaling应该可以解决问题

    AWS的health check没实际用过,看了下文档,好像支持任意的command,可以换成监视pumma的进程挂没挂 https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html

  • 顶级作用域中定义的方法会成为Object的private方法,和下面的定义一样

    class Object
      private
    
      def meet
        puts in main
      end
    end
    

    几乎所有对象,类都继承于Object,所以他们也间接的拥有了私有方法 meet

    #                            +---------+             +-...
    #                            |         |             |
    #            BasicObject-----|-->(BasicObject)-------|-...
    #                ^           |         ^             |
    #                |           |         |             |
    #             Object---------|----->(Object)---------|-...
    #                ^           |         ^             |
    #                |           |         |             |
    #                +-------+   |         +--------+    |
    #                |       |   |         |        |    |
    #                |    Module-|---------|--->(Module)-|-...
    #                |       ^   |         |        ^    |
    #                |       |   |         |        |    |
    #                |     Class-|---------|---->(Class)-|-...
    #                |       ^   |         |        ^    |
    #                |       +---+         |        +----+
    #                |                     |
    #   obj--->OtherClass---------->(OtherClass)-----------...
    

    源文件中定义也是一样的,我是这样测试的

    1. 写个test.rb文件

    def meet
      puts '213'
    end
    
    meet
    
    obj = Object.new
    obj.meet
    

    2. 执行以后可以发现一般的对象也拥有了meet私有方法

    $ ruby test.rb
    213
    test.rb:8:in `<main>': private method `meet' called for #<Object:0x007fda1107c4f0> (NoMethodError)
    
  • @easy_install 有参考Ruby程序员修炼之道,实际开发中我用的最多的是4和5,其他的感觉风险有点高,很少用到

  • Ruby China 7 岁生日快乐 at 2018年10月31日

    🎁 🎁 🎁 🎉 🎉 🎉 🎉

  • google analytics或者
    td-agent + google bigquery自己定义字段来统计

  • 感觉好像广告

  • 用 Docker 构建开发环境 at 2018年10月16日

    @ad583255925 @yukihiro_matz
    目前项目用的是AWS ECS + CircleCI来部署,负载均衡是ELB

  • 能说下为什么要禁止使用stylesheet_link_tag吗? 把背景说清楚,或许有更好的方法来解决

  • 应该是,不过很少那样写,用 . 就可以了

    The :: is a unary operator that allows: constants, instance methods and class methods defined within a class or module, to be accessed from anywhere outside the class or module.
    Remember: in Ruby, classes and methods may be considered constants too.

    这篇文章可以看看
    https://cbabhusal.wordpress.com/2015/03/26/ruby-ruby-dot-and-double-colon-operators/

  • 暂时把cell的render改成了rails的render

    class CellBase < Cell::ViewModel
      attr_accessor :response_body
    
      include AbstractController::Rendering
      include AbstractController::Helpers
      include ActionView::Layouts
    
      helper ApplicationHelper
      include ApplicationHelper
    
      self.view_paths = ['app/cells']
    
      def self.supports_path?
        true
      end
    
      def action_name
        caller(5, 1)[0].match(/`(\w+)/)[1]
      end
    
      # 让view中可以访问cell class里面的方法
      def self.inherited(klass)
        def klass.method_added(name)
          helper_method(name)
        end
      end
    end
    
  • ruby 中如何定义枚举值 at 2018年10月09日

    有类似的

    1. active enum

    2. module

    module Gender
      FEMALE = 1 # 女性
      MALE   = 2 # 男性
      LABELS = { FEMALE => '女性', MALE => '男性' } # 也可以使用I18n来定义
    end
    
    Gender::FEMALE
    Gender::MALE
    
  • 写 Responsive 页面的总结 at 2018年10月04日
  • @posee 我以前半年,现在一年,因人而异吧

  • @Rei 目前我也是这么想的,因为感觉这个gem不太稳定(突然设计风格就变了)
    只是目前所有页面都是cell写的,这改造的活量有点大
    所以问问看有没有类似问题的人,借鉴一下经验

  • @Rei
    我用的docker-sync, 速度还行 https://ruby-china.org/topics/37289

  • 写 Responsive 页面的总结 at 2018年10月01日

    @luikore 第一次做responsive的项目
    确实和UI设计关系很大,有些设计不适合或者很难做responsive
    换个角度说要做responsive,你需要responsive的UI设计,一开始就和做UI的达成共识很重要

  • @charleszhang 日语,日本人英语不行。我英语也不行,不过欧美在日本的公司应该是用英语

  • @Rei stimulus 好像不行?没具体试
    https://github.com/stimulusjs/stimulus/issues/59
    看这里说好像需要5.1以上

  • 很多项目是rails5以下的,对于一个正在运行的项目,要升级到5不是容易的事情

    rails 5以上的项目我想我会尝试使用 rails-ujs + turbolinks + stimulus