程序员…
4 Sep
安装gem:
[root@iceskysl]# gem install spreadsheet –no-ri –no-rdocSuccessfully installed ruby-ole-1.2.10.1Successfully installed spreadsheet-0.6.4.12 gems installed
使用:
require ‘rubygems’
require ‘spreadsheet/excel’
SUM_SPREADSHEET = ‘test.xls’
workbook = Spreadsheet::Excel.new(SUM_SPREADSHEET)
worksheet = workbook.add_worksheet(‘Random numbers and their sum.’)
# sum = 0
# random_numbers = (0..9).collect { rand(100) }
#
# puts “random_numbers=#{random_numbers.size}”
# worksheet.write_column(0, 0, random_numbers)
# worksheet.write_column(0, 1, random_numbers)
worksheet.update_row 4, ‘Hannes Wyss’, ‘Switzerland’, ‘Author’
row = worksheet.row(1)
row.push ‘Creator of Ruby’
row.unshift ‘Yukihiro Matsumoto’
# format = workbook.add_format(:bold => true)
# worksheet.write(10, 0, “Sum:”, format)
# worksheet.write(10, 1, random_numbers.inject(0) { |sum, x| sum + x })
workbook.close
参考:
http://sg552.javaeye.com/blog/701428
http://sunfengcheng.javaeye.com/blog/240130
4 Sep
参考:
http://pleac.sourceforge.net/pleac_ruby/filecontents.html
ruby文件操作大全 http://www.javaeye.com/topic/517410
用ruby读写文本文件 http://www.albertsong.com/read-87.html
Ruby 读取目录(Diretories),文件(files), 网页的几个方法小结
http://weixuhong.com/rubyruby-on-rails/2008/10/06/ruby-%E8%AF%BB%E5%8F%96%E7%9B%AE%E5%BD%95%EF%BC%88diretories%EF%BC%8C%E6%96%87%E4%BB%B6files-%E7%BD%91%E9%A1%B5%E7%9A%84%E5%87%A0%E4%B8%AA%E6%96%B9%E6%B3%95%E5%B0%8F%E7%BB%93/
4 Sep
1.Rails 3.0 Release Notes – Rails导册对所有Ruby on Rails开发者来说都是很宝贵的资源,这个发布文档介绍了很多API的改进和新特性。
2.RailsPlugins.org – 提供了很多 Rails 3的插件.
3.Having Ruby on Rails 3 My Way – Rails 3与Mongoid, Haml, jQuery等的安装
4.The Rails Module (in Rails 3) -在Rails模块中一些有用的方法
5.Rails 3 I18n changes – I18n的改变.
6.Ruby on Rails 3 Screencast series
7.Embracing REST with mind, body and soul - José Valim 介绍了 RESTful responders与Rails 3 controller的使用。
8.Railscasts #224 Controllers in Rails 3 – Rails 3 controllers的新特性.
9.Render Options in Rails 3 – Rails 3的渲染的变化.
10.Adding Routes for tests / specs with Rails 3
11.32 Rack Resources to Get You Started – rack相关资源的整合.
12.New ActionMailer API in Rails 3.0 - 如何使用新的ActionMailer.
13.A Whole New ActionMailer – ActionMailer的特性.
14.ActiveModel: Make Any Ruby Object Feel Like ActiveRecord – ActiveModel的模块化.
15.Railscasts #219 Active Model - 如何正确的添加ActiveModel 模块到tableless模块.
16.ActiveRelation: ActiveRecord Gets a Facelift -新的ActiveRecord finder API.
17.Active Record Query Interface – 自Rails 2以来,ActiveRecord query接口的变化.
18.Gembundler.com -官方的 Bundler文档,包含一些扩展的文档.
19.Library Management Gets an Update in Rails 3 。
20.Railscasts #201 Bundler - 在Rails 3中,如何使用bundler.
21.AdventuresInCoding.com screencast on Bundler 。
22.Rails 3 Internals: Railtie & Creating Plugins – Railties in Rails 3.
23.rails-templater – 如何生成一个 greenfield Rails 3 应用.
24.Making generators for Rails 3 with Thor – 如何使用新的generators ,以及在gem中如何去处理.
25.The Lowdown on Routes in Rails 3 -在 Rails 3创建routes的几个不同的方法.
26.Rails Routing from the Outside In - 新的 router介绍.
27.Plugin Authors: Toward a Better Future – Rails 3中创建插件的改变.
28.Customizing Rails Apps with Plugins - 使用responders, form, devise以及mail form的插件.
29.Devise 1.1 is out and ready to rock with Rails 3 – Devise 1.1的新特性。
30.Beginning Rails 3 – Cloves Carneiro Jr 和 Rida Al Barazi 撰写的 Rails 3 入门书籍,其中有很多实例.
31.The Rails 3 Way .
32.Rails 3 In Action - BDD with Cucumber
33.Rails 3 Upgrade Handbook – Jeremy McAnally的书籍,教你如何从Rails 2 应用升级到Rails 3.
34.Ruby on Rails Tutorial: Learn Rails by Example – 一步一步的教学习 Rails.
4 Sep
在rails中使用find进行模糊查询时,出现了malformed format string(输入为字符)或非法字符(输入为数字)的提示。
(1) @vendors = Vendor.find(:all,:conditions=>[@sql])
(2) @vendors = Vendor.find_by_sql(“select * from vendor where “+@sql)
错误发生在按(1)方式查询过程中,采用(2)方式可以避免这个错误,这间接说明了find_by_sql确实相当不安全。
查阅了一下资料,对于这个问题的说法如下:Rails uses sprintf (%) on the inside. So, Escape your % with %,因此只要将模糊查询的地方一个百分号全部换成两个便可以解决问题。
21 Aug
这几天需要找到漂亮的Charts类库,找了几个,发现一个很不粗的,mark下待使用,介绍如下:
Highcharts is a charting library written in pure JavaScript, offering an easy way of adding interactive charts to your web site or web application. Highcharts currently supports line, spline, area, areaspline, column, bar, pie and scatter chart types.
有兴趣的可以参考如下连接去看看:
http://highcharts.com/
http://railscasts.com/episodes/223-charts
http://www.spritle.com/blogs/?p=859
27 Jul
def parse_rails_log_file(file)
# Remove all empty lines
lines = file.each_line.map(&:strip).reject(&:empty?)
# Use +Enumerable#slice_before+ to slice log file into sections for each request
lines.slice_before(/Started (GET|POST|PUT|DELETE)/).each_with_object({}) do |request_log, totals|
# Only include successfully finished actions in report
if duration = request_log.last[/Completed 200 OK in (?<duration>\d+)ms/, :duration]
action_name = request_log.first[/Started (GET|POST|PUT|DELETE) "(?<action>.+?)" for/, :action]
totals[action_name] ||= 0
totals[action_name] += duration.to_i
end
end
end
if __FILE__ == $PROGRAM_NAME
require "pp"
puts "Parsing Rails 3 log file (extracting cumulative running time per request path):"
puts "================="
log_file = <<-LOG_FILE
Started GET "/index" for 192.168.74.1 at 2010-03-09 11:37:40
Processing by UpdatesController#index as HTML
Update Load (0.5ms) SELECT `updates`.* FROM `updates` ORDER BY created_at DESC
Rendered updates/index.html.erb (16.7ms)
Completed 200 OK in 71ms (Views: 44.3ms | ActiveRecord: 0.5ms)
Started POST "/updates" for 192.168.74.1 at 2010-03-09 11:37:43
Processing by UpdatesController#create as HTML
Parameters: {"commit"=>"Save changes"}
Update Load (0.4ms) SELECT `updates`.* FROM `updates` ORDER BY created_at DESC
Rendered updates/index.html.erb (1.3ms)
Completed 200 OK in 60ms (Views: 32.1ms | ActiveRecord: 0.4ms)
Started GET "/updates" for 192.168.74.1 at 2010-03-09 11:45:51
Processing by UpdatesController#index as HTML
TypeError (exception class/object expected):
app/controllers/updates_controller.rb:3:in `raise'
app/controllers/updates_controller.rb:3:in `index'
Rendered /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.6ms)
Rendered /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.9ms)
Rendered /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within /usr/local/rvm/gems/ruby-1.9.2-head/bundler/gems/rails-16a5e918a06649ffac24fd5873b875daf66212ad-master/actionpack/lib/action_dispatch/middleware/templates/rescues/layout.erb (23.9ms)
Started GET "/updates" for 192.168.74.1 at 2010-03-09 11:45:58
Processing by UpdatesController#index as HTML
Update Load (0.3ms) SELECT `updates`.* FROM `updates` ORDER BY created_at DESC
Rendered updates/index.html.erb (1.1ms)
Completed 200 OK in 100ms (Views: 29.3ms | ActiveRecord: 0.3ms)
LOG_FILE
pp parse_rails_log_file(log_file) # => {"/index"=>71, "/updates"=>160}
end
8 Jun
Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background.
ref:
http://adamfortuna.com/2009/08/17/the-amazingness-of-delayed_job-for-rails/
http://www.magnionlabs.com/2009/2/28/background-job-processing-in-rails-with-delayed_job
http://github.com/tobi/delayed_job
26 May
近日需要实现feed(动态)消息,同时需要支持多语言,本来没什么难的,做一个多态表,然后存储消息的目标对象,再规定好一些动作,入库或者出库的时候拼装下就好了。这里有个比较有趣的是如何最大限度的重用代码或者规则,最后实现中借鉴了Rails国际化的规则。
1. 首先定义针对目标可以做的操作,用常量定义好(考虑到数量不会很多,且不会经常变化,就不存数据库),例如:
class FeedAction
#APP:1 – 99
APP_DOWNLOAD = 1 #Download
APP_FAV = 2 #Favorites
APP_PAY = 3
APP_INSTALL = 4
2. 对定义好的操作名为key,撰写其对应语言的动作描述,写zh.yml或者en.yml文件,例如:
zh:
FEED_ACTION:
APP_DOWNLOAD: “下载了”
APP_FAV: “收藏了”
APP_PAY: “购买了”
APP_RATE: “打了{{rate}}星”
3.生成消息输出的时候,直接
>> I18n.locale = ‘zh’
>> I18n.t ‘FEED_ACTION.APP_PAY’
=> “购买了”
>> I18n.t ‘FEED_ACTION.APP_RATE’,:rate=>2
=> “打了2星”
15 May
终结下来三大类
1,md5 sha1等消息摘要
用的很多,比较熟悉,只是用于验证消息的完整性,而消息本省的传递确是明码的,除非想登录密码md5,那要服务器客户端两边都有。如果需要传输数据给另一方,而这段数据又不希望明文发就得使用密钥了。
2,des等 ,私有密钥加密数据
只要约定密钥,然后在通过这个密钥对信息加密然后传送,另一方通过密钥对加密信息解密。
3,rsa , 公钥和密钥结合的高级货
公钥不是大家都使用的,而是可以公开的,我开始误会错了搞不懂。通过rsa生成一对密钥,公钥和私钥,通过公钥加密的数据,只有私钥才能解开。那在网络中可以随便告诉客户端公钥,然后对方通过公钥加密后传加密信息,即使地球人都知道公钥也不要紧,因为私钥是保密的,解不开得到了加密信息也没办法。当然私钥加密后信息,公钥也可以解开,但速度上差成百上千倍。
ruby中通过openssl这个自带的标准库来实现。举了几个例子,des和rsa的
#!/usr/bin/ruby
require “openssl”
#doc see http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/index.html
class Encrypt
KEY = “aaaabbbb”
IV = “aaaavvvv”
def des_encrypt(plaintext)
c = OpenSSL::Cipher::Cipher.new(“DES-CBC”)
c.encrypt
c.key = KEY
c.iv = IV
ret = c.update(plaintext)
ret << c.final
end
def des_decrypt(encrypt_value)
c = OpenSSL::Cipher::Cipher.new("DES-CBC")
c.decrypt
c.key = KEY
c.iv = IV
ret = c.update(encrypt_value)
ret << c.final
end
def get_rsa_key
rsa = OpenSSL::PKey::RSA.new(1024)
# public_key only can public_encrypt or public_decrypt no private_encrypt nor private_decrypt
#rsa.public_key.to_pem the class of return value is String
[rsa.public_key.to_pem , rsa.to_pem]
end
def rsa_private_encrypt(value , rsakey)
rsa = OpenSSL::PKey::RSA.new(rsakey)
rsa.private_encrypt(value)
end
def rsa_private_decrypt(value , rsakey)
rsa = OpenSSL::PKey::RSA.new(rsakey)
rsa.private_decrypt(value)
end
def rsa_public_encrypt(value , publickey)
rsa = OpenSSL::PKey::RSA.new(publickey)
rsa.public_encrypt(value)
end
def rsa_public_decrypt(value , publickey)
rsa = OpenSSL::PKey::RSA.new(publickey)
rsa.public_decrypt(value)
end
end
def testrun
e = Encrypt.new
text = "a secret message"
puts "text:#{text}"
value = e.des_encrypt(text)
puts "des_encrypt:#{value}"
des_decrypt = e.des_decrypt(value)
puts "des_decrypt:#{des_decrypt}"
puts "-------------------------"
publickey , privatekey = e.get_rsa_key
puts "publickey:\n#{publickey} \n privatekey=\n#{privatekey}"
value1 = e.rsa_private_encrypt(text , privatekey)
puts "rsa_private_encrypt:#{value1}"
rsa_public_decrypt = e.rsa_public_decrypt(value1 , publickey)
puts "rsa_public_decrypt:#{rsa_public_decrypt}"
value2 = e.rsa_public_encrypt("another message" , publickey)
puts "rsa_public_encrypt:#{value2}"
rsa_private_decrypt = e.rsa_private_decrypt(value2 , privatekey)
puts "rsa_private_decrypt:#{rsa_private_decrypt}"
puts "----------------------------"
rsa = OpenSSL::PKey::RSA.new(1024 , 7)
value3 = rsa.private_encrypt("myself key")
puts rsa.public_decrypt(value3)
end
testrun
测试结果:
IceskYsl@eoe ~/Desktop $ ruby encrypt.rb
text:a secret message
des_encrypt:羻"j}####9"q###A##
des_decrypt:a secret message
-------------------------
publickey:
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALrAGpm39jexyrrkYuM6kyP0z+pBlY/i3WnIYHrR3PDk9af2GsuIUwqg
vhKRMxv5EZh1CShec++DfRAaBHwM2zCcHA1rDqrzqoSMdyCav+wbVwkSblqGb6gz
Q4Zk/nM73mF1PaOkZvlpKN7B5H7BsUN2ngpaz4u9MxMm0Tn1guIVAgMBAAE=
-----END RSA PUBLIC KEY-----
privatekey=
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC6wBqZt/Y3scq65GLjOpMj9M/qQZWP4t1pyGB60dzw5PWn9hrL
iFMKoL4SkTMb+RGYdQkoXnPvg30QGgR8DNswnBwNaw6q86qEjHcgmr/sG1cJEm5a
hm+oM0OGZP5zO95hdT2jpGb5aSjeweR+wbFDdp4KWs+LvTMTJtE59YLiFQIDAQAB
AoGBAKbgsSR5yfBc1J8LJP6OQhvYUM6xCngILvivEN/PltJAlvAfMDR+Pk558z9e
NsChYcLNmoBTXuBBrEjuJuG/D0GpOmLadoZYDjlciJxj3Y9w85EvfRssdYGsBvIY
ksHVfsYEKJXp41ORux1jZgJXsnxn9276F7Unam65mPyUleiFAkEA8LMpAfgc3y4f
iHiDSon0AcgoIyH4eiiyxGPQEavIVgD2njRCM2pg3Z2uS3c/Et+EAaLjy9N1Cfy6
plZRwHuXqwJBAMafCjgUQaqFisJNSUWWsENVzjmfk2pnGK1TJot3BtpN67rX1dcC
Q3cNWbVhoF6zp6y+Kn/Lrdx1N+eNvhLOrT8CQQCl09jZuXUysVUaMWTKkrZgD+TP
J5VHnAhlUxrDQeU4k1tU7U36nDx2Ei9FYLc8qm8IrY9hGqLUqaBx/qA+CygXAkAu
sAGp7vEEkUFtrNcVWXdzTH8eQmlXcIZ3b302+TKOLBTGJafpU2niWSwGG72jpR07
2LOKuKjUkmUis8nDB/vnAkAxTVKBDYhfInF1/8/bhDAeqrWLifJUmxLEmO9WSRWm
I5ZodXZIaNOBRCSZToQSdfPbhWtQ68sWGNbI0YYwm3OZ
-----END RSA PRIVATE KEY-----
rsa_private_encrypt:#k4#e|#########F#####0 ###3
## õë######o#####')
c###########m##7e¼####u $>#######hUKc(#ۯ#####Us0T#######
rsa_public_decrypt:a secret message
rsa_public_encrypt:t####H
“#########’#H7############O#j####H###v#]Q`TR###Hs#U%####L###Z#####rѽ##
###F##(#X##˵#3####rsa_private_decrypt:another message
—————————-
myself key
15 May
require 'openssl'
require 'digest/sha1'
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.encrypt
# your pass is what is used to encrypt/decrypt
c.key = key = Digest::SHA1.hexdigest("yourpass")
c.iv = iv = c.random_iv
e = c.update("crypt this")
e << c.final
puts "encrypted: #{e}\n"
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.decrypt
c.key = key
c.iv = iv
d = c.update(e)
d << c.final
puts "decrypted: #{d}\n"
require 'openssl'
keyfile = 'test.key'
certfile = 'test.crt'
data = "this is a test"
cert = OpenSSL::X509::Certificate.new(File.read(certfile))
key = OpenSSL::PKey::RSA.new(File.read(keyfile))
cipher = OpenSSL::Cipher::AES.new("128-CBC")
tmp = OpenSSL::PKCS7.encrypt([cert], data, cipher,
OpenSSL::PKCS7::BINARY)
p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
## Data will be stored as string so emulate that here
p7s = p7.to_s
## Create pkcs7 object out of pkcs7 data
p7 = OpenSSL::PKCS7::PKCS7.new(p7s)
dec = p7.decrypt(key,cert)
print dec
http://nunojob.wordpress.com/2008/12/08/rsa-encrypt-decrypt-in-ruby/
http://www.ruby-forum.com/topic/79319
Comments::最新评论