ruby md5,sha1,base64 加密

查看网上资料发现这些加密大致是这么写的

 #md5加密
 require 'md5'  
 puts MD5.hexdigest('admin') 
 #sha1加密
 require 'digest/sha1' 
 putsDigest::SHA1.hexdigest('admin') 
 #base64
 require 'base64'  
 code = Base64.encode64('admin') 
 source = Base64.decode64(code)  
但是事实上如今这样写已经不可以了(我的ruby版本是ruby 1.9.3p286)
所以应该有所更改的
更改后代码:
 #md5加密
 require'rubylibrubygems1.9.1gemsrack-1.4.1librackauthdigestmd5.rb'
 #(可以自己搜索此文件的位置) 
 #putsMD5.hexdigest('admin') 
 puts "md 5"
 putsDigest::MD5.hexdigest('admin') 
 
 #sha1加密
 puts "sha 1"
 require 'digest/sha1' 
 puts Digest::SHA1.hexdigest('admin')
 
 puts "base 64"
 #base64
 require 'base64'  
 code = Base64.encode64('admin') 
 source = Base64.decode64(code) #解密
 puts code
 puts source

此文章通过 python 爬虫创建,原文是自己的csdn 地址: ruby md5,sha1,base64 加密

在Ruby中方便的调用Win32 API (使用windows-pr和CStruct)

原文网址:
http://www.w-yong.com/docs/ruby_win32_api.html

在Ruby中方便的调用Win32 API (使用windows-pr和CStruct)

缘由

平时工作中,我主要使用C/C++和Ruby。有时经常需要调用API来写一些工具,但又不想动用重量级的C/C++.这时就想到了用Ruby来写。话说Ruby,确实是程序员的好帮手,方便,快捷。是居家旅行......的必备良药。

在Ruby中有一个Win32API,是用来调用API的。但是用起来略为有点啰嗦和冗长。还好,RubyForge上有个Win32 Utils项目,专门提供了对API调用的封装,使得调用API更方便了一步。而且,Win32 Utils已经分门别类的封装好了很多Windows的功能模块,可以直接使用。如win32-file,win32-dir等。

但是,有两个原因导致了Win32APIWin32 Utils在使用上的不方便:

  1. 不管是Win32API还是Win32Utils,虽然解决了调用API的问题,没有很好的解决结构体参数的问题。我们知道,Windows的很多API大都需要结构体指针的参数,来传入或是传出信息。使用者大多利用String#unpack和Array#pack来处理。

  2. Win32 Utils提供的封装好的功能模块,如:win32-file,win32-dir等,是对API的进一步封装,将API封装在底下。这样一来,如果想直接利用API来写程序的话,这些模块暂时就用不上了。

鉴于此,我的经验是使用 windows-pr + CStruct 来调用Windows的API.使用起来比较直观。下面进行分别介绍:

windows-pr

概述

Win32Utils中有3个十分重要的gem: win32-api,windows-api,windows-pr.其他的功能模块都是基于这三个之上。我们来说说这三个的关系:

  • win32-api

    封装了对API的调用。主要就是一个dll: api.so

  • windows-api

    对上面的 win32-api进行了简单包装,使得使用更简单一些。

  • windows-pr

    依赖与上面两个,定义了大量的Win32的API和常量,免去了我们自己定义函数的麻烦。当然,也有一些API没有封装,还得需要我们自己动手。

安装

windows-pr的安装很简单:

gem install windows-pr

但是,如果你用的是ruby1.9.x,则需要特别注意:安装windows-pr时,同时会安装win32-api,默认的情况会安装:win32-api-1.4.6-x86-mingw32。但这个gem是基于ruby1.8.x的,所以在Ruby1.9.x上不能正确运行。 
解决方案如下:

  1. 安装windows-pr: gem install windows-pr

    这一步,会给你安装3个gem:windows-pr,windows-api 和win32-api-1.4.6-x86-mingw32(win32-api当前版本是:1.4.6)

  2. 安装DevKit

    按照官方的步骤来,很简单。DevKit主要就是用来编译Ruby本地扩展的。

  3. 安装win32-api:gem install win32-api --platform=ruby

    这一步,会安装gem:win32-api-1.4.6,并生成新的api.so

  4. 用win32-api-1.4.6的api.so替换掉win32-api-1.4.6-x86-mingw32中的api.so。

还有一个偷懒的办法,这里有一个编译好的适合ruby1.9.x的api.so,请下载下来,在执行完第一步之后,直接进行第4步,替换掉api.so即可。如果仍然不好用,则还需要你亲自编译一下。

使用

实际上,Win32Utils封装的windows的各个功能模块就是使用windows-pr的例子,有兴趣的,可以看看。大家对Win32Utils也比较熟悉,这里就不过多介绍了。

CStruct

概述

CStruct是Ruby 语言用来模仿 C 语言结构体。 有过Win32开发经验的童鞋们一定都知道,Win32SDK中,大部分的API都需要有结构体指针作参数。例如: void GlobalMemoryStatus(LPMEMORYSTATUSlpBuffer);

Ruby基本的二进制操作主要是利用String#pack和Array#unpack来进行。但是,如果来处理C语言中的结构体就有些冗长啰嗦了。如何能模拟C语言中的结构体呢? CStruct就是来做这个事情的。(注意:此CStruct并不是 DL模块中的CStruct!)

这里只是大体介绍一下CStruct。更多的信息及示例,请看CStruct项目的主页.

安装

CStruct的安装也很简单:

gem install cstruct

CStruct的基本用法

先看一个C语言的结构体Point:

struct Point
{
  int x;
  int y;
};

使用CStruct在Ruby中模拟结构体 Point:

class Point < CStruct
   int32😡
   int32:y
end

看起来是比较直观。看看Point的简单用法,来自CStruct的主页。

require 'cstruct'
# struct Point inRuby: 
class Point < CStruct
   int32😡
   int32:y 
end

# create a Point'sinstance
point = Point.new

# assign like as Clanguage
point.x = 10
point.y = 20
puts "point.x = #{point.x},point.y =#{point.y}"

CStruct提供了几个方法,用于取得结构体相关的信息,如(仅列出常用的):

  • 类方法:size,__size__
    取得结构体的大小。另:__size__ 是size的一个别名.

  • 实例方法:<<

    给结构体实例赋值。

  • 实例方法:data

    返回结构体实例的内部存储buffer.这个方法在调用api时经常用到。

Win32Struct

Win32Struct是CStruct带的一个对常用的win32数据类型的封装。在定义windows结构体时,主要用它。使用的时候,需要require。.

require 'win32struct'
                        

Win32中的MEMORYSTATUS 的定义基本如下面这个样子:

struct MEMORYSTATUS{ 
   DWORD dwLength;
   DWORD dwMemoryLoad;
   DWORD dwTotalPhys;
   DWORD dwAvailPhys;
   DWORD dwTotalPageFile;
   DWORD dwAvailPageFile;
   DWORD dwTotalVirtual;
   DWORD dwAvailVirtual;
} ;

使用Win32Struct在Ruby中模拟结构体 MEMORYSTATUS:

class MEMORYSTATUS < Win32Struct
   DWORD :dwLength
   DWORD :dwMemoryLoad
   DWORD :dwTotalPhys
   DWORD :dwAvailPhys
   DWORD :dwTotalPageFile
   DWORD :dwAvailPageFile
   DWORD :dwTotalVirtual
   DWORD :dwAvailVirtual
end

是不是挺像C语言的结构体?

windows-pr & CStruct

有了windows-prCStruct,我们就可以很直观的直接调用API了。来看一个具体的例子:GlobalMemoryStatus(获取系统的内存状态)。

# CStruct Examples
require 'windows/memory'
require 'win32struct'

include Windows::Memory

# example:

# typedef struct _MEMORYSTATUS {
#     DWORD dwLength;
#     DWORD dwMemoryLoad;
#     DWORD dwTotalPhys;
#     DWORD dwAvailPhys;
#     DWORD dwTotalPageFile;
#     DWORD dwAvailPageFile;
#     DWORD dwTotalVirtual;
#     DWORD dwAvailVirtual;
# } MEMORYSTATUS, *LPMEMORYSTATUS;

class MEMORYSTATUS < Win32Struct
    DWORD :dwLength
    DWORD :dwMemoryLoad
    DWORD :dwTotalPhys
    DWORD :dwAvailPhys
    DWORD :dwTotalPageFile
    DWORD :dwAvailPageFile
    DWORD :dwTotalVirtual
    DWORD :dwAvailVirtual        
end

# create a MEMORYSTATUS's instance
stat = MEMORYSTATUS.new {|st| st.dwLength = MEMORYSTATUS.size }

# call API "GlobalMemoryStatus" - See also MSDN
GlobalMemoryStatus(stat.data)

#output
printf "[Physical Memory]n"
printf "  total:d bytesn",stat.dwTotalPhys
printf "  free :d bytesn",stat.dwAvailPhys

printf "[Virtual Memory]n"
printf "  total:d bytesn",stat.dwTotalVirtual
printf "  free :d bytesn",stat.dwAvailVirtual

printf "[Paging File]n"
printf "  total:d bytesn",stat.dwTotalPageFile
printf "  free :d bytesn",stat.dwAvailPageFile

上面的示例代码,像是用C直接调用API一样直观。免去了自己大量的pack,unpack。CStruct还有其他Win32的例子,比如:列举所有进程,获取系统信息等,获取系统版本等,有兴趣的可以看看。

结束

本文到这里也就结束了,文本给出了在ruby中使用windows api的一个方便直观的方法。当然,CStruct目前还有一点限制,比如:多维数组(CStruct目前只支持一维数组)和位域暂时还不支持。总的来说,windows-pr和CStruct结合使用,还是比较方便的。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: 在Ruby中方便的调用Win32 API (使用windows-pr和CStruct)

不使用Ruby的十大理由?

请注意:这是一篇主观意识的文章。它的目的并不是要说服你使用或者不使用Ruby,或者其他任何技术。这篇文章所涉及到的环境是 Web开发,而不是通用的编程。我想要通过这篇文章解释这些年来非 Ruby 社区对于 Ruby的一些看法,并且提醒人们以开放的心态来面对新的事物。敬请欣赏!

我最近做了一个15分钟的演讲“我喜爱的 Ruby 语言以及它的生态系统”。很显然我的言论让忠实的 PHP,.NET 和Java 开发者感到不安。他们对 Ruby 不是好奇,而是感觉我在批评他们热爱的技术。

既然这不是宗教,而是关于如何面对新的事物,我认为我们应该列出所有其他人认为不使用 Ruby 来做 Web 开发的理由。

1. Ruby 并没有 Java 或者 PHP那么成熟

这是对的。Java 和 PHP 被用于 Web 开发要比 Ruby 早很多。但是你知道吗?我姥姥比 Ruby要年长很多,但是我不认为我姥姥可以做 Web 应用。在 Web时代,技术每几年就要更新一次,老和成熟不一定就有优势。在很多方面,Ruby 社区吸取了其他技术的教训,所以能做的更好,相比碎片化的PHP 社区来讲。

如果你考察一门技术的标准只有时间的话,你从一开始就错了。

2. Ruby 的性能不如 .NET 或者 Java

你又说对了!除此之外,Ruby 还比 Erlang,Lua,C++ 等等都要慢,但是你不使用 Erlang 或者 C++ 是吗?Web开发并仅仅是性能。你的应用不可能在上线第一天就有上百万的用户。你需要编码,测试,发布,并且循环这个过程,你需要快速迭代。所以,一开始开发效率大于运行效率。老拿性能来说事是愚蠢并且错误的。Ruby的应用也能像 .NET 或者 Java 应用那样横向扩展。

3. Ruby 在 Windows 下工作的不好

这是一定的。Windows 在很多方面是伟大的,但不包括开源的 Web 开发。Ruby 以及很多源自 *NIX 的伟大技术都不能在Windows 下工作的很好。与其撞破脑袋抱怨你已经习惯了 Windows ,不如试试安装 Linux,让生活继续。技术的魅力在于学习新的事物,而不是呆在熟悉的环境里面一辈子。

4. Ruby 没有 PHP 那么流行

的确是这样的。技术并不是流行比赛,否则的话我们应该都用 JavaScript 来开发(目前在 Github上最受欢迎的语言)。技术是一种达到目的的手段。流行度只是衡量使用率,社区活跃度的一个指标,用来帮助人们判断技术的可用性,稳定性和支持程度。

5. Ruby 社区高傲并且势力

嗯……这么说吧 Java 社区是顽固的,.NET 社区是封闭的,Perl 社区是古怪的,C++ 社区是一群抽烟的中年人。

我遇到过各种各样不同背景的开发者。我并不是说 Ruby 没有势力的人,但是绝对不是主流。我想很多时候是这样的一种情况:因为 Ruby是相对比较新的技术,所以一些简单的任务例如和第三方的测试,开发,迭代都相对容易。所以当 Ruby 程序员称赞这些事情使用 Ruby更容易的时候,他们并不是在看低其他技术,而只是在表述一种更简单的开发方式。

6. Ruby 非常顽固,不自由

这个观点不仅仅是错误,简直就是愚蠢。让我问你一个问题:编写一个 HTTP 路由组件或者图像处理类库有多少种方式?

约定优于配置,最佳实践和清晰的编码标准不会让开发者不自由。相反,它让开发者专注于重要的事情,例如业务逻辑。

Ruby 固有的约定驱动的开发方式帮助开发者提高了开发效率,但同时尊崇社区驱动的标准,使得样板文件最小化。

有趣的是,Ruby是我知道的唯一一门语言,可以让你在任何地方,任何时间更改任何东西。人们很喜欢这些标准和约定,应为它让他们更有效率。

7. Ruby 没有 Java 和.NET 可靠

Windows 没有 NetBSD 那样安全!!!如果你考察可靠性的唯一标准就是类型检查的话,你看事情的角度就错了。

虽然静态语言严格的类型检查和编译属性让他们获得了更好的性能,但是,坦白说,在你编程生涯中,有多少 bug是应为错误的变量类型引起的?

Ruby 用来解决这个问题的方式是宣扬测试文化。也就是说,你的代码的可靠性跟你的测试挂钩,而不是你的方法声明。

8. Ruby 缺少企业级的支持

恐怕你孤陋寡闻了吧?听说过 Engine Yard吗?没有?他们提供非常出色的企业级 Ruby 支持。

所谓的企业级支持是很久以前企业通过绑定用户销售昂贵的,可靠的,最新的技术来获得收入。但是你必须这么做吗?难道你是如此的无能,因为缺少所谓的“支持”就不去选择一项合适的技术?

让我问你一个问题:你认为微软需要多久才能发现,修复,承认,并且发布一个IIS的安全补丁?再想想,你真的认为金钱驱动的垄断企业关心你Web 应用的安全性吗?

在以开源代码为代表的技术创新时代,为了所谓的支持选择一个封闭的,垄断的技术,就是选择了落后所有人一步。正大眼睛看看这些公司吧,Basho,Redhat, Canonical, 10gen, Cloudera, EngineYard,他们提供开源的技术,并且提供企业级的付费支持。

9. Ruby 没有很好的可扩展性

这是很老的话题,要追溯到 Twitter 刚刚开始的时候。当 Twitter 飞速发展的时候,他们必须修改 ActiveRecord中深层次的代码以获得在 Rails 中支持多个 MySQL 数据库。不幸的是,人们混淆了 Ruby 和 Rails。在 Twitter这个案例中忽略了 Twitter 的快速成长得益于 Rails 的易于使用和快速开发。

任何成功的应用到最后都会遇到扩展性问题。Facebook 最后把 PHP 编译成了 C++,Twitter 转向了 Scala,Youtube 依然使用 Python,Apache 和 MySQL。没有任何两个 Web 应用是完全一样的,我们应该从成功的 Web应用中学习经验,而不是上来就宣布某项技术的扩展性强于另外一项技术。

10. 寻找有经验的 Ruby 程序员很困难

这倒是真的,但取决于你在世界的哪个地方。比如在 Israel,.NET 和 PHP 盛行,所以找到好的 Ruby程序员是很困难的。但是你知道吗?在那里更难找到有经验的 Javascript 开发者!

非要较真的话,我也可以说找到好的 PHP 程序员比 Ruby 更困难。因为 PHP 社区分散,用户生成的文档和不一致的 API是的学习难度提高。

不要因为困难而放弃一样好东西,你可以自己培养 Ruby 开发者。我的意思是,如果你认为 Ruby是正确的技术,那么为什么不多投入一些呢?

此文章通过 python 爬虫创建,原文是自己的csdn 地址: 不使用Ruby的十大理由?

ruby post的简单使用

要使用Ruby进行post操作首先需要安装mechanize

输入命令:gem install mechanize (在线安装)

我们首先看提交post的网页
 (为了防止被博客转换成html代码所以每一行前面添加了’#‘)
<#html>
 <#body>
 
 <

#
formaction="welcome.php" method="post">
 Name: <

#
input type="text"name="name" />
 Age: <

#
input type="text"name="age" />
 <

#
input type="submit"/>
 <

#
/form>
 <#body>
 <#

/html>
那么相应的ruby代码是:

require 'mechanize'  
agent = WWW::Mechanize.new 
agent.user_agent_alias = 'Windows IE7' 
page = agent.get("http://127.0.0.1/StuPHP/Testpost.html") 
form0 = page.forms[0]  
form0.fields[0].value = "shunjian" 
form0.fields[1].value = 22 
results = form0.submit
puts results.body

此文章通过 python 爬虫创建,原文是自己的csdn 地址: ruby post的简单使用

Ruby连接mysql数据库

Ruby 连接mysql数据库
首先要安装gem
gem install mysql

此时编写程序
require 'mysql'
db = Mysql.real_connect('127.0.0.1','root','123','sqltest')
res = db.query('select * from name')
while row = res.fetch_row do
    puts"#{row[0]},#{row[1]}"
end

提示出错:cannot load such file -- mysql/mysql_api (LoadError)

此时我们回来看gem install mysql 时提示

  At the time of building this gem, the necessaryDLL files where available
  in the following URL:

 http://dev.mysql.com/get/Downloads/Connector-C/mysql-connector-c-noinstall-6.0
.2-win32.zip/from/pick

  You can put the liblibmysql.dll available inthis package to your Ruby bin di
rectory.

原来没有动态链接库文件
只需按照给的网址下载 解压出来libmysql.dll将它放到ruby/bin 下即可
若是windows系统也可以放到system32目录下

此时就可以正常操作数据库了

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Ruby连接mysql数据库