• 那么我的上一条已经回答过你了。Ruby 在 Web 领域,生态完善、案例众多、技术有效、并非冷门。

  • 不过中文资料少、Windows 下极不友好确实影响在国内的传播

  • Ruby 主要应用在 Web 后端领域,你如果看综合语言排行榜,那么单一领域语言还是很吃亏的,当然也比不过 PHP,那个上手确实容易(从工作经历,我其实是 PHP 转 Ruby),Wordpress 这种杀手应用也太强。

    如果你放眼世界

    Programming Language Usage Distribution in the Top 1 Million Sites Ruby 排第三位(1%)

    Programming Language Usage Distribution in the Top 100k Sites Ruby 还是第三位,但是占比显著提高(4%)

    Programming Language Usage Distribution in the Top 10k Sites Ruby 还是第三位,占比(6%)

    Identify technology on websites Ruby(主要是 Rails)在 Web 框架领域排名第三位

    6 of the Top 10 YCombinator companies use Ruby

    这个市占比,普及率很低么?

    此外国内外有个很明显的差别,朋友进了 AWS,对我讲:“我看了代码仓库,一半的项目都是 Ruby”,可是,你听过 AWS 招 Ruby 么?(我那个朋友是一个 PHP 爱好者,进公司写 Java 和维护一点儿 Ruby 项目)

    Aribnb、苹果,也是大量的 Ruby 系统,你看 Linkedin 上的 JD,招的都是 Software Engineer,某些岗位下会有 Ruby、Rails 是加分项。

    国内其实闷声发大财的公司挺多的,比如听说过商汤有一个 Ruby 团队(之前喝酒有人给我透露过有 30+ 人),没见过他们出来宣传,组织 RubyConf 的时候我一直有一个遗憾(我执行力太差),把那些用 Ruby 但是不声张的公司全炸出来

    另外对于国内 Ruby 市占疲软嘛,我有点得罪人的话,对于公司,能靠堆人和加班就能解决问题的时候,需要谈技术的生产力吗?公司会因为你工作效率高干得多奖励你么?我甚至还过有人对我讲:“你是效率高,但我找 50 个实习生,你拼得过他们么?我找 100 个,你肯定不行了”

    这是对我职业生涯影响最重的一次经历,曾经我的理念是为公司降低成本提高产出,结合国内的经济形势疲软,我就下定决心不再靠依附于公司谋生,自由职业后,我要为工作时间的每一分每一秒负责,此时生产力才真的是问题。

    另外啊,这几年有几阵突然急招 Ruby 工程师,我知道的两次,第一次魔改 GitLab,自主研发代码托管服务,第二次,魔改貔貅,自主研发数字货币交易所。

  • 其实销售能力才是最重要的,不过前端是产品的窗户...

  • 其实你这里 sex 可以用 enum 来做的,然后自动就生成 malefemale 两个 scope 了,rails 6 加了 not_male 这样的 scope,但没有的话你可以自己实现(当然这样就没必要用 enum 了)

    !"male" 这种做法没法搞,这样写必定等价于 false,你可以改写成 by_sex(:not_male) 把 symbol 当 枚举 去用,更改你的 scope 实现做一个 case...when 就好了

  • Ruby/Rails 的生产力高过 Java、Py 等语言我觉得在 RubyChina 应该是有共识的。

    就我提的那个案例的话,从 0 搭一整套 OA(核心功能多租多项目、审批流程、组织结构、动态表单、带全部界面),我一个人实施(其实还是有俩朋友分担了一些工作),工期三个月、期间我还有两个别的合同在同时进行、组织 RubyConf、顺带结了个婚、保证八个小时睡眠和两个小时 山口山 和 SC2 的游戏时间。

    做 Web 或者业务系统都不是什么高精尖的事情,搬砖做体力活要时薪足够高,就只能在效率上找方法(当然把事情做对也很重要),到我描述的这个水平的效率至少我相信只有 Ruby 能带来。我也学习了一些语言,但目的是储备起来配合 Ruby 解决他不擅长的问题,而不是取代它。

    另外的例子,我之前分享过表单引擎 FormCore,能力跟金数据那种商业产品持平,原型版本一个通宵开发完,后来我和 hooopo 做了个带后端存储的商业版本(百万数据表单的过滤聚合查询演示),大概的过程就是吃了个饭聊了方案,然后我花了三个晚上写出来的。 界面虽然丑陋,但是很多公司就靠这种产品就能经营下去了。

    (不会写前端就是不能发财的原罪啊!)

    如果你不相信 Ruby/Rails 的生产力,这些项目代码都是公开的,可以比比看?

  • 当然有条件的话 虚拟机镜像 或者 Docker 分发还是最靠谱的选择

  • OS 完全一致的话,可以试试 https://bundler.io/guides/deploying.html 坑主要是二进制,需要你两台机器都提前装好依赖,版本尽量一致

  • 如果服务器返回结果了,那就要看下网易那边的文档。 Mail 最大的坑是报 EOFError

  • each_chareach_byte 就是把 String 转换成 Enumerable 同时保证没有歧义,有歧义的地方就会产生坑,有坑的地方踩进去可能就捅出大篓子,所以不能让 String 自身有 Enumerable

  • 没做这个,如果给阅读器用直接 https://ruby-china.org/topics/feed

  • 国内直接就能部署一个。。。然后就进去了 GG

  • 下个月~ 最近冷却下做点别的事(zhuan)情(qian)

  • psql (12.2, server 12.1)
    Type "help" for help.
    
    jasl=# SELECT (ACOS(0.9999250668634809) * 6376.77271) as distance;
         distance
    -------------------
     78.06486321137545
    (1 row)
    
    2.6.5 :001 > ActiveRecord::Base.connection.execute("SELECT (ACOS(0.9999250668634809) * 6376.77271) as distance;").first
       (0.5ms)  SELECT (ACOS(0.9999250668634809) * 6376.77271) as distance;
     => {"distance"=>78.06486321137545}
    

    再确认一下 PG 版本和结果?

  • 如果你想校验日期格式 https://github.com/adzap/validates_timeliness 用这个就好

    如果你要想练习,最简单的办法就是,你先搞明白 rawValue = record.send(attribute.to_s + '_before_type_cast') 出来的值和类型是什么 (取 attribute.to_s + '_before_type_cast' 的意图没看懂)

    puts rawValue
    puts rawValue.class
    

    看一看

    继续,做做测试,比如

    2.6.5 :009 > User.first.created_at_before_type_cast
      User Load (0.5ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
     => 2020-02-22 16:33:42 UTC
    2.6.5 :010 > Date.parse User.first.created_at_before_type_cast
      User Load (0.5ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
    Traceback (most recent call last):
            2: from (irb):10
            1: from (irb):10:in `parse'
    TypeError (no implicit conversion of Time into String)
    
    2.6.5 :011 > Date.parse User.first.created_at.to_date
      User Load (0.5ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
    Traceback (most recent call last):
            3: from (irb):11
            2: from (irb):11:in `rescue in irb_binding'
            1: from (irb):11:in `parse'
    TypeError (no implicit conversion of Date into String)
    

    可见字段类型如果是 Datetime 甚至就是 Date 一样可以引发异常,这明显违背了这个验证器的意图。

    这里正确的做法是用专门的库(开头提了),或者利用 ActiveRecord::Type

    2.6.5 :012 > ActiveRecord::Type.lookup(:date).cast("x")
     => nil
    
    2.6.5 :014 > ActiveRecord::Type.lookup(:date).cast('2020-02-02')
     => Sun, 02 Feb 2020
    
    2.6.5 :015 > ActiveRecord::Type.lookup(:date).cast(Date.today)
     => Tue, 25 Feb 2020
    
    2.6.5 :016 > ActiveRecord::Type.lookup(:date).cast(Time.now)
     => Tue, 25 Feb 2020
    

    那么只要判断返回值是否为 nil,即可判定了

  • 自己学习一下 CSV 的格式,然后手拼 CSV

  • Rails 数据库相关问题 at 2020年02月23日

    PG::UndefinedFunction 数据库问题没跑,控制器/路由的错误基本都是 ActionController 抛出的。 你换数据库可以考虑删掉 db/schema.rb 然后 rails db:create && rails db:migrate 重建 schema.rb

  • 有了工作流,很多不好做的事儿都好做了

  • 之前我自己有一套。。。换电脑之后忘了备份了,这次基本上要么在这俩帖子里,要不就在代码里。。。其他都语音就没记了

  • 我是真的考虑要不要恰饭卖个 Pro 😂 什么样的变态需求会有人愿意付费呢?

  • Rails 数据库相关问题 at 2020年02月19日

    没错,所以你的项目达到一定程度后,就要考虑部署环境和开发环境尽可能接近了。

    就算是同一款数据库,版本不同也有可能行为不一致的

  • Rails 数据库相关问题 at 2020年02月19日

    日志里写清楚了

    No function matches the given name and argument types. You might need to add explicit type casts.

    问题在于这 sql

    select * from problems where detected_at > date('now','start of year','-1 year') AND detected_at < date('now','start of year','1 second')):

    date 聚合函数有问题,如果是你自己写的,那么你就要找一下 PG 对应的函数改写

  • Petri Net workflow for Rails at 2020年02月14日

    促进一下生态, @dsh0416 制作了用于构造 PetriNet 的 DSL https://github.com/dsh0416/petri-dsl/

  • 后继产品:Petri Net workflow for Rails by Hooopo

    当然 Hooopo 的代码太暴力了,我也要写个版本,跟他比一比

  • Petri Net workflow for Rails at 2020年02月12日

    炮哥出品,必属精品,这就是我前年的工作流的全新版本啦 🎉

  • 苹果 2016 新设计的那个钢板键盘有设计缺陷,所以使用这设计的(就是 2016-2019 的 mbp)键盘保修期延长到四年且免费更换

  • 成为 MiBoy 啊!一百多就够了吧...反正机械键盘几乎都是 Cherry 轴 Cherry G3000 500 左右(傻大笨) Mac 布局的 Matias 也差不多 700 多

  • 消耗品该磨损就磨损吧(毕竟还能顺道换 C 壳和电池),在书桌上用可以买个键盘用

  • 华顺应该没续那个域名 我看看能否拿掉那一条

  • APM 监控有钱上 NewRelic,没钱自建 ELK

    自动化运维机器不多各台机器单独配 Monit 就好,部署 capstrano,老玩具还马马虎虎能用。

    机器比较多的话,现代话的做法还是上容器了