Archive for May, 2009

25th May
2009
written by cashplk

ruby conf china 2009的网站:

http://rubyconfchina.org/

演讲者以及对应的文档:

http://rubyconfchina.org/speakers

Tags: , ,
23rd May
2009
written by cashplk

以下是一个简单的使用Ruby操作CouchDB数据库的代码:

新建fromRuby2CouchDB.rb文件,具体内容如下:

require 'net/http'
 
module Couch
  class Server
    def initialize(host, port, option = nil)
      @host = host;
      @port = port;
      @option = option;
    end
 
    def delete(uri)
      request(Net::HTTP::Delete.new(uri))
    end
 
    def get(uri)
      request(Net::HTTP::Get.new(uri))
    end
 
    # put json to request
    def put(uri, json)
      req = Net::HTTP::Put.new(uri)
      req["content.type"] = "application/json"
      req.body = json
      request(req)
    end
 
    def post(uri, json)
      req = Net::HTTP::Post.new(uri)
      req["content-type"] = "application/json"
      req.body = json
      request(req)
    end
 
    def request(req)
      res = Net::HTTP.start(@host, @port) {
        |http|http.request(req)
      }
      if (not res.kind_of?(Net::HTTPSuccess))
        handle_error(req, res)
      end
      res
    end
 
    private
 
    def handle_error(req, res)
      e = RuntimeError.new("#{res.code}:#{res.message}\nMETHOD:" +
 
          "#{req.method}\nURI:#{req.path}\n#{res.body}")
      raise e
    end
  end
 
end

在文件路径下,以命令行模式运行:irb,启动ruby编译器:
irb(main):001:0> require “fromRuby2CouchDB.rb”
=> true
irb(main):002:0> server = Couch::Server.new(“127.0.0.1″,”5984″)
=> #<Couch::Server:0xb7bdd258 @option=nil, @port=”5984″, @host=”127.0.0.1″>
irb(main):003:0> server.get(“/blog/”)
会插入一个新的数据库,名为blog。如果不对,会打印出相应的错误。成功后,可以在页面查看是否存在该数据库。

Tags: , , ,
23rd May
2009
written by cashplk

看到InfoQ上关于CouchDB的报道,正好最近也在研究Erlang,就看看。

CouchDB是一个文档形数据库。本身的程序已经实现了基本的管理。和数据库的交互采用的是JS,具体传输的数据是JSON格式的。

下面是Eralng的架构图:

erlang-arch

可以看到,中间层完全使用Erlang编写, 底层搜索则是Lucene。

ubuntu下面的安装:

sudo apt-get install couchdb

OK了之后,直接运行: sudo couchdb 即可运行。

/etc/couchdb/couch.ini,可以对运行的程序参数进行配置。

访问:http://127.0.0.101:5984/_utils/browse/index.html 就可以看到数据库的情况了。

此后的所有操作都可以在界面完成。

假如新建了一个blog的数据库,字段为text.

需要查询数据的时候,直接访问:http://127.0.0.1:5984/blog/1 就可以了。

显示的数据和这个类似:

{"_id":"1","_rev":"2166111176","text":"hello,world"}

初步使用了一下,觉得还不错,但是还是有几个疑问:
1,对于大规模的操作,性能如何?
2,直接页面编辑,必须按照JSON格式, 输入字符之类的,要“”补全。不能自动实现此功能,不爽。
3,中文字符似乎处理还不是很好。

Erlang的官方网站:http://couchdb.apache.org/index.html

23rd May
2009
written by cashplk

XPath介绍:

XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径。

XPath 术语:
节点(Node)

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

XPath语法:

选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的

Tags: ,
23rd May
2009
written by cashplk

项目中看到,可以使用数据库的一个字段表示记录的不同状态。主要实用的是位运算,涉及的函数是 BIT系列函数。具体如下:


BITAND function:返回两个数值型数值在按位进行 AND 运算后的结果。

BITNOT function:返回数值型数值在按位进行 NOT 运算后的结果。

BITOR function:返回两个数值型数值在按位进行 OR 运算后的结果。

BITXOR function:返回两个数值型数值在按位进行 XOR 运算后的结果。

Tags: , ,
23rd May
2009
written by cashplk

放狗搜inject的时候找到的。
原帖:http://www.javaeye.com/topic/24642?page=1

Ruby有不少惯用法,这里略作一些介绍,也方便阅读他人代码:

迭代
一般写法:
for i in (1..10) puts i end

习惯写法:

(1..10).each{|i| puts i} 或 1.upto(10){|i| puts i}

||=赋值
一般写法:
number = 1 if number.nil? number = 1 unless number
习惯写法:

number ||= 1

Tags:
23rd May
2009
written by cashplk

RESTful Web Services 中文版 读后摘抄(一)

第 1 章 Programmable Web及其分类

1.传统网(human web)返回HTML文档。
2.可编程网(programmable web)返回XML文档。

Amazon S3的作用是“在桶(一种带标签的容器)里存放对象(一种带标签的数据)”。
Programmmable web是基于HTTP和XML技术的。

HTTP:信封里的文档

HTTP是一种基于文档的协议。客户端把文档放在信封里,然后发给服务器,作为回应,服务器把响应文档放在信封里,然后发给客户端。

HTTP响应可分为三个部分:
1.HTTP响应代码(HTTP response code)
2.相应报头(request headers)
3.实体主体(entity-body)或表示(representation)

XPath介绍
利用它,可以方便的将XML文档进行切分。关键的一点是:把XPath表达式看成一种从XML文档里提取标签(tag)或元素(elements)的规则。要知道一个XPath表达式是什么意思,只要从右边往左读就是了。

比如:表达式 //photo 的意思是:
寻找所有photo标签  photo
无论它在文档里何处  //

用REXML::XPath.each(doc,’//photo’)这行简单的Ruby代码可以实现遍历每一个photo标签,而不必遍历整个XML树。

23rd May
2009
written by cashplk

看到AlexAlex学Ruby[ inject需要注意的地方 ] ,节选部分如下:

inject([]) do |item ,i |这样的写法,每一步,item都会被设置为block的返回值。

如下:

1
2
3
4
5
6
7
8
9
    arr1 = []
    arr2 = [1,2,3]  
 
    arr2.each do |i|
        arr1 <<  i+1
    end
 
    p arr1
    #=> [2, 3, 4]

使用inject,则可以写为:

1
2
3
4
5
6
7
8
    arr2 = [1,2,3]
 
    arr = arr2.inject([]) do|arr1, i|
        arr1 << i + 1 
    end
 
     p arr1
     #=>[2,3,4]
Tags: ,