<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Klaus Paiva &#187; Javascript</title>
	<atom:link href="http://blog.klaus.pro.br/tags/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.klaus.pro.br</link>
	<description>Idéias e desventuras de Klaus Paiva</description>
	<lastBuildDate>Mon, 12 Jul 2010 20:26:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Curso de desenvolvimento de front-end web</title>
		<link>http://blog.klaus.pro.br/2010/ler/curso-de-desenvolvimento-de-front-end-web/index.html</link>
		<comments>http://blog.klaus.pro.br/2010/ler/curso-de-desenvolvimento-de-front-end-web/index.html#comments</comments>
		<pubDate>Thu, 17 Jun 2010 17:35:00 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Cursos]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Opera]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=419</guid>
		<description><![CDATA[Já recebi vários e-mails através do formulário de contato deste blog me perguntando sobre cursos de web standards, HTML, CSS, Javascript e afins. Em termos de cursos disponíveis gratuitamente na web, eu sempre recomendei o conteúdo disponível no site W3Schools. Porém, além desse curso, essa semana eu recebi um e-mail aqui no trabalho comentando sobre [...]]]></description>
			<content:encoded><![CDATA[<p>Já recebi vários e-mails através do formulário de contato deste blog me perguntando sobre cursos de web standards, HTML, CSS, Javascript e afins. Em termos de cursos disponíveis gratuitamente na web, eu sempre recomendei o conteúdo disponível no site <a href="http://www.w3schools.com/">W3Schools</a>.</p>
<p>Porém, além desse curso, essa semana eu recebi um <em>e-mail</em> aqui no trabalho comentando sobre um curso oferecido pela <strong>Opera</strong> (sim, aquela do <a href="http://www.opera.com/">navegador Opera</a>). Dei uma olhada geral sobre o conteúdo e parece ser bem interessante, além de abordar a maioria dos tópicos usados no dia-a-dia de quem trabalha e desenvolve interfaces <em>web</em>.</p>
<p>Sendo assim, se você está interessado num <a href="http://www.opera.com/company/education/curriculum/">curso de desenvolvimento de front-end gratuito</a>, esta é também uma excelente opção. Bons estudos!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2010/ler/curso-de-desenvolvimento-de-front-end-web/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FireQuery &#8211; Firebug++ para a jQuery</title>
		<link>http://blog.klaus.pro.br/2010/ler/firequery-firebug-para-a-jquery/index.html</link>
		<comments>http://blog.klaus.pro.br/2010/ler/firequery-firebug-para-a-jquery/index.html#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:03:56 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[FireQuery]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=400</guid>
		<description><![CDATA[Dica rápida pra quem usa a biblioteca jQuery no seu dia-a-dia. A extensão FireQuery se acopla ao já famoso Firebug e adiciona uma série de novos recursos, todos pensados em facilitar a vida de quem usa jQuery. Entre os vários recursos vale destacar a listagem dos eventos que estão associados a um elemento na página. [...]]]></description>
			<content:encoded><![CDATA[<p>Dica rápida pra quem usa a biblioteca jQuery no seu dia-a-dia.</p>
<p>A extensão <a href="http://firequery.binaryage.com/">FireQuery</a> se acopla ao já famoso <a href="http://getfirebug.com/">Firebug</a> e adiciona uma série de novos recursos, todos pensados em facilitar a vida de quem usa jQuery.</p>
<p>Entre os <a href="http://firequery.binaryage.com/#features">vários recursos</a> vale destacar a listagem dos eventos que estão associados a um elemento na página. Isso é extremamente útil quando você precisa alterar códigos feitos por outras pessoas, ou mesmo um código seu que você já nem lembra mais como ele funciona. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Dica enviada pelo meu colega de trabalho Paulo Lomanto, que é totalmente <strong>Web 1.0</strong> e não tem Twitter, nem blog, nem nada pra eu <em>linkar</em> aqui. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2010/ler/firequery-firebug-para-a-jquery/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery 1.4</title>
		<link>http://blog.klaus.pro.br/2010/ler/jquery-1-4/index.html</link>
		<comments>http://blog.klaus.pro.br/2010/ler/jquery-1-4/index.html#comments</comments>
		<pubDate>Thu, 14 Jan 2010 20:44:43 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=384</guid>
		<description><![CDATA[Hoje saiu a versão 1.4 da mais popular biblioteca de Javascript na atualidade: a jQuery. Neste texto estão descritas as mudanças presentes nesta nova versão, detalhamento dos novos métodos, novas formas de passar alguns parâmetros e gráficos que ilustram os ganhos de performance obtidos. E se você planeja migrar seu código para esta nova versão, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje saiu a versão 1.4 da mais popular biblioteca de Javascript na atualidade: a <a href="http://jquery.com/">jQuery</a>.</p>
<p><a href="http://jquery14.com/day-01/jquery-14">Neste texto</a> estão descritas as mudanças presentes nesta nova versão, detalhamento dos novos métodos, novas formas de passar alguns parâmetros e gráficos que ilustram os ganhos de performance obtidos.</p>
<p>E se você planeja migrar seu código para esta nova versão, não deixe de conferir a <a href="http://jquery14.com/day-01/jquery-14#backwards">lista de incompatibilidades</a>. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Via <a href="http://twitter.com/jeresig">@jeresig</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2010/ler/jquery-1-4/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML 5</title>
		<link>http://blog.klaus.pro.br/2009/ler/html-5/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/html-5/index.html#comments</comments>
		<pubDate>Wed, 16 Dec 2009 12:16:39 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[Web Workers]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=375</guid>
		<description><![CDATA[Um vídeo bastante interessante que mostra vários recursos provenientes do HTML 5: canvas e SVG, &#60;video&#62;, geolocation, app cache e banco de dados local, e web workers. (aliás, eu já falei sobre web workers aqui no blog ) Introduction to HTML 5 from Brad Neuberg on Vimeo. Have fun! Vi aqui.]]></description>
			<content:encoded><![CDATA[<p>Um vídeo bastante interessante que mostra vários recursos provenientes do HTML 5: <strong>canvas e SVG, &lt;video&gt;, geolocation, app cache e banco de dados local, e web workers</strong>. (aliás, eu já falei sobre <a href="http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html">web workers</a> aqui no blog <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<div class="videos"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="375" 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="src" value="http://vimeo.com/moogaloop.swf?clip_id=6691519&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="375" src="http://vimeo.com/moogaloop.swf?clip_id=6691519&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object>
<p><a href="http://vimeo.com/6691519">Introduction to HTML 5</a> from <a href="http://vimeo.com/user1005914">Brad Neuberg</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
</div>
<p>Have fun! Vi <a href="http://speckyboy.com/2009/12/11/a-collection-of-html5-resources-and-tutorials/">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/html-5/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>text-overflow para múltiplas linhas</title>
		<link>http://blog.klaus.pro.br/2009/ler/text-overflow-para-multiplas-linhas/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/text-overflow-para-multiplas-linhas/index.html#comments</comments>
		<pubDate>Mon, 26 Oct 2009 18:04:35 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[text-overflow]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=360</guid>
		<description><![CDATA[Esse texto surgiu de uma necessidade que é bastante comum pra nós, seres programadores de interfaces web. Sabe quando o webdesigner desenha uma caixa de tamanho fixo (e largura variável, pra complicar um pouco), em que o texto deverá ficar contido ali dentro da caixa, e no caso do texto ser maior que o tamanho [...]]]></description>
			<content:encoded><![CDATA[<p>Esse texto surgiu de uma necessidade que é bastante comum pra nós, seres programadores de interfaces <em>web</em>. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Sabe quando o <em>webdesigner</em> desenha uma caixa de tamanho fixo (e largura variável, pra complicar um pouco), em que o texto deverá ficar contido ali dentro da caixa, e no caso do texto ser maior que o tamanho disponível, os famosos &#8220;três pontinhos&#8221; devem aparecer?</p>
<p>Pra ilustrar isso melhor, veja a imagem abaixo:</p>
<dl class="images">
<dt><img src="http://blog.klaus.pro.br/wp-content/uploads/2009/10/text-overflow-exemplo.png" alt="Caixa com dimensões fixas e conteúdo &quot;ajustado&quot; para caber" /></dt>
<dd>Caixa com dimensões fixas e conteúdo &#8220;ajustado&#8221; para caber</dd>
</dl>
<p>Um método comum de se fazer isso é contar o número de caracteres e colocar &#8220;&#8230;&#8221;, caso o número de caracteres ultrapasse o número máximo de caracteres que ficarão visíveis. Claro que esse número máximo é uma estimativa e nem sempre o resultado fica bom. Além disso, pode acontecer do &#8220;corte&#8221; no texto acontecer no meio de uma palavra, gerando um resultado estranho ao visitante, &#8220;tipo isso aq&#8230;&#8221;.</p>
<p>Nas CSS existe uma propriedade chamada &#8220;text-overflow&#8221; que, sob certas circustâncias, adiciona automagicamente &#8220;&#8230;&#8221; ao final do texto que não coube na área visível. OK! Problema resolvido então? Não exatamente&#8230; <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>O problema não está resolvido por conta de duas outras questões. Uma delas é que o Firefox ainda não implementa essa propriedade (sim, o IE tem! Moderno hein? <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). A outra questão é que essa propriedade não se aplica nos casos em que o texto ocuparia mais de uma linha.</p>
<p>Se você quiser uma explicação mais detalhada (e exemplos) sobre a propriedade &#8220;text-overflow&#8221;, <a href="http://www.quirksmode.org/css/textoverflow.html">acesse este texto no blog do PPK</a>.</p>
<p>Voltando ao assunto original, agora precisamos resolver aquelas duas questões. Felizmente, com algum tempo de Google e mais algum tempo de pesquisa em fóruns, consegui encontrar algo capaz de ajudar nesta tarefa: o <a href="http://jquerytextoverflow.ipdemo.nl/">jQuery textOverflow Plugin</a>.</p>
<p>O código é relativamente simples e oferece várias opções de customização. Aqui tem uma página de exemplo (<a href="http://www.klaus.pro.br/projects/text-overflow/teste1.php">exemplo 1</a>) gerando algo similar ao que foi mostrado na imagem acima.</p>
<p>Caso você tenha vários elementos na página que vão receber esse tratamento, deixo uma dica: tome cuidado com a performance! Como é uma operação intensiva no DOM, a chance desse código deixar o navegador bastante lento é bastante alta.</p>
<p>Pra esses casos, se você realmente precisa dos &#8220;&#8230;&#8221;, acho que vale a pena tentar juntar esse código com a solução de &#8220;<a href="http://www.nczonline.net/blog/2009/08/11/timed-array-processing-in-javascript/">execução de Javascript com pausas</a>&#8220;, proposta pelo <a href="http://www.nczonline.net/">Nicholas Zakas</a>.</p>
<p>Fiz uma proposta com essa combinação. Ela pode ser vista aqui no <a href="http://www.klaus.pro.br/projects/text-overflow/teste2.php">exemplo 2</a> (com 100 elementos). Embora seja visualmente mais lenta, ela não trava o navegador em momento algum, mesmo no IE 6. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bom, o texto ficou bem longo&#8230; mas acho que deu pra passar bem a ideia. Sugestões ou comentários, é só usar o formulário abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/text-overflow-para-multiplas-linhas/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String.replace no Javascript</title>
		<link>http://blog.klaus.pro.br/2009/ler/string-replace-no-javascript/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/string-replace-no-javascript/index.html#comments</comments>
		<pubDate>Wed, 19 Aug 2009 21:17:20 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=349</guid>
		<description><![CDATA[Muita gente conhece o método String.replace do Javascript. De forma geral, ele é o método que permite substituir (jura? =) uma (sub)string por outra string. É um método bastante usado em códigos Javascript, principalmente por possibilitar o uso de expressões regulares na hora de fazer as substituições. A forma mais comum de uso é algo [...]]]></description>
			<content:encoded><![CDATA[<p>Muita gente conhece o método String.replace do Javascript. De forma geral, ele é o método que permite substituir (jura? =) uma (sub)string por outra string.</p>
<p>É um método bastante usado em códigos Javascript, principalmente por possibilitar o uso de <a href="http://www.piazinho.com.br/">expressões regulares</a> na hora de fazer as substituições. A forma mais comum de uso é algo do tipo:</p>
<pre class="javascript"><code><span class="st0">"Javascript"</span>.<span class="me1">replace</span><span class="br0">(</span> <span class="re0">/<span class="br0">[</span>aeiou<span class="br0">]</span>/g</span>, <span class="st0">""</span> <span class="br0">)</span></code></pre>
<p>O trecho de código acima remove as vogais da string &#8220;Javascript&#8221; resultando na string &#8220;<span>Jvscrpt&#8221;</span>, bem simples.</p>
<p>Mas o que nem todo mundo sabe (e eu costumo não lembrar também) é que <strong>o segundo parâmetro do método replace pode ser uma função qualquer</strong>, que será executada recebendo como parâmetro a parte da string que &#8220;casou&#8221; com a expressão dada.</p>
<p>Desta forma você pode manipular como bem quiser a parte que &#8220;casou&#8221; da expressão regular. Isso é útil, por exemplo, se você quer procurar URLs numa determinada string e reduzir aquelas com mais de N caracteres.</p>
<p>Fiz um código que mostra o exemplo acima funcionando. <a href="http://www.klaus.pro.br/code/replace/js-replace.html">Veja o exemplo aqui</a>.</p>
<p><strong>Nota 1</strong>: A expressão regular para &#8220;casar&#8221; URLs está bem simples e contida para o exemplo&#8230; não &#8220;casaria&#8221; todos os formatos possíveis de URL.</p>
<p><strong>Nota 2</strong>: O método <a href="http://msdn.microsoft.com/en-us/library/0esxc5wy(VS.85).aspx">substr no IE</a> não funciona como esperado quando se tem parâmetros negativos. Que azar&#8230; <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/string-replace-no-javascript/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web Workers &#8211; Threads em Javascript</title>
		<link>http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html#comments</comments>
		<pubDate>Wed, 22 Jul 2009 22:10:48 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Web Workers]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=322</guid>
		<description><![CDATA[No final do mês passado eu coloquei aqui no blog uma nota sobre o lançamento do Firefox 3.5 e as novidades trazidas por essa versão. Fiz uma leitura mais aprofundada nos textos e vi um recurso bastante interessante chamado Web Workers. Segundo a descrição do MDC, os Web Workers permitem a execução de códigos de [...]]]></description>
			<content:encoded><![CDATA[<p>No final do mês passado eu coloquei aqui no blog uma <a href="http://blog.klaus.pro.br/2009/ler/firefox-35/index.html">nota sobre o lançamento do Firefox 3.5</a> e as novidades trazidas por essa versão.</p>
<p>Fiz uma leitura mais aprofundada nos textos e vi um recurso bastante interessante chamado <a href="https://developer.mozilla.org/En/Using_web_workers">Web Workers</a>. Segundo a descrição do <a href="https://developer.mozilla.org/">MDC</a>, os Web Workers permitem a execução de códigos de forma <em>multi-thread</em> dentro de aplicações <em>web</em> e sites.</p>
<p>Quem escreve código Javascript hoje em dia sabe que não é raro o navegador &#8220;congelar&#8221; durante um código que exige um pouco mais de processamento. Existem algumas formas de evitar esse &#8220;congelamento&#8221; sim&#8230; mas certamente os Web Workers elevam a resolução deste problema a outro nível de soluções e possibilidades. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Com os Web Workers você pode iniciar um código que será executado em paralelo ao código Javascript da sua página. Esse código executado pelo &#8220;worker&#8221; trabalha num ambiente diferente, sem acesso à página pai e, principalmente, sem acesso ao DOM. A única forma de comunicação entre a página pai e um processo &#8220;worker&#8221; se dá através de mensagens.</p>
<p>Como eu estava interessado em verificar se esses Web Workers realmente trabalham em paralelo <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , fiz uma página que faz esse teste. Nela, há duas versões de um mesmo código que calcula a <a href="http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Fibonacci">sequência (ou número) de Fibonacci</a>. Além disso, na página há uma <a href="http://docs.jquery.com/Effects">animação com jQuery</a> rodando, o que vai permitir perceber claramente se o navegador vai ou não &#8220;congelar&#8221;.</p>
<p><strong><a href="http://www.klaus.pro.br/projects/web-workers/fibonacci.html">Veja aqui o teste com Web Workers</a></strong>. (para o Firefox só funciona na versão 3.5)</p>
<p>Como você pode ver pelo teste acima, realmente o código roda em <em>background</em>, sem afetar a página renderizada.</p>
<p>Vale ressaltar que nos testes eu exibo também o tempo em milissegundos que a operação levou. Fazendo os testes aqui no meu computador, a versão com Web Workers leva em média 1600 ms, enquanto a versão &#8220;normal&#8221; leva em média 800 ms. O dobro de tempo mas é algo a se ponderar se lembrarmos que a versão &#8220;normal&#8221; trava totalmente o navegador enquanto o cálculo é feito. (<del>interessante&#8230; rodando o teste local, a versão com &#8220;worker&#8221; executa bem mais rápido do que a versão online aqui no blog, talvez pelo tempo de download do &#8220;worker.js&#8221;?</del>)</p>
<p><strong>Update</strong>: na versão do código de testes que eu fiz ontem, ao clicar no botão para calcular o número de Fibonacci, o código do &#8220;worker.js&#8221; era baixado antes do cálculo em si ser executado. Isso causava uma grande diferença entre o teste rodando local e o teste rodando <em>online</em> (óbvio hehe). Fiz uma modificação hoje para deixar o &#8220;worker.js&#8221; já carregado (assim como os demais arquivos &#8220;.js&#8221;).</p>
<p>E como comentário final: tentei deixar os códigos tão similares quanto possível para não afetar significativamente os resultados em favor de uma ou outra forma de cálculo. Sugestões e/ou correções são bem-vindas. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<dl class="references">
<dt>Referências</dt>
<dd>developer.mozilla.org: <a href="https://developer.mozilla.org/En/Using_web_workers">Using web workers</a></dd>
<dd>hacks.mozilla.org: <a href="http://hacks.mozilla.org/2009/07/working-smarter-not-harder/">using web workers: working smarter, not harder</a></dd>
<dd>ejohn.org: <a href="http://ejohn.org/blog/web-workers/">Computing with JavaScript Web Workers</a></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firefox 3.5</title>
		<link>http://blog.klaus.pro.br/2009/ler/firefox-35/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/firefox-35/index.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 16:35:08 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Vídeos]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=313</guid>
		<description><![CDATA[Hoje saiu a versão 3.5 do Firefox. A lista de novidades é bastante extensa e empolgante. Dentre as novidades está o suporte para a tag &#60;video&#62;, para exibição nativa de vídeos num documento HTML. Se você quiser ver uma versão, digamos, alto nível das novidades, acesse esta página. Se você está interessado em ver as [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje saiu a <a href="http://www.getfirefox.com/">versão 3.5 do Firefox</a>. A lista de novidades é bastante extensa e empolgante. Dentre as novidades está o suporte para a <a href="http://www.mozilla.com/en-US/firefox/video/">tag &lt;video&gt;</a>, para exibição nativa de vídeos num documento HTML. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Se você quiser ver uma versão, digamos, alto nível das novidades, <a href="http://en-us.www.mozilla.com/en-US/firefox/3.5/releasenotes/#whatsnew2">acesse esta página</a>.</p>
<p>Se você está interessado em ver as novidades da versão 3.5 para nós, desenvolvedores, <a href="https://developer.mozilla.org/En/Firefox_3.5_for_developers">veja esta página</a>.</p>
<p>Fica a dica! <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/firefox-35/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ligue os pontos!</title>
		<link>http://blog.klaus.pro.br/2009/ler/ligue-os-pontos/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/ligue-os-pontos/index.html#comments</comments>
		<pubDate>Thu, 14 May 2009 22:58:50 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Brincadeiras]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Protótipos]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=271</guid>
		<description><![CDATA[Tudo começou quando eu vi um jornal na rua e nele eu vi um passatempo que era bastante comum no jornal que meu pai comprava quando eu era criança. Esse passatempo consiste numa imagem /semi-?completa/ em que alguns pontos devem ser conectados para formar a imagem final. Diante dessa lembrança eu pensei em usar o [...]]]></description>
			<content:encoded><![CDATA[<p>Tudo começou quando eu vi um jornal na rua e nele eu vi um passatempo que era bastante comum no <a href="http://tapera.uol.com.br/">jornal que meu pai comprava quando eu era criança</a>. Esse passatempo consiste numa imagem /semi-?completa/ em que alguns pontos devem ser conectados para formar a imagem final.</p>
<p>Diante dessa lembrança eu pensei em usar o <a href="http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html">objeto Canvas do HTML 5</a> que eu havia comentado anteriormente para, digamos, &#8220;reviver&#8221; essa brincadeira numa formato digital.</p>
<p>Procurei uma imagem para fazer os testes e acabei encontrando um <a href="http://passatemposdivertidos.blogspot.com/">site bem legal</a>, com várias imagens no estilo &#8220;ligue os pontos&#8221;. Dentre as várias opções, escolhi a imagem abaixo:</p>
<dl class="images">
<dt><a href="http://www.klaus.pro.br/projects/liga-pontos/"><img src="http://www.klaus.pro.br/projects/liga-pontos/pato.png" alt="Ligue os pontos" /></a></dt>
<dd>Ligue os pontos e ganhe um pato (ou cisne, ou ganso, ou marreco)</dd>
</dl>
<p>A partir daí comecei a pesquisar um pouco mais sobre os métodos de desenho disponíveis para codificar algo que permitisse desenhar umas linhas sobre a imagem acima. O <a href="https://developer.mozilla.org/en/Canvas_tutorial">tutorial de Canvas no MDC</a> foi bastante importante nesse sentido.</p>
<p>Bom, mas chega de enrolação e deixe-me mostrar esse tal &#8220;<strong><a href="http://www.klaus.pro.br/projects/liga-pontos/">ligue os pontos digital</a></strong>&#8220;. =) Basta sair clicando para ver o resultado. Há também alguns comandos de teclado disponíveis mas eu vou deixar que você descubra (espero) intuitivamente (ou por associação).</p>
<p>O código-fonte está bem simples  o que permite entender relativamente fácil o que foi feito. E falando sobre o código, vale lembrar que o código em si é mais uma prova de conceito do que um exemplo de código bem estruturado. Ah, e detalhe importante é a imagem no canto superior direito na página. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Pra ficar mais legal ainda, embora o tempo não me permita, seria legal colocar junto do código algum algoritmo para descobrir quando a imagem foi desenhada corretamente.</p>
<p>E por fim, o &#8220;liga pontos&#8221; acima foi testado (e funcionou) em Firefox 3.0.10, Opera 9.64, Safari 3.2.3 e Chrome 2.0.172. No IE 8, nativamente, não funciona. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Update</strong>! Enquanto eu &#8220;jogava&#8221; eu estive pensando e cheguei a conclusão que esse tipo de jogo pode ser interessante para pessoas que estão iniciando no mundo da informática, principalmente para adquirir destreza ao usar um <em>mouse</em>. Interessante!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/ligue-os-pontos/index.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>O progresso dos novos navegadores</title>
		<link>http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html#comments</comments>
		<pubDate>Mon, 02 Mar 2009 22:54:58 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desempenho]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Vídeos]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=219</guid>
		<description><![CDATA[Este texto é baseado (uma nota mental pública e estruturada, digamos) na apresentação &#8220;Performance Improvements in Browsers&#8221; feita por &#8220;John Resig&#8220;, que é ninguém menos que o pai da famosa biblioteca jQuery. Abaixo está o vídeo com a apresentação feita (aproximadamente 1h) e na sequência algumas notas e comentários sobre os temas apresentados. Abas separadas [...]]]></description>
			<content:encoded><![CDATA[<p>Este texto é baseado (uma nota mental pública e estruturada, digamos) na apresentação &#8220;<a href="http://ejohn.org/blog/talk-performance-improvements-in-browsers/"><em>Performance Improvements in Browsers</em></a>&#8221; feita por &#8220;<a href="http://ejohn.org/">John Resig</a>&#8220;, que é ninguém menos que o pai da famosa biblioteca <a href="http://jquery.com/">jQuery</a>.</p>
<p>Abaixo está o <a href="http://www.youtube.com/watch?v=13-3VMzfU3Y">vídeo com a apresentação</a> feita (aproximadamente 1h) e na sequência algumas <strong>notas e comentários sobre os temas apresentados</strong>.</p>
<div class="videos"><object width="425" height="344" data="http://www.youtube.com/v/13-3VMzfU3Y&amp;hl=pt-br&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/13-3VMzfU3Y&amp;hl=pt-br&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></div>
<h3 class="subtitles">Abas separadas por processos</h3>
<p>Este é um fato que certamente você deve conhecer. Você está lá navegando tranquilamente com uma <strong>dezena (ou mais =) de abas abertas</strong>&#8230; Daí que você resolve acessar um site com um Javascript mal escrito, com uma animação em que o <a href="http://www.adobe.com/products/flashplayer/">Flash Player</a> se revolta e lá foi, o navegador inteiro congela e não resta outra opção senão matar o processo. Claro que a maioria dos navegadores traz opções para <strong>restaurar a seção anterior</strong> mas não deixa de ser bastante incômodo.</p>
<p>A separação das abas por processos permitiria <strong>matar (encerrar) apenas a aba problemática</strong>, mantendo as outras abas isoladas. Isso por si só já seria uma grande vantagem da separação por abas mas ainda há uma segunda vantagem também bastante interessante! =)</p>
<p>Com a separação em diversos processos o sistema operacional pode <strong>gerenciar melhor o processamento</strong>, alocando mais recursos para as partes onde é realmente necessário, sem congelar as outras partes do navegador.</p>
<p>Vale notar que essa divisão em processos distintos causa um aumento do consumo do memória sim mas, como a quantidade de memória disponível nos PCs atuais (mesmo para os &#8220;PCs de prateleira&#8221;) está deixando de ser um gargalo para o desempenho dos computadores, é de se esperar que os programas passem a fazer alocações maiores de memória. Mais ou menos como o princípio da <strong>lei da oferta e da demanda</strong>.</p>
<h3 class="subtitles">Linearização das instruções de funções</h3>
<p>O termo em inglês acho que permite um entendimento melhor: &#8220;<strong>&#8216;<a href="http://en.wikipedia.org/wiki/Inline_function">function inlining</a></strong>&#8220;. Essa é uma característica que, por exemplo, C++ possui. Usando essa propriedade o compilador pode trocar a chamada de uma função pelo corpo da função, fazendo com que a execução das instruções ocorra <strong>sem o <em>overhead</em> de chamar uma função</strong>.</p>
<p>Além disso, pelo código exibido nos <em>slides</em> parece que, diferentemente do C++, você não precisa dar uma dica para o compilador na hora de escrever a função indicando que a função é candidata ao &#8220;<em>inlining</em>&#8220;.</p>
<h3 class="subtitles">Rede</h3>
<p>Aqui vale destacar o <strong>aumento do número de <em>downloads</em> simultâneos para um mesmo domínio</strong>. Com o IE 7 ainda temos o limite de dois downloads mas, felizmente o IE 8 (beta) já tratá um <strong>limite três vezes maior</strong>, de <a href="http://www.microsoft.com/windows/internet-explorer/beta/readiness/developers-new.aspx#ajax">seis <em>downloads</em> simultâneos para o mesmo domínio</a>. A última versão dos demais navegadores já possui um valor de seis ou sete <em>downloads</em>.</p>
<p>Outro recurso bem legal, e este é uma boa ideia da Microsoft, é o <strong>atributo &#8220;defer&#8221; para a <em>tag</em> &lt;script&gt;</strong>. Esse atributo indica para o navegador que ele pode continuar a <strong>renderizar a página sem esperar o arquivo Javascript</strong> referenciado carregar. O atributo já funcionava no IE e vai funcionar nas novas versões do Firefox e Opera.</p>
<h3 class="subtitles">window.postMessage</h3>
<p>O método <strong>window.postMessage</strong> me chamou a atenção. Com ele será possível a <strong>comunicação entre páginas de domínios distintos</strong> de forma bem simples. O princípio é o seguinte: a página remetente da mensagem irá tentar enviar a mensagem para, por exemplo, um <em>iframe</em> destinatário. Este <em>iframe</em> irá verificar se o remetente é alguém que ele conhece para então aceitar a mensagem e executar alguma ação.</p>
<p>A página que receberá as mensagens pode &#8220;ouvir&#8221; os <strong>eventos de mensagens</strong> usando o tradicional método <a href="https://developer.mozilla.org/En/DOM/Element.addEventListener">addEventListener</a>. Verificando a propriedade <em>origin</em>, a página receptora pode <strong>descobrir pelo domínio se a mensagem está vindo de um destinatário conhecido ou não</strong>.</p>
<h3 class="subtitles">Ajax entre domínios diferentes</h3>
<p>Aquele sonho de fazer requisições Ajax entre os N domínios da sua aplicação está prestes a se realizar. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Adicionando um cabeçalho (<em>header</em>) na resposta da requisição Ajax é possível especificar uma origem (além do próprio domínio) de onde aquela requisição pode ser atendida com segurança. O nome deste cabeçalho é &#8220;<strong>Access-Control-Allow-Origin</strong>&#8221; e está <a href="https://developer.mozilla.org/En/HTTP_Access_Control">melhor descrito nesta página</a>.</p>
<h3 class="subtitles">document.querySelectorAll</h3>
<p>Se você já usou a jQuery sabe como <strong>é prático encontrar os elementos da página usando a sintaxe de CSS</strong>. Melhor ainda se encontrar esses elementos usando a sintaxe de CSS seja possível de ser <strong>feito usando um método nativo do navegador</strong>. É isso que o método <a href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll">document.querySelectorAll</a> permitirá. O melhor de tudo é que as próximas versões do IE, Firefox, Opera e Safari já trarão este método disponível.</p>
<h3 class="subtitles">Visual e CSS</h3>
<p>Adoradas por 10 em cada 10 <em>webdesigners</em>, as <strong>bordas redondas vieram pra ficar</strong>. =) Apesar de os navegadores trazerem implementações com nomes diferentes, todas as implementações funcionam bem. Ou seja, juntando essas propriedades: -moz-border-radius, -webkit-border-radius, -khtml-border-radius e <a href="http://www.w3.org/TR/css3-background/#the-border-radius">border-radius</a> as bordas redondas saem com facilidade.</p>
<p><strong>Sombras também estarão disponíveis</strong>. Nesta página há vários <a href="http://maettig.com/code/css/text-shadow.html">exemplos de uso da propriedade text-shadow</a>.</p>
<p>Outro recurso que certamente vai ser muito usado (e provavelmente muito mal usado também <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) é a possibilidade de se usar <strong><a href="http://ejohn.org/apps/fontface/blok.html">fontes personalizadas na página</a></strong>. Por fontes personalizadas entenda fontes que não estão instaladas na sua máquina. Coisa que já era possível de se fazer no Flash, agora também com CSS.</p>
<p>Além disso, há uma série de <a href="http://www.the-art-of-web.com/css/css-animation/">animações</a> que estarão disponíveis, por enquanto, para Firefox e Safari.</p>
<h3 class="subtitles">Desenho</h3>
<p>O objeto Canvas permite a renderização de elementos numa superfície 2D usando retas, curvas, arcos e/ou círculos. No <a href="https://developer.mozilla.org/">MDC</a> tem um <a href="https://developer.mozilla.org/En/Canvas_tutorial">tutorial bem bacana sobre Canvas</a>. Até me arrisquei a fazer uma &#8220;arte&#8221;: =)</p>
<pre class="javascript"><code><span class="co1">// &lt;canvas id="draw-area" width="150" height="150"&gt;&lt;/canvas&gt; no HTML</span>
<span class="kw2">var</span> canvas = document.<span class="me1">getElementById</span><span class="br0">(</span> <span class="st0">"draw-area"</span> <span class="br0">)</span>;
<span class="kw1">if</span><span class="br0">(</span> !canvas.<span class="me1">getContext</span> <span class="br0">)</span>
<span class="br0">{</span>
  <span class="kw1">return</span>;
<span class="br0">}</span>
<span class="kw2">var</span> context = canvas.<span class="me1">getContext</span><span class="br0">(</span> <span class="st0">"2d"</span> <span class="br0">)</span>;

context.<span class="me1">beginPath</span><span class="br0">(</span><span class="br0">)</span>;
<span class="kw2">var</span> side = <span class="nu0">150</span>;
<span class="kw2">var</span> offset = <span class="nu0">-4</span>;
<span class="kw2">var</span> i = <span class="nu0">0</span>;
<span class="kw1">while</span><span class="br0">(</span> <span class="kw2">true</span> <span class="br0">)</span>
<span class="br0">{</span>
  <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">0</span> <span class="br0">)</span>
  <span class="br0">{</span>
    <span class="kw2">var</span> x = offset + <span class="nu0">4</span>;
    context.<span class="me1">lineTo</span><span class="br0">(</span> x, offset <span class="br0">)</span>;
    offset = x;
    <span class="kw1">if</span><span class="br0">(</span> offset + <span class="nu0">4</span> &gt; <span class="nu0">78</span> <span class="br0">)</span> <span class="co1">// hard-coded mesmo ;P</span>
    <span class="br0">{</span>
      <span class="kw1">break</span>;
    <span class="br0">}</span>
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">1</span> <span class="br0">)</span>
  <span class="br0">{</span>
    context.<span class="me1">lineTo</span><span class="br0">(</span> offset, side - offset <span class="br0">)</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">2</span> <span class="br0">)</span>
  <span class="br0">{</span>
    context.<span class="me1">lineTo</span><span class="br0">(</span> side - offset, side - offset <span class="br0">)</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">3</span> <span class="br0">)</span>
  <span class="br0">{</span>
    context.<span class="me1">lineTo</span><span class="br0">(</span> side - offset, offset <span class="br0">)</span>;
  <span class="br0">}</span>
  i++;
<span class="br0">}</span>
<span class="co1">//context.closePath();</span>
context.<span class="me1">stroke</span><span class="br0">(</span><span class="br0">)</span>;</code></pre>
<p>Outro detalhe importante é que o Canvas permitirá também a <strong>inserção de vídeos dentro dele</strong>.</p>
<h3 class="subtitles">JSON nativo</h3>
<p>Atualmente, ao receber uma <em>string</em> em <a href="https://developer.mozilla.org/En/JSON">JSON</a> você precisa usar um <a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval#section_6">eval</a> para recuperar o objeto original. <strong>O eval é conhecidamente lento</strong>, até pelo fato de ser um método genérico, mas era a melhor saída para se ter acesso às informações contidas na <em>string</em> JSON mas, isso vai mudar!</p>
<p>Agora teremos métodos nativos para codificação e decodificação no formato JSON. A única dúvida que me restou é sobre o nome dos métodos. Nos slides os métodos se chamam <strong>encode e decode</strong>, já na <a href="https://developer.mozilla.org/En/Using_JSON_in_Firefox">página do MDC</a> e no <a href="http://wiki.ecmascript.org/doku.php?id=es3.1:json_support">wiki do ECMAScript</a> os métodos se chamam <strong>parse e stringify</strong>, respectivamente.</p>
<h3 class="subtitles">E por fim&#8230;</h3>
<p>&#8230; fico na torcida pra que as novas versões desses navegadores tenham uma rápida adoção por parte dos usuários. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
