<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Igor Escobar // Blog</title>
	
	<link>http://www.igorescobar.com/blog</link>
	<description>Desenvolvimento, Tecnologia e Informação, na ponta do lápis.</description>
	<lastBuildDate>Tue, 06 Dec 2011 10:00:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/IgorEscobar/Blog" /><feedburner:info uri="igorescobar/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Aumente a performance do seu site com cache .htaccess</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/NSCvlLE9eYw/</link>
		<comments>http://www.igorescobar.com/blog/2011/11/15/aumente-a-performance-do-seu-site-com-cache-htaccess/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 17:07:43 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Otimização]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=448</guid>
		<description><![CDATA[Existem várias formas de se aumentar a performance de uma aplicação web, e quando eu falo aplicação web o mesmo se aplica a sites. Uma das formas mais eficientes de lidar com performance é concentrar esforços para aumentar a sensação de carregamento instantâneo da sua aplicação. Steve Souders escreveu um livro excelente chamado: High Performance Websites e [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.igorescobar.com/blog/2011/11/15/aumente-a-performance-do-seu-site-com-cache-htaccess/apache_htaccess/" rel="attachment wp-att-449"><img class="alignleft size-full wp-image-449" title="apache_htaccess" src="http://www.igorescobar.com/blog/wp-content/uploads/2011/11/apache_htaccess.jpg" alt="" width="183" height="181" /></a></p>
<p>Existem várias formas de se aumentar a performance de uma aplicação web, e quando eu falo aplicação web o mesmo se aplica a sites. Uma das formas mais eficientes de lidar com performance é concentrar esforços para aumentar a sensação de carregamento instantâneo da sua aplicação.</p>
<p>Steve Souders escreveu um livro excelente chamado: <strong>High Performance Websites </strong>e nele, Steve, falou algo que me chamou muita atenção:</p>
<p><em>&#8220;Na maior parte da minha carreira em Internet, fui engenheiro de back-end. Como tal, eu diligentemente atacava cada projeto de performance como um exercício em otimização de back-end, me concentrando em opções de compilação, índices de bases de dados, gerenciamento de memória, etc. Existe muita atenção e vários livros dedicados a otimização performance nessas áreas, então é nelas que a maioria das pessoas emprega seu tempo, procurando melhorias. Na realidade, para a maioria das páginas de Internet, menos de 10% a 20% do tempo de resposta experimentado pelos usuários finais é gasto trazendo o documento HTML do servidor para o browser. Se você quer redurzir dramaticamente os tempos de resposta de suas páginas, tem de se concentrar nos restantes 80% a 90% da experiência do usuário final. No que sesses 80% a 90% são empregados?&#8221;</em></p>
<p>Umas das regras para se otimizar o carregamento de uma interface web, talvez uma das mais importantes, é diminuindo o número de requisições HTTP que esta interface está fazendo.</p>
<p>Existem diversas técnicas para se reduzir o número de requisições HTTP de uma aplicação web, porém, a que vamos abordar hoje é somente um pequeno pedaço deste trabalho, porém, uma parte muito importante dele.</p>
<h2>A negligência e o cache.</h2>
<p>Existe uma negligência muito grande por parte dos programadores e engenheiros com relação ao cache. Não podemos simplesmente cachear tudo e todos. Existe um nível de importancia que deve ser empregado para cada tipo de mídia que estamos cacheando. Vai de negócio para negócio, Na aplicação X os arquivos javascript podem não ser muito importante mas os arquivos mp3 são importantíssimos e vice-versa. É muito importante darmos o tempo certo de vida para cada tipo de mídia sempre olhando para o nosso negócio.</p>
<p>Botando a negligência de lado, por quê o cache é importante? para evitar que o usuário pague o preço. Para que ele baixe somente o que é necessário.</p>
<h2>Diretivas .htaccess para cache</h2>
<pre class="brush: plain; title: ; notranslate">
# 1 ANO
&lt;FilesMatch &quot;\.(ico|pdf|flv)$&quot;&gt;
Header set Cache-Control &quot;max-age=29030400, public&quot;
&lt;/FilesMatch&gt;
# 1 SEMANA
&lt;FilesMatch &quot;\.(jpg|jpeg|png|gif|swf)$&quot;&gt;
Header set Cache-Control &quot;max-age=604800, public&quot;
&lt;/FilesMatch&gt;
# 2 DIAS
&lt;FilesMatch &quot;\.(xml|txt|css|js)$&quot;&gt;
Header set Cache-Control &quot;max-age=172800, proxy-revalidate&quot;
&lt;/FilesMatch&gt;
# 1 MINUTO
&lt;FilesMatch &quot;\.(html|htm|php)$&quot;&gt;
Header set Cache-Control &quot;max-age=60, private, proxy-revalidate&quot;
&lt;/FilesMatch&gt;
</pre>
<p>Veja que é possível darmos um tempo de &#8220;vida&#8221; do cache de um arquivo de acordo com a sua extensão. É importante ressaltar que os tempos que foram dados no exemplo acima é somente um exemplo. Como eu disse acima, é importante você colocar na balança o que é mais importante para o seu negócio.</p>
<h2>.htaccess Time Cheatsheet</h2>
<pre class="brush: plain; title: ; notranslate">
# TIME CHEAT SHEET
#      300   5 MIN
#      600  10 MIN
#      900  15 MIN
#     1800  30 MIN
#     2700  45 MIN
#
#     3600   1 HR
#     7200   2 HR
#    10800   3 HR
#    14400   4 HR
#    18000   5 HR
#    36000  10 HR
#    39600  11 HR
#    43200  12 HR
#    46800  13 HR
#    50400  14 HR
#    54000  15 HR
#    86400  24 HR
#
#    86400   1 DAY
#   172800   2 DAY
#   259200   3 DAY
#   345600   4 DAY
#   432000   5 DAY
#   518400   6 DAY
#   604800   7 DAY
#
#   604800   1 WEEK
#  1209600   2 WEEK
#  1814400   3 WEEK
#  2419200   4 WEEK
#
#  2419200   1 MONTH
#  4838400   2 MONTH
#  7257600   3 MONTH
#  9676800   4 MONTH
# 12096000   5 MONTH
# 14515200   6 MONTH
# 16934400   7 MONTH
# 19353600   8 MONTH
# 21772800   9 MONTH
# 24192000  10 MONTH
# 26611200  11 MONTH
# 29030400  12 MONTH
</pre>
<p>Se este snipet não funcionar (o que é bem improvável) você pode utilizar este snipet em conjunto com a extensão <strong>mod_expires</strong> do apache.</p>
<pre class="brush: plain; title: ; notranslate">
&lt;IfModule mod_expires.c&gt;
ExpiresActive On
ExpiresDefault A300
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A3600
ExpiresByType text/css A3600
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A300
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A300
&lt;/IfModule&gt;
</pre>
<p>O legal de se utilizar o mod_expires é que ele trata o a questão do cache de acordo com o mime-type de cada arquivo e não somente pela extensão.</p>
<h2>Tá, mais, é o ideal gerenciar desta forma?</h2>
<p>Não. Existem formas mais inteligentes de gerenciar as mudanças dos seus arquivos e fazer com que eles sejam baixados novamente pelo navegador do usuário somente quando ele realmente for atualizado, porém, esta é uma forma um pouco mais &#8220;custosa&#8221; e eu certamente irei falar com mais profundidade sobre isso em um próximo post.</p>
<h2>Conclusão</h2>
<p>Podemos minimizar o número de requisições HTTP de nossa aplicação gerenciando de forma mais inteligente os arquivos que estamos incorporando dentro de nossa aplicação web utilizando recursos simples e nativos do nosso apache, como o exemplificado aqui. Esta não é a forma mais eficiente, mas com certeza, vai ajudar muito a minimizar o número de requisições HTTP que sua aplicação web fará nas nas próximas paginas que seu usuário for navegar.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li>Nenhum post relacionado!</li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/NSCvlLE9eYw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2011/11/15/aumente-a-performance-do-seu-site-com-cache-htaccess/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2011/11/15/aumente-a-performance-do-seu-site-com-cache-htaccess/</feedburner:origLink></item>
		<item>
		<title>Abreviando um texto sem cortar palavras no PHP</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/IHYbAEUDkTk/</link>
		<comments>http://www.igorescobar.com/blog/2011/09/19/abreviando-um-texto-sem-cortar-palavras-no-php/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 17:03:56 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Utilidades]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=435</guid>
		<description><![CDATA[Olá Pessoal! Como apresentar soluções para problemas cotidianos, é um dos objetivos deste blog, vou compartilhar com vocês uma solução que escrevi para que vocês possam abreviar um texto, sem cortar qualquer palavra pela metade. É extremamente chato, quando estamos lendo o resumo de uma notícia e nos deparamos com uma palavra cortada, dificultando a [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal!<br />
Como apresentar soluções para problemas cotidianos, é um dos objetivos deste blog, vou compartilhar com vocês uma solução que escrevi para que vocês possam abreviar um texto, sem cortar qualquer palavra pela metade.</p>
<p>É extremamente chato, quando estamos lendo o resumo de uma notícia e nos deparamos com uma palavra cortada, dificultando a compreensão do texto. É feio, principalmente para a estética do layout.</p>
<p>A maioria das funções escritas (em qualquer linguagem) para abreviar um texto, acabam cortando o texto pela metade. Você passa 2 parâmetros: <strong>String</strong> Texto e <strong>Int</strong> Limite.</p>
<p>Texto é o texto própriamente dito, e Limite é o tamanho máximo que o texto deve ocupar. Se o texto for maior que 250 caractéres, o script abrevia o texto sem estourar o limite e sem cortar palavras pela metade, caso contrário, deixa o textocomo está.</p>
<p><strong>A solução que escrevi foi esta:</strong></p>
<pre class="brush: php; title: ; notranslate">
public function abreviaString($texto, $limite, $tres_p = '...')
{
    $totalCaracteres = 0;
    //Retorna o texto em plain/text
    $texto = Biblioteca::somenteTexto($texto);
    //Cria um array com todas as palavras do texto
    $vetorPalavras = explode(&quot; &quot;,$texto);
    if(strlen($texto) &lt;= $limite):
        $tres_p = &quot;&quot;;
        $novoTexto = $texto;
    else:
        //Começa a criar o novo texto resumido.
        $novoTexto = &quot;&quot;;
        //Acrescenta palavra por palavra na string enquanto ela
        //não exceder o tamanho máximo do resumo
        for($i = 0; $i &lt;count($vetorPalavras); $i++):
            $totalCaracteres += strlen(&quot; &quot;.$vetorPalavras[$i]);
            if($totalCaracteres &lt;= $limite)
                $novoTexto .= ' ' . $vetorPalavras[$i];
            else break;
        endfor;
    endif;
    return $novoTexto . $tres_p;
}
</pre>
<p>Note que eu chamei uma função estática chamada somenteTexto(). Quem quiser o fonte dela e saber como ela está implementada, está ai:</p>
<pre class="brush: php; title: ; notranslate">
    public static function somenteTexto($string)
    {
        $trans_tbl = get_html_translation_table(HTML_ENTITIES);
        $trans_tbl = array_flip($trans_tbl);
        return trim(strip_tags(strtr($string, $trans_tbl)));
    }
</pre>
<p>Esta é a solução enviada pelo <strong><a href="http://ferrari.eti.br/">Carlos André Ferrari</a></strong> nos comentários do blog:</p>
<pre class="brush: php; title: ; notranslate">
function abreviaString($texto, $limite, $tres_p = '…') {
  //Retorna o texto em plain/text
  $texto = Biblioteca::somenteTexto($texto);

  if (strlen($texto) &lt;= $limite)
    return $texto;
  return array_shift(explode('||', wordwrap($texto, $limite, '||'))) . $tres_p;
}
</pre>
<p>É importante que, antes de abreviarmos um texto, recebermos o texto puro, livre de tags htmls, scripts ou qualquer outra coisa que não faça parte do texto. Quando isso ocorre, dificulta a abreviação pois o algoritmo não sabe o que é texto e o que é metacaracter.</p>
<p>E é isso aí pessoal, o código está bem comentádo e documentado, caso vocês tenham alguma dúvida, fiquem a vontade para perguntar nos comentários.</p>
<p>Qualquer outra implementação que vocês tenham, que faça a mesma coisa, até mesmo em outras linguagens, o share é totalmente bem-vindo.</p>
<p>[]&#8216;s<br />
Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li><a href='http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/' title='Screenshots com PHP '>Screenshots com PHP </a></li>
<li><a href='http://www.igorescobar.com/blog/2010/11/10/treinamento-phpunit-gratuito/' title='Treinamento PHPUnit Gratuíto'>Treinamento PHPUnit Gratuíto</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/09/21/capturando-miniatura-de-videos-com-php/' title='Capturando miniatura de vídeos com PHP'>Capturando miniatura de vídeos com PHP</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/22/mais-um-zend-certified-engineer/' title='Mais um Zend Certified Engineer'>Mais um Zend Certified Engineer</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/05/falta-pouco-para-a-zce/' title='Falta pouco para a ZCE'>Falta pouco para a ZCE</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/IHYbAEUDkTk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2011/09/19/abreviando-um-texto-sem-cortar-palavras-no-php/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2011/09/19/abreviando-um-texto-sem-cortar-palavras-no-php/</feedburner:origLink></item>
		<item>
		<title>Screenshots com PHP</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/EJSNF0GV58A/</link>
		<comments>http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 13:00:00 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[screenshots]]></category>
		<category><![CDATA[snappy]]></category>
		<category><![CDATA[wkhtmltoimage]]></category>
		<category><![CDATA[wkhtmltopdf]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=382</guid>
		<description><![CDATA[Salvar screenshots de um site não é uma tarefa muito comum de um programador, porém, esta é uma tarefa interessante de ser feita. Existem algumas soluções interessantes para se resolver esta tarefa, porém, existe um cara em especial que me chamou a atenção e atendeu muito bem as minhas necessidades. Requisito para prosseguir com a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/u36/" rel="attachment wp-att-407"><img class="alignleft size-medium wp-image-407" title="u36" src="http://www.igorescobar.com/blog/wp-content/uploads/2011/09/u36-300x225.jpg" alt="" width="300" height="225" /></a>Salvar screenshots de um site não é uma tarefa muito comum de um programador, porém, esta é uma tarefa interessante de ser feita. Existem algumas soluções interessantes para se resolver esta tarefa, porém, existe um cara em especial que me chamou a atenção e atendeu muito bem as minhas necessidades. Requisito para prosseguir com a solução apresentada neste post é instalar o <a href="http://code.google.com/p/wkhtmltopdf/" target="_blank">wkhtmltoimage</a>. Se você acessar o site do projeto vai ver que o nome dele é wkhtmltopdf e não wkhtmltoimage, como é mencionado. O <a href="http://code.google.com/p/wkhtmltopdf/" target="_blank">wkhtmltoimage</a> existe nos downloads do projeto, você só precisa instalar a versão adequada para o seu sistema operacional. Tem versões para Linux, Mac e Windows. Vou guiá-los com base no texto <a href="http://www.codediesel.com/php/taking-screenshots-of-websites-in-php/" target="_blank">Taking screenshots of websit</a><a href="http://www.codediesel.com/php/taking-screenshots-of-websites-in-php/" target="_blank">es with PHP.</a></p>
<p>O <a href="http://code.google.com/p/wkhtmltopdf/" target="_blank">wkhtmltoimage</a> é um simples utilitário para ser executado via shell que faz a conversão de HTML para imagem usando o <a href="http://www.webkit.org/" target="_blank">WebKit Engine</a> e <a href="http://qt.nokia.com/" target="_blank">QT</a>. Não é bem uma conversão. A ferramenta renderiza o endereço requisitado utilizando o <a href="http://www.webkit.org/" target="_blank">WebKit Engine</a> e tira um screenshot desta renderização utilizando o <a href="http://qt.nokia.com/" target="_blank">QT</a>.</p>
<h2>Fazendo sua primeira screenshot</h2>
<p>Levando em consideração que você já tenha o <a href="http://code.google.com/p/wkhtmltopdf/" target="_blank">wkhtmltoimage</a> instalado corretamente, abra o seu terminal e digite:</p>
<pre class="brush: plain; title: ; notranslate">wkhtmltoimage http://www.google.com google.jpg</pre>
<p>O código acima vai converter toda a representação HTML do Google e vai converter isso para jpg usando o <a href="http://code.google.com/p/wkhtmltopdf/" target="_blank">wkhtmltoimage</a>.</p>
<h2>Customizando a saída</h2>
<p>O comando wkhtmltoimage tem uma série de opções:</p>
<ul>
<li>Desabilitar a renderização de imagens.</li>
<li>Controlar a qualidade da imagem de output.</li>
<li>Salvar o screenshot com uma resolução específica.</li>
<li>Salvar uma região especifíca do screenshot (crop).</li>
<li>Desabilitar o javascript da pagina requisitada.</li>
</ul>
<h3>Exemplos</h3>
<pre class="brush: plain; title: ; notranslate">
//renderiza sem imagens
wkhtmltoimage --no-images http://www.google.com google.jpg

//não carrega os javascripts
wkhtmltoimage --no-javascript http://www.google.com google.jpg

//reduz a qualidade da imagem de output
wkhtmltoimage --quality 50 http://www.google.com google.jpg

//personaliza a largura e a altura do screenshot
wkhtmltoimage --height 600 --width 1800 http://www.google.com google.jpg

//faz um crop de 300x300 pixels partindo do eixo x0 e y0
wkhtmltoimage --crop-h 300 --crop-w 300 --crop-x 0 --crop-y 0 http://www.google.com google.jpg
</pre>
<h2>Utilizando com PHP</h2>
<p>Como já era de se imaginar, toda esta façanha não é feita somente com PHP. Você precisa da ajuda de alguns caras e para que o PHP consiga executar estes comandos, vamos precisar da ajuda de um método chamado <a href="http://php.net/manual/en/function.shell-exec.php" target="_blank">shell_exec</a> do PHP. Também podemos utilizar um wrapper escrito em PHP5 que abstrai os métodos do wkhtmltoimage e wkhtmltopdf chamado <a href="https://github.com/knplabs/snappy" target="_blank">Snappy</a> escrito em PHP5 do PHP.</p>
<h3>Método 1: shell_exec</h3>
<pre class="brush: php; title: ; notranslate">shell_exec('./wkhtmltoimage --quality 50 http://www.google.com google.jpg');</pre>
<h3>Método 2: Snappy</h3>
<pre class="brush: php; title: ; notranslate">
&lt;?php

namespace Knplabs\Snappy;

require_once('Knplabs/Snappy/Media.php');
require_once('Knplabs/Snappy/Image.php');

/* 'wkhtmltoimage' executable  is located in the current directory */
$snap = new Image('./wkhtmltoimage');

/* Displays the bbc.com website index page screenshot in the browser */
header(&quot;Content-Type: image/jpeg&quot;);
$snap-&gt;output('http://www.bbc.com');

?&gt;
</pre>
<p>Com alguns métodos adicionados&#8230;</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

namespace Knplabs\Snappy;

require_once('Knplabs/Snappy/Media.php');
require_once('Knplabs/Snappy/Image.php');

$options = array('zoom' =&gt; 0.5, 'no-images' =&gt; true);

/* 'wkhtmltoimage' executable  is located in the current directory */
$snap = new Image('./wkhtmltoimage-i386',$options);

/* Displays the bbc.com website index page screen-shot in the browser */
header(&quot;Content-Type: image/jpeg&quot;);
$snap-&gt;output('http://www.bbc.com');

?&gt;
</pre>
<p>É isso aí!</p>
<p>Qualquer dúvida, estou à disposição.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li><a href='http://www.igorescobar.com/blog/2011/09/19/abreviando-um-texto-sem-cortar-palavras-no-php/' title='Abreviando um texto sem cortar palavras no PHP'>Abreviando um texto sem cortar palavras no PHP</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/11/10/treinamento-phpunit-gratuito/' title='Treinamento PHPUnit Gratuíto'>Treinamento PHPUnit Gratuíto</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/09/21/capturando-miniatura-de-videos-com-php/' title='Capturando miniatura de vídeos com PHP'>Capturando miniatura de vídeos com PHP</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/22/mais-um-zend-certified-engineer/' title='Mais um Zend Certified Engineer'>Mais um Zend Certified Engineer</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/05/falta-pouco-para-a-zce/' title='Falta pouco para a ZCE'>Falta pouco para a ZCE</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/EJSNF0GV58A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/</feedburner:origLink></item>
		<item>
		<title>Git: Visualizando versões anteriores de um arquivo</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/X3XcZpkZSQk/</link>
		<comments>http://www.igorescobar.com/blog/2011/06/14/git-visualizando-versoes-anteriores-de-um-arquivo/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 19:14:43 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=360</guid>
		<description><![CDATA[Um dos principais objetivos que me fez criar este blog é ajudar as pessoas que me acompanham a resolver problemas corriqueiros quando se trabalha com desenvolvimento de software. No último mês trabalhei em um projeto onde tive vários problemas com versões de arquivo. As coisas simplesmente sumiam de onde deveriam estar ou cagadas decorrentes de [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-361" href="http://www.igorescobar.com/blog/2011/06/14/git-visualizando-versoes-anteriores-de-um-arquivo/istock_000000237891xsmall_3/"><img class="alignleft size-full wp-image-361" title="git source code" src="http://www.igorescobar.com/blog/wp-content/uploads/2011/06/iStock_000000237891XSmall_3.jpg" alt="" width="323" height="243" /></a>Um dos principais objetivos que me fez criar este blog é ajudar as pessoas que me acompanham a resolver problemas corriqueiros quando se trabalha com desenvolvimento de software.</p>
<p>No último mês trabalhei em um projeto onde tive vários problemas com versões de arquivo. As coisas simplesmente sumiam de onde deveriam estar ou cagadas decorrentes de comandos espartanos.</p>
<p>Então, aqui vai um comando do <a title="Git Project" href="http://git-scm.com/" target="_blank">git</a> bem interessante, que me salvou diversas vezes:</p>
<pre class="brush: plain; title: ; notranslate"> git show HEAD~2:/caminho/do/arquivo.txt </pre>
<p>Só para você conseguir entender melhor o comando, a estrutura é bem simples. <strong>HEAD</strong> seria a revisão onde o arquivo se encontra e o que tem depois do &#8220;<strong>~</strong>&#8221; seria a versão do arquivo onde 1 seria a versão atual e a 2 seria a anterior a atual e este número pode ser o numero que você quiser (desde que a versão existe). E após os dois pontos seria o caminho do arquivo que você quer ver a versão.</p>
<p>E foi assim que eu consegui resolver vários problemas sem ter que re-escrever tudo denovo.</p>
<h3>Conclusão</h3>
<p>Use o <a href="http://git-scm.com/" target="_blank">git</a> (ou qualquer controle de versão) não importa o tamanho ou a importância do projeto. Use um controle de versão. Além dele garantir o versionamento dos seus arquivos, ter uma boa gama de recursos para melhor organização, dinâmica de projeto, trabalho em grupo e etc., ele proporciona uma camada a mais de segurança dos seus arquivos. Se não fosse pelo <a href="http://git-scm.com/" target="_blank">git</a> eu estaria atrasado com o meu prazo ou muito provavelmente teria madrugado algumas noites a mais.</p>
<p>[]&#8216;s</p>
<p>Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li><a href='http://www.igorescobar.com/blog/2011/05/23/personalizando-o-terminal-para-trabalhar-com-git/' title='Personalizando o terminal para trabalhar com Git'>Personalizando o terminal para trabalhar com Git</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/X3XcZpkZSQk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2011/06/14/git-visualizando-versoes-anteriores-de-um-arquivo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2011/06/14/git-visualizando-versoes-anteriores-de-um-arquivo/</feedburner:origLink></item>
		<item>
		<title>Personalizando o terminal para trabalhar com Git</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/ZGsSwxXwAoQ/</link>
		<comments>http://www.igorescobar.com/blog/2011/05/23/personalizando-o-terminal-para-trabalhar-com-git/#comments</comments>
		<pubDate>Mon, 23 May 2011 15:50:30 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=327</guid>
		<description><![CDATA[Olá Pessoal, Esta é uma dica bem simples para deixar o seu terminal um pouco mais intuitivo. Muitas vezes quando estamos trabalhando com git, precisamos saber exatamente onde estamos no repositório. Vou compartilhar um simples snippet de código que pode deixar a vista algumas informações bem úteis para vocês quando você estiver dentro e fora [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Esta é uma dica bem simples para deixar o seu terminal um pouco mais intuitivo. Muitas vezes quando estamos trabalhando com git, precisamos saber exatamente onde estamos no repositório. Vou compartilhar um simples snippet de código que pode deixar a vista algumas informações bem úteis para vocês quando você estiver dentro e fora de um repositório git.</p>
<h2>Configurando o Terminal</h2>
<p>Abra o seu arquivo .<strong>bashrc</strong>:</p>
<pre class="brush: plain; title: ; notranslate">

$&gt; vim ~/.bashrc
</pre>
<p>E insira o seguinte código no final do arquivo:</p>
<pre>PS1='\[\033[0;37m\][\t]\[\033[0;32m\][\u]\[\033[31m\][\h]`git branch 2&gt;/dev/null | grep \* | head -1 | sed "s/\* //g" | awk "{ print \"[ \"\\\$1 \" ]\" }"` \[\033[1;33m\]\w\a\[\033[0m\]\n\$ '</pre>
<p>Execute o seu .<strong>bashrc</strong> para que as alterações entrem em vigor:</p>
<pre class="brush: plain; title: ; notranslate">

$&gt; . ~/.bashrc
</pre>
<p>E o seu terminal vai ficar parecido com assim:</p>
<p><a rel="attachment wp-att-346" href="http://www.igorescobar.com/blog/2011/05/23/personalizando-o-terminal-para-trabalhar-com-git/git-no-terminal/"><img class="size-full wp-image-346 alignnone" title="git no terminal" src="http://www.igorescobar.com/blog/wp-content/uploads/2011/05/git-no-terminal.png" alt="" width="646" height="275" /></a></p>
<p>Ele vai informar para você <strong>Hora</strong>, <strong>Usuário</strong>, <strong>Máquina,</strong> <strong>Branch,</strong> <strong>Diretório </strong>e também organiza a área onde você digita seus comandos na linha de baixo para aumentar a área útil do terminal.</p>
<p>[]&#8216;s</p>
<p>Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li><a href='http://www.igorescobar.com/blog/2011/06/14/git-visualizando-versoes-anteriores-de-um-arquivo/' title='Git: Visualizando versões anteriores de um arquivo'>Git: Visualizando versões anteriores de um arquivo</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/ZGsSwxXwAoQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2011/05/23/personalizando-o-terminal-para-trabalhar-com-git/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2011/05/23/personalizando-o-terminal-para-trabalhar-com-git/</feedburner:origLink></item>
		<item>
		<title>Detectando Requisições Ajax com PHP</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/Zun4uMm8mEg/</link>
		<comments>http://www.igorescobar.com/blog/2010/12/16/detectando-requisicoes-ajax-com-php/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 17:32:50 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=311</guid>
		<description><![CDATA[É bem comum trabalharmos com requisições Ajax que batem em um servidor rodando alguma aplicação PHP. O problema é que as vezes utilizamos o mesmo método para atender tanto a arquitetura do seu sistema quanto as requisições que são feitas via Ajax. Por exemplo: Temos um objeto PHP que tem como objetivo recuperar todas as [...]]]></description>
			<content:encoded><![CDATA[<p>É bem comum trabalharmos com requisições <strong>Ajax</strong> que batem em um servidor rodando alguma aplicação <strong>PHP</strong>. O problema é que as vezes utilizamos o mesmo método para atender tanto a arquitetura do seu sistema quanto as requisições que são feitas via <strong>Ajax</strong>. </p>
<p><strong>Por exemplo</strong>: Temos um objeto <strong>PHP</strong> que tem como objetivo recuperar todas as notícias cadastradas na base de dados.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class MinhaClasse {
    public function getAllNews(){
        // implementação para receber as notícias

        return $news;
    }
}
?&gt;
</pre>
<blockquote><p>Como eu faço para que este mesmo método supra as minhas requisições <strong>Ajax</strong> sem que eu tenha que criar outro? </p></blockquote>
<p>É bem comum vermos por aí programadores criando dois objetos diferentes para atender as duas necessidades (aplicação e Ajax). Sendo que a única diferença entre eles é como o método retorna. </p>
<p>Podemos utilizar o mesmo método e fazer com que retorne de forma diferente dependendo de como eu estou chamando o método. </p>
<p>Vamos criar um método chamado <strong>isAjax</strong>():</p>
<pre class="brush: php; title: ; notranslate">
public function isAjax(){
        return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &amp;&amp; strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
    }
</pre>
<p><strong>Funciona de forma simples:</strong> Sempre que uma requsição <strong>Ajax</strong> é disparada um header é setado nesta requisição chamada <strong>HTTP_X_REQUESTED_WITH</strong> e o valor dela é setado como <strong>XMLHttpRequest</strong>. </p>
<p><a href="http://www.igorescobar.com/blog/wp-content/uploads/2010/12/requisicoesajax.png"><img src="http://www.igorescobar.com/blog/wp-content/uploads/2010/12/requisicoesajax.png" alt="" title="requisicoesajax" width="511" height="75" class="size-full wp-image-317" /></a> </p>
<p>Desta forma a nossa classe ficaria assim:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class MinhaClasse {
    public function isAjax(){
        return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &amp;&amp; strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
    }
    public function getAllNews(){
        // implementação para receber as notícias
        // ..

        // se o metodo for invocado via Ajax, retorne um JSON
        if($this-&gt;isAjax()) {
            echo json_encode($news);
        } else {
            return $news;
        }

    }
}
?&gt;
</pre>
<p>Veja que se a requisição for feita via <strong>Ajax</strong> o método dar um echo <a href="http://pt.wikipedia.org/wiki/JSON" target="_blank">JSON</a> de <strong>$news</strong>. Se o método for invocado de qualquer outra forma ele irá retornar normalmente.</p>
<p>É isso. Post rápido, pá pum <img src='http://www.igorescobar.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>[]&#8216;s<br />
Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li>Nenhum post relacionado!</li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/Zun4uMm8mEg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2010/12/16/detectando-requisicoes-ajax-com-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2010/12/16/detectando-requisicoes-ajax-com-php/</feedburner:origLink></item>
		<item>
		<title>Treinamento PHPUnit Gratuíto</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/WjUZUnr-H4M/</link>
		<comments>http://www.igorescobar.com/blog/2010/11/10/treinamento-phpunit-gratuito/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 13:06:52 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=306</guid>
		<description><![CDATA[Dia 4 de novembro, Nick Belhomme criou um treinamento gratuito para PHPUnit e divulgou em seu blog no formato SlideShare. Para que não está por dentro, PHPUnit é uma ferramenta criada por Sebastian Bergmann para criamos suites de testes dentro de nossas aplicações PHP para garantirmos as funcionalidades e entrega de nossa aplicação. A abrangência [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.igorescobar.com/blog/wp-content/uploads/2010/11/phpunit-logo.gif"><img class="alignleft size-full wp-image-307" title="phpunit-logo" src="http://www.igorescobar.com/blog/wp-content/uploads/2010/11/phpunit-logo.gif" alt="" width="94" height="80" /></a>Dia 4 de novembro, <a title="Twitter of Nick Belhomme" href="http://twitter.com/#!/NickBelhomme">Nick Belhomme</a> criou um <strong>treinamento</strong> gratuito para <strong>PHPUnit</strong> e divulgou em seu blog no formato <a href="http://www.slideshare.com">SlideShare</a>. Para que não está por dentro, <strong>PHPUnit</strong> é uma ferramenta criada por <a title="Sebastian Bergmann (page does not exist)" href="http://en.wikipedia.org/w/index.php?title=Sebastian_Bergmann&amp;action=edit&amp;redlink=1">Sebastian Bergmann</a> para criamos suites de testes dentro de nossas aplicações <strong>PHP</strong> para garantirmos as funcionalidades e entrega de nossa aplicação. A abrangência da ferramenta é gigantesca, da pra fazer muita coisa. Requisitos de funcionalidade, navegação, integração, integridade etc. Se você nunca ouviu falar de <a title="Test Driven Developement" href="http://pt.wikipedia.org/wiki/Test_Driven_Development" target="_blank">TDD</a> (Test Driven Development) esta é a sua chamada. <a title="Test Driven Developement" href="http://pt.wikipedia.org/wiki/Test_Driven_Development" target="_blank">TDD</a> é umas das vertentes do <a title="Extreme Programming" href="http://en.wikipedia.org/wiki/Extreme_Programming">XP</a> (Extreme Programming) onde você desenvolve toda a sua aplicação orientada a testes. Se serve de atrativo e porcamente falando, <a title="Test Driven Developement" href="http://pt.wikipedia.org/wiki/Test_Driven_Development" target="_blank">TDD</a> é a forma que temos de garantir o funcionamento de todas as funcionalidades do software estão funcionando, incluindo suas camadas. Protege sua aplicação do famoso &#8220;Corrige aqui, Quebra alí&#8221;. O treinamento é em inglês e está logo abaixo.</p>
<p><img style="visibility: hidden; width: 0px; height: 0px;" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyODkzOTM4NjA5MjgmcHQ9MTI4OTM5Mzg2MzM2MCZwPTEwMTkxJmQ9V*ZfZW1iZWRfZG9jdW1lbnQmZz*yJm89MjA2/YzI5ODdiMzdiNDQ5ZTkyN2NlYWI2Y2I1OGY4YzImb2Y9MA==.gif" border="0" alt="" width="0" height="0" /></p>
<div id="__ss_5674970" style="width: 477px;"><strong><a title="Cursus phpunit" href="http://www.slideshare.net/NickBelhomme/cursus-phpunit">Cursus phpunit</a></strong><object id="__sse5674970" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="477" height="510" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="FlashVars" value="gig_lt=1289393860928&amp;gig_pt=1289393863360&amp;gig_g=2" /><param name="src" value="http://static.slidesharecdn.com/swf/doc_player.swf?doc=cursusphpunit-101105025627-phpapp02&amp;stripped_title=cursus-phpunit&amp;userName=NickBelhomme" /><param name="name" value="__sse5674970" /><param name="flashvars" value="gig_lt=1289393860928&amp;gig_pt=1289393863360&amp;gig_g=2" /><param name="allowfullscreen" value="true" /><embed id="__sse5674970" type="application/x-shockwave-flash" width="477" height="510" src="http://static.slidesharecdn.com/swf/doc_player.swf?doc=cursusphpunit-101105025627-phpapp02&amp;stripped_title=cursus-phpunit&amp;userName=NickBelhomme" name="__sse5674970" flashvars="gig_lt=1289393860928&amp;gig_pt=1289393863360&amp;gig_g=2" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">documents</a> from <a href="http://www.slideshare.net/NickBelhomme">Nick Belhomme</a>.</div>
</div>
<p>Post rápido. Como alguns já sabem, agora eu trabalho como PHP Engineer na LBS Local (<a title="Apontador" href="http://www.apontador.com.br/">Apontador</a> &amp; <a title="MapLink" href="http://maplink.apontador.com.br/">MapLink</a>) em São Paulo e o tempo tem ficado bem corrido. Sempre que der vou tentar divulgar por aqui bons materiais que vão acrescentar na vida acadêmica e profissional de cada um. Se não gosta de esperar, estou diáriamente divulgando bons links no meu twitter, <a title="Twitter de Igor Escobar" href="http://www.twitter.com/igorescobar">follow me</a>!</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li><a href='http://www.igorescobar.com/blog/2011/09/19/abreviando-um-texto-sem-cortar-palavras-no-php/' title='Abreviando um texto sem cortar palavras no PHP'>Abreviando um texto sem cortar palavras no PHP</a></li>
<li><a href='http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/' title='Screenshots com PHP '>Screenshots com PHP </a></li>
<li><a href='http://www.igorescobar.com/blog/2010/09/21/capturando-miniatura-de-videos-com-php/' title='Capturando miniatura de vídeos com PHP'>Capturando miniatura de vídeos com PHP</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/22/mais-um-zend-certified-engineer/' title='Mais um Zend Certified Engineer'>Mais um Zend Certified Engineer</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/05/falta-pouco-para-a-zce/' title='Falta pouco para a ZCE'>Falta pouco para a ZCE</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/WjUZUnr-H4M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2010/11/10/treinamento-phpunit-gratuito/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2010/11/10/treinamento-phpunit-gratuito/</feedburner:origLink></item>
		<item>
		<title>Redes Sociais Aplicada no Desenvolvimento de Aplicações Web</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/dStU7E5zvVo/</link>
		<comments>http://www.igorescobar.com/blog/2010/10/04/redes-sociais-aplicada-no-desenvolvimento-de-aplicacoes-web/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 13:00:40 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[redes sociais]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=283</guid>
		<description><![CDATA[Com a Internet cada vez mais presente na vida de todos, as redes sociais estão ganhando força (muita força). A influência de uma marca nas redes sociais já pode ser convertida em lucro e a grande maioria das empresas já perceberam isso. Essas redes têm sido alvo de muitas empresas para fidelizar e conquistar novos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.igorescobar.com/blog/wp-content/uploads/2010/09/social-media.jpg"><img class="size-full wp-image-294 aligncenter" title="social-media" src="http://www.igorescobar.com/blog/wp-content/uploads/2010/09/social-media.jpg" alt="" width="500" height="356" /></a></p>
<p><a href="http://www.igorescobar.com/blog/wp-content/uploads/2010/09/social-media.jpg"></a>Com a Internet cada vez mais presente na vida de todos, as redes sociais estão ganhando força (muita força). A influência de uma marca nas redes sociais já pode ser convertida em lucro e a grande maioria das empresas já perceberam isso. Essas redes têm sido alvo de muitas empresas para fidelizar e conquistar novos clientes através de ações geniais e muito criativas.</p>
<p>Assim como qualquer outra profissão, as coisas mudam. As tendências mudam. As metodologias mudam. As tecnologias mudam. Tudo muda. Inclusive os desejos e prioridades de nossos clientes. Atualmente as empresas querem estar cada vez mais presentes na vida de cada um de seus clientes. <a href="http://www.facebook.com.br/" target="_blank">Facebook</a>, <a href="http://www.twitter.com/" target="_blank">Twitter</a>, <a href="http://www.orkut.com.br/" target="_blank">Orkut</a>, <a href="http://www.youtube.com.br/" target="_blank">YouTube</a>, etc.. está tudo muito comum e nós precisamos aprender a interagir com estas comunidades para poder dar possibilidade ao seu cliente e potencializar a possibilidade de conversão.</p>
<p>Se você não está familiarizado com o termo &#8220;conversão&#8221;, podemos dizer que conversão é quando você anuncia e este anúncio é clicado. Isso é chamado de conversão.</p>
<p>O motivo para eu estar aqui hoje, falando sobre redes sociais para vocês, é para dar um puxão de orelha nos profissionais que ainda não estão dando a mínima para este novo (nem tanto assim) conceito de interação. As redes sociais são mais um leque de aplicações que surgiram com a web 2.0. Neste <em>boom</em>, o conceito de interação foi explorado em uma escala muito maior. Junto com todas as inovações e as modificações na forma como interagimos com os sites e aplicativos web hoje, a web 2.0 trouxe o que chamamos hoje de <strong>redes sociais</strong>.</p>
<p>O meu foco com este post é evangelizar. É fazer com que após você ter lido este post você comece a criar já pensando na integração com as redes sociais. Não faz ideia de como?</p>
<p><strong>Vou te dar algumas ideias:</strong></p>
<ul>
<li>Já pensou que nas notícias do seu site poderia ter a possibilidade dos usuários comentarem nas notícias e replicarem o seu comentário para o Twitter?</li>
<li>Os comentários estão protegidos por login? Use o usuário do <a href="http://www.twitter.com" target="_blank">Twitter</a> do seu visitante para possibilitar mais uma alternativa de autenticação.</li>
<li>Upload de vídeos? Dê uma folga para o seu data storage e faça o upload direto para o YouTube e busque as informações através da <a href="http://code.google.com/apis/youtube/overview.html" target="_blank">API</a>.</li>
<li>Quer fazer transmissão ao vivo para os seus visitantes? Utilize toda a interação que ferramentas como o <a href="http://twitcam.livestream.com/" target="_blank">Twitcam</a> oferecem para você.</li>
<li>Crie aplicativos para Orkut, Facebook e Smarthphones. Os seus usuários poderão ter um nível de interação muito maior e a experiência deles será muito mais rica.</li>
<li>Dê a possibilidade do usuário divulgar suas notícias, fotos, albuns e vídeos através das redes sociais que eles participam.</li>
<li>Crie aplicações onde o seu usuário possa acompanhar as atualizações das suas redes sociais através da aplicação da sua empresa ou start-up.</li>
</ul>
<p>Essa lista pode crescer muito ainda. O importante é você ter a criatividade e começar a incluir as redes sociais no planejamento do novo produto ou site da sua empresa ou cliente.</p>
<p>[]&#8216;s<br />
Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li>Nenhum post relacionado!</li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/dStU7E5zvVo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2010/10/04/redes-sociais-aplicada-no-desenvolvimento-de-aplicacoes-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2010/10/04/redes-sociais-aplicada-no-desenvolvimento-de-aplicacoes-web/</feedburner:origLink></item>
		<item>
		<title>Capturando miniatura de vídeos com PHP</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/UG-niwc9e7k/</link>
		<comments>http://www.igorescobar.com/blog/2010/09/21/capturando-miniatura-de-videos-com-php/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 18:38:39 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Utilidades]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[ffmpeg-php]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=281</guid>
		<description><![CDATA[Hoje vamos falar de um assunto bastante divertido e que é de muita utilidade para todos nós. Vamos aprender como capturar a miniatura (thumbnail) de um vídeo em PHP e posteriormente salva-las no HD. Todo serviço que trabalha com algum tipo de mídia precisa de algumas ferramentas para fazer esta manipulação. O PHP não oferece suporte [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vamos falar de um assunto bastante divertido e que é de muita utilidade para todos nós. Vamos aprender como capturar a miniatura (thumbnail) de um vídeo em PHP e posteriormente salva-las no HD. Todo serviço que trabalha com algum tipo de mídia precisa de algumas ferramentas para fazer esta manipulação. O PHP não oferece suporte utilizando funções nativas para manipular arquivos de audio ou vídeo. Por isso, vocês precisam de 3 coisas muito importantes que são descritas logo a frente para seguirmos com este artigo.</p>
<h3>Requisitos</h3>
<ul>
<li><a title="ffmpeg project" href="http://ffmpeg.sourceforge.net/index.php" target="_blank">ffmpeg</a>-0.4.9_pre1 ou superior.</li>
<li><a title="ffmpeg-php project" href="http://sourceforge.net/projects/ffmpeg-php/" target="_blank">ffmpeg-php</a> 0.5.3 ou superior.</li>
<li><a title="GD Project" href="http://www.boutell.com/gd/" target="_blank">gd</a>-2.0 ou superior. (a versão que vem compilada com o PHP funciona também)</li>
</ul>
<p><strong>obs</strong>: Neste artigo não é meu objetivo ensinar a fazer a instalação destes recursos pois com uma rápida googada você resolve o problema.</p>
<h3>O que é o ffmpeg?</h3>
<p>O ffmpeg é um conjunto de bibliotecas de uso livre e open-source que oferece um suporte completo para você converter e interagir com praticamente qualquer tipo de mídia.</p>
<h3>O que é o ffmpeg-php?</h3>
<p>O <a title="ffmpeg-project" href="http://sourceforge.net/projects/ffmpeg-php/" target="_blank">ffmpeg-php</a> é uma extensão php desenvolvida para que nós, programadores PHP, possamos interagir com o ffmpeg sem utilizarmos a &#8220;perigosa&#8221; função <a title="php system function" href="http://br2.php.net/manual/en/function.system.php" target="_blank">system</a>() (e derivadas) do PHP. Mas vale lembrar que ela cobre &#8220;em partes&#8221; as funções do ffmpeg. Você não consegue com ffmpeg-php converter vídeos por exemplo, mas com o ffmpeg você consegue.</p>
<h2>Recebendo as informações do vídeo com PHP</h2>
<p>Antes de começar a brincar com o vídeo, nós precisamos aprender como pegar as informações do vídeo. O ffmpeg-php permite que você acesse estas informações do video:</p>
<pre class="brush: php; title: ; notranslate">
//Return the duration of a movie or audio file in seconds.
$movie-&gt;getDuration()
//Return the number of frames in a movie or audio file.
$movie-&gt;getFrameCount()
//Return the frame rate of a movie in fps.
$movie-&gt;getFrameRate()
//Return the path and name of the movie file or audio file.
$movie-&gt;getFilename()
//Return the comment field from the movie or audio file.
$movie-&gt;getComment()
//Return the title field from the movie or audio file.
$movie-&gt;getTitle()
//alias $movie-&gt;getArtist()	Return the author field from the movie or the artist ID3 field from an mp3 file.
$movie-&gt;getAuthor()
//Return the copyright field from the movie or audio file.
$movie-&gt;getCopyright()
//Return the artist ID3 field from an mp3 file.
$movie-&gt;getArtist()
//Return the genre ID3 field from an mp3 file.
$movie-&gt;getGenre()
//Return the track ID3 field from an mp3 file.
$movie-&gt;getTrackNumber()
//Return the year ID3 field from an mp3 file.
$movie-&gt;getYear()
 //Return the height of the movie in pixels.
$movie-&gt;getFrameHeight()
//Return the width of the movie in pixels.
$movie-&gt;getFrameWidth()
//Return the pixel format of the movie.
$movie-&gt;getPixelFormat()
//Return the bit rate of the movie or audio file in bits per second.
$movie-&gt;getBitRate()
//Return the bit rate of the video in bits per second.
$movie-&gt;getVideoBitRate()
//Return the audio bit rate of the media file in bits per second.
$movie-&gt;getAudioBitRate()
//Return the audio sample rate of the media file in bits per second.
$movie-&gt;getAudioSampleRate()
//Return the current frame index.
$movie-&gt;getFrameNumber()
//Return the name of the video codec used to encode this movie as a string.
$movie-&gt;getVideoCodec()
//Return the name of the audio codec used to encode this movie as a string.
$movie-&gt;getAudioCodec()
//Return the number of audio channels in this movie as an integer.
$movie-&gt;getAudioChannels()
//Return boolean value indicating whether the movie has an audio stream.
$movie-&gt;hasAudio()
//Return boolean value indicating whether the movie has a video stream.
$movie-&gt;hasVideo()
//Returns a frame from the movie as an ffmpeg_frame object.
//Returns false if the frame was not found.
//framenumber - Frame from the movie to return.
//If no framenumber is specified, returns the next frame of the movie.
$movie-&gt;getFrame([Integer framenumber])
//Returns the next key frame from the movie as an ffmpeg_frame object.
//Returns false if the frame was not found.
$movie-&gt;getNextKeyFrame()
</pre>
<p>No nosso caso, os únicos métodos que vão nos interessar seram: getFrameRate, getDuration, getFrameCount, getFrameHeight , getFrameWidth e getFrame.</p>
<p>No início do seu script, coloque esta linha só por segurança:</p>
<pre class="brush: php; title: ; notranslate">
if ( ! extension_loaded ( 'ffmpeg' ) ) exit ( 'ffmpeg não foi carregado!' );
</pre>
<p>Para receber as informações do vídeo dentro do seu arquivo PHP você precisa utilizar a classe ffmpeg_movie do ffmpeg-php e passar como parametro o caminho do vídeo que você quer manipular.</p>
<pre class="brush: php; title: ; notranslate">
// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo
$movie = new ffmpeg_movie($movie_file);
// pegamos a duranção do video em segundos
$duration = round ( $movie-&gt;getDuration() , 0 );
// recebemos o número de frames do vídeo
$totalFrames = $movie-&gt;getFrameCount();
// recebemos a altura do vídeo em pixels
$height = $movie-&gt;getFrameHeight ();
// recebemos a largura do vídeo em pixels
$width = $movie-&gt;getFrameWidth ();
</pre>
<h2>Recebendo o frame do vídeo e salvando</h2>
<p>Agora que já temos as informações do vídeo, podemos capturar a miniatura de um determinado frame do vídeo e salva-la em nosso HD. Vamos utilizar outra classe do ffmpeg-php chamada ffmpeg_frame e utilizarmos a função toGDImage para convertermos o frame para uma imagem GD. </p>
<p>Para escolhermos o frame podemos utilizar algumas técnicas:</p>
<p><strong>Miniatura de um segundo especifico:</strong></p>
<pre class="brush: php; title: ; notranslate">
$thumbnailOf = $movie-&gt;getFrameRate() * 5;
</pre>
<p><strong>Miniatura do meio do vídeo:</strong></p>
<pre class="brush: php; title: ; notranslate">
$thumbnailOf = round ( $movie-&gt;getFrameCount() / 2 );
</pre>
<p>Neste exemplo vou pegar fazer um calculo para receber um frame do meio do vídeo e salvar no HD.</p>
<pre class="brush: php; title: ; notranslate">
// precisamos criar uma imagem GD para o ffmpeg-php trabalhar nela
$image = imagecreatetruecolor ( $width , $height ) ;
// criamos a instancia do frame com a classe ffmpeg_frame
$frame = new ffmpeg_frame ( $image );
// escolhemos o frame que queremos salvar como jpeg
$thumbnailOf = (int) round ($movie-&gt;getFrameCount() / 2.5);
// recebe o frame
$frame = $movie-&gt;getFrame ( $thumbnailOf );
// converte para uma imagem GD
$image = $frame-&gt;toGDImage ();
//salva no HD.
imagejpeg($image, $movie_file.'.jpg', 100);
</pre>
<p>Pronto! Agora não tem desculpa. Vocês já sabem capiturar o frame de um video e salvar uma miniatura dele.</p>
<h2>Redimencionando o frame do video</h2>
<p>Este capitulo é um bonus. Vocês também podem salvar um frame especifico do video como jpeg e redimenciona-lo antes e salvar no HD. A função resize() da classe ffmpeg_frame faz isso para gente:</p>
<p><code>$frame->resize(Integer width, Integer height [, Integer crop_top [, Integer crop_bottom [, Integer crop_left [, Integer crop_right ]]]])</code></p>
<p>Utilizando o mesmo código acima, acrescentando somente uma linha:</p>
<pre class="brush: php; title: ; notranslate">
// colei esta linha somente como referencia
$frame = $movie-&gt;getFrame ( $thumbnailOf );
// redimenciona o frame para 200 de lagura por 100 de algura.
$frame-&gt;resize ( 200, 100 );
</pre>
<p>Podemos também, redimencionar esta imagem e fazer um crop nela:</p>
<pre class="brush: php; title: ; notranslate">
// colei esta linha somente como referencia
$frame = $movie-&gt;getFrame ( $thumbnailOf );
// redimencionamos o frame para 200x100 e mas com o acrescimo de um crop de 30x30x30x30.
$frame-&gt;resize ( 200, 100, 30, 30, 30, 30 );
</pre>
<p>É isso aí!</p>
<p>Maiores informações, na <a href="http://ffmpeg-php.sourceforge.net/doc/api/" target="_blank">documentação oficial do ffmpeg-php</a>.</p>
<p>[]&#8216;s<br />
Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li><a href='http://www.igorescobar.com/blog/2011/09/19/abreviando-um-texto-sem-cortar-palavras-no-php/' title='Abreviando um texto sem cortar palavras no PHP'>Abreviando um texto sem cortar palavras no PHP</a></li>
<li><a href='http://www.igorescobar.com/blog/2011/09/15/screenshots-com-php/' title='Screenshots com PHP '>Screenshots com PHP </a></li>
<li><a href='http://www.igorescobar.com/blog/2010/11/10/treinamento-phpunit-gratuito/' title='Treinamento PHPUnit Gratuíto'>Treinamento PHPUnit Gratuíto</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/22/mais-um-zend-certified-engineer/' title='Mais um Zend Certified Engineer'>Mais um Zend Certified Engineer</a></li>
<li><a href='http://www.igorescobar.com/blog/2010/07/05/falta-pouco-para-a-zce/' title='Falta pouco para a ZCE'>Falta pouco para a ZCE</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/UG-niwc9e7k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2010/09/21/capturando-miniatura-de-videos-com-php/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2010/09/21/capturando-miniatura-de-videos-com-php/</feedburner:origLink></item>
		<item>
		<title>Feliz Dia Do Programador!</title>
		<link>http://feedproxy.google.com/~r/IgorEscobar/Blog/~3/aLUMrrEZMVU/</link>
		<comments>http://www.igorescobar.com/blog/2010/09/13/dia-do-programador/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 12:39:18 +0000</pubDate>
		<dc:creator>Igor Escobar</dc:creator>
				<category><![CDATA[Blogosfera]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=278</guid>
		<description><![CDATA[Esta é uma data nerd especial! O Dia do Programador (em russo: День программиста) é um feriado profissional oficial na Rússia, celebrado no 256º dia do ano (255º dia, se 1 de janeiro for considerado o dia 0). O número 256 (28) foi escolhido para esta data porque 256 é o número de valores distintos que [...]]]></description>
			<content:encoded><![CDATA[<p>Esta é uma data nerd especial!</p>
<p>O Dia do Programador (em russo: День программиста) é um feriado profissional oficial na Rússia, celebrado no 256º dia do ano (255º dia, se 1 de janeiro for considerado o dia 0). O número 256 (28) foi escolhido para esta data porque 256 é o número de valores distintos que podem ser representados com um byte de oito bits, um número bem conhecido entre os programadores.</p>
<p>Além disso, &#8217;256&#8242; em hexadecimal é &#8217;100&#8242; (&#8217;0&#215;100&#8242;), e é a maior potência de 2 abaixo de 365 (o número de dias em um ano). Nos anos bissextos, a data comemorativa é 12 de setembro (13 de setembro em outros anos).</p>
<p>
<a href="http://pt.wikipedia.org/wiki/Dia_do_Programador" target="_blank">http://pt.wikipedia.org/wiki/Dia_do_programador</a><br />
Parabéns para <strong>nós</strong>!</p>
<p>[]&#8216;s<br />
Igor.</p>
<div id="cab-author" class="cab-author">
<div class="cab-author-inner">
<div class="cab-author-image">
					<img alt='' src='http://0.gravatar.com/avatar/2c817888c05fb49dbedc84462a567fe6?s=75&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D75&amp;r=G' class='avatar avatar-75 photo' height='75' width='75' /></p>
<div class="cab-author-overlay"></div>
</p></div>
<p> <!-- .cab-author-image --></p>
<div class="cab-author-info">
<div class="cab-author-name"><a href="http://www.igorescobar.com" rel="author" class="cab-author-name">Igor Escobar</a></div>
<p>javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.</p>
<p><a href="http://www.twitter.com/igorescobar" rel="external nofollow Twitter me"><img title="Twitter" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/twitter.png" alt="Twitter"  border="0" /></a>&nbsp;<a href="http://www.linkedin.com/in/igorescobar" rel="external nofollow LinkedIn me"><img title="LinkedIn" src="http://www.igorescobar.com/blog/wp-content/plugins/custom-about-author/images/social_media/linkedin.png" alt="LinkedIn" border="0" /></a>&nbsp;</p>
</p></div>
<p> <!-- .cab-author-info -->
			</div>
<p> <!-- .cab-author-inner -->
		</div>
<p> <!-- .cab-author-shortcodes --><br />
		<br/><br />
<h3 class='related_post_title'>Posts Relacionados:</h3>
<ul class='related_post'>
<li>Nenhum post relacionado!</li>
</ul>
<img src="http://feeds.feedburner.com/~r/IgorEscobar/Blog/~4/aLUMrrEZMVU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.igorescobar.com/blog/2010/09/13/dia-do-programador/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.igorescobar.com/blog/2010/09/13/dia-do-programador/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.328 seconds -->

