Amazon
EBS - Elastic Block StoreAMI - Amazon Machine Image
EC2 - Elastic Compute Cloud
Web
CDN - Content Delivery NetworkACID - Atomicity Consistency Isolation Durability
Tech stuff around computer programming, basically for web development, especially opensource. Topics will go round Ruby on Rails (git gems etc.), Ubuntu (admin and basic shell) and work organization (agile philosophy)
#!/usr/bin/ruby
gem_list = <<GEM_LIST
actionmailer (2.3.8)
actionpack (2.3.8)
activerecord (2.3.8)
activeresource (2.3.8)
activesupport (2.3.8)
aws-s3 (0.6.3)
barista (1.3.0)
bistro_car (0.2.2)
soap4r (1.5.8)
therubyracer (0.10.2)
will_paginate (2.3.16)
xml-simple (1.1.2)
GEM_LIST
gem_list.split("\n").each do |line|
gem = line.match(/^.+? /).to_s # with a space at the end
versions = line.match(/\(.+\)/) # surrounded by parenthesis
highest_version = line.match(/([\d\.]+)/).to_s
puts `gem install #{gem} -v #{highest_version}`
end
def initialize
super # options parameter has been removed
extend Strategy::LocalCache
end
and this is the call
# config/environments/development.rb require 'vendor/gems/activesupport/cache/null_store.rb' # could also go in environment.rb # [...] config.cache_store = :null_store # In Rails 3 it's simply :null
Have your file in lib, rather than vendor/gems and have it referenced with full path, something like this:
require "#{Rails.root}/lib/activesupport/cache/null_store.rb"
config.cache_store = :file_store, "/dev/null"
[1,2,3].each_with_object(1).map(&:+)
# => [2, 3, 4]
# Same outcome, even shorter
[1, 2, 3].map(&1.method(:+))
# => [2, 3, 4]
# Thanks to rubyquicktips.com
######## even in 1.8
a = [[1,2,3],[2,3,4],[3,4,5]]
# get the union:
a.inject(a.first) { |f,x| f = f | x } # => [1, 2, 3, 4, 5]
# get the intersection:
a.inject(a.first) { |f,x| f = f & x } => [3]
class Greed
def initialize(dice_faces)
@dice_count = count_occurrences_in(dice_faces)
@score = calculate_score!
end
attr_reader :score
def calculate_score!
@score = 0
@score += score_of_triple_1(1000)
@score += score_of_other_triples(100)
@score += score_of_5s(50)
@score += score_of_1s(100)
end
private
def score_of_5s(score)
face_score(5, score)
end
def score_of_1s(score)
face_score(1, score)
end
def score_of_other_triples(score_each)
score_triples score_each, (2..6).to_a
end
# >>>>> here starts the meat
def score_of_triple_1(score)
score if @dice_count[1] >= 3
end
def score_triples(score, faces)
partial_score = 0
@dice_count.each_with_index do |times, face|
next unless faces.include? face
partial_score += score * face if times >= 3
end
partial_score
end
# faces counted in triples are escluded
def face_score(face, score = 0)
times = @dice_count[face]
score * (times % 3)
end
# <<<<< here ends the meat
def count_occurrences_in(dice_faces)
# nil for 0 which is not a face, then the 6 faces
[nil,0,0,0,0,0,0].tap do |occurrences|
dice_faces.each { |face| occurrences[face] += 1 }
end
end
end
def score(dice)
# You need to write this method
Greed.new(dice).score
end
Even considering only "the meat" of my class, the solution on github is still a few lines shorter... Hei, wait, I could implement the sandwitch in score_triple and count_times! I feel like Randy Marshall watching cooking programs!
class DateDisabler
constructor: (@only) ->
beforeShowDay: (date) =>
if @only == date.getDate()
[true, 'available', 'This date is a good date']
else
[false, 'unavailable', 'This date is NOT good']
jQuery ->
$('.datepicker').each (i, e) ->
dates = $(e).data('only')
disabler = new DateDisabler dates
$(e).datepicker({beforeShowDay: disabler.beforeShowDay})
and the haml that calls it:
.datepicker{data: {only: 5}}
Please note the fat arrow in the beforeShowDay, I'll have a look at it soon.
Of corse you want it to make it accept an array but that's quite easy and I'm going into it right now.
For more complex solutions I recommend gazay/gon, which I know thanks to this railscast
# see: RealVault - Recurring Payments.pdf
module ActiveMerchant::Billing
class RealVault < RealexGateway
# 7. on page 24
URL = 'https://check-doc.cgi'
# 7.1 (Setup a new Payer)
# Create a Profile for a payer using payer‐new
# If the payer exists another one will be stored
# payer is a hash (see self.test)
def send_payer(payer, options = {})
requires! options, :order_id
request = build_payer_new_request payer, options
commit request, URL
end
# 7.2 (Payment method setup)
# Store the Card details using Card‐New
# If the card exists another one will be stored
# card is a ActiveMerchant::Billing::CreditCard
# options is a hash
def send_card(card, options)
requires! options, :order_id
request = build_card_new_request card, options
commit request, URL
end
# see self.test or send_x methods
def store!(payer, card, options)
send_payer_response = send_payer(payer, options)
send_card_response = send_card(card, options) if send_payer_response.success?
{ :success? => (send_payer_response.success? && send_card_response.success?),
:send_payer_response => send_payer_response,
:send_card_response => send_card_response }
end
# ActiveMerchant::Billing::RealVault.test
# will store the payer and the card in the test account
# makes a purchase before as suggested by the doc. to make sure auth is ok
# works out of the box
def self.test
timestamp = Time.new.to_s :number
currency = 'EUR'
firstname = 'John'
surname = 'Smith'
payerref = timestamp
orderid = timestamp
rv = ActiveMerchant::Billing::RealVault.new({:password => "pwd",
:currency => currency,
:rebate => "rebate",
:account => "internettest",
:login => "merchant_id",
:gateway => "Realex"})
card = ActiveMerchant::Billing::CreditCard.new(
:number => 'test_cc_number',
:month => '12',
:year => '2012',
:type => 'visa',
:first_name => firstname,
:last_name => surname,
:verification_value => '123')
payer = { :type => 'Business',
:ref => payerref, # 'smithj01'
:title => 'Mr',
:firstname => firstname,
:surname => surname,
:email => 'jsmith@acme.com',
:company => 'Acme Inc',
:address => {
:line1 => '123 Fake St.',
# :line2
# :line3
:postcode => '3',
:city => 'Hytown',
:county => 'Dunham',
:country => 'Ireland',
:country_code => 'IE'
},
:phonenumbers => {
:home => '55555555',
:work => '+35317433923',
:fax => '+35317893248',
:mobile => '+353873748392',
}
}
options = {:order_id => orderid,
:currency => currency,
:payerref => payer[:ref]}
rv.purchase 777, card, options
rv.store! payer, card, options
# rv.send_payer payer, options
# rv.send_card card, options
end
private
def build_card_new_request(card, options)
action = 'card-new'
timestamp = Time.now.strftime '%Y%m%d%H%M%S' # same as to_s(:number), but not subjected to override
orderid = sanitize_order_id options[:order_id]
chname = "#{card.first_name}#{card.last_name}"
expdate = card.year.to_s[2..3] + card.month.to_s
sha1 = sha1from "#{timestamp}.#{@options[:login]}.#{orderid}...#{options[:payerref]}.#{chname}.#{card.number}"
xml = Builder::XmlMarkup.new :indent => 2
xml.tag! :request, :timestamp => timestamp, :type => action do
xml.tag! :merchantid, @options[:login]
xml.tag! :orderid , orderid
xml.tag! :card do
xml.tag! :ref , card.type + timestamp[3..14]
xml.tag! :payerref, options[:payerref]
xml.tag! :number , card.number
xml.tag! :expdate , expdate
xml.tag! :chname , chname
xml.tag! :type , CARD_MAPPING[card_brand(card).to_s]
xml.tag! :issueno
end
xml.tag! :sha1hash, sha1
end
end
def build_payer_new_request(payer, options)
action = 'payer-new'
timestamp = Time.now.strftime '%Y%m%d%H%M%S' # same as to_s(:number), but not subjected to override
orderid = sanitize_order_id options[:order_id]
sha1 = sha1from "#{timestamp}.#{@options[:login]}.#{orderid}...#{payer[:ref]}"
xml = Builder::XmlMarkup.new :indent => 2
xml.tag! :request, :timestamp => timestamp, :type => action do
xml.tag! :merchantid, @options[:login]
xml.tag! :account , @options[:account]
xml.tag! :orderid , orderid
xml.tag! :payer, :type => payer[:type], :ref => payer[:ref] do
[:title, :firstname, :surname, :company].each do |tag|
xml.tag! tag, payer.send('[]', tag)
end
xml.tag! :address do
address = payer[:address]
[:line1, :line2, :line3, :city, :county, :postcode].each do |tag|
xml.tag! tag, address.send('[]', tag)
end
xml.tag! :country, address[:country], :code => address[:country_code]
end
xml.tag! :phonenumbers do
phonenumbers = payer[:phonenumbers]
[:home, :work, :fax, :mobile].each do |tag|
xml.tag! tag, phonenumbers[tag]
end
end
xml.tag! :email, payer[:email]
xml.tag! :comments do
xml.tag! :comment, nil, :id => 1
xml.tag! :comment, nil, :id => 2
end
end
xml.tag! :sha1hash, sha1
xml.tag! :comments do
xml.tag! :comment, nil, :id => 1
xml.tag! :comment, nil, :id => 2
end
end
xml.target!
end
end
end
Unfortunately even the gem itself needed a slight change, due to constant priority order in Ruby (this wouldn't be necessary in java for example):
# Realex.rb in ActiveMerchant 1.9.4 # commit method in private section - def commit(request) + def commit(request, url = URL)