<?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>Bit a Bit</title>
	<atom:link href="http://www.bitabit.eng.br/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.bitabit.eng.br</link>
	<description>O Blog da Engenharia de Computação da POLI-USP</description>
	<lastBuildDate>Mon, 11 Mar 2013 22:24:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Começa amanhã a FEBRACE</title>
		<link>http://www.bitabit.eng.br/2013/03/11/comeca-amanha-a-febrace/</link>
		<comments>http://www.bitabit.eng.br/2013/03/11/comeca-amanha-a-febrace/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 22:24:14 +0000</pubDate>
		<dc:creator>Nathalia Sautchuk Patrício, Coop9</dc:creator>
				<category><![CDATA[Coop9]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Outros]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2742</guid>
		<description><![CDATA[A 11ª edição da FEBRACE (Feira Brasileira de Ciências e Engenharia) acontece de 12 a 14 de março, nas dependências da Escola Politécnica da Universidade de São Paulo (Poli-USP), em São Paulo. Ela contará com 330 projetos realizados por estudantes do ensino básico de 25 estados brasileiros e do Distrito Federal. No evento, os projetos serão [...]]]></description>
			<content:encoded><![CDATA[<div>
<p><span>A 11ª edição da <a href="http://febrace.org.br/">FEBRACE</a> (Feira Brasileira de Ciências e Engenharia) acontece de 12 a 14 de março, nas dependências da Escola Politécnica da Universidade de São Paulo (Poli-USP), em São Paulo. Ela contará com 330 projetos realizados por estudantes do ensino básico de 25 estados brasileiros e do Distrito Federal.</span></p>
<p><span></span></p>
</div>
<div>
<p>No evento, os projetos serão avaliados por uma comissão julgadora composta por mestres e doutores de diversas áreas do conhecimento. Os autores dos melhores trabalhos ganharão prêmios e poderão ser selecionados para representar o Brasil na Feira Internacional de Ciências e Engenharia da Intel (<a href="http://www.societyforscience.org/intelisef2013">Intel ISEF</a>), que neste ano acontece Phoenix, Arizona (EUA), de 12 a 17 de maio.</p>
</div>
<div>
<p>A mostra pública de projetos da FEBRACE 2013 será realizada de 12 a 14 de março, das 14h às 19h, em uma tenda instalada no estacionamento da Escola Politécnica da USP (Av. Prof. Luciano Gualberto, nº 3, travessa 3, Cidade Universitária). A entrada é franca.</p>
</div>
<div>
<p>Considerada a maior feira brasileira de ciências e engenharia voltada para estudantes pré-universitários, a FEBRACE é promovida anualmente pelo Laboratório de Sistemas Integráveis (LSI) da Poli. Conta com o apoio institucional do Governo Federal, Ministério da Educação, Ministério da Ciência e Tecnologia e Inovação, Capes, CNPq, UNESCO, FIESP, SESI e SENAI, e o apoio cultural da Rede Globo, TV Cultura, TV Escola, TV USP e Olhar Digital. Patrocínio do SEBRAE, Petrobras, Intel e Instituto Votorantim</p>
</div>
<p>&nbsp;</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2742&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2013/03/11/comeca-amanha-a-febrace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEMAT (Software Engineering Method and Theory)</title>
		<link>http://www.bitabit.eng.br/2013/02/19/semat-software-engineering-method-and-theory/</link>
		<comments>http://www.bitabit.eng.br/2013/02/19/semat-software-engineering-method-and-theory/#comments</comments>
		<pubDate>Tue, 19 Feb 2013 19:41:17 +0000</pubDate>
		<dc:creator>Nathalia Sautchuk Patrício, Coop9</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Coop9]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2719</guid>
		<description><![CDATA[Durante o meu mestrado estive estudando diferentes modelos de engenharia de software para poder fazer o estudo de caso que me propus de um software para a área educacional. Através do meu orientador tomei conhecimento de uma iniciativa chamada SEMAT (Software Engineering Method and Theory) e fui ler mais a fundo sobre o assunto. Segundo [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o meu mestrado estive estudando diferentes modelos de engenharia de software para poder fazer o estudo de caso que me propus de um software para a área educacional. Através do meu orientador tomei conhecimento de uma iniciativa chamada SEMAT (Software Engineering Method and Theory) e fui ler mais a fundo sobre o assunto.</p>
<p><img src="http://www.bitabit.eng.br/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<div>Segundo a Call for Action da iniciativa, na área de engenharia de software há um grande número de modelos existentes, porém, poucos deles podem ser considerados maduros ou suficientemente testados e validados em situações reais. Muitas vezes, as diferenças entre os modelos não são bem compreendidas e ampliadas artificialmente. Há ainda a prevalência de modas ao invés de uma disciplina de engenharia, a falta de bases teóricas amplamente aceitas e uma divisão entre as práticas da indústria e a pesquisa acadêmica.</div>
<div>Como uma resposta aos problemas expostos, foi proposto o desenvolvimento do modelo SEMAT que pretende redefinir a engenharia de software baseada em uma teoria sólida, princípios comprovados e melhores práticas que:</div>
<ul>
<li>Inclua um  kernel de elementos amplamente definidos, extensível para usos específicos;</li>
<li>Aborde tanto questões de tecnologia quanto de pessoas;</li>
<li>Seja suportada pela indústria, academia, pesquisadores e usuários e</li>
<li>Tenha suporte a extensões em face da mudança dos requisitos e da tecnologia.</li>
</ul>
<div>
<div>A iniciativa para a concepção desse modelo foi originada em dezembro de 2009 por Ivar Jacobson, Bertrand Meyer e Richard Soley. Porém, apesar disso, a iniciativa começou a deslanchar de fato no fim do ano de 2011 com a proposta para a RFP “A Foundation for the Agile Creation and Enactment of Software Engineering Methods”.</div>
<div>As informações de tudo referente ao SEMAT podem ser encontradas no <a href="http://semat.org/">site</a> e nos arquivos lá postados.</div>
</div>
<div></div>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2719&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2013/02/19/semat-software-engineering-method-and-theory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sincronização automática de código via SSH para Unix</title>
		<link>http://www.bitabit.eng.br/2013/01/22/sincronizacao-automatica-de-codigo-via-ssh-para-unix/</link>
		<comments>http://www.bitabit.eng.br/2013/01/22/sincronizacao-automatica-de-codigo-via-ssh-para-unix/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 22:20:18 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Empreendedorismo]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[notificação]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[sh]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[sincronização]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[terminal-notifier]]></category>
		<category><![CDATA[transmit]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[watchdog]]></category>
		<category><![CDATA[watchmedo]]></category>
		<category><![CDATA[winscp]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2691</guid>
		<description><![CDATA[Trabalhando num projeto pessoal, ainda em fase bem beta, acabei caindo numa situação meio complicada. O servidor onde estou rodando o projeto (Linux) tem uma configuração um tanto quanto diferente do meu Mac. Com isso, algumas coisas que rodam aqui não rodam lá e vice e versa. Como não tenho saco para compilar uma versão [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2013/01/sync.png"><img class="size-full wp-image-2696 alignright" title="sync" src="http://www.bitabit.eng.br/wp-content/uploads/2013/01/sync.png" alt="" width="185" height="185" /></a>Trabalhando num projeto pessoal, ainda em fase bem beta, acabei caindo numa situação meio complicada.</p>
<p>O servidor onde estou rodando o projeto (Linux) tem uma configuração um tanto quanto diferente do meu Mac. Com isso, algumas coisas que rodam aqui não rodam lá e vice e versa.</p>
<p>Como não tenho saco para compilar uma versão similar do PHP na unha pra sobre escrever o que vem no Mountain Lion, nem de ficar editando o <a href="http://en.wikipedia.org/wiki/Httpd.conf" target="_blank">httpd.conf</a> pra deixar as permissões de acesso corretas, muito menos pra achar uma VM e reinstalar um <a href="http://pt.wikipedia.org/wiki/LAMP" target="_blank">LAMP</a> similar, acabei optando por testar as coisas diretamente no servidor.</p>
<p>Os CyberDuck, programa de FTP que tenho utilizado é bem espertinho e, com um duplo clique no arquivo remoto, o mesmo já abre no TextMate 2. Quando salvo no TM2, ele automaticamente vai para o servidor.</p>
<p>Tudo ótimo, tirando o fato de que tudo que altero remotamente precisa ser baixado para minha máquina, manualmente, para que eu tenha cópias locais e faça o versionamento via <a href="http://pt.wikipedia.org/wiki/Svn" target="_blank">SVN</a>.</p>
<p>Além disso, como o produto está tomando proporções maiores, nem sempre usar o TextMate 2 é a melhor opção, principalmente no momento em que começo a cogitar o uso de frameworks para desenvolver. Então, parti pro NetBeans, que, por si só, já faz sincronização automática via FTP, mas, caso eu edite uma linha de código fora dele, isso já falha.</p>
<h2>Começa a busca…</h2>
<p>Dessa forma, fui atrás de uma solução grátis que fizesse exatamente o seguinte:</p>
<ol>
<li>Identificar que um arquivo foi alterado</li>
<li>Subir APENAS o arquivo alterado para o servidor remoto</li>
<li>Me avisar que o processo está concluído e eu já posso apertar CMD+R (o F5 do Mac)</li>
</ol>
<p>Encontrei várias menções ao &#8220;<a href="http://winscp.net/eng/index.php" target="_blank">WinSCP</a>&#8220;, cliente de FTP que promete fazer isso, mas, como o nome já diz, ele é exclusivo para Windows.</p>
<p>Depois, lí que o &#8220;<a href="http://panic.com/transmit/" target="_blank">Transmit</a>&#8220;, cliente de FTP pra Mac também fazia. Baixei um <em>trial</em>, e descobri que ele falhava no quesito <strong>1</strong>, não identificando alteração dos arquivos.</p>
<p>Aí, descobri que existe um comando no terminal chamado &#8220;<a href="http://pt.wikipedia.org/wiki/Rsync" target="_blank">rsync</a>&#8220;, que faz o <strong>2</strong>, mas nem sonha com o <strong>1</strong>.</p>
<p>Vários foruns e S<em><a href="http://stackoverflow.com" target="_blank">tackOverflows</a></em> depois, vi gente sugerindo loop infinito de rsync como &#8220;solução&#8221; para a sincronização em tempo real. Como bom nerd, me recuso a achar que loop infinito executando de 5 em 5 segundos é &#8220;tempo real&#8221;!</p>
<p>Enfim, depois de um fim de semana pesquisando, consegui montar um &#8220;set&#8221; de programas para fazer exatamente o que eu queria e, até o momento, tudo está funcionando exatamente como eu queria!</p>
<h2>A solução &#8220;mágica&#8221;, porém complexa</h2>
<p>Vamos lá, amiguinhos… primeiro, os &#8220;ingredientes&#8221; para nossa mágica:</p>
<ul>
<li>SSH Passwordless Login &#8211; essa solução só funciona se você conseguir se logar via SSH sem o uso de senha. Nem todo servidor aceita isso!</li>
<li>rsync &#8211; acho que vem por padrão no Shell de todo Unix</li>
<li>HomeBrew &#8211; primo Macintóshico do aptitude de Linux</li>
<li>Watchdog &#8211; utilitário em Python que verifica se um arquivo foi alterado</li>
<li>Terminal Notifier &#8211; utilitário em Ruby que manda uma mensagem para o Notification Service do Mac. Não sei se existe algo similar para Linux</li>
<li>Criação de dois Shell Script para serem facilmente executados</li>
</ul>
<p>Agora, ao passo a passo…</p>
<h3>SSH Passwordless Login</h3>
<p>Para conseguir fazer o login sem uso de senha via ssh, digite os seguintes passos no Terminal:</p>
<pre>ssh-keygen -t rsa</pre>
<p>Digite <strong>enter</strong> três vezes para aceitar os valores padrão. Isso irá criar uma chave de acesso da sua máquina.</p>
<p>Acesse seu servidor via FTP e crie uma pasta chamada <strong>.ssh</strong> (atenção com o <strong>ponto</strong>). Dentro dela, crie uma pasta chamada <strong>authorized_keys</strong>.</p>
<p>Copie a chave que foi criada para dentro da pasta authorized_keys.</p>
<p>Dessa forma, terá a seguinte estrutura na raiz do seu usuário FTP:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/.ssh/authorized_keys/id_rsa.pub</pre></div></div>

<p>Agora, precisamos alterar as permissões desse arquivo. Dá pra fazer isso pelo programa de FTP ou via ssh + comando <strong>chmod</strong>.</p>
<p>A pasta <strong>.ssh</strong> deve ter permissões <strong>700</strong>, isto é, dono do arquivo pode ler, escrever e executar.</p>
<p>A pasta <strong>authorized_keys</strong> deve ter permissão <strong>600</strong>, isto é, o dono do arquivo pode ler e escrever, mas não executar.</p>
<p>Feito isso, experimente logar no seu servidor via ssh, pelo terminal:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ssh seu_usuario_de_ftp@seu_servidor.com</pre></div></div>

<p>Verifique que não deve ser pedida senha… você simplesmente acessa, pois o servidor já tem uma autorização para seu computador (se fizer isso de outro local, a senha será pedida).</p>
<h3>rsync</h3>
<p>Se você conseguiu acessar o servidor sem usar senha, provavelmente todo o resto irá funcionar corretamente.</p>
<p>Para começar, vamos testar o <strong>rsync</strong>, para garantir que estamos sincronizando as pastas corretas e excluindo os arquivos corretos dessa sincronização (.svn, .git, .log etc.).</p>
<p>Para o teste, crie uma nova pasta no seu servidor, assim evitamos destruir seu site <img src='http://www.bitabit.eng.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Crie também uma pasta vazia no seu computador e digite o seguinte no Terminal:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">rsync -azP --delete --exclude .svn --exclude .git --exclude .DS_Store --exclude .cvs --exclude '/cache' --exclude '/logs' ~/pasta_vazia_a_ser_sincronizada/ seu_usuario_de_ftp@seu_servidor.com:pasta_vazia_que_voce_criou_no_servidor/</pre></div></div>

<ul>
<li>-<strong>azP</strong> &#8211; não lembro o que significam, mas acho que tem a ver com subir apenas o que foi modificado</li>
<li><strong>&#8211;delete</strong> &#8211; o que você deletar na sua máquina também será excluído do servidor</li>
<li><strong>&#8211;exclude</strong> &#8211; tudo que você não quer que seja sincronizado</li>
<li><strong>~/pasta_vazia_a_ser_sincronizada/</strong> &#8211; o caminho para a pasta do seu computador</li>
<li><strong>seu_usuario_de_ftp@seu_servidor.com:pasta_vazia_que_voce_criou_no_servidor/</strong> &#8211; conexão SSH com seu servidor. Depois dos &#8220;dois pontos&#8221;, é o caminho da pasta que será sincronizada</li>
</ul>
<p>Coloque um arquivo de texto na sua pasta vazia e execute o comando… observe a mágica.</p>
<p>Agora, edite algo nesse texto, e execute o comando novamente.</p>
<p>Se tudo deu certo, depois de executar o comando, o arquivo é enviado ao servidor!</p>
<h3>HomeBrew</h3>
<p>Provavelmente o mais chatinho de instalar, já que precisa do GCC para ser compilado e, normalmente, se consegue o GCC instalando o IMENSO X-Code.</p>
<p>Mas, depois de instalar o IMENSO (não canso de repetir) X-Code, basta digitar o seguinte no Terminal.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ruby -e “$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)”
brew update</pre></div></div>

<h3>Watchdog</h3>
<p>Com o HomeBrew devidamente instalado e atualizado, vamos adicionar uma dependência do Watchdog. Digite no Terminal:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">brew install libyaml</pre></div></div>

<p>Agora, vamos baixar o Watchdog. Basta digitar no Terminal:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">sudo easy_install watchdog</pre></div></div>

<p>Não vamos testá-lo agora, mas só depois, com a criação de um Shell Script.</p>
<h3>Terminal Notifier</h3>
<p>Finalmente, o não necessário, mas bastante importante notificador.</p>
<p>Como é um script Ruby, basta digitar o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">sudo gem install terminal-notifier</pre></div></div>

<p>Após a instalação (bem rápida), teste se ele está funcionando:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">terminal-notifier -message &quot;Starting sync&quot;</pre></div></div>

<p>Se a janelinha de notificação do Mac apareceu, é porque funcionou!</p>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2013/01/Captura_de_Tela_2013-01-22_às_19.43.10.png"><img class="aligncenter size-full wp-image-2695" title="Mensagem de Sincronização" src="http://www.bitabit.eng.br/wp-content/uploads/2013/01/Captura_de_Tela_2013-01-22_às_19.43.10.png" alt="Mensagem de Sincronização" width="342" height="118" /></a></p>
<h3>Shell Script de verificação de atualização</h3>
<p>Primeiro, vamos criar um Shell Script que sera nosso verificador.</p>
<p>Crie um novo arquivo de texto e digite o seguinte nele:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">watchmedo shell-command \
	--patterns=&quot;*.php;*.js;*.css&quot; \
	--recursive \
	--command='~/endereco_do_outro_script/FolderSync.sh' \
	.</pre></div></div>

<p>Preste atenção nos espaços, na barra invertida e no ponto no final!</p>
<ul>
<li><strong>&#8211;patterns</strong> &#8211; define que tipo de arquivo que observar mudanças</li>
<li><strong>&#8211;recursive</strong> &#8211; além da pasta inicial, olha todas as subpastas</li>
<li><strong>&#8211;command</strong> &#8211; define o que você quer executar quando uma mudança for observada. Aqui, iremos executar o outro Shell Script, que executa o rsync e envia os alertas pro Mac.</li>
</ul>
<p>Salve esse arquivo com a extensão &#8220;.sh&#8221;. Vamos chamá-lo de &#8220;FolderWatch.sh&#8221;.</p>
<h3>Shell Script de sincronização e alerta</h3>
<p>Crie um outro arquivo de texto com o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">#!/bin/bash
# Synchronization script
terminal-notifier -message &quot;Starting Site sync&quot;
rsync -azP --delete --exclude .svn --exclude .git --exclude .DS_Store --exclude .cvs --exclude '/cache' --exclude '/logs' ~/pasta_local_do_site_a_ser_sincronizado/ seu_usuario_de_ftp@seu_servidor.com:pasta_do_seu_site
terminal-notifier -message &quot;Sync has finished&quot;</pre></div></div>

<p>Salve esse arquivo no caminho que você definiu no outro arquivo, o &#8220;FolderWatch.sh&#8221;</p>
<p>Agora, pelo terminal, vá até a pasta que deve ser sincronizada e execute o &#8220;FolderWatch.sh&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">~/caminho_do_folder_watch/FolderWatch.sh</pre></div></div>

<p>Na minha máquina, sempre dá um alerta quando executo isso, mas aparentemente, nenhum problema acontece:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.</pre></div></div>

<p>Agora, edite um arquivo do seu site e veja a mágica ocorrendo!</p>
<p>Imediatamente aparece a mensagem do Mac e, no terminal, a mensagem &#8220;* Notification delivered.&#8221;. Depois disso, o <strong>rsync</strong> executa e tudo que você alterou é enviado ao servidor.</p>
<h3>Criando links dos Shell Scripts</h3>
<p>Apenas para facilitar um pouco a vida, você pode criar links dos Shell Scripts para a pasta /usr/bin, de forma que eles sejam acessados sem precisarmos digitar o endereço completo deles:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">ln -s ~/caminho_do_folder_watch/FolderWatch.sh /usr/bin
ln -s ~/caminho_do_folder_sync/FolderSync.sh /usr/bin</pre></div></div>

<h3>Finalmentes…</h3>
<p>Deu um trabalho do cão descobrir tudo isso, mas realmente facilitou minha vida e agora eu durmo tranquilo sabendo que meu computador e meu servidor estão realmente espelhados!</p>
<p>Eu postei essa solução originalmente no StackOverflow, <a href="http://stackoverflow.com/questions/1413637/osx-equivalent-of-winscps-fully-automated-local-remote-sftp-sync/14435615#14435615">aqui</a> e <a href="http://stackoverflow.com/questions/9279/keep-remote-directory-up-to-date/14435664#14435664">aqui</a> <img src='http://www.bitabit.eng.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Se gostou, dá um up lá!</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2691&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2013/01/22/sincronizacao-automatica-de-codigo-via-ssh-para-unix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sistema de Apoio ao Diagnóstico Médico (SADM)</title>
		<link>http://www.bitabit.eng.br/2012/11/20/sistema-de-apoio-ao-diagnostico-medico-sadm/</link>
		<comments>http://www.bitabit.eng.br/2012/11/20/sistema-de-apoio-ao-diagnostico-medico-sadm/#comments</comments>
		<pubDate>Tue, 20 Nov 2012 20:16:16 +0000</pubDate>
		<dc:creator>Victor Silva</dc:creator>
				<category><![CDATA[Outros]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2608</guid>
		<description><![CDATA[Este post visa apresentar brevemente o projeto de formatura desenvolvido por Victor Meireles de Sá e Silva e Tuany Oguro Tabosa, sob a orientação da Prof. Selma Shin Shimizu Melnikoff e co-orientação da Dra. Márcia Ito.O projeto consiste num sistema de sugestão de diagnósticos médicos. Esse projeto está sendo desenvolvido durante o ano de 2012 [...]]]></description>
			<content:encoded><![CDATA[<p><em><em>Este post visa apresentar brevemente o projeto de formatura desenvolvido por Victor Meireles de Sá e Silva e Tuany Oguro Tabosa, sob a orientação da Prof. Selma Shin Shimizu Melnikoff e co-orientação da Dra. Márcia Ito.O projeto consiste num sistema de sugestão de diagnósticos médicos. Esse projeto está sendo desenvolvido durante o ano de 2012 como trabalho de conclusão de curso do curso de Engenharia de Computação Cooperativo da Escola Politécnica da USP.</em></em><em> </em></p>
<h2></h2>
<h2><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/11/DiagMedico1.jpg"><img class="size-medium wp-image-2614 alignright" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/DiagMedico1-300x300.jpg" alt="" width="210" height="210" /></a>Objetivo</h2>
<p><em>O Sistema de Apoio ao Diagnóstico Médico foi construído com o intuito de gerar sugestões de diagnóstico médico a partir de dados de sintomas e exames realizados anteriormente, fornecidos pelo médico durante a consulta. Conforme uma necessidade apresentada por médicos, o sistema foi se adaptando para a determinação de meta para um tratamento de Diabetes.</em></p>
<h2>Motivação</h2>
<p><em>As soluções de auxílio a diagnóstico médico já são utilizadas no exterior, pois, com cada vez mais dados disponíveis na Internet, torna-se atrativo o uso de sistemas que utilizam esses dados para melhorar o conhecimento dos médicos. Estas soluções variam quanto à linguagem, algoritmos e especificidade, sendo difícil realizar comparações entre os mesmos.</em></p>
<p><em>A motivação para se utilizar esse tipo de sistemas é a possibilidade de manipulação de grande quantidade de variáveis envolvidas para o diagnóstico de uma doença, além da existência de grande número de doenças existentes. </em></p>
<p><em>No entanto, o desenvolvimento destes sistemas não tem a intenção de substituir os médicos e sim de fornecer a eles informações e novas visões para realizar o diagnóstico. A decisão final é do médico já que um sistema computacional é limitado a uma série de decisões e regras pré-determinados.</em></p>
<h2>Diabetes</h2>
<p><em>O Diabetes é uma doença comum, que causa aumento do nível de açúcar no sangue. Normalmente, o sangue possui certa quantidade de glicose, vinda dos alimentos, que o organismo utiliza para gerar energia. Para o organismo utilizar a glicose, é necessário um hormônio chamado insulina, que é produzido pelo pâncreas. A doença é causada pela diminuição da produção  ou ação não eficiente da insulina.</em></p>
<p><em>Uma das principais metas no controle do diabetes  é a manutenção do nível de hemoglobina glicada, também denominada hemoglobina glicosada ou glicohemoglobina, abaixo de 7%. </em></p>
<p><em>No entanto, essa meta terapêutica pode variar conforme alguns fatores como, por exemplo, a idade do paciente e a duração da doença. Quando esses fatores não são considerados, podem ocorrer casos de hipoglicemia, além de aumentar os riscos de arteriosclerose vascular em pacientes mais idosos, devido à agressividade do tratamento.</em></p>
<p><em>Dessa forma, a partir de parâmetros como idade e tempo de doença, o SADM calcula o novo valor sugerido da meta do exame do nível de hemoglobina glicada ideal do paciente, como mostra a tabela simplificada a seguir:</em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em></p>
<div id="attachment_2611" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/11/tabela.png"><img class="size-medium wp-image-2611" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/aa1-300x121.png" alt="" width="300" height="121" /></a><p class="wp-caption-text">Tabela simplificada de parâmetros para a determinação de meta para o tratamento de hemoglobina glicada</p></div>
<p></em></p>
<p><em> </em></p>
<p><em> </em></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2608&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/11/20/sistema-de-apoio-ao-diagnostico-medico-sadm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bom Cupom &#8211; Sistema Inteligente para Geração de Promoções Personalizadas em Supermercados</title>
		<link>http://www.bitabit.eng.br/2012/11/20/sistema-inteligente-para-geracao-de-promocoes-personalizadas-em-supermercados/</link>
		<comments>http://www.bitabit.eng.br/2012/11/20/sistema-inteligente-para-geracao-de-promocoes-personalizadas-em-supermercados/#comments</comments>
		<pubDate>Tue, 20 Nov 2012 14:28:41 +0000</pubDate>
		<dc:creator>Gustavo Rocha, Coop12</dc:creator>
				<category><![CDATA[Aprendizado de máquina]]></category>
		<category><![CDATA[Coop12]]></category>
		<category><![CDATA[Inteligência Artificial]]></category>
		<category><![CDATA[TCC]]></category>
		<category><![CDATA[COOP12]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[DATA MINING]]></category>
		<category><![CDATA[tcc]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2565</guid>
		<description><![CDATA[Este post visa descrever brevemente o projeto desenvolvido pelos alunos Bruno Henrique Joia, Gustavo dos Santos Rocha e Igor Yasuo Gushiken do curso de Engenharia de Computação Cooperativo da Escola Politécnica da USP. Este projeto foi desenvolvido como trabalho de conclusão de curso no ano de 2012 sob orientação do Prof. Dr. Antonio Mauro Saraiva [...]]]></description>
			<content:encoded><![CDATA[<p><em>Este post visa descrever brevemente o projeto desenvolvido pelos alunos Bruno Henrique Joia, Gustavo dos Santos Rocha e Igor Yasuo Gushiken do curso de Engenharia de Computação Cooperativo da Escola Politécnica da USP. Este projeto foi desenvolvido como trabalho de conclusão de curso no ano de 2012 sob orientação do Prof. Dr. Antonio Mauro Saraiva e Eng. Etienne Américo Cartolano Júnior.</em></p>
<div id="attachment_2567" class="wp-caption alignright" style="width: 279px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/11/cupom.png"><img class="size-full wp-image-2567" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/cupom.png" alt="Exemplo de Cupom Gerado pelo Bom Cupom" width="269" height="545" /></a><p class="wp-caption-text">Exemplo de cupom gerado pelo Bom Cupom</p></div>
<h2>O Projeto</h2>
<p>O nosso projeto de formatura consiste no desenvolvimento de um sistema que vai analisar os hábitos de consumo dos clientes de um supermercado e através de técnicas de data mining gerar cupons promocionais personalizados a cada cliente, o Bom Cupom.</p>
<p>Um procedimento já bem difundido que foi explorado durante o projeto é a análise de carrinho de compras, que permite a inferência de correlação entre a compra de diferentes produtos. Podemos, por exemplo, deduzir que um cliente que compra muito pão deve também comprar manteiga (e outras implicações não tão evidentes com grande valor estratégico).</p>
<p>Desta maneira visamos atender a interesses dos clientes e dos vendedores. Os clientes obteriam preços diferenciados em produtos especialmente selecionados de acordo com seu padrão de compras. E os supermercados estariam oferecendo tratamento personalizado e desta forma ganhando a preferência e confiança dos consumidores.</p>
<h2>Motivação</h2>
<p>O relacionamento com o cliente é, sem dúvida, um fator muito importante para o sucesso de um negócio. Clientes satisfeitos tornam-se fiéis e possivelmente defensores de uma marca. E para satizfazer os clientes é importante entender seus hábitos e costumes.</p>
<p>Hoje em dia, empresas já estão gerando uma grande quantidade de informação sobre seus clientes. E a utilização de técnicas de data mining, combinada com essa informação inexplorada já existente atualmente é um fator decisivo na estratégia de marketing de uma empresa.</p>
<p>Além disso, técnicas de data mining são uma ferramenta poderosa de análise de dados e seu estudo aprofundado agrega um conhecimento muito importante não só para este projeto de formatura, como também para projetos futuros.</p>
<h2>O Sistema</h2>
<p>O sistema foi dividido basicamente em quatro módulos:</p>
<div id="attachment_2569" class="wp-caption aligncenter" style="width: 557px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/11/modulos.png"><img class="size-full wp-image-2569" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/modulos.png" alt="Divisão do sistema em módulos" width="547" height="130" /></a><p class="wp-caption-text">Divisão do sistema em módulos</p></div>
<h3>Classificação em Avatares</h3>
<p>Já que existe uma grande variedade de produtos oferecidos por um supermercado, a primeira etapa é a padronização e classificação destes produtos em classes, chamadas de avatares.</p>
<p>Esse agrupamento é necessário para aumentar a relevância dos resultados obtidos. Com isso desconsideramos informações muito específicas de um produto como peso, volume, marca, entre outros, ou seja, é aquilo que você escreveria em sua lista de compras.</p>
<p>Por exemplo, um produto que estaria especificado no banco de dados do supermercado como &#8220;DETERGENTE YPÊ NEUTRO 500ml LÍQUIDO&#8221; seria classificado como &#8220;DETERGENTE&#8221; simplesmente.</p>
<p>Com a informação do código de barras dos produtos, foi usada a <a href="http://developer.buscape.com/api/">API do Buscapé</a>, que já fornece uma classificação primária de muitos produtos cadastrados em lojas brasileiras e ainda pode fornecer uma descrição mais detalhada do que a que temos inicialmente. Porém, nem todos os produtos puderam ser classificados com esse método e para a classificação dos restantes foram utilizadas técnicas de comparação de strings como <a href="http://en.wikipedia.org/wiki/Longest_common_subsequence">Longest Common Subsequence</a> e <a href="http://en.wikipedia.org/wiki/Levenshtein_distance">distância de Levenshtein</a>.</p>
<h3>Regras de Associação</h3>
<div id="attachment_2568" class="wp-caption aligncenter" style="width: 718px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/11/grafo.png"><img class="size-large wp-image-2568" style="width: 100%" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/grafo-1024x564.png" alt="Grafo de regras de associação" width="708" height="379" /></a><p class="wp-caption-text">Grafo de regras de associação</p></div>
<p>Com os produtos classificados, este módulo tem como objetivo gerar regras de associação entre os avatares, definindo um modelo global de hábitos de compra para o supermercado. Com este modelo é possível definir a correlação de compra entre produtos, como por exemplo, quem compra pão deve também comprar manteiga.</p>
<div id="attachment_2571" class="wp-caption alignleft" style="width: 187px"><a href="http://www.cs.waikato.ac.nz/ml/weka/"><img class="size-full wp-image-2571" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/weka.png" alt="Weka" width="177" height="92" /></a><p class="wp-caption-text">Weka</p></div>
<p>Nesta etapa foram utilizados algoritmos de geração de regras de associação oferecidos pela ferramenta de data mining da Universidade de Waikato, <a href="http://www.cs.waikato.ac.nz/ml/weka/">Weka</a>. Com a definição de certos parâmetros, foi possível obter as regras de associação mais relevantes de acordo com uma série de métricas também oferecidas pelo framework.</p>
<h3>Modelo de Cestas Básicas</h3>
<p>Para poder oferecer descontos personalizados, é preciso também modelar os hábitos individuais de cada cliente. E para isso precisamos primeiramente dividir os produtos entre categorias de preço.</p>
<p>Para a divisão entre categorias de preço foram utilizadas predominantemente técnicas estatísticas e cada produto foi então classificado em uma de três categorias (chamadas de margem): econômica, intermediária e premium.</p>
<p>Com isso, foi definido o modelo de cestas básicas. Para cada cliente do supermercado foi criada uma cesta básica que contém um item descrevendo cada produto (avatar) já comprado. Esses itens possuem três atributos:</p>
<ul>
<li>Nome do avatar</li>
<li>Margem predominante</li>
<li>Índice de recompra</li>
</ul>
<p>O índice de recompra é determinado também através de análise estatística das compras anteriores e define a probabilidade de que este cliente compre o produto novamente numa visita futura. Definimos assim o perfil individual de compras de cada cliente.</p>
<h3>Geração de Cupons</h3>
<p>Definidos todos os modelos, os cupons de desconto são gerados seguindo três políticas, que podem ser aplicadas conforme a conveniência:</p>
<p><strong>Política de fidelização:</strong> é oferecido desconto em um produto que o cliente já costuma comprar com o intuito de fazer com que ele sinta-se privilegiado com um desconto em seu produto favorito.</p>
<p><strong>Política de upgrade de marca:</strong> é oferecido desconto em um produto que o cliente já costuma comprar, porém em uma margem superior com o intuito de fazer com que o cliente experimente outras marcas.</p>
<p><strong>Política de introdução de produto:</strong> com uma análise da cesta básica em conjunto com as regras de associação, é oferecido desconto em produtos que o cliente ainda não costuma comprar, mas que seriam muito atrativos, de acordo com o modelo global.</p>
<div id="attachment_2570" class="wp-caption aligncenter" style="width: 662px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/11/politica_de_introducao.png"><img class="size-full wp-image-2570" src="http://www.bitabit.eng.br/wp-content/uploads/2012/11/politica_de_introducao.png" alt="Política de introdução de novo produto" width="652" height="278" /></a><p class="wp-caption-text">Processo de oferecimento de desconto pela política de introdução de novo produto</p></div>
<p>&#8212;<br />
Essa foi uma breve descrição do nosso projeto de formatura. A monografia completa com a descrição detalhada do projeto e de seu desenvolvimento pode ser baixada <a href='http://www.bitabit.eng.br/wp-content/uploads/2012/11/bom_cupom-v3.5.pdf'>aqui</a>. Para os interessados haverá uma demostração prática na sala C1-30 das 9h00 às 17h00 no Prédio da Engenharia Elétrica na Poli, no dia 10 de dezembro.</p>
<p>Para entrar em contato com os membros do grupo:<br />
<a href="mailto:brunohjoia@usp.br">Bruno Henrique Joia</a><br />
<a href="mailto:gustavorocha@usp.br">Gustavo dos Santos Rocha</a><br />
<a href="mailto:igor.gushiken@usp.br">Igor Yasuo Gushiken</a></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2565&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/11/20/sistema-inteligente-para-geracao-de-promocoes-personalizadas-em-supermercados/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Por que escolhi fazer engenharia de computação?</title>
		<link>http://www.bitabit.eng.br/2012/06/26/por-que-escolhi-fazer-engenharia-de-computacao/</link>
		<comments>http://www.bitabit.eng.br/2012/06/26/por-que-escolhi-fazer-engenharia-de-computacao/#comments</comments>
		<pubDate>Wed, 27 Jun 2012 01:12:41 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Acadêmico]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[ciência da computação]]></category>
		<category><![CDATA[currículo]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[engenharia de computação]]></category>
		<category><![CDATA[poli]]></category>
		<category><![CDATA[resumo]]></category>
		<category><![CDATA[usp]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2548</guid>
		<description><![CDATA[Em um outro post do Bit a Bit, recebi essa pergunta… meio largada , mas bastante pertinente… acho que merece um post para ela mesma… pode sanar a dúvida de outros e gerar discuções interessantes. &#8220;…Procurei um meio de falar com vc que não fosse esse, mas não encontrei. Não sei se você pode me [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/06/minerva.gif"><img class="alignright size-medium wp-image-2549" title="minerva" src="http://www.bitabit.eng.br/wp-content/uploads/2012/06/minerva-199x300.gif" alt="" width="119" height="180" /></a>Em um outro post do Bit a Bit, recebi essa pergunta… meio largada , mas bastante pertinente… acho que merece um post para ela mesma… pode sanar a dúvida de outros e gerar discuções interessantes.</p>
<p><em>&#8220;…Procurei um meio de falar com vc que não fosse esse, mas não encontrei. Não sei se você pode me ajudar, mas não conheço ninguém que cursa ou se formou em Eng da Computação e procurando por informações cai aqui. Estou na dúvida entre cursar Engenharia ou Ciência da computação (respectivamente, POLI e IME) e gostaria de saber mais sobre as diferenças entre os dois cursos na prática e no mercado. Sei que você pode não conhecer sobre o dia-a-dia do curso no IME, mas de qualquer forma acho que qualquer informação de alguém que cursou uma das duas pode ser válido!</em></p>
<p><em>Cursei dois anos de Economia e larguei sabendo que queria computação, mas na hora de optar por uma das duas (ainda mais que ciência, agora, é separado de Engenharia na inscrição da Fuvest) fiquei perdido. Tenho olhado a grade e procurado informações, mas sobre o mercado e a vivência nos cursos não encontrei nada…&#8221;</em></p>
<p><strong>Minha resposta,<em> com algumas alterações e </em>adição de alguns links, foi a seguinte:</strong></p>
<p>Sofri bastante quando decidi cursar algo a ver com computação, com essa mesma dúvida: ciências ou engenharia.</p>
<p>Cheguei a criar uma <a title="Programação e Computação" href="http://www.orkut.com.br/Main#Community?cmm=70567" target="_blank">comunidade no Orkut</a> para me ajudar nessa decisão! Ainda é uma comunidade interessante (apesar de eu não entrar mais, nem cuidar dela) e tem vários tópicos sobre o assunto.</p>
<p>Mas, independente de outras opiniões que vc possa encontrar nesses tópicos, aí vai a minha.</p>
<p>Obviamente que posso falar com muito mais propriedade sobre Engenharia do que sobre Ciências, mas, vamos lá.</p>
<p>Ciências é um curso bem forte caso você queira desenvolver software. Você aprenderá as entranhas, o planejamento, a construção… provavelmente verá várias linguagens de programação e aprenderá profundamente algumas delas. Entenderá como solucionar diversos problemas usando e criando algorítmos e terá uma base matemática bem forte.</p>
<p>Engenharia é um curso mais generalista (na <a title="Poli - USP" href="http://www.poli.usp.br/" target="_blank">Poli</a>, em específico) e você terá uma visão mais macro do computador. Terá várias matérias não relacionadas a computação, exatamente pelo generalismo da Poli.</p>
<p>Aprenderá muita lógica, mas não será nenhum mestre de programação (se depender da faculdade) em uma linguagem específica. Entenderá todas as entranhas de um sistema computacional, desde os componentes básicos até o sistema operacional.</p>
<p>Passeando um pouco por um computador, começamos com <a title="Laboratório de Fundamentos de Engenharia de Computação" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2024&amp;codcur=3121&amp;codhab=10" target="_blank">Laboratório de Fundamentos de Computação</a>, em que programamos um emulador de uma máquina de Von Neuman (é um computador bem básico mas que é a base da computação atual, ignorando a quântica, que mal vimos).</p>
<p>Nessa mesma disciplina, criamos a linguagem de máquina (tipo um assembly, bem básico) dela e escrevemos programas, inicialmente com comandos hexadecimais (0 a 15) e, no fim do curso, com comandos mnemônicos (SUM para somar, por exemplo).</p>
<p>Temos também, <a title="Laboratório Digital I" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2011&amp;codcur=3121&amp;codhab=10" target="_blank">Laboratório Digital</a>, em que construímos os mais diversos “equipamentos” eletrônicos usando apenas componentes primários, como portas booleanas (fazem operações lógicas, tipo E, OU…). Começamos com coisas bem simples e, no fim do curso, montamos um mini computador com 16 operações diferentes.</p>
<p>Em matérias teóricas, começamos com Projeto Lógico Digital <strong>(essa disciplina, com o excepcional  - minha opinião de merda &#8211; professor <a title="Twitter do Professor Edson Fregni" href="https://twitter.com/#!/efregni">Edson Fregni</a>,  parece ter mudado de nome… ou não existe mais &#8211; não encontrei na grade atual)</strong>. Nessa disciplina, entendemos o funcionamento dos componentes básicos e alguns mais avançados, todos necessários para o entendimento de um computador.</p>
<p>A sequência dessa é <a title="Organização de Sistemas Digitais" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2022&amp;codcur=3121&amp;codhab=10" target="_blank">Organização de Sistemas Digitais</a>, em que, a partir dos componentes que conhecemos na anterior, aprendemos a organizar um sistema a fim de montar om computador. Aprendemos um troço chamado VHDL (ou não) que é uma linguagem de construção de sistemas eletrônicos. Seu funcionamento é bem diferente das linguagens de programação normal, pois nela as coisas não são, necessariamente, sequenciais. Várias coisas podem acontecer paralelamente.</p>
<p>Depois disso, temos <a title="Arquitetura de Computadores" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2032&amp;codcur=3121&amp;codhab=10" target="_blank">Arquitetura de Computadores</a> e entendemos mais a fundo como funciona um computador de verdade. Desde o controle de um disco até a apresentação de dados numa tela. Nessa, temos também uma base de assembly (vimos assembly de ARM no nosso ano, mas pode ser de x86, x64 etc.).</p>
<p>Junto de Arquitetura, temos o <a title="Laboratório de Processadores" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2031&amp;codcur=3121&amp;codhab=10" target="_blank">Lab. de Processadores</a>. Nele, programamos em assembly (era de Motorora 6800, mas já deve ter migrado pra ARM). É a prática e programamos desde coisas bem simples até drivers de comunicação entre o computador e um display.</p>
<p>Depois, temos <a title="Sistemas Operacionais" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2042&amp;codcur=3121&amp;codhab=10" target="_blank">Sistemas Operacionais</a> e entendemos como um “programão” controla tudo o que aprendemos nas outras disciplinas. Usamos um sistema operacional didático chamado Minix para entender como um SO funciona. Mexemos nas entranhas dele e vemos como as coisas funcionam (e como são complicadas).</p>
<p>Finalmente, <a title="Linguagens e Compiladores" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2056&amp;codcur=3121&amp;codhab=10" target="_blank">Linguagens e Compiladores</a> nos dá a base para entender como uma linguagem de programação é criada (nós criamos uma) e como um compilador funciona (criamos um que interpretava a nossa linguagem). A matéria mistura bem teoria e prática e é considerada o terror dos terrores, já que envolve diversos conceitos muito teóricos. Nessa matéria você descobre a mágica das expressões regulares.</p>
<p>Agora, falando em Software, temos diversas matérias que vão desde as teorias de desenvolvimento (cascata, circular etc), banco de dados, documentação e o desenvolvimento propriamente dito.</p>
<p>A matéria <a title="Laboratório de Engenharia de Software II" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2044&amp;codcur=3121&amp;codhab=10" target="_blank">Laboratório de Engenharia de Software II</a> é o que você coloca em prática tudo que aprendeu nas outras disciplinas. No nosso ano, fizemos um ERP modularizado e cada grupo de 4 alunos fez uma parte. Tinhamos que escolher a linguagem de programação (cada grupo podia usar a sua), a arquitetura e divisão do software como um todo, a forma de comunicação de cada módulo com os outros (usamos SOAP no nosso grupo), a documentação que seria produzida e a interface do sistema.</p>
<p>Além disso, no fim do curso tivemos algumas disciplinas sobre empreendedorismo (optativa mas imperdível) <strong>(mais uma que, infelizmente, deve ter se aposentado junto do professor Edson Fregni… uma pena)</strong>, <a title="Segurança da Informação" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2055&amp;codcur=3121&amp;codhab=10" target="_blank">segurança</a> (sentido “security”), <a title="Inteligência Artificial" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2059&amp;codcur=3121&amp;codhab=10" target="_blank">inteligência artificial</a> e <a title="Multimídia e Hipermídia" href="https://uspdigital.usp.br/jupiterweb/obterDisciplina?sgldis=PCS2057&amp;codcur=3121&amp;codhab=10" target="_blank">multimídia</a>.</p>
<p>Outras que valem ser citadas são segurança (sentido “safety”), controle (que usa computação em praticamente tudo, hj em dia) e redes de computadores.</p>
<p>Além disso, tem um monte de outras matérias que não tem nada a ver com computação mas que te ajudam a se formar um engenheiro que, na minha visão, é um “resolvedor de problemas”.</p>
<p>Em relação ao mercado, ambos são bem remunerados e com muita vaga disponível pra quem é bom. Escolhi engenharia por me ver com um perfil não tão técnico. Amo tecnologia, amo computação, mas gosto mais do fim do que do meio e acho que a engenharia dá uma visão mais generalista e acaba sendo um caminho mais natural pra quem não quer escovar bits.</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2548&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/06/26/por-que-escolhi-fazer-engenharia-de-computacao/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Conectividade IPv6 em casa – Parte 2</title>
		<link>http://www.bitabit.eng.br/2012/05/13/conectividade-ipv6-em-casa-%e2%80%93-parte-2/</link>
		<comments>http://www.bitabit.eng.br/2012/05/13/conectividade-ipv6-em-casa-%e2%80%93-parte-2/#comments</comments>
		<pubDate>Sun, 13 May 2012 07:53:13 +0000</pubDate>
		<dc:creator>Hernan Martinez, Comp08</dc:creator>
				<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2498</guid>
		<description><![CDATA[Olá pessoal.  Como eu havia prometido (a mais de um ano atrás ) e também porque o dia mundial de lançamento do IPv6 está logo aí (dia 6 de junho) resolvi escrever a segunda parte do tutorial de Conectividade IPv6 em Casa. Ao término deste tutorial, todos os demais dispositivos da sua rede em casa [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1851" src="http://www.bitabit.eng.br/wp-content/uploads/2011/02/ipv6.png" alt="" width="162" height="113" /><br />
Olá pessoal.  Como eu havia prometido (a mais de um ano atrás <img src='http://www.bitabit.eng.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) e também porque o dia mundial de lançamento do <a title="IPv6" href="http://www.worldipv6launch.org/" target="_blank">IPv6</a> está logo aí (dia 6 de junho) resolvi escrever a segunda parte do tutorial de Conectividade IPv6 em Casa.</p>
<p>Ao término deste tutorial, todos os demais dispositivos da sua rede em casa que possuam suporte ao IPv6 conseguirão conectar-se à internet via IPv6.</p>
<p>Após seguir o tutorial da <a title="Parte 1" href="http://www.bitabit.eng.br/2011/02/03/conectividade-ipv6-em-casa-%E2%80%93-parte-1/" target="_blank">Parte 1</a> você já deve  possuir umas das duas configurações abaixo:</p>
<ul>
<li>Com roteador doméstico + NAT:<a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/conf1.png"><img class="aligncenter size-full wp-image-2502" src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/conf1.png" alt="" width="697" height="300" /></a></li>
</ul>
<ul>
<li>Computador direto na internet com IPv4 público Global Unicast:</li>
</ul>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/conf2.png"><img class="aligncenter size-full wp-image-2503" src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/conf2.png" alt="" width="719" height="257" /></a></p>
<h2>Sub rede com ips válidos na internet IPv6</h2>
<p>Até alguns meses atrás, após conseguir o túnel pelo site do projeto SIXXS, era necessário manter o túnel ativo por uma semana para conseguir  realizar o pedido de alocação de subrede . Porém hoje, todos os usuários que possuem um túnel já possuem também um prefixo de subrede /64 alocado.<br />
Faça o seguinte:</p>
<ol>
<li>Entre no site do projeto SIXXS no endereço <a title="SixXS" href="www.sixxs.net">www.sixxs.net</a> e faça o login no link <a href="http://www.sixxs.net/home/">Login for Existing Users</a>.</li>
<li>Na tela de configurações onde são exibidos os dados do usuário e os túneis haverá também uma tabela com as subredes. Verifique se o prefixo de subrede está ativado, caso contrário, clique no ID da subrede e ative o mesmo.</li>
</ol>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/sixxs.png"><img class="aligncenter size-full wp-image-2507" src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/sixxs.png" alt="" width="1090" height="111" /></a></p>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/subnet.png"><img class="aligncenter size-full wp-image-2508" src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/subnet.png" alt="" width="983" height="145" /></a></p>
<p>Pronto. Agora o PoP anuncia a rota na Internet IPv6 dizendo que a sua subrede, por exemplo, 2001:1291:200:8123::/64 é acessível pelo roteador cujo IP é o IPv6 do túnel: 2001:1291:200:123::2.</p>
<p>Anote o <strong>Subnet Prefix</strong> da sua subrede pois será necessário na configuração do computador como roteador.</p>
<h2>Detalhes do IPv6</h2>
<p>Antes de configurar o Windows para funcionar como um roteador IPv6 é interessante conhecer uma parte do funcionamento do IPv6.</p>
<p>O IPv6 não implementa broadcast, logo não existe no IPv6 o equivalente a mandar um pacote para o endereço 192.168.1.255 sendo que todos os computadores da sub rede 192.168.1.xxx irão receber o pacote. No IPv6 a funcionalidade do broadcast é feita com multicast.</p>
<p>Mas, para o multicast funcionar as placas de rede devem possuir um endereço IP já atribuído e realizar o join no IP do grupo multicast. Sendo assim como funciona, por exemplo, o DHCPv6 já que não existe broadcast? E o ARP? Para responder isto basta você verificar que todas as suas placas de rede, mesmo antes de começar o tutorial na Parte 1, já possuíam um endereço IP começando com fe80::.</p>
<p>O IPv6 define que os 64 bits mais significativos são usados  para definir as redes e os 64 bits menos significativos sejam usados para definir os hosts. Isto mesmo, a recomendação é que para cada usuário final seja fornecido um prefixo IP com 64 bits sobrando para usar nos dispositivos em casa, logo na sua casa você poderá ter 2^64 dispositivos com IPs diferentes todos com IPs reais da internet.</p>
<h2>Endereços Link-Local</h2>
<p>Todo dispositivo IPv6 possui um endereço IP automaticamente gerado assim que o driver IPv6 é ativado na interface e este endereço IP sempre pertence à rede<a title="Link-Local Unicast Addresses" href="http://en.wikipedia.org/wiki/IPv6_address#Unicast_Addresses" target="_blank"> fe80::/10</a>.<br />
A geração automática dos 64 bits menos significativos é feita automaticamente. Mas como garantir que não haja conflito? A resposta é se basear em algo que já esteja garantido em não conflitar.  Se você pensou no endereço da camada de enlace você acertou. O MAC-Address é utilizado na geração automática dos 64 bits menos significativos dos IPs automáticos das placas de rede, porém o MAC-Address possui apenas 48 bits e para gerar 64 bits a partir dele segue-se a receita do padrão <a title="IPv6 interface identifiers" href="http://technet.microsoft.com/en-US/library/cc736439(v=ws.10).aspx" target="_blank">EUI-64</a> que insere os 16 bits 0xFFFE no meio dos 48 bits e inverte o 7º bit mais significativo do valor final.</p>
<div id="attachment_2505" class="wp-caption aligncenter" style="width: 683px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/linklocal.png"><img class="size-full wp-image-2505 " src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/linklocal.png" alt="" width="673" height="95" /></a><p class="wp-caption-text">IPv6 Link-Local gerado automaticamente</p></div>
<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/12/Information-Icon1.png"><img class="alignleft size-full wp-image-2527" src="http://www.bitabit.eng.br/wp-content/uploads/2012/12/Information-Icon1.png" alt="" width="24" height="24" /></a> Alguns SOs não seguem o padrão EUI-64 para evitar que possa inferido facilmente o MAC Address da interface.</p>
<p>Assim, se você possui outros dispositivos IPv6 na sua rede local e se já compartilhava arquivos pelos compartilhamento do Windows, você já estava usando IPv6.:</p>
<div id="attachment_2506" class="wp-caption aligncenter" style="width: 639px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/localping.png"><img class="size-full wp-image-2506" src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/localping.png" alt="" width="629" height="239" /></a><p class="wp-caption-text">Ping de resposta de um computador na rede do Windows</p></div>
<h2>Grupo multicast <em>all-nodes</em></h2>
<p>Agora com todas as placas de rede com endereços IPv6 automaticamente gerados todas elas automaticamente assim que são ativadas realizam o join no <a href="http://en.wikipedia.org/wiki/Multicast_address#IPv6" target="_blank">grupo multicast all-nodes</a> que representa “todos os dispositivos da camada de enlace”. A implementação do IPv6 definiu este grupo multicast com o endereço ff02::1. Assim, para realizar o equivalente ao broadcast do IPv4 basta enviar um pacote para o grupo multicast ff02::1.</p>
<p>Porém todos estes endereços IPv6 da subrede fe80::/10 são apenas endereços locais que servem para comunicação na rede local e não são endereços válidos na internet . Para os computadores acessarem a internet é necessário um roteador e que as placas de redes todas possuam um endereço válido. A implementação do IPv6 inclui um mecanismo feito para facilitar a configuração de redes IPv6 simples como é o cenário doméstico e que não utiliza necessariamente o bom e velho DHCP.</p>
<h2>Router Advertisements</h2>
<p>Após ingressar no grupo multicast os dispositivos enviam um pacote ICMPv6 do tipo Router Solicitation para o grupo multicast all-routers, ff02::2, e os roteadores que estiverem configurados respodem com o pacote Router Advertisement que informa o seu endereço IPv6 e qual o prefixo dos 64 bits superiores que a placa de rede deve usar para a autoconfiguração. Este funcionamento difere do DHCP pois não há a necessidade de configurar no roteador um intervalo de IPs.</p>
<p>Com o 64 bits superiores  a placa de rede gera os 64 bits inferiores usando o padrão EUI-64 e registra o endereço IPv6 do roteador que respondeu com o Router Advertisement como gateway para a internet. Assim a placa de rede conterá dois IPs. Um endereço link-local e um endereço real.</p>
<div id="attachment_2504" class="wp-caption aligncenter" style="width: 674px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/05/globalunicast.png"><img class="size-full wp-image-2504" src="http://www.bitabit.eng.br/wp-content/uploads/2012/05/globalunicast.png" alt="" width="664" height="110" /></a><p class="wp-caption-text">IPv6 após a resposta do gateway com Router Advertisement</p></div>
<p>O mecanismo acima descrito é chamado de <a href="http://en.wikipedia.org/wiki/IPv6#Stateless_address_autoconfiguration_.28SLAAC.29" target="_blank">Stateless Address Autoconfiguration</a> em contraste com o uso do DHCPv6 para alocação de endereços IPv6 que é chamado de Stateful Configuration.</p>
<p>Se você quiser aprender mais sobre o IPv6 principalmente com relação ao serviços que usam o grupo multicast Link-Local recomendo o mini curso de IPv6 em flash do site <a title="Curso IPv6" href="http://curso.ipv6.br/elearning/" target="_blank">www.ipv6.br</a>. É extremamante didático e o capítulo <a title="Serviços Básicos do IPv6" href="http://curso.ipv6.br/elearning/ipv6_mod6.htm" target="_blank">Serviços Básicos do IPv6</a> foca nos pacotes ICMPv6 usados, por exemplo, no Router Advertisement e Router Solicitation.</p>
<h2>Configurando o Windows 7/Vista para funcionar como um gateway IPv6</h2>
<p>Basta agora configurar o Windows para encaminhar pacotes e respoder à pacotes Router Solicitation. Tenha em mãos o seu Subnet Prefix e o nome da conexão local usada para comunicar com os outros computadores da rede interna, por exemplo, &#8220;Conexão Local 1&#8243; ou &#8220;Local Connection 2&#8243;.  Abra o Prompt de Comando <strong>como Administrador</strong> e digite :</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px;font-size: 12px">1) netsh interface ipv6 add route [Seu Subnet Prefix]/64 [Nome da conexão local] publish=yes</span></p>
<p>Isto irá definir um endereço IPv6 real com o seu prefixo alocado pelo PoP  à sua placa de rede.</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px;font-size: 12px">2) netsh interface ipv6 set interface [Adaptador virtual do túnel] forwarding=enabled</span></p>
<p>Isto irá ativar o encaminhamento de pacotes no adaptador de rede virtual do túnel 6in4.</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px;font-size: 12px">3) netsh interface ipv6 set interface [Nome da conexão local] forwarding=enabled advertise=enabled</span><br />
Irá ativar o envio de Router Advertisements na rede local.</p>
<p>Exemplo com os dados do início do post:</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px;font-size: 12px">1) netsh interface ipv6 add route 2001:1291:200:8123::/64 &#8220;Conexão local 1&#8243; publish=yes</span></p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px;font-size: 12px">2) netsh interface ipv6 set interface &#8220;sixxs&#8221; forwarding=enabled</span></p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px;font-size: 12px">3) netsh interface ipv6 set interface &#8220;Conexão local 1&#8243; forwarding=enabled advertise=enabled</span></p>
<p>Pronto. Agora todos os dispositivos da sua rede doméstica terão endereços IPv6 reais da internet. Vá em outro computador e tente rodar o comando</p>
<p><code>ping ipv6.google.com</code></p>
<p>ou usando o seu celular via wi-fi na sua rede local navege para o site <a href="http://test-ipv6.com">test-ipv6.com</a>. Os celulares com Android já possuem suporte ao IPv6 via wi-fi.</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2498&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/05/13/conectividade-ipv6-em-casa-%e2%80%93-parte-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ativando o PHP no Mac OS X</title>
		<link>http://www.bitabit.eng.br/2012/04/02/ativando-o-php-no-mac-os-x/</link>
		<comments>http://www.bitabit.eng.br/2012/04/02/ativando-o-php-no-mac-os-x/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 13:00:51 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2482</guid>
		<description><![CDATA[Todo Mac vem de fábrica com Apache e PHP instalados. Porém, de fábrica, você só consegue executar PHP pelo terminal, mas não consegue fazer o PHP cumprir seu objetivo de vida… criar aplicações web. Isso ocorre porque, apesar do seu Mac ter as duas coisas necessárias funcionando, o PHP está desativado no Apache (o que [...]]]></description>
			<content:encoded><![CDATA[<p>Todo Mac vem de fábrica com <a title="Apache HTTP Server" href="http://pt.wikipedia.org/wiki/Apache_HTTP_Server" target="_blank">Apache</a> e <a title="PHP" href="http://pt.wikipedia.org/wiki/PHP" target="_blank">PHP</a> instalados. Porém, de fábrica, você só consegue executar PHP pelo terminal, mas <a title="Moisés não consegue!" href="http://www.youtube.com/watch?v=mpXShHdQGcQ" target="_blank">não consegue</a> fazer o PHP <a title="PHP serve pra fazer site, porra!" href="http://pt.wikipedia.org/wiki/PHP#Principais_caracter.C3.ADsticas" target="_blank">cumprir seu objetivo de vida</a>… criar aplicações web.</p>
<p style="text-align: center;"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/03/apache-osx-php.png"><img class="aligncenter size-full wp-image-2487" title="apache-osx-php" src="http://www.bitabit.eng.br/wp-content/uploads/2012/03/apache-osx-php.png" alt="" width="408" height="121" /></a></p>
<p>Isso ocorre porque, apesar do seu Mac ter as duas coisas necessárias funcionando, o PHP está desativado no Apache (o que me faz questionar o sentido da vida). Reverter isso, porém, é muito simples, basta seguir esses poucos passos.</p>
<h2>Editando o httpd.conf</h2>
<p>O arquivo httpd.conf é o arquivo com as configurações do Apache, todos os tipos de serviço que ele roda e, &#8220;até&#8221; a configuração de ativar o PHP.</p>
<p>Abra o <strong>Terminal</strong> (pelo Spotligh ou similar, ou pelo caminho /Applications/Utilities/Terminal.app) e digite (você pode substituir o <strong>nano</strong> pelo seu editor preferido, como o TextMate) :</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">sudo nano /etc/apache2/httpd.conf</pre></div></div>

<p>Com o arquivo aberto, procure pela seguinte linha (é a 111 se você nunca tocou nesse arquivo e está no Lion):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>111
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">#LoadModule php5_module libexec/apache2/libphp5.so</pre></td></tr></table></div>

<p>Tudo que você precisa fazer agora é <em>&#8220;descomentá-la&#8221;</em>, <strong>removendo a <a title="Sim, chama cerquilha!" href="http://pt.wikipedia.org/wiki/Cerquilha">cerquilha (#)</a></strong> e salvando o arquivo.</p>
<h2>Reiniciando o Apache</h2>
<p>Você pode iniciar/reiniciar o Apache indo nas <strong>Preferências</strong> e, em <strong>Compartilhamento</strong>, e ativando <strong>Compart. Web</strong>.</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_2488" class="wp-caption aligncenter" style="width: 479px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/03/configuracoes-compartilhamento.png"><img class="size-full wp-image-2488 " title="configuracoes-compartilhamento" src="http://www.bitabit.eng.br/wp-content/uploads/2012/03/configuracoes-compartilhamento.png" alt="" width="469" height="397" /></a><p class="wp-caption-text">Se estiver ativado, desative e ative de novo!</p></div>
<h2>Testando</h2>
<p>Para ver se está tudo ok, crie o arquivo &#8220;index.php&#8221; e coloque-o na pasta <strong>Sites</strong> do seu usuário.</p>
<p>Neste arquivo, insira o seguinte texto:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">phpinfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Agora, vá no seu navegador preferido e digite <strong>localhost/~nome_do_seu_usuario</strong>.</p>
<p>O resultado deve ser uma página gigante, com todas as informações da sua instalação PHP, similar à da imagem abaixo.</p>
<div id="attachment_2489" class="wp-caption aligncenter" style="width: 621px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/03/phpinfo.png"><img class="size-full wp-image-2489" title="phpinfo" src="http://www.bitabit.eng.br/wp-content/uploads/2012/03/phpinfo.png" alt="" width="611" height="693" /></a><p class="wp-caption-text">&quot;Pouca&quot; informação…</p></div>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2482&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/04/02/ativando-o-php-no-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Como criei meu primeiro Plugin para WordPress</title>
		<link>http://www.bitabit.eng.br/2012/02/20/como-criei-meu-primeiro-plugin-para-wordpress/</link>
		<comments>http://www.bitabit.eng.br/2012/02/20/como-criei-meu-primeiro-plugin-para-wordpress/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 12:00:14 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Outros]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[like box]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2453</guid>
		<description><![CDATA[Desenvolvendo o blog do Universo, resolvemos colocar um Facebook Like Box para incentivar o acesso à nossa Fan Page do Facebook. A ideia era colocar um Widget (para quem nunca tocou no Admin do WordPress, Widget é tudo que fica aí, do lado direito… os &#8220;artigos populares&#8221;, os &#8220;últimos comentários&#8221; etc.). Fiz uma rápida pesquisa [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/Painel-de-Widgets.png"><img class="alignright size-full wp-image-2455" title="Painel-de-Widgets" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/Painel-de-Widgets.png" alt="" width="124" height="168" /></a>Desenvolvendo o <a title="Blog do Universo" href="http://blog.universo.mobi" target="_blank">blog do Universo</a>, resolvemos colocar um <a title="Facebook Like Box" href="http://developers.facebook.com/docs/reference/plugins/like-box/" target="_blank">Facebook Like Box</a> para incentivar o acesso à nossa Fan Page do Facebook. A ideia era colocar um Widget (para quem nunca tocou no Admin do WordPress, Widget é tudo que fica aí, do lado direito… os &#8220;artigos populares&#8221;, os &#8220;últimos comentários&#8221; etc.).</p>
<p>Fiz uma rápida pesquisa e acabei instalando dois para testar. <a title="Facebook Like Box" href="http://wordpress.org/extend/plugins/facebook-like-box/" target="_blank">Um deles achei decente</a>, com configurações dentro do próprio painel dos Widgets, <a title="RA-FB Like Box" href="http://wordpress.org/extend/plugins/ra-fb-like-box/screenshots/" target="_blank">o outro, não</a> pois as configurações ficavam em um outro lugar e ele criava um novo item no já gigante painel de administração do WordPress. Não bom!</p>
<div id="attachment_2454" class="wp-caption aligncenter" style="width: 175px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/nao-gosto.jpg"><img class="size-full wp-image-2454" title="nao gosto" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/nao-gosto.jpg" alt="" width="165" height="241" /></a><p class="wp-caption-text">Não preciso de mais um painel principal!</p></div>
<p>Decidi então ficar com o primeiro, já que ele me parecia mais dentro dos padrões de uso que estou acostumado.</p>
<h2>Testando o Plugin de base</h2>
<p>Configurei o Plugin, fui ver como estava ficando e encontrei o primeiro problema, o título. O comportamento padrão dos Widgets é não mostrar nada se você escolher não colocar um título. Não foi o caso desse Plugin. Ao não por um título, ele simplesmente veio em branco, mas a barra de título do tema estava lá, estragando tudo.</p>
<p>Pra completar, não conseguia trocar a cor da borda e, pra piorar, como a versão pequena do logo do <a title="Universo" href="http://portal.universo.mobi" target="_blank">Universo</a> tem a forma de gota e o Facebook não curte <a title="PNG" href="pt.wikipedia.org/wiki/PNG" target="_blank">PNG</a>, o fundinho azul deixava o logo com aquela marca branca maldita!</p>
<p>Foi então que comecei a colocar a mão no código, apenas com o objetivo de corrigir esses probleminhas.</p>
<h2>Deixando bonito</h2>
<p>Depois de estudar um pouco o código original, percebi que ele estava usando uma API antiga do Facebook e que, com ela, eu não ia conseguir deixar do jeito que eu queria.</p>
<div id="attachment_2462" class="wp-caption aligncenter" style="width: 270px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/barrinha-maldita-1.png"><img class="size-full wp-image-2462" title="barrinha-maldita-1" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/barrinha-maldita-1.png" alt="" width="260" height="395" /></a><p class="wp-caption-text">Barrinha maldita! Bordinha maldita! Fundinho azul maldito!</p></div>
<p>Comecei a cavocar e alterar o código, fiz um monte de <a title="POG" href="desciclopedia.ws/wiki/Programação_Orientada_a_Gambiarras">POG</a> pra ir vendo como ficava e acabei tendo o resultado que eu esperava, com bordinha arredondada, colado num dos cantos, fundo branco etc.</p>
<div id="attachment_2460" class="wp-caption aligncenter" style="width: 270px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/ai-sim.png"><img class="size-full wp-image-2460" title="ai-sim" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/ai-sim.png" alt="" width="260" height="352" /></a><p class="wp-caption-text">Isso sim é encaixe!</p></div>
<p>Aí, chegou o momento da verdade. O Diabinho gritando: &#8220;Tá ótimo, parte pra próxima!&#8221;. O Anjinho gritando: &#8220;Tá tosco, meu filho! Funciona, mas ninguém nunca mais vai conseguir arrumar isso de maneira fácil. Faz direito!&#8221;. Sim, o Anjinho é prolixo.</p>
<h2>Transformando o POG em Plugin</h2>
<p>Resolvi ouvir o Anjinho e percebi que a coisa era relativamente simples. Um Plugin de WP se resume a basicamente a formulário, Widget e registro junto ao WordPress.</p>
<p>O Widget já estava funcionando via POG, bastava transformar tudo que estava <a title="Hard Coding" href="http://en.wikipedia.org/wiki/Hard_coding" target="_blank">hard coded</a> em utilização de parâmetros.</p>
<p>O registro do Plugin junto ao WordPress já tinha vindo junto do código original… não havia muito a ser feito.</p>
<p>O formulário é que deu um pouco mais de trabalho, já que resolvi que ia usar um outro componente (text area) que não existia no formulário orginal (nele, só tinha text box e check box).</p>
<p>Já que resolvi escrever um post sobre o assunto, vou comentar tudo que foi feito, com um pouquinho de código pra vocês… seus geeks! O código fonte completo pode ser baixado na própria <a title="Styled Facebook Like Box" href="http://wordpress.org/extend/plugins/styled-facebook-like-box/" target="_blank">página do Plugin &#8220;Styled Facebook Like Box&#8221;</a>.</p>
<h1>Metendo a mão no código</h1>
<h2>Parâmetros</h2>
<p>A primeira coisa que comecei a alterar, já que a API nova do Facebook era um pouco diferente, foi a lista de parâmetros utilizados no form.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Widget title:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Facebook'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'widefat'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'The title before your widget'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'profile_url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'FanPage URL:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'http://facebook.com/universo.mobi'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'widefat'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Your Facebook Fan Page URL'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'width'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Width:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'300'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'(Value in px)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'height'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Height:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'550'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'(Value in px)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'border_color'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Border color:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'#000'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'(#E1E4E6, white)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'background_color'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Background color:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'#FFF'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'(#E123F0, blue)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'faces'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Show faces:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'checkbox'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Show profile photos'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'stream'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Show stream:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'checkbox'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span>false<span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Show profile stream'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'header'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Show header:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'checkbox'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span>false<span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'size'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Show default Facebook header'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'style_code'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Style code:'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'type'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'textarea'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'-moz-border-radius: 10px; border-radius: 10px; -webkit-border-radius:10px;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'rows'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'6'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cols'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'31'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'help'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'margin-left: -40px; border-radius: 10px;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Não sei se essa é uma forma normal de declarar os parâmetros de Widgets, mas achei bem interessante relativamente fácil de manejar. Tudo que tive que fazer foi alterar os arrays para os parâmetros que ia usar, acrescentar um novo tipo (textarea, na linha 22) e colocar uns <em>helps</em> decentes.</p>
<h2>O Widget propriamente dito</h2>
<p>O Widget propriamente dito foi o que realmente fez a diferença, já que antes eu não tinha controle de como o ele ficava na tela.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Output the widget in the sidebar</span>
<span style="color: #000000; font-weight: bold;">function</span> styled_facebook_like_box<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profile_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$width</span><span style="color: #339933;">,</span> <span style="color: #000088;">$height</span><span style="color: #339933;">,</span> <span style="color: #000088;">$faces</span><span style="color: #339933;">,</span> <span style="color: #000088;">$border_color</span><span style="color: #339933;">,</span> <span style="color: #000088;">$background_color</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stream</span><span style="color: #339933;">,</span> <span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #000088;">$style_code</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">//Insert Facebook default JavaScript</span>
 	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;div id='fb-root'&gt;&lt;/div&gt;
		&lt;script&gt;(function(d, s, id) {
 		var js, fjs = d.getElementsByTagName(s)[0];
 		if (d.getElementById(id)) return;
 		js = d.createElement(s); js.id = id;
 		js.src = '//connect.facebook.net/pt_BR/all.js#xfbml=1';
		fjs.parentNode.insertBefore(js, fjs);
		}(document, 'script', 'facebook-jssdk'));&lt;/script&gt;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//Insert the styled Like Box</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;div class='fb-like-box' data-href='<span style="color: #006699; font-weight: bold;">$profile_url</span>' data-width='<span style="color: #006699; font-weight: bold;">$width</span>' data-height='<span style="color: #006699; font-weight: bold;">$height</span>' data-show-faces='<span style="color: #006699; font-weight: bold;">$faces</span>' data-border-color='<span style="color: #006699; font-weight: bold;">$border_color</span>' data-stream='<span style="color: #006699; font-weight: bold;">$stream</span>' data-header='<span style="color: #006699; font-weight: bold;">$header</span>' style='background-color:<span style="color: #006699; font-weight: bold;">$background_color</span>;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$style_code</span><span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$style_code</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;'&gt;&lt;/div&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Dessa forma, na linha 27 eu joguei o JavaScript da <a title="Like Box no Facebook" href="http://developers.facebook.com/docs/reference/plugins/like-box/" target="_blank">página de desenvolvimento do Facebook</a> (que eles recomendam que eu jogue no início do Body do HTML, mas eu não tinha ideia de como fazer isso via plugin) e na linha 37 a DIV que será preenchida pelo Facebook.</p>
<p>Repare que na linha 38 eu coloco um campo como opcional, que é exatamente a textarea do formulário. So nada for colocado nela, esse trecho é desconsiderado.</p>
<p>O código do  Plugin tem uma <em>funçãozona</em> com outras dentro. Entre elas, a do formulário e a que chama essa função (styled_facebook_like_box) que mostrei acima.</p>
<p>Aqui, segue o início dela:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> widget_styled_facebook_like_box_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'register_sidebar_widget'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$check_options</span> <span style="color: #339933;">=</span> get_option<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'widget_styled_facebook_like_box'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Show the Widget in the sidebar</span>
	<span style="color: #000000; font-weight: bold;">function</span> widget_styled_facebook_like_box<span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">extract</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> get_option<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'widget_styled_facebook_like_box'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Fill options with default values if value is not set</span>
		<span style="color: #000088;">$item</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$options</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> 
&nbsp;
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$profile_url</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'profile_url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$width</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'width'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$height</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'height'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$faces</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'faces'</span><span style="color: #009900;">&#93;</span> ? <span style="color: #0000ff;">&quot;true&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;false&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$border_color</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'border_color'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$background_color</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'background_color'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$stream</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'stream'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">&quot;true&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;false&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$header</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'header'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">&quot;true&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;false&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$style_code</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'style_code'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">//Remove the Wordpress Title if none was set</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$before_widget</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$before_title</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$title</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$after_title</span><span style="color: #339933;">;</span> 
&nbsp;
 	styled_facebook_like_box<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profile_url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$width</span><span style="color: #339933;">,</span> <span style="color: #000088;">$height</span><span style="color: #339933;">,</span> <span style="color: #000088;">$faces</span><span style="color: #339933;">,</span> <span style="color: #000088;">$border_color</span><span style="color: #339933;">,</span> <span style="color: #000088;">$background_color</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stream</span><span style="color: #339933;">,</span> <span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #000088;">$style_code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$after_widget</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>A função widget_styled_facebook_like_box pega todos os parâmetros preenchidos no formulário e, com eles, chama a styled_facebook_like_box. Tudo que fiz aqui foi alterar os parâmetros que eram usados.</p>
<h2>O formulário</h2>
<p>Esse foi o pedaço que mais deu trabalho, exatamente porque tive a brilhante ideia de usar a textarea. Diferente de tudo que já era usado no formulário que funciona como &#8220;&lt;input type=&#8217;algum tipo…&#8221;, a text area tem uma tag que abre com ela mesma e não com um tipo, assim &#8220;&lt;textarea…&gt;alguma coisa&lt;/textarea&gt;. Então sofri um pouco para conseguir colocá-la na tela.</p>
<p>Achei a maneira de colocar criar o formulário do código que usei de base muito elegante, já que fazia tudo dentro de um <a title="Loops" href="http://en.wikipedia.org/wiki/Control_flow#Loops" target="_blank"><em>loop</em></a>, em vez de fazer na unha, então resolvi manter, apesar da dificuldade maior.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;">// Output the widget form</span>
	<span style="color: #000000; font-weight: bold;">function</span> widget_styled_facebook_like_box_control<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> get_option<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'widget_styled_facebook_like_box'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'styled_facebook_like_box-submit'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$field_name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%s'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'text'</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'textarea'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'checkbox'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			update_option<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'widget_styled_facebook_like_box'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$styled_facebook_like_box_options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'widget_fields'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// print_r($field);</span>
			<span style="color: #000088;">$field_name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%s'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$field_checked</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'text'</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'textarea'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$field_value</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'checkbox'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$field_value</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field_value</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$field_checked</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'checked=&quot;checked&quot;'</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000088;">$jump</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'checkbox'</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'&lt;br /&gt;'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$field_class</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'class'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$field_size</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'class'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">''</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'size=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'size'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$field_help</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'help'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">''</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'&lt;small&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'help'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/small&gt;'</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">//Exclusive for textarea</span>
			<span style="color: #000088;">$field_rows</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rows'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">''</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'rows=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rows'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$field_cols</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cols'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">''</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'cols=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cols'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'textarea'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #990000;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;p class='styled_facebook_like_box_field'&gt;&quot;</span><span style="color: #339933;">.</span>
						<span style="color: #0000ff;">&quot;&lt;label for='<span style="color: #006699; font-weight: bold;">$field_name</span>'&gt;&quot;</span> <span style="color: #339933;">.</span> __<span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'label'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;/label&gt;<span style="color: #006699; font-weight: bold;">$jump</span>&quot;</span><span style="color: #339933;">.</span>
						<span style="color: #0000ff;">&quot;&lt;input id='<span style="color: #006699; font-weight: bold;">$field_name</span>' name='<span style="color: #006699; font-weight: bold;">$field_name</span>' type='&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;' value='<span style="color: #006699; font-weight: bold;">$field_value</span>' class='<span style="color: #006699; font-weight: bold;">$field_class</span>' <span style="color: #006699; font-weight: bold;">$field_size</span> <span style="color: #006699; font-weight: bold;">$field_checked</span> /&gt;&quot;</span><span style="color: #339933;">.</span>
						<span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$field_help</span>&lt;/p&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
				<span style="color: #990000;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;p class='styled_facebook_like_box_field'&gt;&quot;</span><span style="color: #339933;">.</span>
						<span style="color: #0000ff;">&quot;&lt;label for='<span style="color: #006699; font-weight: bold;">$field_name</span>'&gt;&quot;</span> <span style="color: #339933;">.</span> __<span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'label'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;/label&gt;<span style="color: #006699; font-weight: bold;">$jump</span>&quot;</span><span style="color: #339933;">.</span>
						<span style="color: #0000ff;">&quot;&lt;textarea id='<span style="color: #006699; font-weight: bold;">$field_name</span>' name='<span style="color: #006699; font-weight: bold;">$field_name</span>' value='<span style="color: #006699; font-weight: bold;">$field_value</span>' class='<span style="color: #006699; font-weight: bold;">$field_class</span>' <span style="color: #006699; font-weight: bold;">$field_rows</span> <span style="color: #006699; font-weight: bold;">$field_cols</span>&gt;<span style="color: #006699; font-weight: bold;">$field_value</span>&lt;/textarea&gt;&quot;</span><span style="color: #339933;">.</span>
						<span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$field_help</span>&lt;/p&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;input type=&quot;hidden&quot; id=&quot;styled_facebook_like_box-submit&quot; name=&quot;styled_facebook_like_box-submit&quot; value=&quot;1&quot; /&gt;'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Basicamente, tive que acrescentar as linhas 122, 123 e 124, já que são parâmetros de linhas e colunas exclusivos de um textarea (foram definidos lá no começo, na linha 22) e o trecho que inicia na linha 131.</p>
<p>Com isso, o form do widget ficou assim:</p>
<div id="attachment_2475" class="wp-caption aligncenter" style="width: 281px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/form-do-Styled-Facebook-Like-Box.png"><img class="size-full wp-image-2475" title="form do Styled Facebook Like Box" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/form-do-Styled-Facebook-Like-Box.png" alt="" width="271" height="686" /></a><p class="wp-caption-text">Form final do &quot;Styled Facebook Like Box&quot;</p></div>
<p>Ficou exatamente como eu queria, com os campos padrão do Widget do Facebook, mas a textarea com um campo para colocar formatações CSS.</p>
<h2>Registrando junto ao WP</h2>
<p>Finalmente, entra o código para registrar o Plugin junto ao WordPress. Esse código é o que permite que o Plugin seja reconhecido como um Widget.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>141
142
143
144
145
146
147
148
149
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #666666; font-style: italic;">// Register the widget with WordPress</span>
	<span style="color: #000000; font-weight: bold;">function</span> widget_styled_facebook_like_box_register<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Styled Facebook Like Box'</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// Register widget for use</span>
		register_sidebar_widget<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'widget_styled_facebook_like_box'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// Register settings for use, 300x100 pixel form</span>
		register_widget_control<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'widget_styled_facebook_like_box_control'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	widget_styled_facebook_like_box_register<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>As únicas coisas alteradas aqui forams o nome do Plugin e os nomes das funções chamadas.</p>
<h1>Mandando tudo para o wordpress.org</h1>
<p>Depois de ter feito tudo isso e testado bastante, resolvi que esse plugin merecia mais do que ficar preso ao blog do Universo. Dei uma pesquisada e vi que era muito fácil submetê-lo à lista de Plugins do WordPress.</p>
<p>Basta entrar no site do <a title="WordPress.org" href="http://wordpress.org" target="_blank">WordPress</a> (o .org, não o .com) criar um cadastro, preencher o formulário de submissão e fazer <em>upload</em> de um .zip com seu plugin. Seu plugin deve ter alguns comentários que o descrevem, um TXT e ainda é possível colocar <em>screenshots</em>. Isso tudo é usado para a página do seu Plugin e esse texto é apresentado quando seu Plugin é instalado no WordPress.</p>
<p>Após algumas horas, recebi um email dizendo que o Plugin tinha sido aprovado e que eu já podia enviá-lo por <a title="SVN" href="http://pt.wikipedia.org/wiki/Subversion" target="_blank">SVN</a>.</p>
<p>Subi os arquivos e, quase que instantaneamente, lá ele estava. Depois de algum tempo de teste, resolvi corrigir algumas coisas, mudei a versão e subi novamente. O processo de atualização foi totalmente automático e não tive que fazer nada pra que ele mudasse da 1.0 para 1.1 e depois para a 1.2.</p>
<h1>Finalmentes</h1>
<p>Acei todo o processo bastante simples, desde o desenvolvimento (Ok, usei um outro plugin como base, mas, mesmo assim, não é nada de outro mundo)até a submissão.</p>
<p>Foi divertido e empolgante ver o plugin no ar (em 1 dia, já teve 288 instalações) e sendo usado! Me empolguei tanto, que instalei aqui no Bit a Bit!</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2453&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/02/20/como-criei-meu-primeiro-plugin-para-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Auto Pinner é o FaviconizeTab do Chrome!</title>
		<link>http://www.bitabit.eng.br/2012/02/13/auto-pinner-e-o-faviconizetab-do-chrome/</link>
		<comments>http://www.bitabit.eng.br/2012/02/13/auto-pinner-e-o-faviconizetab-do-chrome/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 12:00:52 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Cooperativo]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Turmas]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[pin]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tab]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2435</guid>
		<description><![CDATA[Um dos motivos que me fez demorar de abandonar o FireFox era um pluginzinho (FaviconizeTab) que dava um &#8220;pin&#8221; em abas que eu determinava conforme uma Expressão Regular de URL. Dessa forma, deixava as coisas que acesso o dia todo fixas num canto, ocupando menos espaço que uma aba normal. Procurei muito por isso no [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-2438" title="URL Pinner ideia" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/URL-Pinner-ideia.png" alt="" width="98" height="104" /></p>
<p><span style="font-family: verdana, sans-serif;">Um dos motivos que me fez demorar de abandonar o FireFox era um <em>pluginzinho</em> (<a title="FaviconizeTab" href="https://addons.mozilla.org/pt-pt/firefox/addon/faviconizetab/" target="_blank">FaviconizeTab</a>) que dava um &#8220;pin&#8221; em abas que eu determinava conforme uma Expressão Regular de URL. Dessa forma, deixava as coisas que acesso o dia todo fixas num canto, ocupando menos espaço que uma aba normal.</span></p>
<p><span style="font-family: verdana, sans-serif;">Procurei muito por isso no Chrome e, enfim, achei!!!</span></p>
<p><span style="font-family: verdana, sans-serif;">A extensão se chama <a title="URL Pinner" href="https://chrome.google.com/webstore/detail/lchefjdnocignejmkklgakfmnjhiimjh?utm_source=chrome-ntp-icon" target="_blank">URL Pinner</a> e funciona praticamente da mesma forma que minha velha conhecida. Basta escolher qual RegEx você quer &#8220;Auto Pinar&#8221;, salvar e pronto!</span></p>
<p style="text-align: center;"><span style="font-family: verdana, sans-serif;"> </span></p>
<div id="attachment_2439" class="wp-caption aligncenter" style="width: 484px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/URL-Pinner-Settings.png"><img class="size-full wp-image-2439 " title="URL Pinner Settings" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/URL-Pinner-Settings.png" alt="Configurações do URL Pinner" width="474" height="449" /></a><p class="wp-caption-text">Configurações do URL Pinner</p></div>
<p><span style="font-family: verdana, sans-serif;">Feito isso, basta acessar as URLs especificadas, que elas vão para o cantinho delas! </span><span style="font-family: verdana, sans-serif;">Você pode até dizer a ordem que quer que elas fiquem (não tinha isso no que eu usava no FF) e elas se arranjam!</span></p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_2437" class="wp-caption aligncenter" style="width: 487px"><a href="http://www.bitabit.eng.br/wp-content/uploads/2012/02/URL-Pinner-funcionando.png"><img class="size-full wp-image-2437 " title="URL Pinner funcionando" src="http://www.bitabit.eng.br/wp-content/uploads/2012/02/URL-Pinner-funcionando.png" alt="URL Pinner em ação" width="477" height="152" /></a><p class="wp-caption-text">URL Pinner em ação</p></div>
<p><span style="font-family: verdana, sans-serif;">As teclas de atalho não funcionaram no Mac, mas, como o que mais me importava era realmente a função de automatizar o processo, nem me importei!</span></p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2435&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2012/02/13/auto-pinner-e-o-faviconizetab-do-chrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
