<?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>Tecnologia &#8211; Paulo Eduardo</title>
	<atom:link href="http://www.pauloeduardo.com/category/tecnologia/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pauloeduardo.com</link>
	<description>Tecnologia, Negócios e o Mundo</description>
	<lastBuildDate>Tue, 02 Feb 2016 18:30:15 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.4.10</generator>
	<item>
		<title>5º Seminário Locaweb PHPSP</title>
		<link>http://www.pauloeduardo.com/2016/02/02/5-seminario-locaweb-phpsp/</link>
		<comments>http://www.pauloeduardo.com/2016/02/02/5-seminario-locaweb-phpsp/#respond</comments>
		<pubDate>Tue, 02 Feb 2016 18:19:11 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1125</guid>
		<description><![CDATA[No último dia 30 de janeiro aconteceu em São Paulo o 5º Seminário Locaweb PHPSP, evento resultante de uma fusão entre o PHPSP + Locaweb, que teve duas edições na própria sede da Locaweb e os Seminários Locaweb, realizados em diferentes estados brasileiros em parceria com outras comunidades e sobre temas diversos. A organização do evento começou em agosto de 2015, com a ideia de realizar um evento em parceria com o PHPSP, maior do que os anteriormente organizados, a Locaweb nos procurou para um evento que deveria ser realizado ainda em 2015 na Bienal de São Paulo, um marco [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>No último dia 30 de janeiro aconteceu em São Paulo o 5º Seminário Locaweb PHPSP, evento resultante de uma fusão entre o PHPSP + Locaweb, que teve duas edições na própria sede da Locaweb e os Seminários Locaweb, realizados em diferentes estados brasileiros em parceria com outras comunidades e sobre temas diversos.</p>
<p>A organização do evento começou em agosto de 2015, com a ideia de realizar um evento em parceria com o PHPSP, maior do que os anteriormente organizados, a Locaweb nos procurou para um evento que deveria ser realizado ainda em 2015 na Bienal de São Paulo, um marco turístico da cidade localizado dentro do Parque do Ibirapuera, porém eram poucas as opções de data até o fim daquele ano, muitas delas coincidindo com feriados, o que reduziria a participação do público, após algumas negociações entre PHPSP, Locaweb, e Fundação Bienal ficou decidido que o evento seria realizado no dia 30 de Janeiro.<br />
​<br />
Começou então a curadoria de conteúdo, após diversas conversas online entre os evangelistas do PHPSP ficou decidido fazer um evento focado em temas novos e diferentes e investir fortemente na interatividade do evento, com base nessas diretrizes começamos a selecionar conteúdos e palestrantes dentre aqueles que já estavam na nossa lista e convidar palestrantes que ainda não estavam nessa lista, mas que sabíamos que poderiam agregar conteúdo extremamente relevante para o evento.<br />
​<br />
Enquanto isso a Locaweb corria com a organização do espaço, coffee break, arquitetura do evento e parte técnica, para garantir que o evento ocorresse da melhor forma possível.<br />
​<br />
Com a grade e o tema definidos passamos então a desenvolver a aplicação de interatividade do evento, com base em uma apresentação anterior do Gabriel Couto na PHP Experience utilizando Reveal.js e WebSockets começamos a criar uma aplicação onde os palestrantes pudessem desenvolver seus slides com áreas de interatividade para que fossem acessados pelos participantes durante o evento.<br />
​<br />
Durante esse tempo ainda tivemos alguns imprevistos, com a proximidade do carnaval a CET resolveu bloquear o acesso pelo portão 3 do Parque do Ibirapuera no dia do evento para a passagem dos blocos de rua de São Paulo, isso poderia dificultar bastante o acesso dos palestrantes, então a Locaweb disparou um e-mail para todos os inscritos avisando das alterações e sugerindo rotas alternativas e estacionamentos próximos. Mas novamente um dia antes do evento a CET mudou os horários dos bloqueios e complicou ainda mais as coisas.<br />
​<br />
Não havia mais o que fazer além de torcer para que todos conseguissem de alguma forma chegar ao evento. Então chegou o dia do evento, por conta dos problemas com trânsito e estacionamento os participantes tiveram problemas já esperados de acesso e o evento começou com um pouco de atraso.<br />
​<br />
Na abertura procurei ser o mais sucinto possível para não atrasar ainda mais, junto o Cássio e o Kemel falamos um pouco sobre os eventos já realizados do PHPSP em parceria com a Locaweb, o Cássio falou um pouco de como essa parceria começou e eu agradeci a presença de todos e o apoio da Locaweb, expliquei como funcionaria o aplicativo de interatividade do evento e prosseguimos então para a primeira palestra do dia.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017.jpg" rel="attachment wp-att-1129"><img class="aligncenter wp-image-1129" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017-1024x683.jpg" alt="Abertura" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0017-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>O Marcel Santos abriu as palestras do evento com sua sempre elogiada palestra de Programação Funcional em PHP, um tema que é bastante recorrente nas comunidades de JavaScript por exemplo porem ainda pouco conhecido da comunidade PHP, como sempre foi uma ótima apresentação do Marcel, seguida por algumas dúvidas.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023.jpg" rel="attachment wp-att-1130"><img class="aligncenter wp-image-1130" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023-1024x683.jpg" alt="Marcel - Programação Funcional em PHP" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0023-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a> ​</p>
<p>Ao final da apresentação do Marcel fizemos sorteios de algumas camisetas e brindes, também usando a aplicação interativa de palestrar, através de um slide especialmente preparado para isso eu pude sortear entre todos aqueles que estavam conectados na aplicação e o nome do vencedor do sorteio era exibido da tela e uma mensagem era exibida no device do sorteado.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067.jpg" rel="attachment wp-att-1131"><img class="aligncenter wp-image-1131" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067-1024x683.jpg" alt="Sorteios" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0067-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a> ​</p>
<p>Enquanto o slide de sorteio era preparado o Gabriel explicou como foi desenvolvida a aplicação de interatividade, quais tecnologias foram utilizadas e como todos poderiam contribuir com ela no <a href="https://github.com/PHPSP/SeminarioLocaweb">Github do PHPSP</a>. E a maior surpresa do evento foi saber que graças a essa aplicação de interatividade o Leonardo, um dos participantes do evento que é deficiente visual pode acompanhar os slides usando seu celular com auxilio de um leitor de tela. Confesso que isso aconteceu totalmente por acaso, mas foi fantástico.<br />
​<br />
Dando continuidade ao evento, e em sua primeira palestra em um evento aberto ao público, o Edson falou um pouco sobre Arquitetura Orientada a Eventos numa apresentação bem descontraída e interativa, no final do evento ele me confessou que estava um pouco nervoso por ser sua primeira palestra, mas em nenhum momento isso transpareceu para o público e a apresentação também foi ótima seguida de mais uma seção de perguntas.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085.jpg" rel="attachment wp-att-1132"><img class="aligncenter wp-image-1132" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085-1024x683.jpg" alt="Edson - Arquitetura Orientada a Eventos" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0085-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>Em seguida o Nickolas iniciou sua apresentação sobre &#8220;React além dos Websockets&#8221; e demonstrou como fazer uso dessas tecnologias para criar aplicações totalmente dinâmicas e não bloqueantes em PHP terminando com uma demonstração de Robô para automatizar tarefas de mouse e teclado através de uma aplicação para controlar o jogo Tíbia.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128.jpg" rel="attachment wp-att-1133"><img class="aligncenter wp-image-1133" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128-1024x683.jpg" alt="Nickolas - React Alem dos Websockets" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0128-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>Nesse momento subi ao palco novamente para dar mais alguns avisos sobre o almoço, que também foi um pouco complicado pois existem poucas opções de restaurantes e lanchonetes próximas e algumas delas estavam fechadas por conta do fechamento do acesso ao parque. Por isso tivemos mais alguns minutos de atraso no retorno.<br />
​<br />
Retorno esse que aconteceu com a palestra do Ivan sobre Json Web Tokens, tecnologia que promete revolucionar a troca de informações a segurança de aplicações web, o Ivan mostrou como funciona um token, como criar tokens e integrá-los a sua aplicação, e ainda deu exemplos de bibliotecas que estão utilizando essa tecnologia de forma inovadora.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152.jpg" rel="attachment wp-att-1134"><img class="aligncenter wp-image-1134" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152-1024x683.jpg" alt="Ivan - Json Web Tokens" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0152-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>Em seguida o Daniel falou sobre PSR7 e Middlewares, começou explicando como funciona o protocolo HTTP e como todos os frameworks possuíam abstrações diferentes para o protocolo e prossegui mostrando como a PSR7 pode impactar beneficamente na interoperabilidade entre os frameworks através do uso de middlewares.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159.jpg" rel="attachment wp-att-1135"><img class="aligncenter wp-image-1135" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159-1024x683.jpg" alt="Daniel - PSR7 e os Middlewares" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0159-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a><br />
​<br />
Depois todos os participantes foram bem tratados com um excelente Coffee Break, enquanto isso eu já ajudava a preparar a próxima atração do dia, mantendo o foco de interatividade começou o painel só de mulheres, onde Ariana, Thamara, Diana, Juciellen e Gabriela, essa última direto de Londres, falaram sobre diversos assuntos como Testes de Software, Frameworks e Microframeworks, Diversidade na Tecnologia, Integração Continua e Deploy e PHP7.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212.jpg" rel="attachment wp-att-1136"><img class="aligncenter wp-image-1136" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212-1024x683.jpg" alt="Painel" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0212-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>Para finalizar as palestras o Diego falou sobre automatização de casas com PHP, mostrou um pouco de Arduíno e como trabalhar com ele, falou um pouco de websockets e finalizou com um show de luzes no palco controladas pela plateia, levando a interatividade ao nível máximo.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231.jpg" rel="attachment wp-att-1137"><img class="aligncenter wp-image-1137" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231-1024x683.jpg" alt="Diego - Automatizando Casas com PHP" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0231-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>​No encerramento mais sorteios, incluindo o Sorteio de um ElePHPant do PHP7, camisetas, mochilas e outros brindes, com todos os evangelistas do PHPSP e a equipe da Locaweb presentes no palco agradecendo a presença de todos os participantes. Mas não terminou por aí, depois do evento muitos participantes se reuniram em um bar próximo para terminar o dia com muita conversa e networking e claro que algumas comidas e bebidas mantendo a tradição dos Pubs do PHPSP.</p>
<p><a href="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250.jpg" rel="attachment wp-att-1138"><img class="aligncenter wp-image-1138" src="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250-1024x683.jpg" alt="Encerramento" width="613" height="409" srcset="http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250-300x200.jpg 300w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250-768x512.jpg 768w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250-1024x683.jpg 1024w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250-375x250.jpg 375w, http://www.pauloeduardo.com/wp-content/uploads/2016/02/DSC_0250-246x164.jpg 246w" sizes="(max-width: 613px) 100vw, 613px" /></a></p>
<p>E para finalizar esse post eu gostaria de agradecer imensamente todos os membros do PHPSP, especialmente o Gabriel, que me ajudou imensamente a fazer com que a aplicação funcionasse sem nenhum problema durante todo o evento, inclusive apagando alguns incêndios durante o desenvolvimento, ao Marcel por ter também contribuído com a aplicação e ter cuidado das redes sociais do PHPSP durante o evento, todos os palestrantes e evangelistas do PHPSP que em nenhum momento negaram ajuda quando essa foi solicitada e em muitas vezes ajudaram em coisas que eu nem mesmo me lembrava que tinham que ser feitas. Ao Cássio, Kemel, Raquel e toda a equipe da Locaweb por mais uma vez fazerem essa parceria incrível entre Locaweb e PHPSP funcionar.<br />
​<br />
O Rafael Dohms, acredito que se referindo à participação em uma conferência, postou o seguinte tweet.<br />
​</p>
<blockquote class="twitter-tweet" data-lang="pt">
<p dir="ltr" lang="en">Conferences: mentally and psychologically energizing, physically destroying&#8230;</p>
<p>— Rafael Dohms (@rdohms) <a href="https://twitter.com/rdohms/status/693755136271851520">31 janeiro 2016</a></p></blockquote>
<p><script src="//platform.twitter.com/widgets.js" async="" charset="utf-8"></script></p>
<p>Esse tweet reflete também a sensação de participar da organização de um evento desse porte, muitas vezes me senti completamente acabado fisicamente, praticamente virei algumas noites na preparação de algumas coisas e realmente agora preciso de algumas férias, mas essa foi sem dúvida uma das experiências mais recompensadoras de toda a minha vida, espero que todos que estiveram presentes tenham saído com a mesma sensação e que possa ver todo mundo novamente em breve.</p>
<p>Enquanto isso todos podem continuar acompanhando o trabalho do PHPSP nas nossas redes sociais, <a href="https://www.facebook.com/sao.paulo.elephants">Facebook</a>, <a href="https://twitter.com/phpsp/">Twitter</a>, <a href="http://www.meetup.com/pt-BR/php-sp/">Meetup </a>e avaliar as atividades do evento no <a href="https://joind.in/event/5-seminrio-locaweb-phpsp">Joind.in.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2016/02/02/5-seminario-locaweb-phpsp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>São Paulo recebe agora em janeiro evento gratuito  sobre linguagem PHP</title>
		<link>http://www.pauloeduardo.com/2016/01/21/sao-paulo-recebe-agora-em-janeiro-evento-gratuito-sobre-linguagem-php/</link>
		<comments>http://www.pauloeduardo.com/2016/01/21/sao-paulo-recebe-agora-em-janeiro-evento-gratuito-sobre-linguagem-php/#respond</comments>
		<pubDate>Thu, 21 Jan 2016 18:34:21 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1122</guid>
		<description><![CDATA[Seminário Locaweb aborda conceitos da linguagem de programação e interessados devem contribuir com a doação de um quilo de alimento não perecível]]></description>
				<content:encoded><![CDATA[<p>São Paulo recebe no dia 30 de janeiro de 2016 a primeira edição do Seminário Locaweb voltado para a linguagem PHP. O encontro acontece na Fundação Bienal, dentro do Parque Ibirapuera – um dos principais cartões-postais da cidade.</p>
<p>O evento conta com desenvolvedores especializados na área. Entre as palestras, estão: “Programação funcional em PHP: saia da zona do conforto”, “Arquitetura orientada a eventos”, “REACT além dos WebSockets”, “Autenticação com Json Web Token (JWT)”, “PSR-7 e os Middlewares”, “Automatizando casas com PHP” e o Painel Seminário Locaweb PHPSP.</p>
<p>No dia do evento, os inscritos devem levar um quilo de alimento não perecível, que serão doados para o <a href="http://efrata.org.br/">Lar Efrata</a>, instituição filantrópica sem fins lucrativos que cuida de crianças e adolescentes sem um lar. As vagas são limitadas e as inscrições gratuitas podem ser feitas <a href="http://eventos.locaweb.com.br/5o-seminario-locaweb-phpsp-sao-paulo/">via internet</a>.</p>
<p>Organizado pela Locaweb e pela comunidade PHPSP, com patrocínios da Agência ICOMP e da empresa de comércio eletrônico TrayCommerce, o Seminário Locaweb PHPSP está em sua primeira edição e espera receber cerca de 350 participantes interessados no tema.</p>
<p><strong>Serviço:</strong> Seminário Locaweb PHPSP<br />
<strong>Quando:</strong> 30 de janeiro de 2016, das 8h às 18h<br />
<strong>Onde:</strong> Fundação Bienal de São Paulo – Portão 3, Pavilhão Ciccillo Matarazzo, Parque do Ibirapuera – São Paulo (SP)<br />
<strong>Informações:</strong> <a href="http://eventos.locaweb.com.br/5o-seminario-locaweb-phpsp-sao-paulo/">http://eventos.locaweb.com.br/5o-seminario-locaweb-phpsp-sao-paulo/</a></p>
<p><strong>Sobre a Locaweb:</strong></p>
<p>A Locaweb é líder em Hosting Infrastructure Services no Brasil, segundo a IDC. Com 17 anos de experiência, cerca de 900 funcionários e 260 mil clientes, oferece soluções em Software, Plataforma, Infraestrutura e Marketing, além da unidade Locaweb Soluções Corporativas, que entrega desde simples projetos a escopos totalmente customizados. Com capacidade para mais de 25 mil servidores, de acordo com o relatório Hostmapper, a empresa é líder isolada no mercado de domínios .com.br. Entre 2012 e 2013, adquiriu quatro novas empresas: a Eventials, a Tray, a SuperPay e a All In Mail.</p>
<p><strong>Informações à Imprensa:</strong><br />
NB Press Comunicação<br />
Telefone: (11) 3254-6464<br />
Natália Lippo &#8211; natalialippo@nbpress.com<br />
Fernanda Brianezi &#8211; fernandabrianezi@nbpress.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2016/01/21/sao-paulo-recebe-agora-em-janeiro-evento-gratuito-sobre-linguagem-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>20 Anos de PHP</title>
		<link>http://www.pauloeduardo.com/2015/06/08/20-anos-de-php/</link>
		<comments>http://www.pauloeduardo.com/2015/06/08/20-anos-de-php/#respond</comments>
		<pubDate>Mon, 08 Jun 2015 21:19:17 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1116</guid>
		<description><![CDATA[Hoje, como muitos de vocês já devem saber fazem 20 que Rasmus Lerdorf Anunciou a Versão 1.0 do PHP e como se esse sozinho já não fosse um excelente motivo pra trazer de volta a vida esse mesmo blog que não recebe atualizações a tempos, o Ben Ramsey chamou todos os desenvolvedores para contar um pouco da sua história com PHP e é por isso que eu estou aqui. Mas para contar minha historia com PHP eu tenho que voltar um pouco antes disso, em 2001, quando eu ainda cursava a sétima serie do ensino fundamental, tinha uma disciplina chamada [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Hoje, como muitos de vocês já devem saber fazem 20 que Rasmus Lerdorf <a href="https://groups.google.com/forum/#!msg/comp.infosystems.www.authoring.cgi/PyJ25gZ6z7A/M9FkTUVDfcwJ">Anunciou a Versão 1.0 do PHP</a> e como se esse sozinho já não fosse um excelente motivo pra trazer de volta a vida esse mesmo blog que não recebe atualizações a tempos, o Ben Ramsey <a href="http://benramsey.com/blog/2015/06/20-years-of-php/">chamou todos os desenvolvedores para contar um pouco da sua história com PHP</a> e é por isso que eu estou aqui.</p>
<p>Mas para contar minha historia com PHP eu tenho que voltar um pouco antes disso, em 2001, quando eu ainda cursava a sétima serie do ensino fundamental, tinha uma disciplina chamada Intermátca (Interdisciplinaridade e Informática, eu sei o nome é péssimo) e o ano inteiro da disciplina consistia em escolher um tema de seu interesse e desenvolver uma página na internet (estática mesmo) falando sobre esse tema, depois de pensar um pouco sobre qual tema iria escolher acabei optando por falar sobre <a href="http://pt.wikipedia.org/wiki/Isaac_Asimov">Isaac Asimov</a> já que robótica era um tema que me interessava bastante, no final desse ano eu não só entreguei um site funcional (com FrontPages em HTML 3 usando frames) que contava um pouco sobre a história do Asimov e continha uma seção com sua bibliografia principal, como também desenvolvi o trabalho de quase todo o resto da turma (tomara que meus professores da época não leiam isso) mas mais do que me garantir a aprovação na matéria isso me abriu os olhos para um mundo até então desconhecido de desenvolvimento de páginas para web.</p>
<p>No ano seguinte a disciplina se repetiu mas parecia mais do mesmo e eu queria mais que isso, comecei então a desenvolver pequenos sites estáticos sobre conteúdos dos quais eu também gostava e cheguei a publicar alguns deles na época, foi nessa época que tive meu primeiro contato com CSS e Web Semântica, o ensino médio chegou e reduzi um pouco essas atividades até que em 2006 depois de já ter sido aprovado no vestibular para a faculdade de Sistemas de Informação resolvi aprofundar meus conhecimentos nas férias antes das aulas começarem, nessa época os sites dinâmicos estavam tomando conta do mercado de tecnologia e eu queria saber como desenvolver páginas com conteúdo personalizado para o usuário e que armazenavam informações no que mais tarde fui descobrir ser um banco de dados.</p>
<p>Acontece que eu não conseguia fazer isso com HTML e CSS, e Javascript não era nem 1% do que é hoje, então comecei a pesquisar como isso era feito e as duas linguagens que apareceram para mim foram PHP e ASP (Legacy ASP), pesquisei mais um pouco na internet e descobri que o Senac de São Paulo oferecia cursos das duas tecnologias, me inscrevi então nos dois para poder decidir qual delas eu mais gostava na prática, porém o &#8220;destino&#8221; influenciou minha escolha e o curso de ASP acabou sendo cancelado por falta de alunos, foi então que tive meu primeiro contato com PHP.</p>
<p>Nem dois meses depois comecei a faculdade juntamente com um estágio de desenvolvimento web em um provedor de internet à rádio local, acontece que a maioria dos sistemas desenvolvidos por essa empresa eram feitos em .NET com VBScript fiquei então responsável mais pelo front-end das aplicações que era o que eu dominava um pouco mais, porem como a principal atividade dessa empresa era fornecer conexão a radio para alguns condomínio e empresas da região o desenvolvimento de sistemas acabava ficando em segundo plano e isso me deu bastante tempo para estudar durante o horário de trabalho.</p>
<p>Não cheguei a ficar nem um ano nesse estágio, comecei a fazer alguns cursos de desenvolvimento em um centro de treinamento e a partir de um desses cursos me surgiu a oportunidade de trabalhar como freelancer em um projeto de grande porte em uma indústria de cosméticos em parceria com uma agencia de desenvolvimento, depois que esse projeto freelance acabou ainda desenvolvi mais alguns projetos com essa agencia de desenvolvimento, mas logo em seguida decidi abrir minha própria empresa de desenvolvimento, a Psyco.</p>
<p>Não vou negar que ter controle de todos os passos do desenvolvimento de uma aplicação e poder tratar diretamente com o cliente eram muito bons, mas como a maioria dos projetos eu acabava cuidando sozinho, comecei a sentir falta da evolução que vinha com a troca de conhecimento com outros profissionais foi então que decidi começar a participar mais de eventos e congressos de desenvolvimento, e em um dos primeiros grandes eventos de desenvolvimento grandes que eu fui nessa época, o TDC São Paulo, eu conheci o PHPSP, fui então conversar com o Anderson &#8220;Duodraco&#8221; Casimiro para saber como eu poderia participar mais da comunidade, ele me falou de alguns eventos que o PHP fazia na época e fiquei de participar dos próximos, mas antes disso no final daquele mesmo dia de TDC fui com alguns dos participantes do evento e membro da comunidade para uma confraternização depois do evento, foi nessa confraternização que acabei conhecendo pessoas como Rogerio, Hussani.</p>
<p>Depois disso comecei a participar dos encontros no iMasters que rolavam na época e dos Pubs organizados pelo PHPSP e conheci ainda mais pessoas ótimas como o William, Diego, Thamara, Ivan e muitos outros e passei a me envolver cada vez mais com a comunidade de desenvolvimento principalmente com o PHPSP e isso passou a ser uma parte muito importante da minha vida. Depois disso já participei de muitos outros eventos, palestrei em alguns e ajudei a organizar alguns outros também, descobri o que realmente é o mundo Open Source e passei a contribuir com ele, me tornei um profissional certificado pela Zend e espero continuar seguindo nesse caminho que só me trouxe coisas boas.</p>
<p>Por isso gostaria de aproveitar e agradecer a todos os que foram citados nesse artigo e muitos outros que não foram mais que fazer parte do PHPSP e das comunidades de desenvolvimento pelo mundo, muitos deles que eu tive oportunidade de conhecer pessoalmente e outros que acompanho pelas redes sociais, Obrigado a todos e que os próximos 20 anos sejam ainda melhores.</p>
<p>E se você ainda não cansou de ler tudo isso e quiser saber também as histórias sobre PHP de outros desenvolvedores aqui segue uma listinha de algumas dessas histórias que foram publicadas hoje:</p>
<ul>
<li><a href="http://benramsey.com/blog/2015/06/20-years-of-php/">Bem Ramsey</a></li>
<li><a href="http://blog.calevans.com/2015/06/08/celebrating-20-years-of-php/">Cal Evans</a></li>
<li><a href="http://akrabat.com/20-years-of-php/">Rob Allen</a></li>
<li><span class="full-name"><span class="p-name customisable-highlight" data-scribe="element:name"><a href="http://www.dragonbe.com/2015/06/20-years-of-php.html">Michelangelo van Dam</a></span></span></li>
<li><span class="main_title"><a href="https://mwop.net/blog/2015-06-08-php-is-20.html">Matthew Weier o&#8217;Phinney</a></span></li>
<li><a href="http://duodra.co/2015/06/08/minha-historia-com-php/">Anderson &#8220;Duodraco&#8221; Casmiro</a></li>
<li><a href="http://www.erikaheidi.com/blog/celebrating-php-twenty-years">Erika Heidi</a></li>
<li><a href="http://blog.doh.ms/2015/06/08/20-years-of-php-and-how-i-got-on-this-train/">Rafael Dohms</a></li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2015/06/08/20-anos-de-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtendo Informações de Aplicações Externas com Zend_Http</title>
		<link>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/</link>
		<comments>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/#respond</comments>
		<pubDate>Wed, 07 Dec 2011 16:15:36 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Http]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1082</guid>
		<description><![CDATA[A algum tempo atras escrevi um artigo sobre Conexão com Servidores XML-RPC, essa é uma das formas de se obter informações de uma aplicação externa, mas em algumas ocasiões as informações que se deseja buscar estão disponíveis publicamente e não é não existe um servidor XML-RPC para fornecer essas informações, nesse caso podemos realizar requisições HTTP simples no plano de fundo da aplicação para obter o conteúdo de outros sites ou aplicações. Iniciando uma Requisição HTTP Remota. Para iniciar uma requisição HTTP remota tudo o que precisa ser feito é abrir uma conexão com o servidor externo através do protocolo [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A algum tempo atras escrevi um artigo sobre <a title="Requisições XML-RPC com Zend Framework" href="http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/">Conexão com Servidores XML-RPC</a>, essa é uma das formas de se obter informações de uma aplicação externa, mas em algumas ocasiões as informações que se deseja buscar estão disponíveis publicamente e não é não existe um servidor XML-RPC para fornecer essas informações, nesse caso podemos realizar requisições HTTP simples no plano de fundo da aplicação para obter o conteúdo de outros sites ou aplicações.</p>
<h3>Iniciando uma Requisição HTTP Remota.</h3>
<p>Para iniciar uma requisição HTTP remota tudo o que precisa ser feito é abrir uma conexão com o servidor externo através do protocolo HTTP usando para isso a classe Zend_Http da seguinte forma:</p>
<pre>$client = new Zend_Http_Client($recipient);</pre>
<p>Você ainda poderá passar alguma configurações para essa requisição, como por exemplo limitar o número de redirecionamentos para 0, ou seja, não permitir que o servidor redirecione para outro site ou aplicação, e limitar o tempo de resposta do servidor, para evitar problemas caso o servidor esteja indisponível, essas configurações podem ser feitas da seguinte forma.</p>
<pre>$client-&gt;setConfig(array(
	'maxredirects' =&gt; 0,
	'timeout'      =&gt; 30));</pre>
<h3>Passando Parâmetro para a Requisição.</h3>
<p>Além de ajustar as configurações de conexão ainda é possível passar parâmetros para essa requisição, um exemplo dessa utilização e caso seja necessário passar dados pelo método POST, usado frequentemente em formulários, o exemplo a seguir mostra a passagem de alguns dados usando esse método:</p>
<pre>$client-&gt;setParameterPost(array(
	'search'  =&gt; 'Psyco',
	'limit'   =&gt; 10,
));

$client-&gt;setMethod(Zend_Http_Client::POST);</pre>
<p>No exemplo acima estamos passando dois parâmetros através do método POST, o primeiro deles seria um termo de busca e o segundo um limite de respostas que seriam exibidas, esses dados poderiam ser passados para um mecanismo de busca para obter seus resultados.</p>
<h3>Obtendo a Reposta</h3>
<p>Depois de realizar todas as configurações e passar os parâmetros necessários é hora de receber as resposta desse servidor, a instrução a seguir demonstra como isso deve ser feito:</p>
<pre>$response = $client-&gt;request();</pre>
<p>Essa instrução irá obter a resposta completa do servidor, o que incluíra o cabeçalho do arquivo e da requisição assim como todo o conteúdo da página, você pode filtrar essa requisição e obter somente o cabeçalho ou somente o conteúdo através das instruções abaixo:</p>
<pre>$response = $response-&gt;getHeader(); //Recebe o cabeçalho
$response = $response-&gt;getBody(); //Recebe o conteúdo</pre>
<h3>Conclusão</h3>
<p>Existem diversas formas de comunicação entre diferentes sites ou aplicações, anteriormente falei um pouco sobre as requisições XML-RPC, essa foi a vez de exemplificar um pouco conexões externas utilizando o próprio protocolo HTTP, cada cenário poderá exigir uma solução diferente, cabe ao programador da aplicação definir qual das soluções melhor se adapta as necessidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/12/07/obtendo-informacoes-de-aplicacoes-externas-com-zend_http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tags Multimídia HTML5</title>
		<link>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/</link>
		<comments>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/#respond</comments>
		<pubDate>Wed, 30 Nov 2011 06:02:51 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1074</guid>
		<description><![CDATA[No artigo anterior falei um pouco sobre as novas tags de conteúdo da versão 5 da HTML, agora chegou a hora de falar um pouco sobre as tags multimídia, que permitem a incorporação de conteúdo em áudio ou vídeo sem a necessidade de instalação de nenhum plugin extra para isso. Incorporando Áudio com HTML 5 Incorporar áudio com HTML5 é muito simples, tudo o que precisa ser feito é inserir o seguinte código na sua marcação: &#60;audio controls="controls"&#62; &#60;source src="audio.ogg" type="audio/ogg" /&#62; &#60;source src="audio.mp3" type="audio/mp3" /&#62; Seu Navegador Não Suporta Áudio em HTML5 &#60;/audio&#62; No código acima vemos a tag [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>No artigo anterior falei um pouco sobre as novas tags de conteúdo da versão 5 da HTML, agora chegou a hora de falar um pouco sobre as tags multimídia, que permitem a incorporação de conteúdo em áudio ou vídeo sem a necessidade de instalação de nenhum plugin extra para isso.</p>
<h3>Incorporando Áudio com HTML 5</h3>
<p>Incorporar áudio com HTML5 é muito simples, tudo o que precisa ser feito é inserir o seguinte código na sua marcação:</p>
<pre>&lt;audio controls="controls"&gt;
	&lt;source src="audio.ogg" type="audio/ogg" /&gt;
	&lt;source src="audio.mp3" type="audio/mp3" /&gt;
	Seu Navegador Não Suporta Áudio em HTML5
&lt;/audio&gt;</pre>
<p>No código acima vemos a tag &lt;audio&gt; que indica a presença de um elemento de áudio na página, nesse caso a tag só contém um atributo controls, que quando incluído instrui o navegador a exibir os controlers desse vídeo, caso esse atributo seja omitido os controles não serão mostrados, além disso essa tag ainda pode receber outros atributos que não estão presentes nesse exemplo, são eles, &#8220;autoplay&#8221;, que caso incluído fará com que o áudio toque automaticamente com o carregamento da página (use com moderação), &#8220;loop&#8221; que indicará que ao final do áudio ele deve ser tocado novamente, e &#8220;preload&#8221; que indica que o arquivo de áudio deve ser carregado (apenas carregado, não tocado) juntamente com a página.</p>
<p>Dentro dessa tag &lt;audio&gt; existem duas tags &lt;source&gt;aonde são informados os caminhos para dois arquivos de áudio, um em .mp3 e um e .ogg, isso é necessário pois alguns navegadores só possuem suporte a um desses tipos de áudio, então para que sua aplicação funcione corretamente nos navegadore modernos é fundamental que você forneça o arquivo em pelo menos esses dois formados, cada um deles contém também o atributo type que indica o mime type desse arquivo.</p>
<p>Por fim, um texto informativo que será exibido somente caso o navegador não possui suporte a tag &lt;audio&gt; do HTML5 é utilizado para informar o visitante dessa limitação do seu navegador.</p>
<h3>Incorporando Vídeo com HTML5</h3>
<p>Incorporar vídeos em HTMl5 é bastante similar à incorporação de áudio, abaixo um exemplo de código para inserção de vídeo que será dvidamente explicado a seguir:</p>
<pre>&lt;video width="400" height="300" controls="controls"&gt;
	&lt;source src="video.mp4" type="video/mp4" /&gt;
	&lt;source src="video.ogg" type="video/ogg" /&gt;
	Seu Navegador Não Suporta Vídeo em HTML5
&lt;/video&gt;</pre>
<p>A diferença básica entre aúdio e vídeo, e que além dos atributos explicados anteriormente o vídeo deve conter os atributos que determinam a largura e a altura desse componente de vídeo (atributos width e height respectivamente), além disso existem dois outros atributos opcionais que podem ser utilizados, o atributo &#8220;poster&#8221; que deve receber como valor o endereço de uma imagem que será usada com demonstração do vídeo antes de seu início e o atributo &#8220;muted&#8221; que caso seja usado fará com que o vídeo toque sem o seu áudio.</p>
<h3>Conclusão</h3>
<p>A inclusão de áudio e vídeo em HTML5 é bastante simples, porém existem usuários que ainda utilizam navegadores sem suporte a essa tecnologia, por isso é sempre bom fornecer uma alternativa a utilização de HTML5 caso o áudio ou vídeo seja de muita importância para o conteúdo da página, com o tempo e a evolução dos navegadores será possível abondonar as tecnicas antigas e explorar ao máximo as capacidades da nova tecnologia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/30/tags-multimidia-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tags de Conteúdo HTML</title>
		<link>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/</link>
		<comments>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 03:08:17 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Marcação]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1068</guid>
		<description><![CDATA[A algum tempo eu não escrevo aqui no blog sobre front-end development, mas essa também é uma área fundamental para o desenvolvimento de boas aplicações que sejam ao mesmo tempo completas, proporcionem uma facilidade de uso para o utilizador da mesma, apesar das novas tags HTML5 já terem sido amplamente tratadas em sites especializados acredito que agora que a maioria dos navegadores já possui suporte completo para elas seja a hora de relembrar um pouco. Nesse artigo vou falar apenas das tags de conteúdo da nova versão da linguagem, deixando de lado um pouco as tags multimídia. Introdução sobre Semântica [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A algum tempo eu não escrevo aqui no blog sobre front-end development, mas essa também é uma área fundamental para o desenvolvimento de boas aplicações que sejam ao mesmo tempo completas, proporcionem uma facilidade de uso para o utilizador da mesma, apesar das novas tags HTML5 já terem sido amplamente tratadas em sites especializados acredito que agora que a maioria dos navegadores já possui suporte completo para elas seja a hora de relembrar um pouco. Nesse artigo vou falar apenas das tags de conteúdo da nova versão da linguagem, deixando de lado um pouco as tags multimídia.</p>
<p><strong>Introdução sobre Semântica</strong></p>
<p>A versão 5 da linguagem HTML tem grandes melhorias no que diz respeito a semântica de uso das tags, mas antes de explicar cada uma dessas tags é preciso saber melhor o que de fato é semântica, a semântica aplicada a marcação de páginas HTML é a correta relação entre as tags existentes na linguagem e o conteúdo inserido nelas, ou seja, utilizar semântica corretamente no HTML é marcar um parágrafo com a tag &lt;p&gt; e um link com a tag &lt;a&gt;, porém, esses são exemplos mais óbvios de semântica, a versão 5 da linguagem HTML vem resolver o problema da ausência de semântica da tag &lt;div&gt;, essa tag por natureza é ausente de significado, e seu objetivo é apenas demarcar uma divisão na página, na maioria das vezes apenas por critérios de apresentação.</p>
<p>As novas tags de conteúdo da linguagem tem como objetivo incorporar significado a algumas das áreas mais comuns de uma página HTML, dessa forma são criadas as tags &lt;header&gt;, &lt;section&gt;, &lt;article&gt;, &lt;nav&gt;, &lt;aside&gt; e &lt;footer&gt; das quais vou tratar abaixo.</p>
<h3>As Novas Tags</h3>
<p>A tag &lt;header&gt; é responsável por marcar a porção do código que se refere ao cabeçalho da página ou seção, esse cabeçalho pode conter por exemplo o titulo do site, uma imagem de cabeçalho e até mesmo um menu principal delimitado pela tag &lt;nav&gt; tratada abaixo. Da mesma forma a tag &lt;footer&gt; é responsável por marcar o rodapé do mesma página ou seção, podendo conter os mesmo elementos da tag anterior.</p>
<p>A tag &lt;section&gt; delimita uma seção do site ou uma seção do site ou do conteúdo, dependendo de onde essa tag está presente na hierarquia do código, delimitados por essa tag podem estar os títulos do conteúdo ou da seção do site. Já tag &lt;article&gt; pode ser literalmente traduzida para artigo, e é dentro dessa tag que deve estar o conteúdo de fato do site ou aplicação. A tag &lt;aside&gt; representaria então o conteúdo relacionado ao conteúdo principal do site, porém, que tem um grau de importância menor que o conteúdo principal delimitado pela tag &lt;article&gt;. Além disso pode representar algum conteúdo relacionado ao uma seção do site e portanto ser utilizado juntamente com a tag &lt;section&gt;.</p>
<p>Por fim tag &lt;nav&gt; é responsável pela navegação do site, portanto é recomendável que os menus do site estejam delimitados pela mesma.</p>
<h3>Estrutura dos Elementos na Página</h3>
<p>Esse é o principal ponto que desejo tratar nesse artigo, não existe um consenso nem uma regra explicita sobre a estruturação dos elementos na página, o que permite algumas interpretações de significados diferentes para cada um das tags de acordo com a hierarquia dos elementos no site, por exemplo, uma tag &lt;header&gt; ou &lt;footer&gt; um nível imediatamente abaixo da tag &lt;body&gt; representaria o cabeçalho ou rodapé da página, porém, caso essas mesma tags fossem utilizadas dentro de uma tag &lt;section&gt; elas passariam a representar o cabeçalho e o rodapé dessa seção individualmente, dessa forma uma página inteira poderia conter vários cabeçalhos e rodapés, cada um deles se referindo a seções distintas da página.</p>
<p>Da mesa forma isso pode acontecer com a tag &lt;nav&gt;, que caso inserida um nível diretamente abaixo da tag &lt;body&gt; ou dentro da tag &lt;header&gt; ou &lt;footer&gt; da página, representaria o menu de navegação principal do site, a mesma tag inserida dentro da tag &lt;section&gt; poderia representar uma navegação secundária ou específica para aquela seção.</p>
<p>Agora o ponto que mais permite diferentes utilizações das tags é aquele que se refere ao relacionamento entre as tags &lt;section&gt;, &lt;article&gt; e &lt;aside&gt;. Para começar as tags &lt;section&gt; e &lt;article&gt; poderia ser aninhadas infinitamente, nesse caso uma &lt;section&gt; imediatamente após a declaração de &lt;body&gt; poderia representar uma seção do site, que por sua vez poderia delimitar uma tag &lt;article&gt; que delimitaria uma nova tag &lt;section&gt; representando uma seção específica do conteúdo e não mais da página. Além disso a tag &lt;section&gt; poderia ser diretamente aninhada representando uma seção principal e outras sub-se</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/23/tags-de-conteudo-html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Requisições XML-RPC com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 16:36:25 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[XML-RPC]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_XmlRpc]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1050</guid>
		<description><![CDATA[Muitas vezes durante o desenvolvimento de algumas aplicações precisamos realizar conexões entre dois servidores para enviar ou buscar informações, existem diferentes protocolos para realizar esse tipo de atividade, mas nesse artigo vou tratar um pouco sobre o protocolo RPC, mais especificamente sobre a variante desse protocolo que transporta mensagens no formato XML, o XML-RPC. Realizando Conexão com um Servidor XML-RPC Antes de se conectar a um servidor é preciso saber se esse servidor suporta o protocolo XML-RPC, se esse servidor realmente suportar o protocolo muito provavelmente haverá uma documentação da interface de conexão com esse servidor, você irá precisar dela [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Muitas vezes durante o desenvolvimento de algumas aplicações precisamos realizar conexões entre dois servidores para enviar ou buscar informações, existem diferentes protocolos para realizar esse tipo de atividade, mas nesse artigo vou tratar um pouco sobre o protocolo RPC, mais especificamente sobre a variante desse protocolo que transporta mensagens no formato XML, o XML-RPC.</p>
<h3>Realizando Conexão com um Servidor XML-RPC</h3>
<p>Antes de se conectar a um servidor é preciso saber se esse servidor suporta o protocolo XML-RPC, se esse servidor realmente suportar o protocolo muito provavelmente haverá uma documentação da interface de conexão com esse servidor, você irá precisar dela para saber os nomes dos métodos que poderá chamar para realizar as consultas ou enviar informações.</p>
<p>Como exemplo vou assumir que está sendo feita uma conexão com um servidor, que suporta o protocolo XML-RPC e que está localizado no endereço &#8220;http://servidor.xmlrpc.com/xmlrpc.php&#8221;, e que implementa apenas um método &#8220;toEnglish&#8221; da classe &#8220;translate&#8221; responsável por receber palavras ou frases em português e retornar sua tradução em inglês.</p>
<p>Para se conectar a esse servidor tudo que precisa ser feito é o seguinte:</p>
<pre>$client = new Zend_XmlRpc_Client('http://servidor.xmlrpc.com/xmlrpc.php');</pre>
<p>Essa instrução está criando uma instância da classe Zend_XmlRpc_Client, passando como parâmetro o endereço do servidor e armazenando essa instância na variável <em>$client</em></p>
<h3>Realizando Chamadas aos Métodos</h3>
<p>Para chamar o método previamente descrito tudo o que precisa ser feito é o seguinte:</p>
<pre>$result = $client-&gt;call('translate.toEnglish', array('Olá Mundo'));
echo $result; //Hello World</pre>
<p>Está sendo chamado o método call da instância de classe armazenada anteriormente na variável <em>$client</em> passando como primeiro parâmetro o nome da classe e método a serem chamados separados por &#8220;.&#8221; e em seguida um array com os parâmetros requisitados por esse método, nesse exemplo apenas a frase em português que deve ser traduzida, caso o método do servidor tenha sido corretamente implementado ele deverá retornar a String &#8220;Hello World&#8221;.</p>
<h3>Verificando Erros e Faltas</h3>
<p>Quando estamos trabalhando com conexões com servidores diferentes muitos fatores podem ocasionar falhar nessa comunicação e muitos deles não estão sob o controle do desenvolvedor, nesse caso tudo o que se pode fazer é verificar se algum erro ocorreu e informar essa falha, isso pode ser feito através de um bloco try-catch da seguinte forma:</p>
<pre>try{
	echo $client-&gt;call('translate.toEnglish', array('Olá Mundo'));
}catch (Zend_XmlRpc_Client_FaultException $e) {
	echo 'XmlRpc Fault ['.$e-&gt;getCode().']: '.$e-&gt;getMessage();
}catch (Zend_XmlRpc_Client_HttpException $e) {
	echo 'Erro de HTTP ['.$e-&gt;getCode().']: '.$e-&gt;getMessage();
}</pre>
<p>Nesse caso a requisição XmlRpc está inserida dentro de um bloco try-catch, caso a mesma seja bem sucedida será impresso na tela a tradução da String enviada como parâmetro, caso contrário existem duas possibilidades de erros, a primeira quando a conexão foi realizada com sucesso mas o servidor remoto retornou uma falta, isso pode acontecer caso a string enviada tenha algum caractere inválido ou caso alguma verificação do servidor não tenha sido bem sucedida, nesse caso é impresso na tela o código e mensagem de erro retornados pelo servidor.</p>
<p>Outra possibilidade é que ocorra uma falha na comunicação com o servidor, o servidor pode estar fora do ar temporariamente ou não ser encontrado, nesse caso a classe Zend_XmlRpc retorna um erro de HTTP, esse erro é impresso na tela juntamente com seu código da mesma forma que o anterior. Dessa forma é possível controlar melhor a comunicação entre as duas aplicações.</p>
<h3>Conclusão</h3>
<p>Com Zend_XmlRpc a comunicação entre duas aplicações se torna muita mais fácil do que caso fosse feita manualmente, com isso é possível acessar API públicas ou proprietárias que forneçam suporte ao esse protocolo e melhorar significamente a sua aplicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/16/requisicoes-xml-rpc-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Autenticação Através de Banco de Dados com Zend_Auth</title>
		<link>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/</link>
		<comments>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 13:00:25 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Autenticação]]></category>
		<category><![CDATA[Auth]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Auth]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1018</guid>
		<description><![CDATA[Boa parte das aplicações desenvolvidas para a web tem pelo menos uma pequena área de acesso restrito, essa área pode restringir o acesso a determinado conteúdo somente para usuários cadastrados ou pode até mesmo ser uma área de administração dessa aplicação, onde o acesso não autorizado poderia trazer mais prejuízos, por isso, é sempre importante desenvolver uma forma segura de verificar as credencias do usuário e isso fica ainda melhor se além de segura essa forma puder ser tão simples como a solução disponível no Zend Framework que será apresentada nesse artigo. A Classe Zend_Auth A classe Zend_Auth do Zend [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Boa parte das aplicações desenvolvidas para a web tem pelo menos uma pequena área de acesso restrito, essa área pode restringir o acesso a determinado conteúdo somente para usuários cadastrados ou pode até mesmo ser uma área de administração dessa aplicação, onde o acesso não autorizado poderia trazer mais prejuízos, por isso, é sempre importante desenvolver uma forma segura de verificar as credencias do usuário e isso fica ainda melhor se além de segura essa forma puder ser tão simples como a solução disponível no Zend Framework que será apresentada nesse artigo.</p>
<h3>A Classe Zend_Auth</h3>
<p>A classe Zend_Auth do Zend Framework é responsável por cuidar de todo o processo de autenticação e armazenamento da seção de login do usuário, deixando muito mais simples o trabalho de verificação das credenciais de acesso e permitindo a utilização de diversos modo de verificação, incluindo verificação de identidade através do banco de dados, através do protocolo HTTP e até mesmo através de serviços como OpenID. Além disso ela pode ser extendida para realizar a verificação por qualquer outro modo que não esteja disponível nativamente. Nesse artigo apenas o método de autenticação através do banco de dados será apresentado, mas você pode conferir a <a href="http://framework.zend.com/manual/en/zend.auth.html">Documentação Oficial da Classe Zend_Auth</a> caso precise realizar a autenticação através de outro método.</p>
<h3>Autenticação Através de Banco de Dados</h3>
<div id="attachment_1033" style="width: 110px" class="wp-caption alignleft"><a href="http://www.pauloeduardo.com/wp-content/uploads/2011/10/UserTable.png"><img class="size-full wp-image-1033 " title="Tabela de Usuários" src="http://www.pauloeduardo.com/wp-content/uploads/2011/10/UserTable.png" alt="Tabela de Usuários" width="100" height="86" /></a><p class="wp-caption-text">Tabela de Usuários</p></div>
<p>Para realizar a autenticação de usuário através do banco de dados é preciso ter uma tabela nesse banco com pelo menos duas colunas, o login e a senha, para critério de exemplo nesse artigo vou adicionar também o nome completo do usuário, seu e-mail, além disso o campo de senha será criptografado usando MD5 (lembrando que o uso de Md5 para armazenar senhas não é recomendado pois é um algorítimo com grande facilidade de quebra, nesse caso usarei apenas como exemplo). O diagrama ao lado ilustra o banco de dados que deverá ser criado para esse exemplo e abaixo transcrevo o código SQL desse banco:</p>
<pre>CREATE TABLE `User` (
	id    int(11) NOT NULL AUTO_INCREMENT,
	nome  varchar(255) NOT NULL,
	mail  varchar(255) NOT NULL,
	login varchar(255) NOT NULL,
	pass  varchar(255) NOT NULL,
	PRIMARY KEY (id)
);</pre>
<h4>O Formulário</h4>
<p>Para criar uma ferramenta de login precisamos criar um formulário por onde o usuário irá informar seus dados para que esses sejam verificados.</p>
<pre>&lt;?php

class Form_Login extends Zend_Form
{
	public function init()
	{
		$login = new Zend_Form_Element_Text('login');
		$login-&gt;setLabel('Login do Usuario')
			-&gt;setRequired(true)
			-&gt;addFilter('StripTags')
			-&gt;addFilter('StringTrim');

		$senha = new Zend_Form_Element_Password('senha');
		$senha-&gt;setLabel('Senha do Usuario')
			-&gt;setRequired(true)
			-&gt;addFilter('StripTags')
			-&gt;addFilter('StringTrim');

		$submit = new Zend_Form_Element_Submit('Entrar');
		$this-&gt;addElements(array($login, $senha, $submit));
	}
}</pre>
<p>O formulário acima contem apenas dois campos, o campo de login e o campo de senha, além é claro do botão que enviará esse formulário para que seus dados sejam processados, as informações sobre método de envio (GET ou POST) foram omitidas, mas é sempre bom lembrar que é altamente recomendável passar dados de login apenas por POST e nunca por GET já que no segundo caso eles ficam visíveis na URL.</p>
<h4>O Controller</h4>
<p>Praticamente toda a verificação de login nesse exemplo será realizada no Controller, por isso essa parte necessita de um pouco mais de atenção, abaixo segue o código desse controller que será devidamente explicado abaixo.</p>
<pre>public function loginAction(){
	if(Zend_Auth::getInstance()-&gt;hasIdentity()){
		$this-&gt;_redirect('index');
	}else{
		$this-&gt;view-&gt;form = new Form_Login();

		if($this-&gt;getRequest()-&gt;isPost() and $this-&gt;view-&gt;form-&gt;isValid($_POST)){
			$values = $this-&gt;view-&gt;form-&gt;getValues();

			$dbAdapter = Zend_Db_Table::getDefaultAdapter();
			$adapter = new Zend_Auth_Adapter_DbTable($dbAdapter);

			$adapter-&gt;setTableName('User')
				-&gt;setIdentityColumn('login')
				-&gt;setCredentialColumn('pass')
				-&gt;setIdentity($values['usuario'])
				-&gt;setCredential($values['senha'])
				-&gt;setCredentialTreatment('MD5(?)');;

			$auth = Zend_Auth::getInstance();
			$result = $auth-&gt;authenticate($adapter);

			if ($result-&gt;isValid()) {
				$this-&gt;_redirect('index');
			}else{
				$this-&gt;view-&gt;form-&gt;setDescription('Usuário ou Senha Inválidos');
			}
		}
	}
}</pre>
<p>Uma Action de Login (loginAction) está sendo criada e logo no início dessa Action está sendo chamado um método estático da classe Zend_Auth para verificar se o usuário já está logado, caso ele já esteja ele é direcionado para a página inicial, caso não esteja o formulário criado anteriormente é instanciado e armazenado na variável <em>$this-&gt;view-&gt;form</em>, ou seja está sendo armazenado em uma variável e passado a visão ao mesmo tempo.</p>
<p>Logo em seguida verificamos se existe uma requisição POST a essa ação e caso exista se o valores passados por essa requisição são válidos de acordo com os parâmetros de validação do formulário, nesse ponto cabe uma observação, caso a requisição não seja do tipo POST ou os valores não forem válidos o formulário será exibido na tela, ou seja, se o visitante ainda não envio nenhum dado para o formulário ou se esses dados estão errados (apenas do ponto de vista de validação de dados, não de login) ele será encaminhado ao formulário para enviar essas informações ou corrigir as informadas anteriormente.</p>
<p>Caso a requisição seja do tipo POST e os valores válidos chegou a hora de verificar se as credenciais estão corretas. A primeira coisa a ser feita é requisitar o adaptador padrão do banco de dados através do método <em>Zend_Db_Table::getDefaultAdapter()</em> e armazená-lo em uma variável, já que vamos precisar dele mais tarde, caso não exista um adaptador padrão previamente configurado será necessário iniciar uma conexão ao banco de dados. Em seguida é criada uma instancia da classe Zend_Auth_Adapter_DbTable passando como parâmetro o adaptador do banco citado anteriormente, e essa instância é armazenada em uma variável.</p>
<p>O próximo passo e passar as informações sobre os dados que serão usados por essa classe através dos métodos chamados logo em seguida. O método setTableName() recebe o nome da tabela de usuários no banco de dados, o método setIdentityColumn() recebe o nome da coluna do banco de dados onde está armazenada a informação de nome de usuário, setCredentialColumm por sua vez recebe o nome da coluna onde está armazenada a senha, os métodos setIdentity e setCredential recebem respectivamente os valores de login e senha passados pelo usuário e por fim o método setCredentialTreatment() recebe a informação sobre o tratamento que será fornecido a senha, nesse caso estamos utilizando a função md5() para criptografar essa senha.</p>
<p>Por fim requisitamos a instância da classe Zend_Auth e chamamos o método authenticate passando como parâmetro a instancia da classe Zend_Auth_Adapter_DbTable já com as informações armazenadas, se o retorno desse método for TRUE redirecionamos o usuário a página inicial se for FALSE incluimos uma descrição ao formulário com as informações de que o login e senha estão incorretos e enviamos o visitante de volta ao formulário para que ele preencha corretamente as informações.</p>
<h4>A View</h4>
<p>A View nesse caso só tem mesmo que exibir o formulário da seguinte fora:</p>
<pre>&lt;h2&gt;Acesso Restrito a Usuários Cadastrados&lt;/h2&gt;
&lt;?php echo $this-&gt;form; ?&gt;</pre>
<h3>Armazenando Informações na Seção de Login</h3>
<p>Através do método apresentado anteriormente foi possível verificar as credenciais do usuário que estava realizando o login e criar a seção de login do mesmo, porém nessa seção o único dado que foi armazenado foi o nome do usuário, porém as vezes é preciso que mais dados que estejam disponíveis na tabela do banco de dados também sejam armazenados, para isso basta realizar apenas uma pequena alteração no controller que ficará da seguinte forma:</p>
<pre>public function loginAction(){
	if(Zend_Auth::getInstance()-&gt;hasIdentity()){
		$this-&gt;_redirect('index');
	}else{
		$this-&gt;view-&gt;form = new Form_Login();

		if($this-&gt;getRequest()-&gt;isPost() and $this-&gt;view-&gt;form-&gt;isValid($_POST)){
			$values = $this-&gt;view-&gt;form-&gt;getValues();

			$dbAdapter = Zend_Db_Table::getDefaultAdapter();
			$adapter = new Zend_Auth_Adapter_DbTable($dbAdapter);

			$adapter-&gt;setTableName('User')
				-&gt;setIdentityColumn('login')
				-&gt;setCredentialColumn('pass')
				-&gt;setIdentity($values['usuario'])
				-&gt;setCredential($values['senha'])
				-&gt;setCredentialTreatment('MD5(?)');;

			$auth = Zend_Auth::getInstance();
			$result = $auth-&gt;authenticate($adapter);

			if ($result-&gt;isValid()) {
				$storage = $auth-&gt;getStorage();
				$storage-&gt;write($adapter-&gt;getResultRowObject(null,'pass'));

				$this-&gt;_redirect('index');
			}else{
				$this-&gt;view-&gt;form-&gt;setDescription('Usuário ou Senha Inválidos');
			}
		}
	}
}</pre>
<p>Logo antes de redirecionar o usuário para a página inicial foi chamado o método getStorage() da classe Zend_Auth e em seguida chamado o método write que recebe como parâmetro o retorno do método getResultRowObjet() que por sua vez pode receber como primeiro parâmetro uma lista de colunas do banco de dados que serão armazenadas (nesse caso foi passado null, que fará com que todas as colunas sejam armazenadas) e como segundo parâmetro uma lista das colunas que não serão armazenadas (nesse caso passamos o nome da coluna que contem a senha), ou seja, todas as colunas exceto a que contém a senha serão armazenadas, depois de ter realizado esse processo basta realizar o seguinte procedimento para exibir as informações da seção de login:</p>
<pre>echo Zend_Auth::getInstance()-&gt;getIdentity(); //Retorna o Login do Usuário mesmo que um Storage não tenha sido criado
echo Zend_Auth::getInstance()-&gt;getIdentity()-&gt;nome; //Retorna o Nome do Usuário
echo Zend_Auth::getInstance()-&gt;getIdentity()-&gt;email; //Retorna o E-mail do Usuário</pre>
<h3>Conclusão</h3>
<p>Através da classe apresentada nesse artigo é possível realizar de forma fácil e segura a autenticação do usuário através de diversos meios, aqui apenas um desses meios foi mostrado mas tenha certeza de que com pouca mudança no que foi apresentado é possível se adaptar a qualquer que seja a sua necessidade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/08/autenticacao-atraves-de-banco-de-dados-com-zend_auth/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Adcionando Paginadores à Paginas com Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/#respond</comments>
		<pubDate>Thu, 03 Nov 2011 13:00:25 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Paginação]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Paginator]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1028</guid>
		<description><![CDATA[Quando não é possível determinar o número exato de resultados que podem aparecer em uma página ou quando esse número de resultados é muito grande, uma prática excelente é usar um paginador para limitar o número de resultados que serão exibidos em cada um das páginas, dessa forma evita-se que uma página se torne muito extensa e que seu tamanho interfira no tempo de carregamento da mesma, além de deixá-la muito mais agradável visualmente. Paginadores no Zend Framework O Zend Framework possui uma classe de paginação própria, que facilita muito esse trabalho e ainda possibilita um excelente controle do modo [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quando não é possível determinar o número exato de resultados que podem aparecer em uma página ou quando esse número de resultados é muito grande, uma prática excelente é usar um paginador para limitar o número de resultados que serão exibidos em cada um das páginas, dessa forma evita-se que uma página se torne muito extensa e que seu tamanho interfira no tempo de carregamento da mesma, além de deixá-la muito mais agradável visualmente.</p>
<h3>Paginadores no Zend Framework</h3>
<p>O Zend Framework possui uma classe de paginação própria, que facilita muito esse trabalho e ainda possibilita um excelente controle do modo como esse paginador será exibido em página, a classe Zend_Paginator permite ainda que vários tipos de dados sejam paginados, os tipos mais comuns são dados contidos em um array e dados provenientes de um banco de dados, nesse artigo iremos abordar apenas o último desses tipos, mas a implementação em cada um deles é bastante semelhante.</p>
<h3>Paginando Resultados do Banco de Dados</h3>
<p>Para realizar a paginação de dados provenientes de um banco de dados obviamente é preciso ter um banco de dados, e pelo menos alguns dados inseridos nele, não vou entrar no mérito de criação desse banco de dados, pois muitos artigos anteriores já usaram diferentes bancos de dados com diferentes informações e o processo de criação de cada um desses bancos já foi detalhado anteriormente, nesse exemplo vou apenas assumir que existe um banco de dados, cuja conexão já está devidamente configurada no Zend Framework, com pelo menos uma tabela de usuários cujo Model também já foi criado.</p>
<h4>Controller</h4>
<p>O Paginador de banco de dados do Zend_Framework recebe como parâmetro um conjunto de dados provenientes do banco (rowset) e a partir desse conjunto de dados exibe apenas os resultados definidos pela configuração desse paginador, o código a seguir ilustra a parte dessa ação que é realizada no Controller:</p>
<pre>public function indexAction(){
	$pagina = $this-&gt;_getParam('pagina', 1);

	$userModel = new User();
	$rowsetUser = $userModel-&gt;fetchAll();

	$paginador = Zend_Paginator::factory($rowsetUser);
	$paginador-&gt;setItemCountPerPage(20);
	$paginador-&gt;setPageRange(9);
	$paginador-&gt;setCurrentPageNumber($pagina);

	$this-&gt;view-&gt;paginador = $paginador;
}</pre>
<p>Nesse exemplo todos os registros da tabela de usuário estão sendo buscados pelo método <em>fetchAll()</em> do Model de Usuários (<em>$userModel</em>) e então esses dados estão sendo passados para o método estático <em>factory()</em> da classe Zend_Paginator, esse método irá interpretar qual o tipo de dados está sendo passado para o paginador e realizar as ações necessárias para o tipo em questão.</p>
<p>Em seguida são feitas algumas configurações no paginador, a primeira delas e configurar o número máximo de itens por página para 20, seguido do número de páginas que será exibido nos controles de página e por último informando ao paginador qual página deverá ser exibida, a variável <em>$pagina</em> usada nesse caso armazena o número de página que está sendo passado pela URL e caso isso não tenha ocorrido assume que o número da página é 1 (Linha 1 do Código). Por último o paginador e passado para a view na variável <em>$this-&gt;view-&gt;paginador</em>.</p>
<h4>Partial View</h4>
<p>Depois de criar as ações no seu controller é preciso criar uma a estrutura dos controles de paginação, o código abaixo é um exemplo desse tipo de estrutura, é uma alteração do exemplo contido na documentação oficial do framework traduzido para o português:</p>
<pre>&lt;?php if ($this-&gt;pageCount): ?&gt;
	&lt;div&gt;
		&lt;!-- Controle de Página Anterior --&gt;
		&lt;?php if (isset($this-&gt;previous)): ?&gt;
			&lt;a href="&lt;?php echo $this-&gt;url(array('pagina' =&gt; $this-&gt;previous)); ?&gt;"&gt;&amp;lt; Anterior&lt;/a&gt; |
		&lt;?php else: ?&gt;
			&lt;span&gt;&amp;lt; Anterior&lt;/span&gt; |
		&lt;?php endif; ?&gt;

		&lt;!-- Controle Numérico de Página --&gt;
		&lt;?php foreach ($this-&gt;pagesInRange as $page): ?&gt;
			&lt;?php if ($page != $this-&gt;current): ?&gt;
				&lt;a href="&lt;?php echo $this-&gt;url(array('pagina' =&gt; $page)); ?&gt;"&gt;&lt;?php echo $page; ?&gt;&lt;/a&gt; |
			&lt;?php else: ?&gt;
				&lt;?php echo $page; ?&gt; |
			&lt;?php endif; ?&gt;
		&lt;?php endforeach; ?&gt;

		&lt;!-- Controle de Próxima Página --&gt;
		&lt;?php if (isset($this-&gt;next)): ?&gt;
			&lt;a href="&lt;?php echo $this-&gt;url(array('pagina' =&gt; $this-&gt;next)); ?&gt;"&gt;Próxima &amp;gt;&lt;/a&gt;
		&lt;?php else: ?&gt;
			&lt;span&gt;Próxima &amp;gt;&lt;/span&gt;
		&lt;?php endif; ?&gt;
	&lt;/div&gt;
&lt;?php endif; ?&gt;</pre>
<p>Esse código deve ser inserido dentro de um arquivo .phtml nesse exemplo vou assumir que esse arquivo está dentro do diretório views/scripts/layout/paginador.phtml mas você pode armazená-lo no lugar que achar melhor, o código acima também é apenas um exemplo de estrutura possível que pode ser alterado para atender as necessidades específicas de cada aplicação.</p>
<h4>Action View</h4>
<p>No arquivo de view da Action em questão tudo que precisa ser feito é o seguinte:</p>
<pre>&lt;?php if (count($this-&gt;paginador)): ?&gt;
	&lt;ul&gt;
		&lt;?php foreach ($this-&gt;paginador as $user): ?&gt;
			&lt;li&gt;&lt;?php echo $user-&gt;name; ?&gt;&lt;/li&gt;
		&lt;?php endforeach; ?&gt;
	&lt;/ul&gt;
&lt;?php endif; ?&gt;
&lt;?php echo $this-&gt;paginationControl($this-&gt;paginador, 'Sliding', 'layout/paginador.phtml'); ?&gt;</pre>
<p>Como é possível ver o dados estão sendo exibidos normalmente como se viessem diretamente do banco de dados, a única diferença é que ao final está sendo incluída a instrução para exibir o paginador, o método paginationControl() recebe três parâmetros, o primeiro deles é a instância do paginador que está sendo utilizado, o segundo é o estilo do paginador, para uma lista completa dos estilos disponível você pode acessar a Documentação da Classe Zend_Paginator, e o último parâmetro e o caminho para o arquivo com a estrutura dos controles que foi criado anteriormente.</p>
<p>Para simplificar ainda mais esse processo você pode configurar os padrões desse paginador incluindo no seu arquivo de Bootstrap a seguinte instrução:</p>
<pre>public function _initPaginator(){
	Zend_Paginator::setDefaultScrollingStyle('Sliding');
	Zend_View_Helper_PaginationControl::setDefaultViewPartial('layout/paginador.phtml');
}</pre>
<p>Feito isso você pode alterar a chamada para os controles de paginação (última linha do código da view Action no início do tópico) para apenas a seguinte instrução:</p>
<pre>&lt;?php echo $this-&gt;paginador; ?&gt;</pre>
<h3>Conclusão</h3>
<p>Com Zend_Paginator e alguns passos simples é possível melhorar significativamente a experiência do usuário na página e ainda reduzir o tempo de carregamento da mesma e o consumo de trafego do servidor de hospedagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/03/adcionando-paginadores-a-paginas-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Traduzindo Mensagens dos Formulários do Zend Framework</title>
		<link>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/</link>
		<comments>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/#respond</comments>
		<pubDate>Tue, 01 Nov 2011 13:00:23 +0000</pubDate>
		<dc:creator><![CDATA[Paulo Eduardo]]></dc:creator>
				<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tradução]]></category>
		<category><![CDATA[Translate]]></category>
		<category><![CDATA[Validação]]></category>
		<category><![CDATA[Validate]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Translate]]></category>
		<category><![CDATA[Zend_Validate]]></category>

		<guid isPermaLink="false">http://www.pauloeduardo.com/?p=1025</guid>
		<description><![CDATA[Artigo rápido sobre como configurar a tradução das mensagens de erro de validação dos formulários criados com Zend_Form a partir dos arquivos de linguagem disponíveis com a versão completa do framework. Baixando os Arquivos com as Traduções Os arquivos com as traduções do Zend Framework estão disponíveis somente com a versão completa do framework que pode ser baixada no Site Oficial, esses arquivos não estão disponíveis nem na versão mínima do framework, nem mesmo são importados para o projeto quando se realiza a criação da estrutura de diretórios a partir do Zend_Tool ou Zend Studio, por isso é fundamental que [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Artigo rápido sobre como configurar a tradução das mensagens de erro de validação dos formulários criados com Zend_Form a partir dos arquivos de linguagem disponíveis com a versão completa do framework.</p>
<h3>Baixando os Arquivos com as Traduções</h3>
<p>Os arquivos com as traduções do Zend Framework estão disponíveis somente com a versão completa do framework que pode ser baixada no Site Oficial, esses arquivos não estão disponíveis nem na versão mínima do framework, nem mesmo são importados para o projeto quando se realiza a criação da estrutura de diretórios a partir do Zend_Tool ou Zend Studio, por isso é fundamental que o download da biblioteca completa seja realizado. Após realizar esses download descompacte os arquivos e  copie a pasta &#8220;resources&#8221; que vem junto com o framework para a raiz do diretório do seu projeto.</p>
<h3>Configurando o Bootstrap</h3>
<p>Basicamente tudo que é preciso fazer para traduzir as mensagens de erro é configurar o seu arquivo de Bootstrap para incluir a linguagem desejada no tradutor padrão da seguinte forma:</p>
<pre>public function _initTranslate() {
	$translator = new Zend_Translate ( array ('adapter' =&gt; 'array', 'content' =&gt; '../resources/languages', 'locale' =&gt; 'pt_BR', 'scan' =&gt; Zend_Translate::LOCALE_DIRECTORY ) );
	Zend_Validate_Abstract::setDefaultTranslator ( $translator );
}</pre>
<p>Tudo que está sendo feito e criar uma instância da classe Zend_Translate e passar um array com os parâmetros de tipo de tradução, caminho para os arquivos de tradução e linguagem desejada, em seguida chamar o método estático <em>setDefaultTranslator()</em> da classe Zend_Validate_Abstract, passando a instância da classe Zend_Translate criada anteriormente.</p>
<h3>Traduzindo Mensagens de Seus Próprios Validadores</h3>
<p>Se você mesmo criou um validador personalizado e deseja que esse validador também esteja disponível em mais de uma linguagem, o processo é igualmente simples, deixa a mensagem de validação do corpo da sua classe de validação em inglês, assim esse validador seguirá o padrão do Zend Framework, em seguida insira mais um item no array cuja chave deve ser a sua mensagem de validação personalizada e o valor dessa variável a tradução para a linguagem desejada, como no exemplo a seguir:</p>
<pre>"My Personal Message" =&gt; "Minha Mensagem Personalizada",
"'%value%' is not a valid CEP" =&gt; "'%value%' não é um CEP válido",</pre>
<p>Se você usou termos coringa na sua mensagem de erro, como &#8216;%value%&#8217;, por exemplo, você também pode incluir esses valores coringa na sua mensagem de erro, como no segundo exemplo acima.</p>
<h3>Conclusão</h3>
<p>Com isso você pode deixar as mensagens da sua aplicação na mesma linguagem do restante da aplicação sem ter que alterar todas as classes de validação do framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pauloeduardo.com/2011/11/01/traduzindo-mensagens-dos-formularios-do-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
