<?xml version="1.0" encoding="UTF-8" ?>
	<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
		<channel>
		
		
			<lastBuildDate>Sun, 05 Sep 2010 04:30:00 -0300</lastBuildDate>
			<title>Jonnas Fonini - Desenvolvimento Web</title>
			<link>http://www.fonini.net</link>
			<description>Regex, Linux, dicas, tutoriais e muito mais</description>
			<language>pt-br</language>
			<copyright>2010 Jonnas Fonini - Todos os direitos reservados.</copyright>
			<atom:link href="http://www.fonini.net/feed.php" rel="self" type="application/rss+xml" />
		            
				<item>
				<title>Rodando aplicativos .NET no Linux</title>
				<description><![CDATA[<p>Hoje precisei fazer algo que não me agrada muito: rodar um software via Wine (Wine Is Not an Emulator). Tratava-se de um software para Windows, mas dá muita preguiça reiniciar a máquina para entrar no Windows (faz meses que não faço isso, somente tenho Windows para rodar o Digital Drums, um software que simula uma bateria musical).</p>
<p>Executei o dito cujo do programa, mas percebi que era necessário o Microsoft .NET Framework 2.0 para o mesmo funcionar. Putz! E agora? Meio a contragosto de instalar tanta porcaria no meu Linux, me obriguei a instalar o .NET.</p>
<p>Siga com atenção os passos abaixo. É necessário ter o Wine instalado na máquina.</p>
<p>Antes de mais nada, faça backup do arquivo system.reg, que se encontra na pasta /home/usuario/.wine/. É importante fazer backup desse arquivo, pois caso a instalação falhe (como aconteceu comigo, por falta de espaço na partição) você precisará remover todas as entradas que contenham a palavra .NET para conseguir instalar o framework (e se arrependerá de ter nascido caso isso aconteça).</p>
<p>Feito isso, digite os comandos abaixo no terminal:</p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget http://www.kegel.com/wine/winetricks<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sh winetricks corefonts vcrun6<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sh winetricks dotnet20<br />
</div></p>
<p>Se tudo correr bem, aparecerá o instalador do .NET, ai é só prosseguir com a instalação em modo gráfico e finalizar o processo.</p>
<p><br />
Abraços e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Thu, 04 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/linux/6-rodando-aplicativos-net-no-linux</guid>
			</item>
			<item>
				<title>Como instalar e configurar o PostgreSQL 8.4 no Ubuntu</title>
				<description><![CDATA[<p>O PostgreSQL é sem dúvidas um dos melhores SGBD's open source da atualidade. Robusto, confiável, agrega várias características que deixam muitos SGBD's pagos no chinelo. Eu, particularmente, uso em todos os projetos aqui na empresa, pois alguns sistemas demandam um rígido controle de consistência dos dados, integridade referencial, etc, e o PostgreSQL me dá essa segurança.</p>
<p>Lembro que sofri bastante nas primeiras vezes que fui instalar e configurar o Postgres no meu Ubuntu, por isso resolvi compartilhar essa experiência que pode ser útil para mais pessoas. Let's work!</p>
<p>No terminal, digite:</p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install postgresql-8.4 postgresql-client-8.4 postgresql-client-common<br />
postgresql-common postgresql-contrib-8.4
</div></p>
<p></p>
<p>Feito isso, vamos configurar o Postgres. Edite o arquivo /etc/postgresql/8.4/main/pg_hba.conf</p>
<p></p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo gedit /etc/postgresql/8.4/main/pg_hba.conf
</div></p>
<p></p>
<p>Essa etapa permitirá a administração para outros usuários e não só para o usuário postgres.<br />
Localize a seguinte linha:<br />
<strong># Database administrative login by UNIX sockets</strong><br />
Agora substitua a linha imediatamente abaixo desta, com o seguinte conteúdo:<br />
<strong>local all all trust</strong></p>
<p>Agora vamos permitir o acesso para seus usuários. Localize a linha<br />
<strong># "local" is for Unix domain socket connections only</strong><br />
e substitua a linha abaixo dela com o seguinte conteúdo:<br />
<strong>local all all trust</strong></p>
<p>Para liberar o acesso remoto procure a seguinte linha:<br />
<strong># IPv4 local connections:</strong><br />
e substitua a linha logo abaixo por esta:<br />
<strong>host all all 0.0.0.0/0 trust</strong></p>
<p>A primeira parte está concluída. Agora edite o arquivo postgresql.conf, que está localizado na mesma pasta:</p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo gedit /etc/postgresql/8.4/main/postgresql.conf
</div></p>
<p></p>
<p>Procure esta linha:<strong><br />
# listen_addresses = 'localhost'<br />
</strong>Descomente a linha e troque 'localhost' por '*', assim qualquer computador poderá acessar o Postgres.<br />
A linha ficará assim:<br />
<strong>listen_addresses = '*'</strong></p>
<p>Agora é só reiniciar o servidor com o seguinte comando:</p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> /etc/init.d/postgresql-8.4 restart
</div></p>
<p></p>
<p>Se você quiser mudar a senha do usuário postgres, digite os seguintes comandos no terminal:</p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo su postgres -c psql postgres<br />
<img src="http://www.fonini.net/images/root.png" alt="" /> ALTER USER postgres WITH PASSWORD 'SuaNovaSenha';<br />
<img src="http://www.fonini.net/images/root.png" alt="" /> \q
</div></p>
<p></p>
<p>Pronto! Seu PostgreSQL está pronto para o uso! Agora você pode instalar um software para gerenciar o banco de dados. Os mais conhecidos são o PgAdmin3 e o phpPgAdmin (necessita instalar Apache + PHP).<br />
Qualquer dúvida comente ou entre em contato.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Fri, 05 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/linux/7-como-instalar-e-configurar-o-postgresql-84-no-ubuntu</guid>
			</item>
			<item>
				<title>Personalizando o Skydome do Compiz no Ubuntu</title>
				<description><![CDATA[<p>Esse tutorial ensina como alterar o Skydome, o fundo do Compiz no Ubuntu. O skydome pode ser visualizado quando você ativa o efeito do cubo 3D, é aquela parte que aparece ao fundo. Você pode inserir uma imagem nesse fundo, como as deste <a href="http://skydomes.blogspot.com/" rel="externo">site</a>, feitas especialmente para esse fim.</p>
<p>Você deve ter o Gerenciador de Configurações do CompizConfig instalado. Se não tiver, instale com o seguinte comando:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install compizconfig-settings-manager
</div>
<p></p>
<p>Após isso, vá em Sistema/Preferências/Gerenciador de Configurações do CompizConfig. Procure por "Cubo da Área de Trabalho" , ative caso não esteja ativo, clique sobre ele, vá até a aba Aparência. Procure por Skydome. Localize a imagem que você vai usar como fundo, marque a opção Skydome e a opção Animar Skydome.</p>
<p>Agora é só girar o cubo (CTRL+ALT+Setas para o lado) e visualizar o seu skydome.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Mon, 22 Feb 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/19-personalizando-o-skydome-do-compiz-no-ubuntu</guid>
			</item>
			<item>
				<title>Problema do ícone de atualizações no Ubuntu 9.10</title>
				<description><![CDATA[<p>Notei há um tempo atrás que o ícone que avisa quando existem atualizações disponíveis para o Ubuntu nunca mais tinha dado as caras na minha máquina. Após uma rápida procura na internet encontrei a solução para o problema. Digite os comando abaixo no terminal:</p>
<p></p>

<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" />gconftool -s --type bool /apps/update-notifier/auto_launch false<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" />killall update-notifier<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" />update-notifier &amp;<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" />disown
</div>
<p></p>
<p>Pronto. Agora o sistema irá avisar novamente quando houverem atualizações disponíveis.</p>
]]></description>
				<pubDate>Tue, 02 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/linux/3-problema-do-icone-de-atualizacoes-no-ubuntu-910</guid>
			</item>
			<item>
				<title>Adicionando o atributo "rel" ao CKEditor 3</title>
				<description><![CDATA[<p>Como todo mundo deve saber, o atributo "target" não valida no XHTML Strict. A solução que eu uso para contornar este problema é baseada em jQuery. Se o link possuir o atributo rel="externo", o mesmo abrirá em uma nova janela. Porém, o editor que eu uso no painel de controle deste site (<a href="http://www.ckeditor.com" rel="externo">CKEditor 3</a>) não permite adicionar o atributo rel aos links, somente editando o código HTML a mão. Se tiver uns 20 links no post a tarefa se torna um saco.</p>
<p>Apesar da falta de café de hoje a tarde aqui na empresa (devidamente solucionada com uma pequena gambiarra na cafeteira), resolvi modificar o plugin responsável por inserir links no CKEditor e estou compartilhando com quem se interessar. Basta extrair o arquivo na pasta <strong>plugins/link/dialogs</strong> e usar.</p>
<p>Como não tinha tempo suficiente para adicionar uma funcionalidade a mais, sobrescrevi uma existente (lang), já que não uso esse atributo. :P</p>
<p><br />
Arquivo: <a href="http://www.fonini.net/labs/mod_link_ckeditor.zip">mod_link_ckeditor.zip</a></p>
<p>Abraço e até a próxima</p>]]></description>
				<pubDate>Thu, 11 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/14-adicionando-o-atributo-rel-ao-ckeditor-3</guid>
			</item>
			<item>
				<title>Transformando BBCode em XHTML com PHP e Regex</title>
				<description><![CDATA[<p>Atendendo a sugestão do amigo <a href="http://twitter.com/Eldius" rel="externo">@Eldius</a>, da galera do <a href="http://search.twitter.com/search?q=%23soudev" rel="externo">#soudev</a> do <a href="http://twitter.com/fonini" rel="externo">Twitter</a>, criei uma função que converte texto em BBCode para XHTML, usando PHP e Regex. A função não é lá das mais elegantes, mas cumpre o prometido, lembrando que o BBCode deve estar escrito corretamente para que ela funcione.</p>
<pre class="brush: php">
function bbcode($str){
	$str = preg_replace("@[b](.+?)[/b]@i", "<strong>$1</strong>", $str);
	$str = preg_replace("@[i](.+?)[/i]@i", "<em>$1</em>", $str);
	$str = preg_replace("@[u](.+?)[/u]@i", "<span style="text-decoration:underline">$1</span>", $str);
	$str = preg_replace("@[s](.+?)[/s]@i", "<span style="text-decoration:line-through">$1</span>", $str);
	$str = preg_replace("@[img](.+?)[/img]@i", "<img src="$1" alt="" />", $str);
	$str = preg_replace("@[url](.+?)[/url]@i", "<a href="$1">$1</a>", $str);
	$str = preg_replace("@[url=(.+?)](.+?)[/url]@i", "<a href="$1">$2</a>", $str);
	$str = preg_replace("@[email](.+?)[/email]@i", "<a href="mailto:$1">$1</a>", $str);
	$str = preg_replace("@[email=(.+?)](.+?)[/email]@i", "<a href="mailto:$1">$2</a>", $str);
	$str = preg_replace("@[size=(.+?)](.+?)[/size]@i", "<span style="font-size:$1px">$2</span>", $str);
	$str = preg_replace("@[color=(.+?)](.+?)[/color]@i", "<span style="color:$1">$2</span>", $str);
	$str = preg_replace("@[*(?:s*)]s*([^[]*)@i", "<li>$1</li>", $str);
	$str = preg_replace("@[list(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ul>$1</ul>", $str);
	$str = preg_replace("@[list=1(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol>$1</ol>", $str);
	$str = preg_replace("@[list=a(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:lower-alpha">$1</ol>", $str);
	$str = preg_replace("@[list=i(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:lower-roman">$1</ol>" ,$str);
	$str = preg_replace("@[list=I(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:upper-roman">$1</ol>" ,$str);
	$str = preg_replace("@[list=A(?:s*)]((.|n)*?)[/list(?:s*)]@", "<ol style="list-style-type:upper-alpha">$1</ol>" ,$str);
	$str = preg_replace("@[quote=(.+?)](.+?)[/quote]@i", "$1 disse: <blockquote>$2</blockquote>", $str);
	$str = preg_replace("@[quote](.+?)[/quote]@i", "Citação: <blockquote>$1</blockquote>", $str);
	$str = str_replace("n", '<br />', $str);
	$str = preg_replace("@[align=(.+?)](.+?)[/align]@i", "<div style="text-align:$1">$2</div>", $str);
	$str = preg_replace("@[center](.+?)[/center]@i", "<div style="text-align:center">$1</div>", $str);
	$str = preg_replace("@[code](.+?)[/code]@i", "<pre>$1</pre>", $str);
	$str = str_replace("[br]", "<br />", $str);
	return($str);
}

	$string = '[b]Texto em negrito[/b][br][quote=Jonnas]Isso é BBCode[/quote] [br] [url=http://www.php.net][img]http://static.php.net/www.php.net/http://www.fonini.net/images/php.gif[/img][/url]';
	echo bbcode($string);
</pre>
<p></p>
<p>Essa função engloba os BBCodes mais conhecidos. Segue a lista abaixo:</p>
<p><strong>[b]</strong> = Negrito<br />
<strong>[i]</strong> = Itálico<br />
<strong>[u]</strong> = Sublinhado<br />
<strong>[s]</strong> = Texto riscado<br />
<strong>[img]</strong> = Imagem<br />
<strong>[url]</strong> = Link<br />
<strong>[email]</strong> = E-mail<br />
<strong>[size]</strong> = Tamanho do texto<br />
<strong>[color]</strong> = Cor do texto<br />
<strong>[list=a]</strong>, <strong>[list=1]</strong>, etc = Listas<br />
<strong>[quote]</strong> = Citação<br />
<strong>[align]</strong> = Alinhamento do texto<br />
<strong>[center]</strong> = Centraliza o texto<br />
<strong>[code]</strong> = Código<br />
<strong>[br]</strong> = Quebra de página</p>
<p>Mais informações sobre BBCode podem ser encontradas <a href="http://www.phpbb.com/community/faq.php?mode=bbcode" rel="externo">aqui</a> e <a href="http://pt.wikipedia.org/wiki/BBCode" rel="externo">aqui</a>.</p>
<p>Esse código também pode ser modificado facilmente para ser usado em conjunto com o <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" rel="externo">SyntaxHighlighter</a>, um script para colorir o código, tornando a visualização mais amigável. Para isso, basta substituir a linha 25 por esta:</p>
<p></p>
<pre class="brush: php">
	$str = preg_replace("@[code=(.+?)](.+?)[/code]@i", "<pre class="brush: $1">$2</pre>", $str);
</pre>
<p></p>
<p>Aí é usar de acordo com a nomenclatura do próprio script. Um código em PHP ficaria assim:</p>
<p>[code=php]$nome = "Jonnas";[/code]</p>
<p>Caso você encontre algum bug ou tem alguma sugestão, não deixe de entrar em contato.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Wed, 10 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/regex/11-transformando-bbcode-em-xhtml-com-php-e-regex</guid>
			</item>
			<item>
				<title>Repositórios úteis para Ubuntu</title>
				<description><![CDATA[<p>Reuni alguns repositórios muito úteis para o Ubuntu, a maioria deles para Ubuntu 9.10. Todo o processo de adicionar os repositórios é feito pelo terminal (muito mais prático). Segue a lista:</p>
<p>
<span style="font-size: 14px;"><strong>Webmin (administração de servidores baseados em Unix com interface web)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://download.webmin.com/download/repository sarge contrib\" >> /etc/apt/sources.list"
</div>
<p></p><p></p>
<p><span style="font-size: 14px;"><strong><br />
Emesene (mensageiro instantâneo)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://apt.emesene.org/ ./\" >> /etc/apt/sources.list"
</div>
<p></p><p></p>
<p><span style="font-size: 14px;"><strong><br />
QBitTorrent (cliente BitTorrent)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ppa.launchpad.net/hydr0g3n/ppa/ubuntu jaunty main\" >> /etc/apt/sources.list"
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 47B4D1C4
<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get update &amp;&amp; sudo apt-get install qbittorrent
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
Opera (navegador)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://deb.opera.com/opera-beta/ stable non-free\" >> /etc/apt/sources.list"
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo wget -O - http://deb.opera.com/archive.key | sudo apt-key add -
</div>
<p><span style="font-size: 14px;"><strong><br />
XMMS (clone do Winamp para Linux)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://www.pvv.ntnu.no/~knuta/xmms/karmic ./\" >> /etc/apt/sources.list"
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
Cafuego (SecondLife, firmwares Broadcom, Inkscape...)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget -q -O - http://ubuntu.cafuego.net/cafuego.gpg | sudo apt-key add -<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ubuntu.cafuego.net/ jaunty-cafuego all\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Ubuntu Satanic (versão satânica do Ubuntu, inútil, só achei interessante)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget -q http://ubuntusatanic.org/ubuntu-se-key.gpg -O- | sudo apt-key add -<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ubuntusatanic.org/hell karmic main\" >> /etc/apt/sources.list"
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
VirtualBox (máquina virtual)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://download.virtualbox.org/virtualbox/debian karmic non-free\" >> /etc/apt/sources.list"
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-key add sun_vbox.asc
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
DropBox (backup remoto)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://linux.dropbox.com/ubuntu karmic main\" >> /etc/apt/sources.list"<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gpg --keyserver pgp.mit.edu --recv-keys 3565780E
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
Wicd (gerenciador de rede)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://apt.wicd.net jaunty extras\" >> /etc/apt/sources.list"<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget -q http://apt.wicd.net/wicd.gpg -O- | sudo apt-key add -
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
PlayOnLinux (instalador de jogos e softwares Windows para Linux)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo wget http://deb.playonlinux.com/playonlinux_karmic.list -O /etc/apt/sources.list.d/playonlinux.list
</div>
<p>
<span style="font-size: 14px;"><strong><br />
UbuntuGames (diversos games)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://archive.ubuntugames.org ubuntugames main\" >> /etc/apt/sources.list"
</div>
<p></p>
<span style="font-size: 14px;"><strong><br />
CompizFusion (efeitos gráficos)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ppa.launchpad.net/compiz/ppa/ubuntu karmic main multiverse restricted universe\" >> /etc/apt/sources.list"
</div>
<p>	<span style="font-size: 14px;"><strong><br />
Gwibber (cliente de redes sociais)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ppa.launchpad.net/gwibber-daily/ppa/ubuntu karmic main universe restricted multiverse\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
aMSN (mensageiro instantâneo)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ppa.launchpad.net/amsn-daily/ppa/ubuntu karmic main\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Gnome-Do (similar ao Katapult do KDE)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ppa.launchpad.net/do-core/ppa/ubuntu karmic main\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Ubuntu Tweak (diversos ajustes não disponíveis na interface gráfica)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://ppa.launchpad.net/tualatrix/ppa/ubuntu karmic main multiverse restricted universe\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Medibuntu (Multimídia)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo wget --output-document=/etc/apt/sources.list.d/medibuntu.list http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list &amp;&amp; sudo apt-get --quiet update &amp;&amp; sudo apt-get --yes --quiet --allow-unauthenticated install medibuntu-keyring &amp;&amp; sudo apt-get --quiet update
</div>
<p><span style="font-size: 14px;"><strong><br />
SwitFox (clone do Firefox)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://getswiftfox.com/builds/debian unstable non-free\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Last.fm (scrobbler da Last.fm)<br />
</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget http://apt.last.fm/last.fm.repo.gpg -O- | sudo apt-key add -<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://apt.last.fm/ debian stable\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
aMule (cliente P2P)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gpg --keyserver wwwkeys.eu.pgp.net --recv 50D0AE60
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gpg --armor --export 50D0AE60 | sudo apt-key add -
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://www.vollstreckernet.de/debian/ stable amule wx\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Skype (mensageiro)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://download.skype.com/linux/repos/debian/ stable non-free\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Google</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://dl.google.com/linux/deb/ stable non-free\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
Wine (roda aplicativos Windows no Linux)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gpg --keyserver subkeys.pgp.net --recv 387EE263
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gpg --export --armor 387EE263 | sudo apt-key add -
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo sh -c "echo \"deb http://wine.budgetdedicated.com/apt karmic main\" >> /etc/apt/sources.list"
</div>
<p><span style="font-size: 14px;"><strong><br />
VLC (reproduz arquivos multimídia)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo add-apt-repository ppa:c-korn/vlc
</div>
<p></p>]]></description>
				<pubDate>Tue, 23 Feb 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/20-repositorios-uteis-para-ubuntu</guid>
			</item>
			<item>
				<title>A criação do universo (segundo a informática) </title>
				<description><![CDATA[<p>
	No princípio, Deus criou o Bit e o Byte. E deles criou a Palavra.<br />
	<br />
	E havia dois Bytes na Palavra, e nada mais existia. E Deus separou o Um do Zero; e ele viu que isso era bom.<br />
	<br />
	E Deus disse: - Que existam os Dados, e assim aconteceu. E Deus disse: - Deixe que os dados vão para seus devidos lugares. E ele criou os disquetes, discos rígidos e os discos compactos.<br />
	<br />
	E Deus disse: - Que sejam feitos os computadores, pois não havia um local para colocar os disquetes e discos rígidos e os discos compactos. Assim, Deus criou os computadores e os chamou de Hardware.<br />
	<br />
	E não havia nenhum software ainda. Mas Deus criou os programas; pequenos e grandes ... E disse-lhes - Ide e multiplicai-vos e preencham toda a memória.<br />
	<br />
	E Deus disse: - Vou criar o Programador; E o programador irá fazer novos programas e governar os computadores e programas e dados.<br />
	<br />
	E Deus criou o Programador, e colocou-o no Data Center, E Deus mostrou os manuais ao Programador e disse que você pode usar todos os volumes e subvolumes mas NÃO USE o Windows.<br />
	<br />
	E Deus disse: - Não é bom para o programador ficar sozinho. Ele pegou um osso do corpo do programador e criou uma criatura que iria olhar para o Programador, e admirar o Programador, e amar as coisas do programador faz; E chamou Deus à criatura: o Usuário.<br />
	<br />
	E o Programador e o Usuário foram deixados sob o DOS nú e que era bom.<br />
	<br />
	Mas Bill era mais esperto do que todas as outras criaturas de Deus. E Bill disse ao Usuário: - Deus realmente lhe disse para não executar nenhum programa?<br />
	<br />
	E o usuário respondeu - Deus nos disse que podemos usar cada programa e dado, mas nos disse para não executar o Windows ou vamos morrer.<br />
	<br />
	E Bill disse ao Usuário: - Como você pode falar sobre algo que você nem conhece? No momento em que você usar o Windows você vai se tornar igual a Deus. Você será capaz de criar qualquer coisa que você gosta com um simples clique do mouse.<br />
	<br />
	E o Usuário viu que os frutos do Windows eram mais bonitos e fáceis de usar. E o Usuário viu que todo o conhecimento era inútil - já que o Windows poderia substituí-lo.<br />
	<br />
	Então o Usuário instalou o Windows em seu computador, e disse ao Programador que era bom.<br />
	<br />
	E o Programador imediatamente começou a procurar por novos drivers. E Deus perguntou-lhe - O que você está procurando? E o Programador respondeu: - Estou à procura de novos drivers, pois eu não posso encontrá-los no DOS. E Deus disse: - Quem disse que você precisa de drivers? Você usou o Windows? E o Programador disse - Foi Bill que disse-nos para fazer isso!<br />
	<br />
	E Deus disse ao Bill - Por causa do que você fez, você será odiado por todas as criaturas. E o Usuário estará sempre descontente com você. E você deverá sempre vender o Windows.<br />
	<br />
	E Deus disse ao Usuário - Por causa do que você fez, o Windows irá decepcioná-lo e devorar todos os seus recursos, e você terá que usar programas péssimos, e você sempre precisarará da ajuda dos Programadores.<br />
	<br />
	E Deus disse ao Programador - Por conta de você ter ouvido o usuário, você nunca será feliz. Todos os programas terão erros e você terá que corrigi-los e corrigi-los até o fim dos tempos.<br />
	<br />
	E Deus expulsou-os do Data Center e trancou a porta, protegendo-a com uma senha.<br />
	<br />
	FALHA GERAL DE SEGURANÇA</p>
<p>
	Vi o texto original e muitos outros <a href="http://www.workjoke.com/programmers-jokes.html" rel="externo">aqui</a>.</p>
]]></description>
				<pubDate>Tue, 23 Feb 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/21-a-criacao-do-universo-segundo-a-informatica-</guid>
			</item>
			<item>
				<title>Plugin Ajax Save para CKEditor 3</title>
				<description><![CDATA[<p>Eu uso o CKEditor num gerador CRUD que eu desenvolvi em PHP, para gerar o painel de controle do site automaticamente através da modelagem do banco de dados. Ontem um cliente pediu um botão no CKEditor para salvar o texto sem dar refresh na página. Não encontrei nada pronto na Internet e resolvi desenvolver este plugin, o Ajax Save. O plugin adiciona um botão similar ao botão Salvar já existente no CKEditor, porém envia os dados via AJAX, ao contrário do primeiro, que somente submete o formulário onde o editor está contido. Let's work!</p>
<p>Baixe o <a href="http://ckeditor.com/download" rel="externo">CKEditor</a> e extraia numa pasta de sua preferência.<br />
Baixe o <a href="http://jquery.com" rel="externo">jQuery</a>.</p>
<p>Dentro da pasta "plugins" do CKEditor crie uma pasta chamada "ajaxsave". Dentro da pasta "ajaxsave", crie um arquivo chamado "plugin.js", com o seguinte conteúdo:</p>
<p></p>
<pre class="brush: js">
(function(){
	var saveCmd ={
		modes : { wysiwyg:1, source:1 },
		exec : function( editor ){
      		var $form = editor.element.$.form;
			if ( $form ){
				try{
					editor.updateElement();
					content = editor.getData();

					jQuery.ajax({
						type: "POST",
						url: "ckeditor/plugins/ajaxsave/save.php",
						data: "texto=" + content,
						success: function(msg){
						 	alert( "Dados recebidos: " + msg );
						}
					});
				} 
				catch ( e ) {
            		//alert(e);
				}
			}
		}
	}

	var pluginName = 'ajaxsave';
	CKEDITOR.plugins.add( pluginName,{
		init : function( editor ){
			var command = editor.addCommand( pluginName, saveCmd );
 			command.modes = { wysiwyg : !!( editor.element.$.form ) };
 			editor.ui.addButton( 'AjaxSave',{
				label : editor.lang.save,
				command : pluginName,
				icon: "plugins/ajaxsave/ajaxsave.png"
			});
		}
	});
})();
</pre>
<p></p>
<p>Dentro desta mesma pasta ficará a página PHP que receberá os dados. Então, crie um arquivo chamado "save.php", com o seguinte conteúdo:</p>
<p></p>
<pre class="brush: php">
echo $_POST['texto'];
</pre>
<p></p>
<p>Nesta mesma pasta deve ter a imagem que será usada no botão. Eu coloquei essa aqui: <img src="http://www.fonini.net/images/ajaxsave.png" alt="" />. O nome dela deve ser "ajaxsave.png".</p>
<p>O plugin já está instalado. Agora vamos configurar o CKEditor para utilizar o plugin. Na pasta raíz do CKEditor existe um arquivo chamado "config.js". Este arquivo é utilizado para definir as configurações globais do CKEditor. O conteúdo do meu está assim:</p>
<p>
<pre class="brush: js">
CKEDITOR.editorConfig = function( config ){
	config.extraPlugins = "ajaxsave";
	config.toolbar = [
		['AjaxSave', 'Preview'],
		['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Print', 'SpellChecker'],
		['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
		['Bold','Italic','Underline','Strike','-','Subscript'],
		['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
		['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
		['Link','Unlink','Anchor'],
		['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar'],
		['Font','FontSize'],
		['TextColor','BGColor', '-', 'Source']
	];
};
</pre>
<p></p>
<p>Agora é só testar. Crie um arquivo chamado "index.html" dentro da pasta do CKEditor com o seguinte conteúdo:</p>
<p></p>
<pre class="brush: xml">
<body>
<head>
<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
</head>
<body>

<form method="post">
	<textarea name="editor"></textarea>

	<script type="text/javascript">
		CKEDITOR.replace('editor');
	</script>
</form>

</body>
</html>
</pre>
<p></p>
<p>Nesta página tem um <a href="http://www.fonini.net/labs/ckeditor" rel="externo">demo</a> da solução.<br /></p>
<p>Abra o index.html, digite alguma coisa no editor e clique no botão do canto esquerdo superior. Um alerta deverá ser mostrado, com o conteúdo enviado via AJAX.</p>
<p><strong>Download dos arquivos</strong></p>
<p><a href="http://www.fonini.net/labs/AjaxSave.plugin.zip">Plugin Ajax Save</a><br /></p>
<p><a href="http://www.fonini.net/labs/ckeditor.zip">CKEditor, com jQuery 1.4.2 e plugin já integrado</a><br /></p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Wed, 25 Feb 2009 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/23-plugin-ajax-save-para-ckeditor-3</guid>
			</item>
			<item>
				<title>Integração do CKEditor com o CKFinder (upload de imagens)</title>
				<description><![CDATA[<p>Na minha "carreira" de desenvolvedor já testei 3 editores WYSWYG (What You See, What You Get) baseados em JavaScript. O primeiro foi o NicEdit, extremamente leve, mas os clientes reclamavam da falta de recursos. Mudei para o TinyMCE. Novamente encontraram problemas, desta vez foi com as imagens. Segundo eles. era muito complicado inserir uma imagem. Finalmente mudei para o CKEditor. Pesado, trocentos arquivos, mas com a tão sonhada funcionalidade de upload de imagens, quando integrado com o CKFinder. O CKFinder permite que você faça upload de imagens e outros arquivos, inserindo-os no CKEditor. Também fornece uma página, onde é possível navegar entre os arquivos escolhidos e alterar várias opções.</p>
<p>O objetivo deste post é ensinar como integrar o CKEditor com o CKFinder.</p>
<p>Baixe o <a href="http://www.ckeditor.com" rel="externo">CKEditor</a> e extraia em alguma pasta.<br />
Baixe o <a href="http://www.ckfinder.com" rel="externo">CKFinder</a> e extraia dentro da pasta que você extraiu o CKEditor. Eu estou usando a versão para PHP</p>
<p>Agora, vá até a pasta do CKFinder e edite o arquivo "config.php". A primeira função do arquivo, CheckAuthentication(), deve retornar true para que você possa acessar o painel do CKFinder. Porém, se ela sempre retornar true, qualquer um poderá acessar e modificar suas imagens. A solução, no meu caso, foi usar a própria sessão do usuário para autenticar no CKFinder. Mais ou menos assim:</p>
<p></p>
<pre class="brush: php">
function CheckAuthentication() {
	if (!empty($_SESSION['usuario']))
		return true;
	return false;
}
</pre>
<p></p>
<p>Para anexar o CKFinder com o CKEditor temos duas opções: no próprio arquivo (HTML, PHP) que vai conter o editor ou no arquivo de configuração do CKEditor, config.js.</p>
<p>No caso de configurar no próprio código:</p>
<p></p>
<pre class="brush: js">
CKEDITOR.replace( 'editor',{
	filebrowserBrowseUrl : 'ckeditor/ckfinder/ckfinder.html',
	filebrowserImageBrowseUrl : 'ckeditor/ckfinder/ckfinder.html?type=Images',
	filebrowserFlashBrowseUrl : 'ckeditor/ckfinder/ckfinder.html?type=Flash',
	filebrowserUploadUrl : 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&amp;type=Files',
	filebrowserImageUploadUrl : 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&amp;type=Images',
	filebrowserFlashUploadUrl : 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&amp;type=Flash'
}
;);
</pre>
<p></p>
<p>Usando o config.js da pasta do CKEditor:</p>
<p></p>
<pre class="brush: js">
CKEDITOR.editorConfig = function( config ){
	config.filebrowserBrowseUrl = 'ckeditor/ckfinder/ckfinder.html',
	config.filebrowserImageBrowseUrl = 'ckeditor/ckfinder/ckfinder.html?type=Images',
	config.filebrowserFlashBrowseUrl = 'ckeditor/ckfinder/ckfinder.html?type=Flash',
	config.filebrowserUploadUrl = 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&amp;type=Files',
	config.filebrowserImageUploadUrl = 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&amp;type=Images',
	config.filebrowserFlashUploadUrl = 'ckeditor/ckfinder/core/connector/php/connector.php?command=QuickUpload&amp;type=Flash'
};
</pre>
<p></p>
<p>O sistema está pronto. Na configuração padrão, o CKFinder armazena as imagens do upload na raíz do servidor, pasta ckfinder/userfiles/. Essa pasta deve ter permissão 777 para que funcione corretamente. Esse caminho pode ser mudado no arquivo "config.php" da pasta do CKFinder.</p>
<p>Após a instalação, o CKFinder fica disponível no botão "Figura" do CKEditor. Clicando nesse botão e indo até a aba "Submeter", você poderá realizar o upload das suas imagens. Clicando em "Localizar no servidor", você poderá usar as imagens já upadas.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Fri, 26 Feb 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/24-integracao-do-ckeditor-com-o-ckfinder-upload-de-imagens</guid>
			</item>
			<item>
				<title>Truncar texto com PHP sem bagunçar tags HTML</title>
				<description><![CDATA[<p>Um dos grandes problemas de guardar HTML no banco de dados é na hora de mostrar. Pode ser que você
queira retornar apenas uma quantidade X de caracteres. Ai surge o grande problema. Pode ser que
algumas tags fiquem pela metade, atrapalhando bastante a visualização do código.
Tá, mas e, por quê eu não tiro as tags antes de cortar a string?
É uma solução, mas existem casos (como o desse site) que é necessário mostrar o HTML também.
Nesse caso podemos usar a função abaixo, que retorna a quantidade de caracteres que você quer,
cuidando para não cortar nenhuma tag HTML pela metade. Segue o código:
 </p>
<pre class="brush: php">
function truncar($text, $length = 100, $ending = '...', $exact = false, $considerHtml = true) {
	if ($considerHtml) {
		if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
			return $text;
		}

		preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
		$total_length = strlen($ending);
		$open_tags = array();
		$truncate = '';
		foreach ($lines as $line_matchings) {
			if (!empty($line_matchings[1])) {
				if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
				} else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
					$pos = array_search($tag_matchings[1], $open_tags);
					if ($pos !== false) {
					unset($open_tags[$pos]);
					}
				} else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
					array_unshift($open_tags, strtolower($tag_matchings[1]));
				}
				$truncate .= $line_matchings[1];
			}
			$content_length = strlen(preg_replace('/&amp;[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
			if ($total_length+$content_length > $length) {
				$left = $length - $total_length;
				$entities_length = 0;
				if (preg_match_all('/&amp;[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
					foreach ($entities[0] as $entity) {
						if ($entity[1]+1-$entities_length <= $left) {
							$left--;
							$entities_length += strlen($entity[0]);
						} else {
							break;
						}
					}
				}
				$truncate .= substr($line_matchings[2], 0, $left+$entities_length);
				break;
			} else {
				$truncate .= $line_matchings[2];
				$total_length += $content_length;
			}
			if($total_length >= $length) {
				break;
			}
		}
	} else {
		if (strlen($text) <= $length) {
			return $text;
		} else {
			$truncate = substr($text, 0, $length - strlen($ending));
		}
	}
	if (!$exact) {
		$spacepos = strrpos($truncate, ' ');
		if (isset($spacepos)) {
			$truncate = substr($truncate, 0, $spacepos);
		}
	}
	$truncate .= $ending;
	if($considerHtml) {
		foreach ($open_tags as $tag) {
			$truncate .= '</' . $tag . '>';
		}
	}
	return $truncate;
}
</pre>

Como usar a função:


<pre class="brush: php">

echo truncar('<span>jo<strong>nn</strong>as</span>', 6, '...', false, true); // imprime <span>jo<strong>nn</strong>as</span><br />...
</pre>
]]></description>
				<pubDate>Fri, 29 Jan 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/2-truncar-texto-com-php-sem-baguncar-tags-html</guid>
			</item>
			<item>
				<title>Usando SQLite com Java</title>
				<description><![CDATA[<p>Por essa nem eu esperava. Estou me aventurando no mundo do Java, depois de tudo que eu falei mal dessa linguagem. Mas fazer o que, não dá pra trabalhar com uma linguagem só :p No fundo, Java é muito legal. Depois de aprender a sintaxe básica do Java, resolvi me aventurar também no SQLite e de quebra, matei dois coelhos com uma pedrada só.</p>
<p>O SQLite é uma biblioteca escrita em C que fornece um banco de dados que dispensa configurações/ajustes. É criado um novo arquivo no disco e a biblioteca se encarrega de todas as operações sobre ele, dispensando um processo separado para o SGBD, como é comum na maioria dos bancos de dados. Para mais informações, consulte o site oficial (<a href="http://sqlite.org" rel="externo">http://sqlite.org</a>).</p>
<p>O exemplo abaixo é extremamente básico, pois ainda estou aprendendo as manhas. Let's work!</p>
<p>Para começar, baixe a biblioteca do SQLite <a href="http://www.zentus.com/sqlitejdbc" rel="externo">aqui</a>. O .jar disponível funciona tanto em Linux, como em Windows e Mac. Inclua a biblioteca em seu projeto. No caso do <a href="http://netbeans.org" rel="externo">NetBeans</a>, procure a aba Projetos, selecione seu projeto, vá em Bibliotecas, botão direito e selecione Adicionar JAR/Pasta, informando a localização do arquivo baixado.</p>
<p>O exemplo baseia-se em um cadastro de pessoas, contendo nome e idade. São três classes: Pessoa (o "The book is on the table" da orientação a objetos, todo mundo que está aprendendo OO faz essa classe), SQLite, onde estão implementados os métodos para inserção e listagem e a classe Exemplo, a classe principal do projeto.</p>
<p><strong>Classe Pessoa:</strong><br /></p>
<p></p>
<pre class="brush: java">
package testesqlite;

public class Pessoa {
	private int idade;
	private String nome;

	public Pessoa(String nome, int idade) {
		this.nome = nome;
		this.idade = idade;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getIdade() {
		return this.idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}
}
</pre>
<p></p>
<p><strong>Classe SQLite</strong><br /></p>
<p></p>
<pre class="brush: java">
package testesqlite;

import java.sql.*;
import java.util.Vector;

public class SQLite {
	private Connection conn;
	private Statement stm;

	public SQLite(String arquivo) throws SQLException, ClassNotFoundException {
		Class.forName("org.sqlite.JDBC");
		this.conn = DriverManager.getConnection("jdbc:sqlite:" + arquivo);
		this.stm = this.conn.createStatement();
	}

	public void initDB() {
		try {
			//Remove e cria a tabela a cada execução. Mero exemplo
			this.stm.executeUpdate("DROP TABLE IF EXISTS pessoas");
			this.stm.executeUpdate("CREATE TABLE pessoas ("
			+ "nome varchar(70) PRIMARY KEY NOT NULL,"
			+ "idade integer);");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void insert(Pessoa pessoa) {
		try {
			this.stm = this.conn.createStatement();
			this.stm.executeUpdate("INSERT INTO pessoas VALUES (\""
			+ pessoa.getNome() + "\","
			+ pessoa.getIdade() + ")");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void removePessoa(String nome) {
		try {
			this.stm = this.conn.createStatement();
			this.stm.executeUpdate("DELETE FROM pessoas WHERE nome = \"" + nome + "\"");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public Vector getAll() {
		Vector lista = new Vector();
		ResultSet rs;
		try {
			rs = this.stm.executeQuery("SELECT * FROM pessoas ORDER BY idade");

			while (rs.next()) {
				lista.add(new Pessoa(rs.getString("nome"), rs.getInt("idade")));
			}
			rs.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return lista;
	}
}
</pre>
<p></p>
<p><strong>Classe Exemplo (main)</strong><br /></p>
<p></p>
<pre class="brush: java">
package testesqlite;
import java.util.Iterator;

public class Exemplo {
	public static void main(String[] args) {
		try {
			SQLite dbCon = new SQLite("pessoas.db");

			dbCon.initDB();
			dbCon.insert(new Pessoa("Jonnas", 19));
			dbCon.insert(new Pessoa("Fulano", 20));
			dbCon.insert(new Pessoa("Beltrano", 10));

			Exemplo.listaTodos(dbCon);

			System.out.println("Removemos a pessoa com o nome Fulano e listamos novamente\n");
			dbCon.removePessoa("Fulano");

			Exemplo.listaTodos(dbCon);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void listaTodos(SQLite dbCon) {
		Iterator it = dbCon.getAll().iterator();
		Pessoa hs;
		while (it.hasNext()) {
			hs = (Pessoa) it.next();
			System.out.println("Nome:" + hs.getNome());
			System.out.println("Idade:" + hs.getIdade() + "\n");
		}
	}
}
</pre>
<p>O código tá bem amador ainda, mas dá pra ter uma noção de como funciona o SQLite com Java. É criado um arquivo chamado "pessoas.db" que será o banco de dados. É criada uma tabela "pessoas" e inserido três registros nela. Todos os registros são listados, remove-se uma das pessoas e lista-se novamente.</p>
<p>Baixe <a href="http://www.fonini.net/labs/TesteSQLite.rar">aqui</a> o projeto criado no NetBeans (com a biblioteca já incluída).</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Thu, 18 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/17-usando-sqlite-com-java</guid>
			</item>
			<item>
				<title>Como remover a voz das músicas no Linux</title>
				<description><![CDATA[<p>Um dia desses eu estava assistindo o <a href="http://vimeo.com/8777801" rel="externo">vídeo em Tributo ao Jimmy "The Rev" Sullivan</a>, fantástico (ex) baterista da banda Avenged Sevenfold, quando me deparei com um trecho de uma música que eu nunca tinha ouvido antes. Procurei em todas as músicas que eu tenho e nada. Finalmente reparei que o trecho do vídeo é estranho pois na música original tem voz naquela parte e no vídeo não tinha.</p>
<p>Então fui a procura de um software para Linux capaz de remover a voz da música em tempo de execução. Uma das únicas opções que encontrei foi o software <a href="http://xxms.org">xmms</a>, clone do Winamp para a plataforma Linux. Esse software possui um plugin chamado Removedor de Voz que "tenta" remover a voz da música. Depende muito da música, a música do Avenged Sevenfold (Sidewinder) que eu queria até removeu a voz, mas a bateria foi junto. Um dos melhores exemplos que eu encontrei foi Primeiros Erros do Capital Inicial, onde realmente remove a voz sem maiores perdas no restante do áudio.</p>
<p>Abaixo, o processo de instalação do xmms no Ubuntu 9.10:</p>
<p>Adicione a seguinte entrada em seu arquivo sources.list (ou no menu Sistema/Administração/Canais de Software):</p>
<pre>deb http://www.pvv.ntnu.no/~knuta/xmms/karmic ./</pre>
<p>Feito isso, digite no terminal:</p>

<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install xmms
</div>
<p>Para executar o programa, novamente no terminal:</p>
<p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" rel="externo"> xmms
</div>
<p>Habilite o plugin Removedor de Voz no menu Opções/Preferências/Plugins de Efeitose clique em Ativar Plugin. As músicas já serão tocadas sem a voz.</p>
<p>Obs: Foi meio chato aqui pra executar esse programa. Tive que fechar todos os programas que fizessem uso da placa de som.<br />
Se você usa outras versões do Ubuntu, use os repositórios disponíveis <a href="http://www.pvv.ntnu.no/~knuta/xmms/" rel="externo">aqui</a>.</p>
<p>Abraços e até a próxima</p>
<p></p>]]></description>
				<pubDate>Mon, 08 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/linux/9-como-remover-a-voz-das-musicas-no-linux</guid>
			</item>
			<item>
				<title>php.js:  Funções do PHP escritas em JavaScript</title>
				<description><![CDATA[<p>Recentemente comentei com o <a href="http://www.twitter.com/edipofederle">@edipofederle</a> no Twitter que gostaria que existisse algo similar a função include() do PHP no JavaScript. Foi ai que eu descobri o <a href="http://www.phpjs.org">php.js</a>. O php.js é um projeto onde vários programadores (atualmente 254) estão escrevendo funções do PHP (atualmente 438) em JavaScript, facilitando muito a vida de quem conhece PHP mas não conhece bem JavaScript. As funções possuem sintaxes idênticas as do PHP, tornando o trabalho ainda mais fácil.</p>
<p>O mais legal do projeto é que você pode "compilar" sua própria versão do php.js, escolhendo as funções que você vai usar ou usando um dos pacotes já prontos no site do projeto.</p>
<p>Resolvi testar algumas funções e elas funcionam mesmo. Basta incluir o arquivo no seu código HTML e usar as funções. Aqui estão alguns exemplos que eu testei:</p>
<p></p>
<pre class="brush: js">
echo(checkdate(02, 29, 2010));
//Checa se a data é valida.
//Retornou false

echo(md5('Jonnas'));
//Retorna o hash MD5 de uma string.
//Retornou: cbab5e5bde68b3fe1043d43ba94fef5c

array = new Array('php', 'javascript', 'xhtml');
echo(count(array));
//Conta a quantidade de elementos de um array.
//Retornou: 3

print_r(sort(array));
//Ordena o array e mostra todos os elemtos
//Retornou: Array ( [0] => javascript [1] => php [2] => xhtml )

echo(round(3,14159265));
Arredonda um nº em ponto flutuante
//Retornou: 3

echo(implode('/', array));
//Junta todos os elementos do array com uma barra, retornando uma string
//Retornou: php/javascript/xhtml
</pre>
<p></p>
<p>Se você dispõe de tempo e vontade você pode ajudar o projeto escrevendo novas funções e melhorando as existentes.</p>
<p>Um abraço e até a próxima</p>
]]></description>
				<pubDate>Fri, 05 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/8-phpjs:--funcoes-do-php-escritas-em-javascript</guid>
			</item>
			<item>
				<title>Campanha #soudev</title>
				<description><![CDATA[<p>Estava eu assistindo a temporada final de Prison Break e com o Seesmic aberto (cliente de twitter), lendo as porcarias da minha timeline, só piazada falando em Big Bosta Brasil, bandas emo, Formspring, colírios (viadinhos) da capricho, spams de sistemas de troca de followers e todos aqueles assuntos horrendos que rondam os Trending Topics brasileiros. Nisso, vi a hashtag #soudev. O pessoal postava as tecnologias que trabalhavam, juntamente com essa tag e os desenvolvedores começavam a se seguir.</p>
<p>Uma idéia simplesmente genial do <a href="http://twitter.com/jandersonfc" rel="externo">@jandersonfc</a>, que logo organizou uma lista, disponível <a href="http://twitter.com/jandersonfc/soudev" rel="externo">aqui</a>, contendo todos os participantes da campanha. Para participar, basta entrar em contato com o @jandersonfc, usando a tag #soudev e você estará fazendo parte da lista.</p>
<p>Minha timeline mudou muito depois da campanha, agora sigo pessoas que twittam realmente o que me interessa, compartilham novos conhecimentos e formam novas opiniões.</p>
<p>Muito obrigado a todos os envolvidos, por fazerem uma timeline melhor e com conteúdo de verdade.</p>
<p>Grande abraço a todos!</p>
]]></description>
				<pubDate>Thu, 11 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/12-campanha-soudev</guid>
			</item>
			<item>
				<title>Os 25 erros de programação mais perigosos</title>
				<description><![CDATA[<p>
	A <a href="http://cwe.mitre.org" rel="externo">CWE</a> divulgou no último dia 17 uma lista com <a href="http://cwe.mitre.org/top25/" rel="externo">os 25 erros de programação mais perigosos</a>. Não deixe de conferir a lista e indique para seus amigos. O que mais me chamou a atenção é que o 2º erro mais comum ainda é o SQL Injection. É inacreditável que ainda existam softwares com essa falha, em pleno ano de 2010, com os milhares de tutoriais e exemplos existentes na Internet.</p>
<p>
	Enfim, leiam a lista, que é bem completa, possui exemplos de códigos inseguros e soluções para os mesmos.</p>
<p>
	Abraço e até a próxima!</p>
]]></description>
				<pubDate>Wed, 24 Feb 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/22-os-25-erros-de-programacao-mais-perigosos</guid>
			</item>
			<item>
				<title>Tutorial de programação com Brainfuck</title>
				<description><![CDATA[<p>Brainfuck é uma linguagem de programação esotérica, praticamente sem fins práticos, criada em 1993. Extremamente minimalista, possui apenas 8 comandos, com os quais é possível fazer inúmeras coisas. Não se deixe enganar pela sintaxe complicada e baixo número de comandos, esta linguagem é capaz de resolver qualquer problema computável. É uma excelente linguagem para treinar a sua lógica e, é claro, fazer jus ao nome da linguagem.</p>
<p><span style="font-size: 14px;"><strong>Comandos<br /></strong></span></p>
<table border="0" cellpadding="1" cellspacing="1" style="width: 403px; height: 169px; border:1px solid #000">
	<tbody>
		<tr>
			<td>
				.</td>
			<td>
				Imprime o caractere ASCII refente ao valor inteiro da célula atual</td>
		</tr>
		<tr>
			<td>
				,</td>
			<td>
				Armazena o valor da próxima tecla a ser pressionada na célula atual</td>
		</tr>
		<tr>
			<td>
				+</td>
			<td>
				Incrementa em 1 o valor da célula atual</td>
		</tr>
		<tr>
			<td>
				-</td>
			<td>
				Decrementa em 1 o valor da célula atual</td>
		</tr>
		<tr>
			<td>
				></td>
			<td>
				Avança o ponteiro para a próxima célula</td>
		</tr>
		<tr>
			<td>
				<</td>
			<td>
				Retrocede o ponteiro para a célula anterior</td>
		</tr>
		<tr>
			<td>
				[</td>
			<td>
				Executa os comandos enquanto o valor da célula atual não for 0</td>
		</tr>
		<tr>
			<td>
				]</td>
			<td>
				Fim do bloco de repetição</td>
		</tr>
	</tbody>
</table>
<p>
	<span style="font-size: 14px;"><strong><br />
	Compiladores<br />
	</strong></span></p>
<p>
	Existem diversos compiladores para a linguagem, inclusive existe um nos repositórios do Ubuntu, o bf. Eu optei por compilar a versão em Assembly disponível <a href="http://www.muppetlabs.com/~breadbox/software/tiny/bf.asm.txt" rel="externo nofollow">aqui</a>. Após escrever o seu código-fonte, o compilador criará um executável binário.</p>
<p>
	<strong><span style="font-size: 14px;"><br />
	Codificando<br />
	</span></strong></p>
<p>
	O brainfuck trabalha com células de memória, ou seja, cada caracter que você usar deverá estar armazenado em uma célula (ou não, no caso de usar sempre a mesma célula, mostrar o valor e sobrescrever, como eu faço no exemplo abaixo). Suponha que você queira mostrar a letra "j" em brainfuck. Você deverá armazenar 106 na célula (digitando 106 sinais de + ou criando um laço de repetição), que é o valor equivalente a "j" em ASCII. O código abaixo escreve "jonnas" na tela:</p>
<p></p>
<pre>
	+++++++++++ Posição 1 recebe 11 e será a controladora do laço abaixo<br />
	Enquanto o valor da primeira posição for maior que 0
	[
	- Decrementa o valor da posição 1
	> Avança para a posição 2
	+++++++++++ Posição 2 recebe 11
	< Volta para a posição 1
	]
	> Avança novamente para a posição 2
	--------------- . Decrementa 15 e imprime
	+++++ . Incrementa 5 e imprime
	- . Decrementa 1 e imprime
	. Apenas imprime novamente
	------------- . Decrementa 13 e imprime
	++++++++++++++++++ . Incrementa 18 e imprime
</pre><p></p>
<p>Apesar de parecer complicado, o processo é simples. A primeira linha armazena 11 na célula 1, que será o número de vezes que o loop executará. Enquanto a posição 1 não for 0, decrementamos a posição 1, avançamos para a posição 2, incrementamos seu valor em 11 e voltamos para a posição 1. Ao final do loop, o valor da posição 1 será 0 e da posição 2 será 121.<br />
Como o valor da letra "j" em ASCII é 106, decrementamos 15 da posição 2 e mostramos. Para mostrar a letra "o", cujo valor é 111, devemos incrementar 5 na posição 2 e mostrar e assim sucessivamente até mostrar o nome inteiro. Veja abaixo uma versão do código sem comentários:</p>
<p></p>
<pre>
+++++++++++
[
	-
	>
	+++++++++++
	<
]
>
--------------- .
+++++ .
- .
.
------------- .
++++++++++++++++++ .
</pre><p></p>
<p>A versão do código em uma única linha é essa:</p>
<p></p>
<pre>
+++++++++++[->+++++++++++<]>---------------.+++++.-..-------------.++++++++++++++++++.<br />
</pre><p></p>
<p>Partindo daí, pode-se resolver inúmeros problemas em brainfuck e aprimorar a lógica cada vez mais.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Thu, 29 Apr 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/38-tutorial-de-programacao-com-brainfuck</guid>
			</item>
			<item>
				<title>Expressões regulares para trabalhar com HTML</title>
				<description><![CDATA[<p>Reuni algumas expressões regulares úteis para trabalhar com HTML.</p>
<p><strong>Encontra comentários HTML<br /></strong></p>
<p><!--[\s\S]*?--[ \t\n\r]*><br />
<a href="http://regexpal.com/?flags=&amp;regex=%3C!--[\s\S]*%3F--[%20\t\n\r]*%3E&amp;input=%3Chtml%3E%0A%3C!--%20comentario%20--%3E%0A%3C%2Fhtml%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Captura o atributo href de links<br /></strong></p>
<p>href[\s]*=[\s]*"[^\n"]*"<br />
<a href="http://regexpal.com/?flags=&amp;regex=href[\s]*%3D[\s]*%22[^\n%22]*%22&amp;input=%3Ca%20href%3D%22http%3A%2F%2Fwww.fonini.net%22%3EJonnas%20Fonini%3C%2Fa%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra todos os atributos de uma tag. Ex: src, name, value.<br />
</strong></p><p>
(?:[\w]*) *= *"(?:(?:(?:(?:(?:\\\W)*\\\W)*[^"]*)\\\W)*[^"]*")<br />
<a href="http://regexpal.com/?flags=&amp;regex=%28%3F%3A[\w]*%29%20*%3D%20*%22%28%3F%3A%28%3F%3A%28%3F%3A%28%3F%3A%28%3F%3A\\\W%29*\\\W%29*[^%22]*%29\\\W%29*[^%22]*%22%29&amp;input=%3Cimg%20src%3D%22imagem.jpg%22%20alt%3D%22Teste%22%20width%3D%2210px%22%20height%3D%2250px%22%20%2F%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra tags <h1> até <h6><br /></strong></p>
<p><h([1-6])>([^<]*)</h([1-6])><br />
<a href="http://regexpal.com/?flags=&amp;regex=%3Ch%28[1-6]%29%3E%28[^%3C]*%29%3C%2Fh%28[1-6]%29%3E&amp;input=%3Ch1%3ETitulo%3C%2Fh1%3E%0Abla%20bla%20bla%0A%3Ch3%3EOutro%20titulo%3C%2Fh3%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra tags <a> válidas<br /></strong></p>
<p>^<a[^>]*([^"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$<br />
<a href="http://regexpal.com/?flags=&amp;regex=^%3Ca[^%3E]*%28[^%22]*%29[^%3E]*%3E%28[%200-9a-zA-Z]%2B%29%3C%2Fa%3E%24&amp;input=%3Ca%20href%3D%22http%3A%2F%2Fwww.fonini.net%22%3EJonnas%20Fonini%3C%2Fa%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra todas as URL's de um texto<br /></strong></p>
<p>(http://|https://)([a-zA-Z0-9]+\.[a-zA-Z0-9\-]+|[a-zA-Z0-9\-]+)\.[a-zA-Z\.]{2,6}(/[a-zA-Z0-9\.\?=/#%&amp;\+-]+|/|)<br />
<a href="http://regexpal.com/?flags=&amp;regex=%28http%3A%2F%2F|https%3A%2F%2F%29%28[a-zA-Z0-9]%2B\.[a-zA-Z0-9\-]%2B|[a-zA-Z0-9\-]%2B%29\.[a-zA-Z\.]{2%2C6}%28%2F[a-zA-Z0-9\.\%3F%3D%2F%23%25%26\%2B-]%2B|%2F|%29&amp;input=http%3A%2F%2Fwww.fonini.net%0Ahttp%3A%2F%2Fwww.pmvilamaria.com.br" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra todas as imagens<br /></strong></p>
<p><[iI][mM][gG][a-zA-Z0-9\s=".]*((src)=\s*(?:"([^"]*)"|'[^']*'))[a-zA-Z0-9\s=".]*/*>(?:</[iI][mM][gG]>)*<br />
<a href="http://regexpal.com/?flags=&amp;regex=%3C[iI][mM][gG][a-zA-Z0-9\s%3D%22.]*%28%28src%29%3D\s*%28%3F%3A%22%28[^%22]*%29%22|%27[^%27]*%27%29%29[a-zA-Z0-9\s%3D%22.]*%2F*%3E%28%3F%3A%3C%2F[iI][mM][gG]%3E%29*&amp;input=%3Cimg%20src%3D%22teste.jpg%22%20%2F%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra tudo que está entre as tags especificadas. Mais tags podem ser adicionadas<br /></strong></p>
<p><(script|style)[^>]*?>(?:.|\n)*?</\s*\1\s*><br /><a href="http://regexpal.com/?flags=&amp;regex=%3C%28script|style%29[^%3E]*%3F%3E%28%3F%3A.|\n%29*%3F%3C%2F\s*\1\s*%3E&amp;input=%3Chtml%3E%0A%3Cscript%3E%0Aalert%28%27bla%27%29%3B%0A%3C%2Fscript%3E%0A%3C%2Fhtml%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Útil para remover tags HTML<br /></strong></p>
<p><[^>]*><br />
<a href="http://regexpal.com/?flags=&amp;regex=%3C[^%3E]*%3E&amp;input=%3Cp%3ETexto%3C%2Fp%3E" rel="externo">Testar</a></p>
<p></p><br />
<p><strong>Encontra extensões de arquivos<br /></strong></p>
<p>\.([A-Za-z0-9]{2,5}($|\b\?))<br />
<a href="http://regexpal.com/?flags=m&amp;regex=\.%28[A-Za-z0-9]{2%2C5}%28%24|\b\%3F%29%29&amp;input=Baixe%20o%20arquivo%20teste.zip" rel="externo">Testar</a></p>
<p>Se alguém tiver sugestões para mais expressões regulares, comente ou entre em contato.</p>
<p>Abraço e até a próxima!</p>]]></description>
				<pubDate>Mon, 09 Feb 2009 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/regex/10-expressoes-regulares-para-trabalhar-com-html</guid>
			</item>
			<item>
				<title>As 7 expressões regulares que devemos conhecer</title>
				<description><![CDATA[<p>Hoje vou mostrar algumas expressões regulares que podem ser muito úteis. Pra quem não conhece, recomendo a leitura do Guia de Expressões Regulares Online (<a href="http://guia-er.sourceforge.net/">http://guia-er.sourceforge.net</a>). Os exemplos estão em PHP, mas podem ser facilmente adaptados para qualquer linguagem que suporte regex.</p>
<p>
<strong><span style="font-size: 14px;">Números de telefone
</span></strong></p>
<p></p>
<pre class="brush: php">
$telefone = "(54) 9613-4396";
if (preg_match('/^(\(?[0-9]{2}\)?|[-. ]?)[ ][0-9]{4}[-. ]?[0-9]{4}$/', $telefone)) {
	echo "Telefone válido";
}
</pre>
<p></p>
<p>
<strong><span style="font-size: 14px;">CEP
</span></strong></p>
<p></p>
<pre class="brush: php">
$cep = "99150-000";
if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4})?$/', $cep)) {
	echo "CEP válido";
}
</pre><p></p>
<p>
 </p>
<p>
<strong><span style="font-size: 14px;">Comentários em várias linhas
</span></strong></p>
<p></p>
<pre class="brush: php">
$comentario = "/* comentario bla bla bla*/";
if (preg_match('/^[(/*)+.+(*/)]$/', $comentario)) {
	echo "Comentário válido";
}
</pre></p>
<p>
<strong><span style="font-size: 14px;">
</span></strong></p>
<p>
<strong><span style="font-size: 14px;">Datas (padrão brasileiro)
</span></strong></p>
<p></p>
<pre class="brush: php">
$data = "12/04/1990";
if (preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $data)) {
	echo "Data válida";
}
</pre><p></p>
<p>
<strong><span style="font-size: 14px;">
</span></strong></p>
<p>
<strong><span style="font-size: 14px;">Cores hexadecimais
</span></strong></p>
<p></p>
<pre class="brush: php">
$cor = "#666666";
if (preg_match('/^#(?:(?:[a-f\d]{3}){1,2})$/i', $cor)) {
echo "Cor válida";
}
</pre><p></p>
<p>
 </p>
<p>
<strong><span style="font-size: 14px;">Endereços IP
</span></strong></p>
<p></p>
<pre class="brush: php">
$ip = "255.255.255.0";
if (preg_match('^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$', $ip)) {
	echo "IP válido";
}
</pre><p></p>
<p>
 </p>
<p>
<strong><span style="font-size: 14px;">E-mails
</span></strong></p>
<p></p>
<pre class="brush: php">
$email = "contato@fonini.net";
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',
$email)) {
	echo "E-mail válido";
}
</pre><p></p>]]></description>
				<pubDate>Tue, 02 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/regex/4-as-7-expressoes-regulares-que-devemos-conhecer</guid>
			</item>
			<item>
				<title>Expressões regulares para trabalhar com números</title>
				<description><![CDATA[<p>Continuando a série sobre expressões regulares iniciada <a href="http://www.fonini.net/regex/10-expressoes-regulares-para-trabalhar-com-html">aqui</a>, reuni algumas expressões regulares úteis para trabalhar com números.</p>
<p></p>
<p><strong>Encontra números inteiros, incluindo negativos</strong></p>
<p>^[-+]?\d*$<br />
<a href="http://regexpal.com/?flags=&regex=^[-%2B]%3F\d*%24&input=-409" rel="externo">Testar</a></p>
<p><strong><br />
Encontra números inteiros e de ponto flutuante (float, double), incluindo negativos<br /></strong></p>
<p>^[-+]?\d*\.?\d*$<br />
<a href="http://regexpal.com/?flags=&regex=^[-%2B]%3F\d*\.%3F\d*%24&input=30.903" rel="externo">Testar</a></p>
<p><strong><br />
Encontra qualquer número real<br />
</strong></p>
<p>^[-+]?\d+(\.\d+)?$<br />
<a href="http://regexpal.com/?flags=&regex=^[-%2B]%3F\d%2B%28\.\d%2B%29%3F%24&input=45345.34534534" rel="externo">Testar</a></p>
<p><strong><br />
Encontra representações de dinheiro em dólar<br />
</strong></p>
<p>^\$(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$<br />
<a href="http://regexpal.com/?flags=&regex=^\%24%28\d{1%2C3}%28\%2C\d{3}%29*|%28\d%2B%29%29%28\.\d{2}%29%3F%24&input=%2489%2C787.00" rel="externo">Testar</a></p>
<p><strong><br />
Encontra representações de dinheiro em reais<br />
</strong></p>
<p>
^R\$ ?([1-9]{1}[\d]{0,2}(\.[\d]{3})*(\,[\d]{0,2})?|[1-9]{1}[\d]{0,}(\,[\d]{0,2})?|0(\,[\d]{0,2})?|(\,[\d]{1,2})?)$<br />
<a href="http://regexpal.com/?flags=&regex=^R\%24%20%3F%28[1-9]{1}[\d]{0%2C2}%28\.[\d]{3}%29*%28\%2C[\d]{0%2C2}%29%3F|[1-9]{1}[\d]{0%2C}%28\%2C[\d]{0%2C2}%29%3F|0%28\%2C[\d]{0%2C2}%29%3F|%28\%2C[\d]{1%2C2}%29%3F%29%24&input=R%24%2090.876%2C34" rel="externo">Testar</a></p>
<p><strong><br />
Encontra inteiros positivos<br />
</strong></p>
<p>^\d+$<br />
<a href="http://regexpal.com/?flags=&regex=^\d%2B%24&input=76548" rel="externo">Testar</a></p>
<p><strong><br />
Encontra porcentagens, positivas ou negativas, com 2 casas decimais<br />
</strong></p>
<p>^-?[0-9]{0,2}(\.[0-9]{1,2})?$|^-?(100)(\.[0]{1,2})?$<br />
<a href="http://regexpal.com/?flags=&regex=^-%3F[0-9]{0%2C2}%28\.[0-9]{1%2C2}%29%3F%24|^-%3F%28100%29%28\.[0]{1%2C2}%29%3F%24&input=67.43" rel="externo">Testar</a></p>
<p><strong><br />
Encontra inteiros entre 0 ou 000 até 255<br />
</strong></p>
<p>^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$<br />
<a href="http://regexpal.com/?flags=&regex=^%28[01]%3F[0-9]%3F[0-9]|2[0-4][0-9]|25[0-5]%29%24&input=255" rel="externo">Testar</a></p>
<p><strong><br />
Encontra inteiros entre 0 ou 000 até 127<br />
</strong></p>
<p>^(0?[0-9]?[0-9]|1[0-1][0-9]|12[0-7])$<br />
<a href="http://regexpal.com/?flags=&regex=^%280%3F[0-9]%3F[0-9]|1[0-1][0-9]|12[0-7]%29%24&input=50" rel="externo">Testar</a></p>
<p>
<strong><br />
Encontra inteiros entre 0 e 999<br />
</strong></p>
<p>^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$<br />
<a href="http://regexpal.com/?flags=&regex=^%28[0-9]|[1-9][0-9]|[1-9][0-9][0-9]%29%24&input=666" rel="externo">Testar</a></p>
<p>
<strong><br />
Encontra inteiros entre 1 e 999<br />
</strong></p>
<p>
^([1-9]|[1-9][0-9]|[1-9][0-9][0-9])$<br />
<a href="http://regexpal.com/?flags=&regex=^%28[1-9]|[1-9][0-9]|[1-9][0-9][0-9]%29%24&input=100" rel="externo">Testar</a></p>
<p>
<strong><br />
Encontra números de cartão de crédito de 13 até 16 dígitos<br />
</strong></p>
<p>
\b(?:\d[ -]*?){13,16}\b<br />
<a href="http://regexpal.com/?flags=&regex=\b%28%3F%3A\d[%20-]*%3F%29{13%2C16}\b&input=0123456789012345" rel="externo">Testar</a></p>
<p></p>
<p>Não deixe de entrar em contato caso tenha alguma dúvida ou sugestões para os próximos posts.</p>
<p>Abraço e até a próxima!</p>]]></description>
				<pubDate>Thu, 11 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/regex/13-expressoes-regulares-para-trabalhar-com-numeros</guid>
			</item>
			<item>
				<title>Expressões regulares para trabalhar com data/hora</title>
				<description><![CDATA[<p>Mais um post da série sobre regex (Veja os anteriores aqui: <a href="http://www.fonini.net/regex/10-expressoes-regulares-para-trabalhar-com-html">Expressões regulares para trabalhar com HTML</a> e <a href="http://www.fonini.net/regex/13-expressoes-regulares-para-trabalhar-com-numeros">Expressões regulares para trabalhar com números</a>). Reuni algumas expressões regulares úteis para trabalhar com data e hora.</p>
<p><strong>Valida data no formato HH:MM<br /></strong></p>
<p>^([0-1][0-9]|[2][0-3]):([0-5][0-9])$<br />
<a href="http://regexpal.com/?flags=&amp;regex=^%28[0-1][0-9]|[2][0-3]%29%3A%28[0-5][0-9]%29%24&amp;input=12%3A30" rel="externo">Testar</a></p>
<p><strong><br />
Variação da anterior, porém não é necessário o separador<br />
</strong></p>
<p>^(20|21|22|23|[0-1]\d)[0-5]\d$<br />
<a href="http://regexpal.com/?flags=&amp;regex=^%2820|21|22|23|[0-1]\d%29[0-5]\d%24&amp;input=1540" rel="externo">Testar</a></p>
<p><strong><br />
Valida horas, com ou sem AM/PM. Os segundos não são obrigatórios<br />
</strong></p>
<p>^((([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]((:|\.)[0-5][0-9])?( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]((:|\.)[0-5][0-9])?))$<br />
<a href="http://regexpal.com/?flags=&amp;regex=^%28%28%28[0]%3F[1-9]|1[0-2]%29%28%3A|\.%29[0-5][0-9]%28%28%3A|\.%29[0-5][0-9]%29%3F%28%20%29%3F%28AM|am|aM|Am|PM|pm|pM|Pm%29%29|%28%28[0]%3F[0-9]|1[0-9]|2[0-3]%29%28%3A|\.%29[0-5][0-9]%28%28%3A|\.%29[0-5][0-9]%29%3F%29%29%24&amp;input=03%3A40%20AM" rel="externo">Testar</a></p>
<p><strong><br />
Valida datas no formato dd/mm/yyyy hh:mm:ss<br /></strong></p>
<p>^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2})) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%28%28%2831\%2F%280%3F[13578]|1[02]%29%29|%28%2829|30%29\%2F%280%3F[1%2C3-9]|1[0-2]%29%29%29\%2F%281[6-9]|[2-9]\d%29%3F\d{2}%29|%2829\%2F0%3F2\%2F%28%28%281[6-9]|[2-9]\d%29%3F%280[48]|[2468][048]|[13579][26]%29|%28%2816|[2468][048]|[3579][26]%2900%29%29%29%29|%280%3F[1-9]|1\d|2[0-8]%29\%2F%28%280%3F[1-9]%29|%281[0-2]%29%29\%2F%28%281[6-9]|[2-9]\d%29%3F\d{2}%29%29%20%2820|21|22|23|[0-1]%3F\d%29%3A[0-5]%3F\d%3A[0-5]%3F\d%24&amp;input=12%2F04%2F1990%2014%3A00%3A50" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Valida datas entre 1/1/1900 até 31/12/2099<br />
	</strong></p>
<p>
	(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)<br />
	<a href="http://regexpal.com/?flags=&amp;regex=%28^%28%28%28%280[1-9]%29|%28[1-2][0-9]%29|%283[0-1]%29%29|%28[1-9]%29%29\x2F%28%28%280[1-9]%29|%281[0-2]%29%29|%28[1-9]%29%29\x2F%28%28[0-9]{2}%29|%28%28%2819%29|%28[2]%28[0]{1}%29%29%29%28[0-9]{2}%29%29%29%29%24%29&amp;input=12%2F04%2F1990" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Valida data e hora ou somente hora ou somente data. Data no formato m/d/y<br />
	</strong></p>
<p>
	^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%3F%3D\d%29%28%3F%3A%28%3F%3A%28%3F%3A%28%3F%3A%28%3F%3A0%3F[13578]|1[02]%29%28\%2F|-|\.%2931%29\1|%28%3F%3A%28%3F%3A0%3F[1%2C3-9]|1[0-2]%29%28\%2F|-|\.%29%28%3F%3A29|30%29\2%29%29%28%3F%3A%28%3F%3A1[6-9]|[2-9]\d%29%3F\d{2}%29|%28%3F%3A0%3F2%28\%2F|-|\.%2929\3%28%3F%3A%28%3F%3A%28%3F%3A1[6-9]|[2-9]\d%29%3F%28%3F%3A0[48]|[2468][048]|[13579][26]%29|%28%3F%3A%28%3F%3A16|[2468][048]|[3579][26]%2900%29%29%29%29|%28%3F%3A%28%3F%3A0%3F[1-9]%29|%28%3F%3A1[0-2]%29%29%28\%2F|-|\.%29%28%3F%3A0%3F[1-9]|1\d|2[0-8]%29\4%28%3F%3A%28%3F%3A1[6-9]|[2-9]\d%29%3F\d{2}%29%29%28%24|\%20%28%3F%3D\d%29%29%29%3F%28%28%280%3F[1-9]|1[012]%29%28%3A[0-5]\d%29{0%2C2}%28\%20[AP]M%29%29|%28[01]\d|2[0-3]%29%28%3A[0-5]\d%29{1%2C2}%29%3F%24&amp;input=04%2F12%2F1990%2014%3A30%3A45" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Valida dias da semana em inglês, resumidos ou não<br />
	</strong></p>
<p>
	^(Sun|Mon|(T(ues|hurs))|Fri)(day|\.)?$|Wed(\.|nesday)?$|Sat(\.|urday)?$|T((ue?)|(hu?r?))\.?$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28Sun|Mon|%28T%28ues|hurs%29%29|Fri%29%28day|\.%29%3F%24|Wed%28\.|nesday%29%3F%24|Sat%28\.|urday%29%3F%24|T%28%28ue%3F%29|%28hu%3Fr%3F%29%29\.%3F%24&amp;input=Sunday" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Valida datas no formato MMM dd, yyyy<br />
	</strong></p>
<p>
	^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2}))<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%3F%3A%28%28%28Jan%28uary%29%3F|Ma%28r%28ch%29%3F|y%29|Jul%28y%29%3F|Aug%28ust%29%3F|Oct%28ober%29%3F|Dec%28ember%29%3F%29\%2031%29|%28%28Jan%28uary%29%3F|Ma%28r%28ch%29%3F|y%29|Apr%28il%29%3F|Ju%28%28ly%3F%29|%28ne%3F%29%29|Aug%28ust%29%3F|Oct%28ober%29%3F|%28Sept|Nov|Dec%29%28ember%29%3F%29\%20%280%3F[1-9]|%28[12]\d%29|30%29%29|%28Feb%28ruary%29%3F\%20%280%3F[1-9]|1\d|2[0-8]|%2829%28%3F%3D%2C\%20%28%281[6-9]|[2-9]\d%29%280[48]|[2468][048]|[13579][26]%29|%28%2816|[2468][048]|[3579][26]%2900%29%29%29%29%29%29%29\%2C\%20%28%281[6-9]|[2-9]\d%29\d{2}%29%29&amp;input=April%2012%2C%201990" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Encontra nomes de meses em inglês<br />
	</strong></p>
<p>
	^(?:J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%3F%3AJ%28anuary|u%28ne|ly%29%29|February|Ma%28rch|y%29|A%28pril|ugust%29|%28%28%28Sept|Nov|Dec%29em%29|Octo%29ber%29%24&amp;input=September" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Valida datas no formato dd/mm/yyyy<br />
	</strong></p>
<p>
	^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/(\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/(\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/(\d{2}))|(29\/02\/((0[48]|[2468][048]|[13579][26])|(00))))$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%28%280[1-9]|[12]\d|3[01]%29\%2F%280[13578]|1[02]%29\%2F%28\d{2}%29%29|%28%280[1-9]|[12]\d|30%29\%2F%280[13456789]|1[012]%29\%2F%28\d{2}%29%29|%28%280[1-9]|1\d|2[0-8]%29\%2F02\%2F%28\d{2}%29%29|%2829\%2F02\%2F%28%280[48]|[2468][048]|[13579][26]%29|%2800%29%29%29%29%24&amp;input=12%2F04%2F90" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Encontra fusos horários<br />
	</strong></p>
<p>
	[-+]((0[0-9]|1[0-3]):([03]0|45)|14:00)<br />
	<a href="http://regexpal.com/?flags=&amp;regex=[-%2B]%28%280[0-9]|1[0-3]%29%3A%28[03]0|45%29|14%3A00%29&amp;input=-03%3A00" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Valida datas no formato mm/dd/yyyy ou mm-dd-yyyy<br />
	</strong></p>
<p>
	^(((((((0?[13578])|(1[02]))[\.\-/]?((0?[1-9])|([12]\d)|(3[01])))|(((0?[469])|(11))[\.\-/]?((0?[1-9])|([12]\d)|(30)))|((0?2)[\.\-/]?((0?[1-9])|(1\d)|(2[0-8]))))[\.\-/]?(((19)|(20))?([\d][\d]))))|((0?2)[\.\-/]?(29)[\.\-/]?(((19)|(20))?(([02468][048])|([13579][26])))))$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%28%28%28%28%28%280%3F[13578]%29|%281[02]%29%29[\.\-%2F]%3F%28%280%3F[1-9]%29|%28[12]\d%29|%283[01]%29%29%29|%28%28%280%3F[469]%29|%2811%29%29[\.\-%2F]%3F%28%280%3F[1-9]%29|%28[12]\d%29|%2830%29%29%29|%28%280%3F2%29[\.\-%2F]%3F%28%280%3F[1-9]%29|%281\d%29|%282[0-8]%29%29%29%29[\.\-%2F]%3F%28%28%2819%29|%2820%29%29%3F%28[\d][\d]%29%29%29%29|%28%280%3F2%29[\.\-%2F]%3F%2829%29[\.\-%2F]%3F%28%28%2819%29|%2820%29%29%3F%28%28[02468][048]%29|%28[13579][26]%29%29%29%29%29%24&amp;input=12%2F31%2F2009" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Encontra meses válidos<br />
	</strong></p>
<p>
	^((0?[1-9])|(1[0-2]))$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28%280%3F[1-9]%29|%281[0-2]%29%29%24&amp;input=1" rel="externo">Testar</a></p>
<p>
	 </p>
<p>
	É isso ai. Abraço e até a próxima!</p>
]]></description>
				<pubDate>Fri, 12 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/regex/15-expressoes-regulares-para-trabalhar-com-data-hora</guid>
			</item>
			<item>
				<title>Softwares úteis para Ubuntu</title>
				<description><![CDATA[<p>Criei essa lista para reunir alguns softwares essenciais para Ubuntu, tanto para desenvolvimento, como para diversão.<br />
<br />
<strong>Filezilla</strong><br />
Um dos melhores clientes de FTP que já usei. Rápido, estável e bastante customizável.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install filezilla
</div>
<br />
<strong>Guake Terminal</strong><br />
Esse é o meu preferido. Um terminal que está sempre ao alcance, bastando teclar F12 (ou outra tecla de sua preferência). Pode-se mudar o nível de transparência do terminal, bem como customizar fontes, cores e colocar uma imagem de fundo.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install guake
</div>
<br />
<strong>Kiki</strong><br />
Programa muito útil para criar e testar expressões regulares<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install kiki
</div>
<br />
<strong>Inkscape</strong><br />
Excelente editor de gráficos vetoriais. Uso bastante quando aqueles clientes chatos enviam logotipos em formato .cdr. Vale lembrar que esse software dá um banho legal do concorrente pago Corel Draw.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install inkscape
</div>
<br />
<strong>Thunderbird</strong><br />
Cliente de e-mail da Mozilla. Não precisa dizer mais nada.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install thunderbird
</div>
<strong><br />
WebHTTrack Website Copier</strong><br />
Um daqueles programas que são o terror das empresas de hospedagem. Esse software permite que um site inteiro seja copiado para seu computador, gerando um trafego enorme no servidor onde o site está hospedado.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install webhttrack<br />
</div>
<br />
<strong>EasyTag</strong><br />
Para fãs de música paranóicos (como eu), esse software permite editar as tags ID3 de arquivos de áudio para manter tudo sua coleção de músicas organizada.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install easytag
</div>
<br />
<strong>PulseAudio Equalizer</strong><br />
Equalizador de 15 bandas para o PulseAudio, com várias configurações pré-definidas e bastante versátil.<br />
Para instalar:<br />
<div class="terminal">	
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget http://dl.dropbox.com/u/1113424/webupd8/pulseaudio-equalizer_2.4_all2.deb<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo dpkg -i  pulseaudio-equalizer_2.4_all2.deb
</div>
<strong><br />
Ubuntu Tweak</strong><br />
Esse programa permite realizar várias modificações no sistema, sendo que algumas não estão disponíveis em lugar nenhum, exceto no terminal.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget http://launchpad.net/ubuntu-tweak/0.5.x/0.5.1/+download/ubuntu-tweak_0.5.1-1~karmic1_all.deb<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo dpkg -i ubuntu-tweak_0.5.1-1~karmic1_all.deb
</div>
<strong><br />
Wine</strong><br />
Muito útil para executar programas feitos para Windows.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install wine<br />
</div>
<br />
<strong>Winetricks</strong><br />
Complemento para o Wine. Permite que você instale facilmente dll's e outros complementos necessários para que alguns softwares interpretados pelo Wine funcionem.<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install zenity<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wget http://www.kegel.com/wine/winetricks<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> chmod +x winetricks<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo mv winetricks /usr/bin
</div>
<strong><br />
Codecs</strong><br />
O procedimento a seguir instala vários codecs muito úteis para reproduzir vários formato de áudio e vídeo<br />
Para instalar:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo wget http://www.medibuntu.org/sources.list.d/$(lsb_release  -cs).list <br />
--output-document=/etc/apt/sources.list.d/medibuntu.list &amp;&amp;<br />
sudo apt-get -q update &amp;&amp;<br />
sudo apt-get --yes -q --allow-unauthenticated install medibuntu-keyring &amp;&amp;<br />
sudo apt-get -q update<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install w32codecs libdvdcss2 ubuntu-restricted-extras
</div>
<br />
</p>]]></description>
				<pubDate>Mon, 15 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/linux/16-softwares-uteis-para-ubuntu</guid>
			</item>
			<item>
				<title>Expressões regulares variadas</title>
				<description><![CDATA[<p>Mais um post da série sobre expressões regulares. Os outros posts de regex podem ser encontrados <a href="http://www.fonini.net/regex/15-expressoes-regulares-para-trabalhar-com-data-hora">aqui</a>, <a href="http://www.fonini.net/regex/13-expressoes-regulares-para-trabalhar-com-numeros">aqui</a> e <a href="http://www.fonini.net/regex/10-expressoes-regulares-para-trabalhar-com-html">aqui</a>.</p>
<p><strong>Valida número do ISBN (<span style="visibility: visible;"><span style="visibility: visible;">International Standard Book Number)</span></span></strong></p>
<p><span style="visibility: visible;"><span style="visibility: visible;">ISBN\x20(?=.{13}$)\d{1,5}([- ])\d{1,7}\1\d{1,6}\1(\d|X)$<br />
<a href="http://regexpal.com/?flags=&amp;regex=ISBN\x20%28%3F%3D.{13}%24%29\d{1%2C5}%28[-%20]%29\d{1%2C7}\1\d{1%2C6}\1%28\d|X%29%24&amp;input=ISBN%20972-1-02783-9" rel="externo">Testar</a><br />
</span></span></p>
<p><strong><span style="visibility: visible;"><span style="visibility: visible;"><br />
Valida formato do CNPJ</span></span><br />
</strong></p>
<p><span style="visibility: visible;"><span style="visibility: visible;">\d{2}.?\d{3}.?\d{3}/?\d{4}-?\d{2}<br />
<a href="http://regexpal.com/?flags=&amp;regex=\d{2}.%3F\d{3}.%3F\d{3}%2F%3F\d{4}-%3F\d{2}&amp;input=89.432.343%2F0001-22" rel="externo">Testar</a></span></span></p>
<p><strong><span style="visibility: visible;"><span style="visibility: visible;"><br />
Limitar o tamanho de uma string em 50 caracteres</span></span><br />
</strong></p>
<br /><p><span style="visibility: visible;"><span style="visibility: visible;">^(.|\n){0,50}$<br /><a href="http://regexpal.com/?flags=&amp;regex=^%28.|\n%29{0%2C50}%24&amp;input=Bla%20teste%20uahsuhaushua%20regex%20%C3%A9%20legal%20jonnas%20fonini" rel="externo">Testar</a><br />
</span></span></p>
<p><strong>Valida formato de temperaturas Celsius e Fahrenheit<br />
</strong></p>
<p>^([+-]?[0-9]+)([CF])$<br />
<a href="http://regexpal.com/?flags=&amp;regex=^%28[%2B-]%3F[0-9]%2B%29%28[CF]%29%24&amp;input=70F" rel="externo">Testar</a></p>
<p><strong><br />
Valida nomes de dispositivos no Linux (mude a parte do "eth" para validar outros dispositivos)<br />
</strong></p>
<p>^(eth[0-9]$)|(^eth[0-9]:[1-9]$)<br />
<a href="http://regexpal.com/?flags=&amp;regex=^%28eth[0-9]%24%29|%28^eth[0-9]%3A[1-9]%24%29&amp;input=eth0" rel="externo">Testar</a></p>
<p> </p>
<p><strong>Valida nomes de domínios<br />
	</strong></p>
<p>
	^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$<br />
	<a href="http://regexpal.com/?flags=&amp;regex=^%28[a-zA-Z0-9]%28[a-zA-Z0-9\-]{0%2C61}[a-zA-Z0-9]%29%3F\.%29%2B[a-zA-Z]{2%2C6}%24&amp;input=www.fonini.net" rel="externo">Testar</a></p>
<p>
	<strong><br />
	<br />
	Valida e-mails de TLD's (Top Level Domains) específicos<br />
	</strong></p>
<p>
	^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.(?:|com|org|net|gov|[A-Z]{2})$<br />
	<a href="http://regexpal.com/?flags=im&amp;regex=^[A-Z0-9._%25%2B-]%2B%40[A-Z0-9.-]%2B\.%28%3F%3A|com|org|net|gov|[A-Z]{2}%29%24&amp;input=contato%40fonini.net%0Ateste%40teste.biz" rel="externo">Testar</a></p>
<p>
	<strong><br />
	<br />
	Localiza tags HTML vazias<br />
	</strong></p>
<p>
	<([A-Z][A-Z0-9]*)[^>]*>\s*</\1><br />
	<a href="http://regexpal.com/?flags=&amp;regex=%3C%28[a-z][a-z0-9]*%29[^%3E]*%3E\s*%3C%2F\1%3E&amp;input=%3Cdiv%3E%3Cp%3E%3C%2Fp%3E%3C%2Fdiv%3E" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Localiza variáveis e valores de arquivos INI<br />
	</strong></p>
<p>
	^([^=\r\n]+)=(.*)<br />
	<a href="http://regexpal.com/?flags=m&amp;regex=^%28[^%3D\r\n]%2B%29%3D%28.*%29&amp;input=valor1%3D20%3B%0Avalor2%3D30%3B" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Encontra linhas duplicadas<br />
	</strong></p>
<p>
	^(.*)(\r?\n\1)+$<br />
	<a href="http://regexpal.com/?flags=m&amp;regex=^%28.*%29%28\r%3F\n\1%29%2B%24&amp;input=linha%0Ateste%0Ateste%0A" rel="externo">Testar</a></p>
<p>
	<strong><br />
	Localiza rótulos de discos do Windows. Ex: C:<br />
	</strong></p>
<p>
	^([a-z]):<br />
	<a href="http://regexpal.com/?flags=m&amp;regex=^%28[a-zA-Z]%29%3A&amp;input=C%3A\teste" rel="externo">Testar</a></p>
]]></description>
				<pubDate>Fri, 19 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/regex/18-expressoes-regulares-variadas</guid>
			</item>
			<item>
				<title>Palíndromos em C ANSI</title>
				<description><![CDATA[<p>Nunca esqueço de uma prova de Programação I, do 2º semestre da faculdade, onde uma das questões consistia em fazer uma função que verificasse se a palavra passada por referência é um palíndromo, uma palavra que pode ser lida tanto da esquerda para a direita, quanto da direita para a esquerda. Lembro que não fui bem sucedido na época (rsrs), mas tá ai a dita função, escrita em C ANSI.</p>
<p>
</p>

<pre class="brush: c">
#include <stdio.h>
#include <string.h>

int ehPalindromo(char *string){
	char *s2 = string + strlen(string) - 1;
	if(!*string)
		return 1;
	while(*string++ == *s2-- &amp;&amp; *string);
	return !*string &amp;&amp; *(--string) == *(++s2);
}

int main(){
	char string[255];

	printf("Palavra: ");
	gets(string);
	printf("%s \n", ehPalindromo(string) ? "Eh palindromo" : "Nao eh palindromo");

	return(0);
}
</pre>
<p></p>
<p>C é uma linguagem que muitos odeiam, mas é muito comum pra quem desenvolve para Linux.
Abraço e até a próxima.
</p>
<p></p>]]></description>
				<pubDate>Thu, 04 Feb 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/5-palindromos-em-c-ansi</guid>
			</item>
			<item>
				<title>E se a Microsoft fabricasse carros?</title>
				<description><![CDATA[<p>
	Vi essa no <a href="http://focalinux.cipsga.org.br/" rel="externo nofollow">Guia Foca GNU/Linux</a> e achei legal.</p>
<p>
	Numa feira de informática (COMDEX), Bill Gates fez uma infeliz comparação da Indústria de computadores com a automobilística e declarou:<br />
	"Se a GM tivesse evoluído tecnologicamente tanto quanto a indústria de computadores evoluiu, estaríamos todos dirigindo carros que custariam 25 dólares e que fariam 1000 milhas por galão (algo como 420km/l)".<br />
	 <br />
	Então a General Motors divulgou o seguinte comentário a respeito desta declaração:<br />
	<br />
	<strong>Se a Microsoft fabricasse carros:</strong><br />
	<br />
	<strong>1)</strong> Toda vez que eles repintassem as linhas das estradas você teria que comprar um carro novo.<br />
	<br />
	<strong>2) </strong>Ocasionalmente, dirigindo a 100 Km/h, seu carro, de repente, morreria na auto-estrada sem nenhuma razão aparente, e você teria apenas que aceitar isso, religá-lo (desligar o carro, tirar a chave do contato, fechar o vidro, sair do carro, fechar e trancar a porta, abrir e entrar no carro, sentar-se ao banco, abrir o vidro, colocar a chave no contato e ligar) e seguir adiante.<br />
	<br />
	<strong>3)</strong> Ocasionalmente, a execução de uma manobra à esquerda, poderia fazer com que seu carro parasse e falhasse. Você teria então que reinstalar o<br />
	motor! Por alguma estranha razão, você aceitaria isso também.<br />
	<br />
	<strong>4)</strong> A Apple faria um carro em parceria com a Sun, confiável, cinco vezes mais rápido e dez vezes mais fácil de dirigir. Mas apenas poderia rodar em 5% das estradas.<br />
	<br />
	<strong>5)</strong> Os indicadores luminosos de falta de óleo, gasolina e bateria seriam substituídos por um simples "Falha Geral ou Defeito Genérico".<br />
	<br />
	<strong>6)</strong> Os novos assentos obrigariam a todos terem o mesmo tamanho "default" de bunda.<br />
	<br />
	<strong>7)</strong> Em um acidente, o sistema de airbag poderia lhe perguntar: "Você tem certeza?" antes de entrar em ação.<br />
	<br />
	<strong>8)</strong> No meio de uma descida pronunciada, quando você ligar o ar condicionado, o rádio e as luzes ao mesmo tempo, ao pisar no freio apareceria uma mensagem do tipo "Este Carro realizou uma operação ilegal e será desligado"!<br />
	<br />
	<strong>9)</strong> Se desligar o seu Carro98 utilizando a chave, sem antes ter desligado o radio ou o pisca-alerta, quando for ligá-lo novamente, ele iria checar todas as funções do carro durante meia hora, e ainda lhe daria uma bronca para não fazê-lo novamente.<br />
	<br />
	<strong>10)</strong> A cada novo lançamento de carro, você teria que reaprender a dirigir, voltar à auto-escola e tirar uma nova carteira de motorista.<br />
	<br />
	<strong>11)</strong> Para DESLIGAR seu carro, você teria que apertar o botão"Iniciar"...<br />
	<br />
	O tio Bill bem que poderia ter ido dormir sem essas.</p>
]]></description>
				<pubDate>Tue, 09 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/30-e-se-a-microsoft-fabricasse-carros</guid>
			</item>
			<item>
				<title>Como copiar um site inteiro para seu computador no Linux</title>
				<description><![CDATA[<p>De volta, após alguns dias sem postar devido a morte da minha vó, Cecília, 93 anos. Descanse em paz, minha vó querida.</p>
<p>Mas vamos lá!</p>
<p>Tenho visto muitas dúvidas de usuários Linux em como copiar um site inteiro para o computador, para acesso offline. Uso o mesmo software dos tempos de Windows, o HTTrack Website Copier, disponível no repositório.</p>
<p>Para instalar:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install webhttrack
</div>
<p></p>
<p>Para usuários de outras distros, existem mais versões no <a href="http://www.httrack.com/page/2/en/index.html" rel="externo">site oficial</a>.</p>
<p>O programa estará disponível no menu Aplicativos/Internet/WebHTTrack Website Copier. O programa foi escrito em C e roda diretamente no browser.</p>
<p>Após aberto, selecione um idioma e crie um novo projeto. O legal desse programa é que você pode continuar a cópia de um site abortado anteriormente, bastando seleciona-lo no início do programa, ao invés de criar um novo projeto. Lembre de especificar o local para onde o site será baixado em seu computador.</p>
<p>Após criar um novo projeto, adicione o endereço do site e avance. Também é possível submeter uma lista, em formato texto, contendo links a serem baixados. Depois de ter configurado todas as opções, o software inicia a cópia do site.</p>
<p>Não recomendo o uso deste programa pois gera um tráfego imenso no servidor do site e isso pode afetar usuários com limite de tráfego mensal baixo. Use com moderação somente em casos necessários ;)</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Wed, 03 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/25-como-copiar-um-site-inteiro-para-seu-computador-no-linux</guid>
			</item>
			<item>
				<title>Como extrair áudio de vídeos no Linux</title>
				<description><![CDATA[<p>Eu estava assistindo um clipe muito foda da banda Holiness, de Erechim/RS, pertinho daqui e resolvi extrair o áudio do clipe para ouvir enquanto o CD não aparece por aqui. A propósito, recomendo a banda a todos que gostam de um bom metal com vocais femininos :D</p>
<p>Tentei num site que prometia extrair áudio de vídeos do YouTube, mas a qualidade é horrenda.</p>
<p>A solução foi no bom e velho terminal, com o mplayer. Se você não tiver o mplayer instalado, faça-o com o seguinte comando:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install mplayer
</div>
<p></p>
<p>Em seguida, vá até a pasta onde está o vídeo e execute um dos seguintes comandos:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> mplayer -dumpaudio video.avi -dumpfile audio.mp3
</div>
<p></p>
<p>ou</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> mplayer -vo null -hardframedrop -ao pcm:file=audio.wav video.mp4
</div>
<p></p>
<p>No primeiro caso a extração é extremamente rápida, quase instantânea, mas pelo menos aqui o áudio extraído de um arquivo .mp4 ficou corrompido. No segundo caso demorou, mas funcionou. Porém, o arquivo resultante ficou com 60 MB, necessitando mais uma conversão para MP3 :S</p>
<p>Grande abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Thu, 04 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/26-como-extrair-audio-de-videos-no-linux</guid>
			</item>
			<item>
				<title>17 dicas para omitizar seus códigos JavaScript</title>
				<description><![CDATA[<p>Reuni algumas dicas da Internet que considero úteis para compartilhar com o pessoal. As dicas abrangem desde melhores práticas de programação até aumento de performance do código.</p>
<p><span style="font-size: 14px;"><strong>1 </strong></span>-<strong> Inicializar arrays e objetos</strong> com a = [] e b = {} é mais rápido do que a = new Array e b = new Object<br /></p>
<p><span style="font-size: 14px;"><strong>2 </strong></span>- ~~(1  *  "20.7") é mais rápido que parseInt(20.7)<br /></p>
<p><span style="font-size: 14px;"><strong>3</strong></span> - Uma das melhores maneiras de aumentar a performance de seus códigos JavaScript é usar o <strong>cache de objetos</strong>. O seguinte código, por exemplo, é ineficiente pois acessa o objeto diretamente várias vezes. Se você tiver 15 imagens na página, serão 30 acessos ao objeto.<br />
<br /></p>
<pre class="brush: javascript">
for (i=0; i<document.http://www.fonini.net/images.length; i++)
	document.http://www.fonini.net/images[i].src = "imagem.jpg";
</pre>
<br />
Uma forma de melhorar o desempenho deste código é guardar o objeto em uma variável, como no exemplo abaixo. Nesse caso o browser não precisa acessar o DOM novamente a cada iteração do laço.<br /><br />
<pre class="brush: javascript">
var imagens = document.http://www.fonini.net/images;
var tam = imagens.length;
for (i=0; i < tam; i++){
	imagens[i].src = "imagem.jpg";
}
</pre>
<p></p>
<p><strong><span style="font-size: 14px;">4</span> - Use === ao invés de ==</strong><br />
O JavaScript usa dois diferentes operadores de igualdade, quando precisamos comparar dois valores e também seus tipos de dados se faz necessário o uso do ===, agora quando precisamos comparar apenas seus valores mas não o tipo de dados podemos usar ==<br /></p>
<p><strong><span style="font-size: 14px;">5</span> - Reduza a quantidade de váriaveis globais</strong><br />
Reduzindo a quantidade de variáveis globais você reduz muito a chance de conflito entre scripts diferentes, bibliotecas ou até no mesmo código.<br /></p>
<p><strong><span style="font-size: 14px;">6</span> - Não declare variáveis dentro de laços de repetição</strong>.<br />
Já vi casos onde a variável container havia sido declarada dentro do loop, reduzindo a performance do código. Guardar o tamanho do array em uma variável para usar no "for" também é recomendado, pois calcula o tamanho somente uma vez<br /><br /></p>
<pre class="brush: javascript">
var container = document.getElementById('minhadiv');
var tam = vetor.length;
for(var i = 0; i < tam; i++) {
	container.innerHtml += i + '<br />';
}
</pre><p></p>
<p><strong><span style="font-size: 14px;">7</span> - Use chaves e ponto-e-vírgula em seus códigos. </strong><br />
Retirar esses elementos pode reduzir alguns bytes do seu código, mas o uso deles torna o código mais legível. Seu uso também é muito importante caso você use algum otimizador de JavaScript, pois o mesmo poderá se perder caso você não tenha delimitado o final de cada linha de código.<br /></p>
<p><span style="font-size: 14px;"><strong>8</strong></span> <strong>- Se possível, use apenas uma biblioteca JavaScript em sua página.</strong><br />Já vi sites que usam Prototype, jQuery e MooTools na mesma página. Pesquise bastante antes de utilizar uma biblioteca JavaScript, procure uma que se adapte as suas necessidades, evitando assim a inclusão de novas bibliotecas, já que a grande maioria delas tem as mesmas funcionalidades.<br /></p>
<p><strong><span style="font-size: 14px;">9</span> - Coloque o JavaScript em arquivos externos sempre que possível, ao invés de colocar o código diretamente no HTML.</strong> Com essa técnica o browser não precisa carregar novamente o código da página, pois o mesmo estará no cache. Tente também reduzir a quantidade de arquivos externos, combinando os códigos em um único arquivo. Isso economiza diversas requisições HTTP, cruciais para o desempenho do site.<br /></p>
<p><strong><span style="font-size: 14px;">10</span> - Use blocos CDATA para evitar erros de validação. </strong><br />
O validador pode identificar uma comparação como sendo a abertura de uma tag HTML que não será fechada, invalidando seu código, como por exemplo if (var < 10). Usando blocos CDATA, como no exemplo abaixo, evitamos que isto aconteça.<br /></p>
<p></p>
<p><strong><span style="font-size: 14px;">11</span> - Use a estrutura de controle switch ao invés de múltiplos if/elses aninhados.</strong><br /><br /></p>
<pre class="brush: javascript">
if (dia == 2){
...
}
elseif (dia == 3){
...
}
elseif (dia == 4){
...
}
</pre>
<br />
Usando switch, o código se torna muito mais legível, além de facilitar na hora da manutenção.<br /><br />
<pre class="brush: javascript">
switch (dia){
	case 2:
		...
		break;
	case 3:
		...
		break;
	case 4:
		...
		break;
	default:
		...
}
</pre><p></p>
<p><strong><br /><span style="font-size: 14px;">12</span> - Use o atributo defer para indicar o uso scripts externos no IE</strong><br />
A função do atributo do defer é avisar o script que está sendo requisitado externamente para esperar  até que a página seja carregada ou o DOM esteja preparado. O mesmo pode ser realizado através de bons métodos não-obstrutivos via JavaScript, que usualmente inclui códigos que previnem a execução de scripts antes que o DOM seja carregado por completo.<br />
A vantagem do defer ocorre quando utilizamos o Internet Explorer, tendo em vista que é único browser que suporta o atributo defer. Então, se você precisa de um rápido script que rode únicamente e exclusivamente no Internet Explorer, e você não quer que ele execute antes que o DOM esteja preparado, então simplesmente adicione defer="defer" no sua tag <script> e ela irá rapidamente tratar o seu problema. Corrigir a transparência de arquivos PNG no IE6 é um exemplo prático do uso do defer.<br />Mas lembre-se que o atributo defer deve ser usado quando escondemos um script de outros browsers com o uso dos comentários condicionais (conditional comments) para que afete somente os navegadores da Microsoft. De outra maneira, o script vai rodar normalmente em outros browsers.<br /></p>
<p><strong><span style="font-size: 14px;">13 </span>- Evite usar palavras reservadas do JavaScript em nomes de funções e/ou variáveis. As principais são essas:</strong><br /></p>
<pre class="brush: javascript">
break
case
catch
continue
default
delete
do
else
finally
for
function
if
in
instanceof
new
return
switch
this
throw
try
typeof
var
void
while
with
</pre><br />
<p></p>
<p><strong><span style="font-size: 14px;">14</span> - Utilize compressão de código.<br />
</strong>Comprimir o código pode reduzir consideravelmente o tamanho do mesmo, reduzindo o tempo de carregamento da página. Existem muitos compressores de código online que realizam o serviço para você. O código também pode ser comprimido no Apache, através de um arquivo .htaccess com o conteúdo similar a esse:<br />
<br />
<FilesMatch ".js$"><br />
	AddHandler application/x-httpd-php .js<br />
</FilesMatch><br /></p>
<p><span style="font-size: 14px;"><strong>15</strong></span> - A menos que você esteja usando alguma biblioteca JavaScript que somente execute o código quando o DOM estiver carregado,<strong> sempre inclua seu código JavaScript no final da página</strong>. Isso evita que o código seja executado antes do carregamento da página, causando efeitos indesejáveis e/ou lentidão.<br /></p>
<p><span style="font-size: 14px;"><strong>16</strong></span> <strong>- Use uma biblioteca de JavaScript cross-browser. </strong><br />
Atualmente existem várias bibliotecas que fazem o trabalho sujo da incompatibilidade entre browsers para você e reduzem a quantidade de linhas de código, bastando você se concentrar na lógica para resolver o problema sem se preocupar se o código vai funcionar em todos os browsers. A minha preferida é a jQuery, cujo lema é "Write less, do more" (escreva menos, faça mais).<br /></p>
<p><strong><span style="font-size: 14px;">17</span> - Comente seu código sempre que possível.</strong><br />
Isso evita muita dor de cabeça no futuro, quando for dar manutenção no código e também evita a famosa frase: "Putz! O que faz essa parte do código?".</p>]]></description>
				<pubDate>Mon, 08 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/29-17-dicas-para-omitizar-seus-codigos-javascript</guid>
			</item>
			<item>
				<title>Como instalar o plugin de UML no NetBeans 6.8</title>
				<description><![CDATA[<p>
	O NetBeans tinha um plugin de UML muito massa nas versões mais antigas, mas tiraram nas últimas versões. Depois de alguma procura na internet, consegui encontrar uma forma de instalar o plugin na versão 6.8. Provavelmente essa técnica também funcionará nas próximas versões da IDE.</p>
<p>
	Abra o NetBeans e vá em Ferramentas/Plugins. Vá na aba Configurações e clique em Adicionar. Escolha um nome para o provedor de atualizações e coloque o seguinte endereço no campo URL: http://ea.ddns.com.br:8090/netbeans6.8/UML/catalog.xml</p>
<p>
	Se o plugin não aparecer imediatamente na aba Plugins Disponíveis clique em Recarregar Catálogo. Quando ele aparecer, basta selecionar e instalar.</p>
<p>
	Abraço e até a próxima!</p>]]></description>
				<pubDate>Thu, 11 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/31-como-instalar-o-plugin-de-uml-no-netbeans-68</guid>
			</item>
			<item>
				<title>Encurtando URL's com PHP usando a API do Bit.ly</title>
				<description><![CDATA[<p>Este é o primeiro post do site e espero que gostem. Hoje vamos aprender como encurtar URL's com PHP usando a API do <a href="http://www.bit.ly" rel="externo">Bit.ly</a>. O Bit.ly é um dos serviços de redução de URL's mais populares da internet, tanto que o Twitter também usa esse serviço em sua página. Para começar você deve possuir a biblioteca cURL instalada em seu servidor e também deve criar uma conta no Bit.ly, onde será fornecida uma API Key que será usada nesse script. Criei esse código primeiramente pra usar aqui no site e resolvi disponibilizar para vocês. Segue o código:</p>
<p>
Vamos supor que a URL a ser encurtada é a do Google: http://www.google.com.br</p>
<p></p>
<pre class="brush: php">
$cURL = curl_init('http://api.bit.ly/shorten?version=2.0.1&amp;longUrl=http://www.google.com.br&amp;login=SeuNomeDeUsuario&amp;apiKey=
SuaAPIKeyFornecidaPeloBitLy');
//Inicia o cURL passando o endereço que será requisitado

curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
//Seta a opção CURLOPT_RETURNTRANSFER como true, assim, a resposta será retornada
//e não impressa na tela

$resultado = curl_exec($cURL);
//Armazena a resposta (em formato JSON) na variável $resultado

curl_close($cURL);
//Fecha o cURL

$link = json_decode($resultado, true);
//Decodifica o objeto JSON para um array, armazenando na variável $link

echo $link['results']['http://www.google.com.br']['shortUrl'];
//Aqui estão os índices do array que você deverá acessar para localizar a URL encurtada

</pre>
<p>
</p>
<p>
Use a função print_r($link) para ver as outras opções retornadas pela API.</p>
<p>
Espero que tenham gostado e até a pŕoxima</p>
<p>
Abraço,
Jonnas Fonini</p>
]]></description>
				<pubDate>Thu, 28 Jan 2010 00:00:00 -0200</pubDate>
				<guid>http://www.fonini.net/posts/1-encurtando-url's-com-php-usando-a-api-do-bitly</guid>
			</item>
			<item>
				<title>Glest - Jogo de estratégia em tempo real Open Source e multiplataforma</title>
				<description><![CDATA[<p>Glest. Este nome une o útil ao agradável: games + open source. Não sou jogador assíduo, jogo uma vez a cada dois meses, quando não tenho nada para fazer mesmo. Acabei encontrando este game no repositório e resolvi testar.</p>
<p><a href="http://glest.org" rel="externo, nofollow">Glest</a> é um jogo de estratégia em tempo real, estilo Age of Empires (quem nunca jogou esse?), mantido por uma comunidade de usuários, que está sempre aprimorando o jogo, adicionando novos mapas, funcionalidades etc.</p>
<p>Outro ponto importante é que existem versões tanto para Linux como para Windows. O jogo não é uma perfeição, mas garante várias horas de diversão. Veja alguns screenshots do jogo:</p>
<p><a href="http://glest.org/http://www.fonini.net/images/galeria/pantallas/s02.jpg" rel="externo, nofollow"><img alt="" src="http://glest.org/http://www.fonini.net/images/galeria/pantallas/s02.jpg" style="width: 180px; height: 135px;" /></a> <a href="http://glest.org/http://www.fonini.net/images/galeria/pantallas/s09.jpg" rel="externo, nofollow"><img alt="" src="http://glest.org/http://www.fonini.net/images/galeria/pantallas/s09.jpg" style="width: 180px; height: 135px;" /></a> <a href="http://glest.org/http://www.fonini.net/images/galeria/pantallas/s13.jpg" rel="externo, nofollow"><img alt="" src="http://glest.org/http://www.fonini.net/images/galeria/pantallas/s13.jpg" style="width: 180px; height: 135px;" /></a></p>
<p></p>
<p><strong>Para instalar no Linux:<br /></strong></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install glest
</div>
<p></p>
<p><strong>Para instalar no Windows:</strong><br />
<a href="http://glest.org/en/downloads.php" rel="externo, nofollow">Site oficial</a></p>
<p>Na página do projeto no <a href="http://sourceforge.net/projects/glest/files/" rel="externo, nofollow">SourceForge</a> você pode encontrar mais downloads e também o código fonte do jogo, para também se divertir compilando :p</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Fri, 05 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/27-glest--jogo-de-estrategia-em-tempo-real-open-source-e-multiplataforma</guid>
			</item>
			<item>
				<title>Easter Eggs do Linux (e alguns softwares Open Source)</title>
				<description><![CDATA[<p>Qual nerd que não gosta de Easter Eggs? São brincadeiras engraçadas (ou no mínimo curiosas) embutidas em alguns softwares, para você dar uma relaxada naqueles momentos em que tudo parece dar errado ou seu cérebro está fundindo.</p>
<p>Reuni uma lista com os Easter Eggs mais conhecidos do Linux e de alguns outros softwares Open Source. Have fun!</p>
<p><br /></p>
<p><span style="font-size: 14px;"><strong>Código fonte do kernel</strong></span></p>
<p>No terminal, digite:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> grep -R fuck /usr/src/linux-headers-2.6.31-20/*
</div>
<p></p>
<p>Substitua a palavra "fuck" por outras e também lembre de substituir a versão do kernel pela versão que você está usando. Você pode fazer isso pressionando TAB após digitar até linux-headers ou através do comando "uname -r".</p>
<p><br /></p>
<p><span style="font-size: 14px;"><strong>Documentação em distribuições Debian-like</strong></span></p>
<p>No terminal, digite:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> zgrep "The.*Release" /usr/share/doc/dpkg/changelog.Debian.gz
</div><p></p>
<p><span style="font-size: 14px;"><strong><br /><br />
Vim (Vi improved)</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> vim
</div><p></p>
<p>Digite :help 42 e verá uma referência ao Guia do Mochileiro das Galáxias</p>
<p><span style="font-size: 14px;"><strong><br /><br />
Data Discordiana</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> ddate
</div><p></p>
<p>Este comando exibe a data de hoje no <a href="http://pt.wikipedia.org/wiki/Calend%C3%A1rio_discordiano" rel="externo nofollow">Calendário Discordiano</a>. Você também pode passar outra data por parâmetro.</p>
<p><span style="font-size: 14px;"><strong><br /><br />
Cowsay</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install cowsay
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> cowsay 'Alguma coisa'
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> cowsay -f head-in.cow ouch  //esse é massa
</div><p></p>
<p><span style="font-size: 14px;"><strong><br /><br />
Aptitude</strong></span></p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude moo
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude -v moo
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude -v -v moo
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude -v -v -v moo
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude -v -v -v -v moo
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude -v -v -v -v -v moo
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> aptitude -v -v -v -v -v -v moo
</div><p></p>
<p><span style="font-size: 14px;"><strong><br /><br />Yes</strong></span></p>
<p>Não achei muita graça nesse, é só um loop infinito no terminal. Você também pode passar algum texto por parâmetro.</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> yes
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> yes 1234567890
</div><p></p>
<p>Pressione CTRL+C quando seu computador estiver quase derretendo.</p>
<p><span style="font-size: 14px;"><strong><br /><br />sl</strong></span></p>
<p>Quantas vezes na correria acabamos errando e ditando "sl" ao invés de "ls". Podemos instalar o programa sl e ao digitar errado seremos avisados por meio de animações no terminal, e segundo a man page desse aplicativo a função dele é alertar os desatentos que erram o comando "ls".</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install sl
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sl
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sl -a
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sl -F
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sl -l
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> man sl  //manual do programa
</div><p></p>
<p><span style="font-size: 14px;"><strong><br /><br />Apt-get</strong></span></p>
<p>Digite o comando abaixo e verifique a última linha do manual.</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> apt-get -h
</div><p></p>
<p><span style="font-size: 14px;"><strong><br />Mozilla Firefox</strong></span></p>
<p>Os easter eggs do Firefox são os mais famosos, e não podem ser deixados de lado. Na barra de endereços digite:</p>
<p>about:mozilla<br />about:robots</p>
<p><span style="font-size: 14px;"><strong><br /><br />
Open Office (funcionam também no BrOffice.org)</strong></span></p>
<p>Abra uma planilha e ponha a seguinte linha na célula A1 para jogar o jogo da velha:</p>
<p>
=GAME(A2:C4;"TicTacToe")</p>
<p></p>
<p>Ponha a linha abaixo em qualquer célula e pressione Enter</p>
<p>=ANTWORT("Das Leben, das Universum und der ganze Rest")</p>
<p></p>
<p>O comando abaixo permite a você jogar um game baseado em StarWars</p>
<p>=GAME("StarWars")</p>
<p></p>
<p>O comando abaixo mostra uma foto da equipe de desenvolvedores do aplicativo:</p>
<p>=STARCALCTEAM()</p>
<p><br />
Agora abra o editor de textos e digite a linha abaixo, seguida de F3 e veja uma foto do time de desenvolvedores</p>
<p>StarWriterTeam</p>
<p><span style="font-size: 14px;"><strong><br /><br />Gnome<br /></strong></span></p>
<p>Pressione ALT+F2 e digite "free the fish" (sem aspas) na tela que irá aparecer. Você verá um peixe passeando pela sua tela. No início eu achei legal, mas chegou uma hora que eu fiquei com muita raiva do peixe :P Para matá-lo, abra o terminal e digite:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> pkill gnome-panel
</div><p></p>
<p>Você também pode jogar com o peixinho. Tecle novamente ALT+F2 e digite "gegls from outer space" (sem aspas).</p>
<p><span style="font-size: 14px;"><strong><br /><br />Perl<br /></strong></span></p>
<p>Não chega a ser um Easter Egg, mas é uma data histórica para todos nós. O dia em que Linus Torvalds começou a escrever o kernel do Linux. Digite no terminal:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> perl -e 'print localtime(672274793). "\n";'
</div><p></p>
<p><span style="font-size: 14px;"><strong><br /><br />GParted<br /></strong></span></p>
<p>Como usuário comum, digite o comando abaixo no terminal e veja a mensagem de alerta:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gparted
</div><p></p>
<p><br /></p>]]></description>
				<pubDate>Fri, 12 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/32-easter-eggs-do-linux-e-alguns-softwares-open-source</guid>
			</item>
			<item>
				<title>Ouvindo música no terminal do Linux</title>
				<description><![CDATA[<p>Se tem uma coisa que eu gosto no Linux é o terminal. Não existem palavras pra descrever o terminal. As liberdades e funcionalidades que ele nos proporciona são imensas. Uma coisa que eu particularmente acho muito massa é a possibilidade de ouvir música através do terminal.</p>
<p>Vou dar algumas dicas de como fazer isso. O tutorial abrange dois softwares: mpg123 e mp3blaster. Vamos lá!<br /></p>
<p><span style="font-size: 14px;"><strong>mpg123<br /></strong></span></p>
<p>Um dos softwares utilizados é o mpg123. Se você não tiver instalado na máquina, instale com o seguinte comando.</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install mpg123
</div>
<p></p>
<p>Para ouvir a sua música, navegue até a pasta onde ela está e rode o seguinte comando:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> mpg123 sua_musica.mp3
</div>
<p></p>
<p>Para deixar o terminal livre para uso enquanto ouve a música, aperte CTRL + Z para parar o processo e em seguida rode o comando bg:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> bg
</div>
<p></p>
<p>O terminal ficará parecido com esse:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> bg
[1]+ mpg123 Avantasia - Reach Out for the Light.mp3 &amp;
</div>
<p></p>
<p>A música ficará tocando em background e o terminal ficará livre para uso. Para parar a execução, execute os seguintes procedimentos:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> jobs //mostra seus processos rodando em background, com o número de identificação<br />
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> fg 1 //traz o processo de volta. Mude o número pelo do seu processo
</div>
<p></p>
<p>Para encerrar a reprodução, pressione CTRL+C ou CTRL+SHIFT+C.</p>
<p><br /></p>
<p>Você também pode ouvir uma pasta inteira com o seguinte comando:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> mpg123 /home/usuario/pasta/*
</div>
<p></p>
<p>O software aceita vários argumentos. Os principais são:</p>
<p><strong>-g 70:</strong> Ajusta o volume (gain). Esse número varia de 0 até 100<br />
<strong>-n 3000:</strong> Decodifica somente 3000 frames<br />
<strong>-Z:</strong> Reprodução aleatória<br />
<strong>-q:</strong> Não mostra tags ID3 da música</p>
<p>Para ver mais opções digite:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> mpg123 --help
</div>
<p></p>
<p><span style="font-size: 14px;"><strong><br /><br />
mp3blaster<br /></strong></span></p>
<p>Outro software, muito mais elaborado, contando com uma pequena interface em modo texto é o mp3blaster. Você pode instalar com o seguinte comando:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo apt-get install mp3blaster
</div>
<p></p>
<p>O software aceita uma música ou diretório como parâmetro inicial. Se não informar nada, o programa exibe a interface, bastante intuitiva pelo fato de ser em modo texto.</p>
<p>Se você tiver problemas ao tocar alguma música ou receber a mensagem "<strong>Failed to open sound device</strong>", experimente fechar todos os aplicativos que estiverem usando o dispositivo de áudio no momento.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Sat, 06 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/28-ouvindo-musica-no-terminal-do-linux</guid>
			</item>
			<item>
				<title>Plugin para Rhythmbox para buscar letras de músicas no Vagalume</title>
				<description><![CDATA[<p>
	Fiz uma extensão para o plugin Lyrics do Rhythmbox. Esse plugin busca letras de músicas de alguns sites na internet, porém é bem difícil encontrar letras de músicas nacionais. Então resolvi criar essa extensão para o plugin, que busca letras no site <a href="http://www.vagalume.com.br" rel="externo nofollow">Vagalume</a>. É a primeira versão do plugin e pode conter erros, pois eu não sabia nada de Python antes de escrever o plugin. Você pode encontrar versões mais atualizadas daqui a algum tempo no <a href="http://github.com/fonini/VagalumeParser" rel="externo nofollow">GitHub</a>.<span style="font-size: 14px;"><strong><br />
	<br />
	<br />
	Instalação<br />
	</strong></span></p>
<p>
	Baixe a extensão <a href="http://www.fonini.net/labs/vagalume-parser.zip">aqui</a> e extraia para uma pasta de sua preferência. Depois é só substituir (como root) os arquivos da pasta /usr/lib/rhythmbox/plugins/lyrics por esses que você acabou de baixar.</p>
<p>
	Feito isso, entre no Rhythmbox, vá em Editar/Plugins, encontre o plugin Letras de Músicas, ative caso esteja desativado e selecione o site vagalume.com.br na listagem.</p>
<p>
	Abraço e até a próxima!</p>
]]></description>
				<pubDate>Wed, 17 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/33-plugin-para-rhythmbox-para-buscar-letras-de-musicas-no-vagalume</guid>
			</item>
			<item>
				<title>Integração do CKEditor com jQuery</title>
				<description><![CDATA[<p>O jQuery é uma biblioteca fantástica. O CKEditor é o editor mais completo. Por quê não juntar os dois? Este tutorial mostra como fazer isso. Um dos grandes ganhos desta integração é que fica muito fácil manipular o "baixo nível" do CKEditor, principalmente se for salvar o conteúdo do editor com AJAX.</p>
<p>Pra começar, baixe a última versão do <a href="http://www.jquery.com" rel="externo nofollow">jQuery</a>. Baixe o <a href="http://www.ckeditor.com" rel="externo nofollow">CKEditor</a>. Extraia o CKEditor para uma pasta e coloque o jQuery na mesma pasta. O CKEditor já vem com um mecanismo que permite essa integração. Ele está localizado na pasta "adapters/jquery.js" e deve ser incluído no HTML da página.</p>
<p><span style="font-size: 14px;"><strong><br />Instalação básica<br /></strong></span></p>
<p></p>
<br />
<pre class="brush: xml">
	<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
	<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
	<script type="text/javascript" src="ckeditor/adapters/jquery.js"></script>

	<script type="text/javascript">
	$(document).ready(function(){
	    $('#editor').ckeditor();
	});
	</script>
	
	<form method="post">
	    <textarea name="editor" id="editor"></textarea>
	</form>
</pre><p></p>
<p><span style="font-size: 14px;"><strong><br /><br />Instalação com parâmetros<br /></strong></span></p>
<p>O CKEditor também aceita dois parâmetros: uma função de callback e os parâmetros de configuração do editor. Veja o exemplo:</p>
<p></p>
<pre class="brush: js">
	<script type="text/javascript">
	$(document).ready(function(){
	    $('#editor').ckeditor(function(){
	        $('#resposta').html('<span style="color:red; font-weight: bold">CKEditor carregado!</span>');
	    },
	    {
	        width: 780,
	        height: 350
	    });
	});
	</script>
	
	<textarea name="editor" id="editor"></textarea>
	
	<div id="resposta"></div>
</pre><p></p>
<p><br />Quando o editor for carregado no exemplo acima, a DIV resposta receberá algum texto. No segundo parâmetros, passamos a largura e altura do editor. Você pode consultar a <a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html" rel="externo nofollow">documentação da API</a> para conhecer as opções de configuração.</p>
<p></p>
<p><span style="font-size: 14px;"><strong>Manipulando o editor<br /></strong></span></p>
<p>Você também pode trabalhar com várias instâncias do editor na mesma página, setar e recuperar valores. Veja um exemplo:</p>
<p></p>
<pre class="brush: js">
	$(document).ready(function(){
	    $('#editor').ckeditor(function(){
	        $('#resposta').html('<span style="color:red; font-weight: bold">CKEditor carregado!</span>');

	
	        var editor = $('#editor').ckeditorGet();

	        // Capturando o conteúdo do editor
	        var data = $('#editor').val();
	        // Adicionando conteúdo ao editor
	        $('#editor').val('<a href="http://www.fonini.net">www.fonini.net</a>');
	    },
	    {
	        width: 780,
	        height: 350
	    });
	});
</pre><p></p>
<p><span style="font-size: 14px;"><strong><br />Demo<br /></strong></span></p>
<p>Veja um demo online, clicando <a href="http://www.fonini.net/labs/ckeditor/jquery" rel="externo nofollow">aqui</a>.</p>
<p>Abraço e até a próxima!</p>
]]></description>
				<pubDate>Wed, 31 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/35-integracao-do-ckeditor-com-jquery</guid>
			</item>
			<item>
				<title>Method Chaining com PHP</title>
				<description><![CDATA[<p>Method Chaining (encadeamento de métodos) é uma técnica de programação que permite reduzir o tamanho de seus códigos. Em determinadas classes, você precisa chamar vários métodos diferentes em diversas linhas. Com method chaining, você poderá chamar esses métodos em cadeia, em somente uma linha. Por exemplo, veja a seguinte classe de formatação de strings:<br /></p>
<pre class="brush:php">
class String{
	private $str;

	public function __construct($str){
		$this->str = $str;
	}
	
	public function toLower(){
		$this->str = strtolower($this->str);
	}
	
	public function capitalize(){
		$this->str =  ucfirst($this->str);
	}
	
	public function bold(){
		$this->str = '<strong>'.$this->str.'</strong>';
	}
	
	public function getStr(){
		return $this->str;
	}
}

$string = new String("TEXTO DE EXEMPLO");
$string->toLower();
$string->capitalize();
$string->bold();
echo $string->getStr();
</pre>
<p>Essa é forma que grande parte dos programadores escrevem seus códigos. Com method chaining, nossa classe ficaria assim:<br /></p>
<pre class="brush:php">
class String{
	private $str;
	
	public function __construct($str){
		$this->str = $str;
	}
	
	public function toLower(){
		$this->str = strtolower($this->str);
		return $this;
	}
	
	public function capitalize(){
		$this->str =  ucfirst($this->str);
		return $this;
	}
	
	public function bold(){
		$this->str = '<strong>'.$this->str.'</strong>';
		return $this;
	}
	
	public function getStr(){
		return $this->str;
	}
}

$string = new String("TEXTO DE EXEMPLO");
echo $string->toLower()->capitalize()->bold()->getStr();
//Retornará <strong>Texto de exemplo</strong>
</pre>
<p>Bem mais simples, não? A diferença da outra classe, é que você retorna a instância do objeto a cada método chamado, permitindo o encadeamento.</p>
<p>Bom, como você pode ver, essa classe praticamente não tem muita utilidade, mas permite ter uma boa visão de como funciona a técnica. Agora é com você.</p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Tue, 20 Apr 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/37-method-chaining-com-php</guid>
			</item>
			<item>
				<title>Wikipédia no terminal do Linux</title>
				<description><![CDATA[<p>Tem louco pra tudo. É possível ver trechos de artigos da Wikipedia através de um lookup DNS em um servidor criado por <a href="https://dgl.cx/" rel="externo nofollow">David Leadbeater</a>. Por exemplo, para ler um trecho do artigo sobre Linux, digite o comando abaixo no terminal:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> dig +short txt Linux.wp.dg.cx
</div><p></p>
<p>Se você não tiver o dig pode fazer a consulta através do host:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> host -t txt Linux.wp.dg.cx
</div><p></p>
<p>Claro que isso não possui muita utilidade, pois somente são retornados 430 bytes. Outro problema é que, para consultas como por exemplo Power Metal, você deve inserir um underline entre as palavras, como é feito na Wikipédia.</p>
<p>Você também pode fazer um alias através do seguinte comando:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wiki() { dig +short txt $1.wp.dg.cx; }
</div><p></p>
<p>E procurar da seguinte maneira:</p>
<p></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> wiki Power_metal
</div><p></p>
<p>Abraço e até a próxima!</p>
<p></p>]]></description>
				<pubDate>Thu, 29 Apr 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/39-wikipedia-no-terminal-do-linux</guid>
			</item>
			<item>
				<title>Plugin para inserir vídeos do YouTube no CKEditor</title>
				<description><![CDATA[<p>Depois de alguns dias sem postar em razão de muito trabalho, Curso de Java e 7 matérias na faculdade, estou de volta com mais um plugin para o CKEditor. Muitos usuários leigos não sabem como inserir um vídeo do YouTube no CKEditor, por não saberem manipular o código fonte do texto. Resolvi criar esse plugin para auxiliar nesta tarefa. Basta apenas colar a URL do vídeo ou o código embed gerado pelo YouTube e o sistema se encarrega do resto.</p>
<p>Também é possível gerar código XHTML válido ao inserir um vídeo via URL. Quando o código XHTML válido é gerado, não aparece nenhum elemento na tela indicando um vídeo, mas no código fonte sim. Estranho.</p>
<p><span style="font-size: 14px;"><strong><br />Instalação<br /></strong></span></p>
<p>Baixe o <a href="http://www.ckeditor.com" rel="externo nofollow">CKEditor</a>, extraia para alguma pasta, baixe o <a href="http://www.fonini.net/labs/ckeditor-youtube.zip">Plugin</a> e extraia para a pasta plugins do CKEditor. Feito isso, você deve informar ao sistema para usar esse plugin. No arquivo "config.js", localizado na pasta do CKEditor, adicione a seguinte linha:</p>
<p></p>
<pre class="brush: js">
config.extraPlugins = "youtube";
</pre><p></p>
<p>Você também deve adicionar o botão do plugin na barra de ferramentas do programa. Veja um exemplo:</p>
<p></p>
<pre class="brush: js">
config.toolbar = [
	['Preview'],
	['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Print', 'SpellChecker'],
	['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
	['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
	['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
	['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
	['Link','Unlink','Anchor'],	['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar'],
	['Font','FontSize'],
	['TextColor','BGColor', '-', 'Source', 'YouTube']
];
</pre><p></p>
<p><span style="font-size: 14px;"><strong><br />Código<br /></strong></span></p>
<pre class="brush: js">
CKEDITOR.dialog.add( 'youtube', function( editor )
{
	return {
		title : 'Inserir vídeo do YouTube',
		minWidth : 390,
		minHeight : 230,
		contents : [
		{
			id : 'urlTab',
			label : 'URL do Vídeo',
			title : 'URL do Vídeo',
			elements :
			[
				{
					id : 'url',
					type : 'text',
					label : 'Cole a URL do vídeo do YouTube'
				},
				{
					id : 'xhtml',
					type : 'checkbox',
					label : 'XHTML válido'
				},
				{
					id : 'width',
					type : 'text',
					label : 'Largura',
					width : '40'
				},
				{
					id : 'height',
					type : 'text',
					label : 'Altura',
					width : '40'
				}
			]
		},
		{
			id : 'embedTab',
			label : 'Código Embed',
			title : 'Código Embed',
			elements :
			[
				{
					id : 'embed',
					type : 'textarea',
					label : 'Cole o código gerado pelo YouTube (embed)'
				}
			]
		}
        ],
		onOk : function() {
			var editor = this.getParentEditor();
			var contentUrl = this.getValueOf( 'urlTab', 'url' );
			var contentEmbed = this.getValueOf( 'embedTab', 'embed' );
			var xhtml = this.getValueOf( 'urlTab', 'xhtml' );
			var width = this.getValueOf( 'urlTab', 'width' );
			var height = this.getValueOf( 'urlTab', 'height' );

			width = width ? width : 450;
			height = height ? height : 366;
					
			if ( contentUrl.length > 0 ) {
				if (xhtml == true){
					contentUrl = contentUrl.replace(/^[^v]+v.(.{11}).*/,"$1");
					editor.insertHtml('<object type="application/x-shockwave-flash" style="width:' + width + 'px; height:' + height + 'px;" data="http://www.youtube.com/v/'+contentUrl+'"><param name="movie" value="http://www.youtube.com/v/'+contentUrl+'" /></object>');
				}
				else {
					contentUrl = contentUrl.replace(/^[^v]+v.(.{11}).*/, "$1");
					editor.insertHtml('<object width="' + width + '" height="' + height + '"><param name="movie" value="http://www.youtube.com/v/'+contentUrl+'"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+contentUrl+'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="' + width + '" height="' + height + '"></embed></object>');
				}
			}	
			else
			if ( contentEmbed.length > 0 ) {
				editor.insertHtml(contentEmbed);						
			}
		},
	buttons : [ CKEDITOR.dialog.okButton, CKEDITOR.dialog.cancelButton ]
	};

} );


CKEDITOR.plugins.add( 'youtube',
{
	init : function( editor )
	{
		var command = editor.addCommand( 'youtube', new CKEDITOR.dialogCommand( 'youtube' ) );
		command.modes = { wysiwyg:1, source:1 };
		command.canUndo = false;

		editor.ui.addButton( 'YouTube',
		{
			label : 'Inserir vídeo do YouTube',
			command : 'youtube',
			icon : this.path + 'youtube.png'
		});

		CKEDITOR.dialog.add( 'youtube', 'youtube' );
	}
});
</pre>
<p></p>
<p><span style="font-size: 14px;"><strong><br />Demo<br /></strong></span></p>
<p>Você pode ver um demo do sistema funcionando clicando <a href="http://www.fonini.net/labs/ckeditor" rel="externo nofollow">aqui</a>.</p>
<p>Abraço e até a próxima!<br /></p>]]></description>
				<pubDate>Thu, 25 Mar 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/34-plugin-para-inserir-videos-do-youtube-no-ckeditor</guid>
			</item>
			<item>
				<title>Tutorial de Hibernate com SQLite</title>
				<description><![CDATA[<p>Comecei a trabalhar com Java há um mês, usando o framework Hibernate. O Hibernate é uma camada de persistência que pode parecer confusa no início, mas proporciona uma grande produtividade, uma vez que gerencia todo o processo de comunicação com o banco de dados, desde criação e atualização de tabelas, até chaves estrangeiras.</p>
<p>O NetBeans 6.8 é uma IDE que facilita muito o processo de criação, pois já vem com o Hibernate incluso. Vale lembrar que é sempre bom saber fazer o trabalho de forma braçal, para conhecer o lugar onde você está se metendo. Resolvi usar SQLite para alguns testes com o Hibernate e estou disponibilizando um exemplo básico do processo, usando o NetBeans. Let's work!</p>
<p>Abra o NetBeans, clique em Arquivo/Novo projeto, selecione Java/Aplicativo Java e escolha um nome para seu projeto. No meu caso ficou TesteHibernate e finalize.</p>
<p>O próximo passo é incluir a biblioteca do Hibernate no projeto. Na aba Projetos, clique com o botão direito em Bibliotecas/Adicionar biblioteca e selecione o Hibernate JPA. Para trabalhar com o SQlite você deve incluir também o driver JDBC do mesmo do projeto. Baixe-o aqui caso você não tenha. Após baixado, crie uma pasta chamada lib na pasta do projeto. Você pode adicionar todas as bibliotecas externas nessa pasta para facilitar a organização. Após colocar o driver na pasta, adicione-o ao projeto clicando novamente na aba Projetos/Bibliotecas/Adicionar JAR/Pasta e selecione o driver.</p>
<p>Agora que já temos o Hibernate e o driver do SQLite incluídos, vamos criar a conexão com o banco de dados. Clique na aba Serviços/Banco de Dados/Drivers. Se o driver do SQLite não estiver aparecendo, clique com o botão direito em Drivers/Novo driver. Em Arquivos do driver, adicione o driver da pasta lib e clique em Localizar. Deverá aparecer "org.sqlite.JDBC" no campo Classe do Driver. Dê o nome SQLite ao driver e clique em OK.</p>
<p><img alt="Adicionando o driver do SQLite" src="http://www.fonini.net/images/driver.jpg" style="width: 516px; height: 245px;" /></p>
<p>Agora clique em Drivers/SQLite/Conectar utilizando.<br />Escolha um nome de usuário, uma senha e a seguinte URL JDBC: jdbc:sqlite:teste.db. O banco estará no arquivo "teste.db" na pasta raíz do projeto.</p>
<p><img alt="Conectando a um banco SQLite" src="http://www.fonini.net/images/conexao.jpg" style="width: 497px; height: 291px;" /></p>
<p>O próximo passo será criar a unidade de persistência do projeto. Clique em Arquivo/Novo arquivo/Persistence/Unidade de persistência. Em biblioteca de persistência, selecione o Hibernate, selecione sua conexão criada anteriormente e selecione a estratégia Criar e finalize.</p>
<p><img alt="Criando uma unidade de persistência" src="http://www.fonini.net/images/persistence.jpg" style="width: 604px; height: 177px;" /></p>
<p>O SQLite exige um dialeto SQL específico, que não vem incluído no Hibernate. Eu encontrei um no seguinte endereço: <a href="http://hibernate-sqlite.googlecode.com" rel="externo nofollow">http://hibernate-sqlite.googlecode.com</a>. Você pode baixar somente a classe necessária, <a href="http://www.fonini.net/labs/SQLiteDialect.zip">clicando aqui</a>. Extraia para a pasta "src" do projeto, ficando assim: "src/util/SQLiteDialect.java". Com a camada de persistência aberta no NetBeans (persistence.xml), clique em XML e adicione a linha do dialeto do SQLite, como mostrado abaixo:</p>
<p></p>
<pre class="brush: java">
<property name="hibernate.dialect" value="util.SQLiteDialect" />
</pre><p></p>
<p>A camada de persistência está pronta. Vamos a criação do model.</p>
<p>Clique em Arquivo/Novo arquivo/Java/Classe Java e dê o nome Pessoa para a classe. O código está abaixo. Não entrarei em detalhes com as anotações utilizadas, quem sabe isso fica para um próximo post.</p>
<p></p>
<pre class="brush: java">
package net.fonini.testehibernate;
	
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
* @author fonini
*/

@Entity
public class Pessoa implements Serializable {
	@Id
	@SequenceGenerator(name="seqPessoa")
	@GeneratedValue(generator="seqPessoa")
	private Integer id;
	
	@Column(length=50, nullable=false)
	private String nome;
	
	@Temporal(TemporalType.DATE)
	private Date aniversario;
	
	public Pessoa(){
	}
	
	public Date getAniversario() {
		return this.aniversario;
	}
	
	public void setAniversario(Date aniversario) {
		this.aniversario = aniversario;
	}
	
	public Integer getId() {
		return this.id;
	}
	
	public void setId(Integer id) {
		this.id = id;
	}
	
	public String getNome() {
		return this.nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
}	
</pre><p></p>
<p>Agora que temos nossa classe, vamos adicioná-la a unidade de persistência. Abra a unidade de persistência, e em "Incluir classes de entidade" clique em Adicionar e selecione a classe Pessoa. Se a classe não aparecer na listagem, verifique se as anotações estão corretas.</p>
<p>O próximo passo é criar uma classe de testes do JUnit para usá-la. Clique em Arquivo/Novo arquivo/Classe Java com o nome Teste e muda a localização para Pacotes de Testes. A classe irá possuir dois métodos: um deles persistirá 3 objetos Pessoa e o outro fará a listagem dos mesmos.</p>
<p></p>
<pre class="brush: java">
package net.fonini.testehibernate;

import java.util.Collection;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import org.junit.Test;

/**
	* @author fonini
*/
public class Teste {
	private EntityManager em;

	public Teste(){
		this.em = Persistence.createEntityManagerFactory("TesteHibernatePU").createEntityManager();
	}
	
	@Test
	public void inserir(){
	// Instanciamos um objeto Pessoa, setando nome e data de nascimento
		Pessoa p1 = new Pessoa();
		p1.setNome("Jonnas Fonini");
		p1.setAniversario(new Date());
	
		Pessoa p2 = new Pessoa();
		p2.setNome("Luana Fonini");
		p2.setAniversario(new Date());
	
		Pessoa p3 = new Pessoa();
		p3.setNome("Fulano de Tal");
		p3.setAniversario(new Date());
	
		// Iniciamos a transação
		em.getTransaction().begin();
		// Aqui persistimos os objetos recém criados
		em.persist(p1);
		em.persist(p2);
		em.persist(p3);
		// E aqui efetuamos definitivamente a transação
		em.getTransaction().commit();
	}
	
	@Test
	public void listar(){
		Collection <Pessoa> lista = em.createQuery("from Pessoa").getResultList();

		for (Pessoa p : lista){
			System.out.println(p.getId() + " - " + p.getNome() + " - " + p.getAniversario());
		}
	}
}
</pre><p></p>
<p>Execute os testes pressionando SHIFT+F6 e veja os resultados. Se os testes atingirem 100%, está tudo certo. Senão, procure a possível causa nas exceções. Se você usa um sistema Unix-like, verifique se a pasta raíz do projeto está com as permissões adequadas para a criação do banco de dados. Note que mesmo com os testes atingindo 100% de sucesso, ainda ocorreu uma exceção. Isso se deve ao fato do SQLite não possuir chave estrangeira.</p>
<p>Você pode <a href="http://www.fonini.net/labs/HibernateSQLite.zip">baixar o projeto completo</a>, com todas as bibliotecas necessárias incluídas.</p>
<p>Esse foi um tutorial bem básico, apesar de longo. Agora é com você. Bom estudos.<br />Abraço e até a próxima!</p>]]></description>
				<pubDate>Mon, 05 Apr 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/36-tutorial-de-hibernate-com-sqlite</guid>
			</item>
			<item>
				<title>Terceiro dia de palestras no FISL11</title>
				<description><![CDATA[<p>
	Hoje o dia foi muito cansativo, mas as palestras não me agradarm muito, por isso assiti poucas. Visitamos o prédio de informática da PUC-RS pela parte da tarde e comprei uma camiseta do Debian. Dormi na praia e não consegui mais encontrar camisetas do Ubuntu e do Tchê Linux. Damn. Mais tarde, eu e o @anibalsolon resolvemos um shell script proposto no estande da QI e ganhamos brindes :D.</p>
<p>
	<strong>09:00 - Faça você mesmo sua versão GNU/Linux (Isamar Villas Boas Perrelli Maia)</strong></p>
<p>
	O palestrante mostrou algumas formas de destrinchar uma distribuição do Ubuntu, mudando alguns aspectos e gerando um ISO de uma nova distribuição, inclusive com recursos de instalação silenciosa, útil para instalar em vários computadores rapidamente sem ter que escolher opções durante a instalação. O palestrante disponibilizou um endereço FTP com a palestra, mas não encontrei a mesma.<br />
	 </p>
<p>
	<strong>10:00 - <span style="">Palestrante não compareceu</span> - Aprofunde-se no PHP 5.3 - (Marcus Vinicius Bastos Leandro)</strong></p>
<p>
	Com certeza uma das palestras mais disputadas e com a menor sala do evento. Depois de enfrentar uma fila tremenda, fiquei frustrado ao saber que o palestrante ainda não havia entrado em contato com a organização e não sabiam se ele ia palestrar. O sujeito acabou não aparecendo. Tá certo, todo mundo é voluntário e só temos que agradecer pelo esforço que todos empreendem em palestrar gratuitamente, mas o rapaz podia ter avisado pelo menos.<br />
	 </p>
<p>
	<strong>18:00 - Ubuntu Master - Dicas e truques! (Luiz Thiago)</strong></p>
<p>
	Palestra muito descontraída, com o público interagindo muito com o palestrante e dando muitas risadas. O palestrante apresentou vários utilitários para facilitar a vida do usuário Ubuntu (e distribuições Debian-like), como gerenciador de clipboard, senhas, menu global, entre outros.<br />
	 </p>
<p>
	<strong>19:00 - Gerenciamento de memória virtual no Kernel Linux (João Eriberto Mota Filho)</strong></p>
<p>
	Essa foi uma das palestras que valeram o dia e o FISL. O palestrante explicou claramente como funciona o gerenciamento da memória virtual no Kernel do Linux, além de falar sobre partições, processos na memória e várias ferramentas para monitorar o uso da memória. Simplesmente foda. Aqui está o link para o download da palestra: <a href="http://www.eriberto.pro.br/palestras/memoria_linux.pdf" rel="externo nofollow">http://www.eriberto.pro.br/palestras/memoria_linux.pdf</a></p>
<p>
	Amanhã é o último dia e quero assistir a palestrado Jon "maddog" Hall. Aí sim vou para casa contente. Grande abraço pessoal!</p>
]]></description>
				<pubDate>Sat, 24 Jul 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/45-terceiro-dia-de-palestras-no-fisl11</guid>
			</item>
			<item>
				<title>Ajustes para o Ubuntu 10.04 Lucid Lynx</title>
				<description><![CDATA[<p>Aqui estão alguns ajustes que tive que fazer na minha instalação do Ubuntu 10.04 para deixar do jeito que eu queria. Compartilho aqui para o caso de alguém mais ter essas mesmas dúvidas.
</p>
<p><br /><strong>Posição dos botões na barra de título</strong><br />
O novo padrão adotado pela Canonical é posicionar os botões de fechar, maximizar e restaurar no lado esquerdo da janela. Felizmente, pra não quem não está acostumado com esta mudança, há uma maneira de voltar os botões à posição original. Para isso, abra um terminal e digite:<br /></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gconf-editor
</div>
<p>Na janela que irá abrir, navegue em <strong>apps/metacity/general</strong> e altere o valor do campo <strong>button_layout</strong> para o mesmo que está na imagem abaixo e feche o programa para efetivar as alterações.</p>
<p><img src="http://www.fonini.net/images/gconf-editor.png" alt="" /></p>
<p><br /><strong>Applet de volume</strong><br />
Outra mudança que eu notei (pode ser apenas um bug) é que o applet de volume não aparece mais na barra superior do Gnome. Para corrigir este problema, devemos adicionar o applet de volume aos aplicativos de sessão, que serão iniciados juntamente com o sistema. Para isso, vá em Sistema/Preferências/Aplicativos de sessão e clique em Adicionar, preenchendo com um nome escolhido por você e o seguinte comando: <strong>/usr/bin/gnome-volume-control-applet</strong>. Dessa forma, o aplicativo irá iniciar juntamente com o Gnome e sempre estará disponível.</p>
<p><br /><strong>Barra de navegação nas pastas</strong><br />
Antigamente existia um botão que permitia alterar a barra de navegação das pastas do modo gráfico para o modo texto, mas ele também sumiu na nova versão. Para alternar para a barra de navegação em modo texto, abra um terminal e digite:<br /></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> gconftool-2 --type=Boolean --set /apps/nautilus/preferences/always_use_location_entry true
</div>
<p><br /><strong>Reiniciar o X com CTRL+ALT+Backspace</strong><br />
Para habilitar esta opção, vá em Sistema/Preferências/Teclado. Clique na aba Disposições e no botão Opções. Procure "Key sequence to kill the X Server" e marque a opção CTRL+ALT+Backspace.</p>
<p><br /><strong>Caracteres inválidos no plugin Lyrics do Rhythmbox</strong><br />
A nova versão do Rhythmbox inclui um plugin para buscar letras de músicas no Terra. Porém, os apóstrofos vem bagunçados. Para corrigir isso, execute os seguintes procedimentos:<br /></p>
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> sudo gedit /usr/lib/rhythmbox/plugins/lyrics/TerraParser.py
</div>
<p>Procure por esta linha <strong>lyrics = re.sub('<[Bb][Rr]/>', '', lyrics)</strong> e adicione a seguinte linha abaixo dela: <strong>lyrics = lyrics.replace('&amp;#039;', '\'')</strong>. Salve o arquivo e reinicie o Rhythmbox.</p>
<p>Bom, esses foram os ajustes que eu precisei fazer na minha nova instalação do Ubuntu 10.04 Lucid Lynx. Espero que sejam úteis para alguém. Abraços e até a próxima!</p>]]></description>
				<pubDate>Tue, 08 Jun 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/linux/40-ajustes-para-o-ubuntu-1004-lucid-lynx</guid>
			</item>
			<item>
				<title>PHP - Trabalhando com PDO (PHP Data Objects)</title>
				<description><![CDATA[<p>
	Olá pessoal, voltando com um novo post depois de muito tempo sem blogar. Hoje vou falar sobre PDO (PHP Data Objects), uma extensão presente a partir da versão 5 do PHP que permite desenvolver códigos de acesso a banco de dados portáveis, mudando apenas uma linha de código.</p>
<p>
	Imagine um sistema cheio de mysql_connect's, mysql_query's e de uma hora pra outra você se vê obrigado a mudar o banco de dados pra PostgreSQL, por exemplo. Imagine o trabalho de alterar toda essa parte do seu projeto? O PDO veio para solucionar esse e muitos outros problemas, como o de SQL Injection, já que usa prepared statements (falarei deles mais abaixo). No caso de você ter um sistema inteiro usando PDO e decide mudar de SGBD, basta alterar apenas a linha de conexão com o tipo de banco de dados desejado.</p>
<p>
	 </p>
<p>
	<strong><span style="font-size: 14px;">Conexão</span></strong></p>
<p>
	 </p>
<pre class="brush: php">	try{
		$conn = new PDO('mysql:host=localhost;dbname=seuBD', 'root', '12345');
	}
	catch (PDOException $e){
		print 'Erro: ' . $e->getMessage();
	}
</pre>
<p>
	 </p>
<p>
	Este é um exemplo de conexão. Você pode criar uma classe utilizando o padrão <a href="http://pt.wikipedia.org/wiki/Singleton" rel="externo nofollow">Singleton</a>, instanciando apenas uma conexão PDO para a aplicação inteira. Se você quisesse alterar o SGBD para PostgreSQL, bastava apenas substituir a palavra <em>mysql</em> por <em>pgsql</em>.</p>
<p>
	Para descobrir quais drivers do PDO você tem disponíveis, execute o código abaixo:</p>
<p>
	 </p>
<pre class="brush: php">	foreach(PDO::getAvailableDrivers() as $driver){
		echo $driver.'<br />';
	}
</pre>
<p>
	 </p>
<p>
	Por padrão, o PDO não exibe erros de consultas escritas incorretamente, por exemplo. Para exibir os erros e facilitar o desenvolvimento da aplicação, basta passar os seguintes parâmetros ao objeto:</p>
<p>
	 </p>
<pre class="brush: php">	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
</pre>
<p>
	 </p>
<p>
	<strong><span style="font-size: 14px;">Selecionando dados<br />
	</span></strong></p>
<p>
	Agora que você já tem seu objeto PDO instanciado, é só usá-lo para realizar as consultas. Veja um exemplo de select:</p>
<p>
	 </p>
<pre class="brush: php">	$clientes = $conn->prepare('SELECT id, nome FROM clientes');
	$clientes->execute();

	while ($dadosClientes = $clientes->fetch()){
		echo 'ID: ' . $dadosClientes['id'] . '  Nome: ' . $dadosClientes['nome'] . '<br />';
	}
</pre>
<p>
	 </p>
<p>
	<br />
	Viu como é simples? Você também pode passar parâmetros para a consulta da seguinte forma:</p>
<p>
	 </p>
<pre class="brush: php">	$clientes = $conn->prepare('SELECT id, nome FROM clientes WHERE id = :id AND nome = :nome');
	$clientes->bindParam(':id', $_POST['id'], PDO::PARAM_INT);
	$clientes->bindParam(':nome', $_POST['nome']);
	$clientes->execute();

	while ($dadosClientes = $clientes->fetch()){
		echo 'ID: ' . $dadosClientes['id'] . '  Nome: ' . $dadosClientes['nome'] . '<br />';
	}
</pre>
<p>
	 </p>
<p>
	A grande vantagem do PDO é que se você usar prepared statements, não precisará se preocupar com SQL Injection, pois o PDO já faz todo o serviço de filtragem dos dados de entrada para você, de forma muito segura.</p>
<p>
	A lógica é a mesma para executar outros tipos de consultas. Veja um exemplo de insert:</p>
<p>
	 </p>
<pre class="brush: php">	$clientes = $conn->prepare('INSERT INTO clientes (nome) VALUES (:nome));
	$clientes->bindParam(':nome', $_POST['nome']);
	$clientes->execute();

	if ($clientes->rowCount() > 0){
		echo 'Registro inserido com sucesso';
	}
</pre>
<p>
	 </p>
<p>
	Para mais detalhes, consulte a <a href="http://br3.php.net/manual/en/book.pdo.php" rel="externo nofollow">documentação oficial</a>.</p>
<p>
	Espero que tenham gostado do post. Um abraço e até a próxima!</p>
]]></description>
				<pubDate>Tue, 29 Jun 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/41-php--trabalhando-com-pdo-php-data-objects</guid>
			</item>
			<item>
				<title>FISL11 - Fórum Internacional do Software Livre</title>
				<description><![CDATA[<p>
	De 21 a 24 de julho de 2010, será realizado o 11º Fórum Internacional do Software Livre, em Porto Alegre/RS. O FISL é considerado o maior encontro de comunidades de software livre da América Latina e um dos maiores do mundo.</p>
<p>
	Participei na edição de 2008 e posso dizer que realmente vale muito a pena. É um evento onde você encontra empresários, estudantes, programadores, enfim, entusiastas do software livre, tem a oportunidade de assistir inúmeras palestras gratuitas, inclusive de celebridades internacionais do software livre, participar dos mini-cursos e fazer novos amigos e até contatos profissionais.</p>
<p>
	O FISL11 será realizado no Centro de Eventos da Pontifícia Universidade Católica do Rio Grande do Sul (PUC-RS) de 21 a 24 de julho de 2010. Esta edição conta até agora com 153 palestras selecionadas. A grade de horários está sendo montada aos poucos, conforme os palestrantes confirmam a participação. Você pode acompanhar este processo <a href="http://verdi.softwarelivre.org/papers_ng/public/fast_grid" rel="externo nofollow">aqui</a>.</p>
<p>
	Para mais informações, consulte o site oficial do evento (<a href="http://www.fisl.org.br" rel="externo nofollow">http://www.fisl.org.br</a>).</p>
<p>
	<img alt="" src="http://www.fonini.net/http://www.fonini.net/images/FISL11_big.png" /></p>
<p>
	É isso ai galera, participem, vale muito a pena e quem sabe a gente não se encontra por lá para bater um papo.</p>
<p>
	FISL 11, A tecnologia que liberta.</p>
<p>
	Grande abraço!</p>
]]></description>
				<pubDate>Fri, 16 Jul 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/42-fisl11--forum-internacional-do-software-livre</guid>
			</item>
			<item>
				<title>Quarto e último dia de palestras no FISL11</title>
				<description><![CDATA[<p>
	Último dia do FISL11. No geral, o fórum valeu muito a pena, muitas palestras legais, algumas nem tanto, mas o que importa é a contribuição de cada um dos palestrantes com o software livre. O evento foi muito bem organizado, exceto a infra-estrutura wireless que decepcionou todo mundo novamente. Mas nem tudo é perfeito e ainda assim quero muito voltar no ano que vem. Ganhei uma camiseta do iG preenchendo um cadastro (sem validação nenhuma, por sinal). Destaque também para os adesivos muito legais do iG, alguns com os Ditados Populares (<a href="http://goncin.wordpress.com/2010/06/21/ditados-populares-em-php/" rel="externo nofollow">parte 1</a>, <a href="http://goncin.wordpress.com/2010/06/29/ditados-populares-em-php-parte-2/" rel="externo nofollow">parte 2</a>, <a href="http://goncin.wordpress.com/2010/07/22/ditados-populares-em-php-parte-3-a-batelada-final/" rel="externo nofollow">parte 3</a>), criação do Fausto Cintra (<a href="http://twitter.com/g0nc1n" rel="externo nofollow">@g0nc1n</a>), alguns reescritos em Ruby e Python, além de algumas frases legais em Shell Script.</p>
<p>
	<strong>09:00 - Testes automatizados para o desenvolvimento colaborativo (Rodrigo Damazio)</strong></p>
<p>
	Palestra muito boa, explicando alguns aspectos sobre testes automatizados, com alguns exemplos em Java e Python. Também foram mostradas algumas ferramentas open-source para auxilar no desenvolvimento, bem como uma leve explicação sobre frameworks de injeção de dependência.<br />
	 </p>
<p>
	<strong>10:00 - O Hacker e O Administrador de Redes (Paulo Fernando Lanella)</strong></p>
<p>
	Confesso que dormi em alguns momentos da palestra, que tratou sobre a cultura hacker e a rotina do administrador de redes, mas não foi legal como parece pelo título. A palestra teve uma parte legal, que era uma imagem da rotina do SysAdmin escrita em inglês com algumas frases engraçadinhas.<br />
	 </p>
<p>
	<strong>11:00 - Novidades do Django 1.2 e o que vem por aí (Marcos Daniel Petry)</strong></p>
<p>
	Palestra destinada a quem já conhece o Django, apresentando as novidades da nova versão. Quem não conhece, com certeza ficou com vontade de testar e usar.<br />
	 </p>
<p>
	<strong>13:00 - Quer aprender a programar de verdade? Pergunte-me como! (Henrique Bastos)</strong></p>
<p>
	A palestra abordou como os dojos podem ajudar que quer aprender a programar ou deseja aumentar seus conhecimentos. Também mostrou como é possível montar um pequeno grupo de estudos para aprender uma determinada linguagem colaborativamente, distribuir tarefas entre os participantes, discutir as soluções apresentadas e participar de eventos.<br />
	 </p>
<p>
	<strong>15:00 - Criando soluções inteligentes com Shell Script (Rafael de Carvalho Farias)</strong></p>
<p>
	Shell Script é muito massa. O palestrante mostrou como criar um script para configuração de servidores Linux, evitando tarefas repetitivas e automatizando algumas outras. Você pode ajudar e acompanhar o desenvolvimento do script no site do palestrante e desenvolvedor: <a href="http://www.rafaelfarias.com" rel="externo nofollow">http://www.rafaelfarias.com</a><br />
	 </p>
<p>
	<strong>16:00 - Depurando o kernel Linux de forma interativa com KGDB (Edjunior Barbosa Machado, Breno Leitão)</strong></p>
<p>
	Palestra bem técnica explicando como depurar o kernel do Linux para a resolução de problemas. Os palestrantes ressaltaram que o próprio Linux Torvalds não usa depuradores, mas os desenvolvedores estão autorizados a usá-los<br />
	 </p>
<p>
	<strong>18:00 - <em>Cancelada</em> - Database Refactoring com PostgreSQL (Fabrízio de Royes Mello</strong></p>
<p>
	<br />
	 </p>
<p>
	<strong>18:00 - oVirt - Ambiente minimalista de virtualização para servidores (Ricardo Marin Matinata)</strong></p>
<p>
	Usando o Fedora como base, o palestrante mostrou como criar um ambiente confiável e minimalista para virtualizar servidores. Dormi em alguns momentos e saí na metade.<br />
	 </p>
<p>
	<strong>19:00 - FOSS Business Basics (Jon "maddog" Hall)</strong></p>
<p>
	Última palestra do FISL que assisti. O grande Maddog mostrou o que é necessário ter para ganhar dinheiro com software livre. Infelizmente tive que sair na metade pois o ônibus ia sair em breve :(<br />
	 </p>
<p>
	É isso ai gurizadinha, terminou mais um FISL que valeu muito a pena, apesar de ser muito cansativo, mas tentaremos estar aqui novamente no ano que vem. </p>
<p>Veja <a href="http://www.flickr.com/photos/39474373@N05/sets/72157624461156003/" rel="externo nofollow">aqui</a> algumas fotos do evento. Obrigado por terem paciência de ler estes posts. Grande abraço!</p>
]]></description>
				<pubDate>Mon, 26 Jul 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/46-quarto-e-ultimo-dia-de-palestras-no-fisl11</guid>
			</item>
			<item>
				<title>Primeiro dia de palestras no FISL11</title>
				<description><![CDATA[<p>
	O dia da abertura do FISL11 foi extremamente cansativo. Cheguei aqui em Porto Alegre às 10:20 da manhã, após 5 horas de viagem de ônibus, com a caravana organizada pelo <a href="http://www.infosoft.inf.br" rel="externo nofollow">Amilton</a>.</p>
<p>
	É impressionante a quantidade de palestras interessantes, nem almocei direito para assistir a uma delas. Abaixo uma breve descrição de cada uma.</p>
<p>
	<strong>11:00 - Quer programar na sua linguagem preferida? No Gnome dá. (Gustavo Noronha)</strong></p>
<p>
	Palestra muito interessante mesmo, abordando desenvolvimento no ambiente Gnome através de GObjects, implementados na linguagem C, permitindo que você desenvolva as mais variadas aplicações usando a API dos GObjectos em diversas linguagens. O palestrante exibiu a implementação de um software para apresentações estilo Power Point, usando chamadas a objetos GObjects usando JavaScript, WebKit e HTML<br />
	 </p>
<p>
	<strong>12:00 - Java EE 6 Toolshow (Arun Gupta)</strong></p>
<p>
	Apresentada por um desenvolvedor indiano com mais de 14 anos no mercado Java, com tradução simultânea para o português. Praticamente um curso de NetBeans, EJB, JavaEE e JSF. Apesar do conteúdo interessante, o código nos telões era praticamente ilegível, o sotaque indiano atrapalhou bastante na compreensão e a tradução em tempo real estava horrível. Não pude deixar de rir ao ver o sobrenome do palestrante, lembrei na hora de um episódio de The Big Bang Theory, onde aparecia uma guria chamada Lalita Gupta :p<br />
	 </p>
<p>
	<strong>14:00 - Web Semântica, a terceira geração da web (Otávio Calaça Xavier)</strong></p>
<p>
	A sala mais lotada do dia. Palestrante abordando a web, desde a versão 1.0, passando pela 2.0, até chegar na versão 3.0, a web semântica. Algumas especificações RFD, SQLSPARk, entre outros<br />
	 </p>
<p>
	<strong>15:00 - Ecosistema Spring: a plataforma enterprise Java livre (Julio Viegas)</strong></p>
<p>
	Excelente palestra sobre o Spring, framework muito poderoso para a linguagem Java. Breve introdução sobre as características do Spring, bem como algumas ferramentas e componentes, como Spring Roo, Grails, CloudFoundry, entre outros.<br />
	Link para os slides da apresentação: <a href="http://www.slideshare.net/julioviegas/ecosistema-spring-aplataformaenterprisejav" rel="externo nofollow">http://www.slideshare.net/julioviegas/ecosistema-spring-aplataformaenterprisejav</a></p>
<p>
	<strong>16:00 - O caminho ágil entre requisitos e testes (Cesar Vianna)</strong></p>
<p>
	Não prestei atenção, pois estava começando a escrever este post e não é minha área<br />
	 </p>
<p>
	<strong>18:00 - Abertura oficial do evento</strong></p>
<p>
	Diversas autoridades presentes, o mesmo bla bla bla de sempre e um ótimo vídeo produzido pelo Kárlisson Bezerra (Nerdson). Destaque para os assovios para a deputada Manuela quando esta falou ao público. P.S.: A nossa caravana foi a que mais assoviou :p<br />
	 </p>
<p>
	É isso aí pessoal, esse foi só o primeiro dia, nem abriram os estandes ainda e ao todos são 153 palestras selecionadas, além de workshops, encontros de grupos de usuários e muito mais. Grande abraço e vida longa ao software livre!</p>
]]></description>
				<pubDate>Wed, 21 Jul 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/43-primeiro-dia-de-palestras-no-fisl11</guid>
			</item>
			<item>
				<title>Segundo dia de palestras no FISL11</title>
				<description><![CDATA[<p>
	<strong>09:00 - Passeio pelos estandes</strong></p>
<p>
	Nesta manhã visitamos os inúmeros estandes presentes no evento. Destaque para a Caixa Econômica Federal, com seu estande interativo e com uma fila imensa (mas imensa mesmo) para ganhar uma camiseta com sua caricatura. Também tirei uma foto com o lendário Jon "maddog" Hall, diretor executivo da Linux International. Ia postar a foto aqui, mas esqueci o cabo da câmera em casa. Posto assim que chegar em casa.<br />
	 </p>
<p>
	<strong>10:00 - Drumbeat, com Mark Surman, diretor executivo da Mozilla Foundation (Mark Surman)</strong></p>
<p>
	Apresentada pelo diretor da Mozilla Foundation (com tradução simultânea para o português, desta vez não usei), esta palestra tratou sobre o Drumbeat, um projeto da Fundação Mozilla para legendar vídeos colaborativamente, contando também com vários brasileiros que trabalham e colaboram com a Fundação Mozilla.<br />
	 </p>
<p>
	<strong>11:00 - Uso do PostgreSQL para soluções corporativas (Almir Trindade Luz)</strong></p>
<p>
	Esta palestra mostrou como a Caixa Econômica Federal da Bahia está migrando seus softwares da plataforma ASP.NET/SQLServer para Java/PostgreSQL. Alguns tópicos sobre detalhes de implementação do banco, como sequências para auto-incremento, tamanhos máximos de bancos, tabelas e campos que o SGBD suporta, entre outros, além de falar sobre biometria e como a Caixa pretende armazenar informações biométricas de todos os seus clientes no futuro.<br />
	 </p>
<p>
	<strong>13:00 - A arte do desenvolvimento PHP (Anderson Casimiro)</strong></p>
<p>
	Esta palestra abordou tudo que é necessário para desenvolver em PHP, desde IDE's até frameworks. Rápida apresentação de vários recursos para facilitar a vida do desenvolvedor web, testes unitários, ferramentas de integração contínua e algumas novidades presentes na versão 5.3 do PHP.<br />
	 </p>
<p>
	<strong>15:00 - O novo protocolo de comunicação web: WebSockets (Wellington Fernando de Macedo)</strong></p>
<p>
	Solução para enviar, receber e confirmar recebimento e envio de dados na mesma conexão, dispensando o uso de AJAX e algumas outras gambiarras. O palestrante mostrou um chat feito com um frame oculto, envolto por um laço infinito em PHP, responsável por atualizar as informações do chat. Após, mostrou o mesmo chat desenvolvido em AJAX com PHP. Após isso, mostrou a solução feita com WebSockets, um novo protocolo desenvolvido por ele, que já está presente em alguns browsers e está sendo implementado em outros. A solução dispensa o uso de programação server-side no processo, porém depende de uma extensão escrita em Python que deve ser carregada no servidor web.<br />
	 </p>
<p>
	<strong>17:00 - Aumentando seus lucros usando Python (André Fonseca)</strong></p>
<p>
	Divertida palestra apresentada por um desenvolvedor que trabalha na Globo (especialmente G1 e Globo Esporte). O palestrante falou sobre como usar Python e seus frameworks pode acelerar o desenvolvimento de uma aplicação de alta qualidade, garantindo a satisfação do cliente e aumentando os lucros.<br />
	 </p>
<p>
	<strong>18:00 - Por que Python? (Marco Mendes)</strong></p>
<p>
	Mais uma palestra sobre Python (agora pretendo estudar de vez essa linguagem), mostrando alguns casos de usos conhecidos, como o YouTube. Abordou também detalhes e características técnicas do Python e como este é adotado cada vez mais por grandes empresas.</p>
<p>
	Amanhã pretendo pegar tudo que é muamba dos estandes e comprar algumas camisetas. Grande abraço pessoal!</p>
]]></description>
				<pubDate>Thu, 22 Jul 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/44-segundo-dia-de-palestras-no-fisl11</guid>
			</item>
			<item>
				<title>sfNicEditPlugin: Adicione um editor de texto rico aos seus forms no Symfony</title>
				<description><![CDATA[<p>Em meados de 2009 usei o framework Symfony para desenvolver um sistema em PHP para um projeto do qual eu era bolsista. Terminado o projeto, abandonei o framework. Agora reiniciei meus estudos e estou gostando bastante. Tanto que já desenvolvi meu primeiro plugin para compartilhar com a comunidade e já tenho muitos outros em mente.</p>
<p>O nome do plugin é sfNicEditPlugin. Ele adiciona uma instância do editor de texto rico <a href="http://www.nicedit.com" rel="externo nofollow">NicEdit</a> a um textarea. Esta é a primeira versão do plugin, ainda faltam alguns parâmetros que o NicEdit aceita, outros já estão disponíveis.</p>
<p>Você pode encontrar o plugin no meu <a href="http://github.com/fonini/sfNicEditPlugin" rel="externo nofollow">GitHub</a> ou na <a href="http://www.symfony-project.org/plugins/sfNicEditPlugin" rel="externo nofollow">página de plugins do Symfony</a>. Em ambos os locais você encontra instruções de instalação em inglês. Aqui no blog vou publicar a versão em português.<br /></p>

<strong>Instalação</strong><br >

<p>Instalação (via pacote PEAR)<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> symfony plugin:install sfNicEditPlugin
</div>
<br /><br />
Instalação via Git<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> git clone git://github.com/fonini/sfNicEditPlugin.git
</div><br />
Ou baixe o plugin <a href="http://plugins.symfony-project.org/get/sfNicEditPlugin/sfNicEditPlugin-1.0.1.tgz" rel="nofollow externo">aqui</a> e extraia para a pasta plugins.<br /><br />
Você deve ativar o plugin, editando o arquivo config/ProjectConfiguration.class.php.<br /></p>

<pre class="brush: php">
class ProjectConfiguration extends sfProjectConfiguration{
	public function setup(){
		$this->enablePlugins(array('sfDoctrinePlugin', 'sfNicEditPlugin', '...'));
	}
}
</pre>

<p>Após ativar o plugin, você deve publicar os arquivos CSS e JS utilizados por ele. Rode o seguinte comando:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> symfony plugin:publish-assets
</div>
      
Por último, limpe o cache:<br />
<div class="terminal">
<img src="http://www.fonini.net/images/valhalla.png" alt="" /> symfony cc
</div><br /></p>

<strong>Usando o widget</strong><br /><br />
<p>Basta você editar a classe que gera o form em que você vai usar o NicEdit, por exemplo lib/form/doctrine/NewsForm.class.php.<br /></p>

<pre class="brush:php">
public function configure(){
	$this->setWidget('text', new sfWidgetFormTextareaNicEdit(array('fullPanel' => true), array('cols' => 100, 'rows' => 20)));
}
</pre>

<p>Pretendo disponibilizar uma nova versão em breve com todos os parâmetros de configuração disponíves no NicEdit. Entre em contato em caso de dúvida. Abraço!</p>]]></description>
				<pubDate>Tue, 24 Aug 2010 00:00:00 -0300</pubDate>
				<guid>http://www.fonini.net/posts/47-sfniceditplugin:-adicione-um-editor-de-texto-rico-aos-seus-forms-no-symfony</guid>
			</item>

	</channel>
</rss>
