The Passionate Craftsman

Ruby, PHP, MySql, Software engineering and more.

Thursday, 29 December 2011

PHP hosting on EC2

EC2 (Amazon Virtual servers) can be used as any other VPS, if you use EBS for storing your data and the cost is really low. But where EC2 really exceed is on building automatically scaling web hosting solutions. Web servers can be load balanced with Elastic Load Balancers, servers can be added on demand. Best tools to create and manage an infrastructure on EC2 are Chef and Puppet.

Labels: ,

Create a basic Ruby app with Rack middleware - part 1

This post - or may be a series of posts - on Rack is intended to understand how modern Ruby frameworks work. Frameworks such as Sinatra or Ruby on Rails use Rack middleware to exchange requests and responses to application servers. Old time of CGI or FCGI are gone. The code below shows how simple is to start a ruby server to serve a 404 error page:

app = lambda do |env|
body = File.open(File.dirname(__FILE__)+'/404.html', 'r').read
[404, {'Content-Type' => 'text/html'}, [body]]
end

run app


Save the previous script in a file named config.ru. If you have a page 404.html in the same directory of config.ru and you run:

> rackup -p 3000

You will get the 404.html page by connecting to http://localhost:3000. Please notice the curly braces between body: it is needed by Ruby 1.9. The run app statement run the lambda we just created.

Labels: ,

Convert ruby code to HTML to paste it into your blog

I use the following script to read ruby code and output the HTML to the stdin of the shell:

require 'syntax/convertors/html'

code = File.read('code.rb')

convertor = Syntax::Convertors::HTML.for_syntax "ruby"
code_html = convertor.convert( code )

puts code_html


Put you ruby code in 'code.rb' and run

> ruby script_name.rb

Then cut and paste the content. You have to add the following CSS if you want to see your code properly formatted:

pre {
    background-color: #f1f1f3;
    color: #112;
    padding: 10px;
    font-size: 1.1em;
    overflow: auto;
    margin: 4px 0px;
          width: 95%;
}



/* Syntax highlighting */
pre .normal {}
pre .comment { color: #005; font-style: italic; }
pre .keyword { color: #A00; font-weight: bold; }
pre .method { color: #077; }
pre .class { color: #074; }
pre .module { color: #050; }
pre .punct { color: #447; font-weight: bold; }
pre .symbol { color: #099; }
pre .string { color: #944; background: #FFE; }
pre .char { color: #F07; }
pre .ident { color: #004; }
pre .constant { color: #07F; }
pre .regex { color: #B66; background: #FEF; }
pre .number { color: #F99; }
pre .attribute { color: #5bb; }
pre .global { color: #7FB; }
pre .expr { color: #227; }
pre .escape { color: #277; }


The style of the CSS code above has been created by changing the type of highlighter:


convertor = Syntax::Convertors::HTML.for_syntax "css"

Labels:

How to call a private method in Ruby

If you want to call a private method in Ruby - for any reason - you can use send, method and instance_eval:



class Foo

private
def bar
puts 'You called bar'
end
end

> foo = Foo.new
foo.bar # this, of course, throws an error
NoMethodError: private method `bar' called for #
from (irb):129
from :0

> foo.send(:bar)
You called bar
=> nil
m = foo.method(:bar)
=> #
> m.call
You called bar
=> nil
> foo.instance_eval { bar }
You called bar
=> nil


Remember you cannot use eval to call a private method:


> eval('foo.bar')
NoMethodError: private method `bar' called for #
from (irb):140
from (irb):140
from :0



Labels: ,