分类目录归档:ruby

使用ruby创建简易的静态html服务器,跟python -m SimpleHttpServer一样

最近好多html页面需要在手机上做测试,电脑上没有安装http服务器不方便测试。

昨天看到同事用python -m SimpleHttpServer可以很方便的将任意目录变成web环境。所以也想用ruby来设置一个。

找了一圈资料发现直接用ruby的rack就能很方便的设置一个。

设置方法:

第一步——安装rack

gem install rack

第二步——创建一个config.ru文件

use Rack::ContentLength
 
app = Rack::Directory.new Dir.pwd
run app

第三步——将config.ru保存到C盘的根目录

第四步——创建一个批处理server.bat到C盘的根目录

rackup -o 0.0.0.0 -p 80 c:/config.ru

使用的时候,先进入到需要映射的目录,然后执行批处理 c:/server.bat

第五步——打开你的浏览器输入http://你的ip

ruby中match和scan的用法

match

只匹配第一次,返回为MatchData类型。

如果未能找到,返回nil

如果找到返回结果中包括两部分:1、完整匹配部分  2、()匹配到的内容

如:

a='a1b2<td>a1b3</td><td>a2b4</td>'
b=a.match(/<td>([a-z1-9]{4})<\/td><td>([a-z1-9]{4})<\/td>/)

#<MatchData "<td>a1b3</td><td>a2b4</td>" 1:"a1b3" 2:"a2b4">

scan:

查找全部匹配的内容。如果正则表达是中带有(),则只记录()的匹配内容。

返回结果为数组,如果没有匹配的结果,数组长度为0,否则返回匹配内容

如:

a='a1b2<td>a1b3</td><td>a2b4</td>'
b=a.scan(/<td>[a-z1-9]{4}<\/td>/)
#没有包含()内容,直接匹配正则内容。
#["<td>a1b3</td>", "<td>a2b4</td>"]

b=a.scan(/<td>([a-z1-9]{4})<\/td>/)
#包含()内容,记录()中的内容
#[["a1b3"], ["a2b4"]]

ruby正则表达式中的编码问题

问题描述:

用ruby写一个抓网页分析的小程序,用match进行正则表达式匹配时,常常会遇到编码的问题。

比如一个简单的程序:

def getSomething
    uri = URI('http://blog.163.com/ma95221@126/blog/static/2482210220100159516893/')
    s=Net::HTTP.get(uri)
    r=r=s.match(/先建个\w\w\w/)
    if(r!=nil)
        puts "haha"
    else
        puts "false"
     end
end

运行时会报错: `match’: invalid byte sequence in UTF-8 (ArgumentError)

原因是加载的内容不是utf-8编码,通过下面两步可以解决

s.force_encoding("GBK")    #先将字符认为成GBK
s=s.encode("UTF-8)        #将字符按照UTF-8来编码

使用ruby的AES加密、解密

ruby的AES加密使用openssl库来操作,第三方的库可以使用fast-aes和aes。

我这里没有用第三方的。

require 'openssl'
require 'base64'
 
text='{"message":"对不起,你没有此权限,无法操作"}'
key="0315b6e6e482ff7e"
iv="44b5618f44f1dfa9"
alg = "AES-128-CBC" 
 
puts %(clear text:    "#{text}")  
puts %(symmetric key: "#{key}")  
puts %(initialization vector: "#{iv}")  
puts %(cipher alg:    "#{alg}")  
 
puts "--Encrypting--"  
des = OpenSSL::Cipher::Cipher.new(alg)  
des.encrypt  
des.key = key  
des.iv = iv  
cipher =  des.update(text)  
cipher << des.final  
str=Base64.encode64(cipher)
puts %(encrypted text: #{str})  
 
puts "--Decrypting--"  
des = OpenSSL::Cipher::Cipher.new(alg)  
des.decrypt  
des.key = key  
des.iv = iv  
out =  des.update(Base64.decode64(str))  
out << des.final  
puts %(decrypted text: "#{out}")  
puts