<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>1up4developers &#187; web</title>
	<atom:link href="http://1up4dev.org/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://1up4dev.org</link>
	<description>Nadando contra o Waterfall. tail -f /mind/realworld &#62;&#62; /blog</description>
	<lastBuildDate>Tue, 08 Nov 2011 11:00:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Dica Rápida: Removendo o test unit de um projeto Rails 3</title>
		<link>http://1up4dev.org/2011/11/dica-rapida-removendo-o-test-unit-de-um-projeto-rails-3/</link>
		<comments>http://1up4dev.org/2011/11/dica-rapida-removendo-o-test-unit-de-um-projeto-rails-3/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 11:00:28 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=1114</guid>
		<description><![CDATA[TweetEste post serve mais como &#8220;cola&#8221; de referência, pois toda vez que vou fazer isso eu não encontro fácil no google e nunca lembro. Por sinal é mega simples, é só editar o config/application.rb e remover a linha: require 'rails/all' E substituir por: &#8230; <a href="http://1up4dev.org/2011/11/dica-rapida-removendo-o-test-unit-de-um-projeto-rails-3/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/11/dica-rapida-removendo-o-test-unit-de-um-projeto-rails-3/" data-text="Dica Rápida: Removendo o test unit de um projeto Rails 3" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/11/dica-rapida-removendo-o-test-unit-de-um-projeto-rails-3/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Este post serve mais como &#8220;cola&#8221; de referência, pois toda vez que vou fazer isso eu não encontro fácil no google e nunca lembro. Por sinal é mega simples, é só editar o <em>config/application.rb</em> e remover a linha:</p>
<pre>require 'rails/all'</pre>
<p>E substituir por:</p>
<pre>require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"</pre>
<p>Após isso, já não aparece mais as tasks de testes, e você pode remover a pasta test.</p>
<pre>$ git rm -r test/</pre>
<p>Pra finalizar, já segue a dica de alterar a task <em>default</em>, no final do <em>Rakefile</em> é só colocar:</p>
<pre>Rake::Task[:default].prerequisites.clear
task :default =&gt; :spec  #no caso do rspec</pre>
<p>Sucesso!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/11/dica-rapida-removendo-o-test-unit-de-um-projeto-rails-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Tutorial] Configurando o ambiente de desenvolvimento Ruby: RVM</title>
		<link>http://1up4dev.org/2011/08/tutorial-configurando-o-ambiente-de-desenvolvimento-ruby-rvm/</link>
		<comments>http://1up4dev.org/2011/08/tutorial-configurando-o-ambiente-de-desenvolvimento-ruby-rvm/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 09:00:19 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=1069</guid>
		<description><![CDATA[TweetSe você ainda não trabalha com Ruby pois acha complicado demais instalá-lo, chega de desculpas! Esse tutorial for dummies ajudará a instalar o Ruby através do RVM de forma direta, sem enrolação. Partindo de uma instalação do Ubuntu 11.04 zerada, &#8230; <a href="http://1up4dev.org/2011/08/tutorial-configurando-o-ambiente-de-desenvolvimento-ruby-rvm/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/08/tutorial-configurando-o-ambiente-de-desenvolvimento-ruby-rvm/" data-text="[Tutorial] Configurando o ambiente de desenvolvimento Ruby: RVM" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/08/tutorial-configurando-o-ambiente-de-desenvolvimento-ruby-rvm/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Se você ainda não trabalha com <a href="http://www.ruby-lang.org/pt/" target="_blank">Ruby</a> pois acha complicado demais instalá-lo, chega de desculpas! Esse tutorial <del>for dummies</del> ajudará a instalar o Ruby através do <a href="http://beginrescueend.com/" target="_blank">RVM</a> de forma direta, sem enrolação.</p>
<p>Partindo de uma instalação do <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> 11.04 zerada, começamos com os pré-requisitos para instalar o RVM:</p>
<pre>user@ubuntu:~$ sudo apt-get install git-core curl</pre>
<p>Basta confirmar a instalação dos pacotes, em seguida executar o comando (extraído do site oficial do RVM):</p>
<pre>user@ubuntu:~$ bash &lt; &lt;(curl -s https://rvm.beginrescueend.com/install/rvm)</pre>
<p>A seguir, o output completo gerado por esse comando indicará os pacotes e libs necessários para a instalação do Ruby.</p>
<pre>(...)

dependencies:
# For RVM
  rvm: bash curl git

# For Ruby (MRI &amp; ree)  you should install the following OS dependencies:
  ruby: /usr/bin/apt-get install <strong>build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake</strong>

(...)

Installation of RVM to /home/user/.rvm/ is complete.</pre>
<p>Agora, basta instalar essas libs através do apt-get:</p>
<pre>user@ubuntu:~$ sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake</pre>
<p>Com as dependências instaladas, abra um novo console (para re-carregar o RVM), e comece a instalar o Ruby, no caso, o MRI 1.8.7:</p>
<pre>user@ubuntu:~$ rvm install 1.8.7</pre>
<p>Esta operação levará alguns minutos. Quando concluída, você terá o Ruby 1.8.7 e o <a href="http://rubygems.org/" target="_blank">Rubygems</a> 1.8.6 instalados. Para testar tudo, execute os seguintes comandos:</p>
<pre>user@ubuntu:~$ rvm use --default 1.8.7
Using /home/user/.rvm/gems/ruby-1.8.7-p352</pre>
<pre>user@ubuntu:~$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]</pre>
<pre>user@ubuntu:~$ gem -v
1.8.6</pre>
<p>Pronto! Agora você tem o Ruby e Rubygems instalados e prontos para o uso. Caso queira conferir, o output dos comandos acima está disponível <a href="https://gist.github.com/1157378" target="_blank">neste gist</a>.</p>
<p>Fique ligado no próximo post: Gemsets e Bundler. Qualquer dúvida, use os comentários.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/08/tutorial-configurando-o-ambiente-de-desenvolvimento-ruby-rvm/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Throw Legacy &#8211; Part I &#8211; Continuous testing with Java</title>
		<link>http://1up4dev.org/2011/04/throw-legacy-part-i-continuous-testing-with-java/</link>
		<comments>http://1up4dev.org/2011/04/throw-legacy-part-i-continuous-testing-with-java/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 11:27:29 +0000</pubDate>
		<dc:creator>andrefarina</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=967</guid>
		<description><![CDATA[TweetThis is my first blog post and I decide to write in English because writing is a good way to learning and I’d like to improve my English, so post a comment if you see some grammar errors. JRuby has &#8230; <a href="http://1up4dev.org/2011/04/throw-legacy-part-i-continuous-testing-with-java/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/04/throw-legacy-part-i-continuous-testing-with-java/" data-text="Throw Legacy &#8211; Part I &#8211; Continuous testing with Java" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/04/throw-legacy-part-i-continuous-testing-with-java/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>This is my first blog post and I decide to write in English because writing is a good way to learning and I’d like to improve my English, so post a comment if you see some grammar errors. <img src='http://1up4dev.org/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </p>
<p>JRuby has helped me a lot bringing Ruby test “culture” into Java with RSpec.<br />
In this series of blog posts I will show how I’m doing tests with Java legacy code. I will try cover topics including testing dao, service, controller and view layers.<br />
In this part, we’re going to set up our development environment, write a RSpec example and implement with Java through JRuby. We’ll also get continuous testing running with infinity test gem.</p>
<p>The first thing we need is install <a href="https://rvm.beginrescueend.com/" target="_blank">rvm (Ruby Version Manager)</a>, <a href="http://www.jruby.org/" target="_blank">JRuby</a> and <a href="http://rubygems.org/" target="_blank">Ruby Gems</a>.</p>
<pre>bash &lt;&lt; ( curl http://rvm.beginrescueend.com/releases/rvm-install-head )</pre>
<p><a title="http://rvm.beginrescueend.com/rvm/install/" href="http://rvm.beginrescueend.com/rvm/install/" target="_blank">http://rvm.beginrescueend.com/rvm/install/</a> for more info.</p>
<p>Install JRuby:</p>
<pre>rvm install jruby</pre>
<p>Set rvm to use JRuby:</p>
<pre>rvm use jruby</pre>
<p>Install RSpec:</p>
<pre>gem install rspec</pre>
<p>Once you have finish installation let’s start code with a example that expresses a form of payment orders available in Brazil called Boleto.</p>
<p>Create the initial project structure like this:</p>
<pre>-boleto
  -spec
  -src
    -com
      -legacy
  -build</pre>
<p>Open up <strong>spec/boleto_spec.rb</strong> and make it look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;date&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;java&quot;</span>
java_import <span style="color:#996600;">&quot;com.legacy.Boleto&quot;</span>
&nbsp;
describe Boleto <span style="color:#9966CC; font-weight:bold;">do</span>
  it <span style="color:#996600;">&quot;calculates due days&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    boleto = Boleto.<span style="color:#9900CC;">new</span>
    boleto.<span style="color:#9900CC;">due_date</span> = java.<span style="color:#9900CC;">util</span>.<span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;2011-01-15&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">ctime</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    boleto.<span style="color:#9900CC;">payment_date</span> = java.<span style="color:#9900CC;">util</span>.<span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;2011-01-25&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">ctime</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    boleto.<span style="color:#9900CC;">due_days</span>.<span style="color:#9900CC;">should</span> == <span style="color:#006666;">10</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Let&#8217;s run the example and watch it fail.</p>
<pre>jruby -J-cp build -S rspec spec/boleto_spec.rb</pre>
<pre>NameError: cannot load Java class com.legacy.Boleto</pre>
<p>Now write just enough code to make it pass on <strong>src/com/legacy/Boleto.java</strong> like this:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.legacy</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Boleto <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> dueDate<span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Date</span> paymentDate<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Date</span> getDueDate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">dueDate</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setDueDate<span style="color: #009900;">&#40;</span><span style="color: #003399;">Date</span> dueDate<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">dueDate</span> <span style="color: #339933;">=</span> dueDate<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Date</span> getPaymentDate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paymentDate</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setPaymentDate<span style="color: #009900;">&#40;</span><span style="color: #003399;">Date</span> paymentDate<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paymentDate</span> <span style="color: #339933;">=</span> paymentDate<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Integer</span> getDueDays<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Also we need to compile the java class.</p>
<pre>javac -d build/ src/com/legacy/Boleto.java</pre>
<p>Instead of run the example by manual command again, let’s install a continuous testing gem:</p>
<pre>wget --no-check-certificate\

http://www.github.com/tomas-stefano/infinity_test/tarball/master\

 -O infinity_test.tar.gz
tar -zxvf infinity_test.tar.gz
cd tomas-stefano-infinity_test-{version}
gem build infinity_test.gemspec
gem install infinity_test-1.0.2.gem</pre>
<p>What we have done here is install infinity_test gem that contains a path to pass arguments to specific versions of Ruby.</p>
<p>Let&#8217;s run the example with continuous testing gem:</p>
<pre>infinity_test --rspec --rubies=jruby+"-J-cp build"</pre>
<p>Now we can write a test for code on <strong>spec/boleto_spec.rb</strong> and Infinity Test automatic runs the test.<br />
Also we can create a .infinity_test file, like this:</p>
<pre>infinity_test do
  use :rubies =&gt; %w(jruby),
    :specific_options =&gt; {'jruby' =&gt; '-J-cp build'},
    :test_framework =&gt; :rspec
  notifications :lib_notify   # for linux / growl for mac
end</pre>
<p>And run:</p>
<pre>infinity_test</pre>
<p><img src="http://1up4dev.org/wp-content/uploads/2011/04/infinity_test.png" alt="infinity_test jruby" width="640" height="150" /><br />
<a title="https://github.com/tomas-stefano/infinity_test/wiki/Customize-Infinity-Test" href="https://github.com/tomas-stefano/infinity_test/wiki/Customize-Infinity-Test" target="_blank">https://github.com/tomas-stefano/infinity_test/wiki/Customize-Infinity-Test</a> for more info.</p>
<p>However, we have to compile the java classes when they change. The solution we came up with is to use editors like <a title="http://www.eclipse.org/" href="http://www.eclipse.org/" target="_blank">eclipse</a> or <a title="http://eclim.org/" href="http://eclim.org/" target="_blank">eclim</a>. This kind of editor auto-recompile Java files whenever they change.</p>
<p>Last notes</p>
<ul>
<li>I&#8217;ve posted the code for boleto here <a title="https://github.com/andref5/rspec-java" href="https://github.com/andref5/rspec-java" target="_blank">https://github.com/andref5/rspec-java</a></li>
<li>More info about JRuby
<ul>
<li> <a title="https://github.com/jruby/jruby/wiki" href="https://github.com/jruby/jruby/wiki" target="_blank">https://github.com/jruby/jruby/wiki</a></li>
<li> <a title="http://pragprog.com/titles/jruby/using-jruby" href="http://pragprog.com/titles/jruby/using-jruby" target="_blank">http://pragprog.com/titles/jruby/using-jruby</a></li>
</ul>
</li>
<li>More info about RSpec
<ul>
<li> <a title="http://relishapp.com/rspec" href="http://relishapp.com/rspec" target="_blank">http://relishapp.com/rspec</a></li>
<li> <a title="http://kerryb.github.com/iprug-rspec-presentation" href="http://kerryb.github.com/iprug-rspec-presentation" target="_blank">http://kerryb.github.com/iprug-rspec-presentation</a></li>
<li> <a title="http://pragprog.com/titles/achbd/the-rspec-book" href="http://pragprog.com/titles/achbd/the-rspec-book" target="_blank">http://pragprog.com/titles/achbd/the-rspec-book</a></li>
</ul>
</li>
<li>More info about Infinity_test
<ul>
<li> <a title="https://github.com/tomas-stefano/infinity_test" href="https://github.com/tomas-stefano/infinity_test" target="_blank">https://github.com/tomas-stefano/infinity_test</a></li>
</ul>
</li>
<li>More info about Ruby
<ul>
<li> <a title="http://mislav.uniqpath.com/poignant-guide/book/" href="http://mislav.uniqpath.com/poignant-guide/book/" target="_blank">http://mislav.uniqpath.com/poignant-guide/book/</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/04/throw-legacy-part-i-continuous-testing-with-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CoffeeScript quem?</title>
		<link>http://1up4dev.org/2011/04/coffescript-what/</link>
		<comments>http://1up4dev.org/2011/04/coffescript-what/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 13:20:26 +0000</pubDate>
		<dc:creator>Plínio Balduino</dc:creator>
				<category><![CDATA[novidades da semana]]></category>
		<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[coffee script]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=934</guid>
		<description><![CDATA[TweetMuito buzz se formou depois que o DHH tornou público que a versão 3.1 do Rails virá com CofeeScript por padrão. Aproveitando a barulheira, que é comum a cada vez que o criador da plataforma abre a boca, vamos nos &#8230; <a href="http://1up4dev.org/2011/04/coffescript-what/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/04/coffescript-what/" data-text="CoffeeScript quem?" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/04/coffescript-what/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Muito buzz se formou depois que o DHH tornou público que a versão 3.1 do Rails virá com CofeeScript por padrão.</p>
<p>Aproveitando a barulheira, que é comum a cada vez que o criador da plataforma abre a boca, vamos nos ater ao que é importante e apresentar uma introdução ao resumo simplificado do CoffeeScript básico.</p>
<p>Confesso que minha opinião sobre essa ferramenta mudou nos primeiros instantes em que comecei a usar. No site do CoffeeScript (ok se eu começar a chamar de CS daqui para frente?) existe um link onde você digita o código do lado esquerdo e, imediatamente, do lado direito aparece o equivalente em JavaScript.</p>
<p>Fiz uma brincadeira lá usando um código que sempre me vem à cabeça ao tentar explicar o básico de programação funcional para alguem. Segue:</p>
<pre>mimimi = (operation, value) ->
   operation(value);

dobro = (value) ->
  value + value;

quadrado = (value) ->
  value * value;

zero = (value) ->
  value - value;

um = (value) ->
  value / value;

alert(mimimi(dobro, 3));
alert(mimimi(quadrado, 3));
alert(mimimi(zero, 3));
alert(mimimi(um, 3));</pre>
<p>Nada de outro mundo, certo? O equivalente JS é o código abaixo:</p>
<pre>var dobro, mimimi, quadrado, um, zero;
mimimi = function(operation, value) {
  return operation(value);
};
dobro = function(value) {
  return value + value;
};
quadrado = function(value) {
  return value * value;
};
zero = function(value) {
  return value - value;
};
um = function(value) {
  return value / value;
};
alert(mimimi(dobro, 3));
alert(mimimi(quadrado, 3));
alert(mimimi(zero, 3));
alert(mimimi(um, 3));</pre>
<p>CS permite também a checagem automática de valores e parâmetros opcionais, conforme o exemplo retirado do site:</p>
<pre>fill = (container, liquid = "coffee") -&gt;
  "Filling the #{container} with #{liquid}..."</pre>
<p>Ou o equivalente em JS:</p>
<pre>var fill;
fill = function(container, liquid) {
  if (liquid == null) {
    liquid = "coffee";
  }
  return "Filling the " + container + " with " + liquid + "...";
};</pre>
<p>Sem dúvida, muito mais legível e expressivo.</p>
<p>É uma ferramenta que eu pretendo usar em algum projeto pequeno, para testar e ver o quanto acelera meu trabalho. Em projetos maiores talvez eu demore um pouco mais para usar mas, considerando que umas das minhas aplicações já conta com 79% de código total escrito em JavaScript, segundo o GitHub, imagino que isso vai melhorar consideravelmente a manutenção do código.</p>
<p>E no mais, se o CS não te chamou a atenção e você não quer mesmo utilizar, basta remover o require do arquivo Gemfiles e a vida segue como se nada tivesse acontecido.</p>
<p>Links recomendados:</p>
<ul>
<li>Site do CoffeScript: <a title="http://jashkenas.github.com/coffee-script/" href="http://jashkenas.github.com/coffee-script/" target="_blank">http://jashkenas.github.com/coffee-script/</a></li>
<li>Mais do mesmo: <a title="http://www.rubyinside.com/rails-3-1-adopts-coffeescript-jquery-sass-and-controversy-4669.html" href="http://www.rubyinside.com/rails-3-1-adopts-coffeescript-jquery-sass-and-controversy-4669.html" target="_blank">http://www.rubyinside.com/rails-3-1-adopts-coffeescript-jquery-sass-and-controversy-4669.html</a></li>
<li>Exemplo bacana de como utilizar CS dentro da sua view: <a title="http://geekiriki.blogspot.com/2010/08/jquery-meets-coffeescript.html" href="http://geekiriki.blogspot.com/2010/08/jquery-meets-coffeescript.html" target="_blank">http://geekiriki.blogspot.com/2010/08/jquery-meets-coffeescript.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/04/coffescript-what/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pesquisa de pré-lançamento do Sitefique.me</title>
		<link>http://1up4dev.org/2011/03/pesquisa-de-pre-lancamento-do-sitefique-me/</link>
		<comments>http://1up4dev.org/2011/03/pesquisa-de-pre-lancamento-do-sitefique-me/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 09:00:31 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[real world]]></category>
		<category><![CDATA[sitefique.me]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=903</guid>
		<description><![CDATA[TweetPessoal, hoje estamos lançando a pesquisa de intenção do nosso próximo produto: Sitefique.me, uma ferramenta online para criação de sites focado na simplicidade. Sobre o produto A idéia surgiu há vários anos mas somente agora nos sentimos experientes o suficiente &#8230; <a href="http://1up4dev.org/2011/03/pesquisa-de-pre-lancamento-do-sitefique-me/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/03/pesquisa-de-pre-lancamento-do-sitefique-me/" data-text="Pesquisa de pré-lançamento do Sitefique.me" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/03/pesquisa-de-pre-lancamento-do-sitefique-me/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Pessoal, hoje estamos lançando a <a href="http://sitefique.me/pesquisa" target="_blank">pesquisa de intenção</a> do nosso próximo produto: <a href="http://sitefique.me/" target="_blank">Sitefique.me</a>, uma ferramenta online para <strong>criação de sites</strong> focado na <strong>simplicidade</strong>.</p>
<h2>Sobre o produto</h2>
<p><a href="http://sitefique.me"><img class="aligncenter" title="Sitefique.me" src="http://media.tumblr.com/tumblr_li2zsoYtUc1qghpef.png" alt="" width="500" height="471" /></a></p>
<p>A idéia surgiu há vários anos mas somente agora nos sentimos <a href="http://1up4dev.com/quem-somos" target="_blank">experientes o suficiente</a> para tirá-la do papel mantendo sua principal característica: ser <strong>simples</strong>. Se você acompanha nosso blog já deve ter notado que <a href="http://1up4dev.org/2011/02/complexidade-nao-escala/" target="_blank">nossa</a> <a href="http://1up4dev.org/2010/05/rubygems-snapshot-importandoexportando-gems-com-velocidade/" target="_blank">busca</a> <a href="http://1up4dev.org/2009/12/agile-enterprise-edition/" target="_blank">por</a> <strong><a href="http://1up4dev.org/2008/11/foco-no-problema/" target="_blank">simplicidade</a></strong> é <a href="http://1up4dev.org/2008/10/software-e-sobre-investimento/" target="_blank">uma</a> <a href="http://1up4dev.org/?s=simples" target="_blank">constante</a> (e não é uma coisa fácil de se encontrar nos <a href="http://1up4dev.org/2008/12/agilidade-cascateira/" target="_blank">ambientes</a> <a href="http://1up4dev.org/2008/06/guerrilha-agile-parte-1/" target="_blank">corporativos</a>).</p>
<p>Foi seguindo essa filosofia, de ser <strong>simples</strong>, que <a href="http://1up4dev.org/2011/02/pare-de-chorar-e-mexa-se/" target="_blank">decidimos</a> criar o <a href="http://sitefique.me" target="_blank">Sitefique.me</a>, voltado para <strong>pequenas empresas</strong>, que têm a necessidade de um <strong>site próprio</strong>, <strong>divulgar seus produtos</strong> e <strong>serviços</strong> ou até mesmo <strong>vendê-los pela internet</strong>, mas que ainda não encontraram a ferramenta na medida ou que <strong>coubesse no orçamento da empresa</strong>.</p>
<p>O <a href="http://sitefique.me/">Sitefique.me</a> permite <strong>criar um site</strong> do zero em poucos minutos, escolhendo um <strong>layout</strong> que pode ser <strong>personalizado</strong>, e <strong>criar páginas</strong> a partir de <strong>modelos</strong> prontos como <strong>vitrine de serviços</strong>, <strong>álbum de fotos</strong>, <strong>localização</strong> com <strong>mapa</strong> e formulário para <strong>contato</strong>. Tudo muito <strong>simples</strong> e direto ao ponto.</p>
<h2>Precisamos da sua ajuda</h2>
<p>A versão final do produto ainda não está disponível. Estamos finalizando os detalhes, cuidando de alguns assuntos legais, e passando aquele pente fino no código, mas pretendemos lançá-lo nas <strong>próximas semanas</strong>.<br />
Por enquanto, gostaríamos que <a href="http://sitefique.me/pesquisa" target="_blank">respondessem nossa pesquisa de intenção</a>, para nos ajudar a decidir sobre alguns pontos do produto, como valores e planos. Quem responder nossa pesquisa e tiver interessado no produto, será <strong>convidado</strong> para testá-lo <strong>antes do lançamento</strong> oficial e ainda ganhará o <strong>primeiro mês</strong> de mensalidade <strong>grátis</strong>, sem compromisso.</p>
<p>Infelizmente não possuímos capital para investir na <strong>divulgação</strong>. Tudo que fizemos até agora foi com nosso próprio dinheiro (servidores, etc) e nosso “tempo livre”. Por isso, pedimos <strong>sua ajuda</strong> para divulgá-lo:</p>
<ul>
<li>Se você apóia iniciativas de <strong>empreendedorismo</strong> como esta, <a href="http://sitefique.me" target="_blank">indique o produto</a> para seus contatos ou empresas que podem necessitar desta solução. Você também pode <strong><a href="http://twitter.com/share?_=1300160882340&amp;count=horizontal&amp;text=http%3A%2F%2Fsitefique.me%20Sua%20empresa%20na%20internet.%20Simples%2C%20r%C3%A1pido%20e%20do%20seu%20jeito!&amp;url=http%3A%2F%2Fmigre.me%2F44ARK&amp;via=sitefiqueme" target="_blank">retuitar</a></strong> para seus seguidores.</li>
<li>Se você é um <strong>desenvolvedor</strong>, como nós, nos ajude divulgando o produto para sua rede de contatos, como mais um “case” de <a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>. Você também pode <strong><a href="http://twitter.com/share?_=1300160882340&amp;count=horizontal&amp;text=http%3A%2F%2Fsitefique.me%20Sua%20empresa%20na%20internet.%20Simples%2C%20r%C3%A1pido%20e%20do%20seu%20jeito!&amp;url=http%3A%2F%2Fmigre.me%2F44ARK&amp;via=sitefiqueme" target="_blank">retuitar</a></strong> para seus seguidores.</li>
<li>Se você tem um <strong>tio</strong> ou um <strong>cunhado</strong> que pega no seu pé nos encontros de família: “Ei sobrinho, quando você vai fazer um site para minha lojinha”, nos ajude indicando o <a href="http://sitefique.me/">Sitefique.me</a>. De qualquer forma, você também pode <strong><a href="http://twitter.com/share?_=1300160882340&amp;count=horizontal&amp;text=http%3A%2F%2Fsitefique.me%20Sua%20empresa%20na%20internet.%20Simples%2C%20r%C3%A1pido%20e%20do%20seu%20jeito!&amp;url=http%3A%2F%2Fmigre.me%2F44ARK&amp;via=sitefiqueme" target="_blank">retuitar</a></strong> para seus seguidores.</li>
<li>Ou se você simplesmente já sofreu com a famosa <a href="http://imasters.com.br/artigo/13412/mercado/sindrome_do_sobrinho_reloaded/">Síndrome do Sobrinho</a>, com certeza nos ajudará a <strong><a href="http://twitter.com/share?_=1300160882340&amp;count=horizontal&amp;text=http%3A%2F%2Fsitefique.me%20Sua%20empresa%20na%20internet.%20Simples%2C%20r%C3%A1pido%20e%20do%20seu%20jeito!&amp;url=http%3A%2F%2Fmigre.me%2F44ARK&amp;via=sitefiqueme" target="_blank">retuitar</a></strong> para seus seguidores.</li>
</ul>
<h2>Muito obrigado.</h2>
<p><a href="http://twitter.com/share?_=1300160882340&amp;count=horizontal&amp;text=http%3A%2F%2Fsitefique.me%20Sua%20empresa%20na%20internet.%20Simples%2C%20r%C3%A1pido%20e%20do%20seu%20jeito!&amp;url=http%3A%2F%2Fmigre.me%2F44ARK&amp;via=sitefiqueme" target="_blank">Retuite para seus seguidores</a>. <a href="http://blog.sitefique.me" target="_blank">Assine o blog do produto</a>. <a href="http://1up4dev.com" target="_blank">Conheça a empresa</a>. <a href="http://1up4dev.com/contato" target="_blank">Entre em contato</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/03/pesquisa-de-pre-lancamento-do-sitefique-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentação não pode ser chato. Como fazer igual ao Rails Guides !</title>
		<link>http://1up4dev.org/2011/02/documentacao-nao-pode-ser-chato-como-fazer-igual-ao-rails-guides/</link>
		<comments>http://1up4dev.org/2011/02/documentacao-nao-pode-ser-chato-como-fazer-igual-ao-rails-guides/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 03:52:40 +0000</pubDate>
		<dc:creator>Roger Leite</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[documentação]]></category>
		<category><![CDATA[rails guides]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=878</guid>
		<description><![CDATA[TweetDocumentação é aquilo que você reclama para fazer e reclama quando não encontra. Por Plínio &#8220;Chico Xavier&#8221; via Twitter. Isto me fez refletir (bem rápido) sobre as possíveis causas da não-documentação: É muito chato ! Editar wiki, doc &#8230; é incrível &#8230; <a href="http://1up4dev.org/2011/02/documentacao-nao-pode-ser-chato-como-fazer-igual-ao-rails-guides/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/02/documentacao-nao-pode-ser-chato-como-fazer-igual-ao-rails-guides/" data-text="Documentação não pode ser chato. Como fazer igual ao Rails Guides !" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/02/documentacao-nao-pode-ser-chato-como-fazer-igual-ao-rails-guides/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><blockquote><p>Documentação é aquilo que você reclama para fazer e reclama quando não encontra.</p></blockquote>
<p>Por <a href="http://1up4dev.org/author/pbalduino/">Plínio</a> &#8220;Chico Xavier&#8221; via <a href="http://twitter.com/#!/p_balduino/status/35689585455407105">Twitter</a>.</p>
<p>Isto me fez refletir (bem rápido) sobre as possíveis causas da não-documentação:</p>
<ul>
<li>É muito chato ! Editar wiki, doc &#8230; é incrível como toda documentação geralmente é feita em algo não produtivo.</li>
<li>Espaço e Tempo (ou seja, prazo!). Sempre é deixado por último e nunca sobra tempo pra ser feito.</li>
<li>Não é levado a sério. Levanta a mão que já viu a secretária documentando &#8220;tela&#8221; de sistema &#8230; <img src='http://1up4dev.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
<li>Normalmente o &#8220;investidor&#8221; do software não vê valor nisto, ou melhor, espera alguém pedir e repassa a tarefa com prioridade &#8220;faz rapidinho&#8221;.</li>
</ul>
<p>Ok. Após reflexão feita, hora de atacar o problema.</p>
<h2>Usando &#8220;guides&#8221; para criar um Guide !</h2>
<p>Este é um resultado da experiência abaixo:</p>
<p style="text-align: center;"><a href="http://rogerleite.github.com/rubygems_snapshot/"><img class="aligncenter size-medium wp-image-891" title="Snapshot Guide (inspirado no Rails Guides)" src="http://1up4dev.org/wp-content/uploads/2011/02/snapshot_guide-300x241.png" alt="Snapshot Guide (inspirado no Rails Guides)" width="300" height="241" /></a></p>
<p>Com a gem <a href="https://github.com/wycats/guides">guides</a>, em segundos você tem um <em>scaffold</em>, pronto para ser preenchido.</p>
<pre><span style="font-family: Georgia, 'Bitstream Charter', serif; color: #444444;"><span style="line-height: 22px;">$ gem install guides</span></span></pre>
<pre><span style="font-family: Georgia, 'Bitstream Charter', serif; color: #444444;"><span style="line-height: 22px;"> </span></span><span style="color: #444444; font-family: Georgia, 'Bitstream Charter', serif; line-height: 22px;">$ guides #mostra os comandos disponíveis</span></pre>
<pre><span style="font-family: Georgia, 'Bitstream Charter', serif; color: #444444;"><span style="line-height: 22px;">$ guides new sample</span></span></pre>
<pre><span style="font-family: Georgia, 'Bitstream Charter', serif; color: #444444;"><span style="line-height: 22px;">$ cd sample</span></span></pre>
<pre><span style="font-family: Georgia, 'Bitstream Charter', serif; color: #444444;"><span style="line-height: 22px;">$ guides build &amp;&amp; guides preview</span></span></pre>
<p>Pronto. Em http://localhost:9292 você terá acesso ao novo guia gerado.</p>
<h3>Preenchendo o seu Guia</h3>
<p>Em <em>guides.yml</em> (exemplo <a href="https://github.com/rogerleite/rubygems_snapshot/blob/master/guides/guides.yml">aqui</a>), está o básico do seu Guia. Nele está o índice de &#8220;capítulos&#8221;, com resumo e nome do arquivo que o link deve seguir. Os arquivos textile  gerados/criados ficarão na pasta <em>source</em>, o resultado do &#8220;guides build&#8221; ficará na pasta <em>output</em>.</p>
<p>As páginas são em <a href="http://www.textism.com/tools/textile/">textile</a>, o que facilita bastante. Mas o grande diferencial, está em alguns <em>helpers</em> disponibilizados pela gem, que torna muito simples criar áreas de destaque como INFO, WARNING &#8230; etc e adicionar comandos e códigos.</p>
<p>Para ter idéia de uma página em textile, segue o link <a href="https://github.com/rogerleite/rubygems_snapshot/raw/master/guides/source/getting_started.textile">source/getting_started.textile</a> (raw).</p>
<h3>Repensando a documentação</h3>
<p>Com certeza, usando a <em>gem guides</em>, vocẽ consegue um boost na hora de documentar. Já evitando aquela chatice de editar wiki, .doc, controlando versão &#8230; etc. Usando textile, seu editor preferido e git, não tem mais desculpas.</p>
<h4>Desenvolvendo Frameworks e APIs</h4>
<p>Já faz um tempo que eu topo com a <em>vibe</em> <a href="http://www.google.com.br/search?sourceid=chrome&amp;ie=UTF-8&amp;q=Documentation+Driven+Development">Documentation Driven Development</a>. Como tudo na vida, é questão de bom senso. Documentar uma API, nada mais é do que definir a interface dela, e dependendo do caso, isto ajuda bastante antes de começar o desenvolvimento.</p>
<h4>Você é um Usuário !</h4>
<p>Uma documentação com um monte de imagem e seta, descrevendo o óbvio não serve para nada (além de passar raiva). Uma documentação <strong>sucinta</strong>, com o básico, por exemplo Instalação, Modo de Usar, Configurações Disponíveis é bem melhor que muito dossiê por aí ! Tente ao máximo se colocar no lugar do usuário ao escrever alguma documentação ou ajuda.</p>
<p>&#8212;</p>
<p>Não deixe de contribuir com o post. Mande sugestões, comentários, reclamações etc.</p>
<p><span style="line-height: 24px; font-size: 16px;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/02/documentacao-nao-pode-ser-chato-como-fazer-igual-ao-rails-guides/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Complexidade não escala!</title>
		<link>http://1up4dev.org/2011/02/complexidade-nao-escala/</link>
		<comments>http://1up4dev.org/2011/02/complexidade-nao-escala/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 09:00:00 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[questionamento]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[simplicidade]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=800</guid>
		<description><![CDATA[TweetEste é um assunto polêmico e que gera muita discussão nos escritórios de TI. Mesmo assim, tendo trabalhado em várias empresas, grandes e pequenas, presenciando vários projetos fracassarem por decisões arquiteturais (as gerenciais não contam nesse contexto), e os mesmos &#8230; <a href="http://1up4dev.org/2011/02/complexidade-nao-escala/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/02/complexidade-nao-escala/" data-text="Complexidade não escala!" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/02/complexidade-nao-escala/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Este é um assunto polêmico e que gera muita discussão nos escritórios de TI. Mesmo assim, tendo trabalhado em várias empresas, grandes e pequenas, presenciando vários projetos fracassarem por decisões arquiteturais (as gerenciais não contam nesse contexto), e os mesmos erros sendo cometidos repetidas vezes, sinto-me na obrigação de passar esta experiência e meu ponto de vista.</p>
<h3>Escalabilidade, por definição</h3>
<p>De acordo com a <a href="http://en.wikipedia.org/wiki/Scalability">Wikipedia</a>, <strong>escalabilidade</strong> <em>é uma característica desejável em todo o sistema que indica sua habilidade de manipular uma porção crescente de trabalho de forma uniforme, ou estar preparado para crescer.</em> Em outras palavras, um sistema deve estar preparado para suportar uma demanda crescente.</p>
<p>Pode ser classificada como:</p>
<ul>
<li>Carga de escalabilidade: um sistema distribuído deve ser fácil para ser expandido e usar sua gama de recursos para acomodar tanto exigências do mesmo sendo elas pouca ou excessiva.</li>
<li>Geograficamente escalável: um sistema é geograficamente escalável quando ele mantém sua utilidade e usabilidade, não obstante como são usados os seus recursos.</li>
<li>Escalabilidade administrativa: não importa a variação de informação que diferentes organizações necessitam compartilhar em um único sistema distribuído, ele deve permanecer fácil de ser usado e gerenciado.</li>
<li>Escalabilidade funcional: capacidade de melhorar o sistema, adicionando novas funcionalidades com mínimo esforço.</li>
</ul>
<p>Pode ser aplicada como:</p>
<ul>
<li><strong>Escalabilidade Vertical</strong> (scale up): significa adicionar recursos em um único nó do sistema (mais memória ou um disco rígido mais rápido).</li>
<li><strong>Escalabilidade Horizontal</strong> (scale out): significa adicionar mais nós ao sistema, tais como adicionar um novo computador com uma aplicação para clusterizar o software. Você pode encontrar escalabilidade horizontal nos sabores <a href="http://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o_distribu%C3%ADda">Sistemas Distribuídos</a>, <a href="http://en.wikipedia.org/wiki/Enterprise_JavaBean">Serviços de Componentes</a>, <a href="http://pt.wikipedia.org/wiki/Service-oriented_architecture">SOA</a>, <a href="http://en.wikipedia.org/wiki/System_of_systems">System of Systems</a>, etc.</li>
</ul>
<p><a href="http://escalabilidade.com"><img src="http://1up4dev.org/wp-content/uploads/2011/01/scale-up-300x150.png" alt="Escalabilidade" title="Escalabilidade" width="300" height="150" class="aligncenter size-medium wp-image-828" /></a><br />
Do ponto de vista do custo de desenvolvimento, manutenção e suporte, eu defino escalabilidade como: caro (complexo) vs. barato (simples). Porém, o que é caro nem sempre é bom&#8230; e vice versa.</p>
<h3>Analogias com o mundo real</h3>
<p>Nós gostamos de fazer <a href="http://en.wikipedia.org/wiki/Extreme_programming_practices#System_metaphor">analogias com coisas reais</a>, são ótimas para expressar idéias e facilitar a comunicação.</p>
<p>Call centers, ou centrais de atendimento. Se você mora no Brasil provavelmente já perdeu algumas horas de sua vida pendurado no telefone tentando resolver um problema com sua assinatura de celular, internet, TV, energia elétrica, etc. Mas por que isso acontece?<br />
Provavelmente, essas centrais de atendimento começaram com poucos funcionários, porém foram &#8220;projetadas&#8221; para crescer conforme a demanda. Basta contratar mais funcionários, dar treinamento e pronto: mais &#8220;nós&#8221; atendendo as requisições. Entretanto, o processo passa a ser mais complexo e mais burocrático, pois é muita informação para disseminar entre os funcionários. Resultado: alto custo para empresa e pouco resultado para os clientes. A espera ainda existe e quando finalmente somos atendidos, a sensação é de estar falando com um robô, que dificilmente entenderá seu problema e dará uma solução padrão ou insatisfatória para o mesmo.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2011/01/call-center.jpg"><img src="http://1up4dev.org/wp-content/uploads/2011/01/call-center-300x225.jpg" alt="Call Center" title="Call Center" width="300" height="225" class="aligncenter size-medium wp-image-820" /></a></p>
<p>O processo é adequado para escalar a demanda horizontalmente, o que o torna complexo e não garante a qualidade. Vale lembrar que o <a href="http://pt.wikipedia.org/wiki/Sistemas_computacionais">software</a> apenas automatiza ou apóia a realização dos processos reais. Se o processo é complexo, o software será tão complexo quanto (e em alguns casos até mais complexo).</p>
<p>Um exemplo diferente: o <a href="http://pt.wikipedia.org/wiki/Volkswagen_Fusca">Fusca</a>. É um dos carros mais simples que existem, não precisa nem de refrigeração a água. Costuma-se dizer que pode ser consertado com um alicate e um rolo de arame. Seu custo de fabricação seria mínimo se comparado com o custo de um carro popular moderno. Ok, não oferece a mesma segurança, velocidade e conforto de um carro moderno, mas ambos conseguem transportar 5 passageiros ao destino desejado.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2011/01/fuka_herbie_oval.jpg"><img class="aligncenter size-medium wp-image-810" title="Fusca" src="http://1up4dev.org/wp-content/uploads/2011/01/fuka_herbie_oval-300x210.jpg" alt="Fusca" width="300" height="210" /></a></p>
<p>Mas o que um Fusca têm a ver com escalabilidade? Bem, imagine um congestionamento na véspera de um feriado, por exemplo. Tanto o Fusca quanto o carro moderno ficarão parados na mesma fila de farofeiros. Toda tecnologia, complexidade e custo da fabricação do carro moderno não o livra de um congestionamento. Não há projeto que consiga prever ou contornar esse problema.</p>
<p><a href="http://1up4dev.org/wp-content/uploads/2011/01/baleia1.jpg"><img class="aligncenter size-medium wp-image-811" title="Twitter" src="http://1up4dev.org/wp-content/uploads/2011/01/baleia1-300x225.jpg" alt="Twitter" width="300" height="225" /></a></p>
<p>Voltando para nossa realidade, em certos casos o custo não paga o benefício. Mesmo um sistema bem planejado, distribuído, separado em camadas e serviços independentes, pode não suportar a demanda, seja de carga ou de funcionalidade. O mesmo aconteceria com um sistema mais simples arquiteturalmente, com certeza. Porém, o custo e velocidade de desenvolvimento e manutenção seria bem menor.</p>
<h3>O que fazer então?</h3>
<p>Sistemas precisam evoluir de acordo com a necessidade. <a href="http://merbist.com/2011/01/31/designing-for-scalability/">Projetar um sistema</a> prevendo todos os possíveis &#8220;casos de uso&#8221; bem como suas hipotéticas cargas (ou acessos) é uma forte característica do <em>waterfall</em>. Sistemas mais simples arquiteturalmente evoluem mais facilmente, em outras palavras, escalam mais facilmente:</p>
<ul>
<li><a href="http://pt.wikipedia.org/wiki/Keep_It_Simple"><strong>Keep it simple, stupid</strong></a>! Soluções simples geralmente custam menos e trazem retorno mais rápido. Qualquer funcionalidade ou recurso que não agregue valor deve ser descartada. Simples assim!</li>
<li><strong>Simplifique requisitos</strong>. Clientes <em>sem</em> software costumam <em>viajar</em> nos requisitos. Converse, escute e entenda exatamente seus <a href="http://1up4dev.org/2008/11/foco-no-problema/">PROBLEMAS</a>, então <a href="http://pt.wikipedia.org/wiki/YAGNI">negocie</a> e sugira uma SOLUÇÃO simples e rápida. E a <a href="http://pragprog.com/titles/prj/ship-it">entregue</a> logo!</li>
<li><strong>Busque soluções prontas</strong>. As necessidades dos clientes, em muitos casos, são parecidas. Provavelmente existe alguma solução pronta que você pode entregar para seu cliente ao invés de desenvolver um novo [software que todos conhecem] do zero.</li>
<li><strong>Otimize sua infra-estrutura</strong>. Procure a melhor forma de deploy da aplicação. Qual hardware é mais adequado, qual sistema operacional e arquitetura. Faça tunning do webserver (workers, pool, memória), módulos e load balance. Utilize uma versão otimizada do interpretador, como o <a href="http://www.rubyenterpriseedition.com/">Ruby Enterprise Edition</a>, <a href="http://www.jruby.org/">JRuby</a> ou <a href="http://rubini.us/">Rubinius</a>.</li>
<li><strong>Monitore sua aplicação</strong>. Uma vez que esteja em produção, monitore-a em busca de gargalos e possíveis pontos de otimização. Existem várias ferramentas para ajudá-lo nessa tarefa, como o <a href="http://hoptoadapp.com/">Hoptoad</a>, <a href="http://newrelic.com/">NewRelic</a>, ou até mesmo o <a href="http://rubini.us/doc/en/tools/profiler/">Rubinius Profiler</a>.</li>
<li><strong>Otimize sua aplicação</strong>. O log é seu melhor amigo no desenvolvimento. Não ignore queries demoradas ou que geram <a href="http://rails-bestpractices.com/posts/29-fix-n-1-queries">N+1</a>, otimize-as! Faça <em>profiling</em>, analise e otimize o código. Utilize <em>caching</em> para serviços externos e para páginas. Caching pode ser a melhor alternativa para turbinar sua aplicação, mas use-o com sabedoria. Bancos de dados não devem ser um problema, por isso saiba escolher a melhor distribuição para seu caso. Mesmo que <a href="http://nosql-database.org/">NoSQL</a> esteja na moda, não quer dizer que é a melhor solução para sua aplicação (a menos que seja necessário para o negócio).</li>
<li><strong>Simplifique o desenvolvimento</strong>. Fameworks ajudam bastante, mas use-os com sabedoria para não inflar o <em>stack</em> da aplicação. Em certas situações, vale mais a pena desenvolver algo simples do zero do que utilizar algo pronto, pesado e que precise ser adaptado para sua necessidade. Escreva menos: quanto menor seu código, mais rápido será sua execução. Camadas são perigosas: evite rodeios e escreva código que realmente interessa. E lembre-se: sempre existe uma ferramenta certa para cada problema.</li>
</ul>
<h3>SIMPLIFIQUE!</h3>
<p>Tenha sempre a palavra <a href="http://zenhabits.net/simple-living-manifesto-72-ideas-to-simplify-your-life/"><strong>SIMPLES</strong></a> gravada na sua mente. Se uma coisa exigir muito esforço para ser feita, talvez nem valha a pena. Volte para o início, pense novamente e busque uma ALTERNATIVA mais rápida/fácil/barata. Quanto melhor for sua técnica, melhor serão suas escolhas. <a href="http://blip.tv/file/2733212">Pratique constantemente</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/02/complexidade-nao-escala/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Deploy de várias aplicações no Nginx + Passenger usando subdomain ou suburi</title>
		<link>http://1up4dev.org/2011/01/deploy-de-varias-aplicacoes-no-nginx-passenger-usando-subdomain-ou-suburi/</link>
		<comments>http://1up4dev.org/2011/01/deploy-de-varias-aplicacoes-no-nginx-passenger-usando-subdomain-ou-suburi/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 10:00:59 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=770</guid>
		<description><![CDATA[TweetSe você está pensando em fazer o deploy da sua aplicação Rails em um server Nginx com Phusion Passenger, você está no caminho certo! Não apenas pela segurança e performance do Nginx, mas também pela facilidade de instalação e configuração &#8230; <a href="http://1up4dev.org/2011/01/deploy-de-varias-aplicacoes-no-nginx-passenger-usando-subdomain-ou-suburi/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/01/deploy-de-varias-aplicacoes-no-nginx-passenger-usando-subdomain-ou-suburi/" data-text="Deploy de várias aplicações no Nginx + Passenger usando subdomain ou suburi" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/01/deploy-de-varias-aplicacoes-no-nginx-passenger-usando-subdomain-ou-suburi/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Se você está pensando em fazer o deploy da sua aplicação Rails em um server <a href="http://nginx.org/">Nginx</a> com <a href="http://www.modrails.com/">Phusion Passenger</a>, você está no caminho certo! Não apenas pela segurança e performance do Nginx, mas também pela facilidade de instalação e configuração quando comparado à outros web servers populares. </p>
<p>A <a href="http://wiki.nginx.org/Install">instalação do Nginx</a> bem como <a href="http://www.modrails.com/install.html">configuração do módulo do Passenger</a> são relativamente simples. A documentação de <a href="http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_installing_phusion_passenger">ambos é bem completa</a>. Você provavelmente não terá muita dificuldade. Eu recomendo seguir o passo-a-passo da instalação do Passenger:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  passenger-install-nginx-module</pre></div></div>

<p>Uma vez que tudo esteja instalado, é hora de configurar o Nginx editando o arquivo <code>nginx.conf</code> (provavelmente localizado em <code>/usr/local/nginx/conf/nginx.conf</code>)</p>
<h3>Usando sub URI</h3>
<p>O deploy como sub URI torna sua aplicação acessível com o endereço <code>http://dominio.com/app1</code>, sendo <code>app1</code> o nome da sua aplicação. Supondo que diretório público do Nginx esteja em <code>/var/www</code> e sua aplicação Rails em <code>/var/rails/app1</code>, configure-o assim:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http <span style="color:#006600; font-weight:bold;">&#123;</span>
    ...
    <span style="color:#9900CC;">server</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
        listen <span style="color:#006666;">80</span>;
        server_name dominio.<span style="color:#9900CC;">com</span> www.<span style="color:#9900CC;">dominio</span>.<span style="color:#9900CC;">com</span>;
        root <span style="color:#006600; font-weight:bold;">/</span>var<span style="color:#006600; font-weight:bold;">/</span>www;
        passenger_enabled on;
        passenger_base_uri <span style="color:#006600; font-weight:bold;">/</span>app1;
    <span style="color:#006600; font-weight:bold;">&#125;</span>
    ...
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Ainda é preciso criar um link simbólico para que o contexto da aplicação Rails seja visível pelo document root em <code>/var/www</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>rails<span style="color: #000000; font-weight: bold;">/</span>app1<span style="color: #000000; font-weight: bold;">/</span>public <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>app1</pre></div></div>

<p>Reiniciando o Nginx, sua aplicação já estará rodando. Para adicionar outras aplicações, basta adicionar:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">        passenger_base_uri <span style="color:#006600; font-weight:bold;">/</span>app1;
        passenger_base_uri <span style="color:#006600; font-weight:bold;">/</span>app2;
        passenger_base_uri <span style="color:#006600; font-weight:bold;">/</span>app3;</pre></div></div>

<p>E em seguida criar os links simbólicos como descrito acima. Nota importante: em alguns casos, será necessário informar a URL relativa correta nas configurações do Rails:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">   config.<span style="color:#9900CC;">action_controller</span>.<span style="color:#9900CC;">relative_url_root</span> = <span style="color:#996600;">&quot;/app1&quot;</span></pre></div></div>

<h3>Usando subdomain</h3>
<p>O deploy como subdomain torna sua aplicação acessível com o endereço <code>http://app1.dominio.com</code>. Basta configurar o Nginx como segue:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http <span style="color:#006600; font-weight:bold;">&#123;</span>
    ...
    <span style="color:#9900CC;">server</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
        listen <span style="color:#006666;">80</span>;
        server_name app1.<span style="color:#9900CC;">dominio</span>.<span style="color:#9900CC;">com</span>;
        root <span style="color:#006600; font-weight:bold;">/</span>var<span style="color:#006600; font-weight:bold;">/</span>rails<span style="color:#006600; font-weight:bold;">/</span>app1<span style="color:#006600; font-weight:bold;">/</span>public;
        passenger_enabled on;
    <span style="color:#006600; font-weight:bold;">&#125;</span>
    ...
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Note que o <code>root</code> aponta diretamente para o diretório &#8220;public&#8221; da aplicação Rails. Para fazer o deploy de outras aplicações como subdomínio, basta configurar outro &#8220;server&#8221;, alterando <code>root</code> e o <code>server_name</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">http <span style="color:#006600; font-weight:bold;">&#123;</span>
    ...
    <span style="color:#9900CC;">server</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
        listen <span style="color:#006666;">80</span>;
        server_name app1.<span style="color:#9900CC;">dominio</span>.<span style="color:#9900CC;">com</span>;
        root <span style="color:#006600; font-weight:bold;">/</span>var<span style="color:#006600; font-weight:bold;">/</span>rails<span style="color:#006600; font-weight:bold;">/</span>app1<span style="color:#006600; font-weight:bold;">/</span>public;
        passenger_enabled on;
    <span style="color:#006600; font-weight:bold;">&#125;</span>
    ...
    <span style="color:#9900CC;">server</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
        listen <span style="color:#006666;">80</span>;
        server_name app2.<span style="color:#9900CC;">dominio</span>.<span style="color:#9900CC;">com</span>;
        root <span style="color:#006600; font-weight:bold;">/</span>var<span style="color:#006600; font-weight:bold;">/</span>rails<span style="color:#006600; font-weight:bold;">/</span>app2<span style="color:#006600; font-weight:bold;">/</span>public;
        passenger_enabled on;
    <span style="color:#006600; font-weight:bold;">&#125;</span>
    ...
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Uma vez que o DNS do host esteja corretamente configurado, suas aplicações estarão acessíveis em <code>http://app1.dominio.com</code>, <code>http://app2.dominio.com</code>, etc.</p>
<p>Dúvidas ou sugestões, utilizem os comentários. Sucesso!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/01/deploy-de-varias-aplicacoes-no-nginx-passenger-usando-subdomain-ou-suburi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Enviando emails no Rails através do Gmail</title>
		<link>http://1up4dev.org/2011/01/enviando-emails-no-rails-atraves-do-gmail/</link>
		<comments>http://1up4dev.org/2011/01/enviando-emails-no-rails-atraves-do-gmail/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 09:00:09 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=774</guid>
		<description><![CDATA[TweetEnviar emails de uma aplicação Rails é muito simples. A parte complicada fica com a configuração do ambiente e do servidor de email. Se você não souber ou não tiver muita paciência para fazer isso (por exemplo instalar e configurar &#8230; <a href="http://1up4dev.org/2011/01/enviando-emails-no-rails-atraves-do-gmail/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/01/enviando-emails-no-rails-atraves-do-gmail/" data-text="Enviando emails no Rails através do Gmail" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/01/enviando-emails-no-rails-atraves-do-gmail/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Enviar emails de uma aplicação Rails é <a href="http://guides.rubyonrails.org/action_mailer_basics.html">muito simples</a>. A parte complicada fica com a configuração do ambiente e do servidor de email. Se você não souber ou não tiver muita paciência para fazer isso (por exemplo instalar e configurar <a href="http://www.sendmail.org">sendmail</a>, <a href="http://www.mutt.org/">mutt</a>, etc), pode facilmente usar sua conta do <a href="http://lindsaar.net/2010/3/15/how_to_use_mail_and_actionmailer_3_with_gmail_smtp">Gmail</a> para enviar as mensagens da sua aplicação.</p>
<p>Basta incluir as seguintes configurações no bloco <code>config</code> dos respectivos ambientes da aplicação (por exemplo, <code>config/environments/production.rb</code>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  config.<span style="color:#9900CC;">action_mailer</span>.<span style="color:#9900CC;">delivery_method</span> = <span style="color:#ff3333; font-weight:bold;">:smtp</span>
  config.<span style="color:#9900CC;">action_mailer</span>.<span style="color:#9900CC;">smtp_settings</span> = <span style="color:#006600; font-weight:bold;">&#123;</span>
    <span style="color:#ff3333; font-weight:bold;">:enable_starttls_auto</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
    <span style="color:#ff3333; font-weight:bold;">:authentication</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:plain</span>,
    <span style="color:#ff3333; font-weight:bold;">:address</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> smtp.<span style="color:#9900CC;">gmail</span>.<span style="color:#9900CC;">com</span>,
    <span style="color:#ff3333; font-weight:bold;">:port</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">587</span>,
    <span style="color:#ff3333; font-weight:bold;">:user_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;seuemail@gmail.com&quot;</span>,
    <span style="color:#ff3333; font-weight:bold;">:password</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;suasenha&quot;</span>
  <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>O toque mágico é a chave <code>:enable_startls_auto =&gt; true</code> para habilitar <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a>. Sucesso!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/01/enviando-emails-no-rails-atraves-do-gmail/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando um WebCrawler de modo fácil e rápido com Ruby e Nokogiri</title>
		<link>http://1up4dev.org/2011/01/criando-um-webcrawler-de-modo-facil-e-rapido-com-ruby-e-nokogiri/</link>
		<comments>http://1up4dev.org/2011/01/criando-um-webcrawler-de-modo-facil-e-rapido-com-ruby-e-nokogiri/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 09:00:41 +0000</pubDate>
		<dc:creator>Rodrigo Panachi</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[shellscript]]></category>

		<guid isPermaLink="false">http://1up4dev.org/?p=725</guid>
		<description><![CDATA[TweetQuantas vezes você precisou buscar alguma informação externa para sua aplicação, como um número de telefone ou uma foto em algum site? A idéia é simples: criar um crawler script para fazer parse de algum conteúdo HTML. E basta apenas &#8230; <a href="http://1up4dev.org/2011/01/criando-um-webcrawler-de-modo-facil-e-rapido-com-ruby-e-nokogiri/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="socialize-in-content" style="float:left;"><div class="socialize-in-button socialize-in-button-left"><a href="http://twitter.com/share" class="twitter-share-button" data-url="http://1up4dev.org/2011/01/criando-um-webcrawler-de-modo-facil-e-rapido-com-ruby-e-nokogiri/" data-text="Criando um WebCrawler de modo fácil e rápido com Ruby e Nokogiri" data-count="vertical" data-via="socializeWP" >Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="socialize-in-button socialize-in-button-left"><iframe src="http://www.facebook.com/plugins/like.php?href=http://1up4dev.org/2011/01/criando-um-webcrawler-de-modo-facil-e-rapido-com-ruby-e-nokogiri/&amp;layout=box_count&amp;show_faces=false&amp;width=50&amp;action=like&amp;font=arial&amp;colorscheme=light&amp;height=65" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:50px !important; height:65px;" allowTransparency="true"></iframe></div></div><p>Quantas vezes você precisou buscar alguma informação externa para sua aplicação, como um número de telefone ou uma foto em algum site? A idéia é simples: criar um <a href="http://en.wikipedia.org/wiki/Web_crawler" target="_blank">crawler</a> script para fazer parse de algum conteúdo HTML. E basta apenas Ruby e <a href="http://nokogiri.org/" target="_blank">Nokogiri</a>.</p>
<h3>Exemplo</h3>
<p>Digamos que eu queira obter a última versão de uma dada gem consultando diretamente no site <a href="http://rubygems.org/">http://rubygems.org</a> para me ajudar quando precisar instalar novas gems no meu ambiente. Vamos ao código:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env ruby</span>
&nbsp;
require <span style="color: #ff0000;">&quot;rubygems&quot;</span>
require <span style="color: #ff0000;">&quot;open-uri&quot;</span>
require <span style="color: #ff0000;">&quot;nokogiri&quot;</span>
&nbsp;
gem = ARGV<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
site = open<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;http://rubygems.org/gems/#{gem}&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
document = Nokogiri::HTML<span style="color: #7a0874; font-weight: bold;">&#40;</span>site<span style="color: #7a0874; font-weight: bold;">&#41;</span>
version = document.css<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;.title h3&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>.text
&nbsp;
puts <span style="color: #ff0000;">&quot;#{gem} version #{version}&quot;</span></pre></div></div>

<p>Vou salvar esse script no arquivo <code>gem-version.sh</code>, torna-lo executável com <code>chmod +x gem-version.sh</code> em seguida executar no terminal:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ .<span style="color: #000000; font-weight: bold;">/</span>gem-version rails
  rails version 3.0.3</pre></div></div>

<p>Pronto, agora você também pode brincar à vontade com <a href="http://github.com/tenderlove/nokogiri" target="_blank">Nokogiri</a> no seu shell!</p>
]]></content:encoded>
			<wfw:commentRss>http://1up4dev.org/2011/01/criando-um-webcrawler-de-modo-facil-e-rapido-com-ruby-e-nokogiri/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

