<?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>DigitalDev</title>
	<atom:link href="http://www.digitaldev.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.digitaldev.com.br</link>
	<description>Para quem gosta de programar</description>
	<lastBuildDate>Wed, 18 Apr 2012 12:29:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>[Dica] Usando o Debian 6 Squeeze no Desktop</title>
		<link>http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/</link>
		<comments>http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 17:47:48 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Brasero]]></category>
		<category><![CDATA[Broffice]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Dicas para Linux]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Flashplayer no Debian]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[Google Chorme]]></category>
		<category><![CDATA[Iniciantes em Linux]]></category>
		<category><![CDATA[Java Virtual Machine]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Linux para Iniciantes]]></category>
		<category><![CDATA[Pidgin]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Plugins no Firefox]]></category>
		<category><![CDATA[Rar]]></category>
		<category><![CDATA[Thunderbird]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[VLC]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=771</guid>
		<description><![CDATA[O Linux, desde quando Linus Torvalds disponibilizou o projeto para a comunidade de desenvolvedores, tem sido usado com diversas finalidades em servidores de rede, super máquinas para processamento, clusters, mainframes e até mesmo embarcado em pequenos dispositivos que temos ao nosso redor. Isso aconteceu graças a sua grande flexibilidade de customização, por ser um ambiente &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/" data-text="[Dica] Usando o Debian 6 Squeeze no Desktop" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2012/04/debian-logo.jpg"><img class="aligncenter size-full wp-image-802" style="border: 0px;" title="debian-logo" src="http://www.digitaldev.com.br/wp-content/uploads/2012/04/debian-logo-e1334316908515.jpg" alt="" width="500" height="241" /></a></p>
<p>O Linux, desde quando <a href="http://pt.wikipedia.org/wiki/Linus_Torvalds" target="_blank">Linus Torvalds</a> disponibilizou o projeto para a comunidade de desenvolvedores, tem sido usado com diversas finalidades em servidores de rede, super máquinas para processamento, <a href="http://pt.wikipedia.org/wiki/Cluster" target="_blank">clusters</a>, <a href="http://pt.wikipedia.org/wiki/Mainframe" target="_blank">mainframes</a> e até mesmo embarcado em pequenos dispositivos que temos ao nosso redor. Isso aconteceu graças a sua grande flexibilidade de customização, por ser um ambiente seguro e também pela compatibilidade com os mais diversos tipos de dispositivos de hardware. Por manter o foco nessas finalidades, a interface com o usuário de desktops ficou para trás. Nessa época o sistema operacional não tinha interface gráfica, sistemas de janelas e era muito difícil instalar programas / aplicativos. Isso só mudou após o surgimento de sistemas de gerenciamento de janelas como <a href="http://pt.wikipedia.org/wiki/X_Window_System" target="_blank">X Window System</a>, de sistemas de gerenciamento de ambiente de trabalho como o <a href="http://pt.wikipedia.org/wiki/KDE" target="_blank">KDE</a> e <a href="http://pt.wikipedia.org/wiki/Gnome" target="_blank">Gnome</a>, de gerenciadores de pacotes como o <a href="http://pt.wikipedia.org/wiki/RPM_(Linux)" target="_blank">rpm</a>, <a href="http://pt.wikipedia.org/wiki/Dpkg" target="_blank">dpkg</a>, <a href="http://pt.wikipedia.org/wiki/Yum" target="_blank">yum</a> e <a href="http://pt.wikipedia.org/wiki/Apt" target="_blank">apt</a>.<br />
<span id="more-771"></span></p>
<h3>1 &#8211; Por que usar o Linux no Desktop?</h3>
<p>Muitas pessoas gostariam de aprender a usar o linux. Um possível primeiro passo nesse aprendizado é instalar o sistema operacional no seu próprio desktop para o uso no dia a dia. Mas esse não seria o único motivo para usar linux, existe também o fato dele ser de graça e ter o código aberto ( oposto ao Windows ). Outro fator que influi é que a quantidade de falhas de segurança é bem menor nessa plataforma do que na plataforma da Microsoft, pois nem se ouve falar sobre ameaças como vírus no linux.</p>
<h3>2 &#8211; Qual distribuição usar?</h3>
<p>Em vários artigos na Internet onde essa pergunta surge, os escritores sempre se esquivam dizendo que &#8220;A melhor distribuição é aquela que você mais se identifica, comece testando uma delas e troque até encontrar a sua&#8221;. Eu não direi o mesmo aqui, porque o intuito desse artigo é falar o uso do linux em desktops. Logo de cara, a melhor distribuição para se usar em desktops de iniciantes na plataforma é o <a title="Ubuntu" href="http://www.ubuntu-br.org/" target="_blank">Ubuntu</a>. Ele já vem com a maioria (se não todos) os programas que você irá usar para atividades corriqueiras como navegar na Internet, digitar e editar textos e se comunicar com amigos pelo Google Talk ou MS Messeger. Além disso, quase não é necessário se fazer configurações de repositórios e com poucas dicas de uso do apt, qualquer um será capaz de instalar programas adicionais.</p>
<p>Você deve estar se perguntando &#8220;Por que ele falou que o Ubuntu é o melhor para usuários iniciantes e escreveu um post sobre o Debian?&#8221;. O Debian e o Ubuntu são distribuições muito parecidas, isso se deve ao fato do primeiro ser a distribuição base usada no segundo. Porém, para usuários que preferem uma instalação mais limpa, instalando apenas os aplicativos necessários para o dia a dia, aconselho o uso do Debian. Como eu falei acima, o Ubuntu já é instalado com a maioria dos programas que precisaremos, porem também virá com muitos programas que nem chegaremos a usar.</p>
<h3>3 &#8211; Debian no Desktop</h3>
<blockquote><p>Nesse artigo, não será abordado sobre a instalação do Debian propriamente dita. O intuito do mesmo é apenas mostrar detalhes sobre a instalação de aplicativos para facilitar as atividades dos usuários.</p></blockquote>
<p>O uso de desktops está concentrado em exercer atividades como navegar na Internet, se comunicar com seus contatos do Microsoft Messeger e Google Talk, ler e-mails, assistir vídeos, escutar músicas entre outros. Mas isso só é possível com auxílio de alguns programas. Abaixo segue uma lista de alguns aplicativos que desempenham funções relacionadas à esse uso.</p>
<p>Os aplicativos aqui abordados serão:</p>
<ul>
<li>Gnome &#8211; Gerenciador de área de trabalho</li>
<li>Pidgin &#8211; Cliente de mensagem para MSN e Gtalk</li>
<li>Google Chrome &#8211; Navegador de Internet</li>
<li>Flashplayer Plugin &#8211; Plugin para visualização de animações em flash nos navegadores WEB</li>
<li>Sun Java Plugin &#8211; Plugin de <a title="Clique para saber mais" href="http://pt.wikipedia.org/wiki/M%C3%A1quina_virtual_Java" target="_blank">JVM (Java Virtual Machine)</a> para navegadores WEB</li>
<li>BrOffice / OpenOffice &#8211; Pacote de aplicações para escritório</li>
<li>Reprodutor de mídias VLC &#8211; Reprodutor de áudio e vídeo com suporte a uma grande quantidade de formatos</li>
<li>Brasero &#8211; Gravador de CDS e DVDS</li>
<li>Rar &#8211; Compactador / Descompactador de pacotes rar</li>
<li>Firefox &#8211; Navegador de Internet</li>
<li>Thunderbird &#8211; Cliente para servidores de e-mail</li>
</ul>
<h4>3.1 &#8211; Configurando os repositórios de pacotes</h4>
<p>Antes de mais nada, é preciso editar o arquivo <strong>/etc/apt/sources.list</strong>. Esse arquivo, após a instalação do Debian, encontra-se como abaixo.</p>
<pre class="brush: plain; title: ; notranslate">
#

# deb cdrom:[Debian GNU/Linux 6.0.2.1 _Squeeze_ - Official amd64 DVD Binary-1 20110626-16:33]/ squeeze contrib main

deb cdrom:[Debian GNU/Linux 6.0.2.1 _Squeeze_ - Official amd64 DVD Binary-1 20110626-16:33]/ squeeze contrib main

deb http://ftp.br.debian.org/debian/ squeeze main
deb-src http://ftp.br.debian.org/debian/ squeeze main

deb http://security.debian.org/ squeeze/updates main contrib
deb-src http://security.debian.org/ squeeze/updates main contrib

# squeeze-updates, previously known as 'volatile'
deb http://ftp.br.debian.org/debian/ squeeze-updates main contrib
deb-src http://ftp.br.debian.org/debian/ squeeze-updates main contrib

#tentativa de efetuar download do flash
deb http://ftp.br.debian.org/debian/ squeeze main contrib non-free
</pre>
<p>Execute o comando <strong>sudo gedit /etc/apt/sources.list</strong> no terminal(shell), comente a linha <strong>5</strong> usando o caractere <strong>#</strong> e adicione <strong>contrib</strong> e <strong>non-free</strong> no final das linhas <strong>7</strong> e <strong>8</strong>. O arquivo deve ficar como abaixo.</p>
<pre class="brush: plain; title: ; notranslate">
#

# deb cdrom:[Debian GNU/Linux 6.0.2.1 _Squeeze_ - Official amd64 DVD Binary-1 20110626-16:33]/ squeeze contrib main

#deb cdrom:[Debian GNU/Linux 6.0.2.1 _Squeeze_ - Official amd64 DVD Binary-1 20110626-16:33]/ squeeze contrib main

deb http://ftp.br.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.br.debian.org/debian/ squeeze main contrib non-free

deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main contrib

# squeeze-updates, previously known as 'volatile'
deb http://ftp.br.debian.org/debian/ squeeze-updates main contrib
deb-src http://ftp.br.debian.org/debian/ squeeze-updates main contrib
</pre>
<p>Após isso, execute o comando <strong>sudo apt-get update</strong>.</p>
<h4>3.2 &#8211; Instalando aplicativos usando o apt</h4>
<p>Todos os aplicativos acima, com exceção do Firefox e do Thunderbird (que serão instalados de forma manual), serão instalados juntos. Se você optar por não instalar um determinado programa, apenas exclua o nome do pacote do comando de instalação. Veja a relação <strong>aplicativo X pacote</strong> na tabela abaixo.<br />
<br/></p>
<div align='center'>
<table width='400'>
<tr>
<th>
        Aplicativo
    </th>
<th>
        Pacote
    </th>
</tr>
<tr>
<td>
        Gnome
    </td>
<td>
        gnome
    </td>
</tr>
<tr>
<td>
        Pidgin
    </td>
<td>
        pidgin
    </td>
</tr>
<tr>
<td>
        Google Chrome
    </td>
<td>
        google-chrome-stable
    </td>
</tr>
<tr>
<td>
        Flashplayer Plugin
    </td>
<td>
        flashplugin-nonfree
    </td>
</tr>
<tr>
<td>
        Sun Java Plugin
    </td>
<td>
        sun-java6-plugin
    </td>
</tr>
<tr>
<td>
        BrOffice
    </td>
<td>
        broffice.org
    </td>
</tr>
<tr>
<td>
        Reprodutor de mídias VLC
    </td>
<td>
        vlc
    </td>
</tr>
<tr>
<td>
        Gravador de CDs / DVDs Brasero
    </td>
<td>
        brasero
    </td>
</tr>
<tr>
<td>
        Compactador / Descompactador Rar
    </td>
<td>
        rar
    </td>
</tr>
</table>
</div>
<p><br/></p>
<p>Agora que você já conhece o nome de todos os pacotes que serão instalados, o comando de instalação fica como abaixo. Execute-a no terminal(shell).</p>
<p><strong>sudo apt-get install gnome pidgin google-chrome-stable flashplugin-nonfree sun-java6-plugin broffice.org vlc brasero rar</strong></p>
<h4>3.3 &#8211; Instalando o Firefox</h4>
<p>O Debian já possui uma versão alternativa ao Firefox que é instalado junto com o Gnome, o <a href="http://pt.wikipedia.org/wiki/Iceweasel" title="Iceweasel, clique para saber mais" target="_blank">Iceweasel</a>. Os navegadores são praticante idênticos, mas algumas pessoas ainda preferem ter o Firefox ao invés do Iceweasel. Se você está entre eles, siga as instruções abaixo.</p>
<p>Diferente dos pacotes instalados anteriormente, é preciso se preocupar se o kernel usado é para arquiteturas de <strong>64 bits</strong> ou <strong>32 bits</strong>. Para saber tais informações, execute o comando abaixo no terminal (shell).</p>
<p><strong>sudo uname -m</strong></p>
<p>A resposta do comando acima será algo como <strong>x86_64</strong> ou <strong>i686</strong>, onde o primeiro significa que sua arquitetura é de <strong>64 bits</strong> e o segundo de <strong>32 bits</strong>.</p>
<p>Caso sua arquitetura seja de <strong>64 bits</strong>, efetue o download da última versão do Firefox executando os comandos mostrados abaixo no terminal (shell).</p>
<pre class="brush: bash; title: ; notranslate">
cd ~/
wget ftp://ftp.mozilla.org/pub/firefox/releases/latest/linux-x86_64/br/firefox-*.tar.bz2
sudo mkdir -p /opt/mozilla/
sudo tar -jxf firefox-*.tar.bz2 -C /opt/mozilla/
sudo mv /usr/bin/firefox /usr/bin/firefox-old
sudo ln -s /opt/mozilla/firefox/firefox /usr/bin/firefox
</pre>
<p>Já se sua arquitetura for <strong>32 bits</strong>, basta apenas trocar o comando <strong>wget ftp://ftp.mozilla.org/pub/firefox/releases/latest/linux-x86_64/br/firefox-*.tar.bz2</strong>, mostrado logo acima, por<br />
<strong>wget ftp://ftp.mozilla.org/pub/firefox/releases/latest/linux-i686/br/firefox-*.tar.bz2</strong>. O resto se passa exatamente igual.</p>
<p>Agora, está faltando apenas criar o ícone do Firefox. Isso pode ser feito criando um arquivo com o nome Firefox.desktop na Área de trabalho / Desktop com o seguinte conteúdo.</p>
<pre class="brush: plain; title: ; notranslate">
[Desktop Entry]
Name=Navegador Web Firefox
GenericName=Navegador Web Firefox
Exec=firefox %u
Terminal=false
Icon=firefox
Type=Application
MimeType=text/html;text/xml;
</pre>
<blockquote><p>O Firefox também poderá ser executado digitando o comando <strong>firefox</strong> no terminal(shell).</p></blockquote>
<h4>3.4 &#8211; Instalando o Thunderbirds</h4>
<p>A instalação do Thunderbirds é bem parecida com a do Firefox mostrada acima. Os passos serão praticamente os mesmos.</p>
<p>Mais uma vez, é preciso se preocupar se o kernel usado é para arquiteturas de <strong>64 bits</strong> ou <strong>32 bits</strong>. Para saber tais informações, execute o comando abaixo no terminal (shell).</p>
<p><strong>sudo uname -m</strong></p>
<p>A resposta do comando acima será algo como <strong>x86_64</strong> ou <strong>i686</strong>, onde o primeiro significa que sua arquitetura é de <strong>64 bits</strong> e o segundo de <strong>32 bits</strong>.</p>
<p>Caso sua arquitetura seja de <strong>64 bits</strong>, efetue o download da última versão do Firefox executando os comandos mostrados abaixo no terminal (shell).</p>
<pre class="brush: bash; title: ; notranslate">
cd ~/
wget ftp://ftp.mozilla.org/pub/thunderbird/releases/latest/linux-x86_64/br/thunderbird-*.tar.bz2
sudo mkdir -p /opt/mozilla/
sudo tar -jxf thunderbird-*.tar.bz2 -C /opt/mozilla/
sudo ln -s /opt/mozilla/thunderbird/thunderbird /usr/bin/thunderbird
</pre>
<p>Já se sua arquitetura for <strong>32 bits</strong>, basta apenas trocar o comando <strong>wget ftp://ftp.mozilla.org/pub/thunderbird/releases/latest/linux-x86_64/br/thunderbird-*.tar.bz2</strong>, mostrado logo acima, por<br />
<strong>wget ftp://ftp.mozilla.org/pub/thunderbird/releases/latest/linux-i686/br/thunderbird-*.tar.bz2</strong>. O resto se passa exatamente igual.</p>
<p>Agora, está faltando apenas criar o ícone do Thunderbird. Isso pode ser feito criando um arquivo com o nome Thunderbird.desktop na Área de trabalho / Desktop com o seguinte conteúdo.</p>
<pre class="brush: plain; title: ; notranslate">
[Desktop Entry]
Name=Cliente de E-mail Thunderbird
GenericName=Cliente de E-mail Thunderbird
Exec=thunderbird %u
Terminal=false
Icon=thunderbird
Type=Application
</pre>
<blockquote><p>O Thunderbird também poderá ser executado digitando o comando <strong>thunderbird</strong> no terminal(shell).</p></blockquote>
<h3>Download do Debian</h3>
<p>Se você ainda não instalou o Debian e não sabe como conseguir a imagem de instalação, <a href="http://www.debian.org/CD/http-ftp/#stable" title="Download do Debian" target="_blank">clique aqui</a> para ser redirecionado ao site de download da distribuição.</p>
<p>Acredito que agora, sua instalação estará pronta para ser usada sem muitas dificuldades. Esperto ter ajudado quem está iniciando no linux e escolheu o Debian como distribuição.</p>
<p>Qualquer dúvida ou sugestão, use a área de perguntas e respostas logo abaixo do post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/04/16/dica-usando-o-debian-6-squeeze-no-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programando para Android #1 &#8211; Instalando o Android SDK</title>
		<link>http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/</link>
		<comments>http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 20:04:20 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Android NDK]]></category>
		<category><![CDATA[Android SDK]]></category>
		<category><![CDATA[FrameWorks]]></category>
		<category><![CDATA[ADT]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[aplicativos para smartphones]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[NDK]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=508</guid>
		<description><![CDATA[Ultimamente, a concorrência entre Apple e Android tem feito o mercado de aplicativos para smartphones explodir. Com isso, acredito que essa é uma ótima oportunidade para programar e comercializar os seus próprios aplicativos. Mas antes de começar a programar para qualquer uma das plataformas, é preciso um ambiente de desenvolvimento instalado e configurado. Atualmente, o &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/" data-text="Programando para Android #1 &#8211; Instalando o Android SDK" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/android-logo-e1319663212604.png"><img class="aligncenter size-full wp-image-509" style="border: 0px;" title="android-logo" src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/android-logo-e1319663332225.png" alt="" width="400" height="400" /></a></p>
<p>Ultimamente, a concorrência entre Apple e Android tem feito o mercado de aplicativos para smartphones explodir. Com isso, acredito que essa é uma ótima oportunidade para programar e comercializar os seus próprios aplicativos. Mas antes de começar a programar para qualquer uma das plataformas, é preciso um ambiente de desenvolvimento instalado e configurado.<br />
<span id="more-508"></span><br />
Atualmente, o Android tem dois kits de desenvolvimento, o <a href="http://developer.android.com/sdk/ndk/index.html" target="_blank">Android NDK (Native Developement Kit)</a>, que usa como base a linguagem de programação <a href="http://pt.wikipedia.org/wiki/C%2B%2B" target="_blank">C++</a>, e o <a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK (Software Development Kit)</a>, que usa como base a linguagem de programação <a href="http://pt.wikipedia.org/wiki/Java_(linguagem_de_programa%C3%A7%C3%A3o)" target="_blank">Java</a>. Nesse tutorial, será abordado a instalação do Android SDK.</p>
<h4><strong>1 &#8211; Efetuando download de arquivos necessários</strong></h4>
<p><strong>Java JDK (79,5 MB)</strong> &#8211; <a href="http://download.oracle.com/otn-pub/java/jdk/7u1-b08/jdk-7u1-windows-i586.exe" target="_blank">Windows</a><br />
<strong>Eclipse Classic 3.7 INDIGO (174 MB)</strong> – <a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.7-201106131736/eclipse-SDK-3.7-win32.zip&amp;url=http://eclipse.c3sl.ufpr.br/eclipse/downloads/drops/R-3.7-201106131736/eclipse-SDK-3.7-win32.zip&amp;mirror_id=576" target="_blank">Windows 32 bits</a> / <a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.7-201106131736/eclipse-SDK-3.7-win32-x86_64.zip&amp;url=http://eclipse.c3sl.ufpr.br/eclipse/downloads/drops/R-3.7-201106131736/eclipse-SDK-3.7-win32-x86_64.zip&amp;mirror_id=576" target="_blank">Windows 64 bits</a><strong><br />
</strong></p>
<h4><strong>2 &#8211; Instalando o Java Development Kit (JDK)</strong></h4>
<p>Como eu já havia falando, o Android SDK tem como base o Java, e para que ele funcione, precisaremos do <a href="http://searchsoa.techtarget.com/definition/Java-Development-Kit" target="_blank">Java JDK</a> instalado. Veja o vídeo de como instalar o Java JDK abaixo.<br />
<span style="text-align:center; display: block;"><a href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/"><img src="http://img.youtube.com/vi/_dIb11htfU8/2.jpg" alt="" /></a></span></p>
<h4><strong>3 &#8211; Efetuando o Download e Instalação do Eclipse</strong></h4>
<p>Para desenvolver aplicativos para Android, é necessário uma boa IDE de desenvolvimento e, por esse motivo, o Eclipse não pode ficar de fora dessa instalação.</p>
<p>O vídeo abaixo mostra passo a passo o procedimento usado para efetuar o download e instalação do Eclipse.</p>
<span style="text-align:center; display: block;"><a href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/"><img src="http://img.youtube.com/vi/sSE-cKzKqxw/2.jpg" alt="" /></a></span>
<h4><strong>4 &#8211; Instalando o Plugin ADT no Eclipse</strong></h4>
<p>Para que o Eclipse possa ser usado, também é necessário a instalação do ADT Plugin (Android Development Tools), esse plugin pode ser encontrado em <a href="https://dl-ssl.google.com/android/eclipse/" target="_blank"><em><strong>https://dl-ssl.google.com/android/eclipse/</strong></em></a>.</p>
<p>O vídeo abaixo mostra detalhes da instalação do ADT Plugin.</p>
<span style="text-align:center; display: block;"><a href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/"><img src="http://img.youtube.com/vi/X5F6-XU_UqM/2.jpg" alt="" /></a></span>
<h4><strong>5 &#8211; Instalando o Android SDK</strong></h4>
<p>Logo na sequência da instalação do plugin ADT, o Eclipse requisitará o SDK. Nesse passo, há duas opções, apontar a localização de uma instalação do Android SDK ou efetuar uma nova instalação. Nesse tutorial, foi escolhido fazer uma nova instalação.</p>
<p>Veja o procedimento no vídeo abaixo</p>
<span style="text-align:center; display: block;"><a href="http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/"><img src="http://img.youtube.com/vi/AMq8ZT1OjbQ/2.jpg" alt="" /></a></span>
<p>Com isso, você já pode começar a construir aplicativos próprios para a plataforma Android.</p>
<p>Se houver alguma dúvida sobre o procedimento aqui mostrado, sinta-se a vontade para usar a área de perguntas e respostas abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/04/05/programando-para-android-1-instalando-o-android-sdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando jQuery UI para construção de modal dialog window</title>
		<link>http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/</link>
		<comments>http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 02:25:04 +0000</pubDate>
		<dc:creator>Elaine</dc:creator>
				<category><![CDATA[HTML / XHTML]]></category>
		<category><![CDATA[JavaScript / Ajax]]></category>
		<category><![CDATA[Linguagens de Marcação]]></category>
		<category><![CDATA[dialog]]></category>
		<category><![CDATA[dialog dinamico]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery ui]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[multiple modal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[pop up]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=751</guid>
		<description><![CDATA[Welcome to jQuery UI! Esse foi um site que sempre me inspirou, principalmente por ser rico em exemplos e permitir criar aplicações com um design interessante e de modo simples e rápido. Não digo que esta seja a melhor biblioteca para criação de interfaces gráficas com javascript nem a mais rápida, pois a avaliação desses &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/" data-text="Usando jQuery UI para construção de modal dialog window" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2012/03/Untitled-1.png"><img class="aligncenter  wp-image-752" title="Exemplo de uso de dialog com jQuery UI" src="http://www.digitaldev.com.br/wp-content/uploads/2012/03/Untitled-1.png" alt="Exemplo de uso de dialog com jQuery UI" width="510" height="272" /></a>Welcome to <a title="http://jqueryui.com" href="http://jqueryui.com">jQuery UI</a>!</p>
<p>Esse foi um site que sempre me inspirou, principalmente por ser rico em exemplos e permitir criar aplicações com um design interessante e de modo simples e rápido.</p>
<p>Não digo que esta seja a melhor biblioteca para criação de interfaces gráficas com javascript nem a mais rápida, pois a avaliação desses quesitos depende de diversos fatores, como das características do navegador e da capacidade de processamento do lado do cliente web. Mas sua utilização tem permitido criar maior dinamismo e usabilidade em interfaces web com php de uma forma muito rápida, tanto em relação a sua implementação quanto ao tempo para entender seu funcionamento.<br />
<span id="more-751"></span><br />
Não domino todos seus recursos, mas abaixo posto uma brincadeira com a função dialog dessa biblioteca, idéia que surgiu no comentário do meu <a title="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/">post anterior</a>.</p>
<p>O problema consiste em criar, com um único script, chamadas para janelas diferentes.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8859-1&quot; /&gt;
&lt;title&gt;jQuery UI Example Page&lt;/title&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/redmond/jquery-ui.css&quot;&gt;

&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot;&gt;&lt;/script&gt;

&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js&quot;&gt;&lt;/script&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){

	// Dialog
	$('.dialog').dialog({
		autoOpen: false,
		width: 600,
		buttons: {
		&quot;Ok&quot;: function() {
		$(this).dialog(&quot;close&quot;);
		},
		&quot;Cancel&quot;: function() {
		$(this).dialog(&quot;close&quot;);
		}
		}
	});

	// Dialog Link
	$('.dialog_link').click(function(){

	$('.dialog').dialog('close');

	var id_link = $(this).attr('id');
	var index = id_link.split('_');

	$('#txt_'+index[1]).dialog('open');

	return false;

	});

	//hover states on the static widgets
	$('.dialog_link, ul.icons li').hover(
	function() { $(this).addClass('ui-state-hover'); },
	function() { $(this).removeClass('ui-state-hover'); }
	);

});
&lt;/script&gt;
&lt;style type=&quot;text/css&quot;&gt;

body{ font: 62.5% &quot;Trebuchet MS&quot;, sans-serif; margin: 50px;}
.demoHeaders { margin-top: 2em; }

.dialog_link
            {
              padding: .4em 1em .4em 20px;
              text-decoration: none;position: relative;
            }

.dialog_link span.ui-icon
            {
               margin: 0 5px 0 0;position: absolute;
               left: .2em;top: 50%;margin-top: -8px;
            }

&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Welcome to jQuery UI!&lt;/h1&gt;

&lt;h2&gt;Dialog&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;#&quot; id=&quot;lk_1&quot; class=&quot;dialog_link ui-state-default ui-corner-all&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-newwin&quot;&gt;&lt;/span&gt;Open Dialog 1&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href=&quot;#&quot; id=&quot;lk_2&quot; class=&quot;dialog_link ui-state-default ui-corner-all&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-newwin&quot;&gt;&lt;/span&gt;Open Dialog 2&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href=&quot;#&quot; id=&quot;lk_3&quot; class=&quot;dialog_link ui-state-default ui-corner-all&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-newwin&quot;&gt;&lt;/span&gt;Open Dialog 3&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href=&quot;#&quot; id=&quot;lk_4&quot; class=&quot;dialog_link ui-state-default ui-corner-all&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-newwin&quot;&gt;&lt;/span&gt;Open Dialog 4&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href=&quot;#&quot; id=&quot;lk_5&quot; class=&quot;dialog_link ui-state-default ui-corner-all&quot;&gt;&lt;span class=&quot;ui-icon ui-icon-newwin&quot;&gt;&lt;/span&gt;Open Dialog 5&lt;/a&gt;&lt;/p&gt;

&lt;div title=&quot;Dialog Title 1&quot; id=&quot;txt_1&quot;  class=&quot;dialog&quot;&gt;
&lt;p&gt;Lorem ipsum dolor sit amet,  Nulla nec tortor.
Donec id elit quis purus consectetur consequat. &lt;/p&gt;
&lt;p&gt;Nam congue semper tellus. Sed erat dolor, dapibus sit amet,
venenatis ornare, ultrices ut, nisi. Aliquam ante.
Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod,
vulputate ac, facilisis id, sem. Morbi in orci. &lt;/p&gt;
&lt;/div&gt;

&lt;div title=&quot;Dialog Title 2&quot; id=&quot;txt_2&quot; class=&quot;dialog&quot;&gt;
&lt;p&gt;Nulla purus lacus, pulvinar vel, malesuada ac,
mattis nec, quam. Nam molestie scelerisque quam.
Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur
adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede.
Nulla nec tortor. Donec id elit quis purus consectetur consequat. &lt;/p&gt;
&lt;/div&gt;

&lt;div title=&quot;Dialog Title 3&quot; id=&quot;txt_3&quot; class=&quot;dialog&quot;&gt;
&lt;p&gt;Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare,
ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit.
Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.
Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam.
Nam molestie scelerisque quam. &lt;/p&gt;
&lt;/div&gt;

&lt;div title=&quot;Dialog Title 4 &quot; id=&quot;txt_4&quot; class=&quot;dialog&quot;&gt;
&lt;p&gt;Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit.
Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor.
Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor,
dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. &lt;/p&gt;
&lt;/div&gt;

&lt;div title=&quot;Dialog Title 5&quot; id=&quot;txt_5&quot; class=&quot;dialog&quot;&gt;
&lt;p&gt;Suspendisse scelerisque dui nec velit.
Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.
Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie
scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur
adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede.
Nulla nec tortor. Donec id elit quis purus consectetur consequat.
Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare,
ultrices ut, nisi. &lt;/p&gt;
&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Esse é um código exemplo do que se pode fazer, manipulando os atributos dos elementos HTML.<br />
Não sei dizer se é uma &#8220;gambi&#8221; utilizar um padrão no ID das divs, de modo que eu possa inclui-las em um loop via PHP, por exemplo. Mas espero que sirva de inspiração para códigos melhores <img src='http://www.digitaldev.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/03/29/usando-jquery-ui-para-construcao-de-modal-dialog-window/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando o Guest Additions do VirtualBox no CentOS 6.2</title>
		<link>http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/</link>
		<comments>http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 11:57:15 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Adições de convidado]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[CentOS 6.2]]></category>
		<category><![CDATA[Guest Additions]]></category>
		<category><![CDATA[Guest Additions 4.1.8]]></category>
		<category><![CDATA[Guest Additions 4.1.8 no CentOS 6.2]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[VirtualBox]]></category>
		<category><![CDATA[Virtualização]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=716</guid>
		<description><![CDATA[Geralmente, quando estamos dispostos a testar um novo Sistema Operacional, mas não queremos instalá-lo diretamente no nosso disco rígido, então, a melhor opção é usar um programa capaz de emular uma máquina virtual. Entre as opções de aplicativos com essa finalidade, com certeza o VirtualBox é um dos mais famosos, pois além de ser gratuito &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/" data-text="Instalando o Guest Additions do VirtualBox no CentOS 6.2" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2012/03/virtualbox_centos.jpg"><img class="aligncenter size-full wp-image-717" style="border: 0px;" title="virtualbox_centos" src="http://www.digitaldev.com.br/wp-content/uploads/2012/03/virtualbox_centos.jpg" alt="VirtualBox e CentOS" width="697" height="243" /></a></p>
<p>Geralmente, quando estamos dispostos a testar um novo Sistema Operacional, mas não queremos instalá-lo diretamente no nosso disco rígido, então, a melhor opção é usar um programa capaz de emular uma <a href="http://pt.wikipedia.org/wiki/M%C3%A1quina_virtual" target="_blank">máquina virtual</a>. Entre as opções de aplicativos com essa finalidade, com certeza o <a href="https://www.virtualbox.org/" target="_blank">VirtualBox</a> é um dos mais famosos, pois além de ser gratuito para uso doméstico, ele também nos dá a possibilidade de criar máquinas virtuais compatíveis com a maioria dos Sistemas Operacionais hoje disponíveis no mercado.<span id="more-716"></span></p>
<p><a name="GuestAdditions"></a><br />
Voltando ao tema do artigo, o <a href="http://www.virtualbox.org/manual/ch04.html" target="_blank">Guest Additions</a> é designado para instalação dentro da máquina virtual (no Sistema Operacional virtualizado) e ele é formado por alguns drivers de dispositivos e aplicativos que servem para otimizar o funcionamento do Sistema Operacional que está sendo emulado pelo VirtualBox.</p>
<p>Os instaladores do Guest Additions, para todos os Sistemas Operacionais suportados, estão presentes dentro da imagem de disco VBoxGuestAdditions.iso. A mesma pode ser no diretório de instalação do VirtuaBox e montada dentro da sua máquina virtual usando o driver de CD-ROM virtual ou simplesmente clique na janela da sua máquina virtual e navegue até <strong>Devices &gt; Install Guest Additions</strong> e a imagem será automaticamente montada dentro do sistema virtual.</p>
<p>Entre as principais vantagens que se tornam disponíveis após a instalação do <a href="http://www.virtualbox.org/manual/ch04.html" target="_blank">Guest Additions</a>, estão:</p>
<ul>
<li><strong><em>Compartilhamento de diretórios entre o Sistema Operacional instalado na máquina física e o da máquina virtual.</em></strong></li>
<li><strong><em>Melhor suporte a vídeo (Aceleração 3D e 2D são ativadas).</em></strong></li>
<li><strong><em>Área de transferencia compartilhada (clipboard).</em></strong></li>
<li><strong><em>Sincronização do relógio do Sistema Operacional hospedeiro com o Sistema Operacional emulado ou hospede.</em></strong></li>
</ul>
<p>Outras vantagens podem ser encontradas clicando <a href="http://www.virtualbox.org/manual/ch04.html" target="_blank">aqui</a> (Inglês).</p>
<p>Eis que existe um bug de instalação do Guest Additions, mais precisamente na versão 4.1.8 do instalador, quando o Sistema Operacional virtualizado é o CentOS 6.2. Porém, a resolução desse bug e instalação passo a passo podem ser encontrados <a href="http://wiki.centos.org/HowTos/Virtualization/VirtualBox/CentOSguest" target="_blank">aqui</a> (Inglês)</p>
<p>Abaixo seguem os comandos necessários para a instalação do Guest Additions 4.1.8 no CentOS 6.2 em <strong>português</strong>.</p>
<p>Entre com o usuário administrador no CentOS<br />
<strong>$ sudo su</strong><br />
ou<br />
<strong>$ su</strong></p>
<p>Após isso, instale os arquivos do código fonte do kernel e algumas outras ferramentas necessárias para a compilação dos arquivos.</p>
<p><strong><br />
# yum groupinstall &#8220;Development Tools&#8221;<br />
# yum install kernel-devel<br />
</strong></p>
<p>Faça o download do patch de correção do Guest Additions e salve-o dentro do diretório <strong>/root</strong><br />
<strong><br />
# cd ~/<br />
# wget http://digitaldev.com.br/downloads/el6.patch<br />
</strong></p>
<p>Se for necessário, monte a imagem do CD-ROM usando o comando<br />
<strong><br />
# mount /dev/cdrom<br />
</strong></p>
<blockquote><p>Para que isso funcione, é necessário que o arquivo de disco virtual <strong>VBoxGuestAdditions.iso</strong> esteja montado no driver de cd virtual da máquina hospedada, como explicado <a href="#GuestAdditions">acima</a>.</p></blockquote>
<p>Agora, execute os comandos abaixo. Esse exemplo é válido para arquitetura x86_64 ou 64 bits.</p>
<p><strong># cd /media/VBOXADDITIONS_4.1.8_75467/<br />
# ./VBoxLinuxAdditions.run &#8211;noexec &#8211;target ~/TMP/<br />
# cd ~/TMP/<br />
# mkdir ../TMP2<br />
# tar jxvf VBoxGuestAdditions-amd64.tar.bz2 -C ../TMP2/<br />
# cd ../TMP2/src/vboxguest-4.1.8/vboxvideo/<br />
# patch -p0 &lt; ~/el6.patch<br />
# cd ~/TMP2/<br />
# tar jcvf ../TMP/VBoxGuestAdditions-amd64.tar.bz2 *<br />
# cd ~/TMP<br />
# ./install.sh</strong></p>
<blockquote><p>Para a arquitetura i386 (32 bits), substitua <strong>VBoxGuestAdditions-amd64.tar.bz2</strong> por <strong>VBoxGuestAdditions-x86.tar.bz2</strong> nos comandos acima.</p></blockquote>
<p>Após isso, reinicie o Sistema Operacional virtual e o Guest Additions estará instalado.</p>
<p>Qualquer dúvida, sugestão o crítica, usem a área de perguntas e respostas abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/03/13/instalando-o-guest-additions-do-virtualbox-no-centos-6-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Intercalando cores entre linhas de uma tabela ou lista usando CSS3</title>
		<link>http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/</link>
		<comments>http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 18:01:31 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML / XHTML]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[lista]]></category>
		<category><![CDATA[lista zebrada]]></category>
		<category><![CDATA[tabela]]></category>
		<category><![CDATA[tabela zebrada]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=687</guid>
		<description><![CDATA[Intercalar as cores de um uma tabela ou lista está muito presente no dia a dia de um programador ou webdesigner. Se você é desenvolvedor web, sabe bem do que estou falando. Já vi muitos programadores escrevem códigos PHP ou ASP para produzir esse efeito de zebra, já vi tambem alguns webdesigners usam CSS + &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/" data-text="Intercalando cores entre linhas de uma tabela ou lista usando CSS3" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg" alt="" title="css-cascading-style-sheets" width="260" height="187" class="aligncenter size-full wp-image-578" /></a></p>
<p>Intercalar as cores de um uma tabela ou lista está muito presente no dia a dia de um programador ou webdesigner. Se você é desenvolvedor web, sabe bem do que estou falando.</p>
<p>Já vi muitos programadores escrevem códigos PHP ou ASP para produzir esse efeito de zebra, já vi tambem alguns webdesigners usam CSS + JavaScript para isso. Mas, graças ao CSS3, isso se tornou possível usando apenas duas linhas de código CSS.<br />
<span id="more-687"></span></p>
<pre class="brush: css; title: ; notranslate">
tr:nth-child(even) {background: #FFF}
tr:nth-child(odd) {background: #EEE}
</pre>
<p>onde &#8220;even&#8221; corresponde às linhas pares e &#8220;odd&#8221; às linhas impáres.</p>
<p>esse pequeno bloco de código pode tambem ser usado em conjunto com vários outros componentes HTML ou em classes CSS. Veja um exemplo do uso em Listas.</p>
<pre class="brush: css; title: ; notranslate">
li:nth-child(even) {background: #FFF}
li:nth-child(odd) {background: #EEE}
</pre>
<p>Agora, veja um exemplo do uso do zebrado anexado a uma classe css feita para formatar uma tabela.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;style type=&quot;text/css&quot;&gt;

		/*css global tabela*/
		.full_table_list{width: 200px;border-collapse: collapse;}

		/*colocando bordas nas linhas*/
		.full_table_list tr{border:1px black solid;}

		/*Definido cor das linhas pares*/
		.full_table_list tr:nth-child(even) {background: #FFF}

		/*Definindo cor das Linhas impáres*/
		.full_table_list tr:nth-child(odd) {background: #EEE}		

	&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
	&lt;table class=&quot;full_table_list&quot;&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 1
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 2
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 3
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 4
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Isso reproduziu o efeito mostrado na imagem abaixo.</p>
<p><img src="http://www.digitaldev.com.br/wp-content/uploads/2012/01/zebrado.jpg" alt="" title="Tabela zebrada" width="273" height="155" class="aligncenter size-full wp-image-691" /></p>
<p>Eu não sou nenhum especialista em CSS, mas se houver alguma dúvida relacionado ao assunto do post, usem a área de perguntas e respostas abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comunicando-se com o Facebook usando PHP</title>
		<link>http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/</link>
		<comments>http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 21:38:44 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Facebook API]]></category>
		<category><![CDATA[Facebook SDK em PHP]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[Integração do Facebook com PHP]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=611</guid>
		<description><![CDATA[Com o crescimento do Facebook como rede social, o desejo de desenvolvedores e donos de sites em conectar suas aplicações web com a mais famosa rede social do mundo vem se tornando cada vez mais comum. Se você se enquadra nesse grupo de desenvolvedores, então veio ao lugar certo, pois nesse post irei explicar como &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/" data-text="Comunicando-se com o Facebook usando PHP" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/facebook-logo.jpg"><img class="aligncenter size-full wp-image-642" title="facebook-logo" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/facebook-logo.jpg" alt="" width="300" height="121" /></a></p>
<p>Com o crescimento do Facebook como rede social, o desejo de desenvolvedores e donos de sites em conectar suas aplicações web com a mais famosa rede social do mundo vem se tornando cada vez mais comum.</p>
<p>Se você se enquadra nesse grupo de desenvolvedores, então veio ao lugar certo, pois nesse post irei explicar como conectar o seu site feito em PHP com o Facebook seguindo alguns passos e usando uma classe de comunicação escrita em PHP.<br />
<span id="more-611"></span></p>
<h4>1º Passo &#8211; Criando uma App no Facebook</h4>
<p>Antes de começarmos, precisaremos criar uma App do Facebook, ela servirá como um canal de comunicação entre o nosso script PHP e a rede social.</p>
<p>Entre no <a href="http://facebook.com" target="_blank">Facebook</a> e efetue login usando seu usuário e senha, logo após, acesse a página de desenvolvedores do Facebook pelo endereço <a href="https://developers.facebook.com/" target="_blank">https://developers.facebook.com/</a> e clique em <strong>Aplicativos</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook1.jpg"><img class="aligncenter size-full wp-image-615" title="app_facebook1" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook1.jpg" alt="" width="500" height="346" /></a></p>
<p>Na próxima página, clique em <strong>+ Criar Novo Aplicativo</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook2.jpg"><img class="aligncenter size-full wp-image-617" title="app_facebook2" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook2.jpg" alt="" width="379" height="162" /></a></p>
<p>Uma caixa de formulário se abrirá no meio da tela, preencha a mesma de acordo com os dados (nome) do aplicativo que você deseja criar e clique em <strong>Continuar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook3-e1322961226746.jpg"><img class="aligncenter size-full wp-image-619" title="app_facebook3" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook3-e1322961226746.jpg" alt="" width="500" height="181" /></a></p>
<p>Na próxima página, preencha o campo de validação de acordo com o texto que aparece na imagem e clique em <strong>Enviar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4.jpg"><img class="aligncenter size-full wp-image-621" title="app_facebook4" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4-e1322961589797.jpg" alt="" width="500" height="188" /></a></p>
<p>Para garantir que sua conta de usuário no Facebook está realmente ligada a uma pessoa e que ela não é uma conta fake, o Facebook dirá que a conta precisa ser verificada. Você poderá fazer isso adicionando seu número de celular o cartão de credito (se você for usuário das operadoras Vivo ou Oi, aconselho optar pela validação por cartão de crédito)</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5.jpg"><img class="aligncenter size-full wp-image-622" title="app_facebook5" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5-e1322961887417.jpg" alt="" width="500" height="231" /></a></p>
<blockquote><p>Observação: Se sua conta no Facebook já foi validada anteriormente, você será redirecionado para a pagina final da criação do App.</p></blockquote>
<h5>Validação por Celular</h5>
<p>Ao escolher a validação por celular, uma janela para adicionar seu telefone será exibida. Preencha a mesma como seu telefone e clique em <strong>Confirmar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook6.jpg"><img class="aligncenter size-full wp-image-624" title="app_facebook6" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook6.jpg" alt="" width="473" height="327" /></a></p>
<p>Na próxima tela, um código será requisitado, provavelmente você recebeu esse código por SMS. Preencha o campo com tal código e clique novamente em <strong>Confirmar</strong>.</p>
<blockquote><p>Observação: Talvez o SMS demore alguns minutos, mas se o mesmo não chegar, clique em reenviar código ou refaça o procedimento optando pela validação por cartão de crédito.</p></blockquote>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook7.jpg"><img class="aligncenter size-full wp-image-625" title="app_facebook7" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook7.jpg" alt="" width="482" height="247" /></a></p>
<h5>Validação por Cartão de Crédito</h5>
<p>Ao escolher a validação por cartão de crédito, sua senha poderá ser novamente requisitada. Preencha o campo <strong>Senha</strong> e clique em <strong>Continuar</strong><br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook8.jpg"><img class="aligncenter size-full wp-image-631" title="app_facebook8" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook8.jpg" alt="" width="553" height="186" /></a></p>
<p>Preencha o formulário de acordo com os dados do seu cartão de crédito e clique em <strong>Salvar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook9.jpg"><img class="aligncenter size-full wp-image-633" title="app_facebook9" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook9.jpg" alt="" width="549" height="496" /></a></p>
<p>Se tudo correu bem com a validação via cartão, o Facebook irá exibir os dados do seu cartão na próxima pagina.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook10.jpg"><img class="aligncenter size-full wp-image-635" title="app_facebook10" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook10.jpg" alt="" width="422" height="497" /></a></p>
<h4>Voltando para a criação do aplicativo</h4>
<p>Após os passos de validação da conta, tanto via telefone ou cartão de credito, volte a página de criação do aplicativo. Se você não fechou a mesma, a página de criação da APP deve estar aberta em paralelo com a de validação da conta, caso contrario, terá que recomeçar o processo de criação do App (o processo de validação da conta não se repetirá)</p>
<p>Na tela mostrada pela imagem abaixo, clique em <strong>Continuar</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5.jpg"><img class="aligncenter size-full wp-image-622" title="app_facebook5" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5-e1322961887417.jpg" alt="" width="500" height="231" /></a></p>
<p>Novamente, você deve preencher o campo de validação de acordo com o texto que aparece na imagem mostrada pelo Facebook e clicar em <strong>Enviar</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4.jpg"><img class="aligncenter size-full wp-image-621" title="app_facebook4" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4-e1322961589797.jpg" alt="" width="500" height="188" /></a></p>
<p>Se tudo correu bem até agora, uma página com os dados da sua App do Facebook será mostrada. Nela você poderá modificar os dados da aplicação e fazer upload de um ícone.</p>
<p>Nessa página, preencha o campo <strong>App Domain</strong> com o domínio do seu site e o campo <strong>Site Url</strong> com a url de onde seu código de integração se encontra. No meu caso, o meu dominio é <strong>digitaldev.com.br</strong> e a pasta onde coloquei o script de integração é <strong>http://digitaldev.com.br/facebook</strong>, por esse motivo, preenchi os campos como mostra a imagem abaixo.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook15.jpg"><img class="aligncenter size-full wp-image-668" title="app_facebook15" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook15.jpg" alt="" width="550" height="618" /></a></p>
<p>Ainda na mesma página, anote os números de <strong>App ID</strong> e <strong>App Secret</strong>. Pois eles serão usados pelo nosso script PHP para fazer referencia ao App do Facebook. Veja a localização dos mesmos visualizando a imagem abaixo.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook12.jpg"><img class="aligncenter size-full wp-image-639" title="app_facebook12" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook12.jpg" alt="" width="448" height="106" /></a></p>
<p>Ao final do processo, clique em <strong>Salvar alterações</strong></p>
<h4>2º Passo &#8211; Escrevendo o script PHP</h4>
<p>Para facilitar o nosso trabalho, iremos usar uma classe para gerenciar a comunicação entre nossa aplicação e o Facebook. Efetue o download da mesma clicando <a href="https://github.com/facebook/php-sdk/zipball/master" target="_blank">aqui</a>.</p>
<p>Ao descompactar o pacote, constataremos a existência de alguns exemplos de uso da classe, mas os arquivos que realmente serão usados são os que se encontram dentro da pasta <strong>src</strong>. Copie-os para uma pasta dentro da sua aplicação, pois você precisará efetuar um <strong>include</strong> ou <strong>require</strong> deles dentro do arquivo de integração.</p>
<p><strong>Vamos ao código PHP</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
//incluindo a classe de conexão com o facebook
require_once 'FacebookApi/facebook.php';

/*
* ID da App, vocé obteve isso na ultima
* página de geração do seu aplicativo no facebook
*/
$App_ID = '';

/*
* App Secret, você obteve isso na ultima
* página de geração do seu aplicativo no facebook
*/
$App_Secret = '';

//Instanciando o Objeto da classe do facebook
$facebook = new Facebook(array(
	    'appId'  =&gt; $App_ID ,
	    'secret' =&gt; $App_Secret
));

//Pegando Id do usuário Logado
$o_user = $facebook-&gt;getUser();

/*
* Verificando se está conectado
*/
if($o_user == 0)
{

	//Envia para a página de permissão do facebook, nela voce irá dar permissão ao aplicativo
	//acessar dados da sua conta
	$url = $facebook-&gt;getLoginUrl(array('scope' =&gt; array('publish_stream','read_stream')));
	header(&quot;Location:&quot;.$url);
}
else
{
	//Verificando se o comando de logout foi enviado
	if($_GET['action'] == 'finish' )
	{
		//Retirando a permissão do Aplicativo à sua conta no facebook
		session_destroy();
		header('Location: '.$facebook-&gt;getLogoutUrl());
	}
	else
	{
		//Atualizando seu status no facebook
		if( $_GET['action'] == 'publish' &amp;&amp; strlen($_POST['status']) &gt; 0 )
		{
			$post =  array('message' =&gt; $_POST['status']);
			$feed = $facebook-&gt;api('/me/feed', 'POST', $post);
		}
		else
		    //pegando as publicações do seu mural
			$feed = $facebook-&gt;api('/me/feed');
			//Use var_dump($feed) ou print_r($feed)
			//para ver todos os campos retornados

		//pegando as informações do usuário conectado
		$me = $facebook-&gt;api('/me');
		//Use var_dump($me) ou print_r($me)
		//para ver todos os campos retornados

		//pegando as publicações da sua home
		$home = $facebook-&gt;api('/me/home');
		//Use var_dump($home) ou print_r($home)
		//para ver todos os campos retornados
	}
}

?&gt;

&lt;!DOCTYPE unspecified PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
  &lt;head&gt;
   &lt;title&gt;Integração com o Facebook&lt;/title&gt;
   &lt;meta content='text/html; charset=utf-8' http-equiv='Content-Type'&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;div align=&quot;center&quot;&gt;
	&lt;table width='600' border='1'&gt;
		&lt;tr&gt;
			&lt;td colspan=&quot;4&quot; align=&quot;center&quot;&gt;
				&lt;a href=&quot;&lt;?php echo $me['link']?&gt;&quot;&gt;
					&lt;?php echo $me['name']?&gt;
				&lt;/a&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td align=&quot;right&quot;&gt;
				Primeiro Nome:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['first_name']?&gt;
			&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;
				Ultimo Nome:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['last_name']?&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td align=&quot;right&quot;&gt;
				Cidade Natal:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['hometown']['name']?&gt;
			&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;
				Cidate onde mora:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['location']['name']?&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
	&lt;br/&gt;

	&lt;?php
	//Imprimindo publicações do mural do usuário
	if(is_array($feed['data']))
	{
	?&gt;
		&lt;table width=&quot;700&quot; border=&quot;1&quot;&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					Seu Mural
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			foreach($feed['data'] AS $hist)
			{
			?&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					&lt;?php
					if(isset($hist['story']))
						echo $hist['story'];
					else
					{
						echo $hist['message'].'&lt;br/&gt;';
						if(isset($hist['picture']))
						?&gt;
						&lt;img src='&lt;?php echo $hist['picture']?&gt;'&gt;
						&lt;?php
					}
					?&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			}
			?&gt;
		&lt;/table&gt;
		&lt;br/&gt;
	&lt;?php
	}
	?&gt;

	&lt;?php
	//imprimindo publicações da home do usuário
	if(is_array($home['data']))
	{
	?&gt;
		&lt;table width=&quot;700&quot; border=&quot;1&quot;&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					Home
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			foreach($home['data'] AS $hist)
			{
			?&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					&lt;?php
					if(isset($hist['story']))
						echo $hist['story'];
					else
					{
						echo $hist['message'].'&lt;br/&gt;';
						if(isset($hist['picture']))
						?&gt;
						&lt;img src='&lt;?php echo $hist['picture']?&gt;'&gt;
						&lt;?php
					}
					?&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			}
			?&gt;
		&lt;/table&gt;
		&lt;br/&gt;
	&lt;?php
	}
	?&gt;

	&lt;div&gt;
		&lt;form action=&quot;?action=publish&quot; method=&quot;POST&quot;&gt;
			&lt;textarea name=&quot;status&quot; rows=&quot;4&quot; cols=&quot;20&quot;&gt;&lt;/textarea&gt;
		&lt;br/&gt;
		&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;
		&lt;/form&gt;
	&lt;/div&gt;

	&lt;a href=&quot;?action=finish&quot;&gt;Sair&lt;/a&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Como você pode observar no código acima, eu copiei todo o conteúdo da pasta <strong>src</strong> do pacote que fizemos download para uma pasta chamada <strong>FacebookApi</strong> na raiz da pasta do meu script.</p>
<p>Para ver esse código funcionando, acesse <a href="http://digitaldev.com.br/facebook" target="_blank">http://digitaldev.com.br/facebook</a></p>
<p>Para fazer o download do código fonte do exemplo acima, clique <a href="http://digitaldev.com.br/downloads/facebook.zip">aqui</a></p>
<p>Para melhorar o seu entendimento do código do exemplo, leia as documentações abaixo.<br />
Graph API &#8211; <a href="https://developers.facebook.com/docs/reference/api/" target="_blank">https://developers.facebook.com/docs/reference/api/</a><br />
PHP SDK overview &#8211; <a href="https://developers.facebook.com/docs/reference/php/" target="_blank">https://developers.facebook.com/docs/reference/php/</a></p>
<p>Espero ter ajudado aos leitores que desejam efetuar a integração entre uma aplicação em PHP e o Facebook. Qualquer dúvida, entre em contato usando a área de perguntas e respostas desse post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Plugin jQuery para criação de máscara de moedas</title>
		<link>http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/</link>
		<comments>http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 22:06:01 +0000</pubDate>
		<dc:creator>Elaine</dc:creator>
				<category><![CDATA[JavaScript / Ajax]]></category>
		<category><![CDATA[Campo moeda]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Mascara de formulários]]></category>
		<category><![CDATA[Máscara para dinheiro]]></category>
		<category><![CDATA[Máscara para moeda]]></category>
		<category><![CDATA[Validação de Dados]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=601</guid>
		<description><![CDATA[Web 2.0 está aí, exigindo cada vez mais interatividade dos sites com os usuários. Como conseguir isso? Um dos modos, é utilizando javascript, o que pode não ser tão fácil assim. Por isso, existem bibliotecas gratuitas com MooTools, Dojo, Script.aculo.us e Prototype, que simplificam o desenvolvimento de aplicações web. Entre elas, está jQuery, com vasta &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" data-text="Plugin jQuery para criação de máscara de moedas" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/jquery-logo-300x61.png"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/jquery-logo-300x61.png" alt="" title="jquery-logo-300x61" width="300" height="61" class="aligncenter size-full wp-image-602" /></a><br />
Web 2.0 está aí, exigindo cada vez mais interatividade dos sites com os usuários.</p>
<p><strong>Como conseguir isso?</strong></p>
<p>Um dos modos, é utilizando javascript, o que pode não ser tão fácil assim.</p>
<p>Por isso, existem bibliotecas gratuitas com <a title="MooTools" href="http://mootools.net/">MooTools</a>, <a title="http://dojotoolkit.org/" href="http://dojotoolkit.org/">Dojo</a>, <a title="Script.aculo.us" href="http://script.aculo.us/">Script.aculo.us</a> e <a href="http://www.prototypejs.org/">Prototype</a>, que simplificam o desenvolvimento de aplicações web.<br />
<span id="more-601"></span><br />
Entre elas, está <strong><a title="jQuery" href="http://jquery.com/">jQuery</a></strong>, com vasta documentação e constante atualização.</p>
<p><strong>Mas&#8230; Por que utilizar jQuery?</strong></p>
<p>Porque ela pode reduzir o tempo de criação, por exemplo, de efeitos visuais em uma página html.<!--more--></p>
<p>Como o próprio slogan diz: &#8221; Escreva menos, faça mais&#8221; (<em>Write less, do more</em>).</p>
<p>É possível criar animações com pouquíssimas linhas de código javascript, ao invés de utilizar flash ou outros recursos.</p>
<p>Quer um exemplo? Que tal brincar um pouco com o efeito drag &#8216;n drop (arrastar e soltar) nessa página?</p>
<p><a title="http://jqueryui.com/demos/droppable/#photo-manager" href="http://jqueryui.com/demos/droppable/#photo-managerhttp://jqueryui.com/demos/droppable/#photo-manager"> http://jqueryui.com/demos/droppable/#photo-manager</a></p>
<p>Outro fator importante é a grande compatibilidade entre navegadores.</p>
<p>Você não precisa se preocupar com a criação de funções específicas para cada um; a biblioteca já compatibiliza o código para você.</p>
<p>É possível utilizar requisições ajax de maneira muito fácil.</p>
<p><strong>Gostou? Quer uma dica?</strong></p>
<p>O jQuery tornou-se popular pelos inúmeros plugins disponíveis na internet. Esses plugins permitem criar novas funções com base nessa biblioteca.</p>
<p>A dica de hoje é o plugin para criação de máscara para moeda em campos html, ou seja, esse campo exibirá as casas decimais na digitação, por exemplo, do preço de um produto.</p>
<p>Recomendo o plugin <a title="MaskMoney" href="https://github.com/plentz/jquery-maskmoney">MaskMoney</a>.</p>
<p>Qual a diferença dos demais?</p>
<p>Ele permite a edição do campo sem a necessidade de apagar o valor completamente.</p>
<p>Muitas das máscaras disponíveis apresentam um bug quanto a isso.</p>
<p>É possível também customizar a máscara, para exibição de mais de duas casas após a vírgula com apenas uma linha de código.</p>
<p>Simples, não?</p>
<p>Mas cuidado na criação de código jQuery. Lembrem-se sempre de que o código é executado no navegador do cliente, então, se o código não for muito grande, pode travar o programa.</p>
<p>Fica a dica sobre alta performace com essa biblioteca:</p>
<p><a title="http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/" href="http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/">http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Construindo uma classe em PHP para validação de dados de entrada</title>
		<link>http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/</link>
		<comments>http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 02:09:32 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Classe de Validação de Dados]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Conversão de dados]]></category>
		<category><![CDATA[CPF]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[E-mail]]></category>
		<category><![CDATA[Filtros]]></category>
		<category><![CDATA[Formulário HTML]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Validação de Dados]]></category>
		<category><![CDATA[Validação de Formulário]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=533</guid>
		<description><![CDATA[Em uma aplicação Web dinâmica, as entradas de dados (formulários, Web Services, importação de arquivos) são responsáveis por alimentar e manter atualizada a nossa base de dados, ao mesmo tempo, essas entradas podem ser uma porta aberta para dados mal formatados, ataques do tipo script injection ou qualquer outro tipo de sujeira. Nesse post iremos &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/" data-text="Construindo uma classe em PHP para validação de dados de entrada" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/11/formulario1.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/11/formulario1.jpg" alt="" title="formulario" width="465" height="284" class="aligncenter size-full wp-image-537" /></a></p>
<p>Em uma aplicação Web dinâmica, as entradas de dados (formulários, Web Services, importação de arquivos) são responsáveis por alimentar e manter atualizada a nossa base de dados, ao mesmo tempo, essas entradas podem ser uma porta aberta para dados mal formatados, ataques do tipo script injection ou qualquer outro tipo de sujeira.</p>
<p><span id="more-533"></span></p>
<p>Nesse post iremos construir uma classe de validação que será capaz de filtrar, validar e criticar os dados de entrada de uma aplicação, garantindo a integridade dos dados e impedindo ataques.</p>
<h4>Requerimentos</h4>
<p>Para facilitar o entendimento do código abaixo, aconselho a leitura da documentação da classe <a href="http://www.php.net/manual/pt_BR/class.exception.php" target="_blank">Exception</a> e das funções <a href="http://br2.php.net/manual/pt_BR/function.isset.php" target="_blank">isset</a>, <a href="http://br2.php.net/manual/pt_BR/function.strlen.php" target="_blank">strlen</a>, <a href="http://br2.php.net/manual/pt_BR/function.str-replace.php" target="_blank">str_replace</a>, <a href="http://br2.php.net/manual/pt_BR/function.is-numeric.php" target="_blank">is_numeric</a>, <a href="http://br2.php.net/manual/pt_BR/function.mb-detect-encoding.php" target="_blank">mb_detect_encoding</a>, <a href="http://br2.php.net/manual/pt_BR/function.htmlentities.php" target="_blank">htmlentities</a>, <a href="http://br2.php.net/manual/pt_BR/function.html-entity-decode.php" target="_blank">html_entity_decode</a>, <a href="http://br2.php.net/manual/pt_BR/function.nl2br.php" target="_blank">nl2br</a>, <a href="http://br2.php.net/manual/pt_BR/function.strip-tags.php" target="_blank">strip_tags</a> no site <a href="http://www.php.net" target="_blank">www.php.net</a>. </p>
<h4>1º Passo – Criando uma classe de tratamento de erros</h4>
<p>Iremos criar uma classe para gerenciar os erros e exceções geradas por nossas classes principal e secundária e para que ela funcione adequadamente, deverá ser herdeira da classe <a href="http://www.php.net/manual/pt_BR/class.exception.php" target="_blank">Exception</a> (nativa do PHP).</p>
<pre class="brush: php; title: ; notranslate">
class DDException extends Exception
{

}
</pre>
<p>Você deve estar se perguntando “Por que não usar a classe Exception, já que a classe herdeira não tem nada implementado?”. Minha resposta é “Se em algum momento quisermos adicionar algum controle de erros ainda não implementado na classe Exception, basta modificar a classe DDException e tudo será resolvido”.</p>
<h4>2º Passo – Implementando classe de gerenciamento dos dados a serem validados</h4>
<p>Essa será a classe principal, ela será usada para armazenar e gerenciar os nossos dados</p>
<pre class="brush: php; title: ; notranslate">
class DDDataValidation
{
	private $v_data_values;
	private $v_data_itens_object;

	//constantes de charset
	const UTF_8 = 1;
	const ISO_8859_1 = 2;

	//constantes para formato de data
	const DATE_EN = 1;
	const DATE_BR = 2;

	//constantes de erro
	const ErrorEmpty = 1;
	const ErrorNumeric = 2;
	const ErrorMaximum = 3;
	const ErrorMinimum = 4;
	const ErrorCPF = 5;
	const ErrorEmail = 6;
	const ErrorDate = 7;

	function __construct()
	{
		$this-&gt;v_data_values = array();
		$this-&gt;v_data_itens_object = array();
	}

	/**
	* Adiciona dados para ser validados
	*
	* @param string $st_alias - Alias definido pelo desenvolvedor para fazer referencia ao dado
	* @param mixed $mx_data - Dado a ser validado
	*/
	public function setData($st_alias,$st_value)
	{
		$this-&gt;v_data_values[$st_alias] = $st_value;
		$this-&gt;v_data_itens_object[$st_alias] = new DDDataValidationItem(addslashes($st_value));
	}

	/**
	* Retorna um objeto contendo dados a serem validados
	*
	* @param string $st_alias - Alias definido pelo desenvolvedor para fazer referencia ao dado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function getData($st_alias)
	{
		if(isset($this-&gt;v_data_itens_object[$st_alias]))
			return $this-&gt;v_data_itens_object[$st_alias];
		else
			throw new DDException('Alias '.$st_alias.' not found');
	}

	/**
	* Retorna os dados sem nenhuma modificação
	*
	* @param string $st_alias - Alias definido pelo desenvolvedor para fazer referencia aos dados
	* @throws DDException
	*/
	public function getOriginal($st_alias)
	{
		if(isset($v_campos[$st_alias]))
			return $v_data_values[$st_alias];
		else
			throw new DDException('Alias '.$st_alias.' not found');
	}

	/**
 	* Retorna a quantidade de erros, idenpendente
 	* do alias referente ao campo
 	*
 	* @return integer
	*/
	public function countErrors()
	{
		foreach($this-&gt;v_data_itens_object AS $data_objects)
			$in_errors += $data_objects-&gt;countErrors();
		return $in_errors;
	}
}
</pre>
<h4>3º Passo – Implementando classe responsável pelos filtros</h4>
<p>Nesse momento, iremos implementar uma classe secundária. Ela será responsável por encapsular o dado propriamente dito e por executar os métodos de restrição, filtro e conversão dos dados.</p>
<pre class="brush: php; title: ; notranslate">
class DDDataValidationItem
{
	private $mx_value;
	private $v_error;
	private $v_boolean_error;

	/**
	* O valor do dado pode ser definidos ou não
	*
	* @param mixed $mx_value
	*/
	function __construct($mx_value = null)
	{
		if($mx_value != null)
			$this-&gt;set($mx_value);
	}

	/**
	* Recebe o dado à ser validado
	*
	* @param mixed $mx_value
	*/
	public function set($mx_value)
	{
		$this-&gt;mx_value = $mx_value;
	}

	/**
	* Retorna o dado validado
	*
	* @return mixed
	*/
	public function get()
	{
		return $this-&gt;mx_value;
	}

	/**
	* Retorna, se houver, o erro referente ao alias de verficação
	*
	* @param flag $mx_erro_code
	* 	Use DDDataValidation::ErrorEmpty - retorna o erro de preenchimento do campo
	*		DDDataValidation::ErrorNumeric - retorna o erro da validação de numero
	*		DDDataValidation::ErrorMaximum - retorna o erro da validação de quantidade de caracteres
	*		DDDataValidation::ErrorMinimum - retorna o erro da validação de quantidade de caracteres
	*		DDDataValidation::ErrorCPF - retorna o erro da validação de CPF
	*		DDDataValidation::ErrorEmail - retorna o erro da validação de e-mail
	*		DDDataValidation::ErrorDate - retornar o erro da validação de data
	*
	* @return string
	*/
	public function getErrorMsg($mx_erro_code)
	{
		if(isset($this-&gt;v_error[$mx_erro_code]))
			return $this-&gt;v_error[$mx_erro_code];
		else
			return new DDValidationItem();
		return $this-&gt;v_error[$mx_erro_code];
	}

	/**
	* Retorna o último erro ocorrido
	*
	* @return string
	*/
	public function getLastErrorMsg()
	{
		$st_message = end($this-&gt;v_error);
		if(isset($st_message))
			return $st_message;
	}

	/**
	* Retorna o primeiro erro ocorrido
	*
	* @return string
	*/
	public function getFirstErrorMsg()
	{
		$st_message = reset($this-&gt;v_error);
		if(isset($st_message))
			return $st_message;
	}

	/**
	* Retorna positivo se houver erro e nega
	*
	* @param mixed $mx_erro_code - Alias de referencia do campo
	* @return boolean
	*/
	public function getError($mx_erro_code)
	{
		if(isset($this-&gt;v_boolean_error[$mx_erro_code]))
			return $this-&gt;v_boolean_error[$mx_erro_code];
	}

	/**
	* Retorna todos os erros, separados apenas pelo delimitador
	*
	* @param character $ch_delimiter - Delimitador
	* @return string
	*/
	public function getAllErrosMessages($ch_delimiter = ' - ')
	{
		foreach($this-&gt;v_error AS $st_error)
			if(isset($st_all_error))
				$st_all_error .= $ch_delimiter.$st_error;
			else
				$st_all_error .= $st_error;
		return $st_all_error;
	}

	/**
	* Retorna a quantidade de erros gerados para aquele campo
	*
	* @return integer
	*/
	public function countErrors()
	{
		return count($this-&gt;v_error);
	}

	/************************/
	/* Métodos de restrição */
	/************************/

	/**
	* Verifica se o dado passado está vazio
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isEmpty( $st_message = null, $mx_error_code = DDDataValidation::ErrorEmpty )
	{
		$mx_value = $this-&gt;trim()-&gt;get();
		if(!(strlen($mx_value) &gt; 0))
		{
			if($st_message != null)
				$this-&gt;v_error[$mx_error_code] = $st_message;
			$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
		}
		return $this;
	}

	/**
	* Verifica se o dado passado é um numero
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isNumeric( $st_message = null, $mx_error_code = DDDataValidation::ErrorNumeric )
	{
		$mx_value = $this-&gt;trim()-&gt;get();
		$mx_value = str_replace(',', '.', $mx_value);
		if(!(is_numeric($mx_value)))
		{
			if($st_message != null)
				$this-&gt;v_error[$mx_error_code] = $st_message;
			$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
		}
		return $this;
	}

	/**
	* Verifica se o dado passado tem quantidade de
	* caracteres acima do limite passado como parametro
	*
	* @param integer $in_max_caracter_count - Quantidade máxima de caracteres
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function isMaximum( $in_max_caracter_count , $st_message = null , $mx_error_code = DDDataValidation::ErrorMaximum )
	{
		if(is_int($in_max_caracter_count))
		{
			if((strlen($this-&gt;mx_value) &gt;= $in_max_caracter_count))
			{
				if($st_message != null)
					$this-&gt;v_error[$mx_error_code] = $st_message;
				$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
			}
		}
		else
			throw new DDException('the variable in_max_caracter_count isn\'t numeric');
		return $this;
	}

	/**
	* Verifica se o dado passado tem quantidade de
	* caracteres abaixo do limite passado como parametro
	*
	* @param integer $in_min_caracter_count - Quantidade mínima de caracteres
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function isMinimum( $in_min_caracter_count , $st_message = null , $mx_error_code = DDDataValidation::ErrorMinimum )
	{
		if(is_numeric($in_min_caracter_count))
		{
			if(strlen($this-&gt;mx_value) &lt;= $in_min_caracter_count)
			{
				if($st_message != null)
					$this-&gt;v_error[$mx_error_code] = $st_message;
				$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
			}
		}
		else
			throw new DDException('the variable in_min_caracter_count isn\'t numeric');
		return $this;
	}

	/**
	* Verifica se o dado é um CPF válido
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isCPF( $st_message , $mx_error_code = DDDataValidation::ErrorCPF )
	{
		$st_cpf = $this-&gt;mx_value;
		$st_cpf = str_pad(ereg_replace('[^0-9]', '', $st_cpf), 11, '0', STR_PAD_LEFT);
		if
		(
			strlen($st_cpf) != 11 ||
			$st_cpf == '00000000000' ||
			$st_cpf == '11111111111' ||
			$st_cpf == '22222222222' ||
			$st_cpf == '33333333333' ||
			$st_cpf == '44444444444' ||
			$st_cpf == '55555555555' ||
			$st_cpf == '66666666666' ||
			$st_cpf == '77777777777' ||
			$st_cpf == '88888888888' ||
			$st_cpf == '99999999999'
		)
			$this-&gt;v_error[$mx_error_code] = $st_message;
		else
			for ($t = 9; $t &lt; 11; $t++)
			{
				for ($d = 0, $c = 0; $c &lt; $t; $c++)
					$d += $st_cpf{$c} * (($t + 1) - $c);

				$d = ((10 * $d) % 11) % 10;
				if ($st_cpf{$c} != $d)
				{
					if($st_message != null)
						$this-&gt;v_error[$mx_error_code] = $st_message;
					$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
				}
			}
		return $this;
	}

	/**
	* Verifica se o dado é um e-mail válido
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isEmail( $st_message , $mx_error_code = DDDataValidation::ErrorEmail )
	{
		$st_email = $this-&gt;mx_value;
		$bo_valid = eregi
		(
			&quot;^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$&quot;,
			$st_email,
			$check
		); 

		if(!$bo_valid)
		{
			if($st_message != null)
				$this-&gt;v_error[$mx_error_code] = $st_message;
			$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
		}
		return $this;
	}

	/**
	* Verifica se o dado é uma data válida
	* @param integer $in_format - Usado para definir qual o formato da data
	* 		Use DDDataValidation::DATE_BR para formato DD/MM/AAAA
	* 		Use DDDataValidation::DATE_EN para formato AAAA/MM/DD
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function isDate( $st_message = null , $in_format = DDDataValidation::DATE_BR , $mx_error_code = DDDataValidation::ErrorDate )
	{
		$dt_date = $this-&gt;mx_value;
		$v_date = preg_split('/[[:punct:]]/',$dt_date);
		if( !is_numeric($v_date[0]) || !is_numeric($v_date[1]) || !is_numeric($v_date[2])  )
		{
			{
					if($st_message != null)
						$this-&gt;v_error[$mx_error_code] = $st_message;
					$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
				}
			return $this;
		}

		if($in_format == DDDataValidation::DATE_BR)
		{
			$in_day = $v_date[0];
			$in_month =  $v_date[1];
			$in_year =  $v_date[2];
		}
		elseif($in_format == DDDataValidation::DATE_EN)
		{
			$in_day = $v_date[2];
			$in_month =  $v_date[1];
			$in_year =  $v_date[0];
		}
		else
			throw new DDException('Invalid value for variable $in_format');

		if (!checkdate( $in_month , $in_day , $in_year ))
			$this-&gt;v_error[$mx_error_code] = $st_message;
		return $this;
	}

	/*********************/
	/* Métodos de filtro */
	/*********************/

	/**
	* Retira, por padrão, caracteres de espaço ( ), tab (\t), retorno de carro (\r)
	* e quebra de linhas (\n) no inicio e no fim do dado. Pode ser personalizada
	* usando a variável $st_characters
	*
	* @param string $st_characters - Caracteres que devem ser retirados no inicio
	* 		e no fim do dado, o valor padrão é &quot; \t\n\r&quot;
	*
	* @return DDDataValidationItem
	*/
	public function trim( $st_characters = &quot; \t\n\r&quot; )
	{
		$this-&gt;mx_value = trim( $this-&gt;mx_value , $st_characters );
		return $this;
	}

	/**
	* Retira, por padrão, todas as tags HTML encontradas no dado
	*
	* @param string $allowable_tags - Use-a para permitir tags especificadas
	* @return DDDataValidationItem
	*/
	public function noHTML( $allowable_tags = '' )
	{
		$this-&gt;mx_value = strip_tags($this-&gt;mx_value,$allowable_tags);
		return $this;
	}

	/**
	* Retira tudo que não for uma letra do alfabeto
	* ou um numero de 0 a 9 do dado
	*
	* @return DDDataValidationItem
	*/
	public function alphaNum()
	{
		$this-&gt;trim();
		$this-&gt;noHTML();
		$this-&gt;mx_value = ereg_replace(&quot;([[:punct:]]| )&quot;,&quot;&quot;,$this-&gt;mx_value);
		return $this;
	}

	/**
	* Retira tudo que não for um numero do dado
	*
	* @return DDDataValidationItem
	*/
	public function numeric()
	{
		$this-&gt;trim();
		$this-&gt;noHTML();
		$this-&gt;mx_value = ereg_replace(&quot;([[:punct:]]|[[:alpha:]]| )&quot;,&quot;&quot;,$this-&gt;mx_value);
		return $this;
	}

	/************************/
	/* Métodos de conversão */
	/************************/

	/**
	* Converte uma data do formato Brasileiro Ex: 10/11/2011
	* 	para o formato Americano Ex: 2011/11/10 ou vice-versa
	*
	* @param integer $f_actual_format - Especificar o formato atual da data
	* 	Use DDDataValidation::DATE_BR para formato Brasileiro
	* 	Use DDDataValidation::DATE_EN para formato Americano
	* @param integer $f_to_format - Especificar o formato de data desejado
	* 	Use DDDataValidation::DATE_BR para formato Brasileiro
	* 	Use DDDataValidation::DATE_EN para formato Americano
	* @param character $ch_delimiter - Especificar o caractere de separação
	* 	para dia mês e ano
	* @throws DDException
	*/
	public function convertDate($f_actual_format = DDDataValidation::DATE_BR , $f_to_format = DDDataValidation::DATE_EN , $ch_delimiter = '-' )
	{
		$dt_date = $this-&gt;mx_value;
		$v_date = preg_split('/[[:punct:]]/',$dt_date);

		if( !is_numeric($v_date[0]) || !is_numeric($v_date[1]) || !is_numeric($v_date[2])  )
			throw new DDException('this data isn\'t a valid date');

		if($f_actual_format != DDDataValidation::DATE_BR &amp;&amp; $f_actual_format != DDDataValidation::DATE_EN)
			throw new DDException('$f_actual_format isn\'t a valid flag');

		if($f_to_format != DDDataValidation::DATE_BR &amp;&amp; $f_to_format != DDDataValidation::DATE_EN)
			throw new DDException('$f_to_format isn\'t a valid flag');

		if($f_actual_format == DDDataValidation::DATE_BR)
		{
			$in_day = $v_date[0];
			$in_month =  $v_date[1];
			$in_year =  $v_date[2];
		}
		elseif($f_actual_format == DDDataValidation::DATE_EN)
		{
			$in_day = $v_date[2];
			$in_month =  $v_date[1];
			$in_year =  $v_date[0];
		}

		if (!checkdate( $in_month , $in_day , $in_year ))
			throw new DDException('this data isn\'t a valid date');

		if($f_to_format == DDDataValidation::DATE_BR)
			$this-&gt;mx_value = $in_day . $ch_delimiter . $in_month . $ch_delimiter . $in_year;
		elseif($f_to_format == DDDataValidation::DATE_EN)
			$this-&gt;mx_value = $in_year . $ch_delimiter . $in_month . $ch_delimiter . $in_day;
		return $this;
	}

	/**
	* Converte todos os caractéres especiais em suas
	* respectivas entidades HTML
	*
	* @return DDDataValidationItem
	*/
	public function htmlEntities()
	{
		$this-&gt;mx_value = htmlentities($this-&gt;mx_value);
		return $this;
	}

	/**
	* Converte entidades HTML em seus respectivos
	* caracteres especiais
	*
	* @return DDDataValidationItem
	*/
	public function htmlEntitiesDecode()
	{
		$this-&gt;mx_value = html_entity_decode($this-&gt;mx_value);
		return $this;
	}

	/**
	* Converte characteres de final de linha (\n) para
	* para a tag &lt;br/&gt; do HTML
	*
	* @return DDDataValidationItem
	*/
	public function nlToBr()
	{
		$this-&gt;mx_value = nl2br($this-&gt;mx_value);
		return $this;
	}

	/**
	* seta o charset do dado
	*
	* @param integer $in_actual_charset - Seta o charset atual do dado
	* 	Use DDDataValidation::ISO_8859_1 para ISO-8859-1
	* 	Use DDDataValidation::UTF-8 para UTF-8
	* @param integer $in_to_charset - Define o charset desejado
	* 	Use DDDataValidation::ISO_8859_1 para ISO-8859-1
	* 	Use DDDataValidation::UTF-8 para UTF-8
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function setCharset($in_actual_charset = DDDataValidation::ISO_8859_1 , $in_to_charset = DDDataValidation::UTF_8)
	{
		if($in_actual_charset != DDDataValidation::ISO_8859_1 &amp;&amp; $in_actual_charset != DDDataValidation::UTF_8)
			throw new DDException('invalid actual charset variable'); 

		if($in_to_charset != DDDataValidation::ISO_8859_1 &amp;&amp; $in_to_charset != DDDataValidation::UTF_8)
			throw new DDException('invalid to charset variable');

		if($in_actual_charset == DDDataValidation::UTF_8 &amp;&amp; $in_to_charset == DDDataValidation::ISO_8859_1)
			$this-&gt;mx_value = utf8_decode($this-&gt;mx_value);

		if($in_actual_charset == DDDataValidation::ISO_8859_1 &amp;&amp; $in_to_charset == DDDataValidation::UTF_8)
			$this-&gt;mx_value = utf8_encode($this-&gt;mx_value);
		return $this;
	}
}
</pre>
<p>Você deve está pensando &#8220;<em><strong>Nossa! Quanto código.</strong></em>&#8220;. Eu sei, é realmente muito código, mas ele será escrito apenas uma vez e usado milhares de vezes. Você só terá que mexer nele novamente se houver a necessidade de implementar um novo método ou fazer a manutenção em alguma parte do código. Resumindo, você só terá que entender o código (se você for um bom programador e não gosta de pegar código pronto na Internet) e aprender a usar.</p>
<h4>4º Passo – Testando o código</h4>
<p>Como teste, iremos usar nossa classe para validar um formulário. Veja o código em anexo abaixo.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
//se o formulário foi enviado

require_once 'DDFormValidation.php';
$o_validation = new DDDataValidation();

//verificando se algo foi enviado
if(count($_POST))
{
	//encapsulando os dados
	$o_validation-&gt;setData('nome', $_POST['nome']);
	$o_validation-&gt;setData('email', $_POST['email']);
	$o_validation-&gt;setData('cpf', $_POST['cpf']);
	$o_validation-&gt;setData('data_nascimento', $_POST['data_nascimento']);

	//efetuando as validações

	//validando nome
	$o_validation-&gt;getData('nome')-&gt;isEmpty('Nome é obrigatório');

	//validando email
	$o_validation-&gt;getData('email')-&gt;isEmpty('E-mail é obrigatório');
	$o_validation-&gt;getData('email')-&gt;isEmail('E-mail inválido');

	//validando CPF
	$o_validation-&gt;getData('cpf')-&gt;isEmpty('CPF é obrigatório');
	$o_validation-&gt;getData('cpf')-&gt;isCPF('CPF inválido');

	//validando data de nascimento
	$o_validation-&gt;getData('data_nascimento')-&gt;isEmpty('Data de Nascimento é obrigatória');
	$o_validation-&gt;getData('data_nascimento')-&gt;isDate('Data de Nascimento inválida',DDDataValidation::DATE_BR);

	if($o_validation-&gt;countErrors() == 0)
		$st_mensagem =  'cadastrado com sucesso';
}	

	?&gt;
&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
body
{
font-family:&quot;tahoma&quot;;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div align=center&gt;
	&lt;br/&gt;
	&lt;br/&gt;
	&lt;form method=&quot;post&quot;&gt;
		&lt;table&gt;
			&lt;tr&gt;
				&lt;td colspan=&quot;2&quot; align=&quot;center&quot; style=&quot;font-size: 30px;&quot;&gt;
					DigitalDev Form
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td&gt;
					&amp;nbsp;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			if(isset($st_mensagem))
			{
			?&gt;
			&lt;tr&gt;
				&lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
					&lt;font color='red' size='4'&gt;&lt;?php echo $st_mensagem?&gt;&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			}
			?&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					Nome:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; name=&quot;nome&quot; value=&quot;&lt;?php echo $_POST['nome']?&gt;&quot; maxlength=&quot;40&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('nome')-&gt;getErrorMsg(DDDataValidation::ErrorEmpty)?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					E-mail:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; name=&quot;email&quot; maxlength=&quot;40&quot; value=&quot;&lt;?php echo $_POST['email']?&gt;&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('email')-&gt;getFirstErrorMsg()?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					CPF:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; size=&quot;11&quot; name=&quot;cpf&quot; maxlength=&quot;14&quot; value=&quot;&lt;?php echo $_POST['cpf']?&gt;&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('cpf')-&gt;getFirstErrorMsg()?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					Data de nascimento:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; size=&quot;10&quot; name=&quot;data_nascimento&quot; maxlength=&quot;10&quot; value=&quot;&lt;?php echo $_POST['data_nascimento']?&gt;&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('data_nascimento')-&gt;getFirstErrorMsg()?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
					&lt;button type=&quot;submit&quot;&gt;Cadastrar&lt;/button&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/table&gt;
	&lt;/form&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Faça o download do código fonte do exemplo acima clicando <a href="http://digitaldev.com.br/downloads/DDFormulario.zip">aqui</a>.</p>
<p>Apesar dessa classe de validação de dados de entrada ser capaz de nos auxiliar na validação, filtro e conversão de dados de entrada, sempre irá existir situações em que ela não poderá nos auxiliar. Nessas situações o programador deverá efetuar manutenções no código ou implementar novos métodos.</p>
<p>Faça o download do código fonte da classe clicando <a href="http://digitaldev.com.br/downloads/DDDataValidation.zip">aqui</a>.</p>
<p>Artigos Relacionados</p>
<p><a href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" target="_blank">Construindo uma classe em PHP para conexão com Banco de Dados</a><br />
<a href="http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/" target="_blank">SQL Injection, como evitar esse tipo de ataque em páginas PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Centralizando objetos na tela com CSS</title>
		<link>http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/</link>
		<comments>http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 18:16:55 +0000</pubDate>
		<dc:creator>sergio</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[alinhamento]]></category>
		<category><![CDATA[altura]]></category>
		<category><![CDATA[centralizando]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[largura]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[tela]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=562</guid>
		<description><![CDATA[Veremos aqui como alinhar objetos no centro da tela, usando css. Usaremos como exemplo o alinhamento de uma imagem com DIV. Verifiquem que o processo é o mesmo caso queremos alinhar tabelas contendo textos ou imagens. Agora vejamos: A imagem possui um tamanho de 400 x 300, respectivamente, largura e altura (width e height). Insira &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/" data-text="Centralizando objetos na tela com CSS" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p style="text-align: center;"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg"><img class="alignnone size-full wp-image-578" title="css-cascading-style-sheets" src="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg" alt="" width="260" height="187" /></a></p>
<p>Veremos aqui como alinhar objetos no centro da tela, usando css. Usaremos como exemplo o alinhamento de uma imagem com DIV. Verifiquem que o processo é o mesmo caso queremos alinhar tabelas contendo textos ou imagens.</p>
<p><span id="more-562"></span></p>
<p><strong>Agora vejamos:</strong></p>
<p>A imagem possui um tamanho de 400 x 300, respectivamente, largura e altura (width e height).</p>
<p>Insira a imagem dentro de um DIV, como abaixo:</p>
<p><em><span style="color: #333399;">&lt;div&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;img src=&#8221;imagem.jpg&#8221; alt=&#8221;" /&gt;</span></em><br />
<em><span style="color: #333399;"> &lt;/div&gt;</span></em></p>
<p><strong>Explicando o CSS:<br />
</strong>Acompanhando o tamanho da imagem, ou seja, 400px x 300px, definiremos no CSS uma largura de 400px e uma altura de 300px que &#8220;guardará&#8221; a imagem:</p>
<p><em><span style="color: #333399;">width: 400px;</span></em><br />
<em><span style="color: #333399;"> height: 300px;</span></em></p>
<p>É necessário entender que o alinhamento não é feito a partir do centro do objeto. Neste caso alinhamos pelas extremidades, onde o canto esquerdo superior passa ser o centro.</p>
<p><strong>Então definimos:</strong></p>
<p><em><span style="color: #333399;">position: absolute;</span></em></p>
<p><strong>E também:<br />
</strong>Distância de 50% a partir do topo e 50% a partir do lado esquerdo:</p>
<p><em><span style="color: #333399;">top: 50%;</span></em><br />
<em><span style="color: #333399;"> left: 50%;</span></em></p>
<p><strong>Para encerrar faremos uma espécie de hack do CSS:<br />
</strong>Definiremos valores negativos para a imagem, mais precisamente nas margens do topo e esquerda. Os valores negativos serão exatamente a metade da altura e da largura da imagem, conforme abaixo:</p>
<p><span style="color: #333399;"><em>margin-top: -150px;</em></span><br />
<span style="color: #333399;"><em> margin-left: -200px;</em></span></p>
<p><strong>Vejamos agora como deverá ficar o CSS final:</strong></p>
<p><em><span style="color: #333399;">.center {<br />
</span></em><em><span style="color: #333399;">     width: 400px;<br />
</span></em><em><span style="color: #333399;">     height: 300px;<br />
</span></em><em><span style="color: #333399;">     position: absolute;<br />
</span></em><em><span style="color: #333399;">     top: 50%;<br />
</span></em><em><span style="color: #333399;">     left: 50%;<br />
</span></em><em><span style="color: #333399;">     margin-top: -150px;<br />
</span></em><em><span style="color: #333399;">     margin-left: -200px;<br />
</span></em><em><span style="color: #333399;">}</span></em></p>
<p><strong>Veja como ficou o html:</strong></p>
<p><span style="color: #333399;"><em>&lt;html&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;head&gt;</em></span><br />
<span style="color: #333399;"><em>          &lt;title&gt;Título&lt;title&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;/head&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;body&gt;</em></span><br />
<span style="color: #333399;"><em>          &lt;div  class=&#8221;center&#8221;&gt;&lt;img src=&#8221;imagem.jpg&#8221; /&gt;&lt;/div&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;/body&gt;</em></span><br />
<span style="color: #333399;"><em>&lt;/html&gt;</em></span></p>
<p><strong>Isso também é possível:</strong></p>
<p><em><span style="color: #333399;">&lt;html&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;head&gt;</span></em><br />
<em><span style="color: #333399;">          &lt;title&gt;Título&lt;title&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;/head&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;body&gt;<br />
&lt;table width=&#8221;400&#8243; border=&#8221;0&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;0&#8243;&gt;</span></em><br />
<em><span style="color: #333399;">               &lt;tr&gt; </span></em><br />
<em><span style="color: #333399;">                    &lt;td&gt;<br />
&lt;div  class=&#8221;center&#8221;&gt;&lt;img src=&#8221;imagem.jpg&#8221; /&gt;&lt;/div&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</span></em></p>
<p>Espero ter ajudado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Construindo uma classe em PHP para conexão com Banco de Dados</title>
		<link>http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/</link>
		<comments>http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 00:57:53 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Banco de dados]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Microsoft SQL Server]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=444</guid>
		<description><![CDATA[Ao se construir uma aplicação ou site em PHP que se comunique com algum banco de dados, uma classe de banco de dados de fácil uso e compreensão pode simplificar bastante o nosso trabalho. Nesse artigo mostrarei como construir uma classe da banco de dados, baseada na classe PDO (nativa do PHP), capaz de fazer &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" data-text="Construindo uma classe em PHP para conexão com Banco de Dados" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/Database.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/Database.jpg" alt="" title="Database" width="500" height="316" class="aligncenter size-full wp-image-445" style="border: 0px;"/></a></p>
<p>Ao se construir uma aplicação ou site em <a href="http://www.digitaldev.com.br/2011/07/03/o-que-e-php-e-qual-e-sua-historia/" target="_blank">PHP</a> que se comunique com algum banco de dados, uma classe de banco de dados de fácil uso e compreensão pode simplificar bastante o nosso trabalho.</p>
<p>Nesse artigo mostrarei como construir uma classe da banco de dados, baseada na classe <a href="http://www.php.net/manual/pt_BR/book.pdo.php" target="_blank">PDO</a> (nativa do PHP), capaz de fazer múltiplas conexões simultâneas e com suporte aos principais gerenciadores de banco de dados usados hoje em dia.<br />
<span id="more-444"></span></p>
<h4><strong>Requisitos</strong></h4>
<p>Como iremos usar a classe PDO do PHP na implementação de uma segunda classe, precisaremos que as extensões <strong>php_pdo_mssql</strong>, <strong>php_pdo_mysql</strong>, <strong>php_pdo_oci</strong>, <strong>php_pdo_pgsql</strong>, <strong>php_pdo_sqlite</strong> estejam ativas nas configurações do seu servidor PHP.</p>
<p>Para facilitar o entendimento do código abaixo, aconselho a leitura da documentação das classes <a href="http://www.php.net/manual/pt_BR/book.pdo.php" target="_blank">PDO</a> e <a href="http://www.php.net/manual/pt_BR/class.exception.php" target="_blank">Exception</a> no site <a href="http://www.php.net/" target="_blank">www.php.net</a>.</p>
<h3><strong>1º Passo &#8211; Criando uma classe de configuração</strong></h3>
<p>Antes de mais nada, precisaremos construir uma classe para guardar as configurações de cada conexão, como por exemplo, endereço do banco, tipo do banco, porta, nome do banco, usuário e senha.</p>
<pre class="brush: php; title: ; notranslate">
class DDConnectSettings
{
	const MYSQL = 1;
	const PGSQL = 2;
	const MSSQL = 3;
	const ORACLE = 4;
	const SQLite = 5;

	private $f_application;
	private $st_host;
	private $in_port;
	private $st_dbase;
	private $st_user;
	private $st_password;

	/**
	* define o gerenciador de banco de dados
	* @param int $f_aplication
	* @example $ob-&gt;setAplication(DDConnectSettings::MYSQL);
	*	Use
	* 	DDConnectSettings::MYSQL - para MySQL
	* 	DDConnectSettings::PGSQL - para PostgreSQL
	* 	DDConnectSettings::MSSQL - para Microsoft SQL Server
	* 	DDConnectSettings::ORACLE - para Oracle
	*	DDConnectSettings::SQLite - para SQLLite
	*/
	public function setApplication($f_aplication)
	{
		$this-&gt;f_application = $f_aplication;
	}

	/**
	* retorna qual o gerenciador de banco de dados definido
	* @return int
	*/
	public function getApplication()
	{
		return $this-&gt;f_application;
	}

	/**
	* define endereço (IP ou domínio) do servidor
	* @param string $st_host
	*/
	public function setHost($st_host)
	{
		$this-&gt;st_host = $st_host;
	}

	/**
	* retorna o endereço do servidor definido
	* @return string
	*/
	public function getHost()
	{
		return $this-&gt;st_host;
	}

	/**
	* define a porta a ser usada na conexão
	* @param int $in_port
	*/
	public function setPort($in_port)
	{
		$this-&gt;in_port = $in_port;
	}

	/**
	* retorna a porta definida
	* @return int
	*/
	public function getPort()
	{
		return $this-&gt;in_port;
	}

	/**
	* define o nome do banco de dados ou arquivo
	* @param string $st_dbase
	*/
	public function setDatabase($st_dbase)
	{
		$this-&gt;st_dbase = $st_dbase;
	}

	/**
	* retorna o nome do banco de dados ou arquivo definido
	* @return string
	*/
	public function getDatabase()
	{
		return $this-&gt;st_dbase;
	}

	/**
	* define o nome do usuário a ser usado em uma conexão protegida
	* @param string $st_user
	*/
	public function setUser($st_user)
	{
		$this-&gt;st_user = $st_user;
	}

	/**
	* retorna o nome do usuário definido no caso de uma conexão pretegida
	* @return string
	*/
	public function getUser()
	{
		return $this-&gt;st_user;
	}

	/**
	* define a senha de usuário a ser usado em uma conexão protegida
	* @param string $st_password
	*/
	public function setPassword($st_password)
	{
		$this-&gt;st_password = $st_password;
	}

	/**
	* retorna a senha de usuário definido no caso de uma conexão pretegida
	* @return string
	*/
	public function getPassword()
	{
		return $this-&gt;st_password;
	}
}
</pre>
<h3><strong>2º Passo &#8211; Criando uma classe de tratamento de erros</strong></h3>
<p>Também precisaremos de uma classe de tratamento de erros e para que ela funcione adequadamente, deverá ser herdeira da classe <a href="http://www.php.net/manual/pt_BR/language.exceptions.php" target="_blank">Exception</a> (também nativa do PHP).</p>
<pre class="brush: php; title: ; notranslate">
class DDDException extends Exception
{

}
</pre>
<p>Você deve estar se perguntando <em><strong>&#8220;Por que não usar a classe Exception, já que a classe herdeira não tem nada implementado?&#8221;</strong></em>. Minha resposta é <em><strong>&#8220;Se em algum momento quisermos adicionar algum controle de erros ainda não implementado na classe Exception, basta modificar a classe DDDException e tudo será resolvido&#8221;</strong></em>.</p>
<h3><strong>3º Passo &#8211; Implementando classe de dados</strong></h3>
<p>Esta classe de dados será responsável por encapsular os dados retornados na consulta SQL, como por exemplo, quantidade de linhas, colunas e dados propriamente ditos.</p>
<pre class="brush: php; title: ; notranslate">
class DDData
{
	const OBJECT = 1;
	const ARRAY_ASSOC = 2;
	const ARRAY_NUM = 3;
	const ARRAY_BOTH = 4;	

	private $o_PDOStatment;	

	/**
	* Retorna dados de uma consulta SQL
	*
	* @param int $f_tout - Usada para formatar a saída dos dados
	* @example $ob-&gt;getData(DDData::ARRAY_NUM)
	* 	Use
	* 	DDData::ARRAY_NUM - para retornar um array multidimensional de índices numéricos
	*	DDData::OBJECT - para retornar um array contendo como valores, objetos stdClass com os dados de cada linha
	*	DDData::ARRAY_ASSOC - para retornar um array multidimensional contendo como índices os nomes dos campos
	*   DDData::ARRAY_BOTH - para retornar um array contendo índices numericos e os nomes dos campos
	* @return array
	* @throws DDDException
	*/
	public function getData($f_tout = self::OBJECT)
	{
		if(!is_a($this-&gt;o_PDOStatment,'PDOStatement'))
			throw new DDDException('Nothing to return');

		if($this-&gt;o_PDOStatment-&gt;columnCount() &gt; 0)
		{
			$v_return = array();

			try
			{
				switch($f_tout)
				{
					case self::OBJECT:
						while($o_line = $this-&gt;o_PDOStatment-&gt;fetchObject())
							array_push($v_return, $o_line);
					break;

					case self::ARRAY_ASSOC:
						$v_return = $this-&gt;o_PDOStatment-&gt;fetchAll(PDO::FETCH_ASSOC);
					break;

					case self::ARRAY_NUM;
						$v_return = $this-&gt;o_PDOStatment-&gt;fetchAll(PDO::FETCH_NUM);
					break;

					case self::ARRAY_BOTH;
						$v_return = $this-&gt;o_PDOStatment-&gt;fetchAll(PDO::FETCH_BOTH);
					break;
				}
			}
			catch(PDOException $e)
			{
				throw  new DDDException($e-&gt;getMessage());
			}
		}
		else
			$v_return = FALSE;
		return $v_return;
	}

	/**
	* Recebe um objeto da classe PDOStatment,
	* este objeto será usado apenas pela classe DDDatabase
	* @param PDOStatement $o_PDOStatment
	*/
	public function setData(PDOStatement $o_PDOStatment)
	{
		$this-&gt;o_PDOStatment = $o_PDOStatment;
	}

	/**
	* Retorna o numero de linhas geradas na consulta SQL
	* @throws DDDException
	* @return integer
	*/
	public function getNRows()
	{
		if(!is_a($this-&gt;o_PDOStatment,'PDOStatement'))
			throw new DDDException('Nothing to return');

		return $this-&gt;o_PDOStatment-&gt;rowCount();
	}

	/**
	* Retorma o numero de colunas geradas na consulta SQL
	* @return integer
	* @throws DDDException
	*/
	public function getNCols()
	{
		if(!is_a($this-&gt;o_PDOStatment,'PDOStatement'))
			throw new DDDException('Nothing to return');

		return $this-&gt;o_PDOStatment-&gt;columnCount();
	}
}
</pre>
<h3><strong>4º Passo &#8211; Implementando a classe principal</strong></h3>
<p>A classe principal será responsavel por administrar as conexões e as requisições feitas por consultas SQL</p>
<pre class="brush: php; title: ; notranslate">
class DDDatabase
{
	private $v_connections;
	private $v_database;

	/**
	* Estabele conexão com o gerenciador de banco de dados
	* @param string $st_database - Alias definido pelo desenvolvedor para uma conexão
	* @param DDConnectSettings $o_DDCSettings - Objeto contendo as configurações de uma conexão
	* @throws DDDException
	*/
	public function setConnectSettings($st_database, DDConnectSettings $o_DDCSettings)
	{
		$v_database[$st_database] = $o_DDCSettings;

		$st_dbname = $o_DDCSettings-&gt;getDatabase();

		switch($o_DDCSettings-&gt;getApplication())
		{
			case DDConnectSettings::MYSQL:
				$st_dsn = &quot;mysql:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::PGSQL:
				$st_dsn = &quot;pgsql:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::MSSQL:
				$st_dsn = &quot;mssql:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::ORACLE:
				$st_dsn = &quot;oci:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::SQLite:
				$st_dsn = &quot;sqlite:$st_dbname&quot;;
			break;

			default:
				throw new DDDException('Invalid drive');
			break;
		}

		$st_host = $o_DDCSettings-&gt;getHost();
		$st_username = $o_DDCSettings-&gt;getUser();
		$st_password = $o_DDCSettings-&gt;getPassword();
		$in_port = $o_DDCSettings-&gt;getPort();

		try
		{
			if(isset($st_host))
			{
				$st_dsn .= &quot;;host=$st_host&quot;;
				if(isset($in_port))
					$st_dsn .= &quot;;port=$in_port&quot;;
			}

			if(isset($st_username) &amp;&amp; isset($st_password))
			{
				$this-&gt;v_connections[$st_database] = new PDO($st_dsn, $st_username, $st_password );
			}
			else
			{
				$this-&gt;v_connections[$st_database] = new PDO($st_dsn);
			}	

			$this-&gt;v_connections[$st_database]-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
		catch (PDOException $e)
		{
			throw new DDDException($e-&gt;getMessage());
		}
	}

	/**
	* Retorna um objeto contendo os dados das configurações de uma conexão
	* @param string $st_database - Alias defindo pelo desenvolvedor para a conexão em questão
	*/
	public function getConnectSettings($st_database)
	{
		return $this-&gt;v_database[$st_database];
	}

	/**
	* Executa uma consulta SQL, retornando uma instância da classe DDData
	* @param string $st_database - Alias da conexão que desenvolvedor deseja usar
	* @param  string $st_query - Consulta SQL
	* @return DDData
	* @throws DDDException
	*/
	public function execQuery($st_database,$st_query)
	{
		try
		{
			$v_row = $this-&gt;v_connections[$st_database]-&gt;query($st_query);
			$o_DDData = new DDData();
			$o_DDData-&gt;setData($v_row);
		}
		catch (PDOException $e)
		{
			throw new DDDException($e-&gt;getMessage());
		}
		return $o_DDData;
	}
}
</pre>
<h3><strong>5º Passo &#8211; Exemplo de como usar a classe</strong></h3>
<pre class="brush: php; title: ; notranslate">
//Setando as configurações da conexão
$o_dbconfig = new DDConnectSettings();
$o_dbconfig-&gt;setApplication(DDConnectSettings::PGSQL);
$o_dbconfig-&gt;setHost('localhost');
$o_dbconfig-&gt;setUser('xxx');
$o_dbconfig-&gt;setPassword('xxx');
$o_dbconfig-&gt;setDatabase('digitaldev');
$o_dbconfig-&gt;setPort(5432);

//Instanciando a classe de banco
$o_db = new DDDatabase();
$o_db-&gt;setConnectSettings('ddev', $o_dbconfig);
$st_query = &quot;SELECT * FROM control.tbl_usuario&quot;;
$o_data = $o_db-&gt;execQuery('ddev', $st_query);

//imprimindo dados
var_dump($o_data-&gt;getData(DDData::OBJECT));

//imprimindo numero de linhas
echo 'Linhas = '.$o_data-&gt;getNRows();

//imprimindo numero de colunas
echo 'Colunas = '.$o_data-&gt;getNCols();
</pre>
<p>Faça download de um outro exemplo de uso, dessa com SQLite, clicando <a href="http://digitaldev.com.br/downloads/DDDatabase_SQLite.zip">aqui</a>.</p>
<p>Apesar de poder ser usada na maioria das interações com banco de dados em uma aplicação PHP, essa classe ainda não possui métodos que permitem controle de transições. Fica a encargo dos desenvolvedores continuar a implementação de acordo com as necessidades de suas aplicações.</p>
<p>Quem quiser usar a classe, pode fazer o download da mesma clicando <a href="http://digitaldev.com.br/downloads/DDDatabase.zip">aqui</a>.</p>
<p>Qualquer dúvida, usem a área de respostas abaixo do post.</p>
<p><strong>Artigos relacionados</strong><br />
<a href="http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/">Classe, encapsulamento, herança, composição e agregação</a><br />
<a href="http://www.digitaldev.com.br/2011/07/03/o-que-e-php-e-qual-e-sua-historia/">O que é PHP e qual é sua historia?</a><br />
<a href="http://www.digitaldev.com.br/2011/09/21/instalando-o-ambiente-de-desenvolvimento-php-php-5-3-x-apache-eclipse/">Instalando o ambiente de desenvolvimento PHP (PHP 5.3.x + Apache + Eclipse)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

