<?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>Cauan Cabral</title>
	<atom:link href="http://cauancabral.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://cauancabral.net</link>
	<description>Geek, nerd e apaixonado por tecnologia</description>
	<lastBuildDate>Sun, 06 May 2012 23:53:19 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>&#8220;Campanha do Armamento&#8221;, sério?</title>
		<link>http://cauancabral.net/2012/05/06/campanha-do-armamento-serio/</link>
		<comments>http://cauancabral.net/2012/05/06/campanha-do-armamento-serio/#comments</comments>
		<pubDate>Sun, 06 May 2012 23:53:19 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Ócio]]></category>
		<category><![CDATA[arma de fogo]]></category>
		<category><![CDATA[desarmamento]]></category>
		<category><![CDATA[falácias]]></category>
		<category><![CDATA[porte de arma]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=300</guid>
		<description><![CDATA[As armas são os bens mais valiosos de uma sociedade pois, em um caso extremo, são as únicas ferramentas capazes de garantir o direito a vida, a liberdade, a igualdade, a segurança e a propriedade Lli isso na página da &#8230; <a href="http://cauancabral.net/2012/05/06/campanha-do-armamento-serio/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/"     class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito&hellip;</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/"     class="crp_title">Pedalando: Segundas impressões</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<div id="attachment_302" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-302" title="Arma automática calibre .30" src="http://cauancabral.net/wp-content/uploads/2012/05/arma_grande.jpg" alt="Arma calibre .30" width="400" height="300" /><p class="wp-caption-text">Você provavelmente não terá uma dessas</p></div>
<blockquote>
<p data-ft="{&quot;type&quot;:1}">As armas são os bens mais valiosos de uma sociedade pois, em um caso extremo, são as únicas ferramentas capazes de garantir o direito a vida, a liberdade, a igualdade, a segurança e a propriedade</p>
</blockquote>
<p data-ft="{&quot;type&quot;:1}">Lli isso na página da &#8220;Campanha do Armamento&#8221; no Facebook.</p>
<div id="attachment_303" class="wp-caption aligncenter" style="width: 594px"><img class="size-large wp-image-303" title="Revolver" src="http://cauancabral.net/wp-content/uploads/2012/05/revolver-1024x638.jpg" alt="um revolver qualquer" width="584" height="363" /><p class="wp-caption-text">Talvez você tenha uma parecida com essa</p></div>
<p data-ft="{&quot;type&quot;:1}">Será? Se eu só tiver dinheiro pra ter um revolver e outro cara tiver uma bazuca/metralhadora, em que mundo eu estarei em igualdade? Em que situação eu protegerei a vida, liberdade, segurança ou propriedade?</p>
<div id="attachment_301" class="wp-caption aligncenter" style="width: 660px"><a href="http://cauancabral.net/wp-content/uploads/2012/05/ak47_1.jpg"><img class="size-full wp-image-301" title="Clássica AK47" src="http://cauancabral.net/wp-content/uploads/2012/05/ak47_1.jpg" alt="Imagem de uma AK47" width="650" height="212" /></a><p class="wp-caption-text">Seu &quot;oponente&quot; terá uma igual ou maior</p></div>
<p data-ft="{&quot;type&quot;:1}">A única coisa que garante liberdade, segurança e propriedade é a igualdade &#8211; não necessariamente financeira, mas ao menos a de oportunidades. Armas só servem para impor, e tudo que vem como imposição, uma hora caí.</p>
<p data-ft="{&quot;type&quot;:1}">Vendo outras postagens na página da campanha e na internet me espanta as linhas de defesas ao armamento, que em vários pontos me lembram os argumentos preconceituosos e raivosos usados contra os últimos candidatos de &#8220;esquerda&#8221; em nosso país:</p>
<ul>
<li>&#8220;o cidadão desarmado é indefeso&#8221;: então o querem que acreditemos que quem está armado está seguro? Não deve nem precisar de polícia&#8230;</li>
<li>&#8220;os governos de &#8216;mal-feitores&#8217; como Hitler, Stalin, Mao Tse e Castro desarmaram os civis e só por isso fizeram o que fizeram&#8221;: Todos estes &#8220;caras&#8221; iniciaram seus governos com alto apoio popular, portanto não foi a falta de armas que permitiu seus governos. Pela mesma linha de raciocínio, países como Reino Unido, Japão e Austrália devem ter governos extremamentes perversos também, já que não é permitido o porte de arma.</li>
<li>&#8220;estão te tirando  mais um direito, qual será o próximo&#8221;: Como todos deveriam saber, ninguém tira direito de ninguém em uma sociedade democrática se isso não for vontade da maioria. E se realmente for a vontade da maioria, que esta seja feita. Isso é democrácia.</li>
</ul>
<div id="attachment_304" class="wp-caption aligncenter" style="width: 390px"><img class="size-full wp-image-304" title="Capa da Veja 380" src="http://cauancabral.net/wp-content/uploads/2012/05/capa_veja_380.jpg" alt="Capa da revista Veja 380" width="380" height="490" /><p class="wp-caption-text">Se Veja é contra o desarmamento, então ele deve ser bom.</p></div>
<p data-ft="{&quot;type&quot;:1}">O que se esconde por trás de todos esses argumentos é a tentativa de maquiar um problema real de difícil solução com uma questão socialmente irrelevante mas que implica numa grande disputa de interesses econômicos. Da mesma forma que a indústria do cigarro e do petróleo não gostam de ser taxada como negativa, a indústria bélica idem, isso faz o faturamento cair.</p>
<p data-ft="{&quot;type&quot;:1}">Se você é uma pessoa atuante, que gosta de ajudar na reinvindicação de direitos e melhorias para a sociedade, sugiro que o invés de fazer &#8220;Campanha do Armamento&#8221;, faça campanhas pela igualdade na educação, por justiça igualitária, pela ética e moralidade em todas as esferas sociais, seja setor público ou privado.</p>
<p data-ft="{&quot;type&quot;:1}">O mundo carece muito mais de pessoas bem intencionadas e corretas do que de armas.</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/"     class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito&hellip;</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/"     class="crp_title">Pedalando: Segundas impressões</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/05/06/campanha-do-armamento-serio/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pedalando: Segundas impressões</title>
		<link>http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/</link>
		<comments>http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 18:17:36 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Ciclismo]]></category>
		<category><![CDATA[bicicleta]]></category>
		<category><![CDATA[pedalada]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=296</guid>
		<description><![CDATA[Como comentei no último post estou tentando adotar a bicicleta como meio de transporte principal para o trabalho. Depois de um primeiro dia tranquilo na sexta-feira, nessa última segunda feira fiz pela primeira vez o caminho &#8220;casa -&#62; trabalho&#8221; e &#8230; <a href="http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/"     class="crp_title">Pedalando: Primeiras impressões</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/"     class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas&hellip;</a></li><li><a href="http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/"     class="crp_title">Aplicações heterogêneas e a busca por conhecimento</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Como comentei no <a title="Pedalando: Primeiras impressões" href="http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/">último post</a> estou tentando adotar a bicicleta como meio de transporte principal para o trabalho. Depois de um primeiro dia tranquilo na sexta-feira, nessa última segunda feira fiz pela primeira vez o caminho &#8220;casa -&gt; trabalho&#8221; e as impressões foram bem diferentes&#8230; vamos lá:</p>
<ul>
<li>Começar o dia pedalando é muito mais difícil do que terminar o dia. Provavelmente pelo corpo frio, falta de aquecimento/alongamento. Fato é que após andar 2 quadras já sentia algum cansaço e no final do trajeto cheguei a carregar a bicicleta a pé por conta da exaustão.</li>
<li>A falta de segurança na pedalada derivada da falta de precisão na troca de marchas é muito mais encomoda quando você está cansado. E o cansaço só aumenta com isso.</li>
<li>Quando cheguei no trabalho parecia que havia subido uma montanha durante os 11Km do trajeto, mas passando de carro pelo mesmo local da pra ver que a quantidade de subidas e descidas são equivalentes em ambos os sentidos ( o que reforça o primeiro ponto ).</li>
<li>Comer antes de pedalar não é uma boa ideia: comi um copinho de iogurte (desses em embalagem com 6) + granola, achando ser uma boa medida por conta da energia mas depois de um certo esforço o iogurte parecia azedar em minha barriga =]</li>
</ul>
<p>Por conta dessas dificuldades fiquei dois dias sem pedalar e decidi fazer apenas o trecho &#8220;trabalho -&gt; casa&#8221; até ganhar alguma resistência física.</p>
<p>Espero encorajar e ajudar outros a adotarem um meio de transporte alternativo, faz bem pra você e pra cidade ;]</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/"     class="crp_title">Pedalando: Primeiras impressões</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/"     class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas&hellip;</a></li><li><a href="http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/"     class="crp_title">Aplicações heterogêneas e a busca por conhecimento</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pedalando: Primeiras impressões</title>
		<link>http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/</link>
		<comments>http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 03:34:33 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Ciclismo]]></category>
		<category><![CDATA[bicicleta]]></category>
		<category><![CDATA[pedalada]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=293</guid>
		<description><![CDATA[Ultimamente tenho usado o blog apenas pra falar de programação, desenvolvimento e coisas do gênero, mas vou voltar a dividir o espaço com alguns assuntos &#8220;OFF-TOPIC&#8221;. Como muitos da minha área não tenho o habito de praticar exercícios e depois &#8230; <a href="http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/"     class="crp_title">Pedalando: Segundas impressões</a></li><li><a href="http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/"     class="crp_title">Aplicações heterogêneas e a busca por conhecimento</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Ultimamente tenho usado o blog apenas pra falar de programação, desenvolvimento e coisas do gênero, mas vou voltar a dividir o espaço com alguns assuntos &#8220;OFF-TOPIC&#8221;.</p>
<p>Como muitos da minha área não tenho o habito de praticar exercícios e depois de esperar uma oportunidade cair do céu pra iniciar algo acabei lembrando que tinha uma bicicleta encostada nos fundos de casa. Juntando os pontos, resolvi que iria adota-la como meio de transporte.</p>
<p>Como não pedalava há muito tempo (e nunca fui especialista nisso), passei um bom tempo lendo e conversando a respeito até que hoje surgiu a oportunidade e fiz o caminho de volta do trabalho com a &#8220;magrela&#8221;.</p>
<p>Essa introdução toda é só para contextualizar um pouco as minhas primeiras impressões:</p>
<ul>
<li>Nunca tinha andando em ciclo-vias &#8211; a sensação de segurança proporcionada é enorme; O problema é que apenas metade do meu caminho possuí ciclo-via.</li>
<li>Apesar da segurança em relação aos automóveis, muitos usam ciclo-vias para caminhar, sentar, brincar com bebês e cachorros, então toda atenção é necessária.</li>
<li>Meu trajeto tem mais ou menos 11Km, fiz hoje em 45min e me surpreendi por isso. Esperava um tempo bem maior.</li>
<li>Apesar de não pedalar há muito tempo, consegui fazer todo o percurso sem dificuldades =P</li>
<li>Não tenho uma bicicleta top, é uma dessas comuns que podem ser compradas em supermercados (uma Sundown Brisk) e hoje já deu pra ver o porque de ler em todo texto sobre ciclismo que ter uma boa bicicleta faz a diferença: marchas travando, correia pulando de uma coroa para outra sozinha, o que nos deixa um pouco inseguro e desperdiça nosso esforço.</li>
</ul>
<p>Encontrei várias dificuldades pra iniciar a pedala: dias dia chuva, trabalho até tarde, compromissos sociais no inicio da noite; mas acho que isso é normal e o negócio persistir =]</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/25/pedalando-segundas-impressoes/"     class="crp_title">Pedalando: Segundas impressões</a></li><li><a href="http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/"     class="crp_title">Aplicações heterogêneas e a busca por conhecimento</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/04/20/pedalando-primeiras-impressoes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CakePHP: Plugin Locale</title>
		<link>http://cauancabral.net/2012/04/18/cakephp-plugin-locale/</link>
		<comments>http://cauancabral.net/2012/04/18/cakephp-plugin-locale/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 18:23:33 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=287</guid>
		<description><![CDATA[Vamos falar um pouco sobre outro plugin para CakePHP que surgiu no coração da Radig: o Locale. Meu amigo José Agripino já apresentou o plugin no próprio blog da Radig, mas como reescrevi quase que totalmente o plugin nos últimos &#8230; <a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/"     class="crp_title">HTML5: Problemas com Input type=&#8221;number&#8221;</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/"     class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas&hellip;</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Vamos falar um pouco sobre outro plugin para <a title="CakePHP Framework" href="http://cakephp.org">CakePHP</a> que surgiu no coração da <a title="Radig Soluções em TI" href="http://radig.com.br">Radig</a>: o <a title="CakePHP Plugin Locale" href="https://github.com/radig/locale">Locale</a>.</p>
<p>Meu amigo <a title="Blog do grande José Agripino Duarte" href="http://agripinoduarte.radig.com.br/">José Agripino</a> já apresentou o plugin no próprio <a title="Plugin Locale para localização de datas e moedas" href="http://www.radig.com.br/2011/01/29/cakephp-plugin-locale-para-localizacao-de-datas-e-moeda/">blog da Radig</a>, mas como reescrevi quase que totalmente o plugin nos últimos dias, acredito ser a hora de falar dele novamente.</p>
<p>Nada melhor para ver a utilidade de algo como imaginar uma situação de uso real, então vamos lá&#8230;</p>
<p>Cenário 1: você desenvolve um sistema para brasileiros, e quer permitir a entrada de informações em formato local, isto é, datas com dia/mês/ano e números com vírgula separando decimais. O problema é que estes dados são inválidos em um banco de dados convencional (como MySQL e PostgreSQL). Ao tentar salvar uma data formatada com dia/mês/ano você receberá um erro como resposta. Como resolver isso? Use o behavior Locale no seu modelo.</p>
<p>Basta adicionar o behavior Locale no modelo que ele fará a conversão de datas e números para o formato americano.</p>
<pre>public $actsAs = array('Locale.Locale');</pre>
<p>É possível converter automaticamente datas, datas acompanhadas de horas e decimais/floats.</p>
<p>Cenário 2: você já tem os dados do seu usuário armazenados no banco (formato padrão/americano) e quer apresenta-los em um formato local na sua View, o que fazer? Use o Helper Locale em sua view. Primeiro ative o helper no seu controller:</p>
<pre>public $helpers = array('Locale.Locale');</pre>
<p>Agora basta usa-lo na view:</p>
<pre>echo $this-&gt;Locale-&gt;date($this-&gt;data['User']['birthday']);</pre>
<p>É possível formatar data, data com hora, data literal (quarta-feira 18 de abril de 2012, por exemplo), decimais como 53,42 e valores monetários ( R$ 53,42 ).</p>
<p>Além do Behavior e do Helper, você pode carregar as libs Localize e Unlocalize em qualquer parte de seu sistema para converter entre os dois diferentes formatos. As libs são estáticas e suportam aninhamento de método, assim você pode fazer:</p>
<pre>echo Localize::setLocale('pt_BR')-&gt;decimal(12.45); // 12,45</pre>
<p>A unica configuração necessária é a definição do locale de sua aplicação, que pode ser feito no próprio bootstrap.php do Cake:</p>
<pre>setlocale(LC_ALL, 'pt_BR');</pre>
<p>Assim como outros plugins da Radig, você pode consultar os <a title="Testes do branche 2.0 do Locale" href="https://github.com/radig/locale/tree/2.0/Test">testes incluídos</a> para ver melhor o funcionamento deste.</p>
<p>Se for utilizar, nos avise, será uma grande satisfação ver que o plugin é util para outros.</p>
<p>Há uma versão compatível com o CakePHP 1.3 e outra com o CakePHP 2.x, basta usar o branch correspondente.</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/"     class="crp_title">HTML5: Problemas com Input type=&#8221;number&#8221;</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/"     class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas&hellip;</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/04/18/cakephp-plugin-locale/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CakePHP: Plugin Auditable</title>
		<link>http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/</link>
		<comments>http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 01:33:09 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=280</guid>
		<description><![CDATA[Cenário: você desenvolve um sistema para uma empresa e 4 meses depois a gerência da empresa detecta um problema nos dados e solicita uma auditoria pra saber o que causou aquilo e quem é o responsável. Este cenário é mais &#8230; <a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Cenário: você desenvolve um sistema para uma empresa e 4 meses depois a gerência da empresa detecta um problema nos dados e solicita uma auditoria pra saber o que causou aquilo e quem é o responsável.</p>
<p>Este cenário é mais comum do que parece, em várias situações talvez não chegue a diretoria, mas algum usuário pede informação de como dada informação chegou ou saiu do sistema. Como você atenderia a solicitação? Se você não tem ainda uma resposta, vou apresentar uma alternativa, um plugin para CakePHP desenvolvido pela equipe da <a title="Radig Soluções em TI" href="http://radig.com.br">Radig</a> (eu incluso) e disponível no seu github: <a title="CakePHP Auditable" href="https://github.com/radig/auditable">github.com/radig/auditable</a></p>
<p>O objetivo do <a title="Plugin CakePHP Auditable" href="https://github.com/radig/auditable/">Auditable</a> é muito simples: tornar qualquer sistema em CakePHP auditável.</p>
<p>O plugin é composto de duas peças chaves: uma classe de configuração e um behavior. Para tornar um modelo auditável, basta &#8220;plugar&#8221; o behavior à ele, a partir daí todas as informações criadas, alteradas ou removidas.</p>
<p>Há ainda um helper para ajudar na formatação das entradas do log e um controller simples que pode ser usado para visualizar o log.</p>
<p>Há casos de teste para todo o behavior e informações sobre sua configuração em seu readme: <a href="https://github.com/radig/auditable/blob/master/README.textile">https://github.com/radig/auditable/blob/master/README.textile</a></p>
<p>Bom proveito =]</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Conforme o assunto se desenrolou nos comentários, implementamos os modelos Logger e LogDetail para uso junto ao CakeMongoDb para armazenar os logs no banco de dados MongoDB. Você pode conferir no plugin <a title="CakePHP Plugin AuditableMongoLogger" href="https://github.com/radig/auditable_mongo_logger">AuditableMongoLogger</a></p>
<p>Qualquer dúvida ou sugestão pode usar os comentários ou o Github ;]</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</title>
		<link>http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/</link>
		<comments>http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 18:05:01 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[acl]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=278</guid>
		<description><![CDATA[Quando falamos em Acl e CakePHP muitos tem a lembrança de horas lutando contra um monte de código para tentar fazer funcionar a autenticação e permissionamento. Bastam algumas dezenas de projetos e você fica craque em configura-lo. Porém vez ou &#8230; <a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li><li><a href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema&hellip;</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/"     class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas&hellip;</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Quando falamos em Acl e CakePHP muitos tem a lembrança de horas lutando contra um monte de código para tentar fazer funcionar a autenticação e permissionamento. Bastam algumas dezenas de projetos e você fica craque em configura-lo.</p>
<p>Porém vez ou outra aparece uma dúvida que te faz perder várias horas <em>debugando</em> e as vezes termina isso sem uma solução razoável.</p>
<p>Trabalhamos muito com Plugins na <a title="Radig Soluções em TI" href="http://radig.com.br">Radig</a> e um problema que enfrentávamos de vez em quando era o de ter um plugin com o mesmo nome de uma ação de controller. Nestes, quando você verifica a permissão para a ação usando uma sintaxe de caminho parcial, isto é, algo como:</p>
<pre>$this-&gt;Acl-&gt;check('acao', 'Fulano');
$this-&gt;Acl-&gt;check('Controller/acao', 'Fulano');
$this-&gt;Acl-&gt;check('Plugin/Controller/acao', 'Fulano');</pre>
<p>Um erro é retornado, dizendo que o Aco não pode ser verificado (lembrando que para o exemplo, Plugin teria o mesmo nome de acao).</p>
<p>Isso foi até assunto de um <a href="http://cakephp.lighthouseapp.com/projects/42648/tickets/1739-case-insensitive-acos-table-can-cause-duplicate-path-retrievements">bug reportado para o CakePHP</a>, afirmando que a falha estava no fato das comparações no banco de dados serem, na maioria das vezes, <em>case-insensitive</em>. De fato, como respondeu o <a href="http://mark-story.com/">Mark Story</a>, uma forma de resolver este &#8220;problema&#8221; é utilizar no banco de dados um <a title="MySQL Charsets" href="http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html">COLLATION</a> que seja de fato <em>case-sensitive</em>. O problema nisso é que a maioria dos conjuntos de caracteres, ao menos no MySQL, são <em>case-insensitive, </em>então você teria de mudar todos os seus banco de dados para corrigir isso.</p>
<p>Porém o usuário <a href="http://cakephp.lighthouseapp.com/projects/42648/tickets/1739-case-insensitive-acos-table-can-cause-duplicate-path-retrievements#ticket-1739-15">nlcO postou uma dica interessante</a>: basta usar o caminho completo do Aco que não haverá conflito, mesmo quando <em>controllers</em>, plugins ou actions tiverem os mesmos nomes. Mas como usar o caminho completo? Basta ver qual é seu Aco raiz (que possuí o parent_id = NULL) e ir incluindo após ele todos os subsequêntes &#8211; plugins, controllers e actions, até formar o caminho completo.</p>
<p>No meu exemplo ficaria:</p>
<pre>$this-&gt;Acl-&gt;check('aplicacao/Plugin/Controller/acao', 'Fulano');</pre>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li><li><a href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema&hellip;</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/"     class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas&hellip;</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5: Problemas com Input type=&#8221;number&#8221;</title>
		<link>http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/</link>
		<comments>http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 18:34:46 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=276</guid>
		<description><![CDATA[Opa, esse é mais um aviso. Recentemente estava trabalhando em um sistema com CakePHP 2.1 e ao tentar editar um registro onde um dos campos era do tipo float, o valor que estava no banco não era apresentado no formulário, &#8230; <a href="http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/"     class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito&hellip;</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema&hellip;</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Opa, esse é mais um aviso.</p>
<p>Recentemente estava trabalhando em um sistema com CakePHP 2.1 e ao tentar editar um registro onde um dos campos era do tipo float, o valor que estava no banco não era apresentado no formulário, embora a tag input estivesse com o atributo value preenchido corretamente. Isso aconteceu comigo no Chrome 17, no Firefox 10 não houve problema porque ele utiliza input text normal.</p>
<p>Um detalhe importante é que eu utilizo o Helper Locale para formatar os números decimais para meus usuários, assim o que vem do banco como &#8220;12.58&#8243; vira &#8220;12,58&#8243; formato que usamos no Brasil. Talvez se usasse ponto como separador de decimais não teria problema &#8211; o que não é possível pra mim.</p>
<p>Ao pesquisar um pouco descobri um bug no Chromium relacionado a isso reportado no link <a href="http://code.google.com/p/chromium/issues/detail?id=44116">http://code.google.com/p/chromium/issues/detail?id=44116</a> . Não consegui entender o motivo mas foi marcado como <em>Wontfix.</em></p>
<p>A saída foi sobrescrever o FormHelper para utilizar input do tipo text quando o número vindo é um ponto flutuante/decimal. Se você não trabalha com CakePHP, mas trabalha com números decimais separados por vírgula, a dica continua valendo: utilize input com o tipo <em>text</em> ao invés de <em>number</em>.</p>
<p><a title="Correção no FormHelper para usar input text em floats" href="https://github.com/radig/TwitterBootstrap/commit/81ab8bcfcdbe16cdad926e0f79f6bb097a707928">Aqui tem um commit</a> onde implementamos a &#8220;correção&#8221; em um FormHelper que estende o do CakePHP.</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/"     class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito&hellip;</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/"     class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema&hellip;</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas versões</title>
		<link>http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/</link>
		<comments>http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 14:29:31 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=272</guid>
		<description><![CDATA[Tirando a poeira disso aqui&#8230; Desde que comecei com CakePHP me sentia frustrado por não conseguir utilizar o shell de diferentes versões sem precisar alterar meu ambiente de trabalho. Na época meu problema era ter projetos rodando a versão 1.2 &#8230; <a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Tirando a poeira disso aqui&#8230;</p>
<p>Desde que comecei com CakePHP me sentia frustrado por não conseguir utilizar o shell de diferentes versões sem precisar alterar meu ambiente de trabalho. Na época meu problema era ter projetos rodando a versão 1.2 e outros rodando 1.3.</p>
<p>Ontem me deparei novamente com o problema e cheguei até a <a title="CakePHP Lighthouseapp" href="http://cakephp.lighthouseapp.com/projects/42648-cakephp/tickets/2675-include-alias-for-cake-shell-in-dist-package">sugerir um alias embutido no CakePHP</a>, porém a ideia foi sabiamente rejeitada.</p>
<p>A solução para isso é mais simples do que parece (se você usa Linux e Bash, pelo menos): basta criar uma alias de comando para cada uma das versões do CakePHP.</p>
<h2>Como fazer</h2>
<ol>
<li>Abra o arquivo ~/.bashrc (se não existir, crie-o);</li>
<li>Para cada versão do CakePHP você vai criar um alias seguindo este &#8220;template&#8221;:</li>
</ol>
<pre>alias cake13="~/pastas_ate_chegar_ao_cake/cakephp/cake/console/cake"</pre>
<p>Meu arquivo ficou assim:</p>
<pre>alias cake13="~/develop/php/cake13/cake/console/cake"
alias cake2="~/develop/php/cake2/lib/Cake/Console/cake"</pre>
<p>Agora é só fechar e abrir novamente o terminal e usar os comandos &#8220;cake2&#8243;, &#8220;cake13&#8243; ou outro que você tenha criado. Works like a charm ;]</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/"     class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aplicações heterogêneas e a busca por conhecimento</title>
		<link>http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/</link>
		<comments>http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 22:13:29 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[braziljs]]></category>
		<category><![CDATA[capacitação]]></category>
		<category><![CDATA[comunidade]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=264</guid>
		<description><![CDATA[Estive muito tempo sem escrever neste espaço por dois motivos: falta de tempo hábil e de um tema &#8220;supimpa&#8221;, que não fosse o mesmo abordado milhões de vezes por milhões de outros blogs. Felizmente a falta de tempo ainda é &#8230; <a href="http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/"     class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito&hellip;</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Estive muito tempo sem escrever neste espaço por dois motivos: falta de tempo hábil e de um tema &#8220;supimpa&#8221;, que não fosse o mesmo abordado milhões de vezes por milhões de outros blogs.</p>
<p>Felizmente a falta de tempo ainda é um problema, graças aos trabalhos na <a title="Radig Soluções em TI, empresa que trabalho" href="http://radig.com.br">Radig</a>. Digo felizmente por que é muito bom trabalhar no que você gosta, <a title="grande parceiro Habib" href="http://twitter.com/#!/habibasseiss">com</a> <a title="José Agripino, o Grande" href="http://twitter.com/#!/agripinoduarte">grandes</a> <a title="o Japa" href="http://twitter.com/#!/rafa_sake/">amigos</a> <a title="Morto, o caçula da turma" href="http://twitter.com/#!/marcelgrassi">e</a> possibilidades infinitas. Mas agora os assuntos estão fervilhando na minha cabeça.</p>
<p>Hoje quero falar um pouco de <strong>aplicações heterogêneas</strong>. Não sei nem se o termo é utilizado, busquei  no <a title="ó grande sábio" href="http://google.com.br">oráculo</a> e não encontrei referências, tentei por sistemas heterogêneos mas o que vem são informações sobre química e soluções heterogêneas.</p>
<p>Mas se o termo não existe, o que quero dizer com aplicações heterogêneas? São aplicações que mesclam tecnologias diferentes com um mesmo propósito, por exemplo: uso de dois modelos de SGDB&#8217;s ou duas linguagens de programação <em>server-side</em>, mas que compartilham informações de modo altamente acoplado.</p>
<p>Venho trabalhando em alguns produtos (um deles é o <a title="Sistema para gesstão para escritórios de advocacia da Radig" href="http://www.radig.com.br/produtos/juris/">Juris</a>, conhece?) e um dos recursos que implementamos são notificações em tempo real sobre ações dentro do sistema para os usuários de interesse.</p>
<p>No projeto do sistema de notificações nós tínhamos os requisitos:</p>
<ul>
<li>Baixo tempo de resposta entre a ação e o disparo de notificação</li>
<li>Escalabilidade &#8211; suportar, sem sobrecarregar o servidor, mais de 1000 conexões simultâneas</li>
<li>Fácil manutenção</li>
<li>Independência do sistema &#8211; acoplamento baixo em código, mas alto em relação aos dados</li>
</ul>
<p>Nossos principais sistemas foram desenvolvidos em PHP, portanto parecia natural escolher a triad PHP+APACHE+(MySQL/PostgreSQL) para o sistema de notificação. Parecia.</p>
<p>Em abril deste ano tive a felicidade de participar do evento <a title="Página do evento, deve ser atualizada a cada ano" href="http://braziljs.com.br/#!/home">BrazilJS</a>, onde pude ver feras como <a title="web opener na Opera Software" href="http://twitter.com/#!/miketaylr">Mike Taylor</a>, <a title="perfil do Richard Worth, desenvolvedor do jQuery UI" href="http://twitter.com/#!/rworth">Richard Worth</a> e seu irmão* <a title="desenvolvedor do Yahoo!" href="http://twitter.com/#!/gchapiewski">Guilherme Chapiewski</a>, o lendário <a title="O Dinossouro das CSS" href="http://maujor.com">Maujor</a>, os gaúchos <a title="twitter do Jaydson" href="http://twitter.com/#!/jaydson">Jaydson</a> e <a title="twitter do Felipe Nascimento" href="http://twitter.com/#!/felipenmoura">Felipe Nascimento</a> que organizaram um evento do outro lado do país, o <a title="você quis dizer: Dr Ricardo Coelho" href="http://twitter.com/#!/ramcoelho">Ricardo Coelho</a> &#8211; segundo maranhense mais conhecido e influente do país (perde só para nosso querido² Sarney) além do velho conhecido <a title="Página pessoal do Bruno PorKaria" href="http://porkaria.com.br">PorKaria</a>.</p>
<p>Duas coisas realmente me chamaram atenção durante o evento: o extensivo uso que tem sido feito da linguagem JavaScript para rodar aplicações no servidor, através do Node.js, e a possibilidade de criação de aplicações com resposta em tempo real com baixo custo computacional através de bibliotecas como <a title="Biblioteca que provê funcionalidades do websocket mesmo em navegadores incompatíveis" href="http://socket.io">Socket.io</a> e <a title="An open source query based message hub" href="http://pubsub.io">PubSub.io</a> ou mesmo protocolos adicionados aos browsers recentes como o websocket.</p>
<p>Estes dois ingredientes (JavaScript no servidor + Websocket) atenderiam perfeitamente os requisitos de minhas aplicações. E a escolha foi feita. Desenvolvi, com poucas linhas de código, toda a aplicação, porém uma parte ficou nebulosa: como compartilhar as notificações geradas em um sistema com outra aplicação? E como saber se a pessoa que está conectada ao servidor de notificações é realmente o usuário autorizado a acessar o sistema? A resposta que encontrei foi compartilhar as sessões.</p>
<p>Como fiz isso? Armazenando a sessão do sistema principal em um banco de dados (escolhi para isso o <a title="banco de dados NoSQL" href="http://mongodb.org">MongoDB</a>, pela velocidade e escalabilidade), enquanto no servidor de notificação só acesso as sessões disponíveis no banco e verifico se o usuário que tenta acessar notificações está realmente autenticado.</p>
<p>Para implementar isso foi preciso um pouco de pesquisa e adaptação tanto no servidor de notificações quanto no sistema principal, mas os detalhes deixarei para uma próxima oportunidade.</p>
<p>Quero deixar registrado aqui meu tardio parabéns a organização e aos palestrantes do BrazilJS, o evento foi sensacional.<br />
E que o texto sirva de inspiração para aqueles que acreditam na &#8220;bala de prata&#8221; (ela não existe).<br />
Não deixe de participar de eventos, comunidades ou fóruns. Nunca pare de estudar, algo que era uma boa solução à 1 ano hoje pode ser uma péssima alternativa perto das demais.</p>
<p>* Piada interna do evento.<br />
² &#8211; [/sarcasm]</p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/"     class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito&hellip;</a></li><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/"     class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mantendo uma base de código organizada e documentada</title>
		<link>http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/</link>
		<comments>http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 16:17:43 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Projetos]]></category>
		<category><![CDATA[ambiente de trabalho]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[ferramentas]]></category>
		<category><![CDATA[Radig]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=257</guid>
		<description><![CDATA[Uma problemática comum de quem desenvolve sistemas é como manter a documentação em dia, se que isso comprometa os prazos de desenvolvimento. Digamos que isso é um problema de otimização: um código bem documentado facilita e muito a sua manutenção; &#8230; <a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/">Continuar lendo <span class="meta-nav">&#8594;</span></a><div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/"     class="crp_title">Dica Rápida &#8211; Evitando problemas com uso de jQuery e&hellip;</a></li></ul></div>]]></description>
				<content:encoded><![CDATA[<p>Uma problemática comum de quem desenvolve sistemas é como manter a documentação em dia, se que isso comprometa os prazos de desenvolvimento.</p>
<p>Digamos que isso é um problema de otimização:</p>
<ol>
<li>um código bem documentado facilita e muito a sua manutenção;</li>
<li>documentar código leva tempo;</li>
<li>tempo é um recurso escasso em desenvolvimento de software;</li>
</ol>
<p>Olha o problema&#8230; sem tempo, não há documentação e sem documentação você precisará de mais tempo para dar manutenção &#8211; oras, mas você já <strong>não tinha tempo</strong> para documentar, como vai ter <strong>mais tempo</strong> agora para dar manutenção?</p>
<p>Tentando equacionar esse problema surgiram várias ferramentas que visam facilitar todas as atividades relacionadas ao desenvolvimento.</p>
<p>Como a maior parte do meu tempo dedico ao PHP e CakePHP, tomarei estes como base para as ferramentas, porém várias delas podem ser utilizadas com outras linguagens/frameworks sem grandes problemas ou então possuem similares em outras linguagens.</p>
<h3>Padrão de código</h3>
<p>A primeira etapa, e talvez a mais importante, seja definir e disponibilizar um conjunto de regras explicando como o código foi escrito.</p>
<p>Este padrão envolve nome de classes, atributos, métodos, comentários, tabelas e colunas do banco de dados, organização de diretórios dentre outras coisas. Até coisas simples como a indentação deve ser padronizada.</p>
<p>Veja alguns guias de codificação para ter um exemplo do que quero dizer:</p>
<ul>
<li><a title="Coding Standards do WordPress" href="http://codex.wordpress.org/WordPress_Coding_Standards">WordPress</a></li>
<li><a title="Princípios do CakePHP" href="http://book.cakephp.org/view/892/Basic-Principles-of-CakePHP">CakePHP</a></li>
<li><a title="Joomla! Coding style and standards" href="http://docs.joomla.org/Coding_style_and_standards">Joomla!</a></li>
</ul>
<h3>Versionamento de código</h3>
<p>Um dos recursos mais importantes durante o desenvolvimento é a capacidade de se desfazer determinada alteração e manter um registro de todas as alterações feitas durante o desenvolvimento.</p>
<p>Atualmente, minha ferramenta favorita para versionamento é o <a title="Git SCM" href="http://git-scm.com/">Git</a> um sistema distribuído de controle de versão. Porém existem vários outros que podem agradar, como o centralizador <a title="Home of Subversion project" href="http://subversion.apache.org/">SVN</a> e os também distribuídos <a title="Hg/Mercurial SCM" href="http://mercurial.selenic.com/">Mercurial</a> e <a title="página oficial do Bazaar" href="http://bazaar.canonical.com/en/">Bazaar</a>.</p>
<p>É muito fácil trabalhar com qualquer um destes sistemas e após conhecer as facilidades que o versionamento de código lhe proporcionam, você terá dificuldade em trabalhar com código sem controle de versão, pode apostar.</p>
<p>Caso você opte por um sistema distribuído, dê uma olhada neste modelo de organização para seu código: <a title="texto em inglês" href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branch model</a></p>
<h3>Versionamento do Banco de Dados</h3>
<p>Por melhor que seja o projeto do seu sistema uma coisa sempre ocorrerá: mudança. E isso envolve mais do que código, muitas vezes alterações na estrutura do banco são necessárias.</p>
<p>Como controlar essas alterações? A resposta é &#8220;Migrations&#8221;</p>
<p>No CakePHP precisamos de plugins para dar essa capacidade a aplicação, há dois largamente utilizados:</p>
<ul>
<li>Projeto do <a title="Perfil de Juan Basso no Twitter" href="http://twitter.com/jrbasso">Juan Basso</a>: <a title="Juan Basso Migrations" href="https://github.com/jrbasso/migrations">https://github.com/jrbasso/migrations</a></li>
<li>Projeto do <a title="Cake Development Corporation" href="http://cakedc.com">CakeDC</a>: <a title="CakeDC Migrations" href="https://github.com/CakeDC/migrations">https://github.com/CakeDC/migrations</a></li>
</ul>
<p>Outros frameworks fornecem suporte &#8220;nativo&#8221; ao recurso, como o <a title="Página do framework Rails para Ruby" href="http://rubyonrails.org/">Ruby on Rails</a> e <a title="Página do Doctrine" href="http://www.doctrine-project.org/">Doctrine </a>para PHP em geral.</p>
<h3>Testes unitários</h3>
<p>Acredito que todos os frameworks modernos fornecem suporte a criação de testes unitários em seus projetos. Os testes são uma fase importante do design do software e fundamental para documentação de qualidade.</p>
<p>O CakePHP até sua versão 1.3 utiliza o framework de testes <a title="SimpleTest: Teste Unitários para PHP" href="http://www.simpletest.org/">SimpleTest</a>, porém passará a utilizar o <a title="Repositório do PHPUnit, padrão &quot;de fato&quot; para testes em PHP" href="https://github.com/sebastianbergmann/phpunit/">PHPUnit</a> em sua versão 2.0 (atualmente em desenvolvimento).</p>
<p>Não sabe o que são testes unitários? Bom, segue alguns links sobre o assunto:</p>
<ul>
<li><a title="TDD" href="http://www.improveit.com.br/xp/praticas/tdd">Desenvolvimento Orientado a Testes</a></li>
<li><a title="Verbete a respeito de testes" href="http://pt.wikipedia.org/wiki/Teste_de_unidade">Wikipedia: Testes de Unidade/Unitário</a></li>
<li><a title="Outro post sobre o assunto" href="http://www.profissionaisti.com.br/2009/11/tdd-desenvolvimento-orientado-a-testes/">TDD: Desenvolvimento Orientado a Testes</a></li>
<li><a title="Cookbook para versão 1.3" href="http://book.cakephp.org/pt/view/1196/Testes">Criando Testes com CakePHP</a></li>
<li><a title="apresentação de João José Pedrini" href="http://www.slideshare.net/joaojose/testes-automatizados-no-cakephp">Testes Automatizados no CakePHP</a></li>
<li><a title="ótimo texto do Gustavo Dutra a respeito" href="http://gustavodutra.com/post/412/como-fazer-testes-unitarios-em-models-no-cakephp/">Como fazer testes unitários em Models no CakePHP</a></li>
</ul>
<p>Testes são como controle de versão&#8230; depois que você usa, não vive sem.</p>
<h3>Documentação</h3>
<p>Como comentado anteriormente, um passo importante para documentação são os testes unitários. Porém não devem ser o único.</p>
<p>Uma forma muito eficiente de documentação são os blocos de comentários, no PHP, o padrão PHPDoc é o mais utilizado.</p>
<p>Existem várias ferramentas que varrem o código de sua aplicação e identificam esses blocos para gerar a documentação, alguns deles são:</p>
<ul>
<li><a title="casa do phpDocumentor" href="http://phpdoc.org">phpDocumentor</a>: ferramenta mais utilizada no mundo PHP</li>
<li><a title="explicação em português sobre PHPDoc" href="http://www.worldlingo.com/ma/enwiki/pt/PHPDoc">Mais informação em português sobre PHPDoc</a></li>
<li><a title="post ensinando a utilizção do phpDocumentor" href="http://luishenrique.org/blog/posts/php-doc-instalacao-e-uso">Documente seu código PHP usando PHPDoc</a></li>
<li><a title="Api Generator - plugin para geração de API, baseado no PHPDoc" href="http://cakephp.lighthouseapp.com/projects/42879/home">Gerador de Api para CakePHP</a></li>
</ul>
<p>Quando sua documentação é concisa e completa, entender o funcionamento da aplicação passa a ser fácil, independente de quando ela foi criada. Quando isso é aliado aos testes unitários, fazer manutenção passa a ser uma atividade mais fácil e gratificante.</p>
<p>Por fim, é preciso saber o que/quando está errado e como/quando foi corrigido, ajudando na manutenção do histórico e acompanhamento da evolução do software. Para isso temos o tópico a seguir.</p>
<h3>Controle de Bugs/Atividades</h3>
<p>Como controlar o que, quando e por quem uma determinada atividade deve ser feita? E como verificar por quem e quando determinada funcionalidade foi implementada? O controle de versão pode fornecer parte destas respostas, mas ficar analisando logs normalmente não é muito comodo. A melhor maneira é utilizar uma ferramenta de controle de bugs/atividades.</p>
<p>Utilizo no meu dia-a-dia o excelente <a title="Redmine - Sistema de controle de atividades" href="http://redmine.org">Redmine, </a>um sistema simples porém poderoso para controle de tarefas. Suporta diferentes projetos, sub-projetos, integra-se com vários sistemas de versionamento de código, permite criação de wikis para documentação além de vários outros recursos.</p>
<p>Além deste, existem vários outros sistemas como o <a title="página do Bugzilla" href="http://www.bugzilla.org/">Bugzilla</a>, <a title="Trac" href="http://trac.edgewall.org/">Trac</a>, <a title="Mantis - feito em PHP" href="http://www.mantisbt.org/">Mantis</a> e <a title="PHProjekt" href="http://phprojekt.com">PHProjekt</a>.</p>
<h3>Conclusão?</h3>
<p>Não, não tem conclusão. O texto visa apenas apresentar algumas atividades que juntas ao planejamento e desenvolvimento de software tendem a tornar a vida dos desenvolvedores melhor, seja diminuindo o stress causado por alterações dos requisitos ou manutenção de código mal projetado/escrito, seja tornando o desenvolvimento mais ágil, permitindo mais horas de lazer e descanso e menos fios de cabelo branco.</p>
<p>A intenção nunca foi cobrir todos os tópicos a exaustão, mas sim apresentar alguns exemplos e motivos para adoção de tais ferramentas/ideias. Caso tenha surgido dúvida a respeito de qualquer item, deixe um comentário =]</p>
<p>Sentiu a falta de algum item? Utiliza algo de forma diferente? Deixe um comentário também.</p>
<p>&#8212;&#8212;&#8212;&#8212;-<br />
Postado originalmente no <a title="blog mantido pela equipe da Radig TI" href="http://www.radig.com.br/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/">blog da Radig</a></p>
<div class="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/projetos/comitiva/"     class="crp_title">Comitiva</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/"     class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/projetos/"     class="crp_title">Projetos</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/"     class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/"     class="crp_title">Dica Rápida &#8211; Evitando problemas com uso de jQuery e&hellip;</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
