• RubyConfChina 2013 计划 at 2013年04月28日

    今年最好能有 Koichi Sasada ...

  • #79 楼 @hooluupog 看情况的,这里的特定情况就是 C++ 没 GC/引用计数 没法做 COW 的字符串抽象

    另外虚拟机的一个作用是使用抽象程度高的字节码达到节省内存的目的,有些 IC 卡上甚至能跑 Java, 但 C++ 运行时就载不进来。

    Go 那个例子和优化没关系,Go 没有解释器所以只能在模板引擎里实现一个很原始的解释器,比现代解释器差很远的。Go 如果要改进这块性能,只能修改模板的处理方式,把模板文件编译成 Go 源文件再进行编译,否则永远也超不过 Ruby 的...

    Go 一遍编译的速度已经没多少改进空间了,但理论上,虚拟机可以根据运行的 profile 动态修改代码,能达到比没有虚拟机的语言更快的速度 (虽然现在的虚拟机都没达到这样的效果).

  • 软件技术人员的技术方向 at 2013年04月27日

    #6 楼 @Saito @lgn21st 领导工程师...

    这位培训师颇有江湖术士的范啊

    A. 培训师可以对每个人都说"你性格不适合当领导", 说错的几率很小,说错了也能引起好奇... B. 我怀疑选任何一格的性格都不适合当领导,适合当领导的会说"你给我选一个"之类的...

  • #1 楼 @neverlandxy_naix prof 是找瓶颈用的,如果只想简单的看看平均一个请求要多久,用 ab 或者 siege 就可以吧...

  • sort 的复杂度是 nlog(n) , n 在 100 万以下 log(n) 当成 1 也可以... 就和遍历差不多。

    reverse 直接就是线性的。不用纠结这种可有可无的速度了...

  • @zw963 ...你总是能深入挖掘...

  • #37 楼 @qhwa 刚才加语音时改错了,现在修好了...

  • #35 楼 @richard020389 我还有 bad apple 的屏保... 当年把 win7 扫雷版的原理搞出来了 (还是 1.9 的代码,现在都用 fiddle 不用 dl 了...)

    # coding: utf-8
    
    require "dl"
    require "dl/import"
    include DL
    
    module MineSweeper
      extend Importer
      dlload 'user32.dll'
    
      # ------------------------------------------------------------------------------
      # memory for title match
    
      MSstr = '扫雷'.encode(Encoding.default_external)
      Mem = CPtr[MSstr + "\0"]
      def Mem.zero
        Mem.size.times do |i|
          Mem[i] = 0
        end
      end
    
      # ------------------------------------------------------------------------------
      # find minesweeper window handle and assign to $ms_h
    
      # window title text
      # (handle, char*, sz)
      extern 'int GetWindowText(int, int, int)', :stdcall
    
      # to find minesweeper window
      # (proc, lparam)
      extern 'int EnumWindows(void*, int)', :stdcall
    
      # (handle, lparam)
      EnumCallback = bind "int enum_call_back(int, int)" do |h, _|
        Mem.zero
        GetWindowText h, Mem.to_i, Mem.size
        txt = Mem.to_s.strip.force_encoding Encoding.default_external
        if txt == MSstr
          $ms_h = h
          0
        else
          1 # 0 stops it
        end
      end
    
      EnumWindows EnumCallback, 0
      exit unless $ms_h
    
      # ------------------------------------------------------------------------------
      # activate minesweeper window
    
      extern 'int SetForegroundWindow(int)', :stdcall
      SetForegroundWindow $ms_h
    
      # ------------------------------------------------------------------------------
      # simulate right clicks
    
      # move cursor
      extern 'int SetCursorPos(int, int)', :stdcall
    
      # generate a mouse event
      # (event, x, y, _, _)
      extern 'void mouse_event(int, int, int, int, int)', :stdcall
      MOUSEEVENTF_RIGHTDOWN = 0x0008
      MOUSEEVENTF_RIGHTUP = 0x0010
    
      # for coordinate transformation
      # (handle, point*)
      extern 'int ClientToScreen(int, void*)', :stdcall
      POINT = struct ['int x', 'int y']
    
      module_function
    
      # move mouse and right click
      def click x, y
        x = x*18 + 41
        y = y*18 + 41
    
        p = POINT.malloc
        p.x = x
        p.y = y
        ClientToScreen $ms_h, p
    
        SetCursorPos p.x, p.y
        sleep 0.01
        mouse_event MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0
        mouse_event MOUSEEVENTF_RIGHTUP, x, y, 0, 0
        sleep 0.05
      end
    
      # right click twice to remove the little flag
      def unclick x, y
        x = x*18 + 41
        y = y*18 + 41
    
        p = POINT.malloc
        p.x = x
        p.y = y
        ClientToScreen $ms_h, p
    
        SetCursorPos p.x, p.y
        sleep 0.01
        mouse_event MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0
        mouse_event MOUSEEVENTF_RIGHTUP, x, y, 0, 0
        mouse_event MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0
        mouse_event MOUSEEVENTF_RIGHTUP, x, y, 0, 0
        sleep 0.05
      end
    end
    
    def slop show
      if show
        12.times do |i|
          MineSweeper.click i, i
        end
      else
        12.times do |i|
          MineSweeper.unclick i, i
        end
      end
    end
    
    def hori show
      if show
        12.times do |i|
          MineSweeper.click i, 0
        end
      else
        12.times do |i|
          MineSweeper.unclick i, 0
        end
      end
    end
    
    5.times {
      slop true
      slop false
      sleep 2
      hori true
      hori false
    }
    
  • initialize_http_header 放在 post_form 后面了自然收不到

    response = Net::HTTP.post uri, data, {"USER-AGENT" => @agent}
    
  • @qichunren @zputee 带音乐和颜色的... 用了 Mac OS X 的 say 和命令行播放器 afplay, linux 应该也有类似的自己改一下就好

    Thread.new do
      system "say -r 300 #{'swa ' * 15}"
    end
    
    require "tempfile"
    path = Tempfile.open 'nyan.mp3' do |f|
      F = f # just don't GC it
      f << `curl -s http://cdn.nyanit.com/audio/nyanlooped.mp3`
      f.path
    end
    Thread.new{loop{system "afplay #{path}"}}
    
    dot = ->{
      i = 0
      j = 16
      -> {
        i += 1
        if i % 100 == 0
          i = 0
          j += 1
        end
        if j > 231
          j = 16
        end
        "\e[38;5;#{j}m█"
      }
    }[]
    
    x = 0
    y = 0
    loop do
      print ' ' * ((1 + Math.sin(x += 0.1)) * 15 + 10)
      n = ((1 + Math.sin(y += 0.019)) * 10).ceil
      puts(n.times.map{dot[]}.join)
      sleep 0.01
    end
    
  • #20 楼 @zputee 其实这个居中可以用 center 改进一下:

    x = 0
    loop do
      dot = '-' * ((1+Math.sin(x += 0.15)) * 15) *2
      puts dot.center 60
      sleep 0.01
    end
    
  • ... 调幅信号:

    x = 0
    y = 0
    loop do
      puts '-' * ((1 + Math.sin(x += 0.018)) * ((1 + Math.sin(y += 0.15))) * 20)
      sleep 0.01
    end
    
  • #6 楼 @chenge 铁打的营盘流水的兵...

  • 炮哥的遗产 at 2013年04月26日

    欢迎炮哥加入电子书党...

  • URI 的一个疑问 at 2013年04月26日

    方法可以和 module 同名

    module A;end
    def A
      puts '和 module A 没关系'
    end
    
  • x = 0
    loop do
      puts '-' * ((1 + Math.sin(x += 0.1)) * 20)
      sleep 0.01
    end
    
  • 哦,其实瓶颈在 doc[k].scan 上面啦,你可以先建立一个索引,从 key 可以快速查出词频,然后利用此索引查找就快了。

    doc_key_count = doc.map do |d|
      h = {}
      keys.each{|key| h[key] = d.scan(key).count }
      h
    end
    
    for rowindex in 0...keyscount
      for colindex in (rowindex + 1)...keyscount
        matrixnum = 0
        doc_key_count.each do |d|
          rownum = d[keys[rowindex]]
          colnum = d[keys[colindex]]
          matrixnum += (rownum > colnum) ? colnum : rownum
        end
        matrix[rowindex][colindex] = matrixnum
      end
    end
    

    上面代码没测试... 意思明白就可以...

  • 另外如果是数值矩阵,用 NMatrix 就已经足够快了

  • 可能是内存重分配太多造成的,用 Array.new 10000 直接创建大小为 10000 的矩阵

    另外不知到你的实际问题是什么,或者可以用稀疏矩阵的技巧

  • 程序员的爱国之情 at 2013年04月26日

    支持中文就会被苹果快用免费化,会被腾讯山寨,还会有很多僵尸跑来打一分...

  • 不能写 @include .center

    @include 后面带的是 module 名称,@extend 后面带的是 css 选择器

  • 程序员的爱国之情 at 2013年04月26日

    程序不会变大了很多吧?我记得 acrobat 的亚洲语言库一百多兆...

  • 这个人写的中文博客太水... 还是他用英文写的东西比较有内容...

  • 花在系统函数调用上的时间

    操作系统提供了很多函数,有处理 io 的,查询设置时间的,还有很多杂七杂八的。没这些函数应用程序没办法使用硬件。例如 printf 就是调用了输出到 stdout 的系统函数,web 服务器收发数据就是调用了 socket 相关的系统函数。

  • 王垠谈编辑器与 IDE at 2013年04月25日

    #102 楼 @hardywu 难道没有看广告觉得很强大,买下来觉得也就那样的时候...

  • 王垠谈编辑器与 IDE at 2013年04月24日

    #99 楼 @hardywu 然后再花几小时发现这个 IDE 干不了好多 vim 能干的事情...

  • github 代练 star, 代刷关注的时代已经不远

  • @bhuztez @blacktulip 其实我一直觉得 duck typing 的表述应该改改:

    If it walks like a duck, quacks like a duck, then we can cook it as a duck...

  • 吐槽 textmate at 2013年04月24日

    #11 楼 @raven 坑爹中..

  • #4 楼 @xhj6

    如果 /\p{P}/ 不匹配 “”‘’ , 那就是因为你在用的 Ruby 太古老了 如果不能写 unicode 字符,那也是因为你在用的 Ruby 太古老了 赶紧升级吧... ruby 1.9 或者 ruby 2.0 都可以。1.8 很难匹配非 ascii 字符


    如果仅仅是匹配中英标点但不匹配 '

    方法 1: 运用正则技巧之 double negation:

    /[^'’[^\p{P}]]/
    

    方法 2: 如果方法 1 不管用,是因为正则引擎比较老,但还可以运用正则技巧之 negative lookahead 解决:

    /(?!['’])\p{P}/
    

    如果还要去掉除了 n't 的结构外的所有 '’, 就要改改代码了

    '‘I don’t know’, he said.'.gsub(/(n['’]t\b)|\p{P}/, '\1')
    # => "I don’t know he said"
    

    代码解释:

    • 如果匹配 n't, 捕获组 \1 就是 n't, 保持原样
    • 如果没匹配 n't 但匹配标点,捕获组 \1 就是空字符串,等于去掉了标点