Thursday, 21 May 2015

YBoss generate Oauth url

require 'uri'
require 'cgi'
require 'openssl'
require 'base64'
module YBoss
class Oauth
attr_accessor :consumer_key, :consumer_secret, :token, :token_secret, :req_method,
:sig_method, :oauth_version, :callback_url, :params, :req_url, :base_str
def initialize
@consumer_key = '234234234--'
@consumer_secret = '167234234'
@token = ''
@token_secret = ''
@req_method = 'GET'
@sig_method = 'HMAC-SHA1'
@oauth_version = '1.0'
@callback_url = ''
end
# openssl::random_bytes returns non-word chars, which need to be removed. using alt method to get length
# ref http://snippets.dzone.com/posts/show/491
def nonce
Array.new( 5 ) { rand(256) }.pack('C*').unpack('H*').first
end
def percent_encode( string )
# ref http://snippets.dzone.com/posts/show/1260
return URI.escape(string,
Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
).gsub('*', '%2A').gsub('\'','%27').gsub('(','%28').gsub(')','%29').gsub('!','%21')
end
# @ref http://oauth.net/core/1.0/#rfc.section.9.2
def signature
key = percent_encode( @consumer_secret ) + '&' + percent_encode( @token_secret )
# ref: http://blog.nathanielbibler.com/post/63031273/openssl-hmac-vs-ruby-hmac-benchmarks
digest = OpenSSL::Digest.new( 'sha1' )
hmac = OpenSSL::HMAC.digest( digest, key, @base_str )
# ref http://groups.google.com/group/oauth-ruby/browse_thread/thread/9110ed8c8f3cae81
Base64.encode64( hmac ).chomp.gsub( /\n/, '' )
end
# sort (very important as it affects the signature), concat, and percent encode
# @ref http://oauth.net/core/1.0/#rfc.section.9.1.1
# @ref http://oauth.net/core/1.0/#9.2.1
# @ref http://oauth.net/core/1.0/#rfc.section.A.5.1
def query_string
pairs = []
@params.sort.each { | key, val |
pairs.push( "#{ percent_encode( key ) }=#{ percent_encode( val.to_s ) }" )
}
pairs.join '&'
end
# organize params & create signature
def sign( parsed_url )
@params = {
'oauth_consumer_key' => @consumer_key,
'oauth_nonce' => nonce,
'oauth_signature_method' => @sig_method,
'oauth_timestamp' => Time.now.to_i.to_s,
'oauth_version' => @oauth_version
}
# if url has query, merge key/values into params obj overwriting defaults
if parsed_url.query
CGI.parse( parsed_url.query ).each do |k,v|
if v.is_a?(Array) && v.count == 1
@params[k] = v.first
else
@params[k] = v
end
end
# @params.merge! CGI.parse( parsed_url.query )
end
# @ref http://oauth.net/core/1.0/#rfc.section.9.1.2
@req_url = parsed_url.scheme + '://' + parsed_url.host + parsed_url.path
# create base str. make it an object attr for ez debugging
# ref http://oauth.net/core/1.0/#anchor14
@base_str = [
@req_method,
percent_encode( req_url ),
# normalization is just x-www-form-urlencoded
percent_encode( query_string )
].join( '&' )
# add signature
@params[ 'oauth_signature' ] = signature
return self
end
end
end
oauth = YBoss::Oauth.new
yahoo_url = "https://yboss.yahooapis.com/ysearch/web,ads?"
params = {
"q" => "dvd",
"ads.url" => "webiste.com",
"ads.TYPE" => "ddc_id",
"ads.Partner" => "ddc_partner"
}.map{|k,v| "#{k}=#{v}&"}.join.chop!
# }.to_param
base = URI.parse(yahoo_url + params )
yahoo_url + oauth.sign(base).query_string
view raw gistfile1.rb hosted with ❤ by GitHub

Thursday, 14 May 2015

Config Heroku unicorn for WEB_CONCURRENCY

# Using
# ruby '2.1.3'
# 'rails', '4.1.8'
# 1. Test unicorn in background and check the RSS memory
heroku run bash
unicorn -c config/unicorn.rb & # Run unicorn in the background
ps euf # Read RSS value for each worker, in kb - ie: 116040 ~ 116mb
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
# u41100 3 0.0 0.0 109116 2028 ? S 16:59 0:00
# u41100 4 0.0 0.0 109916 2760 ? R 16:59 0:00
# u41100 5 0.0 0.0 106504 1276 ? R+ 16:59 0:00
# each instance uses 200mb~
#2. Change the WEB_CONCURRENCY Based on dyno type
# example x1 (500mb RAM) change the worker_processes to 2
# worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
# heroku change log https://devcenter.heroku.com/changelog-items/618
view raw gistfile1.sh hosted with ❤ by GitHub

Wednesday, 6 May 2015