<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jeveaux.com &#187; Linux</title>
	<atom:link href="http://jeveaux.com/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://jeveaux.com</link>
	<description>blog de um apaixonado por programação, videogame, leitura, ideias empreendedoras e agora tatuagem</description>
	<lastBuildDate>Tue, 05 Jul 2011 19:40:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Aprendendo a enviar e-mails autênticos</title>
		<link>http://jeveaux.com/2010/aprendendo-a-enviar-e-mails-autenticos/</link>
		<comments>http://jeveaux.com/2010/aprendendo-a-enviar-e-mails-autenticos/#comments</comments>
		<pubDate>Sun, 16 May 2010 16:08:09 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[a]]></category>
		<category><![CDATA[antispam]]></category>
		<category><![CDATA[antispam.br]]></category>
		<category><![CDATA[cname]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mx]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[sendmail]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=1185</guid>
		<description><![CDATA[Hoje em dia o e-mail é algo tão presente no nosso dia a dia que poucas vezes paramos para pensar em toda a complexidade que está envolvida por trás do funcionamento deste serviço. É muito semelhante a outros serviços básicos, &#8230; <a href="http://jeveaux.com/2010/aprendendo-a-enviar-e-mails-autenticos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia o e-mail é algo tão presente no nosso dia a dia que poucas vezes paramos para pensar em toda a complexidade que está envolvida por trás do funcionamento deste serviço. É muito semelhante a outros serviços básicos, como energia elétrica, por exemplo, alguém já parou pra pensar sobre os meios geração, produção, transporte e distribuição de energia elétrica? E de e-mails? Às vezes parece que funciona por mágica, a intenção é que os usuários realmente pensem assim, mas a coisa não é tão simples assim na prática.</p>
<p>E não é difícil imaginar que haja muita magia &#8211; de verdade &#8211; envolvida na configuração de um servidor de e-mail, especialmente quando você precisa configurar um deles para enviar e-mails autênticos. São muitas variáveis envolvidas e algumas formas de trabalho diferentes entre cada tipo de servidor de e-mail, o que dificulta um pouco as coisas. Mas alguns conceitos importantes nós devemos conhecer a fundo pois serão úteis em qualquer ambiente e com qualquer aplicação de servidor de e-mail.</p>
<blockquote><p>Apenas uma observação: eu não sou especialista em administração de servidores, muito menos em servidores de e-mails, as dicas a seguir são fruto de muito estudo, tentativas, erros e acertos até chegar numa configuração e conhecimento que estão me atendendo.</p></blockquote>
<h2>O host, hostname e domain</h2>
<p>Você sabe (sem consultar) qual o FQDN <em>(Fully Qualified Domain Name)</em> da sua máquina? E dos servidores que você usa e/ou administra? É comum que você não saiba, principalmente se não forem servidores de e-mail ou web.</p>
<p>O FQDN nada mais é do que o nome do host (hostname) junto com o nome do domínio (DNS). Na maioria dos servidores, especialmente os de desenvolvimento, a maior importância do hostname é a possibilidade de dar nomes personalizados para as máquinas, mas em produção isso tem uma importância bem grande.</p>
<h2>A configuração e validação por SPF</h2>
<p>SPF &#8211; <em>Sender Policy Framework</em> &#8211; é uma tentativa para controlar a quantidade de e-mails forjados que circulam na internet. Como encontramos no <a href="http://www.openspf.org/FAQ/What_is_SPF">FAQ do SPF</a>: <em>&#8220;SPF não é anti-spam da mesma forma que a farinha não é comida, é parte da solução&#8221;</em>. O SPF é um das configurações mais importantes para a maioria dos seus e-mails serem entregues com sucesso, especialmente se você quiser entregar e-mail para os servidores do gmail.</p>
<p>Citando um pouco o FAQ do SPF: <em>&#8220;O SPF é um protocolo desenvolvido por um grupo de voluntários, motivados e unidos por um desejo em comum de melhorar o funcionamento da internet. Não é um produto comercial oferecido por uma empresa com fins lucrativos&#8221;</em>. O protocolo SPF está sendo adotado por um número crescente de servidores de hospedagem e ISPs &#8211; <em>Internet Service Providers</em>, tornando-se cada vez mais importante e essencial para o funcionamento correto de um servidor de e-mails.</p>
<p>Na configuração do DNS do domínio o SPF aparece como uma entrada TXT comum, com esta aparência:</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">v=spf1 a mx ...</div></td></tr></tbody></table></div>
<p>Para consultar as entradas TXT de um domínio, use: <code class="codecolorer text default"><span class="text">dig txt dominio.com</span></code>. Um exemplo completo de configuração de SPF:</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">v=spf1 a mx ip4:192.168.1.2 include:aspmx.googlemail.com include:google.com include:_spf.google.com -all</div></td></tr></tbody></table></div>
<p>Nesta configuração estou dizendo que, para o domínio em questão (imaginando o jeveaux.com) o IP 192.168.1.2 é um IP válido para enviar e-mails utilizando o domínio jeveaux.com. Além disso estou também incluindo os domínios de envio do Google para que possam também enviar e-mails utilizando o meu domínio (neste caso através do google apps).</p>
<p>É importante reparar um detalhe no final: <code class="codecolorer text default"><span class="text">-all</span></code>. Esta cláusula está informando que qualquer outro IP (all) deverá ser negado (-), mas pode ser configurado de outras maneiras se você precisar, usando o <code class="codecolorer text default"><span class="text">-all</span></code> ou diretamente um IP:</p>
<ul>
<li>-all &#8211; <em>Fail</em> &#8211; Recusa qualquer e-mail partindo de outros IPs que não estiverem na configuração do SPF</li>
<li>+all &#8211; <em>Pass</em> &#8211; Significa que todo IPs (todo mundo) está autorizado a enviar e-mails em nome do seu domínio</li>
<li>~all &#8211; <em>SoftFail</em> &#8211; Intermediário entre o <em>Fail (-)</em> e o <em>Pass (+)</em>. Geralmente usado em transições de domínios ou servidores de domínios.</li>
<li>?all &#8211; <em>Neutral</em> &#8211; O dono do domínio não tem como ou não quer definir quem está autorizado a enviar e-mails em nome do seu domínio</li>
</ul>
<p><a href="http://www.antispam.br/admin/spf/">Mais informações e detalhes sobre o SPF aqui no Antispam.br</a>.</p>
<h2>MX ou A records?</h2>
<p>Esta é uma dúvida que eu já tive diversas vezes e sempre precisei pensar e repensar a mesma coisa várias e várias vezes. Mas é muito mais simples do que parece, vejamos por necessidade:</p>
<ul>
<li>O servidor de e-mails em questão funciona apenas como SMTP (envio) ou também é utilizado como POP/IMAP (recebimento)?</li>
</ul>
<p>Se a resposta for <strong>SIM</strong>, o seu servidor de e-mails apenas envia e-mails, esqueça a configuração dos MX Records pois elas não lhe serão úteis, preocupe-se apenas com que exista um registro do tipo A no seu domínio contendo o nome (o hostname visto acima) do seu servidor associado com o IP do mesmo.</p>
<p>Se a resposta for <strong>NÃO</strong>, o seu servidor de e-mails também receberá e-mails, então lembre-se também de configurar corretamente os registros MX no seu domínio. Mas como neste artigo estou focando apenas no envio não entrarei em detalhes na configuração do MX, para mais informações <a href="http://en.wikipedia.org/wiki/MX_record">siga por aqui</a>.</p>
<h2>DNS Reverso</h2>
<p>DNS o que!? Reverso!? Pois é, DNS reverso. Pense num domínio: é um nome que encaminha você até um determinado servidor &#8211; IP. Agora pense de maneira reversa, ao contrário: a partir de um determinado servidor &#8211; ou IP &#8211; como chego ao domínio? Pois é isso que faz a configuração do DNS reverso, ela permite que outros servidores verifiquem a identidade do seu servidor comparando se um determinado IP bate com o IP informado no servidor de DNS.</p>
<p>Exemplo: Verificando o IP de um domínio através da resolução de DNS.</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">jeveaux<span style="color: #000000; font-weight: bold;">@</span>valakas ~  $ host giran.com.br<br />
<br />
giran.com.br has address 109.74.206.147</div></div>
<p>E agora fazendo a resolução reversa, de um IP para o domínio.</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">jeveaux<span style="color: #000000; font-weight: bold;">@</span>valakas ~  $ host 109.74.206.147<br />
<br />
147.206.74.109.in-addr.arpa domain name pointer giran.com.br.</div></div>
<p>Na maioria dos casos essa configuração será até fácil, basta pedir ao responsável pelo seu servidor de DNS que o faça. Exceto se você for o responsável também pelo servidor de DNS, então você terá que fazer a configuração do DNS reverso também. Se você precisar configurar manualmente o seu DNS reverso precisará saber um pouco sobre o BIND, recomendo <a href="http://www.dicas-l.com.br/dicas-l/20061127.php">este tutorial do Dicas-L</a>.</p>
<h2>Resumindo o que é importante lembrar</h2>
<p>Se você quiser enviar e entregar e-mails corretamente para todos os servidores &#8211; ou o máximo possível &#8211; lembre-se de configurar corretamente:</p>
<ol>
<li>O hostname e domínio do seu servidor de e-mail</li>
<li>O DNS do domínio com uma entrada válida no SPF para o IP do servidor de e-mails</li>
<li>O DNS reverso no servidor de DNS da rede do servidor para o nome configurado no registro A (próximo passo)</li>
<li>O DNS do domínio com um registro do A apontando para o IP do seu servidor de e-mails.</li>
</ol>
<p>Alguns servidores de e-mail farão apenas a verificação por SPF ou DNS, por isso, configure sempre os dois, não custa nada e vai poupar algumas dores de cabeça e muitas falhas na entrega dos e-mails.</p>
<h2>Um cenário fictício baseado no meu cenário real</h2>
<p>Basicamente omiti apenas os nomes e os endereços IP dos hosts por outros que não são válidos, mas que são suficientes para exemplificar. Vamos ao exemplo:</p>
<p>O domínio jeveaux.com.br, registrado no registro.br está usando os servidores de DNS da Linode. Imaginando uma situação onde temos uma infra-estrutura grande e que uma determinada aplicação precise enviar muitos e-mails, o site ficará num servidor (<code class="codecolorer text default"><span class="text">srv1</span></code>) e o servidor de e-mails ficará em outro servidor (<code class="codecolorer text default"><span class="text">srv2</span></code>), logo, teremos dois IPs diferentes.</p>
<ul>
<li><code class="codecolorer text default"><span class="text">srv1</span></code>: apenas servidor web (o site, apache), IP 192.168.1.1</li>
<li><code class="codecolorer text default"><span class="text">srv2</span></code>: apenas servidor de e-mail (postfix, sendmail, etc), IP 192.168.1.2</li>
</ul>
<p>Servidores configurados, tudo funciona. Então vem o primeiro problema: Meus e-mails não estão nem caindo como spam, eles sequer são entregues, e agora?</p>
<p>A primeira coisa a se verificar é a configuração do domínio. Como está o SPF? O domínio jeveaux.com.br está dizendo explicitamente que o IP do <code class="codecolorer text default"><span class="text">srv2</span></code> pode enviar e-mails por este domínio?</p>
<p><strong>Configure o SPF</strong>, algumas mensagens começarão a ser entregues, mas não são todas, e agora? Será comum encontrar no log estas mensagens de erro:</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">550 5.7.1 Client host rejected: cannot find your hostname, [xxx.xxx.xxx.xx]<br />
<br />
450 5.7.1 Client host rejected: cannot find your reverse hostname, [xxx.xxx.xxx.xx]</div></div>
<p>Vamos ao mais fácil: depois de configurar o SPF, vamos <strong>configurar o DNS reverso</strong>, você pode solicitar ao seu datacenter, ou no caso do Linode fazer diretamente no painel de controle. Com o DNS reverso configurado agora quase todas as mensagens já são entregues, mas nem todas. O que ainda está faltando?</p>
<p><strong>Configurar um apontamento válido no domínio</strong> para o endereço do seu servidor <code class="codecolorer text default"><span class="text">srv2</span></code>, <strong>uma entrada do tipo A</strong> na configuração do domínio será suficiente. Mas qual o hostname &#8211; <em>não falei que seria importante!?</em> &#8211; completo do seu servidor?</p>
<p>No meu servidor <code class="codecolorer text default"><span class="text">srv2</span></code> eu vou executar o comando hostname -f e ver o retorno:</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user@srv2 ~  $ hostname -f<br />
<br />
mail.jeveaux.com.br</div></div>
<p>O que isso quer dizer? Quer dizer que esse nome é o nome que é utilizado <a href="http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#SMTP_transport_example">para iniciar uma conversão entre o seu servidor de e-mails e o servidor de e-mails que você pretende entregar uma mensagem</a>. É (literalmente) assim:</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Server: 220 mail.jeveaux.com.br ESMTP Postfix<br />
<br />
Client: HELO mail.jeveaux.com.br</div></div>
<p>Ocorre que, quando o cliente (o servidor que você quer entregar um e-mail) for verificar o IP de mail.jeveaux.com.br ele não encontrará nada, ou talvez até encontre o IP do <code class="codecolorer text default"><span class="text">srv1</span></code>, dependendo de como estiver a configuração do seu domínio, levando o cliente a concluir que este remetente não é válido. Isso pode fazer seus e-mails irem para a caixa de spam ou diretamente recusados.</p>
<p>Crie então uma entrada do tipo <strong>A</strong> com o nome <strong>mail</strong> dentro do domínio jeveaux.com.br apontando para o IP do <code class="codecolorer text default"><span class="text">srv2</span></code>.</p>
<p>Com estas configurações você terá as credenciais suficientes para entregar e-mails com autenticidade em qualquer servidor de e-mails. É claro que isso não lhe concederá garantias que o e-mail passará como não sendo spam com qualquer conteúdo que você enviar, isso é completamente diferente. Mas ao menos você preencheu os requisitos essenciais para identificar o seu servidor e valida-lo como um servidor autorizado dentro do seu domínio.</p>
<p>Existem muitas outras maneiras de fazer essa configuração, seja através de ajustes no seu servidor de e-mail, no DNS, etc. As que eu expliquei aqui são as que eu faço e utilizo e que consegui compreender com clareza até hoje.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2010/aprendendo-a-enviar-e-mails-autenticos/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Trabalhando com mais de um JDK no Ubuntu</title>
		<link>http://jeveaux.com/2009/trabalhando-com-mais-de-um-jdk-no-ubuntu/</link>
		<comments>http://jeveaux.com/2009/trabalhando-com-mais-de-um-jdk-no-ubuntu/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 20:29:49 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[Java5]]></category>
		<category><![CDATA[Java6]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=855</guid>
		<description><![CDATA[Hoje em dia ter o Java5 e Java6 instalados na máquina de um desenvolvedor é praticamente uma obrigação. Java2 1.4 e Java7 também figuram bastante, ao menos aqui por estas bandas. No meu macbook, que uso para trabalhar, eu controle &#8230; <a href="http://jeveaux.com/2009/trabalhando-com-mais-de-um-jdk-no-ubuntu/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia ter o Java5 e Java6 instalados na máquina de um desenvolvedor é praticamente uma obrigação. Java2 1.4 e Java7 também figuram bastante, ao menos aqui por estas bandas.</p>
<p>No meu macbook, que uso para trabalhar, eu controle tudo via a variável de ambiente <em>$JAVA_HOME</em>, é bem tranquilo. Quando quero compilar ou rodar alguma coisa com outro JDK/JVM é só mudar o <em>$JAVA_HOME</em> e pimba!</p>
<p>Quando eu usava Ubuntu sempre tive problemas para instalar mais de um JDK através do apt-get. A instalação era uma maravilha, como sempre no apt-get, mas por algum motivo o JDK e JVM padrões sempre ficavam com a versão mais alta. Eu tentava <em>&#8216;corrigir&#8217;</em> usando a solução do <em>$JAVA_HOME</em> e incluindo o <em>$JAVA_HOME/bin</em> no <em>$PATH</em>, mas isso só funcionava enquanto eu estivesse no bash ou em aplicações que não fizessem referência direta ao <em>/usr/bin/java</em>.</p>
<p>Recentemente assumimos alguns servidores aqui na <a href="http://www.giran.com.br">Giran</a> e estamos migrando todos para Ubuntu Server. Não vou entrar no mérito dos porquês desta escolha para não criar uma guerra santa. Mas o que importa é que nestes servidores nós queríamos usar o apt-get para gerenciar todos os pacotes, afinal não temos <span style="text-decoration: line-through;">paciência</span> tempo para cuidar de tantos detalhes pequenos em tantos servidores.</p>
<p>Ao instalar um JDK, qualquer versão, através do apt-get, vários comandos estarão disponíveis no <em>$PATH</em>, dentre eles o <em>java, javac, javap, jar</em>, etc. Estes comandos estão sempre <em>/usr/bin</em>, mas são um link simbólico para os comandos em <em>/etc/alternatives</em>, que por sua vez são um link simbólico para o arquivo executável de verdade. Após instalar mais um JDK aí a coisa complica, qual deles será o padrão!? A cadeia de links simbólicos continua a mesma e mudar todos (mais de 15) manualmente não é muito indolor.</p>
<p>As instalações ficam sempre em <em><strong>/usr/lib/jvm/java-$versão<span style="font-style: normal;"><span style="font-weight: normal;">, que é exatamente onde vão bater os links simbólicos de <em>/etc/alternatives</em></span></span></strong></em>. No meu caso, por exemplo, tenho estas duas instalações: <em>/usr/lib/jvm/java-6-sun</em> e <em>/usr/lib/jvm/java-1.5.0-sun</em>. Se eu quiser alternar entre elas como padrão para todo o sistema, posso simplesmente usar o comando <strong><em>&#8220;update-alternatives&#8221;</em></strong> ao invés de sofrer reconfigurando um monte de link simbólico.</p>
<p>Então vamos lá:</p>
<pre lang="bash">spock@vulcan:~$ sudo update-alternatives --config java
There are 2 alternatives which provide `java'.
Selection    Alternative
-----------------------------------------------
+        1    /usr/lib/jvm/java-6-sun/jre/bin/java
*        2    /usr/lib/jvm/java-1.5.0-sun/jre/bin/java

Press enter to keep the default[*], or type selection number: 2
Using '/usr/lib/jvm/java-1.5.0-sun/jre/bin/java' to provide 'java'.</pre>
<p>E pronto, simples assim. O item com o sinal de + (mais) é a opção default e o item com o sinal de * (asterisco) é a opção atual.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/trabalhando-com-mais-de-um-jdk-no-ubuntu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ativando Syntax Highlighting no VIM</title>
		<link>http://jeveaux.com/2009/ativando-syntax-highlighting-no-vim/</link>
		<comments>http://jeveaux.com/2009/ativando-syntax-highlighting-no-vim/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 20:54:21 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Syntax Highlighting]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VI]]></category>
		<category><![CDATA[VIM]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=812</guid>
		<description><![CDATA[Recentemente participei de algumas discussões nas listas que participo que abordaram ambiente de desenvolvimento e, consequentemente, editores e IDEs. A escolha do editor ou da IDE é algo completamente particular e extremamente pessoal, e depois que alguém adota alguma ferramenta, não &#8230; <a href="http://jeveaux.com/2009/ativando-syntax-highlighting-no-vim/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Recentemente participei de algumas discussões nas listas que participo que abordaram ambiente de desenvolvimento e, consequentemente, editores e IDEs. A escolha do editor ou da IDE é algo completamente particular e extremamente pessoal, e depois que alguém adota alguma ferramenta, não adianta alfinetar ou empalar com uma lança, as opiniões dificilmente mudarão, não importa quais ou quantos argumentos forem usados. Até mesmo por isso não quero falar sobre melhor ou pior aqui.</p>
<p>Numa dessas discussões, inevitavelmente começaram a falar sobre o VIM e num determinado momento alguém exclamou que o VIM era tão ruim que nem Syntax Highlighting fazia. Mas oras, é claro que faz. Uma dica rápida.</p>
<h3>1) Ativando Syntax Highlighting manualmente</h3>
<p>Durante a edição de um arquivo, você pode ativar ou desativar a Syntax Highlighting quando quiser. Para ativar:</p>
<pre lang="bash">:syntax on</pre>
<p>E para desativar:</p>
<pre lang="bash">:syntax off</pre>
<h3>2) Ativando Syntax Highlighting automaticamente</h3>
<p>Se você quiser, pode deixar que o VIM faça isso automaticamente sempre que possível. Pra isso edite o arquivo <em><strong>vimrc</strong></em> e adicione o trecho abaixo. No Linux esse arquivo geralmente fica em <em>/etc/vim/vimrc</em>, enquanto no Mac OS X você o encontrará em <em>/usr/share/vim/vimrc</em>.</p>
<pre lang="bash">if has("syntax")
  syntax on
endif</pre>
<p>E é isso. Feche e abra o próprio arquivo <em><strong>vimrc</strong></em> e veja as diferenças. No meu caso ele ficou assim:</p>
<p><a style="text-decoration: none;" href="http://www.jeveaux.com/blog/wp-content/uploads/2009/06/picture-2.png"><img class="aligncenter size-full wp-image-814" title="picture-2" src="http://www.jeveaux.com/blog/wp-content/uploads/2009/06/picture-2.png" alt="picture-2" width="642" height="394" /></a></p>
<p>Os arquivos de syntax ficam no diretório <em>syntax</em> dentro do diretório de instalação do vim, pro caso de você querer mudar alguma coisa.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/ativando-syntax-highlighting-no-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2 e Tomcat com mod_jk</title>
		<link>http://jeveaux.com/2009/apache2-e-tomcat-com-mod_jk/</link>
		<comments>http://jeveaux.com/2009/apache2-e-tomcat-com-mod_jk/#comments</comments>
		<pubDate>Sun, 03 May 2009 15:43:20 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[App Servers]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache2]]></category>
		<category><![CDATA[mod_jk]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=653</guid>
		<description><![CDATA[Nesses últimos dias trabalhei bastante na administração e configuração de servidores *nix na Giran, revivendo algumas experiências antigas e aprendendo muitas outras novas e estou aproveitando para escrever um pouco sobre elas. Configurando um servidor de desenvolvimento da Giran as &#8230; <a href="http://jeveaux.com/2009/apache2-e-tomcat-com-mod_jk/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nesses últimos dias trabalhei bastante na administração e configuração de servidores *nix na <a href="http://www.giran.com.br">Giran</a>, revivendo algumas experiências antigas e aprendendo muitas outras novas e estou aproveitando para escrever um pouco sobre elas.</p>
<p>Configurando um servidor de desenvolvimento da Giran as novidades não foram grandes, a maioria das aplicações, serviços e preocupações foram as mesmas de um ambiente de desenvolvimento local. Já as experiências com a configuração do servidor de produção foram bem mais legais e algumas inéditas. Oracle, MySQL, SVN, Gitorious, <a href="http://www.rubyenterpriseedition.com">Ruby Enterprise Edition</a> + <a href="http://www.modrails.com">Passenger</a> e claro, <a href="http://httpd.apache.org">Apache 2 HTPP Server</a> e <a href="http://tomcat.apache.org">Apache Tomcat</a>.</p>
<p>Por hora vou escrever apenas sobre o <em>mod_jk</em>, que é a integração entre o <a href="http://httpd.apache.org">Apache 2 HTPP Server</a> e o <a href="http://tomcat.apache.org">Apache Tomcat</a>. Eu já tive experiências anteriores com o mod_jk em ambientes de produção, em ambientes com redudância, com tomcat, com jboss e alguns mais, mas ainda não havia passado por uma situação onde eu iniciasse do zero e todas as responsabilidades estivessem comigo, e isso foi ótimo.</p>
<p>Um resumo do ambiente:</p>
<ul>
<li>Ubuntu Server 8.04</li>
<li>Apache 2 HTTP Server 2.2.8</li>
<li>Apache Tomcat 6.0.18</li>
<li>JDK 1.6.0_13</li>
</ul>
<h3>O Apache</h3>
<p>O Apache e o <em>mod_jk</em> foram instalados usando o próprio apt-get, então esta tarefa foi realmente muito fácil:</p>
<pre lang="bash">jeveaux@baium ~ $ sudo apt-get install apache2 libapache2-mod-jk</pre>
<p>Uma série de pacotes e dependências virão junto com os dois pacotes acima, pode confirmar que tudo vai dar certo.</p>
<p>Esta instalação deixará o Apache em <em>/etc/apache2</em>, onde nós teremos (os principais arquivos):</p>
<ul>
<li><strong>httpd.conf</strong> &#8211; Configuração geral do apache.</li>
<li><strong>conf.d</strong> &#8211; Configurações diversas, todos arquivos que estiverem nesse diretório serão carregados como configuração.</li>
<li><strong>mods-available</strong> &#8211; Arquivos de configuração e ativação dos módulos.</li>
<li><strong>mods-enabled</strong> &#8211; Módulos que estão ativados no apache, são links simbólicos para os arquivos do diretório <em>mods-available</em>.</li>
<li><strong>sites-available</strong> &#8211; Arquivos de configuração dos <em>sites (VirtualHost)</em>.</li>
<li><strong>sites-enabled</strong> &#8211; Sites que estão ativados, são links simbólicos para os arquivos do diretório <em>sites-available</em>.</li>
</ul>
<p>No <em>httpd.conf</em> poucas coisas precisam de intervenção, pessoalmente eu gosto muito deste esquema de organização e divisão de configurações utilizada pelo apache. Por exemplo, tudo que estiver no diretório <em>APACHE2_HOME/mods-enabled</em> será carregado automaticamente, primeiro todos os arquivo <em>.load</em>, que geralmente contém o <em>LoadModule</em>, e depois todos os arquivos <em>.conf</em>, que contém as configurações específicas do módulo, desta forma temos vários pares load+conf, um para cada módulo.</p>
<h3>O JDK e o Tomcat</h3>
<p>Apesar do servidor ser Ubuntu, desta vez eu não usei o apt-get. Eu sempre preferi instalar o JDK e algumas outras ferramentas de forma <em>manual</em>, não sei exatamente porque tenho essa mania, mas não consigo fugir.</p>
<p>O que importa é que o <em>JAVA_HOME</em> e o <em>PATH</em> estejam ajustados, se isso estiver correto tanto faz se você instalar usando o apt-get ou não. De qualquer forma, se você optar por usar o apt-get, basta seguir o comando abaixo:</p>
<pre lang="bash">jeveaux@baium ~ $ sudo apt-get install sun-java6-jdk tomcat5.5</pre>
<p>Se não, se você for <span style="text-decoration: line-through;">paranóico</span> como eu, certifique-se de ter configurado o <em>JAVA_HOME</em> e o <em>PATH</em> manualmente no seu <em>.bashrc</em>:</p>
<pre lang="bash">export JAVA_HOME=/development/jdk1.6.0_13
export PATH=$JAVA_HOME/bin:$PATH</pre>
<h3>O mod_jk</h3>
<p>O mod_jk já foi instalado anteriormente, então só precisamos certificar de que ele esteja ativado.</p>
<blockquote><p>Caso você queira ativar ou desativar um módulo, existem duas maneiras: 1) usar os comandos <em>a2enmod &lt;mod&gt;</em> e <em>a2dismod &lt;mod&gt;</em> ou simplesmente criar ou remover os links simbólicos em <em>APACHE2_HOME/mods-enabled</em>.</p></blockquote>
<h5>1) Configurar os workers</h5>
<p>A instalação foi tão simples que somente um arquivo nos interessa por enquanto: <em>/etc/libapache2-mod-jk/workers.properties</em>. Abaixo apenas as configurações mais importantes e algumas que precisaremos alterar:</p>
<pre lang="apache">workers.tomcat_home=/development/apache-tomcat-6.0.18
workers.java_home=<span>/</span>development<span>/</span>jdk1.6.0_13
worker.list=ajp13_worker
worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13
worker.ajp13_worker.lbfactor=1</pre>
<p>No workers.properties temos o mapeamento do tomcat <em>(workers.tomcat_home)</em> e do JDK <em>(workers.java_home)</em>. Há outra propriedade muito importante que é a <em>worker.list</em>, nela definimos todos <em>&#8220;workers&#8221;</em> que teremos. Para um único servidor teremos apenas um <em>worker</em>, mas em ambientes de cluster teremos vários. E temos para cada <em>worker</em> as suas configurações particulares: <em>port</em>, <em>host</em> e <em>type</em>, além de uma em particular, muito importante em ambiente de <em>cluster</em> e <em>load balancer</em>, a <em>lbfactor</em>, que indica a quantidade de trabalho do <em>worker</em> no conjunto, quanto menor o valor, menor o esforço do <em>worker</em>, ou seja, menos requisições serão despachadas para este <em>worker</em>.</p>
<h5>2) Iniciar (ou montar) o JK</h5>
<p>Mais uma vez temos dois caminhos a seguir aqui. Iniciar o JK no site principal ou em algum <em>VirtualHost</em> (sub-domínio) específico. O que vai mudar é onde você vai inserir o código a seguir.</p>
<p>Caso queira colocar o JK no seu site principal, você poderá inserir o código abaixo no seu <em>httpd.conf</em> &#8211; o que eu não recomendo &#8211; ou criar um arquivo <em>jk.conf</em> em <em>APACHE2_HOME/mods-available</em>, depois criar o link simbólico para este arquivo em <em>APACHE2_HOME/mods-enabled</em>.</p>
<p>Mas se você quiser ou precisar usar o JK somente em algum site e/ou sub-domínio específico, insira o código abaixo direto no arquivo do site em <em>APACHE2_HOME/sites-enabled</em>.</p>
<pre lang="apache">JkWorkersFile   /etc/libapache2-mod-jk/workers.properties
JkLogFile       /var/log/apache2/mod_jk.log
JkLogLevel      info
JkMount /*.jsp ajp13_worker
JkMount /teste/* ajp13_worker</pre>
<p>Com essas configurações estamos escolhendo qual arquivo de workers vamos usar <em>(JkWorkerFile)</em>, ou seja, qual o tomcat e JDK. Também definimos o arquivo de log e qual o tipo de log será gravado e, o ponto chave, quando o JK será usado. O <em>JkMount</em> pode ser repetido quantas vezes for preciso e é nele que definiremos todos os padrões de URL quanto forem precisos para que o JK seja usado.</p>
<blockquote><p>É neste momento, configurando o <em>JkMount</em>, que podemos dividir o processamento de recursos dinâmicos (jsp, servlet) para o Tomcat e recursos estáticos para o Apache. Não vou entrar nesse ponto neste artigo, mas fica a dica.</p></blockquote>
<p>Com o trecho acima estamos encaminhando para o tomcat &#8211; através do JK &#8211; tudo que terminar com <em>.jsp</em> ou tudo que estiver após <em>/teste</em>.</p>
<h3>O Deployment</h3>
<p>Aqui tudo correrá como qualquer aplicação Java, sem nenhuma diferença. Chamaremos nossa aplicação Java de <em>&#8220;teste&#8221;</em>. Após o deploy podemos acessa-la como de costume em <em>http://localhost:8080/teste</em>, mas agora com o JK podemos acessar também através da porta 80 (apache) em <em>http://localhost/teste</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2009/apache2-e-tomcat-com-mod_jk/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Maven &#8216;mvn release:prepare&#8217; falhando com SVN</title>
		<link>http://jeveaux.com/2008/maven-mvn-releaseprepare-falhando-com-svn/</link>
		<comments>http://jeveaux.com/2008/maven-mvn-releaseprepare-falhando-com-svn/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 18:54:26 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[mvn]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/?p=240</guid>
		<description><![CDATA[Um problema com a geração de releases com o maven tem incomodado muita gente nas últimas semanas. Trata-se de alguma incompatibilidade entre o maven e os clientes de SVN de versão superior a 1.5.x. O problema ocorre na preparação da &#8230; <a href="http://jeveaux.com/2008/maven-mvn-releaseprepare-falhando-com-svn/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Um problema com a geração de <em>releases </em>com o maven tem incomodado muita gente nas últimas semanas. Trata-se de alguma incompatibilidade entre o maven e os clientes de SVN de versão superior a 1.5.x. O problema ocorre na preparação da <em>release </em>(<em>mvn release:prepare</em>) e diz que o <em>pom.xml </em>já existe no diretório da <em>tag </em>que nem foi criada ainda.</p>
<p>Existe uma solução bem simples que deverá funcionar de primeira caso seu ambiente de desenvolvimento seja <em>*nix</em> que é basicamente executar um <em>update </em>na sua <em>working copy</em> antes de preparar a <em>release</em>:</p>
<pre lang="bash" line="1">svn up -r head
mvn release:prepare</pre>
<p>Entretanto, se você <span style="text-decoration: line-through;">não tem vergonha na cara e</span> desenvolve no windows o procedimento é um pouco mais chatinho, vejamos:</p>
<pre lang="bash" line="1">mvn release:prepare
## vai dar erro, continue
svn up -r head
mvn release:prepare -Dresume</pre>
<p>E se você tiver o TortoiseSVN instalado mate o processo <em>TSVNCache.exe</em> antes de executar os passos acima.</p>
<p>Há esperanças de que a versão 1.5.5 do SVN Client dê um fim nesse problema, mas enquanto ela não chega temos que nos contentar com essa gambiarra terrível. Provavelmente este procedimento deverá ser executado no <em>release:perform</em> também.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2008/maven-mvn-releaseprepare-falhando-com-svn/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Xvfb: Como usar o Selenium sem ter um X Server</title>
		<link>http://jeveaux.com/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/</link>
		<comments>http://jeveaux.com/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 13:49:17 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Testes]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[X11]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/</guid>
		<description><![CDATA[Escrever testes com Selenium geralmente é uma tarefa que, ou é amada ou é odiada com todas as forças do indivíduo que a executa. Isso acontece principalmente devido às inúmeras formas e ferramentas disponíveis para escrever os seus testes de &#8230; <a href="http://jeveaux.com/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Escrever testes com <a href="http://selenium.openqa.org/" target="_blank">Selenium</a> geralmente é uma tarefa que, ou é amada ou é odiada com todas as forças do indivíduo que a executa. Isso acontece principalmente devido às inúmeras formas e ferramentas disponíveis para escrever os seus testes de aceitação. Por exemplo, em Rails quem usa o <a href="http://github.com/aslakhellesoy/cucumber" target="_blank">Cucumber</a> com certeza deve gostar muito de escrever tais testes, já quem usa o Selenium IDE não deve ficar muito feliz depois de algumas semanas repetindo várias e várias coisas.</p>
<p>Executar os testes é outra tarefa muito legal e motivante, ver as coisas acontecendo de forma automática é lindo, mas com o tempo isso começa a ficar muito chato, cansativo e a levar tempo de mais, tempo que você não pode esperar toda vez que quiser fazer um <em>commit</em> ou um <em>push</em> ou até mesmo uma integração para <em>build</em>. Com isso vem a idéia de um servidor de <a href="http://blog.caelum.com.br/2008/11/04/integracao-continua/" target="_blank">integração contínua</a> onde todos os testes serão executados automaticamente do jeito que você desejar: a cada <em>commit/push</em>, tantas vezes por dia, etc.</p>
<p>Novamente tudo fica muito bom quando o servidor de integração contínua está executando tudo e dando conta do recado, mas e se o servidor disponibilizado não tiver um ambiente gráfico? Ou melhor, e se você questionar a razão de ter um ambiente gráfico num servidor como esse? Bom, há de pensar que sem interface gráfica não é possível executar o browser (exceto o <em>lynx</em>, eu sei), então o que fazer? Para resolver este problema existe o <a href="http://www.xfree86.org/4.0.1/Xvfb.1.html" target="_blank">Xvfb</a>, um projeto que serve exatamente para máquinas sem display.</p>
<p>O Xvfb cria um <em>buffer</em> virtual em memória e executa o X Server a partir daí, redirecionando o que deveria ser a saída VGA para a memória, e com isso você consegue um X Server virtual rodando sem display, apenas em memória. Com isso já é possível rodar o browser (e qualquer outra coisa que precisa de um X Server), logo, é possível executar todos os seus testes do Selenium. Um detalhe interessante é a possibilidade de ter<em> qualquer</em> resolução disponível agora, mesmo aquelas que um monitor não poderia te proporcionar.</p>
<p>Vamos agora a instalação e execução do Xvfb:</p>
<h4>Instalando o Xvfb</h4>
<pre lang="text" line="1">jeveaux@valakas ~ $ sudo apt-get install xvfb</pre>
<h4>Executando o Xvfb</h4>
<pre lang="text" line="1">jeveaux@valakas ~ $ Xvfb :1 -screen 0 1600x1200x32</pre>
<p>Com o comando acima vamos iniciar um novo servidor X (<em>:1</em>), screen 0 (<em>-screen 0</em>), resolução de tela de 1600&#215;1200 e 32bits de cores. Agora para abrir o firefox neste servidor:</p>
<pre lang="text" line="1">jeveaux@valakas ~ $ DISPLAY=:1 firefox</pre>
<p>E se você quiser acessar <em>visualmente</em> a saída criada pelo Xvfb pode usar algum cliente VNC como o x11vnc e conectar-se no display criado:</p>
<pre lang="text" line="1">jeveaux@valakas ~ $ sudo apt-get install x11vnc
jeveaux@valakas ~ $ x11vnc -display :1</pre>
<p>E pronto! Obviamente o Xvfb não deve ser usado exclusivamente para o Firefox/Selenium, este post foi apenas uma abordagem dentre as milhares de soluções que podem se beneficiar de um X Server virtual.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intel 4965AGN e Ubuntu Intrepid == Kernel Panic</title>
		<link>http://jeveaux.com/2008/intel-4965agn-e-ubuntu-intrepid-kernel-panic/</link>
		<comments>http://jeveaux.com/2008/intel-4965agn-e-ubuntu-intrepid-kernel-panic/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 21:37:37 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Wireless]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/2008/intel-4965agn-e-ubuntu-intrepid-kernel-panic/</guid>
		<description><![CDATA[Este final de semana fiz a atualização do meu Ubuntu para o Intrepid beta, tudo correu bem na atualização, reiniciei já com o kernel 2.6.27-7 e tudo continuou como antes, até que de repente tudo travou, congelou completamente. Foi bem &#8230; <a href="http://jeveaux.com/2008/intel-4965agn-e-ubuntu-intrepid-kernel-panic/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este final de semana fiz a atualização do meu <a href="http://www.ubuntu.com/" target="_blank">Ubuntu</a> para o <a href="http://www.ubuntu.com/testing/intrepid/beta" target="_blank">Intrepid</a> beta, tudo correu bem na atualização, reiniciei já com o kernel 2.6.27-7 e tudo continuou como antes, até que de repente tudo travou, congelou completamente. Foi bem estranho pois a luz de força (<em>power</em>) se apagou e as luzes do<em> caps lock</em> e <em>scroll lock</em> ficaram piscando.</p>
<p><em>Bad smell</em>, pensei comigo. Reiniciei e continuei a fazer o que estava fazendo. Mais uma vez travou da mesma forma, <em>caps</em> e <em>scroll</em> <em>lock</em> piscando e luz do <em>power</em> apagada. Fiz isso mais umas quatro ou cinco vezes pra tentar identificar o que estava fazendo o sistema travar completamente mas não consegui identificar nenhum padrão que pudesse ser a causa do problema.</p>
<p>Comecei então com a saga de analisar logs e pesquisar sobre o problema na <strike>internet</strike> google, até que descobri que a poderia ser algo com a mudança do driver do wireless, que até o <em>Hardy</em> era o <em>iwlwifi</em> e no <em>Intrepid</em> é o <em>iwlagn</em>. Encontrei <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/276990" target="_blank">algumas referências</a> de <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/278008" target="_blank">pessoas com o mesmo problema</a> no <em>Bug Tracker</em> do Ubuntu, e nos relatos achei uma semelhança com o meu problema: o sistema só congelava quando eu estava usando rede <em>N</em> e fazendo alguma coisa que aumentasse o tráfego na rede.</p>
<p>Basicamente a solução é: baixe a última versão do driver, compile e instale. Aparentemente o driver que está saindo com o <em>Intrepid</em> não está legal. Certamente isso será corrigido até o final do mês, no lançamento oficial do Intrepid, até porque esta é uma versão beta, então alguns <em>bugs</em> são esperados, é mais do que normal. Mas para quem não consegue esperar, segue:</p>
<h4>Atualizando o iwlagn no Ubuntu Intrepid</h4>
<p><strong>1)</strong> Faça o download do último driver em: <a href="http://www.orbit-lab.org/kernel/compat-wireless-2.6/2008/10/" target="_blank">http://www.orbit-lab.org/kernel/compat-wireless-2.6/2008/10/</a></p>
<p><strong>2)</strong> Instalando</p>
<pre>[code]jeveaux@keltir ~ $ sudo apt-get install -y build-essential
jeveaux@keltir ~ $ tar jxvf compat-wireless-2008-10-10.tar.bz2
jeveaux@keltir ~ $ cd compat-wireless-2008-10-10/
jeveaux@keltir ~/compat-wireless-2008-10-10 $ make
jeveaux@keltir ~/compat-wireless-2008-10-10 $ sudo make install[/code]</pre>
<p><strong>3)</strong> Reinicie e pronto =) (eu tentei recarregar o módulo sem reiniciar mais não deu certo, então reinicia que é mais garantido)</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2008/intel-4965agn-e-ubuntu-intrepid-kernel-panic/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Starling: Trabalhando com Filas em Ruby</title>
		<link>http://jeveaux.com/2008/starling-trabalhando-com-filas-em-ruby/</link>
		<comments>http://jeveaux.com/2008/starling-trabalhando-com-filas-em-ruby/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 21:52:33 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[MemCache]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Starling]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/2008/starling-trabalhando-com-filas-em-ruby/</guid>
		<description><![CDATA[Quem nunca ouviu a grande falácia de que Rails não escala? Isso foi moda durante algumas semanas enquanto o Twitter passava por problemas de escalabilidade, não necessariamente por culpa do Rails ou de Ruby, mas quem quer por lenha na &#8230; <a href="http://jeveaux.com/2008/starling-trabalhando-com-filas-em-ruby/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quem nunca ouviu a grande falácia de que Rails não escala? Isso foi moda durante algumas semanas enquanto o Twitter passava por problemas de escalabilidade, não necessariamente por culpa do Rails ou de Ruby, mas quem quer por lenha na fogueira não está muito preocupado com isso e quer mesmo é semear a discórdia. Muita água já passou por baixo da ponte, o Twitter agora está estável e as coisasfluem bem.</p>
<p>No começo deste ano <a href="http://dev.twitter.com/2008/01/announcing-starling.html" target="_blank">o pessoal do Twitter anunciou e tornou open source</a> o projeto <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a>, criado por <a href="http://twitter.com/blaine" target="_blank">Blaine Cook</a>. O <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> é o <em>core</em> do Twitter, ele é o servidor de filas responsável por <em>manter em pé</em> o Twitter. E agora como um projeto open source está disponível como <em>gem</em> e pode ser usado por qualquer outro projeto.</p>
<p>Indo direto ao ponto, o <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> é, basicamente, um servidor de filas implementado sob o protocolo do <a href="http://www.danga.com/memcached/" target="_blank">MemCache</a>. O <a href="http://www.danga.com/memcached/" target="_blank">MemCache</a> é um servidor de cache distribuído de altíssima performance e é largamente usado, principalmente em <em>clusters </em>de aplicações web.</p>
<p>Para usar o Starling é muito simples. Os primeiros passos são</p>
<h4>Instalação</h4>
<p><strong>1)</strong> Instalar o servidor <a href="http://www.danga.com/memcached/" target="_blank">MemCache</a></p>
<p>[code]jeveaux@kamael ~ $ sudo apt-get -y install memcached[/code]</p>
<p><strong>2)</strong> Instalar a <a href="http://www.deveiate.org/projects/RMemCache/" target="_blank"><em>gem</em> do MemCache</a> e</p>
<p>[code]jeveaux@kamael ~ $ sudo gem install memcache-client[/code]</p>
<p><strong>3)</strong> Instalar a <em>gem</em> do <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a>.</p>
<p>[code]jeveaux@kamael ~ $ sudo gem install starling[/code]</p>
<p>E pronto, isso é tudo para começarmos a usar o <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a>. Se você achou a instalação simples se prepare, pois a utilização é ainda mais simples.</p>
<h4>Usando o Starling</h4>
<p>Se você já usou o <a href="http://www.danga.com/memcached/" target="_blank">MemCache</a> vai sentir-se familiarizado com o <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a>. A diferença é apenas na implementação do protocolo, ou seja, a utilização <em>em código</em> será igual a do MemCache, só que ao fazer <em>set</em> e <em>get</em> as coisas acontecerão de uma forma um pouco diferente. Por enquanto a diferença maior que percebi foi em relação do método <em>get</em>, que quando usado no MemCache apenas retorna um valor do cache e o mantém lá, já no caso do <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> o <em>get</em> retorna o valor e o remove da memória. Analisando com calma isso faz sentido, afinal não estamos mais falando de cache e sim de filas, mesmo que a implementação da fila seja feita usando cache.</p>
<p>Mas antes de irmos para os exemplos de código, precisamos fazer com o que o servidor de filas &#8211; duh, <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> &#8211; esteja disponível e rodando. Vamos iniciar o <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> na porta 22122 (-p) e como um <em>daemon</em> (-d):</p>
<p>[code]jeveaux@kamael ~ $ sudo starling -p 22122 -d[/code]</p>
<p>Isso já basta para iniciar o servidor do <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> e deixá-lo disponível para uso. Agora então vamos alimentar a fila, crie o arquivo: <em>alimentar_fila.rb</em>.</p>
<p>[code]#alimentar_fila.rb<br />
require 'rubygems'<br />
require 'memcache'<br />
starling = MemCache.new 'localhost:22122'<br />
starling.set 'fila', 'qualquer objeto'[/code]</p>
<p>Ao executar este arquivo (ruby alimenta_fila.rb) não teremos nenhum resultado visual, mas acredite, a fila chamada de<em>&#8216;fila&#8217;</em> no exemplo está recebendo objetos. Agora o trabalho será para &#8211; como dizem &#8211; <em>consumir</em> a fila. Vamos ao <em>consumir_fila.rb</em>.</p>
<pre>[code]#consumir_fila.rb
require 'rubygems'
require 'memcache'
starling = MemCache.new 'localhost:22122'
loop {
  objeto_fila = starling.get 'fila'
  if !objeto_fila.nil?
    puts 'recuperado da fila:' + objeto_fila
  end
}[/code]</pre>
<p>E agora sim estamos prontos para colocar e remover objetos em uma fila. O exemplo para consumir os objetos ficará em <em>loop</em>, então você pode executá-lo numa janela do <em>bash</em> e em outra janela ir executando o exemplo para alimentar a fila com objetos e acompanhar o comportamento dos procedimentos de alimentar e consumir a fila. A recuperação da fila será imediata, instantânea, afinal, assim como o MemCache, o <a href="http://rubyforge.org/projects/starling/" target="_blank">Starling</a> está preparado para receber milhares de operações por segundo.</p>
<p>E é isso, o seu servidor de filas já está rodando e sendo alimentado/consumido. Agora é aplicar para o que você está precisando :D</p>
<h4>Problemas</h4>
<p>Há um probleminha chato com a gravação de log em disco que o Starling faz das filas. Todo o <em>set</em> feito gera o objeto na memória e também em disco &#8211; geralmente em <em>/var/spool/starling/</em>. O problema é que o <em>get</em> somente remove o objeto da memória e não do disco. Aparentemente isso foi feito pra ser assim mesmo e <a href="http://www.williambharding.com/blog/rails/starling-update-from-the-horses-mouth/" target="_blank">segundo o próprio Blaine Cook este arquivo de <em>log</em> não ficará sendo incrementado para sempre</a>, pois, depois de um <em>certo</em> tamanho (o engraçado é que ele não fala esse <em>certo</em> tamanho) ele será rotacionado, mas por enquanto ainda não descobri este <em>certo</em> tamanho e o arquivo tem crescido infinitamente.</p>
<p>E apenas uma observação quanto ao <em>consumir_fila.rb</em>: Não deixe-o executando por muito tempo e nem muito menos esqueça de finalizá-lo pois como ele fica em <em>loop</em> infinito poderá ocupar o seu processador a toa.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2008/starling-trabalhando-com-filas-em-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Configurando Sony Ericsson MD300 no Ubuntu</title>
		<link>http://jeveaux.com/2008/configurando-sony-ericsson-md300-no-ubuntu/</link>
		<comments>http://jeveaux.com/2008/configurando-sony-ericsson-md300-no-ubuntu/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 22:22:44 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[3G]]></category>
		<category><![CDATA[Claro]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/2008/configurando-sony-ericsson-md300-no-ubuntu/</guid>
		<description><![CDATA[Algum tempo antes de me mudar pro Rio eu fiz um plano de internet 3G da Claro e acabei comprando o modem da Sony Ericsson modelo MD300, na loja mesmo testei no notebook deles e tudo funcionou como eu esperava, &#8230; <a href="http://jeveaux.com/2008/configurando-sony-ericsson-md300-no-ubuntu/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/sony-ericsson-md300.jpg"><img class="alignright" src="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/sony-ericsson-md300.jpg" alt="" width="175" height="117" align="right" /></a>Algum tempo antes de me mudar pro Rio eu fiz um plano de internet 3G da Claro e acabei comprando o modem da Sony Ericsson modelo MD300, na loja mesmo testei no notebook deles e tudo funcionou como eu esperava, velocidade nota 10 e conexão estável, até hoje não tive problemas, a não ser é claro a compatibilidade do modem com o Ubuntu.</p>
<p>Sempre vi muita gente usando 3G no Mac e em Linux com o modem da Huawei &#8211; aquele <em>branquinho</em> clássico &#8211; e logo pensei: &#8220;Vou comprar um desses&#8221;. Mas não tinha este modelo disponível no dia em que comprei. Então os problemas começaram, o MD300, ao ser plugado no usb com o Ubuntu é montado como pen drive e não como modem, afinal de contas ele também é um pen drive. Mas este não é um si o problema, se vai montar como pen drive tanto faz, isso não tem problema, desde que também seja montado como dispositivo de modem, mas isso não acontece.</p>
<p>Pesquisei de todas as formas possíveis por algumas semanas e não encontrei nada que realmente fosse funcional. Tentei ndiswrapper, tentei iniciar uma VM com windows pra conectar o modem e fazer um proxy pro linux, tentei configurar o wvdial, tentei promessa, simpatia e <em>raza braba</em> mas nada fazia o bendito modem funcionar.</p>
<p>Até que achei há alguns dias no<a href="http://blog.mdpetry.net/2008/09/claro-3g-no-ubuntu-com-sony-md300.html" target="_blank"> blog do Petry uma solução que ele usou e funcionou</a>. Fiz a mesma coisa e não funcionou de cara pra mim, tive que fazer algumas coisas diferentes, então por isso vou descrever os passos da solução do Petry com o que eu tive que fazer a mais.</p>
<p>O primeiro e mais importante passo é dizer ao udev como montar o dispositivo corretamente, para isso crie uma regra conforme abaixo. Lembre-se que o nome do arquivo criado deve ser exatamente igual ao exemplo, inclusive o seu conteúdo, nada diferente.</p>
<pre lang="text" line="1">jeveaux@keltir ~ $ sudo vi /etc/udev/rules.d/50-md300modem.rules</pre>
<p>Copie o conteúdo abaixo neste arquivo (tome cuidado com as aspas simples e duplas ao copiar e colar, sugiro conferir pra ver se elas foram transportadas corretamente depois de colar, comigo geralmente elas ficam como ´ ao invés de &#8216;)</p>
<pre lang="bash" line="1">ACTION!="add", GOTO="3G_End"
BUS=="usb", SYSFS{idProduct}=="d0cf", SYSFS{idVendor}=="0fce", PROGRAM="/bin/sh -c 'echo 3 > /sys/%p/device/bConfigurationValue'"
LABEL="3G_End"</pre>
<p>Feito isso vamos reiniciar o udev</p>
<pre lang="text" line="1">jeveaux@keltir ~ $ sudo /etc/init.d/udev restart</pre>
<p>E na seqüência vamos instalar o gnome-ppp e wvdial</p>
<pre lang="text" line="1">jeveaux@keltir ~ $ sudo apt-get -y install gnome-ppp wvdial</pre>
<p>E agora vamos editar o .wvdial.conf do home do usuário (mais uma vez cuidado com as aspas, mesmo problema da regra do udev que citei acima)</p>
<pre lang="text" line="1">jeveaux@keltir ~ $ vi .wvdial.conf</pre>
<p>E então vamos colar este conteúdo no arquivo:</p>
<pre lang="text" line="1">[Dialer Defaults]
Modem = /dev/ttyACM0
ISDN = off
Modem Type = USB Modem
Baud = 460800
Init = ATZ
Init2 = AT+CFUN=1
Init3 = ATQ0 V1 E1 S0=0 &amp;C1 &amp;D2 +FCLASS=0
Init4 = AT+CGDCONT=1,"IP","bandalarga.claro.com.br"
Init5 =
Init6 =
Init7 =
Init8 =
Init9 =
Phone = *99***1#
Phone1 =
Phone2 =
Phone3 =
Phone4 =
Dial Prefix =
Dial Attempts = 1
Dial Command = ATM1L3DT
Ask Password = off
Password = claro
Username = claro
Auto Reconnect = off
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = off
Idle Seconds = 0
Auto DNS = on
;Minimize = off
;Dock = off
;Do NOT edit this file by hand!</pre>
<p>Agora basta plugar o modem, iniciar o gnome-ppp e conectar-se. Você pode fazer isso diretamente pelo console com o comando gnome-ppp ou através do menu <em>Applications &gt; Internet &gt; gnome ppp</em>.</p>
<p>Basicamente até aqui é o mesmo passo a passo descrito no blog do Petry, porém comigo, ao terminar estes passos a conexão simplesmente não era mantida. Mandava conectar, discava, conectava e caía. Para resolver este problema fiz os próximos passos. Não sou exatamente um <em>expert</em> em linux, então não sei explicar exatamente o porquê destes passos, mas foram eles que fizeram o meu gnome-ppp funcionar corretamente.</p>
<p>Aparentemente alguma coisa sobrenatural estava fazendo meu gnome-ppp carregar o arquivo /etc/wvdial.conf ao invés do ~/.wvdial.conf, então precisei colar o conteúdo do ~/.wvdial.conf no /etc/wvdial.conf também.</p>
<p>Depois disso me conectei diretamente com o wvdial.</p>
<pre lang="text" line="1">jeveaux@keltir ~ $ wvdial</pre>
<p>Aí sim a conexão foi realizada com sucesso e não caiu. Depois disso fechei o wvdial e voltei a usar o gnome-ppp, que não caiu nenhuma vez depois disso.</p>
<p>Agora é esperar o <a href="http://www.ubuntu.com/testing/intrepid/beta" target="_blank">Ubuntu 8.10</a>, pois segundo as informações no site o network-manager virá com suporte integrado a conexão 3G (GSM e CDMA). Tomara que não precise mais dessa lenga lenga.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2008/configurando-sony-ericsson-md300-no-ubuntu/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Customizando o gedit para Rails</title>
		<link>http://jeveaux.com/2008/customizando-o-gedit-para-rails-2/</link>
		<comments>http://jeveaux.com/2008/customizando-o-gedit-para-rails-2/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 13:04:47 +0000</pubDate>
		<dc:creator>jeveaux</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[gedit]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.jeveaux.com/blog/2008/customizando-o-gedit-para-rails-2/</guid>
		<description><![CDATA[Não há dúvidas que o TextMate é um excelente editor para se trabalhar com Rails, mas como nem todos possuem um Mac para ter o prazer de utilizar este editor, o jeito é se contentar com alternativas menos hype sexy. &#8230; <a href="http://jeveaux.com/2008/customizando-o-gedit-para-rails-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Não há dúvidas que o <a href="http://macromates.com/" target="_blank">TextMate</a> é um excelente editor para se trabalhar com Rails, mas como nem todos possuem um Mac para ter o prazer de utilizar este editor, o jeito é se contentar com alternativas menos <span style="text-decoration: line-through;">hype</span> <em>sexy</em>.</p>
<p>Para quem usa Gnome, porém, é muito mais fácil encontrar uma ótima alternativa. O gedit é um editor de texto que vem, geralmente, por default em qualquer distribuição Linux com Gnome. Não vou falar muito do gedit como editor pois este não é o foco do post, a idéia é mostrar apenas o projeto <a href="http://github.com/mig/gedit-rails/tree/master" target="_blank">gedit-rails</a>, que é o projeto que contém uma série de utilitários para deixar o gedit ‘turbinado’ para se trabalhar com Rails.</p>
<p>Para instalar o <a href="http://github.com/mig/gedit-rails/tree/master" target="_blank">gedit-rails</a> é super simples, basta fazer o download do projeto (<a href="http://github.com/mig/gedit-rails/zipball/master" target="_blank">zip</a>, <a href="http://github.com/mig/gedit-rails/tarball/master" target="_blank">tar.gz</a> ou via clone do <a href="javascript:void(0);" target="_blank">repositório do github</a>) e fazer a instalação executando o script <em>install.sh</em>. A instalação é simples e não há nenhum estágio além da execução da execução propriamente dita do script e depois disso o trabalho será apenas de configuração.</p>
<p>A instalação adicionará no gedit o tema de fontes e cores: <em>Darkmate</em>, os plugins: <em>Class Browser</em>, <em>HTML Tidy</em>, <em>Rails Hot Keys</em>, <em>Rails Hot Commands</em> e <em>Snap Open</em> e o mais importante, os snippets. A configuração pode ser feita basicamente em duas etapas:</p>
<p align="left"><strong>- </strong><strong>Tema de fontes e cores</strong>: Edit &gt; Preferences &gt; Fonts &amp; Colors&gt; <em>Darkmate</em>. E o resultado será:</p>
<p style="text-align: center"><a href="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-01.png" target="_blank"><img src="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-01.png" alt="" width="287" height="169" /></a></p>
<p align="left"><strong>- Plugins</strong>: Edit &gt; Preferences &gt; Plugins. Lembre-se, os plugins que foram instalados e que podem ser ativados são: <em>Class Browser</em>, <em>HTML Tidy</em>, <em>Rails Hot Keys</em>, <em>Rails Hot Commands</em> e <em>Snap Open</em>. Os snippets já estarão funcionando sem nenhuma modificação. Basicamente alguns dos recursos adicionados serão:</p>
<p align="left"><a href="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-02.png" target="_blank"><img src="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-02.png" alt="" width="174" height="106" /></a> <a href="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-03.png" target="_blank"><img src="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-03.png" alt="" width="117" height="40" /></a> <a href="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-04.png" target="_blank"><img src="http://www.jeveaux.com/blog/wp-content/uploads/2008/10/gedit-rails-04.png" alt="" width="155" height="106" /></a></p>
<p align="left">Recomendo também a leitura dos <a href="http://www.urubatan.info/tag/gedit/" target="_blank">posts sobre gedit-rails do Urubatan</a>, um dos autores do projeto.</p>
<p align="left">Para quem curte o VI também existe uma ótima opção, o <a href="http://www.vimrails.org/" target="_blank">vim-rails</a>. Qualquer dia escrevo sobre este addon.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeveaux.com/2008/customizando-o-gedit-para-rails-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

