<?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; Programação</title>
	<atom:link href="http://cauancabral.net/category/programacao/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>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>Obrigado pelos peixes SVN</title>
		<link>http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/</link>
		<comments>http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 13:08:59 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[CakePHP-1.3]]></category>
		<category><![CDATA[comitiva]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[swiftmailer]]></category>

		<guid isPermaLink="false">http://cauancabral.net/?p=220</guid>
		<description><![CDATA[Há alguns anos descobri o fantástico mundo do controle de versão, naquele momento me perguntei &#8220;como vivi sem isso até hoje?&#8221;. Dali em diante podia alterar arquivos sem medo, qualquer erro era só voltar uma versão e tudo certo. Trabalhar &#8230; <a href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Há alguns anos descobri o fantástico mundo do controle de versão, naquele momento me perguntei &#8220;como vivi sem isso até hoje?&#8221;. Dali em diante podia alterar arquivos sem medo, qualquer erro era só voltar uma versão e tudo certo. Trabalhar em equipe finalmente se tornava algo fácil, graças ao <a title="Página do Subversion SCM" href="http://subversion.apache.org/" onclick="pageTracker._trackPageview('/outgoing/subversion.apache.org/?referer=');">Subversion &#8211; SVN</a>.</p>
<p>Porém os anos passaram e algumas coisas começaram a fazer falta: como faço quando estou desenvolvendo algo grande, fico sem commitar até ter algo estável/usável? crio um branch para isso? mas e depois para unir os branches, e os conflitos? além disso, se só eu estou trabalhando em cima disso, porque commitar para todo mundo algo não pronto?</p>
<p>Foi aí que descobri o <a title="Página com documentação do Git SCM" href="http://git-scm.com/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">GIT</a>, um sistema de controle de versão distribuído, open source e gratuito. Ok, ele é gratuito e open source, mas isso não é motivo suficiente. Como disse, ele é um sistema de controle de versão distribuído, isso quer dizer que cada um que tem uma cópia do repositório tem de fato uma cópia dele, e pode servir outras pessoas, ver histórico, tudo localmente.</p>
<p>Então de quebra, ele resolve o problema de ter de criar um branch para desenvolver uma funcionalidade que só eu vou mexer, posso controlar cada alteração minha localmente, e quando quiser &#8211; se quiser &#8211; posso sincronizar meu repositório local com um outro central (que eu considero central, já que essa figura não existe no GIT). E mais, ele é <strong>MUITO RÁPIDO</strong>. Acho que para ajudar na argumentação de que é rápido basta dizer que ele foi feito por alguns desenvolvedores do Kernel Linux, e gerencia todo o código trabalhado por eles &#8211; e não é pouca coisa.</p>
<p>Ainda estou caminhando com o <a href="http://git-scm.com/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">GIT</a>, tenho aproveitado minha ânsia de aprende-lo junto com a de contribuir com softwares open source para criar e disponibilizar projetos no <a title="Plataforma para centralização de repositórios Git" href="http://github.com" onclick="pageTracker._trackPageview('/outgoing/github.com?referer=');">GitHub</a>.</p>
<p>A grande maioria dos projetos é voltado ao <a title="CakePHP Framework" href="http://cakephp.org" onclick="pageTracker._trackPageview('/outgoing/cakephp.org?referer=');">CakePHP</a>, mas há outras coisas também. Alguns projetos que podem interessar são:</p>
<ul>
<li><a title="Sistema de gerenciamento de eventos escrito em CakePHP" href="http://github.com/CauanCabral/Comitiva" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Comitiva?referer=');">Comitiva</a> &#8211; Sistema construído em CakePHP 1.3 para gerenciamento de eventos;</li>
<li><a title="Plugin que serve de wrapper para utilização da biblioteca SwiftMailer dentro do CakePHP" href="http://github.com/CauanCabral/Mailer" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Mailer?referer=');">Plugin Mailer</a> &#8211; Um plugin que ajuda na utilização da biblioteca PHP <a title="Página da lib SwiftMailer" href="http://swiftmailer.org" onclick="pageTracker._trackPageview('/outgoing/swiftmailer.org?referer=');">SwiftMailer</a> dentro do CakePHP;</li>
<li><a title="Behavior para transformação de dados" href="http://github.com/CauanCabral/CakePHP-Locale-Behavior" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/CakePHP-Locale-Behavior?referer=');">Behavior Locale</a> &#8211; Um behavior para transformar dados vindo do usuário de seu padrão local para um padrão internacional (de banco de dados)</li>
<li><a title="Classes de apoio em PHP" href="http://github.com/CauanCabral/libs" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/libs?referer=');">Libs</a> &#8211; uma coleção de pequenos scripts PHP que fui fazendo ao longo da vida. Há coisas boas, coisas úteis, coisas não tão úteis, mas tudo pode ser usado ao menos como ponto inicial para uma implementação mais elaborada.</li>
</ul>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><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/04/18/cakephp-plugin-locale/" rel="bookmark" class="crp_title">CakePHP: Plugin Locale</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/2012/03/25/cakephp-plugin-auditable/" rel="bookmark" class="crp_title">CakePHP: Plugin Auditable</a></li><li><a href="http://cauancabral.net/2008/01/17/sentiram-falta/" rel="bookmark" class="crp_title">Sentiram falta?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Classe para fazer Contagem de Linhas e Bônus</title>
		<link>http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/</link>
		<comments>http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 01:40:37 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=139</guid>
		<description><![CDATA[Classe para contar número de linhas &#8220;codadas&#8221; de uma aplicação. Foi escrita em PHP, pensando em extensões comuns nesse tipo de sistema, mas pode facilmente ser adaptado para contar linhas de sistemas em Java, C/C++ dentre outras. A idéia por &#8230; <a href="http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Classe para contar número de linhas &#8220;codadas&#8221; de uma aplicação. Foi escrita em PHP, pensando em extensões comuns nesse tipo de sistema, mas pode facilmente ser adaptado para contar linhas de sistemas em Java, C/C++ dentre outras.</p>
<p>A idéia por trás da classe foi matar a curiosidade geek de ver o tamanho de uma &#8220;criança&#8221; que ajudei a criar, além disso quero estudar uma forma de fazer melhores estimativas para custo e prazo para desenvolvimento de software.</p>
<p>A classe está disponível livremente, sob a licença MIT. Faça o download dela <a title="Classe Metrics" href="http://geek.cauancabral.net/wp-content/uploads/2009/07/metrics.class.php" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/07/metrics.class.php?referer=');"></a><a href="http://geek.cauancabral.net/wp-content/uploads/2009/08/metrics.zip" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/08/metrics.zip?referer=');">metrics.class.php</a>. Qualquer dúvida sobre sua utilização, deixe nos comentários ou entre em contato comigo.</p>
<p>Vou aproveitar e disponibilizar a atualização da classe para validação de dados e outras &#8220;firulas&#8221; mais que já disponibilizei anteriormente, porém agora com pequenas adições. Visualize ela <a href="http://geek.cauancabral.net/wp-content/uploads/2009/08/validation.zip" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/08/validation.zip?referer=');">validation.class.php</a><a title="Classe para validação e outros bônus" href="http://geek.cauancabral.net/wp-content/uploads/2009/07/validation.class.php" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/07/validation.class.php?referer=');"></a>.</p>
<p>Qualquer sugestão sobre ambas as classes pode ser feita nos comentários. Espero que seja útil para alguém.</p>
<p>Até a próxima.</p>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p>Atualizado: troquei os arquivos por equivalentes compactados em arquivo .zip . Valeu Gelinho e Felipe ;]</p>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p>Atualizado novamente: à um bom tempo meu amigo <a href="http://sites.google.com/site/raphoxaraujo/" onclick="pageTracker._trackPageview('/outgoing/sites.google.com/site/raphoxaraujo/?referer=');">Raphox</a> indicou na lista do <a title="Grupo de Usuários PHP de MS" href="http://www.phpms.org" onclick="pageTracker._trackPageview('/outgoing/www.phpms.org?referer=');">PHPMS</a> uma classe criada pelo grande <a title="Criador, dentre outras coisas, do PHPUNIT" href="http://sebastian-bergmann.de" onclick="pageTracker._trackPageview('/outgoing/sebastian-bergmann.de?referer=');">Sebastian Bergmann</a> para mensurar softwares em PHP, o nome da classe é PHPLOC e ela está disponível neste endereço: http://github.com/sebastianbergmann/phploc . Vale a pena conferir</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/11/19/google-analytics-e-adobe-facilitando-a-sua-vida/" rel="bookmark" class="crp_title">Google Analytics e Adobe &#8211; facilitando a sua vida</a></li><li><a href="http://cauancabral.net/2009/01/13/25-erros-mais-graves/" rel="bookmark" class="crp_title">25 erros de programação mais graves</a></li><li><a href="http://cauancabral.net/2008/07/16/software-freedom-day-08/" rel="bookmark" class="crp_title">Software Freedom Day 08</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CakePHP &#8211; Dúvidas Comuns #2</title>
		<link>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/</link>
		<comments>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 00:36:54 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[i10n]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=111</guid>
		<description><![CDATA[Dúvida: Como usar habilitar a internacionalização &#8211; o famoso I18N &#8211; nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views? Habilitar a internacionalização e ter a localização em &#8230; <a href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dúvida: Como usar habilitar a internacionalização &#8211; o famoso I18N &#8211; nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views?</p>
<p>Habilitar a internacionalização e ter a localização em uma aplicação com CakePHP desde a versão 1.2  é relativamente simples: basta uma lida no nosso <a title="Internacionalizando uma aplicação em CakePHP" href="http://book.cakephp.org/pt/view/161/Internacionalizando" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/161/Internacionalizando?referer=');">Cookbook</a> e pronto.</p>
<p>Outra coisa que é relativamente simples de se fazer é validar os dados, basta termos um atributo em nosso modelo chamado &#8220;validate&#8221; e seguir as dicas do <a title="Validação de dados com CakePHP" href="http://book.cakephp.org/pt/view/125/Valida%C3%A7%C3%A3o-de-dados" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/125/Valida_C3_A7_C3_A3o-de-dados?referer=');">livro de receitas</a>.</p>
<p>Mas pelo Cookbook somos induzidos a fornecer a mensagem de erro na hora de criar a View, algo que eu particularmente não gosto. É até comum termos um modelo que é usado por Controllers diferentes e consequêntemente por Views diferentes.</p>
<p>Uma maneira de evitar isso, é definir as mensagens de erro já na definição das regras de validação, dentro do atributo &#8220;validate&#8221; do seu modelo. O grande problema é que para traduzir uma determinada expressão utilizamos um método, e a chamada de método na definição estática de um atributo não é permitida no PHP (dúvida? tente fazer o código abaixo)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Modelo <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span> <span style="color: #339933;">=</span> _<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ola mundo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//esse código não devera ser executado</span></pre></div></div>

<p>A solução para isso é a atribuição das regras de validação no momento da instanciação da classe, ou seja, no seu método construtor, da seguinte maneira</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">class</span> Modelo <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #666666; font-style: italic;">/* aqui você pode definir as regras e mensagens,mesmo chamando um método */</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Qualquer dúvida não deixem de utilizar os comentários ;]</p>
<p>&#8212;&#8212;&#8211;<br />
Atualizado: havia esquecido da chamada ao construtor da superclasse AppModels ( através do parent::__construct() ) no último código mostrado.<br />
&#8212;&#8212;&#8211;<br />
<strong>Atualizado</strong></p>
<p>Obrigado ao José Tranca e Thiago Goulart pelos comentários, as soluções propostas por eles devem ser adotada em detrimento da minha, já que melhora consideravelmente a modularidade e reusabilidade das traduções.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><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/2012/04/18/cakephp-plugin-locale/" rel="bookmark" class="crp_title">CakePHP: Plugin Locale</a></li><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/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/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CakePHP &#8211; dúvidas comuns #1</title>
		<link>http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/</link>
		<comments>http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 19:47:02 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Joomla!]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[dúvidas]]></category>
		<category><![CDATA[habtm]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=105</guid>
		<description><![CDATA[Como já comentei algumas vezes, estou desenvolvendo com um framework MVC em PHP chamado CakePHP. Ele foi construído com intuíto de provar o potencial do PHP (na época em comparação ao Ruby e o Ruby on Rails). Se precisar de &#8230; <a href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Como já comentei algumas vezes, estou desenvolvendo com um framework <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Model_E2_80_93view_E2_80_93controller?referer=');">MVC</a> em PHP chamado <a title="Página oficial do framework CakePHP" href="http://www.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/www.cakephp.org?referer=');">CakePHP</a>. Ele foi construído com intuíto de provar o potencial do PHP (na época em comparação ao <a href="http://www.ruby-lang.org/pt/" onclick="pageTracker._trackPageview('/outgoing/www.ruby-lang.org/pt/?referer=');">Ruby</a> e o <a href="http://www.rubyonrails.pro.br/" onclick="pageTracker._trackPageview('/outgoing/www.rubyonrails.pro.br/?referer=');">Ruby on Rails</a>). Se precisar de mais informações sobre o framework sugiro leitura do seu <a title="Documentação oficial do CakePHP" href="http://book.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org?referer=');">Cookbook</a> e de outros blogs a respeito.</p>
<p>Desde que descobri o CakePHP faço parte do grupo <a title="Grupo de discussão sobre CakePHP em português" href="http://groups.google.com/group/cakephp-pt/" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/cakephp-pt/?referer=');">CakePHP Tuga</a> e ocasionalmente no canal de IRC do grupo #cakephp-pt na rede Freenode.org, e já tive a oportunidade de aprender e ajudar diversas vezes.</p>
<p>Vamos as dúvidas:</p>
<ol>
<li>Como salvar dados de um formulário que envolva um relacionamenteo de &#8220;muitos para muitos&#8221;/many-to- many ou ainda de HasAndBelongToMany (HABTM) ?</li>
</ol>
<p>Nesta dúvida temos que ter em mente que o CakePHP faz todas as ligações entre nossos modelos desde que sigamos suas convenções, caso façamos isso, não haverá dificuldades.<br />
Mas quais são essas convenções? <a title="Conveções do CakePHP" href="http://book.cakephp.org/pt/view/22/Conven%C3%A7%C3%B5es-no-CakePHP" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/22/Conven_C3_A7_C3_B5es-no-CakePHP?referer=');">Veja você mesmo</a>.</p>
<p>Um detalhe que não podemos esquecer é que por padrão o CakePHP está preparado para tratar suas convenções em inglês, então, se não quisermos ter de modificar as configurações padrões, temos de desenvolver em inglês. Ok?</p>
<p>Seguindo todas as conveções o que fica faltando? É preciso saber como um relacionamento HABTM se manifesta em um formulário, ou seja, como ele é apresentado. No CookBook temos um <a title="Salvando dados em um HABTM" href="http://book.cakephp.org/pt/view/85/Salvando-dados-em-tabelas-relacionadas-HABTM" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/85/Salvando-dados-em-tabelas-relacionadas-HABTM?referer=');">texto</a> sobre o caso. Resumindo, o que temos de ter é:</p>
<ul>
<li>Um formulário com o nome de um dos modelos envolvidos no relacionamento. Por exemplo, em um blog temos um modelo Post e outro Tags, os dois estão ligados por um HABTM, então no formulário para inserir um Post, o nome de formulário seria Post.</li>
<li>Um ou mais campos identificados com o outro modelo parte do relacionamento e sua chave. No nosso exemplo seriam um ou mais campos com o nome &#8216;Tag.Tag&#8217;.</li>
</ul>
<p>No item anterior que surge a principal dúvida: como definir o nome do meu campo? que tipo de campo usar?</p>
<p>Primeiro definimos o tipo de campo a se utilizar: normalmente utilizamos um Select box para multiplas seleções OU um conjunto de Checkbox. Qualquer que seja a escolha o restante é bem simples:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/*
$tag é o retorno de um find('list') com os campos id e name selecionados
$tags = array( array('id' =&gt; 1, 'name' =&gt; 'tag 1'), array('id' =&gt; 2, 'name' =&gt; 'tag 2') );
&nbsp;
o índice 'multiple' só deve ser utilizado quando quiser um conjunto de checkbox
*/</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Tag.Tag'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'select'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'multiple'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'checkbox'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'options'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$tags</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'labels'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Selecione as tags'</span>
	<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Com isso seu formulário já retornará o que é esperado pelo CakePHP e tudo que será necessário para salvar os dados do relacionamento é utilizar o método &#8216;saveAll&#8217; ao invés de &#8216;save&#8217;.</p>
<p>Ainda esta semana comentarei das dúvidas sobre validação.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</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/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</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><li><a href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AJAX com Prototype</title>
		<link>http://cauancabral.net/2009/01/14/ajax-com-prototype/</link>
		<comments>http://cauancabral.net/2009/01/14/ajax-com-prototype/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 13:37:56 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[comentários]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=91</guid>
		<description><![CDATA[Prototype é uma biblioteca javascript bastante utilizada, mas que pra mim nunca chamou atenção (ao contrário do JQuery), mas como tenho utilizado o CakePHP e em sua estrutura de Helpers ele usa esta biblioteca, tive de &#8220;perder&#8221; um tempinho estudando-a. &#8230; <a href="http://cauancabral.net/2009/01/14/ajax-com-prototype/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a title="Página da biblioteca Prototype" href="http://www.prototypejs.org" onclick="pageTracker._trackPageview('/outgoing/www.prototypejs.org?referer=');">Prototype</a> é uma biblioteca javascript bastante utilizada, mas que pra mim nunca chamou atenção (ao contrário do <a title="A fantástica biblioteca js JQuery" href="http://jquery.com" onclick="pageTracker._trackPageview('/outgoing/jquery.com?referer=');">JQuery</a>), mas como tenho utilizado o <a title="Página do framework CakePHP" href="http://cakephp.org" onclick="pageTracker._trackPageview('/outgoing/cakephp.org?referer=');">CakePHP</a> e em sua estrutura de Helpers ele usa esta biblioteca, tive de &#8220;perder&#8221; um tempinho estudando-a.</p>
<p>Para isso, fiz como meu amigo <a title="PorKaria's blog" href="http://porkaria.wordpress.com" onclick="pageTracker._trackPageview('/outgoing/porkaria.wordpress.com?referer=');">PorKaria</a> e montei um sisteminha simples de comentários (na verdade o dele era o <a title="Livro Livre" href="http://phpbrasil.com/scripts/script.php/id/1661" onclick="pageTracker._trackPageview('/outgoing/phpbrasil.com/scripts/script.php/id/1661?referer=');">guestbook</a>, mas no fim fazem a mesmo coisa, hehehe).</p>
<p>Descrição do sistema:</p>
<p>Sistema usando AJAX (na verdade o X aqui é de XHTML, porque não utilizo XML) Permite a inserção de comentários, salvando-os em um banco de dados (MySQL), tudo de forma assíncrona. A bibliote utilizada para implementação da parte em javascript é a Prototype, a formatação (CSS) foi retirada de um tutorial do <a title="Referência em Web Semântica" href="http://www.tableless.com.br" onclick="pageTracker._trackPageview('/outgoing/www.tableless.com.br?referer=');">Tableless</a> sobre formatação de formulários e o PHP foi escrito por mim. Além do cadastro, fiz o que pode se chamar início de um sistema de busca com sugestão (famoso autocomplete). Digo o início porque ele não avalia bem o momento de se fazer a busca e não é possível clicar nos resultados, apenas vê-los.</p>
<p><span id="more-91"></span><br />
Estrutura:</p>
<ul>
<li>main.php : é a página onde está todo o sistema, apartir dela que é feito a leitura dos comentários e o envio de novos comentários;</li>
<li>adiciona_comentario.php : nesta página fazemos o processamento dos dados vindos do formulário e os salvamos no banco;</li>
<li>le_comentario.php : arquivo que recupera do banco todos os comentarios e retorna os dados em uma lista html;</li>
<li>busca_comentario.php : script que faz a busca dos comentários no banco para o &#8220;autocomplete&#8221; e retorna-os como uma lista;</li>
<li>validation.class.php : velho conhecido que faz a validação dos dados&#8230; a classe ainda está em implementação, mas já está mais completa do que a versão anterior que compartilhei.</li>
</ul>
<p>Irei comentar apenas a parte javascript, qualquer dúvida sobre o restante, deixe nos comentários ou email-me.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Funcao que recupera os dados do banco para apresentar ao usuário</span>
<span style="color: #003366; font-weight: bold;">function</span> recupera<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Updater</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'comentarios'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'adiciona_comentario.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O trecho acima define uma função que cria uma nova instância de Ajax.Updater, que fará uma chamada ao arquivo adiciona_comentario.php e usará a resposta para substituir o conteúdo da tag XHTML com ID &#8216;comentarios&#8217;. Ou seja, é essa função que ira carregar os comentários feitos na página.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Funcao que envia os dados do formulário para serem salvos no banco</span>
<span style="color: #003366; font-weight: bold;">function</span> envia<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'adiciona_comentario.php'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
		method<span style="color: #339933;">:</span> <span style="color: #3366CC;">'post'</span><span style="color: #339933;">,</span>
		parameters<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;adiciona&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		onCreate<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'adiciona'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'enviando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>transport<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'enviando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'adiciona'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			recupera<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onFailure<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Alguma coisa não deu certo...'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Este outro trecho define a função envia os dados do formulário para o arquivo adiciona_comentario. Aí é utilizado o objeto Ajax.Request, que é a implementação mais genérica do Prototype para Ajax.<br />
O que é passado para o objeto:</p>
<ol>
<li>O arquivo que receberá a requisição</li>
<li> Aqui vem o segundo parâmetro que é composto por vários subparâmetros
<ol>
<li>Método de envio: POST;</li>
<li>Variáveis enviadas: utilizo a função &#8216;serialize()&#8217; no formulário, ela transforma os dados dele em uma lista de variáveis, entendíveis pelo navegador e PHP;</li>
<li>Uma função callback que é disparada quando é criado a requisição. Uso ela para mostrar uma mensagem &#8216;Enviando&#8230;&#8217;;</li>
<li>Uma função callback que é disparada quando é concluído com sucesso a requisição. Ela esconde a mensagem mostrada anteriormente e chama a função &#8216;recupera()&#8217; para recarregar os comentários;</li>
<li>Por última uma função callback que é disparada quando ocorre um erro na requisição.</li>
</ol>
</li>
</ol>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Funcao que faz uma busca em Ajax e retorna os resultados como em um autocompletar</span>
<span style="color: #003366; font-weight: bold;">function</span> fazBusca<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'busca_comentario.php'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
		method<span style="color: #339933;">:</span> <span style="color: #3366CC;">'post'</span><span style="color: #339933;">,</span>
		parameters<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'termo'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		onCreate<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>transport<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span>transport.<span style="color: #660066;">responseText</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	onFailure<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Alguma coisa não deu certo...'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Aqui uma função que faz a busca pelos termos digitados. Utiliza o mesmo objeto da função anterior, o Ajax.Request, então não entrarei em detalhes.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Evento que é disparado quando o documento termina de carregar sua estrutura</span>
document.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dom:loaded&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'enviando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'carregando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	recupera<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'busca'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keydown'</span><span style="color: #339933;">,</span> fazBusca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Por ultimo utilizo a função &#8216;observe()&#8217; no elemento &#8216;document&#8217; para que após concluída o carregamento da página (não incluído aí o carregamento de possíveis imagens), execute alguns comandos:<br />
Com a função &#8216;hide()&#8217; escondo os elementos de aviso ao usuário;<br />
Com a última linha, faço com que sempre que uma tecla for pressionada (keydown) no elemento com ID &#8216;busca&#8217;, execute a função &#8216;fazBusca&#8217;.</p>
<p>Um bônus:</p>
<p>Muitas pessoas enfrentam problemas com codificação quando trabalham com AJAX, para poupar dores de cabeça é recomendado o uso de UTF8 tanto no seu editor de texto (na hora de criar os códigos), quanto nos header dos documentos e no banco de dados. Tendo certeza que está tudo em UTF8, você provavelmente não terá problemas. Só não esqueça de um detalhe: o <a title="Página do PHP" href="http://br.php.net/" onclick="pageTracker._trackPageview('/outgoing/br.php.net/?referer=');">PHP</a> não trabalha nativamente com UTF8, então, antes de usar qualquer função que trate uma string, use a função <a title="documentação da função utf8_decode" href="http://br.php.net/manual/pt_BR/function.utf8-decode.php" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.utf8-decode.php?referer=');">utf8_decode</a> do PHP e depois, mas antes de salvar no banco de dados, utilize a função <a title="Documentação da função utf8_encode" href="http://br.php.net/manual/pt_BR/function.utf8-encode.php" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.utf8-encode.php?referer=');">utf8_encode</a>. Isso será necessário até o lançamento do <a title="Unicode no PHP" href="http://www.php.net/~derick/meeting-notes.html" onclick="pageTracker._trackPageview('/outgoing/www.php.net/_derick/meeting-notes.html?referer=');">PHP 6</a>.</p>
<p><a title="Arquivos do post" href="http://geek.cauancabral.net/wp-content/uploads/2009/01/comentarios.zip" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/01/comentarios.zip?referer=');">Download de todos os arquivos do exemplo.</a><br />
obs.: descompacte os arquivos numa mesma pasta, em seguida crie um novo diretório chamado &#8216;lib&#8217; e mova o arquivo validation.class.php para ele.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><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/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li><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></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/01/14/ajax-com-prototype/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>25 erros de programação mais graves</title>
		<link>http://cauancabral.net/2009/01/13/25-erros-mais-graves/</link>
		<comments>http://cauancabral.net/2009/01/13/25-erros-mais-graves/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 18:33:18 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=85</guid>
		<description><![CDATA[Divulgada uma lista com os 25 erros de programação que mais causam prejuízos no mundo. <a href="http://cauancabral.net/2009/01/13/25-erros-mais-graves/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Foi divulgado pelo <a title="SANS Institute - Top 25 [en]" href="http://www.sans.org/top25errors/" onclick="pageTracker._trackPageview('/outgoing/www.sans.org/top25errors/?referer=');">SANS Institute[en]</a> uma lista com os 25 erros de programação que mais causam prejuízos no mundo. Esta lista foi elaborada por especialistas de mais de 30 instituições dos EUA e organizações internacionais de segurança digital.</p>
<div id="attachment_88" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-88" title="BSOD no braço" src="http://geek.cauancabral.net/wp-content/uploads/2009/01/bsod_no_braco-300x244.jpg" alt="tradicional erro de segurança" width="300" height="244" /><p class="wp-caption-text">um erro tradicional</p></div>
<p>A lista foi subdivida em três categorias: &#8220;Interação Insegura entre Componentes&#8221;, &#8220;Risco no Gerenciamento de Recursos&#8221; e &#8220;Defesa Porosa&#8221; &#8211; no original: Insecure Interaction Between Components, Risky Resource Management e Porous Defenses.</p>
<p>Há na lista falhas como possibilidade de injeção de códigos, utilização de algorítmos de criptografia defasado e transferência de dados sensíveis sem criptografia.</p>
<p>No <a title="Top 25 errors [en]" href="http://www.sans.org/top25errors/" onclick="pageTracker._trackPageview('/outgoing/www.sans.org/top25errors/?referer=');">artigo original[en]</a> há várias informações sobre os erros e comentários de renomadas empresas de segurança sobre a importância da lista.</p>
<p>Sem dúvida um texto que vale a pena para todo desenvolvedor.</p>
<p>via: <a title="Fonte da notícia" href="http://idgnow.uol.com.br/seguranca/2009/01/12/governo-e-empresas-dos-eua-listam-os-25-piores-erros-de-programacao/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/idgnow.uol.com.br/seguranca/2009/01/12/governo-e-empresas-dos-eua-listam-os-25-piores-erros-de-programacao/?referer=');">IDG NOW!</a></p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2012/05/06/campanha-do-armamento-serio/" rel="bookmark" class="crp_title">&#8220;Campanha do Armamento&#8221;, sério?</a></li><li><a href="http://cauancabral.net/2009/03/29/fisl-10-eu-vou/" rel="bookmark" class="crp_title">FISL 10 &#8211; Eu vou!</a></li><li><a href="http://cauancabral.net/2008/11/02/hoje-tem-final-da-f1-vai-la-massa/" rel="bookmark" class="crp_title">Hoje tem final da F1&#8230; vai lá Massa!</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/2008/07/16/software-freedom-day-08/" rel="bookmark" class="crp_title">Software Freedom Day 08</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/01/13/25-erros-mais-graves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desenvolvimento rápido</title>
		<link>http://cauancabral.net/2008/09/21/desenvolvimento-rapido/</link>
		<comments>http://cauancabral.net/2008/09/21/desenvolvimento-rapido/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 22:41:27 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[ágil]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/2008/09/21/desenvolvimento-rapido/</guid>
		<description><![CDATA[Últimamente está na moda a palavra &#8220;ágil&#8221;. Você têm de projetar rápido, desenvolver rápido, implementar rápido para ser considerado ágil. E apesar do PHP fornecer centenas de funções prontas para diversas tarefas rotineiras, ele perde feio comparado a outras linguagens &#8230; <a href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Últimamente está na moda a palavra &#8220;ágil&#8221;.<br />
Você têm de projetar rápido, desenvolver rápido, implementar rápido para ser considerado ágil.</p>
<p>E apesar do <a href="http://br.php.net" onclick="pageTracker._trackPageview('/outgoing/br.php.net?referer=');">PHP</a> fornecer centenas de funções prontas para diversas tarefas rotineiras, ele perde feio comparado a outras linguagens mais novas como Ruby ou Python, principalmente quando juntamos a estas seus grandes frameworks &#8211; Rails no caso do Ruby e Django no caso do Python.</p>
<p>Mas a comunidade PHP tem suas cartas na manga, vários frameworks agilizam o desenvolvimento tanto em aplicações simples como em aplicações sofisticadas.<br />
E são várias as opções. Tem para todos os gostos, nos próximo posts vou falar um pouco deles.</p>
<p>Hoje começo com o <a href="http://www.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/www.cakephp.org?referer=');">CakePHP</a>:</p>
<p><span style="font-weight: bold;">Descrição:</span><br />
Compete de frente com o Rails. Possui uma base bem estruturada, código bem organizado, comunidade participativa e uma licensa flexivel. Seu grande destaque está no baker, que gera ações básicas (criar,ler,atualizar e apagar entradas) para uma tabela do banco de dados.</p>
<p><span style="font-weight: bold;">Como usa-lo?</span><br />
É muito fácil, basta ir a página <a href="http://cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/cakephp.org/?referer=');">dele</a> e fazer o download do último lançamento. Recomendo a versão 1.2.xx , apesar de ser RC2 (candidata a estável) ela já está bem estável e possui vários melhoramentos em relação a versão 1.1.xx.<br />
Em seguida descompacte o arquivo onde achar melhor (dentro de seu servidor web) e pronto. Agora só falta você configurar o arquivo &#8220;/app/config/database.php&#8221;. Nele você encontra instruções de como inserir as informações para acessar o seu banco de dados, há até um exemplo de como fazer.<br />
Agora é só acessar, através do navegador, a pasta que você descompactou o CakePHP.</p>
<p><span style="font-weight: bold;">Onde encontrar material para estudo?</span><br />
Como comentei antes, o CakePHP possui uma comunidade bem participativa, mas a maioria não fala português, então você encontrará bastante informação em inglês, aqui listo alguns sites e blogs com informações sobre o tema, bons estudos:</p>
<ul>
<li><a href="http://cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/cakephp.org/?referer=');">CakePHP</a> &#8211; A página oficial, sempre com novidades (inglês)</li>
<li><a href="http://book.cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/?referer=');">The Cookbook</a> &#8211; O manual oficial do cake. Possui conteúdo para versão 1.1 e 1.2, sendo que a segunda esta sendo finalizada. Obrigatório. (em inglês com parte do conteúdo em português, só alterar no rodapé da página).</li>
<li><a href="http://api.cakephp.org/" onclick="pageTracker._trackPageview('/outgoing/api.cakephp.org/?referer=');">API for CakePHP</a> &#8211; A documentação das classes, métodos e funcionalidades do CakePHP. Não é muito rica em detalhes, mas está melhorando. Obrigatório. (inglês)</li>
<li><a href="http://lemoncake.wordpress.com/" onclick="pageTracker._trackPageview('/outgoing/lemoncake.wordpress.com/?referer=');">lemoncake</a> &#8211; Um blog com várias discussões sobre CakePHP e dicas/tutoriais de como usar recursos do Cake. Muito recomendado. (inglês).</li>
<li><a href="http://aranworld.com/article/161/cakephp-acl-tutorial-what-is-it" onclick="pageTracker._trackPageview('/outgoing/aranworld.com/article/161/cakephp-acl-tutorial-what-is-it?referer=');">aranworld</a> &#8211; Um blog que tem posts esporádicos a respeito do CakePHP, mas no link que vinculei, há uma série de posts sobre o sistema de controle de acesso do CakePHP, uma ferramente extremamente poderosa mas que pode parecer complicada de utilizar no inicio. Muito recomendado. (inglês)</li>
<li><a href="http://cakephp.com.br" onclick="pageTracker._trackPageview('/outgoing/cakephp.com.br?referer=');">CakePHP &#8211; Brasil</a> &#8211; Portal brasileiro sobre CakePHP, ótimo para quem não arrisca muito o inglês, possui dicas e até uma versão traduzida do manual. Muito recomendado. (português)</li>
</ul>
<p>E podem esperar que em breve haverá vários posts a respeito. Estou utilizando bastante o CakePHP e tenho gostado muito. Colocarei algumas dicas aqui logo logo.</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/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</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/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/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/09/21/desenvolvimento-rapido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jogar Quake direto no Browser?</title>
		<link>http://cauancabral.net/2008/07/15/jogar-quake-direto-no-browser/</link>
		<comments>http://cauancabral.net/2008/07/15/jogar-quake-direto-no-browser/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 23:45:43 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[flashplayer]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[opesource]]></category>
		<category><![CDATA[tamarin]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=39</guid>
		<description><![CDATA[Parece um absurdo, mas não é. A Fundação Mozilla está desenvolvendo uma Máquina Virtual que implementa o ECMAScript(linguagem que deu origem ao ActionScript do Flash, similar ao JavaScript) versão 4, e graças a idéia de um de seus desenvolvedores, será &#8230; <a href="http://cauancabral.net/2008/07/15/jogar-quake-direto-no-browser/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Parece um absurdo, mas não é.</p>
<p>A Fundação Mozilla está desenvolvendo uma Máquina Virtual que implementa o ECMAScript(linguagem que deu origem ao ActionScript do Flash, similar ao JavaScript) versão 4, e graças a idéia de um de seus desenvolvedores, será possível rodar aplicativos escritos no Muito Bom e também muito velho C. Sim, aquela linguagem que é preferida por pessoas como Linus Torvalds e Paulo Adonis.</p>
<p>Além do C, já é possível rodar aplicações Python com esta máquina virtual, e no futuro será possível utilizar várias outras linguagens.</p>
<p>Para provar o feito, a equipe do Tamarin rodou Quake e Zelda ( rodando em um emulador de Nintendo escrito em C ). Tudo funcionou, som e imagem, mas claro, a perfomance não é a mesma. Segundo o desenvolvedor, é aceitável.</p>
<p>Esta pode ser mais uma arma da Mozilla e uma carta na manga da Adobe para enfrentar a Microsoft e seu Silverlight+Visual Studio( que já permite a utilização de linguagen .NET ). Se isso vai gerar bons frutos, só na prática saberemos.</p>
<p>A grande notícia relacionada ao projeto, é que além de tornar possível rodar estas linguagens, o Tamarin poderá substituir o flashplayer nos navegadores, sendo uma alternativa Open Source ( e integrada ao navegador ).</p>
<p>Fontes: <a title="Web Gear" href="http://info.abril.com.br/blog/webgear/20080715_listar.shtml?94789" onclick="pageTracker._trackPageview('/outgoing/info.abril.com.br/blog/webgear/20080715_listar.shtml?94789&amp;referer=');">INFO Online</a>, <a title="Explicação do feito [en]" href="http://www.toolness.com/wp/?p=52" onclick="pageTracker._trackPageview('/outgoing/www.toolness.com/wp/?p=52&amp;referer=');">The Web at Toolness</a>[en], <a title="Página do projeto" href="http://www.mozilla.org/projects/tamarin/" onclick="pageTracker._trackPageview('/outgoing/www.mozilla.org/projects/tamarin/?referer=');">Tamarin Project[en]</a>.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/01/18/novidades/" rel="bookmark" class="crp_title">Novidades&#8230;</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/02/06/novidades-de-janeiro/" rel="bookmark" class="crp_title">Novidades de janeiro</a></li><li><a href="http://cauancabral.net/2011/09/24/aplicacoes-heterogeneas-e-a-busca-por-conhecimento/" rel="bookmark" class="crp_title">Aplicações heterogêneas e a busca por conhecimento</a></li><li><a href="http://cauancabral.net/2008/01/17/sentiram-falta/" rel="bookmark" class="crp_title">Sentiram falta?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/07/15/jogar-quake-direto-no-browser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

