<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>O Desenvolvedor</title>
<link>http://www.andafter.org/blogs/odesenvolvedor</link>
<pubDate> Wed, 8 Jul 2009 23:04:18 -0300</pubDate>
<description>O Desenvolvedor - desevolvimento web, programação, scripts e filosofia de internet!</description>
<generator>http://www.andafter.org</generator>
<language>pt-br</language>
<creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.0/</creativeCommons:license><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><image><link>http://www.andafter.org/blogs/odesenvolvedor</link><url /><title>O Desenvolvedor</title></image>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ODesenvolvedor" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/ODesenvolvedor" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FODesenvolvedor" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
	<title>Do ASP ao PHP, vim para o lado negro da força!</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/yT8T1mIksJM/do-asp-ao-php-vim-para-o-lado-negro-da-forca_1176.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/do-asp-ao-php-vim-para-o-lado-negro-da-forca_1176.html#comentar</comments>
	<pubDate> Fri, 3 Jul 2009 10:52:31 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/do-asp-ao-php-vim-para-o-lado-negro-da-forca_1176.html</guid>
	<description><![CDATA[Decidi migrar de vez para o PHP, deixando de lado o ASP clássico e colocando os estudos em .NET em stand by. Aqui explico meus motivos...]]></description>
	<content:encoded><![CDATA[<p>Buenas povo! Faz tempo que n&atilde;o dedico meu tempo a escrever aqui no <strong><a href="http://www.odesenvolvedor.com.br">O Desenvolvedor</a></strong>, mas pretendo voltar ao ritmo anterior e com algumas mudan&ccedil;as (acompanhando as novidades na minha vida profissional).</p>
<p>Este &eacute; um post para apresentar algumas novidades que, de certa forma, guiar&atilde;o minhas publica&ccedil;&otilde;es por aqui. A primeira &eacute; que <strong>n&atilde;o vou dar continuidade aos meus estudos com .NET</strong>, e estou reduzindo meu trabalho com o <a href="http://www.andafter.org/blogs/odesenvolvedor/tag/asp"><strong>ASP</strong></a> cl&aacute;ssico. Isso n&atilde;o quer dizer que encerrarei meus posts sobre a linguagem, mas como estou me dedicando a estudar outras, poss&iacute;velmente me focarei nelas.</p>
<p style="margin-left: 40px; "><span style="color: rgb(51, 51, 51); ">Ah, preciso agradecer ao </span><strong><a href="http://leocaseiro.com.br/"><span style="color: rgb(51, 51, 51); ">Leo Caseiro</span></a></strong><span style="color: rgb(51, 51, 51); ">, que me disponibilizou um material excelente sobre .NET quando comecei a estudar!</span></p>
<p>Espero que este artigo ajude a orientar de alguma forma as pessoas que procuram pela manjada quest&atilde;o: &quot;que linguagem &eacute; melhor estudar?&quot;</p>
<p>Vamos aos motivos das minhas mudan&ccedil;as...</p>
<p>&nbsp;</p>
<h2>Porque <em>&quot;desistir&quot;</em> o ASP cl&aacute;ssico?</h2>
<p>J&aacute; fazia algum tempo que eu procurava evoluir, trocar de linguagem de programa&ccedil;&atilde;o, e por isso iniciei meus estudos em .NET.&nbsp;Vamos aos <strike>3</strike>&nbsp;4 motivos que me levaram a&nbsp;<em>&quot;pular fora&quot;:</em></p>
<p style="text-align: center; "><input type="image" src="http://www.andafter.org/images/album/internet/MicrosoftLogo.jpg" alt="Microsoft" width="450" height="360" /></p>
<p>Para aprender alguma coisa nova. E n&atilde;o estou dizendo que sei tudo do ASP, n&atilde;o mesmo. Mas mudar &eacute; bom, gosto de mudan&ccedil;as, aprender uma linguagem de programa&ccedil;&atilde;o nova &eacute; como come&ccedil;ar a estudar um novo idioma, estimula o c&eacute;rebro, tira noites de sono de uma forma positiva, anima!</p>
<p>Queria mudar porque o&nbsp;<strong><a href="http://www.andafter.org/blogs/odesenvolvedor/tag/asp">ASP</a>&nbsp;</strong>est&aacute; se tornando obsoleto (para muitos, j&aacute; &eacute;) devido a migra&ccedil;&atilde;o para o .NET, que apresenta mais possibilidades e melhor desempenho (dizem, nunca testei realmente).</p>
<p>Comunidade de desenvolvedores muito pequena. Tudo bem que existe o Google, existem f&oacute;runs e at&eacute; uma documenta&ccedil;&atilde;o razo&aacute;vel, mas nada comparado a PHP, por exemplo. Muitas vezes eu quebrava a cabe&ccedil;a para desenvolver determinada funcionalidade, sabendo que em outras linguagens uma centena de desenvolvedores j&aacute; haviam desenvolvido isso e disponibilizado o c&oacute;digo para uso, estudo e altera&ccedil;&otilde;es.</p>
<p>Dinheiro. Grana. Eu pago licen&ccedil;a para utilizar o Windows Server no meu servidor. Eu n&atilde;o consigo bons dll&acute;s gratuitos para manipula&ccedil;&atilde;o de imagem ou arquivos (pdf&acute;s, planilhas, etc...). Quase tudo &eacute; pago, seguindo o &quot;padr&atilde;o&quot; da tecnologia ASP.</p>
<p>&nbsp;</p>
<h2>Porque n&atilde;o o .NET?</h2>
<p>Alguns dos motivos que me fizeram querer mudar do&nbsp;<strong><a href="http://www.andafter.org/blogs/odesenvolvedor/tag/asp">ASP</a>&nbsp;</strong>continuam presentes na linguagem .NET, como por exemplo o <strong>custo.</strong></p>
<p style="text-align: center; "><input type="image" src="http://www.andafter.org/images/album/internet/elephpant-elephant-php-logo.png" alt="PHP" width="397" height="255" /></p>
<p>A comunidade de desenvolvedores n&atilde;o ser muito grande (ou n&atilde;o gostar de colaborar com o mundo, indo contra a poderosa e adorada &quot;<em>interwebs&quot;</em>).</p>
<p>Motivos pessoais: como eu comentei, estou de emprego novo, e por aqui o .Net n&atilde;o &eacute; utilizado (pelo menos at&eacute; onde eu sei).</p>
<p>&nbsp;</p>
<h2><strong>Porque escolhi o PHP?</strong></h2>
<p><strike>Pra ser cool.</strike></p>
<p>O primeiro motivo, obviamente, a linguagem aberta, gratuita. Vou economizar um dinheiro consider&aacute;vel por m&ecirc;s pelo simples fato de n&atilde;o precisar pagar licen&ccedil;a do Windows no servidor. <span style="color: rgb(153, 153, 153); ">Isso ser&aacute; a longo prazo, somente depois que eu migrar meu sistema todo de Intranet para o </span><a href="http://www.andafter.org/blogs/odesenvolvedor/tag/php"><span style="color: rgb(153, 153, 153); "><strong>PHP</strong></span></a><span style="color: rgb(153, 153, 153); ">, que vai levar possivelmente mais do que seis meses...</span></p>
<p style="text-align: center; "><img alt="Darth Vader" width="350" height="403" src="http://www.andafter.org/images/album/internet/MasterReplica_DarthVaderHelmet.jpg" /></p>
<p style="text-align: center; ">Para ficar do lado negro da for&ccedil;a!*</p>
<p style="text-align: center; ">&nbsp;</p>
<p>Comunidade gigantesca de desenvovledores e melhor, que adoram compartilhar conhecimentos. A documenta&ccedil;&atilde;o &eacute; maravilhosa.</p>
<p>Linguagem ainda em desenvolvimento (agora o&nbsp;<a href="http://www.andafter.org/blogs/odesenvolvedor/tag/php"><strong>PHP</strong></a>&nbsp;5, estou certo?), sem a necessidade de &quot;extens&otilde;es&quot; como os dll&acute;s que j&aacute; me perturbaram no <a href="http://www.andafter.org/blogs/odesenvolvedor/tag/asp"><strong>ASP</strong></a>.</p>
<p>J&aacute; tinha um conhecimento superficial sobre a linguagem, foi com ela me inseri no mundo do desenvolvimento criando meu primeiro blog e CMS, l&aacute; no meu tempo de guri...</p>
<p>Comecei a estudar loucamente MVC, nunca vi um framework gratuito e funcional para&nbsp;<a href="http://www.andafter.org/blogs/odesenvolvedor/tag/asp"><strong>ASP</strong></a>, j&aacute; me indicaram diversos (e aparentemente muito bons) para o&nbsp;<strong><a href="http://www.andafter.org/blogs/odesenvolvedor/tag/php">PHP</a>!</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&Eacute; isso... a partir de agora n&atilde;o se assustem se surgir por aqui alguns posts <em>&quot;PHP for dummies&quot;</em>, e aceito sugest&otilde;es de artigos tamb&eacute;m, viu?</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>* o t&iacute;tulo deste artigo &eacute; gra&ccedil;as ao tweet do <strong><a href="http://www.twitter.com/cleiverrr">@cleiverrr</a></strong>, quando anunciei meus estudos com o PHP:<em> &quot;lol </em><a href="http://www.twitter.com/gserrano"><em><strong>@gserrano</strong></em></a><em> est&aacute; vindo pro lado negro da for&ccedil;a! =D&quot;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/yT8T1mIksJM" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/do-asp-ao-php-vim-para-o-lado-negro-da-forca_1176.html</feedburner:origLink></item>
<item>
	<title>Wordpress - listar usuários com um determinado perfil</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/tZz7T-XsGlQ/wordpress-listar-usuarios-com-um-determinado-perfil_1158.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/wordpress-listar-usuarios-com-um-determinado-perfil_1158.html#comentar</comments>
	<pubDate> Mon, 22 Jun 2009 15:47:37 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/wordpress-listar-usuarios-com-um-determinado-perfil_1158.html</guid>
	<description><![CDATA[Veja como listar, no Wordpress, todos os usuários de um certo perfil (autor, editor, etc...)]]></description>
	<content:encoded><![CDATA[<p>Tenho quase certeza que essa n&atilde;o &eacute; a melhor forma (sem usar algum plugin) para listar todos os usu&aacute;rios cadastrados no seu blog/site com o <strong>Wordpress</strong> de um determinado perfil, mas no caso em que a performance n&atilde;o &eacute; gargalo, n&atilde;o vi problemas:</p>
<ul>
    <li>fa&ccedil;a um <em>select</em> na tabela de usu&aacute;rios, retornando todos os <em>ids</em></li>
    <li>percorra a lista de <em>ids</em>, retornando cada usu&aacute;rio relativo a esse <em>id</em></li>
    <li>faz um if para checar o <em>user_level</em>. &Eacute; ele que define o perfil do usu&aacute;rio</li>
</ul>
<p>O c&oacute;digo seria:</p>
<p><code>&lt;?php <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $aUsersID = $wpdb-&gt;get_col( $wpdb-&gt;prepare(&quot;SELECT $wpdb-&gt;users.ID FROM $wpdb-&gt;users ORDER BY %s ASC&quot;, &quot;&quot;));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;foreach ( $aUsersID as $iUserID ) :<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$user = get_userdata( $iUserID );<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if($user-&gt;user_level==2) { //2 &eacute; o user_level para contribuidor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //faz o que for necess&aacute;rio com o objeto $user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endforeach;<br />
?&gt;<br />
<br type="_moz" />
</code></p>
<p>&nbsp;</p>
<p>Pelo que pude ver da estrutura da base do <strong>Wordpress</strong>, que eu ainda estou conhecendo, h&aacute; uma tabela <strong>wp_users</strong> que tem os usu&aacute;rios e uma outra, <strong>wp_usermet</strong><strong>a</strong>, de <em>metadados</em>. N&atilde;o entendi porque <em>user_level</em> n&atilde;o faz parte da <strong>wp_users</strong> pois est&aacute; ligado diretamente ao usu&aacute;rio (ser&aacute; que nas primeiras vers&otilde;es n&atilde;o existia esse campo e depois criaram como um metadado?), mas certamente um <em>inner join</em> poderia resolver mais elegantemente essa quest&atilde;o.</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/tZz7T-XsGlQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/wordpress-listar-usuarios-com-um-determinado-perfil_1158.html</feedburner:origLink></item>
<item>
	<title>Validação de CPF por javascript</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/GvCfePkaSXI/validacao-de-cpf-por-javascript_1138.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/validacao-de-cpf-por-javascript_1138.html#comentar</comments>
	<pubDate> Tue, 16 Jun 2009 9:59:36 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/validacao-de-cpf-por-javascript_1138.html</guid>
	<description><![CDATA[Função javascript para validar CPFs]]></description>
	<content:encoded><![CDATA[<p>Depois de testar v&aacute;rias fun&ccedil;&otilde;es, encontrei uma - na verdade, encontraram e me encaminharam - que parece funcionar corretamente, pois o que mais acontecia era funcionar com uns, e com outros n&atilde;o, a&iacute; trocava a fun&ccedil;&atilde;o e parava de funcionar com alguns mas com outros come&ccedil;ava a rolar.</p>
<blockquote>
<p><em>function ValidarCPF(Objcpf){ <br />
&nbsp;&nbsp;&nbsp; var cpf = Objcpf.value; <br />
&nbsp;&nbsp;&nbsp; exp = /.|-/g <br />
&nbsp;&nbsp;&nbsp; cpf = cpf.toString().replace( exp, &quot;&quot; ); <br />
&nbsp;&nbsp;&nbsp; var digitoDigitado = eval(cpf.charAt(9)+cpf.charAt(10)); <br />
&nbsp;&nbsp;&nbsp; var soma1=0, soma2=0; <br />
&nbsp;&nbsp;&nbsp; var vlr =11; <br />
&nbsp;&nbsp;&nbsp; for(i=0;i&lt;9;i++){ <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; soma1+=eval(cpf.charAt(i)*(vlr-1)); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; soma2+=eval(cpf.charAt(i)*vlr); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; vlr--; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp; soma1 = (((soma1*10)%11)==10 ? 0:((soma1*10)%11)); <br />
&nbsp;&nbsp;&nbsp; soma2 = (((soma2+(2*soma1))*10)%11); <br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp; if(cpf == &quot;11111111111&quot; || cpf == &quot;22222222222&quot; || cpf == <br />
&quot;33333333333&quot; || cpf == &quot;44444444444&quot; || cpf == &quot;55555555555&quot; || cpf == <br />
&quot;66666666666&quot; || cpf == &quot;77777777777&quot; || cpf == &quot;88888888888&quot; || cpf == <br />
&quot;99999999999&quot; || cpf == &quot;00000000000&quot; ){ <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var digitoGerado = null; <br />
&nbsp;&nbsp;&nbsp; }else{ <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var digitoGerado = (soma1*10) + soma2; <br />
&nbsp;&nbsp;&nbsp; } <br />
<br />
&nbsp;&nbsp;&nbsp; if(digitoGerado != digitoDigitado){ <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; return true;<br />
} </em></p>
</blockquote><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/GvCfePkaSXI" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/validacao-de-cpf-por-javascript_1138.html</feedburner:origLink></item>
<item>
	<title>Menu por ano e mês no Wordpress</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/dkZhh9cIamI/menu-por-ano-e-mes-no-wordpress_1121.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/menu-por-ano-e-mes-no-wordpress_1121.html#comentar</comments>
	<pubDate>Sun, 7 Jun 2009 12:53:54 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/menu-por-ano-e-mes-no-wordpress_1121.html</guid>
	<description><![CDATA[Como montar um menu por ano e mês dos seus posts no Wordpress]]></description>
	<content:encoded><![CDATA[<p>Mexendo no template de um blog do Wordpress, precisei inserir aquele menu que tem os anos e os m&ecirc;ses desses anos para navegac&atilde;o.</p>
<p>O c&oacute;digo &eacute; simples:</p>
<pre name="code" class="html">
&lt;ul&gt;
&lt;?php
/**/
$years = $wpdb-&gt;get_col(&quot;SELECT DISTINCT YEAR(post_date) FROM $wpdb-&gt;posts WHERE post_status = &quot;publish&quot; AND post_type = &quot;post&quot; ORDER BY post_date DESC&quot;);
foreach($years as $year) :
?&gt;
	&lt;li&gt;&lt;a href=&quot;&lt;?php echo get_year_link($year); ?&gt; &quot;&gt;&lt;?php echo $year; ?&gt;&lt;/a&gt;

		&lt;ul&gt;
		&lt;?	$months = $wpdb-&gt;get_col(&quot;SELECT DISTINCT MONTH(post_date) FROM $wpdb-&gt;posts WHERE post_status = &quot;publish&quot; AND post_type = &quot;post&quot; AND YEAR(post_date) = &quot;&quot;.$year.&quot;&quot; ORDER BY post_date DESC&quot;);
			foreach($months as $month) :
			?&gt;
			&lt;li&gt;&lt;a href=&quot;&lt;?php echo get_month_link($year, $month); ?&gt;&quot;&gt;&lt;?php echo date( &quot;F&quot;, mktime(0, 0, 0, $month) );?&gt;&lt;/a&gt;&lt;/li&gt;
			&lt;?php endforeach;?&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
&lt;?php endforeach; ?&gt;
&lt;/ul&gt;</pre>
<p>Com isso, ser&aacute; exibido um menu mais ou menos assim</p>
<p>2009</p>
<ul>
    <li>Maio</li>
    <li>Abril</li>
    <li>Mar&ccedil;o</li>
    <li>Fevereiro</li>
    <li>Janeiro</li>
</ul>
<p>2008</p>
<ul>
    <li>Dezembro</li>
    <li>Novembro</li>
</ul>
<p>&nbsp;</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/dkZhh9cIamI" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/menu-por-ano-e-mes-no-wordpress_1121.html</feedburner:origLink></item>
<item>
	<title>Criando miniatura de imagem no PHP com a GD</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/yDsnHjGNTlo/criando-miniatura-de-imagem-no-php-com-a-gd_1043.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/criando-miniatura-de-imagem-no-php-com-a-gd_1043.html#comentar</comments>
	<pubDate> Sat, 2 May 2009 11:45:5 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/criando-miniatura-de-imagem-no-php-com-a-gd_1043.html</guid>
	<description><![CDATA[Como criar uma miniatura de imagem no PHP com a biblioteca GD]]></description>
	<content:encoded><![CDATA[<p>Nesse post eu havia falado, por cima, sobre a biblioteca GD, que possibilita a manipula&ccedil;&atilde;o de imagens no PHP.</p>
<p>Uma das funcionalidades mais necess&aacute;rias no PHP &eacute; criar uma thumbnail (miniatura) de uma imagem - e certamente &eacute; uma das primeiras coisas que algu&eacute;m que come&ccedil;a a programar em PHP e precisa fazer com imagens, tem a necessidade.</p>
<p>Segue abaixo a fun&ccedil;&atilde;o que eu uso - h&aacute; anos. N&atilde;o foi desenvovida por mim, achei ela no Google anos atr&aacute;s, e sei que ela se popularizou!</p>
<p>&nbsp;</p>
<blockquote>
<p><em>&lt;?php<br />
&nbsp;&nbsp; //imagem original<br />
&nbsp;&nbsp;&nbsp; $source_image = &quot;spork.jpg&quot;;<br />
<br />
&nbsp;&nbsp; //altura m&aacute;xima<br />
&nbsp;&nbsp;&nbsp; $thumb_height = 40;<br />
<br />
&nbsp;&nbsp;&nbsp; //prefixo da miniatura<br />
&nbsp;&nbsp;&nbsp; $thumb_prefix = &quot;thumb_&quot;;<br />
<br />
&nbsp;&nbsp; //qualidade - vai de 0 a 100<br />
&nbsp;&nbsp;&nbsp; $quality = 100;<br />
<br />
&nbsp;&nbsp; //checa se imagem existe<br />
&nbsp;&nbsp; if(!file_exists($source_image)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;Imagem n&atilde;o encontrada&quot;;<br />
&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //tipos suportados (jpg, png, gif, etc...)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $supported_types = array(1, 2, 3, 7);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //retorna informa&ccedil;&otilde;es da imagem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list($width_orig, $height_orig, $image_type) = getimagesize($source_image);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //checa se &eacute; um tipo suportado<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!in_array($image_type, $supported_types)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;Tipo n&atilde;o suportado de imagem: &quot; . $image_type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //nome da imagem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $path_parts = pathinfo($source_image);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $filename = $path_parts[&quot;filename&quot;];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //calcula as propor&ccedil;&otilde;es<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $aspect_ratio = (float) $width_orig / $height_orig;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //calcula a largura da thumb baseada na altura<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $thumb_width = round($thumb_height * $aspect_ratio);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //detecta o tipo de arquivo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $source = imagecreatefromstring(file_get_contents($source_image));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cria canvas<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $thumb = imagecreatetruecolor($thumb_width, $thumb_height);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thumb_width, $thumb_height, $width_orig, $height_orig);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //destr&oacute;i, para liberar mem&oacute;ria<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagedestroy($source);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cria thumb baseada no tipo da imagem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ( $image_type )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagegif($im, $fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $thumbnail = $thumb_prefix.$filename . &quot;.gif&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $thumbnail = $thumb_prefix.$filename . &quot;.jpg&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagejpeg($thumb, $thumbnail, $quality);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagepng($im, $fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $thumbnail = $thumb_prefix.$filename . &quot;.png&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 7:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imagewbmp($im, $fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $thumbnail = $thumb_prefix.$filename . &quot;.bmp&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
?&gt;</em></p>
</blockquote><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/yDsnHjGNTlo" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/criando-miniatura-de-imagem-no-php-com-a-gd_1043.html</feedburner:origLink></item>
<item>
	<title>Google Analytics libera API para desenvolvedores</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/S2_V07kQYSE/google-analytics-libera-api-para-desenvolvedores_1034.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/google-analytics-libera-api-para-desenvolvedores_1034.html#comentar</comments>
	<pubDate> Tue, 28 Apr 2009 12:40:19 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/google-analytics-libera-api-para-desenvolvedores_1034.html</guid>
	<description><![CDATA[O Google livrou uma API para o Analytics que permite a exportação de todos os dados disponíveis no Analytics para uso em outros aplicativos, uma mão na roda para o acompanhamento de estatísticas...]]></description>
	<content:encoded><![CDATA[<p>Ontem li no <a href="http://www.profissionaisdeweb.com/dicas/google-disponibiliza-api-do-analytics/">Profissionais Web</a>&nbsp;que o <a href="http://www.google.com.br">Google</a> disponibilizou uma API para o <strong>Google&nbsp;Analytics</strong>, isso significa que agora ser&aacute; poss&iacute;vel desenvolver aplicativos utilizando as estat&iacute;sticas vindas do Analytics.</p>
<p>Uma verdadeira m&atilde;o na roda!</p>
<p>&nbsp;</p>
<h2>O que &eacute; poss&iacute;vel fazer com a API do Analytics?</h2>
<p>Com a API significa que voc&ecirc; pode ter acesso a <strong>TODOS</strong> os dados dispon&iacute;veis no Analytics de um aplicativo terceirizado ou desenvolvido por voc&ecirc;, ou em sites de terceiros. Para o meu caso pensei em duas aplica&ccedil;&otilde;es.</p>
<p>&nbsp;</p>
<h3>1. Exibir relat&oacute;rios para os clientes em interface pr&oacute;pria</h3>
<p>&nbsp;</p>
<p>Atualmente eu trabalho com aplicativos web e com CMS pr&oacute;prio (GS Intra), por&eacute;m nunca desenvolvi um sistema de estat&iacute;sticas para ele por dois motivos principais relacionadas ao Analytics:</p>
<ul>
    <li>Gratuito</li>
    <li>N&atilde;o utiliza recursos do meu servidor</li>
    <li>Superioridade t&eacute;cnica ao que eu poderia desenvoler</li>
</ul>
<p>Com o uso da API ser&aacute; poss&iacute;vel que eu centralize em um s&oacute; aplicativo o gerenciamento do conte&uacute;do, dos clientes e estat&iacute;sticas do site de meus clientes. N&atilde;o preciso mandar o cliente para um site externo para que ele visualize as estat&iacute;sticas. Facilita para o cliente, &eacute; obviamente &eacute; melhor para o desenvolvedor, que agrega mais funcionalidade e valor ao sistema.</p>
<p>&nbsp;</p>
<h3>2. Acompanhar impacto de mudan&ccedil;as no site</h3>
<p>Eu tenho s&eacute;rios problemas para acompanhar o impacto das altera&ccedil;&otilde;es realizadas no And After. Por exemplo, adiciono um elemento de navega&ccedil;&atilde;o visando aumentar o tempo m&eacute;dio de visita dentro do site no dia 27 de abril.</p>
<p>Preciso de um log, onde eu adicione nesta data todas as altera&ccedil;&otilde;es feitas para que posteriormente eu colete informa&ccedil;&otilde;es do &quot;antes e depois&quot;. Utilizei por algum tempo o Excel para fazer isso, mas era praticamente no CTRL+C e CTRL+V para mesclar dados do Buscap&eacute;, AdSense e Analytics em uma mesma tabela, al&eacute;m das datas das modifica&ccedil;&otilde;es.</p>
<p>Agora &eacute; poss&iacute;vel eu tem um banco de dados com todas as altera&ccedil;&otilde;es realizadas em no site (como o exemplo do elemento de navega&ccedil;&atilde;o) e mesclar com os dados que ser&atilde;o importados da API, facilitando a cria&ccedil;&atilde;o do &quot;antes e depois&quot; das altera&ccedil;&otilde;es de forma autom&aacute;tica.&nbsp;</p>
<p>Quando (e se) a API do AdSense for liberada ent&atilde;o, ficar&aacute; show. Em um &uacute;nico aplicativo ser&aacute; poss&iacute;vel medir o impacto de mudan&ccedil;as nas visitas e rendimentos de um site.&nbsp;</p>
<p>&nbsp;</p>
<p>Ta a&iacute; a dica para um aplicativo que eu utilizaria. haha :)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Saiba mais sobre a API do Analytics em</h2>
<p><a href="http://analytics.blogspot.com/2009/04/attention-developers-google-analytics.html">Blog oficial do Google Analytics</a></p>
<p><a href="http://code.google.com/intl/pt-BR/apis/analytics/docs/">Google Code Analytics</a></p>
<p style="margin-left: 40px; "><a href="http://code.google.com/intl/pt-BR/apis/analytics/docs/gdata/1.0/gdataJavascript.html">Javascript</a></p>
<p style="margin-left: 40px; "><a href="http://code.google.com/intl/pt-BR/apis/analytics/docs/gdata/1.0/gdataJava.html">Java</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>O que j&aacute; existe desenvolvido?</h2>
<h3>Polaris</h3>
<p>At&eacute; o momento testei um aplicativo desktop, o <a href="http://www.desktop-reporting.com/polaris.html">Polaris</a>. Ele utiliza a plataforma (plataforma?) <strong>Adobe Air</strong>, e a vers&atilde;o free &eacute; extremamente simples de usar.</p>
<p>Apresenta diversas informa&ccedil;&otilde;es em uma pequena janela com uma interface bastante intuitiva.&nbsp;</p>
<p>Confira algumas telas do Polaris , o &nbsp;analytics desktop:</p>
<p style="text-align: center; "><img alt="Polaris - Google analytics destkop" width="470" height="280" src="http://www.andafter.org/images/album/internet/dashboard.jpg" /></p>
<p style="text-align: center; "><img alt="Polaris - Google analytics destkop" width="470" height="280" src="http://www.andafter.org/images/album/internet/content.jpg" /></p>
<p style="text-align: center; "><img alt="Polaris - Google analytics destkop" width="470" height="280" src="http://www.andafter.org/images/album/internet/visits.jpg" /></p>
<p style="text-align: center; "><img alt="Polaris - Google analytics destkop" width="470" height="280" src="http://www.andafter.org/images/album/internet/traffic.jpg" /></p>
<p style="text-align: center; ">&nbsp;</p>
<p>Recomendo!&nbsp;</p>
<p>&nbsp;</p>
<h3>Mobile<span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"><br />
</span></h3>
<p>N&atilde;o testei, mas no blog oficial do Analytics recomendaram uma <a href="http://www.analyticsmarket.com/mobileapps/mobile-ga/android">aplica&ccedil;&atilde;o Android do Analytics.</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Assim que eu fizer testes com a ferramenta publicarei os resultados e programa&ccedil;&otilde;es aqui no <a href="http://www.odesenvolvedor.com.br"><strong>O desenvolvedor</strong></a>, se voc&ecirc; j&aacute; desenvolveu alguma coisa ou quer compartilhas suas id&eacute;ias pode <a href="http://www.andafter.org/publicar2.asp">publicar um artigo</a> ou <a href="#comentar">comentar</a>. :)</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/S2_V07kQYSE" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/google-analytics-libera-api-para-desenvolvedores_1034.html</feedburner:origLink></item>
<item>
	<title>Biblioteca GD: trabalhe com imagens no PHP</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/P4zvoMZors8/biblioteca-gd-trabalhe-com-imagens-no-php_1025.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/biblioteca-gd-trabalhe-com-imagens-no-php_1025.html#comentar</comments>
	<pubDate> Tue, 21 Apr 2009 16:41:52 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/biblioteca-gd-trabalhe-com-imagens-no-php_1025.html</guid>
	<description><![CDATA[Apresentação e um exemplo básico de uso da GD - biblioteca PHP para manipulação de imagens]]></description>
	<content:encoded><![CDATA[<p>Com <strong>PHP</strong> &eacute; poss&iacute;vel al&eacute;m de trabalhar com a sa&iacute;da (x)html ter manipula&ccedil;&atilde;o de imagens. A biblioteca mais utilizada &eacute; a GD - <a href="http://br.php.net/gd">http://br.php.net/gd</a></p>
<p>Por padr&atilde;o ela j&aacute; vem instalada desde a vers&atilde;o 4.3 do <strong>PHP</strong>, e com ela &eacute; poss&iacute;vel desde criar imagens do 0, escrevendo textos, usando filtros de opacidade, at&eacute; criar miniaturas de outras imagens ou, ainda mesclar as mesmas, criando mosaicos e afins, com sa&iacute;das em formato jpg, png, e por a&iacute; vai. As possibilidades s&atilde;o infinitas, e ficam a disposi&ccedil;&atilde;o e necessidade de quem for implementar.</p>
<p>Abaixo segue o exemplo cl&aacute;ssico de uso mais simples da biblioteca: criar uma imagem com largura e altura definida, com um texto no miolo dela.</p>
<p><em>&lt;?php </em></p>
<p><em>function createImageWithText($width, $height, $txt) {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //cria uma imagem com largura x altura definida pelo usu&aacute;rio<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $im = imagecreatetruecolor($width, $height);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //aloca as cores para imagem<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $text_color = imagecolorallocate($im, 233, 14, 91);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //escreve o texto na imagem<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagestring($im, 1, 5, 5,&nbsp; $txt, $text_color);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //inicia buffer<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ob_start();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // cria imagem de sa&iacute;da, formato jpeg, bom 85% de qualidade<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagejpeg($im, NULL, 85);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //captura sa&iacute;da para string<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $contents = ob_get_contents();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //finaliza captura<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ob_end_clean();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //libera mem&oacute;ria<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagedestroy($im);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //escreve arquivo em disco, usando os comando b&aacute;sicos do PHP<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $fh = fopen(&quot;temp/img2.jpg&quot;, &quot;w+&quot; );<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fwrite( $fh, $contents );<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fclose( $fh );<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; } </em></p>
<p><em>&nbsp;&nbsp; createImageWithText(400, 200, &quot;meu texto&quot;); </em></p>
<p><em>?&gt;</em></p>
<p>Em breve farei outros posts a respeito!</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/P4zvoMZors8" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/biblioteca-gd-trabalhe-com-imagens-no-php_1025.html</feedburner:origLink></item>
<item>
	<title>Como usar o confirm() no javascript</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/1lYBgdSoSlc/como-usar-o-confirm-no-javascript_1020.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-usar-o-confirm-no-javascript_1020.html#comentar</comments>
	<pubDate> Thu, 16 Apr 2009 20:22:21 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-usar-o-confirm-no-javascript_1020.html</guid>
	<description><![CDATA[Como usar o comando confirm() do javascript para interagir com o usuário]]></description>
	<content:encoded><![CDATA[<p>Muitas vezes &eacute; necess&aacute;rio interagir com o visitante que est&aacute; no seu site, e a forma mais trivial &eacute; usar o comando <em>confirm()</em> do <strong>javascript</strong> para isso.</p>
<p>Com ele voc&ecirc; pode parar o fluxo que est&aacute; acontecendo exibindo uma caixa de di&aacute;logo - na qual a mensagem exibida &eacute; passada como par&acirc;metro para esse comando - na qual o usu&aacute;rio tem a op&ccedil;&atilde;o de escolher entre Sim e N&atilde;o (ou Ok e Cancelar, dependendo do browser). Quando o usu&aacute;rio faz a sele&ccedil;&atilde;o, o comando retorna true ou false, o que possibilita que o fluxo seja alterado.</p>
<p>Um exemplo de uso:</p>
<p><em>if(confirm(&quot;Deseja realmente fazer isso?&quot;)) {<br />
&nbsp; //faz algo, como chamar uma fun&ccedil;&atilde;o que apaga dados<br />
} else {<br />
&nbsp; alert(&quot;Ok, voc&ecirc; n&atilde;o quer mesmo fazer isso...&quot;);<br />
}</em></p>
<p>Simples e pr&aacute;tico!</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/1lYBgdSoSlc" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-usar-o-confirm-no-javascript_1020.html</feedburner:origLink></item>
<item>
	<title>Como contar arquivos em uma pasta usando ASP (FSO)</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/486W_4lV5rY/como-contar-arquivos-em-uma-pasta-usando-asp-fso-_845.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-contar-arquivos-em-uma-pasta-usando-asp-fso-_845.html#comentar</comments>
	<pubDate> Tue, 7 Apr 2009 13:3:7 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-contar-arquivos-em-uma-pasta-usando-asp-fso-_845.html</guid>
	<description><![CDATA[Como contar os arquivos em uma pasta utilizando FSO e o comando .count. nada de usar POG e usar loop nos arquivos do diretório... ]]></description>
	<content:encoded><![CDATA[<p>Na intranet de um cliente existe um m&oacute;dulo para distribui&ccedil;&atilde;o de arquivos para os clientes dele, para isso eu utilizo o <strong>File System Object (FSO)</strong>, que navega pelas pastas especificadas do sistema (onde meu cliente sobe diversos arquivos por FTP), identifica os arquivos e distribui cada arquivo para o respectivo usu&aacute;rio final (o cliente do meu cliente).</p>
<p>Com poucos arquivos a distribui&ccedil;&atilde;o acontece tranquilamente, os arquivos s&atilde;o movidos para a pasta de cada usu&aacute;rio, cada usu&aacute;rio recebe uma notifica&ccedil;&atilde;o por e-mail com o link para a &aacute;rea de login do sistema com acesso aos arquivos. Por&eacute;m todo o servidor tem um limite para execu&ccedil;&atilde;o de scripts e muitas vezes simplesmente aumentar esse limite de tempo de execu&ccedil;&atilde;o n&atilde;o &eacute; recomend&aacute;vel, pois se alguma coisa der errado (como um loop infinito) vai ficar sobrecarregndo o servidor.</p>
<p style="text-align: center; "><span class="Apple-style-span" style="font-family: Verdana; font-size: 11px; line-height: 14px; "><a href="http://www.andafter.org/blogs/eucompraria/publicacoes/faca-de-sua-parede-um-desktop-com-pastas-e-tudo_536.html"><img width="450" height="450" alt="New Folder" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " src="http://i291.photobucket.com/albums/ll285/bibia1010/073_Neuer_Ordner_02.jpg" /></a></span><a href="http://www.andafter.org/blogs/eucompraria/publicacoes/faca-de-sua-parede-um-desktop-com-pastas-e-tudo_536.html"><br type="_moz" />
</a></p>
<p style="text-align: center; "><a href="http://www.andafter.org/blogs/eucompraria/publicacoes/faca-de-sua-parede-um-desktop-com-pastas-e-tudo_536.html">Isso sim &eacute; organizar os documentos em pastas</a></p>
<p>&nbsp;</p>
<p>Come&ccedil;aram a acontecer problemas quando existiam muitos arquivos para mover, pois al&eacute;m da listagem de todos os arquivos o sistema segue uma l&oacute;gica para identificar de qual usu&aacute;rio &eacute; cada arquivo para que a distribu&ccedil;&atilde;o seja feita de forma correta.</p>
<p>A solu&ccedil;&atilde;o para n&atilde;o retornar o erro de limite de tempo excedido e n&atilde;o aumentar loucamente este limite (o usu&aacute;rio certamente vai achar que deu erro quando uma p&aacute;gina demorar demais para carregar) foi limitar o n&uacute;mero de arquivos movimentados por vez, isso permite dar um feedback entre a &quot;pagina&ccedil;&atilde;o&quot; evitando que o usu&aacute;rio pense que o aplicativo travou ou deu erro e clique repetidamente em bot&otilde;es da interface. Eles gostam disso.</p>
<p>Segue uma parte da solu&ccedil;&atilde;o que adotei.</p>
<p>&nbsp;</p>
<h2>Como contar quantos arquivos tem em uma pasta utilizando o FSO?</h2>
<p>Quando procurei informa&ccedil;&otilde;es de como contar quantos arquivos existiam em uma pasta a maioria envolvia um loop por todos os arquivos, e isso me lembrou <a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/nao-programe-isso_967.html"><strong>minha experi&ecirc;ncia com POG: N&atilde;o programe isso!</strong></a></p>
<p>Twittei para ver se algu&eacute;m conhecia uma solu&ccedil;&atilde;o melhor do que um loop, <a href="http://twitter.com/chrisloki">@chrisloki</a>,&nbsp;<a href="http://twitter.com/cleiverrr">@cleiverrr</a> e <a href="http://twitter.com/alinedecampos">@alinedecampos</a> responderam com id&eacute;ias/sugest&otilde;es, n&atilde;o achei nenhuma documenta&ccedil;&atilde;o completa do FSO (ok, s&oacute; dei uma googleada b&aacute;sica) mas resolvi testar algumas coisas como UBound (para pegar o &iacute;ndica mais alto de uma array) e depois um count.</p>
<p>O UBound n&atilde;o funciona, o array de arquivos n&atilde;o pode ser tratado como um normal, mas existe o comando COUNT no FSO, segue abaixo o script para contar quantos arquivos existem em uma pasta:</p>
<p>&nbsp;</p>
<p style="margin-left: 40px; "><span style="color: rgb(153, 153, 153); "><span style="font-size: large; ">dirtowalk = &quot;../web_users/gssolutions/arquivos/&quot;</span></span></p>
<p style="margin-left: 40px; "><span style="color: rgb(153, 153, 153); "><span style="font-size: large; ">Set fs = CreateObject(&quot;Scripting.FileSystemObject&quot;)</span></span></p>
<p style="margin-left: 40px; "><span style="color: rgb(153, 153, 153); "><span style="font-size: large; ">Set f = fs.GetFolder(server.mappath(dirtowalk))</span></span></p>
<p style="margin-left: 40px; "><span style="color: rgb(153, 153, 153); "><span style="font-size: large; ">Set fc = f.Files<br type="_moz" />
</span></span></p>
<p style="margin-left: 40px; "><strong><span style="color: rgb(153, 153, 153); "><span style="font-size: large; ">total = fc.count</span></span></strong></p>
<p style="margin-left: 40px; "><span style="color: rgb(153, 153, 153); "><span style="font-size: large; ">response.write &quot;Total de arquivos na pasta &quot; &amp; dirtowalk &amp; &quot;: &quot; &amp; total</span></span></p>
<p>&nbsp;</p>
<p>&Eacute; isso a&iacute;, um simples .count no &quot;array&quot; de arquivos retorna o n&uacute;mero de arquivos dentro da pasta. Caso existam subpastas, voc&ecirc; teria que criar um loop para ir navegando e somando os arquivos dentro de cada subpasta...</p>
<p>Mais funcional e elegante do que um <strong>&quot;<span style="color: rgb(192, 192, 192); ">For Each arquivo In fc</span>&quot;!</strong></p>
<p>Obrigado a todos os que ajudaram e responderam meus pedidos de socorro no twitter, espero ter ajdado tamb&eacute;m! :)</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/486W_4lV5rY" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-contar-arquivos-em-uma-pasta-usando-asp-fso-_845.html</feedburner:origLink></item>
<item>
	<title>Usando o comando eval()</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/qoAryxdhduY/usando-o-comando-eval-_1001.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-o-comando-eval-_1001.html#comentar</comments>
	<pubDate> Mon, 6 Apr 2009 22:10:22 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-o-comando-eval-_1001.html</guid>
	<description><![CDATA[Exemplo de uso do domando eval() do javascript]]></description>
	<content:encoded><![CDATA[<p><strong>Javascript</strong> n&atilde;o &eacute; uma linguagem tipada. Disso j&aacute; sabemos. Ent&atilde;o, muitas vezes, as coisas n&atilde;o funcionam exatamente como esperamos.</p>
<p>Um caso que acontece muito pode ser simulado nesse exemplo que segue: um formul&aacute;rio com dois campos e uma rotina que executa a soma dos valores dos dois campos:</p>
<p><em>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br />
&lt;title&gt;Exemplo de soma&lt;/title&gt;<br />
&lt;script type=&quot;application/javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; window.onload = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; document.getElementById(&quot;calcular&quot;).onclick = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var val1 = document.getElementById(&quot;campo1&quot;).value;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var val2 = document.getElementById(&quot;campo2&quot;).value;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert(val1 + val2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;Soma - exemplo&lt;/h1&gt;<br />
&lt;form action=&quot;#&quot; method=&quot;post&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;label for=&quot;campo1&quot;&gt;campo 1:&lt;/label&gt;&lt;input type=&quot;text&quot; id=&quot;campo1&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;label for=&quot;campo1&quot;&gt;campo 2:&lt;/label&gt;&lt;input type=&quot;text&quot; id=&quot;campo2&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; id=&quot;calcular&quot; value=&quot;calcular&quot; /&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p>
<p>Fa&ccedil;a um teste preenchendo os inputs com valores num&eacute;ricos, e clique no bot&atilde;o de calcular. Se voc&ecirc; preencher com, por exemplo, 5 e 3, ao clicar no bot&atilde;o ter&aacute; um alert() com o valor 53.<br />
O que aconteceu? O interpretador do javascript entende que s&atilde;o strings (textos), e a soma que ele faz &eacute;, na verdade, uma concatena&ccedil;&atilde;o das strings.</p>
<p>Como resolver isso?</p>
<p>Existe um comando nativo do javascript, eval(param), que recebe um par&acirc;metro e o interpreta. Mude a linha que faz a soma para</p>
<p><em>alert(eval(val1) + eval(val2));</em></p>
<p>E voc&ecirc; ver&aacute; que a soma, que antes era uma concatena&ccedil;&atilde;o, vai ser feita da forma esperada: somando realmente os valores.</p>
<p>Mas, fica o alerta: usar o comando eval() deve sempre ser muito bem analisado se vale a pena. Uma vez que ele interpreta qualquer comando que est&aacute; em uma string, voc&ecirc; acaba abrindo o seu c&oacute;digo para ser executado por terceiros.</p>
<p>Num pr&oacute;ximo post mostro como fazer essa soma de uma forma mais elegante!</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/qoAryxdhduY" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-o-comando-eval-_1001.html</feedburner:origLink></item>
<item>
	<title>Como imprimir aspas no Javascript</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/ihZD6yJxY7E/como-imprimir-aspas-no-javascript_946.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-imprimir-aspas-no-javascript_946.html#comentar</comments>
	<pubDate> Thu, 2 Apr 2009 12:17:10 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-imprimir-aspas-no-javascript_946.html</guid>
	<description><![CDATA[Quando você quer exibir aspas simples com JS é só usar aspas dupla no código, e vice e versa. Mas e quando precisa "printar" aspas simples e duplas em um mesmo script?]]></description>
	<content:encoded><![CDATA[<p>Esta semana eu liberei novamente a <strong><a href="http://vitrine.andafter.org">Vitrine F&aacute;cil Buscap&eacute;</a></strong>, que permite a cria&ccedil;&atilde;o e gerenciamento de Vitrines personalizadas para o programa de afiliado Buscap&eacute;. Quando estava liberando a aplica&ccedil;&atilde;o em beta tive problemas para implementar um sistema de rastreamento de clicks.</p>
<p>Muito bem, voltando ao assunto vou explicar o contexto do meu problema, eu tinha um link que era impresso em Javascript, e precisava adicionar o atributo <strong>onClick</strong> nele, que ficaria no resultado final assim:</p>
<p style="margin-left: 40px; "><span style="font-size: large; ">onClick=&quot;funcao(&acute;var1&acute;,&acute;var2&acute;)&quot;</span></p>
<p>Mas no Javascript, se eu fosse usar um document.write ou qualquer outro m&eacute;todo de alguma biblioteca (<strong><a href="http://www.andafter.org/blogs/odesenvolvedor/tag/jquery">jQuery</a></strong>, no meu caso) quando eu utilizasse a aspa simples automaticamente estaria fechando a string (n&atilde;o sei se string &eacute; o correto para o que eu quero definir, sorry) do Javascript, ou seja, estaria &quot;cortando&quot; a minha linha que seria exibida no c&oacute;digo pela metade.</p>
<p>Uma pesquisa r&aacute;pida em f&oacute;runs e encontrei a solu&ccedil;&atilde;o: voc&ecirc; precisa utilizar uma barra invertida (lembrouexpress&otilde;es regulares, utiliza a barra para transformar o pr&oacute;ximo caracter em &quot;normal&quot;), ent&atilde;o ficaria assim no Javascript:</p>
<p style="margin-left: 40px; "><span style="font-size: large; ">document.write(&quot;<span style="color: rgb(153, 153, 153); ">onClick=<span style="color: rgb(255, 0, 0); "><span style="font-size: x-large; "><u>&quot;</u></span></span>funcao(&acute;var1&acute;,&acute;var2&acute;)<span style="color: rgb(255, 0, 0); "><span style="font-size: x-large; "><u>&quot;</u></span></span></span> &quot;)</span></p>
<p>Antes das duas aspas VERMELHAS voc&ecirc; deve inserir uma barra invertida, n&atilde;o consegui exibir ela aqui pois o sistema de publica&ccedil;&atilde;o &quot;engole&quot; as barras (depois irei verificar).</p>
<p>Utilizei o document.write apenas como exemplo da possibilidade de uso, no meu caso utilizei as barras invertidas em um <strong>$(&quot;#link123&quot;).html(&quot;<span style="color: rgb(153, 153, 153); ">onClick....</span>&quot;)&nbsp;</strong>sem problema nenhum.</p>
<p>&nbsp;</p>
<p>Uma dica simples que para quem trabalha com Javascript n&atilde;o deve ser novidade, mas lembro de ter tido problemas com isso em um passado distante, como tive o mesmo problema agora resolvi fazer o post para ajudar quem pode precisar (e evitar ter que googlear novamente este mesmo problema).</p>
<p>&nbsp;</p>
<p>D&uacute;vidas, dicas e cr&iacute;ticas nos <a href="#comentar">coment&aacute;rios</a>&nbsp;:)</p>
<p>&nbsp;</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/ihZD6yJxY7E" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-imprimir-aspas-no-javascript_946.html</feedburner:origLink></item>
<item>
	<title>Flex - o meu Hello World</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/LCikuomPk0M/flex-o-meu-hello-world_983.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/flex-o-meu-hello-world_983.html#comentar</comments>
	<pubDate> Mon, 30 Mar 2009 11:35:54 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/flex-o-meu-hello-world_983.html</guid>
	<description><![CDATA[Um Hello World! usando Adobe Flex]]></description>
	<content:encoded><![CDATA[<p>Por v&aacute;rios motivos, comecei a dar uma olhada em <strong>Flex</strong>, o <em>framework</em> da Adobe para cria&ccedil;&atilde;o de <strong>RIAs</strong> (<em>Rich Internet Application</em>) baseado no <strong>Flash</strong>.</p>
<p>Nunca me atrevi a abrir um .fla na minha vida; pelo pouco que conheci do Flash na &eacute;pcoa do <em>action script</em> 1 e 2, achei que era muito confuso para o resultado final, e que o AS1 e 2 eram voltados a designers (nada contra) que precisavam de poucos recursos nos seus swfs. Por isso que quando saiu o action script 3 eu j&aacute; fiquei mais animado, pois ele estava muito melhor estruturado, com pacotes de componentes melhor divididos, boa orienta&ccedil;&atilde;o a objetos (e seus paradigmas), documenta&ccedil;&atilde;o online</p>
<p>Quem j&aacute; trabalhou com qualquer linguagem orientada a eventos (<strong>VB, Delphi, C++ Builder</strong>) se sente muito confort&aacute;vel, e quem est&aacute; acostumado a OO s&oacute; tem o trabalho de descobrir as <em>features</em> do framework. A <a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=2&amp;url=http%3A%2F%2Fwww.adobe.com%2Fproducts%2Fflex%2Fflexdownloads%2F&amp;ei=N9jQSanMN52NtgeJ1MXvCQ&amp;usg=AFQjCNFMh5BlBms3qQku1qWtPxCexjz_vQ&amp;sig2=AQpsgI1GdwmqEjsdpXoaTA">SDK pode ser baixada livremente</a>.<br />
A Adobe comercializa o <em>Adobe Flex Builder</em>, que permite uma maior facilidade na implementa&ccedil;&atilde;o das interfaces.</p>
<p>Eu n&atilde;o baixei pois queria trabalhar direto no <strong>mxml</strong>, que &eacute; o formato (uma esp&eacute;cie de xml) concebido para os arquivos onde s&atilde;o escritos os c&oacute;digos de um projeto Flex.</p>
<p>Basicamente, os passos para um Hello World - algo simples - s&atilde;o, al&eacute;m de ter a SDK do Flex na sua m&aacute;quina, criar o .mxml e compilar o mesmo, para gerar o swf.</p>
<p>O mxml ficou da seguinte forma (<a href="http://www.andafter.org/blogs/odesenvolvedor/exemplos/flex/hello/hello.mxml">pode fazer download aqui</a>):</p>
<p><em>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; xmlns:explorer=&quot;*&quot; <br />
&nbsp;&nbsp;&nbsp; width=&quot;100%&quot; height=&quot;100%&quot; pageTitle=&quot;Hello World&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:HDividedBox width=&quot;100%&quot; height=&quot;100%&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;mx:Text&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;mx:text&gt;Ol&aacute; Mundo!&lt;/mx:text&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/mx:Text&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mx:HDividedBox&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/mx:Application&gt;</em></p>
<p>Application &eacute; o n&oacute; pai do documento, seria como no html a tag &lt;html&gt;. Nele, digo que o swf gerado ter&aacute; largura e altura de 100%.</p>
<p>Ent&atilde;o insiro um objeto HDividedBox, que insere uma divis&atilde;o horizontal nela, e dentro dela uma &aacute;rea de texto (Text).</p>
<p>Com isso, &eacute; s&oacute; salvar (salvei como hello.mxml) e compilar o mesmo, com o comando</p>
<p>../bin/mxmlc -use-network=false hello.mxml</p>
<p>*aponte ../bin para a pasta bin que fica dentro da SDK do Flex da sua m&aacute;quina.</p>
<p>O swf gerado foi esse <a href="http://www.andafter.org/blogs/odesenvolvedor/exemplos/flex/hello/hello.swf">aqui</a></p>
<p><embed menu="true" loop="true" play="true" src="http://www.andafter.org/blogs/odesenvolvedor/exemplos/flex/hello/hello.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed></p>
<p>O que achei do Flex? A vantagem &eacute; a facilidade na componentiza&ccedil;&atilde;o de elementos da interface, com uma qualidade gr&aacute;fica que CSS/javascript n&atilde;o alcan&ccedil;am com facilidade.</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/LCikuomPk0M" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/flex-o-meu-hello-world_983.html</feedburner:origLink></item>
<item>
	<title>PDO - classe para acesso a diversos tipos de banco de dados</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/w3sbuZSrn7s/pdo-classe-para-acesso-a-diversos-tipos-de-banco-de-dados_972.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/pdo-classe-para-acesso-a-diversos-tipos-de-banco-de-dados_972.html#comentar</comments>
	<pubDate> Fri, 27 Mar 2009 21:37:26 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/pdo-classe-para-acesso-a-diversos-tipos-de-banco-de-dados_972.html</guid>
	<description><![CDATA[Interface simples e leve para acesso a banco de dados, chamada de PHP Data Object, ou PDO.]]></description>
	<content:encoded><![CDATA[<p>Quando comecei a programar em <strong>PHP</strong>, aprendi como fazer requisi&ccedil;&otilde;es a banco de dados <strong>MySQL</strong> usando as fun&ccedil;&otilde;es nativas do <strong>PHP</strong> (<em>mysql_connect(), mysql_query()</em>, etc...), as chamadas <a href="http://www.php.net/manual/en/ref.mysql.php">MySQL Functions</a>.<br />
<br />
Muito se passou, o <strong>PHP</strong> estava na vers&atilde;o 3, e hoje em dia est&aacute; na 5 (quando sai a 6, mesmo?!?!). Muitas coisas mudaram, e o <strong>PHP</strong> possui agora caracter&iacute;sticas de <em>Orienta&ccedil;&atilde;o a Objetos</em> muito boas. E com isso foi poss&iacute;vel criar uma interface simples e leve para acesso a banco de dados, chamada de <strong>PHP Data Object</strong>, ou <a href="http://br.php.net/manual/en/book.pdo.php">PDO</a>.<br />
O que o <strong>PDO</strong> faz &eacute; ser um intermediador para que voc&eacute; possa acessar v&aacute;rios tipos de bases de dados (<em>MySQL, PostGree, Firebird, SQL Server, Oracle,</em> etc...) com a mesma sintaxe, alterando apenas o <em>driver</em> usado na conex&atilde;o. Ou seja, n&atilde;o &eacute; ele quem faz a conversa com a base de dados; ele procura quem &eacute; que vai conversar com aquele tipo de base de dados.<br />
<br />
Um exemplo pr&aacute;tico de <em>insert</em> em uma tabela de um banco <em>MySQL</em>:<br />
<br />
<em>&lt;?php<br />
$fullName = $_POST[&quot;fullName&quot;];<br />
$childrensName = $_POST[&quot;childrensName&quot;];<br />
$age = $_POST[&quot;age&quot;];<br />
$cpf = $_POST[&quot;cpf&quot;];<br />
$hobbies = $_POST[&quot;fullName&quot;];<br />
<br />
<br />
$db = new PDO(&quot;mysql:host=localhost;dbname=mydb&quot;, admin&quot;, &quot;root&quot;);<br />
$stmt = $db-&gt;prepare(&quot;INSERT INTO user (fullName, childrensName, age, cpf, hobbies) VALUES (&quot;$fullName&quot;,&quot;$childrensName&quot;,&quot;$age&quot;,&quot;$cpf&quot;,&quot;$hobbies&quot;)&quot;);<br />
$stmt-&gt;execute();<br />
?&gt;</em><br />
<br />
Se fosse necess&aacute;rio usar outro banco, por exemplo um <em>Firebird</em>, seria necesseario alterar apenas a linha que faz a instancia&ccedil;&atilde;o do objeto <strong>PDO</strong>, usando o driver adequado.<br />
<br />
Esse texto n&atilde;o visa ser um tutorial de como usar, mas sim uma apresenta&ccedil;&atilde;o dessa classe muito &uacute;til e, certamente, elegante!</p>
<p><a href="http://br.php.net/manual/en/book.pdo.php">http://br.php.net/manual/en/book.pdo.php</a></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/w3sbuZSrn7s" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/pdo-classe-para-acesso-a-diversos-tipos-de-banco-de-dados_972.html</feedburner:origLink></item>
<item>
	<title>Não programe isso!</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/TjRJ2JWYxQM/nao-programe-isso_967.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/nao-programe-isso_967.html#comentar</comments>
	<pubDate> Wed, 25 Mar 2009 16:26:59 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/nao-programe-isso_967.html</guid>
	<description><![CDATA[Um designer que virou programador? Um pouco da minha experiência com o aprendizado em programação. E exemplos do que você NUNCA deve fazer.]]></description>
	<content:encoded><![CDATA[<p>Meu primeiro contato profissional com desenvolvimento server-side&nbsp; foi em 2004, quando comecei a trabalhar como estagi&aacute;rio em uma ag&ecirc;ncia de design, onde aprendi muito sobre clientes, gr&aacute;ficas, prazos e internet.<span style="color: rgb(153, 153, 153); font-size: 24px; font-weight: bold;" class="Apple-style-span"><br />
</span></p>
<p>Eu j&aacute; havia &ldquo;programado&rdquo; em PHP, na verdade tudo o que eu tinha feito foi um CMS bem meia boca para um blog, com um sistema de coment&aacute;rios. Nunca gostei do blogger e na &eacute;poca n&atilde;o conhecia o Wordpress (ele existia em 2002?).</p>
<p class="MsoNormal">E eu aprendi errado. Aprendi a programar com um <b style="">designer</b>, n&atilde;o com um desenvolvedor &ldquo;de verdade&rdquo;. Faltava conhecimento t&eacute;cnico para quem me ensinou e eu mal tinha no&ccedil;&atilde;o da vida, quem dir&aacute; de se preocupar com fazer um script correto. Funcionou? Beleza, deixa. Essa &eacute; a &eacute;tica POG.</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p style="margin-left: 40px;"><span style="color: rgb(153, 153, 153); font-size: 24px; font-weight: bold;" class="Apple-style-span">Hey, antes de ler saiba que...</span></p>
<p style="margin-left: 40px;"><span style="color: rgb(153, 153, 153);">Esse texto &eacute;&nbsp;<strong>FOR DUMMIES</strong>. Ou um bom exemplo de&nbsp;<strong>piada</strong>&nbsp;para desenvolvedores mais experientes. &Eacute; um pouco da minha experi&ecirc;ncia desde que comecei a programar. Apresento aqui um caso de script <strong>BIZARRO</strong>, e comento sobre os problemas dele e suas gambiarra.</span></p>
<p style="margin-left: 40px;"><span style="color: rgb(153, 153, 153);">Se voc&ecirc; &eacute; ninja pode achar um desperd&iacute;cio do seu precioso tempo continuar a leitura, ent&atilde;o recomendo que voc&ecirc; v&aacute; para a&nbsp;</span><strong><a href="http://www.andafter.org/blogs/odesenvolvedor">Home</a></strong><span style="color: rgb(153, 153, 153);">&nbsp;e procure algo do seu n&iacute;vel.</span></p>
<p style="margin-left: 40px;"><span style="color: rgb(153, 153, 153);">Ou continue a leitura e se mije de rir.</span></p>
<p style="margin-left: 40px;">&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal">Boas solu&ccedil;&otilde;es l&oacute;gicas por&eacute;m debilidade t&eacute;cnica, eis &eacute; a f&oacute;rmula da <b style="">gambiarra</b>.</p>
<p class="MsoNormal">Ontem, quando comecei a desenvolver o novo blog do <b style="">And After</b> (antecipo que o novo blog ser&aacute; sobre <b style="">Arquitetura de Informa&ccedil;&atilde;o</b>, com uma galerinha que manja muito! <span style="color: rgb(128, 128, 128);"><strong>:D</strong></span> ) fui dar uma olhada em uns script antigos, desenvolvidos na &eacute;poca do meu est&aacute;gio, e isso me levou a escrever este artigo.</p>
<p class="MsoNormal">Ah, e antes que me acusem: eu defendo o est&aacute;gio, e aprendi muito quando o fiz.</p>
<p class="MsoNormal"><span style="font-size: large;">Leia outros artigos sobre est&aacute;gio:</span></p>
<p style="margin-left: 40px;" class="MsoNormal"><a href="http://www.andafter.org/publicacoes/estagio-e-so-exploracao-nao_138.html">Est&aacute;gio &eacute; s&oacute; explora&ccedil;&atilde;o?</a></p>
<p style="margin-left: 40px;" class="MsoNormal"><a href="http://www.andafter.org/publicacoes/na-vida-de-um-estagiario_371.html">Na vida de um estagi&aacute;rio... (v&iacute;deo)</a></p>
<p style="text-align: center;" class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Encontrei uma <b style="">SUPER GAMBIARRA</b> em um script de pagina&ccedil;&atilde;o (ASP) que era utilizado na empresa que eu trabalhava. Vou repetir: <b style="">SUPER GAMBIARRA</b>. POG de mestre em POG.</p>
<p style="text-align: center;" class="MsoNormal"><o:p>&nbsp;<img height="338" width="465" alt="Gambiarra" src="http://www.andafter.org/images/album/internet/30102006125200g.jpg" /></o:p></p>
<p style="text-align: center;" class="MsoNormal">Isso &eacute; uma&nbsp;<u>gambiarra</u>.</p>
<p style="text-align: center;" class="MsoNormal">&nbsp;</p>
<h2>Vamos l&aacute;, como N&Atilde;O fazer um script de pagina&ccedil;&atilde;o:</h2>
<p class="MsoNormal">A primeira coisa que precisamos para fazer uma pagina&ccedil;&atilde;o &eacute; saber o total de dados e quantos dados vamos exibir em cada p&aacute;gina, correto? E j&aacute; neste in&iacute;cio est&aacute; a gambiarra que eu quero apresentar, para quem est&aacute; come&ccedil;ando <b style="">jamais</b> utilizar.</p>
<p class="MsoNormal">&nbsp;</p>
<p style="text-align: center;" class="MsoNormal"><a class="lightbox" href="http://www.andafter.org/images/album/internet/idiotaspiscina1gu0.jpg"><img height="338" width="450" alt="Gambiarra? " src="http://www.andafter.org/images/album/internet/idiotaspiscina1gu0.jpg" /></a></p>
<p style="text-align: center;" class="MsoNormal">N&atilde;o fa&ccedil;a isso tamb&eacute;m.</p>
<p style="text-align: center;" class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Primeiro, cria-se uma consulta no banco para pegar todos os dados, a&iacute; est&aacute; o primeiro problema. <span lang="EN-US" style="">Uma consulta extensa e in&uacute;til.<o:p></o:p></span></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">set rs = conntemp.execute(&quot;SELECT * FROM imoveis WHERE aprovado = 1 ORDER BY data desc&quot;)</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p class="MsoNormal">Agora vamos ver qual o total dos resultados, par saber quantas p&aacute;ginas iremos criar, veja s&oacute; o que <b style="">n&atilde;o fazer</b>.</p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">max= 10<br />
total = 0</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">do while not rs.eof<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total = total + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.movenext<br />
loop</span></span></strong><span lang="EN-US" style=""><br style="" />
<br style="" />
<o:p></o:p></span></p>
<p class="MsoNormal">Na &eacute;poca mesmo sem entender NADA eu pensei: tem que ter um comando para contar as linhas de uma consulta. E &oacute;bvio, isso existe.</p>
<p class="MsoNormal">Bom, vou pular a parte normal do c&oacute;digo e partir para a pr&oacute;xima gambiarra. Vou chamar essa consulta de todos os dados de <strong>super consulta</strong>. <u><strong>Nunca</strong></u>&nbsp;use uma super consulta. &Eacute; desnecess&aacute;rio. Se estava na p&aacute;gina 1, o script era o seguinte para exibir os dados:</p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">For x = 1 to max</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p style="margin-left: 70.8pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">Response.write rs(&ldquo;dados&rdquo;)<br />
rs.movenext</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p style="text-indent: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">next</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p class="MsoNormal">Onde max &eacute; a vari&aacute;vel que define o n&uacute;mero de itens exibido por p&aacute;gina. Achou rid&iacute;culo<span lang="EN-US" style="">? Calma, tem mais</span>.</p>
<p class="MsoNormal">Se o usu&aacute;rio vai para a p&aacute;gina 3, j&aacute; imaginou como &eacute; feito? Isso mesmo, a consulta com todos os resultados continua e calcula se quantos <i style="">movenext</i> ser&atilde;o necess&aacute;rios para chegar na linha desejada. Veja como fica esta obra de arte POG:</p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);">for z = 1 to pagina</span></strong></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span lang="EN-US">for dado = 1 to max</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not rs.eof then</span></span></strong><span lang="EN-US" style=""><o:p></o:p></span></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rs.movenext</span></strong></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if</span></strong></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next</span></strong></p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><strong><span style="color: rgb(255, 0, 0);">next</span></strong></p>
<p class="MsoNormal">O que esta gambiarra faz? Se voc&ecirc; est&aacute; na p&aacute;gina 3, o script por tr&ecirc;s vezes repete o comando <i style="">movenext</i> por 10 vezes (a vari&aacute;vel max). Depois disso, repete-se o loop do max, para exibir os itens.</p>
<p class="MsoNormal">Se voc&ecirc; n&atilde;o entendeu porque isso &eacute; prejudicial <span style="color: rgb(192, 192, 192);"><strike>(voc&ecirc; &eacute; noob)</strike></span>, vamos l&aacute;, vou falar um pouco de otimiza&ccedil;&atilde;o.</p>
<p class="MsoNormal">&nbsp;</p>
<h2>Explicando os problemas</h2>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<h3>Problema #1 &ndash; A super consulta</h3>
<p class="MsoNormal">N&atilde;o precisa ser nenhum g&ecirc;nio para pelo menos imaginar que diversas consultas no banco de dados prejudicam o desempenho de um script. A super consulta pode ter como resultado 9 linhas como 999.234.765 linhas. E voc&ecirc; vai usar apenas 10 destas linhas.</p>
<p class="MsoNormal">Outra coisa muito comum (para quem desenvolve aplica&ccedil;&otilde;es pequenas e n&atilde;o tem conhecimento t&eacute;cnico) &eacute; utilizar o SELECT <u><strong>*</strong></u> FROM. Exemplo, voc&ecirc; faz a pesquisa que resulta em 9 colunas por linha. E voc&ecirc; precisa apenas de duas, nome e ID.</p>
<h3>Solu&ccedil;&atilde;o #1</h3>
<p class="MsoNormal">Retorne os resultados com apenas com os dados que precisa, utilize o comando LIMIT sempre!</p>
<p class="MsoNormal">Se voc&ecirc; vai utilizar somente os 10 primeiros resultados e quer apenas o a coluna ID e o NOME utilize a seguinte consulta:</p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><span lang="EN-US" style="">SELECT id,nome FROM tabela LIMIT 10</span><span lang="EN-US" style=""><o:p></o:p></span></p>
<blockquote>
<p>&nbsp;</p>
</blockquote>
<h2>Problema #2 &ndash; A contagem das linhas</h2>
<p class="MsoNormal">Ficar percorrendo todas as linhas de uma consulta e criar um contato estilo<span style="">&nbsp; </span><i style="">x = x+1</i> definitivamente n&atilde;o &eacute; uma boa op&ccedil;&atilde;o. Na verdade n&atilde;o deveria nem ser considerado uma op&ccedil;&atilde;o.</p>
<h3>Solu&ccedil;&atilde;o #2</h3>
<p class="MsoNormal">Como contar as linhas sem utilizer a SUPER CONSULTA? Simples, pequeno gafanhoto.</p>
<p class="MsoNormal">Utilize o comando COUNT, veja o exemplo abaixo.</p>
<p style="margin-left: 35.4pt;" class="MsoNormal"><span lang="EN-US" style="">SELECT count(ID) as total FROM tabela<o:p></o:p></span></p>
<p class="MsoNormal">Fazendo isso voc&ecirc; utiliza o total como umas coluna da tabela, por exemplo:</p>
<p style="margin-left: 35.4pt;" class="MsoNormal">total = rs(&ldquo;total&rdquo;)</p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<h2>Problema #3 &ndash; Chegar na linha desejada</h2>
<p class="MsoNormal">Tudo bem, voc&ecirc; conseguiu fazer a consulta e pegar o valor total, se a p&aacute;gina for a 1 voc&ecirc; utiliza o LIMIT, mas quando a p&aacute;gina for maior que 1 n&atilde;o tem jeito, voc&ecirc; vai utilizar a SUPER CONSULTA e contar os movenext, certo?</p>
<p class="MsoNormal">NOT!</p>
<p class="MsoNormal">Nada de SUPER CONSULTA, jamais nesta vida.</p>
<h3>Solu&ccedil;&atilde;o #3</h3>
<p class="MsoNormal">Para chegar na linha desejada utilizaremos novamente o comando LIMIT, suponto que voc&ecirc; est&aacute; na p&aacute;gina 3 e o m&aacute;ximo de itens exibidos por p&aacute;gina &eacute; 10. Voc&ecirc; precisa pegar da linha 21 at&eacute; a 30. Sua consulta:</p>
<p style="margin-left: 35.4pt;" class="MsoNormal">SELECT id,nome FROM tabela LIMIT 21,30</p>
<p class="MsoNormal">Simples assim, o LIMIT pode n&atilde;o somente limitar o n&uacute;mero de resultados, utilizando o formato acima ele seleciona exatamente quais linhas ser&atilde;o resultados da consulta.</p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<h2>Conclus&atilde;o</h2>
<p class="MsoNormal"><strike>Jamais confiem em um designer programando server-side.</strike></p>
<p class="MsoNormal">Brincadeira! :)</p>
<p class="MsoNormal">Sou formado em design e est&aacute; fazendo 5 anos que programo em ASP (cl&aacute;ssico). Sim, ASP cl&aacute;ssico, eu sei, estou OLD e j&aacute; passou da hora de me atualizar.</p>
<p class="MsoNormal">Mas meus c&oacute;digos de hoje s&atilde;o limpos, s&atilde;o orientados n&atilde;o por uma pessoa, mas por f&oacute;runs, blogs e muitas Googleadas. Este ano comecei a estudar .NET (estou come&ccedil;ando, na verdade <span style="color: rgb(128, 128, 128);"><strong>:)</strong></span>), li artigos e um livro de SCRUM, testei scrum solo. Acompanho blogs de desenvolvimento, ano passado comecei a estudar mais a fundo javascript (e jQuery). Ah, fiz um pequeno framework para desenvolver as intranets de meus clientes, est&aacute; funcionando bem, de forma modular, permitindo diferentes configura&ccedil;&otilde;es. Al&eacute;m do aprendizado (javascript, ASP, SQL) depois um BOM tempo com o aprendizado comecei a utiliz&aacute;-la para meus clientes, o retorno financeiro come&ccedil;ou no final do ano passado.</p>
<p class="MsoNormal">O que eu quero dizer &eacute;: <b style="">estude</b>. Estude muito.</p>
<p class="MsoNormal"><strong>Duvidem do c&oacute;digo que est&atilde;o vendo. Duvidem da primeira solu&ccedil;&atilde;o que encontrar.</strong></p>
<p class="MsoNormal">Se tiverem oportunidade <b style="">participem de um projeto de porte m&eacute;dio ou grande</b>, ou fa&ccedil;am um teste de carga em seus scripts. Gambiarra s&oacute; &ldquo;funciona bem&rdquo; em aplica&ccedil;&otilde;es pequenas, pois guando o <i style="">bicho pega</i> vai tudo pro pau.</p>
<p class="MsoNormal"><b style="">Estude.<o:p></o:p></b></p>
<p class="MsoNormal">Leia metodologias, baixe scripts, teste solu&ccedil;&otilde;es novas para problemas antigos.</p>
<p class="MsoNormal">Aprenda a economizar consultas ao banco de dados.</p>
<p class="MsoNormal">Aprenda a utilizar cache. Invente um modelo de cache. Mas n&atilde;o gambiarras.</p>
<p class="MsoNormal">Estudem.</p>
<p class="MsoNormal">E claro,&nbsp;<b style=""><a href="http://feeds2.feedburner.com/ODesenvolvedor">assinem o FEED</a></b><a href="http://feeds2.feedburner.com/ODesenvolvedor"> do O Desenvolvedor</a>, pois o <strong><a href="http://www.andafter.org/user.asp?id=345">Chris Benseler</a></strong> manda muito bem. E ele n&atilde;o &eacute; um designer metido a programador como eu. <span style="color: rgb(128, 128, 128);"><strong>:)</strong></span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<hr />
<p>&nbsp;</p>
<p style="margin-left: 40px;"><span style="font-size: x-large;">Aten&ccedil;&atilde;o 2</span></p>
<p style="margin-left: 40px;">Jamais utilize os c&oacute;digos que est&atilde;o em <span style="color: rgb(255, 0, 0);"><strong>VERMELHO</strong></span> neste artigo. Se voc&ecirc; fizer isso provavelmente voc&ecirc; perder&aacute; o emprego. A honra. E sua conta naquele f&oacute;rum bacana de desenvolvimento que voc&ecirc; participa.</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/TjRJ2JWYxQM" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/nao-programe-isso_967.html</feedburner:origLink></item>
<item>
	<title>Adicionar método de truncar texto em javascript a classe String</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/_g2sdIWQLlk/adicionar-metodo-de-truncar-texto-em-javascript-a-classe-string_957.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/adicionar-metodo-de-truncar-texto-em-javascript-a-classe-string_957.html#comentar</comments>
	<pubDate> Mon, 23 Mar 2009 12:40:22 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/adicionar-metodo-de-truncar-texto-em-javascript-a-classe-string_957.html</guid>
	<description><![CDATA[Adicionando método de truncar à classe String do javascript]]></description>
	<content:encoded><![CDATA[<p>O Danilo (do <a href="http://www.tidbits.com.br/truncar-texto-em-javascript-abreviar-sem-cortar-palavras">Tidbits</a>) aproveitou a id&eacute;ia do <a href="http://www.igorescobar.com/blog/2009/03/16/abreviando-um-texto-sem-cortar-palavras-no-php/">Igor em fazer um truncate de strings no PHP</a> e fez uma f<a href="http://www.tidbits.com.br/truncar-texto-em-javascript-abreviar-sem-cortar-palavras">un&ccedil;&atilde;o no javascript para isso</a> - voc&ecirc; passa a string e o limite de caracteres, se o tamanho dela for maior do que esse limite, ela corta e coloca tr&ecirc;s pontos no final.</p>
<p>Resolvi usar essa fun&ccedil;&atilde;o do Daniel para adicionar um m&eacute;todo de truncar ao objeto <strong>String</strong> do <em>javascript</em>. Com isso, ao inv&eacute;s de chamar a fun&ccedil;&atilde;o passando o texto e o limite de caracteres, &eacute; s&oacute; chamar o m&eacute;todo passando o limite:</p>
<p><em>minhaString.truncar(limite);</em></p>
<p>Vamos &agrave; implementa&ccedil;&atilde;o, j&aacute; com o exemplo de uso:</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Truncar - javascript&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; adapta&ccedil;&atilde;o da fun&ccedil;&atilde;o truncar() feita pelo Danilo do Tidbits,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; adicionando-a a classe String<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Fun&ccedil;&atilde;o original: http://www.tidbits.com.br/truncar-texto-em-javascript-abreviar-sem-cortar-palavras<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String.prototype.truncar = function(limite){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!limite)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw &quot;Limite n&atilde;o informado&quot;;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.toString().length&gt;limite){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; limite--;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; last = texto.substr(limite-1,1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(last!=&quot; &quot; &amp;&amp; limite &gt; 0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; limite--;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; last = texto.substr(limite-1,1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; last = texto.substr(limite-2,1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(last == &quot;,&quot; || last == &quot;;&quot;&nbsp; || last == &quot;:&quot;){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;texto = texto.substr(0,limite-2) + &quot;...&quot;;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else if(last == &quot;.&quot; || last == &quot;?&quot; || last == &quot;!&quot;){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;texto = texto.substr(0,limite-1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;texto = texto.substr(0,limite-1) + &quot;...&quot;;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return texto;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</em></p>
<p><em><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var texto = &quot;Meu texto&quot;;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert(texto.truncar(5));<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/body&gt;<br />
&lt;/head&gt;<br />
&lt;/html&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/_g2sdIWQLlk" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/adicionar-metodo-de-truncar-texto-em-javascript-a-classe-string_957.html</feedburner:origLink></item>
<item>
	<title>Zoom em imagem por javascript</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/4XzclsCdlz0/zoom-em-imagem-por-javascript_952.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/zoom-em-imagem-por-javascript_952.html#comentar</comments>
	<pubDate> Fri, 20 Mar 2009 15:5:37 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/zoom-em-imagem-por-javascript_952.html</guid>
	<description><![CDATA[Como criar uma ferramenta de zoom em imagem no javascript através de um slider]]></description>
	<content:encoded><![CDATA[<p>Vou mostrar como fazer um zoom em uma imagem usando <strong>javascript</strong>, usando um <em>slider</em> para controlar.</p>
<p><a href="http://www.andafter.org/blogs/odesenvolvedor/exemplos/javascript/prototype/slider/slider.htm">O mesmo pode ser visto funcionando aqui</a>!</p>
<p>No caso, utilizei o framework <a href="http://script.aculo.us">script.aculo.us</a> para criar o <em>slider</em> - mas a l&oacute;gica vale para qualquer outra biblioteca javascript.</p>
<p><strong>Vamos num passo-a-passo</strong></p>
<p>Inseri no html uma imagem:</p>
<p><em>&lt;img src=&quot;img2.png&quot; alt=&quot;imagem&quot; id=&quot;zoomImg&quot; /&gt;</em></p>
<p>Depois de ter o <em>script.aculo.us</em>, &eacute; feito o include dele e da <em>prototype</em> (ela &eacute; usada pela <em>engine</em> do <em>script.aculo.us</em>)</p>
<p><em>&lt;script src=&quot;scriptaculous/lib/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;scriptaculous/src/scriptaculous.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</em></p>
<p>No html, deve ser criada uma div com outra dentro. A pai ser&aacute; a &aacute;rea por onde o <em>slider</em> poder&aacute; correr, e a filha, o <em>slider</em> propriamente deito:</p>
<p><em>&lt;div id=&quot;square_slider&quot; class=&quot;slider&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div id=&quot;square_slider_handle&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;</em></p>
<p>No <em>CSS</em>, formato o layout das mesmas, imaginando que ser&aacute; um <em>slider</em> vertical:</p>
<p><em>&lt;style type=&quot;text/css&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; div.slider { width:10px; margin:10px 0; background-color:#ccc; height:100px; position: absolute; top:20px; left:20px; z-index:10000000000;}<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; div.slider div { width:10px; height:15px; background-color:#f00; cursor:move; position: absolute; }<br />
&lt;/style&gt;</em></p>
<p>O pr&oacute;ximo passo &eacute; criar o comportamento do <em>slider</em>. Isso &eacute; feito usando a classe <em>Control</em> (implementada pelo <em>script.aculo.us</em>), que possui um m&eacute;todo Slider o qual cria o comportamento do <em>slider</em>. A documenta&ccedil;&atilde;o &eacute; bem complexa, por isso vou me ater a essa implementa&ccedil;&atilde;o.<br />
Nesse caso, crio uma &aacute;rea de slider (<em>div id=&quot;square_slider&quot;</em>) cujo slider &eacute; controlado pelo elemento <em>div id=&quot;square_slider_handle&quot;</em>.<br />
Para esse <em>slider</em>, passo as seguintes parametriza&ccedil;&otilde;es:</p>
<ul>
    <li><strong>range</strong>: valor m&iacute;nimo e m&aacute;ximo da &aacute;rea de slide</li>
    <li><strong>slidervalues</strong>: valor m&iacute;nimo e m&aacute;ximo em que o slider pode percorrer</li>
    <li><strong>axis</strong>: dire&ccedil;&atilde;o do slider</li>
    <li><strong>onChange</strong>: fun&ccedil;&atilde;o que &eacute; chamada quando o usu&aacute;rio acaba de fazer o slide</li>
</ul>
<p>No caso, digo que &eacute; um slider que varia de valores entre 20 e 100, com os mesmos valores m&aacute;ximos, vertical. A fun&ccedil;&atilde;o no <em>onChange</em> &eacute; onde fa&ccedil;o o c&aacute;lculo. Essa fun&ccedil;&atilde;o recebe como par&acirc;metro o valor onde o slide foi solto. Com isso, calculo uma rela&ccedil;&atilde;o (ratio) entre o valor do slide e um valor base (no caso, 600, que &eacute; a largura da imagem).</p>
<p><em>var square_slider = new Control.Slider(&quot;square_slider_handle&quot;, &quot;square_slider&quot;, {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; range: $R(20, 100),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; values: $R(20, 100),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; sliderValue: [100],<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; axis: &quot;vertical&quot;,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; onChange: function(value) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; //divide o valor por 100 para achar a taxa de zoom<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; var ratio = value/100;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; multiplica a largura da imagem pelo inverso do ratio<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Observa&ccedil;&atilde;o: o valor de width &eacute; a base usada para c&aacute;lculo; no exemplo, &eacute; o tamanho original da imagem&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; var width = 600;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(&quot;zoomImg&quot;).setStyle({width: Math.round(width/ratio) + &quot;px&quot;});<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });</em></p>
<p>Voc&ecirc; pode fazer <a href="http://www.andafter.org/blogs/odesenvolvedor/exemplos/javascript/prototype/slider/slider.zip">download do pacote completo</a>, funcional :)</p>
<p>Abaixo, segue o html inteiro da p&aacute;gina, para visualiza&ccedil;&atilde;o</p>
<p><em>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;<br />
&nbsp;&nbsp;&nbsp; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Slider&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;meta content=&quot;text/html; charset=UTF-8&quot; http-equiv=&quot;Content-Type&quot; /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script src=&quot;scriptaculous/lib/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script src=&quot;scriptaculous/src/scriptaculous.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;style type=&quot;text/css&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; div.slider { width:10px; margin:10px 0; background-color:#ccc; height:100px; position: absolute; top:20px; left:20px; z-index:10000000000;}<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; div.slider div { width:10px; height:15px; background-color:#f00; cursor:move; position: absolute; }<br />
&nbsp;&nbsp;&nbsp; &lt;/style&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; window.onload = function() {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var square_slider = new Control.Slider(&quot;square_slider_handle&quot;, &quot;square_slider&quot;, {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; range: $R(20, 100),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; values: $R(20, 100),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sliderValue: [100],<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; axis: &quot;vertical&quot;,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; onChange: function(value) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //divide o valor por 100 para achar a taxa de zoom<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var ratio = value/100;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; multiplica a largura da imagem pelo inverso do ratio<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Observa&ccedil;&atilde;o: o valor de width &eacute; a base usada para c&aacute;lculo; no exemplo, &eacute; o tamanho original da imagem&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var width = 600;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $(&quot;zoomImg&quot;).setStyle({width: Math.round(width/ratio) + &quot;px&quot;});<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
<br />
&lt;div id=&quot;square_slider&quot; class=&quot;slider&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;div id=&quot;square_slider_handle&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;img src=&quot;img2.png&quot; alt=&quot;imagem&quot; id=&quot;zoomImg&quot; /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/4XzclsCdlz0" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/zoom-em-imagem-por-javascript_952.html</feedburner:origLink></item>
<item>
	<title>Como permitir que subdomínios leiam os Cookies do domínio principal em ASP</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/mXCoMFDMcFk/como-permitir-que-subdominios-leiam-os-cookies-do-dominio-principal-em-asp_934.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-permitir-que-subdominios-leiam-os-cookies-do-dominio-principal-em-asp_934.html#comentar</comments>
	<pubDate> Tue, 17 Mar 2009 15:35:20 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-permitir-que-subdominios-leiam-os-cookies-do-dominio-principal-em-asp_934.html</guid>
	<description><![CDATA[Script em ASP para permitir que os subdomínios tenham acessos aos cookies criados pelo domínio principal]]></description>
	<content:encoded><![CDATA[<p>Criei o <a href="http://www.andafter.org"><strong>And After</strong></a> para dominar o mundo e me tornar um milion&aacute;rio da internet, para isso conto com a ajuda dos donos do mundo (Bia, Chris e recentemente o Cristian).&nbsp;</p>
<p>As id&eacute;ias foram crescendo, Um dos projetos est&aacute; sendo desenvolvido em um <strong>subdom&iacute;nio</strong>, mas por padr&otilde;es de seguran&ccedil;a um cookie s&oacute; pode ser lido pelo dom&iacute;nio que o criou, ent&atilde;o os cookies ficam inacess&iacute;veis para os subdom&iacute;nios.</p>
<p style="text-align: center; "><img alt="Cookies" width="500" height="460" src="http://www.andafter.org/images/album/cookies.jpg" /></p>
<p style="margin-left: 40px; ">Se voc&ecirc; n&atilde;o sabe NADA sobre cookies recomendo as leituras:</p>
<h3 style="margin-left: 40px; "><a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/cookies-em-asp_529.html">Como criar e ler cookies em ASP</a></h3>
<h3 style="margin-left: 40px; "><a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/classe-para-gravar-e-ler-cookies-por-javascript_537.html">Classe para gravar e ler cookies - por javascript</a></h3>
<p>&nbsp;</p>
<p>Para permitir que todos os subdom&iacute;nios consigam ler o cookie precisamos apenas adiconar a propriedade <strong>domain </strong>na hora de criar o cookie.</p>
<p>&nbsp;Por exemplo, tenho um cookie chamado <strong>odesenvolvedor </strong>que foi criado pelo dom&iacute;nio andafter.org e quero permitir que o subdom&iacute;nio testes.andafter.org consiga ler este cookie, quando eu gerar o cookie adiciono a seguinte linha:</p>
<p>&nbsp;</p>
<p style="margin-left: 40px; "><strong>Response.Cookies(&quot;odesenvolvedor&quot;).domain = &quot;andafter.org&quot;</strong></p>
<p style="margin-left: 40px; ">&nbsp;</p>
<p>Neste cado o atributo domain permite que todos os subdom&iacute;nios de andafter.org tenham acesso ao dom&iacute;nio.</p>
<p style="text-align: center; "><img alt="Todo poderoso" width="0" height="0" src="http://www.andafter.org/images/album/todo%20poderoso.jpeg" /><img alt="Todo poderoso" width="485" height="391" src="http://www.andafter.org/images/album/todo%20poderoso.jpeg" /></p>
<p style="text-align: center; "><span style="font-size: x-large; "><span style="color: rgb(192, 192, 192); "><span class="Apple-style-span" style="font-family: "-webkit-sans-serif"; line-height: 19px; ">&quot;That"s the way the cookie crumbles&quot;*</span></span></span></p>
<p style="text-align: center; ">&quot;E &eacute; assim que o biscoito &eacute; repartido&quot;*</p>
<p>&nbsp;</p>
<p>Simples e f&aacute;cil, agora posso dominar o mundo utilizando diversos subdom&iacute;nios!</p>
<p>Espero que isso tenha ajudado, sugest&otilde;es, d&uacute;vidas e cr&iacute;ticas nos <strong><a href="#comentar">coment&aacute;rios</a>&nbsp;</strong>:)</p>
<p>&nbsp;</p>
<hr />
<p>&nbsp;</p>
<p>Para quem n&atilde;o lembra no filme Todo Poderoso, esta &eacute; a &quot;assinatura&quot; do &acirc;ncora que se torna deus, interpretado por Jim Carrey. Via <a href="http://en.wikiquote.org/wiki/Bruce_Almighty">Wikiquote</a></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/mXCoMFDMcFk" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-permitir-que-subdominios-leiam-os-cookies-do-dominio-principal-em-asp_934.html</feedburner:origLink></item>
<item>
	<title>Adicionando propriedades a objetos no Javascript em tempo de execução</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/GwTy-gqAIcE/adicionando-propriedades-a-objetos-no-javascript-em-tempo-de-execucao_948.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/adicionando-propriedades-a-objetos-no-javascript-em-tempo-de-execucao_948.html#comentar</comments>
	<pubDate> Mon, 16 Mar 2009 16:17:18 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/adicionando-propriedades-a-objetos-no-javascript-em-tempo-de-execucao_948.html</guid>
	<description><![CDATA[Função que facilita a adição de propriedades (funções, variáveis) a objetos usando o objeto prototype]]></description>
	<content:encoded><![CDATA[<p>Uma capacidade muito explorada no <strong>javascript</strong> &eacute; a possibilidade de se adicionar propriedades a objetos em tempo de execu&ccedil;&atilde;o. Como <strong>javascript</strong> &eacute; uma linguagem interpretada, o desenvolvedor tem a possibilidade de adicionar propriedades (vari&aacute;veis, fun&ccedil;&otilde;es, etc...) a objetos j&aacute; instanciados.<br />
Para isso, &eacute; usado o objeto <strong>prototype</strong> que <a href="http://www.javascriptkit.com/javatutors/proto.shtml">todos objetos do javascript possuem</a>.<br />
Abaixo segue uma fun&ccedil;&atilde;o que facilita a escrita; ao inv&eacute;s de criar para cada fun&ccedil;&atilde;o a ser adicionada no objeto uma entrada diferente, com ela s&oacute; &eacute; necess&aacute;rio passar como par&acirc;metro o objeto e uma lista de propriedades.</p>
<p><em>/* fun&ccedil;&atilde;o recebe dois par&acirc;metros: o objeto e a lista de m&eacute;todos que ser&atilde;o adicionados a ele */<br />
&nbsp;&nbsp;&nbsp; function addMethods(myObject, methods) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //percorre a lista de m&eacute;todos<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (var property in methods) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //adiciona o m&eacute;todo ao objeto, dinamicamente<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myObject.prototype[property] = methods[property];<br />
&nbsp; &nbsp;&nbsp;&nbsp; }<br />
}</em></p>
<p>Para facilitar, segue um c&oacute;digo completo onde no onload da p&aacute;gina adiciono ao objeto String (nativo do javascript) duas fun&ccedil;&otilde;es e uma vari&aacute;vel:</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Adicionar metodos&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; /* fun&ccedil;&atilde;o recebe dois par&acirc;metros: o objeto e a lista de m&eacute;todos que ser&atilde;o adicionados a ele */<br />
&nbsp;&nbsp;&nbsp; function addMethods(myObject, methods) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //percorre a lista de m&eacute;todos<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (var property in methods) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //adiciona o m&eacute;todo ao objeto, dinamicamente<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myObject.prototype[property] = methods[property];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; window.onload = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; addMethods(String, {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; func1: function() {alert(&quot;Sou a funcao 1&quot;);},<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; func2: function() {alert(&quot;Sou a funcao 2&quot;);},<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const1: 2<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var myString = new String();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myString.func1();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert(myString.const1);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp; <br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/GwTy-gqAIcE" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/adicionando-propriedades-a-objetos-no-javascript-em-tempo-de-execucao_948.html</feedburner:origLink></item>
<item>
	<title>Enviando e-mail em ASP (CDO) utilizando o Google Apps</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/jS_NctDydTQ/enviando-e-mail-em-asp-cdo-utilizando-o-google-apps_937.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/enviando-e-mail-em-asp-cdo-utilizando-o-google-apps_937.html#comentar</comments>
	<pubDate> Fri, 13 Mar 2009 14:51:12 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/enviando-e-mail-em-asp-cdo-utilizando-o-google-apps_937.html</guid>
	<description><![CDATA[Enviar e-mail sem ASP (CDO) utilizando o servidor SMTP do Google, através de uma conta no Google Apps]]></description>
	<content:encoded><![CDATA[<p>Desde que migrei para o novo servidor que estou gerenciando optei por fornecer os benef&iacute;cios do <strong>Google Apps </strong>para todos os meus clientes, principalmente pela poderosa ferramente de e-mail (Gmail) que de longe &eacute; o melhor sistema de webmail que eu j&aacute; testei.</p>
<p>Como resolvi utilizar este como &uacute;nico servidor de e-mails, tive que fazer altera&ccedil;&otilde;es nos scripts de envio de e-mail, newsletter, contato, etc. dos sites dos clientes, como demorei um pouco para descobrir porque n&atilde;o estava funcionando acho que este pode ajudar quem est&aacute; com o mesmo problema.</p>
<p>&nbsp;</p>
<h2>Enviando e-mail em ASP utilizando o Google Apps</h2>
<p>Muito bem, &eacute; um script simples mas que me tomou algum tempo pois eu havia esquecido de habilitar o SSL. N&atilde;o esque&ccedil;a de usar um e-mail do seu dom&iacute;nio como remetente, criar a conta de e-mail (cerifique logando no webmail) e habilitar o uso de SMTP pelo painel do Google Apps.</p>
<p>Feito isso, &eacute; s&oacute; utilizar o c&oacute;digo abaixo alterando apenas as configura&ccedil;&otilde;es para sua conta.</p>
<p>&nbsp;</p>
<pre name="code" class="html">
 
Dim objCDOSYSMail

Dim objCDOSYSCon
Set objCDOSYSMail = Server.CreateObject(&quot;CDO.Message&quot;)
 
Set objCDOSYSCon = Server.CreateObject (&quot;CDO.Configuration&quot;)
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/smtpserver&quot;) = &quot;smtp.gmail.com&quot;
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/smtpserverport&quot;) = 25
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/sendusing&quot;) = 2

&quot;Aqui estava o meu problema: SSL tem que ser TRUE!
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/smtpauthenticate&quot;) = 1
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/smtpusessl&quot;) = True

&quot;o e-mail completo que voc&ecirc; utiliza no google apps (n&atilde;o esque&ccedil;a de habilitar SMTP no painel fo Google apps!
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/sendusername&quot;) = &quot;eu@andafter.org&quot;
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/sendpassword&quot;) = &quot;senha&quot;
objCDOSYSCon.Fields(&quot;http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout&quot;) = 30
 
objCDOSYSCon.Fields.update 
Set objCDOSYSMail.Configuration = objCDOSYSCon
 
objCDOSYSMail.From = &quot;Newsletter And After
objCDOSYSMail.To = &quot;Nome &lt;email@andafter.org&gt;&quot;
objCDOSYSMail.Subject = &quot;And After - Newsletter Junho&quot;
objCDOSYSMail.HtmlBody = email
objCDOSYSMail.Send

Set objCDOSYSMail = Nothing 
Set objCDOSYSCon = Nothing </pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 style="color: red;"><strong>Limite de envios</strong></h3>
<p>O Google libera o envio de apenas 500 e-mails por conta para evitar o uso indevido do Google Apps, por isso voc&ecirc; pode utilizar duas ou mais contas se for necess&aacute;rio o envio de Newsletter assim. Por exemplo, crie as contas:</p>
<ul>
    <li>news1@andafter.org&nbsp;</li>
    <li>news2@andafter.org&nbsp;</li>
    <li>news3@andafter.org&nbsp;</li>
    <li>news4@andafter.org&nbsp;</li>
</ul>
<p>Assim voc&ecirc; pode realizar o disparo de 2.000 mensagens a cada 24h, configurando cada grupo de usu&aacute;rio para ser atendido por uma conta de e-mail. :)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Espero que ajude, para o envio em&nbsp;<strong>PHP&nbsp;</strong>tamb&eacute;m &eacute; necess&aacute;rio habilitar o SSL (&oacute;bvio...) mas n&atilde;o vou me arriscar no c&oacute;digo, se algu&eacute;m quiser compartilhar&nbsp;<strong><a href="http://www.andafter.org/publicar2.asp">publique-o no And After</a></strong>&nbsp;:)</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/jS_NctDydTQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/enviando-e-mail-em-asp-cdo-utilizando-o-google-apps_937.html</feedburner:origLink></item>
<item>
	<title>Exibindo arquivos de um diretório em PHP</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/p9Ux5RlNvZA/exibindo-arquivos-de-um-diretorio-em-php_926.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exibindo-arquivos-de-um-diretorio-em-php_926.html#comentar</comments>
	<pubDate> Mon, 9 Mar 2009 21:14:30 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exibindo-arquivos-de-um-diretorio-em-php_926.html</guid>
	<description><![CDATA[LIstando diretórios e arquivos em PHP usando a função glob()]]></description>
	<content:encoded><![CDATA[<p>Todas as vezes em que precisei listar arquivos de um diret&oacute;rio - em PHP usava as fun&ccedil;&otilde;es <em>opendir()</em> e <em>readdir()</em>. H&aacute; muito tempo n&atilde;o precisava fazer isso, e hoje me deparei com essa necessidade.<br />
Fui procurar a documenta&ccedil;&atilde;o e encontrei uma outra fun&ccedil;&atilde;o que nunca tinha visto, a <em>glob()</em>. S&oacute; &eacute; necess&aacute;rio passar o caminho fis&iacute;co do diret&oacute;rio e ele retorna um array de entradas com arquivos e diret&oacute;rios.</p>
<p>O uso &eacute; simples:</p>
<p><em>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br />
&lt;title&gt;Listando arquivos&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;ul&gt;<br />
&lt;?php<br />
&nbsp;&nbsp;&nbsp; //define o caminho do diret&oacute;rio<br />
&nbsp;&nbsp;&nbsp; $dir = &quot;/Applications/MAMP/htdocs/exemplos/files/&quot;;<br />
&nbsp;&nbsp;&nbsp; //listar arquivos<br />
&nbsp;&nbsp;&nbsp; $files = glob($dir.&quot;/*&quot;) or die(&quot;Erro ao acessar &quot; . $dir);<br />
&nbsp;&nbsp;&nbsp; //permorre a lista<br />
&nbsp;&nbsp;&nbsp; foreach($files as $file) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!is_dir($file)){<br />
?&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;a href=&quot;&lt;?php echo $file;?&gt;&quot; title=&quot;&lt;?php echo $file;?&gt;&quot;&gt;&lt;?php echo $file;?&gt;&lt;/a&gt;&lt;/li&gt;<br />
&lt;?php<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
?&gt;<br />
&lt;/ul&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/p9Ux5RlNvZA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exibindo-arquivos-de-um-diretorio-em-php_926.html</feedburner:origLink></item>
<item>
	<title>Exibindo a quantidade de comentários do tipo spam no Wordpress</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/dMYPz85rD0M/exibindo-a-quantidade-de-comentarios-do-tipo-spam-no-wordpress_907.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exibindo-a-quantidade-de-comentarios-do-tipo-spam-no-wordpress_907.html#comentar</comments>
	<pubDate> Tue, 3 Mar 2009 10:6:16 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exibindo-a-quantidade-de-comentarios-do-tipo-spam-no-wordpress_907.html</guid>
	<description><![CDATA[Veja como exibir a quantidade de comentários marcados como spam no Wordpress]]></description>
	<content:encoded><![CDATA[<p>Uma das pestes para quem gerencia <strong>blogs</strong> s&atilde;o os <em>spams</em> em coment&aacute;rios. Atrapalham, enchem a paci&ecirc;ncia e nos fazem perder tempo moderando-os. No meu blog pessoal (onde uso <em>Wordpress</em> como gerenciador), resolvi fazer um contador de <em>spams</em>. Como?<br />
Nos templates do <em>Wordpress</em> o desenvolvedor tem no contexto um objeto <em>$wpdb</em>, que abstrai o banco de dados do mesmo. Ele tem um m&eacute;todo, <em>get_results()</em>, onde voc&ecirc; pode fazer uma query <em>SQL</em>. No caso, ao inv&eacute;s de chamar a tabela pelo nome dela, podemos usar <em>$wpdb-&gt;comments</em> (esse atributo retorna o nome da tabela; vale a pena fazer dessa forma, pois com isso mantemos um certo desacoplamento). A coluna na tabela que marca o status de um <strong>comment</strong> &eacute; a <em>comment_approved</em>; <em>spam</em> &eacute; o status para coment&aacute;rios marcados como spam.</p>
<p>Ent&atilde;o, o c&oacute;digo &eacute;:</p>
<p><em>&nbsp;&lt;?php<br />
&nbsp;&nbsp;&nbsp; global $wpdb;<br />
&nbsp;&nbsp; $spamComments = $wpdb-&gt;get_results(&quot;SELECT * FROM &quot; . $wpdb-&gt;comments . &quot; WHERE&nbsp; comment_approved=&quot;spam&quot;&quot;);<br />
&nbsp;&nbsp; echo sizeof($spamComments);<br />
?&gt;</em></p>
<p>&nbsp;No caso, eu poderia ter usado o <em>COUNT</em> do <em>SQL</em> - seria mais perform&aacute;tico, inclusive - mas retirei esse c&oacute;digo de uma implementa&ccedil;&atilde;o que fiz onde eu precisava da lista de coment&aacute;rios futuramente...</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/dMYPz85rD0M" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exibindo-a-quantidade-de-comentarios-do-tipo-spam-no-wordpress_907.html</feedburner:origLink></item>
<item>
	<title>Como editar conteúdos do html pelo browser</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/PjXPZ_PQToA/como-editar-conteudos-do-html-pelo-browser_903.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-editar-conteudos-do-html-pelo-browser_903.html#comentar</comments>
	<pubDate> Thu, 26 Feb 2009 14:58:50 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-editar-conteudos-do-html-pelo-browser_903.html</guid>
	<description><![CDATA[Conheça a propriedade contenteditable para habilitar edição de html pelo browser]]></description>
	<content:encoded><![CDATA[<p>Via em v&aacute;rios aplicativos web de <strong>CMS</strong> a op&ccedil;&atilde;o do usu&aacute;rio editar o conte&uacute;do de uma p&aacute;gina pelo pr&oacute;prio browser, ao inv&eacute;s de ter que entrar numa outra interface. Ficava me perguntando como isso era feito, qual o tipo de <em>m&aacute;gica</em>. Quando vi que o (famoso) <em>Sharepoint</em>, o <strong>CMS</strong> da <em>Microsoft</em> faz isso, comecei a ficar desesperan&ccedil;oso, pensando que seria com alguma sa&iacute;da propriet&aacute;ria, algum componente para o IE.</p>
<p>Mas uma pesquisada no <em>Google</em> me fez deparar com um atributo desconhecido por mim at&eacute; hoje (mesmo depois de mais de 5 anos trabalhando com interfaces para web), n&atilde;o reconhecido pela <strong>W3C</strong> mas suportado por v&aacute;rios browsers (testei no Firefox do Ubuntu, MacOS X e Windows Vista e XP), Safari, IE 6 e 7: contenteditable</p>
<p>Elementos do (x)html podem ser edit&aacute;veis com a propriedade <em>contenteditable=&quot;true&quot;</em><br />
Fa&ccedil;a um teste em qualquer html seu, colocando assim:</p>
<p><em>&lt;div contenteditable=&quot;true&quot;&gt;texto edit&aacute;vel&lt;/div&gt;</em></p>
<p>Voc&ecirc; ver&aacute; quea &aacute;rea &eacute; cli&ccedil;avel, e um cursor aparece quando voc&ecirc; clica. E pode editar!</p>
<p>Como disse, n&atilde;o &eacute; v&aacute;lidado pelo <em>W3C</em>, mas todos os browsers usam... muito &uacute;til para um <strong>CMS</strong> ou qualquer outro onde o usu&aacute;rio possa editar textos!</p>
<p>Abaixo, segue um exemplo de como habilitar/desabilitar uma div para edi&ccedil;&atilde;o. A partir da&iacute;, muita coisa pode ser feita :)</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Exemplo de uso - contenteditable&lt;/title&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; function toggleEditArea() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var field = document.getElementById(&quot;edit_area&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!field.getAttribute(&quot;contenteditable&quot;) || field.getAttribute(&quot;contenteditable&quot;)==&quot;false&quot;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; field.setAttribute(&quot;contenteditable&quot;, &quot;true&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; field.setAttribute(&quot;contenteditable&quot;, &quot;false&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=&quot;edit_area&quot;&gt;sadsadsadsadas&lt;/div&gt;<br />
&lt;a href=&quot;?edit&quot; onclick=&quot;toggleEditArea(); return false;&quot;&gt;habalitar/desabilitar&lt;/a&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/PjXPZ_PQToA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/como-editar-conteudos-do-html-pelo-browser_903.html</feedburner:origLink></item>
<item>
	<title>Criando sua própria classe para requisições assíncronas - ajax</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/aHA3kYN59PE/criando-sua-propria-classe-para-requisicoes-assincronas-ajax_887.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/criando-sua-propria-classe-para-requisicoes-assincronas-ajax_887.html#comentar</comments>
	<pubDate> Thu, 19 Feb 2009 14:47:25 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/criando-sua-propria-classe-para-requisicoes-assincronas-ajax_887.html</guid>
	<description><![CDATA[Veja como criar sua prórpia classe javascript para consultas ajax, sem nenhuma dependência externa, nos mesmos moldes que os famosos frameworks]]></description>
	<content:encoded><![CDATA[<p>Sabe esses <em>frameworks</em> javascript que facilitam a nossa vida? Que tem fun&ccedil;&otilde;es, <em>crossbrowsers</em>, prontas para consultas <em>ajax</em>? Ent&atilde;o, que tal ver como implementar isso?</p>
<p>E, n&atilde;o, n&atilde;o quero reinventar a roda! Serve mesmo para estudos ou no caso em que n&atilde;o &eacute; poss&iacute;vel adotar um framework - sim, de vez em quando precisamos implementar algo s&oacute; com fun&ccedil;&otilde;es nativas do javascript por requisitos do sistema...</p>
<p>Primeiro, criei uma fun&ccedil;&atilde;o javascript chamada<strong> MyAjaxLoader()</strong>. Nela, instancio um objeto que far&aacute; as nossas consultas, de uma forma <em>crossbrowser</em>. Esse c&oacute;digo, que verifica se existe o <em>ActiveX</em> (browsers IE) ou n&atilde;o, j&aacute; foi muito explorado em diversos blogs. Indico <a href="http://www.hospedia.com.br/artigos/4/ajax/1/ajax_-_o_objeto_xmlhttprequest_-_parte_1.html">essa leitura</a>.<br />
O pr&oacute;ximo passo &eacute; criar uma fun&ccedil;&atilde;o<strong> load()</strong> e adicion&aacute;-la a fun&ccedil;&atilde;o <strong>MyAjadLoader()</strong> com a propriedade <em>prototype</em> (n&atilde;o confundir isso com a biblioteca hom&ocirc;nima). Essa t&eacute;cnica permite criarmos fun&ccedil;&otilde;es com fun&ccedil;&otilde;es dentro, o que de uma certa forma pode ser abstra&iacute;do para uma classe.<br />
Essa fun&ccedil;&atilde;o recebe dois par&acirc;metros: a <em>url</em> que ser&aacute; requisitada e uma lista de chaves/valor de op&ccedil;&otilde;es. Nessa lista de chaves/valor estou tratando apenas duas chaves: <em>params</em>, que podem ser os par&acirc;metros a serem passados para a url e <em>onSuccess</em>, a fun&ccedil;&atilde;o que ser&aacute; chamada em caso de sucesso na requisi&ccedil;&atilde;o (<a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-e-outros-parametros-para-outra-funcao-em-javascript-_874.html">veja aqui texto sobre como passar fun&ccedil;&otilde;es de callback</a>)</p>
<p>Abaixo, segue um exemplo funcional da classe!</p>
<p>&lt;<em>html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Criando sua pr&oacute;pria classe para requisi&ccedil;&atilde;o ass&iacute;ncrona (ajax)&lt;/title&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
<br />
/**<br />
* classe para requisi&ccedil;&otilde;es ass&iacute;ncronas - c&oacute;digo nativo<br />
*/<br />
function MyAjaxLoader() {<br />
<br />
&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlhttp = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;); <br />
&nbsp;&nbsp;&nbsp; } catch (e) { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlhttp = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (E) { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlhttp = false; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
<br />
&nbsp;&nbsp;&nbsp; if&nbsp; (!xmlhttp &amp;&amp; typeof&nbsp; XMLHttpRequest != &quot;undefined&quot; ) { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlhttp = new&nbsp; XMLHttpRequest(); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch&nbsp; (e) { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlhttp = false ; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; this.xmlhttp = xmlhttp;<br />
<br />
}<br />
<br />
/**<br />
* m&eacute;todo que recebe a url a ser requisitada e pode receber par&acirc;metros adicionais:<br />
* params: par&acirc;metros da url<br />
* onSuccess: fun&ccedil;&atilde;o de callback<br />
*/<br />
MyAjaxLoader.prototype.load = function(url, p) {<br />
&nbsp;&nbsp;&nbsp; //verifica se tem no par&acirc;metro uma chave igual a params; se tiver, concatena com a url<br />
&nbsp;&nbsp;&nbsp; if(p.params)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var myUrl = url + &quot;?&quot; + p.params;<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var myUrl = url;<br />
&nbsp;&nbsp;&nbsp; //abre a conex&atilde;o<br />
&nbsp;&nbsp;&nbsp; xmlhttp.open(&quot;get&quot;, myUrl);<br />
&nbsp;&nbsp;&nbsp; //faz a requisi&ccedil;&atilde;o<br />
&nbsp;&nbsp;&nbsp; xmlhttp.send(null);<br />
&nbsp;&nbsp;&nbsp; var thisMMP = this;<br />
&nbsp;&nbsp;&nbsp; //verifica os estados de transi&ccedil;&atilde;o<br />
&nbsp;&nbsp;&nbsp; xmlhttp.onreadystatechange = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //4 &eacute; o final da requisi&ccedil;&atilde;o<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(xmlhttp.readyState==4) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //erro 404: n&atilde;o existe a url ou houve erro ao requisitar<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(xmlhttp.status==404) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert(&quot;Erro: url n&atilde;o encontrada&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //verifica se tem no par&acirc;metro uma chave igual a onSuccess; se tiver, chama a <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //fun&ccedil;&atilde;o de callback passando o resultado da requisi&ccedil;&atilde;o<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(p.onSuccess)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p.onSuccess.call(this, xmlhttp.responseText);&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
var myAjax = new MyAjaxLoader();<br />
myAjax.load(&quot;tmp.htm&quot;, {params: &quot;id=1&amp;method=x&quot;, onSuccess: functionOk});<br />
<br />
/* fun&ccedil;&atilde;o de callback */<br />
function functionOk(data) {<br />
&nbsp;&nbsp;&nbsp; alert(data);<br />
}<br />
<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/aHA3kYN59PE" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/criando-sua-propria-classe-para-requisicoes-assincronas-ajax_887.html</feedburner:origLink></item>
<item>
	<title>Construindo uma classe PHP para acessar a API do BlogBlogs</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/mgr3GTXjRkM/construindo-uma-classe-php-para-acessar-a-api-do-blogblogs_883.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/construindo-uma-classe-php-para-acessar-a-api-do-blogblogs_883.html#comentar</comments>
	<pubDate> Tue, 17 Feb 2009 18:18:44 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/construindo-uma-classe-php-para-acessar-a-api-do-blogblogs_883.html</guid>
	<description><![CDATA[Classe em PHP para facilitar o acesso à API do BlogBlogs]]></description>
	<content:encoded><![CDATA[<p>Postei nesse &uacute;ltimo final-de-semana <a href="http://www.chrisb.com.br/blog/classe-para-acessar-a-api-do-blogblogs/">uma classe em PHP que fiz para acessar a API do BlogBlogs de uma forma f&aacute;cil</a>.<br />
A <a href="http://blogblogs.com.br/ajuda/faq/secao/api">API do BlogBlogs</a> retorna atrav&eacute;s da arquitetura <em>REST</em> arquivos <em>XML que</em> representam informa&ccedil;&otilde;es do perfil de um usu&aacute;rio do BlogBlogs e de blogs cadastrados no sistema.</p>
<p><a href="http://www.chrisb.com.br/files/lib/BlogBlogsService.php.zip">Download da classe aqui!</a></p>
<p>Primeiramente, criei duas classes, que abstraem esses dados em forma de objetos. Uma classe &eacute; a <strong>BlogBlogsBlog</strong>, um bean para a entidade blog, e outra a <strong>BlogBlogsUser</strong>, que por sua vez &eacute; um bean para o usu&aacute;rio do sistema. Cada classe recebe no construtor os atributos.</p>
<p><em>/**<br />
* Dados do usu&aacute;rio do BlogBlogs<br />
*/<br />
class BlogBlogsUser {<br />
&nbsp;&nbsp;&nbsp; function __construct($username, $firstname, $lastname, $fullname, $thumbnailpicture, $profilepage, $blogs, $favorites, $fans) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;userName = $username;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;firstName = $firstname;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;lastName = $lastname;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;fullName = $fullname;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;thumbnailPicutre = $thumbnailpicture;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;profilePage = $profilepage;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;blogsCount = $blogs;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;favoritesCount = $favorites;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;fansCount = $fans;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;blogs = array();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
/**<br />
* Dados de um blog do BlogBlogs<br />
*/<br />
class BlogBlogsBlog {<br />
&nbsp;&nbsp;&nbsp; function __construct($name, $url, $rssurl, $blogpage, $lastupdate, $inboundblogs, $inboundlinks, $rank, $lang) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;name = $name;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;url = $url;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;rssUrl = $rssurl;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;blogPage = $blogpage;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;lastUpdate = $lastupdate;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;inboundBlogs = $inboundblogs;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;inboundLinks = $inboundlinks;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;rank = $rank;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;lang = $lang;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</em></p>
<p>Com isso, podia continuar a implementa&ccedil;&atilde;o. Criei a classe <strong>BlogBlogsService</strong>. Guardei no atributo <em>apiUrl</em> a url da API, e no construtor da classe recebo o valor da chave da API do BlogBlogs (semelhante ao processo de se usar a API do Google Maps, por exemplo).<br />
Ent&atilde;o criei alguns m&eacute;todos, e os que s&atilde;o &uacute;teis para o desenvolvedor:</p>
<ul>
    <li><em>setUserName()</em>: seta o username do usu&aacute;rio pelo qual faremos a busca no sistema do BlogBlogs. O m&eacute;todo automaticamente busca todos os blogs e os dados do perfil do usu&aacute;rio</li>
    <li><em>getBlogByUrl()</em>: faz a busca por um blog atrav&eacute;s da sua url</li>
</ul>
<p>Assim, temos implementadas todas as buscas poss&iacute;veis pela API.</p>
<p><em>class BlogBlogsService {<br />
&nbsp;&nbsp;&nbsp; private $apiUrl = &quot;http://api.blogblogs.com.br/api/rest/&quot;;<br />
&nbsp;&nbsp;&nbsp; private $userKey;<br />
&nbsp;&nbsp;&nbsp; private $doc;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * construtor: recebe a chave da API do BlogBlogs<br />
&nbsp;&nbsp;&nbsp; * para gerar, acesse http://blogblogs.com.br/dev/chave<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; function __construct($k) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;userKey = $k;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;user = null;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * recebe o userName no blogblogs e faz a consulta<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; function setUserName($userName) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $path = $this-&gt;apiUrl . &quot;userinfo?key=&quot; . $this-&gt;userKey . &quot;&amp;username=&quot; . $userName;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;doc = new DOMDocument();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;doc-&gt;load($path);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //verifica erros: caso tenha um n&oacute; com namespace error<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($this-&gt;doc-&gt;getElementsByTagName(&quot;error&quot;)-&gt;length==1) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;errorMsg = $this-&gt;doc-&gt;getElementsByTagName(&quot;error&quot;)-&gt;item(0)-&gt;nodeValue;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new Exception($this-&gt;errorMsg);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($this-&gt;doc-&gt;getElementsByTagName(&quot;result&quot;)-&gt;length!=1)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //dados do usu&aacute;rio<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $userset = $this-&gt;doc-&gt;getElementsByTagName(&quot;result&quot;)-&gt;item(0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $blogBlogsUser = new BlogBlogsUser($userset-&gt;getElementsByTagName(&quot;username&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;firstname&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;lastname&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;fullname&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;thumbnailpicture&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;profilepage&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;blogs&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;favorites&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; $userset-&gt;getElementsByTagName(&quot;fans&quot;)-&gt;item(0)-&gt;nodeValue);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //dados de cada blog<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; foreach($this-&gt;doc-&gt;getElementsByTagName(&quot;weblog&quot;) as $blog) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $blog = $this-&gt;createBlogWithXMLNode($blog);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //$blogBlogsUser-&gt;addBlog($blog);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;addBlogToUser($blogBlogsUser, $blog);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;user = $blogBlogsUser;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * recupera um blog por uma url<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; function getBlogByUrl($url) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $path = $this-&gt;apiUrl . &quot;bloginfo?key=&quot; . $this-&gt;userKey . &quot;&amp;url=&quot; . $url;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;doc = new DOMDocument();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;doc-&gt;load($path);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($this-&gt;doc-&gt;getElementsByTagName(&quot;weblog&quot;)-&gt;length!=1)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $blog = $this-&gt;doc-&gt;getElementsByTagName(&quot;weblog&quot;)-&gt;item(0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $myBlog = $this-&gt;createBlogWithXMLNode($blog);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $myBlog;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; function createBlogWithXMLNode($node) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $blog = new BlogBlogsBlog($node-&gt;getElementsByTagName(&quot;name&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;url&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;rssurl&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;blogpage&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;lastupdate&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;inboundblogs&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;inboundlinks&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;rank&quot;)-&gt;item(0)-&gt;nodeValue,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $node-&gt;getElementsByTagName(&quot;lang&quot;)-&gt;item(0)-&gt;nodeValue);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $blog;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; function addBlogToUser($user, $blog) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; array_push($user-&gt;blogs, $blog);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</em></p>
<p>Vamos ver um passo-a-passo de como ver um atributo de um usu&aacute;rio:</p>
<p><em>$minha_chave = &ldquo;XXXXXXXXXXXXXXX&rdquo;;<br />
$bbService = new BlogBlogsService($minha_chave);<br />
</em><em>$bbService-&gt;setUserName(&quot;ChrisB&quot;);<br />
</em><em>echo $bbService-&gt;user-&gt;fullName;</em><em> </em><em> </em></p>
<p>Se quisermos listar os blogs dele, exibindo as urls dos mesmos, acessamos a lista de BlogBlogsBlog que o BlogBlogsUser possue:</p>
<p><em>foreach($bbService-&gt;user-&gt;blogs as $blog) {<br />
$blog-&gt;url . &ldquo;&lt;br /&gt;&rdquo;;<br />
}</em></p>
<p>Ainda podemos fazer a busca diretamente po um blog, pela sua url:</p>
<p><em>$bbService-&gt;getBlogByUrl(&rdquo;http://www.chrisb.com.br/blog/&rdquo;)<br />
//para exibir o nome do blog<br />
$bbService-&gt;getBlogByUrl(&rdquo;http://www.chrisb.com.br/blog/&rdquo;)-&gt;name;</em></p>
<p>Creio que os exemplos, mesmo simples, mostram a facilidade de uso. []s!</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/mgr3GTXjRkM" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/construindo-uma-classe-php-para-acessar-a-api-do-blogblogs_883.html</feedburner:origLink></item>
<item>
	<title>Usando funções de callback em javascript para sucesso ou erro</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/xsHmBDMG-Ew/usando-funcoes-de-callback-em-javascript-para-sucesso-ou-erro_876.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-funcoes-de-callback-em-javascript-para-sucesso-ou-erro_876.html#comentar</comments>
	<pubDate> Thu, 12 Feb 2009 21:56:51 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-funcoes-de-callback-em-javascript-para-sucesso-ou-erro_876.html</guid>
	<description><![CDATA[Veja como ter várias funcões de callback, no javascript, para casos de sucesso, erro, etc...]]></description>
	<content:encoded><![CDATA[<p>Em mais um <a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-e-outros-parametros-para-outra-funcao-em-javascript-_874.html">post sobre fun&ccedil;&otilde;es como par&acirc;metro de outras fun&ccedil;&otilde;es no <em>javascript</em></a>, vou mostrar como fazer para passar uma s&eacute;rie de fun&ccedil;&otilde;es para determinados fins - como em caso de sucesso, em caso de falha, etc...</p>
<p>Onde sempre vemos isso? <strong>Frameworks</strong> como <em>jQuery</em> e <em>Prototype</em> d&atilde;o a op&ccedil;&atilde;o de voc&ecirc; escolher uma fun&ccedil;&atilde;o de <em>callback</em> para sucesso de um evento, outra para falha, outra para quando se inicia o drag de um elemento na tela, e por a&iacute; vai. Isso &eacute; feito passando, ao inv&eacute;s de uma fun&ccedil;&atilde;o, uma lista de fun&ccedil;&otilde;es. No caso, para poder dar nome a elas, usamos a estrutura de <em>chave/valor</em> (<em>key/value</em>).</p>
<p>O exemplo abaixo explica como a fun&ccedil;&atilde;o <em>wrapper()</em> passa 2 par&acirc;metros e duas fun&ccedil;&otilde;es de <em>callback</em>: uma para sucesso, outra para falha. Na primeira chamada, a fun&ccedil;&atilde;o de <em>callback</em> chamada ser&aacute; a de sucesso, pois &eacute; poss&iacute;vel efetuar a rotina. No outro caso, dar&aacute; erro, ent&atilde;o ser&aacute; usada a fun&ccedil;&atilde;o de falha.</p>
<p><em>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br />
&lt;title&gt;Untitled Document&lt;/title&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
function wrapper(par1, par2) {<br />
&nbsp;&nbsp;&nbsp; //verifica se o &uacute;ltimo par&acirc;metro &eacute; uma fun&ccedil;&atilde;o para cham&aacute;-la;<br />
&nbsp;&nbsp;&nbsp; //os demais par&aacute;metros s&atilde;o repassados para a fun&ccedil;&atilde;o <br />
<br />
&nbsp;&nbsp;&nbsp; var lastArgument = arguments[arguments.length-1];<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Classe Math possue o m&eacute;todo max(), que retorna o maior valor entre dois par&acirc;metros<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var sum = Math.max(par1, par2);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //se n&atilde;o for erro, joga (throw) erro<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(isNaN(sum))<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw &quot;not a valid result&quot;;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //se chegar at&eacute; aqui, &eacute; um resultado v&aacute;lido e chama fun&ccedil;&atilde;o de sucesso<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lastArgument.onSuccess.call(this, sum);<br />
&nbsp;&nbsp;&nbsp; } catch(e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //se n&atilde;o, chama a fun&ccedil;&atilde;o de erro<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lastArgument.onFailure.call(this, e);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
function errorHandler(e) {<br />
&nbsp;&nbsp;&nbsp; alert(&quot;Error: &quot; + e);<br />
}<br />
<br />
function myFunction(sum) {<br />
&nbsp;&nbsp;&nbsp; alert(sum);<br />
}<br />
</em><em>wrapper(10, 2, {onSuccess: myFunction, onFailure:errorHandler});</em><em> //ser&aacute; chamado sucesso<br />
wrapper(10, &quot;a&quot;, {onSuccess: myFunction, onFailure:errorHandler}); //ser&aacute; chamado erro<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em><br />
&nbsp;</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/xsHmBDMG-Ew" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-funcoes-de-callback-em-javascript-para-sucesso-ou-erro_876.html</feedburner:origLink></item>
<item>
	<title>Passando uma função e outros parâmetros para outra função em javascript </title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/4TArH7Y3Bp4/passando-uma-funcao-e-outros-parametros-para-outra-funcao-em-javascript-_874.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-e-outros-parametros-para-outra-funcao-em-javascript-_874.html#comentar</comments>
	<pubDate> Tue, 10 Feb 2009 22:16:42 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-e-outros-parametros-para-outra-funcao-em-javascript-_874.html</guid>
	<description><![CDATA[Passar além de funções como parâmetro outraos parâmetros para outra função e executar a mesma usando o método call()&lt;br /&gt;
]]></description>
	<content:encoded><![CDATA[<p>Seguindo o que comecei a explicar nesse <a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-como-parametro-para-outra-funcao-em-javascript_866.html">post sobre como passar fun&ccedil;&otilde;es como par&acirc;metro para outra no javascript</a>, vou mostrar agora rapidamente como passar outros par&acirc;metros - texto, string, o que voc&ecirc; precisar.</p>
<p>Esse exemplo abaixo funciona para o caso de voc&ecirc; saber exatamente quantos par&acirc;metros ser&atilde;o passados para a fun&ccedil;&atilde;o e quantos recebidos pela fun&ccedil;&atilde;o de <em>callback</em>.</p>
<p><em>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br />
&lt;title&gt;Untitled Document&lt;/title&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
function wrapper(par1, par2) {<br />
&nbsp;&nbsp;&nbsp; //verifica se o &uacute;ltimo par&acirc;metro &eacute; uma fun&ccedil;&atilde;o para cham&aacute;-la;<br />
&nbsp;&nbsp;&nbsp; //os demais par&aacute;metros s&atilde;o repassados para a fun&ccedil;&atilde;o &nbsp; <br />
&nbsp;&nbsp;&nbsp; if(arguments.length&gt;0) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var lastArgument = arguments[arguments.length-1];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(typeof(lastArgument)==&quot;function&quot;) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lastArgument.call(this, par1, par2);&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
function myFunction(par1, par2) {<br />
&nbsp;&nbsp;&nbsp; alert(par1);<br />
&nbsp;&nbsp;&nbsp; alert(par2);<br />
}<br />
wrapper(&quot;a&quot;, &quot;b&quot;, myFunction);<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p>
<p>O exemplo funciona da seguinte forma: a fun&ccedil;&atilde;o <em>wrapper</em> recebe duas strings e uma fun&ccedil;&atilde;o. Nela, verifica-se se o &uacute;ltimo par&acirc;metro &eacute; uma func&atilde;o e, se for, ela chama essa fun&ccedil;&atilde;o passando essas duas strings como par&acirc;metro.<br />
Note que esse exemplo vale para a fun&ccedil;&atilde;o sendo passada como &uacute;ltimo par&acirc;metro. Ela pode ser passada em outra ordem, mas a&iacute; deve ser feita a devida checagem.</p>
<p>Nos pr&oacute;ximos post, mostro como receber uma quantidade aleat&oacute;ria de par&acirc;metros e tratar de repass&aacute;-los (usando <em>JSON</em>) e como definir fun&ccedil;&otilde;es de callback espec&iacute;ficas dependendo de condi&ccedil;&otilde;es na wrapper.</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/4TArH7Y3Bp4" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-e-outros-parametros-para-outra-funcao-em-javascript-_874.html</feedburner:origLink></item>
<item>
	<title>Passando uma função como parâmetro para outra função em javascript</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/hEdpJq7tJhs/passando-uma-funcao-como-parametro-para-outra-funcao-em-javascript_866.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-como-parametro-para-outra-funcao-em-javascript_866.html#comentar</comments>
	<pubDate> Mon, 9 Feb 2009 11:37:43 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-como-parametro-para-outra-funcao-em-javascript_866.html</guid>
	<description><![CDATA[Passar funções como parâmetro para outra função e executar a mesma usando o método call()]]></description>
	<content:encoded><![CDATA[<p>Uma coisa que &eacute; muito comum, com a populariza&ccedil;&atilde;o dos<em> frameworks/bibliotecas javascript</em>, &eacute; passar uma fun&ccedil;&atilde;o como par&acirc;metro para outra, e essa fun&ccedil;&atilde;o ser executada depois de algum <em>evento</em> (finalizar uma requsi&ccedil;&atilde;o ass&iacute;ncrona ou acabar o <em>drag&quot;n drop</em> de um elemento, por exemplo).</p>
<p>Mas, como funciona isso? Simples: no <em>javascript</em>, uma <strong>function</strong> &eacute; um <strong>Object</strong> do <em>javascript</em>. Com isso, ela pode ser passada como par&acirc;metro com a mesma sintaxe de uma vari&aacute;vel. Um bom exemplo &eacute;:</p>
<p><em>function myFunction() {<br />
&nbsp; //faz algo<br />
}</em></p>
<p><em>function wrapper(parameter) {<br />
&nbsp;//faz algo<br />
}</em></p>
<p><em>wrapper(myFunction);</em></p>
<p>No caso, passamos para a fun&ccedil;&atilde;o wrapper a fun&ccedil;&atilde;o myFunction como par&acirc;metro.</p>
<p>Agora, como fazer para que essa fun&ccedil;&atilde;o seja chamada dentro da fun&ccedil;&atilde;o <em>wrapper</em>()? Toda fun&ccedil;&atilde;o do <em>javascript</em> tem alguns m&eacute;todos padr&atilde;o. Um deles &eacute; o <em>call</em>(), que com que a fun&ccedil;&atilde;o seja exetucada.</p>
<p><em>function wrapper(parameter) {<br />
&nbsp;&nbsp;&nbsp; parameter.<strong>call</strong>(); //executa parameter, que no caso &eacute; a fun&ccedil;&atilde;o passada como par&acirc;metro<br />
}</em></p>
<p>Uma boa pr&aacute;tica &eacute; checar se o par&acirc;metro &eacute; mesmo uma fun&ccedil;&atilde;o. Para isso, usamos a fun&ccedil;&atilde;o <em>typeof</em>() que verifica o tipo do objeto:</p>
<p><em>function wrapper(parameter) {<br />
&nbsp;&nbsp;&nbsp; if(<strong>typeof</strong>(parameter)==&quot;function&quot;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parameter.call();<br />
}</em></p>
<p>Segue abaixo o exemplo completo do c&oacute;digo para testes:</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Passando uma fun&ccedil;&atilde;o como par&acirc;metro para outra&lt;/title&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
function wrapper(parameter) {<br />
&nbsp;&nbsp;&nbsp; if(typeof(parameter)==&quot;function&quot;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parameter.call();<br />
}<br />
function myFunction() {<br />
&nbsp;&nbsp;&nbsp; alert(&quot;teste&quot;);<br />
}<br />
wrapper(myFunction);<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p>
<p>Ao rodar esse exemplo, dever&aacute; aparecer na tela um alert com o &quot;teste&quot; impresso.</p>
<p>No pr&oacute;ximo post vou explicar como passar al&eacute;m da fun&ccedil;&atilde;o outros par&acirc;metros e fazer com que a fun&ccedil;&atilde;o <em>wrapper</em>() reconhe&ccedil;a os mesmos e repasse para a fun&ccedil;&atilde;o <em>myFunction</em>().</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/hEdpJq7tJhs" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/passando-uma-funcao-como-parametro-para-outra-funcao-em-javascript_866.html</feedburner:origLink></item>
<item>
	<title>Crie um cronômetro em javascript</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/m7jUxZlfebc/crie-um-cronometro-em-javascript_863.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/crie-um-cronometro-em-javascript_863.html#comentar</comments>
	<pubDate> Thu, 5 Feb 2009 21:26:3 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/crie-um-cronometro-em-javascript_863.html</guid>
	<description><![CDATA[Classe javascript que implementa um cronômetro - útil para testes de performance]]></description>
	<content:encoded><![CDATA[<p>Como saber qual forma de implementar um c&oacute;digo em <strong>javascript</strong> roda mais r&aacute;pido, com melhor perfomance? Ou, ainda, qual <strong>browser</strong> interpreta um c&oacute;digo mais r&aacute;pido?</p>
<p>Criei uma classe bem simples: instancia-se ela, chama o m&eacute;todo <em>start</em>() para iniciar o cron&ocirc;metro e o <em>stop</em>() para parar. O <em>stop</em>() retorna a diferen&ccedil;a de tempo em segundos.</p>
<p>A implementa&ccedil;&atilde;o da classe &eacute;:</p>
<p><em>/*<br />
classe para contador de tempo<br />
*/<br />
function TimeCounter() {<br />
&nbsp;&nbsp;&nbsp; this.startDate = null;<br />
&nbsp;&nbsp;&nbsp; this.ellapsedTime = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //inicia o timer<br />
&nbsp;&nbsp;&nbsp; this.start = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.startDate = new Date();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp; para o timer e retorna a diferen&ccedil;a entre a hora atual e a em que foi startado/ dividindo<br />
&nbsp;&nbsp;&nbsp; por mil pois a diferen&ccedil;a &eacute; dada em milisegundos<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; this.stop = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (new Date() - this.startDate)/1000;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</em></p>
<p>Segue um uso da mesma; ao carregar a p&aacute;gina (<em>onload</em>() da janela) inicio o cron&ocirc;metro e crio 1000 <em>divs</em>, adicionando-as ao <em>body</em>. Ap&oacute;s acabar o la&ccedil;o, paro o cron&ocirc;metro. *fa&ccedil;a o teste em diversos <em>browsers</em> e veja a diferen&ccedil;a de performance</p>
<p><em>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br />
&lt;title&gt;Time Counter&lt;/title&gt;<br />
&lt;script type=&quot;application/javascript&quot;&gt;<br />
&nbsp;&nbsp;&nbsp; function TimeCounter() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.startDate = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.ellapsedTime = null;<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.start = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.startDate = new Date();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.stop = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (new Date() - this.startDate)/1000;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; var timeCounter = new TimeCounter();<br />
&nbsp;&nbsp;&nbsp; window.onload = function() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; timeCounter.start();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(var i=0; i&lt;1000; i++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var div = document.createElement(&quot;div&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; div.appendChild(document.createTextNode(i));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; document.body.appendChild(div);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert(timeCounter.stop());<br />
&nbsp;&nbsp;&nbsp; }<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;/body&gt;</em></p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/m7jUxZlfebc" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/crie-um-cronometro-em-javascript_863.html</feedburner:origLink></item>
<item>
	<title>Exiba seus últimos twits no seu blog</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/4nk0W4kBIcg/exiba-seus-ultimos-twits-no-seu-blog_857.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exiba-seus-ultimos-twits-no-seu-blog_857.html#comentar</comments>
	<pubDate> Mon, 2 Feb 2009 22:35:51 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exiba-seus-ultimos-twits-no-seu-blog_857.html</guid>
	<description><![CDATA[Apenas com javascript, exiba as últimas mensagens do seu Twitter no seu site/blog]]></description>
	<content:encoded><![CDATA[<p>Quer mostrar suas &uacute;ltimas mensagens enviadas no <em>Twitter</em> (<a href="http://www.andafter.org/publicacoes/twitter-o-que-e-como-usar-e-porque-usar_370.html">n&atilde;o sabe ainda o que &eacute; o Twitter</a>?) no seu site/blog? Sem nenhuma programa&ccedil;&atilde;o <strong>server-side</strong>?</p>
<p>Simples. O pr&oacute;prio pessoal do <em>Twitter</em> desenvolveu uma biblioteca <em>javascript</em> na qual voc&ecirc; s&oacute; precisa inserir o username (o usu&aacute;rio n&atilde;o pode ter as mensagens privadas) e dizer quantas mensagens quer exibir.</p>
<p><em>&lt;script type=&quot;text/javascript&quot; src=&quot;http://twitter.com/javascripts/blogger.js&quot;&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot; src=&quot;http://twitter.com/statuses/user_timeline/<span style="color: rgb(255, 0, 0);">nome_do_usuario</span>.json?callback=twitterCallback2&amp;amp;count=<span style="color: rgb(255, 0, 0);">quantidade</span>&quot;&gt;&lt;/script&gt;</em></p>
<p>Troque o nome_do_usuario pelo username do <em>Twitter</em> e o quantidade pela quantidade de mensagens.</p>
<p>Feito isso, crie uma lista ul com o id igual a twitter_update_list.<em> </em></p>
<p><em>&lt;ul id=&quot;twitter_update_list&quot;&gt;<br />
&lt;/ul&gt;</em></p>
<p>&Eacute; onde as mensagens ser&atilde;o exibidas!</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/4nk0W4kBIcg" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/exiba-seus-ultimos-twits-no-seu-blog_857.html</feedburner:origLink></item>
<item>
	<title>Usando a prototype - passo 8 - seletores CSS</title>
	<link>http://feedproxy.google.com/~r/ODesenvolvedor/~3/FKYjNmNq-Yw/usando-a-prototype-passo-8-seletores-css_849.html</link>
	<comments>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-a-prototype-passo-8-seletores-css_849.html#comentar</comments>
	<pubDate> Fri, 30 Jan 2009 11:29:50 -0300</pubDate>
	<dc:creator>And After</dc:creator>
	<dc:subject>design</dc:subject>
	<dc:subject>tecnologia</dc:subject>
	<guid isPermaLink="false">http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-a-prototype-passo-8-seletores-css_849.html</guid>
	<description><![CDATA[Como usar a função $$ para usar seletores CSS na prototype - semelhante a jQuery]]></description>
	<content:encoded><![CDATA[<p>Muito se fala da facilidade que a <em>jQuery</em> tem em usar a sintaxe de CSS para selecionar elementos do <em>DOM</em>, o que facilita a vida de quem tem forte conhecimento em <em>CSS</em>. Mas poucos sabem que a <strong>prototype</strong> desde a vers&atilde;o 1.5 (agora est&aacute; na 1.6.0.3) possui algo semelhante.</p>
<p>Enquanto na <em>jQuery</em> se utiliza o $ para fazer qualquer tipo de sele&ccedil;&atilde;o (retornando ou um objeto ou uma lista), na <strong>prototype</strong> se utiliza o $ para selecionar um objeto pelo id dele e a fun&ccedil;&atilde;o <strong>$$</strong> para selecionar pelas regras do <em>CSS</em>, retornando um objeto<a href="http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-a-prototype-passo-3-arrays-e-a-classe-enumerable_602.html"> Array da prototype</a> (que &eacute; um objeto que extende o Array do javascript).</p>
<p>Vamos a um exemplo pr&aacute;tico. Tendo o seguinte html:</p>
<p><em>&lt;div&gt;<br />
&nbsp;&nbsp; &lt;ul id=&quot;main-nav&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;abc&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;fgh&lt;/li&gt;<br />
&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp;&nbsp; &lt;ul id=&quot;nav&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;abc&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;fgh&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;abc&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;fgh&lt;/li&gt;<br />
&nbsp;&nbsp; &lt;/ul&gt;<br />
&lt;/div&gt;</em></p>
<p>usando a fun&ccedil;&atilde;o <strong>$$</strong>, voc&ecirc; pode tentar retornar os elementos da seguinte forma:</p>
<p><em>$$(&quot;div ul&quot;); //retorna as duas listas<br />
$$(&quot;div.container ul&quot;); //n&atilde;o retorna<br />
$$(&quot;div ul#main-nav&quot;); //retorna as lista com id main-nav<br />
$$(&quot;div ul#main-nav li&quot;); //retorna os itens de lista da lista com id main-nav<br />
$$(&quot;div ul#main-nav li:first-child&quot;); //retorna o primeiro item de lista da lista com id main-nav</em></p>
<p>A vers&atilde;o 1.6 (atual) suporta seletores do <em>CSS3</em>. Veja na<a href="http://www.prototypejs.org/api/utility/dollar-dollar"> documenta&ccedil;&atilde;o oficial quais s&atilde;o eles</a>.</p>
<p>Uma coisa importante &eacute; notar que<strong> essa implementa&ccedil;&atilde;o &eacute; totalmente crossbrowser e que n&atilde;o est&aacute; ligada a capacidade do browser de interpretar o CSS</strong> (ou seja, um browser que n&atilde;o entende seletores do CSS3 consegue pela prototype usar a fun&ccedil;&atilde;o $$ igualmente a um browser que interprete o CSS3).</p>
<p>Quer ver esse c&oacute;digo funcionando? Veja <a href="http://www.chrisb.com.br/files/testeprot.htm">nesse html</a>.</p><img src="http://feeds.feedburner.com/~r/ODesenvolvedor/~4/FKYjNmNq-Yw" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.andafter.org/blogs/odesenvolvedor/publicacoes/usando-a-prototype-passo-8-seletores-css_849.html</feedburner:origLink></item>
</channel>
</rss>
