<?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 &#187; Desenvolvimento Web</title>
	<atom:link href="http://cauancabral.net/category/desenvolvimento-web/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>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<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/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Vamos falar um pouco sobre outro plugin para <a title="CakePHP Framework" href="http://cakephp.org" onclick="pageTracker._trackPageview('/outgoing/cakephp.org?referer=');">CakePHP</a> que surgiu no coração da <a title="Radig Soluções em TI" href="http://radig.com.br" onclick="pageTracker._trackPageview('/outgoing/radig.com.br?referer=');">Radig</a>: o <a title="CakePHP Plugin Locale" href="https://github.com/radig/locale" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/locale?referer=');">Locale</a>.</p>
<p>Meu amigo <a title="Blog do grande José Agripino Duarte" href="http://agripinoduarte.radig.com.br/" onclick="pageTracker._trackPageview('/outgoing/agripinoduarte.radig.com.br/?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/www.radig.com.br/2011/01/29/cakephp-plugin-locale-para-localizacao-de-datas-e-moeda/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/locale/tree/2.0/Test?referer=');">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 id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/12/12/3f-ferias-da-faculdade-finalmente/" rel="bookmark" class="crp_title">3F: Férias da Faculdade, Finalmente.</a></li><li><a href="http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/" rel="bookmark" class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/" rel="bookmark" class="crp_title">HTML5: Problemas com Input type=&#8221;number&#8221;</a></li><li><a href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/" rel="bookmark" class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/04/18/cakephp-plugin-locale/feed/</wfw:commentRss>
		<slash:comments>0</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/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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" onclick="pageTracker._trackPageview('/outgoing/radig.com.br?referer=');">Radig</a> (eu incluso) e disponível no seu github: <a title="CakePHP Auditable" href="https://github.com/radig/auditable" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/auditable?referer=');">github.com/radig/auditable</a></p>
<p>O objetivo do <a title="Plugin CakePHP Auditable" href="https://github.com/radig/auditable/" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/auditable/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/auditable/blob/master/README.textile?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/auditable_mongo_logger?referer=');">AuditableMongoLogger</a></p>
<p>Qualquer dúvida ou sugestão pode usar os comentários ou o Github ;]</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/" rel="bookmark" class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/" rel="bookmark" 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/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a href="http://cauancabral.net/2012/03/21/html5-problemas-com-input-typenumber/" rel="bookmark" class="crp_title">HTML5: Problemas com Input type=&#8221;number&#8221;</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2012/03/25/cakephp-plugin-auditable/feed/</wfw:commentRss>
		<slash:comments>10</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/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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" onclick="pageTracker._trackPageview('/outgoing/radig.com.br?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/tickets/1739-case-insensitive-acos-table-can-cause-duplicate-path-retrievements?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/mark-story.com/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/dev.mysql.com/doc/refman/5.5/en/charset-charsets.html?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/tickets/1739-case-insensitive-acos-table-can-cause-duplicate-path-retrievements_ticket-1739-15?referer=');">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 id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/" rel="bookmark" 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/" rel="bookmark" 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/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema &#8211; quase tudo mudou</a></li><li><a href="http://cauancabral.net/2012/03/13/cakephp-dica-rapida-usando-shell-de-multiplas-versoes/" rel="bookmark" class="crp_title">[CakePHP] Dica Rápida &#8211; Usando shell de múltiplas versões</a></li><li><a href="http://cauancabral.net/2010/01/27/dica-rapida/" rel="bookmark" class="crp_title">Dica rápida</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/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/chromium/issues/detail?id=44116&amp;referer=');">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" onclick="pageTracker._trackPageview('/outgoing/github.com/radig/TwitterBootstrap/commit/81ab8bcfcdbe16cdad926e0f79f6bb097a707928?referer=');">Aqui tem um commit</a> onde implementamos a &#8220;correção&#8221; em um FormHelper que estende o do CakePHP.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/" rel="bookmark" class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/" rel="bookmark" class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito fácil</a></li><li><a href="http://cauancabral.net/2012/03/22/cakephp-acl-problema-com-acos-duplicados/" rel="bookmark" class="crp_title">[CakePHP] Acl: Problema com Acos &#8220;duplicados&#8221;</a></li><li><a href="http://cauancabral.net/2008/01/06/sem-assunto-parte-3/" rel="bookmark" class="crp_title">Sem assunto &#8211; parte 3</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>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/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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" onclick="pageTracker._trackPageview('/outgoing/radig.com.br?referer=');">Radig</a>. Digo felizmente por que é muito bom trabalhar no que você gosta, <a title="grande parceiro Habib" href="http://twitter.com/#!/habibasseiss" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/habibasseiss?referer=');">com</a> <a title="José Agripino, o Grande" href="http://twitter.com/#!/agripinoduarte" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/agripinoduarte?referer=');">grandes</a> <a title="o Japa" href="http://twitter.com/#!/rafa_sake/" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/rafa_sake/?referer=');">amigos</a> <a title="Morto, o caçula da turma" href="http://twitter.com/#!/marcelgrassi" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/marcelgrassi?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/google.com.br?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/www.radig.com.br/produtos/juris/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/braziljs.com.br/_/home?referer=');">BrazilJS</a>, onde pude ver feras como <a title="web opener na Opera Software" href="http://twitter.com/#!/miketaylr" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/miketaylr?referer=');">Mike Taylor</a>, <a title="perfil do Richard Worth, desenvolvedor do jQuery UI" href="http://twitter.com/#!/rworth" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/rworth?referer=');">Richard Worth</a> e seu irmão* <a title="desenvolvedor do Yahoo!" href="http://twitter.com/#!/gchapiewski" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/gchapiewski?referer=');">Guilherme Chapiewski</a>, o lendário <a title="O Dinossouro das CSS" href="http://maujor.com" onclick="pageTracker._trackPageview('/outgoing/maujor.com?referer=');">Maujor</a>, os gaúchos <a title="twitter do Jaydson" href="http://twitter.com/#!/jaydson" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/jaydson?referer=');">Jaydson</a> e <a title="twitter do Felipe Nascimento" href="http://twitter.com/#!/felipenmoura" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/felipenmoura?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/ramcoelho?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/porkaria.com.br?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/socket.io?referer=');">Socket.io</a> e <a title="An open source query based message hub" href="http://pubsub.io" onclick="pageTracker._trackPageview('/outgoing/pubsub.io?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/mongodb.org?referer=');">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 id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2010/03/20/3%c2%ba-workshop-do-phpms/" rel="bookmark" class="crp_title">3º Workshop do PHPMS</a></li><li><a href="http://cauancabral.net/2010/06/25/delivery-facil-pedir-comida-na-internet-e-muito-facil/" rel="bookmark" class="crp_title">Delivery Fácil &#8211; Pedir comida na internet é muito fácil</a></li><li><a href="http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/" rel="bookmark" class="crp_title">1º Workshop PHPMS &#8211; PHP Extremo, SUCESSO</a></li><li><a href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</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/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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" onclick="pageTracker._trackPageview('/outgoing/codex.wordpress.org/WordPress_Coding_Standards?referer=');">WordPress</a></li>
<li><a title="Princípios do CakePHP" href="http://book.cakephp.org/view/892/Basic-Principles-of-CakePHP" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/view/892/Basic-Principles-of-CakePHP?referer=');">CakePHP</a></li>
<li><a title="Joomla! Coding style and standards" href="http://docs.joomla.org/Coding_style_and_standards" onclick="pageTracker._trackPageview('/outgoing/docs.joomla.org/Coding_style_and_standards?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/subversion.apache.org/?referer=');">SVN</a> e os também distribuídos <a title="Hg/Mercurial SCM" href="http://mercurial.selenic.com/" onclick="pageTracker._trackPageview('/outgoing/mercurial.selenic.com/?referer=');">Mercurial</a> e <a title="página oficial do Bazaar" href="http://bazaar.canonical.com/en/" onclick="pageTracker._trackPageview('/outgoing/bazaar.canonical.com/en/?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/nvie.com/posts/a-successful-git-branching-model/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/twitter.com/jrbasso?referer=');">Juan Basso</a>: <a title="Juan Basso Migrations" href="https://github.com/jrbasso/migrations" onclick="pageTracker._trackPageview('/outgoing/github.com/jrbasso/migrations?referer=');">https://github.com/jrbasso/migrations</a></li>
<li>Projeto do <a title="Cake Development Corporation" href="http://cakedc.com" onclick="pageTracker._trackPageview('/outgoing/cakedc.com?referer=');">CakeDC</a>: <a title="CakeDC Migrations" href="https://github.com/CakeDC/migrations" onclick="pageTracker._trackPageview('/outgoing/github.com/CakeDC/migrations?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/rubyonrails.org/?referer=');">Ruby on Rails</a> e <a title="Página do Doctrine" href="http://www.doctrine-project.org/" onclick="pageTracker._trackPageview('/outgoing/www.doctrine-project.org/?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/www.simpletest.org/?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/github.com/sebastianbergmann/phpunit/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/www.improveit.com.br/xp/praticas/tdd?referer=');">Desenvolvimento Orientado a Testes</a></li>
<li><a title="Verbete a respeito de testes" href="http://pt.wikipedia.org/wiki/Teste_de_unidade" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Teste_de_unidade?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/www.profissionaisti.com.br/2009/11/tdd-desenvolvimento-orientado-a-testes/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/1196/Testes?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/joaojose/testes-automatizados-no-cakephp?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/gustavodutra.com/post/412/como-fazer-testes-unitarios-em-models-no-cakephp/?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/phpdoc.org?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/www.worldlingo.com/ma/enwiki/pt/PHPDoc?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/luishenrique.org/blog/posts/php-doc-instalacao-e-uso?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42879/home?referer=');">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" onclick="pageTracker._trackPageview('/outgoing/redmine.org?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/www.bugzilla.org/?referer=');">Bugzilla</a>, <a title="Trac" href="http://trac.edgewall.org/" onclick="pageTracker._trackPageview('/outgoing/trac.edgewall.org/?referer=');">Trac</a>, <a title="Mantis - feito em PHP" href="http://www.mantisbt.org/" onclick="pageTracker._trackPageview('/outgoing/www.mantisbt.org/?referer=');">Mantis</a> e <a title="PHProjekt" href="http://phprojekt.com" onclick="pageTracker._trackPageview('/outgoing/phprojekt.com?referer=');">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/" onclick="pageTracker._trackPageview('/outgoing/www.radig.com.br/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/?referer=');">blog da Radig</a></p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/" rel="bookmark" class="crp_title">CakePHP 1.3 quase assado</a></li><li><a href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li><li><a href="http://cauancabral.net/2012/04/18/cakephp-plugin-locale/" rel="bookmark" class="crp_title">CakePHP: Plugin Locale</a></li><li><a href="http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; Otimizando código</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>
		<item>
		<title>Dica Rápida &#8211; Evitando problemas com uso de jQuery e imagens</title>
		<link>http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/</link>
		<comments>http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 20:45:09 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=243</guid>
		<description><![CDATA[Algumas vezes precisamos recuperar, em tempo de execução, o tamanho de uma determinada imagem para aplica-la corretamente ao layout da página, porém essa verificação pode acontecer antes da hora, o que geraria erros inesperados. Todo mundo que trabalha com a &#8230; <a href="http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes precisamos recuperar, em tempo de execução, o tamanho de uma determinada imagem para aplica-la corretamente ao layout da página, porém essa verificação pode acontecer antes da hora, o que geraria erros inesperados.</p>
<p>Todo mundo que trabalha com a biblioteca jQuery conhece a chamada:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">//seu código javascript</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ela diz ao browser para executar o bloco interno somente quando o <strong>DOM</strong> do seu documento tiver sido totalmente carregado, isso permite que ele faça o <em>parser</em> de seu documento utilizando os seletores sem esquecer de nenhum item. Porém quando carregamos estruturas externas ao DOM, como uma imagem, não temos garantia de que o código dentro do bloco anterior será executado quando a imagem já tiver sido carregada.<br />
Dessa maneira, caso você precise de informações sobre a imagem, seu script falhará.</p>
<p>Para contornar isso, podemos utilizar uma outra chamada, que é disparada somente quando <strong>TODO</strong> o documento tiver sido carregado:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">//seu código javascript</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>As duas diferenças, além do comportamento são:</p>
<ol>
<li>Saí o &#8216;seletor&#8217; <strong>document</strong> para a entrada do <strong>window</strong>;</li>
<li>Saí o evento <strong>ready</strong> para a entrada do <strong>load</strong>;</li>
</ol>
<p>A primeira alteração ocorre por conta da segunda, já que o evento <em>load</em> não pode ser associado a um <em>document</em>.</p>
<p>Com essa pequena alteração você garante que seu script rodará apenas quando todo o documento tiver sido carregado &#8211; o que é essencial em algumas situações, como a citada anteriormente, porém dispensável na maioria das vezes.</p>
<p>Fonte: <a title="documentação do jQuery" href="http://api.jquery.com/load-event/" onclick="pageTracker._trackPageview('/outgoing/api.jquery.com/load-event/?referer=');">http://api.jquery.com/load-event/</a></p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a href="http://cauancabral.net/2009/01/14/ajax-com-prototype/" rel="bookmark" class="crp_title">AJAX com Prototype</a></li><li><a href="http://cauancabral.net/2008/10/22/usar-google-analytics-para-paginas-em-flash-ou-ajax-e-mole/" rel="bookmark" class="crp_title">Usar Google Analytics para páginas em Flash ou Ajax? É mole&#8230;</a></li><li><a href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li><li><a href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joomla! 1.6 &#8211; O que está para chegar&#8230;</title>
		<link>http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/</link>
		<comments>http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 23:06:53 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[Joomla!]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[joomla 1.6]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=190</guid>
		<description><![CDATA[Em 21 de Janeiro de 2008 foi lançado a versão 1.5 deste excelente CMS, e desde então foram lançados 15 subversões (atualizações), envolvendo pequenas melhorias e correções de segurança. Desde meados de 2009 quem utiliza o Joomla! só pensa na &#8230; <a href="http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Em 21 de Janeiro de 2008 foi lançado a versão 1.5 deste excelente CMS, e desde então foram lançados 15 subversões (atualizações), envolvendo pequenas melhorias e correções de segurança.</p>
<p>Desde meados de 2009 quem utiliza o Joomla! só pensa na próxima grande atualização do CMS, a versão 1.6. Ela deve incluir alguns dos itens mais requisitados pela comunidade como:</p>
<ul>
<li>Sistema de permissões, com possibilidade de se criar novos grupos e definir o que cada grupo pode fazer;</li>
<li>União das Seções e Categorias, ao mesmo tempo que agora pode-se ter infinitas subcategorias;</li>
<li>Suporte a outros sistemas de banco de dados;</li>
<li>Assistente para adicionar link para um artigo enquanto estamos escrevendo outro artigo;<span id="more-190"></span></li>
</ul>
<p>Agora parece que estamos perto do lançamento da próxima grande atualização do Joomla!, e pensando nisso baixei a versão atual em desenvolvimento do SVN e tirei alguns screenshot da área administrativa dessa nova versão, mostrando alguns dos recursos novos:</p>

<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_dashboard/' title='joomla16_dashboard'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_dashboard-150x150.png" class="attachment-thumbnail" alt="joomla16_dashboard" title="joomla16_dashboard" /></a>
<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_administracao_menu/' title='joomla16_administracao_menu'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_administracao_menu-150x150.png" class="attachment-thumbnail" alt="joomla16_administracao_menu" title="joomla16_administracao_menu" /></a>
<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_grupos/' title='joomla16_grupos'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_grupos-150x150.png" class="attachment-thumbnail" alt="joomla16_grupos" title="joomla16_grupos" /></a>
<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_nivel-de-acesso/' title='joomla16_nivel-de-acesso'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_nivel-de-acesso-150x150.png" class="attachment-thumbnail" alt="joomla16_nivel-de-acesso" title="joomla16_nivel-de-acesso" /></a>
<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_categorias-conteudo/' title='joomla16_categorias-conteudo'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_categorias-conteudo-150x150.png" class="attachment-thumbnail" alt="joomla16_categorias-conteudo" title="joomla16_categorias-conteudo" /></a>
<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_administracao-conteudo/' title='joomla16_administracao-conteudo'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_administracao-conteudo-150x150.png" class="attachment-thumbnail" alt="joomla16_administracao-conteudo" title="joomla16_administracao-conteudo" /></a>
<a href='http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/joomla16_edicao-artigo/' title='joomla16_edicao-artigo'><img width="150" height="150" src="http://cauancabral.net/wp-content/uploads/2010/01/joomla16_edicao-artigo-150x150.png" class="attachment-thumbnail" alt="joomla16_edicao-artigo" title="joomla16_edicao-artigo" /></a>

<p>As últimas informações sobre o planejamento (incluindo o que deve ser feito e o que já foi feito) podem ser vistas <a title="Feature Patches for Joomla! 1.6" href="http://developer.joomla.org/coordinator-blog/292-feature-patches-for-16.html" onclick="pageTracker._trackPageview('/outgoing/developer.joomla.org/coordinator-blog/292-feature-patches-for-16.html?referer=');">nesta notícia</a> e nesta <a title="Joomla! 1.6 status" href="http://www.joomla.org/component/content/article/5252.html" onclick="pageTracker._trackPageview('/outgoing/www.joomla.org/component/content/article/5252.html?referer=');">página de status</a>.</p>
<p>Podemos aguardar, na melhor das hipóteses, um release final do Joomla! 1.6 para março de 2010, o que não está muito longe, felizmente =]</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2009/06/13/ultimas-novidades-2/" rel="bookmark" class="crp_title">Últimas Novidades #2</a></li><li><a href="http://cauancabral.net/2008/01/17/sentiram-falta/" rel="bookmark" class="crp_title">Sentiram falta?</a></li><li><a href="http://cauancabral.net/2008/01/06/sem-assunto-parte-3/" rel="bookmark" class="crp_title">Sem assunto &#8211; parte 3</a></li><li><a href="http://cauancabral.net/2010/01/17/trabalhando-com-php-5-2-no-opensuse-11-2-downgrade-do-php-5-3-para-5-2/" rel="bookmark" class="crp_title">Trabalhando com PHP 5.2 no OpenSUSE 11.2 (Downgrade do PHP 5.3 para 5.2)</a></li><li><a href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/" rel="bookmark" class="crp_title">CakePHP 1.3 quase assado</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Latinoware 2009 &#8211; COLAPHP &#8211; Evento fantástico</title>
		<link>http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/</link>
		<comments>http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 14:56:24 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[latinoware]]></category>
		<category><![CDATA[mini-curso]]></category>
		<category><![CDATA[palestra]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=155</guid>
		<description><![CDATA[Eae pessoal, tudo tranquilo? Tenho andado bem corrido ultimamente e não tenho conseguido dar a atenção que queria ao blog. De agora em diante as coisas não devem melhorar muito, mas farei o possível para trazer coisas interessantes pra cá. &#8230; <a href="http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eae pessoal, tudo tranquilo?</p>
<p>Tenho andado bem corrido ultimamente e não tenho conseguido dar a atenção que queria ao blog. De agora em diante as coisas não devem melhorar muito, mas farei o possível para trazer coisas interessantes pra cá.</p>
<p>Desde o dia 21/10/2009 estou em Foz do Iguaçu &#8211; PR, para participar do Latinoware 2009, um dos maiores eventos de software livre das Américas.<br />
Estou tendo a oportunidade de ministrar um minicurso e apresentar uma palestra no &#8220;subevento&#8221; COLAPHP &#8211; Congresso Latinoamericano de PHP, que possui uma trilha dedicada a linguagem dentro do  Latinoware.</p>
<p>A experiência não poderia estar sendo melhor. Pude conhecer excelentes profissionais e fazer muitas amizades.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; fim do rascunho 1 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Nos dias 23 e 24 de outubro tive a oportunidade de ministrar um minicurso e uma palestra dentro da trilha COLAPHP do Latinoware.</p>
<p>Ambos tratavam do CakePHP, no caso do minicurso fizemos uma introdução no framework, falando um pouco de seu funcionamento, suas convenções e criamos rapidamente uma aplicação simples utilizando o terminal com o Bake.</p>
<p>O slides utilizado no minicurso foi este:</p>
<object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2474507&amp;doc=cakephp-091111083152-phpapp01" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2474507&amp;doc=cakephp-091111083152-phpapp01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355" wmode="transparent"></embed></object>
<p>No caso da palestra, falei novamente sobre a integração de aplicações escritas em CakePHP e Flex, dando uma revisada na apresentação. Ela ficou assim:</p>
<object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2928697&amp;doc=flexphp-100116083159-phpapp02" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=id=2928697&amp;doc=flexphp-100116083159-phpapp02" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355" wmode="transparent"></embed></object>
<p>Aproveito o espaço (e a disponibilidade de tempo) para agradecer todos que participaram do evento como um todo, seja na organização, apoio ou assistindo, perguntando, corrigindo e ajudando a gente durante as apresentações. Obrigado a todos.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;- fim do rascunho 2 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>O texto do rascunho 1 foi escrito em 23/10/2009, o do rascunho 2 logo após o evento, hoje é 16/01/2010 e o textos ainda estevam como rascunho para ser publicado no blog. Pois é, esse final de ano foi realmente muito corrido, mas valeu a pena.</p>
<p>Agora é hora de se organizar para poder ter um 2010 ainda mais proveitoso (de começo ele já está sendo muito melhor).</p>
<p>Até breve.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/" rel="bookmark" class="crp_title">1º Workshop PHPMS &#8211; PHP Extremo, SUCESSO</a></li><li><a href="http://cauancabral.net/2009/09/24/2%c2%ba-workshop-phpms/" rel="bookmark" class="crp_title">2º Workshop PHPMS</a></li><li><a href="http://cauancabral.net/2008/09/21/software-freedom-day-08-sucesso/" rel="bookmark" class="crp_title">Software Freedom Day 08 &#8211; Sucesso!</a></li><li><a href="http://cauancabral.net/2008/05/08/voltando-a-ativa-no-bom-sentido/" rel="bookmark" class="crp_title">Voltando a ativa ( no bom sentido )</a></li><li><a href="http://cauancabral.net/2009/06/14/workshop-php-extremo/" rel="bookmark" class="crp_title">Workshop PHP Extremo</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2010/01/16/latinoware-2009-colaphp-evento-fantastico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop PHP Extremo</title>
		<link>http://cauancabral.net/2009/06/14/workshop-php-extremo/</link>
		<comments>http://cauancabral.net/2009/06/14/workshop-php-extremo/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 01:35:44 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php-extremo]]></category>
		<category><![CDATA[phpms]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=130</guid>
		<description><![CDATA[Como havia comentado no post anterior, o PHPMS realizará seu primeiro worksop: Workshop PHP Extremo. Citando a página do evento: O que é o Workshop PHP Extremo? Trata-se de um evento voltado a profissionais, em especial os que trabalham com &#8230; <a href="http://cauancabral.net/2009/06/14/workshop-php-extremo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Como havia comentado no post anterior, o PHPMS realizará seu primeiro worksop: Workshop PHP Extremo.</p>
<p>Citando a página do evento:</p>
<blockquote><p><strong>O que é o Workshop PHP Extremo?</strong></p>
<p>Trata-se de um evento voltado a profissionais, em especial os que trabalham com PHP.  O Workshop visa a capacitar os desenvolvedores PHP do estado e permitir a troca de experiências e networking,  elevando o nível dos atuais desenvolvedores PHP e profissionais da área.</p></blockquote>
<p>Como é possível ver pela breve introdução, é um evento voltado para desenvolvedores, como diria Steve Ballmer: &#8220;developers! developers! developers!&#8221;</p>
<p>Se você tem interesse em participar do evento corra, pois as vagas são bem limitadas (30 pessoas) e o valor está muito baixo &#8211; apenas R$ 15,00 antes de evento &#8211; e de quebra você leva uma camiseta. Visite a página do<a title="PHP Extremo" href="http://workshop.phpms.org" onclick="pageTracker._trackPageview('/outgoing/workshop.phpms.org?referer=');"> Workshop PHP Extremo</a> e siga os passos para fazer sua inscrição.</p>
<p>Caso além de querer participar você queira um espaço para compartilhar seu conhecimento, um lugar apresentar algo e discutir com profissionais da área, então é sua chance de apresentar um trabalho no Workshop. Serão 3 apresentações durante o workshop, uma pode ser a sua, basta submeter sua proposta de trabalho <a title="Submissão de trabalho para Workshop PHP Extremo" href="http://spreadsheets.google.com/viewform?formkey=cklxc3A4SWptYjBzRHhERzFUb3JCOFE6MA.." onclick="pageTracker._trackPageview('/outgoing/spreadsheets.google.com/viewform?formkey=cklxc3A4SWptYjBzRHhERzFUb3JCOFE6MA..&amp;referer=');">neste formulário</a>. Mas corra, as submissões tem de ser feitas até o dia 20 de Junho.</p>
<p>Vamos participar para que possamos realizar outros destes no futuro.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2009/09/24/2%c2%ba-workshop-phpms/" rel="bookmark" class="crp_title">2º Workshop PHPMS</a></li><li><a href="http://cauancabral.net/2010/03/20/3%c2%ba-workshop-do-phpms/" rel="bookmark" class="crp_title">3º Workshop do PHPMS</a></li><li><a href="http://cauancabral.net/2009/06/13/ultimas-novidades-2/" rel="bookmark" class="crp_title">Últimas Novidades #2</a></li><li><a href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a href="http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/" rel="bookmark" class="crp_title">1º Workshop PHPMS &#8211; PHP Extremo, SUCESSO</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/06/14/workshop-php-extremo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

