<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8933244724303036133</id><updated>2011-11-27T17:42:36.574-08:00</updated><title type='text'>Extreme JS</title><subtitle type='html'>Desenvolvimento Avançado em Javascript.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-7290414226989715585</id><published>2010-04-08T10:15:00.000-07:00</published><updated>2010-04-08T10:20:20.096-07:00</updated><title type='text'>API Flickr - Criando um mosaico de fotos</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;Para quem deseja adicionar no seu blog ou no seu site um Mosaico com fotos do Flickr basta seguir o tutorial abaixo.&lt;br/&gt;Vocês verão que é bem simples e fácil de implementar. Usando a API do próprio Flickr em conjunto com a JQuery.&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;small&gt;&lt;b&gt;1° Passo:&lt;br/&gt;- Inserindo a JQuery:&lt;/b&gt;&lt;br/&gt;Se você não tem ou não quer disponibilizar em seu dominio a API da JQuery, você pode chama-la através do Google usando a seguinte sintaxe:&lt;br/&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;&amp;lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;2° Passo: &lt;br/&gt;- Configurando o CSS para o Mosaico:&lt;/b&gt;&lt;br/&gt;    &lt;font color='#ff0000'&gt;&amp;lt;style type="text/css"&amp;gt; &lt;br/&gt;    // Referente ao box do Flickr&lt;br/&gt;    #contentFlickr {&lt;br/&gt;         border: 0px;&lt;br/&gt;         width: 240px;&lt;br/&gt;         height: 340px;&lt;br/&gt;    }&lt;br/&gt;    // Links&lt;br/&gt;    #contentFlickr a{&lt;br/&gt;        border: 0;&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    // Referente a cada box de imagem&lt;br/&gt;    .imgItem {&lt;br/&gt;        border: 0;&lt;br/&gt;        width: 80px;&lt;br/&gt;        height: 80px;&lt;br/&gt;    }&lt;br/&gt;    &amp;lt;/style&amp;gt; &lt;/font&gt;&lt;br/&gt;&lt;b&gt;&lt;br/&gt;3° Passo:&lt;br/&gt;- Criar o elemento que receberá o Mosaico:&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;&amp;lt;div id="contentFlickr"&amp;gt;&amp;lt;/div&amp;gt; &lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;4° Passo:&lt;br/&gt;- Chamada JS para a API do Flickr com as fotos.&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;&amp;lt;script type="text/javascript"&amp;gt; &lt;/font&gt;&lt;br/&gt;&lt;b&gt;&lt;font color='#009900'&gt;/* &lt;br/&gt;* URL com o JSON contendo as fotos&lt;br/&gt;* Troque o valor do parametro ID (49502986292) pelo valor do Flickr que você deseja buscar as fotos&lt;br/&gt;*/&lt;/font&gt;&lt;/b&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;var strUlr = "http://api.flickr.com/services/feeds/groups_pool.gne?id=49502986292@N01&amp;amp;lang=en-us&amp;amp;format=rss_200&amp;amp;format=json&amp;amp;jsoncallback=?";&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;&lt;font color='#009900'&gt;/*&lt;br/&gt;* Totalizador de fotos, atribua aqui a quantidade de fotos que você quer no Mosaico&lt;br/&gt;*/&lt;/font&gt;&lt;/b&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;var totalPhotos = 9;&lt;br/&gt;&lt;br/&gt;$.getJSON(strUrl, function(data){&lt;br/&gt;  $.each(data.items, function(i,item){&lt;br/&gt;    if (i &amp;lt; totalPhotos){&lt;br/&gt;        $("#contentFlickr").append('&amp;lt;a href="' + item.link + '" class="imgItem"&amp;gt;&amp;lt;img src="' + item.media.m +'" class="imgItem"/&amp;gt;&amp;lt;/a&amp;gt;');&lt;br/&gt;    }&lt;br/&gt;  });&lt;br/&gt;});&lt;/font&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;&amp;lt;/script&amp;gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;O resultado final é este:&lt;br/&gt;&lt;img src='http://cicerofeijo.com/_blog/_img/flickr_mosaic.jpg' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Se quiser personalizar, basta mexer no CSS agora ;)&lt;br/&gt;&lt;br/&gt;&lt;font color='#ff0000'&gt;* Desculpem pelo código meio solto no post, é que as tags PRE e o HighlightCode não funcionam de jeito algum no Blogspot.&lt;/font&gt;&lt;br/&gt; &lt;/small&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-7290414226989715585?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/7290414226989715585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/7290414226989715585'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2010/04/api-flickr-criando-um-mosaico-de-fotos_7738.html' title='API Flickr - Criando um mosaico de fotos'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-4424832021196706923</id><published>2010-01-11T09:22:00.001-08:00</published><updated>2010-01-11T09:27:50.992-08:00</updated><title type='text'>Compreendendo o funcionamento do operador "delete" no Javascript.</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: small;"&gt;O que pode e não pode ser deletado no escopo de um código Javascript.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Artigo interessante, principalmente no que se refere ao diferente comportamento deste operador no Internet Explorer em em conjunto com o Firebug.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Link: &lt;/span&gt;&lt;a href="http://perfectionkills.com/understanding-delete/"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://perfectionkills.com/understanding-delete/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;O conteúdo do livro referenciado no artigo também é muito válido, segue abaixo o link para o site da Amazon:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.amazon.com/Object-Oriented-JavaScript-high-quality-applications-libraries/dp/1847194141"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://www.amazon.com/Object-Oriented-JavaScript-high-quality-applications-libraries/dp/1847194141&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-4424832021196706923?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/4424832021196706923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/4424832021196706923'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2010/01/compreendendo-o-funcionando-do-operador.html' title='Compreendendo o funcionamento do operador &quot;delete&quot; no Javascript.'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-6007767398801824305</id><published>2010-01-05T10:01:00.001-08:00</published><updated>2010-01-05T10:04:55.811-08:00</updated><title type='text'>Webtop v0.0.3</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_rSUahnavSLA/S0N_MMU31DI/AAAAAAAAAXY/JUD5dk0tmTg/s1600-h/wt_sshot2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://1.bp.blogspot.com/_rSUahnavSLA/S0N_MMU31DI/AAAAAAAAAXY/JUD5dk0tmTg/s320/wt_sshot2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5423318223728137266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Publiquei ontem uma nova versão do Webtop, esse projeto na verdade está servindo como meu trabalho de conclusão, sendo que eu já havia começado há cerca de um ano.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Existem bugs para serem corrigidos ainda, como problemas nas instâncias de janelas, etc. Mas como resolvi remodelar a forma de organização de scripts e optei por utilizar outro plugin para interações nas janelas (JQuery UI) acabei me atrasando um pouco.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Página oficial do projeto: &lt;/span&gt;&lt;a href="http://code.google.com/p/webtop/"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://code.google.com/p/webtop/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;DEMO : &lt;/span&gt;&lt;a href="http://bit.ly/7R0MA0"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://bit.ly/7R0MA0&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-6007767398801824305?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/6007767398801824305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/6007767398801824305'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2010/01/webtop-v003.html' title='Webtop v0.0.3'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_rSUahnavSLA/S0N_MMU31DI/AAAAAAAAAXY/JUD5dk0tmTg/s72-c/wt_sshot2.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-1153153919377417232</id><published>2009-12-30T09:49:00.001-08:00</published><updated>2009-12-30T09:54:43.413-08:00</updated><title type='text'>Web em tempo real com XMPP</title><content type='html'>&lt;span style="font-size:85%;"&gt;Artigo interessante sobre a utilização da Strophe.js e XMPP.&lt;br /&gt;A apresentação é uma espécie de tutorial sobre XMPP e o funcionamento da biblioteca JS para a comunicação do cliente / servidor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.infoq.com/presentations/Real-Time-Web-with-XMPP"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 318px;" src="http://4.bp.blogspot.com/_rSUahnavSLA/SzuTjbAtYFI/AAAAAAAAAXQ/UUcQ_pwwhCk/s320/xmppp_blog1.jpg" alt="" id="BLOGGER_PHOTO_ID_5421088813225959506" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Link do post: &lt;a href="http://www.infoq.com/presentations/Real-Time-Web-with-XMPP"&gt;http://www.infoq.com/presentations/Real-Time-Web-with-XMPP&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-1153153919377417232?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/1153153919377417232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/1153153919377417232'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/12/web-em-tempo-real-com-xmpp.html' title='Web em tempo real com XMPP'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_rSUahnavSLA/SzuTjbAtYFI/AAAAAAAAAXQ/UUcQ_pwwhCk/s72-c/xmppp_blog1.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-6972393811682160543</id><published>2009-11-24T04:50:00.000-08:00</published><updated>2009-11-24T04:58:59.315-08:00</updated><title type='text'>Trimpath - Javascript Template</title><content type='html'>&lt;span style="font-size:78%;"&gt;Uma das bibliotecas mais úteis que tenho utilizado para aplicações de médio e grande porte em Javascript é a Trimpath.&lt;br /&gt;Para quem já está acostumado a trabalhar com separação de camadas de interface de dados, a biblioteca é uma "mão na roda".&lt;br /&gt;Semelhante a soluções para PHP (Smarty e Template Power por exemplo) a sintaxe de marcas e a possibilidade de inserção de lógica no HTML facilitam muito o seu uso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Como funciona?&lt;/span&gt;&lt;br /&gt;- Baixe o ZIP da Trimpath em http://code.google.com/p/trimpath/wiki/JavaScriptTemplates.&lt;br /&gt;- Você precisa apenas do arquivo trimPath.js que vem no pacote.&lt;br /&gt;- Insira o arquivo no seu documento HTML.&lt;br /&gt;- Chame a seguinte função para realizar o parse do template:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;var result = TrimPath.parseTemplate(strTemplate).process(params);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Onde:&lt;/span&gt;&lt;br /&gt;- strTemplate é a String que contém os dados a serem parseados (o seu template)&lt;br /&gt;- params são os dados em JSON que serão inseridos na apresentação do template&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Exemplo:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;var strTemplate = "Oi ${fulano}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;var params = { fulano : "Cicero" };&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;var result = TrimPath.parseTemplate(strTemplate).process(params);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Você já pode criar seus templates e separar a sua aplicação de uma forma mais organizada e prática.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dicas:&lt;/span&gt;&lt;br /&gt;O template não precisa necessariamente estar no próprio HTML. Requisite o conteúdo via Ajax, e armazene o responseText da requisição em uma String.&lt;br /&gt;&lt;br /&gt;Lendo com mais calma a documentação você perceberá que os parametros JSON que você utiliza para o parse são facilmente identificaveis por tipo pela biblioteca. Como por exemplo quando você passa um array dentro do seu objeto, o mesmo pode ser percorrido atrav´s da sintaxe de LOOP da trimPath.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-6972393811682160543?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/6972393811682160543/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/11/trimpath-javascript-template.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/6972393811682160543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/6972393811682160543'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/11/trimpath-javascript-template.html' title='Trimpath - Javascript Template'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-8905168565412867159</id><published>2009-11-04T12:37:00.000-08:00</published><updated>2009-11-04T12:39:35.440-08:00</updated><title type='text'>Ctrl + C Ctrl + V</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;font face='serif'&gt;&lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: &amp;apos;Times New Roman&amp;apos;; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;&lt;span style='color: rgb(116, 116, 116); font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 11px; line-height: 17px;' class='Apple-style-span'&gt;&lt;h2 style='margin: 0px; padding: 0px; color: rgb(26, 26, 26); text-decoration: none; font-family: Georgia,&amp;apos;Times New Roman&amp;apos;,Times,serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 300%; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;Slow class selectors&lt;/h2&gt;&lt;p style='margin: 0px 0px 1em; padding: 0px;'&gt;This method can be problematic with large html documents with thousands of DOM elements. Web browsers which aren't able to do efficient evaluations on class based selectors are seriously disadvantaged here as they need to trawl through the entire document tree to find the elements. Other browsers are better off, but it's still a high cost operation relative to the&lt;b&gt; super fast id based &lt;/b&gt;selector.&lt;/p&gt;&lt;p style='margin: 0px 0px 1em; padding: 0px;'&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style='margin: 0px 0px 1em; padding: 0px;'&gt;Leia o resto em : &lt;a href='http://ajaxian.com/archives/jquery-bondage'&gt;http://ajaxian.com/archives/jquery-bondage&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=0be2327d-691c-806e-a44d-92c03ab2a3d0' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-8905168565412867159?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/8905168565412867159/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/11/ctrl-c-ctrl-v.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/8905168565412867159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/8905168565412867159'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/11/ctrl-c-ctrl-v.html' title='Ctrl + C Ctrl + V'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-3836959134525228539</id><published>2009-10-15T10:15:00.000-07:00</published><updated>2009-10-15T10:17:46.955-07:00</updated><title type='text'>HTML 5 Database Storage</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;Para quem está acompanhando as novas definições para HTML 5 já deve ter ouvido falar de tags como CANVAS, VIDEO, etc.&lt;br/&gt;Mas uma das novas features as quais eu considero sensacional é o armazenamento interno de dados no navegador, não mais através de cookies, e sim utilizando um espaço especifico do aplicativo que permite guardar e organizar estas informações como em um banco de dados.&lt;br/&gt;&lt;br/&gt;Até o momento essa feature já foi disponibilizada na última versão do Webkit, presente no Safari 4.&lt;br/&gt;Um exemplo prático desta implementação esta em: &lt;a href='http://webkit.org/demos/sticky-notes/'&gt;http://webkit.org/demos/sticky-notes/&lt;/a&gt; .&lt;br/&gt;Neste caso foi criada uma aplicação que simula post-it´s que podem ser movidos e escritos em uma espécie de mural.&lt;br/&gt;&lt;br/&gt;As informações de texto e posicionamento do conteúdo são armazenados em uma base de dados interna do navegador, com uma tabela especifica da aplicação.&lt;br/&gt;&lt;br/&gt;Veja a imagem abaixo, onde através do Web Inspector podemos visualizar os dados armazenados:&lt;br/&gt;&lt;/small&gt;&lt;div align='center'&gt;&lt;small&gt;&lt;img height='162' width='563' src='http://lh5.ggpht.com/_rSUahnavSLA/StdS6gm3QQI/AAAAAAAAAXI/BMor3Vq0Ro0/%5BUNSET%5D.jpg?imgmax=800' style='max-width: 800px;'/&gt;&lt;/small&gt;&lt;br/&gt;&lt;/div&gt;&lt;small&gt;&lt;br/&gt;O interessante disso tudo é que pelo menos no Safari o armazenamento é feito utilizando-se SQL LITE.&lt;br/&gt;&lt;br/&gt;No fonte podemos visualizar como as query´s são executadas:&lt;br/&gt;&lt;/small&gt;&lt;small&gt;&lt;br/&gt;&lt;/small&gt;&lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: &amp;apos;Times New Roman&amp;apos;; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;&lt;pre style='white-space: pre-wrap;'&gt;&amp;lt;font color="#cc0000"&amp;gt;function loaded()&lt;br /&gt;{&lt;br /&gt;    db.transaction(function(tx) {&lt;br /&gt;        tx.executeSql("SELECT COUNT(*) FROM WebkitStickyNotes", [], function(result) {&lt;br /&gt;            loadNotes();&lt;br /&gt;        }, function(tx, error) {&lt;br /&gt;            tx.executeSql("CREATE TABLE WebKitStickyNotes (id REAL UNIQUE, note TEXT, timestamp REAL, left TEXT, top TEXT, zindex REAL)", [], function(result) { &lt;br /&gt;                loadNotes(); &lt;br /&gt;            });&lt;br /&gt;        });&lt;br /&gt;    });&amp;lt;/font&amp;gt;&lt;br /&gt;&amp;lt;font color="#cc0000"&amp;gt;}&amp;lt;/font&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;small&gt;&lt;br/&gt;&lt;strike&gt;Espero que esta definição continue sendo seguida, e que no futuroa a Microsoft não invente de implementar isso no IE utilizando uma outra estrutura e até sintaxe de acesso aos dados.&lt;/strike&gt;&lt;br/&gt;&lt;br/&gt;Mais informações em : &lt;/small&gt;&lt;a href='http://www.whatwg.org/specs/web-apps/current-work/'&gt;&lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: &amp;apos;Times New Roman&amp;apos;; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;&lt;span style='font-family: Tahoma; font-size: 12px; white-space: pre;' class='Apple-style-span'&gt;http://www.whatwg.org/specs/web-apps/current-work/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;small&gt;No Firefox 3.5: &lt;a href='https://developer.mozilla.org/en/DOM/Storage'&gt;https://developer.mozilla.org/en/DOM/Storage&lt;/a&gt;&lt;/small&gt;&lt;br/&gt;&lt;small&gt;&lt;br/&gt;No Internet Explorer: &lt;a href='http://msdn.microsoft.com/en-us/library/ms531424%28VS.85%29.aspx'&gt;http://msdn.microsoft.com/en-us/library/ms531424(VS.85).aspx&lt;/a&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=42bd1d15-baba-831f-a9bb-e98d29ab79a1' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-3836959134525228539?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/3836959134525228539/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/10/html-5-database-storage_15.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/3836959134525228539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/3836959134525228539'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/10/html-5-database-storage_15.html' title='HTML 5 Database Storage'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_rSUahnavSLA/StdS6gm3QQI/AAAAAAAAAXI/BMor3Vq0Ro0/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-8251268752073337594</id><published>2009-09-08T12:26:00.000-07:00</published><updated>2009-09-08T12:27:16.649-07:00</updated><title type='text'>Criando lightbox sem Javascript!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;Um dos elementos mais "Web2.0" presentes na atualidade é o "modal", ou lightbox, como preferirem. Este tipo de elemento tem como particularidade dar uma sensação ao usuário que ele não está acessando um outro documento/endereço no navegador, e faz com que o mesmo se sinta em uma espécia de Sistema Operacional Virtual.&lt;br/&gt;O problema maior em implementar estas "caixinhas" de diálogo flutuantes está na compatibilidade delas com os outros navegadores (Firefox 2, Firefox3, Firefox 3.5, Safari, Chrome, IE 6, IE7, IE8, etc).&lt;br/&gt;Para que a feature funcione em todos os navegadores são implementadas funcionalidades em Javascript que além de assumirem o comportamento esperado, realizam workarrounds para que o modulo funcione de forma eficaz para todos.&lt;br/&gt;&lt;br/&gt;Imagine então implementar algo parecido, porém de uma forma mais simples, usando apenas CSS! Sim, apenas utilizando regras de herança e de semântica para que um modal simples, sem efeitos de transição seja exibido.&lt;br/&gt;Seguindo esta linha, que surgiu a proposta de um tutorial disponibilizado no blog (&lt;a href='carsonfield.com/blog'&gt;carsonfield.com/blog&lt;/a&gt;) que cria um modal utilizando apenas CSS.&lt;br/&gt;&lt;br/&gt;No blog o autor fala da compatibilidade da solução com diversos navegadores, entretanto tive alguns problemas de interface (background) no IE 6 de uma VM que utilizo aqui. Creio que é algo relacionado ao background transparente, o qual existem problemas para renderizar no IE 6.&lt;br/&gt;&lt;br/&gt;Destaco a importância deste tutorial pelo fato de que atualmente a média de tamanho de plugins e JS´s para implementação de modal em conjunto com CSS supera o tamanho de 6Kb, sendo que neste caso do exemplo, temos apenas 900Bytes de CSS para a implementação de modais estáticos, sem necessidade de muitos efeitos e interaçoes.&lt;br/&gt;&lt;br/&gt;O link do tutorial é : &lt;a href='http://carsonified.com/blog/design/css/how-to-create-a-valid-non-javascript-lightbox/'&gt;http://carsonified.com/blog/design/css/how-to-create-a-valid-non-javascript-lightbox/&lt;/a&gt;&lt;br/&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=64b881d1-8495-8a10-9fb1-5c61b0ace5d0' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-8251268752073337594?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/8251268752073337594/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/09/criando-lightbox-sem-javascript.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/8251268752073337594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/8251268752073337594'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/09/criando-lightbox-sem-javascript.html' title='Criando lightbox sem Javascript!'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-7480564026905571656</id><published>2009-07-09T12:37:00.001-07:00</published><updated>2009-07-09T12:38:38.535-07:00</updated><title type='text'>[ OFF TOPIC ] Agilidade e Qualidade de Projetos</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;Ainda sobre Agilidade e Qualidade de Projetos, o Fabio Akita postou um screencast sobre a sua apresentação, a mesma que sitei no post anterior sobre este assunto:&lt;br/&gt;&lt;br/&gt;&lt;a href='http://www.akitaonrails.com/2009/07/07/screencast-agilidade-qualidade-e-futuro' target='_blank'&gt;http://www.akitaonrails.com/2009/07/07/screencast-agilidade-qualidade-e-futuro&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Agora vocês podem ver e ouvir o que rolou nessa palestra da Locaweb.&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-7480564026905571656?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/7480564026905571656/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/07/off-topic-agilidade-e-qualidade-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/7480564026905571656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/7480564026905571656'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/07/off-topic-agilidade-e-qualidade-de.html' title='[ OFF TOPIC ] Agilidade e Qualidade de Projetos'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-9024160619679485574</id><published>2009-06-25T06:45:00.001-07:00</published><updated>2009-06-25T06:45:25.156-07:00</updated><title type='text'>FISL - 1°Dia</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;O post está atrasado por que o primeiro dia foi ontem, but...&lt;br/&gt;Minhas impressões sobre a minha primeira ida ao FISL é que o local está bem organizado, tem muitos estandes de empresas conhecidas e a variedade de palestras está bem atraente.&lt;br/&gt;Dentre as palestras que fui ontem duas se destacaram:&lt;br/&gt;- &lt;b&gt;Introdução ao desenvolvimento ágil&lt;/b&gt;&lt;br/&gt;- C&lt;b&gt;MS não é só BLOG e Notícias. O diferencial do Drupal na Secretaria de Saúde de AL.&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;Na sequência estou postando com calma o resumo das palestras, por que por aqui as coisas estão corridas.&lt;br/&gt;&lt;br/&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-9024160619679485574?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/9024160619679485574/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/06/fisl-1dia.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/9024160619679485574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/9024160619679485574'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/06/fisl-1dia.html' title='FISL - 1°Dia'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-414672615794633539</id><published>2009-06-18T10:55:00.001-07:00</published><updated>2009-06-18T10:57:11.988-07:00</updated><title type='text'>[ OFF TOPIC ] Agilidade e Qualidade de Projetos</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;Mês passado estive&lt;small&gt; &lt;/small&gt;no 11° Encontro &lt;/small&gt;&lt;small&gt;Locaweb &lt;/small&gt;&lt;small&gt;de Profissionais da Internet, ocorrido em Porto Alegre.&lt;br/&gt;Ainda estou devendo pro pessoal um resumo dos principais assuntos abordados no evento, mas com certeza além do Rene de Paula (Microsoft) outra palestra que me deixou super motivado foi a do Fabio Akita (&lt;a target='_blank' href='http://www.akitaonrails.com/'&gt;http://www.akitaonrails.com/&lt;/a&gt;) que falava sobre Agilidade e Qualidade de Projetos.&lt;br/&gt;Estou esperando os encontros acabarem para poder divulgar o material que será disponibilizado, mas enfatizo que os slides do Akita já estão disponíveis no slideshare pela url (&lt;a target='_blank' href='http://www.slideshare.net/akitaonrails/encontro-locaweb-so-paulo'&gt;http://www.slideshare.net/akitaonrails&lt;/a&gt;). Este meu post serve exclusivamente para ressaltar o tópico sobre os tipos de desenvolvimento de software (Clássico e o Caseiro - "D.O.S - Desenvolvimento Orientado á Sobrinho") e as formas de Desenvolvimento (Escopo X Qualidade) - (Slides 61 em diante no Encontro de SP). Neste tópico são mencionadas duas formas bem interessantes de abordagem: &lt;br/&gt;- &lt;b&gt;Projetos que o Escopo Fixo&lt;/b&gt;: deve ser seguido como a ponta prioritária da pirâmide, tendo seus prazos cumpridos, porém  com a qualidade duvidosa na entrega, onde "se livrar da responsabilidade" é algo prioriário.&lt;br/&gt;&lt;br/&gt;- &lt;b&gt;Projetos de Escopo Variável&lt;/b&gt;: mas com a Qualidade no Topo da pirâmide, onde o objetivo é compatilhar responsabilidades gerando confiança. Neste caso algumas features são postergadas, e em alguns casos até removidas, mas a qualidade é bem mais alta.&lt;br/&gt;&lt;br/&gt;Nunca tive muito interesse em ser um Gerente de Projetos, gosto muito de desenvolver, entretanto nesses slides vi muita coisa que realmente é interessante para o nosso dia e situações que podem ser contornadas através de outras possibilidades de análise.&lt;br/&gt;Assim que o material do evento for divulgado, posto o resumo aqui.&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-414672615794633539?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/414672615794633539/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/06/off-topic-agilidade-e-qualidade-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/414672615794633539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/414672615794633539'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/06/off-topic-agilidade-e-qualidade-de.html' title='[ OFF TOPIC ] Agilidade e Qualidade de Projetos'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-3547534692122237804</id><published>2009-06-17T11:56:00.001-07:00</published><updated>2009-06-17T12:00:35.144-07:00</updated><title type='text'>Performance de JS - Direto no BIT</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;small&gt;Este post é baseado em algumas definições apresentadas nos Slides de Nicholas C. Zakas, Principal Front End Engineer do Yahoo! e um dos desenvolvedores do YUI. Vou apresentar superficialmente o que está na apresentação, mas sugiro que vocês a vejam slide por slide, já que são 90 páginas e todas com observações bem importantes.&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;small&gt;A URL da apresentação é : &lt;a target='_blank' href='http://www.slideshare.net/nzakas/speed-up-your-javascript'&gt;http://www.slideshare.net/nzakas/speed-up-your-javascript&lt;/a&gt;&lt;/small&gt;&lt;br/&gt;&lt;small&gt;&lt;br/&gt;&lt;b&gt;Por que o Javascript é tão lento?&lt;/b&gt;&lt;br/&gt;O Javascript torna-se lento devido à forma que a implementação é realizada. No meu primeiro post no blog eu mencionei as vantagens quanto ao bom e mau uso de frameworks Javascript, mais especificamente da JQuery.&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;small&gt;No quesito de performance, alguns tópicos devem ser analisados:&lt;br/&gt;- Gerenciamento de Escopo&lt;br/&gt;- Acesso à dados&lt;br/&gt;- Loops (Repetições)&lt;br/&gt;- DOM (Document Object Model)&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;small&gt;Darei importância aos 3 últimos itens, apresentando uma breve descrição do primeiro (o que não o torna menos importante).&lt;br/&gt;&lt;b&gt;&lt;br/&gt;&lt;big&gt;Gerenciamento de Escopo&lt;/big&gt;&lt;/b&gt;&lt;br/&gt;Brevemente falando, todas as vezes que uma função é executada pelo Javascript uma série de encadeamentos são disparados, e executados como processos em paralelo.&lt;br/&gt;Algumas instruções destes procedimentos são executadas de forma desnecessária, já que o algoritmo não consegue interpretar o que virá pela frente.&lt;br/&gt;Para evitarmos que este encadeamento seja percorrido à cada instrução presente em nossa função, uma das mais importantes colocações é quanto ao armazenamento de variaveis, que sugere a declaração de elementos globais como variaveis pertencentes ao escopo interno da função.&lt;br/&gt;&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;function exemplo1(){&lt;br/&gt;    // A declaração do objeto DOCUMENT no escopo da função, evita que o interpretador fique "entrando" e "saindo" do escopo da função para buscar valores&lt;br/&gt;    var doc = document;&lt;br/&gt;    var divs = doc.getElementsByTagName("divs");&lt;br/&gt;    var images = doc.getElementsByTagName("img");&lt;br/&gt;    return true;&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Outro detalhe, NUNCA esqueça do VAR antes de declarar uma váriavel, caso contrário ela será tratada como GLOBAL e o fluxo de encadeamento é quebrado, prejudicando a navegação pelo escopo definido.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;&lt;big&gt;Acesso à dados&lt;/big&gt;&lt;/b&gt;&lt;br/&gt;Este item é bem importante, seguindo a linha de raciocínio especificado no item anterior, temos as seguintes colocações:&lt;br/&gt;- Acessar dados literais ou de variáveis locais é algo rápido.&lt;br/&gt;- Acessar dados de uma propriedade (atributo) de um objeto ou array é muito mais custoso (variando de browser para browser).&lt;br/&gt;&lt;br/&gt;&lt;img width='427' height='267' style='max-width: 800px;' src='http://lh4.ggpht.com/_rSUahnavSLA/Sjk7ghfk3EI/AAAAAAAAAXE/zW-w8_-m5is/%5BUNSET%5D.jpg?imgmax=800'/&gt;&lt;br/&gt;&lt;br/&gt;- Acessar objeto.name é mais rápido do que objeto.name.name;&lt;br/&gt;- Quanto mais profundo o nível da propriedade, mais custoso é o acesso.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;&lt;big&gt;Property Notation&lt;/big&gt;&lt;/b&gt;&lt;br/&gt;O acesso à objetos em Javascript pode ser realizada de duas formas:&lt;br/&gt;- Com ponto : objeto.nome&lt;br/&gt;- Com colchetes (como um array associativo) : objeto["nome"]&lt;br/&gt;&lt;br/&gt;A diferença entre as duas está apenas na sintaxe, com excessão do Safari, que processa mais rápido a primeira opção.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Recomendações:&lt;/b&gt;&lt;br/&gt;- Armaneze niveis de acesso de objetos em variáveis locais, dentro do escopo da função ou método, especificamente quando estes são acessados de forma repetitiva.&lt;br/&gt;- Minimize o nível de atributos/propriedades em objetos, lembre-se: quanto mais complexa a estrutura, mais lento é o processamento.&lt;br/&gt;&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;function exemplo2(arrData){&lt;br/&gt;    for(var a = 0; a &amp;lt; arrData.length; a++){&lt;br/&gt;        alert(arrData[a]);&lt;br/&gt;    }&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;O exemplo acima realiza o loop em um array (bem óbvio), entretando a CADA volta do Loop, o array é novamente acessado, e medido. Ou seja, você está realizando a contagem de todas posições ocupadas à cada volta do Loop. :S&lt;br/&gt;&lt;br/&gt;Agora observe o exemplo abaixo:&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;function exemplo3(arrData){&lt;br/&gt;    var arrSize = arrData.length;&lt;br/&gt;    for(var a = 0; a &amp;lt; arrSize; a++){&lt;br/&gt;        alert(arrData[a]);&lt;br/&gt;    }&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;ÓTIMO, E O QUAL O GANHO DISSO?&lt;/b&gt;&lt;br/&gt;Vamos então aos números:&lt;br/&gt;- Firefox ganho de 5%;&lt;br/&gt;- Safari ganho de 10%;&lt;br/&gt;-&lt;font color='#ff0000'&gt; Internet Explorer ganho de 33%;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;Loops / Repetições:&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;Neste processo devemos ter cuidado à quantidade de instruções por interação e principalmente termos uma condição de parada eficaz.&lt;br/&gt;&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;var len = 5;&lt;br/&gt;for(var i = 0; i &amp;lt; len; i++){&lt;br/&gt; // faça alguma coisa&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;No exemplo acima temos duas instruções repetitivas:&lt;br/&gt;&lt;font color='#ff0000'&gt;i &amp;lt; len;&lt;br/&gt;e&lt;br/&gt;i++&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Podemos simplificar esse processo da seguinte forma:&lt;br/&gt;&lt;font face='Courier New'&gt;for(var i = len; i--){&lt;br/&gt;  // faça alguma coisa , agora mais rapido!&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;QUAL O GANHO COM ISSO?&lt;/b&gt;&lt;br/&gt;Somente 50%. :)&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;DOM (Document Object Model)&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;Objetos de uma HTMLCollection (document.images, document.forms, getElementsByTagName, getElementsByClassName, etc).&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Coleções em HTML DOM assumem-se como "vivas" pois são automaticamente atualizadas cada vez que a estrutura do documento sofrer modificações.&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;Vejamos o exemplo:&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;var divs = document.getElementsByTagName("div");&lt;br/&gt;for(a = 0; a &amp;lt; divs.length; a++){&lt;br/&gt;    var div = document.createElement("div");&lt;br/&gt;    document.body.appendChild(div);&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;No exemplo acima acabamos de criar um loop infinito! Isso por que a cada interação a variavel "divs" é acessada, e o DOM é reparseado para sua contagem, e já que estamos inserindo um elemento novo a cada interação, não teremos um fim nunca.&lt;br/&gt;&lt;br/&gt;Entretanto se seguirmos a seguinte linha:&lt;br/&gt;&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;var divs = document.getElementsByTagName("div");&lt;br/&gt;for(a = 0, len = divs.length; a &amp;lt; len; a++){&lt;br/&gt;    // Faça alguma coisa&lt;br/&gt;}&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Atribuimos o tamanho do elemento à uma nova variável, a qual pertence apenas ao escopo do FOR, e que não será reparseada em casos de modificações no documento.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Obs.&lt;/b&gt;: Da mesma maneira que sugerimos o armazenamento de variaveis GLOBAIS como LOCAIS no gerenciamento de escopo podemos aplicar esta regra também para o DOM.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;Reaproveitamento&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;Este tópico também recebe destaque no que se refere à modificações de layout de um elemento. Como de costume fazemos isso acessando o elemento através do atributo "style" e por fim a propriedade desejada.&lt;br/&gt;Ex.:&lt;br/&gt;document.getElementById("myDiv").style.display = "block";&lt;br/&gt;document.getElementById("myDiv").style.border = "1px solid #FF0000";&lt;br/&gt;&lt;br/&gt;No exemplo acima estamos obrigando o interpretador acessar toda a àrvore dde propriedade do elemento "myDiv" duas vezes, o ideal é evitarmos mudar propriedades de elementos desta forma, realizando esta configuração através de classes especificas de CSS.&lt;br/&gt;&lt;br/&gt;Ex.:&lt;br/&gt;&lt;font face='Courier New'&gt;document.getElementById("myDiv").className = "estilo1";&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;e no CSS teremos a configuração desejada:&lt;br/&gt;&lt;br/&gt;&lt;font face='Courier New'&gt;.estilo1{&lt;br/&gt;    display: block;&lt;br/&gt;    border: 1px solid #FF0000&lt;br/&gt;}&lt;/font&gt;&lt;/small&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-3547534692122237804?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/3547534692122237804/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/06/performance-de-js-direto-no-bit.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/3547534692122237804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/3547534692122237804'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/06/performance-de-js-direto-no-bit.html' title='Performance de JS - Direto no BIT'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rSUahnavSLA/Sjk7ghfk3EI/AAAAAAAAAXE/zW-w8_-m5is/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-2192959425027078334</id><published>2009-06-08T11:08:00.000-07:00</published><updated>2009-06-17T12:03:11.271-07:00</updated><title type='text'>Page Speed: complemento para o Firebug que possibilita a medição de carga e análise de otimização da página</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;span style='font-size: 85%;'&gt;Buenas pessoal, Richard Rabbat and Bryan McQuade desenvolveram uma ferramenta para a análise e sugestão de melhorias para carga de websites, baseados em normas de performance e desenvolvimento web.&lt;br/&gt;&lt;br/&gt;A serventia desta ferramenta é agir em cojunto com o Firebug, e ter um comportamento parecido com o YSlow do Yahoo, entretanto ela é interessante pois já apresenta um relatório do que pode ser melhorado e como pode ser melhorado, além do mais existe uma opção chamada Page Speedy Activity específica para análise de parse e execução de códigos Javascript.&lt;br/&gt;&lt;br/&gt;Para instalar esse add basta ter o Firefox e o Firebug instalado.&lt;br/&gt;&lt;br/&gt;O link para o projeto é &lt;a href='http://google-code-updates.blogspot.com/2009/06/introducing-page-speed.html'&gt;este&lt;/a&gt; (&lt;/span&gt;&lt;span style='font-size: 85%;'&gt;http://google-code-updates.blogspot.com/2009/06/introducing-page-speed.html)&lt;/span&gt;&lt;br/&gt;&lt;span style='font-size: 85%;'&gt;&lt;br/&gt;sendo que de brinde temos uma especificação sobre &lt;a href='http://code.google.com/intl/pt-BR/speed/page-speed/docs/rules_intro.html'&gt;Web Performance Best Practices&lt;/a&gt; do Google, o que creio ser algo muito parecido com o do Yahoo, mas que pode possuir algumas particularidades interessantes.&lt;br/&gt;&lt;br/&gt;Estas especificações sobre melhoria de carga e desenvolvimento envolvem a combinação de arquivos Javascript, CSS Sprites, limitação no número de domínios requisitados entre outras, realmente é um plugin super interessante que vale a pena ser instalado.&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-2192959425027078334?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/2192959425027078334/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/06/page-speed-complemento-para-o-firebug.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/2192959425027078334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/2192959425027078334'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/06/page-speed-complemento-para-o-firebug.html' title='Page Speed: complemento para o Firebug que possibilita a medição de carga e análise de otimização da página'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-5910263710761948141</id><published>2009-06-03T14:13:00.000-07:00</published><updated>2009-06-03T15:37:51.611-07:00</updated><title type='text'>Importando e exportando Dados HTTP com o Firebug</title><content type='html'>&lt;span style="font-size:85%;"&gt;Jan Odvarko do Firebug Team critou um novo plugin que nos permite a exportação dos dados do Firebug no Formato HTTP Archive (JSON) e a visualização destes dados através de uma interface Web, apresentando-se da mesma forma que é feito no Firebug.&lt;br /&gt;&lt;br /&gt;A vantagem deste plugin é o fato de você poder armazenar o histórico em JSON das cargas e trafégo realizados pelo seu HTML.&lt;br /&gt;O Firebug na sua versão atual não permite que você realize esse procedimento.&lt;br /&gt;&lt;br /&gt;É importante avisa-los que na própria descrição do plugin, o autor informa que é necessária no mínimo a versão 1.4a26 do Firebug.&lt;br /&gt;No site oficial a versão disponível é a &lt;a href="https://addons.mozilla.org/pt-BR/firefox/addon/1843"&gt;1.4.0b1&lt;/a&gt; , entretanto esta versão é compatível apenas com o Firefox 3.5b4.&lt;br /&gt;Para utilizar na versão estável do Firefox (3.0.10) você pode baixar as outras versões neste &lt;a href="http://getfirebug.com/releases/export/1.4/"&gt;link&lt;/a&gt;.&lt;br /&gt;Aconselho você a utilizar a mesma versão mencionada antes (1.4a26), pois tentei baixar as mais recentes e houve incompatibilidade com o plugin.&lt;br /&gt;&lt;br /&gt;O download do add para o Firebug está disponível em:&lt;br /&gt;&lt;a href="http://getfirebug.com/releases/export/1.4/"&gt;http://getfirebug.com/releases/export/1.4/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Baixe a versão 0.6.&lt;br /&gt;&lt;br /&gt;Você verá que após reiniciar o seu navegar estará disponível a opção export no menu "Rede".&lt;br /&gt;Ao clicar em exportar um arquivo JSON será gerado para você.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_rSUahnavSLA/Sib7Ee_GlHI/AAAAAAAAAWk/4u1LJ2rZcJg/s1600-h/export_fire.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 82px;" src="http://4.bp.blogspot.com/_rSUahnavSLA/Sib7Ee_GlHI/AAAAAAAAAWk/4u1LJ2rZcJg/s320/export_fire.jpg" alt="" id="BLOGGER_PHOTO_ID_5343234062377456754" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Cole o conteúdo deste arquivo no formulário deste site e você poderá visualizar o histório de rede (carga) do site que foi medido.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softwareishard.com/har/viewer/"&gt;http://www.softwareishard.com/har/viewer/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Um detalhe muito importante é que você pode salvar em seu PC este serviço de análise, bastando "Salvar Como" o documento principal, e verificando se o relacionamento entre os arquivos JS e CSS do site ficaram com a localização correta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;O que eu ganho com isso?&lt;/span&gt;&lt;br /&gt;O caso de uso para este plugin é bem específico, tenho trabalhado muito com análise de carga e desempenho de sites e realmente o trabalho para documentar estar informações de forma visual e clara é bem cansativo e trabalhoso.&lt;br /&gt;&lt;br /&gt;Por fim, não posso deixar de relatar a fonte de onde busquei este artigo, &lt;a href="http://www.ajaxian.com/"&gt;http://www.ajaxian.com&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-5910263710761948141?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/5910263710761948141/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/06/importando-e-exportando-dados-http-com.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/5910263710761948141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/5910263710761948141'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/06/importando-e-exportando-dados-http-com.html' title='Importando e exportando Dados HTTP com o Firebug'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_rSUahnavSLA/Sib7Ee_GlHI/AAAAAAAAAWk/4u1LJ2rZcJg/s72-c/export_fire.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-67277902434113357</id><published>2009-06-02T12:31:00.000-07:00</published><updated>2009-06-02T12:39:03.862-07:00</updated><title type='text'>Ainda sobre frameworks Javascript</title><content type='html'>&lt;span style="font-size:85%;"&gt;Esta semana enquanto lia alguns feeds me deparei com uma matéria super interessante do Fabio Nagao para o &lt;a href="http://www.imasters.com.br/"&gt;IMASTERS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://imasters.uol.com.br/artigo/12943/jquery/jquery_vs_mootools_-_como_escolher/"&gt;Matéria: JQuery vs Mootools - Como escolher?&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Ela relata a diferença entre a utilização da &lt;a href="http://www.jquery.com/"&gt;JQuery&lt;/a&gt; e a &lt;a href="http://mootools.net/"&gt;Mootools&lt;/a&gt;, o que aparentemente para quem não conhece seria "quase" a mesma coisa, por se tratarem de frameworks e por serem em Javascript.&lt;br /&gt;&lt;br /&gt;O fato de você ter uma biblioteca com um objeto chamado "$" para acessar elementos do DOM ou realizar efeitos especiais no seu HTML não quer dizer que tratam-se de frameworks iguais (&lt;a href="http://www.jquery.com/"&gt;JQuery&lt;/a&gt;, &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, &lt;a href="http://extjs.com/"&gt;Ext&lt;/a&gt;, &lt;a href="http://mootools.net/"&gt;Mootools&lt;/a&gt;, etc).&lt;br /&gt;Variantes como: contexto, nível de conhecimento e necessidade podem leva-lo a usar um framework ou outro, sendo cada caso um caso.&lt;br /&gt;&lt;br /&gt;Sugiro que você leia atentamente e com calma o texto da matéria, pois realmente é bem interessante.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-67277902434113357?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/67277902434113357/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/06/ainda-sobre-frameworks-javascript.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/67277902434113357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/67277902434113357'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/06/ainda-sobre-frameworks-javascript.html' title='Ainda sobre frameworks Javascript'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8933244724303036133.post-413698987676425514</id><published>2009-05-06T08:04:00.000-07:00</published><updated>2009-05-06T08:07:06.745-07:00</updated><title type='text'>Javascript Frameworks: Boa e má utilização</title><content type='html'>&lt;span style="font-size:85%;"&gt;Trabalho com Javascript há alguns anos e admito que a sua utilização tem se tornado de extrema importância para os meios de desenvolvimentos atuais.&lt;br /&gt;&lt;br /&gt;Sou do tempo que Javascript era utilizado para dar "alert´s" ao usuário, validar um formulário explodindo um OK/CANCELAR na cara do usuário dizendo que ele esqueceu de preencher o campo "nome".&lt;br /&gt;&lt;br /&gt;Entretanto os tempos mudaram, surgiu o conceito de "Web 2.0", começou-se a utilizar o Javascript para o carregamento de conteúdo dinâmico (Ajax), diversos frameworks surgiram (JQuery, Ext, Prototype, Mootools, etc). Porém o objetivo destes "ajudantes" digamos assim, é de facilitar a vida do programador, reduzindo quantidade de código, abstraindo e incorporando uma série de funcionalidades e features que visam facilitar o desenvolvimento.&lt;br /&gt;Mas se olharmos mais a fundo, surge a questão: O quanto performático são estes frameworks? Quando e como devemos utiliza-los?&lt;br /&gt;&lt;br /&gt;Escrevi este artigo para retratar de uma forma simples e básica o que defendo. Sei das facilidades que a JQuery proporciona por exemplo, é muito mais rápido você buscar um elemento específico escrevendo :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;$("#myDiv")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;do que:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;document.getElementById("myDiv")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Buscar um elemento por seu &lt;span style="font-style: italic;"&gt;className &lt;/span&gt;então, nem se fala.&lt;br /&gt;&lt;br /&gt;Porém, como mencionei antes, você sabe qual é o custo desta facilidade?&lt;br /&gt;&lt;br /&gt;Vamos aos números:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Utilizando a JQuery para obter o "node" de determinado elemento com um ID único o tempo estimado é de 1,5ms (milisegundos)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Utilizando a forma clássica o tempo reduz para 0,34ms (milisegundos)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;O resultado é o mesmo, porém como vemos a forma clássica (utilizando a sintaxe direta do JS) é mais 3X rápida.&lt;br /&gt;&lt;br /&gt;Não podemos levar em conta que isso é uma valor irrisório quando temos usuários utilizando conexões cada vez mais rápidas, sendo que isso também influência o tempo de processamento do lado do cliente, realizado pelo browser.&lt;br /&gt;&lt;br /&gt;Esses números se justificam quando levamos em conta a utilização de plugins para JQuery por exemplo, um plugin chamado ZOOMTHUMB que realiza uma aproximação de um thumb no HTML pode ser facilmente replicado de forma clássica de desenvolvimento, mesmos que com algumas linhas a mais.&lt;br /&gt;&lt;br /&gt;Observe o comparativo:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;JQUERY + PLUGIN ZOOMTHUMB&lt;br /&gt;Total de chamadas executadas: ~500&lt;br /&gt;Tempo de execução: 28ms&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Modo Clássico (Sem JQuery, sem Plugin):&lt;br /&gt;Total de chamadas executadas: 4&lt;br /&gt;Tempo de Execução: 1,1ms&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Quero que compreendam que não estou implicando com o uso da JQuery, ou qualquer outro framework e seus plugins, apenas considero e defendo que devemos avaliar quando e como usar estes recursos.&lt;br /&gt;&lt;br /&gt;A justificativa de reduzir quantidade de código não é válida de forma isolada. ;)&lt;br /&gt;&lt;br /&gt;Nos testes que realizei foi de grande ajuda o add-on Firebug (para Firefox), o qual você pode realizar um teste mais detalhado do que é executado, e qual chamada consome mais tempo dentro do seu script.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8933244724303036133-413698987676425514?l=extremejs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://extremejs.blogspot.com/feeds/413698987676425514/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://extremejs.blogspot.com/2009/05/javascript-frameworks-boa-e-ma.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/413698987676425514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8933244724303036133/posts/default/413698987676425514'/><link rel='alternate' type='text/html' href='http://extremejs.blogspot.com/2009/05/javascript-frameworks-boa-e-ma.html' title='Javascript Frameworks: Boa e má utilização'/><author><name>Cícero Feijó</name><uri>http://www.blogger.com/profile/17880873571059844682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_rSUahnavSLA/SiBgKRgPaXI/AAAAAAAAAWA/kC-RaWwvDR4/S220/eu.jpg'/></author><thr:total>0</thr:total></entry></feed>
