Tuesday, June 30, 2015

ERROR: "https://rubygems.org" is not allowed by the gemspec, which only allows "TODO: Set to 'http://mygemserver.com'"

Problem: 

Not able to publish gem to rubygems.org

Resolution:

Delete the following lines from your-gem.gemspec file.

  if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
  end

how to use active support outside of rails

Error : NoMethodError: undefined method `hours' for 1:Fixnum

Resolution:

1. bundle open activesupport
2. Search for 'def hours', it is found in core_ext/numeric/time.rb
3. Add require 'active_support/core_ext/numberic/time.rb'

This is better than doing : require 'active_support/all'

Saturday, June 27, 2015

How to use Simplecov in gem development

1. Add the simplecov gem and start before anything else in test_helper.rb

$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'simplecov'

SimpleCov.start

require 'rasam'
require 'minitest/autorun'

2. You can mark private methods as:
    # :nocov:
  to exclude from test coverage.
 
3. Run : rake test

4. Open coverage/index.html

Friday, June 26, 2015

How I resolved confusing tests and production code


Pair Ranking is very well defined problem solving technique. When my code become convoluted I had to switch my perspective to that of the user to improve the code and the tests. Read more about it here: TDD Beyond Basics : Outside In Perspective. This also shows you an example of how you could use this gem.

Searching for a given element in an array of arrays in Ruby

How to pull the number 3 from this list by searching for the value 'c'.

records =
[
 ["a","1"],
 ["b","2"],
 ["c","3"]
]

search_for = 'c'

Solution 1:

test = records.select{ |x| x[0] == search_for }

p test[0][1]

Solution 2:

p records.assoc(search_for).last

Playing with Rails 4.2.3

zepho-mac-pro:blog zepho$ rails g scaffold article title
      invoke  active_record
      create    db/migrate/20150626235457_create_articles.rb
      create    app/models/article.rb

  BLAH, BLAH, BLAH

zepho-mac-pro:blog zepho$ rake db:migrate
== 20150626235457 CreateArticles: migrating ===================================
-- create_table(:articles)
   -> 0.0015s
== 20150626235457 CreateArticles: migrated (0.0016s) ==========================

zepho-mac-pro:blog zepho$ rails c
Loading development environment (Rails 4.2.3)
2.2.2 :001 > Article
 => Article (call 'Article.connection' to establish a connection)
2.2.2 :002 > Article.count
   (0.1ms)  SELECT COUNT(*) FROM "articles"
 => 0

Thursday, June 25, 2015

Pair Ranking Algorithm

require 'highline/import'
require "pp"
require 'rasam'

include Rasam

options = ask("Enter your choices (or a blank line to quit):",
lambda { |ans| ans =~ /^-?\d+$/ ? Integer(ans) : ans} ) do |q|
  q.gather = ""
end

@pr = PairRank.new(options)
@saved_combinations = Array.new(@pr.combinations)
combinations = Array.new(@pr.combinations)

pair = combinations.shift

def get_user_choice_for(pair)
  choose do |menu|
    menu.prompt = "Please choose your favorite: "

    pair.each do |c|
      menu.choice(c) do
        say(c)

        rationale = ask("Why?  ")

        say(rationale)

        rc = RationalChoice.new(pair, c, rationale)
        @pr.make(rc)
      end
    end
  end
end

loop do
  p pair  
  get_user_choice_for(pair)
  break if combinations.empty?
  pair = combinations.shift
end


@pr.decisions.each do |d|
  p d.to_s
end


p @pr.score_for('A')
p @pr.score_for('B')
p @pr.score_for('C')

def handle_ties(pair)
  choose do |menu|
    menu.prompt = "Please choose your favorite: "

    pair.each do |c|
      menu.choice(c) do
        say(c)

        rationale = ask("Why?  ")

        say(rationale)

        rc = RationalChoice.new(pair, c, rationale)
        @pr.make(rc)
      end
    end
  end
end

loop do
  p 'Handling a tie'
  if @pr.tied_pair.empty?
    break
  else
    handle_ties(@pr.tied_pair)
   
    @pr.decisions.each do |d|
      p d.to_s
    end
   
    p @pr.score_for('A')
    p @pr.score_for('B')
    p @pr.score_for('C')
    p @pr.tied_pair
   
  end
end

find numbers that are same in an array ruby

a = [0,1,2,2,3,3]
x = a.find_all { |e| a.count(e) > 1 }
   
p x

Wednesday, June 24, 2015

Pair Ranking Gem Released

Select a single winner using votes that express preferences. This can also be used to create a sorted list of winners. rasam gem

Create Gem and Publish to Rubygems

$gem build rasam.gemspec
$gem push rasam-0.1.0.gem

Generate all combinations of a given length for a list of items

In Ruby 2.2.2:

 a = [1,2,3,4]
 a.combination(2)
 => # 

We need to call to_a on this enumerator:

 a = ['A', 'B', 'C', 'D']
 => ["A", "B", "C", "D"]
> a.combination(2).to_a
 => [["A", "B"], ["A", "C"], ["A", "D"], ["B", "C"], ["B", "D"], ["C", "D"]]

How to provide a default value for all elements in a hash

a = Hash.new(0)
 => {}
> a['x']
 => 0

`require': cannot load such file -- minitest/autorun

Install Minitest gem by running: bundle install

Eliminate spaces, -, +, *, /, = and parentheses in a string

Run:

str = "Revenue - Costs * (1 + Profitpercentage)"
p str.scan(/[A-Za-z]+/)

at http://rubyplus.biz/

You will see:

["Revenue", "Costs", "Profitpercentage"]

How to delete nested hash elements based on the elements properties

data = {
"total_records"=>3,
"records"=>
   [{"title"=>"Val1",
   "coins"=>1},
   {"title"=>"Val2",
   "coins"=>1},
   {"title"=>"Val3",
   "coins"=>1}]
}

p data

data['records'].delete_if{ |h| %w(Val1 Val2).include?(h['title']) }

p data

Output:

{"total_records"=>3, "records"=>[{"title"=>"Val1", "coins"=>1}, {"title"=>"Val2", "coins"=>1}, {"title"=>"Val3", "coins"=>1}]}
{"total_records"=>3, "records"=>[{"title"=>"Val3", "coins"=>1}]}

Two HERE Docs in Ruby 2.2.2

data = [
<<'EOT1', <<'EOT2'
more text
EOT1
and more
EOT2
]

p data

An error occurred while installing json (1.6.1), and Bundler cannot continue.

Make sure that `gem install json -v '1.6.1'` succeeds before bundling.
zepho-mac-pro:dynamic-menus zepho$ gem install json -v 1.6.1
Building native extensions.  This could take a while...
ERROR:  Error installing json:
ERROR: Failed to build gem native extension.

    /Users/zepho/.rvm/rubies/ruby-2.2.2/bin/ruby -r ./siteconf20150624-48402-1w7o7yz.rb extconf.rb
checking for ruby/re.h... yes
checking for ruby/encoding.h... yes
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling generator.c
generator.c:952:47: error: too few arguments provided to function-like macro invocation
    VALUE result = rb_str_new(FBUFFER_PAIR(fb));
                                              ^
generator.c:952:11: warning: incompatible pointer to integer conversion initializing 'VALUE' (aka 'unsigned long') with an expression of type 'VALUE (const char *, long)';
    VALUE result = rb_str_new(FBUFFER_PAIR(fb));
          ^        ~~~~~~~~~~
1 warning and 1 error generated.
make: *** [generator.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/zepho/.rvm/gems/ruby-2.2.2@dmenu/gems/json-1.6.1 for inspection.
Results logged to /Users/zepho/.rvm/gems/ruby-2.2.2@dmenu/extensions/x86_64-darwin-11/2.2.0/json-1.6.1/gem_make.out


Resolution: Downgrade ruby from 2.2.2 to 2.1

Could not find coffee-script-source-1.1.3 in any of the sources

Resolution:

bundle update --source coffee-script-source

Top 6 Ruby Links for June 24, 2015


1. How to build a rails 5 api only and backbone application

2. Provisioning a Server for Rails Stack using Sunzi Gem

3. How to Setup Vagrant for Rails Development

4. Using the Rails 5 Attributes API Today, in Rails 4.2

5. Render Markdown views with Redcarpet and Pygment in Rails

6. Subscribing for events in rails_event_store

Tuesday, June 23, 2015

How to check postgres version

There are two ways:

#1:
sudo -u postgres psql
psql (9.4.4)
Type "help" for help.

postgres=# \q

#2.
deploy@localhost:~/apps/your-app/current$ psql --version

psql (PostgreSQL) 9.4.4

rbenv: version `ruby' is not installed on production


1. env | grep PATH

Check that rbenv shims is in the path:

PATH=/usr/local/rbenv/shims:/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript

2.

See `rbenv help ' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme
deploy@localhost:~/apps/carmel_production/current$ rbenv versions
rbenv: version `ruby' is not installed
  2.2.2
deploy@localhost:~/apps/carmel_production/current$ rbenv 2.2.2
rbenv: no such command `2.2.2'
deploy@localhost:~/apps/carmel_production/current$ rbenv local 2.2.2
deploy@localhost:~/apps/carmel_production/current$ rbenv versions
* 2.2.2 (set by /home/deploy/apps/carmel_production/current/.ruby-version)
deploy@localhost:~/apps/carmel_production/current$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
deploy@localhost:~/apps/carmel_production/current$ bundle exec unicorn -D -c /home/deploy/apps/carmel_production/shared/config/unicorn.rb -E production

Capistrano Deployment fails due to rake db:migrate failure

The cause is that the database does not exist.

Create a Database on the Server Manually

sudo -u postgres createdb --owner=postgres your-database-name

To go to postgres console:

sudo -u postgres psql

FATAL: password authentication failed for user "your-user-idl"

The following steps work for a fresh install of postgres 9.4 on Ubuntu 14.04

By default, postgres creates a user named 'postgres'. We log in as that user, and give that user a password.

$ sudo -u postgres psql
\password
Enter password: topseckret

\q

to exit postgres.

Then we connect as 'postgres'. The -h localhost part is important: it tells the psql client that we wish to connect using a TCP connection (which is configured to use password authentication), and not by a PEER connection (which does not care about the password).

$ psql -U postgres -h localhost

PG::ConnectionBad: FATAL: Peer authentication failed for user

Specify the host in database.yml:

production:
  adapter: postgresql
  encoding: unicode
  database: postgresql
  pool: 5
  host: localhost
  username: postgresql
  password: secret

bitbucket Permission denied (publickey). capistrano

You should already have your ssh keys added to your Bitbucket account. From the root of the rails project run:
1. ssh-add ~/.ssh/id_rsa
2. cap production deploy



sudo stderr: sudo: no tty present and no askpass program specified

1. Login to the server as root
2. Add the following line to the end of sudoers file by doing : visudo
deploy ALL=(ALL) NOPASSWD: ALL

Installing pg gem on Mac OS 10.9.5

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/bparanj/.rvm/rubies/ruby-2.1.5/bin/ruby -r ./siteconf20150623-1849-zuaatt.rb extconf.rb 
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/Users/bparanj/.rvm/rubies/ruby-2.1.5/bin/ruby
--with-pg
--without-pg
--enable-windows-cross
--disable-windows-cross
--with-pg-config
--without-pg-config
--with-pg_config
--without-pg_config
--with-pg-dir
--without-pg-dir
--with-pg-include
--without-pg-include=${pg-dir}/include
--with-pg-lib
--without-pg-lib=${pg-dir}/lib

extconf failed, exit code 1

Gem files will remain installed in /Users/bparanj/.rvm/gems/ruby-2.1.5@carmel/gems/pg-0.18.2 for inspection.
Results logged to /Users/bparanj/.rvm/gems/ruby-2.1.5@carmel/extensions/x86_64-darwin-14/2.1.0-static/pg-0.18.2/gem_make.out
An error occurred while installing pg (0.18.2), and Bundler cannot continue.

Make sure that `gem install pg -v '0.18.2'` succeeds before bundling.

RESOLUTION : 

1. Install http://postgresapp.com/
2. Move postgres from Downloads folder to the Applications folder
3. gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/9.4/bin/pg_config


Monday, June 22, 2015

Upgrading Ruby using Sunzi

# rbenv
# $1: ruby version

# This condition will not work if we want to upgrade Ruby. Fix is needed.
if [ -d /usr/local/rbenv ]; then
  echo 'rbenv already installed, skipping.'
else
  git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv
  echo 'export RBENV_ROOT=/usr/local/rbenv' >> /etc/profile.d/rbenv.sh
  echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> /etc/profile.d/rbenv.sh
  echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
  chmod +x /etc/profile.d/rbenv.sh
  source /etc/profile.d/rbenv.sh
  pushd /tmp
    git clone git://github.com/sstephenson/ruby-build.git
    cd ruby-build
    ./install.sh
  popd
  echo "Compiling Ruby. Grab some hot chocolate, this will take a while..."
  rbenv install $1
  rbenv global $1
  gem install bundler --no-ri --no-rdoc
  rbenv rehash
fi

I had to blow the entire /usr/local/rbenv to force the upgrade. Just specifying the version in sunzi.yml:

attributes:
  environment: production
  ruby_version: 2.2.2

does not work.

Using Sunzi Gem to Provision Your Server in Minutes

Sunzi is the easiest server provisioning utility designed for mere mortals. If Chef or Puppet is driving you nuts, try Sunzi! Here is step-by-step instructions on  : Provisioning a Server using Sunzi

Deploy Rails 4.1 App with Sunzi and Capistrano 3 Notes from Screencast

1. Ignore database.yml and secrets.yml by adding it to .gitignore
2. gem install sunzi (Does not have to be in Gemfile)
3. cd config
4. sunzi create 
5. In a temp directory : git clone git@github.com:crslade/sunzi-recipes.git sunzi-template
6. In the project directory

cd config/sunzi/
cp ~/temp/sunzi-template/files/* files
cp ~/temp/sunzi-template/recipes/* recipes
cp ~/temp/sunzi-template/sunzi.yml .
cp ~/temp/sunzi-template/install.sh .

7. sunzi.yml has password. Do not checkin into git. Same thing for deploy_key.

Add sunzi.yml and deploy_key to config/sunzi/.gitignore

# Ignore sensitive data
sunzi.yml
files/deploy_key

8. [todo/config/sunzi]

cp sunzi.yml sunzi.sample.yml
cp files/deploy_key files/deploy_key.sample (Deploy user can login without password)

9. cp ~/.ssh/id_rsa.pub files/deploy_key 

10. define database name, password, deploy_user = deploy, app_name=todo in sunzi.yml

11. Manual Steps. Some of these can be automated. Since it is one time thing, it is ok to do it manually.

Login to VPS. Create a linode instance by selecting the plan, location. Add the public ssh key of laptop so that you can login to the instance as a root user.


   $cat ~/.ssh/id_rsa.pub 
   $root@192.155.81.222 
   #mkdir .ssh
   #paste id_rsa.pub content in .ssh/authorized_keys
   #chown -R root:root .ssh
   #chmod 700 .ssh
   #chmod 600 .ssh/authorized_keys
   #exit
   $ssh root@192.155.81.222 
   should not prompt for any password
   
   AUTOMATE THIS TASK LATER.
   
   
12. Copy the IP address from your Linode dashboard and ssh root@ip-address 

You should be able to login into the instance without providing any password.

13. sunzi compile

14.  sunzi deploy ip-address

This will take 10 to 15 minutes.

15. Hit the IP address on the browser. You will see the nginx static page.

16. ssh deploy@ip-address should take into the instance without requiring any password.

17. github.com/talkingquickly/capistrano-3-rails-template copy the clone url and download this project.

[temp]$ git clone url cap-template

18. 

[todo] Gemfile

# Use unicorn as the app server
gem 'unicorn'

# Use Capistrano for deployment
group :development do
 gem 'capistrano-rails'
 gem 'capistrano-bundler'
 gem 'capistrano-rbenv', "~> 2.0"
end

Refer the : https://github.com/crslade/todo-sunzi-deploy or temp/todo-sunzi-deploy

bundle install

19. 

bundle exec cap install

Capfile :

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# Includes tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#
# require 'capistrano/rvm'
require 'capistrano/rbenv'
# require 'capistrano/chruby'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
Dir.glob('lib/capistrano/**/*.rb').each { |r| import r }

20. In project root directory:

cp ~/temp/cap-template/lib/capistrano/*.rb lib/capistrano
cp ~/temp/cap-template/lib/capistrano/tasks/* lib/capistrano/tasks
cp ~/temp/cap-template/config/deploy.rb config/deploy.rb
cp ~/temp/cap-template/config/deploy/production.rb config/deploy/production.rb
mkdir config/deploy/shared
cp ~/temp/cap-template/config/deploy/shared/* config/deploy/shared

21. Edit deploy.rb

application name
repo url
ruby version

linked_files secrets.yml
config_files secrets.yml

22. 

Create deploy/shared/secrets.yml.erb

Copy secrets.yml into the erb file and retain only production.

23. Find out how to setup staging server. Leave staging.rb as it is for now.

24. In deploy/production.rb

Specify the server_name as IP address or as domain name if DNS is already setup. The IP also goes into server line.

25. cap production deploy:setup_config

26. ssh deploy@ip-add

cd apps/todo_prod/shared/config

cp secrets.sample.yml to secrets.yml
cp database.sample.yml database.yml

THIS STEP CAN BE DONE USING SSHKIT SCRIPT OR WRAP SSHKIT TASK IN A RAKE TASK.

27. 

commit all changes to git and push it to bitbucket.

28.

cap production deploy

29.

Reload the webpage. The application should be running.

30. To troubleshoot:

Unicorn log files. Output of deployment. nginx log files and app log files.

nginx error log file location

You can find the location of the nginx error log file in your ngnix configuration file:

/etc/nginx# cat nginx.conf
user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;

In this case, the error log is in /var/log/nginx/ directory.

Rails Basics : Using Dropdowns

I have created a sample project with detailed instructions on how to create drop-downs in Rails 4.2.2 and Ruby 2.2.2 https://rubyplus.com/articles/2501

RVM PATH Problem

Warning! PATH is not properly set up, '/Users/zepho/.rvm/gems/ruby-2.1.2/bin' is not at first place,
         usually this is caused by shell initialization files - check them for 'PATH=...' entries,
         it might also help to re-add RVM to your dotfiles: 'rvm get stable --auto-dotfiles',
         to fix temporarily in this shell session run: 'rvm use ruby-2.1.2'.


Resolution: rvm get stable --auto-dotfiles


Pongal Gem Released

Pongal is a valid US state generator that can be used in Geocoding applications. Check it out: https://rubygems.org/gems/pongal

How to generate a random number in a range in Ruby 2.2.2

rand(0..4)

This will generate random numbers 0 to 4. It is inclusive of the lower and upper bound in the range.

Sunday, June 21, 2015

Implicit Vs Explicit Return in Ruby

You can run the following code at RubyPlus Code Editor:

Implicit return:

def times_ten(integer)
  integer * 10
end

p times_ten(1)

Explicit return:

def times_ten(integer)
  return integer * 10
end

p times_ten(2)


Saturday, June 20, 2015

dyld: Library not loaded

dyld: Library not loaded: /usr/local/lib/libruby.1.9.1.dylib
  Referenced from: /usr/local/bin/ruby
  Reason: image not found

Trace/BPT trap: 5

Resolution: gem install bundler

Wednesday, June 17, 2015

Top 6 Ruby Links for June 17, 2015

1. How a Bug in My Ruby Code Cost Code School $13,000

2. Docker Basics : Running a Nginx in a Container

3.  Ruby events (meetups, conferences, camps, etc.) from around the world

4. When should you use DateTime and when should you use Time?

5. Understanding the rails-jquery CSRF vulnerability (CVE-2015-1840)

6. Mutation testing for Ruby

VirtualBox 4.3 and Vagrant 1.7.2

Vagrant has detected that you have a version of VirtualBox installed
that is not supported. Please install one of the supported versions
listed below to use Vagrant:

4.0, 4.1, 4.2

Reason : VirtualBox 4.3.28 is not compatible with Vagrant 1.0.5

1. Check :

vagrant --version
Vagrant version 1.0.5

2. Delete the Vagrant folder in Applications.

3. Download the latest vagrant from : http://www.vagrantup.com/downloads

I installed vagrant 1.7.2. This is compatible with VirtualBox 4.3

Monday, June 15, 2015

Sunday, June 14, 2015

Wednesday, June 10, 2015

Using Custom Fonts in Rails 4.2

There is no need to configure anything as long as you have fonts copied to app/assets/fonts directory. Make sure to use the font-url to use custom fonts. You can see this font in action at RubyPlus. My style.css.scss looks like this :

@font-face {
font-family: 'OpenSans-Bold';
  src:font-url('OpenSans-Bold.ttf');
}

@font-face {
font-family: 'OpenSans-BoldItalic';
src:font-url('OpenSans-BoldItalic.ttf');
}

@font-face {
font-family: 'OpenSans-ExtraBold';
src:font-url('OpenSans-ExtraBold.ttf');
}

@font-face {
font-family: 'OpenSans-ExtraBoldItalic';
src:font-url('OpenSans-ExtraBoldItalic.ttf');
}

@font-face {
font-family: 'OpenSans-Italic';
src:font-url('OpenSans-Italic.ttf');
}

@font-face {
font-family: 'OpenSans-Light';
src:font-url('OpenSans-Light.ttf');
}

@font-face {
font-family: 'OpenSans-LightItalic';
src:font-url('OpenSans-LightItalic.ttf');
}

@font-face {
font-family: 'OpenSans-Regular';
src:font-url('OpenSans-Regular.ttf');
}

@font-face {
font-family: 'OpenSans-Semibold';
src:font-url('OpenSans-Semibold.ttf');
}

@font-face {
font-family: 'OpenSans-SemiboldItalic';
src:font-url('OpenSans-SemiboldItalic.ttf');
}

Top 6 Ruby Links for June 10, 2015

1.  Wrapper for the confreaks API. Browse and download convention videos from the command line.

2.  Object Oriented Design Basics : Open Closed Principle

3. Nothing is Something

4.  Functional Programming dictionary with Ruby #1/2

5. Cells 4.0 – Goodbye Rails! Hello Ruby!

6. How to Deal With and Eliminate Flaky Tests 

Monday, June 08, 2015

ssh-copy-id: command not found

1. If it is already installed: brew unlink ssh-copy-id
2. brew install ssh-copy-id

Thursday, May 28, 2015

Practical Object Oriented Design in Ruby Book Review

Rating : 3 out of 5 stars.

Things I liked:

1. The discussion of how messages form the basis for a good design and she classified what type of tests should be written in each case.

2. How TDD does not magically create design and how to apply good design principles as you code.

3. Writing contract tests to avoid problems due to mock abuse.

4. Guidelines for public interface.

Things I did not like:

1. Lot of fluff during the discussions. It is better to move them to her blog and make the book concise.

2. The cure is worse than the disease. Using template methods to avoid calling super.

3. Using toy examples in Bicyle domain is annoying.

4. She talks about coupling without covering the basics of coupling.

Content Review

Her Suggestion: 

Hide the variables, even from the class that defines them, by wrapping them in methods.

My Thoughts: 

#1 : If the class is small and has single purpose, this is not required. You can avoid the downside of exposing data and avoid the risk of name changes.

#2 : Her example of RevealingReferences class is an example for Data Coupling. The example of isolating knowledge of the data structure is an example of Localized Change.

Understanding Dependencies

#3. Coupling to a concrete class name. Coupling to a message name. Knowing the parameters and it's order is an example of Parameter Coupling.

#4. She probably forgot to mention in the section on Writing Loosely Coupled Code, 'If a class has too many arguments then it is likely that it violates Single Purpose Principle.

#5. Minimizing context is about providing a service.

#6. The diagram 4.7 is about raising the level of abstraction. There can be many ways to prepare for a trip. This flexibility allows reuse in different contexts.

#7. Things that change at different rates change for different reasons.

Some nuggets I liked in the book:

Nugget #1 : If you think of a class as having a single purpose, then the things it does are what it allows it to fulfill that purpose.

Nugget #2 : Public methods should read like a description of responsibilities. The public interface is a contract that articulates the responsibilities of your class.

Nugget #3 : Seeking Context Independence. The best possible situation is for an object to be completely independent of its context. An object that could collaborate with others without knowing who they are or what they do.

Find out what is running on a given port


1. Find out what is running on a given port

$sudo lsof -i :4567
Password:

COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    86461 zepho    9u  IPv6 0xffffff803ac28f80      0t0  TCP localhost:tram (LISTEN)
ruby    86461 zepho   10u  IPv4 0xffffff8022e51c00      0t0  TCP localhost:tram (LISTEN)
ruby    86461 zepho   11u  IPv6 0xffffff802197bac0      0t0  TCP localhost:tram (LISTEN)

2. Check what process is running with that process id.

$ ps aux | grep 86461
zepho          86461   0.0  0.1  2492352  18280 s005  T     4:59PM   0:00.31 ruby hello.rb
zepho          91001   0.0  0.0  2434892    460 s005  R+    8:37PM   0:00.00 grep 86461

3. Kill that mother fucker like this:

$ kill -9 86461


Top 6 Ruby Links for the week May 21, 2015

1. Best Post of the Week : The Ruby Community: The Next Version
2. Most Useful Library of the Week : An intelligent pure Ruby WHOIS client and parser.
3. A good Alternative to Nokogiri 
4. How to Write Faster Ruby
5. Dynamic Site as fast as a Static Generated One with Raptor : Interesting article. I would do not do it. I don't need a dynamic site mixed with static static, if I need a static site, I use Python to deploy it to GAE. Essential TDD Tutorial site is deployed this way.
6. Rails 5 - Much Faster Collection Rendering

Wednesday, May 27, 2015

Setting Up Port Forwarding in VirtualBox

1) If the VM is running, stop it.

2) To forward from port 3001 on the host to port 3000 on the guest, run the following command on the host.
$ VBoxManage modifyvm "Ubuntu" --natpf1 "webrick,tcp,,3001,,3000"

3) To delete the port forwarding run:

VBoxManage modifyvm "Ubuntu" --natpf1 delete "webrick"

4) Now you can go to http://localhost:3001 on your host to hit webrick running on your VM.

The page loads very slow. Is there any way to speed it up?

Tuesday, May 19, 2015

** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000

Running mongodb in Mac OS 10.10.3 can give that warning. If this warning is ignored, it will lead to problems. In the same terminal,run :
$ulimit -n 1024

$ mongod --config /usr/local/etc/mongod.conf

Thursday, May 07, 2015

MOPED: Could not resolve IP for: xyz:27017 runtime: n/a

       Could not connect to a primary node for replica set #]>

     Moped::Errors::ConnectionFailure:

The following error can happen if the xyz is not localhost. If you are running the mongo on localhost on your machine, change the mongoid.yml file to point to localhost. This will fix the problem.

Friday, April 24, 2015

NoMethodError: undefined method `devise' for User

 Problem: NoMethodError: undefined method `devise' for User (call 'User.connection' to establish a connection):Class
Solution:
 run rake db:migrate
before :
 rails g devise user

Check current environment in Sinatra

   if Sinatra::Base.development?
     # do something exciting here
   end

How to exclude spec folder from test coverage report

   SimpleCov.start do
     add_filter '/spec/'
   end

Reference

Sinatra TDD Tools   
 

Thursday, April 23, 2015

Upgrading Ruby using rbenv

1. Change the default version of Ruby globally to use 2.2.2

rbenv global 2.2.2

2. Change the ruby version in Gemfile

ruby '2.2.2'

3. gem install bundler

4. bundle


Wednesday, April 22, 2015

Sinatra Console

There is nothing similar to rails console in sinatra. You can go to irb and do a :

require './myapp.rb'

to start experimenting with your Sinatra app.

You can create a console.rb and put the following code:

require './game.rb'
require 'irb'
ARGV.clear
IRB.start

You now have a simple Sinatra console, you can run it as ruby console.rb.

Reference:

Sinatra Console

irb history

I installed ruby 2.2.1 using rbenv on Mac OS 10.10.3. By default the irb console does not save the history, so you cannot use the saved code in the history by using the arrows in new irb sessions. To fix this problem, create ~/.irbrc and add this code:

require 'irb/ext/save-history'
#History configuration
IRB.conf[:SAVE_HISTORY] = 1000
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"


Tuesday, April 21, 2015

Bundler is using a binstub that was created for a different gem.

This is an rvm issue. Suggestions on rvm home page did not work. Solution: Uninstall rvm and use rbenv to manage ruby versions.

Add the following to ~/.bashrc
[[ -s "$HOME/.profile" ]] && source "$HOME/.profile" # Load the default .profile
rt PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"

source ~/.bashrc

Say 'Yes' to the prompt.

which bundle showed no output. Run: gem install bundle

References:
https://gorails.com/forum/rbenv-bundle-command-not-found
https://gorails.com/setup/osx/10.10-yosemite

Monday, April 20, 2015

Textmate 2 Setup Mate

You may get No such file or directory error when you create the symlink. 

1. Run:
ln -s /Applications/TextMate.app/Contents/SharedSupport/Support/bin/mate /usr/local/bin/mate
2. Go to Textmate -> Preferences, click on Terminal tab, click install for 'Shell support'.

Now the mate command will work.

Tuesday, April 14, 2015

short prompt in ubuntu 14.04 terminal

In your ~/.bash_profile add:

PROMPT_COMMAND='PS1="[\W]\\$ "'

Open a new terminal and you should see a small prompt.

Saturday, April 11, 2015

Using Custom Fonts in Rails 4.2

1. For Rails 4.2, copy the custom fonts to the folder app/assets/fonts. I am using the purchased fonts OpenSans.

2. Declare your font in your css file like this:

@font-face {
    font-family: 'OpenSans-Bold';
    src:url('OpenSans-Bold.ttf');
}

3. Use the declared font in css. For example:

font-family: 'OpenSans-Regular'

4. Add gem 'font-awesome-sass' to Gemfile

5. Run bundle intall

6. In application.scss, add:

@import "font-awesome-sprockets";
@import "font-awesome";

Sunday, April 05, 2015

Using Jeweler to Create Ruby Gems

1. gem install jeweler
2. jeweler gem-name
3. bundle install
4. rake version:write MAJOR=0 MINOR=1 PATCH=0
5. git remote rm origin
Jeweler automatically creates a git repo
6. Open the Rakefile and customize the gem details.
I changed the default github repo URL to bitbucket repo URL
7. git remote add origin bitbucket-url
8. Delete the line Jeweler::RubygemsDotOrgTasks.new to prevent accidental release to Gemcutter.
9. rake gemspec
10. rake build to create the .gem file that can be used with any project.


pessimistic dependency may be overly strict

ISSUE

$rake build
WARNING:  pessimistic dependency on jeweler (~> 2.0.1, development) may be overly strict
  if jeweler is semantically versioned, use:
    add_development_dependency 'jeweler', '~> 2.0', '>= 2.0.1'
WARNING:  See http://guides.rubygems.org/specification-reference/ for help
  Successfully built RubyGem
  Name: pdf_stamper
  Version: 0.2.0
  File: pdf_stamper-0.2.0.gem

RESOLUTION

group :development do
  gem "rdoc", "~> 3.12"
  gem "bundler", "~> 1.0"
  gem "jeweler", "~> 2.0"
end
 

Now you can build the gem file:

 $rm -rf pkg
 $rake build
  Successfully built RubyGem
  Name: pdf_stamper
  Version: 0.2.0
  File: pdf_stamper-0.2.0.gem

Saturday, April 04, 2015

Twitter Bootstrap 3.3.4 on Rails 4.2.1

1. Add : gem 'bootstrap-sass', '~> 3.3.4' to Gemfile.
2. Run bundle
3. Rename application.css to application.scss
4. Copy this to application.scss

// "bootstrap-sprockets" must be imported before "bootstrap" and "bootstrap/variables"
@import "bootstrap-sprockets";
@import "bootstrap";

Sunday, March 29, 2015

Client Side Validations Gems vs JQuery Libray in a Rails project

Client side validations gem has the following issues:

1. Browser compatibility is not known.
2. Radio buttons issue.
3. Document is not up to date for Rails 3.2.
4. Depends on persistence mechanism. Supports Mongoid, MongoMapper.
5. Custom validations still require writing javascripts.

Advantages of pure jQuery library approach:

1. Clean separation of UI logic from Mid-tier and Persistence tier.
2. Front-end developers can develop and test without any server-side coding. Faster.
3. Wide browser compatibility.
4. Upgrades are easier and not affected by Rails and Client Side Validation gem versions.
5. Simplicity. Rule based and less code to write, integrate, test and maintain.

dyld: Library not loaded error

Upgrading rvm using : rvm get head
seems to create problems with the error:

dyld: Library not loaded: /usr/local/lib/libruby.1.9.1.dylib
  Referenced from: /usr/local/bin/ruby
  Reason: image not found
Trace/BPT trap: 5

I had to do: rvm get stable
and use Ruby version 2.1.5
to get past that error.

The Scientific Method is Crap : Teman Cooke at TED

Great presentation explaining why it is Crap. He is right. How do you explain discoveries that were made by accident? Instead of the Scientific Method, we can adopt:

Cycle of Scientific Thinking

Observations
Questions
Model (Hypothesis)
Prediction
Testing / Checking
Answers

Friday, February 27, 2015

How to export specific columns in a table to a csv file in mysql

Go to the mysql prompt as usual and run the command:
select id, email from users INTO OUTFILE '/Users/zepho/temp/users.csv' FIELDS TERMINATED BY ',';

This will create a csv file with only id, email columns in the users table in the users.csv file.

ERROR 1 (HY000): Can't create/write to file '/var/empty/projects/gold' (Errcode: 2)
ERROR 1 (HY000): Can't create/write to file '/Users/zepho/temp/users.csv' (Errcode: 13)

If you get these errors run:

chmod 777  /Users/zepho/temp



Thursday, February 26, 2015

How to turn off Spring

Spring is a big headache in development environment. Creates weird issues like not being able to play in rails console and is a big waste of time. To turn off spring, in the terminal, run:

export DISABLE_SPRING=1
 
You will now be able to go to rails console.  You may also have to kill any stray rails
console processes that may be running but never succeeded.

To remove it :
  • 'Unspring' your bin/ executables: bin/spring binstub --remove --all
  • Remove spring from your Gemfile
 
 

Saturday, February 21, 2015

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) Mac OS 10.9.5

I was able to connect to the server using SQL Pro but not from the command line. The solution:

$ mysql -h 127.0.0.1 -P 3306 -u root -p

You can also use telnet to check the connectivity:

$telnet 127.0.0.1 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
J
5.6.21 81/8j0O?Am$fZn<||}~!mysql_native_password

!#08S01Got packets out of orderConnection closed by foreign host.


Friday, February 20, 2015

Is TDD Dead Part 3 Transcript Concise Version : Fast Feedback and Quality Assurance

Kent said that decisions involving TDD were about trade-offs: "In some ideal world we would have instant, infallible feedback about our programming decisions", "every key stroke that I make, if the code is ready to deploy, it would just instantly deploy." But that ideal is impossible at the moment so the question is how far do we back off from that. He went to enumerate several constraints in the trade-off.


  • Frequency: how rapidly do we want our feedback ?
  • Fidelity: how accurate do we want the red/green signal to be?
  • Overhead: how much are we prepared to pay?
  • Lifespan: how long is this software going to be around, which is a probability as well as time.


Those four are the constraints he thinks we need to compare. "My personal goal is just to understand the set of trade-offs by articulating them to people who are prepared to tear my ideas apart in a constructive way"

Fowler outlined three things that we can look at, to get feedback on:


  1. Is the software doing something useful for the user of the software?
  2. Have I broken anything? 
  3. Is my code-base healthy? This so I can continue to build things quickly.


David introduced the topic that TDD's success had led to a neglect of QA. The other issue is that to understand trade-offs you have to understand the costs, all the talk of TDD has been on the benefits. This neglect of costs is why people cannot comprehend that there is such a thing as test-induced damage. The trade-off continuum is true of other things. Consider the cost of reliability: going from 99% to 99.999% is exponentially more expensive than getting to 99%. We must also consider criticality. High reliability is important for space shuttles and pacemakers, but wrong for an exploratory web site. The rule of not writing a line of production code without a test doesn't fit in with trade-offs around criticality.

David agreed that it was good to mindfully trade-off QA for initial speed, but some have taken programmer testing too far and don't see the value of exploratory testing. Your tests may be green but when it's in production users do things you don't expect.

David says that worst of all is when developers are not part of of customer service. Many programmers don't want to be on-call because it's drudgery, but it's also a feedback loop. Code with green tests can be a plateau that's below where you want to be. "The on-call is the feedback loop that teaches you what tests you didn't write." As soon as you think you don't make mistakes any more, that's a mistake, and you stop growing. He'd rather pay the price of catching that early with a phone call at 2am.

How to use Favicon for your Rails 4.2 app

1. Copy your favicon.ico to app/assets/images folder.
2. In the layouts/application.html.erb add:  <%= favicon_link_tag %> within the head tags.
3. Deploy and enjoy!

Monday, February 16, 2015

Disabling SSL V3 for Poodle for Apache in Ubuntu

1. edit /etc/apache2/mods-available/ssl.conf
2. Look for : SSLProtocol All -SSLv2
3. Replace it with : SSLProtocol All -SSLv2 -SSLv3
4. Test configuration: apachectl configtest
5. Restart Apache : sudo service apache2 restart

Saturday, February 14, 2015

Auto Refresh Browser on File Save

I was looking for a tool that reloads static html pages automatically on file save. CodeKit does not work on Mac 10.7.5 and it costs $40. Here is a simple alternative.

1. Install Auto Reload Firefox Plugin
2. Go to Tools -> AutoReload Preferences and turn off notifications. It's a bit distracting.



3. Open the local html file in a text editor.

Now, whenever you save the file, the page will get refreshed automatically. Much faster feedback. I love it.


Sunday, February 08, 2015

How to build codeschool.com clone and make $35 million in 4 years!

1. You need Ubuntu 14.04 LTS. I installed it on my $10/month Linode instance. Digital Ocean offers $5/month plan which is good enough.
2. Expose docker to access over network
3. From your machine: $
    ssh root@ip-address-of-your-server
4. $chmod 777 setup-script.sh
   $sh setup-script.sh
5. git clone git@github.com:grounds/grounds.io.git
6. cd grounds.io
7. make pull
8. In ~/.profile add export DOCKER_URL=http://ip-address-of-your-server:4243
9. chmod -R 777 grounds.io
10. Edit fig.yml:
web:
  build: .
  command: rake run
  ports:
    - '80:3000'

11. Run the Rails app:
RAILS_ENV=production SECRET_KEY_BASE="your secret key generated using rake secret" fig up -d

See it in action at www.rubyplus.biz