<?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>Paulo Fernandes</title>
	<atom:link href="http://www.phpaulo.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpaulo.com.br</link>
	<description>Tecnologia, Desenvolvimento de Software, Metodologia, Web e etc..</description>
	<lastBuildDate>Tue, 20 Jul 2010 20:55:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Primeiro dia com o Python</title>
		<link>http://www.phpaulo.com.br/desenvolvimento/primeiro-dia-com-o-python/</link>
		<comments>http://www.phpaulo.com.br/desenvolvimento/primeiro-dia-com-o-python/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 20:55:59 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=74</guid>
		<description><![CDATA[Hoje iniciei meu desenvolvimento com  Python, tomei essa iniciativa após o oosjam
Aqui será uma  espécie de passos que eu segui.
Acessei o site  http://www.python.org e fiz o download da versão 2.7 para Windows e  comecei a leitura desse link http://docs.python.org/tutorial/index.html,  li somente a primeira página enquanto rodava o executável MSI, mandei [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje iniciei meu desenvolvimento com  Python, tomei essa iniciativa após o <a title="OSSJam " href="http://twitter.com/#search?q=%23ossjam" target="_blank">oosjam</a></p>
<p>Aqui será uma  espécie de passos que eu segui.</p>
<p>Acessei o site  <a title="Python" href="http://www.python.org" target="_blank">http://www.python.org</a> e fiz o download da <a href="http://www.python.org/ftp/python/2.7/python-2.7.msi" target="_blank">versão 2.7 para Windows</a> e  comecei a leitura desse link <a href="http://docs.python.org/tutorial/index.html" target="_blank">http://docs.python.org/tutorial/index.html</a>,  li somente a primeira página enquanto rodava o executável MSI, mandei  instalar na pasta padrão<strong> C:\PYTHON27\</strong></p>
<p>Como gosto da parte prática  tentei ir direto para o &#8220;Hello World&#8221; <img src='http://www.phpaulo.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Primeiro Problema, como  configurar o windows para entender o Python <img src='http://www.phpaulo.com.br/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>No tutorial do  site do Python, o segui. Abri o prompt de comando e digitei python</p>
<p>||    &#8216;python&#8217; não é um comando reconhecido</p>
<p>Tive que adicionar o  caminho de instalação ao path do windows</p>
<p>||    set  path=%path%;C:\python27</p>
<p>Depois disso, digitei python no prompt e  deu certo <img src='http://www.phpaulo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Abriu uma interface no prompt e eu fiz o meu primeiro  &#8220;Hello World&#8221; foi até que simples, veja:</p>
<p>||    print &#8216;hello  world&#8217;<br />
||    print &#8220;hello world&#8221;</p>
<p>Ainda não aprendi o  suficiente, mas funcionou com aspas duplas e com aspas simples, algo  interessante do Python é que não precisa de ; no final da linha, basta  pular de linha que ele entende que é uma nova instrução.</p>
<p>Como eu  já sabia, arquivos Python tem a extensão <strong>.py</strong></p>
<p>Então, pensei, vou  salvar um arquivo e tentar executá-lo. Criei um arquivo em uma pasta  qualquer e quando salvei como .py no <a href="http://notepad-plus-plus.org/">notepadd++</a> e fechei o arquivo e  fui na pasta vê-lo. Para minha surpresa, o arquivo já alterou o icone,  informando que era um arquivo executável e que o windows reconhecia o  seu tipo. Clique duas vezes no arquivo e rapidamente, o prompt de  comando abriu e fechou. Pensei comigo mesmo, deve ter algo de errado com  o arquivo né? Ai fiz a seguinte &#8220;burrada&#8221;, coloquei 2000 linhas com a  seguinte instrução<br />
||     print &#8220;hello&#8221;<br />
||     print &#8220;hello&#8221;<br />
||      print &#8220;hello&#8221;<br />
||     print &#8220;hello&#8221;<br />
||     &#8230;</p>
<p>Cliquei duas  vezes novamente e percebi que ele estava imprimindo várias vezes. Acima  disse que fiz a &#8220;burrada&#8221;, porque eu bem que poderia ter criado um for,  que é muito mais elegante do que um CTRL+C e CTRL+V. Problema!!!!</p>
<p>Segundo  problema, como se cria variavel em Python??<br />
Bem mais simples do que  pensei basta escrever a variavel e usar o sinal de &#8216;=&#8217; para atribuir o  valor<br />
||    i = 0</p>
<p>Maravilha, e agora vamos ao for, ops! mais  um problema</p>
<p>Terceiro problema, como se cria um for<br />
Fiquei  feliz, descobri rapidinho, um amigo me indicou o livro <em>&#8220;Beggining Python  &#8211; From Novice To Professional (Magnus Lie Hetland)&#8221;</em>, algo interessante  de ser mencionado é que no Python não tem abre e fecha chaves, tudo é na  base da identação <img src='http://www.phpaulo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Acredito que dessa forma seja até melhor para se  programar, afinal tem gente que abre as chaves na mesma linha e outros  abrem na linha de baixo do método, mas isso é outra história.<br />
||      for numero in range(1,20000):<br />
||         print numero</p>
<p>Resultado:<br />
||        1<br />
||       2<br />
||       3<br />
||     &#8230;.</p>
<p>Mas agora eu queria  fazer algo para melhorar um pouco e deixar mais próximo da &#8220;vergonha&#8221;  do CTRL+C e CTRL+V que fiz acima, então resolvi concatenar variavel com a  String, ops!!! outro problema</p>
<p>Quarto problema, como concatenar  variavel em Python<br />
Com o livro essa foi facinho, basta utilizar a  virgula, isso mesmo &#8216;,&#8217; a virgula.<br />
Como agora estou com o livro, acho  que os problemas vão diminuir <img src='http://www.phpaulo.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8220;Tomara!&#8221;<br />
||    for numero in  range(1,20000):<br />
print &#8220;hello&#8221;,numero</p>
<p>Resultado:<br />
||      hello 1<br />
||     hello 2<br />
||     hello 3<br />
||     &#8230;.</p>
<p>Além  da virgula &#8216;,&#8217; concatenar ela serve para dar um espaço em branco, mas  como que se concatena sem espaço??</p>
<p>Quinto problema, concatenar um  numero com uma string sem espaço em branco?<br />
Esse foi mais  complicado, porém aprendi diversas outras coisas, mas no final descobri  com se faz, reparem na crase &#8216;`&#8217;<br />
||    for numero in range(1,20000):<br />
||         print &#8216;hello&#8217;+`numero`</p>
<p>Resultado:<br />
||     hello1<br />
||      hello2<br />
||     hello3<br />
||     &#8230;.</p>
<p>O que aprendi que comentei  acima é que se eu quisesse repetir o campo &#8220;hello&#8221; varias vezes eu  poderia simplesmente multiplicar pelo valor que eu quisesse, exemplo:<br />
||     for numero in range(1,20000):<br />
||        print &#8216;hello&#8217;*5</p>
<p>Resultado:<br />
||      hellohellohellohellohello<br />
||     hellohellohellohellohello<br />
||      hellohellohellohellohello<br />
||     &#8230;.</p>
<p>Outra coisa que  aprendi no primeiro dia de Python foi como executar um script direto no  console ( prompt de comando ), sem a necessidade de clicar duas vezes no  arquivo<br />
Vá até a pasta que o arquivo está instalado e digite<br />
||     python hello.py<br />
ou<br />
||    hello.py</p>
<p>Esse foi o estudo que  realizei com Python no primeiro dia. Espero amanha ter tempo para  investir mais um tempo e testar outras coisas, como por exemplo, mais  laçõs de repetição, condicionais e o que mais surgir de dúvida.</p>
<p>Peço  que me ajudem a erros que cometi acima, e fatos que ainda não aprendi e  quais podem ser meus próximos passos.</p>
<p>Até mais</p>
<p>Paulo  Fernandes<br />
<a href="http://twitter.com/paulofernandesj" target="_blank">@paulofernandesj</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/desenvolvimento/primeiro-dia-com-o-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SCRUM em 2 minutos</title>
		<link>http://www.phpaulo.com.br/metodologia/scrum-em-2-minutos/</link>
		<comments>http://www.phpaulo.com.br/metodologia/scrum-em-2-minutos/#comments</comments>
		<pubDate>Mon, 10 May 2010 12:00:51 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Metodo]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=59</guid>
		<description><![CDATA[O texto abaixo foi criado por Paulo Fernandes (eu) e Jefferson Lira como parte do artigo Como atender os requisitos arquiteturais de software usando métodos ágeis como SCRUM e XP.
O SCRUM é um processo iterativo e incremental para o desenvolvimento de qualquer produto e gerenciamento de qualquer projeto, a quem diga que esta mais para [...]]]></description>
			<content:encoded><![CDATA[<p>O texto abaixo foi criado por <a title="E-mail de Contato" href="mailto:paulofernandesjr@gmail.com">Paulo Fernandes (eu)</a> e <a title="E-mail de Contato" href="mailto:jefferson.l.vieira@gmail.com">Jefferson Lira</a> como parte do artigo <a title="Como-atender-os-requisitos-arquiteturais-de-software-usando-métodos-ágeis-como-SCRUM-e-XP" href="http://www.phpaulo.com.br/artigo/pos/Como-atender-os-requisitos-arquiteturais-de-software-usando-metodos-ageis-como-SCRUM-e-XP.pdf" target="_blank">Como atender os requisitos arquiteturais de software usando métodos ágeis como SCRUM e XP</a>.</p>
<p>O SCRUM é um processo iterativo e incremental para o desenvolvimento de qualquer produto e gerenciamento de qualquer projeto, a quem diga que esta mais para um framework que uma metodologia, ou até mesmo mais para atitude que um processo.</p>
<p>Para que o SCRUM seja utilizado com êxito, cada pessoa envolvida deve cumprir com seu papel, seguindo corretamente todos os processos, e a fim de viabilizar, utilizar como apoio algumas das ferramentas que lhe são oferecidas. Entretanto, para que seja possível seguir corretamente todos os processos, primordialmente é necessário que todos estejam de acordo com a cultura envolvida.</p>
<p>Segue abaixo uma breve descrição sobre os três papeis relacionados ao SCRUM:</p>
<p><strong>Product Owner</strong>: responsável por garantir o retorno de investimento, este deve conhecer as necessidades do cliente;</p>
<p><strong>Scrum Master</strong>: responsável por remover os impedimentos do time e garantir o uso do SCRUM;</p>
<p><strong>Time (Equipe)</strong>: equipe de desenvolvimento multidisciplinar e auto-gerenciável, responsável por produzir produto com qualidade e valor para o cliente.</p>
<p>As ferramentas como: <strong>Product Backlog</strong>, <strong>Sprint Backlog</strong>, <strong>Burndown Chart</strong> e <strong>Scrum Board</strong> são de grande utilidade durante o ciclo de vida do SCRUM. Para um melhor entendimento, segue abaixo uma breve descrição:</p>
<p><strong>Product Backlog</strong>: uma lista com todos os requisitos que o Product Owner deseja, sem muitos detalhes técnicos, essa lista é ordenada por prioridade pelo Product Owner;</p>
<p><strong>Sprint Backlog</strong>: contém uma lista com as tarefas decompostas sobre os itens extraídos do Product Backlog que foi definida no Sprint Planning Meeting e que deverá ser entregue ao Product Owner.  Estas atividades não devem durar mais de 2 dias ou 16 horas;</p>
<p><strong>BurnDown Chart</strong>: gráfico que mostra o trabalho da equipe dia a dia, avaliando assim se o Sprint está atrasado ou não. Caso o gráfico demonstre que a equipe acabará o Sprint antes, o Product Owner é consultado e novas funcionalidades são incorporadas àquele Sprint;</p>
<p><strong>Scrum Board</strong>: é um quadro onde deverá contemplar todas as tarefas que serão realizadas dentro de um Sprint e listadas de acordo com as prioridades de cada item.</p>
<p>Existem três tipos de cerimônias no SCRUM,<strong> Sprint Planning Meeting</strong>, <strong>Daily Scrum Meeting</strong> e <strong>Sprint Review Meeting</strong>, estes três tipos de evento caracterizam bem o ciclo de vida de cada Sprint: início, meio e fim. Segue abaixo uma breve descrição sobre as cerimônias:</p>
<p><strong>Sprint Planning Meeting</strong>: encontro para planejar o que será feito no Sprint. A equipe acessa o Product Backlog e detalha de forma mais ampla as atividades que serão executadas no Sprint de acordo com suas prioridades, avaliando tempo e complexidade. Após definido o que será feito, o Sprint Backlog é gerado;</p>
<p><strong>Daily Scrum Meeting</strong>: encontros diários, com duração em média de 15 minutos, a idéia de ser uma reunião em que cada membro da equipe deve responder 3 perguntas: O que fiz ontem? O que farei hoje? O que está impedindo de que alcance o objetivo? Essa reunião é liderada pelo ScrumMaster;</p>
<p><strong>Sprint Review Meeting</strong>: encontro realizado quando o Sprint chega ao fim. Este encontro é dividido em duas partes, na primeira parte é demonstrado ao ProductOwner quais atividades definidas no Product Backlog foram realizadas, o Product Owner lidera esse encontro e pode chamar todos os interessados no projeto. Após a demonstração o Product Owner e os interessados no projeto atualizam e repriorizam o Product Backlog, definindo assim o próximo Sprint. Finalizada essa primeira parte o ScrumMaster toma a liderança e começa uma reunião com a equipe, onde a equipe avalia o que foi realizado positivamente e negativamente no Sprint, também avaliam o que poderia ser mudado para melhorar o próximo Sprint.</p>
<p>O <strong>Sprint</strong> é um conjunto de tarefas a serem executadas em um determinado tempo. A Figura 1 ilustra o ciclo de vida do SCRUM.</p>
<div class="wp-caption aligncenter" style="width: 311px"><a href="http://www.phpaulo.com.br/artigo/pos/ciclo-de-vida-scrum.jpg"><img title="Ciclo de Vida do SCRUM" src="http://www.phpaulo.com.br/artigo/pos/ciclo-de-vida-scrum.jpg" alt="Ciclo de Vida do SCRUM" width="301" height="140" /></a><p class="wp-caption-text">Ciclo de Vida do SCRUM</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/metodologia/scrum-em-2-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arquitetura de Software em 2 minutos</title>
		<link>http://www.phpaulo.com.br/arquitetura/arquitetura-de-software-em-2-minutos/</link>
		<comments>http://www.phpaulo.com.br/arquitetura/arquitetura-de-software-em-2-minutos/#comments</comments>
		<pubDate>Mon, 10 May 2010 12:00:26 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Arquitetura de Software]]></category>
		<category><![CDATA[ISO 9126]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=54</guid>
		<description><![CDATA[O texto abaixo foi criado por Paulo Fernandes (eu) e Jefferson Lira como parte do artigo Como atender os requisitos arquiteturais de software usando métodos ágeis como SCRUM e XP.
A arquitetura do software é um ponto de extrema importância no desenvolvimento e deverá ter uma maior atenção quando sua existência é de grande complexidade para [...]]]></description>
			<content:encoded><![CDATA[<p>O texto abaixo foi criado por <a title="E-mail de Contato" href="mailto:paulofernandesjr@gmail.com">Paulo Fernandes (eu)</a> e <a title="E-mail de Contato" href="mailto:jefferson.l.vieira@gmail.com">Jefferson Lira</a> como parte do artigo <a title="Como-atender-os-requisitos-arquiteturais-de-software-usando-métodos-ágeis-como-SCRUM-e-XP" href="http://www.phpaulo.com.br/artigo/pos/Como-atender-os-requisitos-arquiteturais-de-software-usando-metodos-ageis-como-SCRUM-e-XP.pdf" target="_blank">Como atender os requisitos arquiteturais de software usando métodos ágeis como SCRUM e XP</a>.</p>
<p>A arquitetura do software é um ponto de extrema importância no desenvolvimento e deverá ter uma maior atenção quando sua existência é de grande complexidade para o sucesso do software, pois a definição desta poderá não ser a mais apropriada para o negócio. A má escolha de uma arquitetura de software fará com que o projeto possa ser um desastre, já a melhor escolha propicia uma maior chance para o sucesso do projeto. Abaixo evidenciamos definições sobre o que é a arquitetura de um software.</p>
<p>A arquitetura de software de um programa ou de um sistema é a estrutura ou estruturas do sistema, que incluem elementos de software, propriedades externas e as suas relações.</p>
<p>A arquitetura de software define a estrutura básica do sistema. A arquitetura é modulada em um alto nível de funcionalidades do sistema, gerenciamento e distribuição de dados, qual plataforma será usada, etc.</p>
<p>Arquitetura de software é a estrutura dos componentes do sistema/programa, seus relacionamentos, princípios e diretrizes para o projeto e sua evolução.</p>
<p>Devido as definições citadas acima, formalizamos que não existe uma definição mundial sobre o que é a arquitetura de software. As definições no geral enfatizam que a arquitetura é a descrição do sistema e a soma de pequenas partes dele, e como essas partes se relacionam e cooperam entre si para executar o trabalho do sistema. A qualidade e longevidade do software são determinadas pela sua arquitetura.</p>
<p>Não podemos confundir a arquitetura do software com o design. A arquitetura se preocupa com a seleção de elementos arquiteturais, suas iterações e restrições, já o design são as atividades que se preocupam com a modularização e detalhamento de interfaces, algoritmos, procedimentos e tipos de dados que darão suporte satisfatório a arquitetura.</p>
<p>Um software tipicamente contempla requisitos funcionais e não funcionais, sendo que muitas das vezes um deverá refletir o comportamento do outro. Os requisitos funcionais descrevem as funções que o software deve ser capaz de realizar. Já os requisitos não-funcionais descrevem as qualidades e restrições de como o sistema realiza suas funções. Um software, portanto, deve exibir atributos de qualidade que atendam aos seus requisitos.</p>
<p>O ideal é que os atributos de qualidade do software sejam identificados e qual a sua influência na arquitetura, por fim relacionar estes atributos as decisões arquiteturais que os proporcionam.</p>
<p>Com um modelo de apoio para definir e organizar os atributos do software importantes para a avaliação de sua qualidade existe a norma ISO 9126. Esta norma é um padrão internacional para avaliação da qualidade do software. Os atributos utilizados para avaliar a qualidade do software são os seguintes:</p>
<p><strong>Funcionalidade</strong>: é a capacidade do software realizar as funções que foram especificadas;</p>
<p><strong>Confiabilidade</strong>: é a capacidade do software ser seguro e tolerante a falhas;</p>
<p><strong>Usabilidade</strong>: é a medida da facilidade do usuário executar alguma funcionalidade do sistema;</p>
<p><strong>Eficiência</strong>: é a capacidade do sistema alcançar a resposta dentro do período de tempo especificado, está relacionado tanto ao desempenho quanto aos recursos usados;</p>
<p><strong>Manutenibilidade</strong>: é a medida de quanto o software é fácil ser alterado;</p>
<p><strong>Portabilidade</strong>: é a medida da facilidade do software ser portado para outro ambiente.</p>
<p>Tendo definido as decisões e informações arquiteturais, seja performance, escalabilidade, arquitetura de referência, segurança, ou outros itens, estas devem ser armazenadas em um documento. O documento mais comum que encontramos é o DAS (Documento de Arquitetura de Software). Este documento é de grande utilidade para guiar a equipe de desenvolvimento. <strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/arquitetura/arquitetura-de-software-em-2-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eXtreme Programming (XP) em 2 minutos</title>
		<link>http://www.phpaulo.com.br/metodologia/extreme-programming-xp-em-2-minutos/</link>
		<comments>http://www.phpaulo.com.br/metodologia/extreme-programming-xp-em-2-minutos/#comments</comments>
		<pubDate>Mon, 10 May 2010 12:00:03 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[eXtrme Programming]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=62</guid>
		<description><![CDATA[O texto abaixo foi criado por Paulo Fernandes (eu) e Jefferson Lira como parte do artigo Como atender os requisitos arquiteturais de software usando métodos ágeis como SCRUM e XP.
Extreme Programming ou XP como é chamado é um processo de desenvolvimento de software baseado em valores de simplicidade, comunicação, feedback e coragem. O objetivo do [...]]]></description>
			<content:encoded><![CDATA[<p>O texto abaixo foi criado por <a title="E-mail de Contato" href="mailto:paulofernandesjr@gmail.com">Paulo Fernandes (eu)</a> e <a title="E-mail de Contato" href="mailto:jefferson.l.vieira@gmail.com">Jefferson Lira</a> como parte do artigo <a title="Como-atender-os-requisitos-arquiteturais-de-software-usando-métodos-ágeis-como-SCRUM-e-XP" href="http://www.phpaulo.com.br/artigo/pos/Como-atender-os-requisitos-arquiteturais-de-software-usando-metodos-ageis-como-SCRUM-e-XP.pdf" target="_blank">Como atender os requisitos arquiteturais de software usando métodos ágeis como SCRUM e XP</a>.</p>
<p>Extreme Programming ou XP como é chamado é um processo de desenvolvimento de software baseado em valores de simplicidade, comunicação, feedback e coragem. O objetivo do XP é assegurar que o cliente receba o máximo de valor a cada dia de trabalho da equipe de desenvolvimento. Ele é organizado em torno de valores e práticas que atuam de forma harmônica e coesa para assegurar que o cliente sempre receba um alto retorno do investimento em software.</p>
<p>Os quatro valores fundamentais em que o XP se baseia são:</p>
<p><strong>Feedback</strong>: fazer com que o cliente conduza o desenvolvimento diariamente a fim de garantir que a equipe direcione toda a sua atenção para aquilo que de fato irá gerar mais valor;</p>
<p><strong>Comunicação</strong>: evitar o gasto de um valioso esforço na tentativa de trocar informações por meios de extensos documentos escritos que freqüentemente são interpretados de forma incorreta ou incompleta;</p>
<p><strong>Simplicidade</strong>: garantir que seja desenvolvido apenas o suficiente para atender as necessidades atuais do cliente, desprezando qualquer funcionalidade não essencial;</p>
<p><strong>Coragem</strong>: devido ao XP ser uma metodologia de software que se baseia em diversas premissas que contrariam os processos tradicionais de desenvolvimento de software, é preciso que todos da equipe tenham coragem para adotá-las e acreditar que, utilizando as práticas e valores do XP, serão capazes de fazer com que o software evolua com segurança e agilidade.</p>
<p>O XP tem alguns pontos fortes que auxiliam no processo de desenvolvimento, a citar:</p>
<p><strong>Cliente Presente</strong>: a presença objetiva viabilizar a simplicidade dos processos, facilitar a comunicação com os desenvolvedores e permitir um ciclo continuo e rápido de feedback;</p>
<p><strong>Jogo do Planejamento</strong>: reunião com o cliente a cada nova release a fim de definir quais funcionalidades devem ser implementadas de acordo com suas priorizações;</p>
<p><strong>Stand Up Meeting</strong>: reunir com a equipe de desenvolvimento a cada manhã para avaliar o trabalho que foi executado no dia anterior e priorizar aquilo que será implementado no dia que se inicia;<strong> </strong></p>
<p><strong>Refactoring</strong>: é utilizado para manter sempre o software o mais simples possível de ser manipulado sem que estas alterações no código possam afetar as funcionalidades que já estão implementadas;</p>
<p><strong>Código Coletivo</strong>: a idéia é que o código seja comunitário a todos os desenvolvedores, permitindo assim que todos possam alterar o código quando necessário sem ter que pedir autorização de outra pessoa;</p>
<p><strong>Código Padronizado</strong>: a fim de permitir que o sistema seja o mais homogêneo possível, a equipe deve estabelecer padrões de codificação, viabilizando assim a facilidade de qualquer manutenção futura;</p>
<p><strong>Metáfora</strong>: técnica para transmitir idéias de formas simples, através de uma linguagem comum que é estabelecida entre a equipe e o cliente;<strong> </strong></p>
<p><strong>Ritmo Sustentável</strong>: é recomendável que os desenvolvedores trabalhem apenas 8 horas por dia a fim de garantir o máximo de rendimento e permitir a produção de software com a melhor qualidade possível;</p>
<p><strong>Design Simples</strong>: optar sempre pela simplicidade do design, viabilizando a agilidade durante o desenvolvimento, dado que o feedback deve ser rápido ao cliente;</p>
<p><strong>Integração Contínua</strong>: a equipe de desenvolvimento deve garantir a integração de seus códigos com o restante do sistema diversas vezes ao dia;</p>
<p><strong>Releases Curtos</strong>: visa à disponibilidade de funcionalidades rapidamente ao cliente para que ele possa utilizar o software no dia-a-dia e se beneficiar dele.</p>
<p><strong>Desenvolvimento Guiado pelos Testes</strong>: visa o desenvolvedor escrever testes para cada funcionalidade antes mesmos de começar a codificá-las, possibilitando eles aprofundar o entendimento das necessidades do cliente;</p>
<p>Abaixo a Figura demonstra as práticas e os principais ciclos do XP:</p>
<div class="wp-caption aligncenter" style="width: 330px"><a href="http://www.phpaulo.com.br/artigo/pos/praticas-e-principios-do-xp.jpg"><img title="Práticas e princípios do XP" src="http://www.phpaulo.com.br/artigo/pos/praticas-e-principios-do-xp.jpg" alt="Práticas e princípios do XP" width="320" height="241" /></a><p class="wp-caption-text">Práticas e princípios do XP</p></div>
<p>A idéia da utilização do XP é voltada para projetos cujos requisitos são vagos e mudam com freqüência, desenvolvimento de sistema orientado a objeto, equipes pequenas e de preferência até 12 desenvolvedores. Este desenvolvimento deverá atender o modo iterativo ou incremental, objetivando que o sistema comece a ser implementado logo no início do projeto e ao longo do tempo adquirindo novas funcionalidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/metodologia/extreme-programming-xp-em-2-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando DWR em sua aplicação Java para criar o efeito de onchange de um combobox para outro</title>
		<link>http://www.phpaulo.com.br/java/instalando-dwr-em-sua-aplicacao-java-para-criar-o-efeito-de-onchange-de-um-combobox-para-outro/</link>
		<comments>http://www.phpaulo.com.br/java/instalando-dwr-em-sua-aplicacao-java-para-criar-o-efeito-de-onchange-de-um-combobox-para-outro/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 14:25:10 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[cidades]]></category>
		<category><![CDATA[classico]]></category>
		<category><![CDATA[combo]]></category>
		<category><![CDATA[dwr]]></category>
		<category><![CDATA[estados]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=39</guid>
		<description><![CDATA[Objetivo
Este artigo tem como objetivo principal ser rápido, direto e ilustrar como criar um combobox (elemento select do HTML) de estados e no evento de onchange criar a lista de cidades a partir do estado.
Como configurar
A primeira coisa que deve ser feita é acessar o site do framework DWR (http://directwebremoting.org/dwr/index.html) após isso, baixe à última [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objetivo</strong></p>
<p>Este artigo tem como objetivo principal ser rápido, direto e ilustrar como criar um <strong>combobox</strong> (elemento <strong>select</strong> do HTML) de estados e no evento de <strong>onchange</strong> criar a lista de cidades a partir do estado.</p>
<p><strong>Como configurar</strong></p>
<p>A primeira coisa que deve ser feita é acessar o site do framework DWR (<a href="http://directwebremoting.org/dwr/index.html">http://directwebremoting.org/dwr/index.html</a>) após isso, baixe à última versão estável do framework, no momento da escrita deste artigo a versão é <strong>2.0.5</strong>.</p>
<p>No próprio site do <strong>DWR</strong>, existe um tutorial <strong>Get Started</strong> que ensina passa a passo como instalar, configurar e ainda alguns exemplos do que pode ser feito e de como fazê-los. Neste artigo será feito um passo a passo mais resumido que o encontrado no site, caso queira mais detalhes, entre no site do framework. Abaixo segue um passo a passo do que deve ser feito:</p>
<p>1. Adicione a lib do DWR (<strong>dwr.jar</strong>) ao classpath da aplicação (copie o arquivo <strong>dwr.jar</strong> para a pasta <strong>WEB-INF/lib</strong>, por exemplo);</p>
<p>2. Adicione o seguinte trecho de código ao arquivo <strong>web.xml</strong>, que está dentro da pasta WEB-INF;</p>
<blockquote><p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;<span style="text-decoration: underline;">dwr</span>-invoker&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;org.directwebremoting.servlet.DwrServlet&lt;/servlet-class&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;debug&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;true&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt;<span style="text-decoration: underline;">dwr</span>-invoker&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/<span style="text-decoration: underline;">dwr</span>/*&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p></blockquote>
<p>3. Crie dentro da pasta <strong>WEB-INF</strong> um arquivo chamado <strong>dwr.xml</strong>, adicione o seguinte conteúdo dentro dele (Este arquivo será explicado mais tarde);</p>
<blockquote><p>&lt;!DOCTYPE dwr PUBLIC</p>
<p>&#8220;-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN&#8221;</p>
<p>&#8220;http://getahead.org/dwr/dwr20.dtd&#8221;&gt;</p>
<p>&lt;dwr&gt;</p>
<p>&lt;allow&gt;</p>
<p>&lt;create creator=<em>&#8220;new&#8221;</em> javascript=<em>&#8220;AjaxDwr&#8221;</em>&gt;</p>
<p>&lt;param name=<em>&#8220;class&#8221;</em> value=<em>&#8220;br.com.phpaulo.dwr.exemplo.util.AjaxDwr&#8221;</em>/&gt;</p>
<p>&lt;/create&gt;</p>
<p>&lt;convert converter=<em>&#8220;bean&#8221;</em> match=<em>&#8221; br.com.phpaulo.dwr.exemplo.bean.Fornecedor&#8221;</em> /&gt;</p>
<p>&lt;convert converter=<em>&#8220;bean&#8221;</em> match=<em>&#8221; br.com.phpaulo.dwr.exemplo.bean.Municipio&#8221;</em> /&gt;</p>
<p>&lt;/allow&gt;</p>
<p>&lt;/dwr&gt;</p></blockquote>
<p>4. Pronto! Sua aplicação já está utilizando o framework DWR.</p>
<p><strong>Código Java e JavaScript</strong></p>
<p>Para atingir o objetivo do artigo que é ser simples e direto, assumimos que o código Java e a página JSP da aplicação estão prontas e somente necessitem de ajustes para o <strong>DWR</strong>, caso precise de mais algum suporte, deixe um comentário ou mande um e-mail para o autor. Vamos à parte visual para este exemplo. Adicione na sua página JSP a chamada das bibliotecas JavaScript necessárias:</p>
<blockquote><p>&lt;script type=<em>&#8216;text/javascript&#8217;</em> src=<em>&#8216;</em>&lt;%=request.getContextPath() %&gt;<em>/dwr/engine.js&#8217;</em>&gt;&lt;/script&gt;</p>
<p>&lt;script type=<em>&#8216;text/javascript&#8217;</em> src=<em>&#8216;</em>&lt;%=request.getContextPath() %&gt;<em>/dwr/util.js&#8217;</em>&gt;&lt;/script&gt;</p></blockquote>
<p>Quando o arquivo <strong>dwr.xml</strong> foi criado, adicionamos o seguinte bloco de código:</p>
<blockquote><p>&lt;create creator=<em>&#8220;new&#8221;</em> javascript=<em>&#8220;AjaxDwr&#8221;</em>&gt;</p>
<p>&lt;param name=<em>&#8220;class&#8221;</em> value=<em>&#8220;br.com.phpaulo.dwr.exemplo.util.AjaxDwr&#8221;</em>/&gt;</p>
<p>&lt;/create&gt;</p></blockquote>
<p>Este bloco significa que um <strong>novo</strong> arquivo JavaScript será criado e o nome desse arquivo será <strong>AjaxDwr</strong>, veja as opções no bloco acima, bem intuitivo não. O conteúdo desse arquivo será o mesmo que a classe Java que está mapeada no parâmetro <strong>value</strong> dentro da tag<strong> create</strong>, com todos os métodos dessa classe com uma função de retorno (<strong>callback</strong>).</p>
<p>Adicione na página que você deseja ter o suporte ao DWR a seguinte linha:</p>
<blockquote><p>&lt;script type=<em>&#8216;text/javascript&#8217;</em> src=<em>&#8216;</em>&lt;%=request.getContextPath() %&gt;<em>/dwr/interface/AjaxDwr.js&#8217;</em>&gt;&lt;/script&gt;</p></blockquote>
<p>Esta linha poderá ser alterada, tudo dependerá do nome que você der ao JavaScript da classe. O &lt;%=request.getContextPath() %&gt; é apenas para referenciar o contexto da aplicação. Com esse processo feito agora só precisamos criar a função JavaScript que será executada no evento <strong>onchange</strong> do combo de estados, essa função pode ser vista abaixo:</p>
<blockquote><p>1<strong>.function</strong> atualizaCombo() {</p>
<p>2.      <strong>var</strong> uf = dwr.util.getValue(&#8221;uf&#8221;);</p>
<p>3.      AjaxDwr.getCidades(uf, montaCombo);</p>
<p>4.}</p>
<p>5.</p>
<p>6.<strong>function</strong> montaCombo(data){</p>
<p>7.    dwr.util.removeAllOptions(&#8221;cidade&#8221;);</p>
<p>8.    dwr.util.addOptions(&#8221;cidade&#8221;, data, &#8220;idMunicipio&#8221;, &#8220;nmMunicipio&#8221;);</p>
<p>9.}</p></blockquote>
<p>Repare na função, usamos variáveis do DWR. Abaixo é explicado linha a linha o que é feito no código acima:</p>
<p>Linha 1. Declara a função <strong>atualizaCombo</strong>, sem parâmetro;</p>
<p>Linha 2. Armazena o valor selecionado no combo cujo <strong>id</strong> seja igual a <strong>uf;</strong></p>
<p>Linha 3. Invoca a classe <strong>AjaxDwr</strong>, definida no arquivo <strong>dwr.xml</strong> e chama o método <strong>getCidades </strong>passando como parâmetro o id do estado, através da variável <strong>uf</strong> definida na Linha 2 e chama uma função no <strong>callback</strong> da <strong>getCidades</strong>, chamar no callback, quer dizer que ela será executada quando o método <strong>getCidades</strong> da classe Java for concluído, no caso essa função chama <strong>montaCombo</strong> e deverá ser passada sem parâmetros, pois está implícito que ele recebe o retorno da função <strong>getCidades</strong>;</p>
<p>Linha 6. Declara a função <strong>montaCombo</strong>, recebendo como parâmetro a o retorno do método <strong>getCidades</strong>;</p>
<p>Linha 7. Remove todos os elementos <strong>&lt;option&gt; </strong>que o combo de tiver, essa função recebe como parâmetro o id do elemento que queremos remover as opções;</p>
<p>Linha 8. Adiciona toda a lista de elementos que vir de retorno do método <strong>getCidades,</strong> no caso, essas opções são as cidades, a assinatura do método é dwr.util.addOptions(id_do_elemento, conteúdo_de_retorno, campo_que_representa_o_value, campo_que_representa_o_texto_do_valor); Onde:</p>
<p><strong>id_do_elemento</strong>: representa o id do combo que deve receber os dados;</p>
<p><strong>conteúdo_de_retorno</strong>: representa o conteúdo que deve ser retornado pelo método, qualquer nome válido pode ser usado;</p>
<p><strong>campo_que_representa_o_value</strong>: nome do atributo que está definido no bean que representa o id;</p>
<p><strong>campo_que_representa_o_texto_do_valor</strong>: nome do atributo que está definido no bean que representa o texto a ser exibido no option.</p>
<p>Para mais informações de possibilidades de adicionar opções, veja o seguinte link <a href="http://directwebremoting.org/dwr/browser/util/lists.html">http://directwebremoting.org/dwr/browser/util/lists.html</a>.</p>
<p>O método <strong>getCidades </strong>da classe Java, deve ser um método simples, deve retornar uma lista de cidades, como o método abaixo:</p>
<blockquote><p><strong>public</strong> List&lt;Cidade&gt; getCidades(<strong>int</strong> idEstado){</p>
<p>List&lt;Cidade&gt; listaCidades = <strong>new</strong> ArrayList&lt;Cidade&gt;();</p>
<p><strong>if</strong>( idEstado &gt; 0 ) {</p>
<p><strong>try</strong> {</p>
<p>listaCidades = <strong>new</strong> CidadeDAO().getMunicipios(idEstado);</p>
<p>} <strong>catch</strong>(SQLException e){</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>}</p>
<p><strong>return</strong> listaCidades;</p>
<p>}</p></blockquote>
<p>Um detalhe importante para que isso funcione é que criemos um <em>converter</em> no <strong>DWR</strong> para que ele saiba qual <strong>bean</strong> pode converter, o por isso dessa linha no arquivo <strong>dwr.xml.</strong></p>
<blockquote><p>&lt;convert converter=<em>&#8220;bean&#8221;</em> match=<em>&#8221; br.com.phpaulo.dwr.exemplo.bean.Fornecedor&#8221;</em> /&gt;</p></blockquote>
<p>Para cada <strong>bean</strong> que for utilizar crie um <em>converter </em>para o DWR saber em quais classes ele pode converter e dessa forma realizar a conversão de forma correta.</p>
<p><strong>Conclusão</strong></p>
<p>Da forma que foi exibido acima, você poderá criar um <strong>combo</strong> com uma lista de opções de qualquer classe e no evento <strong>onchange</strong> filtrar opções para o próximo combo.</p>
<p>Caso o erro <strong>“data is null” </strong>for exibido, verifique se não esqueceu de configurar o converter, ou reveja as opções definidas no método <strong>addOptions.</strong></p>
<p>A idéia foi mostrar de forma clara e objetiva como criar o clássico caso de selecionar um estado e gerar a lista de cidades. Espero que aproveitem e que este artigo faça com que o seu trabalho fique mais produtivo.</p>
<p><strong>Links</strong></p>
<p><a href="http://directwebremoting.org/">http://directwebremoting.org/</a></p>
<p><a href="http://directwebremoting.org/dwr/introduction/getting-started.html">http://directwebremoting.org/dwr/introduction/getting-started.html</a></p>
<p><a href="http://directwebremoting.org/dwr/browser/util/lists.html">http://directwebremoting.org/dwr/browser/util/lists.html</a></p>
<p><a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=3733">http://www.devmedia.com.br/articles/viewcomp.asp?comp=3733</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/java/instalando-dwr-em-sua-aplicacao-java-para-criar-o-efeito-de-onchange-de-um-combobox-para-outro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A API do Yahoo! meme</title>
		<link>http://www.phpaulo.com.br/desenvolvimento/a-api-do-yahoo-meme/</link>
		<comments>http://www.phpaulo.com.br/desenvolvimento/a-api-do-yahoo-meme/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 02:41:44 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=32</guid>
		<description><![CDATA[Em outubro de 2009 o Yahoo! liberou a versão beta do meme (http://meme.yahoo.com). Para quem não sabe o meme é um serviço de microblog semelhante ao Twitter (http://twitter.com), porém no meme podemos postar vídeos, fotos, links, textos, arquivos de música e não temos um limite de 140 caracteres nas mensagens.
Até a data da escrita desse [...]]]></description>
			<content:encoded><![CDATA[<p>Em outubro de 2009 o Yahoo! liberou a versão <em>beta</em> do <strong><em>meme </em></strong>(<a href="http://meme.yahoo.com/">http://meme.yahoo.com</a>)<strong>. </strong>Para quem não sabe o <strong><em>meme</em></strong> é um serviço de microblog semelhante ao <strong><em>Twitter </em></strong>(<a href="http://twitter.com/">http://twitter.com</a>), porém no <strong><em>meme </em></strong>podemos postar vídeos, fotos, links, textos, arquivos de música e não temos um limite de 140 caracteres nas mensagens.</p>
<p>Até a data da escrita desse artigo, o serviço não era popular e não tinham ferramentas para acesso ao serviço, tudo tinha que ser pelo próprio site do <strong><em>meme</em></strong>. Como o objetivo do artigo é ser técnico não entraremos em detalhes do serviço e sim falaremos da API.</p>
<p><strong>Introdução</strong></p>
<p><strong> </strong>Para usar esta API, você precisa conhecer primeiramente um pouco sobre como o Yahoo! trabalha com suas APIs. O Yahoo! usa a linguagem <strong>YQL ( Yahoo Query Language), </strong>nada muito óbvio não? O <strong>YQL </strong>é uma linguagem baseada na mesma estrutura do <strong>SQL (Structure Query Language), </strong>para essa API do <strong><em>meme</em></strong> passamos os comandos via uma requisição HTTP, REST. O Yahoo! fornece suporte a alguns linguagens, entre elas <strong>Flash</strong>, <strong>Java</strong>, <strong>JavaScript</strong>, <strong>.NET</strong>, <strong>PHP</strong>, <strong>Python</strong>, <strong>Ruby</strong> e <strong>Silverlight</strong>, neste artigo não usaremos nenhuma linguagem, apenas mostraremos como chamar as querys e gerar as chamadas REST.</p>
<p>Abaixo temos um exemplo de como escrever uma query usando o <strong>YQL</strong>, está query é apenas um exemplo e não faz parte da API do <strong><em>meme</em></strong>. O resultado dela é um <strong>XML </strong>com todas as “tabelas” que podemos usar, podemos também fazer o retorno ser via <strong>JSON </strong>ao invés de <strong>XML. </strong>No artigo será trabalhado com <strong>XML</strong>.</p>
<p>Comando: <strong>show tables</strong></p>
<p>Requisição REST gerada: <a href="https://query.yahooapis.com/v1/public/yql?q=show%20tables&amp;format=xml"><strong><em>https://query.yahooapis.com/v1/public/yql?q=show%20tables&amp;format=xml</em></strong></a><strong><em> </em></strong></p>
<p><em> </em>Para testar mais comandos do <strong>YQL, </strong>sugiro que acesse o console de demonstração do Yahoo! <a href="https://developer.yahoo.com/yql/console/">https://developer.yahoo.com/yql/console/</a>. Apenas para comunicar que para muitas coisas, precisaremos estar autenticados com a nossa conta do Yahoo!</p>
<p>Agora que já sabemos um pouco como a API funciona, vamos colocar a mão na massa e trazer alguns resultados mais reais do <strong><em>meme.</em> </strong>A conta usada para os exemplos de requisições do <strong><em>meme</em></strong> será esta: <strong>paulofernandesj.</strong></p>
<p><strong> </strong></p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura1.jpg"><img title="Tela Console Yahoo!" src="http://www.phpaulo.com.br/artigo/images/api-yahoo-meme-1.jpg" alt="Tela Console Yahoo!" width="542" height="302" /></a><p class="wp-caption-text">Tela Console Yahoo!</p></div>
<p><strong>O que posso fazer?</strong></p>
<p>Não diferente de algumas APIs do Google, o Yahoo! também pede para que você obtenha uma chave para acesso a API. Para obter essa chave acesse a central dos desenvolvedores <a href="http://developer.yahoo.com/">http://developer.yahoo.com/</a>, isso caso queira criar um aplicativo. O objetivo deste artigo é mostrar as funcionalidades da API do <strong><em>meme</em></strong> através do console fornecido pelo próprio Yahoo!</p>
<p>Agora listaremos diversas querys que podem ser executadas para retornarem os resultados, acrescentaremos uma breve descrição sobre o resultado obtido. Uma coisa que precisamos deixar bem claro antes de iniciarmos o processo de explicação das querys é que nelas sempre constará o valor <strong>VNDIRCXTU6SOYRG2CTBU2D7SCY</strong> para o campo <strong>owner_guid</strong>,<strong> owner_guid</strong> é o campo pelo qual conseguimos trazer as informações de determinada conta do <strong><em>meme</em></strong>, deste que está conta não esteja privada no modo de visualização. Para trazer os resultados da sua conta, basta usar o primeiro comando abaixo e obterá o <strong>XML</strong> com os valores da sua conta, bastando apenas encontrar o campo<strong> owner_guid</strong> e começar a utilizar esta conta para as próximas consultas. Outra forma de obter os dados nas querys é colocar em <strong>owner_guid </strong>o valor <strong>me</strong>, sem aspas, porém este parâmetro trará somente as configurações da sua conta, veja os exemplos abaixo. O padrão para os itens abaixo será:</p>
<p>O que o comando faz</p>
<p>query <strong>YQL</strong></p>
<p>Chamada REST</p>
<p>Explicação mais detalhada (Caso necessário)</p>
<p>Só mais um fato importante que será muito útil para seu aprendizado. O Yahoo! disponibiliza um comando chamado <strong>desc &lt;tabela&gt;</strong>, que nada mais é do que a descrição da tabela que queremos usar. Observe o comando abaixo e teste-o na sua página do console para ver exatamente o seu retorno. Para a informação abaixo eu executei o comando <strong>desc meme.info.</strong></p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;</p>
<p>&lt;query xmlns:yahoo=&#8221;http://www.yahooapis.com/v1/base.rng&#8221; yahoo:count=&#8221;1&#8243; yahoo:created=&#8221;2009-10-13T08:36:40Z&#8221; yahoo:lang=&#8221;en-US&#8221; yahoo:updated=&#8221;2009-10-13T08:36:40Z&#8221; yahoo:uri=&#8221;https://query.yahooapis.com/v1/yql?q=desc+meme.info&#8221;&gt;</p>
<p>&lt;diagnostics&gt;</p>
<p>&lt;publiclyCallable&gt;true&lt;/publiclyCallable&gt;</p>
<p>&lt;user-time&gt;1&lt;/user-time&gt;</p>
<p>&lt;service-time&gt;0&lt;/service-time&gt;</p>
<p>&lt;build-version&gt;3431&lt;/build-version&gt;</p>
<p>&lt;/diagnostics&gt;</p>
<p>&lt;results&gt;</p>
<p>&lt;table security=&#8221;ANY&#8221;&gt;</p>
<p>&lt;meta&gt;</p>
<p>&lt;author&gt;Yahoo! Inc.&lt;/author&gt;</p>
<p>&lt;documentationURL/&gt;</p>
<p>&lt;sampleQuery&gt;SELECT * FROM meme.info WHERE owner_guid=me&lt;/sampleQuery&gt;</p>
<p>&lt;/meta&gt;</p>
<p>&lt;request&gt;</p>
<p>&lt;select&gt;</p>
<p>&lt;key name=&#8221;owner_guid&#8221;/&gt;</p>
<p>&lt;key name=&#8221;name&#8221;/&gt;</p>
<p>&lt;/select&gt;</p>
<p>&lt;/request&gt;</p>
<p>&lt;/table&gt;</p>
<p>&lt;/results&gt;</p>
<p>&lt;/query&gt;</p>
<p>O interessante nesse comando é que ele mostra muita coisa da estrutura da tabela, como por exemplo, o nível de <strong>segurança</strong> da tabela, exemplos de como podem ser feita as <strong>consultas com essa tabela</strong>, quais <strong>parâmetros</strong> podem ser passados no <strong>where</strong>.</p>
<p><strong>Exemplos</strong></p>
<p>Retornando as informações da sua conta através do <strong>owner_guid=me.</strong></p>
<p><strong>SELECT * FROM meme.info WHERE owner_guid=me</strong></p>
<p><strong><a href="https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.info%20WHERE%20owner_guid%3Dme&amp;format=xml">https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.info%20WHERE%20owner_guid%3Dme&amp;format=xml</a></strong></p>
<p>Se reparar no retorno, poderá pegar a sua chave do Yahoo! Acesse a estrutura da árvore do <strong>XML</strong> da seguinte forma <strong>result&gt;meme&gt;guid</strong>, dentro desse campo estará a chave para começar a consultar, repare que para consultar usando <strong>me, </strong>não precisamos de aspas simples, porém para a próximas consultas, usaremos o <strong>guid </strong>e colocaremos as consultas usando aspas simples.</p>
<p>_________________________________________________________________</p>
<p>Retornando os <em>followers</em> de uma conta pública, através do <strong>owner_guid</strong> da conta</p>
<p><strong>SELECT * FROM meme.followers </strong></p>
<p><strong>WHERE owner_guid=&#8217;VNDIRCXTU6SOYRG2CTBU2D7SCY&#8217;</strong></p>
<p><strong><a href="https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.followers%20WHERE%20owner_guid%3D%27VNDIRCXTU6SOYRG2CTBU2D7SCY%27&amp;format=xml">https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.followers%20WHERE%20owner_guid%3D&#8217;VNDIRCXTU6SOYRG2CTBU2D7SCY&#8217;&amp;format=xml</a></strong></p>
<p>O retorno dessa chamada REST retornará os dados dos meus <em>followers</em>, com essa informação eu consigo capturar outros dados desses <em>follower</em>, como por exemplo seus <em>posts</em>. Apenas para lembrar que o Yahoo! limita essa chamada a 10 <em>followers</em> para não retornar um XML muito extenso, dando trabalho para processar a requisição.</p>
<p>_________________________________________________________________</p>
<p>Retornando os <em>following</em> de uma conta pública, através do <strong>owner_guid</strong> da conta</p>
<p><strong>SELECT * FROM meme.following </strong></p>
<p><strong>WHERE owner_guid=&#8217;VNDIRCXTU6SOYRG2CTBU2D7SCY&#8217;</strong></p>
<p><strong><a href="https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.following%20WHERE%20owner_guid%3D%27VNDIRCXTU6SOYRG2CTBU2D7SCY%27&amp;format=xml">https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.following%20WHERE%20owner_guid%3D&#8217;VNDIRCXTU6SOYRG2CTBU2D7SCY&#8217;&amp;format=xml</a></strong></p>
<p>O retorno dessa chamada é bem parecido com o retorno dos <em>followers</em> a única diferença é que ele retorna os <em>followings</em>.</p>
<p>_________________________________________________________________</p>
<p>Retornando os <em>post</em> de uma conta pública, através do <strong>owner_guid</strong> da conta</p>
<p><strong>SELECT * FROM meme.posts</strong></p>
<p><strong>WHERE owner_guid=&#8217;VNDIRCXTU6SOYRG2CTBU2D7SCY&#8217;;</strong></p>
<p><strong><a href="https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.posts%20WHERE%20owner_guid%3D%27VNDIRCXTU6SOYRG2CTBU2D7SCY%27%3B&amp;format=xml">https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20meme.posts%20WHERE%20owner_guid%3D&#8217;VNDIRCXTU6SOYRG2CTBU2D7SCY&#8217;%3B&amp;format=xml</a></strong></p>
<p>Esta chamada retorna os <em>posts</em> do usuário que foi passado como parâmetro, nesse retorno ele traz os comentários, data que foi postado, conteúdo e mais algumas informações.</p>
<p>_________________________________________________________________</p>
<p>Inserindo um novo <em>post</em> em uma conta <strong>autenticada</strong></p>
<p><strong>INSERT INTO meme.user.posts (type, content) VALUES (&#8221;text&#8221;, &#8220;testando a API do meme&#8221;)</strong></p>
<p><strong><a href="https://query.yahooapis.com/v1/yql?q=INSERT%20INTO%20meme.user.posts%20%28type%2C%20content%29%20VALUES%20%28%22text%22%2C%20%22testando%20a%20API%20do%20meme%22%29&amp;format=xml">https://query.yahooapis.com/v1/yql?q=INSERT%20INTO%20meme.user.posts%20(type%2C%20content)%20VALUES%20(%22text%22%2C%20%22testando%20a%20API%20do%20meme%22)&amp;format=xml</a></strong></p>
<p>Este é uma das chamadas mais interessantes, pois ela acessa a sua conta e publica um <em>post</em>. Após a chamada, no próprio retorno ele traz os dados o <em>status</em> da postagem e os dados das informações do <em>post</em>, seria como se postasse e já listasse aquele <em>post</em>.</p>
<p>_________________________________________________________________</p>
<p>Excluindo um <em>post</em> de uma conta <strong>autenticada</strong></p>
<p><strong>DELETE FROM meme.user.posts WHERE pubid = &#8220;1aR2FNB&#8221;</strong></p>
<p><strong><a href="https://query.yahooapis.com/v1/yql?q=DELETE%20FROM%20meme.user.posts%20WHERE%20pubid%20%3D%20%221aR2FNB%22&amp;format=xml">https://query.yahooapis.com/v1/yql?q=DELETE%20FROM%20meme.user.posts%20WHERE%20pubid%20%3D%20%221aR2FNB%22&amp;format=xml</a></strong></p>
<p>Com esta chamada você consegue apagar um <em>post</em>, para isso precisa estar autenticado na conta e saber o <strong>pubid </strong>(<em>string</em> única do <em>post</em>). Para saber o <strong>pubid</strong>, basta usar o comando que lista os <em>posts. </em>Semelhante ao método para postagem ele retorna o status da exclusão, caso tente excluir um <em>post</em>, a chamada REST retorna um erro (<em>undefined</em>).</p>
<p>_________________________________________________________________</p>
<p>Existem outras chamadas que podem ser feitas, como por exemplo, seguir algum usuário, deixar de seguir alguém, e algumas mais.</p>
<p>Sempre que estiver em dúvida utiliza o comando <strong>desc &lt;tabela&gt;. </strong>Ele é de grande utilidade no trabalho com a API do Yahoo!</p>
<p><strong> </strong></p>
<p><strong>Conclusão</strong></p>
<p>Alguns dos comandos apresentados sozinhos não fazem muito sentido, mas a combinação deles pode gerar um resultado bem legal, como por exemplo, criar uma paginação dos <em>followers</em>, combinando a consulta das informações do usuário (tabela <strong>meme.info </strong>) com a listagem dos <em>followers</em>.</p>
<p>O objetivo deste artigo foi divulgar o <strong>YQL </strong>e mostrar os comandos da API do <strong>meme</strong>. Este artigo é bem básico, e mostra somente como realizar as chamadas aos métodos, não especificamos nenhuma linguagem, pois as chamadas são iguais para todas que façam chamadas via REST.</p>
<p>Escolha a linguagem que tem mais facilidade e teste essas chamadas, veja o poder que as chamadas REST e o <strong>YQL</strong> proporcionam.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/desenvolvimento/a-api-do-yahoo-meme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Colocando sua empresa no Google Maps</title>
		<link>http://www.phpaulo.com.br/utilidade/colocando-sua-empresa-no-google-maps/</link>
		<comments>http://www.phpaulo.com.br/utilidade/colocando-sua-empresa-no-google-maps/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 22:20:38 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Utilidade]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Maps]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=28</guid>
		<description><![CDATA[O Google tem diversos serviços que muitos de nós desconhecemos. Neste artigo será explicado um pouco sobre o Google Local Business Center. Este serviço permite que sua empresa e o endereço dela apareçam no Google, tanto na página inicial quando no Google Maps, preferencialmente no Google Maps. Para testar o serviço acesse http://www.google.com.br/local
Como Fazer 
A [...]]]></description>
			<content:encoded><![CDATA[<p>O Google tem diversos serviços que muitos de nós desconhecemos. Neste artigo será explicado um pouco sobre o <strong>Google Local Business Center</strong>. Este serviço permite que sua empresa e o endereço dela apareçam no Google, tanto na página inicial quando no <strong>Google Maps</strong>, preferencialmente no <strong>Google Maps</strong>. Para testar o serviço acesse <a href="http://www.google.com.br/local">http://www.google.com.br/local</a></p>
<p><strong>Como Fazer </strong></p>
<p><strong></strong>A primeira coisa que deve ser feita é o <em>login</em> com sua conta Google. Após esse processo para facilitar a localização do serviço, digite na busca do Google “Local Business Center” ou se preferir acesse esse link: <a href="http://www.google.com/local/add">http://www.google.com/local/add</a>.</p>
<p>A sua tela deverá ser bem parecida com a imagem abaixo.</p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura1.jpg"><img title="Tela Inicial" src="http://www.phpaulo.com.br/artigo/images/google-local-figura1.jpg" alt="Tela Inicial" width="542" height="302" /></a><p class="wp-caption-text">Tela Inicial</p></div>
<p>Clique no botão “<strong>Adicionar Nova Empresa</strong>” no lado direito da página. Preencha todos os campos que são solicitados, ao lado você consegue ter uma prévia do endereço localizado e dos dados digitados. Selecione até <strong>5 categorias</strong> que mais descrevem a área de atuação de sua empresa. Após preencher todos os campos clique em “<strong>Próximo</strong>”.</p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura2.jpg"><img title="Dados a serem digitados" src="http://www.phpaulo.com.br/artigo/images/google-local-figura2.jpg" alt="Dados a serem digitados" width="542" height="302" /></a><p class="wp-caption-text">Dados a serem digitados</p></div>
<p>Neste momento especifique o horário de funcionamento, opções de pagamento, fotos, vídeos e informações adicionais, tais como: Estacionamento, Lanchonete e o que mais a empresa tiver para oferecer aos clientes. Você também pode corrigir a localização no mapa, caso não tenha ficado exatamente onde sua empresa esta localizada, clique em “<strong>Enviar</strong>” para salvar as informações.</p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura3.jpg"><img title="Dados adicionais" src="http://www.phpaulo.com.br/artigo/images/google-local-figura3.jpg" alt="Dados adicionais" width="542" height="302" /></a><p class="wp-caption-text">Dados adicionais</p></div>
<p>Agora que os dados foram enviados para o Google, você precisa confirmar todas as informações solicitadas. Para isso, o Google disponibiliza três formas:</p>
<ol>
<li><strong>Por telefone</strong>: o Google ligará na sua empresa para confirmar os dados inseridos;</li>
<li><strong>Por SMS</strong>: o Google enviará um SMS confirmando os dados;</li>
<li><strong>Por cartão postal</strong>: o Google enviará um cartão postal para sua empresa, esse processo é o mais demorado, de 3 a 4 semanas.</li>
</ol>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura4.jpg"><img title="Opções de confirmação" src="http://www.phpaulo.com.br/artigo/images/google-local-figura4.jpg" alt="Opções de confirmação" width="542" height="302" /></a><p class="wp-caption-text">Opções de confirmação</p></div>
<p>Clique em “<strong>Concluir</strong>” para verificar as informações, no exemplo usado, foi solicitado via <strong>cartão postal</strong>, devido aos dados inseridos no sistema, veja a imagem abaixo.</p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura5.jpg"><img title="Opção selecionada" src="http://www.phpaulo.com.br/artigo/images/google-local-figura5.jpg" alt="Opção selecionada" width="542" height="302" /></a><p class="wp-caption-text">Opção selecionada</p></div>
<p>Caso sua empresa seja grande e tenha diversas unidades, você pode fazer o cadastro delas utilizando um serviço de <em>upload</em> dos dados. Acesse esse link <a href="http://www.google.com/local/add/uploadFeed?hl=pt-BR&amp;gl=BR">http://www.google.com/local/add/uploadFeed?hl=pt-BR&amp;gl=BR</a> para saber como proceder para realizar esse processo. A imagem abaixo mostra o <em>printscreen</em> do link citado.</p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/google-local-figura6.jpg"><img title="Opção de upload de arquivo" src="http://www.phpaulo.com.br/artigo/images/google-local-figura6.jpg" alt="Opção de upload de arquivo" width="542" height="302" /></a><p class="wp-caption-text">Opção de upload de arquivo</p></div>
<p><strong>Concluindo</strong></p>
<p><strong></strong>Agora que você já sabe como colocar o endereço da sua empresa no <strong>Google Maps</strong>, não perca tempo e coloque-a o mais rápido possível. Dessa forma você estará aumentando a sua chance de atrair novos clientes.</p>
<p>Para saber mais sobre os produtos do Google e como usá-los acesse o site do Grupo de Usuários de Tecnologia Google (GTUG-SP) <a href="http://groups.google.com.br/group/sp-gtug">http://groups.google.com.br/group/sp-gtug</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/utilidade/colocando-sua-empresa-no-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendendo um pouco a API Google Maps</title>
		<link>http://www.phpaulo.com.br/java/entendendo-um-pouco-a-api-google-maps/</link>
		<comments>http://www.phpaulo.com.br/java/entendendo-um-pouco-a-api-google-maps/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 03:00:59 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Maps]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=16</guid>
		<description><![CDATA[Artigo explica como usar a API Google Maps, do básico ao avançado]]></description>
			<content:encoded><![CDATA[<p>O Google dispensa comentários com todas as inovações que ele faz, hoje falaremos um pouco sobre a API do <em>Google Maps</em>. API (Application Programming Interface ou Interface de Programação de Aplicativos) é a forma que temos de nos comunicar com as funções pré-programadas definidas pelo fornecedor, no caso, Google.</p>
<p>Esta API permite a criação de mapas com locais definidos, controle de zoom, tipos de mapa, geração de rotas, pesquisa por estabelecimentos, e muitas coisas mais.</p>
<p><strong>Como começar</strong></p>
<p>A primeira coisa que devemos fazer é acessar o link da página inicial da API (<a href="http://code.google.com/intl/pt-BR/apis/maps/signup.html" target="_blank">http://code.google.com/intl/pt-BR/apis/maps/signup.html</a>), ler e aceitar o contrato, digitar a url do site que deseja usar a API e clicar no botão “Gerar chave da API”. (veja a figura 1)</p>
<div class="wp-caption aligncenter" style="width: 552px"><a href="http://www.phpaulo.com.br/artigo/images/api-google-maps-imagem-1.jpg"><img title="Figura 1: Aceitando o contrato" src="http://www.phpaulo.com.br/artigo/images/api-google-maps-imagem-1.jpg" alt="Figura 1: Aceitando o contrato" width="542" height="302" /></a><p class="wp-caption-text">Figura 1: Aceitando o contrato</p></div>
<p>Após isso, caso ainda não esteja logado com a sua “<em>Google Account</em>”, o Google pedirá para efetuar o login, nesse passo você obterá a chave para usar a API <strong>somente </strong>na url que digitou o site. Caso queira usar a API em outro site, deverá repetir esse processo para <strong>cada site</strong> que quiser. (Veja a figura 2)</p>
<div class="wp-caption aligncenter" style="width: 572px"><a href="http://www.phpaulo.com.br/artigo/images/api-google-maps-imagem-2.jpg"><img title="Figura 2: Chave Gerada" src="http://www.phpaulo.com.br/artigo/images/api-google-maps-imagem-2.jpg" alt="Figura 2: Chave Gerada" width="562" height="495" /></a><p class="wp-caption-text">Figura 2: Chave Gerada</p></div>
<p>Agora que já temos a chave, podemos usar a API no site. O Google disponibiliza alguns exemplos, para trabalhar com <em>JavaScript</em>, <em>Flash</em>, <em>Serviço</em>, etc..</p>
<p>Neste artigo abordaremos o uso da API para <em>JavaScript</em> e para isso devemos adicionar o seguinte script dentro do bloco <strong>head</strong> do HTML, no local <strong>“SUA_CHAVE”</strong>, você deve colocar a chave que o Google gerou para o site, veja o campo <strong><em>Your key is</em></strong><em> </em>na figura 2.</p>
<blockquote><p>&lt;script src=&#8221;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;sensor=true&amp;amp;key=<strong>SUA_CHAVE</strong>&#8220;&gt;&lt;/script&gt;</p></blockquote>
<p> O código de base para começar o aprendizado está abaixo:</p>
<blockquote><p>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221;</p>
<p>  &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#8221;&gt;</p>
<p>&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;</p>
<p>                        &lt;head&gt;</p>
<p>                                               &lt;title&gt;Aprendendo a Usar a API Google Maps | Paulo Fernandes &lt;/title&gt;</p>
<p>                                               &lt;meta content=&#8221;text/html; charset=ISO-8859-1&#8243; http-equiv=&#8221;Content-Type&#8221;/&gt;</p>
<p>                                               &lt;script src=&#8221;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;sensor=true&amp;amp;key=ABQIAAAAAaVFxs6kNq7gWY59qf5XMxSec6s_uUscdbTyPSy8oWl8zYzqFRRanjFebOU60thMmEQQDEPx3A3y5Q&#8221;&gt;&lt;/script&gt;</p>
<p>                                               &lt;script&gt;</p>
<p>                                                                       var map = null;</p>
<p>                                                                       var geocoder = null;</p>
<p>                                                                       function inicializa() {</p>
<p>                                                                                              if (GBrowserIsCompatible()) {</p>
<p>                                                                                                                      map = new GMap2(document.getElementById(&#8221;mapa_base&#8221;));</p>
<p>                                                                                                                      map.setCenter(new GLatLng(-22.9035393, -43.2095869), 13);</p>
<p>                                                                                                                      geocoder = new GClientGeocoder();</p>
<p>                                                                          }</p>
<p>                                                                       }</p>
<p>    &lt;/script&gt;</p>
<p>                        &lt;/head&gt;</p>
<p>                        &lt;body&gt;</p>
<p>                                               &lt;div style=&#8221;width: 500px; height: 300px&#8221;&gt;&lt;/div&gt;</p>
<p>                        &lt;/body&gt;</p>
<p>&lt;/html&gt;</p></blockquote>
<p>Este código não está difícil de entender, explicaremos as partes mais importantes:</p>
<ul>
<li>No <em>onload()</em>, a função <strong>inicializa()</strong> verifica se o navegador do usuário é compatível com a API Google Maps, caso positivo, o método captura uma div com id igual a <strong>“<em>mapa_base</em>”</strong> e defini o mapa centralizado. O local padrão que escolhi foi à cidade do <strong>Rio de Janeiro</strong>, que é representada pelas seguintes coordenadas de latitude e longitude <strong>-22.9035393, -43.2095869</strong>, respectivamente. O número seguinte, <strong>13</strong> representa o zoom no mapa, quando menor esse número, menor o zoom.</li>
<li>No <em>onunload()</em>, a função <strong>GUnload()</strong> serve para limpar as estruturas internas e liberar a memória.</li>
</ul>
<p>Para mais informações sobre os métodos acesse a documentação em português, através do seguinte link: <a href="http://code.google.com/intl/pt-BR/apis/maps/documentation/reference.html" target="_blank">http://code.google.com/intl/pt-BR/apis/maps/documentation/reference.html</a>. Essa documentação está interessante, e será a base para o artigo.</p>
<p><strong>Exemplos Simples</strong></p>
<p>No link a seguir podemos analisar diversos exemplos do poder desta API, <a href="http://code.google.com/intl/pt-BR/apis/maps/documentation/demogallery.html" target="_blank">http://code.google.com/intl/pt-BR/apis/maps/documentation/demogallery.html</a>.</p>
<p>Para o artigo, colocaremos alguns exemplos interessantes para inserir um mapa personalizado no site.</p>
<ul>
<li><strong>Descobrir qual a latitude e longitude do endereço</strong>: Isso é útil quando se pretende definir algum local como default ao entrar no site. Para isso faremos um formulário onde você digita o endereço e o mapa é carregado no endereço e exibe o posicionamento de latitude e longitude. O código <em>JavaScript</em> é esse:</li>
</ul>
<blockquote><p>function mostraEndereco(){</p>
<p>                                                var endereco = document.getElementById(&#8221;endereco&#8221;).value;</p>
<p>                                                if ( geocoder ) {</p>
<p>                                                                        geocoder.getLatLng(endereco,</p>
<p>                                                                                               function(point){</p>
<p>                                                                                                                       if ( !point ) {</p>
<p>                                                                                                                                              alert(endereco + &#8221; não encontrado&#8221;);</p>
<p>                                                                                                                       } else {</p>
<p>                                                                                                                                              map.setCenter(point, 13);</p>
<p>                                                                                                                                              var marca = new GMarker(point);</p>
<p>                                                                                                                                              map.addOverlay(marca);</p>
<p>                                                                                                                                               marca.openInfoWindowHtml( endereco + &#8220;&lt;br /&gt;&#8221; + point.toString() );</p>
<p>                                                                                                                       }</p>
<p>                                                                                               }</p>
<p>                                                                        );</p>
<p>                                                } else {</p>
<p>                                                                        alert(&#8221;GeoCoder não identificado&#8221;);</p>
<p>                                                }</p>
<p>}</p></blockquote>
<p>E no HTML:</p>
<blockquote><p>&lt;form action=&#8221;#&#8221; method=&#8221;get&#8221;&gt;</p>
<p>                                                &lt;input size=”50” value=&#8221;São Paulo&#8221; /&gt;</p>
<p>                                                &lt;input value=&#8221;Mostrar Latitude/Longitude&#8221;/&gt;</p>
<p>&lt;/form&gt;</p></blockquote>
<p> </p>
<ul>
<li><strong>Definindo um evento: </strong>Para definir um evento precisamos utilizar o objeto <strong>GEvent.</strong> Seguindo a mesma linha do código, definiremos um evento, que será disparado toda vez que o marcador for clicado, fazendo com que a posição geográfica seja exibida, devemos colocar esse evento na função <em>mostrarEndereco(), </em>pois é nela que definimos o marcador.</li>
</ul>
<blockquote><p>GEvent.addListener(marca, &#8220;click&#8221;, function() {                                                                                                                                                                               marca.openInfoWindowHtml( endereco + &#8220;&lt;br /&gt;&#8221; + point.toString() );                                                                        });</p>
<p> </p></blockquote>
<ul>
<li><strong>Adicionando zoom no mapa: </strong>Para adicionar o controle de zoom, devemos adicionar um controle ao mapa, através do método <em>addControl()</em> e a esse controle devemos adicionar o controle do mapa, o mais correto é adicionar isso na função de inicialização: <em>inicializa()</em>, a linha completa que deve ser inserida é está:<strong></strong></li>
</ul>
<blockquote><p>map.addControl( new GSmallMapControl() );</p></blockquote>
<p> </p>
<ul>
<li><strong>Adicionando forma de visualização: </strong>Podemos definir um controle para que o usuário possa ver o endereço na forma de mapa, hibrido ou satélite. Para isso devemos seguir a mesma linha de raciocínio para inserir o zoom, que seria adicionar um controle.<strong></strong></li>
</ul>
<blockquote><p>map.addControl( new GMapTypeControl() );</p></blockquote>
<p> </p>
<p><strong>Exemplo Avançado</strong></p>
<p>Para mostrar algo avançado que tal traçar a rota do <strong>ponto A</strong> ao <strong>ponto</strong> <strong>B</strong>? Para isso precisaremos que o usuário digite os valores dos <strong>pontos</strong> <strong>A</strong> e <strong>B</strong>. Para traçar a rota, vamos reescrever todo o exemplo, simplificando as configurações.</p>
<blockquote><p>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Strict//EN&#8221;</p>
<p>  &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&#8221;&gt;</p>
<p>&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;</p>
<p>                        &lt;head&gt;</p>
<p>                                               &lt;title&gt;Aprendendo a Usar a API Google Maps &#8211; Obter Rota | Paulo Fernandes &lt;/title&gt;</p>
<p>                                               &lt;meta content=&#8221;text/html; charset=ISO-8859-1&#8243; http-equiv=&#8221;Content-Type&#8221;/&gt;</p>
<p>                                               &lt;script src=&#8221;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;sensor=true&amp;amp;key=ABQIAAAAAaVFxs6kNq7gWY59qf5XMxSec6s_uUscdbTyPSy8oWl8zYzqFRRanjFebOU60thMmEQQDEPx3A3y5Q&#8221;&gt;&lt;/script&gt;</p>
<p>                                               &lt;script&gt;</p>
<p>                                                                       var map = null;</p>
<p>                                                                       var geocoder = null;</p>
<p>                                                                       var from;</p>
<p>                                                                       var to;</p>
<p>                                                                       var directionsPanel = null;</p>
<p>                                                                       var directions = null;</p>
<p>                                                                      </p>
<p>                                                                       function inicializa() {</p>
<p>                                                                                              if (GBrowserIsCompatible()) {</p>
<p>                                                                                                                      map = new GMap2(document.getElementById(&#8221;mapa_base&#8221;));</p>
<p>                                                                                                                      map.setCenter(new GLatLng(-22.5489433, -46.6388182), 7);</p>
<p>                                                                                                                      geocoder = new GClientGeocoder();</p>
<p>                                                                                                                      map.addControl( new GSmallMapControl() );</p>
<p>                                                                                                                      map.addControl( new GMapTypeControl() );</p>
<p>                                                                                                                      directionsPanel = document.getElementById(&#8221;route&#8221;);</p>
<p>                                                                                                                      directions = new GDirections(map, directionsPanel);</p>
<p>                                                                                                                     </p>
<p>                                                                          }</p>
<p>                                                                       }</p>
<p>                       </p>
<p>                                                                       function gerarRota(){</p>
<p>                                                                                              from = document.getElementById(&#8221;partida&#8221;).value;</p>
<p>                                                                                              to = document.getElementById(&#8221;destino&#8221;).value;</p>
<p>                                                                                              if ( geocoder ) {</p>
<p>                                                                                                                      geocoder.getLatLng(from,</p>
<p>                                                                                                                                             function(point){</p>
<p>                                                                                                                                                                     if ( !point ) {</p>
<p>                                                                                                                                                                                            alert(from + &#8221; não encontrado&#8221;);</p>
<p>                                                                                                                                                                     }</p>
<p>                                                                                                                                             }</p>
<p>                                                                                                                      );</p>
<p>                                                                                                                      geocoder.getLatLng(to,</p>
<p>                                                                                                                                             function(point){</p>
<p>                                                                                                                                                                     if ( !point ) {</p>
<p>                                                                                                                                                                                            alert(to + &#8221; não encontrado&#8221;);</p>
<p>                                                                                                                                                                     }</p>
<p>                                                                                                                                             }</p>
<p>                                                                                                                      );</p>
<p>                                                                                                                     </p>
<p>                                                                                                                      var string = &#8220;from: &#8221; + from + &#8221; to: &#8220;+to;</p>
<p>                                                                                                                      directions.clear();</p>
<p>                                                                                                                      directions.load(string);</p>
<p>                                                                                                                      GEvent.addListener(directions, &#8220;error&#8221;, erroGetRoute);</p>
<p>                                                                                              } else {</p>
<p>                                                                                                                      alert(&#8221;GeoCoder não identificado&#8221;);</p>
<p>                                                                                              }</p>
<p>                                                                       }</p>
<p>                                                                      </p>
<p>                                                                       function erroGetRoute(){</p>
<p>                                                                                              alert(&#8221;Não foi possivel traçar a rota de: &#8221; + from + &#8221; para: &#8221; + to );</p>
<p>                                                                       }</p>
<p>                                                                      </p>
<p>                                                                      </p>
<p>    &lt;/script&gt;</p>
<p>                        &lt;/head&gt;</p>
<p>                        &lt;body&gt;</p>
<p>                                               &lt;form action=&#8221;#&#8221; method=&#8221;get&#8221;&gt;</p>
<p>                                                                       &lt;label for=&#8221;partida&#8221;&gt;Partida&lt;/label&gt;</p>
<p>                                                                       &lt;input value=&#8221;São Paulo&#8221; size=&#8221;50&#8243; /&gt;</p>
<p>                                                                       &lt;br /&gt;</p>
<p>                                                                       &lt;label for=&#8221;destino&#8221;&gt;Destino&lt;/label&gt;</p>
<p>                                                                       &lt;input value=&#8221;Rio de Janeiro&#8221; size=&#8221;50&#8243; /&gt;</p>
<p>                                                                       &lt;br /&gt;</p>
<p>                                                                       &lt;input value=&#8221;Obter Rota&#8221;/&gt;</p>
<p>                                               &lt;/form&gt;</p>
<p>                                               &lt;div style=&#8221;width: 800px; height: 500px;&#8221;&gt;&lt;/div&gt;</p>
<p>                                               &lt;div style=&#8221;width: 300px; height: 500px; position: absolute; right: 0; top: 0;&#8221;&gt;&lt;/div&gt;</p>
<p>                        &lt;/body&gt;</p>
<p>&lt;/html&gt;</p></blockquote>
<p>Para mostrar a rota, tivemos que criar uma nova div com o id igual à “<strong>route”, </strong>é neste local que exibiremos o passo a passo da rota traçada. Essa captura do local foi feito nesta linha directionsPanel = document.getElementById(&#8221;route&#8221;); Para traçar a rota, devemos instanciar o objeto <strong>GDirections </strong>e informar para ele carregar a rota através do método directions.load(string);</p>
<p>No método <strong><em>load</em></strong> devemos passar os dois endereços escritos por extenso, antes o endereço de partida devemos atribuir <strong><em>from:</em> </strong>e antes do endereço de destino <strong><em>to:</em> </strong>, ficando a string completa <strong>from: São Paulo to: Rio de Janeiro</strong> , por exemplo.</p>
<p>Caso algum dos dois endereços não seja encontrado, o código exibirá um <strong>alert</strong> informando que a rota não pode ser traçada.</p>
<p><strong>Conclusão</strong></p>
<p>Com este artigo pudemos perceber o poder que a API nos dá, ela nos fornece outras diversas possibilidades que podem ser vistas na documentação oficial. O objetivo do artigo foi introduzir os principais conceitos e o que se pode utilizar no site de sua empresa, por exemplo.</p>
<p>Algo que devemos tomar cuidado é na declaração das variáveis, pois o local onde ela é declarada pode fazer com que a API se porte de forma indesejada. Por exemplo, quando declaramos uma marca, se tivemos declarado ela fora da função a cada novo endereço, a marca anterior seria perdida, mas repare que a informação de latitude e longitude é perdida, mantendo somente a ultima. Faça o teste, declare a variável fora do método, acredito que achará bem interessante.</p>
<p>Pode ser que exista outra forma de fazer o que demonstramos ou até que o que foi demonstrado esteja errado, mesmo que aparentemente funcionando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/java/entendendo-um-pouco-a-api-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iniciando com o GWT</title>
		<link>http://www.phpaulo.com.br/java/iniciando-com-o-gwt/</link>
		<comments>http://www.phpaulo.com.br/java/iniciando-com-o-gwt/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 02:51:21 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[GWT]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=13</guid>
		<description><![CDATA[Artigo explica as funcionalidades básicas para o trabalho com o Framework GWT]]></description>
			<content:encoded><![CDATA[<p><em>S</em>abemos que deixar uma interface rica e que funcione nos principais navegadores é muito difícil devido à falta de padrões existentes entre os navegadores. O GWT foi criado para facilitar essa tarefa para os desenvolvedores, pois podem passar até 90% do tempo diário para contornar as peculiaridades de cada navegador.</p>
<p>O GWT (Google Web Toolkit) é um framework para desenvolvimento web que tem como objetivo facilitar a vida dos desenvolvedores, pois possui um conjunto de ferramentas, API e componentes visuais que facilitam a criação de modernas, ricas e dinâmicas interfaces.</p>
<p>A criação do código para geração da interface é escrita usando Java e não JavaScript, o que torna o desenvolvimento muito mais fácil, pois graças as IDEs (ferramentas que auxiliam o desenvolvimento, muita delas gratuitas e conhecidas), os erros podem ser descobertos em tempo de compilação, Java é fortemente tipada e é muito mais fácil encontrar desenvolvedores Java no mercado do que JavaScript.</p>
<p>No momento que a classe Java é compilada o GWT faz o papel de compilador JavaScript, fazendo com que o código Java seja convertido em JavaScript. O <strong>Hosted Mode</strong> é utilizado como <strong>debbuger</strong> do código facilitando a identificação dos erros devido ao seu console de administração.</p>
<p>Uma funcionalidade muito interessante é que com o GWT minimizamos ao máximo o tamanho do arquivo JavaScript, ao invés de fazer vários “IFs” no código para saber qual o navegador, qual o idioma, etc., ele gera um arquivo JavaScript para cada tipo de combinação de navegador e se por acaso sua aplicação for internacionalizada, o GWT gerará um arquivo JavaScript para cada tipo de idioma. O responsável por saber qual arquivo será utilizado na hora de exibição para o usuário é o servidor, tudo isso ocorre transparentemente para os usuários.</p>
<p><strong>Começando</strong></p>
<p>Para iniciarmos uma aplicação usando o GWT, precisamos fazer o download de suas bibliotecas que podem ser baixadas nesse link, <a href="http://code.google.com/intl/pt-BR/webtoolkit/" target="_blank">http://code.google.com/intl/pt-BR/webtoolkit/</a>. Além disso, precisaremos de uma IDE, usaremos o Eclipse IDE versão Ganymede que pode ser baixado neste link, <a href="http://www.eclipse.org/downloads/" target="_blank">http://www.eclipse.org/downloads/</a>. Para facilitar ainda mais o desenvolvimento, devemos fazer o download do plugin do GWT para o Eclipse Ganymede, que pode ser encontrado neste link, <a href="http://code.google.com/intl/pt-BR/eclipse/docs/download.html" target="_blank">http://code.google.com/intl/pt-BR/eclipse/docs/download.html</a>.</p>
<p>Neste passo não vamos detalhar o processo de instalação, pois no site Google este passo está muito bem detalhado, veja este link, <a href="http://code.google.com/intl/pt-BR/eclipse/docs/install-eclipse-3.4.html" target="_blank">http://code.google.com/intl/pt-BR/eclipse/docs/install-eclipse-3.4.html</a></p>
<p>Para criar um novo projeto usando o Eclipse e o plugin, devemos clicar em <em>File</em> &gt; <em>New</em> &gt; <em>Web Application Project</em>. Preencha o campo <em>Project name</em> com o nome do projeto, no exemplo usaremos <strong>PucProjeto</strong>, o campo <em>Package</em> pode ser preenchido com o pacote que deseja que fique o raiz do projeto, no exemplo usaremos <strong>br.pucsp.pos.web</strong>. No campo <em>Location</em> definimos o <em>workspace</em> da aplicação, no campo <em>Google SDKs </em>definimos qual <em>GWT</em> devemos usar e qual a <em>Engine</em> devemos usar. Após isso clique em <em>Finish</em>.</p>
<p> </p>
<div class="wp-caption aligncenter" style="width: 518px"><a href="http://www.phpaulo.com.br/artigo/images/artigo-gwt-imagem-1.jpg"><img title="Figura 1" src="http://www.phpaulo.com.br/artigo/images/artigo-gwt-imagem-1.jpg" alt="Imagem 1 Artigo GWT" width="508" height="574" /></a><p class="wp-caption-text">Imagem 1 Artigo GWT</p></div>
<p>Após clicar em <em>Finish</em> uma aplicação de exemplo será criada, para testá-la, clique com o botão do lado direito sobre o projeto e depois <em>Run As </em>&gt; <em>Web Application</em>, um console do Google será aberto e você ver a aplicação de teste em funcionamento.</p>
<p>Todo o código que é renderizado e mostrado para o usuário está na classe <strong>br.pucsp.pos.web.client.PucProjeto</strong>, que usa uma implementação da classe <strong>com.google.gwt.core.client.EntryPoint.</strong> O código que será compilado deve ficar dentro do método <strong>onModuleLoad()</strong>, caso queira editar este projeto que o plugin criou, pode excluir todas as <strong>classes</strong> exceto a <strong>br.pucsp.pos.web.client.PucProjeto</strong>, fazendo isso não teremos nenhum problema, pois somente com ela o GWT consegue compilar.</p>
<p>Na criação do projeto usando o plugin uma pasta chamada <strong>war </strong>foi criada, dentro dessa pasta existem dois arquivos, um com as configurações do CSS (Cascading Style Sheet), que são as folhas de estilo. Podemos criar as nossas classes e nossos IDs e depois usá-los no código Java do GWT citando o id com o seguinte comando:</p>
<blockquote><p>closeButton.getElement().setId(&#8221;closeButton&#8221;);</p></blockquote>
<p> </p>
<p>ou citando a classe com o seguinte comando:</p>
<blockquote><p> closeButton.getElement().setClassName(&#8221;sendButton&#8221;);</p></blockquote>
<p>No outro arquivo encontramos o layout da página HTML, todos os elementos que forem absolutos devem ser inseridos nessa página. Podemos definir áreas nesse código HTML que serão inseridas via a classe Java que estamos criando com o uso do framework GWT. No exemplo criado pelo plugin, o GWT criou uma página com uma tabela com duas colunas e definiu as colunas como áreas, para o nosso exemplo, altere o nome dessas áreas para os seguintes nomes, <em>nameFieldContainer, aboutButtonContainer.</em>            Para que algo seja inserido nessas áreas, devemos criar um tipo de painel, no exemplo usamos o <strong>SimplePanel</strong> e o <strong>DialogBox</strong> que são referenciadas no código Java através da seguinte linha de código:</p>
<blockquote><p>      RootPanel.<em>get</em>(&#8221;nameFieldContainer&#8221;).add(psugBox);</p>
<p>      RootPanel.<em>get</em>(&#8221;aboutButtonContainer&#8221;).add(aboutButton);</p></blockquote>
<p>     </p>
<p>Abaixo está o código completo da classe <strong>br.pucsp.pos.web.client.PucProjeto</strong><strong> </strong></p>
<blockquote><p><strong>package</strong> br.pucsp.pos.web.client;</p>
<p> </p>
<p><strong>import</strong> com.google.gwt.core.client.EntryPoint;</p>
<p><strong>import</strong> com.google.gwt.event.dom.client.ClickEvent;</p>
<p><strong>import</strong> com.google.gwt.event.dom.client.ClickHandler;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.Button;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.DialogBox;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.HTML;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.Label;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.MultiWordSuggestOracle;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.RootPanel;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.SimplePanel;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.SuggestBox;</p>
<p><strong>import</strong> com.google.gwt.user.client.ui.VerticalPanel;</p>
<p> </p>
<p><strong>public</strong> <strong>class</strong> PucProjeto <strong>implements</strong> EntryPoint {</p>
<p> </p>
<p>       <strong>public</strong> <strong>void</strong> onModuleLoad() {</p>
<p>             <strong>final</strong> Button aboutButton = <strong>new</strong> Button(&#8221;Sobre&#8221;);</p>
<p>            </p>
<p>             <strong>final</strong> DialogBox about = <strong>new</strong> DialogBox();</p>
<p>             about.setText(&#8221;Sobre o Exemplo&#8221;);</p>
<p>             about.setAnimationEnabled(<strong>true</strong>);</p>
<p>             <strong>final</strong> Button closeButton = <strong>new</strong> Button(&#8221;Fechar&#8221;);</p>
<p>             closeButton.getElement().setId(&#8221;closeButton&#8221;);</p>
<p>             aboutButton.getElement().setClassName(&#8221;sendButton&#8221;);</p>
<p>            </p>
<p>             VerticalPanel dialogVPanel = <strong>new</strong> VerticalPanel();</p>
<p>             dialogVPanel.addStyleName(&#8221;dialogVPanel&#8221;);</p>
<p>             dialogVPanel.add(<strong>new</strong> HTML(&#8221;&lt;b&gt;Projeto Desenvolvido por:&lt;/b&gt;&#8221;));</p>
<p>             dialogVPanel.add(<strong>new</strong> HTML(&#8221;&lt;br&gt;&lt;b&gt;Paulo Fernandes [ paulofernandesjr@gmail.com ]&lt;/b&gt;&#8221;));</p>
<p>             dialogVPanel.setHorizontalAlignment(VerticalPanel.<em>ALIGN_RIGHT</em>);</p>
<p>             dialogVPanel.add(closeButton);</p>
<p>             about.setWidget(dialogVPanel);</p>
<p>            </p>
<p>             /**</p>
<p>              * <span style="text-decoration: underline;">Essa</span> é <span style="text-decoration: underline;">uma</span> <span style="text-decoration: underline;">forma</span> <span style="text-decoration: underline;">de</span> fazer</p>
<p>              */</p>
<p>             <strong>class</strong> MyHandler <strong>implements</strong> ClickHandler {</p>
<p>                    <strong>public</strong> <strong>void</strong> onClick(ClickEvent event) {</p>
<p>                           aboutButton.setEnabled(<strong>false</strong>);</p>
<p>                           about.setText(&#8221;Sobre o Projeto&#8221;);</p>
<p>                           about.center();</p>
<p>                           closeButton.setFocus(<strong>true</strong>);</p>
<p>                    }</p>
<p>             }</p>
<p>             MyHandler handler = <strong>new</strong> MyHandler();</p>
<p>             aboutButton.addClickHandler(handler);</p>
<p> </p>
<p>             /**</p>
<p>              * <span style="text-decoration: underline;">Essa</span> é <span style="text-decoration: underline;">outra</span> <span style="text-decoration: underline;">forma</span> <span style="text-decoration: underline;">de</span> <span style="text-decoration: underline;">fazer</span></p>
<p>              */</p>
<p>             closeButton.addClickHandler(<strong>new</strong> ClickHandler() {</p>
<p>                    <strong>public</strong> <strong>void</strong> onClick(ClickEvent event) {</p>
<p>                           about.hide();</p>
<p>                           aboutButton.setEnabled(<strong>true</strong>);</p>
<p>                           aboutButton.setFocus(<strong>true</strong>);</p>
<p>                    }</p>
<p>             });</p>
<p> </p>
<p>             MultiWordSuggestOracle palavras = <strong>new</strong> MultiWordSuggestOracle();</p>
<p>             palavras.add(&#8221;abacate&#8221;);</p>
<p>             palavras.add(&#8221;abacaxi&#8221;);</p>
<p>             palavras.add(&#8221;acordar&#8221;);</p>
<p>             palavras.add(&#8221;aeromotor&#8221;);</p>
<p>              palavras.add(&#8221;agudo&#8221;);</p>
<p>             palavras.add(&#8221;alcool&#8221;);</p>
<p>             palavras.add(&#8221;algarismo&#8221;);</p>
<p>            </p>
<p>             SuggestBox suggestBox = <strong>new</strong> SuggestBox(palavras);</p>
<p>             suggestBox.setAnimationEnabled(<strong>true</strong>);</p>
<p>             suggestBox.setVisible(<strong>true</strong>);</p>
<p> </p>
<p>             /**</p>
<p>              * <span style="text-decoration: underline;">painel</span> <span style="text-decoration: underline;">para</span> a <span style="text-decoration: underline;">caixa</span> <span style="text-decoration: underline;">de</span> <span style="text-decoration: underline;">sugestoes</span></p>
<p>              */</p>
<p>             VerticalPanel sugBox = <strong>new</strong> VerticalPanel();</p>
<p>             sugBox.setHorizontalAlignment(VerticalPanel.<em>ALIGN_CENTER</em>);</p>
<p>             sugBox.add(<strong>new</strong> Label(&#8221;Digite a letra A&#8221;));</p>
<p>             sugBox.add(suggestBox);</p>
<p>             SimplePanel psugBox = <strong>new</strong> SimplePanel();</p>
<p>             psugBox.setWidget(sugBox);</p>
<p>            </p>
<p>             RootPanel.<em>get</em>(&#8221;nameFieldContainer&#8221;).add(psugBox);</p>
<p>             RootPanel.<em>get</em>(&#8221;aboutButtonContainer&#8221;).add(aboutButton);</p>
<p>                          </p>
<p>       }</p>
<p>}</p></blockquote>
<p><strong> </strong><strong> </strong></p>
<p><strong></p>
<div class="wp-caption aligncenter" style="width: 580px"><a href="http://www.phpaulo.com.br/artigo/images/artigo-gwt-imagem-2.jpg"><img title="Imagem 2 Artigo GWT" src="http://www.phpaulo.com.br/artigo/images/artigo-gwt-imagem-2.jpg" alt="Imagem 2 Artigo GWT" width="570" height="430" /></a><p class="wp-caption-text">Imagem 2 Artigo GWT</p></div>
<p></strong></p>
<p><strong>Concluindo</strong></p>
<p>No seguinte link <a href="http://code.google.com/intl/pt-BR/webtoolkit/doc/1.6/DevGuide.html" target="_blank">http://code.google.com/intl/pt-BR/webtoolkit/doc/1.6/DevGuide.html</a> está o guia para os desenvolvedores que quiserem se aperfeiçoar mais com este excelente framework.  Neste outro link tem uma aplicação de exemplo que o pessoal do Google fez para vermos mais um pouco do poder do GWT <a href="http://gwt.google.com/samples/Mail/Mail.html" target="_blank">http://gwt.google.com/samples/Mail/Mail.html</a>.</p>
<p>Com este artigo descobrimos o quanto podemos melhorar nossas aplicações usando o GWT, para quem já desenvolve para web, sabe que para fazer o que fizemos neste exemplo, daria um trabalho um tanto quanto complexo, imagine só essa aplicação de e-mail que está no link acima.</p>
<p> </p>
<p><strong>Fontes</strong></p>
<p><a href="http://code.google.com/intl/pt-BR/webtoolkit/" target="_blank">http://code.google.com/intl/pt-BR/webtoolkit/</a></p>
<p><a href="http://www.gwt.com.br/" target="_blank">http://www.gwt.com.br/</a></p>
<p><a href="http://www.comp.ufscar.br/~bruno_abrahao/Trabalhos/Tutorial%20GWT.pdf" target="_blank">http://www.comp.ufscar.br/~bruno_abrahao/Trabalhos/Tutorial%20GWT.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/java/iniciando-com-o-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabalhando com arquivos Microsoft Word em Java</title>
		<link>http://www.phpaulo.com.br/java/trabalhando-com-arquivos-microsoft-word-em-java/</link>
		<comments>http://www.phpaulo.com.br/java/trabalhando-com-arquivos-microsoft-word-em-java/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 02:31:29 +0000</pubDate>
		<dc:creator>Paulo Fernandes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Jakarta]]></category>
		<category><![CDATA[POI]]></category>
		<category><![CDATA[Word]]></category>

		<guid isPermaLink="false">http://www.phpaulo.com.br/?p=8</guid>
		<description><![CDATA[Artigo explica como trabalhar com Java para tratar arquivos Microsoft Word até 2003 usando a API Jakarta POI.]]></description>
			<content:encoded><![CDATA[<p>Olá a todos. Meus artigos são diretos, não fico enchendo muito de conteúdo que eu não julgo necessário, por isso se sentiram carência em algum tema, por favor, me escreve que poderei fazer um artigo somente para aquele tema em especifico.</p>
<p><strong>Introdução</strong></p>
<p>Neste artigo explicarei como manipular documentos do Microsoft Word 97-2003, utilizando uma excelente API chamada Jakarta POI [<a href="http://poi.apache.org/" target="_blank">http://poi.apache.org/</a>]. Neste artigo falarei somente até a versão 2003 do Microsoft Word, pois na versão 2007 ele trabalha de uma forma diferente.</p>
<p><strong>Problema</strong></p>
<p>Vamos simular uma situação onde a esta aplicação poderia ser utilizada. Tenho um contrato que é padrão para todos os clientes, mas eu preciso inserir em cada contrato, o nome, o valor do contrato e o valor em porcentagem da multa e enviar para efeito de teste, salvar o contrato com o nome da empresa em formato pdf. Outra possibilidade do problema seria criar um <em>e-mail marketing</em> e enviar por e-mail para uma lista de usuários cadastrados.</p>
<p><strong>A API Jakarta POI</strong></p>
<p>Esta API é fantástica, tem diversas funções e não serve apenas para trabalhar com arquivos do Microsoft Word, serve também para arquivos do Microsoft Excel, Microsoft Visio, Microsoft PowerPoint, entre outros, a versão estável até o momento da escrita deste artigo era a versão 3.2. Os desenvolvedores estão trabalhando na versão 3.5 que suportará arquivos Microsoft Office 2007. No exemplo do projeto eu explicarei algumas das funções da API, pode até ser que eu fuja um pouco da solução do problema, porém creio que ficará fácil para entender como trabalhar com a API.</p>
<p><strong>Solução</strong></p>
<p>A solução para o problema não é tão complexa, basta você abrir o arquivo Microsoft Word desejado, encontrar os trechos onde deseja que sejam as palavras sejam substituídas, e substituí-las. Para isso eu colocarei no meio do meu arquivo <strong>contrato.doc </strong>umas “TAGS PERSONALIZADAS”, estas TAGS poderiam ser quaisquer palavras, eu adotei um padrão para não correr o risco de alterar algo que não quisesse que fosse alterado. O padrão utilizado foi o seguinte:</p>
<p>                  #NOME_DO_CAMPO#</p>
<p>As minhas variáveis ficaram da seguinte forma no arquivo <strong>contrato.doc</strong></p>
<p>                  #NOME_EMPRESA#</p>
<p>                  #VALOR_CONTRATO#</p>
<p>                  #VALOR_MULTA#</p>
<p>Sobre o contrato, ele não é especifico para o que vou demonstrar, ele foi retirado do site <a href="http://www.sitecontabil.com.br/modelos_contrato.htm" target="_blank">http://www.sitecontabil.com.br/modelos_contrato.htm</a> e o link para download do contrato de exemplo é esse aqui:  <a href="http://www.sitecontabil.com.br/modelos_contrato/0338.htm" target="_blank">http://www.sitecontabil.com.br/modelos_contrato/0338.htm</a>. Utilizei apenas alguns espaços que não são exatamente para o que deveria, mas como o objetivo deste artigo é mostrar a aplicação funcionando, não vi muita necessidade em ter um exemplo que se encaixe perfeitamente com o artigo.</p>
<p><strong>Código</strong></p>
<p>Como o objetivo é mostrar o funcionamento da API Jakarta POI, e não sobre SWING ou Desenvolvimento WEB, fiz um código, que em minha opinião está bem didático e comentado, facilitando o entendimento. O código do projeto pode ser baixado do link a seguir:</p>
<p>                  <a href="http://www.phpaulo.com.br/artigo/1/artigo1-word-to-java.zip">http://www.phpaulo.com.br/artigo/1/artigo1-word-to-java.zip</a></p>
<p>Para o desenvolvimento foi necessário o download da biblioteca Jakarta POI, que está no link download do site da API, também está no arquivo do projeto.</p>
<p>No exemplo mostro como extrair o texto de duas possibilidades:</p>
<p>1ª usando o <strong>WordExtractor: </strong>fará com que você pegue a o conteúdo e armazene em uma <strong>String, </strong>no exemplo eu usei, <strong>StringBuilder, </strong>por ela ser mais rápida que a String o que facilitará ainda mais a substituição.</p>
<p>2ª usando o <strong>Range</strong>: que tem um método, muito eficiente que faz a modificação do texto através do método <strong>replaceText(String parametroABuscar, String parametroASubstituir).</strong></p>
<p>Apenas para efeito de demonstração da API, adicionarei um parágrafo no começo e no final do Arquivo contendo os meus dados. Com isso o exemplo não só mostrará como substituir, mas também como adicionar conteúdo.</p>
<p>Como o objetivo não é como mostrar a geração de PDF, a parte do PDF está muito simples, deveria ser melhorada, mas isso é para outro artigo.</p>
<p>O exemplo foi desenvolvido utilizando Java 6, Eclipse Ganymede e NetBeans 6.5.</p>
<p> </p>
<p><strong>Conclusão</strong></p>
<p>Esta API não se restringe apenas a arquivos Microsoft Word, como mencionei acima pode ser usada com outros formatos também, para maiores informações acesse o site do projeto: <a href="http://poi.apache.org/" target="_blank">http://poi.apache.org/</a></p>
<p>Com isso encerro aqui o meu artigo, caso tenham alguma dúvida, podem me enviar um e-mail, que na medida do possível estarei respondendo, estou aberto a sugestões para próximos artigos.</p>
<p>Até o próximo pessoal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpaulo.com.br/java/trabalhando-com-arquivos-microsoft-word-em-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
