• 终于也忍不住了 at 2014年04月29日

    @huacnlee 奇怪,#2,5,6,8,9,17,18,19,24 都有问题,其他贴子也有问题,如:Tunnelbear 很赞的梯子的 2 楼等也有问题,好象是随机的。 退出登录后,还是可以喜欢除上面之外的所有楼。看起来 unit test 是会有些问题。

    问题好象是 Fix #281, Now will redirect to login page when unlogined user clicked…里的 25 行 current_user。

  • 终于也忍不住了 at 2014年04月28日

    我在淘宝刚买了白色无刻的,加运费 1611,比楼主贵 37 块,不过第 2 天就送到了。键盘是工作需要,比起其他的电子消费品更应该投入,只要贵得有道理,贵点无所谓。

    6 个开关我只开了 sw2。编辑器用 textmate2,^a^e^f 都已经被定义过了,^f 是 Text Bundle 占用的改掉就可以,^a^e 是 Emmet 占用的要到系统设置的 keyboard 的 shortcut 的自定义里加 Textmate2,再加条目,菜单名和快捷键。这几个改为其它的快捷键后,^a^e^f 就回来了。

    这样基本无忧。至于 vim 和 emacs,还是更习惯 tm。

  • 剧透一点里面的 keynote

    Splitting up functions to support the testing process [destroys] your system architecture and code comprehension along with it. Test at a coarser level of granularity. -- James Coplien "Why Most Unit Testing is Waste"

    I got paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence. -- Kent Beck

    I didn't have time to write a short letter, so I wrote a long one instead. -- Mark Twain

    和一点点笔记 Software writer, not a software engineer. Open your eye to read and write and rewrite. How to improve your code? The delete key.

  • 应该要问另一个问题,开发过程中哪些因素对质量更重要?时间有限的话,花在哪里更有效用? 领域知识、领域建模、需求调查、详细设计、框架、编程、review、交流、测试(各种测试)、文档等等

  • 稍看了下里面的链接的 pdf,感受到了一些观点: 1、系统测试的性价比最高。 2、过度追求覆盖率会伤害到设计与开发。 3、单元测试只在必要的时候做。 4、review 比单元测试更重要。

    个人感觉测试就是规范,是质量的保证,对大团队大项目来说更重要,但你付不付得起代价是另一回事。 dhh 应该是反对把 tdd 或 unit test 的重要性绝对化。

  • #10 楼 @hz_qiuyuanxin 谢谢,你的办法一定可以,但不喜欢 utc 的时区(虽然没有多时区的用户),mysql 的系统一段时间后就要被换掉了,目前用的解决方案运行一段时间后就作废了,所以就这样了。不过,支持你的折腾。 另外,写个 gem 包装一个换时区的 rake task 应该会有用。

  • #6 楼 @hz_qiuyuanxin 谢谢,是 2 个 orm 并行吗?这任务麻烦啊。那个,我前面说错了,我的次 db 也是 mysql 的。

    #7 楼 @emanon 我也不想一起用 psql 和 mysql,但历史遗留的问题一下子没办法解决,现在重做那个用 php 和 mysql 的系统。

  • #2 楼 @hz_qiuyuanxin

    对查询,因为我的查询界面和处理是自动的,问题不大。对转换数据是有这样的问题,范围比较小,不管了,先跑起来再说。

    另外对于 PostgreSQL 来说,数据库的 timezone 和当前 session 的 timezone,你在进行操作的时候,PostgreSQL 是会对其进行处理的,而 MySQL 是不管的。

    有没有更详细的资料(参考)?

    如果你做好了完整的解决方案,一定告诉我。

  • 和我碰到的问题差不多,主 db 时区是 beijing 的 psql 的,因为历史原因,次的是 utc 的 mysql 的(也就是没有减 8,还有其他的程序跑在这个 db 上)。config 里是按主 db 来设的,次 db 只用于查询。下面的做法能用,但 time_zone_aware_attributes 在 rails 里到底怎么处理还没有来得及看。 1、查询条件

    # target是一个查询参数,0是类型,1是start,2是end
    if 'Date' == target[0]
      zone = (get_search_class(params).time_zone_aware_attributes ? "" : " UTC")
      target[1] += " 00:00:00#{zone}" if target[1].present?
      target[2] += " 23:59:59#{zone}" if target[2].present?
    end
    
    

    2、显示 在次 db 的主类里,加上一个类方法 time_zone_aware_attributes。

    class SecondServer < ActiveRecord::Base
      self.abstract_class = true
      establish_connection :second_server
      def self.time_zone_aware_attributes
        false
      end
    end
    

    3、转换数据,每个 date 或 datetime 的数据都转换。如:a.updated_at.try(:to_bjtime) 在一般的查询里是不使用的,只在把这些日期和时间转存到主 db 的时候使用。

    class Date
        def to_bjtime
          Time.parse(self.to_s)
        end
    end
    class Time
        def to_bjtime
          self.class.parse self.to_s.gsub(" UTC","")
        end
    end
    
  • Ubuntu 14.04 LTS 发布 at 2014年04月18日

    我的版本还是 11.04 的,想在线升级,怎么样比较稳妥,各位有经验吗?

  • 一个普通的写法

    h = {}
    key.each_with_index {|k,i| (h[k] ||= []) << value[i] }
    
  • #5 楼 @Kabie 这招很好用啊,在对记录作汇总的时候

    class User
      attr_accessor :gender, :name
      def initialize(arr)
        @gender, @name = arr
      end
      def last_name
        @name[0]
      end
    end
    records = %w(男 张三 男 李四 女 张洋 男 李五 女 潘潘).each_slice(2).collect {|arr| User.new arr}
    def group_hash(records, attr_k, attr_v)
     records.collect(&attr_v).group_by.each_with_index {|v,i| records[i].send(attr_k)}
    end
    group_hash(records, :gender, :name)
    group_hash(records, :last_name, :name)
    

    irb(main):598:0> group_hash(records, :gender, :name) => {"男"=>["张三", "李四", "李五"], "女"=>["张洋", "潘潘"]} irb(main):599:0> group_hash(records, :last_name, :name) => {"张"=>["张三", "张洋"], "李"=>["李四", "李五"], "潘"=>["潘潘"]}

  • #12 楼 @pynix 谢谢,这个真不错,应该会有个主机能新建,管理、监控这些 dockers 的。

  • 如何确保订单状态安全性 at 2014年04月15日

    #7 楼 @special

    当然好了,时间+状态+salt 作个 hash 应该就可以了,下次状态变更之前都校验一下。每天晚上出货之前,当天所有的状态变更成出货的全部验证一遍。

  • 这个贴的 22 楼,我写了个 trytry。一般情况下 我都在 model 里写,分页后没怎么考虑效率问题。

    def self.collect_data(search_result)
      search_result.collect do |r|
        {
          'field1' => r.trytry('b.c.d.e'),
          'field2' => r.trytry('b.c.f'),
          ...
        }
      end
    end
    

    当然也可以考虑 把 field1 和 b.c.d.e 的这个关系保存起来,命名一个 collection_name, 给 arel 的结果集加上 collect_data(collection_name)

  • 如何确保订单状态安全性 at 2014年04月15日

    我乱讲 1、加 log 表、每次订单状态变更记录用户 id,ip 等。 2、某一金额之上的,如 1 万元之上的订单状态变更人工审核。 3、异常监视,一些非正常的事件(如经常有非法访问)的 ip 记录下来加入当天黑名单,在这些 ip 之上的订单状态变更也要人工审核。 4、在订单状态中,如果要变更到已付款的状态,付款的凭证比对等。 5、其他服务器安全性的要求。

  • #4 楼 @hisea 是啊,特别是已婚大牛,本来有意向的,看到这个诱惑,算了,多一事不如少一事...... 你知道大牛们最需要的是安宁。

    是否有股份?这一节很好。

  • js 中 select 问题 求教大神 at 2014年04月14日

    是不是这段要加在上面的 callback 里

    $("#building_group_id option").each ->
          $(this).attr "selected", true  if $(this).val() is building_group_id
    
  • 应该不是这个问题,我把 validate 搞混了。应该是你的 before_filter 里逻辑的问题。

  • 问题是 redirect_to 用在这里好不好,感觉还是先返回 true,false 会比较好,alert 放在暂存里。

    redirect_to posts_url, alert: "此板块不允许发帖" if @forum.id < 6
    is_new_user = Time.now < (current_user.created_at + 7.days)
    today_posts_count = Post.where("author_id = ? AND created_at >= ?", current_user.id, Time.now.at_beginning_of_day).count if is_new_user
    redirect_to posts_url, alert: "未满一周用户每天只能发5篇帖子" if is_new_user and today_posts_count >= 5
    true
    
  • #19 楼 @zgm 是这样的,可以和用户分表 (xxx) 一样,存在 xxx_funs 的表里。 还要一点假设,关注不可以超 1000。

  • #30 楼 @billy 谢谢,真的程序员不怕喷!喷错了与我无关,喷对了我又明白了道理,省了学费。

    但是这个例子怎么拿?用 find 找不到就有 exception 了,拿到 post instance 这 title 也不会没有。

  • #24 楼 @billy 谢谢,给 ruby 打补丁的意思就象是 rails 对 ruby 做的一样,我的意思是再加一点。 至于 try 的问题,就是楼主引用文章里的要求,post 为 1 不存在时,取 title 时返回 nil。

  • #11 楼 @miclle 要关系数据库啊,象这种大V的话,以 1000 粉作为分隔作特殊处理

  • 用户分表,按某个 hash 方式。 关注与被关注,做序列化的 2 个字段跟着用户分表。 共同关注就直接计算了。

  • #15 楼 @zj0713001

    谢谢,要这样写:Post.where("id = ?",1).first.try(:title)

    #11 楼 @Kabie 我写了一个 trytry,象这样:a.trytry('b.c.d.e') haskell 不熟悉,看着语法不是太喜欢,我会选择在 ruby 里做补丁,然后等 matz 把好东西都拿过来。

    module Object
      include ModuleBase
      def trytry(sym_list, value=nil)
        return self if value.present? and sym_list.last != '='
        receiver = self
        sym_list.to_s.split('.').each do |field| 
          if field.last == '=' 
            receiver.try(field, value)
            receiver.save!
          else
            receiver = if field =~ /\(/ 
              params = field.gsub(/[ \):]/, '').gsub('(', ',').split(',')
              receiver.try(params[0], *params[1..-1])
            else
              receiver.try(field)
            end
          end
        end
        receiver
      end
    end
    
  • Post.find(1).try(:title)

  • 关注,谢谢

  • 还有%操作符 %的用法(即 sprintf)

    irb(main):125:0> '%02d' % 9
    => "09"