一直感觉 rails 的 model 不符合单一职责原则,但是对数据库操作更方便了?
比如干了这些事
验证码验证和 JWT 好像没什么关系?
JWT 登录的大概流程----参考代码使用这个ruby-jwt
客服端 输入用户名和密码登录
服务器 验证用户名,密码,验证码,正确就返回一个 jwt token,里面包含一些用户信息,比如 ID 之类的
payload = {user_id: user.id, expire: (Time.now + 1.week).to_i}
token = JWT.encode payload, secret_key
客服端 把接收到的 token 发送给服务器
服务器 对 token 进行解析,得到你开始设置的用户信息,比如 ID 什么的,验证 ID 是否有效,是否过期之类的
decoded_token = JWT.decode token, nil, false
decoded_token包含了你开始设置的user_id和expire
docker-compose up 应该不会让 docker volume 消失,可以用这个查看 volume
docker volume ls
docker inspect { volume_name }
这个也许有帮助
https://stackoverflow.com/questions/45636883/docker-compose-using-volume-from-exisiting-container
每天不加班或者加班一小时以内的应该也不少?
https://github.com/galetahub/ckeditor
好像只需要这个 (未测试)
Rails.application.config.assets.precompile += %w[ckeditor/config.js]
可能是 form 没写好,用 fields_for 会自动帮你输出 id field
<%= form.fields_for :dirary_pictures do |pic| %>
<% end %>
少加班,多运动,吃的清淡,少玩手机
眼睛干涩
这个我也想问,没找到啥特别好的办法
目前在用这些
@jasl 有的,需要自己加个 helper,从 webpack 的 manifest 文件 (webpack-assets.json) 里面读取带 digest 的文件名 (webpacker 好像自带)
感觉直接用 webpack 打包上传到 CDN 也不错,配置稍微麻烦点
理解了这个以后,就能明白整数加整数可能会是负数是什么原因
#include <stdio.h>
int main()
{
int f1 = 2147483647;
int f2 = 1;
printf("%d", f1 + f2);
return 0;
}
输出 -2147483648
很多数字用浮点数 (二进制表示) 无法精确表示,只能近似表示,精度取决于二进制的位数,一些要求高精度的时候也许会有问题。
比如 123.456 - 123.444 = 0.012,我们期待是 0.012
ruby 里面
pry(main)> 123.456 - 123.444
=> 0.012000000000000455
c 里面
#include <stdio.h>
int main()
{
float f1 = 123.456;
float f2 = 123.444;
printf("%f", f1 - f2);
return 0;
}
=> 0.012001
C 可以在这个网站 compile 查看结果
unicode 是字符集
utf-8 和 utf-16 是 uncode 的具体编码方式
utf-8 中文用 3 个字节 (好像不全是),英文用 1 个字节
pry(main)> '我'.encoding
=> #<Encoding:UTF-8>
pry(main)> '我'.bytes
=> [230, 136, 145]
pry(main)> 'a'.bytes
=> [97]
utf-16 中文英文都是 2 个字节
pry(main)> '我'.encode("UTF-16BE").bytes
=> [98, 17]
pry(main)> 'a'.encode("UTF-16BE").bytes
=> [0, 97]
如果都是中文,utf-16 编码可以让文件相对小些,不过感觉现在流行用 utf-8
写的挺好
【编码的奥秘】感觉这本书写的很通俗易懂,有兴趣的可以看看
https://stackoverflow.com/questions/35492483/very-slow-activerecordquerycachecall
也许是一些 request 导致数据库有很多慢的 query,可以把 log 调出来看下
多看道德经,身心放松,身体自然好
我觉的都没毛病,关键看 API 是给谁用的,API 使用者觉的方便好用不
REST 的好处是熟悉 REST 的开发者对于类似的 API 上手快一些
还有 API 的整体设计统一也很重要
比如取得一个动物园的所有动物
可以这样
animals?zoos_id=:id
这个时候获取一个动物详情,animal/:id 相对比较自然
也可以这样
/zoos/:id/animals
这个时候获取一个动物详情,/zoos/:id/animals/:id 相对比较自然
那现在核心是 "让一人负责基础设施" 的部署,小团队没有问题,再大一点的团队可能会有基础设施的构建权限或者基础设施的变化的问题。
多谢回复。
是的,目前不到 10 个人,IAM 权限没有分那么细,实际进行terraform plan
限制成 2 个人来减少误操作。
从安全问题考虑的话,我觉的主要是在 IAM 对开发人员的权限进行分配。
比如一般的人员只可以执行获取 resource 的操作,无法删除,更改之类的
这样一般开发人员即使terraform destroy
,并且输入 yes 以后,也不会被拉出去祭天。。
当然相应的开发就没那么方便了,如何取舍取决于你目前的团队
Terraform Collaboration for Everyone 目前还没用过,还没感觉到使用的必要性 (以后也许会)
terraform apply 目前是在 sandbox 构建以后,merge 到 mater,然后自动在 CI 上面进行
也许有点多余了,让固定的一个人从本地执行也许就够了,毕竟更改不是那么频繁
terraform destroy 基本只在 sandbox 测试的时候用,production 目前还没用到
微服务好像喜欢这样? GCP + Kubernetes + Go + Other language
需要子类实现的话,应该是 protected 吧
class A
protected
def priv_a
3
end
end
class B < A
def priv_a
5
end
end
要实现类似 JAVA 之类的 private,可以看下这个
源码有注释,开头和结尾必须都是数字才返回 size
Both the begin and the end of the Range must be Numeric, otherwise nil is returned.
# rng.size -> num
#
# Returns the number of elements in the range. Both the begin and the end of
# the Range must be Numeric, otherwise nil is returned.
#
# (10..20).size #=> 11
# ('a'..'z').size #=> nil
# (-Float::INFINITY..Float::INFINITY).size #=> Infinity
def size()
#This is a stub, used for indexing
end
终于把 cell gem 删除了
为了尽量少改动代码,扩展 render partial 来实现了类似的接口
# app/helpers/cell_helper.rb
module CellHelper
def cell(cell_name, options = {})
cell_class = class_from_cell_name(cell_name)
cell_class.new(self, options)
end
private
def class_from_cell_name(name)
"#{name}_cell".camelize.constantize
end
end
# app/cells/cell_base.rb
class CellBase
attr_reader :context
def initialize(context, options = {})
@context = context
@options = options
end
def call(method_name, options = {})
send(method_name, options)
end
protected
def render(options = {})
locals = options.fetch(:locals, {})
locals = locals.merge(cell: self)
called_method_name = caller_locations(1, 1)[0].label
context.render(
partial: template_file_path(called_method_name, options),
locals: locals
)
end
def template_file_path(method_name, options)
file_name = options[:file].present? ? options[:file] : method_name
folder = self.class.to_s.underscore[0..-6]
"#{folder}/#{file_name}"
end
end
class SampleCell < CellBase
end
我们目前也使用 AWS
scaling 使用的是 Auto Scaling,当 CPU 或者内存超过一定量的时候,就自动启动新的 EC2 Instance
health check 用的 NewRelic Infrastructure 来监视 nginx,unicorn 等进程,发现异常后发送到 slack
如果只是一时的大量请求,仅仅扩展 web server 就可以解决的话,用 Auto Scaling 应该可以解决问题
AWS 的 health check 没实际用过,看了下文档,好像支持任意的 command,可以换成监视 pumma 的进程挂没挂 https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html
顶级作用域中定义的方法会成为 Object 的 private 方法,和下面的定义一样
class Object
private
def meet
puts “in main”
end
end
几乎所有对象,类都继承于 Object,所以他们也间接的拥有了私有方法 meet
# +---------+ +-...
# | | |
# BasicObject-----|-->(BasicObject)-------|-...
# ^ | ^ |
# | | | |
# Object---------|----->(Object)---------|-...
# ^ | ^ |
# | | | |
# +-------+ | +--------+ |
# | | | | | |
# | Module-|---------|--->(Module)-|-...
# | ^ | | ^ |
# | | | | | |
# | Class-|---------|---->(Class)-|-...
# | ^ | | ^ |
# | +---+ | +----+
# | |
# obj--->OtherClass---------->(OtherClass)-----------...
源文件中定义也是一样的,我是这样测试的
def meet
puts '213'
end
meet
obj = Object.new
obj.meet
$ ruby test.rb
213
test.rb:8:in `<main>': private method `meet' called for #<Object:0x007fda1107c4f0> (NoMethodError)
@easy_install
有参考Ruby程序员修炼之道
,实际开发中我用的最多的是 4 和 5,其他的感觉风险有点高,很少用到
google analytics 或者
td-agent + google bigquery 自己定义字段来统计
感觉好像广告