Posts
rails 4.0.0发布,版本强迫更新症发作
非技术文,记录一下。
今看rails api的文档一个链接点不开了,一刷新发现版本变了。
just go 4.0
6月25日就发布了,我落后了…
之前于工教的mfs的事先暂缓一下。
change logs
controller里的params不能直接用了,需要require 后在permit
activerecord的update_attributes 加了个简便的alias — update
migration里的定义可以直接加index,不用再之后add_index了,如t.string :name, index: true
也可以直接t.index :name
join table有了自己的create_join_table
所有controller里的before_filter都改成before_action
after 和 around的也同改。
所有controller里的params给model的赋值也都得先require & permit
所有model的scope 改 -> {where xxx}
has_many的restrict改成restrict_with_error,连带着controller里的destroy也不用rescure了,直接用flash显示错误就行。
升级到4.0不像2升到3变化那么大,也没有3.0到3.1的时候加了assets这些东西,大概算是平滑过度。
Posts
cacti poller error, Cannot find module (SNMPv2-TC)
cacti 运行一阵子之后发现监控主机的根分区快满了。一查发现log里的poller-error.log文件特别大。
里面有好多类似
Cannot find module (SNMPv2-TC)
的错误。
开始以为是少了什么snmp的依赖库,用apt-file search也没有找到这些东西。
http://www.podciborski.co.uk/miscellaneous/snmp-cannot-find-module/
竟然还有个snmp-mibs-downloader这么个东西
之后download-mibs,自动安装。不再报错。
今天看了一下cacti的图,发现一台机器的 load average 非常大,达到800多,别的机器峰值也没过10,还以为是数据采集出错了。
上去top看了一下也没发现cpu占用很多的进程。ps 后发现好多mongodump的进程死了,原因是前几天备份分区满了每天的备份任务不能继续执行。
mongodump的进程状态为D,-9也杀不掉,只好重启了。之后load average总算是正常了,惯性思维导致忽略重要的报警信息。
Posts
em-websocket
第一次做websocket的东西。
eventmachine和原来习惯的顺序执行思路的编程相差很多。先是在
本以为客户端会每两秒收到一次信息,但是结果是等3次都执行完,server一次性发送全部信息给client
后来看eventmachine的api发现TickLoop这个循环可以非阻塞的立即发送信息给client,将普通循环替换成
但是由于是非阻塞,tick_loop后面的代码会立即执行,而不管tick_loop,导致在tick_loop中的变量和后面变量不一致。
开始还以为在tick_loop中生成了新的线程,复制了局部变量,但是debug变量的object_id后发现是没变的,后来显示前后的时间才发现了执行的顺序不对劲。
再后来,发现在tick_loop中,ws.send 也是每次循环之后一起发送,而不是按照先后顺序调用的发送,比如
在server的两次puts 相差1秒,但是在client的接收确实同时接收,没有时间差。
最后试来试去,发现在EM.defer里用常规的循环,可以实现我想要的效果。在defer里用tick_loop不能。
这样client可以按照时间顺序接收到消息。
后来想想,ws这中模式,应大有作为,替换掉原来的http开发模式,使web程序变得更有交互性。大概主要的交互方式有两种,一种是直接推送js,让浏览器执行更新数据。
一种是推送json,里面有需要调用的函数,与该函数的参数然后eval执行。应该是后种更好一些,交互的数据量更小但需要前台有丰富的接口支持。大概这类的前台框架国外已经有了吧我想。
不过当前的开发主流框架还没有跟进到这个地步,web的开发流程与开发者也需要很大的逻辑转变。
Posts
邮箱上传附件nginx问题
今天有人反映公司邮箱大于1m的附件无法发送。一看是万网的邮箱。万网邮箱上传用的是个flash插件,一添加附件总会停留在上传的地方,给万网客服发了邮件人家回复说没问题。但是我这怎么也发不了邮件。
后来想到可能是nginx透明proxy的问题,但是上传附件用的是post,不会被缓存。后来在chrome里的调试工具发现上传大文件时返回的是
413 Request Entity Too Large 赶紧在nginx里加上 client_max_body_size = 100m;
问题的难点在调试上。
Posts
wheezy升级iceweasel
今天调试websocket的东西,原本的iceweasel不支持websocket。
win下的火狐都支持了。
http://tech71.com/install-firefox-21-in-debian-wheezy/
参照这个加源升级版本。
Posts
chrome文件下载content-disposition错误
碰到个怪问题。文件下载不能。chrom报错说多个content-disposition重复。
看后台日志全都显示正常,后来发现只有今天新上传的几个文件下载有问题。用火狐试了一下能下载。发现这几个文件的文件名里都有逗号。所以在下载时指定的content-disposition里的filename里的内容被逗号分割了。在里面把文件名用单引号引起来就好了。
Posts
php email
有个用php发送邮件的玩意出了问题。
看了一下,原来的东西用的是phpmailer,用的一个163的邮箱做smtp验证发送。
出问题是因为当天发送太多了,我进了一下这个163邮箱发现直接用网页发送提示数量超额,只能第二天接着发。
于是打算把这个服务改到自己的邮件服务器上。
不过phpmailer这玩意实在不好用,无论如何不能通过验证…
于是看了一下roundcube里,用的是pear的net_smpt
于是也就跟着用了。
改了之后测试了一下,用户名密码肯定都没问题的情况下出错
relay access denied
出错几次之后还被自己的防火墙给封了….
幸亏邮件服务器也是自己的,改了一下postfix的main.cf
在 mynetworks 里把自己服务器的ip也加了进去,凑合能发了。
但是 gmail的邮箱退信不能收说是不兼容
Our system has detected that this message
is 550-5.7.1 not RFC 2822 compliant
按照这个解决了一下,在邮件头添加了一下From和To
http://webmasters.stackexchange.com/questions/43059/why-is-an-email-failing-rfc2822-specifications
Posts
关于unicorn的平滑重启
http://ruby-china.org/topics/35
今天偶然看到了这篇
看到unicorn有个平滑重启,但是按这个
preload_app false的配置,好像不能管用,还报很多错
改回true之后倒是能用
实验了一下,是可以的
kill -USR2 之后生成新pid但是老pid.oldbin需要手动kill一下
unicorn的说明里写等新进程载入完毕之后再kill老进程。
Posts
awstats logrotate prerotate
首先感谢这页资料
http://kamisama.me/2013/03/20/install-configure-and-protect-awstats-for-multiple-nginx-vhost-on-debian/
开始用splunk看的很好,不过终归是试用的,还是得找个合适的免费软件代替。
看上了awstats,本来以为是个cgi程序,看了半天原来是个生成静态文件的工具。
别人写的动态用php生成的弄出来,不过这东西要是动态的,太耗系统。
好多资料里还需要手动日志切割,大概是年代太久了,当前系统里基本都会有自动的日志切割工具,debian里就会预装logrotate
看资料写的在/etc/logrotate.d/nginx里
prerotate 里加东西,省去了再加crontab的麻烦
就看了看当前系统的
发现这里有个run-parts httpd-prerotate
于是就建立了一个httpd-prerotate的文件夹
把需要执行的脚本放里面加上x权限。
脚本为
#!/bin/bash为
if [ -x /usr/share/awstats/tools/awstats_buildstaticpages.pl]; then
/usr/share/awstats/tools/awstats_buildstaticpages.pl -update -config=proxy -lang=cn -dir=/var/www/awstats -awstatsprog=/usr/lib/cgi-bin/awstats.pl
fi
然后配置好nginx的一个虚拟目录给 /var/www/awstats
后来有一次看mysql的二进制日志,发现全都是非常小,而且看时间都是每天早上6.45生成的。
明明my.cnf里配置了max_binlog_size = 1000M,但没起作用。
原来就是/etc/logrotate.d/mysql-server里更新为daily,虽然这里的配置没有指定binlog,但是每次分割日志后都会通过postrotate重启mysql,也就生成了新的二进制日志。
果断改成monthly