<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1110641097953748292</id><updated>2012-01-22T22:51:48.207-08:00</updated><category term='ruby'/><category term='enumerator enums'/><category term='iran'/><category term='postgresql'/><category term='SQL'/><category term='erlang'/><category term='ActiveRecord'/><category term='JBoss Eclipse'/><category term='youtube'/><category term='DBI'/><category term='credid crunch'/><category term='memcache'/><category term='WSDL'/><category term='PHP performance'/><category term='rack'/><category term='gem'/><category term='rails'/><category term='ola bini'/><category term='Win32'/><category term='freebsd'/><category term='Resin'/><category term='devops'/><category term='EC2'/><category term='database'/><category term='IBM'/><category term='computer science'/><category term='threads'/><category term='ruby-on-ralis cms drupal'/><category term='vi'/><category term='metaprogramming ruby'/><category term='loke'/><category term='limits math youtube'/><category term='selfgrowth'/><category term='UDDI'/><category term='web services'/><category term='bash'/><category term='Java'/><category term='Open Source'/><category term='PHP'/><category term='rspec'/><category term='Zend Server CE'/><category term='activemq'/><category term='shoulda'/><category term='unix'/><category term='Linux'/><category term='mac firefox'/><category term='mac'/><category term='history'/><category term='SOA BPM Orchestration'/><category term='expect'/><category term='mathematics'/><category term='DBA'/><category term='merb ruby books'/><category term='WSIL'/><category term='MySql'/><category term='Zend PHP'/><category term='watir'/><category term='jruby'/><category term='testing'/><category term='J2EE'/><category term='Capistrano'/><title type='text'>The Passionate Craftsman</title><subtitle type='html'>Ruby, PHP, MySql, Software engineering and more.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-139496712148762026</id><published>2011-12-29T03:04:00.000-08:00</published><updated>2011-12-29T03:07:03.160-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='EC2'/><title type='text'>PHP hosting on EC2</title><content type='html'>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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-139496712148762026?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/139496712148762026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/php-hosting-on-ec2_29.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/139496712148762026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/139496712148762026'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/php-hosting-on-ec2_29.html' title='PHP hosting on EC2'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-698446772794243925</id><published>2011-12-29T02:17:00.001-08:00</published><updated>2011-12-29T02:41:28.560-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rack'/><title type='text'>Create a basic Ruby app with Rack middleware - part 1</title><content type='html'>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:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="ident"&gt;app&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;lambda&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;env&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dirname&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;__FILE__&lt;/span&gt;&lt;span class="punct"&gt;)+'&lt;/span&gt;&lt;span class="string"&gt;/404.html&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;br /&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;404&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;Content-Type&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;text/html&lt;/span&gt;&lt;span class="punct"&gt;'},&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;]]&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="ident"&gt;app&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&amp;gt; rackup -p 3000&lt;br /&gt;&lt;br /&gt;You will get the 404.html page by connecting to http://localhost:3000. Please notice the curly braces between &lt;i&gt;body&lt;/i&gt;: it is needed by Ruby 1.9. The &lt;span style="font-style:italic;"&gt;run app&lt;/span&gt; statement run the lambda we just created.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-698446772794243925?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/698446772794243925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/create-basic-ruby-app-with-rack.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/698446772794243925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/698446772794243925'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/create-basic-ruby-app-with-rack.html' title='Create a basic Ruby app with Rack middleware - part 1'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8063766708545511214</id><published>2011-12-29T01:54:00.000-08:00</published><updated>2011-12-29T02:07:59.697-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Convert ruby code to HTML to paste into your blog</title><content type='html'>I use the following script to read ruby code and output the HTML to the stdin of the shell:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;syntax/convertors/html&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;code&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;code.rb&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;convertor&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Syntax&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Convertors&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;HTML&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;for_syntax&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;ruby&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;code_html&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;convertor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;convert&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="ident"&gt;code&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;code_html&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Put you ruby code in 'code.rb' and run&lt;br /&gt;&lt;br /&gt;&gt; ruby script_name.rb&lt;br /&gt;&lt;br /&gt;Then cut and paste the content. You have to add the following CSS if you want to see your code properly formatted:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;pre {&lt;br /&gt;    background-color: #f1f1f3;&lt;br /&gt;    color: #112;&lt;br /&gt;    padding: 10px;&lt;br /&gt;    font-size: 1.1em;&lt;br /&gt;    overflow: auto;&lt;br /&gt;    margin: 4px 0px;&lt;br /&gt;          width: 95%;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* Syntax highlighting */&lt;br /&gt;pre .normal {}&lt;br /&gt;pre .comment { color: #005; font-style: italic; }&lt;br /&gt;pre .keyword { color: #A00; font-weight: bold; }&lt;br /&gt;pre .method { color: #077; }&lt;br /&gt;pre .class { color: #074; }&lt;br /&gt;pre .module { color: #050; }&lt;br /&gt;pre .punct { color: #447; font-weight: bold; }&lt;br /&gt;pre .symbol { color: #099; }&lt;br /&gt;pre .string { color: #944; background: #FFE; }&lt;br /&gt;pre .char { color: #F07; }&lt;br /&gt;pre .ident { color: #004; }&lt;br /&gt;pre .constant { color: #07F; }&lt;br /&gt;pre .regex { color: #B66; background: #FEF; }&lt;br /&gt;pre .number { color: #F99; }&lt;br /&gt;pre .attribute { color: #5bb; }&lt;br /&gt;pre .global { color: #7FB; }&lt;br /&gt;pre .expr { color: #227; }&lt;br /&gt;pre .escape { color: #277; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The style of the CSS code above has been created by changing the type of highlighter:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="ident"&gt;convertor&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Syntax&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Convertors&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;HTML&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;for_syntax&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;css&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8063766708545511214?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8063766708545511214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/convert-ruby-code-to-html-to-paste-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8063766708545511214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8063766708545511214'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/convert-ruby-code-to-html-to-paste-into.html' title='Convert ruby code to HTML to paste into your blog'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7190102834573655024</id><published>2011-12-29T00:39:00.000-08:00</published><updated>2011-12-29T01:30:55.126-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming ruby'/><title type='text'>How to call a private method in Ruby</title><content type='html'>If you want to call a private method in Ruby - for any reason - you can use &lt;i&gt;send&lt;/i&gt;, &lt;i&gt;method&lt;/i&gt; and &lt;span style="font-style:italic;"&gt;instance_eval:&lt;/span&gt;&lt;div&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Foo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="ident"&gt;private&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;bar&lt;/span&gt;&lt;br /&gt;      &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;You called bar&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;foo&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Foo&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;foo&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;bar&lt;/span&gt; &lt;span class="comment"&gt;# this, of course, throws an error&lt;/span&gt;&lt;br /&gt;&lt;span class="constant"&gt;NoMethodError&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;private&lt;/span&gt; &lt;span class="ident"&gt;method&lt;/span&gt; `&lt;span class="ident"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt; called for #&lt;br /&gt; from (irb):129&lt;br /&gt; from :0&lt;br /&gt;&lt;br /&gt;&amp;gt; foo.send(:bar)&lt;br /&gt;You called bar&lt;br /&gt;=&amp;gt; nil&lt;br /&gt;m = foo.method(:bar)&lt;br /&gt;=&amp;gt; #&lt;br /&gt;&amp;gt; m.call&lt;br /&gt;You called bar&lt;br /&gt;=&amp;gt; nil&lt;br /&gt;&amp;gt; foo.instance_eval { bar }&lt;br /&gt;You called bar&lt;br /&gt;=&amp;gt; nil&lt;span class="normal"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Remember you cannot use &lt;i&gt;eval&lt;/i&gt; to call a private method:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;eval&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;foo.bar&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;span class="constant"&gt;NoMethodError&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;private&lt;/span&gt; &lt;span class="ident"&gt;method&lt;/span&gt; `&lt;span class="ident"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt; called for #&lt;br /&gt; from (irb):140&lt;br /&gt; from (irb):140&lt;br /&gt; from :0&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Reference: &lt;a href="http://www.khelll.com/blog/ruby/ruby-dynamic-method-calling/"&gt;http://www.khelll.com/blog/ruby/ruby-dynamic-method-calling/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7190102834573655024?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7190102834573655024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/how-to-call-private-method-in-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7190102834573655024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7190102834573655024'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/12/how-to-call-private-method-in-ruby.html' title='How to call a private method in Ruby'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4860887247450342865</id><published>2011-11-16T03:01:00.000-08:00</published><updated>2011-11-16T03:07:06.031-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='selfgrowth'/><title type='text'>How to become successful</title><content type='html'>This is a quite inspiring speech. Reaching a target or becoming successful takes time and pain. Rewards are difficult to obtain, but when you get it... it is awesome:&lt;br /&gt;&lt;br /&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/JRfoFGGyRvU" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4860887247450342865?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4860887247450342865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/how-to-become-successful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4860887247450342865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4860887247450342865'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/how-to-become-successful.html' title='How to become successful'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/JRfoFGGyRvU/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4887944070501903259</id><published>2011-11-13T10:19:00.000-08:00</published><updated>2011-11-13T10:21:26.322-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Create a Rails 3 project with "activerecord", "capybara", "devise", "git", "haml", "jquery", "rspec", "sass", "settingslogic"</title><content type='html'>You can run this commend:&lt;br /&gt;&lt;br /&gt;rails new APP_NAME -m http://railswizard.org/50fc74d6dfa659c06971.rb -J -T&lt;br /&gt;&lt;br /&gt;I have created the template using http://railswizard.org/&lt;a href="http://railswizard.org/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4887944070501903259?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4887944070501903259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/create-rails-3-project-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4887944070501903259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4887944070501903259'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/create-rails-3-project-with.html' title='Create a Rails 3 project with &quot;activerecord&quot;, &quot;capybara&quot;, &quot;devise&quot;, &quot;git&quot;, &quot;haml&quot;, &quot;jquery&quot;, &quot;rspec&quot;, &quot;sass&quot;, &quot;settingslogic&quot;'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2190074031188780855</id><published>2011-11-13T10:13:00.000-08:00</published><updated>2011-11-13T10:15:39.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>Unix: change password one line</title><content type='html'>&lt;script src="https://gist.github.com/1362431.js"&gt; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2190074031188780855?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2190074031188780855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/unix-change-password-one-line.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2190074031188780855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2190074031188780855'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/unix-change-password-one-line.html' title='Unix: change password one line'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-1157335240429740494</id><published>2011-11-13T10:00:00.001-08:00</published><updated>2011-11-13T10:02:41.139-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='expect'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>How to change the user password without re-typing the passowrd</title><content type='html'>You can use the following script to change the user password as root without having to re-type the password:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1362404.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I found this script helpful when called via ssh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-1157335240429740494?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/1157335240429740494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/how-to-change-user-password-without-re.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1157335240429740494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1157335240429740494'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/how-to-change-user-password-without-re.html' title='How to change the user password without re-typing the passowrd'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-1689328309798062979</id><published>2011-11-11T02:27:00.001-08:00</published><updated>2011-11-11T02:29:05.442-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Catch all exceptions in your Ruby program</title><content type='html'>Just put your code between begin and rescue statements and print the error. An example:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ree-1.8.7-head :010 &amp;gt; begin&lt;br /&gt;ree-1.8.7-head :011 &amp;gt;     Testing.new&lt;br /&gt;ree-1.8.7-head :012?&amp;gt;   rescue Exception =&amp;gt; msg&lt;br /&gt;ree-1.8.7-head :013?&amp;gt;      puts "Something went wrong ("+msg+")"&lt;br /&gt;ree-1.8.7-head :014?&amp;gt;   end&lt;br /&gt;Something went wrong (uninitialized constant Testing)&lt;br /&gt;=&amp;gt; nil&lt;br /&gt;&lt;br /&gt;You  can boot your application between begin and rescue and you will be able  to print the error, perform an action, send an email in the rescue  begin section:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;begin&lt;br /&gt; MyApp.run!&lt;br /&gt;rescue Exception =&amp;gt; msg&lt;br /&gt; puts "Something went wrong ("+msg+")"&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-1689328309798062979?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/1689328309798062979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/catch-all-exceptions-in-your-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1689328309798062979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1689328309798062979'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/11/catch-all-exceptions-in-your-ruby.html' title='Catch all exceptions in your Ruby program'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4670908726657582845</id><published>2011-08-12T03:35:00.000-07:00</published><updated>2011-08-12T03:40:45.414-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='DBA'/><title type='text'>List MySql database size with a query</title><content type='html'>The query:&lt;br /&gt;&lt;br /&gt;SELECT table_schema "Data Base Name",&lt;br /&gt; sum( data_length + index_length ) / 1024 /&lt;br /&gt;1024 "Data Base Size in MB",&lt;br /&gt; sum( data_free )/ 1024 / 1024 "Free Space in  MB"&lt;br /&gt;FROM information_schema.TABLES&lt;br /&gt;GROUP BY table_schema ;&lt;br /&gt;&lt;br /&gt;The mysql console:&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; SELECT table_schema "Data Base Name",&lt;br /&gt;    -&amp;gt; sum( data_length + index_length ) / 1024 /&lt;br /&gt;    -&amp;gt; 1024 "Data Base Size in MB",&lt;br /&gt;    -&amp;gt; sum( data_free )/ 1024 / 1024 "Free Space in MB"&lt;br /&gt;    -&amp;gt; FROM information_schema.TABLES&lt;br /&gt;    -&amp;gt; GROUP BY table_schema ;&lt;br /&gt;+--------------------+----------------------+------------------+&lt;br /&gt;| Data Base Name     | Data Base Size in MB | Free Space in MB |&lt;br /&gt;+--------------------+----------------------+------------------+&lt;br /&gt;| information_schema |           0.00878906 |       0.00000000 |&lt;br /&gt;| mysql              |           0.61361027 |       0.00000000 |&lt;br /&gt;| performance_schema |           0.00000000 |       0.00000000 |&lt;br /&gt;| test               |           0.01562500 |      10.00000000 |&lt;br /&gt;+--------------------+----------------------+------------------+&lt;br /&gt;4 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4670908726657582845?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4670908726657582845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/08/list-mysql-database-size-with-query.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4670908726657582845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4670908726657582845'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/08/list-mysql-database-size-with-query.html' title='List MySql database size with a query'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7571913531666905140</id><published>2011-08-12T01:33:00.000-07:00</published><updated>2011-08-14T05:10:31.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Install MySql generic binary on Linux</title><content type='html'>I want to have the latest GA version of MySql, the 5.5.x instead of the old 5.1 release. 5.5.x has many performance improvements, from x2 to x8, according to an article of &lt;a href="http://datacharmer.blogspot.com/"&gt;Guiseppe Maxia&lt;/a&gt;, a MySql expert. Go to the &lt;a href="http://www.mysql.com/downloads/mirror.php?id=403422#mirrors"&gt;download page&lt;/a&gt; and get the tar gizipped binary version of Mysql. I downloaded this one:&lt;br /&gt;&lt;br /&gt;# apt-get install libaio1&lt;br /&gt;# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.15-linux2.6-x86_64.tar.gz/from/http://mysql.mirrors.ovh.net/ftp.mysql.com/&lt;br /&gt;# mv index.html mysql.tar.gz&lt;br /&gt;# tar xzfv mysql.tar.gz&lt;br /&gt;# mv mysql-5.5.15-linux2.6-x86_64/ mysql-5.5.15&lt;br /&gt;# mv mysql-5.5.15/ /usr/local/&lt;br /&gt;# cd /usr/local/&lt;br /&gt;# ln -s mysql-5.5.15/ mysql&lt;br /&gt;# cd mysql&lt;br /&gt;# chown -R mysql .&lt;br /&gt;# chgrp -R mysql .&lt;br /&gt;# scripts/mysql_install_db --user=mysql&lt;br /&gt;# cp support-files/mysql.server /etc/init.d/mysql.server&lt;br /&gt;# cp support-files/my-medium.cnf /etc/my.cnf&lt;br /&gt;# chmod +x /etc/init.d/mysql.server&lt;br /&gt;# update-rc.d mysql.server defaults&lt;br /&gt;# /etc/init.d/mysql.server start&lt;br /&gt;Starting MySQL.. *&lt;br /&gt;# /etc/init.d/mysql.server restart&lt;br /&gt;# bin/mysql -uroot&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; use mysql;&lt;br /&gt;Reading table information for completion of table and column names&lt;br /&gt;You can turn off this feature to get a quicker startup with -A&lt;br /&gt;&lt;br /&gt;Database changed&lt;br /&gt;mysql&amp;gt; update user set password=PASSWORD("your_passwd") where user='root';&lt;br /&gt;Query OK, 4 rows affected (0.00 sec)&lt;br /&gt;Rows matched: 4  Changed: 4  Warnings: 0&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; flush privileges;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; exit&lt;br /&gt;Bye&lt;br /&gt;&lt;br /&gt;Done! Simple isn't it?&lt;br /&gt;&lt;br /&gt;Reference: &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/binary-installation.html"&gt;http://dev.mysql.com/doc/refman/5.5/en/binary-installation.html&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7571913531666905140?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7571913531666905140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/08/install-mysql-generic-binary-on-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7571913531666905140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7571913531666905140'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/08/install-mysql-generic-binary-on-linux.html' title='Install MySql generic binary on Linux'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4299645940573284089</id><published>2011-08-05T05:22:00.000-07:00</published><updated>2011-12-29T01:33:19.798-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='devops'/><title type='text'>conman: automate your server configuration</title><content type='html'>Probably you already know about &lt;a href="http://www.puppetlabs.com/"&gt;Puppet&lt;/a&gt; and &lt;a href="http://wiki.opscode.com/display/chef"&gt;Chef&lt;/a&gt; and probably you felt overwhelmed when learning one of the the two server configuration management. I want to show you &lt;a href="https://github.com/moocode/conman"&gt;conman&lt;/a&gt; a simpler and easier approach then Puppet and Chef. Of course it has very basic features but it could be easily extended. So install conman:&lt;br /&gt;&lt;br /&gt;gem install conman&lt;br /&gt;&lt;br /&gt;conman has ingredients and recipes. Recipes contains ingredients. An &lt;a href="https://github.com/moocode/conman/blob/master/lib/conman/ingredient.rb"&gt;ingredient is a class&lt;/a&gt; extending the Ingredient class having methods with commands. Here you can see and example of a class which can install or remove the apache2 package:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Apache2Ingredient &amp;lt; Ingredient&lt;br /&gt;   def install&lt;br /&gt;       `sudo apt-get install apache2`&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def remove&lt;br /&gt;   `sudo apt-get remove apache2`&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The you can include you new ingredient in your recipe:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MyRecipe &amp;lt; Recipe&lt;br /&gt;     apache2 :install&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;apache2 method search and load the Apache2Ingredient, then calls the install method. Simple!&lt;br /&gt;&lt;br /&gt;You can run the recipe using the command line:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;conman -i /path/to/ingredients /path/to/recipes/my_recipe.rb&lt;br /&gt;&lt;br /&gt;or using Ruby:&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;Conman.init :ingredients =&amp;gt; '/path/to/ingredients/' Conman.run '/path/to/recipes/my_recipe.rb'&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;conman does not know about packages, apt-get, rpm... but I think it can be easily implemented. Another important thing that is missing is the possibility to run remotely the recipes; a SSH session using a Ruby library could do the trick (execute the command remotely).&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="https://github.com/moocode/conman"&gt;https://github.com/moocode/conman&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4299645940573284089?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4299645940573284089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/08/conman-automate-your-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4299645940573284089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4299645940573284089'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/08/conman-automate-your-server.html' title='conman: automate your server configuration'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7212520478226991425</id><published>2011-01-31T02:39:00.000-08:00</published><updated>2011-01-31T02:46:43.461-08:00</updated><title type='text'>Life is, in fact, a battle</title><content type='html'>"Life is, in fact, a battle. Evil is insolent and strong: beauty enchanting but rare; good very apt to be weak; folly very apt to be defiant; wickedness to carry the day; imbeciles to be in great places, people of sense in small, and mankind generally unhappy.&lt;br /&gt;&lt;br /&gt;But the world as it stands is no illusion, no phantasm, no evil dream of a night; we wake up to it again for ever and ever; we can neither forget it nor deny it nor dispense with it."&lt;br /&gt;&lt;br /&gt;I do not remember who wrote it, but I fully subscribe to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7212520478226991425?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7212520478226991425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2011/01/life-is-in-fact-battle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7212520478226991425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7212520478226991425'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2011/01/life-is-in-fact-battle.html' title='Life is, in fact, a battle'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-1636076375858337412</id><published>2010-11-30T13:36:00.000-08:00</published><updated>2010-11-30T13:36:07.518-08:00</updated><title type='text'>Bettermeans Introduction</title><content type='html'>&lt;iframe width="480" height="295" src="http://www.youtube.com/embed/MAlnMWlvw9g?fs=1" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-1636076375858337412?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/1636076375858337412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/11/bettermeans-introduction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1636076375858337412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1636076375858337412'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/11/bettermeans-introduction.html' title='Bettermeans Introduction'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/MAlnMWlvw9g/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-504813487639716321</id><published>2010-11-20T12:10:00.000-08:00</published><updated>2010-11-20T12:24:07.347-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>Test unique values in Rails model with Rspec</title><content type='html'>I wanted to test 'validates_uniqueness_of' for this model:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class CourseItem &lt; ActiveRecord::Base&lt;br /&gt;  validates_presence_of :course_id, :day, :url&lt;br /&gt;  validates_uniqueness_of :course_id, :scope =&gt; :day, &lt;br /&gt;                          :message =&gt; "- this day has been already created."&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I tried to create two objects with the same value and I was getting the validetion error when creating the second value, the spec was failing and I did not know you to test it. There is a custom matcher to test the uniqueness of fields and it is available with a &lt;a href="https://github.com/bogdan/accept_values_for"&gt;gem&lt;/a&gt; developed by &lt;a href="http://gusiev.com/about-me/"&gt;Bogdan Gusiev&lt;/a&gt;. This blog post will help you to get started: &lt;a href="http://gusiev.com/2010/06/ultimate-rspec-matcher-to-test-validation/"&gt;http://gusiev.com/2010/06/ultimate-rspec-matcher-to-test-validation/&lt;/a&gt;. That gem has other useful matchers too.&lt;br /&gt;&lt;br /&gt;I checked that model with the following code:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/708121.js?file=gistfile1.txt"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-504813487639716321?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/504813487639716321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/11/test-unique-values-in-rails-model-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/504813487639716321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/504813487639716321'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/11/test-unique-values-in-rails-model-with.html' title='Test unique values in Rails model with Rspec'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8329426832936245669</id><published>2010-09-24T23:28:00.000-07:00</published><updated>2010-09-25T02:26:57.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Install pg gem with PostgreSql 9.0 on Leopard</title><content type='html'>Download the installer from: &lt;a href="http://www.enterprisedb.com/products/pgdownload.do#osx"&gt;http://www.enterprisedb.com/products/pgdownload.do#osx&lt;/a&gt;.&lt;br /&gt;Install PostgreSQL, insert your password and you will have pgAdmin and other tools in your Applications directory.&lt;br /&gt;&lt;br /&gt;If you will try to install the pg gem now you will get a compile error. You need to define the architecture of PostgreSQL and its bin directory:&lt;br /&gt;&lt;br /&gt;sudo -s&lt;br /&gt;export ARCHFLAGS='-arch x86_64'&lt;br /&gt;export PATH=/Library/PostgreSQL/9.0/bin:${PATH}&lt;br /&gt;gem install pg&lt;br /&gt;&lt;br /&gt;This is the output I get:&lt;br /&gt;&lt;br /&gt;bash-3.2# gem install pg&lt;br /&gt;Building native extensions.  This could take a while...&lt;br /&gt;Successfully installed pg-0.9.0&lt;br /&gt;1 gem installed&lt;br /&gt;Installing ri documentation for pg-0.9.0...&lt;br /&gt;Installing RDoc documentation for pg-0.9.0...&lt;br /&gt;bash-3.2#&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8329426832936245669?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8329426832936245669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/09/install-pg-gem-with-postgresql-90-on.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8329426832936245669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8329426832936245669'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/09/install-pg-gem-with-postgresql-90-on.html' title='Install pg gem with PostgreSql 9.0 on Leopard'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2093775763269627932</id><published>2010-09-24T07:25:00.000-07:00</published><updated>2010-09-24T07:31:29.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>auto_complete plugin on Rails 3 not working</title><content type='html'>If you are migrating your Rails app and auto_complete is not working, the reason is auto_complete does not remove the default escaping in Rails 3. A &lt;a href="http://github.com/marklazz"&gt;guy&lt;/a&gt; has fixed this problem. You just need to put his &lt;a href="http://github.com/marklazz/auto_complete"&gt;version&lt;/a&gt; in the place of the old plugin:&lt;br /&gt;&lt;br /&gt;rails plugin install --force http://github.com/marklazz/auto_complete.git&lt;br /&gt;&lt;br /&gt;Thanks &lt;a href="http://github.com/marklazz"&gt;marklazz&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2093775763269627932?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2093775763269627932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/09/autocomplete-plugin-on-rails-3-not.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2093775763269627932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2093775763269627932'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/09/autocomplete-plugin-on-rails-3-not.html' title='auto_complete plugin on Rails 3 not working'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7673786005776834519</id><published>2010-09-09T12:19:00.000-07:00</published><updated>2010-09-09T12:23:45.032-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vi'/><title type='text'>Is vi an UFO?</title><content type='html'>In a &lt;a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/34113a9a2717f2a1"&gt;thread of Rails Talk&lt;/a&gt; I found a discussion about a good text editor, nothing new, but I want to cite this guy, he is very funny: &lt;blockquote&gt;the problem with vim is that people always say is so powerful but when i try&lt;br /&gt;to use it is like im looking at the sky waiting to see a UFO to pass by but&lt;br /&gt;nothing happens&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7673786005776834519?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7673786005776834519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/09/is-vi-ufo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7673786005776834519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7673786005776834519'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/09/is-vi-ufo.html' title='Is vi an UFO?'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2735580408515258403</id><published>2010-08-24T01:33:00.000-07:00</published><updated>2010-08-24T01:46:40.455-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>VNC viewer on Snow Leopard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qfh6a6uZa-8/THOG4kv-MbI/AAAAAAAAA-c/C2EQjUHtBFg/s1600/Screen+shot+2010-08-24+at+09.50.35.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 111px;" src="http://2.bp.blogspot.com/_qfh6a6uZa-8/THOG4kv-MbI/AAAAAAAAA-c/C2EQjUHtBFg/s320/Screen+shot+2010-08-24+at+09.50.35.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5508895075699929522" /&gt;&lt;/a&gt;&lt;br /&gt;If you need to connect to a VNC server with your Mac, you do not need to download and install a VNC client. Snow Leopard has and application in '/System/Library/CoreServices/Screen Sharing'. Just click 'Screen Sharing' and you will be prompted to enter an IP or host name of the server. It works much better than &lt;a href="http://sourceforge.net/projects/cotvnc/"&gt;Chicken of the VNC&lt;/a&gt;. Screen Sharing is also compatible with Apple Remote Desktop (ARD) v2.1 or later.&lt;br /&gt;&lt;br /&gt;Mac OS X 10.5 has this application too (Snow Leopard is 10.6).&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;br /&gt;Mac OS X 10.6 Help - &lt;a href="http://docs.info.apple.com/article.html?path=Mac/10.6/en/14066.html"&gt;About screen sharing&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2735580408515258403?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2735580408515258403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/vnc-viewer-on-snow-leopard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2735580408515258403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2735580408515258403'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/vnc-viewer-on-snow-leopard.html' title='VNC viewer on Snow Leopard'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qfh6a6uZa-8/THOG4kv-MbI/AAAAAAAAA-c/C2EQjUHtBFg/s72-c/Screen+shot+2010-08-24+at+09.50.35.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8321398854942366189</id><published>2010-08-13T08:31:00.000-07:00</published><updated>2010-08-13T08:56:45.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveRecord'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>When ActiveRecord does not find a record</title><content type='html'>In Rails, when ActiveRecord does not find a record with the specified ID raises and exception. A good way to control this exception is to intercept it and respond with an appropriate HTTP status code, in this case a 404. This is a simple example:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/523101.js?file=gistfile1.txt"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8321398854942366189?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8321398854942366189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/when-activerecord-does-not-find-record.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8321398854942366189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8321398854942366189'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/when-activerecord-does-not-find-record.html' title='When ActiveRecord does not find a record'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2547243172344059664</id><published>2010-08-11T04:23:00.000-07:00</published><updated>2010-08-11T05:04:22.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Capistrano'/><title type='text'>Execute Rails migrations on producion server with Capistrano</title><content type='html'>If you cannot access, from your development computer, the production database (because of corporate policies and/or security settings), you can add a command to &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt; when you deploy your application.&lt;br /&gt;&lt;br /&gt;After copying the files and coping database.yml, you can run easily a migration on the production server in this way:&lt;br /&gt;&lt;br /&gt;run "cd /rails_dir/#{application}/current/ &amp;amp;&amp;amp; rake db:migrate RAILS_ENV=production"&lt;br /&gt;&lt;br /&gt;That command goes into the root of your Rails application and execute the migration specifying production as environment.&lt;br /&gt;&lt;br /&gt;After that command you can change the symlink and switch to the newly deployed application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2547243172344059664?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2547243172344059664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/execute-rails-migration-on-producion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2547243172344059664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2547243172344059664'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/execute-rails-migration-on-producion.html' title='Execute Rails migrations on producion server with Capistrano'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7621321919282075798</id><published>2010-08-06T13:32:00.000-07:00</published><updated>2010-08-06T14:36:52.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Installing Erlang on Mac OS X</title><content type='html'>mkdir erlang&lt;br /&gt;cd erlang/&lt;br /&gt;wget http://www.erlang.org/download/otp_src_R14A.tar.gz&lt;br /&gt;tar xz otp_src_R14A.tar.gz&lt;br /&gt;cd otp_src_R14A&lt;br /&gt;./configure --enable-hipe --enable-smp-support --enable-threads&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ../..&lt;br /&gt;rm -rf erlang&lt;br /&gt;&lt;br /&gt;Start the Erlang console:&lt;br /&gt;&lt;br /&gt;erl&lt;br /&gt;&lt;br /&gt;If you do not have wget, you can install it with Darwin Ports:&lt;br /&gt;&lt;br /&gt;sudo port install wget&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7621321919282075798?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7621321919282075798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/how-to-install-erlang-on-mac-osx-snow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7621321919282075798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7621321919282075798'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/how-to-install-erlang-on-mac-osx-snow.html' title='Installing Erlang on Mac OS X'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4413388379028373683</id><published>2010-08-02T13:38:00.000-07:00</published><updated>2010-08-02T13:44:40.871-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>Kitty - a funny gem</title><content type='html'>I found a new &lt;a href="http://cdn.rubypulse.com/normal/rubypulse_ep0.43_kitty.mov"&gt;screencast on Rubypulse&lt;/a&gt; about a gem named kitty. If you install the gem, then you will have a kitty command that will print a random ASCII-art cat. For instance:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/505280.js?file=kitty_output.txt"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4413388379028373683?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4413388379028373683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/kitty-funny-gem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4413388379028373683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4413388379028373683'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/08/kitty-funny-gem.html' title='Kitty - a funny gem'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7946203353961325909</id><published>2010-07-27T09:13:00.000-07:00</published><updated>2010-07-27T09:26:23.029-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shoulda'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>How to test a redirect with Shoulda</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;I was trying to test if the controller was redirecting but I was getting a 200 (success) instead of 302. With a standard Unit::Test it was working ok. Then, by printing the response body I so that with Shoulda I was getting a 200 with the text:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/492457.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;So I decided to test if the response was a link (a tag) with redirected as text of the link:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;assert_select "a", "redirected"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This is the code showing the same test, one with Unit::Test, the other with Shoulda:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/492436.js"&gt; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7946203353961325909?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7946203353961325909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/07/how-to-test-redirect-with-shoulda.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7946203353961325909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7946203353961325909'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/07/how-to-test-redirect-with-shoulda.html' title='How to test a redirect with Shoulda'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3319011794950114256</id><published>2010-05-20T23:45:00.000-07:00</published><updated>2010-05-21T00:03:56.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>How to lock Mac OS X screen</title><content type='html'>Go in applictions -&gt; utilities and open 'Keychain Access'. In preferences check 'Show status in menu bar', then you will see a black padlock in the right of the task bar. To lock your screen you only need to click the padclock and select 'Lock Screen'. To lock require a password when your screen saver starts, go in 'System Preferences' -&gt; 'Security', than check 'Require password to wake this computer from sleep or screensaver'. In Snow Leopard you can set the time when the screen will be blocked after the start of the screensaver.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In Mac OS X, how do I password-protect my computer?  - &lt;a href="http://kb.iu.edu/data/ajqx.html"&gt;http://kb.iu.edu/data/ajqx.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;OS X Tip: Lock That Screen - &lt;a href="http://www.whatdoiknow.org/archives/000957.shtml"&gt;http://www.whatdoiknow.org/archives/000957.shtml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Add a screen locking icon to the menubar Desktop - &lt;a href="http://www.macosxhints.com/article.php?story=20020901073230521"&gt;http://www.macosxhints.com/article.php?story=20020901073230521&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3319011794950114256?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3319011794950114256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/05/how-to-lock-mac-os-x-screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3319011794950114256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3319011794950114256'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/05/how-to-lock-mac-os-x-screen.html' title='How to lock Mac OS X screen'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2663422637739667090</id><published>2010-05-16T11:19:00.000-07:00</published><updated>2010-05-16T11:48:48.055-07:00</updated><title type='text'>Install RMagic on Mac</title><content type='html'>This post documents the installation of RMagick on Snow Leopard. You need &lt;a href="http://trac.macports.org/wiki/InstallingMacPorts"&gt;MacPorts installed&lt;/a&gt;. Install &lt;a href="http://www.imagemagick.org/script/index.php"&gt;imagemagick library&lt;/a&gt; using MacPorts (have a cup of tea or coffe):&lt;br /&gt;&lt;br /&gt;sudo port install tiff -macosx imagemagick +q8 +gs +wmf&lt;br /&gt;&lt;br /&gt;Install rmagick gem (use sudo if you do not use rvm):&lt;br /&gt;&lt;br /&gt;gem install rmagick&lt;br /&gt;&lt;br /&gt;Now you should test if Ruby can use &lt;a href="http://www.imagemagick.org/script/index.php"&gt;imagemagick&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;irb -rubygems -r RMagick&lt;br /&gt;ree-1.8.7-2010.01 &gt; puts Magick::Long_version&lt;br /&gt;This is RMagick 2.13.1 ($Date: 2009/12/20 02:33:33 $) Copyright (C) 2009 by Timothy P. Hunter&lt;br /&gt;Built with ImageMagick 6.6.1-5 2010-05-16 Q8 http://www.imagemagick.org&lt;br /&gt;Built for ruby 1.8.7&lt;br /&gt;Web page: http://rmagick.rubyforge.org&lt;br /&gt;Email: rmagick@rubyforge.org&lt;br /&gt;=&gt; nil&lt;br /&gt;ree-1.8.7-2010.01 &gt;&lt;br /&gt;&lt;br /&gt;Done!&lt;br /&gt;&lt;br /&gt;Thanks to: http://rmagick.rubyforge.org/install-osx.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2663422637739667090?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2663422637739667090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/05/install-rmagic-on-mac.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2663422637739667090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2663422637739667090'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/05/install-rmagic-on-mac.html' title='Install RMagic on Mac'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-9153217788516744271</id><published>2010-04-21T08:35:00.000-07:00</published><updated>2010-04-21T08:37:45.710-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>How to detect browser type and version in PHP</title><content type='html'>You can use a simple class provided here: &lt;a href="http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php/"&gt;http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A simple exmple:&lt;br /&gt;&lt;br /&gt;            if( $browser-&gt;getBrowser() == Browser::BROWSER_IE &amp;amp;&amp;amp; $browser-&gt;getVersion() == 6 ) {&lt;br /&gt;                //do nothing&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;               // ok show something for non IE6 users&lt;br /&gt;            }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-9153217788516744271?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/9153217788516744271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/how-to-detect-browser-type-and-version.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/9153217788516744271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/9153217788516744271'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/how-to-detect-browser-type-and-version.html' title='How to detect browser type and version in PHP'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4079528290542544741</id><published>2010-04-16T10:02:00.000-07:00</published><updated>2010-04-16T10:09:17.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><title type='text'>Scooter Framework</title><content type='html'>After reading an &lt;a href="http://www.infoq.com/news/2010/04/scooter-10"&gt;article on InfoQ&lt;/a&gt;, I leant that the new &lt;a href="http://www.scooterframework.com/"&gt;Scooter Framework&lt;/a&gt; for J2EE is inspired by Ruby on Rails. The resemblance to Rails is incredible and it is very simple too! In am sure that it will become very popular.&lt;br /&gt;&lt;br /&gt;I suggest you watch the Hello World screencast:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cm2MfAoMbZA&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/cm2MfAoMbZA&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Then the &lt;a href="http://www.scooterframework.com/docs/twitterdemo.html"&gt;Twitter example&lt;/a&gt; shows you how the delopment works. There is an easy testing framework, but the the controllers cannot be tested yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4079528290542544741?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4079528290542544741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/scooter-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4079528290542544741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4079528290542544741'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/scooter-framework.html' title='Scooter Framework'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5173753944739461404</id><published>2010-04-16T09:37:00.000-07:00</published><updated>2010-04-16T09:53:32.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><title type='text'>Date and time functions in MySQL</title><content type='html'>MySQL has many date and time functions to manipulate and compare dates and time, the &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html"&gt;reference documentation form 5.1 version&lt;/a&gt;. If you want to add a day to a datetime or date field:&lt;br /&gt;&lt;br /&gt;SELECT now(), now() + INTERVAL 10 DAY;&lt;br /&gt;&lt;br /&gt;If you run the query above you will see the current date and the current date plus ten days. You can add or subtract even hours, second and more.&lt;br /&gt;&lt;br /&gt;       SELECT *&lt;br /&gt;                    FROM article&lt;br /&gt;                    WHERE approved=1&lt;br /&gt;                    AND (&lt;br /&gt;                        (birth &lt;&gt; now( ))&lt;br /&gt;                        OR (news=1 OR never_expires=1)&lt;br /&gt;                    )&lt;br /&gt;&lt;br /&gt;The example above shows a query which loads the articles between the bith and now and between now and the expiry (death) date. If hte article is a news or should not expire, the date comparison is not taken into consideration.&lt;br /&gt;&lt;br /&gt;If you want the current time:&lt;br /&gt;&lt;br /&gt;SELECT CURTIME();&lt;br /&gt;&lt;br /&gt;If you want to get the day of a date:&lt;br /&gt;&lt;br /&gt;SELECT DAY('2009-12-15');&lt;br /&gt;&lt;br /&gt;If you want the difference, in days, between two dates:&lt;br /&gt;&lt;br /&gt;SELECT DATEDIFF('2007-12-30 23:59:59','2007-12-20');&lt;br /&gt;&lt;br /&gt;The result is 10 because MyQSL subtract the second value from the first. The documentation is quite clear and complete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5173753944739461404?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5173753944739461404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/date-and-time-functions-in-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5173753944739461404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5173753944739461404'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/date-and-time-functions-in-mysql.html' title='Date and time functions in MySQL'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4049940406924570867</id><published>2010-04-12T10:10:00.000-07:00</published><updated>2010-04-12T10:13:38.544-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Find duplicate fields in SQL</title><content type='html'>Let's say that you have a table named users, where you keep your application users. If you has forgotten to set the username field as unique and you have some duplicate fields, you can use the following query:&lt;br /&gt;&lt;br /&gt;SELECT username, COUNT(*)&lt;br /&gt;FROM users&lt;br /&gt;GROUP BY username&lt;br /&gt;HAVING COUNT(*) &gt; 1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4049940406924570867?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4049940406924570867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/find-duplicate-fields-in-sql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4049940406924570867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4049940406924570867'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/04/find-duplicate-fields-in-sql.html' title='Find duplicate fields in SQL'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2124629174151975908</id><published>2010-03-12T06:46:00.001-08:00</published><updated>2010-03-12T07:32:21.650-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><title type='text'>Case sensitive MySql search</title><content type='html'>If you want to make a table case sensitive or you just discovered that you are searching some text and the result comprises only a result matching only case sensitive pattern, here is an explanation that might help you.&lt;br /&gt;&lt;br /&gt;The key point is collation. Collations names ending in _ci are case insensitive. Collections ending with _cs and _bin are case sensitive. You can change a collection of a table with the following query:&lt;br /&gt;&lt;br /&gt;ALTER TABLE table_name COLLATE collation_name&lt;br /&gt;&lt;br /&gt;It is possible to make a single column case sensitive:&lt;br /&gt;&lt;br /&gt;`title` varchar(50) collate utf8_bin&lt;br /&gt;&lt;br /&gt;That row has been taken from a CREATE TABLE statement. With that 'collate utf8_bin' text in you table definition, your serach will be case sensitive!&lt;br /&gt;&lt;br /&gt;Userful links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mysqldatabaseadministration.blogspot.com/2006/09/case-sensitive-mysql.html"&gt;Farhan Mushraqi blog&lt;/a&gt; - Case sensitive SQL&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2124629174151975908?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2124629174151975908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/03/case-sensitive-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2124629174151975908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2124629174151975908'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/03/case-sensitive-mysql.html' title='Case sensitive MySql search'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5671152718387673916</id><published>2010-02-14T05:46:00.000-08:00</published><updated>2010-02-14T06:34:50.438-08:00</updated><title type='text'>Learning C on Youtube</title><content type='html'>I am using more and more Youtube to learn new things. Math, computer science and C programming. I started to learn C many years ago with a book about programming C with Visual C/C++ 4. Then I had a course with the Open University on &lt;a href="http://ict.open.ac.uk/courses/t223/index.html"&gt;computer architecture&lt;/a&gt; and I learnt a bit of assembly an C. I have a very strong passion for C, since it has been using to program the Unix OS and many other fundamental softwares and it is still used, although most of the time, Java is preferred, but if you want to do system programming on Unix, C is just in the right place. I want to share this Youtube video, is about C programming, but the most interesting thing is that Unicom channel has produced many other C/C++ videos, so check that channel for more videos.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/m6hB9CvHl24&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/m6hB9CvHl24&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;However I have ordered two books. &lt;a href="http://www.iu.hio.no/%7Emark/unix/unix_toc.html"&gt;'The unix programming environment'&lt;/a&gt; is one of the most important books about Unix. It is written by one of the creators of Unix and has relevant information about C programming in a Unix environment. The other book is The C book: &lt;a href="http://www.amazon.co.uk/C-Programming-Language-2nd/dp/0131103628"&gt;The C Programming Language (2nd Edition)&lt;/a&gt;, by &lt;a href="http://www.amazon.co.uk/exec/obidos/search-handle-url?_encoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books-uk&amp;amp;field-author=Brian%20W.%20Kernighan"&gt;Brian W. Kernighan&lt;/a&gt; (Author), &lt;a href="http://www.amazon.co.uk/exec/obidos/search-handle-url?_encoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books-uk&amp;amp;field-author=Dennis%20Ritchie"&gt;Dennis Ritchie&lt;/a&gt; (creators of the language).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5671152718387673916?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5671152718387673916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/02/learning-c-on-youtube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5671152718387673916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5671152718387673916'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/02/learning-c-on-youtube.html' title='Learning C on Youtube'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2329966978116034508</id><published>2010-01-26T08:21:00.000-08:00</published><updated>2010-08-06T10:12:23.507-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='watir'/><title type='text'>Watir on Rails</title><content type='html'>&lt;a href="http://watir.com/"&gt;Watir&lt;/a&gt; is a tool for user acceptance testing and in general can be used to control a browser to do automated task. Since I am using the standard Rails's testing framework, and I run my tests with &lt;span style="font-style: italic;"&gt;rake test&lt;/span&gt;, I thought why not to use watir test in a similar way. There is a plugin, Watir on Rails, that integrates Ruby on Rails with Waitr. You only need to run &lt;span style="font-style: italic;"&gt;rake test:watir&lt;/span&gt; to test your application with rake. The test can be written in a similar way of the other Rails' tests. For instance:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/286963.js?file=pickaxe_book_googgle_search_test.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;How to use the example:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;gem install watir # install watir&lt;/li&gt;&lt;li&gt;script/plugin install git://github.com/chip/watir-on-rails.git&lt;/li&gt;&lt;li&gt;put the file in test/watir or script/generate watir SuccessfulLogin to generate a test&lt;/li&gt;&lt;li&gt;run: rake test:watir&lt;/li&gt;&lt;li&gt;watch the browser doing your job ;-)&lt;/li&gt;&lt;li&gt;Start learning from the cheat sheet:http://wiki.openqa.org/display/WTR/Ruby+Cheat+Sheet&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Watir need your web server on, if you are testing a local application, so you should run:&lt;br /&gt;&lt;br /&gt;mongrel_rails start -e test # if you are using mongrel&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://watir-on-rails.rubyforge.org/"&gt;Watir on Rails&lt;/a&gt; - Watir on Rails web page&lt;br /&gt;&lt;a href="http://watir.com/"&gt;&lt;/a&gt;&lt;a href="http://github.com/chip/watir-on-rails"&gt;Watir on Rails at Github&lt;/a&gt;&lt;br /&gt;&lt;a href="http://watir.com/"&gt;Watir&lt;/a&gt; - the official web site&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2329966978116034508?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2329966978116034508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/watir-on-rails.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2329966978116034508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2329966978116034508'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/watir-on-rails.html' title='Watir on Rails'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5674666277399767213</id><published>2010-01-20T09:25:00.000-08:00</published><updated>2011-01-11T09:35:03.001-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Capistrano'/><title type='text'>Rails deployment with Capistrano and SVN</title><content type='html'>I spent one day and half trying to deploy my first &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; application with &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt;. Where I work, we use &lt;a href="http://subversion.tigris.org/"&gt;SVN&lt;/a&gt; as &lt;a href="http://en.wikipedia.org/wiki/Revision_control"&gt;SCM&lt;/a&gt;. My PC runs Windows XP and the production server is Solaris 10. The server uses Apache, MySql and &lt;a href="http://www.modrails.com/"&gt;Passenger&lt;/a&gt;, aka mod_rails. I have used this recipe:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span&gt;set :application, "apps"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :user, 'my_username'&lt;/span&gt;&lt;br /&gt;&lt;span&gt;#default_run_options[:pty] = true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :domain,      "solaris10.ds.domain.com"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :repository,  "https://svn.domain.co.uk/svn/apps"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :local_scm_command, "C:/applications/svn/svn"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :scm_command, "/usr/local/bin/svn"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :use_sudo,    false&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :deploy_to,   "/sites/rails-data/#{application}"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;set :database_conf, "/sites/rails-data/database_conf"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;role :app, domain&lt;/span&gt;&lt;br /&gt;&lt;span&gt;role :web, domain&lt;/span&gt;&lt;br /&gt;&lt;span&gt;role :db, domain, :primary =&gt; true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;namespace :deploy do&lt;/span&gt;&lt;br /&gt;&lt;span&gt; task :start, :roles =&gt; :app do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    run "touch #{current_release}/tmp/restart.txt"&lt;/span&gt;&lt;br /&gt;&lt;span&gt; end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt; task :stop, :roles =&gt; :app do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    # Do nothing.&lt;/span&gt;&lt;br /&gt;&lt;span&gt; end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt; desc "Restart Application"&lt;/span&gt;&lt;br /&gt;&lt;span&gt; task :restart, :roles =&gt; :app do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    run "touch #{current_release}/tmp/restart.txt"&lt;/span&gt;&lt;br /&gt;&lt;span&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;desc "Echo environment vars"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;namespace :env do&lt;/span&gt;&lt;br /&gt;&lt;span&gt; task :echo do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   run "echo printing out cap info on remote server"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   run "echo $PATH"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   run "echo $LD_LIBRARY_PATH"&lt;/span&gt;&lt;br /&gt;&lt;span&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;# optional task to reconfigure databases&lt;/span&gt;&lt;br /&gt;&lt;span&gt;after "deploy:update_code" , :configure_database&lt;/span&gt;&lt;br /&gt;&lt;span&gt;desc "copy database.yml into the current release path"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;task :configure_database, :roles =&gt; :app do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;db_config = "#{database_conf}/database_#{application}.yml"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;  run "cp #{db_config} #{release_path}/config/database.yml"&lt;/span&gt;&lt;br /&gt;&lt;span&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have lost a huge amount of time trying to understand why Capistrano was not able to find the SVN client and some libraries. First tip, &lt;span style="font-weight: bold;"&gt;you must have an SVN client in your production server&lt;/span&gt;. When you run Capistrano, it connects to the production server with SSH. The main difference is that is an SSH session in non-interactive mode, so your user path is not loaded!&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Second tip, &lt;span style="font-weight: bold;"&gt;create a file in ~/.ssh name environment and add your PATH variable and your LD_LIBRARY_PATH&lt;/span&gt;, so the SVN client will be able to find the libraries that it need&lt;span&gt;s&lt;/span&gt;. Third tip, &lt;span style="font-weight: bold;"&gt;do not use the export command&lt;/span&gt; in the environment file. Fourth tip, your &lt;span style="font-weight: bold;"&gt;sshd_config&lt;/span&gt; must have:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PermitUserEnvironment yes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Without this setting sshd will not load the environment file. In my Capistrano recipe there are three new tasks added to deploy, start, restart. The new two task are used to restart Passenger, so that tasks cannot be used if you &lt;span style="text-decoration: underline;"&gt;have &lt;/span&gt;&lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt;. If you run 'cap env:echo' you will be able to see the PATH and  LD_LIBRARY_PATH used by Capistrano during the SSH session.&lt;br /&gt;&lt;br /&gt;If Capistrano is not able to set the PATH of the local and remote SVN clients you can use:&lt;br /&gt;&lt;br /&gt;set :local_scm_command, "C:/applications/svn/svn" # set local svn client path&lt;br /&gt;set :scm_command, "/usr/local/bin/svn" # set remote svn path&lt;br /&gt;&lt;br /&gt;The standard path, for svn command,  is typically /bin:/usr/bin:/usr/sbin.&lt;br /&gt;&lt;br /&gt;You should not keep your database.yml in your SCM. I keep it in a directory and I tell to Capistrano to copy this file during the deployment, otherwise the migration will fail. Now what am I missing? Well a &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Continuos Integration&lt;/a&gt; (CI) solution. Yesterday I have evaluated &lt;a href="http://cruisecontrolrb.thoughtworks.com/"&gt;CruiseControl.rb&lt;/a&gt; by &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt;. It seems very easy to install and use, but it still have not read the documentation completely and I still do not know if I can integrate CruiseControl.rb with Capistrano and if it is useful at all, but this will be another post.&lt;br /&gt;&lt;br /&gt;After many releases, the release path will start to have many versions and if we want to clean the directory, this is the command to use:&lt;br /&gt;&lt;br /&gt;cap deploy:cleanup&lt;br /&gt;&lt;br /&gt;This tasks will leave only the last five releases. If you want to set the number of releases to keep in the production server;&lt;br /&gt;&lt;br /&gt;set :keep_releases, 3 # where 3 is the number of releases&lt;br /&gt;&lt;br /&gt;I have a directory of videos, named uploads, in Rails root directory. Every relaease will move your files with the old code. So I removed uploads directory from SVN (ignore list), then I configured an additional task in deploy.rb:&lt;br /&gt;&lt;br /&gt;deploy.task :symlinks do&lt;br /&gt;run "ln -nfs #{shared_path}/uploads #{release_path}/uploads"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;This task create a symlink to the shared path of Capistrano. The shared path is there to be used by any release. With this technique you can keep your files outside your code, all you need is a symlink!&lt;br /&gt;&lt;br /&gt;I see Capistrano as a very useful tool, very flexible and it solves most of my deployment needs. Everytime I think it is time to update the production environment, I commit all the modified files with SVN, than I run 'cap deploy', enter the password to access the server and... I have my fresh code updated. Of course before updating, all the tests should be executed successfully.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;pretheory - &lt;a href="http://blog.pretheory.com/arch/2008/02/capistrano_path_and_environmen.php"&gt;Capistrano path and environment issues&lt;/a&gt;&lt;br /&gt;Capistrano - &lt;a href="http://www.capify.org/index.php/From_The_Beginning"&gt;From the Beginning&lt;/a&gt;&lt;br /&gt;The Pragmatic Bookself - &lt;a href="http://pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition"&gt;Agile Web Development with Rails, Third Edition&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5674666277399767213?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5674666277399767213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/rails-deployment-with-capistrano-and.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5674666277399767213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5674666277399767213'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/rails-deployment-with-capistrano-and.html' title='Rails deployment with Capistrano and SVN'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-600303258954033913</id><published>2010-01-16T06:52:00.000-08:00</published><updated>2010-01-16T07:02:37.932-08:00</updated><title type='text'>Qcubed/Qcodo Oracle adapter on Github</title><content type='html'>I will stop using &lt;a href="http://www.qcodo.com/"&gt;Qcodo&lt;/a&gt; and &lt;a href="http://qcu.be/"&gt;Qcubed&lt;/a&gt; as web framework and moving my current project, a corporate intranet, to &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;. However since I was the first to complete the Oracle adapter, and I have developed few applications working with Oracle (for &lt;a href="http://www.fiora.it/"&gt;Acquedotto del Fiora&lt;/a&gt;), I decided to put the adapter in a &lt;a href="http://github.com/rtacconi/Qcodo-Qcubed-Oracle-adapter"&gt;Github project&lt;/a&gt;, after fixing a serious &lt;a href="http://qcu.be/content/problem-qoracle-adapter"&gt;bug&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/rtacconi/Qcodo-Qcubed-Oracle-adapter"&gt;http://github.com/rtacconi/Qcodo-Qcubed-Oracle-adapter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qfh6a6uZa-8/S1HU7vG5-xI/AAAAAAAAA5Y/4Oeb7PogQTs/s1600-h/logov3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 45px;" src="http://3.bp.blogspot.com/_qfh6a6uZa-8/S1HU7vG5-xI/AAAAAAAAA5Y/4Oeb7PogQTs/s320/logov3.png" alt="" id="BLOGGER_PHOTO_ID_5427353148680960786" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-600303258954033913?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/600303258954033913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/qcubedqcodo-oracle-adapter-on-github.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/600303258954033913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/600303258954033913'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/qcubedqcodo-oracle-adapter-on-github.html' title='Qcubed/Qcodo Oracle adapter on Github'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qfh6a6uZa-8/S1HU7vG5-xI/AAAAAAAAA5Y/4Oeb7PogQTs/s72-c/logov3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4316849789725344007</id><published>2010-01-14T09:53:00.000-08:00</published><updated>2010-01-14T09:57:37.713-08:00</updated><title type='text'>Happy Birthday Blog!</title><content type='html'>I started this blog last year, the 5th of January 2009. So, happy bithday blog, your one year older. I hope that this blog might be interesting so someone. I am using it not only to publish articles for the Internet readers, but even for myself. I write technical things that I need to use it not every day, but sometimes. This blog has been helpful for refresh my mind on how to create a trigge on Mysql, referetial integrity and more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4316849789725344007?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4316849789725344007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/happy-birthday-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4316849789725344007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4316849789725344007'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/happy-birthday-blog.html' title='Happy Birthday Blog!'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5848431154939883536</id><published>2010-01-08T05:21:00.000-08:00</published><updated>2011-09-06T01:03:08.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Migration from Qcodo to Rails</title><content type='html'>I am re-developing an intranet in &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;. It is currently written in PHP with &lt;a href="http://www.qcodo.com/"&gt;Qcodo&lt;/a&gt; as framework. It is very new intranet, so why I should re-develop it with Rails? Well, I do not like to program with PHP anymore and I have found many problems in Qcodo and I realized that the way to develop with that framework is not the way I like it.&lt;br /&gt;&lt;br /&gt;This is a list of aspects that I do not like in PHP:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Every variable has to use the dollar character, the semicolon in the end of a statement, curly braces for blocks.&lt;/li&gt;&lt;li&gt;Namespaces in PHP 5.3 has an horrible syntax, it is similar to a DOS path (same slash).&lt;/li&gt;&lt;li&gt;PHP 5.3 has the infamous goto! Is that a way to improve a language? Crazy!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;PHP is loosely-typed, which means that converts values behind the scenes and you need to have a good knowledge of the language to understand what it might happen to your data.&lt;/li&gt;&lt;li&gt;Variables are case sensitive, functions are not. There is not a real naming convention in the primitives.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Every function must be declared with the 'function' keyword, how redundant!&lt;/li&gt;&lt;li&gt;PHP attracts  bad programmers (although there are good programmes that use PHP).&lt;/li&gt;&lt;li&gt;Many famous programs written in PHP are not really OOP, they do not use design patterns, or something to similar to a clean code, see Drupal, Joomla &amp;amp; co.&lt;/li&gt;&lt;li&gt;There are other reasons, but I want to talk about moving from PHP to Rails.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Qcodo problems are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;QFroms, the form used by Qcodo are dependent form JavaScript, without it, your web site/application will not work.&lt;/li&gt;&lt;li&gt;The JavaScript used is bugged, does not use a mainstream JS framework.&lt;/li&gt;&lt;li&gt;QForm controls, such as text boxes, select lists, sometimes loose the status, so the data have nasty Ajax errors that block the page (it becomes non-responsive).&lt;/li&gt;&lt;li&gt;Ajax error just make the QForm dead. This is not acceptable.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is an MVC framework, but you do not have a front controller, so forget to use a nice URL out of the box; you have to build a front controller by your own and use mod_rewrite.&lt;/li&gt;&lt;li&gt;It is event-driven too, which is not bad. But, you define all your controls as you do in a desktop-like application, like in VB (the first version was made in Visual Basic!). Lots of HTML is embedded in objects, you do not get the feeling of making a template but you just write just $object-&amp;gt;render(). HTML templates should have HTML or tags, as in Java, Pythons or Rails frameworks.&lt;/li&gt;&lt;li&gt;You cannot add JavaScript in your tags, because you do not has tags, but just $object-&amp;gt;render() (well you can do it but it is awkward). Instead you have to create a custom object to put your Javascript (official way to do it).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Because of the previous point, to write &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JavaScript&lt;/span&gt; in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Qcodo&lt;/span&gt; is a pain in the a...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Qcodo&lt;/span&gt; is a dead project because the creator, Mike Ho, has blocked the commits to the source code for a lot of time. Now the project is on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Github&lt;/span&gt;, but it has not changed a lot, for me it is too late and I cannot see anything positive in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;roadmap&lt;/span&gt;, if there is one.&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Qcodo&lt;/span&gt; has been forked by some guys because of the problem stated above. The fork is &lt;a href="http://qcu.be/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Qcubed&lt;/span&gt;&lt;/a&gt;. I left that community &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;becouse&lt;/span&gt; of their mentality and the ignorance of that people, of course not all of them, but most of the core developers. &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;BDD&lt;/span&gt;&lt;/a&gt; and DDD for them is something trendy, to make some bucks with consulting. They do not know the framework properly, they are not as good as Mike Ho, they are going in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;nowhere&lt;/span&gt;. &lt;a href="http://www.symfony-project.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Symfony&lt;/span&gt;&lt;/a&gt; is a much better alternative, but is still &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;PHP&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Again, there are other reasons but I want to talk about how to migrate to Rails.&lt;/li&gt;&lt;/ul&gt;In the end after evaluating Java, Groovy and Ruby, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;JRuby&lt;/span&gt;, I chose Ruby. Of course I am using the most famous framework, Rails. But how start to use Rails in a corporate intranet near to be released? I decided to write new modules with Rails and leave the rest with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;PHP&lt;/span&gt;, at least for now.&lt;br /&gt;&lt;br /&gt;I started by cleaning the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;CSS&lt;/span&gt; and HTML template. When the template was ready I have adopted the same template for Rails and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;PHP&lt;/span&gt;, so the user could not spot the difference that the intranet is using two different environments and languages. Well, before doing that I had installed &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Pushion&lt;/span&gt; Passenger and Ruby Enterprise Edition on the testing and production server (well, the server's admin installed Passenger there).&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Then&lt;/span&gt; I integrated the sessions by using the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;PHPSESSID&lt;/span&gt; cookie. The user first logs in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;PHP&lt;/span&gt; intranet, using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;LDAP&lt;/span&gt;, than I store the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;PHPSESSID&lt;/span&gt; value in the database with a corresponding email address, which is unique and it is the user name too. In the application controller (Rails) I get PHP session id (PHPSESSID) from the cookie and than I query an intranet's web service, passing the sessoin id and getting back the corresponding email address. With the email of the user I get the identifier that I need to integrate PHP with Rails, at least the user's credentials. But, why not performing a query directly to the database instead of using the web service. I already have a standalone application that use this solution, so I just cut and pasted the code, with very little modifications, otherwise I just could query the database table.&lt;br /&gt;&lt;br /&gt;The tables of the database (MySql) do not follow Rails naming conventions. The first idea was to use another database, but I realized that I could use the same database and Rails' migrations could managed everything, at least the tables used by Rails. I have found several way to use a legacy database with PHP and Rails. Here are some notes during my braindumps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;ActiveRecord's&lt;/span&gt; table_name and primary_key methods to cope with the old table names.&lt;/li&gt;&lt;li&gt;to move functionality and data from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;PHP&lt;/span&gt;-land to Rails-land, use Tim Riley's acts_as_importable &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;plugin&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Use views: CREATE VIEW departments as select &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;deptID&lt;/span&gt; as id,&lt;br /&gt;`honcho_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;userID&lt;/span&gt;` as head,&lt;br /&gt;`parent_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;deptID&lt;/span&gt;` as parent_id,&lt;br /&gt;`ordinal` as position,&lt;br /&gt;`&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;deptName&lt;/span&gt;` as name,&lt;br /&gt;`code`,&lt;br /&gt;`description`,&lt;br /&gt;`contact_us`,&lt;br /&gt;`display`&lt;br /&gt;FROM dept&lt;/li&gt;&lt;li&gt;Use a table prefix to differentiate Rails table from legacy tables: in your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;config&lt;/span&gt;/environment.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;rb&lt;/span&gt; you would add: config.active_record.table_name_prefix = 'rails_'&lt;/li&gt;&lt;li&gt;How to import a legacy data: http://openmonkey.com/articles/2009/05/importing-legacy-data-in-rails&lt;/li&gt;&lt;li&gt;How to protected legacy database access from Rails: http://github.com/jaz303/read_only_model&lt;/li&gt;&lt;/ul&gt;The above list was used by myself over the last month. It is confusing but makes sense to me. I decided to use views because is an easy way to use Rails naming conventions and helped my to refactor a little bit the database, since I have inherited it from another developer and has lots of ugly names and errors that brakes referential integrity. If you decide to prefix your Rails tables, remenber that there is a but in the testing framework and a table like this:&lt;br /&gt;&lt;br /&gt;_users&lt;br /&gt;&lt;br /&gt;will become:&lt;br /&gt;&lt;br /&gt;__users&lt;br /&gt;&lt;br /&gt;I was using an underscore as prefix, but when running 'rake test' the tables where created with two times the prefix. there is a fix for that but it is not included in new versions of Rails and it will never be, since the ticket in Trac has been closed. So I do not use and prefix, old tables use the singular notation, Rails one are plural, that is my way to separate Qcodo's tables form Rails' tables.&lt;br /&gt;&lt;br /&gt;I decided to use Rails migrations for any database change, since Rails migrations are capable to do what I want so I get the real benefit to take advantage to version my database changed. I you need to do something that Rails migrations are not capable, just use the execute command and put your SQL as argument.&lt;br /&gt;&lt;br /&gt;That's all for now but I will post other interesting things that I will discover in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5848431154939883536?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5848431154939883536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/migration-from-php-to-rails.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5848431154939883536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5848431154939883536'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/migration-from-php-to-rails.html' title='Migration from Qcodo to Rails'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7896543326170866690</id><published>2010-01-04T08:27:00.000-08:00</published><updated>2010-01-04T08:41:19.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Create MySql Trigger before deleting a field</title><content type='html'>I &lt;a href="http://stackoverflow.com/questions/1948047/trigger-before-delete-mysql"&gt;asked some help&lt;/a&gt; from StackOverFlow and I had some partial help. I have a table with departments and the table user is referencing the department table, so every user belongs to one department (one to many). When I have to delete an old deparment it happens that there are some users associated to that department. Since a business rule is to have each user associated to one department or at least to department #1, which is the company it self, I want to set all users' department to 1, if the referenced department is deleted. This can be done with your programming language code or with a trigger, I decided to have a trigger (althogh I usually prefer to use the programming language and MySql as persistent layer, but this is another story).&lt;br /&gt;&lt;br /&gt;I have used this code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;CREATE TRIGGER dept_set_user_to_wuk BEFORE DELETE ON dept&lt;br /&gt;FOR EACH ROW UPDATE user SET deptid = 1 WHERE deptid = OLD.deptid;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have created a trigger named dept_set_user_to_wuk saying that before deleting a row in dept (&lt;span style="font-style: italic;"&gt;BEFORE DELETE ON dept&lt;/span&gt;), it should update each user's department to the default ID #1. It is worth to mention that the where clause is very important, since I used the OLD keyword. OLD keyword reference the field of the table specified after ON, in this case is the 'dept' table.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7896543326170866690?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7896543326170866690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/create-mysql-trigger-before-deleting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7896543326170866690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7896543326170866690'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2010/01/create-mysql-trigger-before-deleting.html' title='Create MySql Trigger before deleting a field'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4670591342170383213</id><published>2009-11-24T14:50:00.000-08:00</published><updated>2009-11-24T14:52:36.412-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>How to install mysql gem on Mac</title><content type='html'>Download and install the x86 version of MySql, the run the following command:&lt;br /&gt;&lt;br /&gt;sudo env ARCHFLAGS="-arch i386" gem install mysql -- \&lt;br /&gt;  --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/usr/local/mysql/lib \&lt;br /&gt;  --with-mysql-include=/usr/local/mysql/include&lt;br /&gt;&lt;br /&gt;This should be enough to have the mysql gem installed&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4670591342170383213?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4670591342170383213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/how-to-install-mysql-gem-on-mac.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4670591342170383213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4670591342170383213'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/how-to-install-mysql-gem-on-mac.html' title='How to install mysql gem on Mac'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-6943344774652435044</id><published>2009-11-23T09:33:00.000-08:00</published><updated>2011-07-24T05:18:57.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><title type='text'>ERROR 1005 (HY000) at line...: Can’t create table ... (errno: 150)</title><content type='html'>If you get an error simialr to this:&lt;br /&gt;&lt;br /&gt;ERROR 1005 (HY000) at line 244: Can’t create table ‘./intranet2/dept.frm’ (errno: 150)&lt;br /&gt;&lt;br /&gt;It means that you should turn off the mysql integrity check with this command:&lt;br /&gt;&lt;br /&gt;SET FOREIGN_KEY_CHECKS = 0;&lt;br /&gt;&lt;br /&gt;In my case was not enough, I had to remove the to foreign key of that table, load the dump and then recreate the foreign keys. The where some &lt;a href="http://riccardotacconi.blogspot.com/2009/11/find-orphan-rows-in-mysql.html"&gt;orphan rows&lt;/a&gt;, some I removed the problem and applied the foreign keys again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-6943344774652435044?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/6943344774652435044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/error-1005-hy000-at-line-cant-create.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/6943344774652435044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/6943344774652435044'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/error-1005-hy000-at-line-cant-create.html' title='ERROR 1005 (HY000) at line...: Can’t create table ... (errno: 150)'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7848795033228581491</id><published>2009-11-10T04:46:00.000-08:00</published><updated>2009-11-10T04:48:34.095-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>MIT 6.00 Introduction to Computer Science and Programming</title><content type='html'>The following Youtube video is the first lesson of th 6.00 MIT course. It is a fantastic introduction to computer science.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/k6U-i4gXkLM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/k6U-i4gXkLM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7848795033228581491?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7848795033228581491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/mit-600-introduction-to-computer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7848795033228581491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7848795033228581491'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/mit-600-introduction-to-computer.html' title='MIT 6.00 Introduction to Computer Science and Programming'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4046253304541611590</id><published>2009-11-10T04:32:00.000-08:00</published><updated>2009-11-10T04:44:31.377-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Find orphan rows in MySql</title><content type='html'>If you have two tables, with already date on both of them, when you try to apply a foreign key to have referential integrity, you might get this error:&lt;br /&gt;&lt;br /&gt;Cannot add or update a child row: a foreign key constraint fails ...&lt;br /&gt;&lt;br /&gt;This means that you have one or more rows, in the referenced table, which is missing, so you are trying to reference a row that does not exist. You can use this SQL query to find the missing ids of the referenced table:&lt;br /&gt;&lt;br /&gt;SELECT t1.id_referencing_t2&lt;br /&gt;FROM a_table AS t1&lt;br /&gt;LEFT JOIN referenced_table AS t2&lt;br /&gt;ON t1.id_referencing_t2 = t2.primary_id_of_t2&lt;br /&gt;WHERE t2.primary_id_of_t2 IS NULL&lt;br /&gt;&lt;br /&gt;You have to substitute the following name with your real one:&lt;br /&gt;&lt;br /&gt;id_referencing_t2: the id the reference the primary key on the referenced table.&lt;br /&gt;primary_id_of_t2: the primary key of the referenced table.&lt;br /&gt;a_table: the table that references the referenced table.&lt;br /&gt;referenced_table: is the table that you want to reference, the table that have the missing ids.&lt;br /&gt;&lt;br /&gt;The result of the query is the primary key of the rows that points to missing id in the other table. With those ids you can alter the value to a default one, or delete the rows.&lt;br /&gt;&lt;br /&gt;Now you should be able to apply referencial integrity to your tables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4046253304541611590?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4046253304541611590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/find-orphan-rows-in-mysql.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4046253304541611590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4046253304541611590'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/11/find-orphan-rows-in-mysql.html' title='Find orphan rows in MySql'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8627736957445369451</id><published>2009-10-23T08:59:00.000-07:00</published><updated>2009-10-23T09:04:51.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Rails default route</title><content type='html'>If yuo want to map your Rails' root directory, something like www.example.com/, to a controller, use this directive in your cong/routes.rb:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;map.root :controller =&gt; 'configurations'&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;'configurations' is the controller that you might want to map. 'map.root' means 'map the root'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8627736957445369451?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8627736957445369451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/rails-default-route.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8627736957445369451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8627736957445369451'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/rails-default-route.html' title='Rails default route'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4990999855370366288</id><published>2009-10-23T03:40:00.000-07:00</published><updated>2010-05-26T09:18:59.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><title type='text'>How to install Mysql/Ruby on Solaris SPARC 64</title><content type='html'>I found only partial documentation on how to install the Ruby driver for MySql. There are two version of drivers, one is MySql/Ruby and is written in C, the second is Ruby/MySql and is written in Ruby. Ruby/MySql is included in Rails but has slower performance, plus it was not working with MySql 5.0, it does not work with MySql 4.something too!&lt;br /&gt;&lt;br /&gt;So I decieded to compile the C driver. Below you can find the commands:&lt;br /&gt;&lt;br /&gt;&lt;blockquotes&gt;&lt;br /&gt;curl http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.7.tar.gz -o mysql-gzip -d gzip -d mysql-ruby-2.7.tar.gz&lt;br /&gt;tar xfv mysql-ruby-2.7.tar&lt;br /&gt;cd mysql-ruby-2.7&lt;br /&gt;ruby extconf.rb --with-mysql-include=/usr/local/mysql/include/mysql --with-mysql-lib=/usr/local/mysql/lib/mysql&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;/blockquotes&gt;&lt;br /&gt;&lt;br /&gt;Make sure that 'make install' will be executed as root. Now you can test the connection with:&lt;br /&gt;&lt;br /&gt;&lt;blockquotes&gt;&lt;br /&gt;ruby test.rb [hostname] [username] [dbpassword]&lt;br /&gt;&lt;/blockquotes&gt;&lt;br /&gt;&lt;br /&gt;Of course you have to put the host, username and password. Another nice script to test your MySql connection is:&lt;br /&gt;&lt;br /&gt;&lt;blockquotes&gt;&lt;br /&gt;require 'mysql'&lt;br /&gt;&lt;br /&gt;mysql = Mysql.init()&lt;br /&gt;mysql.connect('localhost', 'username', 'password')&lt;br /&gt;results = mysql.query("SELECT now();")&lt;br /&gt;results.each{|row|; puts row;}&lt;br /&gt;mysql.close()&lt;br /&gt;&lt;/blockquotes&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4990999855370366288?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4990999855370366288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/how-to-install-mysqlruby-on-solaris.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4990999855370366288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4990999855370366288'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/how-to-install-mysqlruby-on-solaris.html' title='How to install Mysql/Ruby on Solaris SPARC 64'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8068224475177123544</id><published>2009-10-22T02:44:00.000-07:00</published><updated>2009-10-22T05:09:55.890-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='MySql'/><category scheme='http://www.blogger.com/atom/ns#' term='DBI'/><title type='text'>Ruby database recipes with MySql</title><content type='html'>First of all I am using Windows as OS (yes, I have to use it here).&lt;br /&gt;&lt;br /&gt;Rails has a very nice ORM: ActiveRecord. However ActiveRecord is quite complex and a simple library to manipulate data in a script can be more than enough. In this post I will use MySql as DBMS. First of all you need the MySql adapter and the MySql gem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;gem install mysql&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;If you have troubles when installing the gem and you have the MySql 5.1 client, download and install the 5.0 instead, there are, at the moment of writing some issues in Windows. Now you can check if you can connect to the database. The following example is the code to manipulate data in a MySql table named users. As you can see it is not so different from the previous example, but it can be use with other DBMSs, this is the beauty of a database abstracion layer, using the adapter design pattern.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; require 'dbi'&lt;br /&gt;&lt;br /&gt;   # Connect to a database, old style&lt;br /&gt;   dbh = DBI.connect('DBI:Mysql:test:localhost', 'root', 'asdf')&lt;br /&gt;&lt;br /&gt;   # Insert some rows, use placeholders&lt;br /&gt;   1.upto(13) do |i|&lt;br /&gt;       sql = "insert into users (username) VALUES (?)"&lt;br /&gt;       dbh.do(sql, "user#{i}")&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   # Select all rows from users&lt;br /&gt;   sth = dbh.prepare('select * from users')&lt;br /&gt;   sth.execute&lt;br /&gt;&lt;br /&gt;   # Print out each row&lt;br /&gt;   while row=sth.fetch do&lt;br /&gt;       p row&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   # Close the statement handle when done&lt;br /&gt;   sth.finish&lt;br /&gt;&lt;br /&gt;   # Don't prepare, just do it!&lt;br /&gt;   dbh.do('delete from users where id &gt; 10')&lt;br /&gt;&lt;br /&gt;   # And finally, disconnect&lt;br /&gt;   dbh.disconnect&lt;br /&gt;&lt;/blockquote&gt;Some useful links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.troubleshooters.com/codecorn/ruby/database/index.htm#_Install_and_test_Ruby_dbi"&gt;Install and test the Ruby API&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ruby-dbi.rubyforge.org/rdoc/index.html"&gt;RDoc for DBI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ruby-dbi.rubyforge.org/"&gt;Ruby DBI home page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8068224475177123544?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8068224475177123544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/ruby-database-recipes-with-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8068224475177123544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8068224475177123544'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/ruby-database-recipes-with-mysql.html' title='Ruby database recipes with MySql'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3658189265391149159</id><published>2009-10-18T02:33:00.001-07:00</published><updated>2009-10-18T02:52:08.676-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='loke'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='ola bini'/><title type='text'>JRuby, a thread safe Ruby implementation for multi cores</title><content type='html'>Ruby 1.8 was not thread safe, now the problem with 1.9 is ended, but there is the global interpreter lock, that prevents the MRI interpreter to scale on multiple cores. JRuby is not written in C, it is written using Java and uses Java threads. Java threads are thread safe and can scale on multiple cores, as any J2EE application.&lt;br /&gt;&lt;br /&gt;Please, have a look this Google Tech video by Ola Bini, a JRuby core developer. He talks about JRuby, his threads, garabage collection and more.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PfnP-8XbJao&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PfnP-8XbJao&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Ola Bini works for ThoughtWorks, he has developed another language called &lt;a href="http://kenai.com/projects/ioke/"&gt;Loke&lt;/a&gt;. Loke is built to run on the JVM and borrows many ideas from Lisp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3658189265391149159?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3658189265391149159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/jruby-thread-safe-ruby-implementation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3658189265391149159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3658189265391149159'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/jruby-thread-safe-ruby-implementation.html' title='JRuby, a thread safe Ruby implementation for multi cores'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5133725393487707963</id><published>2009-10-18T02:30:00.000-07:00</published><updated>2009-10-22T02:20:09.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>History of Mathematics on Youtube</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wo-6xLUVLTQ&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wo-6xLUVLTQ&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5133725393487707963?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5133725393487707963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/history-of-mathematics-on-youtube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5133725393487707963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5133725393487707963'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/10/history-of-mathematics-on-youtube.html' title='History of Mathematics on Youtube'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3419998789789788584</id><published>2009-09-21T09:50:00.000-07:00</published><updated>2009-10-20T08:25:32.879-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='activemq'/><category scheme='http://www.blogger.com/atom/ns#' term='merb ruby books'/><title type='text'>Ruby ActiveMQ and Stomp</title><content type='html'>Apache ActiveMQ can be used as messaging system with Ruby. The easy way to use it is with the Stomp protocol.&lt;br /&gt;&lt;br /&gt;To use tis example you need to use the Stomp gem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;gem install stomp&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The following example uses the producer/consumer paridigm. Create and run a consumer script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;require "rubygems"&lt;br /&gt;require "stomp"&lt;br /&gt;&lt;br /&gt;client = Stomp::Client.open "stomp://localhost:61613"&lt;br /&gt;# client.send('/queue/testing', "hello world")&lt;br /&gt;# Processing loop&lt;br /&gt;client.subscribe('/queue/testing') do |msg|&lt;br /&gt;  puts msg&lt;br /&gt;end&lt;br /&gt;client.join # Wait until listening thread dies&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The code above waits for incoming messages, tehn prints the message. Write the producer script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;require "rubygems"&lt;br /&gt;require "stomp"&lt;br /&gt;# connect to ActiveMQ&lt;br /&gt;client = Stomp::Client.open "stomp://localhost:61613"&lt;br /&gt;# send a message to '/queue/testing' &lt;br /&gt;client.send('/queue/testing', "hasta la vista!!")&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;From this example you can see how easy is to communicate between applications and servers. &lt;br /&gt;&lt;br /&gt;The &lt;a href="http://stomp.codehaus.org/"&gt;Stomp&lt;/a&gt; protocol is an HTTP like protocol to wirte clients to access other protocol or technologies. Here Stomp is used to connect to ActiveMQ, which is a &lt;a href="http://java.sun.com/products/jms/"&gt;JMS&lt;/a&gt; compliant server.&lt;br /&gt;&lt;br /&gt;A better way to use MOM services in Ruby is to use the &lt;a href="http://code.google.com/p/activemessaging"&gt;ActiveMessaging&lt;/a&gt; gem. You can find an article in InfoQ: &lt;a href="http://www.infoq.com/articles/intro-active-messaging-rails"&gt;Introduction to ActiveMessaging for Rails&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3419998789789788584?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3419998789789788584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/09/ruby-activemq-and-stomp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3419998789789788584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3419998789789788584'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/09/ruby-activemq-and-stomp.html' title='Ruby ActiveMQ and Stomp'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5981573859757345111</id><published>2009-08-24T01:44:00.000-07:00</published><updated>2009-08-24T01:48:58.680-07:00</updated><title type='text'>CURL on Windows</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qfh6a6uZa-8/SpJT7MyPzYI/AAAAAAAAAyI/hYpSohCQrt4/s1600-h/ds-curlicon.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 99px; height: 37px;" src="http://4.bp.blogspot.com/_qfh6a6uZa-8/SpJT7MyPzYI/AAAAAAAAAyI/hYpSohCQrt4/s320/ds-curlicon.png" alt="" id="BLOGGER_PHOTO_ID_5373449581915786626" border="0" /&gt;&lt;/a&gt;If you need to run curl on Windows you can download it form&lt;br /&gt;&lt;p&gt;the project's wbesite: &lt;a href="http://curl.haxx.se/download.html"&gt;http://curl.haxx.se/download.html&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then you have to unzip it, and copy culr.exe in "C:\Windows\System32".&lt;br /&gt;If you will try to execute curl you will get an error because &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; is mission.&lt;br /&gt;You should download the installer form here: &lt;a href="http://www.shininglightpro.com/products/Win32OpenSSL.html"&gt;http://www.shininglightpro.com/products/Win32OpenSSL.html&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;After running the &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; installer, you can run curl from the command line. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you want to test a page of a web application, for instance a generated xml file, you can use curl in this way:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;curl -H "Accept: application/xml" http://localhost:3000/info/who_bought/3 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;In that example you specify, in the header, that you want an XML file,&lt;br /&gt;than you pass the &lt;a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier"&gt;URI&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5981573859757345111?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5981573859757345111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/08/curl-on-windows.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5981573859757345111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5981573859757345111'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/08/curl-on-windows.html' title='CURL on Windows'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qfh6a6uZa-8/SpJT7MyPzYI/AAAAAAAAAyI/hYpSohCQrt4/s72-c/ds-curlicon.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-877390555141420458</id><published>2009-08-21T05:45:00.000-07:00</published><updated>2009-08-21T05:48:16.114-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>BitNami Project</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bitnami.org/images/bitnami-logo.png?1249903141"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 142px; height: 44px;" src="http://bitnami.org/images/bitnami-logo.png?1249903141" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://bitnami.org/"&gt;BitNami&lt;/a&gt; is an Open Source project fousing in ready to install web applications. The software is provided with easy and not invasive installers. But there are more interesting features. The installers are provided for the man platforms, Windows, Linux, Mac OS X and Solaris. Another interesting aspect is that you can install an appication in your machine, your can get a &lt;a href="http://www.vmware.com/"&gt;Vmware&lt;/a&gt;/&lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; images or you can get an ready made image to deploy in a cloud.&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The applications provided are &lt;a href="http://bitnami.org/advanced_search"&gt;endless&lt;/a&gt; and I think that is a very easy way to test a software. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-877390555141420458?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/877390555141420458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/08/bitnami-project.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/877390555141420458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/877390555141420458'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/08/bitnami-project.html' title='BitNami Project'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7127528548437650947</id><published>2009-07-28T01:45:00.000-07:00</published><updated>2009-07-28T01:56:06.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><title type='text'>Sun's JRuby team jumps ship to Engine Yard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://media.xircles.codehaus.org/_projects/jruby/_logos/medium.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 128px; height: 57px;" src="http://media.xircles.codehaus.org/_projects/jruby/_logos/medium.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;"The JRuby Guys", Charles Nutter and Thomas Enebo, the main developers of the &lt;a href="http://kenai.com/projects/jruby"&gt;JRuby project&lt;/a&gt; are moving from &lt;a href="http://www.sun.com/"&gt;Sun&lt;/a&gt; to &lt;a href="http://www.engineyard.com/"&gt;Engine Yard&lt;/a&gt;. The reason seems to be the uncertainity created by the acqusition by &lt;a href="http://www.oracle.com/"&gt;Oracle &lt;/a&gt;of &lt;a href="http://www.sun.com/"&gt;Sun&lt;/a&gt;. They said that they do not not if Oracle will support JRuby in the future, so they accepted the offer of &lt;a href="http://www.engineyard.com/"&gt;Engine yard&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.engineyard.com/"&gt;Engine yard&lt;/a&gt; offers &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; hosting on a cloud computing platform. They are very popular in the Ruby world and probably JRuby will continue to be developed and sustained.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7127528548437650947?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7127528548437650947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/suns-jruby-team-jumps-ship-to-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7127528548437650947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7127528548437650947'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/suns-jruby-team-jumps-ship-to-engine.html' title='Sun&apos;s JRuby team jumps ship to Engine Yard'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3040450528990116945</id><published>2009-07-25T12:00:00.000-07:00</published><updated>2009-07-25T12:00:30.537-07:00</updated><title type='text'></title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_qfh6a6uZa-8/SmtWTQAgUCI/AAAAAAAAApM/b26p231mORU/s1600-h/P1010439.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_qfh6a6uZa-8/SmtWTQAgUCI/AAAAAAAAApM/b26p231mORU/s320/P1010439.JPG" border="0" alt="" style="clear:both;float:left; margin:0px 10px 10px 0;" /&gt;&lt;/a&gt; My VX220 when I went two week ago in the Cotwolds. Here is near Broadway, just in the end of the High St.&lt;div style='clear:both; text-align:LEFT'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3040450528990116945?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3040450528990116945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/my-vx220-when-i-went-two-week-ago-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3040450528990116945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3040450528990116945'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/my-vx220-when-i-went-two-week-ago-in.html' title=''/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qfh6a6uZa-8/SmtWTQAgUCI/AAAAAAAAApM/b26p231mORU/s72-c/P1010439.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-1652204963426985255</id><published>2009-07-22T06:33:00.000-07:00</published><updated>2009-07-22T06:44:53.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merb ruby books'/><title type='text'>The Merb Way</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qfh6a6uZa-8/SmcVY9jSBDI/AAAAAAAAAos/dSVD-qAUFxw/s1600-h/the-merb-way.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 226px; height: 296px;" src="http://3.bp.blogspot.com/_qfh6a6uZa-8/SmcVY9jSBDI/AAAAAAAAAos/dSVD-qAUFxw/s320/the-merb-way.jpeg" alt="" id="BLOGGER_PHOTO_ID_5361277399991452722" border="0" /&gt;&lt;/a&gt;I am really happy to see that there is a new &lt;a href="http://www.informit.com/store/product.aspx?isbn=0321606388"&gt;book&lt;/a&gt; to learn &lt;a href="http://merbivore.com/"&gt;Merb&lt;/a&gt;. This book is published by Addison-Wesley, one of the best IT publishing company. The book covers most of the features, including routing, REST, DataMapper, ERB (Erubis) and HAML, Merb mailers, Behavior Driven Development and testing with RSpec. I think that there is more than enough to write an enterprise application with &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://merbivore.com/"&gt;Merb.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a list of the topics taken from &lt;a href="http://www.informit.com/"&gt;InformIT&lt;/a&gt; web site:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Master Merb innovations that will be incorporated into Rails 3&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Understand the fundamentals of Merb development, one step at a time &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Use Merb’s sophisticated application router to guide incoming requests&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Explore the Merb stack, master its configuration options, and dive into its internals&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Use Merb controllers to integrate application code, handle responses, and manage sessions, filters, and exceptions&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Build templates with both ERB (Erubis) and HAML&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Use the DataMapper ORM to represent object properties and behaviors &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Learn best practices for RESTful development with Merb &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Leverage Helpers to simplify many common development tasks &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Refactor code, encapsulate it in gems, and share it across multiple applications&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Customize the responses your application sends to each user&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Gain a deep, practical understanding of Merb plugins and extensibility&lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Authenticate users with Merb’s modular authentication plugin &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Configure, generate, describe, and test Merb mailers &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Use the merb-parts gem to create component-like regions on Web pages &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Cache content to relieve stress on Web servers &lt;/div&gt;&lt;/li&gt;&lt;li&gt;  &lt;div style="margin: 0px;"&gt;Make the most of Behavior Driven Development and testing with RSpec&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-1652204963426985255?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/1652204963426985255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/merb-way.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1652204963426985255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1652204963426985255'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/merb-way.html' title='The Merb Way'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qfh6a6uZa-8/SmcVY9jSBDI/AAAAAAAAAos/dSVD-qAUFxw/s72-c/the-merb-way.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-6568606977540507825</id><published>2009-07-17T03:49:00.000-07:00</published><updated>2009-07-17T03:55:26.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby-on-ralis cms drupal'/><title type='text'>CMS for Ruby on Rails</title><content type='html'>I&lt;a href="http://stackoverflow.com/questions/1136567/cms-for-ruby-on-rails"&gt; asked on Stackoverflow&lt;/a&gt; a suggestion for a CMS made in RoR. One sugggestion was &lt;a href="http://www.browsercms.org/"&gt;BrowserCMS&lt;/a&gt;. The creators want to create an alternative to Drupal for RoR, well this is what I was looking for. There is an interesting video about &lt;a href="http://www.browsercms.org/"&gt;BrowserCMS&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;embed src='http://aac2009.confreaks.com/player.swf' height='380' width='640' allowscriptaccess='always' allowfullscreen='true' flashvars='image=images%2F07-feb-2009-10-00-browsercms-patrick-peak-and-paul-barry-preview.jpg&amp;file=http%3A%2F%2Faac2009.confreaks.com%2Fvideos%2F07-feb-2009-10-00-browsercms-patrick-peak-and-paul-barry-small.mp4&amp;plugins=viral-1'/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-6568606977540507825?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/6568606977540507825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/cms-for-ruby-on-rails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/6568606977540507825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/6568606977540507825'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/cms-for-ruby-on-rails.html' title='CMS for Ruby on Rails'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2951619521495900137</id><published>2009-07-08T06:17:00.001-07:00</published><updated>2009-07-08T06:34:58.445-07:00</updated><title type='text'>PHP 5.3</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.php.net/www.php.net/images/php.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 120px; height: 67px;" src="http://static.php.net/www.php.net/images/php.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;PHP 5.3 has been released the 30 of June. I made a post about the infamous GOTO statement, but there are some good news:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://php.net/manual/en/functions.anonymous.php"&gt;Closures&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://php.net/namespaces"&gt;Namespaces&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://uk3.php.net/lsb"&gt;Late Static Bindings&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Clojures are available in many dynamic language, such as Groovy and Ruby. The problem is that we still have to use the function keywork - I hope that that unecessary keyword will disappear -. In few wors, a closure is a function with some code inside that can be assigned to a variable, then the code can be executed from the variable.&lt;br /&gt;&lt;br /&gt;Namespaces are important to avoid name collisions and to create aliases. Any serious programming language should have namespaces, to organize the code and to use classes with the same name but in different packages. With namespaces, in the future, there will be less conflicts in libraries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2951619521495900137?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2951619521495900137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/php-53.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2951619521495900137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2951619521495900137'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/php-53.html' title='PHP 5.3'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5572527224616188625</id><published>2009-07-08T06:11:00.000-07:00</published><updated>2009-07-08T06:15:39.414-07:00</updated><title type='text'>nWire for PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qfh6a6uZa-8/SlSb1ugd9AI/AAAAAAAAAns/ur2TUmp2ZQ4/s1600-h/php-visualizer.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 274px;" src="http://2.bp.blogspot.com/_qfh6a6uZa-8/SlSb1ugd9AI/AAAAAAAAAns/ur2TUmp2ZQ4/s320/php-visualizer.gif" alt="" id="BLOGGER_PHOTO_ID_5356077204169946114" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.nwiresoftware.com/products/nwire-php"&gt;nWire&lt;/a&gt; will release very soon a stable version of nWire for PHP. nWire is an Eclipse and Zend Studio plug-in to explore PHP code with call hirearchy and diagrams.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5572527224616188625?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5572527224616188625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/nwire-for-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5572527224616188625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5572527224616188625'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/nwire-for-php.html' title='nWire for PHP'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qfh6a6uZa-8/SlSb1ugd9AI/AAAAAAAAAns/ur2TUmp2ZQ4/s72-c/php-visualizer.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-6369366466030999041</id><published>2009-07-08T02:52:00.000-07:00</published><updated>2010-01-14T09:58:20.043-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Server CE'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><title type='text'>Memcached + PHP + Win 32 + ZendServer CE</title><content type='html'>If you have the misfortune to develop PHP applications on a Windows box and you want to develop and learn mamcache, this is a quick recipe, but I assume that you have already installed &lt;a href="http://www.zend.com/community/zend-server-ce"&gt;ZendServer CE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download a port of memcache to Win32 platform: &lt;a href="http://jehiah.cz/projects/memcached-win32/"&gt;http://jehiah.cz/projects/memcached-win32/&lt;/a&gt;. Then do the following:&lt;br /&gt;&lt;br /&gt;1.  Unzip the binaries in your desired directory (eg. c:\memcached)&lt;br /&gt;2. Install the service using the command: 'c:\memcached\memcached.exe -d install' from either the command line&lt;br /&gt;3. Start the server from the Microsoft Management Console or by running the following command: 'c:\memcached\memcached.exe -d start'&lt;br /&gt;&lt;br /&gt;The the server, by default is listening on port 11211.&lt;br /&gt;&lt;br /&gt;When you have started the memcache service you need to activate the PHP module. In ZendServer CE you already have the dll, so go to C:\Program Files\Zend\ZendServer\etc - I presume that you have your ZendServer CE installed in C:\Program Files\Zend\ZendServer\ - uncomment this line:&lt;br /&gt;&lt;br /&gt;extension=php_memcache.dll&lt;br /&gt;&lt;br /&gt;Restart the server (Apache ZendServer) and you should see that the module is active. Now you can test your installation with the following script:&lt;br /&gt;&lt;br /&gt;connect('localhost', 11211) or die ("Could not connect");&lt;br /&gt;&lt;br /&gt;$version = $memcache-&gt;getVersion();&lt;br /&gt;echo "Server's version: ".$version."&lt;br /&gt;\n";&lt;br /&gt;&lt;br /&gt;$tmp_object = new stdClass;&lt;br /&gt;$tmp_object-&gt;str_attr = 'test';&lt;br /&gt;$tmp_object-&gt;int_attr = 123;&lt;br /&gt;&lt;br /&gt;$memcache-&gt;set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");&lt;br /&gt;echo "Store data in the cache (data will expire in 10 seconds)&lt;br /&gt;\n";&lt;br /&gt;&lt;br /&gt;$get_result = $memcache-&gt;get('key');&lt;br /&gt;echo "Data from the cache:&lt;br /&gt;\n";&lt;br /&gt;&lt;br /&gt;var_dump($get_result);&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;Visit the PHP page for memcache: &lt;a href="http://php.net/memcache"&gt;http://php.net/memcache&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-6369366466030999041?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/6369366466030999041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/memcached-php-win-32-zendserver-ce.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/6369366466030999041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/6369366466030999041'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/07/memcached-php-win-32-zendserver-ce.html' title='Memcached + PHP + Win 32 + ZendServer CE'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3095903503134153377</id><published>2009-06-27T09:47:00.000-07:00</published><updated>2009-06-27T10:28:05.713-07:00</updated><title type='text'>merb new Ruby framework</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qfh6a6uZa-8/SkZWnolJL1I/AAAAAAAAAkA/3V1aYeaKUeQ/s1600-h/merb_logo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 158px; height: 57px;" src="http://4.bp.blogspot.com/_qfh6a6uZa-8/SkZWnolJL1I/AAAAAAAAAkA/3V1aYeaKUeQ/s320/merb_logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5352060446084509522" /&gt;&lt;/a&gt;&lt;br /&gt;merb is a new framework for Ruby. Why we need merb if we have Rails? merb has data mapper as default ORM tool, which is more powerful than ActiveRecord when dealing with complex databases, plus is more modular and orientated to the enterprise. Matt Amionetti has mad a &lt;a href="http://www.infoq.com/presentations/aimonetti-merb"&gt;presentation&lt;/a&gt; at QCon, in San Francisco, which is highly suggested if you are interested in merb. &lt;br /&gt;&lt;br /&gt;I tried to install merb but the installer crashes because a file is missing in the repository. I have to say than the documentation seems quite incomplete and the web site is quite poor in the design and contents.&lt;br /&gt;&lt;br /&gt;However merb is a quite interesting framework, new enterprise ORM, RSec built-in, modular... I will have a look in the future, probably, now I will stick with Grails (built on top of Hibernate and Spring). For web development the better choices are Grails, Rails and now merb (although too young).&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/aimonetti-merb"&gt;Merb: When Flexibility and Performance Matter&lt;/a&gt;&lt;br /&gt;&lt;a href="http://merbivore.com/"&gt;merb framework&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3095903503134153377?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3095903503134153377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/merb-new-ruby-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3095903503134153377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3095903503134153377'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/merb-new-ruby-framework.html' title='merb new Ruby framework'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qfh6a6uZa-8/SkZWnolJL1I/AAAAAAAAAkA/3V1aYeaKUeQ/s72-c/merb_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2234361064185700009</id><published>2009-06-27T07:20:00.000-07:00</published><updated>2009-06-27T07:27:16.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming ruby'/><title type='text'>Metaprogramming in Ruby</title><content type='html'>Dave Thomas is on infoq. He explain how &lt;a href="http://www.infoq.com/presentations/metaprogramming-ruby"&gt;metaprogramming in Ruby works&lt;/a&gt;. He explains many hidden and unknown features of the Ruby language, for instance the definition of a class can be changed in real time and is possible to define a method using a conditional statement. I have appreciated the the comments about Java, a programming language that was designed for mediocre programmer to commit less mistakes. In Ruby you have less restrictions and the talent is preferred instead of the fear that you have poor quality programmers in your team.&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;http://www.infoq.com/presentations/metaprogramming-ruby&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2234361064185700009?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2234361064185700009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/metaprogramming-in-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2234361064185700009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2234361064185700009'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/metaprogramming-in-ruby.html' title='Metaprogramming in Ruby'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8738621102873162098</id><published>2009-06-27T07:16:00.000-07:00</published><updated>2009-06-27T07:20:02.032-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac firefox'/><title type='text'>Firefox with full screen mode on Mac</title><content type='html'>Some of you should have noticed that Firefox on the mac does not has a full screen mode. There is a simple hack for that. Just install a Firefox plug-in, the you will have an icon in the bottom right of Firefox where you can switch to full or normal view mode.The plug-in is &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4650"&gt;FullerScreen&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;References: &lt;br /&gt;https://addons.mozilla.org/en-US/firefox/addon/4650&lt;br /&gt;http://www.mactales.com/article/how-to-fullscreen-firefox-on-os-x-mac-using-fullscreener-plugin/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8738621102873162098?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8738621102873162098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/firefox-with-full-screen-mode-on-mac.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8738621102873162098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8738621102873162098'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/firefox-with-full-screen-mode-on-mac.html' title='Firefox with full screen mode on Mac'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2551815542079287081</id><published>2009-06-25T02:27:00.000-07:00</published><updated>2009-06-25T02:45:30.398-07:00</updated><title type='text'>GOTO in PHP</title><content type='html'>I am sad to announce the PHP 5.3 has a new goto statement. From a paper of Dijkstra (1968) the goto statement has been considered harmful and so many year after PHP introduce a goto statement. I think that the &lt;a href="http://en.wikipedia.org/wiki/Spaghetti_code"&gt;spaghetti coders&lt;/a&gt; will be happy of using goto in their programs. But what about the credibility of PHP in the enterprise. &lt;a href="http://www.zend.com"&gt;Zend&lt;/a&gt; is claiming that PHP is a good technology for the enterprise environment, well, I do not think so.&lt;br /&gt;&lt;br /&gt;Why do not why start to use GWBasic for web programming?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;br /&gt;http://www.procata.com/blog/archives/2004/07/29/goto-in-php/&lt;br /&gt;&lt;br /&gt;http://uk.php.net/manual/en/control-structures.goto.php&lt;br /&gt;&lt;br /&gt;Edsger Dijkstra (March 1968). "Go To Statement Considered Harmful" (PDF). Communications of the ACM 11 (3): 147–148. doi:10.1145/362929.362947. http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF. "The unbridled use of the go to statement has as an immediate consequence that it becomes terribly hard to find a meaningful set of coordinates in which to describe the process progress. ... The go to statement as it stands is just too primitive, it is too much an invitation to make a mess of one's program.".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2551815542079287081?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2551815542079287081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/goto-in-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2551815542079287081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2551815542079287081'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/goto-in-php.html' title='GOTO in PHP'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-922737973843525018</id><published>2009-06-14T11:20:00.000-07:00</published><updated>2009-06-14T11:43:37.831-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM'/><category scheme='http://www.blogger.com/atom/ns#' term='WSIL'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL'/><category scheme='http://www.blogger.com/atom/ns#' term='UDDI'/><title type='text'>Web Services</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qfh6a6uZa-8/SjVCnKicx-I/AAAAAAAAAg0/4oy8wBMLwNo/s1600-h/oasis-logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 221px; height: 58px;" src="http://4.bp.blogspot.com/_qfh6a6uZa-8/SjVCnKicx-I/AAAAAAAAAg0/4oy8wBMLwNo/s320/oasis-logo.gif" alt="" id="BLOGGER_PHOTO_ID_5347253373183510498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This week I have learnt so many things about web services. Eclipse and Axis2 are very useful to create, consume and register web services. The main protocol are SOAP, WDSL and &lt;a href="http://www.uddi.org/pubs/uddi_v3.htm"&gt;UDDI&lt;/a&gt;. SOAP is use to exchange the messages, WDSL to describe a web service and UDDI is directory service used to register/publish web services. It is possible to access a web service using only UDDI, but this approach does not follow really the UDDDI standards. There is an alternative to UDDI, created and maintained by IBM, is known as &lt;a href="http://t320webservices.open.ac.uk/axisg_tr696_axis2_A21791/services/HelloService?wsdl"&gt;WSIL&lt;/a&gt;, but UDDI is more well known. OASIS maintains UDDI.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qfh6a6uZa-8/SjVD0Gy5TxI/AAAAAAAAAg8/9wCSWMn9vlg/s1600-h/axis.jpg"&gt;&lt;img style="cursor: pointer; width: 167px; height: 96px;" src="http://1.bp.blogspot.com/_qfh6a6uZa-8/SjVD0Gy5TxI/AAAAAAAAAg8/9wCSWMn9vlg/s320/axis.jpg" alt="" id="BLOGGER_PHOTO_ID_5347254695028674322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Useful links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration"&gt;UDDI on Wikipedia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ws.apache.org/axis2/tools/1_0/eclipse/wsdl2java-plugin.html"&gt;Code Generator Wizard - eclipse Plug-in&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/webtools/community/tutorials/BottomUpAxis2WebService/bu_tutorial.html"&gt;Eclipse WTP Tutorials - Creating Bottom Up Web Service via Apache Axis2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-922737973843525018?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/922737973843525018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/web-services.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/922737973843525018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/922737973843525018'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/web-services.html' title='Web Services'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qfh6a6uZa-8/SjVCnKicx-I/AAAAAAAAAg0/4oy8wBMLwNo/s72-c/oasis-logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-9045984786920453693</id><published>2009-06-14T08:04:00.000-07:00</published><updated>2009-06-14T08:08:50.083-07:00</updated><title type='text'>The Origins of Linux - Linus Torvalds</title><content type='html'>In this video, a bit old, you can here the history of Linux for Linus Torvalds.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WVTWCPoUt8w&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/WVTWCPoUt8w&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-9045984786920453693?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/9045984786920453693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/origins-of-linux-linus-torvalds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/9045984786920453693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/9045984786920453693'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/origins-of-linux-linus-torvalds.html' title='The Origins of Linux - Linus Torvalds'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3399224630291104586</id><published>2009-06-14T06:29:00.000-07:00</published><updated>2009-06-14T07:55:26.123-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freebsd'/><title type='text'>FreeBSD on a desktop</title><content type='html'>In the following video you can see FreeBSD on a desktop with Beryl.&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LyemBheu7NI&amp;hl=en&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LyemBheu7NI&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3399224630291104586?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3399224630291104586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/freebsd-on-desktop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3399224630291104586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3399224630291104586'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/freebsd-on-desktop.html' title='FreeBSD on a desktop'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7070136297759953043</id><published>2009-06-14T06:22:00.000-07:00</published><updated>2009-06-14T06:29:18.806-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iran'/><title type='text'>Political election farce in Iran.</title><content type='html'>It is incredible what is happening in Iran. They tricked the elections. After 20 minutes the end of the voting time, they have declared that they won the election. This is a bad news for the world too. It is not a democracy, it is a dictatorship! It is a shame!&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/AzVE0AiH5G0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/AzVE0AiH5G0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7070136297759953043?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7070136297759953043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/political-election-farce-in-iran.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7070136297759953043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7070136297759953043'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/political-election-farce-in-iran.html' title='Political election farce in Iran.'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4525923454825912381</id><published>2009-06-12T00:17:00.000-07:00</published><updated>2009-06-12T00:19:03.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><category scheme='http://www.blogger.com/atom/ns#' term='credid crunch'/><title type='text'>A video to understand what is the credit crunch</title><content type='html'>&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_ZAlj2gu0eM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/_ZAlj2gu0eM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4525923454825912381?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4525923454825912381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/video-to-understand-what-is-credit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4525923454825912381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4525923454825912381'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/video-to-understand-what-is-credit.html' title='A video to understand what is the credit crunch'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5405135448685350907</id><published>2009-06-07T13:17:00.000-07:00</published><updated>2009-06-07T14:00:56.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='limits math youtube'/><title type='text'>Learn limits online</title><content type='html'>I have found a website, &lt;a href="http://www.justmathtutoring.com/"&gt;http://www.justmathtutoring.com/&lt;/a&gt;,  full of tutorials on mathematics. The author has published more than 300 videos on &lt;a href="http://www.youtube.com/"&gt;youtube&lt;/a&gt;. An example is the following video about limits.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HYSI-AHUqRM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/HYSI-AHUqRM&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5405135448685350907?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5405135448685350907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/learn-limits-online.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5405135448685350907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5405135448685350907'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/learn-limits-online.html' title='Learn limits online'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-5721067814532876753</id><published>2009-06-05T04:37:00.000-07:00</published><updated>2009-06-05T04:56:27.284-07:00</updated><title type='text'>Use Hazelcast library in PHP</title><content type='html'>If you want the power of Java in PHP, easily, the answer is &lt;a href="http://quercus.caucho.com/"&gt;Quercus / PHP&lt;/a&gt;. Quercus is a 100% implementation of PHP in Java. I have downloaed the GPL version of Resin, unzipped in C:\. The file to start the server is httpd.exe.&lt;br /&gt;&lt;br /&gt;In "C:\resin-3.1.9\webapps\ROOT\WEB-INF" you will find "resin-web.xml", the configuration file of Resin. Copy the following text:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;web-app xmlns="http://caucho.com/ns/resin"&gt;&lt;br /&gt;   &lt;servlet-mapping url-pattern="*.php"&lt;br /&gt;                    servlet-class="com.caucho.quercus.servlet.QuercusServlet"&gt;&lt;br /&gt;   &lt;/servlet-mapping&gt;&lt;br /&gt;&lt;/web-app&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Than create this file "hello-world.php" in "C:\resin-3.1.9\webapps\ROOT" and copy this text:&lt;br /&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;   echo "Hello World";&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;Now you should be able to see the script executed: http://localhost:8080/hello-world.php&lt;br /&gt;&lt;br /&gt;Go to the &lt;a href="http://www.hazelcast.com/"&gt;Hazelcast web site&lt;/a&gt; and download the zip. Inside the zip copy "hazelcast.jar" in "C:\resin-3.1.9\webapps\ROOT\WEB-INF\lib", create the lib directory if does not exist. &lt;br /&gt;&lt;br /&gt;Create another php file, say "htest.php". Copy the code:&lt;br /&gt;&lt;br /&gt;&lt;?php&lt;br /&gt; import com.hazelcast.core.Hazelcast;&lt;br /&gt; import java.util.Map;&lt;br /&gt; import java.util.Collection;&lt;br /&gt; require_once './Customer.php';&lt;br /&gt;&lt;br /&gt; $mapCustomers = Hazelcast::getMap("customers");&lt;br /&gt; $mapCustomers-&gt;put("1", new Customer("Joe", "Smith"));&lt;br /&gt; $mapCustomers-&gt;put("2", new Customer("Ali", "Selam"));&lt;br /&gt; $mapCustomers-&gt;put("3", new Customer("Avi", "Noyan"));&lt;br /&gt;&lt;br /&gt; $colCustomers = $mapCustomers-&gt;values();&lt;br /&gt; foreach ($mapCustomers as $cus) {&lt;br /&gt;   echo $cus-&gt;getName().'&lt;br /&gt;';&lt;br /&gt; }&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;In "htest.php" you call the Hazelcast library, get an instance of a Map, a distributed Map! You put 3 new object into the map and than you print its property. To run this example you have to create the "Customer" class in PHP. In the same directory create "Customer.php" and copy this code:&lt;br /&gt;&lt;br /&gt;&lt;?php&lt;br /&gt; class Customer {&lt;br /&gt;  protected $strName;&lt;br /&gt;  &lt;br /&gt;  public function __construct($strName) {&lt;br /&gt;   $this-&gt;strName = $strName;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function getName() {&lt;br /&gt;   return $this-&gt;strName;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;Tahn run the example: http://localhost:8080/htest.php&lt;br /&gt;&lt;br /&gt;You should get this output:&lt;br /&gt;&lt;br /&gt;Joe&lt;br /&gt;Ali&lt;br /&gt;Avi&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://quercus.caucho.com/"&gt;Quercus&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.hazelcast.com/"&gt;Hazelcast&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/docreader/#p=hazelcast&amp;s=hazelcast&amp;t=hazelcast"&gt;Hazelcast docs&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/news/2007/10/php-java-stack"&gt;Infoq: PHP on Java: Best of Both Worlds?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sda-india.com/sda_india/psecom,id,22,site_layout,sdaindia,news,19716,p,0.html"&gt;Use Java to Improve Drupal's Scalability&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-5721067814532876753?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/5721067814532876753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/use-hazelcast-library-in-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5721067814532876753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/5721067814532876753'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/use-hazelcast-library-in-php.html' title='Use Hazelcast library in PHP'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2287416456223314411</id><published>2009-06-05T02:37:00.000-07:00</published><updated>2011-02-01T07:01:00.181-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Server CE'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Resin'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend PHP'/><title type='text'>Performance of PHP platforms</title><content type='html'>I tested some different platforms to see which one has the best perfomance. I tested Zend Server CE, a SAMP environment and Resin with Quercus.&lt;br /&gt;&lt;br /&gt;The Zend Server is running on my PC:&lt;br /&gt;&lt;br /&gt;OS: Windows XP&lt;br /&gt;Processor: P4 HT&lt;br /&gt;RAM: 1GB&lt;br /&gt;&lt;br /&gt;This is the script that I used to test the performance:&lt;br /&gt;&lt;br /&gt;missing&lt;br /&gt;&lt;br /&gt;This script is executed in 4.317 seconds on the Send Server CE.&lt;br /&gt;&lt;br /&gt;The Resin Server Pro, with the compile option for better performance, executes the script in 12.72 seconds. The Resin Server with GPL license, without the compile option on, executes the script in 13.60 seconds. Both of versions of Resin are installed in my PC.&lt;br /&gt;&lt;br /&gt;The SAMP server, is on a Solaris server, 32GB RAM and many CPUs. The execution time on Soalris is 36.79 seconds! On Solaris is used the Apache Handler and there is only eAccelerator, not APC.&lt;br /&gt;&lt;br /&gt;My conclusion is that having a caching module on, it makes a big difference. Having Zend Server CE makes a huge difference. I do not think that Resin Pro is quite better than the GPL version, since the  difference is very little.&lt;br /&gt;&lt;br /&gt;In the end I would choose Resin Server with GPL license. A unique benefit is to have the integration of PHP with Java and the other dynamic languages, running on the JVM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2287416456223314411?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2287416456223314411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/performance-of-php-platforms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2287416456223314411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2287416456223314411'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/06/performance-of-php-platforms.html' title='Performance of PHP platforms'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-976073587045636674</id><published>2009-05-27T01:41:00.000-07:00</published><updated>2009-09-03T06:19:04.134-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>M888 - Databases in enterprise systems</title><content type='html'>I find interesting a &lt;a href="http://www3.open.ac.uk/courses/bin/p12.dll?C01M888"&gt;course&lt;/a&gt; of The Open University, at postgraduate level, that talks about databases in the enterprise. The course covers ODBC and JDBC, the some popular persistence frameworks (e.g. Java EE, .NET, Hibernate, Toplink) and SQL/J (a multi-part specification for using SQL with Java). The course covers even web application frameworks (e.g. ASP.NET, PHP). This course probably is useful to have a general understanding a the possible solutions availables on the market; thus I think is more for software architect than programmers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-976073587045636674?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/976073587045636674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/m888-databases-in-enterprise-systems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/976073587045636674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/976073587045636674'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/m888-databases-in-enterprise-systems.html' title='M888 - Databases in enterprise systems'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-153115473092378156</id><published>2009-05-19T02:54:00.001-07:00</published><updated>2009-05-19T02:54:09.608-07:00</updated><title type='text'>Test  Driven  Development  Tutorial</title><content type='html'>The presentation is an introduction to TDD. It is quite useful to developers new to TDD. &lt;div style="width:425px;text-align:left" id="__ss_181371"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/Skud/test-driven-development-tutorial?type=presentation" title="Test  Driven  Development  Tutorial"&gt;Test  Driven  Development  Tutorial&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=test-driven-development-tutorial-11961285135562-4&amp;stripped_title=test-driven-development-tutorial" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=test-driven-development-tutorial-11961285135562-4&amp;stripped_title=test-driven-development-tutorial" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/Skud"&gt;Skud&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-153115473092378156?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/153115473092378156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/test-driven-development-tutorial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/153115473092378156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/153115473092378156'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/test-driven-development-tutorial.html' title='Test  Driven  Development  Tutorial'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8161566895386898516</id><published>2009-05-18T01:49:00.001-07:00</published><updated>2009-05-18T01:55:22.275-07:00</updated><title type='text'>Map a directory in Apache outside the documentroot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.zend.com/topics/zend-server-ce-screens.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 385px; height: 331px;" src="http://static.zend.com/topics/zend-server-ce-screens.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Assuming that you are using Zend Server CE under Windoes and that is installed in "C:\Program Files\Zend", here is how to map a directory, which is outside the documentroot.&lt;br /&gt;&lt;br /&gt;* Create a new directory: C:\Program Files\Zend\Apache2\lol&lt;br /&gt;* Add a new alias in C:\Program Files\Zend\Apache2\conf\http.conf, inside "&lt;IfModule alias_module&gt;": Alias /lol "C:\Program Files\Zend\Apache2\lol"&lt;br /&gt;* Add the permissions to the direcotry:&lt;br /&gt;&lt;br /&gt;&lt;Directory "C:\Program Files\Zend\Apache2\lol"&gt;&lt;br /&gt; Order allow,deny&lt;br /&gt; Allow from all&lt;br /&gt;&lt;/Directory&gt;&lt;br /&gt;&lt;br /&gt;Than you can reach the directory "lol": http://localhost/lol/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8161566895386898516?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8161566895386898516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/map-directory-in-apache-outside.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8161566895386898516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8161566895386898516'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/map-directory-in-apache-outside.html' title='Map a directory in Apache outside the documentroot'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7230224102429773657</id><published>2009-05-14T06:36:00.000-07:00</published><updated>2009-06-07T14:00:13.464-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='enumerator enums'/><title type='text'>Enumerator class in PHP</title><content type='html'>If you want an elegant way to an have enumerated type try this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;class QFlashMessageType {&lt;br /&gt; const Info = 0;&lt;br /&gt; const Error = 1;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You can use it in this way:&lt;br /&gt;QFlashMessageType::Info;&lt;br /&gt;&lt;br /&gt;An enum class example on stackoverflow: http://stackoverflow.com/questions/254514/php-and-enums&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7230224102429773657?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7230224102429773657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/enumerator-class-in-php.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7230224102429773657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7230224102429773657'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/enumerator-class-in-php.html' title='Enumerator class in PHP'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4968237271495559346</id><published>2009-05-12T15:08:00.001-07:00</published><updated>2009-05-12T15:17:50.953-07:00</updated><title type='text'>Accelerated C++: Practical Programming by Example</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/51XZZ9RV4BL._SL500_AA240_.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 240px;" src="http://ecx.images-amazon.com/images/I/51XZZ9RV4BL._SL500_AA240_.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I have bought this book two days ago: &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/020170353X"&gt;&lt;span id="btAsinTitle"&gt;Accelerated C++: Practical Programming by Example&lt;/span&gt;&lt;/a&gt;. Tomorrow I will have the pleasure to have a look if it is as good as the rating a &lt;a href="http://www.amazon.co.uk/"&gt;Amazon UK&lt;/a&gt;. I have found interesting a review by ddddd and this is an extract of the review: &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"I've seen other books that try to teach you C++ from the ground up, not giving useful advice until they've bored you with pointers and memory management and so on. Let me say, the way these folks do it (high-level library functions first, primitive data structures later, then OO at the end) is surely the way to go. What's more, this book gets you in the habit of elegant, modular programming, although its main focus is on problem-solving, not style."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It seems that someone, in the end, has found a way to teach C++ in a non-painful way. I think that by learning C++ using example and high level classes is better than explaining any detail about the data type and pointer - although this is important too -.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4968237271495559346?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4968237271495559346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/accelerated-c-practical-programming-by.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4968237271495559346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4968237271495559346'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/05/accelerated-c-practical-programming-by.html' title='Accelerated C++: Practical Programming by Example'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8065229778562847879</id><published>2009-03-01T05:03:00.000-08:00</published><updated>2010-05-13T08:25:02.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>The World's first web server</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qfh6a6uZa-8/S-wZvqey2CI/AAAAAAAAA7w/iCnoOUIfLig/s1600/NeXTstation.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 315px;" src="http://3.bp.blogspot.com/_qfh6a6uZa-8/S-wZvqey2CI/AAAAAAAAA7w/iCnoOUIfLig/s320/NeXTstation.jpg" alt="" id="BLOGGER_PHOTO_ID_5470775953996306466" border="0" /&gt;&lt;/a&gt;The world's first web server was the &lt;a href="http://en.wikipedia.org/wiki/NeXTstation"&gt;NeXTstation&lt;/a&gt; used by &lt;a href="http://en.wikipedia.org/wiki/Tim_Berners-Lee"&gt;Tim Banners Lee&lt;/a&gt; at &lt;a href="http://public.web.cern.ch/public/"&gt;CERN&lt;/a&gt;. The manufacturer is &lt;a href="http://en.wikipedia.org/wiki/NeXT"&gt;NeXT, inc&lt;/a&gt; founded by &lt;a href="http://en.wikipedia.org/wiki/Steve_Jobs"&gt;Steve Jobs&lt;/a&gt;. NeXT was acquired by Apple and &lt;a href="http://en.wikipedia.org/wiki/NeXTSTEP"&gt;NeXTSTEP&lt;/a&gt; was used to build the operating system of the lastest Mac: &lt;a href="http://en.wikipedia.org/wiki/Mac_OS_X"&gt;Max OS X&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://info.cern.ch/"&gt;http://info.cern.ch/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8065229778562847879?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8065229778562847879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/03/worlds-first-web-server.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8065229778562847879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8065229778562847879'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/03/worlds-first-web-server.html' title='The World&apos;s first web server'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qfh6a6uZa-8/S-wZvqey2CI/AAAAAAAAA7w/iCnoOUIfLig/s72-c/NeXTstation.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8616577012394308529</id><published>2009-02-26T08:20:00.000-08:00</published><updated>2009-02-26T08:22:42.330-08:00</updated><title type='text'>How to get the properties of an object with PHP</title><content type='html'>How to get the properties of an object:  &lt;br /&gt;&lt;br /&gt; $ref = new ReflectionClass('User');&lt;br /&gt;    $props = $ref-&gt;getProperties();&lt;br /&gt;    foreach($props as $prop) {&lt;br /&gt;        echo $prop-&gt;name .'&lt;br /&gt;';&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;In this case the properties of the class User will be printed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8616577012394308529?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8616577012394308529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/how-to-get-properties-of-object-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8616577012394308529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8616577012394308529'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/how-to-get-properties-of-object-with.html' title='How to get the properties of an object with PHP'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2371646887448928609</id><published>2009-02-20T07:18:00.000-08:00</published><updated>2009-02-20T07:30:01.013-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss Eclipse'/><title type='text'>JBoss AS Tools</title><content type='html'>After testing JSP and Servlet with Tomcat, inside Eclipse, I thought to try JBoss AS, the famous application server of Jboss. How to install JBoss AS and JBoss AS Tools in Eclipse:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download JBoss AS 5, decompress it in a directory.&lt;/li&gt;&lt;li&gt;In Eclipse, click on Help -&gt; Software updates and Add-ons, type jboss in the filter and press enter.&lt;/li&gt;&lt;li&gt;Flag 'JBoss Tools Relaese' and follow the simple installation procedure.&lt;/li&gt;&lt;li&gt;Then click in Window -&gt; Preferences -&gt; Server -&gt; Runtime Environments, click on 'Add', select the directory where you have extracted JBoss AS, select the JRE (I think that it should be and SDK). Click on 'Finish'.&lt;/li&gt;&lt;/ol&gt;Now JBoos AS is installed and can be start, stop inside Eclipse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2371646887448928609?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2371646887448928609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/jboss-as-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2371646887448928609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2371646887448928609'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/jboss-as-tools.html' title='JBoss AS Tools'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-3231835507033840704</id><published>2009-02-20T07:12:00.000-08:00</published><updated>2009-02-20T07:15:29.313-08:00</updated><title type='text'>Developing Web applications with Tomcat and Eclipse</title><content type='html'>I have found a nice article about the &lt;a href="http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html"&gt;development of Java web applications&lt;/a&gt; with Eclipse. It is the best and quickest article that I have ever seen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-3231835507033840704?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/3231835507033840704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/developing-web-applications-with-tomcat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3231835507033840704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/3231835507033840704'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/developing-web-applications-with-tomcat.html' title='Developing Web applications with Tomcat and Eclipse'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7360578514279041119</id><published>2009-02-19T01:20:00.000-08:00</published><updated>2009-02-19T01:24:14.655-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend PHP'/><title type='text'>Zend Server Public Beta</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Zend&lt;/span&gt; has released a new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;PHP&lt;/span&gt; application server. Now &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Zend&lt;/span&gt; Core and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Zend&lt;/span&gt; Platform are distributed &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;together&lt;/span&gt;. From the product description:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fully supported and certified distribution of PHP 5.2&lt;/li&gt;&lt;li&gt;Fully supported Zend Framework 1.7 release&lt;/li&gt;&lt;li&gt;Integrated native installers (RPM/DEB/MSI)&lt;/li&gt;&lt;li&gt;Web-based administration Interface&lt;/li&gt;&lt;li&gt;Comprehensive out-of-the-box database connectivity&lt;/li&gt;&lt;li&gt;Powerful PHP monitoring capabilities to identify problems and help fix them quickly&lt;/li&gt;&lt;li&gt;URL-based output caching required by today's modern web applications&lt;/li&gt;&lt;li&gt;Zend Optimizer+ - byte code cache to boost application performance&lt;/li&gt;&lt;li&gt;New "Guard Loader" to enable processing of Zend Guard encoded files&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7360578514279041119?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7360578514279041119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/zend-server-public-beta.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7360578514279041119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7360578514279041119'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/zend-server-public-beta.html' title='Zend Server Public Beta'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8673531925547920985</id><published>2009-02-04T02:13:00.000-08:00</published><updated>2009-02-04T02:21:52.945-08:00</updated><title type='text'>Andi Gutmans is the new CEO of Zend Technologies</title><content type='html'>Andi Gutmans, founder of Zend is the new CEO. He was senior vice president of R&amp;amp;D.&lt;br /&gt;&lt;br /&gt;Cameron Lester said that Zend Technologies, with Andi as CEO, will be more effective in its innovation strategies. This, in my opinion, is a signal that Zend is continuing in his strategy to bring more innovation in his IT consulting services and technologies.&lt;br /&gt;&lt;br /&gt;Mark Burton, former executive vice president of MySql, is now executive chairman.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8673531925547920985?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8673531925547920985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/andi-gutmans-is-new-ceo-of-zend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8673531925547920985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8673531925547920985'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/02/andi-gutmans-is-new-ceo-of-zend.html' title='Andi Gutmans is the new CEO of Zend Technologies'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-2044293609582284312</id><published>2009-01-23T01:58:00.000-08:00</published><updated>2009-01-23T02:05:33.874-08:00</updated><title type='text'>The Decline and Fall of Agile</title><content type='html'>I have found an interesting post in a blog that is talking about that there are many failures in the  software development using Agile methods. One thing to learn from that post is that Agile is hard to apply and most of the time the teams use only a part of the methods. Using only a part of those methods means that the team will fails to use Agile. This type of problem is even wrose using Scrum.&lt;br /&gt;&lt;br /&gt;The post: &lt;a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html"&gt;http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-2044293609582284312?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/2044293609582284312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/decline-and-fall-of-agile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2044293609582284312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/2044293609582284312'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/decline-and-fall-of-agile.html' title='The Decline and Fall of Agile'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-1710543175573399167</id><published>2009-01-16T02:41:00.000-08:00</published><updated>2009-01-16T02:57:28.845-08:00</updated><title type='text'>Beginning POJOs: Lightweight Java Web Development Using Plain Old Java Objects in Spring, Hibernate, and Tapestry</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.apress.com/resource/bookcover/9781590595961?size=medium"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 241px; height: 316px;" src="http://www.apress.com/resource/bookcover/9781590595961?size=medium" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.apress.com/book/view/1590595963"&gt;This new book&lt;/a&gt; from Apress seems to me very interesting: it covers a lightweight development way for J2EE. The main tools and technologies are covered:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Eclipse&lt;/li&gt;&lt;li&gt;Ant&lt;/li&gt;&lt;li&gt;Spring&lt;/li&gt;&lt;li&gt;Hibernate&lt;/li&gt;&lt;li&gt;Jboss Seam&lt;/li&gt;&lt;/ul&gt;I think I will order one because I was looking for a book providing an integrated approach to the overmentioned tools and frameworks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-1710543175573399167?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/1710543175573399167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/beginning-pojos-lightweight-java-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1710543175573399167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/1710543175573399167'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/beginning-pojos-lightweight-java-web.html' title='Beginning POJOs: Lightweight Java Web Development Using Plain Old Java Objects in Spring, Hibernate, and Tapestry'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-8623572097532137844</id><published>2009-01-10T11:50:00.000-08:00</published><updated>2009-01-10T11:59:02.661-08:00</updated><title type='text'>My new car</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qfh6a6uZa-8/SWj8IKPsoKI/AAAAAAAAAOA/Q1KRl8gba7c/s1600-h/vx220-buy.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_qfh6a6uZa-8/SWj8IKPsoKI/AAAAAAAAAOA/Q1KRl8gba7c/s320/vx220-buy.jpg" alt="" id="BLOGGER_PHOTO_ID_5289754979465994402" border="0" /&gt;&lt;/a&gt;I am going to buy this VX220. I have driven this car and I must admin that I was very impressed.  A very nice experience. The engine is not so powerful - the previous Honda Integra that I owned had a fantastic engine -, but the difference is the frame and the light weight. With this car I will really enjoy driving, even in the every day life. Yes, it is not a very handy car and I am happy that it is not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-8623572097532137844?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/8623572097532137844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/my-new-car.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8623572097532137844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/8623572097532137844'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/my-new-car.html' title='My new car'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qfh6a6uZa-8/SWj8IKPsoKI/AAAAAAAAAOA/Q1KRl8gba7c/s72-c/vx220-buy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-7178506537558237720</id><published>2009-01-06T05:48:00.000-08:00</published><updated>2009-01-06T05:57:18.359-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA BPM Orchestration'/><title type='text'>ActiveVOS</title><content type='html'>&lt;a href="http://www.activevos.com/"&gt;http://www.activevos.com&lt;/a&gt; is the web site of Active Endpoints. ActiveVOS is "the world's first all-in-one, standards-based visual orchestration system -- is the only SOA-based process orchestration and business process management (BPM)".&lt;br /&gt;&lt;br /&gt;If you are interested in SOA development and business process management you can find more information here: &lt;a href="http://www.activevos.com/indepth.php"&gt;http://www.activevos.com/indepth.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-7178506537558237720?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/7178506537558237720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/activevos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7178506537558237720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/7178506537558237720'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/activevos.html' title='ActiveVOS'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1110641097953748292.post-4288780753757301049</id><published>2009-01-05T04:01:00.000-08:00</published><updated>2009-01-05T04:14:40.477-08:00</updated><title type='text'>New Blog</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;This is my first post on this new blog. I am a web &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;developer&lt;/span&gt; working for an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;FTSE&lt;/span&gt; 100 company in the UK. I develop in &lt;a href="http://www.php.net/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;PHP&lt;/span&gt; &lt;/a&gt;using the &lt;a href="http://www.qcodo.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Qcodo&lt;/span&gt; &lt;/a&gt;framework, but I am studying &lt;a href="http://grails.org/"&gt;GRAILS&lt;/a&gt; and &lt;a href="http://www.adobe.com/products/flex/"&gt;FLEX&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this blog I will post articles and news about software development/engineering. I hope that you will find it helpful. do not &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;hesitate&lt;/span&gt; to contact me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1110641097953748292-4288780753757301049?l=riccardotacconi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://riccardotacconi.blogspot.com/feeds/4288780753757301049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/new-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4288780753757301049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1110641097953748292/posts/default/4288780753757301049'/><link rel='alternate' type='text/html' href='http://riccardotacconi.blogspot.com/2009/01/new-blog.html' title='New Blog'/><author><name>Riccardo Tacconi</name><uri>http://www.blogger.com/profile/15830685266951613839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_qfh6a6uZa-8/TKMQwbTiZjI/AAAAAAAAA-0/PzoHlSyqsc4/S220/ruby.png'/></author><thr:total>0</thr:total></entry></feed>
