Rails 4.2.8 才支持 Ruby 2.4: http://weblog.rubyonrails.org/2017/2/21/Rails-4-2-8-has-been-released/
https://makandracards.com/makandra/14229-the-many-gotchas-of-ruby-class-variables
Class variables are bound at compile-time. Also note that only the class and module keywords can be used to change the scope to which class variables are bound. You can not change scope by using class_eval or instance_eval.
摘自 Programming Ruby 1.9&2.0。
有默认值的参数必须放在没有默认值的参数后面。
是会死循环的,不信你试试 arr = [1,2,3]; arr.each {|i| puts i; arr << rand(100) }
。
你给的例子之所以没有死循环,是因为 arr << arr.shift
相当于只是把 arr 的第一个元素移到了末尾,数组的长度并没有变化。
结合楼上给出的源代码,循环的判断条件是 i<RARRAY_LEN(ary)
,既然数组长度没变,循环次数也就是固定的。
发现官方的 Rails Internationalization (I18n) API 指南中也有提到,之前没细看,没发现。
遇到过这种坑,数据库中若设置默认值,Model.new
出来的对象就有了这些默认值,model 中再设置默认值或检测是否设置了值时就容易踩坑。
所以慎用数据库的默认值。
最可能的问题是配置问题。
使用 GitHub 的 git 协议要求你 clone 仓库时用户的公钥在你的 GitHub 账号中。就是说只有 GitHub 的用户才能用 git 协议。部署工具自动 clone 时怎么证明是 GItHub 的用户?要么你服务器上的部署用户的 .ssh/id_rsa.pub
在某个 GitHub 账号的 SSH keys 中,要么你本地用户的 .ssh/id_rsa.pub
在某个账号的 SSH keys 中且设置了 set :forward_agent, true
。
一个月前发了简历,结果没人回复。
至于连接数据库,Rails 是在内置的 Initializers 中的 active_record.initialize_database
初始化连接的,我之前有其它需求想删除这个 initializer,但没找到方法。
楼上检测 MySQL 是否启动的方法依赖 nc,需要单独安装。发现一种只依赖 bash 的方案:
is_db_up(){
timeout 5s bash -c 'echo > /dev/tcp/example.com/3306'
}
Ruby 的编码分 external encoding, internal encoding。三言两语也说不清楚,你看官方文档吧:https://docs.ruby-lang.org/en/2.3.0/Encoding.html
本例中,Windows 系统默认编码是 GBK,因此 external encoding 默认即是 GBK;internal encoding 默认是 nil,即不转码外部读取的信息。
External encoding 和 internal encoding 共同作用,因此 Dir.foreach
获取到的文件名是 GBK 编码,你用了 force_encoding
"转码" 成 UTF-8,然而事实上 force_encoding
并不会对数据进行转码,只是尝试以新的编码解读同样的二进制序列。GBK 中合法的字节序列可能在 UTF-8 中并不合法,因此就出错了。
正确的转码方式是 file_name = file.encode('utf-8')
。
另外,测试中发现个奇怪的地方,Dir['*']
获取到的文件名是 UTF-8 编码的。
类似 3 楼,我搞过另一种实现方式:
module ActiveSupportJSONSerializerModifier
def jsonify(value)
if value.kind_of?(Time) || value.kind_of?(DateTime)
value.strftime '%Y-%m-%d %H:%M:%S'
else
super value
end
end
end
class ActiveSupport::JSON::Encoding::JSONGemEncoder
prepend ActiveSupportJSONSerializerModifier
end
(render json 时各种类型如何转换是由 ActiveSupport::JSON::Encoding::JSONGemEncoder#jsonify 控制的)
但这样修改会影响整个应用,如果只希望改变个别 API 的日期返回格式,还是写个辅助函数在 render 前处理一遍数据,把日期对象转为字符串吧。
比如:
def format_time_column(records, column_name)
column_name = column_name.to_s
# 要点是要先转成纯 Hash,否则该列依然是日期对象,依然会被 jsonify 当做日期序列化
records.map(&:attributes).each do |record|
record[column_name] = record[column_name].strftime('%Y-%m-%d %H:%M:%S')
end
end
我觉得,处理大文件时基本原则有两个:
Let's Encrypt 的开销挺大,目前正在众筹,有能力的朋友建议支持一下。
2016-09-06: Mozilla 考虑对 WoSign 采取行动,StartCom 可能受牵连,镜像站可否改用其它 HTTPS 证书? 2016-09-10: https 证书换为 AlphaSSL 和 Let’s Encrypt
中科大镜像源已经行动了,RubyChina 加油啊。。
借此贴问一下,有没有可能实现多个 Rails 应用共用同一个 Sidekiq server? 有时一台服务器要部署多个项目,每个项目都单独运行一个 Sidekiq server 的话是比较耗资源的。
另外,Sidekiq Wiki 中推荐的守护进程管理方式是使用进程管理器如 systemd 和 upstart,然而一台服务器上运行多个 Sidekiq 实例就不太好用 systemd 管理了(需要为每个实例写一个 systemd service)。
我觉得国内 CA 不值得信任的一个重要原因是在天朝没有任何机构敢于对抗 ZF(ZF 要你签个假证书,你敢不签?)。
可悲的是,WoSign 和 StartCom 已经在受信颁发机构列表中,你不用他们的证书没用,把他们从受信机构中删除才行,然而目前使用 StartCom 的网站似乎比较多,删除后可能会影响日常上网。
#5 楼 @lgn21st 先停止 80 到 443 的跳转,使用 Let's Encrypt 成功获取证书后再恢复跳转。后续续期时不会有问题。
跟域名服务商无关。
我遇到过DNS problem: query timed out,当时使用的是沃通的证书,阿里云的云解析,使用上述方案解决。不知道你遇到的是不是同样的错误。
以前都是用 puts,最近才试了下 byebug
,发现挺好用的。。
Good!
有空能否分享下 bundler 从服务器获取解析依赖所需数据的几种方式(没搜到相关信息),以及目前镜像站的实现方式(找不到 bundler-api 的文档)?
根据我的观察,bundler 从服务器获取解析依赖所需数据的方式有以下三种:
/versions
,其内容似乎是服务器上所有 gem 的所有可用版本列表。返回的内容相当大,ruby-china 约 9.3M, rubygems.org 为 13M,即使 gzip 压缩后也分别达 3.8M, 5.2M。感觉对本地网络、服务器带宽的要求都会比较高。/versions
不可用,请求 /api/v1/dependencies
gemspec
文件,请求地址如 https://gems.liveneeq.com/quick/Marshal.4.8/mysql2-0.1.0.gemspec.rz