A blind debugging session.
The website using PHP is down.
What we have to work with
The source code. (No)
Knowledge of the system. (No)
Familiarity with the programming language. (No)
SSH Access. (Yes)
Logging in the real world is often useless.
Find a pid. ps aux | grep apache
sudo strace -ff -s 2048 -p pid
How to read strace output
write(l, "hi\n", 3) = 3
write -> function name
arguments are l, "hi\n" and 3
return value is 3
To learn more about system calls: man 2 write
strace gives lot of output. Work backwards and find the failure. Look for the error message in the strace output. Find the cause by reading the strace output. Find the offender and write down your hypothesis. Prove your hypothesis. Find the offender. Fix the bug.
0. Forget everything you think you know.
1. Get a third party opinion.
2. Refer the 'Linux Performance Tools' diagram for a list of third-party tools.
You can also use strace to start a process.
sudo strace -ff apt-get update
Work backwards, find failure. Find the cause. Confirm your hypothesis. Locate a hook. Stare at the code. Confirm your hypothesis.
2. Locate the correct source code.
3. Identify a hard-coded string to grep for.
4. Stare at the code until it makes sense.
5. Fix whatever is broken.
0. Forget everything you think you know.
1. Get a third party opinion.
2. Locate the correct source code.
3. Identify a hard-coded string to grep for.
4. Stare at the code until it makes sense.
5. Fix whatever is broken.
puts Process.ppid
t = Thread.new do
sleep 10
end
# Grabbing the pid.
pid = Process.pid
puts pid
# Get the child pids.
pipe = IO.popen("ps -ef | grep #{pid}")
child_pids = pipe.readlines.map do |line|
puts line
parts = line.split(/\s+/)
# puts parts
# parts[2] if parts[3] == pid.to_s and parts[2] != pipe.pid.to_s
end.compact
# Show the child processes.
# puts child_pids
#
#
# q = Queue.new
# # q.pop
#
t.join
Friday, July 24, 2015
Thursday, July 09, 2015
Friday, July 03, 2015
Thursday, July 02, 2015
Colt Gem Released
Colt is a micro gem used to subscribe to a given plan using the Stripe API. The plans must already exist in your account. The current version can check Stripe credentials and Stripe API version.
Source Code. You can find the different versions at Rubygems.org
Source Code. You can find the different versions at Rubygems.org
Tuesday, June 30, 2015
Check Amazon S3 Credentials
1. gem install aws-s3
2. In IRB console : require 'aws/s3'
3.
AWS::S3::Base.establish_connection!(access_key_id: 'abcd', secret_access_key: 'secret')
AWS::S3::Service.buckets
AWS::S3::Bucket.find('your-existing-bucket-name')
2. In IRB console : require 'aws/s3'
3.
AWS::S3::Base.establish_connection!(access_key_id: 'abcd', secret_access_key: 'secret')
AWS::S3::Service.buckets
AWS::S3::Bucket.find('your-existing-bucket-name')
It would be nice to steal code from aws-s3 gem to test if the credentials is valid or not.
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.
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
$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
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
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
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
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
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"]]
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"]]
`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}]}
"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}]}
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
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
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 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
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
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
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.
# $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'.
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.
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)
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
Thursday, June 18, 2015
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
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
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');
}
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
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
2. brew install ssh-copy-id
Sunday, June 07, 2015
Thursday, June 04, 2015
Top 6 Ruby Links for June 4, 2015
1. High level Rails testing using Capybara and Minitest
2. Don't use before_action to load data
3. Capturing stdout & stderr from shell commands via Ruby
4. Empty? vs blank? vs any? – why you should not use any? to test if there’s anything in the array
5. Practicing Ruby Contributors Fund
6. A week with a Rails Security Strategy: More security, new habits
2. Don't use before_action to load data
3. Capturing stdout & stderr from shell commands via Ruby
4. Empty? vs blank? vs any? – why you should not use any? to test if there’s anything in the array
5. Practicing Ruby Contributors Fund
6. A week with a Rails Security Strategy: More security, new habits
Monday, June 01, 2015
Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
In development.rb:
config.action_mailer.default_url_options = { :host => 'localhost' }
config.action_mailer.default_url_options = { :host => 'localhost' }
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
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?
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
Solution:
run rake db:migrate
before :
rails g devise user
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
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
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"
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
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.
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";
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.
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
$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";
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.
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.
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
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
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.
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:
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.
- 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:
- Is the software doing something useful for the user of the software?
- Have I broken anything?
- 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!
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
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
Subscribe to:
Posts (Atom)