<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <id>http://www.ultrav.com.br</id>
  <title>ultrav</title>
  <updated>2012-01-28T00:00:00Z</updated>
  <author>
    <name>Vinícius Figueiredo</name>
  </author>
  <link href="http://www.ultrav.com.br" rel="alternate"></link>
  <link href="" rel="self"></link>


  <entry>
    <id>http://www.ultrav.com.br/2012/01/28/configurando-lamp-no-centos-6/</id>
    <title type="html">Configurando LAMP no CentOS 6</title>
    <updated>2012-01-28T00:00:00Z</updated>
    <published>2012-01-28T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2012/01/28/configurando-lamp-no-centos-6/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Esse artigo é um guia rápido para configurar um ambiente LAMP (Linux, Apache,
MySQL e PHP) no CentOS 6. Ele foi compilado enquanto eu fazia a instalação do
servidor que uso para hospedar esse e outros sites.&lt;/p&gt;

&lt;h2&gt;Instalação&lt;/h2&gt;

&lt;p&gt;O texto não cobre a instalação do CentOS, eu utilizo servidores virtuais da
&lt;a href=&#34;http://www.linode.com/?r=41a2405fc970b31abc4d8b4482c49460af631db3&#34;&gt;Linode&lt;/a&gt; e o guia inicia logo após o deploy da imagem mínima do CentOS
disponibilizada por esse provedor. Se você utiliza outros serviços de
hospedagem, oriente-se com o suporte sobre o deploy da imagem.&lt;/p&gt;

&lt;p&gt;Caso você precise instalar o CentOS a partir de mídia, pode procurar ajuda na
&lt;a href=&#34;http://www.centos.org/docs/&#34;&gt;documentação oficial&lt;/a&gt;. Até o momento da escrita desse artigo, os manuais
para versão 6 ainda não estavam disponíveis. De qualquer maneira o guia de
instalação da versão 5 pode ser utilizado. Também é possível obter ajuda no
&lt;a href=&#34;http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/index.html&#34;&gt;guia de instalação do RHEL 6&lt;/a&gt; e em &lt;a href=&#34;http://www.if-not-true-then-false.com/2011/centos-6-netinstall-network-installation/&#34;&gt;diversos&lt;/a&gt; &lt;a href=&#34;http://techspotting.org/how-to-install-centos-6-linux-for-servers-desktops/&#34;&gt;guias&lt;/a&gt; pela internet.&lt;/p&gt;

&lt;h2&gt;Criação de usuário e atualização do sistema&lt;/h2&gt;

&lt;p&gt;Após a instalação, realize o reboot do servidor e conecte-se como &lt;code&gt;root&lt;/code&gt;. Vamos
criar um usuário administrativo para evitar o uso direto do &lt;code&gt;root&lt;/code&gt;. O usuário
deve fazer parte do grupo &lt;code&gt;wheel&lt;/code&gt; e terá permissão administrativa através de
&lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para criar o usuário &lt;code&gt;foobar&lt;/code&gt; e adiciona-lo ao grupo &lt;code&gt;wheel&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@centos ~]# useradd -G wheel foobar
[root@centos ~]# passwd foobar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora vamos atualizar o &lt;code&gt;sudo&lt;/code&gt; e configurar permissão para todos usuários do
grupo &lt;code&gt;wheel&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@centos ~]# yum install sudo
[root@centos ~]# visudo
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basta alterar a linha baixo removendo o &#39;#&#39; inicial dela, salvar e sair.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# %wheel    ALL=(ALL)   NOPASSWD: ALL
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com isso podemos passar a usar o novo usuário que terá direitos administrativos
através do &lt;code&gt;sudo&lt;/code&gt;. Efetue logout como &lt;code&gt;root&lt;/code&gt; e conecte-se agora com o novo
usuário. &lt;/p&gt;

&lt;p&gt;Vamos atualizar o servidor. Antes de fazer isso costumo configurar os
&lt;a href=&#34;http://fedoraproject.org/wiki/EPEL&#34;&gt;repositórios EPEL&lt;/a&gt;. Esses repositórios contém pacotes diversos para
distribuições como RHEL, CentOS e Scientific Linux. Para habilitar basta
baixar o pacote RPM e instala-lo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
[foobar@centos ~]$ sudo rpm -ivh epel-release-6.5.noarch.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora fazemos a atualização do sistema:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo yum check-update
[foobar@centos ~]$ sudo yum upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Instalando o Apache&lt;/h2&gt;

&lt;p&gt;Com o Linux instalado, já temos o L do LAMP, agora vamos instalar o Apache
e configura-lo para subir junto com o boot do servidor. Para isso basta
executar os comandos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo yum install httpd httpd-manual
[foobar@centos ~]$ sudo chkconfig httpd on
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;É necessário editar o arquivo &lt;code&gt;/etc/httpd/conf/httpd.conf&lt;/code&gt; para fazer a
configuração inicial do Apache. Não é preciso modificar muita coisa do padrão,
basta alterar os trechos indicados abaixo.&lt;/p&gt;

&lt;p&gt;Abra o arquivo no seu editor de textos favorito, procure o trecho abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;Directory /&amp;gt;
    Options FollowSymLinks
    AllowOverride None
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E altere-o para:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;Directory /&amp;gt;
    Options FollowSymLinks
    AllowOverride All
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mais uma modificação, procure o trecho abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be &#34;All&#34;, &#34;None&#34;, or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E altere para:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be &#34;All&#34;, &#34;None&#34;, or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride All
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por fim, alterar o trecho abaixo de:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#
# Use name-based virtual hosting.
#
# NameVirtualHost *:80
#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
#
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Salve o arquivo, saia e em seguida reinicie o Apache com o comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo service httpd restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para testar a configuração basta acessar através de qualquer navegador o
o endereço IP do seu servidor. Antes precisamos apenas criar uma regra no
firewall permitindo conexão na porta 80 que é bloqueada por padrão no CentOS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Após é interessante salvar a regra para que seja aplicada toda vez que o
iptables for carregado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo service iptables save
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Me dê um M: Instalando MySQL Server&lt;/h2&gt;

&lt;p&gt;Com o Apache testado e funcionando, podemos instalar o MySQL Server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo yum install mysql-server mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Após a instalação é importante Fazer a configuração inicial de segurança do
MySQL Server rodando o script abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo /usr/bin/mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;P de PHP&lt;/h2&gt;

&lt;p&gt;Para finalizar o ambiente LAMP só falta o PHP. Basta instalar os pacotes
abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo yum install php php-mysql php-pear
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Configurando o primeiro site&lt;/h2&gt;

&lt;p&gt;Nesse momento já temos o ambiente LAMP configurado, é possível fazer a
instalação de alguma aplicação PHP como por exemplo o Wordpress. Abaixo um
exemplo de configuração de virtual host para prover o site www.dominio.com.br
nesse servidor recém instalado.&lt;/p&gt;

&lt;p&gt;Primeiro vamos criar o diretório onde o site será hospedado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ sudo mkdir /var/www/dominio.com.br/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora vamos criar a configuração de virtual host no Apache, basta criar o
arquivo &lt;code&gt;/etc/httpd/conf.d/dominio-com-br.conf&lt;/code&gt; com o conteudo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerAdmin webmaster@localhost
    ServerName dominio.com.br
    ServerAlias www.dominio.com.br

    DocumentRoot /var/www/dominio.com.br

    ErrorLog /var/log/httpd/dominio.com.br-error.log
    LogLevel warn
    CustomLog /var/log/httpd/dominio.com.br-access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basta popular o diretório &lt;code&gt;/var/www/dominio.com.br&lt;/code&gt; com o seu site e reiniciar
o Apache:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[foobar@centos ~]$ service httpd restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com essa configuração o seu servidor já pode responder por esse site. Claro
que para o site se torne acessível ao público, o DNS desse domínio deve ser 
configurado para apontar pro seu servidor. Essa configuração foge do escopo
desse rápido guia.&lt;/p&gt;

&lt;h2&gt;Concluindo&lt;/h2&gt;

&lt;p&gt;LAMP no CentOS é simples, rápido e fácil. Em alguns minutos você já tem a
configuração inicial de um servidor web. Evidentemente ainda faltam algumas
várias configurações importantes antes de colocar esse servidor em produção.
É importante atentar a segurança, também fazer algum tunning no que foi 
instalado.&lt;/p&gt;

&lt;p&gt;Como esse é apenas um guia rápido, não vou abordar essas configurações. Em
textos futuros pretendo relatar algumas delas, sempre me baseando nas
configurações reais que usei quando montei o servidor que roda esse site.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2011/01/18/extendendo-online-um-file-system-ext3-com-lvm/</id>
    <title type="html">Extendendo online um file system ext3 com LVM</title>
    <updated>2011-01-18T00:00:00Z</updated>
    <published>2011-01-18T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2011/01/18/extendendo-online-um-file-system-ext3-com-lvm/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Outro dia você configurou um &lt;a href=&#34;http://ultrav.com.br/2010/06/22/lvm-em-3-minutos/&#34;&gt;LVM em 3 minutos&lt;/a&gt;, rápido e fácil. Aquele
file system já não cabe mais tudo que precisa guardar, chegou a hora aumentar
o espaço. E agora?&lt;/p&gt;

&lt;p&gt;Graças ao LVM tudo continua fácil. Segundo as configurações do artigo
anterior, a nossa configuração tem o VG vg0 e o LV lvol0. Queremos
extender o file system criado para aproveitar o tamanho do disco
&lt;code&gt;/dev/sdc&lt;/code&gt; recém instalado no servidor.&lt;/p&gt;

&lt;p&gt;Primeiro você pode criar uma partição do tipo Linux LVM conforme já
foi visto. Depois disso criamos o physical volume na nova partição:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ~]# pvcreate /dev/sdc1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos extender o VG vg0 para usar o novo PV que criamos na partição:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ~]# vgextend vg0 /dev/sdc1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora podemos extender o LV lvol0 para o tamanho desejado, o comando que
usamos é o &lt;code&gt;lvextend&lt;/code&gt; e possui várias formas. A primeira delas com a opção
&lt;code&gt;-L&lt;/code&gt; extende o LV em unidade de megabytes. Essa opção aceita os sufixos M,
G, T, P e E para megabytes, gigabytes, terabytes, petabytes ou exabytes
respectivamente. Para ter um LV com 15G fazemos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ~]# lvextend -L 15G /dev/vg0/lvol0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O valor 15G é absoluto, é possível usar o sinal de mais para adicionar o
valor ao tamanho atual do LV. O comando abaixo vai adicionar 5G ao LV:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ~]# lvextend -L +5G /dev/vg0/lvol0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com a opção &lt;code&gt;-l&lt;/code&gt; extendemos o LV usando logical extends como unidade de
medida. Calcular o número de logical extends que queremos no LV é um pouco
mais chato, não vou falar disso agora mas vou usar essa opção pra mostrar um
atalho:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ~]# lvextend -l 100%VG /dev/vg0/lvol0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O comando acima vai alocar 100% do espaço do VG para o LV lvol0. É
exatamente isso o que queremos.&lt;/p&gt;

&lt;p&gt;Por fim é só extender o file system, a partir do kernel 2.6 podemos extender
partições ext3 online:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ~]# resize2fs /dev/vg0/lvol0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Missão data é missão cumprida.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/12/31/one-liner-gerador-de-senhas/</id>
    <title type="html">One-liner gerador de senhas</title>
    <updated>2010-12-31T00:00:00Z</updated>
    <published>2010-12-31T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/12/31/one-liner-gerador-de-senhas/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Senhas são uma chatice, eu passei a gostar delas no dia que tirei todas da 
minha cabeça. Hoje em dia eu não sei a senha para nenhum serviço, gerei
várias senhas aleatórias e guardo todas no meu &lt;a href=&#34;http://www.keepassx.org/&#34;&gt;KeePassX&lt;/a&gt;. O programa
tem um gerador de senhas que é uma mão na roda.&lt;/p&gt;

&lt;p&gt;Quantas vezes você precisou gerar alguma senha no console e ficou pensando?
Para ajudar nessas horas vai um one liner:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tr -dc A-Za-z0-9_ &amp;lt; /dev/urandom | head -c 16 ; echo
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ah, one liners! São ótimos e ficam melhores ainda quando entendemos. Esse é 
bem fácil.&lt;/p&gt;

&lt;p&gt;Usamos o &lt;a href=&#34;http://en.wikipedia.org/wiki//dev/urandom&#34;&gt;gerador de números aleatórios do kernel&lt;/a&gt;, redirecionando 
para que o &lt;code&gt;tr&lt;/code&gt; elimine qualquer caractere que não for letras de A a Z,
maiúsculas ou minusculas, números e o underline. O &lt;code&gt;head -c&lt;/code&gt; serve apenas
para cortar 16 caracteres dos milhares que o &lt;code&gt;/dev/urandom&lt;/code&gt; vai gerar.
Por fim o &lt;code&gt;echo&lt;/code&gt; é só para quebrar a linha e não bagunçar o seu prompt.&lt;/p&gt;

&lt;p&gt;Geralmente eu faço uma função com esse one liner e deixo no meu &lt;code&gt;.bashrc&lt;/code&gt;.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/12/31/corretor-ortografico-em-portugues-no-vim/</id>
    <title type="html">Corretor ortográfico em português no VIM</title>
    <updated>2010-12-31T00:00:00Z</updated>
    <published>2010-12-31T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/12/31/corretor-ortografico-em-portugues-no-vim/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Eu uso o &lt;a href=&#34;http://vim.org/&#34;&gt;vim&lt;/a&gt; para edições de textos no geral, ainda estou muito longe
de domina-lo por completo mas consigo programar e editar os textos desse
blog sem problemas. Uma coisa que sentia falta era correção ortográfica,
por sorte isso foi fácil de resolver.&lt;/p&gt;

&lt;p&gt;Primeiro devemos baixar o &lt;a href=&#34;http://www.broffice.org/verortografico/baixar&#34;&gt;dicionário de palavras em português do BrOffice&lt;/a&gt;,
a versão mais atual para data desse artigo é de &lt;a href=&#34;http://www.broffice.org/files/pt_BR-2010-10-30AOC3.zip&#34;&gt;30/10/2010&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Descompacte o arquivo e inicie o vim no mesmo diretório. Agora execute o
comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:mkspell pt pt_BR
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Esse comando vai demorar um pouco e gerar um arquivo chamado &lt;code&gt;pt.utf-8.spl&lt;/code&gt;,
copie esse arquivo para &lt;code&gt;~/.vim/spell&lt;/code&gt; e adicione no seu &lt;code&gt;~/.vimrc&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set spell spelllang=pt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora qualquer palavra que não esteja no dicionário instalado será marcada
de vermelho. Existem alguns comandos para facilitar o uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;]s - Move o cursor para próxima palavra incorreta&lt;/li&gt;
&lt;li&gt;[s - Move o cursor para palavra correta anterior&lt;/li&gt;
&lt;li&gt;zg - Adiciona a palavra do cursor no dicionário&lt;/li&gt;
&lt;li&gt;zug - Remove a última palavra adicionada&lt;/li&gt;
&lt;li&gt;z= - Exibe sugestões para substituição de uma palavra errada&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/11/26/oracle-102-no-rhel-5-libxpso6-nao-encontrada/</id>
    <title type="html">Oracle 10.2 no RHEL 5, libXp.so.6 não encontrada</title>
    <updated>2010-11-26T00:00:00Z</updated>
    <published>2010-11-26T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/11/26/oracle-102-no-rhel-5-libxpso6-nao-encontrada/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Se você estiver instalando o Oracle 10.2.0 no RHEL 5 e receber a mensagem de erro abaixo como resposta do Oracle Universal Installer não se desepere. Vai ser preciso instalar o pacote libXp para arquitetura i386, mesmo que esteja rodando RHEL 5 x86_64. No meu caso a instalação do pacote &lt;code&gt;libXp-1.0.0-8.1.el5.i386.rpm&lt;/code&gt; resolveu o problema.&lt;/p&gt;

&lt;p&gt;No RHEL 4 o arquivo &lt;code&gt;libXp.so.6&lt;/code&gt; fazia parte do pacote &lt;code&gt;xorg-x11-deprecated-libs&lt;/code&gt; que é instalado por padrão, na versão 5 do RHEL o pacote que entrega esse arquivo mudou e me fez perder um pouco de tempo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Exception java.lang.UnsatisfiedLinkError: /tmp/OraInstall&amp;lt;time_stamp&amp;gt;/jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory occurred..
java.lang.UnsatisfiedLinkError: /tmp/OraInstall&amp;lt;time_stamp&amp;gt;/jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at sun.security.action.LoadLibraryAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.NativeLibLoader.loadLibraries(Unknown Source)
at sun.awt.DebugHelper.&amp;lt;clinit&amp;gt;(Unknown Source)
at java.awt.Component.&amp;lt;clinit&amp;gt;(Unknown Source)
at oracle.sysman.oii.oiif.oiifm.OiifmGraphicInterfaceManager.&amp;lt;init&amp;gt;(OiifmGraphicInterfaceManager.java:222)
at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.createInterfaceManager(OiicSessionInterfaceManager.java:193)
at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.getInterfaceManager(OiicSessionInterfaceManager.java:202)
at oracle.sysman.oii.oiic.OiicInstaller.getInterfaceManager(OiicInstaller.java:436)
at oracle.sysman.oii.oiic.OiicInstaller.runInstaller(OiicInstaller.java:926)
at oracle.sysman.oii.oiic.OiicInstaller.main(OiicInstaller.java:866)
Exception in thread main java.lang.NoClassDefFoundError
at oracle.sysman.oii.oiif.oiifm.OiifmGraphicInterfaceManager.&amp;lt;init&amp;gt;(OiifmGraphicInterfaceManager.java:222)
at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.createInterfaceManager(OiicSessionInterfaceManager.java:193)
at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.getInterfaceManager(OiicSessionInterfaceManager.java:202)
at oracle.sysman.oii.oiif.oiifm.OiifmAlert.&amp;lt;clinit&amp;gt;(OiifmAlert.java:151)
at oracle.sysman.oii.oiic.OiicInstaller.runInstaller(OiicInstaller.java:984)
at oracle.sysman.oii.oiic.OiicInstaller.main(OiicInstaller.java:866)
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/10/10/ambiente-desenvolvimento-python-ubuntu/</id>
    <title type="html">Ambiente desenvolvimento Python no Ubuntu</title>
    <updated>2010-10-10T00:00:00Z</updated>
    <published>2010-10-10T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/10/10/ambiente-desenvolvimento-python-ubuntu/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Existem algumas ferramentas que considero fundamentais nas minhas aventuras como pseudo-programador Python, são elas: &lt;a href=&#34;http://mercurial.selenic.com/&#34;&gt;Mercurial&lt;/a&gt;, &lt;a href=&#34;http://pip.openplans.org/&#34;&gt;pip&lt;/a&gt;, &lt;a href=&#34;http://virtualenv.openplans.org/&#34;&gt;virtualenv&lt;/a&gt; e &lt;a href=&#34;http://www.doughellmann.com/projects/virtualenvwrapper/&#34;&gt;virtualenv wrapper&lt;/a&gt;. Vou mostrar como faço a instalação inicial delas no Ubuntu.&lt;/p&gt;

&lt;p&gt;Geralmente eu costumo utilizar os pacotes da distribuição mas infelizmente nesse caso os pacotes do Ubuntu são um pouco velhos. O que faço nesse caso é instalar o &lt;code&gt;easy_install&lt;/code&gt; através do pacote Ubuntu e as demais ferramentas através do PyPI. Antes é importante instalar o pacote de desenvolvimento do Python:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install python-dev
sudo apt-get install python-setuptool
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos usar o &lt;code&gt;easy_install&lt;/code&gt; para instalar o &lt;code&gt;pip&lt;/code&gt; que tem suas vantagens:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo easy_install pip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois é só usar o &lt;code&gt;pip&lt;/code&gt; para instalar todo o restante:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo pip install mercurial virtualenv virtualenvwrapper
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/08/11/wireless-realtek-8192-ubuntu/</id>
    <title type="html">Wireless Realtek 8192 no Ubuntu</title>
    <updated>2010-08-11T00:00:00Z</updated>
    <published>2010-08-11T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/08/11/wireless-realtek-8192-ubuntu/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Instalei o &lt;a href=&#34;http://www.ubuntu.com/netbook/&#34;&gt;Ubuntu Netbook Remix&lt;/a&gt; no meu netbook Samsung N150, todo o hardware foi reconhecido mas a placa de rede wireless Realtek 8192 não conseguia listar nenhuma rede. Pesquisando na internet vi que o problema é o firmware, com os comandos abaixo o problema é resolvido.&lt;/p&gt;

&lt;p&gt;Primeiro tenha certeza que é realmente essa a sua placa wireless usando o comando &lt;code&gt;lspci&lt;/code&gt;, a saída deve ser parecida com essa:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;05:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device 8192 (rev 01)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A seguir vamos instalar o git (caso ainda não o tenha no seu sistema), baixar o firmware e copia-lo para o local correto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install git-core
cd /tmp/
git clone git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/firmware.git
sudo cp -av firmware/RTL8192E /lib/firmware/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora basta reiniciar o sistema para tudo funcionar.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/07/03/cedilha-no-gnome-em-ingles/</id>
    <title type="html">Utilizar cedilha no Gnome (Ubuntu) em inglês</title>
    <updated>2010-07-03T00:00:00Z</updated>
    <published>2010-07-03T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/07/03/cedilha-no-gnome-em-ingles/" rel="alternate"></link>
    <content type="html">&lt;p&gt;O cedilha não funciona com o Gnome no idioma inglês e o teclado americano. Para ativar essa tecla é necessário editar o arquivo &lt;code&gt;libgtk2.0-0.immmodules&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo vim /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Procure pela linha que começa com &lt;em&gt;cedilla&lt;/em&gt; e adicione o &lt;code&gt;:en&lt;/code&gt; no final do último parâmetro. A linha deve ficar assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&#34;cedilla&#34; &#34;Cedilla&#34; &#34;gtk20&#34; &#34;/usr/share/locale&#34; &#34;az:ca:co:fr:gv:oc:pt:sq:tr:wa:en&#34;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Salve e faça login novamente para que a mudança faça efeito.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/06/28/listar-processos-utilizando-portas/</id>
    <title type="html">Listar processos utilizando determinada porta</title>
    <updated>2010-06-28T00:00:00Z</updated>
    <published>2010-06-28T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/06/28/listar-processos-utilizando-portas/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Para listar os processos utilizando determinada porta basta usar o comando &lt;code&gt;lsof&lt;/code&gt; com a opção &lt;code&gt;-i&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# lsof -i :80
COMMAND   PID     USER   FD   TYPE DEVICE SIZE NODE NAME
apache2  2741     root    3u  IPv4   9277       TCP *:www (LISTEN)
apache2 12058 www-data    3u  IPv4   9277       TCP *:www (LISTEN)
apache2 12426 www-data    3u  IPv4   9277       TCP *:www (LISTEN)
apache2 12427 www-data    3u  IPv4   9277       TCP *:www (LISTEN)
apache2 12609 www-data    3u  IPv4   9277       TCP *:www (LISTEN)
apache2 12979 www-data    3u  IPv4   9277       TCP *:www (LISTEN)
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/06/22/lvm-em-3-minutos/</id>
    <title type="html">LVM em 3 minutos</title>
    <updated>2010-06-22T00:00:00Z</updated>
    <published>2010-06-22T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/06/22/lvm-em-3-minutos/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Sequência de comandos para configurar LVM no disco &lt;code&gt;/dev/sdb&lt;/code&gt;. Todos comandos devem ser executados como root.&lt;/p&gt;

&lt;p&gt;Primeiro deve-se criar a partição LVM no dispositivo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ]# fdisk /dev/sdb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No prompt do fdisk digitar a sequência:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt; para criar uma nova partição&lt;/li&gt;
&lt;li&gt;&lt;code&gt;p&lt;/code&gt; para indicar que ela será primária&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; porque é a primeira partição desse disco&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENTER&lt;/code&gt; duas vezes para aceitar o primeiro e último cilindro fazendo a partição ocupar todo o disco&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt; para alterar o tipo da partição&lt;/li&gt;
&lt;li&gt;&lt;code&gt;8e&lt;/code&gt; indica o tipo como Linux LVM&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; para gravar a tabela de partição e sair do fdisk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O primeiro comando LVM que vamos usar é para criar um physical volume nessa partição:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ]# pvcreate /dev/sdb1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora criamos o volume group chamado vg0:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ]# vgcreate vg0 /dev/sdb1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nos resta agora criar um logical volume chamado lvol0 no volume group recém criado. A opção &lt;code&gt;-L&lt;/code&gt; indica o tamanho do logical volume, &lt;code&gt;-n&lt;/code&gt; a identificação dele:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ]# lvcreate -L 10G -n lvol0 vg0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Um atalho para usar todo o espaço livre do volume group no logical volume é usar a opção &lt;code&gt;-l&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ]# lvcreate -l 100%FREE -n lvol0 vg0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por fim, basta criarmos o file system a ser usado. Para criar um file system ext3 com label ORACLE:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@rhel ]# mkfs.ext3 -L ORACLE /dev/vg0/lvol0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Inspirado em &lt;a href=&#34;http://www.walkernews.net/2007/07/02/how-to-create-linux-lvm-in-3-minutes/&#34;&gt;How To Create Linux LVM In 3 Minutes&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/04/19/colecao-a-venda/</id>
    <title type="html">Vendendo coleção de games</title>
    <updated>2010-04-19T00:00:00Z</updated>
    <published>2010-04-19T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/04/19/colecao-a-venda/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Resolvi vender os restos da minha coleção de games antigos. Reproduzo abaixo a mensagem que publiquei em fóruns que frequento:&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Amigos,&lt;/p&gt;

&lt;p&gt;Resolvi que quero ficar apenas com o meu Xbox 360 e então estou vendendo o resto da minha coleção de games. Vender os itens antigos é complicado e doloroso por causa do valor sentimental, eu já comecei antes mas parei pela metade. Agora resolvi que é melhor vender para quem use do que manter tudo isso guardado no armário, apenas ocupando espaço na minha casa.&lt;/p&gt;

&lt;p&gt;Para os que não me conhecem, eu já fiz negociações positivas nos fóruns NES Archive, SegaNET, Fórum UOL e Outerspace. No NES Archive já participei mais ativamente sendo inclusive moderador no passado. Ainda apareço raramente no NES Archive e SegaNET.&lt;/p&gt;

&lt;p&gt;Tenho pontos positivos no &lt;a href=&#34;http://www.mercadolivre.com.br/jm/profile?act=ver&amp;amp;id=78002970&#34;&gt;Mercado Livre&lt;/a&gt; e &lt;a href=&#34;http://myworld.ebay.com/viniciusfs]http://myworld.ebay.com/viniciusfs&#34;&gt;eBay&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Também sou autor do (praticamente morto) blog &lt;a href=&#34;http://www.oitobits.net&#34;&gt;Oitobits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para todos os itens o frete é por conta do comprador, para qualquer verificação o meu CEP é 22231-130. Moro no Rio de Janeiro, bairro Flamengo, quem for da cidade pode retirar em mãos e testar os itens.&lt;/p&gt;

&lt;p&gt;Contato preferencial por MP, e-mail e Gtalk: viniciusfs!gmail.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Só aceito trocas por dinheiro!&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Xbox 360&lt;/h2&gt;

&lt;p&gt;Guitarra: modelo Aerosmith, perfeito estado quase sem uso. &lt;strong&gt;[R$ 150]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0002.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Too Human: completo e perfeito. Só foi aberto, nunca cheguei a jogar. &lt;strong&gt;[R$40]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0052.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;PGR4: completo e perfeito. Só foi aberto, nunca cheguei a jogar. &lt;strong&gt;[R$40]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0053.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Xbox&lt;/h2&gt;

&lt;p&gt;Console destravado, versão 1.6, HD de 40GB, controle S, XBMC atualizado e configurado, vários emuladores prontos para jogar. Uma coletânia de vários DVDs com ROMs diversas. &lt;strong&gt;[R$ 300]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0047.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0048.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Game Cube&lt;/h2&gt;

&lt;p&gt;Resident Evil 4 (Player&#39;s Choice) completo na caixa e com manuais, tudo perfeito. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0056.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Game Boy&lt;/h2&gt;

&lt;p&gt;Game Boy Classic: completo, com caixa, manual, cabo link e o jogo Tetris. Tudo em ótimo estado. &lt;strong&gt;[R$ 150]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0050.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Nintendo DS&lt;/h2&gt;

&lt;p&gt;Nintendo DS Lite branco, completo na caixa com manual e plásticos. Comprado no Submarino, vai até com a nota fiscal.&lt;/p&gt;

&lt;p&gt;R4 Revolution, kit completo com Micro SD 2GB.&lt;/p&gt;

&lt;p&gt;Pacote completo NDS por &lt;strong&gt;[R$ 350]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0051.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;NES&lt;/h2&gt;

&lt;p&gt;NES Playtronic, dois controles, cabo AV e fonte de alimentação. Tudo funcionando perfeitamente. &lt;strong&gt;[R$ 150]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0011.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0013.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Controle NES Max completo, na caixa com manual. Tenho duas unidades, uma ainda esta lacrada a outra só foi aberta para testar. &lt;strong&gt;[R$ 30 cada]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0029.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h3&gt;Jogos&lt;/h3&gt;

&lt;p&gt;River City Ransom completo, caixa, manual e plástico protetor. &lt;strong&gt;[R$50]&lt;/strong&gt; &lt;strong&gt;Vendido para tkricardo (NES Archive)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0049.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mario Bros. &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Mario Bros. &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Mario Bros. 2 &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Mario Bros. 3 &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Battletoads &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ninja Gaiden &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Kirby&#39;s Adventure &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Double Dragon &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Teenage Mutant Ninja Turtles 2 - The Arcade Game &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Micro Machines (Camerica) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Chip &#39;n Dale, Rescue Rangers &lt;strong&gt;[R$ 5]&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0033.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0034.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0037.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0038.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0058.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Famicom&lt;/h2&gt;

&lt;p&gt;Famicom, primeiro modelo (HVC-002) com fonte (HVC-002) e adaptador RF (HVC-003) originais. &lt;strong&gt;[R$ 100]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0007.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0008.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Famicom, primeiro modelo (HVC-002) com cabo RF genérico. O console não liga, foi ligado com fonte errada, alguém que saiba eletrônica pode tentar reparar o equipamento. &lt;strong&gt;[R$ 30]&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Jogos&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Super Mario Bros. (HVC-SM) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Mario USA (HVC-MT) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Mario Bros. 3 (HVC-UM) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Soccer (HVC-SC) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Hoshi no Kirby (HVC-KI) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Derby Stallion - Zenkoku Ban (HSP-47) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sanrio Cup: Pon Pon Volley (CTS-PM) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Teenage Mutant Ninja Turtles 2: The Manhattan Project (RC-863) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Contra Force (Piratinha) &lt;strong&gt;[R$ 5]&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0031.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0032.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;SNES&lt;/h2&gt;

&lt;p&gt;Super NES Control Set completo na caixa. Versão americana, console, dois controles, fonte de alimentação, cabo RF, plástico, manuais e folhetos. Tudo original e perfeito. &lt;strong&gt;[R$ 250]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0014.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0015.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0016.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0018.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0019.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h3&gt;Jogos&lt;/h3&gt;

&lt;p&gt;Super Punch-Out (caixa de locadora) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0041.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0042.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Donkey Kong Country (caixa de locadora) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0039.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0040.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Super Famicom&lt;/h2&gt;

&lt;p&gt;Street Fighter II (SHVC-S2) completo com caixa e manual. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0009.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Final Fight (SHVC-FT) completo com caixa e manual. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0010.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aladdin (SHVC-RJ) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rockman 7 (SHVC-A7RJ-JPN) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Street Fighter II (SHVC-XW) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Donkey Kong (SHVC-8X) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Donkey Kong 2 (SHVC-ADNJ-JPN) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Donkey Kong 3 (SHVC-A3CJ-JPN) &lt;strong&gt;[R$ 25]&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0027.JPG&#34; alt=&#34;&#34; /&gt;
&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0028.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;h2&gt;Mega Drive japonês&lt;/h2&gt;

&lt;p&gt;Fantasia (G-4061) completo com caixa e manual. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0003.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;World of Illusion (G-4080) completo com caixa e manual. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0006.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Bare Knuckle (G-4050) completo com caixa e manual. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0005.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Alladin (G-4111) completo com caixa e manual. &lt;strong&gt;[R$ 50]&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://tmp.oitobits.net/vinicius/vendas/DSCN0004.JPG&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/04/10/mudanca-de-dominio-novo-sistema/</id>
    <title type="html">Mudança de domínio e novo sistema</title>
    <updated>2010-04-10T00:00:00Z</updated>
    <published>2010-04-10T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/04/10/mudanca-de-dominio-novo-sistema/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Ressurgindo das cinzas o blog agora mudou de um sub-domínio do &lt;a href=&#34;http://oitobits.net&#34;&gt;Oitobits&lt;/a&gt; para um domínio próprio. Com o novo domínio agora ele recebeu um nome em definitivo, &lt;em&gt;ultrav&lt;/em&gt;. Não é o melhor de todos mas já tem um nome e não pretendo altera-lo.&lt;/p&gt;

&lt;p&gt;Para complementar as mudanças o site não roda mais no &lt;a href=&#34;http://zine.pocoo.org&#34;&gt;Zine&lt;/a&gt;, não roda nenhum sistema dinâmico na verdade, agora são apenas páginas HTML estáticas geradas com um programa que desenvolvi. Eu testei muitos geradores de sites estáticos antes de decidir fazer o meu. Mesmo depois de começar a codificar eu continuei procurando e testando vários mas por diversos motivos não fiquei satisfeito com nenhum. Assim que o meu código estiver &#39;publicável&#39; divulgarei aqui no blog, por enquanto ele funciona mas é feio e não merece ser visto.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2010/02/25/data-de-instalacao-de-um-pacote-rpm/</id>
    <title type="html">Data de instalação de um pacote RPM</title>
    <updated>2010-02-25T00:00:00Z</updated>
    <published>2010-02-25T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2010/02/25/data-de-instalacao-de-um-pacote-rpm/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Se por algum motivo qualquer você precisar saber a data de instalação de um pacote RPM pode usar a opção &lt;code&gt;%{installdate:time}&lt;/code&gt; na sua query:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@server~]# rpm -qa --queryformat &#34;%{installtime:date} %{name}\n&#34; | grep puppet
Wed 18 Feb 2009 03:24:32 PM BRST puppet-server
Wed 18 Feb 2009 03:24:23 PM BRST puppet
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ainda existe uma opção &lt;code&gt;--last&lt;/code&gt; que lista os pacotes do mais recementemente instalado para o mais antigo. Para saber os últimos três adicionados ao sistema:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[root@server~]# rpm -qa --last | head -3
func-0.24-1.el4                               Wed 14 Oct 2009 10:57:14 AM BRST
certmaster-0.24-1.el4                         Wed 14 Oct 2009 10:57:08 AM BRST
python-simplejson-1.7.3-1.el4                 Wed 14 Oct 2009 10:56:59 AM BRST
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2009/05/06/juntar-arquivos-de-legenda/</id>
    <title type="html">Juntando arquivos de legenda com Subtitles</title>
    <updated>2009-05-06T00:00:00Z</updated>
    <published>2009-05-06T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2009/05/06/juntar-arquivos-de-legenda/" rel="alternate"></link>
    <content type="html">&lt;p&gt;&lt;a href=&#34;http://karasik.eu.org/software/&#34;&gt;Subtiles&lt;/a&gt; é um programa em Perl para manipulação de arquivos de legenda através da linha de comando. Não existe pacote para Ubuntu mas você pode baixar o tar.gz no site, descompactar e copiar o arquivo &lt;code&gt;subs&lt;/code&gt; para &lt;code&gt;/usr/bin&lt;/code&gt;. Depois disso instale o pacote &lt;code&gt;libsubtitles-perl&lt;/code&gt; usado pelo script.&lt;/p&gt;

&lt;p&gt;Entre as diversas tarefas que ele realiza, consegue juntar legendas com facilidade:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ subs -j 2 pt1.str pt2.str -o final.str
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Onde &lt;code&gt;-j&lt;/code&gt; significa &lt;em&gt;join&lt;/em&gt; e o número &lt;code&gt;2&lt;/code&gt; o intervalo de tempo entre o fim de uma legenda e o início da outra. Você vai ter que pensar um pouquinho para acertar a conta mas não vai doer nada. Não se esqueça de adicionar o tempo sem legendas até o fim do arquivo.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2009/04/04/juntar-arquivos-avi-com-mencoder/</id>
    <title type="html">Juntar arquivos AVI usando mencoder</title>
    <updated>2009-04-04T00:00:00Z</updated>
    <published>2009-04-04T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2009/04/04/juntar-arquivos-avi-com-mencoder/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Na linha de comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mencoder -forceidx -ovc copy -oac copy -o file.avi p1.avi p2.avi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Onde &lt;code&gt;-o&lt;/code&gt; é o nome do arquivo final a ser criado, os arquivos seguintes são as partes que serão usadas. Os arquivos devem ter as mesmas configurações de codecs, FPS entre outras coisas. Você não vai conseguir unir dois arquivos com propriedades completamente diferentes.&lt;/p&gt;

&lt;p&gt;Para instalar o mencoder no Ubuntu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install mencoder
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/11/11/backup-incremental-com-rsync-e-hardlinks/</id>
    <title type="html">Backup incremental com rsync e hardlinks</title>
    <updated>2008-11-11T00:00:00Z</updated>
    <published>2008-11-11T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/11/11/backup-incremental-com-rsync-e-hardlinks/" rel="alternate"></link>
    <content type="html">&lt;div class=&#34;alert&#34;&gt;
&lt;p&gt;Esse artigo permanece aqui por motivos históricos. O script é funcional mas
recomendo a utilização do aplicativo &lt;a href=&#34;http://rsnapshot.org&#34;&gt;rsnapshot&lt;/a&gt;
que provê funcionalidade similiar com muito mais recursos. &lt;em&gt;Atualizado em
13/12/2012&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Desde que assinei um VPS onde hospedo esse site e outros projetos pessoais eu venho enrolando para implementar algum tipo de backup. Meu objetivo é ter uma cópia de segurança dos sites e arquivos de configuração do servidor. Queria algo bem simples então apostei no &lt;a href=&#34;http://samba.anu.edu.au/rsync/&#34;&gt;rsync&lt;/a&gt;, por SSH eu sincronizava os diretórios remotos para meu disco local.&lt;/p&gt;

&lt;p&gt;Tudo jóia até eu fazer vários backups e ver como aquilo ia consumindo espaço em disco. A cada novo backup, poucos arquivos mudavam mas eu sempre copiava tudo. Eu precisava é de um backup incremental para resolver o problema, para isso acabei montando um script que usa o rsync e a opção &lt;code&gt;-l&lt;/code&gt; do cp para gerar hardlinks. Um hardlink não é nada mais do que um link para um inode já existente no disco, assim o hardlink e o arquivo alvo são o mesmo arquivo no file system. Sendo o mesmo arquivo eu economizo espaço.&lt;/p&gt;

&lt;p&gt;O que o script faz é procurar um backup anterior no disco, se ele encontra cria um novo diretório feito apenas de hardlinks para esse backup anterior. Depois disso rodamos o rsync contra esse novo diretório, dessa maneira atualizamos o que foi modificado desde o último backup. Para que o novo backup reflita exatamente o que esta no servidor na data atual, rodamos o rsync com a opção &lt;code&gt;--delete&lt;/code&gt; que remove do destino arquivos não existentes na origem.&lt;/p&gt;

&lt;p&gt;Simples e bem eficiente, abaixo um exemplo da economia:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ du -csh *
59M 20080907
65M 20081026
14M 20081109
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O backup &lt;code&gt;20080907&lt;/code&gt; foi o primeiro feito com rsync e tem 59MB. Para o backup &lt;code&gt;20081026&lt;/code&gt; eu rodei novamente o rsync sem criar hardlinks, ou seja baixei todo o conteúdo novamente mais as diferenças, fiz 65MB de download. Para o último backup eu usei o script com hardlinks, baixei apenas a diferença em relação ao último backup, como o texto mostra, apenas 14MB. Para melhorar a coisa, o script também remove backups muito antigos.&lt;/p&gt;

&lt;p&gt;Convencido da utilidade? Vamos ao script:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
#
# Faz backups incrementais de diretorios em um servidor remoto utilizando rsync e
# hardlinks para economia de banda e espaço em disco.
#
# Por Vinicius Figueiredo &amp;lt;viniciusfs [arroba] gmail.com&amp;gt;
# Dominio Publico
# 

SERVER=&#34;servidor.com.br&#34;
DIRS_TO_COPY=&#34;/var/www /etc&#34;
BACKUP_DIR=&#34;/backup&#34;
RETENTION=15

DATE=`date +%Y%m%d`
LOG=&#34;${0}_${DATE}.log&#34;

CURRENT_BACKUP=&#34;${BACKUP_DIR}/${DATE}&#34;

echo &#34;Iniciando script em `date`&#34; &amp;gt; ${LOG}

if [ -e ${BACKUP_DIR}/last ]; then
    LAST_BACKUP=`cat ${BACKUP_DIR}/last`

    if [ -d ${LAST_BACKUP} ]; then
        echo &#34;Ultimo backup encontrando, linkando arquivos...&#34; &amp;gt;&amp;gt; ${LOG}
        cp -la ${LAST_BACKUP} ${CURRENT_BACKUP} &amp;gt;&amp;gt; ${LOG} 2&amp;gt;&amp;amp;1
    fi
else
    echo &#34;Nenhum backup anterior encontrado, criando diretorio para backup atual...&#34; &amp;gt;&amp;gt; ${LOG}
    mkdir ${CURRENT_BACKUP} &amp;gt;&amp;gt; ${LOG} 2&amp;gt;&amp;amp;1
fi

for dir in ${DIRS_TO_COPY}; do
    echo &#34;Iniciando backup de ${SERVER}:${dir}&#34; &amp;gt;&amp;gt; ${LOG}
    rsync -av --delete ${SERVER}:${dir} ${CURRENT_BACKUP} &amp;gt;&amp;gt; ${LOG} 2&amp;gt;&amp;amp;1
done

echo ${CURRENT_BACKUP} &amp;amp;gt; ${BACKUP_DIR}/last

for dir in `find ${BACKUP_DIR} -maxdepth 1 -type d -mtime +${RETENTION}`; do
    echo &#34;Removendo backup ${dir}&#34; &amp;gt;&amp;gt; ${LOG}
    rm -rf ${dir} &amp;amp;gt;&amp;amp;gt; ${LOG} &amp;gt;&amp;gt; ${LOG} 2&amp;gt;&amp;amp;1
done
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O que você deve configurar são as 4 primeiras variáveis.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SERVER&lt;/code&gt; é o servidor de onde iremos tirar esse backup.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DIRS_TO_COPY&lt;/code&gt; é uma lista de diretórios a serem copiados desse servidor, os diretórios devem ser separados por espaço.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BACKUP_DIR&lt;/code&gt; é o destino local do backup.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RETENTION&lt;/code&gt; é a retenção dos backups em dias. Backups mais antigos do que esse número serão deletados no final do script.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para automatizar a tarefa você pode criar um job na cron. Vale lembrar que você vai precisar ter acesso via &lt;a href=&#34;http://www.ultrav.com.br/2008/10/26/ssh-sem-senha-atraves-de-chave-publica-privada/&#34;&gt;SSH sem senha ao servidor&lt;/a&gt; alvo dos backups para que fique 100% automático.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/10/26/ssh-sem-senha-atraves-de-chave-publica-privada/</id>
    <title type="html">SSH sem senha através de chave pública/privada</title>
    <updated>2008-10-26T00:00:00Z</updated>
    <published>2008-10-26T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/10/26/ssh-sem-senha-atraves-de-chave-publica-privada/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Você pode acessar outras máquinas via SSH sem senha utilizando chaves pública/privada. Na máquina de onde partirá o acesso execute o comando abaixo para criar as chaves, lembre-se de deixa o passphrase em branco, esse é o segredo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ssh-keygen -b 1024 -t rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Onde &lt;code&gt;-b&lt;/code&gt; indica o tamanho em bits e &lt;code&gt;-t&lt;/code&gt; o tipo da chave. A chave por padrão é armazenada em &lt;code&gt;~/.ssh&lt;/code&gt; com os nomes &lt;code&gt;id_rsa&lt;/code&gt; para chave privada e &lt;code&gt;id_rsa.pub&lt;/code&gt; para chave pública. Agora é preciso copiar a chave pública para o servidor remoto, isso pode ser feito com o comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ssh-copy-id -i ~/.ssh/id_rsa.pub servidor-remoto
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O comando &lt;code&gt;ssh-copy-id&lt;/code&gt; adiciona a chave ao arquivo &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; do servidor remoto. A opção &lt;code&gt;-i&lt;/code&gt; serve apenas para indicar qual é a chave a ser copiada, é a única opção do comando, acho que nem deveria ser necessária.&lt;/p&gt;

&lt;p&gt;Agora é só conectar.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/08/13/bitcalc-convertendo-bytes-kilobytes-megabytes/</id>
    <title type="html">Bitcalc - Convertendo bytes, kilobytes, megabytes, etc...</title>
    <updated>2008-08-13T00:00:00Z</updated>
    <published>2008-08-13T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/08/13/bitcalc-convertendo-bytes-kilobytes-megabytes/" rel="alternate"></link>
    <content type="html">&lt;p&gt;No meu dia a dia como administrador de servidores faço bastante uso de uma ferramenta para conversão de valores entre bytes, kilobytes, megabytes, etc. Certo dia o &lt;a href=&#34;http://www.matisse.net/bitcalc/&#34;&gt;site que uso para isso&lt;/a&gt; estava fora do ar quando precisei então pensei em fazer a minha própria &#39;calculadora&#39; para conversão. Depois de notar o quanto seria chato escrever uma função para cada unidade pensei que seria uma boa hora para escrever minha primeira função usando &lt;a href=&#34;http://docs.python.org/ref/lambdas.html&#34;&gt;lambda&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O resultado foi a função abaixo que com mais algumas linhas de Python e ajuda de &lt;a href=&#34;http://webpy.org&#34;&gt;web.py&lt;/a&gt; virou o site &lt;a href=&#34;http://bitcalc.oitobits.net&#34;&gt;Bitcalc&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def convert(number, unit):
    return map(lambda x : number * 1024 ** (unit - x), range(0,6))
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/03/28/compartilhando-pastas-entre-ubuntu-e-windows/</id>
    <title type="html">Compartilhando pastas entre Ubuntu e Windows</title>
    <updated>2008-03-28T00:00:00Z</updated>
    <published>2008-03-28T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/03/28/compartilhando-pastas-entre-ubuntu-e-windows/" rel="alternate"></link>
    <content type="html">&lt;p&gt;No Ubuntu é bem fácil adicionar suporte ao Samba, que permite o compartilhamento de arquivos entre Linux e Windows. No menu &lt;em&gt;System &amp;gt; Administration &amp;gt; Shared folders&lt;/em&gt; você instala o suporte a Samba e seleciona os diretórios que deseja compartilhar. O único porém é que nessa tela você não consegue criar um password para seu usuário no Samba então do Windows você não pode acessar o compartilhamento recém adicionado.&lt;/p&gt;

&lt;p&gt;Para resolver isso acessar o terminal e digitar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo smbpasswd -e seu_usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com isso o usuário especificado agora pode logar no Samba com a senha cadastrada.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/03/19/pasted-um-pastebin-clone-em-python/</id>
    <title type="html">Pasted, um pastebin clone em Python</title>
    <updated>2008-03-19T00:00:00Z</updated>
    <published>2008-03-19T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/03/19/pasted-um-pastebin-clone-em-python/" rel="alternate"></link>
    <content type="html">&lt;p&gt;&lt;a href=&#34;http://p.oitobits.net&#34;&gt;Pasted&lt;/a&gt; é meu primeiro projeto para web. Criado em Python, usando o framework &lt;a href=&#34;http://webpy.org&#34;&gt;web.py&lt;/a&gt; e &lt;a href=&#34;http://sqlobject.org&#34;&gt;SQLObject&lt;/a&gt; para camada de dados, o Pasted é um pastebin clone com objetivo de ser simples e prático.&lt;/p&gt;

&lt;p&gt;A interface é limpa e clara, sem formulários com informações nada interessantes para quem quer mostrar trechos de código ou logs. Ele é simples mas não pobre, é possível responder entradas, visualizar as diferenças entre elas e até baixar um arquivo no formato &lt;em&gt;unified diff&lt;/em&gt;. Existe a possibilidade de visualizar o código colorido, famoso &lt;em&gt;highlight syntax&lt;/em&gt;, graças ao &lt;a href=&#34;http://pygments.org&#34;&gt;Pygments&lt;/a&gt;. Cada entrada tem um MD5 hash do seu conteúdo registrado, se você tentar publicar algo que já existe será redirecionado para entrada existente. Dessa maneira evito duplicações e economizo espaço no banco de dados. Além da interface web é possível enviar conteúdo para o Pasted através de dois scripts que funcionam em linha de comando, o primeiro escrito em Python serve para usuários de Windows, Linux e outros UNIX, o segundo é um script RC para usuários de Plan 9.&lt;/p&gt;

&lt;p&gt;As 260 linhas de Python que formam o &lt;a href=&#34;http://src.oitobits.net/pasted&#34;&gt;código fonte&lt;/a&gt; estão online. Provavelmente o código não tem muita coisa legal para ser vista dada a simplicidade do sistema e sem dúvidas deve ter coisa pra melhorar nele.&lt;/p&gt;

&lt;p&gt;Se você gostar, use! :)&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/03/01/problemas-de-video-com-plan9-no-vmware/</id>
    <title type="html">Problemas de vídeo com Plan 9 no VMware</title>
    <updated>2008-03-01T00:00:00Z</updated>
    <published>2008-03-01T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/03/01/problemas-de-video-com-plan9-no-vmware/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Para solucionar o problema de vídeo que faz com que a tela fique &#39;embaralhada&#39; ao rodar a instalação do &lt;a href=&#34;http://plan9.bell-labs.com/plan9/&#34;&gt;Plan 9&lt;/a&gt; no VMware você deve iniciar uma nova janela de console e digitar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo hwaccel off &amp;gt; /dev/vgactl
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para criar uma nova janela no &lt;a href=&#34;http://en.wikipedia.org/wiki/Rio_%28program%29&#34;&gt;Rio&lt;/a&gt;, o gerenciador de janelas do Plan9, clique com o botão direito, escolha &lt;em&gt;New&lt;/em&gt;, o mouse vai virar uma cruz, com o botão direito desenhe um quadrado e ele vai virar seu terminal. Agora é só limpar a tela, para isso minimize todas as janelas ou crie uma janela que ocupe toda a tela. É só continuar a instalação.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/01/21/rodando-windows-nativo-atraves-de-maquina-virtual-no-ubuntu/</id>
    <title type="html">Rodando Windows nativo através de máquina virtual no Ubuntu</title>
    <updated>2008-01-21T00:00:00Z</updated>
    <published>2008-01-21T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/01/21/rodando-windows-nativo-atraves-de-maquina-virtual-no-ubuntu/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Esse artigo mostra como fazer para rodar uma instalação real do Windows através de uma máquina virtual usando o VMware Server no Ubuntu. Isso serve para quem já tem o Windows e Ubuntu em dual-boot com Linux e tem interesse de usar essa mesma instalação do Windows virtualizada DENTRO do Ubuntu economizando assim espaço em disco e tendo algumas vantagens.&lt;/p&gt;

&lt;p&gt;Exemplo de uso? Tenho o Ubuntu como sistema principal e o Windows para jogos. Quando preciso usar o Windows para algo rápido e que não precisa de desempenho eu carrego ele através de uma máquina virtual sem sair do Ubuntu. Quando quero jogar dou boot nele direto.&lt;/p&gt;

&lt;p&gt;As dicas abaixo são todas baseadas em experiências pessoais, eu não sou nenhum expert em virtualização e nem domino todas as opções e parâmetros do VMware. O texto abaixo mostra o que eu fiz para resolver o meu problema, funcionou aqui no meu computador e pode funcionar no seu. Use as dicas abaixo por sua conta e risco, eu não me responsabilizo por qualquer dano ao seu sistema.&lt;/p&gt;

&lt;h2&gt;Preparando&lt;/h2&gt;

&lt;p&gt;O recomendado é fazer isso do zero mas nada impede de você usar tudo que já tem. Fazendo do zero é bom instalar o Windows e depois o Ubuntu porque o sistema da Microsoft tem uma mania terrível de engolir o GRUB e ignorar outros sistemas operacionais instalados no disco.&lt;/p&gt;

&lt;p&gt;Com o dual-boot preparado configure um tempo razoável para seleção dos sistemas no menu do GRUB. Aqui deixei 10 segundos o que acho suficiente. Essa alteração é feita editando o arquivo &lt;code&gt;/boot/grub/menu.lst&lt;/code&gt; e mudando o valor da variável &lt;code&gt;timeout&lt;/code&gt; para o número desejado.&lt;/p&gt;

&lt;p&gt;Provavelmente você vai rodar o VMware através do seu usuário normal então temos que garantir que ele vai ter acesso aos discos. Para isso faça no terminal:&lt;sourcecode syntax=&#34;sh&#34;&gt;sudo adduser seu_usuario disk&lt;/sourcecode&gt; &lt;/p&gt;

&lt;p&gt;Instale o VMware Server no Ubuntu. Existem muitos passo-a-passo para fazer isso na internet, não vou me preocupar em explicar isso aqui até porque é basicamente baixar o pacote, descompactar e rodar o script de instalação padrão.&lt;/p&gt;

&lt;h2&gt;Ajustando o Windows&lt;/h2&gt;

&lt;p&gt;Dê boot no Windows e crie um novo profile de hardware. Para isso acesse &lt;em&gt;Control Panel &amp;gt; System &amp;gt; Hardware &amp;gt; Hardware profiles&lt;/em&gt;. Clique em &lt;em&gt;Copy&lt;/em&gt; e nomeie o profile como &lt;e&gt;VMware&lt;/em&gt;. Marque a opção &lt;em&gt;Wait until I select a hardware profile&lt;/em&gt; para que o Windows aguarde a seleção do profile correto antes do boot.&lt;/p&gt;

&lt;p&gt;Reinicie no Ubuntu.&lt;/p&gt;

&lt;h2&gt;Criando a máquina virtual&lt;/h2&gt;

&lt;p&gt;Inicia o VMware Server e crie uma nova máquina virtual custom. Siga os passos normais até a parte do disco. Agora selecione &lt;em&gt;Use Physical Disk&lt;/em&gt;, depois &lt;em&gt;Use Entiry Disk&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Inicia a máquina virtual. Selecione o Windows no menu do GRUB e selecione o profile VMware no Windows. Instale o VMware Tools através do menu &lt;em&gt;VM &amp;gt; Install VMware Tools&lt;/em&gt;, reinicie a máquina virtual e instale todo o hardware que ele detectar.&lt;/p&gt;

&lt;p&gt;Lembre-se SEMPRE inicie a máquina virtual com o profile VMware, nele estarão configurados o hardware para máquina virtual. Quando você iniciar o Windows nativamente SEMPRE escolha o profile original.&lt;/p&gt;

&lt;h2&gt;Possíveis problemas&lt;/h2&gt;

&lt;p&gt;Se o Windows parar no boot com uma tela azul e reiniciar você vai ter que parar a máquina virtual e alterar na mão o arquivo de configuração dela. O arquivo tem geralmente nome da máquina, a extensão &lt;code&gt;.vmx&lt;/code&gt; e por padrão fica em &lt;code&gt;/var/lib/vmware/Virtual Machines/nome-da-vm&lt;/code&gt;. Abra o arquivo e substitua as entradas scsi para o disco por ide, exemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;scsi0:0.present = &#34;TRUE&#34;
scsi0:0.fileName = &#34;Windows XP Pro.vmdk&#34;
scsi0:0.deviceType = &#34;rawDisk&#34;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;para:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ide0:0.present = &#34;TRUE&#34;
ide0:0.fileName = &#34;Windows XP Pro.vmdk&#34;
ide0:0.deviceType = &#34;rawDisk&#34;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Abra também o arquivo de configuração do disco dessa máquina, no meu caso &lt;code&gt;Windows XP Pro.vmdk&lt;/code&gt; e delete as entradas abaixo (os valores de cada item podem ser diferentes):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ddb.geometry.biosSectors = &#34;63&#34;
ddb.geometry.biosHeads = &#34;255&#34;
ddb.geometry.biosCylinders = &#34;19457&#34;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por fim, altere o driver de scsi para ide substituindo &lt;code&gt;ddb.adapterType = &#34;buslogic&#34;&lt;/code&gt; por &lt;code&gt;ddb.adapterType = &#34;ide&#34;&lt;/code&gt;. Salve os arquivos e inicie a máquina virtual.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2008/01/01/script-para-baixar-videos-do-youtube-em-python/</id>
    <title type="html">Script para baixar vídeos do YouTube em Python</title>
    <updated>2008-01-01T00:00:00Z</updated>
    <published>2008-01-01T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2008/01/01/script-para-baixar-videos-do-youtube-em-python/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Para praticar fiz um script que baixa vídeos do YouTube e converte para AVI. Mais um teste bobo somente para estudar um pouco de Python. O script baixa usando &lt;code&gt;wget&lt;/code&gt; e converte usando &lt;code&gt;ffmpeg&lt;/code&gt; então só funciona em &lt;a href=&#34;http://en.wikipedia.org/wiki/Unices&#34;&gt;unices&lt;/a&gt; que tenham esses dois programas. Depois vou ver se faço pelo menos o download em Python puro.&lt;/p&gt;

&lt;p&gt;Eu não checo o único argumento de entrada porque acredito que seja óbvio, é apenas a URL do vídeo. Se você quiser usar basta salvar o código abaixo como &lt;code&gt;yt&lt;/code&gt; ou qualquer coisa que poupe digitação em algum lugar como &lt;code&gt;/usr/bin&lt;/code&gt; e usar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ yt http://www.youtube.com/watch?v=8QXO7ExtQrQ&lt;/code&gt; 
O script é uma &#34;versão&#34; em Python do script que o &lt;a href=&#34;http://ambientworks.net/~pedro/&#34;&gt;Pedro Martelletto&lt;/a&gt; fez em &lt;a href=&#34;http://en.wikipedia.org/wiki/Lua_%28programming_language%29&#34;&gt;Lua&lt;/a&gt; e esta &lt;a href=&#34;http://www.openbsd.org/4.2_packages/i386/yt-6.tgz-long.html&#34;&gt;disponível&lt;/a&gt; no sistema de ports do OpenBSD.&lt;/p&gt;

&lt;p&gt;Como já falei, é só exercício. Se você precisa de um script para uso intenso (quem precisa?) recomendo experimentar o &lt;a href=&#34;http://www.arrakis.es/~rggi3/youtube-dl/&#34;&gt;youtube-dl&lt;/a&gt; também em Python com muito mais recursos, a única coisa que ele não faz é converter o vídeo para AVI.&lt;/p&gt;

&lt;p&gt;Se você usa Windows devem existir trocentos programas em .NET que ocupam 30MB de memória RAM e 50MB de espaço em disco para fazer isso.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
&#34;&#34;&#34;
    Description: Uses wget and ffmpeg to download and convert YouTube videos to AVI.
    Author: Vinicius de F Silva &amp;lt;viniciusfs@gmail.com&amp;gt;
    License: Public Domain
&#34;&#34;&#34;
import sys, urllib, re, os, commands

page_url = sys.argv[1]
download_url = &#34;http://www.youtube.com/get_video?video_id=%s&amp;amp;t=%s&amp;amp;fmt=18&#34;
wget_cmd = &#34;wget -O \&#39;%s\&#39; \&#39;%s\&#39;&#34;
ffmpeg_cmd = &#34;ffmpeg -y -i \&#39;%s\&#39; -b 1000k -vcodec mpeg4 -acodec copy \&#39;%s\&#39;&#34;

socket = urllib.urlopen(page_url)
html_buffer = socket.read()
socket.close()

video_params_pattern = re.compile(&#34;video_id=(?P&amp;lt;video_id&amp;gt;.*)&amp;amp;t=(?P&amp;lt;t_param&amp;gt;[^\&#34;&amp;amp;]*)&#34;)
video_params = video_params_pattern.search(html_buffer)

title_pattern = re.compile(&#34;\&amp;lt;meta name=\&#34;title\&#34; content=\&#34;(?P&amp;lt;title&amp;gt;.*)\&#34;&#34;)
title = title_pattern.search(html_buffer).group(&#34;title&#34;)

cleaner = re.compile(r&#34;[^A-Za-z0-9\_]&#34;)
title = title.replace(&#34; &#34;, &#34;_&#34;)
title = cleaner.sub(&#34;&#34;, title)

tmp_flv = title + &#34;.flv&#34;
output_filename = tmp_flv.replace(&#34;.flv&#34;, &#34;.avi&#34;)
output_filename = output_filename.lower()

os_cmd = wget_cmd % (tmp_flv, download_url%(video_params.group(&#34;video_id&#34;), video_params.group(&#34;t_param&#34;)))
wget_status, wget_output = commands.getstatusoutput(os_cmd)
os_cmd = ffmpeg_cmd % (tmp_flv, output_filename)
ffmpeg_status, ffmpeg_output = commands.getstatusoutput(os_cmd)

os.remove(tmp_flv)

print &#34;File %s saved successfully.&#34; % output_filename
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/12/30/primeira-contribuicao-com-software-livre/</id>
    <title type="html">Primeira contribuição com software livre</title>
    <updated>2007-12-30T00:00:00Z</updated>
    <published>2007-12-30T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/12/30/primeira-contribuicao-com-software-livre/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Hoje fiz a minha primeira contribuição de código com software livre. Já ajudei na tradução de algumas coisas mas nunca tinha mandado código algum, até porque ainda tenho muito o que aprender. Apesar de bem simples, estou feliz com a contribuição e espero continuar ajudando cada vez mais.&lt;/p&gt;

&lt;p&gt;O software escolhido foi o player de música que mais uso, o &lt;a href=&#34;http://www.listen-project.org&#34;&gt;Listen&lt;/a&gt;. Adicionei a possibilidade de usar o site &lt;a href=&#34;http://www.letras.mus.br&#34;&gt;Letras.mus.br&lt;/a&gt; para exibir as letras das músicas em execução. É um daqueles patches que nasce da necessidade, queria usar esse site para pesquisa de letras, vi que era simples adicionar e resolvi fazer. Fiz um &lt;a href=&#34;http://www.listen-project.org/ticket/732&#34;&gt;patch para a versão atual&lt;/a&gt; e também um &lt;a href=&#34;http://www.listen-project.org/ticket/733&#34;&gt;plugin para versão em desenvolvimento&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Agora vou tentar acertar o plugin que estava fazendo para exibir a música em execução no status do Pidgin e envia-lo também.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/12/07/programas-indispensaveis-no-meu-computador/</id>
    <title type="html">Programas indispensáveis no meu computador</title>
    <updated>2007-12-07T00:00:00Z</updated>
    <published>2007-12-07T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/12/07/programas-indispensaveis-no-meu-computador/" rel="alternate"></link>
    <content type="html">&lt;p&gt;O &lt;a href=&#34;http://tiagomadeira.net/&#34;&gt;Tiago&lt;/a&gt; me convidou para um &lt;a href=&#34;http://tiagomadeira.net/programas-indispensaveis-no-meu-computador&#34;&gt;meme&lt;/a&gt;. A missão? Escolher três programas indispensáveis para mim. Nunca pensei muito sobre isso mas acho que os programas que chegam mais próximo dessa condição devem ser os que uso mais né? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.mozilla.com/en-US/firefox/?from=getfirefox&#34;&gt;Mozilla Firefox&lt;/a&gt; - A janela para o mundo.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.listen-project.org/&#34;&gt;Listen&lt;/a&gt; - Sempre tocando alguma música da minha biblioteca de MP3. Poderia ser melhor mas por enquanto é bom o suficiente e cumpre o que promete.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.gnome.org/projects/gedit/&#34;&gt;Gedit&lt;/a&gt; - Aqui que digito meus textos, códigos, listas de compras, to-do lists que nunca serão completas e tudo mais. O Tiago disse que usa o vim eu só faço isso para edições mais rápidas ou quando estou sem interface gráfica mesmo. Se estiver no Gnome vou de Gedit turbinado, ele é legal pra caramba.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se eu quebrar a corrente vocês ficarão chateados comigo? Pois eu vou quebrar.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/11/29/organizando-tags-mp3-com-python-e-taglib/</id>
    <title type="html">Organizando tags MP3 com Python e taglib</title>
    <updated>2007-11-29T00:00:00Z</updated>
    <published>2007-11-29T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/11/29/organizando-tags-mp3-com-python-e-taglib/" rel="alternate"></link>
    <content type="html">&lt;p&gt;O título é só uma piada, aqui você não vai organizar nada, isso foi apenas um exercício bobo de programação. O &lt;a href=&#34;http://tiagomadeira.net/&#34;&gt;Tiago Madeira&lt;/a&gt; fez seu blog renascer das cinzas com um &lt;a href=&#34;http://tiagomadeira.net/organizando-sua-biblioteca-de-musicas-no-formato-mp3-utilizando-ruby-e-taglib&#34;&gt;script em Ruby que preenche as tags de arquivos MP3&lt;/a&gt; baseando-se no nome do arquivo. Eu achei legal e como estou querendo aprender Python resolvi fazer parecido com essa linguagem.&lt;/p&gt;

&lt;p&gt;O resultado é o script abaixo que não faz exatamente a mesma coisa que o dele. Pelo que eu entendi do código Ruby o script do Tiago entra nos subdiretórios e sai acertando as tags de arquivos com o padrão de nome &#34;Faixa - Titulo.mp3&#34;. O meu fica no diretório corrente e acerta as tags de arquivos no padrão &#34;Artista - Album - Faixa - Titulo.mp3&#34;. O script é burro e espera esse padrão de nome de arquivo, se não for esse ele vai fazer besteira.&lt;/p&gt;

&lt;p&gt;Programadores Python, pelo amor de Deus, não me matem! Eu não tenho experiência alguma com a linguagem e com certeza absoluta isso ai pode ser feito de maneira muito mais elegante, muito mais Python. Simplesmente fui na documentação da linguagem e usei as primeiras coisas que eu encontrei pra ler diretórios e executar expressões regulares. Qualquer sugestão de melhoria é bem vinda e acatada com carinho pelo &lt;em&gt;wannabe programmer&lt;/em&gt; aqui.&lt;/p&gt;

&lt;p&gt;Para executar o código você deve ter o interpretador Python (duh!) e a &lt;a href=&#34;http://developer.kde.org/~wheeler/taglib.html&#34;&gt;TagLib&lt;/a&gt; para Python, que é &lt;a href=&#34;http://news.tiker.net/software/tagpy&#34;&gt;TagPy&lt;/a&gt;. No ubuntu um &lt;code&gt;apt-get install python-tagpy&lt;/code&gt; resolve tudo.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
import os, re, tagpy

conteudo = os.listdir(os.getcwd())

for i in conteudo:
    if os.path.isfile(i) and re.search(&#39;mp3$&#39;, i) is not None:
        arquivo = tagpy.FileRef(i)
        tag = arquivo.tag()
        nome_do_arquivo = i.split(&#34;.&#34;)
        nome_do_arquivo = nome_do_arquivo[0].split(&#34; - &#34;)
        tag.artist = nome_do_arquivo[0]
        tag.album = nome_do_arquivo[1]
        tag.track = int(nome_do_arquivo[2])
        tag.title = nome_do_arquivo[3]
        arquivo.save()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;[update]&lt;/strong&gt; Vivendo e aprendendo, uma versão um pouco mais enxuta do script. A biblioteca padrão do Python é bem extensa e ainda não conheço muito dela. A dica do modulo glob eu achei lendo um script qualquer na net.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import os, glob, tagpy

for file in glob.glob(&#34;*.mp3&#34;):
    nome, extensao = os.path.splitext(file)
    nome = nome.split(&#34; - &#34;)
    arquivo = tagpy.FileRef(file)
    tag = arquivo.tag()
    tag.artist = nome[0]
    tag.album = nome[1]
    tag.track = int(nome[2])
    tag.title = nome[3]
    arquivo.save()
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/10/31/listando-modulos-perl-instalado/</id>
    <title type="html">Listando módulos Perl instalados</title>
    <updated>2007-10-31T00:00:00Z</updated>
    <published>2007-10-31T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/10/31/listando-modulos-perl-instalado/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Precisava de alguns módulos Perl instalados para rodar um script. Como não entendo nada de Perl e nunca instalei nenhum módulo adicional só tenho os que vieram na instalação padrão do Ubuntu Server. Mas quais são eles? São suficiente para o tal script que precisava usar? Atrás dessas informações encontrei o script abaixo que gera uma lista de módulos Perl instalados.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl

use File::Find;
use ExtUtils::MakeMaker;

find(
        sub {
                next unless /.pm$/i;
                my $mod = $File::Find::name;
                $mod =~ s/^$File::Find::topdir\/?//;
                $mod =~ s/\.pm$//i;
                $mod=~s!/!::!g;
                my $ver=MM-&amp;amp;gt;parse_version($File::Find::name);
                print &#34;$mod ($ver)\n&#34;
        },
        @INC
)
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/10/26/por-que-eu-gosto-da-linha-de-comando/</id>
    <title type="html">Por que eu gosto da linha de comando</title>
    <updated>2007-10-26T00:00:00Z</updated>
    <published>2007-10-26T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/10/26/por-que-eu-gosto-da-linha-de-comando/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Depois que você começa a pegar o jeito é bom demais. Editando um post para o &lt;a href=&#34;http://www.oitobits.net&#34;&gt;Oitobits&lt;/a&gt;, baixei algumas imagens mas precisava criar miniaturas e renomea-las para publicar. Na linha de comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a=0; for i in *; do convert $i -resize 25% jaspion-famicom-thumb-$a.jpg; \
mv $i jaspion-famicom-$a.jpg; a=$(($a+1)); done
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Quebrei a linha em duas para não detonar com o layout do site.&lt;/p&gt;

&lt;p&gt;Usuários de outros sistemas operacionais sem esse recurso teriam que abrir algum software de edição de imagem com capacidade de processamento em lote para fazer o mesmo ou então fazer arquivo por arquivo.&lt;/p&gt;

&lt;p&gt;Eu poderia ter feito mais, subir as imagens para o servidor que hospedo meu site com um comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;scp *.jpg oitobits@oitobits.net:/oitobits.net/wp-content/uploads
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Posso também transformar a primeira linha de comandos em um script modificando poucas coisas, assim sempre que eu precisar rodo esse script e pronto, trabalho chato feito em poucos segundos.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/09/10/ubuntu-desabilitando-o-touchpad-enquanto-digita/</id>
    <title type="html">Ubuntu, desabilitando o touchpad enquanto digita</title>
    <updated>2007-09-10T00:00:00Z</updated>
    <published>2007-09-10T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/09/10/ubuntu-desabilitando-o-touchpad-enquanto-digita/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Uma coisa muito irritante no touchpad dos notebooks é aciona-lo sem querer enquanto você digita algo. Involuntariamente você clica em algum botão, marca texto, fecha alguma janela ou simplesmente tira o foco da caixa de texto e digita tudo em algum outro lugar. Para evitar esse comportamento podemos desabilitar o touchpad enquanto digitamos. O procedimento é simples e rápido, não requer prática tão pouco habilidade.&lt;/p&gt;

&lt;p&gt;Primeiro vamos editar o &lt;code&gt;xorg.conf&lt;/code&gt; para adicionar um parâmetro na configuração do touchpad. Depois configurar o &lt;code&gt;syndaemon&lt;/code&gt; para desabilitar o touchpad quando o teclado estiver ativo. Mamão com açucar.&lt;/p&gt;

&lt;p&gt;Pra começar vamos fazer uma cópia do &lt;code&gt;xorg.conf&lt;/code&gt; só por precaução.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora vamos editar o arquivo original:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gedit /etc/X11/xorg.conf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Procure por uma sessão parecida com isso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Section &#34;InputDevice&#34;
	Identifier	&#34;Synaptics Touchpad&#34;
	(...)
End Section
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E adiciona a linha abaixo antes de &lt;code&gt;End Section&lt;code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Option &#34;SHMConfig&#34; &#34;on&#34;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por fim vamos adicionar o &lt;code&gt;syndaemon&lt;/code&gt; na iniciação da nossa sessão Gnome. Para isso vá em &lt;em&gt;System &amp;gt; Preferences &amp;gt; Sessions&lt;/em&gt;, clique na aba &lt;em&gt;Startup Programs&lt;/em&gt;, clique no botão &lt;em&gt;Add&lt;/em&gt; e digite &lt;code&gt;syndaemon -d -t -i 2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora é só reiniciar o Xorg com a combinação de teclas &lt;em&gt;CTRL + ALT + BACKSPACE&lt;/em&gt; e testar.&lt;/p&gt;

&lt;p&gt;O syndaemon é um programa que monitora a atividade do teclado. A opção -d faz com que ele rode em background o tempo inteiro, -t faz com que ele desative apenas o clique e a rolagem do touchpad, você pode mover o cursor enquanto digita. Por fim, a opção -i é o tempo em segundos que o touchpad vai permanecer desabilitado depois que a última tecla é pressionada.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/08/18/webcam-do-acer-5600-series-no-ubuntu-linux/</id>
    <title type="html">Webcam dos Acer Aspire 5600 Series no Ubuntu Linux</title>
    <updated>2007-08-18T00:00:00Z</updated>
    <published>2007-08-18T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/08/18/webcam-do-acer-5600-series-no-ubuntu-linux/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Os notebooks Aspire da &lt;a href=&#34;http://www.acer.com&#34;&gt;Acer&lt;/a&gt; vem com uma webcam integrada acima da tela. Essa webcam pode ser da Logitech, Orbit ou uma marca desconhecida que dizem se chamar Bison. Bison mesmo eu só conheço o &#39;chefão&#39; do Street Fighter mas esse é assunto do &lt;a href=&#34;http://www.oitobits.net&#34;&gt;meu outro blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como essa webcam Bison não funciona &lt;em&gt;out of the box&lt;/em&gt; no Ubuntu esse artigo tem como objetivo descrever os passos para você deixa-la operacional. Tudo que esta escrito aqui foi testado com sucesso num Aspire 5630 com Ubuntu 7.04.&lt;/p&gt;

&lt;p&gt;Primeiro vamos identificar se realmente temos uma webcam Bison no notebook, depois baixar e compilar os fontes do driver, carregar o modulo e por fim testar em alguma aplicação. Simples, rápido e indolor.&lt;/p&gt;

&lt;p&gt;Para identificar a webcam basta executar o &lt;code&gt;lsusb&lt;/code&gt; no console e procurar por uma linha com &lt;code&gt;ID 5986:0100&lt;/code&gt; ou &lt;code&gt;ID 5986:0200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para baixar o código fonte direto do repositório é preciso ter o &lt;a href=&#34;http://subversion.tigris.org/&#34;&gt;Subversion&lt;/a&gt; instalado e executar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;svn checkout svn://svn.berlios.de/linux-uvc/linux-uvc/trunk&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se você não tem e nem deseja instalar o Subversion basta copiar para alguma pastas todos os arquivos do site: &lt;a href=&#34;http://svn.berlios.de/svnroot/repos/linux-uvc/linux-uvc/trunk&#34;&gt;http://svn.berlios.de/svnroot/repos/linux-uvc/linux-uvc/trunk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No Ubuntu é necessário fazer uma pequena alteração no arquivo &lt;code&gt;Makefile&lt;/code&gt; substituindo a linha &lt;code&gt;INSTALL_MOD_DIR := usb/media&lt;/code&gt; para &lt;code&gt;INSTALL_MOD_DIR := kernel/ubuntu/media/usbvideo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora basta a seqüencia de comandos abaixo para compilar e carregar o módulo do driver.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd [diretorio dos arquivos]
sudo make
sudo modprobe -r uvcvideo
sudo make install
sudo modprobe uvcvideo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para testar basta abrir qualquer programa que faça uso do dispositivo. No meu caso testei a funcionalidade da webcam com o luvcview que é recomendado pela equipe que mantém o driver. Para instalar o luvcview:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://mxhaard.free.fr/spca50x/Investigation/uvc/luvcview-20070512.tar.gz
tar -xzvf luvcview-20070512.tar.gz
cd luvcview-20070512
make
./luvcview&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se tudo aconteceu sem problemas uma janela com um live preview da webcam salta na sua tela. Para compilar o luvcview é necessário ter as bibliotecas de desenvolvimento do SDL, caso não tenha instale com o comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install libsdl1.2-dev&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qualquer dúvida deixe um comentário que eu tenho ajudar.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/19/plugins-check_cpu-e-check_ram-para-nagios/</id>
    <title type="html">Plugins check_cpu e check_ram para Nagios</title>
    <updated>2007-07-19T00:00:00Z</updated>
    <published>2007-07-19T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/19/plugins-check_cpu-e-check_ram-para-nagios/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Como já &lt;a href=&#34;http://www.ultrav.com.br/2007/06/28/algumas-criticas-ao-nagios/&#34;&gt;falei por aqui&lt;/a&gt;, estou implementando um servidor &lt;a href=&#34;http://www.nagios.org&#34;&gt;Nagios&lt;/a&gt; na empresa em que trabalho. Vou monitorar uma porrada de servidores e a esmagadora maioria não é de responsabilidade minha, eu apenas vou coloca-los para serem monitorados no Nagios. Quando eu questiono os administradores sobre o que eles desejam monitorar a maioria quer saber sobre espaço em disco, uso de CPU, memória RAM e checar por processos ativos. Nos plugins oficiais do Nagios não tem nada que retorne uso de CPU e RAM em porcentagem e a maioria das pessoas não se contenta em monitorar o load average da máquina. Para resolver o problema eu fiz dois shell scripts que fazem o serviço desejado e mostram o resultado em porcentagem.&lt;/p&gt;

&lt;p&gt;Apesar de simples foram bem úteis e feitos com carinho, talvez sirvam para mais pessoas por isso estou disponibilizando os dois aqui.&lt;/p&gt;

&lt;h3&gt;Atualizações&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;27/08/2007 - Ajuste do bug que fazia a checagem por NRPE retornar erro de output no Solaris.&lt;/li&gt;
&lt;li&gt;20/07/2007 - Atualização para funcionar em Solaris 8 e 9.&lt;/li&gt;
&lt;li&gt;19/07/2007 - Lançada primeira versão testada em Linux (Debian, Ubuntu, CentOS e Red Hat Enterprise).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://tmp.oitobits.net/check_cpu&#34;&gt;check_cpu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://tmp.oitobits.net/check_ram&#34;&gt;check_ram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/18/3-posts-uteis-no-simples-ideias/</id>
    <title type="html">3 posts úteis no Simples Idéias</title>
    <updated>2007-07-18T00:00:00Z</updated>
    <published>2007-07-18T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/18/3-posts-uteis-no-simples-ideias/" rel="alternate"></link>
    <content type="html">&lt;p&gt;O Nando Vieira do &lt;a href=&#34;http://www.simplesideias.com.br&#34;&gt;Simples Idéias&lt;/a&gt; vai sortear o livro &lt;a href=&#34;http://pragmaticprogrammer.com/titles/rails/&#34;&gt;Agile Web Development With Rails&lt;/a&gt; entre os leitores que comentarem sobre três posts do blog dele. Eu não me recordo quando comecei a acompanhar o Simples Idéias e não sei como cai lá, só sei que desde a primeira visita assinei o feed e sempre que tem post novo eu saio correndo pra ler. Como estou aprendendo Ruby e Rails claro que vou tentar a sorte nessa &#39;&lt;a href=&#34;http://simplesideias.com.br/ganhe-o-livro-agile-web-development-with-rails/&#34;&gt;promoção&lt;/a&gt;&#39;.&lt;/p&gt;&lt;p&gt;Os meus posts escolhidos são:&lt;/p&gt;&lt;ul&gt;
	&lt;li&gt;&lt;a href=&#34;http://simplesideias.com.br/lista-de-plugins-para-o-gedit/&#34;&gt;Lista de Plugins para o gEdit&lt;/a&gt; - Nesse post o Nando mostra uma bela seleção de plugins que facilitam muito a vida de quem deseja usar o gEdit para programar. Com ajuda dele dei uma turbinada no gEdit que passou de simples editor de texto para quase uma IDE. Ainda não é um &lt;a href=&#34;http://macromates.com/&#34;&gt;Textmate&lt;/a&gt; que eu vejo nos screencasts mas fica bem perto e é free.
&lt;/li&gt;

	&lt;li&gt;&lt;a href=&#34;http://simplesideias.com.br/lastfm-no-wordpress/&#34;&gt;Last.fm no Wordpress&lt;/a&gt; - Plugin simples e eficiente que faz o que eu procurava faz tempo. Testado e aprovado, melhor do que os plugins feitos por gringos que achei por ai, então estou usando aqui no blog.&lt;/li&gt;


	&lt;li&gt;&lt;a href=&#34;http://simplesideias.com.br/spesa-oficialmente-lancado/&#34;&gt;Spesa oficialmente lançado&lt;/a&gt; - Esse é apenas o post anúncio do projeto dele, um gerenciador financeiro pessoal chamado Spesa. Porque eu curti o post? Bem, o aplicativo que ele escreve é bom e realmente útil. Além disso serviu como incentivo para começar a programar pra web e iniciar algum projeto mesmo sozinho.&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Ele também pediu uma sugestão de tema para posts. Bem, primeiro eu sugiro aceitar trackbacks ;) e quanto a temas para posts, eu ainda sou iniciante em Ruby/Rails e entendo que o cara esta em outro nível por isso não vou pedir textos para iniciantes. Acho que seria legal postar algo sobre Python e desenvolvimento para desktop já que pelo que parece ele anda fazendo algo na área.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/15/mr-lee-e-a-catcam/</id>
    <title type="html">Mr. Lee e a CatCam</title>
    <updated>2007-07-15T00:00:00Z</updated>
    <published>2007-07-15T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/15/mr-lee-e-a-catcam/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Quem tem gato em casa sabe que eles gostam de sair pra dar longos passeios. Algumas vezes vão para lugares que os donos não fazem idéia e só voltam 2 ou 3 dias depois. Como todo dono de gatos sempre ficava curioso em saber o que diabos eles tanto fazem pela rua. Um dos meus gatos saia religiosamente acompanhado do gato que morava no prédio ao lado. Achava engraçado o fato dele ter um amigo pra dar &#39;rolês&#39;.&lt;/p&gt;&lt;p&gt;Um sujeito muito mais curioso que eu resolveu acabar com suas dúvidas. Montou uma câmera numa caixinha a prova de gatos, configurou para tirar fotos automáticas e pendurou isso no pescoço do seu gato, Mr. Lee. O resultado você pode ver no site &lt;a href=&#34;http://www.mr-lee-catcam.de/index.htm&#34;&gt;Mr. Lee CatCam&lt;/a&gt;.  O dono do bichano também explica em detalhes como fez tudo para outros donos curiosos repetirem a dose com gatos de todo o mundo. No momento eu só quero que a &lt;a href=&#34;http://flickr.com/photos/youthcrust/818459725/in/set-1459034/&#34;&gt;Sofia&lt;/a&gt; desista de comer o botão da minha camisa.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/15/hello-perl/</id>
    <title type="html">Hello Perl</title>
    <updated>2007-07-15T00:00:00Z</updated>
    <published>2007-07-15T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/15/hello-perl/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Larry Wall fumou um cigarrinho do capeta pra desenvolver a linguagem Perl. Rode você mesmo o código abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
if (( !0 &amp;amp;&amp;amp; !1 ) != ( not 0 &amp;amp;&amp;amp; not 1 ))
{
    printf &#34;Hello Perl!\n&#34; 
}
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/11/aquecimento-global/</id>
    <title type="html">Aquecimento global</title>
    <updated>2007-07-11T00:00:00Z</updated>
    <published>2007-07-11T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/11/aquecimento-global/" rel="alternate"></link>
    <content type="html">&lt;p&gt;&lt;img src=&#34;/static/images/sun_love.jpg&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Sensacional.&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/10/salvando-arquivos-remotos-no-gedit/</id>
    <title type="html">Salvando arquivos remotos no gedit</title>
    <updated>2007-07-10T00:00:00Z</updated>
    <published>2007-07-10T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/10/salvando-arquivos-remotos-no-gedit/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Estou usando o gedit turbinado com &lt;a href=&#34;http://simplesideias.com.br/lista-de-plugins-para-o-gedit/&#34;&gt;plugins e tema selecionados pelo Nando Vieira&lt;/a&gt;. Acho incrível a produtividade desse editor, com a coleção certa de plugins ele faz bastante coisa e chega até a deixar de lado a necessidade de uma IDE. Ainda não é um &lt;a href=&#34;http://macromates.com/&#34;&gt;Textmate&lt;/a&gt; mas como ter um computador da Apple esta muito longe dos meus planos, mais especificamente do meu orçamento, estou adorando o custo/benefício.&lt;/p&gt;&lt;p&gt;Por padrão o gedit não consegue salvar arquivos remotos abertos via FTP mas resolver isso é fácil. Basta abrir o &lt;em&gt;Configurator Editor&lt;/em&gt; do Gnome e editar a chave &lt;code&gt;/apps/gedit-2/preferences/editor/save/writable_vfs_schemes&lt;/code&gt; acrescentando FTP na lista.&lt;/p&gt;&lt;p&gt;Para abrir o Configurator Editor basta abertar &lt;code&gt;ALT + F2&lt;/code&gt; e digitar &lt;code&gt;gconf-editor&lt;/code&gt;.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/07/01/ajustando-o-comportamento-do-backspace-no-firefox/</id>
    <title type="html">Ajustando o comportamento do backspace no Firefox</title>
    <updated>2007-07-01T00:00:00Z</updated>
    <published>2007-07-01T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/07/01/ajustando-o-comportamento-do-backspace-no-firefox/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Por padrão no Firefox para Linux (ou pelo menos no Ubuntu) o backspace retorna para o início da página ao invés de voltar para página anterior. Para ajustar isso basta digitar na barra de endereços:&lt;/p&gt;&lt;p&gt;&lt;code&gt;about:config&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Na lista procure por &lt;em&gt;&lt;strong&gt;browser.backspace_action&lt;/strong&gt;&lt;/em&gt;, clique duas vezes e altere o valor de 1 para 0. Configurado para 1 a ação do backspace é fazer um &#39;page up&#39;, com 0 ele faz um &#39;page back&#39;.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/06/28/algumas-criticas-ao-nagios/</id>
    <title type="html">Algumas críticas ao Nagios</title>
    <updated>2007-06-28T00:00:00Z</updated>
    <published>2007-06-28T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/06/28/algumas-criticas-ao-nagios/" rel="alternate"></link>
    <content type="html">&lt;p&gt;&lt;a href=&#34;http://www.nagios.org&#34;&gt;Nagios&lt;/a&gt; é um popular software de monitoração, o trabalho dele é ficar de olho nos equipamentos da sua rede e avisar quando algo anda errado. Eu aceitei o desafio de implementar o sistema na empresa que eu trabalho e desde então venho quebrando bastante a cabeça.&lt;/p&gt;&lt;p&gt;A parte boa, diria ótima, do Nagios é a flexibilidade. O sistema é capaz de monitorar computadores, switches, roteadores, impressoras e qualquer outra coisa que você coloque numa rede IP. Ao contrário de outros softwares semelhantes ele não te obriga a muitas coisas. Por não ser um pacote fechado e completo para cumprir a sua tarefa o Nagios não te diz como você vai monitorar seus hosts ou como vai te notificar sobre as falhas. Ele deixa que você decida como quer fazer isso e se preocupa em fazer o que você deseja do jeito que deseja.&lt;/p&gt;&lt;p&gt;A maneira mais comum de monitorar hosts é através de plugins, o Nagios tem um &lt;a href=&#34;http://nagiosplug.sourceforge.net/&#34;&gt;pacote padrão de plugins&lt;/a&gt; para checar o que normalmente os administradores de rede precisam. Se você quer algo que o pacote padrão de plugins não faz pode escrever seu próprio plugin na linguagem que bem entender seguindo algumas regras simples. A flexibilidade que isso te dá é incrível, o que o Nagios pode monitor fica limitado apenas a habilidade e criatividade do administrador.&lt;/p&gt;&lt;p&gt;A parte ruim do sistema é a sua complexidade. Ele te dá grande flexibilidade mas te deixa na mão muitos arquivos de configuração que dependem uns dos outros formando um verdadeiro &lt;em&gt;spaghetti code&lt;/em&gt;. Para melhorar tudo esses arquivos de configuração são em texto puro. Você vai criar centenas (ou até milhares) de objetos para fazer o que quer e todos eles vão estar em arquivos texto. É provável que você esteja ai pensando &#34;mas que fresco, quer usar software Unix e não mexer com arquivos texto?&#34;. Eu não tenho problemas em trabalhar com arquivos texto, o problema é quando eu tenho que trabalhar com centenas deles pra fazer um software funcionar. A manutenção disso se torna trabalhosa e lenta.&lt;/p&gt;&lt;p&gt;Em ambientes pequenos com até 100 hosts e serviços básicos a implementação do Nagios nem é tão complexa assim, agora em ambientes muito grandes a coisa fica apavorante. Atualmente eu tenho uns 200 servidores no meu Nagios e provavelmente vou chegar nos 800. Levando em consideração que precise monitorar 5 serviços em cada servidor terei 4000 serviços. Quisera eu monitorar apenas 5 serviços em cada máquina e eu nem falei que serviços dependem de contatos, horários, notificações, grupos, comandos e assim você começa entender onde eu quero chegar. É desumano e inviável manter isso em arquivos de texto. Não consigo entender como os desenvolvedores ainda não colocaram todas as configurações em um banco de dados com uma interface mais agradável e ágil para administração.&lt;/p&gt;&lt;p&gt;Outra coisa que também me deixou triste é a documentação sobre recursos avançados. Textos sobre o básico como baixar, compilar e configurar meia dúzia de serviços em meia dúzia de hosts você encontra aos milhares na internet. Agora tente procurar algo mais avançado como redundância e monitoração distribuída. Como eu tenho três grandes redes diferentes eu gostaria de dividir o processamento da minha monitoração em 3 servidores e manter a configuração/visualização deles centralizada mas infelizmente é impossível.&lt;/p&gt;&lt;p&gt;O que também me incomoda é o fato do Nagios não ter suporte a vários processadores. Eu tenho um baita servidor com 4 processadores totalizando 8 cores e o software não pode tirar vantagem disso. É decepcionante.&lt;/p&gt;&lt;p&gt;A aplicação é boa, muito boa, faz o que promete e ainda é gratuita mas tem muitos pontos a serem melhorados. Eu espero um dia estar plenamente satisfeito com o Nagios, terminar de implementar o sistema no meu ambiente e manter a sanidade. Depois disso eu até escrevo uma apostila, um livro ou empacoto todas as soluções que encontrei num sistema e faço consultoria por ai.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/03/31/linux-tem-nome-ubuntu/</id>
    <title type="html">Linux tem nome: Ubuntu</title>
    <updated>2007-03-31T00:00:00Z</updated>
    <published>2007-03-31T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/03/31/linux-tem-nome-ubuntu/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Minhas primeiras experiências com Linux foram a bastante tempo atrás, não sou tão velho nesse mundo mas já se passaram muitos anos desde que instalei um tal de Conectiva 6 no meu 486. Na época eu não conhecia ninguém que rodasse Linux, na verdade nunca nem tinha visto o sistema rodando mas era um garoto curioso e queria descobrir o que era esse tal Linux. Lembro que a falta de conhecimento e conhecidos pra ajudar fizeram com que primeiro eu perdesse minha partição de dados na tentativa de instalação e depois passei uma semana no dual boot até configurar meu modem.&lt;/p&gt;&lt;p&gt;Com grande satisfação posso falar que usar Linux hoje não é mais tão complicado quanto já foi. E não digo isso porque conheço um pouco mais do sistema, digo isso porque agora existe o Ubuntu. Estou tendo o prazer de rodar nesse momento a versão 7.04 dessa distribuição. Essa versão é beta e o produto final sai em um mês.&lt;/p&gt;&lt;p&gt;Acabei de instalar o sistema e fiz as atualizações sugeridas automaticamente. Depois do reboot fui conferir a opção &#34;Efeitos da Área de Trabalho&#34; que permite o uso daqueles &lt;em&gt;eye-candy&lt;/em&gt; famosos. Achei incrível habilitar essas opções com apenas dois cliques mas não gostei de ver que a cereja do bolo, desktop 3D, não funcionava. Para resolver cliquei em &#34;Aplicações&#34; &amp;gt; &#34;Adicionar/Remover&#34;, digitei Beryl na busca, marquei os resultados e cliquei em OK. Simples e fácil. Eles conseguiram tornar o meu artigo sobre instalação&lt;a href=&#34;http://vinicius.oitobits.net/arquivo/ati-aiglx-e-beryl-no-ubuntu-edgy-facil-facil/&#34;&gt; do AIGLX + Beryl&lt;/a&gt; algo completamente inútil.&lt;/p&gt;&lt;p&gt;Com um bonito e moderno desktop funcionando com menos de 5 minutos resolvi acessar internet e ver uns vídeos no YouTube. Flash Player? O Firefox avisou que eu precisava do plugin, pediu a minha confirmação e fez todo o serviço. Falando em vídeos, resolvi ir para minha coleção pessoal. Cliquei no primeiro vídeo e o Totem disse que eu não tinha codec mas me sugeriu alguns pacotes para resolver o problema. Aceitei a sugestão e pronto, vídeo rodando. Testei outros formatos e sempre que o sistema não encontrava um codec instalado automaticamente me sugeria algum pacote para resolver o problema.&lt;/p&gt;&lt;p&gt;Uma novidade dessa versão, que ainda não pude testar, é a opção de instalar drivers proprietários em poucos cliques. Na próxima semana devo comprar uma nova placa de vídeo e então vou poder testar esse recurso. Como tudo andou bem até agora não tenho nenhum receio de que algo possa dar errado.&lt;/p&gt;&lt;p&gt;A única coisa chata é que o GRUB ainda &#34;engole&#34; a entrada para o Windows quando adiciona algum novo kernel na lista. Se bem que com tanta facilidade e eficiência eu não faço questão nenhuma de voltar pra lá.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/02/22/apt-get-atraves-de-um-proxy-isa-server/</id>
    <title type="html">apt-get através de um proxy ISA Server</title>
    <updated>2007-02-22T00:00:00Z</updated>
    <published>2007-02-22T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/02/22/apt-get-atraves-de-um-proxy-isa-server/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Hoje configurei uma máquina virtual rodando Ubuntu Server na minha estação de trabalho e tive dificuldades para conseguir rodar o apt-get por estar atrás de um proxy ISA Server da Microsoft. O procedimento normal para configurar acesso via proxy é adicionar a variável http_proxy no sistema editando o arquivo .bashrc na sua pasta home. Normalmente basta adicionar essas duas linhas ao final do arquivo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http_proxy=http://usuario:senha@servidorproxy:porta
export http_proxy&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como nada feito na Microsoft segue os padrões a autenticação do ISA Server tem uma diferença importante, o nome do domínio de rede. A linha fica assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http_proxy=http://DOMINIO\\usuario:senha@servidorproxy:porta
export http_proxy&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora é só executar o &lt;code&gt;.bashrc&lt;/code&gt; e se divertir.&lt;/p&gt;&lt;p&gt;Essa dica não vale apenas para apt-get, acredito que qualquer aplicativo possa fazer uso dessa variável de ambiente.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2007/01/13/ati-aiglx-e-beryl-no-ubuntu-edgy-facil-facil/</id>
    <title type="html">ATI, AIGLX e Beryl no Ubuntu Edgy fácil fácil</title>
    <updated>2007-01-13T00:00:00Z</updated>
    <published>2007-01-13T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2007/01/13/ati-aiglx-e-beryl-no-ubuntu-edgy-facil-facil/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Acabei de instalar meu Ubuntu e pra deixar o visual dele menos chato resolvi usar desktop 3D. Todo mundo já viu dezenas de vídeos do famoso cubo 3D do Beryl e não conheço uma pessoa que não tenha vontade de experimentar.&lt;/p&gt;

&lt;p&gt;Já brinquei com o Beryl antes usando XGL e os drivers proprietários da ATI para minha Radeon 9800 Pro mas não achei nada fácil e não gostei do desempenho. Para nessa nova tentativa resolvi usar o AIGLX que já vem instalado no Ubuntu Edgy e só precisa ser ativado. Foi tudo muito simples e rápido, gostei muito da facilidade de instalação e do desempenho que achei superior aos meus testes anteriores.&lt;/p&gt;

&lt;p&gt;Os procedimentos abaixo foram testados com uma placa de vídeo Radeon 9800 Pro rodando os drivers Open Source, tudo isso claro, num Ubuntu Edgy. Os drivers proprietários da ATI não permitem o uso do AIGXL então você vai ter que remove-los se quiser usam esse tutorial.&lt;/p&gt;

&lt;p&gt;Pra começar vamos ver se o direct rendering está ativo no seu sistema, para isso digite esse comando no console:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;glxinfo | grep rendering
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A resposta deve ser isso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;direct rendering: Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos agora adicionar os repositórios do Beryl. Digite:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gedit /etc/apt/sources.list
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No gEdit que foi aberto adicione a linha:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;deb http://ubuntu.beryl-project.org/ edgy main
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Salve o arquivo e feche o gEdit. Para ter acesso a esse repositório precisamos adicionar a chave de autenticação, basta digitar os comandos abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://ubuntu.beryl-project.org/root@lupine.me.uk.gpg
sudo apt-key add root@lupine.me.uk.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois basta atualizar a lsita de pacotes com:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instale os pacotes do Beryl:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install beryl-core beryl-plugins beryl-plugins-data emerald \
beryl-settings beryl-manager beryl beryl-dev emerald-themes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com o Beryl instalado vamos editar o arquivo xorg.conf que é a configura do servidor X:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gedit /etc/X11/xorg.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Adicione a linha abaixo na seção Device:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Option &#34;XAANoOffscreenPixmaps&#34; &#34;true&#34;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Salve, saia do gEdit e agora vamos configurar o beryl-manager para ser iniciado automaticamente em cada sessão do Gnome.&lt;/p&gt;

&lt;p&gt;Como o nome já diz, o beryl-manager é responsável gerenciar o Beryl. Clique em &lt;em&gt;Sistema &amp;gt; Preferências &amp;gt; Sessões&lt;/em&gt;. Vá até a aba &#34;&lt;em&gt;Programas Iniciais&lt;/em&gt;&#34;, clique em &#34;&lt;em&gt;Adicionar&lt;/em&gt;&#34; e digite &lt;strong&gt;beryl-manager&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agora é só reiniciar o servidor X com a combinação de teclas &lt;em&gt;CTRL + ALT + Backspace&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Se tudo deu certo, você já tem um desktop 3D bonito e prático. Você vai ver que o Beryl rodando no seu computador é muito mais legal do que os vídeos rodando no computador dos outros. ;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/static/images/aiglx-beryl-ati.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2006/12/06/ativando-mod_rewrite-no-apache/</id>
    <title type="html">Ativando mod_rewrite no Apache</title>
    <updated>2006-12-06T00:00:00Z</updated>
    <published>2006-12-06T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2006/12/06/ativando-mod_rewrite-no-apache/" rel="alternate"></link>
    <content type="html">&lt;p&gt;No meu texto sobre &lt;a href=&#34;http://vinicius.oitobits.net/arquivo/instalando-lamp-apache-mysql-e-php-no-ubuntu/&#34;&gt;instalação de um ambiente LAMP no Ubuntu Linux&lt;/a&gt; faltou algo que pode ser muito útil, instalar o mod_rewrite no Apache. O mod_rewrite faz miséria e tem muitos recursos, você pode conferir todos na &lt;a href=&#34;http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html&#34;&gt;documentação oficial&lt;/a&gt;, uma das suas aplicações mais comuns é na criação de URLs amigáveis. Ativar o bichinho no Ubuntu é muito simples, basta uma linha:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo a2enmod rewrite&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora é só recarregar o Apache:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/apache force-reload&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2006/12/05/convertendo-arquivos-chm-para-html-no-linux/</id>
    <title type="html">Convertendo arquivos CHM para HTML no Linux</title>
    <updated>2006-12-05T00:00:00Z</updated>
    <published>2006-12-05T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2006/12/05/convertendo-arquivos-chm-para-html-no-linux/" rel="alternate"></link>
    <content type="html">&lt;p&gt;O formato &lt;acronym title=&#34;Microsoft Compressed HTML Help&#34;&gt;CHM&lt;/acronym&gt; é um formato de arquivos proprietário da Microsoft criado para ser usado em seus arquivos de help. Muitos e-books e páginas de documentação encontrados na internet vem nesse formato, existem diversos aplicativos para visualiza-los no Linux e um dos mais usados é o &lt;a href=&#34;http://xchm.sourceforge.net/&#34;&gt;xchm&lt;/a&gt;. Eu particulamente não me sinto confortável consultando documentos grandes nesse formato e também me incomoda a falta de flexibilidade que não permite edição do arquivo. Para solucionar esse problema podemos converter o arquivo CHM para HTML usando a biblioteca &lt;a href=&#34;http://www.jedrea.com/chmlib/&#34;&gt;CHM lib&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No Ubuntu ou Debian é fácil:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install libchm-bin
extract_chmLib arquivo.chm destino&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;A primeira linha instala a CHM lib no nosso sistema e a segunda linha é responsável pela conversão dos arquivos, onde &#34;arquivo.chm&#34; é o caminho para o arquivo a ser convertido e &#34;destino&#34; é o diretório destino onde os arquivos HTML serão gerados.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2006/11/28/instalando-lamp-apache-mysql-e-php-no-ubuntu/</id>
    <title type="html">Instalando LAMP (Apache, MySQL e PHP) no Ubuntu</title>
    <updated>2006-11-28T00:00:00Z</updated>
    <published>2006-11-28T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2006/11/28/instalando-lamp-apache-mysql-e-php-no-ubuntu/" rel="alternate"></link>
    <content type="html">&lt;p&gt;Preparar o seu &lt;a href=&#34;http://www.ubuntu.com&#34;&gt;Ubuntu Desktop&lt;/a&gt; para virar um ambiente de desenvolvimento &lt;acronym apache=&#34;&#34; title&#34;linux=&#34;&#34; php&#34;=&#34;&#34; mysql=&#34;&#34;&gt;LAMP&lt;/acronym&gt; é fácil e rápido. Esse ambiente é fundamental para desenvolvedores web ou até mesmo para quem não é programador mas mantém um blog ou sites pequenos.&lt;/p&gt;

&lt;p&gt;Como a primeira letra do LAMP é Linux e isso já temos instalado vamos pular e ir direto para segunda, ou melhor pra todas as três restantes de uma só vez. Abra um terminal e digite:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install apache2 mysql-server php5 php5-mysql&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Como você já deve ter notado esse comando vai instalar o servidor Apache com suporte a PHP e o servidor MySQL. Depois disso vamos trocar a senha do usuário root do MySQL com o comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo mysqladmin -u root password novasenha&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Onde &#34;novasenha&#34; é a senha que você deseja.&lt;/p&gt;

&lt;p&gt;Para facilitar a sua vida na administração desse servidor MySQL vamos instalar o famoso &lt;a href=&#34;http://www.phpmyadmin.net&#34;&gt;phpMyAdmin&lt;/a&gt; com o comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install phpmyadmin&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Agora vamos testar se tudo funcionou corretamente, para isso basta criar um arquivo com o nome index.php em /var/www com o comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gedit /var/www/index.php&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Copie e cole o código abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php php_info();?&amp;gt;&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Agora basta acessar http://localhost/ para ver uma página com informações do PHP indicando que tudo funcionou corretamente. O site de administração do phpMyAdmin pode ser acessado no endereço http://localhost/phpmyadmin/.&lt;/p&gt;

&lt;p&gt;O diretório default para sites é /var/www então é lá que os arquivos do seu site devem ficar para estarem disponíveis no Apache.&lt;/p&gt;</content>
  </entry>

  <entry>
    <id>http://www.ultrav.com.br/2006/11/24/hello-world/</id>
    <title type="html">Hello World</title>
    <updated>2006-11-24T00:00:00Z</updated>
    <published>2006-11-24T00:00:00Z</published>
    <link href="http://www.ultrav.com.br/2006/11/24/hello-world/" rel="alternate"></link>
    <content type="html">&lt;p&gt;O primeiro artigo de um blog sempre soa idiota mas não tenho como escapar do tradicional &#34;esse é um blog pessoal e pretendo usar ele para falar de assuntos que tenho interesse, coisas como programação, sistemas operacionais, desenvolvimento de jogos e tecnologia em geral&#34;.&lt;/p&gt;</content>
  </entry>

</feed>
