• 我觉得 lt 是看起来不错,但是使用起来却有点不直观,重新学习和习惯的成本比较高;以前尝试过一次之后就放弃了

  • 买之前打个电话,联系个销售顾问,她就一下子可以帮你全部搞定,从下单到付款 ^_^

  • #16 楼 @ChanceDoor 真正重构的话就应该试图去除这些分支,可能就要引入不少设计模式上的东西了;就这个问题我可能就会采用链式的简化处理方法,基本原理就是

    login_result = 动态令牌检查器 && 验证检查器 && 过期时间检查器
    

    这其中的每一个检查器都可以封装成一个完整的对象并在其中处理逻辑和错误,并返回 bool 之类的标志以便决定下一个检查器;好处是 caller 完全移除 if-else,具体每个检查器的判断逻辑也很简单

    我没用过 devise,以上说法也只是根据一般代码的设计思路而言,不一定真正适用你的具体场景。

    至于放哪儿,实际上我觉得根据你的场景而言,首先这一段逻辑你会重用么?它是否是属于业务层的逻辑?或者是其他要考虑的?然后再决定是放在 controller,还是 model,是否需要封装成一个 class,或者是要变成 lib,更或者是 module...

  • #14 楼 @ChanceDoor 有一种减少流程分支层次的方法是错误先行,此后就可以省去正确的分支;当然这不不一定是一种很好的重构策略,只能算是一种编码风格; 如果重构的话就应该试图去除这些分支,可能就要引入不少设计模式上的东西了。

    
    比如登陆界面需要先调用一个动态令牌的API,
        如果动态令牌不通过
            动态令牌错误    
    
        调用devise的用户名密码验证,
            验证不通过
              用户名密码错误
    
            判断账号是否存在过期时间,
                如果过期时间为nil,
                    就写入当前时间并成功登陆,
    
                判断是否过期
                过期
                     过期错误
    
                成功登陆
    
  • 推荐几个技术类的 podcast at 2013年04月23日

    其实不限于 ruby 的,iTunes 上有很多好的 Podcast 可以看的,制作又精良,顺便还可以学英语

  • #11 楼 @jjzxcc 是,socket 编程就是这样,你要按照给你的标准定义直接写字节出去,比如根据你那个文档就是往输出流里面写 32 个字节的帐号,再输出 8 个字节的签发日期,然后是一个字节的凭证种类,依次类推,直到写完;然后根据服务器端的返回依次读取,前 6 个字节是返回码,后 16 个字节是支付密码。

  • Mac 用户快来滚雪球啊... at 2013年04月18日

    我也看到了,可是没觉得那个一定要收的。。。不知道大家为什么那么喜欢 CMM2

  • 日本移民及技术签证 at 2013年04月18日

    #9 楼 @ashchan @lufeihaidao 这个倒是的,经常加班,但是也经常不用上班那么早,还时不时有个三连休啥的,而且有时候还可以只要一个月的工作时间到 140 个小时就可以了吧

  • 日本移民及技术签证 at 2013年04月18日

    #7 楼 @ashchan 呵呵,他去时候是个光棍,日常也没啥大的开销;不过赚的一点钱全部套股市里面了 😓

  • #34 楼 @qhwa 共勉,😄 你比俺厉害,都尝试去了解他里面的业务逻辑了,比如那个 uuid;我也看了下,原先的逻辑有些不太直接,不过考虑到跟他的具体场景相关,就没有做推断和改变了。

  • 日本移民及技术签证 at 2013年04月18日

    无需要日语等级,只要有 offer 给你就可以过去了;如果有朋友什么之类的在那边,就简单了,去个中国人多的公司,可能都不一定需要总是日语交流的。 日本生活压力还好,再怎么花了每个月总可以省个一两万人民币的

    我一朋友刚去时候就是上面这个状况

  • 只做了原理性质的重构,里面具体的操作上估计有问题,比如 sql 的拼接 LZ 的新旧数据库我发现 column name 都是一样的,这样完全不必要硬写 sql 的;如果不一样的话弄个映射也可以避免;此外重构就是把处于不同抽象层次上的逻辑封装到不同的方法中。

    发现和楼上的基本重复了。。。

    #!/usr/bin/env ruby
    # encoding: utf-8
    #copy tag from test env to prod env
    
    require 'mysql2'
    
    class TagCopy
    
      def transfer_tag_by_key(tag_key)
        open_db
    
        results = load_old_tags(tag_key)
    
        uuid = get_uuid_from_new_db
        srid = get_srid_from_new_db
    
        results.each do |old_tag|
          transfer_tag old_tag, uuid[0], srid[0]
          transfer_child uuid[0],old_tag["id"] if has_child(old_tag)
        end
    
        close_db
      end
    
      def transfer_child new_pid, parent_id
        results = load_old_childs_for_parent(parent_id)
    
        results.each do |row|
          uuid = get_uuid_from_new_db
          transfer_tag(row,uuid[0],new_pid)
          transfer_child uuid[0],row["id"] if has_child(row)
        end
      end
    
    
      def transfer_tag(row, id, parent_id)
        miss_colums = %w(site row_num sort_no ad_quantity)
        miss_colums_values = row["row_site"] || 0, row["row_num"] || 1, row["sort_no"] || 0, 0
    
        all_columns = ["id", "parent_id", common_columns, miss_colums].flatten.join
        all_columns_value = [id, parent_id, common_columns.collect{|col| row[col]}, miss_colums_values].flatten
    
        insert_sql = "insert into yitian_b2c_db.tbl_cms_tags (#{all_columns.join(',')}) values (#{all_columns_value.join(',')})"
    
        @to_db.query(insert_sql)
      end
    
      private
    
      def has_child
        row["child"] >0
      end
    
      def common_columns
        %w(no tag_key tag_name tag_url tag_desc structure type isleaf child level brand_no category_no channel_no other_no enable_more image_size)
      end
    
      def old_db
        Mysql2::Client.new {:host => "192.168.xx.xx",  
                            :port => 3306, 
                            :username => "mysql", 
                            :password => "mysql", 
                            :database => "mydb"
                           }
      end
    
      def new_db
        Mysql2::Client.new {:host => "192.168.xx1.xx2", 
                            :port => 3306, 
                            :username => "root", 
                            :password => "root", 
                            :database => "mydb"
                           }
      end
    
      def load_old_tags(tag_key)
        param = @from_db.escape(tag_key)
        sql = "select #{common_columns.join(',')} from tbl_cms_tags where tag_key = '#{param}'"
        @from_db.query(sql)
      end
    
      def load_old_childs_for_parent(parent_id)
        sql = "select #{common_columns.join(',')} from tbl_cms_tags where parent_id = '#{parent_id}' "
        results = @from_db.query(sql);
      end
    
      def get_uuid_from_new_db
        @to_db.query("SELECT REPLACE(UUID(),'-','')", :as => :array).to_a[0]
      end
    
      def get_srid_from_new_db
        @to_db.query("select id from tbl_cms_tags where tag_key ='ol_main'").to_a[0]
      end
    
      def close_db
        @from_db.close
        @to_db.close
      end
    
      def open_db
        @from_db ||= from_db
        @to_db ||= to_db 
      end
    end
    
    
    TagCopy.new.transfer_tag_by_key("ol_index")
    
  • 😄 RP 啊,我买时用的卡刚好几个月前过期了,换了新卡,还没在 linode 上使用

  • 一道 Ruby 水平自测题. at 2013年04月15日
  • 一道 Ruby 水平自测题. at 2013年04月15日

    #26 楼 @zw963

    proc_object = proc {p}
    p proc_object.lambda?    # => false
    
    proc_object = proc &method(:p)
    p proc_object.lambda?   # => true
    
  • 个人觉得这种搜索如果数据量多了优先考虑搜索引擎吧,然后缓存就变简单了,只需要根据搜索出来的 id 直接取缓存就可以了

  • 一道 Ruby 水平自测题. at 2013年04月15日

    其实楼主这个问题很不错的,在应用中有不少人经常用这个方法来处理map中对象的转换和封装的。它可以更一般化

    class Class
      def to_proc
        proc(&method(:new))
      end
    end
    

    这样就可以根据需要随意的创建对象了,只有有对应的构造方法

    [{:name => 'Tom'}, {:name => 'Jerry'}].map(&User) 
    

    或者做类型转换,

    User.all.map(&UserWrapper)
    
  • 一道 Ruby 水平自测题. at 2013年04月15日

    哈哈,我也是,别的都看懂了,就是不知道 Array.new 传这两个参数的用法。

  • 建议重新排版并且将标题中的错别字改正,效果会更好

  • 如果你不准备买新的话,建议升级,特别是换 SSD 之后性能飙升,做开发完全没问题。

    我上个本跟你一样,09 年的 467 机型,换 ssd 和内存之后一直用到 12 年底,没有任何性能上的问题。

    我当时换的 160G SSD,而且我没有拆光驱,直接把原硬盘给拆了,如果你不要在上面装很多音乐或者视频之类的话完全够用了。

    价格之类的一淘宝就知道了。。。LZ 真懒啊!

  • ruby china iphone app at 2013年03月29日

    @dave 错误同楼上,注释掉之后仍跑不起来,原因未知

  • 额,尴尬…… at 2013年03月29日

    撇去前面基于 JVM 的框架不谈,对比 go 和 ruby 的数据发现基本刚好对应前不久那个从 30 台服务器到 2 台服务器的差距

  • wget 怎么覆盖下载 at 2013年03月28日

    #4 楼 @lzm110 目录不用-O,使用-P 或者 --directory-prefix=/path/to/save

    man wget 里面都有的

  • wget 怎么覆盖下载 at 2013年03月28日

    参数顺序错了,ftp 地址对应 url, -O 对应本地存储的文件名

    wget ftp://10.1.111.111/1.txt -O 1.txt

  • Ruby 社区应该去 Rails 化了 at 2013年03月26日

    赞同文中的不少观点,没有最好的技术,只有合适的技术,合适的技术不仅仅关于出现的地方,也跟时间有关;rails 亦然,同一个应用开始时候使用 rails 是个很好的选择,那么在需要的时候用更好的技术替换 rails 也是一个好的选择。

    去 Rails 化个人也在一定程度上赞同,所谓去并不是抛弃不用,而是应该不惟 rails;不可否认 rails 成就了 ruby,但是这也使得很多人惟 rails 化了

  • 出问题时候 dns 无法解析 l.ruby-china.org,不过别的域名正常,很奇怪,电脑上也没有进行任何别的设置

    不过右拍云的应该没有这么不稳定吧,而且大家似乎也没碰见过,我再查查是不是自己这边的问题

  • 如果是给父母用的话小米或者那个乐视的盒子肯定都比 apple tv 合适一些。

    @Rei @lgn21st 我个人用 apple tv 是因为很少看网络视频,都是用电脑放高清,在电视上看,所以 airplay 很重要;另外就是我经常看 iTunes 上的 podcasts

  • 我也用的 apple tv, 小米的盒子感觉除了娱乐没有太大的用途,那个 airplay 支持貌似也不是太好。

    apple tv 现在也能直接看优酷等网络视频,不过我更喜欢它的 airplay 和 itunes 里面直接可以访问到的各种学习资源

  • #23 楼 @luikore 赞同,很希望在 gr 之后有一个支持多设备同步的 rss 订阅平台。