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

<channel>
	<title>JulioGreff.net &#187; Destaques</title>
	<atom:link href="http://juliogreff.net/categoria/destaques/feed/" rel="self" type="application/rss+xml" />
	<link>http://juliogreff.net</link>
	<description>A mesma web, um novo estilo de desenvolvimento</description>
	<lastBuildDate>Sat, 07 May 2011 17:07:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>O Internet Explorer 6 é culpa nossa!</title>
		<link>http://juliogreff.net/o-internet-explorer-6-e-culpa-nossa/</link>
		<comments>http://juliogreff.net/o-internet-explorer-6-e-culpa-nossa/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 11:20:24 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[Usabilidade/Acessibilidade]]></category>
		<category><![CDATA[ie6]]></category>

		<guid isPermaLink="false">http://juliogreff.net/?p=368</guid>
		<description><![CDATA[Não há nada que um desenvolvedor web odeie mais do que o Internet Explorer 6. Por mais que desejemos, parece que ele não vai embora. Entretanto, e por incrível que pareça, a permanência do Internet Explorer 6 no mercado é culpa nossa! Logo que o IE7 foi lançado em 2006, parecia algo lógico manter a [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/inneroptions/' rel='bookmark' title='Permanent Link: innerOptions'>innerOptions</a></li>
<li><a href='http://juliogreff.net/historico-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Histórico para Navegação via JavaScript'>Histórico para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/hijax-ajax-acessivel/' rel='bookmark' title='Permanent Link: Hijax: Ajax Acessível'>Hijax: Ajax Acessível</a></li>
<li><a href='http://juliogreff.net/ajax-vs-acessibilidade/' rel='bookmark' title='Permanent Link: Ajax vs. Acessibilidade'>Ajax vs. Acessibilidade</a></li>
<li><a href='http://juliogreff.net/interfaces-de-usuario-com-javascript/' rel='bookmark' title='Permanent Link: Interfaces de Usuário com JavaScript'>Interfaces de Usuário com JavaScript</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Não há nada que um desenvolvedor web odeie mais do que o Internet Explorer 6. Por mais que desejemos, parece que ele não vai embora. Entretanto, e por incrível que pareça, a permanência do Internet Explorer 6 no mercado é culpa nossa!</p>
<p class="center"><img title="O Internet Explorer 6 precisa morrer!" src="http://juliogreff.net/wp-uploads/ie6.jpg" alt="O Internet Explorer 6 precisa morrer!" /></p>
<p>Logo que o IE7 foi lançado em 2006, parecia algo lógico manter a compatibilidade com o IE6 por algum tempo, por mais doloroso que isso fosse. <a title="People don’t know what a web browser is" rel="external" href="http://www.wisdump.com/web-experience/people-dont-know-web-browser-ie-firefox-opera-updates/">Usuários comuns mal sabem diferenciar entre um browser e o Google</a>, atualizar para o IE7 nos primeiros dias seria pedir demais. O estranho é que, até hoje, quase <strong>3 anos</strong> depois, muitos de nós continuam a dar suporte ao browser. Perdemos tempo, paciência e alguns anos de vida corrigindo bugs e assegurando que tudo funcione relativamente bem. Isso significa que nivelamos nosso desenvolvimento por baixo, deixando de usar coisas como PNGs transparentes, muitos seletores CSS e scripts mais eficientes, só para começar a listar alguns. Algo está errado aí, você não acha?</p>
<p>Mas se o browser é usado pelo usuário, como isso pode ser culpa nossa? Simples: enquanto tudo funcionar, o usuário não fará o menor esforço para atualizar seu software. <strong>O usuário é acomodado</strong> (pra não dizer ignorante). É preciso tomar atitudes para que ele se atente que seu software está muito ultrapassado, e essa atitude cabe a nós. Por pressão dos clientes e dos nossos superiores, o máximo que conseguimos foram <a title="Atualize seu navegador - Campanha para eliminar browsers antigos do mercado" rel="external" href="http://imasters.uol.com.br/crossbrowser/pt-br/">barrinhas sutis no topo da página</a> que, convenhamos, não servem para nada mais do que decoração e alívo de consciência. Será preciso muito mais que isso.</p>
<p class="center"><img title="Sweet! IE6! After this, maybe you can go chat on AOL, you fucking dinosaur!" src="http://juliogreff.net/wp-uploads/ie6-dinosaur.png" alt="Sweet! IE6! After this, maybe you can go chat on AOL, you fucking dinosaur!" /></p>
<p>Até que as coisas deixem de funcionar, o usuário não fará nada. Fato. Em um mundo ideal, os sites de maior tráfego não dariam mais suporte a browsers legados, e a evolução começaria a acontecer. Como não vivemos em um mundo ideal, precisamos dar o nosso jeito. Educar o cliente, os parentes, os amigos, pode até parecer legal, mas é numa escala muito pequena. Em meus projetos pessoais, coisas como a singela tela acima começarão a aparecer. Como freelancer, o suporte ao IE6 terá seu preço (e as telas de aviso serão um pouco mais educadas). Na agência onde trabalho ainda enfrento alguns problemas, mas na maioria dos projetos o IE6 é completamente ignorado, e simpáticas telas explicando como atualizar o browser estão sendo implementadas.</p>
<p><strong>Não existe mais motivo algum para a existência do IE6</strong>. Não deveriam mais existir motivos para mantermos a compatibilidade. Eu seria um profissional muito mais feliz se, em 2010, eu nunca mais ouça falar em Internet Explorer 6. Acredito que esse seja o desejo de muitos, e espero que ele consiga ser realizado dessa vez. Vamos fazer nossa parte e acabar com o monstro que criamos?</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/inneroptions/' rel='bookmark' title='Permanent Link: innerOptions'>innerOptions</a></li>
<li><a href='http://juliogreff.net/historico-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Histórico para Navegação via JavaScript'>Histórico para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/hijax-ajax-acessivel/' rel='bookmark' title='Permanent Link: Hijax: Ajax Acessível'>Hijax: Ajax Acessível</a></li>
<li><a href='http://juliogreff.net/ajax-vs-acessibilidade/' rel='bookmark' title='Permanent Link: Ajax vs. Acessibilidade'>Ajax vs. Acessibilidade</a></li>
<li><a href='http://juliogreff.net/interfaces-de-usuario-com-javascript/' rel='bookmark' title='Permanent Link: Interfaces de Usuário com JavaScript'>Interfaces de Usuário com JavaScript</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/o-internet-explorer-6-e-culpa-nossa/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>7 coisas que todo desenvolvedor web deveria saber</title>
		<link>http://juliogreff.net/coisas-que-desenvolvedores-web-deveriam-saber/</link>
		<comments>http://juliogreff.net/coisas-que-desenvolvedores-web-deveriam-saber/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 17:22:13 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[Diversos]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[tecnologias]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://juliogreff.net/?p=307</guid>
		<description><![CDATA[Desenvolvimento Web é coisa séria, e evoluiu muito em termos de maturidade e complexidade. Para fazer frente ao crescente níveis de exigência, nós, desenvolvedores, devemos estar aprendendo a todo instante. Não importa qual campo você deseja seguir, seja ele no lado cliente ou servidor. Mas acredito que existam coisas que todo desenvolvedor web de verdade [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/qual-curso-devo-fazer-pra-me-tornar-um-desenvolvedor-web/' rel='bookmark' title='Permanent Link: Qual curso devo fazer pra me tornar um desenvolvedor web?'>Qual curso devo fazer pra me tornar um desenvolvedor web?</a></li>
<li><a href='http://juliogreff.net/comodismo-vs-inovacao/' rel='bookmark' title='Permanent Link: Comodismo vs. Inovação'>Comodismo vs. Inovação</a></li>
<li><a href='http://juliogreff.net/e-a-tal-da-web-20/' rel='bookmark' title='Permanent Link: E a tal da Web 2.0?'>E a tal da Web 2.0?</a></li>
<li><a href='http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/' rel='bookmark' title='Permanent Link: CodeCast #1 &#8211; Impressões sobre Início de Carreira'>CodeCast #1 &#8211; Impressões sobre Início de Carreira</a></li>
<li><a href='http://juliogreff.net/responsexml/' rel='bookmark' title='Permanent Link: ResponseXML'>ResponseXML</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Desenvolvimento Web é coisa séria, e evoluiu muito em termos de maturidade e complexidade. Para fazer frente ao crescente níveis de exigência, nós, desenvolvedores, devemos estar aprendendo a todo instante. Não importa qual campo você deseja seguir, seja ele no lado cliente ou servidor. Mas acredito que existam coisas que todo desenvolvedor web de verdade deveria saber.</p>
<h3>Web Standards</h3>
<p>Hoje em dia, o mínimo que se espera de um bom desenvolvedor web é o conhecimento dos <strong>Web Standards</strong>, XHTML e CSS. Eles contribuem para a criação de documentos mais consistentes entre si, mais compatíveis e de manutenção extremamente mais simples. Aliás, o conhecimento dos padrões não é mais um diferencial como era há alguns anos atrás, mas sim um requisito básico. Se hoje sonhamos com a web semântica, os padrões web são o primeiro passo. Com documentos mais semânticos, temos mais acessibilidade e também mais relevância, principalmente no que diz respeito a motores de busca.</p>
<p>Mesmo depois de muita evangelização, ainda temos desenvolvedores que acabam de descobrir as maravilhas do mundo validado. Também temos aqueles que não fazem a mínima idéia do que isso signifique, ou que não tem o mínimo interesse em aprender. Se você é um desses, hora de rever seus conceitos&#8230;</p>
<h3>JavaScript</h3>
<p>O <strong>JavaScript</strong>, apesar de ter sido muito injustiçado no passado, é uma linguagem onipresente, e de extrema importância. Qualquer usuário tem pelo menos um interpretador instalado em seu computador. Além do mais, ela é a <strong>única linguagem client-side</strong> disponível, e permanecerá assim por um bom tempo.</p>
<p>JavaScript vai ser a <a title="5 razões pelas quais JavaScript pode ser a próxima grande linguagem" rel="external" href="http://logbr.reflectivesurface.com/2007/10/30/5-razoes-pelas-quais-javascript-pode-ser-a-proxima-grande-linguagem/">próxima grande linguagem</a>. Apesar de ainda estarmos longe de resultados surpreendentes, caminhamos rápido nesse sentido. Muita coisa que antigamente só era possível com Flash hoje é feita com JavaScript.</p>
<p>Além da própria linguagem, aprenda a usar alguma biblioteca, como <a title="Mootools" rel="external" href="http://mootools.net/">Mootools</a>, <a title="jQuery" rel="external" href="http://jquery.com/">jQuery</a> ou <a title="Prototype" rel="external" href="http://prototypejs.org/">Prototype</a>. Aliado a essas ferramentas, você poderá criar aplicações muito mais interessantes em muito menos tempo. Mas atenção: não aprenda somente a biblioteca, sem aprender antes JavaScript puro. Afinal, <a title="jQuery é bom para designers" rel="external" href="http://www.tableless.com.br/jquery-e-bom-para-designers">saber só jQuery é coisa de designer</a>.</p>
<h3>Expressões Regulares</h3>
<p>Um simples replace nem sempre é suficiente quando trabalhamos com manipulação de textos. Aí entram as <strong>Expressões Regulares</strong>, poderosa ferramenta que todos conhecem, alguns usam, e poucos realmente sabem. Seja em PHP, Ruby, Python ou mesmo JavaScript, algum dia você precisará delas.</p>
<p>Se você leva desenvolvimento a sério, dedique um tempo a aprender expressões regulares (<a title="Expressões Regulares - Uma Abordagem Divertida" rel="external" href="http://www.piazinho.com.br/">Expressões Regulares &#8211; Uma Abordagem Divertida</a> é um bom começo!). Além de uma ferramenta de desenvolvimento, elas podem se tornar ferramentas de produtividade. Se você usa IDEs com suporte a busca e substituição com expressões regulares, pode se beneficiar muito disso.</p>
<h3>Controle de Versão</h3>
<p>Para alguns, o <strong>Controle de Versão</strong> mudou completamente, e para a melhor, a forma de trabalhar. Para outros, parece simplesmente inútil, principalmente para quem trabalha sozinho. Seja CVS, SVN, GIT, Mercurial ou qualquer outro, o controle de versão, aliado a ferramentas como o <a title="The Trac Project" rel="external" href="http://trac.edgewall.org/">Trac</a>, pode fazer maravilhas. Além de manter controle de suas alterações, podendo sempre voltar atrás caso alguma modificação dê errado ou mesmo quando o cliente não aprova, você pode manter um controle de sua produtividade, analisando quantos <em>commits</em> foram feitos em quanto tempo, quantos tickets foram fechados, quantos ainda permanecem pendentes.</p>
<p>Desde que passei a utilizar SVN em alguns projetos, como no próprio Spaghetti, notei uma grande melhora no controle sobre o código. Nunca mais pensei duas vezes em apagar grandes blocos de código pensando que eles poderiam ser úteis outra vez (e geralmente nunca seriam realmente necessários). Uma excelente forma de analisar seu progresso, uma excelente forma de backup, uma excelente forma de manter seu código sincronizado. Esqueça aquele colega que tem uma versão ultrapassada de seu código e sobrescreve partes importantes. Quando passei a utilizar ferramentas de tracking, bugs não eram esquecidos, idéias estavam sempre à mão. Digo, como muitos por aí: isso <strong>realmente</strong> mudou a minha maneira de desenvolver.</p>
<h3>MVC</h3>
<p>O <strong>Model-View-Controller</strong>, ou <strong>MVC</strong> para os íntimos, nunca fez tanto sentido quanto na web. Depois do <a title="Ruby on Rails" rel="external" href="http://rubyonrails.org/">Ruby on Rails</a>, virou quase um requisito básico para o desenvolvimento de bons projetos. E desde então, <a title="Desenvolver com Rails não tem graça" href="http://juliogreff.net/desenvolver-com-rails-nao-tem-graca/">desenvolver não tem mais graça</a>. Além disso, a separação de aplicações nessas 3 camadas torna o desenvolvimento e manutenção muito mais simples.</p>
<p>Se você não quer ficar para trás, <strong>adote seu framework</strong>. O <em>pattern</em> é usado na maioria deles, e de brinde você ganha muita produtividade. <a title="Frameworks: Por um PHP Menos Ruim" href="http://juliogreff.net/frameworks-por-um-php-menos-ruim/">Frameworks tornam as linguagens menos ruins</a>. Se você usa PHP, eu sugeriria o <a title="Spaghetti* Framework" rel="external" href="http://trac.spaghettiphp.org/">Spaghetti</a>. Se você usa Ruby ou Python, e é seu primeiro contato com frameworks, siga a tendência e adote Rails ou <a title="Django" rel="external" href="http://djangoproject.com/">Django</a>. Se você é corajoso, faça como fizemos na minha agência: crie seu próprio framework. Usando algum framework ou não, o que importa é pegar o espírito da coisa.</p>
<h3>SQL</h3>
<p>Mesmo com toda a flexibilidade e abstração da camada de dados que os frameworks MVC nos oferecem, <strong>SQL</strong> ainda é necessário. Apesar de você não vê-lo, ele ainda está lá. Consultas complexas ou mais específicas nem sempre são disponibilizadas pelos frameworks, e sempre pode haver a necessidade de uma incursão via terminal, para tarefas de manutenção, por exemplo.</p>
<p>Talvez você não acredite no retorno que isso pode trazer. Até ter nas mãos uma aplicação gigante e extremamente dependente de banco de dados, onde as consultas devem ser otimizadas ao máximo para minimizar a carga do servidor. Você não quer sua aplicação baleiando por você não saber SQL, quer?</p>
<h3>Desenvolvimento Guiado a Testes</h3>
<p><strong>Test Driven Development</strong>, ou simplesmente <strong>TDD</strong>, é, na minha opinião, a melhor maneira de manter seu código livre de bugs. Fazer o desenvolvimento guiado a testes significa desenvolver o teste antes da funcionalidade. A cada iteração, os testes são rodados novamente, de maneira automática, e você sempre saberá se alguma modificação quebrou o restante do código.</p>
<p>Sem testes automatizados, aplicações nunca são testadas como deveriam. São tarefas repetitivas e cansativas. Com o auxílio de ferramentas de testes, eles podem ser rodados várias vezes, certificando de que tudo está correndo bem. Se um novo bug é descoberto, um novo teste é criado, as modificações são feitas, e você terá a certeza de que o problema foi resolvido para todo o sempre, sem quebrar o restante da aplicação. E convenhamos, não há nada pior do que bugs&#8230;</p>
<p>Não é obrigatório que um desenvolvedor saiba tudo isso, embora eu considere extremamente importante, mesmo alguns não sendo necessários todos os dias, todos podem melhorar nossa maneira de trabalhar. Ainda não domino todos os itens citados, mas tenho um bom conhecimento em todos eles. O que importa mesmo é buscar isso, e <strong>sempre continuar aprendendo</strong>. Mexa-se! Você não quer ficar para trás, quer?</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/qual-curso-devo-fazer-pra-me-tornar-um-desenvolvedor-web/' rel='bookmark' title='Permanent Link: Qual curso devo fazer pra me tornar um desenvolvedor web?'>Qual curso devo fazer pra me tornar um desenvolvedor web?</a></li>
<li><a href='http://juliogreff.net/comodismo-vs-inovacao/' rel='bookmark' title='Permanent Link: Comodismo vs. Inovação'>Comodismo vs. Inovação</a></li>
<li><a href='http://juliogreff.net/e-a-tal-da-web-20/' rel='bookmark' title='Permanent Link: E a tal da Web 2.0?'>E a tal da Web 2.0?</a></li>
<li><a href='http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/' rel='bookmark' title='Permanent Link: CodeCast #1 &#8211; Impressões sobre Início de Carreira'>CodeCast #1 &#8211; Impressões sobre Início de Carreira</a></li>
<li><a href='http://juliogreff.net/responsexml/' rel='bookmark' title='Permanent Link: ResponseXML'>ResponseXML</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/coisas-que-desenvolvedores-web-deveriam-saber/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Interfaces de Usuário com JavaScript</title>
		<link>http://juliogreff.net/interfaces-de-usuario-com-javascript/</link>
		<comments>http://juliogreff.net/interfaces-de-usuario-com-javascript/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 11:00:42 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[ext]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/?p=185</guid>
		<description><![CDATA[A web vai se tornando uma plataforma cada vez mais próximas das aplicações desktop que temos. Temos várias aplicações por aí para provar isso. Mas aos olhos do usuário, uma aplicação só com XHTML+CSS às vezes pode não ser tão interessante. De uns tempos pra cá, entretanto, várias bibliotecas surgiram para acabar com esse problema, [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-vs-jquery/' rel='bookmark' title='Permanent Link: Mootools vs. jQuery'>Mootools vs. jQuery</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
<li><a href='http://juliogreff.net/historico-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Histórico para Navegação via JavaScript'>Histórico para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/estatisticas-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Estatísticas para Navegação via JavaScript'>Estatísticas para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/jquery-segundas-impressoes/' rel='bookmark' title='Permanent Link: jQuery &#8211; Segundas Impressões'>jQuery &#8211; Segundas Impressões</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>A web vai se tornando uma plataforma cada vez mais próximas das aplicações desktop que temos. Temos várias aplicações por aí para provar isso. Mas aos olhos do usuário, uma aplicação só com XHTML+CSS às vezes pode não ser tão interessante. De uns tempos pra cá, entretanto, várias bibliotecas surgiram para acabar com esse problema, e trazer interfaces de usuários realmente interessantes. Preparado para algo fora de série?</p>
<p>O número dessas bibliotecas é incontável, algumas mais simples, outras mais complexas, outras mais famosas, algumas nem tanto. Fiz uma breve pesquisa, e trouxe as mais conhecidas (e algumas nem tanto) para quem ainda não teve a oportunidade de conhecer. Só para lembrar, hoje não vou tratar sobre o uso dessas bibliotecas, isso fica pra uma próxima oportunidade, já que a idéia é um pouco extensa.</p>
<h3>ExtJS</h3>
<p>A <a href="http://extjs.com/" title="ExtJS" rel="external">ExtJS</a> é de longe a biblioteca mais conhecida. Provavelmente você já deve ter pelo menos ouvido falar sobre, a menos que você viva na Sibéria. Também acredito que deva ser uma das mais antigas, e por isso uma das mais completas também.</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/extjs.png" alt="ExtJS" title="ExtJS" /></p>
<p>Seu <a href="http://extjs.com/deploy/dev/examples/samples.html" title="ExtJS - Demos and Samples" rel="external">visual é espetacular</a>, mas tem seu preço: ela é muito lenta. Todos os efeitos de transparência, os drag &#8216;n&#8217; drops, tudo isso exige muito do pobre navegador. Pense bem antes de escolher onde usá-la, faça somente se for necessário, nunca para simples &#8220;enfeites&#8221;. Lenta, mas uma obra de arte.</p>
<p>E os desenvolvedores <abbr title="Adobe Integrated Runtime">AIR</abbr> não precisam ficar tristes: há até um <a href="http://extjs.com/blog/2008/02/24/tasks2/" title="Simple Tasks - AIR Application" rel="external">demo</a> do bichinho em funcionamento. Ainda não tive muito tempo com o AIR, mas acredito que a questão da velocidade não seja tão crítica quanto em um navegador, quem puder falar sobre, agradeço.</p>
<h3>Yahoo User Interface</h3>
<p class="left"><img src="http://juliogreff.net/wp-uploads/yui.png" alt="Yahoo User Interface" title="Yahoo User Interface" /></p>
<p>A <a href="http://developer.yahoo.com/yui/" title="Yahoo User Interface" rel="external">Yahoo User Interface</a>, ou YUI, deve ser a primeira user interface a se popularizar. Foi a base do nascimento da ExtJS. Tem lá seus defeitos, como o prefixo YUI para todos os métodos, mas tem um poder imenso. Me parece ser bem mais leve que a Ext, e usa gráficos bem mais simples também.</p>
<p>A documentação é um dos pontos fortes. Mantida pela comunidade de desenvolvedores do Yahoo, você nunca estará sozinho. Apesar disso, achei o site um pouco confuso para encontrar alguma coisa, principalmente os demos. Mas o material está lá, e há muito&#8230;</p>
<h3>MochaUI</h3>
<p>Ainda beta, a <a href="http://mochaui.com/" rel="external" title="MochaUI">MochaUI</a> seria a minha preferida. Adivinhem por quê? Sim, baseada na <a href="http://mootools.net/" title="Mootools Library" rel="external">Mootools</a>&#8230; A <a href="http://mochaui.com/demo/" title="MochaUI - Demo" rel="external">demonstração</a> realmente me deixou impressionado, talvez tenha sido o relógio.</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/mochaui.png" title="MochaUI" alt="MochaUI" /></p>
<p>Aparenta ser bem leve, tanto que na demonstração você pode modificar propriedades das janelas sem travar o navegador. Usa gráficos simples, mas não menos atraentes. De longe, seria a primeira que eu escolheria para trabalhar (sim, opinião extremamente parcial). Mal posso esperar pela versão 1.0!</p>
<h3>Dijit</h3>
<p>Falando em <a href="http://dojotoolkit.org/" title="Dojo Toolkit" rel="external">Dojo</a>, nem é preciso dizer muito. O framework mais abrangente que conheço também conta com sua interface de usuário, o <a href="http://dojotoolkit.org/projects/dijit" title="Dijit" rel="external">Dijit</a>. Não consegui encontrar demonstrações no site, mas as imagens mostram algo realmente promissor.</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/dijit.gif" alt="Dijit" title="Dijit" /></p>
<p>Lendo a descrição do projeto, você verá que o Dijit não é <em>apenas</em> uma simples interface de usuário. É extremamente customizável, extensível, acessível e localizável. O que isso significa? Bem, dê asas à imaginação, o céu é o limite&#8230;</p>
<h3>jQuery UI</h3>
<p>O <a href="http://ui.jquery.com/" title="jQuery UI" rel="external">jQuery UI</a>, bem jovem ainda, também é espetacular. Baseado na brilhante <a href="http://jquery.com/" rel="external" title="jQuery">jQuery</a>, tem tudo para deixar qualquer um de boca aberta. A <a href="http://ui.jquery.com/repository/real-world/effects/" title="jQuery UI Effects" rel="external">demonstração de efeitos</a>, por exemplo, me impressionou muito. A própria tela de demonstrações é uma obra de arte.</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/jqueryui.png" title="jQuery UI" alt="jQuery UI" /></p>
<p>Apesar de baseada no jQuery, achei a biblioteca ligeiramente lenta. Talvez tenha sido impressão, mas não esperava isso de jQuery. Entretanto, pela sua idade, é muito madura, muito poderosa. Se jQuery não havia <a href="http://juliogreff.net/jquery-segundas-impressões/" title="jQuery - Segundas Impressões">me chamado atenção</a> ainda&#8230;</p>
<h3>Prototype UI</h3>
<p class="center"><img src="http://juliogreff.net/wp-uploads/prototypeui.png" title="Prototype UI" alt="Prototype UI" /></p>
<p>Até então desconhecido pra mim, o release candidate <a href="http://www.prototype-ui.com/" title="Prototype UI" rel="external">Prototype UI</a> não conseguiu me chamar a atenção. Não por ser baseado em <a href="http://www.prototypejs.org/" title="Prototype" rel="external">Prototype</a> e <a href="http://script.aculo.us/" title="Scriptaculous" rel="external">Scriptaculous</a> (o que já considero um ponto contra), nem por usar um tema do Mac, mas por parecer muito prematura. Os demos apresentados são bonitinhos, mas um tanto &#8220;crus&#8221;. Prefiro não dar minha opinião, vai que o negócio vire um Ext-killer?</p>
<h3>SproutCore</h3>
<p class="center"><img src="http://juliogreff.net/wp-uploads/sproutcore.png" title="SproutCore" alt="SproutCore" /></p>
<p>O <a href="http://www.sproutcore.com/" title="SproutCore" rel="external">SproutCore</a>, iniciativa da Apple, tem uma proposta um tanto &#8220;utópica&#8221;, pelo que entendi é trazer o Cocoa para a web. As demonstrações são interessantes, mas o pobre navegador sofreu as conseqüências. Esse negócio consegue ser mais pesado que a própria Ext! Além disso, vi mais opiniões <a href="http://www.pixelbox.net/2008/06/17/sprout-core/" title="SproutCore (Pixelbox)" rel="external">negativas</a> do que positivas&#8230;</p>
<h3>UIZE</h3>
<p class="center"><img src="http://juliogreff.net/wp-uploads/uize.png" title="UIZE" alt="UIZE" /></p>
<p>O <a href="http://www.uize.com/" title="UIZE" rel="external">UIZE</a> (pronuncia-se &#8220;you eyes&#8221;) é outro que nunca havia sido apresentado a mim. Concordo com o pessoal do <a href="http://ajaxian.com/archives/uize-javascript-ui-toolkit" title="UIZE: JavaScript UI Toolkit" rel="external">Ajaxian</a>: são os efeitos mais legais que já vi. Apesar disso, a biblioteca ainda necessita muito mais trabalho, já que tem poucos recursos (poucos, mas legais).</p>
<p>Não tive a oportunidade de trabalhar por algum tempo com nenhuma dessas bibliotecas, e nem falar muito sobre as quais tenho mais experiência. Somente uma breve opinião sobre cada uma. Caso tenha esquecido de alguma, por favor, cite-a nos comentários, terei prazer em falar um pouquinho. Só uma precaução: cuidado onde você irá usar tudo isso&#8230; Existem aplicações e aplicações. Até mais!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-vs-jquery/' rel='bookmark' title='Permanent Link: Mootools vs. jQuery'>Mootools vs. jQuery</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
<li><a href='http://juliogreff.net/historico-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Histórico para Navegação via JavaScript'>Histórico para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/estatisticas-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Estatísticas para Navegação via JavaScript'>Estatísticas para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/jquery-segundas-impressoes/' rel='bookmark' title='Permanent Link: jQuery &#8211; Segundas Impressões'>jQuery &#8211; Segundas Impressões</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/interfaces-de-usuario-com-javascript/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Frameworks: Por um PHP Menos Ruim</title>
		<link>http://juliogreff.net/frameworks-por-um-php-menos-ruim/</link>
		<comments>http://juliogreff.net/frameworks-por-um-php-menos-ruim/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 01:04:04 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[Server-Side]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/?p=157</guid>
		<description><![CDATA[O PHP não é a linguagem mais &#8220;cool&#8221; para se desenvolver para web no momento. Outras linguagens estão tomando o posto por serem mais compatíveis com o ambiente web que temos hoje. Um dos fatores que mais influencia nessa &#8220;tomada de território&#8221; é a agilidade no desenvolvimento que, aliado aos frameworks dessas linguagens, tornam o [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/json-no-php/' rel='bookmark' title='Permanent Link: JSON no PHP'>JSON no PHP</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/pense-mais-e-codifique-menos/' rel='bookmark' title='Permanent Link: Pense Mais e Codifique Menos'>Pense Mais e Codifique Menos</a></li>
<li><a href='http://juliogreff.net/por-que-projetos-morrem/' rel='bookmark' title='Permanent Link: Por que projetos &#8220;morrem&#8221;?'>Por que projetos &#8220;morrem&#8221;?</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="left">
<img src="http://juliogreff.net/wp-uploads/frameworks-por-um-php-menos-ruim.jpg" title="Frameworks - Por Um PHP Menos Ruim" alt="Frameworks - Por Um PHP Menos Ruim" />
</p>
<p>O PHP não é a linguagem mais &#8220;cool&#8221; para se desenvolver para web no momento. Outras linguagens estão tomando o posto por serem mais compatíveis com o ambiente web que temos hoje. Um dos fatores que mais influencia nessa &#8220;tomada de território&#8221; é a agilidade no desenvolvimento que, aliado aos frameworks dessas linguagens, tornam o PHP quase obsoleto. Há como manter o PHP a pelo menos um nível competitivo com essas linguagens?</p>
<p>Apesar de todos os seus defeitos, o PHP ainda é a linguagem mais usada no mercado, embora venha perdendo espaço para novas tecnologias, como Ruby e Python. Aliadas a poderosos frameworks, essas &#8220;novas&#8221; linguagens (Ruby e Python são muito mais antigas que você imagina) tornam o desenvolvimento muito mais rápido. Só com o PHP, raça e vontade nunca será possível alcançar tais níveis de produtividade. A solução é seguir a mesma idéia: adotar um framework.</p>
<p>Não culpo o PHP por ser uma linguagem bem mais lenta em termos de desenvolvimento, a culpa é dos próprios desenvolvedores. Eles geralmente escolhem o lado mais difícil da coisa, recriando toda a estrutura para cada novo sistema. Poucos se preocupam em pesquisar por novas soluções que resolvam seus problemas de maneira mais rápida e automatizada. Ruby e Python, apesar de serem linguagens mais ágeis em minha opinião, só se tornaram &#8220;modinha&#8221; após o aparecimento dos frameworks. Por que os programadores PHP não escolhem o mesmo caminho?</p>
<p>Apesar de estar migrando, agora passo a acreditar que o que realmente importe talvez não seja somente a linguagem, mas sim as ferramentas que nos auxiliam com elas (leia-se frameworks), além dos próprios programadores. Pra que sofrer? Provavelmente alguém com mais tempo e conhecimento já tenha criado uma solução para determinado problema, bem melhor do que você mesmo poderia fazer, sem tempo e às vezes sem tamanho conhecimento.</p>
<p>Confesso que nunca havia usado um framework para PHP, embora já tenha sentido necessidade. Sempre praguejava a cada sistema iniciado, mas mesmo assim desenvolvia minhas próprias soluções para tornar o desenvolvimento menos doloroso. Isso durou até um mês atrás, quando me vi diante de um sistema bem complexo a ser desenvolvido na agência onde trabalho. Sem um framework, levaríamos meses para acabar. A única solução foi a adoção de um framework para PHP. Agora, o desenvolvimento do sistema flui rapidamente, e de maneira bem menos dolorosa, chata e sem graça.</p>
<p>A solução escolhida por nós foi o <a href="http://cakephp.org" rel="external" title="CakePHP - The Rapid Development PHP Framework">CakePHP</a>, talvez o framework mais conhecido para PHP. Sem dúvida alguma, é uma ferramenta de grande poder na hora de desenvolver, principalmente na versão 1.2 (ainda beta, com documentação escassa até o momento, e que talvez dê algumas dores de cabeça até que esteja completa). Para mim, o tempo de desenvolver em PHP puro se encerrou para sempre.</p>
<p>Talvez você não goste tanto do Cake quanto eu, e prefira outras opções. Opções não faltam, há o <a href="http://codeigniter.com" rel="external" title="Code Igniter">Code Igniter</a>, o <a href="http://framework.zend.com" rel="external" title="Zend Framework">Zend</a>, o <a href="http://www.symfony-project.org" rel="external" title="Symfony">Symfony</a>, entre dezenas de outros. Não importa qual seja o framework, desde que ele traga um ambiente mais rápido e agradável para desenvolvimento. Pra falar bem a verdade, uma das maiores razões para eu ter escolhido um framework em lugar de criar minha própria biblioteca de funções foi a implementação de orientação a objetos nesses frameworks, que pra mim dão muito mais sentido à programação.</p>
<p>Para programadores de outras linguagens, o mesmo princípio se aplica: não importa qual solução se use, desde que ela traga benefícios. Me direcionei para PHP pois é onde mais trabalho no momento e, por ironia, a linguagem que menos gosto. Os frameworks foram algo que me fizeram tomar um pouco mais de gosto pela linguagem. E se você não utiliza nada para ajudar no desenvolvimento, está na hora de rever seus conceitos&#8230;</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/json-no-php/' rel='bookmark' title='Permanent Link: JSON no PHP'>JSON no PHP</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/pense-mais-e-codifique-menos/' rel='bookmark' title='Permanent Link: Pense Mais e Codifique Menos'>Pense Mais e Codifique Menos</a></li>
<li><a href='http://juliogreff.net/por-que-projetos-morrem/' rel='bookmark' title='Permanent Link: Por que projetos &#8220;morrem&#8221;?'>Por que projetos &#8220;morrem&#8221;?</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/frameworks-por-um-php-menos-ruim/feed/</wfw:commentRss>
		<slash:comments>67</slash:comments>
		</item>
		<item>
		<title>Comodismo vs. Inovação</title>
		<link>http://juliogreff.net/comodismo-vs-inovacao/</link>
		<comments>http://juliogreff.net/comodismo-vs-inovacao/#comments</comments>
		<pubDate>Thu, 29 May 2008 15:08:01 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[Diversos]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[filosofia]]></category>
		<category><![CDATA[tecnologias]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/?p=150</guid>
		<description><![CDATA[Linguagens de programação e frameworks de desenvolvimento surgem aos montes no ambiente web. De uma maneira ou outra, nossas velhas ferramentas acabam se tornando obsoletas. Por mais que tenhamos domínio sobre elas, o rendimento não se equipara a novas ferramentas, seja em produtividade, desempenho, facilidade de uso ou qualquer outro fator. Será que é hora [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/coisas-que-desenvolvedores-web-deveriam-saber/' rel='bookmark' title='Permanent Link: 7 coisas que todo desenvolvedor web deveria saber'>7 coisas que todo desenvolvedor web deveria saber</a></li>
<li><a href='http://juliogreff.net/caindo-na-real/' rel='bookmark' title='Permanent Link: Caindo na Real'>Caindo na Real</a></li>
<li><a href='http://juliogreff.net/vale-a-pena-arriscar-em-novas-tecnologias/' rel='bookmark' title='Permanent Link: Vale a pena arriscar em novas tecnologias?'>Vale a pena arriscar em novas tecnologias?</a></li>
<li><a href='http://juliogreff.net/digg-pra-que/' rel='bookmark' title='Permanent Link: Digg pra quê?'>Digg pra quê?</a></li>
<li><a href='http://juliogreff.net/fim-ou-recomeco/' rel='bookmark' title='Permanent Link: Fim ou Recomeço?'>Fim ou Recomeço?</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="left">
<img src="http://juliogreff.net/wp-uploads/inovar.jpg" title="Parar ou Inovar?" alt="Parar ou Inovar?" />
</p>
<p>Linguagens de programação e frameworks de desenvolvimento surgem aos montes no ambiente web. De uma maneira ou outra, nossas velhas ferramentas acabam se tornando obsoletas. Por mais que tenhamos domínio sobre elas, o rendimento não se equipara a novas ferramentas, seja em produtividade, desempenho, facilidade de uso ou qualquer outro fator. Será que é hora de abandonar nossa velha forma de desenvolver para dar lugar a novas ferramentas?</p>
<p>As ferramentas com as quais estamos acostumados, como o PHP, por exemplo, foram criadas para resolver os problemas que tínhamos à época em que foram criadas, baseando-se nos métodos dessa época. Elas têm nos servido muito bem, e provavelmente ainda poderão servir por algum tempo mais. Mas a web muda, e as exigências quanto ao desenvolvimento nesse ambiente também. Não basta mais resolver um problema, esse problema deve ser resolvido de forma rápida e eficiente. Com a correria de hoje em dia, só PHP não basta mais.</p>
<p>Com o tempo, além de recriamos soluções para velhos problemas, novos problemas vão surgindo. A web não é mais um ambiente minúsculo como era há alguns anos atrás. Ela cresceu. Cresceu muito. A demanda por serviços, e por serviços cada vez mais rápidos é muito maior do que antes. Criamos novos problemas e precisamos de soluções para eles. Nossas antigas ferramentas não estão preparadas para tanto.</p>
<p>De uma forma ou outra, precisamos ser ágeis. Os frameworks estão aí para ficar. Como o capitalismo nos obriga a produzir em velocidade insalubre, somente uma boa linguagem de programação também não basta. Precisamos ser rápidos, muito, muito rápidos. Mesmo para linguagens não tão recentes, já existem soluções ótimas. Há vida além do Rails e Django!</p>
<p>Embora essas novas tecnologias sejam fascinantes, há um pequeno problema. Uma nova ferramenta leva a uma curva de aprendizado. Isso toma tempo, &#8220;tempo de processamento&#8221;, enfim, nos tirar de nossa zona de conforto. A questão é: devo eu partir pra outra? A minha resposta é: depende.</p>
<p>Tudo é relativo, e não há uma resposta pronta para esse tipo de pergunta. Você pode se sentir realmente confortável com certa linguagem, e conseguir ser extremamente produtivo com ela, ao passo que, mesmo conhecendo bem outras ferramentas, não consegue manter o mesmo ritmo. Nesse caso, sempre existem os frameworks. Não é necessário &#8220;reaprender a programar&#8221;, e ganha-se o benefício de um desenvolvimento mais rápido. Nesse caso, mudar de ares não é algo sensato a se fazer, principalmente se você tem um tempo escasso.</p>
<p>Já se você consegue ser produtivo em várias linguagens, opte por aquela mais moderna e robusta, ou continue buscando algo novo. Assim tem-se o benefício da versatilidade: não importa a ferramenta, importa saber fazer.</p>
<p>Meu caso é um pouco diferente. Apesar de trabalhar diariamente com PHP, nunca gostei da linguagem. Parece-me mais uma biblioteca de funções do que uma linguagem bem estruturada. Quando fui apresentado ao Ruby, me rendi. Apesar de não ter me aventurado muito ainda, é o que pretendo seguir. Não tanto por produtividade, nem tanto por &#8220;moda&#8221;, mas por gosto. Não deixa de ser um motivo válido&#8230;</p>
<p>Tenho certeza que esse assunto dá uma boa discussão. <strong>Qual sua opinião? Fixar-se em uma ferramenta e especializar-se nela, ou procurar algo diferente que melhore sua forma de trabalhar?</strong></p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/coisas-que-desenvolvedores-web-deveriam-saber/' rel='bookmark' title='Permanent Link: 7 coisas que todo desenvolvedor web deveria saber'>7 coisas que todo desenvolvedor web deveria saber</a></li>
<li><a href='http://juliogreff.net/caindo-na-real/' rel='bookmark' title='Permanent Link: Caindo na Real'>Caindo na Real</a></li>
<li><a href='http://juliogreff.net/vale-a-pena-arriscar-em-novas-tecnologias/' rel='bookmark' title='Permanent Link: Vale a pena arriscar em novas tecnologias?'>Vale a pena arriscar em novas tecnologias?</a></li>
<li><a href='http://juliogreff.net/digg-pra-que/' rel='bookmark' title='Permanent Link: Digg pra quê?'>Digg pra quê?</a></li>
<li><a href='http://juliogreff.net/fim-ou-recomeco/' rel='bookmark' title='Permanent Link: Fim ou Recomeço?'>Fim ou Recomeço?</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/comodismo-vs-inovacao/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>CodeCast #3 &#8211; Semântica e Microformatos</title>
		<link>http://juliogreff.net/codecast-3-semantica-microformatos/</link>
		<comments>http://juliogreff.net/codecast-3-semantica-microformatos/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 15:11:16 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[CodeCast]]></category>
		<category><![CDATA[Destaques]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[semântica]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/?p=139</guid>
		<description><![CDATA[Por mais que se fale, ainda tem muito desenvolvedor que peca nessa parte: o bom e velho HTML semântico. Tentando esclarecer um pouco mais o assunto, cá está o CodeCast #3, em versão resumida e ainda por cima atrasada. Em 20 poucos minutos falamos um pouco sobre semântica, microformats, XML, RDF, e qualquer outra coisa [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/' rel='bookmark' title='Permanent Link: CodeCast #1 &#8211; Impressões sobre Início de Carreira'>CodeCast #1 &#8211; Impressões sobre Início de Carreira</a></li>
<li><a href='http://juliogreff.net/codecast-4-adobe-flash/' rel='bookmark' title='Permanent Link: CodeCast #4 &#8211; Adobe Flash'>CodeCast #4 &#8211; Adobe Flash</a></li>
<li><a href='http://juliogreff.net/codecast-2-xhtml-2-e-html-5/' rel='bookmark' title='Permanent Link: CodeCast #2 &#8211; XHTML 2 e HTML 5'>CodeCast #2 &#8211; XHTML 2 e HTML 5</a></li>
<li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/semantica/' rel='bookmark' title='Permanent Link: Semântica'>Semântica</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Por mais que se fale, ainda tem muito desenvolvedor que peca nessa parte: o bom e velho HTML semântico. Tentando esclarecer um pouco mais o assunto, cá está o <strong>CodeCast #3</strong>, em versão resumida e ainda por cima atrasada.</p>
<p>Em 20 poucos minutos falamos um pouco sobre semântica, microformats, XML, RDF, e qualquer outra coisa relacionada que eu possa ter esquecido no momento. <a href="http://codecast.rafaelmarin.net/podcast/codecast_3.mp3" title="CodeCast #3 - A Semântica e Microformatos" rel="external" class="track codecast-3">CodeCast #3 &#8211; A Semântica e Microformatos</a>.</p>
<p>Peço desculpas pela recente ausência, e pela falta de respostas para alguns contatos. Logo logo respondo todo mundo, e também pretendo postar alguma coisa em breve (juro!). Até mais!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/' rel='bookmark' title='Permanent Link: CodeCast #1 &#8211; Impressões sobre Início de Carreira'>CodeCast #1 &#8211; Impressões sobre Início de Carreira</a></li>
<li><a href='http://juliogreff.net/codecast-4-adobe-flash/' rel='bookmark' title='Permanent Link: CodeCast #4 &#8211; Adobe Flash'>CodeCast #4 &#8211; Adobe Flash</a></li>
<li><a href='http://juliogreff.net/codecast-2-xhtml-2-e-html-5/' rel='bookmark' title='Permanent Link: CodeCast #2 &#8211; XHTML 2 e HTML 5'>CodeCast #2 &#8211; XHTML 2 e HTML 5</a></li>
<li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/semantica/' rel='bookmark' title='Permanent Link: Semântica'>Semântica</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/codecast-3-semantica-microformatos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
<enclosure url="http://codecast.rafaelmarin.net/podcast/codecast_3.mp3" length="19168887" type="audio/mpeg" />
		</item>
		<item>
		<title>CodeCast #2 &#8211; XHTML 2 e HTML 5</title>
		<link>http://juliogreff.net/codecast-2-xhtml-2-e-html-5/</link>
		<comments>http://juliogreff.net/codecast-2-xhtml-2-e-html-5/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 21:57:06 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[CodeCast]]></category>
		<category><![CDATA[Destaques]]></category>
		<category><![CDATA[html 5]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[xhtml]]></category>
		<category><![CDATA[xhtml 2]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/?p=137</guid>
		<description><![CDATA[Gravamos no tempo, falhei na hora de avisar&#8230; O CodeCast #2 já está no ar há uma semana, mas só agora pude trazê-lo até aqui. Rotina nova, ainda me acostumando&#8230; Desta vez falamos sobre os novos padrões, XHTML 2 e HTML 5. Coisas legais, mancadas, acessibilidade, semântica, enfim. Seguimos algumas dicas do pessoal, fizemos o [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-3-semantica-microformatos/' rel='bookmark' title='Permanent Link: CodeCast #3 &#8211; Semântica e Microformatos'>CodeCast #3 &#8211; Semântica e Microformatos</a></li>
<li><a href='http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/' rel='bookmark' title='Permanent Link: CodeCast #1 &#8211; Impressões sobre Início de Carreira'>CodeCast #1 &#8211; Impressões sobre Início de Carreira</a></li>
<li><a href='http://juliogreff.net/codecast-4-adobe-flash/' rel='bookmark' title='Permanent Link: CodeCast #4 &#8211; Adobe Flash'>CodeCast #4 &#8211; Adobe Flash</a></li>
<li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/semantica/' rel='bookmark' title='Permanent Link: Semântica'>Semântica</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Gravamos no tempo, falhei na hora de avisar&#8230; O <strong>CodeCast #2</strong> já está no ar há uma semana, mas só agora pude trazê-lo até aqui. Rotina nova, ainda me acostumando&#8230;</p>
<p>Desta vez falamos sobre os novos padrões, <strong>XHTML 2</strong> e <strong>HTML 5</strong>. Coisas legais, mancadas, acessibilidade, semântica, enfim. Seguimos algumas dicas do pessoal, fizemos o podcast em apenas 30 minutos, tínhamos uma pauta (que não foi seguida muito à risca, mas ela existia) e também já temos o <a href="http://feeds.feedburner.com/codecast-br" title="CodeCast - RSS" rel="external">RSS</a> funcionando.</p>
<p>Como disse o Rafael, <a href="http://codecast.rafaelmarin.net/podcast/codecast_2.mp3" title="CodeCast #2 - XHTML 2 e HTML 5" rel="external" class="track codecast-2">escutem</a> que está bem legal!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-3-semantica-microformatos/' rel='bookmark' title='Permanent Link: CodeCast #3 &#8211; Semântica e Microformatos'>CodeCast #3 &#8211; Semântica e Microformatos</a></li>
<li><a href='http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/' rel='bookmark' title='Permanent Link: CodeCast #1 &#8211; Impressões sobre Início de Carreira'>CodeCast #1 &#8211; Impressões sobre Início de Carreira</a></li>
<li><a href='http://juliogreff.net/codecast-4-adobe-flash/' rel='bookmark' title='Permanent Link: CodeCast #4 &#8211; Adobe Flash'>CodeCast #4 &#8211; Adobe Flash</a></li>
<li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/semantica/' rel='bookmark' title='Permanent Link: Semântica'>Semântica</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/codecast-2-xhtml-2-e-html-5/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
<enclosure url="http://codecast.rafaelmarin.net/podcast/codecast_2.mp3" length="11019101" type="audio/mpeg" />
		</item>
		<item>
		<title>CodeCast #1 &#8211; Impressões sobre Início de Carreira</title>
		<link>http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/</link>
		<comments>http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 16:14:41 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[CodeCast]]></category>
		<category><![CDATA[Destaques]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/codecast-impressoes-sobre-inicio-de-carreira/</guid>
		<description><![CDATA[É com grande prazer que anuncio o primeiro episódio do CodeCast, projeto meu juntamente com o Rafael Marin. Um podcast sobre desenvolvimento web e todas as suas possíveis vertentes. Nessa primeira edição, falamos sobre Impressões sobre Início de Carreira, com relação ao que já conseguimos perceber em nossas experiências na área. Como somos novos nesse [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-4-adobe-flash/' rel='bookmark' title='Permanent Link: CodeCast #4 &#8211; Adobe Flash'>CodeCast #4 &#8211; Adobe Flash</a></li>
<li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/codecast-2-xhtml-2-e-html-5/' rel='bookmark' title='Permanent Link: CodeCast #2 &#8211; XHTML 2 e HTML 5'>CodeCast #2 &#8211; XHTML 2 e HTML 5</a></li>
<li><a href='http://juliogreff.net/codecast-3-semantica-microformatos/' rel='bookmark' title='Permanent Link: CodeCast #3 &#8211; Semântica e Microformatos'>CodeCast #3 &#8211; Semântica e Microformatos</a></li>
<li><a href='http://juliogreff.net/sobre/' rel='bookmark' title='Permanent Link: Sobre'>Sobre</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="left"><img src="http://juliogreff.net/wp-uploads/codecast.gif" title="CodeCast" alt="CodeCast" /></p>
<p>É com grande prazer que anuncio o primeiro episódio do <a href="http://codecast.rafaelmarin.net/" title="CodeCast - PodCast sobre Desenvolvimento Web, Produtividade e assuntos relacionados" rel="external">CodeCast</a>, projeto meu juntamente com o <a href="http://rafaelmarin.net/" title="RafaelMarin.net" rel="external friend">Rafael Marin</a>. Um podcast sobre desenvolvimento web e todas as suas possíveis vertentes.</p>
<p>Nessa primeira edição, falamos sobre <strong>Impressões sobre Início de Carreira</strong>, com relação ao que já conseguimos perceber em nossas experiências na área. Como somos novos nesse negócio de podcast, já peço desculpas por qualquer bobagem dita ou os &#8220;ahmmm&#8221;, &#8220;hummm&#8221;, que podem ter aparecido de maneira mais exagerada&#8230; Mas a gente aprende com o tempo.</p>
<p>E de vocês, caros leitores-ouvintes, aguardamos um feedback sobre essa nova empreitada. Qualquer sugestão, crítica, elogio, reclamação ou o que seja, sinta-se à vontade para nos dizer.</p>
<p><a href="http://codecast.rafaelmarin.net" title="CodeCast" rel="external">Baixe a primeira edição</a>: <strong>Impressões sobre Início de Carreira</strong>, em qualidade alta (44MB) ou qualidade baixa (19MB). Duração: 48 minutos. E vou ficando por aqui, até mais!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/codecast-4-adobe-flash/' rel='bookmark' title='Permanent Link: CodeCast #4 &#8211; Adobe Flash'>CodeCast #4 &#8211; Adobe Flash</a></li>
<li><a href='http://juliogreff.net/codecast-5-frameworks/' rel='bookmark' title='Permanent Link: CodeCast #5 &#8211; Frameworks'>CodeCast #5 &#8211; Frameworks</a></li>
<li><a href='http://juliogreff.net/codecast-2-xhtml-2-e-html-5/' rel='bookmark' title='Permanent Link: CodeCast #2 &#8211; XHTML 2 e HTML 5'>CodeCast #2 &#8211; XHTML 2 e HTML 5</a></li>
<li><a href='http://juliogreff.net/codecast-3-semantica-microformatos/' rel='bookmark' title='Permanent Link: CodeCast #3 &#8211; Semântica e Microformatos'>CodeCast #3 &#8211; Semântica e Microformatos</a></li>
<li><a href='http://juliogreff.net/sobre/' rel='bookmark' title='Permanent Link: Sobre'>Sobre</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/codecast-impressoes-sobre-inicio-de-carreira/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Documentando Scripts com ScriptDoc</title>
		<link>http://juliogreff.net/documentando-scripts-com-scriptdoc/</link>
		<comments>http://juliogreff.net/documentando-scripts-com-scriptdoc/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 16:42:52 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[documentação]]></category>
		<category><![CDATA[scriptdoc]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/documentando-scripts-com-scriptdoc/</guid>
		<description><![CDATA[Você já pensou em documentar seus scripts dentro deles mesmos em um formato padrão e ainda poder utilizar essa documentação no seu editor, contando até com auto-completar? Se você usa o Aptana, o ScriptDoc lhe provê esses recursos. O Code Assist Ferramentas que facilitam a vida do desenvolvedor não faltam no Aptana. O Code Assist [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/historico-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Histórico para Navegação via JavaScript'>Histórico para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/responsexml/' rel='bookmark' title='Permanent Link: ResponseXML'>ResponseXML</a></li>
<li><a href='http://juliogreff.net/cookies-em-javascript/' rel='bookmark' title='Permanent Link: Cookies em JavaScript'>Cookies em JavaScript</a></li>
<li><a href='http://juliogreff.net/estatisticas-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Estatísticas para Navegação via JavaScript'>Estatísticas para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/interfaces-de-usuario-com-javascript/' rel='bookmark' title='Permanent Link: Interfaces de Usuário com JavaScript'>Interfaces de Usuário com JavaScript</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Você já pensou em documentar seus scripts dentro deles mesmos em um formato padrão e ainda poder utilizar essa documentação no seu editor, contando até com auto-completar? Se você usa o <a href="http://www.aptana.com" rel="external" title="Aptana IDE">Aptana</a>, o ScriptDoc lhe provê esses recursos.</p>
<h3>O Code Assist</h3>
<p>Ferramentas que facilitam a vida do desenvolvedor não faltam no Aptana. O Code Assist é uma delas. Quando você digita o nome de algum objeto (<code>document</code>, por exemplo), ele mostra todos os métodos e propriedades disponíveis, permitindo que você complete o código sem precisar digitá-lo por inteiro. Isso também funciona para funções comuns, quando se começa a digitar seu nome.</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/code_assist.png" title="Usando o Code Assist" alt="Usando o Code Assist" /></p>
<p>Além de completar seu código, o Code Assist ainda mostra as informações sobre o método, como parâmetros, retorno, descrição e compatibilidade (no caso de métodos do JavaScript ou DOM) através de uma tooltip. Essa mesma tooltip também aparece quando se digitam os parênteses de alguma função, mostrando seus parâmetros e suas descrições.</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/code_assist_tooltip.png" title="Tooltips do Code Assist" alt="Tooltips do Code Assist" /></p>
<p>Também é possível usar o Code Assist com seus próprios scripts, ou seja, usar toda essa facilidade juntamente com as classes, métodos e funções que você escreveu. Para usar o Code Assist com seus códigos, é necessário documentá-los através do ScriptDoc, mais uma ferramenta do Aptana.</p>
<h3>O ScriptDoc</h3>
<p>A documentação através do ScriptDoc funciona com blocos de comentário dentro do próprio código JavaScript, seguindo um padrão definido. Basicamente, um bloco de documentação deve ser assim:</p>
<pre><code>/**
* Descrição do Código
*/</code></pre>
<p>Esse bloco deve ser incluído logo acima da função que se deseja documentar, e ela será automaticamente vinculada à esse bloco de documentação pelo parser do Aptana. A primeira linha, para todos os blocos de documentação (exceto na descrição de arquivos), deve ser uma pequena descrição da classe, método ou atributo. Nas linhas seguintes podem ser incluídas <a href="http://www.aptana.com/docs/index.php/ScriptDoc_comprehensive_tag_reference" rel="external" title="ScriptDoc Comprehensive Tag Reference">tags</a> que adicionem mais informações sobre o código.</p>
<pre><code>/**
* Cria um elemento HTML
* @param {String} tagName Nome da tag a ser criada
* @return {Object} Retorna a tag criada
*/
function createHTMLElement(tagName) { }
</code></pre>
<p>O ScriptDoc permite várias tags, as duas usadas acima são apenas para um exemplo simples. Há uma <a href="http://www.aptana.com/docs/index.php/ScriptDoc_comprehensive_tag_reference" rel="external" title="ScriptDoc Comprehensive Tag Reference">lista compreensiva de tags</a> na documentação do Aptana, tanto on-line quanto off-line. Veja o resultado da função documentada:</p>
<p class="center"><img src="http://juliogreff.net/wp-uploads/own_code_assist.png" title="Code Assist de Função Documentada" alt="Code Assist de Função Documentada" /></p>
<p>A descrição de arquivos também pode ser feita de maneira bem semelhante, através da tag <code>@projectDescription</code>, e outras que também podem ser usadas no restante da documentação.</p>
<pre><code>/**
* @projectDescription Descrição do Arquivo
* @author Autor
* @version 1.0
*/</code></pre>
<h3>Usando arquivos .sdoc</h3>
<p>Caso você não queira que sua documentação fique diretamente no script, apenas ocupando espaço desnecessário, ela pode ser colocada em um arquivo externo, de extensão .sdoc.</p>
<p>Para que esse tipo de documentação funcione, é necessário criar um arquivo com o mesmo nome do script, mas com a extensão .sdoc, fazendo com que o Aptana reconheça o arquivo como sendo documentação do script.</p>
<p>No arquivo .sdoc, pode-se escrever a documentação normalmente, assim como seria no script. Há apenas uma modificação a ser feita: deve ser incluída a tag <code>@id</code> para cada bloco de documentação, e deverá haver uma tag correspondente no script (somente a tag <code>@id</code>). Veja um exemplo do arquivo .sdoc:</p>
<pre><code>/**
* Cria um elemento HTML
* @id createHTMLElement
* @param {String} tagName Nome da tag a ser criada
* @return {Object} Retorna a tag criada
*/
</code></pre>
<p>E também um exemplo do script:</p>
<pre><code>/**
 * @id createHTMLElement
 */
function createHTMLElement(tagName) { }
</code></pre>
<p>No início de ambos os arquivos também pode ser inclusa a tag <code>@namespace</code>, que definirá um objeto que englobará todas as funções e atributos do script. Se incluíssemos <code>@namespace HTML</code> em nossos exemplos, poderíamos usar tanto <code>createHTMLElement</code> quanto <code>HTML.createElement</code>. É claro que não funcionaria no script, a menos que assim quiséssemos.</p>
<p>É por isso que a cada dia mais gosto do Aptana, apesar de ser extremamente pesado (Aptana + WMP não dá certo). Adicionando mais tags pode-se criar uma documentação ótima para seus scripts, e de uma maneira muito simples. Também há planos de um gerador HTML para a documentação ScriptDoc, basta esperar. Pra quem não conhece o Aptana, vale o teste. Aproveitem, e até a próxima!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/historico-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Histórico para Navegação via JavaScript'>Histórico para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/responsexml/' rel='bookmark' title='Permanent Link: ResponseXML'>ResponseXML</a></li>
<li><a href='http://juliogreff.net/cookies-em-javascript/' rel='bookmark' title='Permanent Link: Cookies em JavaScript'>Cookies em JavaScript</a></li>
<li><a href='http://juliogreff.net/estatisticas-para-navegacao-via-javascript/' rel='bookmark' title='Permanent Link: Estatísticas para Navegação via JavaScript'>Estatísticas para Navegação via JavaScript</a></li>
<li><a href='http://juliogreff.net/interfaces-de-usuario-com-javascript/' rel='bookmark' title='Permanent Link: Interfaces de Usuário com JavaScript'>Interfaces de Usuário com JavaScript</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/documentando-scripts-com-scriptdoc/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Desenhando com Canvas</title>
		<link>http://juliogreff.net/desenhando-com-canvas/</link>
		<comments>http://juliogreff.net/desenhando-com-canvas/#comments</comments>
		<pubDate>Sat, 14 Jul 2007 17:09:54 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[canvas]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/desenhando-com-canvas/</guid>
		<description><![CDATA[Canvas (&#60;canvas&#62;) é um elemento HTML que pode ser usado para desenhar através de JavaScript, ou outra linguagem de scripting provida pelo browser. Podemos usa-lo para fazer desenhos, composições com imagens e até animações. Já foram criados até alguns jogos básicos através de canvas. Esse elemento funciona apenas em browsers mais modernos. Firefox 1.5+, Operaernos. [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/utilizando-o-metodo-post/' rel='bookmark' title='Permanent Link: Utilizando o Método POST em Ajax'>Utilizando o Método POST em Ajax</a></li>
<li><a href='http://juliogreff.net/documentando-scripts-com-scriptdoc/' rel='bookmark' title='Permanent Link: Documentando Scripts com ScriptDoc'>Documentando Scripts com ScriptDoc</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/jquery-segundas-impressoes/' rel='bookmark' title='Permanent Link: jQuery &#8211; Segundas Impressões'>jQuery &#8211; Segundas Impressões</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Canvas (<code>&lt;canvas&gt;</code>) é um elemento HTML que pode ser usado para desenhar através de JavaScript, ou outra linguagem de scripting provida pelo browser. Podemos usa-lo para fazer desenhos, composições com imagens e até animações. Já foram criados até alguns jogos básicos através de canvas.</p>
<p>Esse elemento funciona apenas em browsers mais modernos. Firefox 1.5+, Operaernos. Firefox 1.5+, Opera 9, Safari ou qualquer outro browser com a engine Gecko 1.8. E não, não funciona no IE, eu havia dito <em>browsers</em> e <em>modernos</em>.</p>
<h3>Marcação</h3>
<p>Diferente do SVG, todo nosso desenho será feito via scripting, e não temos tanto controle sobre os elementos desenhados. O que devemos fazer é adicionar nossa &#8220;área de desenho&#8221; na marcação:</p>
<pre><code>&lt;canvas id="canvas" width="150" height="150"&gt;&lt;/canvas&gt;</code></pre>
<p>A altura e largura do canvas são definidos, respectivamente, por height e width, que também podem ser definidos pelo DOM ou CSS. Caso não sejam especificados, assumem 300px de largura e 150px de altura por padrão.</p>
<h3>Acessando o Canvas</h3>
<p>Agora vamos ao script. Primeiramente, precisamos esperar o documento carregar para podermos começar a desenhar, caso contrário seremos avisados que o elemento não existe. Depois, precisamos obter o elemento do canvas, através de <code>document.getElementById</code>, nada de espetacular.</p>
<p>Para termos acesso às funções de desenho, precisamos acessar tal contexto. Cada elemento canvas possui o método <code>getContext</code>, que leva apenas um parâmetro, que logicamente é o tipo do contexto de desenho. Atualmente, somente o contexto &#8220;2d&#8221; é aceito, mas no futuro poderá ser implementado &#8220;3d&#8221; também. Agora vamos juntar tudo, e criar o código:</p>
<pre><code>window.onload = function() {

  var canvas = document.getElementById("canvas");

  canvas = canvas.getContext("2d");

}

</code></pre>
<p>Agora já acessamos o contexto de desenho e podemos começar a desenhar, embora ainda não vejamos nada em nosso canvas canvas. Ele ainda é apenas uma área transparente.</p>
<p>Para desenharmos, usaremos aquele clássico sistema de coordenadas (x,y), como nos programas de design e nas aulas de matemática. Cada unidade corresponde a 1 pixel, e o topo esquerdo é a posição (0,0). Todas as coordenandas são definidas com base nesse ponto.</p>
<h3>Formas</h3>
<p>Em canvas, existe apenas uma forma primitiva, que são os retângulos. Todas as outras formas são criadas através da combinação de &#8220;paths&#8221;, que vamos ver logo depois. Para o desenho de retângulos, podemos utilizar 3 funções:</p>
<ul>
<li><code>fillRect(x, y, largura, altura)</code>: desenha um retângulo preenchido</li>
<li><code>strokeRect(x, y, largura, altura)</code>: desenha um retângulo sem preenchimento, apenas contorno</li>
<li><code>clearRect(x, y, largura, altura)</code>: limpa uma área retangular do desenho</li>
</ul>
<p>Observe o exemplo abaixo, utilizando os três métodos. Primeiro, preenchemos um retângulo. Logo após, limpamos uma área de dentro do retângulo anterior, e dentro dessa área limpa contornamos outro retângulo. Vejamos um boneco bem, digamos, &#8220;quadradão&#8221;:</p>
<pre><code>window.onload = function() {

  var canvas = document.getElementById("canvas").getContext("2d");

  canvas.fillRect(0,0,150,150);

  canvas.clearRect(15,25,30,30);

  canvas.strokeRect(17,27,26,26);

  canvas.clearRect(105,25,30,30);

  canvas.strokeRect(107,27,26,26);

  canvas.clearRect(63,65,24,30);

  canvas.clearRect(15,120,120,10);

}</code></pre>
<h3>Cores</h3>
<p>Cores também são um aspecto &#8220;chatinho&#8221; de se trabalhar em Canvas. Não é possível definir uma cor especificamente para uma forma, é algo mais genérico.  Usamos as propriedades <code>fillStyle</code> e <code>strokeStyle</code>, que definem a cor para preenchimento e contorno, respectivamente, para as formas desenhadas posteriormente (não temos controle sobre formas desenhadas anteriormente). Elas aceitam valores rgb, rgba, valores hexadecimais e nomes em inglês (&#8220;red&#8221;, &#8220;green&#8221;, &#8220;blue&#8221;&#8230;). Vamos fazer uma modificação no desenho anterior:</p>
<pre><code>window.onload = function() {

  var canvas = document.getElementById("canvas").getContext("2d");

  canvas.fillStyle = "#ffff66"

  canvas.strokeStyle = "blue";

  canvas.fillRect(0,0,150,150);

  canvas.clearRect(15,25,30,30);

  canvas.strokeRect(17,27,26,26);

  canvas.clearRect(105,25,30,30);

  canvas.strokeRect(107,27,26,26);

  canvas.strokeStyle = "rgba(0,0,0,0.8)";

  canvas.strokeRect(63,65,24,30);

  canvas.fillStyle = "#ff0000";

  canvas.fillRect(15,120,120,10);

}</code></pre>
<h3>Paths</h3>
<p>Os paths (caminhos), são basicamente linhas que assumem vários formatos que, quando combinadas, nos permitem criar as mais diversas formas. Se você tem uma base, mesmo que mínima, sobre desenho vetorial, vai entender perfeitamente o que digo.</p>
<p>Para desenharmos esses &#8220;caminhos&#8221;, precisamos iniciar um novo path, através do método <code>beginPath</code>. Apesar de termos iniciado um caminho, ainda não há nada no canvas.</p>
<p>Depois de iniciado, precisamos invocar os métodos que especificam como o path será desenhado, que forma ele deverá ter. Podemos desenhar linhas, arcos, curvas e retângulos. Não vou explicar os métodos agora pra não perder a graça.</p>
<p>Após termos desenhado todo o path através dos métodos que (não) citei acima, pode-se fecha-lo (opcional se o path será preenchido) através do método <code>closePath</code>. Ele tentará traçar uma linha reta do último ponto para o ponto inicial, se o caminho já não estiver fechado ou tiver apenas um ponto.</p>
<p>Embora a forma esteja &#8220;desenhada&#8221;, ela ainda não aparece no canvas. Isso porque todo o caminho fica na memória até que o passemos para o canvas. Para tal, precisamos preenchê-lo ou contorná-lo, através dos métodos <code>fill</code> e <code>stroke</code>, respectivamente.</p>
<p>Nossos primeiros paths serão baseados em linhas, que podem ser desenhadas pelo método <code>lineTo(x, y)</code>. Ele desenha uma linha do ponto corrente do path até as coordenandas (x, y) passadas como parâmetro. Vamos ver um exemplo:</p>
<pre><code>canvas.beginPath();

canvas.lineTo(150, 150);

canvas.lineTo(0, 150);

canvas.lineTo(0, 0);

canvas.fill();

canvas.beginPath();

canvas.moveTo(0,0);

canvas.lineTo(150, 0);

canvas.lineTo(150, 150);

canvas.closePath();

canvas.stroke();

</code></pre>
<p>Desenhamos dois triângulos, um preenchido e outro contornado. Note que, quando usamos <code>fill</code>, não é necessário fechar a forma. Note também uma chamada ao método <code>moveTo</code>, será um dos métodos mais utilizados em suas composições. Fica o mistério&#8230;</p>
<p>O método <code>moveTo</code> move a origem do path para qualquer ponto do canvas. É equivalente a levantar o pincel e começar a desenhar a partir de outro ponto. Toda vez que adicionamos um path à lista, essa origem será o lugar do último ponto desenhado, a menos que ele fosse mudado. Veja o exemplo anterior sem a chamada ao <code>moveTo</code>.</p>
<p>Iniciamos então com os arcos. Eles são a base para a criação de qualquer tipo de forma circular, círculos, semicírculos, semi-semicírculos&#8230; São criados através do método <code>arc(x, y, radius, startAngle, endAngle, anticlockwise)</code>que na minha opinião é um método um pouco mais complicado.</p>
<p>Os parâmetros <code>x</code> e <code>y</code> determinam o centro do arco. <code>radius</code> indica o tamanho do raio, em pixels. <code>startAngle</code> e <code>endAngle</code> são os ângulos de início e fim do arco, medidos em radianos. Sou péssimo nisso aí, e uso o seguinte código de conversão (retirado do <a href="http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes" rel="external" title="Mozilla Developer Center - en">MDC</a>):</p>
<pre><code>var radians = (Math.PI/180)*degrees;</code></pre>
<p>Pra quem também não é muito bom em geometria, 0 e <code>Math.PI</code> desenham um meio círculo e 0 e <code>Math.PI*2</code> desenham um círculo completo.</p>
<p>Há também o último parâmetro, <code>anticlockwise</code>, booleano, que define se o círculo deverá ser desenhado para o sentido horário (false) ou anti-horário (true).</p>
<pre><code>// Exemplo do MDC

canvas.beginPath();

canvas.arc(75,75,50,0,Math.PI*2,true); // Rosto

canvas.moveTo(110,75);

canvas.arc(75,75,35,0,Math.PI,false);   // Boca (sentido horário)

canvas.moveTo(65,65);

canvas.arc(60,65,5,0,Math.PI*2,true);  // Olho Esquerdo

canvas.moveTo(95,65);

canvas.arc(90,65,5,0,Math.PI*2,true);  // Olho Direito

canvas.stroke();

</code></pre>
<p>Também é bom lembrar que o último ponto do círculo será o final da curva, e não o centro dele.</p>
<p>Terminando as formas, temos as curvas quadráticas e curvas de Bézier. Elas têm um uso mais complexo (bem mais complexo), principalmente pra quem não tem experiência com design. Como também não sou um mestre do design, fico devendo um exemplo (não gosto de copiar exemplos que eu não tenha conseguido reproduzir). Temos muita coisa interessante no MDC.</p>
<ul>
<li><code>quadraticCurveTo(cp1x, cp1y, x, y)</code></li>
<li><code>bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)</code></li>
</ul>
<p>Os parâmetros <code>x</code> e <code>y</code> definem as coordenandas para o ponto de fim das curvas. <code>cp(n)x</code> e <code>cp(n)y</code> indicam as coordenadas dos pontos de controle das curvas. Esses pontos são onde controlamos a curvatura. É lógico que sem um tipo de visualização é muito mais difícil tentar algo na tentativa-e-erro. Boa sorte!</p>
<h3>Transparência</h3>
<p>Existem duas maneiras de implementar a transparência em nossos desenhos: através de uma definição de cor rgba ou pela propriedade <code>globalAlpha</code>. O valor varia de 0 (forma transparente) a 1 (forma opaca).</p>
<p>Um exemplo, utilizando as duas técnicas. Claro, não há efeito&#8230;</p>
<pre><code>canvas.fillStyle = "rgba(255,0,0,0.5)"; // Transparência 50%

canvas.globalAlpha = 0.5;

</code></pre>
<p>Agora sim, um exemplo mais prático:</p>
<pre><code>canvas.fillStyle = "rgba(255, 0, 0, 1)";

canvas.fillRect(0, 0, 100, 100);

canvas.fillStyle = "rgb(0, 255, 0)";

canvas.globalAlpha = 0.5;

canvas.fillRect(50, 50, 100, 100);

</code></pre>
<h3>Gradientes</h3>
<p>Geralmente costuma-se citar primeiro os estilos de linha para depois os gradientes. Acho que essa parte será mais interessante, e explicarei antes dos estilos de linha. Em canvas só podemos criar dois tipos de gradiente: linear e radial, e fazemos isso através dos métodos <code>createLinearGradient</code> e <code>createRadialGradient</code>. Eles podem ser atribuídos a variáveis, já que poderão ser usados várias vezes, sem a necessidade de recria-los. Eles podem ser utilizados para definir <code>fillStyle</code> e <code>strokeStyle</code>.</p>
<p>O método <code>createLinearGradient</code> leva 4 parâmetros: x1, y1, x2 e y2. Os dois primeiros definem as coordenadas do ponto inicial e os dois últimos do ponto final. Já <code>createRadialGradient</code> leva 6: os três primeiros definem o círculo central (x1, y1 e raio1, nessa ordem) e o círculo de fora (x2, y2 e raio2, nessa ordem). Vamos à um exemplo:</p>
<pre><code>var lineargradient = canvas.createLinearGradient(0,0,150,150);

var radialgradient = canvas.createRadialGradient(75,75,0,75,75,100);

</code></pre>
<p>Mesmo criados e atribuídos ao preenchimento ou contorno, os gradientes vistos acima não têm efeito algum, pois não definimos as cores do gradiente. Precisamos definir &#8220;color stops&#8221;, que são pontos que definem a cor do gradiente. Fazemos isso através do método (método do objeto gradiente, e não do canvas) <code>addColorStop</code>, que leva os parâmetros posição e cor. A posição pode ser um valor entre 0 e 1, que é relativo ao gradiente, e a cor pode ser definida como no CSS3 (rgb, rbga, #rrggbb, &#8220;red&#8221;, &#8220;green&#8221;, &#8220;blue&#8221;&#8230;).</p>
<pre><code>var radial = canvas.createRadialGradient(75,75,0,75,75,60);

radial.addColorStop(0,'red');

radial.addColorStop(0.5,'orange');

radial.addColorStop(0.9,'yellow');

radial.addColorStop(1,"rgba(255,255,255,0)");

canvas.fillStyle = radial;

canvas.beginPath();

canvas.arc(75, 75, 60, 0, Math.PI*2, true);

canvas.fill();

</code></pre>
<h3>Estilos de Linha</h3>
<p>Podemos modificar alguns estilos das linhas (contornos) em nosso desenho. O primeiro estilo que veremos é a espessura da linha, definida pela propriedade <code>lineWidth</code>, que é definida em pixels. Um exemplo utilizando linhas randonâmicas:</p>
<pre><code>for(var i = 0; i &lt; 10; i++) {

  canvas.lineWidth = Math.round(Math.random()*10);

  canvas.beginPath();

  canvas.moveTo(i * 14, 5);

  canvas.lineTo(i * 14, 140);

  canvas.stroke();

}</code></pre>
<p>A propriedade <code>lineCap</code> define como deverão ser as extremidades das linhas. Os valores possíveis são &#8220;butt&#8221;, &#8220;round&#8221; e &#8220;square&#8221;. Com o valor &#8220;butt&#8221;, as linhas terminarão exatamente nas coordenadas que foram definidas. Com o valor &#8220;round&#8221;, será adicionada um semicírculo ao final da linha. Já &#8220;square&#8221; adiciona um retângulo com tamanho igual a metade da espessura da linha.</p>
<p>Temos também a propriedade <code>lineJoin</code>, que define como as linhas que se encontram devem ser. Pode receber os valores &#8220;mitter&#8221;, &#8220;round&#8221; e &#8220;bevel&#8221;. &#8220;mitter&#8221; faz as extremidades alongarem-se até se encontrarem em um único ponto, e esse alongamento é definido pela propriedade &#8220;mitterLimit&#8221;. &#8220;round&#8221; arredonda e &#8220;bevel&#8221; faz um corte um pouquinho arredondado.</p>
<h3>Finalizando&#8230;</h3>
<p>Tive como objetivo apenas fazer uma introdução ao uso de canvas e suas capacidades vetoriais. Canvas também pode criar composições com imagens, texturas, fazer animações, e até jogos. É uma ótima ferramenta, apesar de um tanto limitada quanto a compatibilidade com outros softwares (IE, no caso). Fui!</p>
<p><strong>Atualização:</strong> caso você queira desenhar com JavaScript, mas sem Canvas, tente a idéia do Micox: <a href="http://www.elmicox.com/2008/desenhando-pontos-e-linhas-com-javascript-puro-sem-canvas/" title="Desenhando pontos e linhas com javascript puro (sem canvas)" rel="external friend">Desenhando pontos e linhas com javascript puro (sem canvas)</a>.</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/utilizando-o-metodo-post/' rel='bookmark' title='Permanent Link: Utilizando o Método POST em Ajax'>Utilizando o Método POST em Ajax</a></li>
<li><a href='http://juliogreff.net/documentando-scripts-com-scriptdoc/' rel='bookmark' title='Permanent Link: Documentando Scripts com ScriptDoc'>Documentando Scripts com ScriptDoc</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/jquery-segundas-impressoes/' rel='bookmark' title='Permanent Link: jQuery &#8211; Segundas Impressões'>jQuery &#8211; Segundas Impressões</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/desenhando-com-canvas/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

