• 再次回复:

    终于抽时间写了个 test

    require "benchmark"
    
    result = Benchmark.measure("normal") do
      100.times do
        f = File.open("/Users/***/Downloads/***.dmg", "r")
        s = f.read
        f.close
        # p "finish #{s.length}"
      end
    end
    
    p result
    
    result = Benchmark.measure("concurrent") do
      threads = []
      100.times do
        t = Thread.new do
          f = File.open("/Users/***/Downloads/***.dmg", "r")
          # p f
          s = f.read
          f.close
          # p "finish #{s.length}"
        end
        threads << t
      end
      threads.each do |t|
        t.join
      end
    end
    
    p result
    
    while true
    
    end
    

    运行结果:

    #<Benchmark::Tms:0x007fecde927d90 @label="normal", @real=0.2543760000007751, @cstime=0.0, @cutime=0.0, @stime=0.24, @utime=0.010000000000000002, @total=0.25>
    #<Benchmark::Tms:0x007fecde917648 @label="concurrent", @real=0.1437469999982568, @cstime=0.0, @cutime=0.0, @stime=0.31000000000000005, @utime=0.020000000000000004, @total=0.33000000000000007>
    

    证实以下结论:

    IO 是不堵塞的

    没什么太大的好处,但也并不是完全没有用,刚比较了一下,小并发,还是比较快的,但是数据量一大就不行了(因为 Ruby 都是把数据不管二进制还是字符流存在 String,数据大了很卡)。。。

    另外,IO 密集的程序应该是做日志系统吧。。。但是日志系统一般都有逻辑,而不会直接就执行一行 read 和 write,所以还是没有优势。

    不过如果是简单的日志系统,单线程的,那还是比较有价值的。

    适用场景:个人博客(基本不涉及计算,而且偏向静态所以多数都是 IO 操作)、展示型网站、bug 追踪系统、工作流系统。

    GIL 让密集计算串行起来其实让开发者更安心用多线程,其实“并行”还是有的,只是模拟(通过给定每个 Thread 执行时间作业),对于非高需求的开发者,实际上这样可以降低开发难度(满足简单软件开发)。所以也是满足了这门语言适合对 CS(Computer Science)不 Geek 的人群使用。

    另外,一开始是我用 C 多线程来改写了 amber-kit 项目部分的代码,后来发现把 Ruby 的 VM 弄死了(回去再补图)。所以才在 5 楼回复了一下,结果被楼上楼下的各种误会(其实没有人知道我做了什么)。

    在 C 多线程 pthread 下,MRI 或无法回收 pthread 里面执行的堆栈的 VALUE,混编需要注意这点。

    然后跑了 1000 个并发(其实没到 1000,大概在 200 - 400 左右)就挂了,然后报错 segment fault,一堆 ruby gc 相关的错误 trace 就出现了。

    其实我只是想绕开 GIL,但是还是失败了

  • Thank you very much~ That's what I need

  • unicorn 跑 MRI,puma 跑 JVM,因为前者多进程,后者是多线程(我看了源码,是客户端 waiting full 的 Thread_pool),多线程在 MRI 有 GIL,相当于没并行,加上 IO 会堵塞(除了 IO 会释放),所以(基本)是串行的,那样环境下的 PUMA 等于(不亚于)单进程单线程。 楼上说的代码线程安全,加锁就好,另外,多进程有缺陷:互相之间超难通信,过程复杂,而且传输的东西有时候不全(用 pipe + marshal)

  • 马克,今晚回

  • 以前没有成熟的方案的年代,人们不是推这个就是那个语言,当解决方案已经遍地、市场已经洗牌了之后,人们开始寻求更好的解决方案,然后新的解决方案有新的市场,然后继续洗牌,最后剩下的就那么几家。

    上次我发的关于 TM(TextMate)是不是已经淘汰的相关讨论,其实也就是这样,自从 Jetbrains 以后、机器性能提升了好几遍之后,谁还会因为担心卡啦、慢啦去用 没有任何社区模块支持的 barebone 文本编辑器?

    5 年以前还可以说用 Notepad++ 写代码,因为当初人类对编辑器的意识没有那么丰富。

    不是还有一篇帖子嘲讽 如何退出 VIM?

    我觉得前端在某些功能取代后端去完成,是更自然的事情,因为有些功能本来就应该前端完成,只是当年 ECMAScript 没那么强,但是随着 The Art of ECMAScript(这个词汇来自于 TypeScript 的视频)发展,后端有些功能真的就应该客户端来做,比如界面谁来确定的,肯定是客户端。

    从很早以前,本来就应该是前端去确定界面的逻辑、功能,只是上个 Web 2.0 时代 JS 没那么强,人们更喜欢动态用后台提供的数据(HTML 形式)去构建界面。

    就简单来说,10 年以前我上初中刚开始学网页制作喜欢用 document.getElementById(),有且只能通过 ID 筛选,虽然不同浏览器加入了自己的特性,但是在别的浏览器不兼容,就算你开发出一套库也要时间,总之就是生产力还上不去。

    现在随便 querySelector $() 一大堆。。。我就不举例了。。。

    我以前写过一篇文章,很多程序员是怎么来到这个行业的,很多都是为了淘金,淘完了转身就走了。

    所以,如果你是打算淘金的话,建议你不要学习钱景不好确定的 Ruby 和 Rails。

    在上一个年代(世纪),那时候很火的就是汽车维修技术啦、厨艺啦,但是坚持到最后的人有几个?

    千万不要学半路就走人,不然你就不学,因为你没有诚意走完这条路,或者说你只是因为羡慕别人从这条路终点摘个果所以你去摘而已。

    腹黑地讲:

    如果已经深入泥潭的,发现走不回来的,我还是劝你别回来了,因为你还不如继续深陷下去,还能作为肥料养沃泥土,或许你还能成为个准专业人物,不然你要起身的话动作幅度太大,力气也要很大,而且上了岸你还要重走很多本来想走的路。。。而且或许你已经跟不上了。。。

    也许。。。

    这就是所谓“脱坑”的定义了,也难怪他们用一句“进坑容易脱坑难”把它说这么难。。。

    如果你只是看到一些爱装逼的“自称”或者被人“冠以”大神的所谓某某某。。。

    请务必正确选择自己的道路,不要被各种雕虫小技吸引,不要被某些“大哥大姐”拉拢,更不要随便叫别人师傅,除非你真百分百确认、永不后悔地打算一直走下去。

    因为:

    花花世界无奇不有,首先请了解你自己现在该做什么,然后请做你自己的事情,请务正业!(不要别人干什么你又羡慕什么又去干什么,别到时候一事无成一无所得)

  • 谢谢

  • 能达到那个级别了,直接转 Java go,除非创业公司一分钱都没有

  • 说好的算法(algorithm)呢?你这只是搬运了些不明来源的包过来做了不知所然的调用

  • 招募项目合伙人 at July 21, 2017

    LZ 估计是被创业公司拖欠工资或者不让离职

  • 招募项目合伙人 at July 20, 2017

    满分作文系列,Good

  • Ruby - 反射 at July 17, 2017

    我只是提点建议:少用反射,效率很低,建议用 map(Hash)关联起来,另外,这样的用法你是在为以后、别的同事维护带来麻烦,因为字符串没有索引 parse 到,相当于你制造了 DSL 那样,后续只能看上下文,而且还不好排错,而且还跟危险

  • 如何读文档? at July 17, 2017

    一个 Spring 就够玩年了,没有多年的使用经验,实际大公司项目(这里侧重说大公司,是因为大公司才有更多的机会实现更多的细节),其它就算你知道再多,没有一个规范、吸取多重元素后的积累,那种产物多年后会认知到当年的 TYTSP,文章不错,给出了一些 basic index,也已经描述了我想说的没有实际项目光从文档也是没有意义的想法,文档很多 Sample 都木有,有些也只是列举在那里做个标记,你之前炮灰工程师的文章不正提到这些吗,单纯凭借特定传授的那些内容,真的就能简历写几年经验?没有自己踩过坑,没有自己一手掌握而凭空想象、参考来的东西,都是不切实际的。上次我故意提 ThinkPHP,因为内部实现得超级为任务化的复杂,它的复杂不是在学术设计而是面向任务,我后来彻底抛弃了 PHP 理由就是大多数框架都喜欢用的动态特性,实际上跟 PHP 本身作为模板语言(跟 erb JSP 一个目的)同时又兼任通用编程,实际上一些开发方式会存在二义性,比如通过一个字符串反射信息,尤其是一些模板引擎,你到底是反射字面量、变量还是 HTML 模板的某部分,有点混乱,但是这样的语言很好做事(完成任务),我同事就喜欢这样的方式拼接 SQL 各种过程式完成任务,虽然已经被我喷惯了。Rb 有 Symbol,其实就是个 Selector,别的语言也有,ObjC 明显有,ECMAScript 6 也有,等等。。。但是这些设施能够更好更规范做事。咦,怎么扯远了,我也不知道。。。话说 LZ 只是为了表达自己的一种理解,结果又被 姜叔叔抠字眼了。

  • Ruby Toolbox 要跑路啦! at July 12, 2017

    很多项目都挂掉了,朝代更迭,ST N 多个 Ruby 插件也不维护,有时候感觉是不是淘汰了。

  • 弯弯老师你好

  • 咳咳,其实,有一次,我的大学朋友问我能做那么多项目了,让我给他们讲讲课什么的,引导一下。后来我跟他们说看一些名著(比如 Bjarne Stroustrup 写的 A Tour of CPP),但是他们不太认可,有些甚至觉得我这样的建议有装逼之嫌。

    没错,对于一个常年在职工作的开发人员来说,我们是已经有了很多项目经验以及对这个行业的观点,已经形成了一定感官认识,但是对于一个新人来说,我直接告诉你别走这条路,然后不带任何的理由,尤其你要是把 @jasl 这人喊出来,他不仅不会给你指导,还不耐烦地直接怼你(在另一个帖子)。

    其实吧,LZ 最适合的,应该是找一个优质的培训机构、网上课堂、视频、入门书籍,Head First 系列是你的最佳首选。

    我觉得论坛吧,好好说说话,好好讲话,理解一下,不就好咯,干嘛搞得好像人神共愤啦,谁谁谁一定对的错的,纠结于对了错了,有什么用?你就算是 coding 精英,市场上没你产品的用武之地,你也是浪费。

    反倒是那群销售一样的程序员——培训机构的老师很火,为啥,因为人家懂得让别人接受自己、了解自己,哪怕水平不高,但是至少人家认可,接受,你再跟别人说你自己对,别人也只会跟你对着干。

    所以一部分的 IT 开发不适合当管理,因为那部分人际沟通能力极差。要不然就不会有“程序员鼓励师”啦之类的“特殊岗位”。

    “代码即正义”是希望自己永远单身孤身一人自己蹲在电脑前的节奏。

    作为一个新人,他们确实是希望得到帮助、理解和学习,而老人们不是你去仗势按照自己已经定格了的所谓的人生观去评定、评述。因为或许新一代学了这样东西,会有不同的观点,人家跟你的代码观、价值观彻底不一样。

    这也是一个公司发展,新陈代谢的循环。

    如果 Ruby China 总是希望有且只站在 Ruby China 那帮人自己进度去衡量他人,我觉得,确实是比较失望。至少,一开始就不让人发帖子而是先去搜索,对,如果我要去搜索,我一定不会来这里,而是选择 Baigooduck(baidu / google / duckduckgo)。

    另外,我以前发一个帖子,关不掉,而且管理员还把帖子重启,添油加醋,我觉得,这里的管理员确实……

  • 其实我是不认可全栈的说法的,这世上没有全能的工程师,总有弱点,自以为全能的阵营,很可能是各方面只做了 50%(哦不,甚至 25% 都不到的用例,然后自己自满骄傲的觉得自己全能)。全栈是占有欲强的人世界观,实际上公司如果给你这时间各处研究,去一点点实现,很多市场都死了。

  • 物理机 ubuntu-mate,(以前 linuxmint,由于 18 版本开始显卡驱动不对,放弃)。

  • 呀,加入这个社区一段时间,其实特别期待你的回复的(多年前大概 2012 年就看过你的帖子,在我是考虑选择 PHP 还是 Ruby 的时候)。 话说没找到你的 ripper-tags,可以分享吗?

  • 没鄙视 RM,上面回复说了,尤其如果做 Rails 公司项目的时候,还是要用 RM,理由是生产力,Editor 不带辅助设施(facility)效率不高,毕竟商业主要最重要的是钱而不是写代码时候讲究的文艺。

    还有回复说的高手赶思维的问题,其实高手更需要一个集成环境赶紧把整体原型构造出来,而不是折腾环境 configuration。

    或许感觉他们喜欢编辑器,主要是动态语言系列基本共性都是看上下文,IDE 是打辅助的,动态语言在 IDE 没有静态语言那样开发效率高,因为动态语言开发的项目大了,IDE 基本提示都是懵的,除非 IDE 占用大量内存去为当前项目做超级复杂的语义分析,动态语言最适合的 IDE 应该是人工智能,说到 AI,如果都 AI 帮你分析到非常精确了,以至于让你随便打都知道你下一步些什么,还要人来写代码干嘛?

    所以,动态语言在某种程度上,你用 ST 和用 WS(WebStorm)、RM(Ruby Mine)基本差不多的,ctags 插件基本帮你把提示扫出来了,不直接匹配而是提示该词法定义的位置,WS 把项目写大了,也会产生类似结果的。所以那个时候就不用纠结用哪个了。但是从资源占用上,ST、TextMate 这些肯定占绝对优势。

  • 那个简直就是 the copy of TextMate,一样的功能,快捷键生成代码,而且 chocolat 还没有 git 集成,好像不支持插件。而且还那么贵:49 美金

  • Atom 和 VSC 一起说吧,Atom 社区一点,字体渲染效果好看一些,autocomplete-ruby 用的 rsense,问题是 rsense 不维护了,转向 ctags。

    VSC 在代码分析方面强很多,但是 ruby-ide 插件有 N 多 bug,我给他们提的 issue 都没 fix,不过我后来发现其实是 js 调用 command 失败,没做容错处理,总之前半部分代码写错了,后半部分就没代码提示了。

  • 呃,我以前没钱买 mac 的时候在 archlinux 写 C 就是用 vim 配置 ctags,是挺好用的,没毛病。不过介于效率,后来换成了 gedit,之后项目大了换成 anjuta。

    Clion 不错,我用在公司的 Cpp 框架就是在 Clion 写,refactor 便捷。

  • 目前 ST 3,因为用自己的框架,如果用 Rails 做公司项目则配 RM

  • 我发现一些箭头符号什么的快捷键,不知道怎么按,比如一些 each statement,输入前几个字母然后加快捷键,我感觉还是 ST 直观一些~

  • 漫谈 Kernel at June 27, 2017

    上面一堆把自己说得老司机一样的话,下面一句 raise 类似 php 的 die,说明你根本不了解 php。

  • 换句话说这篇文章在指点大家:【哪个行业赚钱就去哪个】

    我觉得这样难免有误于人,选择一样东西,综合因素有很多的,这里就不多提了。当然你说【你只喜欢赚钱】所以【你看哪个行业赚钱就去哪个】是说得通的。

    然而这只是其中一个角度,但是千万不要拿你自己的角度去像培训机构一样的误导人家~

    万一某些孩子有某些聪明的天赋才智,你把人家的整个人生都被你狭隘的赚钱价值观给毁了~

    另外,内容涉及的视频是不是买通了关系在这里打广告的?

  • 路过~~~