<?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/"
		xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>PHPSP.org.br &#187; Des-sobrinhação</title>
	<atom:link href="http://phpsp.org.br/category/artigos/des-sobrinhacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://phpsp.org.br</link>
	<description>Grupo de Desenvolvedores de PHP de São Paulo</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:08:17 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<copyright>2006-2009 </copyright>
	<managingEditor>admin@phpsp.org.br (PHPSP.org.br)</managingEditor>
	<webMaster>admin@phpsp.org.br (PHPSP.org.br)</webMaster>
	<category>php</category>
	<ttl>1440</ttl>
	<image>
		<url>http://phpsp.org.br/wp-content/uploads/2009/03/phpspcast-cover-art-144x144.gif</url>
		<title>PHPSP.org.br</title>
		<link>http://phpsp.org.br</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle>PHP à Paulista!</itunes:subtitle>
	<itunes:summary>Um podcast bem humorado sobre PHP e assuntos relacionados. Baseado no PHPSP, em cada episódio do Podcast são reunidos convidados novos para conversar sobre um assunto relacionado ao PHP de forma descontraida e informativa.</itunes:summary>
	<itunes:keywords>php, phpsp, brasil</itunes:keywords>
	<itunes:category text="Technology" />
	<itunes:category text="Technology">
		<itunes:category text="Software How-To" />
	</itunes:category>
	<itunes:category text="Technology">
		<itunes:category text="Podcasting" />
	</itunes:category>
	<itunes:author>PHPSP.org.br</itunes:author>
	<itunes:owner>
		<itunes:name>PHPSP.org.br</itunes:name>
		<itunes:email>admin@phpsp.org.br</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://phpsp.org.br/wp-content/uploads/2009/03/phpspcast-coverart-generic.png" />
		<item>
		<title>Autenticação e Criptografia de Senhas</title>
		<link>http://phpsp.org.br/2011/01/autenticacao-e-criptografia-de-senhas/</link>
		<comments>http://phpsp.org.br/2011/01/autenticacao-e-criptografia-de-senhas/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 18:47:02 +0000</pubDate>
		<dc:creator>Rubens Takiguti Ribeiro</dc:creator>
				<category><![CDATA[Artigos de Convidados]]></category>
		<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[criptografia]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=1676</guid>
		<description><![CDATA[Este artigo apresenta algumas formas de criptografia de senhas em sistemas de informação baseados em PHP.]]></description>
			<content:encoded><![CDATA[<p>É comum que sistemas de informações utilizem um mecanismo de  autenticação para acesso às ferramentas restritas através de um login e  senha. Por questões de confidencialidade e segurança, é comum, também,  que as senhas fiquem guardadas de forma criptografada no banco de dados.  Os algoritmos de criptografia usados para estes casos são aqueles de  via única (unidirecional), ou seja, que não permitem que um valor  codificado seja descriptografado facilmente. O nome dado a um valor  criptografado também é chamado de &#8220;hash&#8221;.</p>
<p>PHP oferece diferentes alternativas para criptografar uma senha. Cada  uma delas pode ter suas peculiaridades na hora de se montar o mecanismo  de autenticação. Vejamos algumas das principais funções usadas para  criptografia de senhas:</p>
<ul>
<li><tt><a href="#funcao_md5">md5</a></tt> &#8211; Gera uma sequência binária de 16 bytes (ou 32 símbolos hexadecimais)</li>
<li><tt><a href="#funcao_sha1">sha1</a></tt> &#8211; Gera uma sequência binária de 20 bytes (ou 40 símbolos hexadecimais)</li>
<li><tt><a href="#funcao_crypt">crypt</a></tt> &#8211; Gera um hash de acordo com um algum algoritmo escolhido (poucas opções)</li>
<li><tt><a href="#modulo_hash">hash</a></tt> &#8211; Módulo que oferece diferentes algoritmos de criptografia (para saber os disponíveis, basta usar <tt>hash_algos</tt>)</li>
<li><tt><a href="#modulo_mcrypt">mcrypt</a></tt> &#8211; Módulo que oferece diferentes algoritmos de codificação/decodificação (para saber os disponíveis, basta usar <tt>mcrypt_list_algorithms</tt>)</li>
<li><tt><a href="#modulo_mhash">mhash</a></tt> &#8211; Módulo obsoleto por <tt>hash</tt>.</li>
</ul>
<hr />
<div>
<h3 id="funcao_md5">MD5</h3>
<p>Esta função é nativa do PHP e gera uma sequência binária de 16 bytes  ou 32 símbolos hexadecimais. O uso é simples, basta passar o texto a ser  codificado e se deseja obter o retorno na forma binária. Por padrão é  retornado uma sequência hexadecimal, que é mais conveniente de se  guardar em um banco de dados.</p>
<pre>$hash_hex = md5('teste'); // Gera 698dc19d489c4e4db73e28a713eab07b
$hash_bin = md5('teste', true); // Gera 16 bytes (inclusive não imprimíveis)</pre>
<p>Para testar se uma senha digitada é igual à senha criptografada no  BD, basta criptografar a senha informada e comparar as duas  criptografadas. Afinal, uma sequência sempre gera o mesmo resultado  criptografado.</p>
<pre>$senha_codificada_bd = $dados_bd['senha']; // exemplo de senha obtida do BD
$senha_codificada_informada = md5($_POST['senha']);

if ($senha_codificada_bd == $senha_codificada_informada) {
    // As senhas sao compativeis
}</pre>
<p>Observação: Como o hash gerado por MD5 tem tamanho fixo, é óbvio que  existem infinitas sequências textuais que produzem o mesmo hash. Porém,  isso não é tão crítico, pois encontrar duas sequências que geram o mesmo  hash é algo bastante incomum, especialmente entre senhas que envolvem  apenas caracteres imprimíveis.</p>
</div>
<hr />
<div>
<h3 id="funcao_sha1">SHA1</h3>
<p>Esta função é semelhante à MD5 (mesmos parâmetros), porém, o  algoritmo gera uma sequência binária de 20 bytes ou 40 símbolos  hexadecimais. Por padrão é retornado uma sequência hexadecimal.</p>
<pre>$hash_hex = sha1('teste'); // Gera 2e6f9b0d5885b6010f9167787445617f553a735f
$hash_bin = sha1('teste', true); // Gera 20 bytes (inclusive não imprimíveis)</pre>
<p>Para testar se uma senha digitada é igual à senha criptografada no BD, basta seguir a mesma ideia apresentada em MD5.</p>
</div>
<hr />
<div>
<h3 id="funcao_crypt">Crypt</h3>
<p>A função <tt>crypt</tt> também é nativa do PHP, mas, diferente de <tt>md5</tt> e <tt>sha1</tt>,  é genérica, pois pode-se especificar qual algoritmo a ser usado. A  função recebe uma string a ser codificada e, opcionalmente, um sal. O  &#8220;sal&#8221; é uma sequência aleatória usada como base para codificar outra  sequência. A ideia é que utilizando o mesmo sal para codificar o mesmo  texto, obtenha-se o mesmo valor. Mas usando um sal diferente para  codificar o mesmo texto, pode-se obter resultados diferentes.</p>
<p>A função crypt varia o seu funcionamento de acordo com o sal informado:</p>
<ul>
<li>CRYPT_STD_DES &#8211; Sal de 2 caracteres alfa-numéricos;</li>
<li>CRYPT_EXT_DES &#8211; Sal de 9 caracteres, sendo: 1 underscore + 4 bytes  (indicando o número de iterações) + 4 bytes alfa-numéricos (sal  propriamente dito)</li>
<li>CRYPT_MD5 &#8211; Sal de 12 caracteres, sendo: iniciado em &#8220;$1$&#8221; + 8 bytes (sal) + final &#8220;$&#8221;</li>
<li>CRYPT_BLOWFISH &#8211; Sal iniciado em &#8220;$2a$&#8221; + 2 dígitos (custo) +  símbolo &#8220;$&#8221; + 21 bytes alfa-numéricos ou &#8220;.&#8221; ou &#8220;/&#8221; (sal) + final &#8220;$&#8221;</li>
<li>CRYPT_SHA256 &#8211; Sal de 16 caracteres, sendo: iniciado em &#8220;$5$&#8221; + 12 bytes (sal) + final &#8220;$&#8221;</li>
<li>CRYPT_SHA512 &#8211; Sal de 20 caracteres, sendo: iniciado em &#8220;$6$&#8221; + 16 bytes (sal) + final &#8220;$&#8221;</li>
</ul>
<p>Exemplo de uso:</p>
<pre>$hash_md5 = crypt('teste', '$1$abcdefgh$');
// Gera $1$abcdefgh$DYdsp/CvdHfTi6XSCsPdg.</pre>
<p>Observe que o valor codificado também tem como prefixo o próprio sal.  Caso este valor codificado é usado como sal da função novamente, ela  recupera apenas o sal, ignorando o valor codificado:</p>
<pre>$hash_md5 = crypt('teste', '$1$abcdefgh$DYdsp/CvdHfTi6XSCsPdg.');
// Tambem gera $1$abcdefgh$DYdsp/CvdHfTi6XSCsPdg.</pre>
<p>Portanto, para checar se uma senha codificada no BD é (provavelmente) a mesma que uma informada pelo usuário, basta fazer:</p>
<pre>$senha_codificada_bd = $dados_bd['senha']; // exemplo de senha obtida do BD
$senha_codificada_informada = crypt($_POST['senha'], $senha_codificada_bd);

if ($senha_codificada_bd == $senha_codificada_informada) {
    // As senhas sao compativeis
}</pre>
<p>Observação: em algumas versões antigas do PHP, esta função dependia  dos recursos do sistema operacional. A partir da versão 5.3.0, o próprio  PHP possui sua própria implementação destes recursos e não depende do  sistema.</p>
</div>
<hr />
<div>
<h3 id="modulo_hash">Hash</h3>
<p>O módulo <tt>hash</tt> era um módulo pecl, mas passou a fazer parte  do PHP na versão 5.1.2. Ele também é genérico, pois pode-se informar  qual o algoritmo de codificação a ser usado. Para saber os algoritmos  suportados, basta usar a função <tt>hash_algos</tt>, que devolve um vetor com os nomes dos algoritmos. Para usar a função <tt>hash</tt>,  basta passar no primeiro parâmetro o nome do algoritmo a ser usado, no  segundo o valor a ser codificado, e no terceiro o tipo de saída (binário  ou hexadecimal).</p>
<p>Exemplo:</p>
<pre>$hash_md5 = hash('md5', 'teste', false); // Gera 698dc19d489c4e4db73e28a713eab07b
$hash_md5 = hash('md5', 'teste', true); // Gera 16 bytes (inclusive não imprimíveis)</pre>
<p>A vantagem deste módulo em relação aos demais é que o algoritmo é  informado por parâmetro, logo, pode ser informado dinamicamente, com o  valor armazenado em algum lugar.</p>
<p>Além de <tt>hash</tt>, existem outras funções no módulo, como a função <tt>hash_hmac</tt>, que recebe também uma chave de codificação (como um sal), e utiliza o algoritmo HMAC.</p>
<p>Exemplo:</p>
<pre>$hash_md5 = hash_hmac('md5', 'teste', 'chave', false); // Gera d1c9c8e42bb681e024dd07ae91aeeb4a</pre>
<p>Note que, diferente de <tt>crypt</tt>, a função <tt>hash_hmac</tt> não embute a chave (sal) no valor codificado, logo, ele não pode ser usado como parâmetro.</p>
</div>
<hr />
<div>
<h3 id="modulo_mcrypt">Mcrypt</h3>
<p>O módulo <tt>mcrypt</tt> suporta vários mecanismos de codificação/decodificação. As principais funções são a <tt>mcrypt_generic</tt> e a <tt>mdcrypt_generic</tt>,  que recebem um resource com o mecanismo de codificação/decodificação e o  valor a ser codificado/decodificado. O resource é criado pela função <tt>mcrypt_module_open</tt> e manipulado por outras funções.</p>
<p>Um exemplo de uso pode ser visto no link: <a href="http://php.net/manual/en/function.mcrypt-module-open.php">http://br2.php.net/manual/en/function.mcrypt-module-open.php</a></p>
</div>
<hr />
<div>
<h3 id="modulo_mhash">Mhash</h3>
<p>Este módulo está obsoleto pelo módulo <tt>hash</tt>. No PHP 5.3.0, as funções deste módulo são emuladas pelas funções do módulo <tt>hash</tt>. É melhor usar o módulo <tt>hash</tt> diretamente.</p>
<p>A principal função do módulo é <tt>mhash</tt>, que recebe o  algoritmo, o valor a ser codificado e a chave HMAC (caso deseja-se  utilizar o algoritmo HMAC). O valor retornado é hexadecimal.</p>
<p>Exemplo:</p>
<pre>$hash_md5 = mhash(MHASH_MD5, 'teste'); // Gera 698dc19d489c4e4db73e28a713eab07b
$hash_md5_hmac = mhash(MHASH_MD5, 'teste', 'chave'); // Gera d1c9c8e42bb681e024dd07ae91aeeb4a</pre>
</div>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/ec30dacab0388115907eb369308ea6e1?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/rubs33/' title='Rubens Takiguti Ribeiro'>Rubens Takiguti Ribeiro</a></h3><p></p><p><a href='http://www.rubsphp.blogspot.com/' title='Rubens Takiguti Ribeiro'>Website</a> - <a href='http://phpsp.org.br/author/rubs33/' title='More posts by Rubens Takiguti Ribeiro'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2011/01/autenticacao-e-criptografia-de-senhas/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Salvem os bebês foca: Espaços duplicados</title>
		<link>http://phpsp.org.br/2010/10/salvem-os-bebes-foca-espacos-duplicados/</link>
		<comments>http://phpsp.org.br/2010/10/salvem-os-bebes-foca-espacos-duplicados/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 20:14:10 +0000</pubDate>
		<dc:creator>Augusto Pascutti</dc:creator>
				<category><![CDATA[Des-sobrinhação]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=1521</guid>
		<description><![CDATA[Programar pode ser uma tarefa árdua ou gratificante e geralmente isso está relacionado com o tipo de código que você está mexendo. Existem vários tipos de código, mas o mais repulsivo sempre é o Spaguetti: uma maçaroca generalizada de todas as coisas, páginas que ultrapassam as milhares de linhas geralmente codificadas por pessoas que não [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignright" style="width: 298px"><img class="  " title="Bebê Foca" src="http://www.freewallpapers.com.br/800/wallpaper415127000.jpg" alt="Bebê Foca" width="288" height="216" /><p class="wp-caption-text">Bebê Foca</p></div>
<p>Programar pode ser uma tarefa árdua ou gratificante e geralmente isso está relacionado com o tipo de código que você está mexendo. Existem vários tipos de código, mas o mais repulsivo sempre é o Spaguetti: uma maçaroca generalizada de todas as coisas, páginas que ultrapassam as milhares de linhas geralmente codificadas por pessoas que não acreditam no uso de funções e boas práticas de desenvolvimento (não vou nem cogitar Orientação a Objetos).</p>
<p>Agora, existem também os desenvolveres sobrinhos criativos. Eles se esforçam (ou não) mas acabam por não chegar lá, falhando miseravelmente em sua tentativa frustrada de resolver um problema. Na verdade eles resolvem, não o problema em si mas o resultado do problema e quando isso acontece, um inocente bebê foca é morto violentamente por uma facção de desenvolvedores xiitas.</p>
<h2>O problema</h2>
<p>É incrível como podemos sempre contar com os usuários. Existe uma síndrome constante que se espalha como praga no mundo: espaços duplos. Não sei o porquê disso, mas é incrível como sempre precisamos tratar espaços duplicados dentro das nossas aplicações a fim de não quebrar o layout ou ferrar com todo o design imaculado de um portal.</p>
<p>Vamos a primeira tentativa do nosso querido amigo:</p>
<pre class="brush: php; title: ; notranslate">
function remover_espacos_duplos($texto) {
    $texto = str_replace(&quot;   &quot;,&quot; &quot;, $texto);
    $texto = str_replace(&quot;  &quot;,&quot; &quot;, $texto);
    return $texto;
}
</pre>
<p>Com o tempo nosso sobrinho percebeu que poderiam haver mais que dois ou três espaços e que essa função não era a solução pro problema. Não demorou e surgiu a versão 2.0 da função:</p>
<pre class="brush: php; title: ; notranslate">
function remover_espacos_duplos($texto) {
    $espacos = array(&quot;     &quot;,&quot;    &quot;,&quot;   &quot;,&quot;  &quot;);
    foreach ( $espacos as $espaco ) {
        if ( strpos($texto, $espaco) !== false ) {
            $texto = str_replace($espaco, ' ', $texto);
        }
    }
    return $texto;
}
</pre>
<p>Há! Bem melhor agora! Agora ela contempla até 5 espaços consecutivos. Já imaginou quando alguém colocar 20 espaços consecutivos? Como será que nosso amiguinho iria resolver? Que Deus proteja os bebês foca.</p>
<h2>A solução</h2>
<p>Para evitar que o pessoal copie as funções acima sem ler o post e consequentemente entender que se trata de uma brincadeira e de como não resolver o problema, vamos sempre propor uma solução, e pra esta a melhor é:</p>
<pre class="brush: php; title: ; notranslate">
function remover_espacos_duplos($texto) {
    return preg_replace('/\s\s+/', ' ', $texto);
}
</pre>
<h2>Ajude a salvar bebês foca</h2>
<p>Nos envie algum código de sobrinho que você achou por aí. Não precisamos de nomes, mas uma história é sempre interessante. Envie um email para sobrinhagem@phpsp.org.br</p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/89de242e444d231e9928320af0417571?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/augusto/' title='Augusto Pascutti'>Augusto Pascutti</a></h3><p>Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.</p><p><a href='http://www.augustopascutti.com' title='Augusto Pascutti'>Website</a> - <a href='http://phpsp.org.br/author/augusto/' title='More posts by Augusto Pascutti'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2010/10/salvem-os-bebes-foca-espacos-duplicados/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Seminário PHP 2009</title>
		<link>http://phpsp.org.br/2009/08/seminario-php-2009/</link>
		<comments>http://phpsp.org.br/2009/08/seminario-php-2009/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 13:23:16 +0000</pubDate>
		<dc:creator>Rafael Dohms</dc:creator>
				<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[Palestras e Seminários]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php53]]></category>
		<category><![CDATA[PHPSP]]></category>
		<category><![CDATA[seminariophp]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=840</guid>
		<description><![CDATA[O PHPSP esta preparando grandes surpresas para a comunidade neste final de ano. Nosso primeiro passo confirmado é o Seminário PHP que acontece no dia 31/Outubro. O Seminário PHP é realizado pela Tempo Real Eventos com o apoio do PHPSP para montar o seu conteúdo. A coordenação do grupo se reuniu e definimos que o [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://phpsp.org.br/wp-content/uploads/2009/08/logophphome.jpg"><img class="alignright size-full wp-image-847" title="Seminário PHP 2009" src="http://phpsp.org.br/wp-content/uploads/2009/08/logophphome.jpg" alt="Seminário PHP 2009" /></a></p>
<p>O PHPSP esta preparando grandes surpresas para a comunidade neste final de ano. Nosso primeiro passo confirmado é o <a title="4 Seminário PHP" href="http://www.temporealeventos.com.br/?area=75" target="_blank">Seminário PHP</a> que acontece no dia <strong>31/Outubro</strong>.</p>
<p>O <a href="http://www.temporealeventos.com.br/?area=75"><strong>Seminário PHP</strong></a> é realizado pela Tempo Real Eventos com o apoio do <strong>PHPSP</strong> para montar o seu conteúdo. A coordenação do grupo se reuniu e definimos que o tópico ideal para o evento seria a profissionalização do desenvolvedor PHP, ou como falamos por aqui, a Des-Sobrinhação. Portanto o foco do evento é apresentar técnicas, formas de pensar, estratégias de carreira e novidades sobre o PHP.</p>
<p>Participando deste evento você poderá levar a sua carreira a um novo patamar, melhorando seu ambiente de trabalho com novas tecnicas que facilitam o trabalho em equipe e se destacar profissionalmente, abrindo caminho para novas experiências profissionais.</p>
<p>Nosso grupo de palestrantes é formado por grandes nomes da comunidade e pessoas que construíram suas carreiras utilizando o PHP. <strong>Rafael Dohms</strong> e <strong>Augusto Pascutti</strong> são coordenadores do PHPSP e possuem vasta experiência em contribuir com projetos open source como o Habari, PHP e outros, além de serem hosts do PHPSPCast. <strong>Guilherme Blanco</strong> se destaca ainda mais na comunidade por ser contribuidor do Doctrine, um sistema de ORM excelente para o PHP, além de já ser palestrante de carteira carimbada em grandes eventos de PHP no Brasil. <strong>Alex Piaz</strong> também possui um grande histórico de participação em projetos Open Source e se destaca pela evolução que causou no ISA com o seu conhecimento de ambientes e equipes.</p>
<p>Com essa equipe de &#8220;heróis&#8221; o evento passará por palestras de carreira, PHP 5.3, boas práticas e ambientes de desenvolvimento, com certeza uma grande contribuição para quem quer dar o próximo passo em sua carreira.</p>
<p><strong>A <a href="http://www.temporealeventos.com.br/?area=75&amp;tipo=1&amp;id=1704">pré-inscrição</a> no <a href="http://www.temporealeventos.com.br/?area=75">evento</a> custa apenas </strong><strong>R$ 79,00 e se prolonga até o dia </strong><strong>19/Setembro</strong>. Este evento não segue o formato de eventos do PHPSP, pois estamos apenas realizando o conteúdo do evento. Mas não deixe de participar por isso, parte do dinheiro da inscrição será repassada ao PHPSP e convertido em benefícios para a comunidade, como a <em>confecção de camisetas, canecas, coffee breaks nos eventos e muito mais</em>, tudo isto será apresentado à comunidade de forma transparente com uma prestação de contas online, contribua para o grupo!</p>
<p>Se quiser saber mais sobre o conteúdo do evento, aguarde o lançamento do <strong>PHPSPCast #3</strong> em breve, nele reunimos parte desta equipe de palestrantes e conversamos sobre diversos fatores de uma carreira profissional.</p>
<p>Esperamos que todos possam <a href="http://www.temporealeventos.com.br/?area=75&amp;tipo=1&amp;id=1704">participar do evento</a> e que ele traga uma luz a todos que querem construir uma carreira com tijolos de PHP e melhorar seus ambientes de trabalho para melhorar ainda mais seu trabalho. E aguardem pois temos mais novidades a caminho, fiquem de olho no blog.</p>
<p><strong>Coordenação PHPSP</strong></p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/4c678b5f99c982a1acf01be4b37efb8d?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/rdohms/' title='Rafael Dohms'>Rafael Dohms</a></h3><p>Rafael Dohms é um Evangelista PHP e membro ativo da Comunidade PHP. Ele ajudou na fundação de dois Grupos de Usuários de PHP ao longo do tempo e hoje compatilha a coordenação do PHPSP. Desenvolvedor, gamer e apaixonado por código ele também é host do primeiro podcast de PHP do Brasil: PHPSPCast.

Atualmente ele trabalha na equipe SWAT do grupo MIH, uma equipe de experts que fornecem conhecimento técnico para o grupo além de trabalhar com P&amp;D buscando novos nichos da internet e tecnologia. Seu papel como Desenvolvedor Sênior é codar, treinar e auxiliar outras empresas e se divertir enquanto faz isso.</p><p><a href='http://www.rafaeldohms.com.br' title='Rafael Dohms'>Website</a> - <a href='http://www.twitter.com/rdohms' title='Rafael Dohmson Twitter'>Twitter</a> - <a href='http://phpsp.org.br/author/rdohms/' title='More posts by Rafael Dohms'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2009/08/seminario-php-2009/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Late Static Binding e o PHP 5.3</title>
		<link>http://phpsp.org.br/2009/05/late-static-binding-e-o-php-53/</link>
		<comments>http://phpsp.org.br/2009/05/late-static-binding-e-o-php-53/#comments</comments>
		<pubDate>Tue, 19 May 2009 15:37:11 +0000</pubDate>
		<dc:creator>Augusto Pascutti</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php 5.3]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=465</guid>
		<description><![CDATA[Foi lançado a alguns dias a RC2 (release candidate 2) da nova major version do PHP, a versão 5.3. Em alguns dias o PHPSPCast sobre PHP 5.3 deve ir ao ar, mas enquanto ele não chega, vamos entender um pouco mais sobre o problema de Late Static Binding que foi resolvido no PHP 5.3. O [...]]]></description>
			<content:encoded><![CDATA[<p>Foi lançado a alguns dias a RC2 (release candidate 2) da nova major version do PHP, a versão 5.3. Em alguns dias o PHPSPCast sobre PHP 5.3 deve ir ao ar, mas enquanto ele não chega, vamos entender um pouco mais sobre o problema de Late Static Binding que foi resolvido no PHP 5.3.</p>
<p><strong>O Problema</strong></p>
<p>Eu já tentei explicar conceitualmente, mas, sinceramente? Ninguém entendeu (comigo incluso). Então vamos pra prática. Vamos supor que tenhamos as duas classes abaixo:</p>
<p><code><br />
</code></p>
<pre class="brush: php; title: ; notranslate">
class User {
public static function getTipo() {
return 'user';
}

public static function showTipo() {
echo self::getTipo();
}
}

class Admin extends User {
public static function getTipo() {
return 'admin';
}
}

Admin::showTipo(); // imprime: 'user'
</pre>
<p><span id="more-465"></span></p>
<p>A linha 17 do código acima deveria retornar &#8216;admin&#8217; e não &#8216;user&#8217; como foi retornado. Esse seria o comportamente esperado.  O problema é a palavra reservada self não resolve a chamada estática, assim como a contante __CLASS__ que se for usada, também retorna a classe errada. Ambos não resolvem a chamada em tempo de execução, eles somente verificam ondem foram declaradas e retornam isso.</p>
<p><strong>A solução</strong></p>
<p>A solução não é nenhuma mágica, ou seja, o código não se resolverá sozinho. Quem sabe um dia? A partir da versão 5.3 que será lançada este ano, você poderá usar uma palavra reservada do PHP (que não é nova) e ela &#8211; ao contrário do self &#8211; irá resolver a chamada em tempo de execução e retornará os valores corretos. A palavra é: static. Sugestivo não?</p>
<p><code><br />
</code></p>
<pre class="brush: php; title: ; notranslate">
class User {
public static function getTipo() {
return 'user';
}

public static function showTipo() {
echo static::getTipo();
}
}

class Admin extends User {
public static function getTipo() {
return 'admin';
}
}

Admin::showTipo(); // imprime: 'admin' (PHP 5.3)
</pre>
<p>Com a troca do <em>self</em> pelo <em>static</em>, o PHP consegue resolver a classe que chamou o método e retornar o valor correto.</p>
<p><strong>O problema (A revolta dos que não foram)</strong></p>
<p>Magicamente, a solução no PHP 5.3 apresenta um (pasme) novo problema. Antes tínhamos o problema (Late Static Binding) de que o PHP não resolvia a classe que chamava o método, o PHP só via em chamadas estáticas o local onde ele foi declarado. Agora nosso problema passa a ser que o PHP não consegue mais ver corretamente chamadas de classes pai, veja o código abaixo e tire suas próprias conclusões.</p>
<p><code><br />
</code></p>
<pre class="brush: php; title: ; notranslate">
class User {
public static function getTipo() {
return 'user';
}

public static function showTipo() {
echo static::getTipo();
}
}

class Moderador extends User {
public static function getTipo() {
return 'mod';
}

public static function norris() {
User::showTipo();
parent::showTipo();
self::showTipo();
}
}

class Admin extends Moderador {
public static function getTipo() {
return 'admin';
}
}

Admin::norris();
/**
* Imprime
* user
* admin
* admin
*/
</pre>
<p>Enfim, o PHP 5.3 está chegando com grandes mudanças, é importante ressaltar que esta é uma <em>major release</em> e que muitas coisas devem ser levadas em consideração. O PHP já possui release candidates para você testar, então se você ainda não testou o que está esperando? Se você puder ainda compilar, não esqueça de rodar um <em>`make test`</em> e enviar os dados para o <em>http://qa.php.net/</em> para que suas estátisticas dos testes efetuados sejam computados; só isso já é uma contribuição para o projeto. Aguardem essa semana o PHPSPCast sobre as novidades do PHP 5.3, e logicamente, vão se preparando para ele.</p>
<p>A documentação do PHP sobre a implementação de Late Static Binding já existe, inclusive em português e pode ser vista aqui: <a href="http://br2.php.net/manual/pt_BR/language.oop5.late-static-bindings.php" target="_blank">http://br2.php.net/manual/pt_BR/language.oop5.late-static-bindings.php</a></p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/89de242e444d231e9928320af0417571?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/augusto/' title='Augusto Pascutti'>Augusto Pascutti</a></h3><p>Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.</p><p><a href='http://www.augustopascutti.com' title='Augusto Pascutti'>Website</a> - <a href='http://phpsp.org.br/author/augusto/' title='More posts by Augusto Pascutti'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2009/05/late-static-binding-e-o-php-53/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Análise de performance</title>
		<link>http://phpsp.org.br/2009/05/analise-de-performance/</link>
		<comments>http://phpsp.org.br/2009/05/analise-de-performance/#comments</comments>
		<pubDate>Mon, 04 May 2009 02:00:02 +0000</pubDate>
		<dc:creator>Augusto Pascutti</dc:creator>
				<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=363</guid>
		<description><![CDATA[Me perguntaram como realmente se pode medir o desempenho de uma aplicação PHP, que tipo de classe ou ferramenta eu utilizava para fazer isso, foi então que uma pessoa me mostrou um artigo encontrado em um site respeitável na internet: Benchmarking de Aplicações PHP. Eu não canso de ficar &#8220;de cabelo em pé&#8221; com as [...]]]></description>
			<content:encoded><![CDATA[<p>Me perguntaram como realmente se pode medir o desempenho de uma aplicação PHP, que tipo de classe ou ferramenta eu utilizava para fazer isso, foi então que uma pessoa me mostrou um artigo encontrado em um site <span style="text-decoration: line-through;">respeitável</span> na internet: <a href="http://imasters.uol.com.br/artigo/11798/php/benchmarking_de_desempenho_no_php/" target="_blank">Benchmarking de Aplicações PHP</a>.</p>
<p>Eu não canso de ficar &#8220;de cabelo em pé&#8221; com as coisas que eu leio, principalmente na internet. Uma coisa que devemos aprender é a questionar as coisas que lemos, a internet é de domínio público. Eu posso &#8211; por exemplo &#8211; escrever um artigo sobre como fazer inseminação artificial! Seria tão ruim quanto o artigo que eu citei?! Difícil&#8230;</p>
<p>Vamos aos fatos. Nosso mundo é o mundo do desenvolvimento! Pro inferno com a fábrica da Coca-Cola, de Dadinhos de Amendoim e de Muppy. Quase nada que é válido pra eles é válido para o &#8220;nosso mundo&#8221;, por que insistir em querer replicar coisas que funcionam na administração de empresas em desenvolvimento de software? A resposta é simples: é muito mais fácil repetir do que pensar! Vamos analisar todos os erros do artigo, e ver como realmente medir a performance de uma aplicação.<span id="more-363"></span></p>
<p><strong>Profiling x Benchmark</strong></p>
<p>O ato de medir a performance de uma aplicação é conhecido como profiling, já benchmark é utilizado para medir a performance relativa da aplicação. benchmark é utilizado para medir o desempenho de uma aplicação em diferentes ambientes, fazem isso através de testes genéricos pré-definidos e os dados que resultam dos testes não dizem nada a respeito da aplicação, eles só são úteis se você possui outros resultados para usar de base de comparação.</p>
<p>Já o resultado de um profiling é absoluto. Através deste resultado você sabe em que parte do seu código estão os gargalos e os possíveis gargalos futuros. Quando se está analisando problemas de performance, o profiling é a base de todas as ações que você vai tomar enquanto que o benchmak existe para resolver problemas mais específicos.</p>
<p>No artigo o autor não deixa isso explícito e é extremamente fácil confundir benchmark e profiling. Medir um algoritmo contra outro (como ele fez) é benchmark, medir a performance da aplicação para saber onde ela demora mais é profiling!</p>
<p><strong>Regra Número um de Análise de Performance<br />
</strong></p>
<p>Agora sim as coisas ficam um pouco parecidas com o mundo real: como um cientista, no momento de analisar qualquer coisa, você não assume nada. Nada! Esse é o primeiro erro que você pode cometer e todo mundo comete. Para assumir qualquer postura em relação a algo, você precisa ter argumentos. Que argumento é mais convincente do que o resultado de um teste?!</p>
<p><strong>Ferramentas de Benchmark</strong></p>
<p>Quantos de nós usamos o Apache Httpd?! Praticamente todos! Pois então, o Apache Httpd vêm com uma ferramenta imbutida de benchmark muito boa, o &#8220;ab&#8221; ou &#8220;Apache Benchmark&#8221;. Com ela você consegue executar testes de chamada a uma determinada URL especificando o número de requisições que você deseja simular, o número de requisições simultâneas e depois comparar os dados. Eis os dados de comparação entre algumas ferramentas de cache em PHP.</p>
<table style="text-align: center;" border="0">
<thead>
<tr>
<th></th>
<th>Sem Zend Optimizer</th>
<th>Com Zend Optimizer</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>PHP Raw (Puro)</strong></td>
<td>59</td>
<td>70</td>
</tr>
<tr>
<td><strong>APC</strong></td>
<td>102</td>
<td>-</td>
</tr>
<tr>
<td><strong>eAccelerator</strong></td>
<td>99</td>
<td>125</td>
</tr>
<tr>
<td><strong>xCache</strong></td>
<td>109</td>
<td>125</td>
</tr>
</tbody>
</table>
<p>Usar o &#8220;ab&#8221; é bem trivial, um simples &#8220;ab &#8211;help&#8221; é autoexplicativo e você não terá dificuldades em examinar os resultados.</p>
<p><strong>Ferramentas de Profiling</strong></p>
<p>Existe um formato bem conhecido de resultado de profiling chamado &#8220;CacheGrind&#8221;. É bem comum que ferramentas de profling (independente da linguagem) gerem um resultado em formato CacheGrind, o que aos olhos humanos é um terror, mas que com um programa de leitura fica muito melhor.</p>
<p>Portanto temos duas etapas: gerar um arquivo CacheGrind e analisá-lo. Gerar é fácil, você pode usar o <a href="http://www.xdebug.org/" target="_blank">xDebug</a> para fazer isso. O Xdebug, se configurado para, irá gerar um arquivo CacheGrind sempre que uma página for executada. Se nunca usou o xDebug aconselho começar a usar, ele ajuda muito no desenvolvimento além de ser uma ótima ferramenta de profiling.</p>
<p>Para analisar o arquivo gerado temos diversas opcões para diferentes sistemas operacionais. A que eu mais gosto? <a href="http://code.google.com/p/webgrind/" target="_blank">Webgrind</a>! Você instala ele e pronto. Nada de ficar acostumando com interface que depende do S.O. nem sentir falta de alguma funcionalidade! O WebGrind é bom o suficiente pra substituir qualquer ferramenta de análise CacheGrind desde que o arquivo de análise não seja muito grande. &#8220;Mas o que eu posso ver?&#8221; deve estar se perguntando.</p>
<p>Através do CacheGrind podemos saber quantas vezes determinada função, arquivo ou método foi executado; quando ele foi executado e quanto tempo demorou cada execução. Podemos ver isso em diversos níveis e em diversas ordens. Isso facilita a análise de gargalos na sua aplicação e direciona seu esforço nesses gargalos e não em suposições.</p>
<p><strong>Performace x Manutenção de Código</strong></p>
<p>Isso é algo que gera controvérsia, mas é muito simples. Tudo o que vimos neste post está relacionado a performance. Benchmark e profilling servem de ferramentas para ajudar a melhorar a performance de sua aplicação, elas por si só não fazem nada. Mas sem elas, você provavelmente não fará nada muito útil nessa área também.</p>
<p>Tenha como prioridade a manutenção de seus códigos! Vamos repetir isso mais uma vez: tenha como prioridade a manutenção dos seus códigos. Esqueça a performace de início. Peformance em último caso se resolve com hardware, manutenção não tem preço que pague nem reza que resolva.</p>
<p>O artigo cita, por exemplo. Trocar objetos por array torna uma aplicação mais rápida? Torna. A pergunta pertinente que deveria ser feita é: a que custo?</p>
<p>Você não vai precisar deixar de usar objetos em sua aplicação, o benefício é mínimo em termos de performance pra perda que você tem na manutenção do código. Dificilmente para qualquer um de nós essa troca chegue a trazer algum benefício! Por esse motivo eu critiquei tanto o artigo no início desse post. O autor foi infeliz na comparação e na conclusão.</p>
<p>Chega de usar PHP como uma linguagem qualquer. Ela evoluiu a muito tempo! Se você se considera um programador, evolua junto com ela! Sem mais &#8220;echo&#8221; para debug, sem mais &#8220;microtime()&#8221; para medir desempenho! Estudem, testem, pratiquem, cheguem às suas próprias conclusões!</p>
<p><strong>Conclusões</strong></p>
<p>Não darei nenhuma conclusão aqui, já os incitei o suficiente. Testem o que foi mostrado nesse post em suas aplicações ou seus blogs e cheguem a suas própria conclusões. Uma coisa que não citei no decorrer do post, mas acho importante, é que não existe como chegar a uma conclusão a partir de um único teste. Tenha seu &#8220;rol&#8221; de dados e a partir dele obtenha suas conclusões.</p>
<p>Eu fui bem duro nas críticas ao artigo citado por um motivo. Se o intuito é ensinar alguma coisa, se preocupe com as coisas que você passa. Pessoas lerão e usarão aquilo em seu dia a dia. Respeito muito as pessoas que passam o conhecimento adiante, mas isso deve ser feito com cuidado. Sugerir indiretamente ao público leitor que arrays são mais rápidos que objetos mostrando uma diferença numérica em um caso hipotético de forma isolada é prejudicial, a impressão que se tem ao final do artigo é de que não devemos usar objetos pois eles irão deixar nossas aplicações lentas, quando provavelmente (pra não dizer certamente) os objetos nunca serão os culpados pela lentidão da sua aplicação.</p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/89de242e444d231e9928320af0417571?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/augusto/' title='Augusto Pascutti'>Augusto Pascutti</a></h3><p>Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.</p><p><a href='http://www.augustopascutti.com' title='Augusto Pascutti'>Website</a> - <a href='http://phpsp.org.br/author/augusto/' title='More posts by Augusto Pascutti'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2009/05/analise-de-performance/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Segurança insegura !</title>
		<link>http://phpsp.org.br/2009/04/seguranca-insegura/</link>
		<comments>http://phpsp.org.br/2009/04/seguranca-insegura/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 15:28:36 +0000</pubDate>
		<dc:creator>Augusto Pascutti</dc:creator>
				<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/2009/04/05/seguranca-insegura/</guid>
		<description><![CDATA[Alguns de vocês já sabem que o próximo PHPSPCast já foi gravado e está sendo editado, o tema dele é segurança ! Segurança é algo com o qual sempre devemos estar preocupados, mas como em diversas áreas de desenvolvimento, não basta &#8220;achar&#8221;; é necessário estudar e entender todos os problemas de segurança de determinadas implementações. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-378" title="Falha de Segurança" src="http://phpsp.org.br/wp-content/uploads/2009/04/carjpg.jpeg" alt="Falha de Segurança" width="330" height="231" />Alguns de vocês já sabem que o próximo PHPSPCast já foi gravado e está sendo editado, o tema dele é <strong>segurança</strong> ! Segurança é algo com o qual sempre devemos estar preocupados, mas como em diversas áreas de desenvolvimento, não basta &#8220;achar&#8221;; é necessário estudar e entender todos os problemas de segurança de determinadas implementações.<br />
É comum cairmos no mesmo problema em que nosso colega caiu. Ele queria proteger o <strong>phpinfo() </strong>dele das demais pessoas, ele poderia muito bem remover essa funcionalidade depois, mas ele corria o risco de esquecer e isto ficar aberto pra sempre. Pensando nisso e na segurança do ambiente dele, ele acabou com a seguinte solução:</p>
<pre class="textmate-source twilight"><span class="linenum">    1</span> <span class="source source_php"><span class="source source_php source_php_embedded source_php_embedded_block source_php_embedded_block_html"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_begin punctuation_section_embedded_begin_php">&lt;?php</span>
<span class="linenum">    2</span>  <span class="keyword keyword_control keyword_control_php">if</span> (<span class="variable variable_other variable_other_global variable_other_global_safer variable_other_global_safer_php"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_php">$</span>_SERVER</span>[<span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">REMOTE_ADDR</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span>] <span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_php">==</span> <span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">192.168.2.89</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span>)
<span class="linenum">    3</span>  {
<span class="linenum">    4</span>    <span class="support support_function support_function_info support_function_info_php">phpinfo</span>()<span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span>
<span class="linenum">    5</span>  } <span class="keyword keyword_control keyword_control_php">else</span> {
<span class="linenum">    6</span>    <span class="support support_function support_function_construct support_function_construct_php">echo</span> <span class="string string_quoted string_quoted_double string_quoted_double_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">"</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_double meta_string-contents_quoted_double_php">&lt;h1&gt;You're like, not authorized to view this.&lt;/h1&gt;</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">"</span></span><span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span>
<span class="linenum">    7</span>  }
<span class="linenum">    8</span> <span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_end punctuation_section_embedded_end_php"><span class="source source_php">?</span>&gt;</span></span></span></pre>
<p>A falha se encontra no fato de que não se deve confiar na variável <em>$_SERVER</em>. É comum as pessoas acreditarem que quem fornece esses dados é o servidor http e que eles são intocáveis. Mas a super global <em>$_SERVER</em> é tão manipulável quanto qualquer outra variável, portanto o que foi criado acima foi uma falsa idéia de segurança.<br />
O post original pode ser encontrado <a title="aqui" href="http://egovsergo.com/2009/04/03/protecting-your-phpinfo/">aqui</a>.</p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/89de242e444d231e9928320af0417571?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/augusto/' title='Augusto Pascutti'>Augusto Pascutti</a></h3><p>Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.</p><p><a href='http://www.augustopascutti.com' title='Augusto Pascutti'>Website</a> - <a href='http://phpsp.org.br/author/augusto/' title='More posts by Augusto Pascutti'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2009/04/seguranca-insegura/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Twitto: Framework que cabe em um tweet !</title>
		<link>http://phpsp.org.br/2009/03/twitto-framework-que-cabe-em-um-tweet/</link>
		<comments>http://phpsp.org.br/2009/03/twitto-framework-que-cabe-em-um-tweet/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 23:35:56 +0000</pubDate>
		<dc:creator>Augusto Pascutti</dc:creator>
				<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=286</guid>
		<description><![CDATA[Se você &#8211; a esta altura do campeonato &#8211; não faz idéia do que é um &#8220;tweet&#8221;, ponha-se daqui para www.twitter.com ! Agora ! Podemos conversar de igual pra igual. Pense em um framework. Uma coisa grande. Com várias opções, módulos, suporte a plugins, MVC, talvez um Data Mapper, etc, etc, etc. Agora pense em [...]]]></description>
			<content:encoded><![CDATA[<p>Se você &#8211; a esta altura do campeonato &#8211; não faz idéia do que é um &#8220;tweet&#8221;, ponha-se daqui para <a title="Twitter" href="http://twitter.com" target="_blank">www.twitter.com</a> !</p>
<p>Agora ! Podemos conversar de igual pra igual. Pense em um framework. Uma coisa grande. Com várias opções, módulos, suporte a plugins, MVC, talvez um Data Mapper, etc, etc, etc. Agora pense em um tweet: 140 caracteres. São coisas como óleo e água, gato e cachorro, são paulinos e mulheres (eu ainda vou escutar por causa disso).</p>
<p><span id="more-286"></span></p>
<p>Pois bem, tentando mostrar a beleza feminina aos São Paulinos &#8211; ou que um framework não precisa ser uma coisa grande, pra quem não entendeu a piada -, o fundador do Symphony (o framework) criou o Twitto: um framework do tamanho de um tweet, ou seja: 140 caracteres. Na verdade &#8211; e lógico &#8211; ele não e grande coisa, simplismente funciona como um Front Controller bem básico. Mas é uma prova de conceito e usa novas features do PHP 5.3, enfim &#8230; o dito cujo segue abaixo.</p>
<pre class="textmate-source twilight"><span class="linenum">    1</span> <span class="text text_html text_html_basic"><span class="source source_php source_php_embedded source_php_embedded_block source_php_embedded_block_html"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_begin punctuation_section_embedded_begin_php">&lt;?php</span>
<span class="linenum">    2</span> <span class="meta meta_include meta_include_php"><span class="keyword keyword_control keyword_control_import keyword_control_import_include keyword_control_import_include_php">require</span> <span class="constant constant_other constant_other_php">__DIR__</span><span class="keyword keyword_operator keyword_operator_string keyword_operator_string_php">.</span><span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">/c.php</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span></span><span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span>
<span class="linenum">    3</span> <span class="keyword keyword_control keyword_control_php">if</span> (<span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_php">!</span><span class="support support_function support_function_type support_function_type_php">is_callable</span>(<span class="variable variable_other variable_other_php"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_php">$</span>c</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_php">=</span> <span class="keyword keyword_operator keyword_operator_error-control keyword_operator_error-control_php">@</span><span class="variable variable_other variable_other_global variable_other_global_php"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_php">$</span>_GET</span>[<span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">c</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span>] ?: <span class="storage storage_type storage_type_php">function</span>() { <span class="support support_function support_function_construct support_function_construct_php">echo</span> <span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">Woah!</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span><span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span> }))
<span class="linenum">    4</span>   <span class="keyword keyword_control keyword_control_exception keyword_control_exception_php">throw</span> <span class="keyword keyword_other keyword_other_new keyword_other_new_php">new</span> <span class="support support_class support_class_php">Exception</span>(<span class="string string_quoted string_quoted_single string_quoted_single_php"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_php">'</span><span class="meta meta_string-contents meta_string-contents_quoted meta_string-contents_quoted_single meta_string-contents_quoted_single_php">Error</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_php">'</span></span>)<span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span>
<span class="linenum">    5</span> <span class="variable variable_other variable_other_php"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_php">$</span>c</span>()<span class="punctuation punctuation_terminator punctuation_terminator_expression punctuation_terminator_expression_php">;</span></span>
</span></pre>
<p>Agora você pode se parguntar, quais são as coisas &#8220;novas&#8221; que o twitto está usando, simples:</p>
<ul>
<li>Constante <code>__DIR__</code></li>
<li>Operador <code>?:</code></li>
<li>Funções anônimas</li>
</ul>
<p>No fim, o Twitto existe apenas como brincadeira, e para mostrar alguns novos recursos do PHP 5.3, mas se ele realmente for aceito como framework ele é o mais rápido existente. Mais pra frente mostro uns benchmarks que estou fazendo e o twitto já está neles.</p>
<p>O site do Twitto é: www.twitto.org</p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/89de242e444d231e9928320af0417571?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/augusto/' title='Augusto Pascutti'>Augusto Pascutti</a></h3><p>Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.</p><p><a href='http://www.augustopascutti.com' title='Augusto Pascutti'>Website</a> - <a href='http://phpsp.org.br/author/augusto/' title='More posts by Augusto Pascutti'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2009/03/twitto-framework-que-cabe-em-um-tweet/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>5 coisas que um programador PHP precisa</title>
		<link>http://phpsp.org.br/2009/02/5-coisas-que-um-programador-php-precisa/</link>
		<comments>http://phpsp.org.br/2009/02/5-coisas-que-um-programador-php-precisa/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 09:00:41 +0000</pubDate>
		<dc:creator>Augusto Pascutti</dc:creator>
				<category><![CDATA[Des-sobrinhação]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://phpsp.org.br/?p=216</guid>
		<description><![CDATA[Se você ganha a vida com PHP sabe o quanto sofremos por conta dos chamados &#8220;sobrinhos&#8221;, se você não sabe o que estou falando, termine de ler esse post e procure no Google que você vai entender do que estamos falando! Quem foi ao &#8220;I Encontro&#124;PHPSP&#8221; sabe que um objetivo tão importante quanto unir a [...]]]></description>
			<content:encoded><![CDATA[<p>Se você ganha a vida com PHP sabe o quanto sofremos por conta dos chamados &#8220;sobrinhos&#8221;, se você não sabe o que estou falando, termine de ler esse post e procure no Google que você vai entender do que estamos falando! Quem foi ao &#8220;I Encontro|PHPSP&#8221; sabe que um objetivo tão importante quanto unir a comunidade é levar mais conhecimento a ela, deixando claro que o PHP deixou a muito tempo de ser uma linguagem de programação para sites e entrou no ramo enterprise!</p>
<p>Onde queremos chegar com tudo isso? Simples! O mal dos sobrinhos é que logo após seu &#8220;Hello World!&#8221; eles já se consideram programadores, e logicamente, as coisas não funcionam bem assim. Inspirado <a href="http://blog.calevans.com/2009/02/09/5-tools-every-php-developer-should-master/" target="_blank">num post do Cal Evans</a> (se você nunca ouviu falar nesse nome, google-for-it ! agora!) em que ele diz 5 ferramentas que um programador PHP precisa conhecer, nós dizemos mais: considere-se um programador somente se você conhecer PELO MENOS as cinco ferramentas abaixo!</p>
<p><span id="more-216"></span></p>
<p><strong>5: Testes Unitários</strong></p>
<p>Todo mundo bate nesta tecla, hoje temos ótimas soluções ( <a href="http://www.phpunit.de/" target="_blank">PHPUnit</a> e <a href="http://www.simpletest.org/" target="_blank">SimpleTest</a> ) para isso, todas muito maduras e largamente utilizadas. A vantagem de se desenvolver com o apoio dos testes de unidade ou até mesmo utilizando TDD (Test Driven Development) é notável e díficil de apresentar a quem nunca utilizou. No começo tudo pode parecer muito trabalhoso e inútil, mas com o tempo os testes unitários que você (teoricamente) &#8220;perdeu tempo&#8221; escrevendo se provam fiéis amigos do programador.</p>
<p><strong>4: Debug</strong></p>
<p>Debugar um código está bem longe de sair dando &#8220;echo&#8221; pelo código ! Isso vale para as mais rebuscadas técnicas que variam dessa, como por exemplo escrever uma função específica pra isso ou controlar isso através de alguma constante e/ou variável. O debug de um código consiste em ver o que existe na memória de execução do PHP em determinado momento do script, além de possíbilitar controlar o interpretador, parando, avançando a medida que for necessário ao programador. Existem &#8211; pra variar &#8211; muitas ferramentas pra isso: <a href="http://www.xdebug.org/" target="_blank">xDebug</a>, <a href="http://www.nusphere.com/products/php_debugger.htm" target="_blank">dbg</a>, <a href="http://www.zend.com/en/community/pdt" target="_blank">Zend_Debug</a>, etc &#8230;</p>
<p><strong>3: Modelo ER</strong></p>
<p>Trabalhar com PHP invariavelmente significa trabalhar com um Banco de Dados assim como trabalhar com desenvolvimento de sistemas implica invariavelmente em constantes mudanças; é muito lógico no momento de criação de uma nova tabela a modelagem dela e os relacionamentos que ela possui dentro do sistema, mas e depois de 1 ano ? As pessoas mudam, amadurecem (ou não) e mudam o jeito de conceber as coisas, mas o banco de dados continua o mesmo e toda a lógica vai pro saco ! Por isso ter um diagrama de entidade-relacionamento do seu banco de dados pode ser crucial para o andamento de um projeto durante muito tempo, você não perde muito tempo fazendo isso e existem ainda várias ferramentas para ajudar !</p>
<p>( Vamos atualizar a listagem das ferramentas para auxiliar na produão de MERs com o tempo &#8230; )</p>
<p><strong>2: Sistema de Controle de Versões</strong></p>
<p>Não vamos perder muito tempo discutindo isso aqui, se você trabalha em equipe ou não, seja seu projeto gigante ou não: use ! Além de manter todas as versões do seu projeto você têm um backup do código. Trabalhar com um sistema de controle de versão se equipara aos Testes de Unidade: você pode passar uma vida inteira sem eles, mas uma vez com eles, nunca mais sem eles !</p>
<p>Existem diversas opções, as mais famosas: <a href="http://ximbiot.com/cvs/wiki/" target="_blank">CVS</a> (utilizado no desenvolvimento do PHP mas sendo migrado pro Subversion), <a href="http://subversion.tigris.org/" target="_blank">Subversion</a> (mais novo que o CVS e muito semelhante a ele), <a href="http://git-scm.com/" target="_blank">GIT</a> (feito pelo Linus Torvalds para o desenvolvimento do kernel do Linux)</p>
<p><strong>1: (Um) Framework</strong></p>
<p>Esse aqui vai gerar briga, mas a briga vale a pena. Primeiro: um CMS (Joomla, Drupal, etc) não é um framework ! Nunca foram e nunca serão, este não é o propósito deles. Um framework é um conjunto de ferramentas genérico que deve servir bem um programador fazendo um site e um fazendo um sistema de gerenciamento logístico de entrega de camisinhas musicais no sertão brasileiro!</p>
<p>Você não precisa utilizar um framework em seus projetos, mas conhecer um ou mais frameworks ajuda em muito seu nível de desenvolvimento! Acredite: você não é o melhor programador que existe ! Existem muitos outros que pensam a mesma coisa! Um fato é que um framework possui muito conhecimento alheio agregado dentro do código, assim como muito teste em ambientes reais.</p>
<p>Muitos pregam que a curva de aprendizado custa demais a empresa. Ora, se a empresa fizer um sistema a partir do zero, novos desenvolvedores também terão que aprender a utilizar as coisas existentes que provavelmente terão menos padrão, menos qualidade e muito menos teste. Outro motivo latente é a performance, uma besteira nós dizemos! Existem muitas formas de se obter performance sem ao menos mexer em uma linha de código, além de que a probabilidade de um framework criado por você ser mais lento do que um existente é bem grande!</p>
<p>Enfim, utilizando ou não um framework no dia-a-dia; conhecer um ou mais é fundamental para o desenvolvimento profissional do programador! Existem MUITOS frameworks em PHP, vamos citar alguns:</p>
<ul>
<li><a href="http://www.cakephp.org/" target="_blank">CakePHP</a> (Rails do PHP)</li>
<li><a href="http://framework.zend.com" target="_blank">Zend Framework</a></li>
<li><a href="http://www.kohanaphp.com" target="_blank">Kohana</a> (baseado no <a href="http://www.codeigniter.com" target="_blank">CodeIgniter</a> mas somente para PHP5)</li>
<li><a href="http://www.symfony-project.org/" target="_blank">Symphony</a></li>
<li><a href="http://www.pradosoft.com/" target="_blank">Prado</a> (Event Driven Framework)</li>
</ul>
<p><strong>Conclusão</strong></p>
<p>Programar vai muito além de simplimente saber escrever códigos. Um programador não é a pessoa que simplismente escreve o código para máquina interpretar e executar o que ele deseja, ele precisa fazer isso de forma legível para os demais programadores além de garantir que tudo continue funcionando perfeitamente. Todos os cinco itens citados acima contribuem exatemente pra isso!</p>
<p>Tenha sempre em mente o que foi dito acima: você escreve para os outros e não para você! Raramente você vai escrever algo para esconder do resto do mundo, ou que não vá precisar da mão de alguém no código, mas se nada disse te convenceu, escreva os códigos pensando que o próximo que for dar manutenção no seu código pode ser um serial killer que sabe onde você mora! E outra; não existe nenhuma medida que diga seu nível em PHP. Atualmente a melhor delas é a Certificação da Zend, mas excluindo ela da lista, o que vai dizer se você é ou não é um bom programador é a opinião dos outros sobre seu código. Pense nisso na próxima vez em que você for programar!</p>
<p>Notem também que IDEs nem entraram nos pontos, uma porque isso é uma discussão infindável e outra porque uma IDE não vai tornar você um melhor programador, ela com certeza vai te tornar um programador mais produtivo! Então escolha bem a sua!</p>
<p>Contamos com suas opiniões sobre os asssuntos acima! E vamos indo rumo a des-sobrinhação  do PHP!</p>
<div class="wp-about-author-containter-top" style="background-color:#FFF;"><div class="wp-about-author-pic"><img alt='' src='http://0.gravatar.com/avatar/89de242e444d231e9928320af0417571?s=100&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D100&amp;r=G' class='avatar avatar-100 photo' height='100' width='100' /></div><div class="wp-about-author-text"><h3><a href='http://phpsp.org.br/author/augusto/' title='Augusto Pascutti'>Augusto Pascutti</a></h3><p>Augusto Pascutti é desenvolvedor PHP a 5 anos, trabalhou em projetos Open Source como CakePHP, Zend Framework e Habari. É evangelista PHP e de boas práticas, Zend Certified Engineer para PHP 5, fundador/coordenador do PHPSP, host do PHPSPCast e headbanger nas horas vagas.</p><p><a href='http://www.augustopascutti.com' title='Augusto Pascutti'>Website</a> - <a href='http://phpsp.org.br/author/augusto/' title='More posts by Augusto Pascutti'>More Posts</a> </p></div></div>]]></content:encoded>
			<wfw:commentRss>http://phpsp.org.br/2009/02/5-coisas-que-um-programador-php-precisa/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
	</channel>
</rss>

