.htaccess实现url redirect

最近开始做些seo方面的工作,纠正了自己之前的误区,以为huangzhimin.com和www.huangzhimin.com是相同的,其实不然,对于spider来说,这完全就是两个网页。登录google的webmaster就一目了然了,google允许你选择一个prefer的网页,不过更推荐使用301redirect的方式。

对于基于apache的网站来说,实现301redirect是非常简单的,下面是我把non www重定向到www页面的配置

RewriteEngine on
RewriteCond %{HTTP_HOST} ^huangzhimin.com [NC]
RewriteRule ^(.*)$ http://www.huangzhimin.com/$1 [L,R=301]

现在所有的网页都是www开头的,方便spider来爬取

Posted in  seo


在github上发布gem

现在ruby上流行的gem一般都在两个repository上,一个是rubyforge,一个是github。

这几天在写regexp_crawler,通过正则表达式来爬取网上的数据。今天写得差不多了,就想在github上以gem的形式发布。

首先,在自己项目的编辑页面,把RubyGem这项勾上。

接着,就是生成gemspec文件。我是通过jeweler来管理自己gemspec的。

  1. 安装jeweler gem。
$ gem install jeweler
  1. 在Rakefile文件中增加新的task
require 'jeweler'

Jeweler::Tasks.new do |gemspec|
  gemspec.name = "regexp_crawler"
  gemspec.summary = "RegexpCrawler is a Ruby library for crawl data from website using regular expression."
  gemspec.description = "RegexpCrawler is a Ruby library for crawl data from website using regular expression."
  gemspec.email = "flyerhzm@gmail.com"
  gemspec.homepage = ""
  gemspec.authors = ["Richard Huang"]
end
  1. 新增VERSION文件,来表示当前gem的版本
$ rake version:write 0.1.0

以后可以通过rake task来调整版本号

$ rake version:bump:major
$ rake version:bump:minor
$ rake version:bump:patch
  1. 运行rake,生成gem
$ rake gemspec

最后,把生成的gemspec文件push到github上,github会帮你自动生成gem文件,你就可以安装自己的gem了

$ gem install flyerhzm-regexp_crawler

Posted in  ruby rubygems


update_attribute和update_attributes的区别

update_attribute和update_attributes都是用来修改model的属性,它们区别除了一个修改单个属性,一个修改多个属性外,最重要的是update_attribute不执行validation,而update_attributes执行validation,查看源码:

def update_attribute(name, value)
  send(name.to_s + '=', value)
  save(false)
end
def update_attributes(attributes)
  self.attributes = attributes
  save
end

可以看出来,update_attribute执行的是save(false),而update_attributes执行的是save

Posted in  rails


Rails2.3.3新功能──touch

touch是Rails2.3.3引入的新功能,可以将指定的attributes改为当前时间,默认是更改updated_at或updated_on。

典型的用法在many-to-one时,当many端发生改变时,更新one端的updated_at时间。比如在一个论坛系统中,一个帖子的更新时间会随着之后的回复发生改变:

class Post  ActiveRecord::Base
  has_many :replies
end

class Reply  ActiveRecord::Base
  belongs_to :post, :touch => true
end

这里声明的:touch = true,其实就是定义了一个method来更新Post的updated_at时间,并且在after_save和after_destroy的时候调用该method

def add_touch_callbacks(reflection, touch_attribute)
  method_name = "belongs_to_touch_after_save_or_destroy_for_#{reflection.name}".to_sym
  define_method(method_name) do
    association = send(reflection.name)

    if touch_attribute == true
      association.touch unless association.nil?
    else
      association.touch(touch_attribute) unless association.nil?
    end
  end
  after_save(method_name)
  after_destroy(method_name)
end

Posted in  rails


麦兜响当当

麦兜,感觉像是一个个笑料的集合,但是结局太仓促了点。

麦兜的前期宣传还是非常成功的,没有腰没有脖子的话也时常被拿来引用,那个互相推鸡腿的对话也被我们背得滚瓜烂熟。就凭这两个镜头,就让我们对麦兜非常得期待。

不过真的现场看的时候,又感觉不是非常搞笑了,谁让笑点都在之前被消化了呢。几百年前的麦子还是很好玩的,而互相推鸡腿其实是一段很感人的故事,小朋友们看了不知道会不会太早感受到生活的无奈呢。

Posted in  life


Fork me on GitHub