• C++ 入门书籍推荐 at 2016年06月06日

    走错论坛了吧?: ]

  • Ruby SH 薄荷聚会有感 at 2016年05月24日

    #13 楼 @darkbaby123 所以说这是互为因果嘛。因为 Ruby 在该领域没有好的选择,只能选择其它更成熟的。反过来,由于很少有人会在该领域选择 Ruby,因而 Ruby 在该领域也会越来越萎缩。

  • Ruby SH 薄荷聚会有感 at 2016年05月23日

    Ruby 在其它领域的现状,主要不是 Ruby 语言本身,而是领域相关的社区及资源远远不完善。

    与 Ruby 目前的圈子组成也有相关,在 Web 领域,Ruby 开发者自然当仁不让。但在其它领域,要么是 领域专家不了解 Ruby,人家自然用自己熟悉的 语言 做项目,要么是 Ruby 开发者 ( 因为主要集中在 Web ) 不了解其领域,无法用 Ruby 来写该领域的项目。( 不是说没有人,只是相对 Web 领域, 其它领域的 Ruby 开发者占比太少). 互为因果吧,结果就是现状: Ruby 在强项领域一直很强,在弱项领域一直很弱

    Python 的很多领域的库,用 Ruby 不能实现吗?当然能。那用 Ruby 来实现一个吧,呃....... 这方面不懂啊。 ;)

    领域相关的社区及资源还是需要一步步来,先有项目,然后再逐步完善吧。其实 Ruby 能做很多事情。

  • #3 楼 @seanlin

    __method__method 是两个不同的的方法。

    Kernel.methods 的输出太多,用 grep 筛选下,就能看到 method

    Kernel.methods.grep /^method$/    #=> [:method]
    
  • 在不考虑第三方 gem 的情况下,可以把方法转为 Method 对象来取得一些信息

    p method(:printf)
    p method(:printf).owner
    
  • 本来就可以在文件对象上直接调用 printf 啊

    f.printf("%-10s\n", 'ruby')
    

    printf 是 IO 类的一个实例方法,File 类继承于 IO,所以其对象可以直接用 printf

  • Windows 下玩 Ruby 一点问题没有。玩 Rails 略有坑。

  • @accept 另一种写法

    def draw_diamond(count)
      raise "Orz... " unless count.odd?
      lines = (1...count).select(&:odd?)
                         .inject(['*']) { |m, i| m << "*#{' ' * i}*"}
      [*lines, *lines.reverse.tap(&:shift) ].each { |l| puts l.center(count) }
    end
    
    draw_diamond(9)
    draw_diamond(15)
    
  • 即使磨好枪,也会有怀才不遇的这种可能。何况 程序员 这个圈子普遍是智商高,情商低,所以这个圈子大部分人被烹也是必然。 给楼主的建议:不要一直给别人做嫁衣。

  • Ruby 的梗不比 C++ 少。

  • 关于 Ruby 异常捕捉问题 at 2015年12月28日

    windows 下也没问题。不知你所云。

  • 2.3.0 悄无声息的发布了? at 2015年12月25日

    终于要支持 字节码 文件了。

  • #11 楼 @mingle5566 对于数组的处理用 vector, 不过 bit-struct 对 array 的 处理比较啰嗦。

    require "bit-struct"
    
    class SentRTU < BitStruct
      unsigned :order,    16, 'order'
      unsigned :srv_type, 8,  'srv-type'
    
      vector :router_addr,   "router_addr", :length => 128 do
        unsigned :byte, 8 
      end 
    
      def set_router_addr(str)
        if str.length > router_addr.size - 1
           raise "str.length should be less than router_addr.size - 1"
        end
    
        # bit-struct 对 vector 的写入处理比较啰嗦,只能挨个赋值。
        # 像这样是不行的:
        #   str.bytes.each_with_index {|byte, i| router_addr[i].byte = byte }
    
        addr = self.router_addr
        str.bytes.each_with_index do |byte, i| 
          v = addr[i]
          v.byte = byte
          addr[i] = v
        end 
        self.router_addr = addr
      end
    end
    
    
    a = SentRTU.new
    a.set_router_addr('abcdef')
    puts a.router_addr
    

    类似的 gem 还有 binstruct, cstruct . 在使用类似的 gem 时,一定要注意 struct 的 alignment 与相应的 C struct 的 alignment 要一致,不然就不对了。

  • #7 楼 @mingle5566 不客气,能用上就 OK 了。 #9 楼 @flowerwrong 嗯,如果结构很简单,自己进行 位操作 和 unpack 也是不错的选择。

  • #3 楼 @mingle5566 这个当然也可以。用这个 gem bit-struct 或 gem cstruct(不是 Fiddle::CStruct)

    仅为 示范性伪代码

    require 'bit-struct'
    class MyStruct < BitStruct
        ...
        unsigned    :id,   8,     "id"     # 8 意为 8bit,也就一个byte。一个int32类型,就是32。以此类推。
       ...
    end
    
     data = recv(...)
     my_data = MyStruct.new(data)
    puts my_data.id
    
    1. Ruby 标准库:Fiddle
    2. gem FFI

    这两者都有对 C struct 的支持。Fiddle::CStruct 和 FFI::Struct. 具体使用参考其文档即可。

    • 脱离了场景,直接谈语言的性能,基本就是耍流氓了。在某些场景下,C 都不是最佳选择,更别说什么 Go,Rust... 等一堆所谓的性能好的语言。
    • 将某种语言用于它不合适的场景中,要么是不熟悉场景及所使用的语音,要么就真是在耍流氓了。
    • 相同场景下,至少在主流的动态语言中,Ruby 的性能还可以。
    • 用 Ruby / Rails 创业成功后,然后技术转型,写一篇“我为什么用 XXX 而放弃 Ruby / Rails”等类似的文章,这也是在耍流氓了。当初,如果不是 Ruby / Rails 的快速开发能力,他连写这篇文章的机会估计都没有。当初如果直接使用 XXX,大概率的被对手拍死在沙滩上。

    性能是重要的,但不是最重要的,更不是全部。它只是雷达图的一项。

  • [sec, min, hour, day, month, year, wday, yday, isdst, zone]
    
  • 👍 好文啊,建议楼主出 电子书。

  • 只要自己用的开心就好嘛。

    记得前一阵子 Weibo 上,一个 Erlang 的大神 和 一个 Go 语言的大神 为了一个 C++ 的库吵了起来,本来两人以前还是朋友,结果只是为了一个技术上的观点,朋友都做不成了。

    技术并不是生活的全部,通过技术讨论来结识更多的朋友,本应该是一件很高兴的事。

  • 百度要是能找得到的话,那才不正常呢。

  • #3 楼 @bluexuemei 转化为二维的话,用 each_slice 处理一下就可。

    建议在多看看 Ruby 基础方面的书。

  • #4 楼 @bluexuemei 先求得秒,然后除以 86400 就可以了。

    require 'time'
    
    def time_to_float(s)
      (Time.parse(s) - Time.parse("00:00:00")) / 86400
    end
    
  • 换个思路,把矩阵看成是 一维的 Array 后,再处理就更简单。

    a =[ 2, 3, 4, 5, 
         3, 4, 5, 6, 
         1, 2, 3, 2, 
         8, 9, 5, 3 ]
    
    b =[ 1, 1, 1, 5, 
         4, 5, 2, 3, 
         6, 5, 6, 3, 
         7, 4, 9, 7 ] 
    
    p a.zip(b).map &:max  # =>  [2, 3, 4, 5, 4, 5, 5, 6, 6, 5, 6, 3, 8, 9, 9, 7]
    
  • 楼主没说转换的规则是什么。如果如楼上 @est 说的,那试试这样:

    def float_to_time(v)
      raise RangeError, ":(~~~" if v < 0 or v > 1
      Time.at(v * 86400).utc.strftime("%H:%M:%S")
    end
    
    p float_to_time 0.5
    
  • 赞楼主一个。 看问题只看表面的,玩啥 OS 都是只知其表。

  • gem install debugger 报错 at 2014年09月16日

    你这不是已经装成功了嘛

    那个 unable to convert 是在生成文档时产生的,你可以忽略。

  • 我觉得招聘贴才是这个论坛的精华贴,看图文并茂的招聘贴其实也是种享受了,比各种水贴,无病呻吟贴等都有内涵。

  • #4 楼 @lihaidong
    V8 (指 C++ 写的那个 Engine ) 的移植性是相当好 (最起码对主流 OS 来说),主要是 libv8 这个 gem 在写的时候本身就没考虑 win 平台,所以,安装受阻也正常,更谈不上是恶心啊。就像我拿一个 win 的软件包直接在 Mac OS 下安装,肯定也不行啊。

    这类问题基本上属于编译环境的差异导致。因为 V8 Engine 在多个平台跑是妥妥的。而且 libv8 就是包了一下 V8,所以只要用 mingw 编译好 V8 就 OK。按着这个思路, libv8therubyracer 就都能解决安装问题。

    运行结果,上图:

    等后面有时间,可以专门写一下 libv8 和 therubyracer 在 win 下的编译安装。

  • 这在哪都一样啊,大多数就是不懂才黑的,你问他真用过吗?他也只是 呵呵,听别人说的。就像鬼故事都是别人家的鬼故事。