inicio mail me! sindicaci;ón

Updating postgres from 9.3 to 9.4 on MacOSX

Working with Heroku I recently wanted to pull the Heroku production DB to my local DB. Using pg:pull I got the following error message:
pg_dump: aborting because of server version mismatch
because Heroku uses PostgreSQL 9.4 and my local version was 9.3.
So I had to update my local DB; this is what I did:

1) shut down db and remove launch agent plists:
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
rm ~/Library/LaunchAgents/homebrew.mxcl.postgresql*

2) remove links to old binaries, install new version (links automatically):
brew unlink postgresql93
brew install postgres

Note that I do not yet uninstall the old binaries, we need them to run pg_update later!vers

3) Link the new launch agent plist
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents

4) create a new empty cluster with the same locale as the old one:
initdb /usr/local/var/postgres9.4 --locale=en_US.UTF-8

5) run the upgrade script (using the binary of the new version)
pg_upgrade -v \
-d /usr/local/var/postgres \
-D /usr/local/var/postgres9.4 \
-b /usr/local/Cellar/postgresql93/9.3.5/bin \
-B /usr/local/Cellar/postgresql/9.4.5_2/bin

6) start new server and uninstall the old version:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
brew uninstall postgresql93

7) optional: re-install the pg rem for my ruby app
gem uninstall pg

Hope this helps somebody!

Expressions as ruby default method arguments

When you use an expression as a ruby default argument like in

def delay(time=2.minutes.from_now)
  ... # stuff that needs to be done later

you might wonder, when exactly the expression gets evaluated, at parse time or at execution time. The difference, especially for time based expressions, can be huge!
Let’s find out:

puts 'A'
def delay(time=puts('B'))
puts 'C'

The output is


So it’s at execution time, which is much more useful anyway.

HTML5 input validation with custom message

HTML5 provides us with ways to specify different types of input, complete with client side validation. Inputs can be marked as required and it is even possible to specify regexp patterns for valid input.

Let’s put this into action by creating an input for german zip codes, consisting of 5 numbers:

As you can see, this works, but the actual validation message you get when entering a wrong code is a bit generic (In german: „Ihre Eingabe muss mit dem geforderten Format übereinstimmen.“). Instead, you would want the message to state what a correct zip code has to look like.

Fortunately there is a way to specify the message to be displayed via the javascript setCustomValidity method (unfortunately there is no way to do this via another attribute, say pattern-invalidmessage).

Now, when using the setCustomValidity method there is a conceptual problem. Setting this on an input field, automatically renders this field invalid, no matter whether it is otherwise perfectly fine!

So for our case, we want to set this message only after the browser has decided, that the field does not match the pattern, kind of as a second error on the field. The message should be specified in another attribute called data-invalidmessage.
The following CoffeeScript does just that:

The final working example:

Use CSS to change link content on hover

Using just a data-attribute and a simple stylesheet rule it is possible to change the content of a link when hovering over it.
Use an HTML / SASS combination like the following:

<a href="target" data-hovertext="Hover Text">
  Normal Text
  font-size: 0
    font-size: initial
    content: attr(data-hovertext)

See this in action.

Using throw and catch to tidy up our code

Let’s say we want a simple controller action that checks, if a given code is valid.
It should return true and false and, if the code is invalid, give the reason (whether that is because it is unknown or because it has been used already). The action could look like this:

def valid
  if code = Code.find_by_value(params[:id])
    unless code.used?
      respond_with :valid => true
      respond_with :valid => false, :reason => 'used'
    respond_with :valid => false, :reason => 'unknown'

Now this deep nesting effectively hides the underlying algorithm, a simple one in this case.
Expressing this using throw and catch straightens the code a bit:

def valid
  failure = catch :fail do
    code = Code.find_by_value(params[:id]) or throw(:fail, 'unknown')
    code.unused?                           or throw(:fail, 'used')
  respond_with({:valid => !failure}.merge(failure ? {:reason => failure}: {}))

We are down to one respond_with line but the has merging and the throws at the beginning of the line are not particularly pretty.

Let’s introduce a little Ruby mixin for the Hash class that provides it with a compact method that its friend Array has had all along:

module HashExtensions
  def compact
    self.reject{|key, value| value.nil? }

class Hash
  include HashExtensions

Now using this to clean up the response hash and moving the throw statements to the end so the steps of the algorithm are visible we have our final version of the action:

def valid
  failure = catch :fail do
    code = Code.find_by_value(params[:id]) or throw :fail, 'unknown'
    code.unused?                           or throw :fail, 'used'
  respond_with({:valid => !failure, :reason => failure}.compact)

Saving local text files to S3 using paperclip

Sometimes you need to save a locally created file to S3 instead of an uploaded file, as is the standard. Here is how:

has_attached_file :tagged_text_file,  STORAGE_OPTIONS.merge({
  :processors   => []
def save_tagged_text_file
  file ="#{RAILS_ROOT}/tmp/tagged_text_#{id}.txt", 'w+')
  file << tagged_text
  self.tagged_text_file = file

Connecting to redis via SSH tunneling

SSH tunneling is, of course, useful for a ton of services, but I happened to stumble upon it, when I wanted to connect to a remote redis server.

If you have a redis server running on [remotehost], you can easily connect
to it (given you have ssh access to it, of course) via:

ssh -L 9999:localhost:6379 [remoteuser]@[remotehost]

This will open a tunnel from the remote port 6379 (redis standard) to your local port 9999.

You can now use the redis on your local port 9999 like you would if it was running locally. Nice.

Push local branch to specific heroku app

You use two heroku apps as staging and production for your project. You added both as git remotes, e.g. „production“ and „staging“.

Now you want to push your local branch „poster“ to remote „staging“, use
git push staging poster:master

Note, that you can only push to „master“ on herokus side. This is just git syntax, but I keep forgetting it, so here it is for future reference.

Ruby: map Array to Hash

Sometimes you may wish to map an Array to a Hash in Ruby, like say, you got the output of I18n.available_locales

locales = [:en, :de, :fr]

and want to transform that into a Hash to fill a select element, like so:

{:en => 'EN', :de => 'DE', :fr => 'FR'}

How do you do that in the most concise way?
First, there is always inject:

locales.inject({}) {|hsh, sym| hsh[sym] = sym.to_s.upcase; hsh}

But I like the following approach way better, mainly because it emphasizes my intention more clearly (and, btw. is faster too):

Hash[{|sym| [sym, sym.to_s.upcase]}]

Remember: Hash[[[:a,:b],[:c,:d]]] (as well as Hash[:a,:b,:c,:d])
produces {:a => :b, :c => :d}.

Copying Files between S3 buckets

Building on this article here is a simple ruby script, that copies files between two buckets of the same S3 account, omitting files already present (by name).
This variant adds a list of path prefixes, so you can selectively copy only certain directories of your buckets.
Furthermore it copies the original buckets ACLs for each key.

require 'rubygems'
require 'right_aws'

aws_access_key_id     = 'YOUR AMAZON ACCESS KEY'
aws_secret_access_key = 'YOUR AMAZON SECRET ACCESS KEY'
source_bucket         = 'SOURCE BUCKET NAME'
target_bucket         = 'TARGET BUCKET NAME'
prefixes              = [PATH_PREFIX1, PATH_PREFIX2, ...]

s3 =, aws_secret_access_key)

copied_keys =
(prefixes || ['']).each do |prefix|
  s3.incrementally_list_bucket(target_bucket, {:prefix => prefix}) do |key_set|
    copied_keys << key_set[:contents].map{|k| k[:key]}.flatten

(prefixes || ['']).each do |prefix|
  s3.incrementally_list_bucket(source_bucket, {:prefix => prefix}) do |key_set|
    key_set[:contents].each do |key|
      key = key[:key]
      if copied_keys.include?(key)
        puts "#{target_bucket} #{key} already exists. Skipping..."

        puts "Copying #{source_bucket} #{key}, setting acl"

          s3.copy(source_bucket, key, target_bucket)
          acl = s3.get_acl(source_bucket, key)
          s3.put_acl(target_bucket, key, acl[:object])
        rescue Exception => e
          puts "cannot copy key, #{e.inspect}\nretrying #{retries} out of 10 times..."
          retries += 1
          retry if retries <= 10
Next entries »