小塌客

石头的博客

Archive "2008"

Erlang在CentOS5.2中的安装

一直都在忙别的东西,还没怎么认真的开始学erlang, 最近正好工作中要用到AMQP了, 用的broker就是RabbitMQ, RabbitMQ正是用erlang写的, 所以安装RabbitMQ的前提肯定要先安装erlang了,

 

在Debian中的安装是预想中的顺利apt-get install erlang 就搞定了, RabbbitMQ的安装要去官方下载专门的deb包, 也是一条命令就OK了, 不过我还是对CentOS有爱,就在CentOS中也安装了一遍,不过过程真的是不顺利, 

 

首先下载Erlang的源程序包,我用的是最近的R12B-4, 然后看了README就是标准的编译方式,先

./configure

报缺少java, 于是还得先安装JDK, 安装完JDK后记得要export JDK的bin路径到系统PATH中, (记得还缺少一个什么忘了,应该容易安装的)

 

然后make

 

经过大约10分钟的编译, 出现了可怕的Error,

collect2: ld returned 1 exit status

make[4]: *** [../priv/bin/x86_64-unknown-linux-gnu/ssl_esock] Error 1

 

google了好长时间才发现原来这是CentOS5的一个bug, 编辑erlang源目录中的文件lib/ssl/c_src/Makefile.in, 将

LIBS = @LIBS@(我这里是第41行)

修改为

LIBS = @LIBS@ -lkeyutils -lselinux

 

然后重新./configure, make, 最后make install 就行了

 

RabbitMQ的安装也采用源码包的方式, 安装比较简单, 看下源目录中的README就OK了

 

 

今天买到《Erlang程序设计》了

终于买到这本书了,不知道翻译的怎样,就算正式开始学习Erlang了,真是贵,就400页的书,卖79块钱,直接去银行打劫算了。。。

 

努力,努力,努力

 

 

北京的生活

来北京快两个月了,时间过的有时感觉还真是快,鼠标点点自己的日志,发现最近两个月的几乎都是技术有关的,难道自己真的成了传说中的工作狂了(P:你不一直都是!?),工作其实没有什么压力,上头交代的任务基本都可以顺利的完成,莫非我又开始自己的自虐倾向了,改不过来了,哎,,,

 

总结一下来北京工作这近两个月收获还是蛮大的,学到的东西也很多(P:主要是因为自己的自虐倾向),上头人挺好的,也比较信得过我的技术,公司同事都还不错

 

感觉自己现在真的是彻底的宅了,极其规律的生活,公司-地铁-自己的小屋, 三点一线还是在继续, 从小学到中学到大学到工作,永远都是这样,不行,我要革命

 

Google的手机水货已经降到3600了,又手心发烫了,坚持,坚持。。。

 

现在看电影的时间都没了,只有周末了,感觉只有周末才是真正的自己,可以不规律了,可以不继续那该死的三点一线了

 

不管是以前的朋友还是公司的同事都问我干嘛不住在公司附近,不用每天起那么早跑那么远来上班了,我的原因只有一个,因为石景山这里有我两个大学的同学在这里,住石景山可以离他们近点,玩着方便。我真的不想变成每天没有一个人可以说句话,只有工作工作工作,那样我会无法忍受的,住这里下班回来有时大家还可以一起吃羊肉串,一起吃地边摊, 继续享受大学的感觉,可以说这是现在我最大的也是唯一的乐趣了

 

用“塌客”的网站参加了中国首届软件创新大赛,希望能拿个入围奖,呵呵,

 

 

ruby写的一个随机发扑克类

最近用ruby写了一个随机发扑克的类, 可以指定参加的player个数

 

class Card54
  
  @@given = [] #the cards already given
  @@player_num = nil #players number
  @@player_cards = {} #cards players get
  @@now_turn = 0 #now player's turn
  
  @@cards = (1..54).to_a #total cards
  
  def initialize(player_num=4)
    @@player_num = player_num
    @@cards.length.times { run }
  end
  
  def run
    raise 'no card avaiable' if @@given.length == @@cards.length
    card = rand_card(@@cards - @@given)
    @@given << card
    @@now_turn = 0 if @@now_turn == @@player_num
    give @@now_turn.next, card
    @@now_turn = @@now_turn.next
  end
  
  def player_cards
    p @@player_cards
  end
  
  private
  def rand_card c
    c[rand(c.length)]
  end
  
  def give turn, card
    if @@player_cards[turn].nil?
      @@player_cards[turn] = card.to_s
    else
      @@player_cards[turn] = @@player_cards[turn] + ',' + card.to_s
    end
  end
end
 
#require 'card54'
#play = Card54.new 4
#play.player_cards

这样就支持Card54.new.player_cards了

 

class Card54
  
  attr_reader :player_cards, :player_num
  
  def initialize(player_num=4)
    @given = [] #the cards already given
    @player_cards = {} #cards players get
    @now_turn = 0 #now player's turn
    @cards = (1..54).to_a #total cards
    
    @player_num = player_num
    @cards.length.times { run }
  end
  
  def run
    raise 'no card avaiable' if @given.length == @cards.length
    card = rand_card(@cards - @given)
    @given << card
    @now_turn = 0 if @now_turn == @player_num
    give @now_turn.next, card
    @now_turn = @now_turn.next
  end
  
  private
  def rand_card c
    c[rand(c.length)]
  end
  
  def give turn, card
    if @player_cards[turn].nil?
      @player_cards[turn] = card.to_s
    else
      @player_cards[turn] = @player_cards[turn] + ',' + card.to_s
    end
  end
end

 

rails国际化工具gettext的使用

其实一直觉得国际化的工具都没必要用的, 把所有要国际化的文字全部定义成变量放在一个文件中,每种语言对应一个文件,然后再结合JS来调用, 我觉得这样的方法就可以很方便的解决国际化的问题了, yahoo有很多应用也是这样做的, 不过,从项目开发的角度说使用国际化工具显得更专业点,其他我还倒真的没看出有什么优势,

 

说归说,现在项目要用了, 还得用, 现在主要的国际化工具就是gettext, 当然也有对应的ruby的了, 也可以用在rails中

 

1. 首先安装

#gem install gettext


2. 然后在config/environment.rb中加入

  require 'gettext'
  require 'gettext/rails'

 

3. 在项目的跟目录的Rakefile中加入

desc "Update pot/po files."
task :updatepo do
  require 'gettext/utils'
  GetText.update_pofiles("cal_point", Dir.glob("{app,lib,bin}/**/*.{rb,erb,rjs,rhtml}"), "cal_point_0.9")
end

desc "Create mo-files"
task :makemo do
  require 'gettext/utils'
  GetText.create_mofiles(true, "po", "locale")
end

 

4. 在application.rb中加入

class ApplicationController < ActionController::Base
  init_gettext 'cal_point'

end

cal_point是你项目的名字, 生成的po, mo文件也将以此命名

 

5. 建立目录po/zh, zh是语言目录, 可以根据自己的需要建立, 尊不遵循语言命名的标准都行


6. 在需要国际化的地方用"_()"方法来调用就行了, 比如: _("hello world");


7. 执行rake updatepo, 将会在po下生成文件cal_point.pot, 复制cal_point.pot到zh目录下为cal_point.po(我就在这里浪费了好多时间, 官方的文档中没有提到这一点), 然后编辑cal_point.po文件就行了, 注意文件编码一定要是UTF-8


8. 执行rake makemo, 将会自动生成/locale/zh/LC_MESSAGES/cal_point.mo, 这个文件是二进制文件不用管, gettext将自动调用,


9. gettext判断显示语言的方法有:

A. cookies中的lang设置

B. request中的lang变量

C. 也可以强制本地设置:

<% set_locale "en" %>
<%=_("Hello world") %>

关于使用一种方法是:在application.rb中:

  before_init_gettext :default_locale
  def default_locale
    if params[:lang].nil? or params[:lang].empty?
      set_locale "zh"
    else
      set_locale params[:lang]
    end
  end

 

就不多说了,资料比较多

参考资料:

Ruby-GetText-Package HOWTO for Ruby on Rails

Ruby-GetText-Package HOWTO maintain po/mo files


postfix一个帐户接收多个域的邮件

邮件服务器需要一个帐户接收两个域的邮件, 在网上查了很多资料都不行,google了很长时间,才找到一点线索, 终于搞定了, 步骤就是:

 

首先你的postfix要支持regexp的查询表, 通过postconf -m, 可以看出是否支持, 就是正则表达式了(pcre),

这里举例发到xxx@abc.com.cn的邮件xxx@abc.com的域也可以收到

1. 添加虚拟域abc.com.cn

2. 建立文件/etc/postfix/reg_virtual.cf文件, 内容:

/(.*)@abc\.com\.cn/   $(1)@abc.com

3. 执行postmap /etc/postfix/reg_virtual.cf

4. 修改/etc/postfix/main.cf中的virtual_alias_maps为

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf regexp:/etc/postfix/reg_virtual.cf

(上面假设你已经有了mysql查询表, 上面没有换行, regexp前有空格)

5. 重启postfix

 

这样就OK了

 

参考文档

Using sympa_virtual with Postfix instead of regexp aliases

REGEXP_TABLE(5)   REGEXP_TABLE(5)
Postfix Pipe
Postfix Filter
Defending E-mail HOWTO