• 话说这个方法 search_with_prefix 是不是应该叫 fuzzy_search..

    这不是 prefix_search 啊..

    [7] pry(main)> t.search_with_prefix 'AC' do |_, id|
    [7] pry(main)*   puts id
    [7] pry(main)* end  
    1
    1
    3
    2
    

    每个字符串不应该 search 两次?还是这才是正确的行为。

  • [2] pry(main)> require "triez"
    => true
    [3] pry(main)> t = Triez.new suffix: true
    => #<Triez:0x007f88cc936ff0>
    [4] pry(main)> sequences = {
    [4] pry(main)*   'ACTGAAAAAAACTG' => 1,  
    [4] pry(main)*   'ATACGGTCCA' => 2,  
    [4] pry(main)*   'GCTTGTACGT' => 3  
    [4] pry(main)* }  
    => {"ACTGAAAAAAACTG"=>1, "ATACGGTCCA"=>2, "GCTTGTACGT"=>3}
    [5] pry(main)> sequences.each do |seq, id|
    [5] pry(main)*   t[seq] = id  
    [5] pry(main)* end  
    => {"ACTGAAAAAAACTG"=>1, "ATACGGTCCA"=>2, "GCTTGTACGT"=>3}
    [6] pry(main)> t.search_with_prefix 'CGGT' do |_, id|
    [6] pry(main)*   puts id #=> 2  
    [6] pry(main)* end  
    2
    
  • #10 楼 @luikore Awesome! Great! cool! Good job!

    › gem i tries  
    Fetching: tries-0.2.0.gem (100%)
    Successfully installed tries-0.2.0
    1 gem installed
    
  • #1 楼 @hooopo #2 楼 @whitecrow #3 楼 @fleuria

    我谨代表 @luikore 鄙视你们这些 Mark 党..

    › gem i triez
    Fetching: triez-0.1.gem (100%)
    Building native extensions.  This could take a while...
    ERROR:  Error installing triez:
        ERROR: Failed to build gem native extension.
    
            /Users/saito/.rvm/rubies/ruby-1.9.3-p374/bin/ruby extconf.rb
    creating Makefile
    /usr/local/bin/gcc-4.2 -O3 -c -I.. ../hat-trie/ahtable.c ../hat-trie/hat-trie.c ../hat-trie/murmurhash3.c
    In file included from ../hat-trie/ahtable.h:28,
                     from ../hat-trie/ahtable.c:8:
    ../hat-trie/pstdint.h:711: error: conflicting types for ‘uintptr_t’
    /usr/include/i386/types.h:109: error: previous declaration of ‘uintptr_t’ was here
    ../hat-trie/pstdint.h:712: error: conflicting types for ‘intptr_t’
    /usr/include/i386/types.h:105: error: previous declaration of ‘intptr_t’ was here
    In file included from ../hat-trie/ahtable.h:28,
                     from ../hat-trie/hat-trie.c:9:
    ../hat-trie/pstdint.h:711: error: conflicting types for ‘uintptr_t’
    /usr/include/i386/types.h:109: error: previous declaration of ‘uintptr_t’ was here
    ../hat-trie/pstdint.h:712: error: conflicting types for ‘intptr_t’
    /usr/include/i386/types.h:105: error: previous declaration of ‘intptr_t’ was here
    In file included from ../hat-trie/murmurhash3.h:7,
                     from ../hat-trie/murmurhash3.c:4:
    ../hat-trie/pstdint.h:711: error: conflicting types for ‘uintptr_t’
    /usr/include/i386/types.h:109: error: previous declaration of ‘uintptr_t’ was here
    ../hat-trie/pstdint.h:712: error: conflicting types for ‘intptr_t’
    /usr/include/i386/types.h:105: error: previous declaration of ‘intptr_t’ was here
    ar -r libtries.a
    ar: no archive members specified
    usage:  ar -d [-TLsv] archive file ...
        ar -m [-TLsv] archive file ...
        ar -m [-abiTLsv] position archive file ...
        ar -p [-TLsv] archive [file ...]
        ar -q [-cTLsv] archive file ...
        ar -r [-cuTLsv] archive file ...
        ar -r [-abciuTLsv] position archive file ...
        ar -t [-TLsv] archive [file ...]
        ar -x [-ouTLsv] archive [file ...]
    
    make
    compiling hat-stub.c
    compiling triez.cc
    cc1plus: warning: command line option "-Wdeclaration-after-statement" is valid for C/ObjC but not for C++
    cc1plus: warning: command line option "-Wimplicit-function-declaration" is valid for C/ObjC but not for C++
    linking shared-object triez.bundle
    ld: library not found for -ltries
    collect2: ld returned 1 exit status
    make: *** [triez.bundle] Error 1
    
    
    Gem files will remain installed in /Users/saito/.rvm/gems/ruby-1.9.3-p374/gems/triez-0.1 for inspection.
    Results logged to /Users/saito/.rvm/gems/ruby-1.9.3-p374/gems/triez-0.1/ext/gem_make.out
    
  • 发帖请注意代码的格式化 at 2013年01月31日

    mao 这是个好姿势, 你以后要常摆.

  • #28 楼 @ranmocy grack 本身是 Scott Chacon 写的,只不过没有认证体系。是完全开放的。

    我把它封装成了一个 gem, 然后开了一个 valid? 的口子。大家就可以根据 valid? 来自己实现了。

    揣摩 grack/server 其实还好。知道有那么几个 http 的接口就好了。核心是 upload-pack 跟 receive-pack. 当然这两个接口是 git 最重要的两个接口了。

  • #25 楼 @ranmocy 其实挺好实现的..

    用 git-hooks 往 redis 里面 push 一条数据就好了,不需要调用 inner api, 成本几乎为 0.

    具体可以参考现在的 gitlabhq 里面的 hooks. 做法几乎一样,只不过 push 的数据不同而已。

  • #26 楼 @ranmocy 嗯,这两个是没区别的。

    valid? 的时候先读了一次是因为要 解析 body 体,获取 git 的 push 信息.. 从而判断权限。

    server.rb 内部的就不需要做这个 rewind 了。( 读过一次之后,头指针变化之后,重置头指针..

    具体是什么还真有点忘记了。貌似是我最后解决了所有 Server 的 Grack 问题... 现在的版本都是没问题的。orz..

  • #23 楼 @ranmocy 是的,要不然没法获取自己软件被安装的数量,计数也是很重要的啊..

    之前 Github 有一个 clone 数量,后来莫名其妙就消失了。

  • #21 楼 @ranmocy 贴出来吧,里面就一个文件:

    gitlab_meta.rb

    class GitlabMeta
      # empty gem
    end
    
  • #24 楼 @ranmocy 嗯,是的。这里的 read 不论什么都不会出错的。

    我想起来了,貌似是之前没有 rewind.. MIT 是可以进入闭源软件的.. 基本等同于没限制。

  • #18 楼 @ranmocy 实际上什么数据都没监控,只是记录一下安装数据而已。

    反驳的人基本都没看过 gitlab_meta 这个神奇的 gem 里面到底是啥。

  • #22 楼 @ranmocy 如果没记错的话,在 Thin 上是不行的。用 unicorn 部署是没问题的。

    我的 grack 主要是在 gitlabhq 里面实现 valid? 方法的时候用到了,主要是为了实现 gitlabhq 的权限控制。

    如果没有分支权限问题的话,是不需要获取头的。https://github.com/gitlabhq/gitlabhq/blob/master/lib/gitlab/backend/grack_auth.rb#L76-L85

  • #20 楼 @robbin read 就会碰到我原文里面的问题。

    有的 Server 可以读取,有的不行。

  • d at 2013年01月26日

    #11 楼 @bhuztez

    屎屎家有一个野蛮的邻居,每当屎屎穿新衣服经过邻居家门前的时候,邻居就会往屎屎身上扔屎,有一天屎屎穿着最漂亮的衣服去上学,屎哥对屎屎说“这件衣服弄脏了没有其他衣服穿了,你要躲着邻居家门口走”,屎姐不同意说“你没错,错的是邻居,你要天天穿着新衣服从邻居家门口路过,这样躲屎的能力就提高了,就不怕他了”。

    是这个节奏么?

  • d at 2013年01月26日

    其实小明如果能把每天扔到自己身上的屎都收集起来,做深入研究。就能知道邻居一家身体状况。大便要是带血的话,痔疮,肛瘘,直肠癌各三成怕是无误了。

  • d at 2013年01月26日

    有一天小明穿着你最漂亮的衣服去上学

    我觉得这个小明很有问题:穿我的衣服干嘛,穿他自己的啊。

  • #14 楼 @hooopo 实际上 Rails 一直以来都有两个问题是比较困扰的,现在不觉得只是因为都瘸习惯了而已..

    1>. Model 的字段不明,这个在 Java 还真不是问题,因为 Java 会区分 field 和 method 的调用方式。该加 () 加 (). rubyist 早就习惯不加 () 的调用方式了。导致看代码过程中你无法区分是 field 还是 method. 就需要回头看 schema.rb 或者 直接瞄数据库..

    2>. Controller 的 Mapping 不明,这个在 Java 上也不是问题.. 因为 Java 现在的实现方式都是 Annotation( 直接标注在方法上).. 往往在 debug 的时候经常会某个 url 出错,需要立即进入对应的 Controller 看看代码。发现你得先进 routes.rb 看看到底是哪个东西映射的。尤其在 Rails 4 之后,routes Concern 加进来,找都找不着...

    很多人说:你瘸了,我卖你副拐吧.. annotate, rake routes | grep 两副拐到手,你终于能走正步了..

    出门跟邻里相亲打招呼,发现为啥就自己需要拄拐。哀叹自己遗传基因不好.. 听天由命。

    突然旁边就走来一个大叔面带微笑:

    !![]((http://d.pr/i/4j5X+)

    潜心修炼两个时辰,你就脱拐了.. 仔细询问邻里相亲,发现他们都是这样脱拐的。..

    其实书里面只写着三个单词:你将整书付之一炬,刻与村头木板石碑,退隐江湖,深藏功与名。

    石碑上刻着: . . . ^^^^^^^^^^^^^^^^^^^ | # Sinatra + DataMapper | vvvvvvvvvvvvvvvvvvvvvv

  • string.coffee 就有 2k 行的代码。

    其实是挺恐怖的... 如果我们都有 Google 的 10G 网络,那可能就没人 care 这个问题了...

  • #6 楼 @zacker330 这个确实是问题.. 程序的可读性会有影响。无论用什么方式解决,原生的 AR 都没有提供解决方案。

    我就在静等 DataMapper 2 了..

  • #15 楼 @lgn21st 嗯,没问题..

  • 同时写两个 gem 太痛苦了 at 2013年01月24日

    问题是你为什么要同时开发两个 Gem,如果都是新作的,应该先在 lib 目录才对。

    后抽离出去,一口吃成胖子能行么?

  • 这段代码怎么去重复? at 2013年01月24日

    #5 楼 @hooopo 怎么有种 omasake 的既视感。

  • #11 楼 @sailtsao Gitlab 本身也比较吃资源的。推荐 3 实例 1G 内存.. ( 其实是跟 Rails 有关系。用 Go 写就不会这样了.. orz. 另外可以适当减少实例的数量减少内存需求。

    另外 AWS 的 CPU 差到不可接受。.. 其他的其实还行。

  • #8 楼 @bhuztez ruby_china 也监控着呢..

  • 客户端产品其实可以通过 Google Analytics 嵌入不同的 Custom Event..

    这样可以记录用户行为,针对性的改善用户体验。不然自己开发的成本还是挺高的。

  • #4 楼 @bhuztez 这当然是个好主意,每个版本都会 release 一个对应的 gem 版本。你可以监控这个版本的有多少人安装了。同时你就可以选择是否放弃兼容落后版本等等..

    同时对于开源作者来说是一个很大的激励作用...

    Gitlab 这种是因为不能嵌入 Google Analytics. 现在多少客户端产品都在搞这个事情..

    Yeoman 在每次创建项目的时候都会触发 Google Analytics. 这样作者可以知道每天有多少人用 Yeoman 创建了项目等等..

  • 另外,通过这个开源项目,randx 自身也实现了变现。

    开源的盈利点总是有人会看到,总是有人来请你一起实现梦想。前提是你的产品足够好。

  • #1 楼 @sailtsao 是的,每月 randx 都会 release 一个版本,不管大小。

    他这种毅力我周围的人是绝对没有的..

    另外一个小 Tip 也是我学到的挺好的内容,如何 track 自己的开源产品被别人使用了。

    Gitlab 有一个自己的 gitlab_meta 的 gem.. 在 production group 里面,所以可以知道 Gitlab 被多少人真正应用在线上了。

    ruby_china 也可以借鉴其实。