<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2" -->
<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>Meio Código</title>
	<link>http://www.meiocodigo.com</link>
	<description>A peça que faltava para seu código.</description>
	<pubDate>Sat, 23 Aug 2008 03:21:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<item>
		<title>Função simples para testar tempo de execução em PHP</title>
		<link>http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/</link>
		<comments>http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 14:14:27 +0000</pubDate>
		<dc:creator>fabiomcosta</dc:creator>
		
		<category><![CDATA[time]]></category>

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

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/</guid>
		<description><![CDATA[Vou ser bem objetivo neste post.
Mostrarei uma função bastante simples para que rapidamente você verifique o tempo de execução de seus scripts PHP. Após mostrar a função, exemplo de uso e resultado, explicarei o fucionamento da função.

function getTime(){
	static $tempo;
	list($usec, $sec) = explode(" ",microtime());
	if( $tempo == NULL ){
		$tempo = ((float)$usec + (float)$sec);
	}
	else{
		echo 'Tempo (segundos): '.(((float)$usec + [...]]]></description>
			<content:encoded><![CDATA[<p>Vou ser bem objetivo neste post.<br />
Mostrarei uma função bastante simples para que rapidamente você verifique o tempo de execução de seus scripts PHP. Após mostrar a função, exemplo de uso e resultado, explicarei o fucionamento da função.</p>
<pre class="”prettyprint”">
function getTime(){
	static $tempo;
	list($usec, $sec) = explode(" ",microtime());
	if( $tempo == NULL ){
		$tempo = ((float)$usec + (float)$sec);
	}
	else{
		echo 'Tempo (segundos): '.(((float)$usec + (float)$sec)-$tempo).'';
	}
}</pre>
<p>Esta função funciona no PHP 4 e 5. No PHP 5 foi adicionado um parâmetro a esta função, que serve como uma flag para que o retorno da função seja float ou não (<a href="http://br.php.net/manual/pt_BR/function.microtime.php" title="Função microtime" target="_blank">documentação do PHP para a função microtime</a>).<br />
Então uma forma de escrever esta função somente para PHP 5 seria:</p>
<pre class="”prettyprint”">
function getTime(){
	static $tempo;
	if( $tempo == NULL ){
		$tempo = microtime(true);
	}
	else{
		echo 'Tempo (segundos): '.(microtime(true)-$tempo).'';
	}
}</pre>
<p>Fica mais elegante porém só funciona para a versão 5 do PHP.<br />
Vou mostrar agora um exemplo de como usá-la para que vocês vejam a simplicidade de uso.</p>
<pre class="”prettyprint”">
getTime();

$testeIteracao = 0;
for($i=0;$i&lt;1000000;$i++){
	$testeIteracao++;
}

getTime();</pre>
<p>No código acima o resultado aqui na minha máquina foi:</p>
<pre class="”prettyprint”">
Tempo (segundos): 0.19565415382385</pre>
<p>Ou seja o PHP levou 195,65 milissegundos para executar este <em>loop</em>.</p>
<p>Como vimos, no código de exemplo, a função é chamada uma vez antes do código a ser testado e outra vez depois do código.<br />
Na primeira chamada a variável estática &#8220;$tempo&#8221; é declarada e possui valor &#8220;NULL&#8221; e por isso obedece ao &#8220;if( $tempo == NULL )&#8221; e recebe o valor da função &#8220;microtime()&#8221;.<br />
Na segunda chamada a variável &#8220;$tempo&#8221;, por ser estática, já possui um valor que é o tempo que foi armazenado na primeira chamada. Então entramos no &#8220;else&#8221; que subtrai o valor de uma nova chamada da função &#8220;microtime()&#8221; com o valor de &#8220;$tempo&#8221; e imprime esse valor. Dessa forma obtemos o tempo que levou da primeira chamada de &#8220;getTime()&#8221; até a segunda, ou seja o tempo de execução do código que está entre as duas chamadas da função.</p>
<p>As variáveis estáticas em classes, são variáveis que podem ser acessadas mesmo sem se ter um instância de um objeto daquela classe (<a href="http://br.php.net/manual/pt_BR/language.oop5.static.php" title="Palavra-chave Static" target="_blank">Palavra-chave &#8217;static&#8217; em classes</a>). Porém no caso de uma variável estática em uma função este valor é mantido entre as chamadas da função, sendo mantido em seu escopo, por isso aconteceu o que foi mostrado.</p>
<p>Espero que tenham gostado, Abraço e até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Django Graphviz - Documentando seus models</title>
		<link>http://www.meiocodigo.com/2008/07/29/django-graphviz-documentando-seus-models/</link>
		<comments>http://www.meiocodigo.com/2008/07/29/django-graphviz-documentando-seus-models/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 16:03:53 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
		
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/07/29/django-graphviz-documentando-seus-models/</guid>
		<description><![CDATA[Navegando pelos blogs hoje eu me deparei com uma ferramenta muito interessante: o Django Graphviz. Ele gera, a partir do arquivo models.py, uma representação gráfica do banco de dados da aplicação. Segue abaixo uma imagem gerada por ela:

No blog do Mayron Cachina [1] existe um tutorial explicando como utilizar a ferramenta.
[1] http://cachina.wordpress.com/2008/02/29/djangographviz-cria-um-png-de-seu-model/
]]></description>
			<content:encoded><![CDATA[<p>Navegando pelos blogs hoje eu me deparei com uma ferramenta muito interessante: o Django Graphviz. Ele gera, a partir do arquivo models.py, uma representação gráfica do banco de dados da aplicação. Segue abaixo uma imagem gerada por ela:</p>
<p><a href="http://www.meiocodigo.com/wp-content/uploads/2008/07/especies.png" title="Representação gráfica do banco de dados"><img src="http://www.meiocodigo.com/wp-content/uploads/2008/07/especies.png" alt="Representação gráfica do banco de dados" /></a></p>
<p>No <a href="http://cachina.wordpress.com/2008/02/29/djangographviz-cria-um-png-de-seu-model/" title="Artigo do blog do Mayron Cachina">blog do Mayron Cachina</a> [1] existe um tutorial explicando como utilizar a ferramenta.</p>
<p>[1] <a href="http://cachina.wordpress.com/2008/02/29/djangographviz-cria-um-png-de-seu-model/" title="Artigo do blog do Mayron Cachina">http://cachina.wordpress.com/2008/02/29/djangographviz-cria-um-png-de-seu-model/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/07/29/django-graphviz-documentando-seus-models/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CakePHP - Herança de Helper</title>
		<link>http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/</link>
		<comments>http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 17:03:04 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
		
		<category><![CDATA[Helper]]></category>

		<category><![CDATA[Herança]]></category>

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/</guid>
		<description><![CDATA[Ultimamente tenho utilizado o Framework CakePHP, e uma dúvida que me surgiu esses dias foi como um Helper herdar de outro helper. Por exemplo, criei um helper MyTimeHelper que herda do TimeHelper, e adicionei um método que sobrescreve o format. Entretanto, me ocorria um problema que o script não conseguia encontrar o TimeHelper, por ele [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente tenho utilizado o Framework <a href="http://www.cakephp.com">CakePHP</a>, e uma dúvida que me surgiu esses dias foi como um Helper herdar de outro helper. Por exemplo, criei um helper MyTimeHelper que herda do TimeHelper, e adicionei um método que sobrescreve o format. Entretanto, me ocorria um problema que o script não conseguia encontrar o TimeHelper, por ele não ter sido invocado pelo core do cake. Então eu adicionei a linha App::import(&#8217;Helper&#8217;,'Time&#8217;); no início da definição do MyTimeHelper e o problema foi resolvido. Então o codigo fica assim:</p>
<p>App::import(&#8217;Helper&#8217;, &#8216;Time&#8217;);</p>
<p>class MyTimeHelper extends TimeHelper {<br />
&#8230;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Evitando múltiplos posts com session</title>
		<link>http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/</link>
		<comments>http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 20:52:51 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
		
		<category><![CDATA[Validação]]></category>

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/</guid>
		<description><![CDATA[Muitos desenvolvedores já se depararam com a situação de que usuários impacientes enviam formulários dezenas de vezes, e isso realmente incomoda, pois aparecem vários registros idênticos.
Uma forma de solucionar tal problema seria usando session. No momento do envio, salva algo que identifique(que chamarei de identidade) o formulário na SESSION, e sempre que for enviar algo, [...]]]></description>
			<content:encoded><![CDATA[<p>Muitos desenvolvedores já se depararam com a situação de que usuários impacientes enviam formulários dezenas de vezes, e isso realmente incomoda, pois aparecem vários registros idênticos.</p>
<p>Uma forma de solucionar tal problema seria usando session. No momento do envio, salva algo que identifique(que chamarei de identidade) o formulário na SESSION, e sempre que for enviar algo, verifica se a identidade da session bate com a do fomulário enviado, se bater, o sistema impede que o formulário seja enviado novamente.</p>
<p>No caso de formulários de e-mail, eu particularmente uso como identidade a mensagem do e-mail criptografada por md5, visto que reduz significativamente o tamanho do que será guardado na session.</p>
<p>Bom, vamos aos códigos:</p>
<pre class="”prettyprint”" ><code>
session_start();

$md5Mensagem = md5($_POST['mensagem']);
if(isset($_SESSION['md5Mensagem'] &amp;&amp; $md5Mensagem == $_SESSION['md5Mensagem']){
     echo 'Esta mensagem já foi enviada';
} else {
     if(ENVIA_MENSAGEM){
          $_SESSION['md5Mensagem'] = $md5Mensagem;
          echo 'Mensagem enviada com sucesso';
     } else echo 'Mensagem não foi enviada';
}
</code></pre>
<p>O código acima está bem simplificado, eu encapsulei o processo de enviar a mensagem (função mail, gravar no banco, ou qualquer outro método) por fugir do escopo deste post.</p>
<p>O código verifica se existe algum md5Mensagem na session, e se ele é igual ao md5 da mensagem enviada, se sim, ele informa que a mensagem já foi enviada, se não, o sistema tenta fazer o envio, se der certo ele salva o md5 na session, se não, ele apenas informa que não deu certo.</p>
<p>Bom, é isso, qualquer dúvida, postem comentários que responderemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mensagens de Erro com Session em PHP (serialize)</title>
		<link>http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/</link>
		<comments>http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:49:48 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
		
		<category><![CDATA[Validação]]></category>

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/</guid>
		<description><![CDATA[Pra quem pensa que a variável global SESSION é apenas para autenticação de usuários, aqui vai mais uma. O objetivo principal da SESSION, assim como dos COOKIES é enviar variáveis calculadas em uma página para outra página.
Irei apresentar aqui um sistema simples de mensagens de erro e confirmação com o uso da SESSION.
Primeiramente vou apresentar [...]]]></description>
			<content:encoded><![CDATA[<p>Pra quem pensa que a variável global SESSION é apenas para autenticação de usuários, aqui vai mais uma. O objetivo principal da SESSION, assim como dos COOKIES é enviar variáveis calculadas em uma página para outra página.</p>
<p>Irei apresentar aqui um sistema simples de mensagens de erro e confirmação com o uso da SESSION.</p>
<p>Primeiramente vou apresentar uma classe que eu usei para armazenar as mensagens:</p>
<pre class="”prettyprint”">
<code>
&lt;?
class Mensagem {
    public static $ERRO=1,$SUCESSO=2;

    private $mensagem;
    private $tipo;

    public function __construct($mensagem,$tipo){
        $this-&gt;mensagem = $mensagem;
        $this-&gt;tipo = $tipo;
    }

    public function getMensagem(){
        return $this-&gt;mensagem;
    }

    public function getTipo(){
        return $this-&gt;tipo;
    }

    public static function tipoToString($tipo){
        if($tipo == 1) return 'erro';
        else if($tipo == 2) return 'sucesso';
    }
}
?&gt;
</code></pre>
<p>Pra quem já mexe com orientação a objetos, a classe acima é simples. Uma classe com 2 variáveis estáticas($ERRO e $SUCESSO) que seriam os tipos de mensagens, uso isso mais para definir o CSS que irá acompanhar a mensagem. Tem duas variáveis, uma para a mensagem em si, e outra para o tipo da mensagem, um construtor que define as variáveis, e funções para obter os valores das variáveis.</p>
<p>O uso é simples, vamos ver um caso abaixo:</p>
<p>Temos a página de formulário simplificada (form.php) da seguinte forma:</p>
<pre class="”prettyprint”">
<code>
&lt;?
if(isset($_SESSION['mensagens'])){
    $mensagens = unserialize($_SESSION['mensagens']);
    unset($_SESSION['mensagens']);
} else {
    $mensagens = array();
}

if(isset($_SESSION['pessoa'])){
    $pessoa = unserialize($_SESSION['pessoa']);
    unset($_SESSION['pessoa'];
} else {
    $pessoa = new Pessoa();
}

?&gt;

&lt;ul class="mensagens"&gt;
    &lt;?= foreach($mensagens as $mensagem): ?&gt;
    &lt;li&gt;&lt;p class="&lt;?=Mensagem::tipoToString($mensagem-&gt;getTipo())?&gt;"&gt;&lt;?=$mensagem-&gt;getMensagem()?&gt;&lt;/p&gt;  &lt;/li&gt;
    &lt;? endforeach; ?&gt;
&lt;/ul&gt;
&lt;form action="insert.php" method="post"&gt;
    &lt;input name="nome" value="&lt;?=$pessoa-&gt;getNome()?&gt;" type="text" /&gt;
    &lt;input name="idade" value="&lt;?=$pessoa-&gt;getIdade()?&gt;" type="text" /&gt;
    &lt;input type="submit" /&gt;
&lt;/form&gt;
</code></pre>
<p>No código acima, criamos um formulário solicitando nome e idade. As primeiras linhas são código PHP, atente para a função <strong>unserialize</strong>, ela desserializa os dados que vieram da SESSION, visto que a mesma não suporta objetos. Pegamos da SESSION as mensagens, e apagamos da SESSION para que a mensagem só apareça uma vez. Fazemos o mesmo com um objeto do tipo pessoa, o qual armazena os dados que já foram enviados previamente, evitando que o usuário preencha o formulário novamente.</p>
<p>Abaixo vem uma lista, com todas as mensagens que estavam na SESSION. Atente para a função tipoToString, da classe mensagem, que eu criei apenas para definir o atributo <em>class</em> do parágrafo da mensagem.</p>
<p>Em seguida vem o formulário pegando todos os <em>values</em> do objeto pessoa que estava na SESSION.</p>
<p>Abixo teremos o script que irá processar este formulário (submit.php):</p>
<pre class="”prettyprint”">
<code>
&lt;?

$nome = $_POST['nome'];
$idade = $_POST['idade'];

$pessoa = new Pessoa();

if(!$nome) $mensagens[] = new Mensagem("O nome não foi informado",Mensagem::$ERRO);
else $pessoa-&gt;setNome($nome);

if(!is_numeric($idade)) $mensagens[] = new Mensagem("A idade deve ser um número!",Mensagem::$ERRO);
else $pessoa-&gt;setIdade($idade);

if(count($mensagens)){
    $_SESSION['mensagens'] = serialize($mensagens);
    $_SESSION['pessoa'] = serialize($pessoa);
    header("Location: form.php");
}

if(cadastra no banco){
    $mensagens[] = new Mensagem("Pessoa cadastrada com sucesso!",Mensagem::$SUCESSO);
} else {
    $mensagens[] = new Mensagem("Ocorreu um erro durante o cadastramento da pessoa!",Mensagem::$ERRO);
}

header("Location: form.php");

?&gt;</code></pre>
<p>No código acima, pegamos os dados do formulário através do POST e verificamos se os dados validam de acordo com algumas regras, caso contrário colocamos, em um array de mensagens, uma mensagem de erro. Depois de feita a validação, verificamos se existem mensagens de erro, caso positivo, serializamos as mensagens e a pessoa que possui alguns dados já cadastrados e colocamos na SESSION, fazendo o redirecionamento para o formulário, de forma que o usuário possa retificar seus erros.</p>
<p>Caso tudo ocorra dentro do normal, armazenamos uma mensagem de sucesso na SESSION, e redirecionamos para o formulário, para que o usuário efetue novo cadastro. Poderia redirecionar para a lista de cadastrados, ou qualquer outro lugar, contanto que o script tenha os códigos que lessem a mensagem de sucesso, mas para simplificar o meu post, eu criei apenas duas páginas.</p>
<p>Espero que isso ajude, e qualquer dúvida, comenta.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Melhorando o tempo de carregamento de um site</title>
		<link>http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/</link>
		<comments>http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/#comments</comments>
		<pubDate>Fri, 21 Dec 2007 04:00:47 +0000</pubDate>
		<dc:creator>fabiomcosta</dc:creator>
		
		<category><![CDATA[otimizar]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/</guid>
		<description><![CDATA[Não sei se o leitor conhece um add-on (ou plugin) do Firefox chamado Firebug. Essa ferramenta é de fundamental importância para o desenvolvimento de sites usando CSS e Javascript, não vou entrar em detalhes. Onde quero chegar é que o Firebug possui um add-on ( isso mesmo um add-on de um add-on ) chamado YSlow, [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei se o leitor conhece um add-on (ou plugin) do <a href="http://www.getfirefox.com" target="_blank" title="Firefox">Firefox</a> chamado <a href="http://www.getfirebug.com/" title="Firebug" target="_blank">Firebug</a>. Essa ferramenta é de fundamental importância para o desenvolvimento de sites usando CSS e Javascript, não vou entrar em detalhes. Onde quero chegar é que o Firebug possui um add-on ( isso mesmo um add-on de um add-on ) chamado <a href="http://developer.yahoo.com/yslow/" target="_blank" title="YSlow">YSlow</a>, ele ajuda bastante o desenvolvedor a achar onde o site está lento. Ele se baseia em 14 regras, por ordem de importância, para dar notas ao site. Dependendo de como ele estiver em cada uma das regras ele receberá a respectiva nota para a regra. Falarei sobre algumas das regras que esse programa apresenta e como obter uma melhor nota em cada uma delas.</p>
<h4>Regra número 1:  Fazer o minimo de requisições HTTP possível</h4>
<p>Como eu falei acima as regras estão em ordem de importância, ou seja essa é a principal delas. Para diminuir as requisições HTTP do seu site o que pode ser feito é diminuir o número de arquivos externos, como por exemplo, arquivos Javascript, CSS, imagens, etc. No caso o ideal seria que o site tivesse no máximo um arquivo CSS e um Javascript. Já no caso das imagens o que pode ser feito é salvar várias imagens em apenas uma e usando a propriedade background-position do CSS você acessaria cada uma dessas imagens.</p>
<p><a href="http://www.meiocodigo.com/exemplos/bg-position" title="Uma imagen para vários icones" target="_blank">exemplo</a></p>
<h4>Regra número 2: Usar mais de um sub-domínio</h4>
<p>Você pode criar subdomínios e colocar os arquivos externos de seu site neles. Por exemplo se você tem o domínio meiocodigo.com você pode colocar seus arquivos CSS e javascript num subdomínio a.meiocodigo.com e botar arquivos flash, flv e vídeos por exemplo num subdomínio b.meiocodigo.com. Isso melhora a velocidade do site por que ao fazer isso você acessa mais de um servidor de uma vez, e dessa forma eles têm como enviar seus pedidos mais rapidamente. Para entrar em mais detalhes sobre os benefícios visite <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html" title="Connections" target="_blank">este site</a>.</p>
<h4>Regra número 3: Adicionar data de expiração no cabeçalho</h4>
<p>A data de expiração que pode vir no cabeçalho de arquivos HTTP serve para informar ao browser a data em que ele deve ser desprezado, ou seja se colocarmos uma data futura no cabeçalho o browser será capaz de armazenar em cache o arquivo até a data que você determinar. Existem várias formas de fazer isso. Uma delas é adicionando a meta tag abaixo dentro da tag head de uma página de seu site:</p>
<pre class="”prettyprint”">
&lt;<span class="start-tag">meta</span><span class="attribute-name"> http-equiv</span>=<span class="attribute-value">&#8220;expires&#8221; </span><span class="attribute-name">content</span>=<span class="attribute-value">&#8220;Tue, 18 Dec 2007 02:18:46 GMT&#8221; </span><span class="error"><span class="attribute-name">/</span></span>&gt;</pre>
<p>Uma outra que eu particularmente prefiro e acho mais robusta, apesar de que somente serve para servidores Apache ( mas deve ter formas semelhantes para outros servidores ) é acrescentar a seguinte regra ao seu httpd.conf ou .htaccess:</p>
<pre class="”prettyprint”">
&lt;FilesMatch ".(jpg|jpeg|png|gif)$"&gt;
Header set Expires "<span class="attribute-value">Tue, 18 Dec 2007 02:18:46 GMT</span>&#8221;
&lt;/FilesMatch&gt;</pre>
<p>Dessa forma eu estou dizendo que apenas os arquivos de imagem do meu site terão data de expiração futura. Você pode usar essa forma para adicionar datas de expiração diferentes para diferentes grupos de arquivos. Por exemplo não é muito interessante colocar uma data muito futura no caso de arquivos .html ou .php, que são arquivos que estão em constante atualização.</p>
<p><a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/" title="Cache" target="_blank"> mais sobre cache </a></p>
<h4>Regra número 4: Compactar arquivos externos com GZip</h4>
<p>Essa é uma das principais regras para quem costuma usar bibliotecas javascript (<a href="http://www.jquery.com" title="JQuery" target="_blank">JQuery</a>, <a href="http://mootools.net/" target="_blank" title="Mootools">Mootools</a>, etc) com frequência, mas também pode ser usado com qualquer arquivo. A motivo de informação sobre os benefícios da compactação GZip darei um exemplo de uma usando a biblioteca JQuery que tem em torno de 77kb em sua forma normal. Se for usado o <a href="http://developer.yahoo.com/yui/compressor/" title="YUI Compressor" target="_blank">compactador de javascript do Yahoo!</a> ele passa a ter em torno de 46kb, e se for usada a compactação GZip em cima desse arquivo a biblioteca fica com incríveis 15kb! É um ganho de 513,33%!</p>
<p>Para compactar seus arquivos usando GZip deve-se ter o mod_deflate instalado no Apache ( a maioria dos hosts possui ) e pode-se usar a seguinte regra em seu httpd.conf ou .htaccess:</p>
<pre class="”prettyprint”">
&lt;IfModule mod_deflate.c&gt;
AddOutputFilterByType DEFLATE application/x-javascript text/css text/javascript
&lt;/IfModule&gt;</pre>
<p>Neste caso estou compactando apenas os arquivos Javascript e CSS, mas claro que pode-se adicionar outros tipos de arquivos. Para mais tipos de arquivos você pode olhar o arquivo mime.type que se encontra na pasta raiz do Apache.</p>
<h4>Regra número 5: Colocar arquivos CSS no cabeçalho do arquivo</h4>
<p>Foi constatado que as páginas de um site carregam com maior velocidade se os estilos forem colocados na tag head dos arquivos. Isso acontece por que a renderização da página é feita progressivamente, ao contrário do que acontece quando você coloca CSS no final de um arquivo. Um outro fator é o visual, quando um usuário abre uma página e ela vai &#8220;visualmente abrindo&#8221; ele sabe que a página está chegando em seu browser e ele vai esperar calmamente (até um certo limite, é claro), mas se você colocar o CSS na parte de baixo do site ele será a última coisa a ser lida pelo browser e o usuário terá a sensação que o site não está carregando até que seja finalmente lido o CSS e ele veja o site completo. Além de que existem bugs de renderização no IE, quando se coloca CSS na parte de baixo do site ( em cima ou em baixo, sempre existirão bugs de renderização no IE :S ).</p>
<h4>Regra número 6: Colocar scripts no final do arquivo</h4>
<p>Os browsers lêem o código fonte dos sites de cima para baixo, e quando lê uma inclusão de um arquivo Javascript, por exemplo, ele tem que baixar todo o arquivo, ler seu conteúdo e interpretar o código, para somente depois continuar com a leitura do resto do site. Por isso quando existem arquivos muito pesados na parte de cima de um site o usuário pode ficar um tempo considerável sem ter nenhuma resposta visual do site, por que o browser está lendo e interpretando linhas de script. Por isso, deve-se evitar ao máximo colocar scripts na parte de cima dos sites. Uma das soluções é incluir um arquivo, usando qualquer linguagem server-side, somente com scripts no final da página, antes do fim da tag body.</p>
<h4>Regra número 7: Evitar expressões no CSS</h4>
<p>As expressões de CSS são suportadas apenas pelo Internet Explorer e devem ser evitadas por que são executadas toda vez que um evento acontece no site ( toda vez que o mouse mexe, ou damos um click por exemplo) , podendo acarretar em lentidão no computador do usuário.  A regra é só usar expressões em casos em que já se tentou de tudo e não se obteve sucesso.  Para quem não sabe o que são expressões de CSS ai vai um exemplo de linha de código para uma expressão desse tipo, pesadíssima por sinal:</p>
<pre class="”prettyprint”">
background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );</pre>
<h4>Regra número 8: Colocar Javascript e CSS em arquivos externos</h4>
<p>Quanto maior os arquivos de Javascript e CSS e quanto maior a quantidade de páginas usando o mesmo conteúdo dos arquivos mais importante é essa regra. O que acontece  é que esses arquivos externos são guardados em cache quando possuem data de expiração futura ( regra 3 ) e quando um usuário visita mais de uma página de seu site acaba tendo acesso muito mais rápidos às páginas por possuir os arquivos em cache.</p>
<h4>Regra número 9: Reduzir o número pesquisas em DNS</h4>
<p>Essa regra vai um pouco contra a regra número dois mas a idéia é não ter um número muito grande de nomes de domínios numa mesma página de um site. Como a requisição a um servidor DNS para saber qual o IP associado a aquele nome demanda um certo tempo isso pode comprometer o desempenho do site. O ideal então é ter entre 2 e 4 nomes de domínios diferentes no mesmo site. Se for menos vai contra a regra número 2 e se for mais vai contra esta regra.</p>
<h4>Regra número 10: Comprimir os arquivos Javascript</h4>
<p>Existem algoritmos opensource na internet que comprimem scripts Javascript. Eles são especialmente úteis para trechos de código fixos, onde se sabe que não ocorrerão alterações ( o código após a compressão fica difícil de compreender ) como por exemplo no caso de se usar uma biblioteca Javascript. Algumas já fornecem seus códigos comprimidos usando esse tipo de algoritmo. Os mais famosos e eficientes são o <a href="http://developer.yahoo.com/yui/compressor/" title="YUI-Compressor" target="_blank">YUI-Compressor</a> criado pela Yahoo! e o <a href="http://dean.edwards.name/packer/" title="Packer" target="_blank">packer</a> criado por Edwards Packer. Cada um tem sua vantagem, o da Yahoo! tem uma taxa de compressão muito boa e não usa nenhum tipo de script mirabolante para comprimir o arquivo, já o packer tem uma taxa de compressão excelente porém usa um script que faz uso da função eval do javascript (muito conhecida por ser pesada) para a compressão do arquivo e por isso pode comprometer o desempenho do site quando o arquivo comprimido está sendo interpretado pelo browser. Meu preferido, e acredito que de muita gente, é o YUI-Compressor, que além de não comprometer o desempenho do site ainda tem uma taxa de compressão muito boa e pode chegar até a ser melhor do que a do packer se em cima desse arquivo for usada a compressão GZIP, que foi apresentada na regra número 4. Mais informações sobre o benefício do YUI-Compressor com GZIP <a href="http://www.julienlecomte.net/blog/2007/08/13/" title="YUI-Compressor com GZIP" target="_blank">neste link</a>.</p>
<h4>Regra número 11: Evite redirecionamentos</h4>
<p>Bom achei essa regra um pouco boba, afinal só se faz redirecionamento em sites quando é realmente necessário. Simplesmente evite-os.</p>
<h4>Regra número 12:  Remover scripts duplicados</h4>
<p>Sem comentários.</p>
<h4>Regra número 13: Configurar ETags</h4>
<p>As ETags são etiquetas compostas por inode-tamanho-timestamp  no caso do Apache 1.3 e 2.x e servem para identificar unicamente um arquivo e isso pode causar um pequeno delay se seus arquivos estiverem hospedados em diversos hosts diferentes. Para remover as ETags de seus arquivos você pode colocar as seguintes linhas em seu arquivo httpd.conf ou .htaccess:</p>
<pre class="”prettyprint”">
Header unset ETag
FileETag None</pre>
<p>Para mais informações sobre ETags visite <a href="http://www.htaccesselite.com/htaccess/etags-vt68.html" title="ETags" target="_blank">este site</a>.</p>
<h4>Regra número 14: Fazer cache de Ajax</h4>
<p>Quando uma aplicação tiver um arquivo Ajax com conteúdo estático o ideal seria usar a regra 3 nesses arquivos. Dependendo da quantidade de arquivos deste tipo seu site pode ficar bastante rápido e intuitivo.</p>
<p>Espero que tenham gostado pessoal, postem por favor!  Próximo post estou pensando em adicionar mais uma funcionalidade a biblioteca ajax que já apresentei anteriormente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Compactar com GZip e armazenar em Cache arquivos .js e .css (solução)</title>
		<link>http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/</link>
		<comments>http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 00:04:40 +0000</pubDate>
		<dc:creator>meiocodigo</dc:creator>
		
		<category><![CDATA[js]]></category>

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

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/</guid>
		<description><![CDATA[ Editado:
Pessoal, para a melhor solução para este tipo de problema vejam a regra número 4 deste post.
Se quizer entender mais sobre GZip continue lendo.
Fim da edição. 
GZip é uma compactação feita pelo servidor web antes de enviar os arquivos para o browser, mas para que isso ocorra com sucesso deve-se mudar o cabeçalho dos [...]]]></description>
			<content:encoded><![CDATA[<p><em> Editado:</em></p>
<p>Pessoal, para a melhor solução para este tipo de problema vejam a regra número 4 <a href="http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/" title="GZIP">deste post</a>.<br />
Se quizer entender mais sobre GZip continue lendo.</p>
<p><em>Fim da edição. </em></p>
<p>GZip é uma compactação feita pelo servidor web antes de enviar os arquivos para o browser, mas para que isso ocorra com sucesso deve-se mudar o cabeçalho dos arquivos para indicar que o arquivo aceita esse tipo de compactação, para que o servidor compacte este arquivo e quando esse arquivo chegar no browser, este descompacte-o, tornando-o um arquivo normal como todos os outros novamente.</p>
<p>A motivo de informação sobre os benefícios da compactação GZip darei um exemplo de uma biblioteca muito famosa, a <a href="http://jquery.com/" title="jQuery" target="_blank">JQuery</a>, que tem em torno de 77kb em sua forma normal. Se for usado o <a href="http://developer.yahoo.com/yui/compressor/" title="YUI Compressor" target="_blank">compactador de javascript do Yahoo!</a> ele passa a ter em torno de 46kb, e se for usada a compactação GZip em cima desse arquivo a biblioteca fica com incríveis 15kb!</p>
<p>Vinha a um tempo pensando em uma forma inteligente de compactar arquivos &#8220;.js&#8221; e &#8220;.css&#8221; usando GZip. Li vários artigos no Yahoo! e em fórums diversos e não encontrei nada falando a respeito, e quando falavam não era de forma clara, tanto é que só fui ver uma forma inteligente de se fazer isso a uns minutos atrás, quando achei algo a respeito no site do <a href="http://extensions.joomla.org/component/option,com_mtree/task,viewlink/link_id,3249/Itemid,35/" title="Extensão do Joomla" target="_blank">Joomla</a>. É uma extensão que modifica o cabeçalho dos arquivos que são incluídos nas páginas desse sistema. Vendo a extensão eu pude ver o quão simples é modificar o cabeçalho de arquivos .css e .js de forma inteligente. Antes havia pensado em modificar a extensão dos arquivos para &#8220;.php&#8221; e fazer essas modificações (trabalho de corno), vi que funcionou mas não era viável em um projeto grande.</p>
<p>Bom, falei demais já. Vamos para o código da solução:</p>
<pre class="”prettyprint”">  /**
* @author Fábio Miranda Costa <fabiomcosta@gmail.com> <fabiocosta@maxmeio.com>
* Usado para compactar arquivos JS e CSS, acrescenta-os ao cache do browser
* e faz algumas melhorias adicionais. <script src="incs/file_inc.php?file=funcs.js" type="text/javascript"></script>
<link href="incs/file_inc.php?file=jquery.tooltip.css" rel="stylesheet" type="text/css" />*/
$file = $_GET[&#8221;file&#8221;];
$ext = substr($file,strrpos($file, &#8220;.&#8221;)+1,strlen($file));
</fabiocosta@maxmeio.com></fabiomcosta@gmail.com>ob_start (&#8221;ob_gzhandler&#8221;);
<fabiomcosta@gmail.com><fabiocosta@maxmeio.com>if($ext==&#8221;js&#8221;) $ext=&#8221;javascript&#8221;;
header( &#8220;Content-type: text/&#8221;.$ext.&#8221;; charset: </fabiocosta@maxmeio.com></fabiomcosta@gmail.com><span class="attribute-value">iso-8859-1</span><fabiomcosta@gmail.com><fabiocosta@maxmeio.com>&#8220;);//não se esqueça de mudar para o charset que você usa
header( &#8220;Content-Encoding: gzip,deflate&#8221;);
header( &#8220;Expires: &#8220;.gmdate(&#8221;D, d M Y H:i:s&#8221;, time() + (24 * 60 * 60)) . &#8221; GMT&#8221;);//adiciona 1 dia ao tempo de expiração
header( &#8220;ETag: &#8220;);//a idéia é apagar o conteúdo da Etag, ver post http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/
header( &#8220;Cache-Control: must-revalidate, proxy-revalidate&#8221; );
include($file);
ob_flush();
</fabiocosta@maxmeio.com></fabiomcosta@gmail.com></pre>
<p>Fiz esse código o mais compacto possível, já que será usado em todos os includes de css e js do site.<br />
Não vou explicar muito como funciona, apenas como usá-lo, que é o que importa.<br />
Para usar é muito fácil, apenas crie um arquivos incluindo o código acima, no meu exemplo o arquivo é &#8220;file_inc.php&#8221;, e coloque no cabeçalho do seu site os includes de arquivos css e javascript seguindo os exemplos abaixo:</p>
<p>para javascript:</p>
<pre class="”prettyprint”">
&lt;script src="incs/file_inc.php?file=funcs.js" type="text/javascript"&gt;&lt;/script&gt;</pre>
<p>No atributo &#8220;src&#8221; coloque o caminho para o arquivo &#8220;file_inc.php&#8221; depois passe a variável &#8220;file&#8221; usando GET, ou seja adicione o texto &#8220;?file=&#8221; logo após o nome do arquivo, como pode-se ver no exemplo e depois coloque o endereço do arquivo &#8220;.js&#8221; que você quer incluir em seu site. Lembrando que esse endereço será sempre relativo ao arquivos file_inc.php, ou seja, se o &#8220;file_inc.php&#8221; estiver na pasta &#8220;inc/includer/&#8221; e o arquivo que você quer incluir está na pasta &#8220;inc/js/&#8221; o &#8220;src&#8221; do include ficará &#8220;inc/includer/file_inc.php?file=../js/funcs.js&#8221;.</p>
<p>para css:</p>
<pre class="”prettyprint”">&lt;link href="incs/file_inc.php?file=styles.css" rel="stylesheet" type="text/css" /&gt;</pre>
<p>Com o css é a mesma coisa, o que muda é apenas o óbvio, ou seja, a tag será &#8220;link&#8221; e o atributo usado passará a ser &#8220;href&#8221;.<br />
<a href="http://www.meiocodigo.com/2007/12/21/melhorando-o-tempo-de-carregamento-de-um-site/" title="GZIP"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/10/25/compactar-com-gzip-e-armazenar-em-cache-arquivos-js-e-css-solucao/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Solução para update de &#8220;select&#8221; usando Ajax no IE</title>
		<link>http://www.meiocodigo.com/2007/08/27/solucao-para-update-de-select-usando-ajax-no-ie/</link>
		<comments>http://www.meiocodigo.com/2007/08/27/solucao-para-update-de-select-usando-ajax-no-ie/#comments</comments>
		<pubDate>Mon, 27 Aug 2007 22:58:25 +0000</pubDate>
		<dc:creator>fabiomcosta</dc:creator>
		
		<category><![CDATA[ie]]></category>

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

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/08/27/solucao-para-update-de-select-usando-ajax-no-ie/</guid>
		<description><![CDATA[Hoje, depois de um certo tempo sem postar, irei apresentar uma solução para o problema do update em tags &#8220;select&#8221; no IE, mas antes explicarei que problema é esse para quem não entendeu.
O Internet Explorer (IE) não aceita, por um bug, a inserção de nós &#8220;option&#8221; em um nó &#8220;select&#8221; usando a propriedade inneHTML do [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje, depois de um certo tempo sem postar, irei apresentar uma solução para o problema do update em tags &#8220;select&#8221; no IE, mas antes explicarei que problema é esse para quem não entendeu.<br />
O Internet Explorer (IE) não aceita, por um bug, a inserção de nós &#8220;option&#8221; em um nó &#8220;select&#8221; usando a propriedade inneHTML do mesmo. Ao se tentar isso as opções do &#8220;select&#8221; simplesmente não aparecem, ficam todas brancas, é tosco!<br />
por exemplo, se eu tentar executar o código abaixo as options não aparecerão no IE:</p>
<pre class="”prettyprint”">
document.getElementById("id_de_um_select").innerHTML = "Opção 1";</pre>
<p>Agora vou mostrar a solução para esse problema, ela é bem simples de entender e o método é bastante rápido e eficiente, eu mesmo que fiz depois de penar com esse bug e testar alguns métodos que encontrei por ai na net e ver que quando eles eram usados com uma lista muito grande de &#8220;options&#8221; o &#8220;select&#8221; demorava anos para ser atualizado. Nesse caso não o método funciona mais ou menos na mesma velocidade para lista de tamanhos diferentes. Eis o método, e logo abaixo a explicação do mesmo:</p>
<pre class="”prettyprint”"><code>
/**
 * Método usado para jogar conteúdo no innnerHTML de selects.
 * @param {Object} selectObj - o Select que receberá o texto.
 * @param {Object} texto -  o texto que será incorporado no objeto select.
 */
function updateSelect(selectObj,texto){
	var tempDiv = document.createElement("div");
	var attString = "";
	var att = selectObj.attributes;
	for(var i = 0 ; i &lt; att.length ; i++)
		if(att[i].nodeValue != "" &amp;&amp; att[i].nodeValue != null )//o IE diz que nó tem todos os atributos possíveis com valor null ou "" então temos que filtrar esses valores
			tempDiv.innerHTML = "&lt;select "+attString+"&gt;"+texto+"&lt;/select&gt;";
	var newSelect = tempDiv.firstChild;
	selectObj.parentNode.replaceChild(newSelect,selectObj);
	selectObj = null;tempDiv = null;
	return newSelect;
}</code></pre>
<p>Como podemos ver essa função tem dois parâmetros, &#8220;selectObj&#8221;  e &#8220;texto&#8221;. selectObj é o objeto select que receberá a string &#8220;texto&#8221; em seu &#8220;innerHTML&#8221;.<br />
Bom vou pular as partes bestas&#8230;<br />
No único &#8220;for&#8221; dessa função o que estou fazendo é jogando todos os atributos do nó &#8220;select&#8221; numa string para futuramente colocar no innerHTML de uma div temporário que é criada. Dentro da tag &#8220;select&#8221; eu coloco o parâmetro &#8220;texto&#8221; e jogo eles no innerHTML da div temporária, depois crio um select temporário que recebe o primeiro nó da div temporária (no caso é o nosso select) e substituo o select anterior por este novo.<br />
Simples não?</p>
<p>Vou anexar a este post a biblioteca &#8220;max&#8221;, que foi apresentada anteriormente em outro post, já com esse novo método sendo usado automaticamente ao se tentar fazer um update em um nó &#8220;select&#8221;.<br />
Em breve estarei postando mais um método para a biblioteca &#8220;max&#8221; que vai torná-la capaz de ser usada com o method &#8220;post&#8221;, normalmente usado em formulários.<br />
Qualquer dúvida em como usar a biblioteca por favor me avisem! e seu comentário é muito importante!!! <img src='http://www.meiocodigo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h5>Arquivos:</h5>
<ul class="arquivos">
<li><a href="http://www.meiocodigo.com/wp-content/uploads/2007/08/biblioteca_max.zip" title="Biblioteca Max">Biblioteca Max 0.19</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/08/27/solucao-para-update-de-select-usando-ajax-no-ie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flash cobrindo conteúdo (solução)</title>
		<link>http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/</link>
		<comments>http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 13:46:05 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
		
		<category><![CDATA[Flash]]></category>

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

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

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/</guid>
		<description><![CDATA[Um problema muito comum para quem usa flash combinado com html e css, apenas para destacar alguns detalhes, é o fato de o flash cobrir o conteúdo da página por padrão. Eu particularmente enfrentei este problema várias vezes ao tentar colocar um menu drop-down que ao ser visualizado deveria cobrir o flash. Mas o menu [...]]]></description>
			<content:encoded><![CDATA[<p>Um problema muito comum para quem usa flash combinado com html e css, apenas para destacar alguns detalhes, é o fato de o flash cobrir o conteúdo da página por padrão. Eu particularmente enfrentei este problema várias vezes ao tentar colocar um menu drop-down que ao ser visualizado deveria cobrir o flash. Mas o menu ficava sempre escondido atrás do flash.</p>
<p>Para solucionar o caso eu utilizei os seguintes conceitos:</p>
<ul>
<li>A propriedade z-index do CSS;</li>
<li>posicionamento do CSS;</li>
<li>As tags object e embed;</li>
<li>e o atributo wmode do vídeo.</li>
</ul>
<p>O z-index pelo que eu tenho percerbido e lido em diversos lugares só funciona em elementos html que estejam &#8220;posicionados&#8221;, ou seja, tenham o atributo position com o valor absolute, relative ou fixed.</p>
<p>Portanto, colocaremos o video flash dentro de uma div e aplicaremos o seguinte css a ela:</p>
<pre class=”prettyprint”><code>div#flash_div{
position: relative;
z-index: 0;
}</code></pre>
<p>E devemos fazer o mesmo para os objetos que queremos que sobreponham o flash.</p>
<p>Como existem muitas divergências na renderização entre os browsers, é necessário fazer duas chamadas ao vídeo: uma por meio da tag object(a qual é aceita pelo Internet Explorer) e por meio da tag embed(aceita pelo firefox). Ambas as tags terão os mesmos atributos. E dentre eles deve-se setar o wmode do object e do embed para transparent:</p>
<pre class=”prettyprint”><code>
&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="214" height="229" id="monitor" align=""&gt;
&lt;param name="movie" value="images/monitor.swf"&gt;
&lt;param name="quality" value="high"&gt;
<strong>&lt;param name=&#8221;wmode&#8221; value=&#8221;transparent&#8221;&gt;</strong>
&lt;embed <strong>wmode=&#8221;transparent&#8221;</strong> src=&#8221;images/monitor.swf&#8221; quality=&#8221;high&#8221; bgcolor=&#8221;#FFFFFF&#8221; width=&#8221;214&#8243; height=&#8221;229&#8243; name=&#8221;monitor&#8221; align=&#8221;" type=&#8221;application/x-shockwave-flash&#8221; pluginspage=&#8221;http://www.macromedia.com/go/getflashplayer&#8221;&gt;&lt;/embed&gt;
&lt;/object&gt;</code></pre>
<p>Eu resolvi meu problema assim. Com apenas uma ressalva: essa solução não funciona para usuário do Linux, e não tenho conhecimento de nenhuma outra solução. Espero ter ajudado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/06/20/flash-cobrindo-conteudo-solucao/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Operaçoes matemáticas com datas em PHP</title>
		<link>http://www.meiocodigo.com/2007/06/12/operacoes-matematicas-com-datas-em-php/</link>
		<comments>http://www.meiocodigo.com/2007/06/12/operacoes-matematicas-com-datas-em-php/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 13:14:43 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2007/06/12/operacoes-matematicas-com-datas-em-php/</guid>
		<description><![CDATA[Hoje eu vou falar de um problema que eu vejo muito nos fórums de comunidades de programadores PHP iniciantes. As lendárias operações sobre datas.
Vou listar as funções mais significativas para o nosso problema:

date
mktime
explode

Com estas três funções acima já é possível converter datas de um formato para outro facilmente.
Para exemplificar, eu irei criar um script que, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje eu vou falar de um problema que eu vejo muito nos fórums de comunidades de programadores PHP iniciantes. As lendárias operações sobre datas.</p>
<p>Vou listar as funções mais significativas para o nosso problema:</p>
<ul>
<li><a href="http://br2.php.net/manual/pt_BR/function.date.php">date</a></li>
<li><a href="http://br2.php.net/manual/pt_BR/function.mktime.php">mktime</a></li>
<li><a href="http://br2.php.net/manual/pt_BR/function.explode.php">explode</a></li>
</ul>
<p>Com estas três funções acima já é possível converter datas de um formato para outro facilmente.</p>
<p>Para exemplificar, eu irei criar um script que, baseado na minha data de nascimento(11/08/1986), converta-a para um formato usado em <a href="http://pt.wikipedia.org/wiki/Sgbd">SGBDs</a> (aaaa-mm-dd). Depois o script irá retornar a minha idade em dias, meses e anos.</p>
<p>Vamos primeiro aprender a converter data do formato mais amigável ao ser humano(dd/mm/aaaa) para o formato utilizado pela maioria dos <a href="http://pt.wikipedia.org/wiki/Sgbd">SGBDs</a> (aaaa-mm-dd). Para isso vamos usar o método explode, para separar os valores de dias, meses e anos, supondo que temos uma string no formato dd/mm/aaaa:</p>
<pre class=”prettyprint”><code>$data = "11/08/1986"; //minha data de nascimento
<strong>$vetor = explode(&#8221;/&#8221;,$data);</strong>
$dias = $vetor[0];
$meses = $vetor[1];
$anos = $vetor[2];
<strong>$data_formatada = $anos.&#8221;-&#8221;.$meses.&#8217;-&#8217;.$dias;</strong></code></pre>
<p>No código acima, foi gerado uma string de data no formato aceito pelos campos DATE dos SGBDs.</p>
<p>Para realizar operações entre datas, e desta forma, encontrarmos a diferença entre o dia de hoje e meu nascimento, usaremos o método mktime e o método date, aplicados aos valores de $dias, $meses e $anos obtidos no código acima. E o método date, para obter a data atual.</p>
<pre class=”prettyprint”><code>$dias_atuais = date("d");
$meses_atuais = date("m");
$anos_atuais = date("Y");
$diferenca_segundos = mktime(0,0,0,$meses_atuais - $meses,$dias_atuais-$dias,$anos_atuais-$anos);
$diferenca_minutos = $diferenca_segundos/60;
$diferenca_horas = $diferenca_minutos/60;</code></pre>
<p>Pronto, com o código acima eu encontrei a minha idade em segundo, em minutos e em horas. Com essa mesma lógica é possível encontrar em dias e semanas. Meses e anos é um pouco mais complicado pois necessita de verificar quais meses tem 28, 30 ou 31 dias, e que anos são ou não bissextos.</p>
<p>Vamos deixar este detalhe para um próximo post.</p>
<p>Espero que tenha ajudado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2007/06/12/operacoes-matematicas-com-datas-em-php/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
