<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="wordpress/2.2.1" --><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Thinking About Something</title>
	<link>http://tas.milk-it.net</link>
	<description>blog sobre tecnologia, desenvolvimento e design escrito e mantido pela Milk-it Brasil Software House, sediada em Belo Horizonte, Brasil.</description>
	<pubDate>Wed, 14 Jan 2009 13:48:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/thinkingaboutsomething" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Rails =~ /Merb/</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/KTzszFX7SmE/</link>
		<comments>http://tas.milk-it.net/carlos/rails-merb/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 00:29:09 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>merb</category><category>rails3</category><category>rubyonrails</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/rails-merb/</guid>
		<description><![CDATA[&#8220;Anh?&#8221; É, eu também fiz essa cara que você está fazendo quando li o artigo do blog oficial do rails. Mas é isso mesmo:
Rails 3.0 é a próxima major version, e englobará nada menos que o (seu antes arqui-rival) Merb. Não só isso, Merb+Rails serão juntos o Rails 3.0. E os preparativos já começaram! wycats [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Anh?&#8221; É, eu também fiz essa cara que você está fazendo quando li o <a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3" rel="external">artigo do blog oficial</a> do rails. Mas é isso mesmo:</p>
<p>Rails 3.0 é a próxima <em>major version</em>, e englobará nada menos que o (seu antes arqui-rival) <a href="http://merbivore.com/" rel="external">Merb</a>. Não só isso, Merb+Rails serão juntos o Rails 3.0. E os preparativos já começaram! <a href="http://yehudakatz.com" rel="external">wycats</a> já é parte do <a href="http://rubyonrails.org/core" rel="external">Rails Core Team</a>, o plano de ação já foi feito e o Merb já até tem uma <a href="http://rubyonrails.org/merb" rel="external">página especial</a> no site oficial do rails.</p>
<p>Para quem não conhece (Sério? Você precisa atualizar seus feeds&#8230;), <a href="http://merbivore.com/" rel="external">Merb</a> é um outro grande framework Ruby, que tem como princípios desde o seu nascimento ser rápido, 100% modularizado e Thread-safe. A forma de se desenvolver no Merb é bastante parecida com Rails (como era de se imaginar), porém com algumas particularidades. Leia mais no <a href="http://merbivore.com/" rel="external">site oficial do Merb</a>.</p>
<h3>O que isso trará de bom para o Rails</h3>
<p>Em primeiro lugar a fusão trará para o Rails a política de liberdade do Merb. No Merb, você não é obrigado a usar <a href="http://datamapper.org/" rel="external">DataMapper</a> (o ORM padrão), ou obrigado a usar ERb (para renderizar a view) e etc, eles são apenas padrões sugeridos, o que não acontece no Rails, onde você precisa fazer uma forcinha para mudar estes padrões. No Rails 3.0 esta abordagem de liberdade também fará parte de nossas vidas, sendo simplificado o uso de DataMapper e Sequel.</p>
<p>Desta forma, teremos um &#8220;rails-core&#8221;, assim como o merb-core, que será o rails sem nenhum módulo. De qualquer forma, ainda haverá um pacote &#8220;rails&#8221; que nos trará toda a pilha de módulos do rails.</p>
<p>Otimizações na performance do Rails será um outro benefício que este merge nos trará. O Merb tem muitas partes do Rails reescritas com melhorias de performance que também serão parte do Rails 3.0.</p>
<p>No Merb, os plugins tem uma API fixa, o que significa que os plugins escritos não quebram a cada nova versão do framework. Esta linha de pensamento será trazida para o Rails 3, aumentando ainda mais nossa gama de plugins e  a facilidade de manter o desenvolvimento de um.</p>
<p>A base de usuários&#8230; ahh, a base de usuários&#8230; <img src='http://tas.milk-it.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> O Rails contará agora com praticamente todos os desenvolvedores Ruby disponíveis como sua base até por que, coincidência ou não, desde o dia 17/12/08 já poderemos <a href="http://github.com/rails/rails/commit/61a41154f" rel="external">usar o Sinatra</a> de forma fácil dentro de uma aplicação Rails (ainda edge, futura 2.3).</p>
<p>Nas palavras do próprio Yehuda Katz, de forma geral, olharão para o Merb e trarão para o Rails o que ele tiver de melhor e ainda faltar ao Rails.</p>
<h3>A migração</h3>
<p>A migração promete não ser penosa. Segundo o post de anúncio do merge, migrar um aplicativo Rails 2 para Rails 3 será relativamente &#8216;tranquilo&#8217;, assim como migrar aplicações Merb para Rails 3.</p>
<p>Quem mantém aplicações Merb não precisa se preocupar, já a versão atual do Merb continuará sendo mantida com bugfixes e pequenas alterações já previstas. Daí pra frente, tudo será Rails 3.0.</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/KTzszFX7SmE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/rails-merb/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/rails-merb/</feedburner:origLink></item>
		<item>
		<title>Novo no Rails Edge: Suporte simples a “Conditional-Get” (ETags)</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/7EW25nXVWSQ/</link>
		<comments>http://tas.milk-it.net/carlos/novo-no-rails-edge-suporte-simples-a-conditional-get-etags/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 03:24:49 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>edge</category><category>rubyonrails</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/novo-no-rails-edge-suporte-simples-a-conditional-get-etags/</guid>
		<description><![CDATA[O Carlos Brando vem fazendo um excelente trabalho em trazer para nós as novidades do Rails Edge (no caso, o 2.2). Mas ao me deparar com esta atualização não pude me conter em blogar sobre. Na verdade, apenas traduzir o artigo do Ryan.
&#8212;&#8212;&#8212;&#8211;
Conditional-gets são uma facilidade da especificação do HTTP que fornece um método de [...]]]></description>
			<content:encoded><![CDATA[<p>O Carlos Brando vem fazendo <a href="http://www.nomedojogo.com/category/edge-rails/" rel="external">um excelente trabalho</a> em trazer para nós as novidades do Rails Edge (no caso, o 2.2). Mas ao me deparar com esta atualização não pude me conter em blogar sobre. Na verdade, apenas traduzir <a href="http://ryandaigle.com/articles/2008/8/14/what-s-new-in-edge-rails-simpler-conditional-get-support-etags" rel="external">o artigo do Ryan</a>.</p>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p><em>Conditional-gets</em> são uma facilidade da especificação do HTTP que fornece um método de os servidores we comunicarem aos brosers que a resposta para a requisição GET não mudou desde a última requisição e que o cache do browser pode ser usado com segurança.</p>
<p>Eles funcionam usando os cabeçalhos HTTP_IF_NONE_MATCH e HTTP_IF_MODIFIED_SINCE para passar para frente e para trás um identificador único do conteúdo e o <em>timestamp</em> de quando o conteúdo foi modificado pela última vez. Se o browser fizer a requisição onde o identificador do conteúdo (<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19" rel="external">etag</a>) ou a data da última modificação bater com a versão do servidor então o servidor precisa apenas enviar de volta uma resposta vazia com um status de <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5" rel="external">&#8220;não modificado&#8221; (304)</a>.</p>
<p>É do servidor (nós) a responsabilidade de olhar a data da última modificação e o cabeçalho <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26" rel="external">if-none-match</a> e determinar quando ou não enviar a resposta completa (com a renderização da página, por exemplo). Com <a href="http://github.com/JackDanger/rails/commit/b7529ed1cc7cfd8df5fd1b069e2881d39d3d984c" rel="external">este novo suporte a <em>conditional-get</em> no rails</a>, isto se torna uma tarefa muito fácil:</p>
<pre name="code" class="ruby">class ArticlesController &lt; ApplicationController
    def show
        @article = Article.find(params[:id])

        # Define o cabeçalho da resposta para refletir exatamente
        # o estado do objeto requisitado
        response.last_modified = @article.published_at.utc
        response.etag = @article

        # Se o estado da requisição é o mesmo do estado no servidor
        # então sabemos que não precisamos enviar todo o resultado
        if request.fresh?(response)
          head :not_modified
        else
          respond_to do |wants|
            # normal response processing
          end
        end
    end
end</pre>
<p>O valor do etag é calculado para você com o metodo <em>setter</em> etag=. Tudo que você tem que fazer é prover um único objeto ou array de objetos que definem de forma única a identificação desta requisição. Neste exemplo o artigo por si mesmo contém toda a informação que identifica o estado desta requisição. De qualquer forma, você pode precisar de usar mais de uma chave em seu aplicativo. Como para uma requisição específica para cada usuário:</p>
<pre name="code" class="ruby">response.etag = [@article, current_user]</pre>
<p>O método request.fresh?(response) é quem dirá a você se a requisição casa com o valor de last-modified-since ou if-none-match da resposta que está sendo enviada. Se sim, você pode evitar de responder todo o conteúdo e economizar alguma (ou muita!) banda.</p>
<p>Também é possível você evitar de acessar o banco de dados se seu aplicativo trata com páginas completamente estáticas armazenadas no banco de dados (isso é raro):</p>
<pre name="code" class="ruby">class ArticlesController &lt; ApplicationController
    def show
        # Se o artigo não muda, o etag pode se basear apenas em
        # ítems que temos na requisição
        response.etag = [:article, params[:id]]

        # Se o estado da requisição é o mesmo do servidor
        # podemos evitar também de acessar o banco de dados
        if request.fresh?(response)
          head :not_modified
        else
          @article = Article.find(params[:id])
          respond_to do |wants|
            ...
          end
        end
    end
end</pre>
<p>Então, seja um bom cidadão e faça suas requisições compatíveis com conditional-get. Isto é a coisa certa a ser feita - e melhoram também a performance de seus programas.</p>
<p>&#8212;-</p>
<p>Vale notar, que você pode também usar estes cabeçalhos para acessar webservices (principalmente os feitos em Rails agora :D) fazendo requisição de XML, se você, por exemplo, estiver guardando os dados que você acessou e guardar a data em que isto foi feito, assim você economisa ainda mais banda!</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/7EW25nXVWSQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/novo-no-rails-edge-suporte-simples-a-conditional-get-etags/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/novo-no-rails-edge-suporte-simples-a-conditional-get-etags/</feedburner:origLink></item>
		<item>
		<title>Rails DataBrowser no rubyforge!</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/4dkGvLi3ib8/</link>
		<comments>http://tas.milk-it.net/carlos/rails-databrowser-no-rubyforge/#comments</comments>
		<pubDate>Sat, 07 Jun 2008 18:39:16 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>databrowser</category><category>rubyonrails</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/rails-databrowser-no-rubyforge/</guid>
		<description><![CDATA[Agora você também pode instalar o Rails DataBrowser via RubyGems!
update 25/06/08: o site do Rails DataBrowser mudou! Abandonamos o uso do Trac, e agora estamos com o Redmine. Então acesse redmine.milk-it.net/projects
Acabei de publicar a gem no RubyForge, e esta será atualizada constantemente assim como o plugin!
Bom, para installar:

gem install databrowser
Para usar:

require 'data_browser'
ActionController::Routing::Routes.draw do &#124;map&#124;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Agora você também pode instalar o <a href="http://redmine.milk-it.net/projects" rel="external">Rails DataBrowser</a> via RubyGems!</p>
<p><strong>update 25/06/08:</strong> o site do Rails DataBrowser mudou! Abandonamos o uso do Trac, e agora estamos com o Redmine. Então acesse <a href="http://redmine.milk-it.net/projects" rel="external">redmine.milk-it.net/projects</a></p>
<p>Acabei de <a href="http://rubyforge.org/projects/databrowser/" rel="external">publicar a gem no RubyForge</a>, e esta será atualizada constantemente assim como o plugin!</p>
<p>Bom, para installar:</p>
<pre name="code" class="php">
gem install databrowser</pre>
<p>Para usar:</p>
<pre name="code" class="ruby">
require 'data_browser'
ActionController::Routing::Routes.draw do |map|
  # your routes
  map.databrowser
end</pre>
<p>Ou, se você está usando Rails >= 2.1, ao invés de fazer o require no routes.rb, adicione esta linha em seu environment.rb</p>
<pre name="code" class="ruby">
  config.gem "databrowser", :lib => "data_browser"
</pre>
<p>Espero que gostem!</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/4dkGvLi3ib8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/rails-databrowser-no-rubyforge/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/rails-databrowser-no-rubyforge/</feedburner:origLink></item>
		<item>
		<title>Processamento de imagens com Qt - Parte II</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/wC1FmKrV49c/</link>
		<comments>http://tas.milk-it.net/carlos/processamento-de-imagens-com-qt-parte-ii/#comments</comments>
		<pubDate>Mon, 26 May 2008 03:49:17 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>desenvolvimento</category><category>open source</category><category>pid</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/processamento-de-imagens-com-qt-parte-ii/</guid>
		<description><![CDATA[Bom, apenas para deixar vocês a par do que foi feito após aquele post. Continuei meu belo trabalho e hoje resolvi colocá-lo no Github[1], quem sabe ele não cresce e mais pessoas adicionam novos recursos para ajudar outras a entrar na área de Processamento de Imagens Digitais (PID)?
Quando comecei a fazer o trabalho eu tinha [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, apenas para deixar vocês a par do que foi feito após <a href="http://tas.milk-it.net/carlos/manipulando-imagem-com-qt/">aquele post</a>. Continuei meu belo trabalho e hoje resolvi <a href="http://github.com/chjunior/blind-camaleon/tree/master" rel="external">colocá-lo no Github</a>[1], quem sabe ele não cresce e mais pessoas adicionam novos recursos para ajudar outras a entrar na área de <a href="http://pt.wikipedia.org/wiki/Processamento_de_imagem" rel="external">Processamento de Imagens Digitais (PID)</a>?</p>
<p>Quando comecei a fazer o trabalho eu tinha muita informação sobre processamento de imagens, mas pouca coisa em C++ (na verdade a linguagem fui eu quem escolhi, causei minha própria coceira). O pouco que encontrei nesta linguagem não era lá realmente funcional (apenas classes isoladas e etc.).</p>
<p>Quem quiser adicionar filtros, mesmo que simples (média, mediana, etc), é só fazer o <em>fork</em> e me comunicar sobre as mudanças ou então gerar um <em>patch</em> e me enviar.</p>
<p>O que realmente está precisando ser feito:</p>
<ul>
<li>Fazer o <strong>espectro</strong> de Fourier funcionar direito (<a href="http://github.com/xjunior/blind-chameleon/tree/master/fft.cpp#L22" rel="external">a transformada</a> está correta, <a href="http://github.com/xjunior/blind-chameleon/tree/master/fft.cpp#L57" rel="external">a inversa</a> ídem);</li>
<li>Temporada de caça aos <em><a href="http://en.wikipedia.org/wiki/Memory_leak" rel="external">memory leaks</a></em>! Achei vários e já tratei de corrigir, porém após alguns filtros ele consome muita memória e precisamos fechar e abrir novamente se quisermos nossos recursos de volta.</li>
<li>Adicionar recursos para trabalhar com imagens coloridas (como o trabalho era para trabalhar com imagens em escala de cinza, apenas isso foi feito) - quando a imagem é colorida, nós a convertemos para escala de cinza;</li>
</ul>
<p>Abraços!</p>
<p>[1] <a href="http://github.com/xjunior/blind-chameleon/tree" rel="external">http://github.com/xjunior/blind-chameleon/tree</a></p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/wC1FmKrV49c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/processamento-de-imagens-com-qt-parte-ii/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/processamento-de-imagens-com-qt-parte-ii/</feedburner:origLink></item>
		<item>
		<title>Histórico da linha de comando</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/b8JEj2WXvJo/</link>
		<comments>http://tas.milk-it.net/carlos/historico-da-linha-de-comando/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 16:27:57 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>linux</category><category>misc</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/historico-da-linha-de-comando/</guid>
		<description><![CDATA[Seguindo o post do Luke Franci:
$ history 1000 &#124; awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' &#124; sort -rn &#124; head
110 vi
65 rake
43 gcc
40 ls
40 cd
24 rm
24 ./mc
18 thin
18 svn
15 su
Faça o teste e poste nos comentários ou em seu blog!
]]></description>
			<content:encoded><![CDATA[<p>Seguindo <a href="http://feeds.feedburner.com/~r/RailSpikes/~3/271786687/command-line-history" rel="external">o post</a> do <a href="http://railspikes.com" rel="external">Luke Franci</a>:</p>
<pre name="code" class="php">$ history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
110 vi
65 rake
43 gcc
40 ls
40 cd
24 rm
24 ./mc
18 thin
18 svn
15 su</pre>
<p>Faça o teste e poste nos comentários ou em seu blog!</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/b8JEj2WXvJo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/historico-da-linha-de-comando/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/historico-da-linha-de-comando/</feedburner:origLink></item>
		<item>
		<title>Suporte a TimeZone no Rails 2.1: uma visão geral</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/fgAUayEezyg/</link>
		<comments>http://tas.milk-it.net/carlos/suporte-a-timezone-no-rails-21-uma-visao-geral/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 17:06:02 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>active record</category><category>rubyonrails</category><category>time zone</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/suporte-a-timezone-no-rails-21-uma-visao-geral/</guid>
		<description><![CDATA[Esta é uma tradução do artigo escrito por Geoff Buesing.
Este será o primeiro de muitos posts que farei sobre os novos recursos de time zone (fuso horário) na próxima versão (2.1) do Rails. Neste post, eu darei uma visão geral destes novos recuros, na criação de um novo aplicativo.
Começarei com um aplicativo Rails 2.1 criado [...]]]></description>
			<content:encoded><![CDATA[<p>Esta é uma tradução do <a href="http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/" rel="external">artigo escrito</a> por <a href="http://mad.ly" rel="external">Geoff Buesing</a>.</p>
<p>Este será o primeiro de muitos posts que farei sobre os novos recursos de <em>time zone</em> (fuso horário) na próxima versão (2.1) do Rails. Neste post, eu darei uma visão geral destes novos recuros, na criação de um novo aplicativo.</p>
<p>Começarei com um aplicativo Rails 2.1 criado através do comando &#8220;rails&#8221;. No 2.1, suporte a fuso horário estará ligado por padrão no environment.rb, através da opção config.time_zone:</p>
<pre name="code" class="ruby"># config/environment.rb
config.time_zone = 'UTC'</pre>
<p>– Este estará definido para UTC como padrão, mas você irá normalmente modificar isto para um fuso horário apropriado para sua localidade. As novas tarefas do rake time:zones:all, time:zones:us, e time:zones:local foram adicionadas para ajudá-lo a encontrar os nomes adequados de fuso horário. time:zones:local farão uma tentativa educada baseada no sistema local de horário, então este é um bom lugar para se começar:</p>
<pre name="code" class="php">$ rake time:zones:local
* UTC -06:00 *
Central America
Central Time (US &amp; Canada)
Guadalajara
Mexico City
Monterrey
Saskatchewan</pre>
<p>Carlos: este é o exemplo usado no artigo original, não vou modificar pois os exemplos se baseam nestes resultados&#8230;. no meu sistema acontece isso:</p>
<pre name="code" class="php">$ rake time:zones:local
* UTC -02:00 *
Mid-Atlantic</pre>
<p>Para este exemplo, eu usarei config.time_zone para US Central Time:</p>
<pre name="code" class="ruby"># config/environment.rb
config.time_zone = 'Central Time (US &amp; Canada)'</pre>
<p>A seguir, criarei um simples scaffold para um modelo Task, com um atributo datetime <em>alert_at</em>:</p>
<pre name="code" class="php">$ script/generate scaffold Task name:string alert_at:datetime
$ rake db:migrate
$ script/server</pre>
<p>Irei ao formulário para nova tarefa, e criarei uma:</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/new_task1.png" title="new_task1.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/new_task1.thumbnail.png" alt="new_task1.png" /></a></p>
<p>A action <em>show</em> exibe a data e hora que eu digitei, seguido pela correção (deslocamento) UTC:</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/show_task1.png" title="show_task1.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/show_task1.thumbnail.png" alt="show_task1.png" /></a></p>
<p>&#8230; para este exemplo, o prefixo UTC é -0500, que é a correção para US Central Time durante o &#8220;horário de verão&#8221;:</p>
<p>Para mostrar como este horário é guardado no banco de dados, eu vou ao script/console, e usar o método #alert_at_before_type_cast:</p>
<pre name="code" class="ruby">&gt;&gt; t = Task.find_by_name('foo')
=&gt; #&lt; Task … &gt;
&gt;&gt; t.alert_at
=&gt; Sun, 06 Apr 2008 10:30:00 CDT -05:00
&gt;&gt; t.alert_at_before_type_cast
=&gt; "2008-04-06 15:30:00"</pre>
<p>O banco de dados está guardando a representação UTC de nosso horário: 15:30 UTC é simultâneamente 10:30 CDT (Central Daylight Time - daylight é o horário de verão). A diferença entre os dois horários é a correção UTC (-5 horas, neste caso).</p>
<p>Depois, eu vou editar a tarefa e alterar o mês para Janeiro (fora do horário de verão, lá):</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/edit_task.png" title="edit_task.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/edit_task.thumbnail.png" alt="edit_task.png" /></a></p>
<p>Note que a correção UTC agora é -0600 - por que o alert_at não está mais no horário de verão.</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/show_task_updated.png" title="show_task_updated.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/show_task_updated.thumbnail.png" alt="show_task_updated.png" /></a></p>
<p>script/console confirmará que o banco de dados recebeu a representação correta UTC:</p>
<pre name="code" class="ruby">&gt;&gt; t = Task.find_by_name('foo')
=&gt; #&lt; Task … &gt;
&gt;&gt; t.alert_at
=&gt; Sun, 06 Jan 2008 10:30:00 CST -06:00
&gt;&gt; t.alert_at_before_type_cast
=&gt; "2008-01-06 16:30:00"</pre>
<p>A hora do banco de dados é agora 16:30 ao invés de 15:30, por que a correção UTC é -6 horas agora.</p>
<h3>Fusos por usuário</h3>
<p>O que eu defini anteriormente funcionará bem para um aplicativo onde todos os usuários estão no mesmo fuso. Se o aplicativo eventualmente necessitar suportar usuários em fusos diferentes, é bastante fácil de se fazer isso:</p>
<p>Primeiramente, eu criarei um scaffold de usuário, com um atributo <em>string</em> para guardar o fuso do usuário:</p>
<pre name="code" class="php">$ script/generate scaffold User name:string time_zone:string
$ rake db:migrate</pre>
<p>Mudarei formulário do usuário para usar o combo de fusos ao invés de um campo de texto:</p>
<pre name="code" class="ruby"># views/users/new.html.erb
&lt;%= f.time_zone_select :time_zone, TimeZone.us_zones %&gt;</pre>
<p>O novo formulário de usuário ficará assim — eu o usarei para criar alguns usuários com fusos diferentes:</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/new_user.png" title="new_user.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/new_user.thumbnail.png" alt="new_user.png" /></a></p>
<p>Para efeitos de demonstração, eu adicionarei um before_filter simples chamado &#8220;login_from_querystring&#8221; ao ApplicationController:</p>
<pre class="ruby" name="code"># controllers/application.rb
before_filter :login_from_querystring
def login_from_querystring
  @current_user = User.find_by_name(params[:user])
end</pre>
<p>Então adicionarei um outro before_filter &#8220;set_time_zone&#8221;, que definirá o Time.zone para o fuso do usuário atual:</p>
<pre name="code" class="ruby"># controllers/application.rb
before_filter :set_time_zone
def set_time_zone
  Time.zone = @current_user.time_zone if @current_user
end</pre>
<p>Adicionarei um cabeçalho ao layout para mostrar quem está logado, seu fuso horário e o hora atual em seu fuso horário:</p>
<pre name="code" class="ruby"># views/layouts/tasks.html.erbCurrent user: &lt;%= @current_user.name if @current_user %&gt;
Current time zone: &lt;%= Time.zone.name %&gt;
Current time: &lt;%= Time.zone.now.inspect %&gt;
&lt;hr /&gt;</pre>
<p>Finalmente, modificarei a view da index das tarefas para usar a representação #inspect do alert_at, para nos revelar alguns detalhes adicionais:</p>
<pre name="code" class="ruby"># views/tasks/index.html.erb
&lt;%=h task.alert_at.inspect %&gt;</pre>
<p>Agora, se eu logar com um dos usuários que eu criei, eu verei a tarefa que criei anteriormente, com o alert_at ajustado para o fuso do usuário atual:</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/index_usuario1.png" title="index_usuario1.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/index_usuario1.thumbnail.png" alt="index_usuario1.png" /></a></p>
<p>&#8230; note que o horário exibido para a tarefa é 11:30 EST - que é o mesmo que 10:30 CST.</p>
<p>Para o usuário em US Mountain Time, a tarefa será mostrada como 9:30 MST:</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/index_usuario2.png" title="index_usuario2.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/index_usuario2.thumbnail.png" alt="index_usuario2.png" /></a></p>
<p>Sem um usuário logado, o fuso usado é o definido em config.time_zone:</p>
<p><a href="http://tas.milk-it.net/wp-content/uploads/2008/04/index_usuario21.png" title="index_usuario21.png" rel="lightbox"><img src="http://tas.milk-it.net/wp-content/uploads/2008/04/index_usuario21.thumbnail.png" alt="index_usuario21.png" /></a></p>
<h3>Métodos para criar horários no Time.zone atual</h3>
<p>Anteriormente, nós estávamos nos apoiando no ActiveRecord para automaticamente converter atributos do model para o horário local do usuário. Para casos onde você precisa criar novas instâncias de Time no fuso local do usuário, os métodos Time.zone.local(), Time.zone.parse() e Time.zone.now() estão disponíveis, assim como Time.zone.now():</p>
<pre name="code" class="ruby">&gt;&gt; Time.zone = 'Hawaii'
=&gt; "Hawaii"
&gt;&gt; Time.zone.now
=&gt; Wed, 09 Apr 2008 15:48:18 HST -10:00
&gt;&gt; Time.zone.local(2008, 4, 9, 15, 48, 18)
=&gt; Wed, 09 Apr 2008 15:48:18 HST -10:00
&gt;&gt; Time.zone.parse('2008-04-09 15:48:18')
=&gt; Wed, 09 Apr 2008 15:48:18 HST -10:00
&gt;&gt; Time.zone.at(1207792098)
=&gt; Wed, 09 Apr 2008 15:48:18 HST -10:00</pre>
<p>Time e DateTime #in_time_zone converterá qualquer instância para o fuso em Time.zone:</p>
<pre name="code" class="ruby">&gt;&gt; Time.zone = 'Alaska'
=&gt; "Alaska"
&gt;&gt; t = Time.utc(2000)
=&gt; Sat Jan 01 00:00:00 UTC 2000
&gt;&gt; t.in_time_zone
=&gt; Fri, 31 Dec 1999 15:00:00 AKST -09:00</pre>
<p>&#8230; ou, para qualquer fuso ou identificador de fuso (ex.: nome, inteiro ou Duration):</p>
<pre name="code" class="ruby">&gt;&gt; t.in_time_zone('Hawaii')
=&gt; Fri, 31 Dec 1999 14:00:00 HST -10:00
&gt;&gt; t.in_time_zone(-6.hours)
=&gt; Fri, 31 Dec 1999 18:00:00 CST -06:00</pre>
<h3>Dica: Atualizando seu aplicativo</h3>
<ol>
<li>o novo recurso de fuso horário assume que seu banco de dados está guardando horários em UTC, então se você está atualmente guardando horários em um fuso diferente de UTC, você precisará migrar os dados existentes para UTC.</li>
<li>se você instalou o plugin tzinfo_timezone, você precisará removê-lo, dado que este sobrescreve a classe TimeZone no ActiveSupport.</li>
<li>a gem TZInfo não é mais necessárioa, dado que esta está agora dentro do ActiveSupport. De toda forma, se você tem uma versão recente desta gem instalada, Rails favorecerá a gem sobre a versão incluída no ActiveSupport.</li>
<li>A versão do TZInfo incluída no ActiveSupport é uma versão compacta da gem, então se você está interagindo com a API do TZInfo diretamente, você precisará da gem instalada.</li>
<li>Se você não deseja usar o novo recurso de fuso horário - este novo recurso não deve interferir em seu código existente, desde que você não declare o config.time_zone em seu environment.rb.</li>
</ol>
<h3>No próximo capítulo&#8230;</h3>
<p>Nos próximos posts, tentarei cobrir mais coisas &#8220;escondidas&#8221;, mas esperamos que este post ajude vocês</p>
<p>Se você acha fuso horário, correções UTC, e horário de verão confuso, você talvez queira ver estas <a href="http://mad.ly/2008/04/03/time-zone-visualizations/">validações de fuso horário</a>, que talvez te deixem ainda mais confuso&#8230;</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/fgAUayEezyg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/suporte-a-timezone-no-rails-21-uma-visao-geral/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/suporte-a-timezone-no-rails-21-uma-visao-geral/</feedburner:origLink></item>
		<item>
		<title>Telefone</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/h6sykyC13IQ/</link>
		<comments>http://tas.milk-it.net/admin/telefone/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 13:40:02 +0000</pubDate>
		<dc:creator>milk-it</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>milk it</category>
		<guid isPermaLink="false">http://tas.milk-it.net/admin/telefone/</guid>
		<description><![CDATA[Acredito que muitos de vocês não perceberam - no nosso contato ou rodapé -, mas o nosso telefone mudou. Agora é +55 31 3227 1009. Vocês que são os nossos amigos, clientes e parceiros vão ter muito mais facilidade para entrar em contato conosco.
Antes nós usávamos o serviço SkypeIn da Skype, que é muito bom [...]]]></description>
			<content:encoded><![CDATA[<p>Acredito que muitos de vocês não perceberam - no nosso contato ou rodapé -, mas o nosso telefone mudou. Agora é <strong>+55 31 3227 1009</strong>. Vocês que são os nossos amigos, clientes e parceiros vão ter muito mais facilidade para entrar em contato conosco.</p>
<p>Antes nós usávamos o serviço <a href="http://skype.com/go/skypein" rel="external">SkypeIn</a> da <a href="http://www.skype.org" rel="external">Skype</a>, que é muito bom e simples. O problema é que dependíamos dos computadores, internet e fone-microfone para atender e sempre acontecia algum problema. Agora, para não dar mais brecha pro <a href="http://pt.wikipedia.org/wiki/Lei_de_Murphy" rel="external">Murphy</a>, resolvemos assinar uma linha de telefone convencional.</p>
<p>Agora todos poderão <a href="http://www.milk-it.net/contato" rel="external">entrar em contato com a Milk-it</a> com mais comodidade e sem uma secretária eletrônica falando em inglês. <img src='http://tas.milk-it.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/h6sykyC13IQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/admin/telefone/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/admin/telefone/</feedburner:origLink></item>
		<item>
		<title>Mudanças…</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/xIHUFsJ5fUA/</link>
		<comments>http://tas.milk-it.net/admin/mudancas/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 21:32:03 +0000</pubDate>
		<dc:creator>milk-it</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>microsoft</category><category>milk it</category><category>open source</category>
		<guid isPermaLink="false">http://tas.milk-it.net/admin/mudancas/</guid>
		<description><![CDATA[Há algum tempo estávamos cogitando mudar a nossa forma de trabalho e nossas tecnologias, então venho informar que não vamos mais trabalhar com Ruby on Rails, GNU/Linux e boa parte das soluções livres. Isso se deve ao fato das soluções da Microsoft atenderem muito melhor a nossa empresa. Agora todas as nossas estações de trabalho [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo estávamos cogitando mudar a nossa forma de trabalho e nossas tecnologias, então venho informar que não vamos mais trabalhar com <a href="http://www.rubyonrails.org" rel="external">Ruby on Rails</a>, <a href="http://www.gnu.org" rel="external">GNU</a>/<a href="http://www.kernel.org" rel="external">Linux</a> e boa parte das soluções livres. Isso se deve ao fato das soluções da <a href="http://www.microsoft.com.br" rel="external">Microsoft</a> atenderem muito melhor a nossa empresa. Agora todas as nossas estações de trabalho serão <a href="http://www.microsoft.com/brasil/windowsxp/default.mspx" rel="external">Windows XP</a> com <a href="http://www.microsoft.com/brasil/office/" rel="external">Office</a> 2007 e <a href="http://www.microsoft.com/brasil/msdn/visualstudio/default.mspx" rel="external">Visual Studio</a> 2008, todas as licenças já estão em posse da Milk-it.</p>
<p>Agradecemos a toda a comunidade <a href="http://www.youtube.com/watch?v=IJrfcQq_eIw" rel="external">software livre</a>, especialmente a Ruby on Rails e <a href="http://www.gentoo.org" rel="external">Gentoo</a>, mas atualmente as soluções da Microsoft nos atendem muito melhor. Como todos os nossos projetos abertos usam tecnologias livres, vamos fechar o nosso repositório <a href="http://svn.milk-it.net/open" rel="external">svn.milk-it.net/open</a> pelo simples fato de não fazer mais sentido dar manutenção neles.</p>
<p>Sei que muitos de vocês lêem o nosso blog por conta dos <a href="http://tas.milk-it.net/tag/open-source">posts voltados para software livre</a>, mas espero a compreensão de todos.</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/xIHUFsJ5fUA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/admin/mudancas/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/admin/mudancas/</feedburner:origLink></item>
		<item>
		<title>Processamento de imagens com Qt</title>
		<link>http://feedproxy.google.com/~r/thinkingaboutsomething/~3/hFixwITx4es/</link>
		<comments>http://tas.milk-it.net/carlos/manipulando-imagem-com-qt/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 16:57:12 +0000</pubDate>
		<dc:creator>Carlos Júnior</dc:creator>
		
		<category><![CDATA[all]]></category>
<category>desenvolvimento</category><category>open source</category><category>pid</category>
		<guid isPermaLink="false">http://tas.milk-it.net/carlos/manipulando-imagem-com-qt/</guid>
		<description><![CDATA[Este semestre estou cursando uma matéria que se chama Processamento de Imagens Digitais na PUC-MG e, diga-se de passagem, estou gostando muito da matéria. Recebemos então nosso primeiro trabalho prático que consiste em 3 passos, sendo o que primeiro irá gerar a versão em escala de cinza de uma imagem. Considerei esta a oportunidade perfeita [...]]]></description>
			<content:encoded><![CDATA[<p>Este semestre estou cursando uma matéria que se chama Processamento de Imagens Digitais na <a HREF="http://www.pucminas.br" REL="external">PUC-MG</a> e, diga-se de passagem, estou gostando muito da matéria. Recebemos então nosso primeiro trabalho prático que consiste em 3 passos, sendo o que primeiro irá gerar a versão em escala de cinza de uma imagem. Considerei esta a oportunidade perfeita para aprender a trabalhar com <a HREF="http://trolltech.com/products/qt" REL="external">Qt</a>.</p>
<p>Como o trabalho necessitava de uma interface gráfica (exigência do professor), comecei com o <a HREF="http://trolltech.com/products/qt/features/designer" REL="external">Qt Designer</a>. O programa é realmente muito bom e fácil de mexer! Por usar caixas de ferramentas flutuantes, recomendo o uso de uma área de trabalho somente para o programa.</p>
<p>O segundo passo foi escrever o comportamento da interface, ou melhor, o trabalho de fato. Como este não é um tutorial de Qt vou pular direto para a manipulação da imagem. Escrevi então o seguinte código para deixar a imagem em escala de cinza utilizando a <a HREF="http://doc.trolltech.com/4.3/qimage.html" REL="external">QImage</a>:</p>
<pre NAME="code" CLASS="c++">void
pidMain::generateGrayScale()
{
    // ocultei o código original pois se trata de recuperar o objeto QImage e nada mais
    QImage *original = getImage();
    QImage *gray = new QImage(original-&gt;width(), original-&gt;height(), QImage::Format_RGB32);
    QRgb grayPix;
    QColor *curPix;
    int bright;    

    for (int i =0; i &lt; gray-&gt;width(); i++)
        for (int j = 0; j &lt; gray-&gt;height(); j++)
        {
            curPix= &amp;QColor::fromRgba(original-&gt;pixel(i, j));
            bright = qRound(0.3 * curPix-&gt;red() + 0.5 * curPix-&gt;green() + 0.2 * curPix-&gt;blue());
            grayPix = qRgb(bright, bright, bright);
            gray-&gt;setPixel(i, j, grayPix);
        }    

    // também ocultei o código original aqui. Agora temos uma imagem em escala de cinza no ponteiro "gray"
}</pre>
<p>Espero que este código seja útil a alguém ! Caso queiram opinar, melhorar, estragar ou qualquer coisa, <a HREF="http://paste.milk-it.net/private/47d552578de91" REL="external">o código para alteração está aqui</a> !</p>
<p>Abraços!</p>
<img src="http://feeds.feedburner.com/~r/thinkingaboutsomething/~4/hFixwITx4es" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tas.milk-it.net/carlos/manipulando-imagem-com-qt/feed/</wfw:commentRss>
		<feedburner:origLink>http://tas.milk-it.net/carlos/manipulando-imagem-com-qt/</feedburner:origLink></item>
	</channel>
</rss>
