项目目录名为: cap_puma
rails find_by 别忘了查询条件 线上出现了一个诡异的bug。查了很久终于发现是find_by查询没有加条件。举个例子:
最近为项目系统中使用的Elasticsearch进行了升级。从原来1.4版本的Elasticsearch升级到5.x版本。
net/http in Golang
最近的任务是将elasticsearch集群由低版本的1.4.2升级到5.5.2版本。由于跨的版本比较多,查看了一下elasticsearch文档,Breaking changes 非常多,所以这会是一次改动很大的升级。
ActiveRecord reload reload方法:数据库更新不可能反馈到变更前创建的对象上。通过reload方法让对象重新加载数据库最新的变更。
使用过ubuntu的人儿们可能都遇到过这类问题,明显这种问题是一个类型,而不是单一的由于某一个固定的因素引起的。
netstat
Gem lograge
众所周知,我们能使用Golang轻松编写并发程序。Golang利用goroutine,让我们编写并发程序变得容易。并发程序中重要的问题之一就是如何正确的处理“竞争资源”或“共享资源”。Golang为我们提供了锁的机制。这篇文章,就简单介绍Golang中锁的使用方法。并且进行错误的使用方法和正确的使用方法的代码示例对比。文章的所以代码示例在:https://github.com/pathbox/learning-go/tree/master/src/lock
使用正则快速获取括号内的字符串 result = file_name.match(/\A.((\S+)).\Z/) result1 = file_name.match(/\A.[(\S+)].\Z/) p $1 p result.to_a
现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1、es2、es3),打算将其升级为5台(增加es4、es5)。这篇文章主要是对整个操作的过程记录,以及出现的问题总结,包括移动数据量所需要的时间。因为,一开始由于不知道线上数据量全部分配完需要多少时间,如果从凌晨开始操作,到早上8点都还没有同步完,这样会影响到白天线上业务的正常使用。
如果调用第三方接口,请别忘了超时机制 周末的时候,线上出了问题。是由于IPIP服务商的服务器出了问题,我们调的接口迟迟没有返回值。 导致我们项目中,开了很多goroutine,每个goroutine中会请求IPIP的接口分析ip地址,由于IPIP的服务器没能及时相应, 导致大量的goroutine都阻塞在了那里。所以, 不要“信任”第三方服务,调用他们服务接口的时候,应该使用超时机制。
在Rails controller中可以定义回调方法。回调方法是一个队列,满足先进先出的执行顺序。但我们知道,回调有before_action, after_action, around_action 这三种简单的类型。并且还有append_xxx_action、 prepend_xxx_action、和skip_xxx_action。 在RubyChina上有一篇精华帖讲了controller callback 源码的内容 详解 Rails Controller 中的 Callback 这里我们研究除了skip_xxx_action的其他类型的执行顺序。
多个条件进行操作的时候,难免遇到冲突 比如触发器,不同的触发器的触发条件如果有冲突,顺序不同,影响不同。如果A触发器先执行更改记录,会导致B触发器条件不满足而无法执行。如果让B先执行,则两者都可以顺利执行。
从同事接手了一个项目。这个项目是用了<go-socket.io>这个库,仿照socket.io的功能,和前端进行交互。因为之前是用socket.io做的后端,但是 觉得性能不够用了,就改用Go来进行重构。重构之后,发生内存泄露的现象。这个项目峰值大概维护1w-1.5w个socket长连接,一开始内存消耗量大概到2g-3g。 然而,当连接数没有增长的情况下,随着运行时间的增长,内存也在增长。并且大概一个多小时的时间,内存就涨到了10g,而且连接数才1w多,说好的支撑”百万连接呢”。如果不进行重启服务操作,内存会涨到14g(16g的内存)。所以,确定是有内存泄露。我需要做的就是找到内存泄露的原因,修复这个问题。
CSRF攻击
我喜欢在<hosts>文件里给ip地址定义域名名称。比如一台测试服务器的ip地址是<192.168.100.1>
GIL 是 Global Interpreter Lock 也叫 GVL
在数据库层面建立唯一索引,是最好的防止数据重复的方法,即使是在高并发的情况下 在Rails model层使用validates 方法进行唯一性的验证逻辑,比如:
我们知道,Ruby是动态语言。 静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。
!!符号 !! 符号可以将nil转为true之后,再转为false。这样可以将false或nil都以false结果进行判断
Ubuntu 14.04环境
example1
serialize Hash 在serialize Hash 有个小坑。 普通的hash和ActionController::Parameters 或 Hashie::Mash 等类型都能存。这就会导致了,如果代码中原本使用symbol方式取值正确的逻辑,当该字段值用hash类型,并且hash对应的key用字符串形式存了,原本原本使用symbol方式取值正确的逻辑取值就变为空了。所以,推荐当取值的时候都用字符串形式。第二个是,如果数据库存了ActionController::Parameters类型的值,在rails 5中取这个值的时候就报错,,直接导致用这个model的时候就报错。因为ActionController::Parameters 在rails 5不再继承于Hash,而进行 serialize hash 的时候就不行了。在rails 4 中把这个数据用普通hash更改一下,在rails 5 项目中就恢复正常
这周对Rails项目中的ElasticSearch进行了总结并写成了文档,觉得有一些内容值得记录和分享。 这篇文章主要是在Rails项目中对索引,mapping的设置、管理操作的总结,不涉及搜索方面的内容。 源数据是存在MySQL中,ES的数据是MySQL写操作的时候进行了回调同步到ES中,这个应该和很多人的使用同步策略一样。
What is the background job? It is simple that is running in the background.
Go有指针类型含义和作用和C语言的指针是一样的,指向类型的地址,而且用途很广,但是你不能对指针进行运算。 比如C语言中的对指针的++ 运算或移位运算在Go中是没有的。
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。Go语言也是一种面向对象编程的语言,但是和传统的编程语言有一些不同。但是Go也有很多传统OOP语言的特点:
简单的读取
Ruby Rails
ES 慢查询优化 对搜索客户手机号码的ES慢查询进行优化。由于表的记录已经达到一定数量级,对手机号码进行char_split 的分词方法, 会产生性能问题,因为该分词方法会把手机号码进行拆分组合,这里很耗时。 优化方法:用正则表达式检验出传的参数是手机号码,不使用char_split分词查询,而是使用完全匹配的方式进行过滤
iteration variable重用
methods on value or pointer
简介
这次掉了这个坑里。
描述:某个功能需要为数据库增加相关数据。大概逻辑是:根据表Company,根据某些条件往Department和DepartmentsUser表中插入数据。 然后将User表中满足筛选条件的status字段进行更改。
最近遇到了一个坑,关于rails中的hash struct。问题不难,但非常容易让人忽略。
最近项目中出现了很多MySQL的慢查询,平均耗时10s钟。运维小哥把慢查询找了出来,交给我们进行优化。本文就是本次MySQL慢查询优化的总结。
Git is amazing! 本文是对git的进一步的学习和掌握总结。