那么我的上一条已经回答过你了。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 来做的,然后自动就生成 male
和 female
两个 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_char
和 each_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
PG::UndefinedFunction
数据库问题没跑,控制器/路由的错误基本都是 ActionController
抛出的。
你换数据库可以考虑删掉 db/schema.rb
然后 rails db:create && rails db:migrate
重建 schema.rb
有了工作流,很多不好做的事儿都好做了
之前我自己有一套。。。换电脑之后忘了备份了,这次基本上要么在这俩帖子里,要不就在代码里。。。其他都语音就没记了
我是真的考虑要不要恰饭卖个 Pro 什么样的变态需求会有人愿意付费呢?
没错,所以你的项目达到一定程度后,就要考虑部署环境和开发环境尽可能接近了。
就算是同一款数据库,版本不同也有可能行为不一致的
日志里写清楚了
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 对应的函数改写
促进一下生态, @dsh0416 制作了用于构造 PetriNet 的 DSL https://github.com/dsh0416/petri-dsl/
后继产品:Petri Net workflow for Rails by Hooopo
当然 Hooopo 的代码太暴力了,我也要写个版本,跟他比一比
炮哥出品,必属精品,这就是我前年的工作流的全新版本啦
苹果 2016 新设计的那个钢板键盘有设计缺陷,所以使用这设计的(就是 2016-2019 的 mbp)键盘保修期延长到四年且免费更换
成为 MiBoy 啊!一百多就够了吧...反正机械键盘几乎都是 Cherry 轴 Cherry G3000 500 左右(傻大笨) Mac 布局的 Matias 也差不多 700 多
消耗品该磨损就磨损吧(毕竟还能顺道换 C 壳和电池),在书桌上用可以买个键盘用
华顺应该没续那个域名 我看看能否拿掉那一条
APM 监控有钱上 NewRelic,没钱自建 ELK
自动化运维机器不多各台机器单独配 Monit 就好,部署 capstrano,老玩具还马马虎虎能用。
机器比较多的话,现代话的做法还是上容器了