Rails gsub 的坑 (SafeBuffer 相关)

代码一

s = "[a1111][b22222][v4321342]"
s.gsub(/\[\w(\d+)\]/) do 
  $1
end

结果

=> "1111222224321342"

代码二

s = ERB::Util.html_escape("[a1111][b22222][v4321342]")
s.gsub(/\[\w(\d+)\]/) do 
  $1
end

结果

=> "432134243213424321342"

怎么样,很不一样哈

一开始想 html_escape 就是转换几个字符,怎么会出现这样的情况,仔细查看之后 发现 html_escape 返回的是 SafeBuffer 对象,就是这个 SafeBuffer 导致的这个问题, 使用 to_s 还不行,原来 SafeBuffer 重写了 to_s

def to_s
  self
end

好吧,就用 to_str 吧

s = ERB::Util.html_escape(“[a1111][b22222][v4321342]“).to_str s.gsub(/[\w(\d+)]/) do $1 end

SafeBuffer 为什么会这样呢? 在 Rails 的 bug,还是 feature

Posted in ruby on rails | Tagged , , | Leave a comment

rails 中使用 mysql 的 MEDIUMTEXT 数据类型

接收用户的数据,像论坛的内容、博客的内容等等这样的数据,rails 中的 text 类型 默认使用的是 mysql 中的 TEXT 类型,该类型默认只能容纳 65535 bytes (~64kb), 要想使用 MEDIUMTEXT 或者 LONGTEXT 类型,只需要加上 limit 参数即可,比如想使用 MEDIUMTEXT 类型, 使用 add_column :table, :column, :text, limit: 64.kilobytes + 1,limit 参数比 65535 大 1 就是 在 MEDIUMTEXT 范围内,就会自动使用 MEDIUMTEXT, LONGTEXT 同理

TEXT, MEDIUMTEXT, LONGTEXT 大小对照表

1 to 255 bytes: TINYTEXT 256 to 65535 bytes: TEXT (~64kb) 65536 to 16777215 bytes: MEDIUMTEXT (~16MB) 16777216 to 4294967295 bytes: LONGTEXT (~4GB)

一般使用 MEDIUMTEXT 足够了,用不着 LONGTEXT

Posted in ruby on rails | Tagged , | Leave a comment

服务器/vps ubuntu 和 centos 选哪个?

在国内 Linux 服务器市场中,应该 ubuntu 和 centos 要占一半以上的市场, 最近折腾了 N 个 VPS,基本都是在这 2 个系统中折腾。

2 个系统的稳定性都没得说,只是包管理不一样,选择哪个系统大多数是在选包管理。

yum,官方的源软件老、量少,连个 htop 也得用第三方源

apt,比 yum 好一些

所以使用 centos,一开始你就要添加各种第三方 yum 源,使用起来才爽;而 ubuntu 的 apt,肯定也不是最新的软件版本,但也不至于太老,说的过去,能用,软件的数量也比 yum 多 很多,不是有特殊需要,一般不需要添加其它源。

我现在有 ubuntu 就用这个,没有的话 centos 顶上。

Posted in Linux | Tagged , , , | Leave a comment

Python 2.7 中的 xreadlines unicode 中文编码陷阱

Python 2.x 自从有了

from __future__ import unicode_literals

之后编码问题貌似好多了,内部统一使用 unicode 编码,输出的终端也能根据终端的编码自动 转换,对于外部的文件读写也有了 codecs ,可以轻松搞定编码问题。

但是,但是, xreadlines 是个陷阱

通过 readlines 和 readline 读取的内容都能自动转换成 unicode 类型,而 xreadlines 还是 str 类型。

Posted in Python | Tagged , , | 1 Comment

使用 rbenv 代替 rvm

之前一直使用 rvm,本地使用还好,没什么不好的地方,但是在服务器上需要开机启动 unicorn,这个就有些麻烦了,之前写过方法,很麻烦

看到 rbenv,就在本地用了下,非常好,有意想不到的效果,mac 上安装 ruby 2.0,他能自动把最新的 openssl 1.0.1e 安装上,rvm 的话需要先安装 homebrew ,使用 homebrew 安装最新的 openssl,然后才能安装 ruby 2.0

本地使用还有一点和 rvm 不同,rvm 可以直接执行 rake,用了 rbenv 之后需要使用 bundle exec rake … 方法执行 rake,不然会遇到版本问题

服务器上开机执行 unicorn,就比 rvm 太简单了, 直接在脚本里面加上下面一行就可以了

PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

综合来说 rbenv 比 rvm 好用不少,可以说 rbenv 没有比 rvm 不好的地方。至此,所有机器上面都把 rvm 换成了 rbenv

Posted in ruby on rails | Tagged , | Leave a comment

Cannot open the message catalog “man” for locale “zh_CN.UTF-8″

今天使用 centos 6.2 出现这个问题

Cannot open the message catalog "man" for locale "zh_CN.UTF-8"

本能的反映应该是和系统默认设置的中文有关,google 了一下,发现现成的答案都是一些这种的方法

我也来提供一个解决方法:

/etc/environment 文件中增加下面2行
LANG=en_US.utf-8
LC_ALL=en_US.utf-8
Posted in Linux | Tagged | Leave a comment

php-fpm 空白页面

使用 remi yum 源安装的 php-fpm 5.4,安装之后访问 php 页面出现空白的情况, http 状态码是 200, 所有日志里面都没有任何信息。

经过各种排查,终于找到问题:

nginx配置中缺少

fastcgi_param  SCRIPT_FILENAME  $request_filename;

为什么会缺少这个配置呢

原因是原本程序是运行在 ubuntu server 中,现在迁移到 centos 中。

经过比较 ubuntu 和 centos 的 nginx 默认配置,在 fastcgi_param 文件中 centos 就 缺少上面那行配置,而 ubuntu 默认就有。

Posted in Linux, PHP | Tagged , | Leave a comment

Linux 桌面虚拟化请选择 VirtualBox,误使用 KVM/Xen

不管你是使用 Linux 办公、学习或者娱乐(做服务器请忽略本内容),或多或少都需要一些 Windows 专用软件, 不得已只得使用虚拟机。我在 openSUSE 上面折腾了1年的 KVM/Xen 使用 Windows 系统,中间的辛酸可是不少, 当我使用了 VirtualBox,真的超级好用,不折腾,真的是流畅。

主要原因是因为 KVM/Xen 本身缺少对图形虚拟化的支持,虽然 Red hat 有 SPICE/qxl,比 KVM 原生好不少, 应付下服务器的下面的图形还行,做桌面使用的化还是处于玩具阶段,各种的卡、卡、卡。当然 VirtualBox 的 设置也不 KVM 好不少。

Linux 桌面虚拟化请选择 VirtualBox (也叫VBox)

Posted in Linux | Tagged | 3 Comments

openSUSE ibus 安装 超强二笔输入法

openSUSE YaST 里面自带的有二笔输入法,但是码表是青松的,不好用的,还是超强的好用。

首先下载超强二笔输入法的词库

二笔词库下载:

http://pan.baidu.com/share/link?shareid=410730&uk=755290576

解压之后执行:

sudo cp erbi-cq.png /usr/share/ibus-table/icons
sudo cp erbi_cq.db /usr/share/ibus-table/tables

然后重启 IBus, 添加 二笔-超强

Posted in Internet | Tagged , | Leave a comment

小米1电信版 4.1开发版降级到4.0稳定版

之前一直使用 4.0 的开发版,很稳定,没有什么毛病,结果上周升级之后竟然变成了 4.1 开发版,用了一周之后觉得和 4.0 差距还有很远,稳定性远远没法和 4.0 相比,我光扣电池都好几次。去小米官方看看决定降级到 4.0 稳定版。

由于没有 Windows 系统,所以只能使用卡刷的方式,降级步骤如下:

  1. 去小米官方下载 4.0 稳定版卡刷包,下载地址: http://bbs.xiaomi.cn/topic-mirom.html

  2. 把下载的 zip 文件拷贝到手机卡的根目录,文件名改为:update.zip

  3. 关机。然后同时按 开机键和音量上键 进入 MI-Recovery

  4. 要先清除数据,清空所有数据 (这里如何不清空数据的话,刷过系统后会无法进入系统)

  5. 在主菜单选择 将update.zip安装至系统

再之后重启就ok了。

Posted in Internet | Tagged | 评论关闭