<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.1" -->
<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/"
	>

<channel>
	<title>Just Another Underworker</title>
	<link>http://charlesschaefer.net/blog</link>
	<description>Design e estrutura em construção</description>
	<pubDate>Wed, 20 May 2009 21:43:49 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<item>
		<title>Depurando aplicações PHP com XDebug e PHPEclipse</title>
		<link>http://charlesschaefer.net/blog/?p=18</link>
		<comments>http://charlesschaefer.net/blog/?p=18#comments</comments>
		<pubDate>Wed, 20 May 2009 21:42:15 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[PHPEclipse]]></category>

		<category><![CDATA[Depuração]]></category>

		<category><![CDATA[XDebug]]></category>

		<category><![CDATA[Apache]]></category>

		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=18</guid>
		<description><![CDATA[Muitos programadores, mesmo os mais experientes, cultivam o costume de depurar suas aplicações utilizando funções internas do PHP para parar a execução do script e exibir os dados de uma ou mais variáveis. Contudo, essa não é (como você mesmo já deve ter percebido) uma abordagem muito eficaz para se achar e corrigir problemas no [...]]]></description>
			<content:encoded><![CDATA[<p>Muitos programadores, mesmo os mais experientes, cultivam o costume de depurar suas aplicações utilizando funções internas do PHP para parar a execução do script e exibir os dados de uma ou mais variáveis. Contudo, essa não é (como você mesmo já deve ter percebido) uma abordagem muito eficaz para se achar e corrigir problemas no seu código. Além disso, ficar enchendo seu script com <em>die()</em> e <em>var_dump()</em> não é lá uma coisa muito produtiva, seja para depuração ou apenas para entender o funcionamento de algum trecho do seu programa.</p>
<p>Constantemente quem vem de outras linguagens para o PHP me pergunta se há uma forma mais eficiente para depuração no PHP. Algumas vezes até programadores experientes na linguagem me fazem esse tipo de pergunta. Sempre indico as mesmas ferramentas, mas normalmente não se encontra muita leitura explicando o funcionamento e o processo de instalação dessas ferramentas. Nos próximos parágrafos vou falar das ferramentas que utilizo para depuração e explicar como instalá-las e utilizá-las.<br />
 <a href="http://charlesschaefer.net/blog/?p=18#more-18" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=18</wfw:commentRss>
		</item>
		<item>
		<title>Apresentando o USVN</title>
		<link>http://charlesschaefer.net/blog/?p=15</link>
		<comments>http://charlesschaefer.net/blog/?p=15#comments</comments>
		<pubDate>Wed, 06 May 2009 23:07:26 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[Subversion]]></category>

		<category><![CDATA[Apache]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Framework]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=15</guid>
		<description><![CDATA[Nessa nossa vida de desenvolvedor, muitas vezes ficamos responsáveis por tarefas que, a princípio, não nos cabem. Seja porque a empresa em que trabalhamos é pequena ou desorganizada, porque somos freelancers, ou porque estamos trabalhando em projetos pessoais.
Uma dessas tarefas que sempre me perseguiu é a administração de repositórios no Subversion. Tudo bem que o [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa nossa vida de desenvolvedor, muitas vezes ficamos responsáveis por tarefas que, a princípio, não nos cabem. Seja porque a empresa em que trabalhamos é pequena ou desorganizada, porque somos freelancers, ou porque estamos trabalhando em projetos pessoais.</p>
<p>Uma dessas tarefas que sempre me perseguiu é a administração de repositórios no Subversion. Tudo bem que o svnadmin não é uma ferramenta tão difícil assim de utilizar, mas é bem chato ficar olhando o help sempre que precisa de um repositório novo.</p>
<p>Há algum tempo eu conheci uma ferramenta que facilitou de mais a minha vida: USVN (<a href="Muitas vezes eu fico respon" title="User Friendly SVN" target="_blank">http://usvn.info/</a>) . Com ela é possível criar e gerenciar repositórios, grupos, usuários e permissão de acesso aos repositórios. Enfim, praticamente tudo o que você precisa para gerenciar seus repositórios no Subversion o USVN tem, com o diferencial de ser com uma GUI amigável <img src='http://charlesschaefer.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>O USVN é escrito em PHP e utiliza o Zend Framework. Pelo que já pude ver no código do projeto, é bem fácil adicionar uma funcionalidade nova caso não exista dentro da ferramenta. E fazer uma extensão do sistema ainda pode te trazer outros benefícios.</p>
<p>Uma coisa que me agradou bastante no projeto é a preocupação da equipe com a qualidade do código. Isso faz com que, ao entrar para ajudar no desenvolvimento do projeto, você deve aprender a trabalhar com algumas ferramentas que aumentam bastante a qualidade do seu software e até a sua produtividade em algumas tarefas repetitivas (testes de unidade, automação de tarefas com o Phing, etc). Uma ótima oportunidade de aprender na prática a trabalhar com algumas ferramentas das quais talvez você só tenha ouvido falar.</p>
<p>Vale muito a pena tanto a utilização da ferramenta quanto a contribuição com o projeto. Fica a dica!</p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=15</wfw:commentRss>
		</item>
		<item>
		<title>1º Encontro do PHP MG</title>
		<link>http://charlesschaefer.net/blog/?p=14</link>
		<comments>http://charlesschaefer.net/blog/?p=14#comments</comments>
		<pubDate>Wed, 06 May 2009 22:28:44 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[PHP MG]]></category>

		<category><![CDATA[Eventos]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=14</guid>
		<description><![CDATA[Uma rapidinha para voltar às atividades no blog.
Dia 25 de Abril aconteceu em BH o 1º Encontro do PHP MG. Tivemos muitas pessoas no evento e palestras muito interessantes também. Quem não foi perdeu uma ótima oportunidade de conhecer as caras do PHP em Minas.
Ao final do evento alguns integrantes do grupo PHP MG e [...]]]></description>
			<content:encoded><![CDATA[<p>Uma rapidinha para voltar às atividades no blog.</p>
<p>Dia 25 de Abril aconteceu em BH o 1º Encontro do PHP MG. Tivemos muitas pessoas no evento e palestras muito interessantes também. Quem não foi perdeu uma ótima oportunidade de conhecer as caras do PHP em Minas.</p>
<p>Ao final do evento alguns integrantes do grupo PHP MG e outros participantes do evento se reuniram em um bar para o 1º PHPinga do PHP MG. O ápice do evento, eu diria <img src='http://charlesschaefer.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Veja mais informações e links para as fotos dos eventos e slides das palestras no site do grupo: <a href="http://www.phpmg.com/" title="Grupo de Usuário PHP de Minas Gerais">http://www.phpmg.com/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=14</wfw:commentRss>
		</item>
		<item>
		<title>Evitando acesso a determinadas pastas no apache</title>
		<link>http://charlesschaefer.net/blog/?p=13</link>
		<comments>http://charlesschaefer.net/blog/?p=13#comments</comments>
		<pubDate>Wed, 06 May 2009 22:27:40 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[Subversion]]></category>

		<category><![CDATA[Apache]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=13</guid>
		<description><![CDATA[Algumas vezes eu prefiro colocar alguns dos sistemas que desenvolvo para serem atualizados via software de Controle de Versões. Contudo, quando você coloca no ar uma cópia do seu repositório, por exemplo, do Suversion, todas as suas pastas terão uma pasta .svn com dados que não são interessantes serem públicos.
Para evitar o acesso a essas [...]]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes eu prefiro colocar alguns dos sistemas que desenvolvo para serem atualizados via software de Controle de Versões. Contudo, quando você coloca no ar uma cópia do seu repositório, por exemplo, do Suversion, todas as suas pastas terão uma pasta .svn com dados que não são interessantes serem públicos.</p>
<p>Para evitar o acesso a essas pastas (.svn) eu consegui o seguinte comando, que deve ser colocado no .htaccess da raiz de sua aplicação:</p>
<p><em>RedirectMatch 404 /\\.svn(/|$) </em></p>
<p>Com isso, mesmo que seu usuário digite o endereço até uma de suas pasta .svn, ele não terá acesso a ela, como se realmente não existisse no servidor.</p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=13</wfw:commentRss>
		</item>
		<item>
		<title>Ignorando arquivos e diretórios no Subversion</title>
		<link>http://charlesschaefer.net/blog/?p=12</link>
		<comments>http://charlesschaefer.net/blog/?p=12#comments</comments>
		<pubDate>Wed, 02 Jul 2008 02:13:07 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=12</guid>
		<description><![CDATA[Muitas vezes temos pastas e arquivos que não queremos que entrem nos nossos repositórios ou, quando fazemos builds ou usamos linguagens compiladas não queremos dar commit do resultado sempre. Por exemplo, imagine-se trabalhando num projeto opensource e que você gera pacotes semanais, ou ainda está num projeto escrito em, por exemplo, java, e não quer [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes temos pastas e arquivos que não queremos que entrem nos nossos repositórios ou, quando fazemos builds ou usamos linguagens compiladas não queremos dar commit do resultado sempre. Por exemplo, imagine-se trabalhando num projeto opensource e que você gera pacotes semanais, ou ainda está num projeto escrito em, por exemplo, java, e não quer que a compilação entre no controle de versões.</p>
<p>Nesses casos, você quer que os arquivos .zip, .tar.gz e .bz2 gerados pelo build, ou ainda os arquivos .class gerados da compilação, não apareçam na saída do seu comando de status (svn st).</p>
<p>O Subversion apresenta uma funcionalidade para evitar que esses arquivos sujem a sua saída ao pedir o status da sua cópia local. É a propriedade svn:ignore.</p>
<p>Para usá-la basta fazer da seguinte forma:</p>
<pre>
$ svn propedit svn:ignore diretorio</pre>
<p>Isso irá abrir o editor configurado para o seu ambiente. Agora basta digitar os padrões que devem ser ignorados, por exemplo:</p>
<pre>
tmp/logs
tmp/cache
*.class
*.zip
*.tar.gz
*.bz2</pre>
<p>Salve o arquivo e dê comit pasta:</p>
<pre>
$ svn ci diretorio</pre>
<p>Pronto. Agora sempre que você tiver uma mudança no diretório &#8216;diretorio&#8217; essa mudança não irá aparecer na saída do &#8217;svn st&#8217;.</p>
<p>Uma dica rápida e simples, mas de grande ajuda (principalmente para mim =D).</p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=12</wfw:commentRss>
		</item>
		<item>
		<title>BH passa a ter formação de qualidade para Profissionais PHP</title>
		<link>http://charlesschaefer.net/blog/?p=11</link>
		<comments>http://charlesschaefer.net/blog/?p=11#comments</comments>
		<pubDate>Sun, 22 Jun 2008 16:37:37 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[PHPrime]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=11</guid>
		<description><![CDATA[Quem mora em BH ou redondezas e tiver interesse em conhecer melhor os recursos do PHP já pode se alegrar. Uma nova iniciativa está trazendo para os mineiros treinamentos de qualidade, focados no uso profissional do PHP.
É a PHPrime (www.phprime.com.br) que inicia seus trabalhos oferecendo os cursos PHP Essentials e PHP Zend Certified Engineer e [...]]]></description>
			<content:encoded><![CDATA[<p>Quem mora em BH ou redondezas e tiver interesse em conhecer melhor os recursos do PHP já pode se alegrar. Uma nova iniciativa está trazendo para os mineiros treinamentos de qualidade, focados no uso profissional do PHP.</p>
<p>É a PHPrime (<a href="http://www.phprime.com.br" title="Escola de PHP em Belo Horizonte" target="_blank">www.phprime.com.br</a>) que inicia seus trabalhos oferecendo os cursos <a href="http://www.phprime.com.br/curso.php?ac=detalhes&amp;id=4" title="Conceitos básicos e como utilizar o PHP para desenvolver aplicações simples, porém de forma correta e profissional" target="_blank">PHP Essentials</a> e <a href="http://www.phprime.com.br/curso.php?ac=detalhes&amp;id=9" title="Curso voltado para profissionais experientes, interessados na certificação ZCE" target="_blank">PHP Zend Certified Engineer</a> e que promete abrir outros cursos em breve, como o PHP Advanced, com o objetivo de ensinar conceitos, técnicas e tecnologias avançadas, voltadas para profissionais que já conhecem PHP.</p>
<p>Quem tiver interesse as inscrições já estão abertas. É só entrar no site e se matricular. Aqueles que tiverem interesse em outros cursos ou quiserem opinar sobre quais tópicos gostariam de ver no PHP Advanced, basta entrar em contato com a escola, no link <a href="http://www.phprime.com.br/contato.php" title="Para entrar em contato com a escola" target="_blank">contato</a> do site.</p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=11</wfw:commentRss>
		</item>
		<item>
		<title>Preparando o DBDesigner para acessar o MySQL no Linux</title>
		<link>http://charlesschaefer.net/blog/?p=10</link>
		<comments>http://charlesschaefer.net/blog/?p=10#comments</comments>
		<pubDate>Sat, 22 Dec 2007 23:32:04 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[GNU/Linux]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=10</guid>
		<description><![CDATA[Sempre vejo algumas pessoas reclamarem da dificuldade de se conseguir instalar o DBDesigner com acesso ao MySQL no Linux. Recentemente, buscando uma forma mais fácil de manter minhas tabelas sincronizadas com os meus DERs, eu resolvi dedicar um tempo à solução desse problema. Felizmente eu consegui e resolvi postar aqui como fazer.
Para os passos abaixo [...]]]></description>
			<content:encoded><![CDATA[<p>Sempre vejo algumas pessoas reclamarem da dificuldade de se conseguir instalar o DBDesigner com acesso ao MySQL no Linux. Recentemente, buscando uma forma mais fácil de manter minhas tabelas sincronizadas com os meus DERs, eu resolvi dedicar um tempo à solução desse problema. Felizmente eu consegui e resolvi postar aqui como fazer.</p>
<p>Para os passos abaixo considero que você já tenha o DBDesigner instalado e funcionando, apenas sem conexão com o banco. Se não é o seu caso, pode conferir como instalar por <a href="http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=2258&amp;pagina=3" title="Tutorial de instalação do DBDesigner">este tutorial</a> no <a href="http://www.vivaolinux.com.br" title="Um dos melhores sites sobre Linux no Brasil">Viva o Linux</a>.</p>
<p>Então vamos lá. Faça o download da biblioteca libsqlmda pelo endereço: <a href="http://crlab.com/dbx/dbxmda.tar.gz" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">http://crlab.com/dbx/dbxmda<wbr></wbr>.tar.gz</a></p>
<p>Descompacte tudo e mova o arquivo <em>libsqlmda.so.3.10</em> para a pasta <em>/usr/lib</em>. Crie o Link de <em>/usr/lib/libsqlmda.so.3.10</em> para <em>/usr/lib/libsqlmda.so</em> .</p>
<p>Entre na pasta do <span id="st" name="st" class="st">DBDesigner</span> e copie o arquivo <em>Linuxlib/libmysqlclient.so.10.*</em> para <em>/usr/lib</em>. Crie o link de <em>/usr/lib/libmysqlclient.so.10.*</em> para <em>/usr/lib/libmysqlclient.so.10</em> .</p>

<div class="wp_syntax"><div class="code"><pre>$ wget http://crlab.com/dbx/dbxmda.tar.gz
$ tar zxvf dbxmda.tar.gz
$ cd DbxMda
$ sudo cp libsqlmda.so.3.10 /usr/lib
$ sudo ln -s /usr/lib/libsqlmda.so.3.10 /usr/lib/libsqlmda.so</pre></div></div>

<p><em>[Update]</em><br />
<em> A instrução para o link de libsqlmda.so.* estava errada.<br />
[/Update]</em></p>
<p>Abra o <span id="st" name="st" class="st">DBDesigner</span>, vá no menu <em>&#8220;Database </em>&gt;<em> Connect To Database</em>&#8220;. Crie uma nova conexão com o Banco, no botão &#8220;<em>New Database Connection</em>&#8220;. Preencha os dados da aba General da forma que for necessário e na aba Advanced modifique os seguintes dados:</p>
<p><strong>GetDriverFunc: </strong>getSQLDriverMySQL (Note que já está lá o nome getSQLDriver<span style="font-weight: bold">MYSQL</span>, que deve ser trocado para getSQLDriver<span style="font-weight: bold">MySQL</span>, com <span style="font-weight: bold"> y</span> minúsculo)</p>
<p><strong>LibraryName:</strong> libsqlmda.so</p>
<p><strong>VendorLib: </strong>libmysqlclient.so.10<span style="font-weight: bold"><span style="font-weight: bold"><span style="font-weight: bold"><br />
<span style="font-weight: bold">  </span></span></span></span></p>
<p>Após isso, faça a conexão e seja feliz para sempre, ou morda-se de inveja por estar com menos sorte que eu e pegar mais um pouco de problemas para conectar&#8230;. :p</p>
<p>Acho que não será muito problema. Testei no Ubuntu Feisty Fawn com MySQL 5 e rodou muito bem, com direito a sincronização do banco com seu modelo e a engenharia reversa do seu banco.</p>
<p>Acho que com isso chegamos ao fim. Com essa funcionalidade &#8220;a mais&#8221; o DBDesigner torna-se uma ferramenta ainda mais interessante para se trabalhar com banco de dados. Enquanto não chega o MySQL WorkBench, o DBDesigner continuará a ser uma mão na roda <img src='http://charlesschaefer.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Espero que a dica tenha servido para outras pessoas também conseguirem essa tão sonhada proeza.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=10</wfw:commentRss>
		</item>
		<item>
		<title>Uma dica rápida para os programadores brasileiros</title>
		<link>http://charlesschaefer.net/blog/?p=9</link>
		<comments>http://charlesschaefer.net/blog/?p=9#comments</comments>
		<pubDate>Tue, 22 May 2007 22:10:00 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=9</guid>
		<description><![CDATA[Todos sabemos bem quem é que nos ajuda quando estamos em apuros com PHP (isso mesmo, quem, a personificação da utilidade). Pois bem, o nosso bom e velho manual (quase) nunca nos deixa na mão, não é verdade? Acho que todos concordamos com isso. Mas ainda assim vou me arriscar a apontar um pequeno problema [...]]]></description>
			<content:encoded><![CDATA[<p><span style=";font-family:verdana;font-size:100%;"  >Todos sabemos bem quem </span><span style=";font-family:georgia;font-size:100%;"  >é que nos ajuda quando estamos em apuros com PHP </span><span style=";font-family:georgia;font-size:100%;"  >(isso mesmo, <span style="font-weight: bold;">quem</span>, a personificação da utilidade). Pois bem, o nosso bom e velho manual (quase) nunca nos deixa na mão, não é verdade? Acho que todos concordamos com isso. </span><span style=";font-family:georgia;font-size:100%;"  >Mas ainda assim vou me arriscar a apontar um pequeno problema nele.</span><br /><span style=";font-family:georgia;font-size:100%;"  ><br />Conheço alguns programadores que ainda não sabem fazer uma leitura básica num texto escrito em inglês. Uns dizem que não têm tempo, outros que dá pra se virar com o que há em português sobre programação. Afinal de contas o nosso bom e velho manual tem boa parte de seu conteúdo traduzida para o português. Pra quê aprender inglês?</p>
<p>Nosso querido manual é realmente traduzido para o português, apesar de a documentação de algumas funções ainda não terem sido traduzidas ainda. Mas faço uma pergunta: se por um acaso não pudermos confiar nem no manual do PHP, será que poderemos confiar em algo mais?</p>
<p>Não estou dizendo, de forma alguma, que o manual é uma fonte não confiável para os programadores. Só queria apresentar uma parte dele que não é tão confiável para os brasileiros, principalmente aqueles que não sabem nada de inglês (fui um destes por um tempo também :} )</p>
<p>O motivo deste post? Veja:</p>
<p><a href="http://br2.php.net/manual/pt_BR/function.socket-bind.php">http://br2.php.net/manual/pt_BR/function.socket-bind.php</a></p>
<p><a href="http://br2.php.net/manual/en/function.socket-bind.php">http://br2.php.net/manual/en/function.socket-bind.php</a></p>
<p>Entende agora o que eu quero dizer ao apontar o manual em português como &#8220;confiável mas nem tanto&#8221;?</p>
<p>O primeiro link (tradução do manual para português BR) traz um aviso medonho dizendo para usar a função por sua própria conta pois sua estrutura ou nome podem ser mudados ou o suporte a ela descontinuado. Agora quando você visita o manual em inglês vê que não há nada disso. Isso ocorre provavelmente porque a versão do manual em inglês é bem mais nova que a versão traduzida para o português.</p>
<p>Esse problema de desatualização não acontece somente em funções remotas como a socket_bind(). Veja aqui o manual da função file():</p>
<p><a href="http://br2.php.net/manual/pt_BR/function.file.php">http://br2.php.net/manual/pt_BR/function.file.php</a></p>
<p>agora em inglês:</p>
<p><a href="http://br2.php.net/manual/en/function.file.php">http://br2.php.net/manual/en/function.file.php</a></p>
<p>Novamente isso não é, de forma alguma, uma crítica ao manual (que ainda é a fonte mais confiável de informações) nem aos tradutores (que devem estar atolados de trabalho e não tiveram tempo de atualizar algumas funções). Quero apenas alertá-los, principalmente os mais novos na linguagem, que quando você viu o manual da função em português uma coisa, testou e não funcionou como esperado, dê uma lida nela em inglês para ver se não há nenhuma diferença. Pode estar nessa diferença o detalhe que irá evitar de fazê-lo gastar todo o seu dia procurando uma solução.</p>
<p>Vou mandar os links para o pessoal do manual do PHP, que agora conta com um novo editor: Philip Olson</p>
<p>Tenho certeza de que corrigirão o mais rápido possível.</p>
<p>Até a próxima.<br /></span>
<div class="blogger-post-footer">Acompanhe o resto pelo blog&#8230;</div>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=9</wfw:commentRss>
		</item>
		<item>
		<title>Criando um sistema de erros amigáveis para o CakePHP</title>
		<link>http://charlesschaefer.net/blog/?p=8</link>
		<comments>http://charlesschaefer.net/blog/?p=8#comments</comments>
		<pubDate>Sun, 22 Apr 2007 17:07:00 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=8</guid>
		<description><![CDATA[Por mais simples que seja, uma aplicação sempre terá uma mensagem dinâmica a passar para o usuário. Sempre damos um jeitinho de mandar a mensagem de formas diferentes em arquivos diferentes. Isso torna o sistema de erros da nossa aplicação uma coisa inextensível e de manutenção custosa.
O CakePHP, apesar de toda sua facilidade, não possui [...]]]></description>
			<content:encoded><![CDATA[<p>Por mais simples que seja, uma aplicação sempre terá uma mensagem dinâmica a passar para o usuário. Sempre damos um jeitinho de mandar a mensagem de formas diferentes em arquivos diferentes. Isso torna o sistema de erros da nossa aplicação uma coisa inextensível e de manutenção custosa.</p>
<p>O CakePHP, apesar de toda sua facilidade, não possui um sistema integrado para exibição de mensagens para o usuário. Para isso criei um pequeno sistema de mensagens amigáveis, composto por um componente, um helper e um elemento. Chamo-o de <span style="font-style: italic">FriendlyError</span>.</p>
<p>Com o FriendlyError você poderá mostrar três níveis de erro para o seu usuário: message, warning e error (mensagem, aviso e erro, respectivamente).</p>
<p>Seu uso consiste da definição, no controle, da mensagem a ser exibida, e sua captura para exibição, na view.</p>
<p>Exemplo:<br />
controle</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php">try<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// ...</span>
<span style="color: #66cc66;">&#125;</span> catch <span style="color: #66cc66;">&#40;</span>Exception <span style="color: #0000ff;">$e</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">FriendlyError</span>-&gt;<span style="color: #006600;">setError</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$e</span>-&gt;<span style="color: #006600;">getMessage</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>view</p>

<div class="wp_syntax"><div class="code"><pre class="php">setError<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #66cc66;">&#41;</span>; ?&amp;gt;</pre></div></div>

<p>e teremos um resultado assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="html4strict"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;errors&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;friendly_error&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    Ocorreu um erro no sistema!</pre></td></tr></table></div>

<p>Para a utilização do FriendlyError você deve fazer alguns ajustes na sua aplicação. O primeiro é indicar o uso do componente e do helper nas variáveis <span style="font-style: italic">$components</span> e <span style="font-style: italic">$helpers</span> do seu controller. O segundo é copiar o elemento <span style="font-style: italic">friendly_error.ctp</span> para a sua pasta de componentes. Se precisar, pode modificar a forma como o elemento exibe os erros.</p>
<p>Feito isso, basta utilizar o componente no seu controller. Os métodos possíveis são <span style="font-style: italic">setMessage(),</span> <span style="font-style: italic">setError()</span> e <span style="font-style: italic">setWarning().</span> Eles não são declarados no componente, mas são interpretados pelo método <span style="font-style: italic">__call()</span> (PHP5).</p>
<p>Se precisar de mostrar outras mensagens você poderá utilizar os outros argumentos <span style="font-style: italic">($error_array,</span> <span style="font-style: italic">$warning_array</span> e <span style="font-style: italic">$message_array)</span> do método <span style="font-style: italic">setError()</span> do helper para poder exibir suas mensagens junto com as mensagens que estavam na sessão.</p>
<p>O FriendlyError é compatível apenas com o PHP5.</p>
<p>Download: <a href="http://charlesschaefer.net/projetos/cakephp/friendly_error/files/friendly_error.tar.gz"> http://charlesschaefer.net/projetos/cakephp/friendly_error/files/friendly_error.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=8</wfw:commentRss>
		</item>
		<item>
		<title>Frameworks</title>
		<link>http://charlesschaefer.net/blog/?p=7</link>
		<comments>http://charlesschaefer.net/blog/?p=7#comments</comments>
		<pubDate>Sat, 03 Mar 2007 17:17:00 +0000</pubDate>
		<dc:creator>charles</dc:creator>
		
		<category><![CDATA[Framework]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://charlesschaefer.net/blog/?p=7</guid>
		<description><![CDATA[O mundo dos programadores é cercado de palavrinhas estranhas desde o começo da carreira. Para programadores autodidatas (como eu), muitas vezes, entender estas palavrinhas é uma tarefa um tanto quanto difícil, principalmente quando não se acha uma definição para elas no seu dicionário, que nunca o havia deixado na mão (até então) :p

Ultimamente tem-se falado [...]]]></description>
			<content:encoded><![CDATA[<p class="western" style="margin-bottom: 0cm; font-family: verdana;">O mundo dos programadores é cercado de palavrinhas estranhas desde o começo da carreira. Para programadores autodidatas (como eu), muitas vezes, entender estas palavrinhas é uma tarefa um tanto quanto difícil, principalmente quando não se acha uma definição para elas no seu dicionário, que nunca o havia deixado na mão (até então) :p</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Ultimamente tem-se falado muito em utilização de frameworks. Frameworks para desenvolvimento em <a href="http://cakephp.org/">PHP</a>, em <a href="http://jquery.com/">javascript</a> e para <a href="http://www.xajaxproject.org/">ambos</a> ao mesmo tempo; frameworks baseados no padrão <a href="http://www.google.com.br/url?sa=X&#038;start=4&amp;amp;amp;amp;amp;amp;oi=define&#038;q=http://en.wikipedia.org/wiki/MVC&amp;usg=__-Lf-cY2R8DcBCIY7o0RZok0LnS0=">MVC</a>, frameworks com <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> (Object Relational Mapping – essa faz parte de um outro mundo obscuro na programação: as siglas), <a href="http://en.wikipedia.org/wiki/Active_Record">Active Record</a>, etc.</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Mas afinal de contas, o que diabos é um framework?</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Joãozinho: Hum, ham, é um conjunto de classes que resolvem cada uma um problema específico, evitando assim que o programador escreva muitos códigos?</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Aeh Joãozinho, finalmente algo que presta hein!</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Mas hoje em dia, um framework tornou-se mais do que uma série de classes que nos ajudam a resolver um problema específico. Um framework hoje, mais do que ajudar a resolver problemas, dita uma forma específica, padronizada de resolvê-los.  </p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Assim o programador pode se desligar das decisões de como uma determinada tarefa será aplicada, como realizar o acesso aos dados, de que forma exibir estes dados, etc. Tudo o que o programador precisa saber é como resolver o seu problema. O resto, é por conta do framework.  </p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Nos dias atuais, onde o tempo controla a vida das pessoas e das organizações, qualquer que seja a ajuda para poupar tempo será bem-vinda. Não poderia ser diferente com os frameworks. Desenvolvedores de todas as partes do mundo discutem diariamente sobre o uso de frameworks, qual usar, por quê usar, por quê não, quando usar, etc. E estas discussões estão muitas vezes pautadas nas reuniões para implementação de projetos dentro das empresas também.  </p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">As organizações precisam poupar o máximo de tempo, mesmo que para isso, as vezes, seja necessário se perder um pouco do desempenho dos sistemas que se desenvolve. E é essa a tarefa de um bom framework: poupar o máximo de tempo possível de um programador.  </p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_mdkUsC0426w/Rem1NUTLLbI/AAAAAAAAAAM/ICceJazmaM8/s1600-h/framework.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_mdkUsC0426w/Rem1NUTLLbI/AAAAAAAAAAM/ICceJazmaM8/s200/framework.png" alt="" id="BLOGGER_PHOTO_ID_5037756898582670770" border="0" /></a></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Mas nem sempre os frameworks irão realizar com sucesso a sua árdua tarefa, principalmente se forem mal escolhidos para determinado projeto. É necessário saber com precisão o que será necessário desenvolver para saber a quem/que recorrer. Além disso é necessário saber também as peculiaridades de cada framework disponível no mercado (ou pelo menos os mais famosos) para conseguir prever os problemas oriundos da adoção deste framework, conseguindo assim subsídios suficientes para a escolha do melhor.</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Para nós, programadores PHP, há uma infinidade de frameworks. Eu, particularmente, recomendo os baseados no Ruby on Rails, framework para Ruby que “revolucionou” a forma como se programa para a web. O que mais me agrada é o CakePHP, mas temos ainda o Symphony, o Zend Framework, o PHP on TRAX, entre outros facilmente <a href="http://www.google.com.br/search?q=framework+php">encontráveis pelo google</a>.</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Para você que precisa decidir qual deles escolher, este link pode ser de grande ajuda: <a href="http://www.phpit.net/article/ten-different-php-frameworks/">http://www.phpit.net/article/ten-different-php-frameworks/</a>.</p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;">Ele possui uma tabela comparativa com as características de alguns frameworks para PHP disponíveis no mercado.</p>
<p>
<p class="western" style="margin-bottom: 0cm; font-family: verdana;"></p>
<p>Até a próxima!
<div class="blogger-post-footer">Acompanhe o resto pelo blog&#8230;</div>
]]></content:encoded>
			<wfw:commentRss>http://charlesschaefer.net/blog/?feed=rss2&amp;p=7</wfw:commentRss>
		</item>
	</channel>
</rss>
