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

<channel>
	<title>Valdinei dos Santos</title>
	<atom:link href="http://www.valdineidossantos.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.valdineidossantos.com</link>
	<description>programação, sistemas operacionais e assuntos web</description>
	<lastBuildDate>Sat, 27 Feb 2010 20:09:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Utilizando svn em linha de comando</title>
		<link>http://www.valdineidossantos.com/2010/02/utilizando-svn-em-linha-de-comando/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=utilizando-svn-em-linha-de-comando</link>
		<comments>http://www.valdineidossantos.com/2010/02/utilizando-svn-em-linha-de-comando/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 20:02:50 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[controle código]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[versionamento]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=165</guid>
		<description><![CDATA[Estava trabalhando em projeto com o  @Joe  e como estavamos em lugares diferentes tinhamos que sincronizar nosso trabalho assim sempre que terminassemos um feature simples como uma página, um layout ou qualquer coisa simples mas funcional nós mandamos para o servidor e o outro poderia pegar as atualizações e seguir com seus próprios [...]]]></description>
			<content:encoded><![CDATA[<p>Estava trabalhando em projeto com o <a title="@joerabelo" href="http://twitter.com/joerabelo" target="_blank"> @Joe </a> e como estavamos em lugares diferentes tinhamos que sincronizar nosso trabalho assim sempre que terminassemos um feature simples como uma página, um layout ou qualquer coisa simples mas funcional nós mandamos para o servidor e o outro poderia pegar as atualizações e seguir com seus próprios códigos.</p>
<p>Para que possamos fazer isso é necessário que nossos códigos estejam sob um servidor de arquivos que faz esse controle de versionamento e outras coisas.</p>
<p>Esse servidor é conhecido como subversion ( <a title="http://subversion.tigris.org/" href="http://subversion.tigris.org/" target="_blank">http://subversion.tigris.org/</a> ) ele nos dá inúmeras possibilidades como adicionar arquivos, remover arquivos, sincronizar, verificar updates, avançar para novas versões, retroceder para versões anteriores de arquivos e outras coisas mais.  Assim não precisamos ficar fazendo os malditos .old, .old1, .old2, .old3.</p>
<p>Depois dessa micro historinha vamos aos codigos.</p>
<p>Para fazermos o download de um projeto para trabalharmos teremos que ter um usuário e senha cadastrados junto ao servidor isso quem tem de fazer é o administrador do projeto.</p>
<p>Considerando que você tenha um usuário e senha valido no servidor vamos listar as pastas e arquivos do projeto.</p>
<pre class="brush: shell"># Lista a raiz do projeto
svn list svn://url/servidor</pre>
<pre class="brush: shell"># Lista a pasta path do projeto
svn list svn://url/servidor/path</pre>
<p>Seria básicamente um ls no servidor svn.</p>
<p>Agora vamos fazer o download ou melhor o checkout do projeto para nossa máquina para começarmos os trabalhos, afinal tempo é dinheiro.</p>
<pre class="brush: shell">#fazendo o download da pasta path para uma url local
svn co svn://url/servidor/path /url/onde/ficara/projeto</pre>
<p>Caso você não esteja logado vai ser requisitado a senha e o usuário que você esta usando no momento na maquina local vai ser<br />
passado como parametro para o checkout no servidor svn</p>
<p>Caso você tenha outro usuário cadastrado no servidor svn você pode passar esse usário como parâmetro.</p>
<pre class="brush: shell">svn --username outroUsuario co svn://url/servidor/path /url/onde/ficara/projeto</pre>
<p>A cada novo commit (envio de codigos para o servidor svn) será criado um novo número de controle de versão (revision).  Pensando que poderiamos mandar um código incorreto(bugado) para o servidor e um companheiro queira pegar  uma versão anterior ou seja a ultima versão correta do projeto pois você ou alguém mandou um código bugado.<br />
Vamos pedir ao servidor informações sobre o projeto para sabermos o número da última revisão.</p>
<pre class="brush: shell">#Descobrindo informações sobre o projeto
# o que interessa neste momento e saber qual o numero de revision
svn info svn://url/servidor/path
#Visto o numero da ultima revisão podemos escolher qualquer versão anterior a essa passando o -r no checkout
svn --username outroUsuario -r numerorevisao co svn://url/servidor/path /url/onde/ficara/projeto</pre>
<p>Pronto temos os códigos todos em nossa máquina agora mãos a obra vamos trabalhar com codificação.</p>
<p>Quando terminarmos vamos precisar mandar nossa modificações para o servidor, para isso temos um comando bem bacana e simples.</p>
<pre class="brush: shell">#Voce pode commitar uma pasta inteira ou  um arquivo você escolhe
svn commit -m "Seu comentário ou justificativa para as mudanças do codigo isso vai para o log do commit"  /path/a/ser/commitado /path/arquivo/commitar</pre>
<p>Podemos verificar todos os arquivos que estão modificados em seu computador e no servidor.</p>
<pre class="brush: shell">svn status -u path/a/ser/verificado</pre>
<p>Com alguma frequência  dois desenvolvedores modificam o mesmo arquivo quando isso acontecer o arquivo vai ser marcado como conflict<br />
Para ver as diferenças é possivel fazer um</p>
<pre class="brush: shell"> svn diff  arquivoNovo arquivoVelho</pre>
<p>Depois de ter corrigidos todos os erros basta marcar esse arquivo como resolvido.</p>
<pre class="brush: shell"> svn resolv  arquivoNovo</pre>
<p>Logo</p>
<pre class="brush: shell"> svn resolved  arquivoNovo</pre>
<p>Para depois fazer seu commit corretamente, agora como você vai resolver os conflitos do arquivo&#8230;. isso é com você &#8230;</p>
<p>E por ultimo e não menos importante podemos ver o commit das pessoas envolvidas no projeto além de seus comentários e arquivos modificados.</p>
<pre class="brush: shell">#Pegando a saida do log e redirecionando para o less caso seja muito grande esse log.
svn log | less</pre>
<p>E para uma leitura completa do log escolha um revision r visto no log visualizado anteriormente.</p>
<pre class="brush: shell">svn -r  -v  log</pre>
<p>Atenção a dicas básicas, nunca apague fisicamente um arquivo com nosso amigo rm, utilize</p>
<pre class="brush: shell">svn del /path/arquivo
#ou
svn rm /path/arquivo

#ou para pasta com recursividade
svn rm -r /path/past</pre>
<p>E para adicição de arquivos ao projeto.</p>
<pre class="brush: shell">svn add /path/arquivo

#ou para pasta //Nao testado <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  

svn add -r /path/pasta</pre>
<p>Acredito que com esses comandos básicos já de para se divertir a vontade com o subversion, aconselho sempre usar um servidor de controle de versão. Existem outros como o CVS, GIT dentre outros mais esses ainda não experimentei , quando o fizer posto aqui alguma coisa.</p>
<p>Abraços</p>
<p>Dinei</p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "svn";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2010/02/utilizando-svn-em-linha-de-comando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Editando tags id3 com python</title>
		<link>http://www.valdineidossantos.com/2010/01/editando-tag-id3-python/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=editando-tag-id3-python</link>
		<comments>http://www.valdineidossantos.com/2010/01/editando-tag-id3-python/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 20:31:33 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[id3]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[mutage]]></category>
		<category><![CDATA[mutagen]]></category>
		<category><![CDATA[os.join]]></category>
		<category><![CDATA[os.walk os.path]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=150</guid>
		<description><![CDATA[Ola a todos, 
Hoje vou falar de um problema que muitas pessoas devem ter. Ao baixar uma música qualquer da internet os carinhas colocam o nome do site no Titulo da música, no artista e nos comentários mas como isso se o o arquivo esta com nome correto?
Eles usam as tags ID3, mas então o [...]]]></description>
			<content:encoded><![CDATA[<p>Ola a todos, </p>
<p>Hoje vou falar de um problema que muitas pessoas devem ter. Ao baixar uma música qualquer da internet os carinhas colocam o nome do site no Titulo da música, no artista e nos comentários mas como isso se o o arquivo esta com nome correto?<br />
Eles usam as tags ID3, mas então o que é a tag ID3? </p>
<p>&#8220;A etiqueta ID3 (em inglês: ID3 Tag) é um conjunto de informações mais usados junto com o formato de áudio MP3. Ela permite armazenar informações como o título, artista, album, número da faixa, ou outra informação sobre o arquivo no próprio aquivo.&#8221; Wikipedia [1]</p>
<p>Depois de ler um pouco a respeito resolvi mudar as tags das músicas para que quando as estiver escutando apareçam os dados válidos como nome da música e do Artista que a canta. Eu uso o Rhythmbox[2] e este pode até ser integrado ao seu software para conversa instantanea como AMSN[4], PIDGIN[4] dentre outros. Fazer isso na mão seria muito cansativo e não divertido, solução &#8230;. python. </p>
<p>Para este script utilizei uma biblioteca não padrão do python o mutagen[5], este serve para mostrar/editar as tags ID3 das músicas em formato mp3.</p>
<p>De acordo com o exemplo do site bastam 4 linhas para abrir->modificar->salvar o titulo de uma música em formato mp3 em seu HD.</p>
<pre class="brush:python">
 from mutagen.easyid3 import EasyID3
 audio = EasyID3("sua_musica.mp3")
 audio["title"] = "Somente um exemplo no titulo"
 audio.save()
</pre>
<p>Agora vamos a meu script, não vou comentar pois o código já esta bem comentado.</p>
<pre class="brush:python">
#!/bin/env python
#!-*- coding: utf-8 -*-
from sys import exit
from os import walk, path
from os.path import isfile, join

"""
@author: Valdinei dos Santos
@twitter: http://twitter.com/valdineisantos
@site: http://www.valdineidossantos.com/
@date: 16 Janeiro 2010
"""

try:
    from mutagen.easyid3 import EasyID3
except:
    print "Necessario instalar a biblioteca mutagen"
    print "Site: http://code.google.com/p/mutagen/"
    print "Python Setup Tools: easy_install mutagen"
    exit(1)

#Diretorio que vai ser pesquisado
directory_root = "/home/valdinei/Musica/Downloads/"

def getInformations(track):
        fileAtributes = dict()
        """
        O Padrão das músicas estavam "01 - Artista - Album.mp3"
        Nesta parte de Código vc deve se adequar a sua realidade mas isso é só trabalhar com strings.
        """
        #split por "- " me dará com resultado 3 strings
        trackNumber, artist, title   =  track.split("- ")

        #Que depois de tratadas serao retorandas como valor final
        fileAtributes["trackNumber"] =  trackNumber.strip()
        fileAtributes["artist"]      =  artist.strip() 

        #Tratando a string como um lista. O .mp3 esta sendo ignorado pois pego tudo -4 casas do final
        fileAtributes["title"]       =  title.strip()[:-4]

        return fileAtributes 

"""
Caso tenhamos mais diretorios internos sera recursivo.
Mais sobre Walk em : http://docs.python.org/library/os.html#os.walk
"""
for (original,  directoryname, filenames) in walk (directory_root):
    filenames.sort()

    total = len(filenames)

    cont = 0;

    for filename in filenames:
        """
        Calculando a porcentagem de arquivos feitos
        (parcial * 100)/numero total de músicas
        """
        cont = cont +  1
        percent = round (cont * 100 / total )
        print "%02d%%" % percent

        info = getInformations(filename)

        #Verifico se o endereço do arquivo é valido realmente e se ele continua la.
        if isfile( join(original,filename) ):
            """
            Agora vamos começar a modificar as tags ID3 dos arquivos MP3 depois salva-los.
            """
            try:
                mp3 = EasyID3( join(original,filename) )
                mp3["title"] = info["title"]
                mp3["artist"] = info["artist"]
                mp3["tracknumber"] = info["trackNumber"]

                #Salva as informações no arquivo
                mp3.save()
            except Exception, e:
                print "%s %s" % (e.__doc__, e )

print "Todos os Arquivos foram modificados"
</pre>
<p>E com isso suas mp3 agora vão ter o formato que você definiu que teriam. Atenção eu em momento algum modifiquei o nome físico do arquivo, somente as meta informações baseadas no nome que era o que eu tinha em mãos. </p>
<p>Não estou em momento nenhum incentivando a NINGUÉM baixar NADA da internet. A idéia original aqui era simplesmente python + programação e algumas boas práticas. </p>
<p>Algumas coisas que derrepente podem ter passados despercebidas foi o uso do os.walk, os.join, os.isfile todos importados no cabeçalho. Mas isso pode ser um outro assunto de post.</p>
<p>Seguem os links de referencia:</p>
<p>[1] Wikipedia : <a href="http://pt.wikipedia.org/wiki/ID3" target="_blank"> http://pt.wikipedia.org/wiki/ID3 </a></p>
<p>[2] Rhythmbox:  <a href="http://projects.gnome.org/rhythmbox/" target="_blank">  http://projects.gnome.org/rhythmbox/ </a></p>
<p>[4] AMSN: <a href="http://www.amsn-project.net/" target="_blank"> http://www.amsn-project.net/ </a> (esse projeto originalmente era feito por um brasileiro)</p>
<p>[5] PIDGIN: <a href="http://www.pidgin.im/" target="_blank"> http://www.pidgin.im/ </a></p>
<p>[6] Mutagen: <a href="http://code.google.com/p/mutagen/" target="_blank"> http://code.google.com/p/mutagen/ </a></p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "mp3 python programacao";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2010/01/editando-tag-id3-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Themes Gnome com Ubuntu</title>
		<link>http://www.valdineidossantos.com/2009/11/themes-gnome-ubuntu/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=themes-gnome-ubuntu</link>
		<comments>http://www.valdineidossantos.com/2009/11/themes-gnome-ubuntu/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 13:19:30 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[shellscript]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=134</guid>
		<description><![CDATA[Recentemente fiz a atualização do meu Ubuntu e resolvi instalar alguns temas bacanas nele.  Lendo um blog show de bola para ubuntu www.ubuntudicas.com.br encontrei um site de temas bacana.
Projeto Bisigi  http://www.bisigi-project.org/?page_id=6 
E como tinham muitos temas resolvi fazer um script para instalar  , novidade né ?
Segue o script:

#!/bin/bash

#Verificando se a chave publica do [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente fiz a atualização do meu Ubuntu e resolvi instalar alguns temas bacanas nele.  Lendo um blog show de bola para ubuntu <a title="http://www.ubuntudicas.com.br/" href="www.ubuntudicas.com.br" target="_blank">www.ubuntudicas.com.br</a> encontrei um site de temas bacana.</p>
<p>Projeto Bisigi <a href="http://www.bisigi-project.org/?page_id=6" target="_blank"> http://www.bisigi-project.org/?page_id=6 </a></p>
<p>E como tinham muitos temas resolvi fazer um script para instalar <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , novidade né ?</p>
<p>Segue o script:</p>
<pre class="brush:shell">
#!/bin/bash

#Verificando se a chave publica do projeto se econtra em sua listas de chaves
sudo apt-key list | grep -qi 'bisigi'

#Caso nao encontre sera adicionada
if [ $? -gt 0 ];
then
    echo 'Adicionando chave do ppa launch, isso pode demorar um pouquinho tenha paciencia <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> '
    sudo gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-key 881574DE &#038;&#038; gpg -a --export 881574DE | sudo apt-key add -
fi

#Procurando a palavra bisigi(nome do site) no source list
grep -qi 'bisigi' /etc/apt/sources.list

#Caso nao encontre vai adicionar ao source list para que possa ser feito o download dos arquivos via aptitude depois
if [ $? -gt 0 ];
then
    echo "Adicionando os repositorios ao source list "
    sudo echo "## Thèmes du projet bisigi" &gt;&gt; /etc/apt/sources.list
    sudo echo "deb http://ppa.launchpad.net/bisigi/ppa/ubuntu karmic main" &gt;&gt; /etc/apt/sources.list
    sudo echo "deb-src http://ppa.launchpad.net/bisigi/ppa/ubuntu karmic main" &gt;&gt; /etc/apt/sources.list
fi

echo "Atualizando a lista de software com as novas modificacoes"
sudo apt-get update

clear
echo "Instalando os pacotes"
for themeName in "aquadreams-theme" "ubuntu-sunrise-theme" "bamboo-zen-theme" "step-into-freedom-theme" "tropical-theme" "balanzan-theme" "wild-shine-theme" "infinity-theme"  "showtime-theme" "exotic-theme"
do
    echo "==== Instalando o theme ${themeName} ==========="
    #Obrigado @Henter pela dica, simples é melhor que complexo!
    sudo aptitude install -y $themeName
    sleep 1
    clear
done

echo "Finalizada a instalação, para mudar para um dos themes instalados faça:"
echo "Clique no menu principal -&gt; Sistema -&gt; Preferencias -&gt; Aparencia"
echo "Escolha entre os temas apresentados o que mais agrada e seja feliz"
echo " "
echo " "

echo "Blog: http://www.valdineidossantos.com"
echo "Twitter: http://twitter.com/valdineisantos"

echo " "
echo " "
</pre>
<p>Copie o código acima e salve com o nome installThemes.sh, ou outro nome qualquer que você quiser.</p>
<p>Para rodar este script basta executar o comando :</p>
<pre class="brush:shell">   sudo bash /local/onde/salvou/installThemes.sh</pre>
<p>Espero que gostem.</p>
<p>Caso tenha algum bug, correção só mandar fiz esse script rápidinho só para passar para os companheiros de trabalho.</p>
<p>Abraços Valdinei.</p>
<p>Referencias:<br />
<a href="http://www.ubuntudicas.com.br/?p=2232" target="_blank">http://www.ubuntudicas.com.br/?p=2232</a></p>
<p><a href="http://www.bisigi-project.org/?page_id=8&#038;lang=en" target="_blank" >http://www.bisigi-project.org</a></p>
<p><a href="http://www.henter.org/2009/10/04/zen-python" target="_blank">http://www.henter.org/2009/10/04/zen-python</a></p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "shell";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/11/themes-gnome-ubuntu/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Abrindo arquivos com vim</title>
		<link>http://www.valdineidossantos.com/2009/10/abrindo-arquivos-vim/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=abrindo-arquivos-vim</link>
		<comments>http://www.valdineidossantos.com/2009/10/abrindo-arquivos-vim/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 19:48:16 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[dia a dia]]></category>
		<category><![CDATA[geral]]></category>
		<category><![CDATA[gvim]]></category>
		<category><![CDATA[tabs]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=123</guid>
		<description><![CDATA[
Vou postar algumas dicas sobre o VIM, um editor em linha comando.
Básicamente vou postar alguns comandos e como deixo certas funções habilitadas setando as mesmas no seu ~/.vimrc, estou considerando que o leitor saiba os comandos básicos de VIM como abrir arquivo, fechar arquivo, entrar em modo de inserção entrar em modo comandos etc.
Abrindo várias [...]]]></description>
			<content:encoded><![CDATA[<p><img  border='0' src="http://images.wikia.com/vim/images/b/bc/Wiki.png" alt="VIM "  title='VIM'/><br />
Vou postar algumas dicas sobre o VIM, um editor em linha comando.<br />
Básicamente vou postar alguns comandos e como deixo certas funções habilitadas setando as mesmas no seu ~/.vimrc, estou considerando que o leitor saiba os comandos básicos de VIM como abrir arquivo, fechar arquivo, entrar em modo de inserção entrar em modo comandos etc.</p>
<p>Abrindo várias páginas ao mesmo tempo (colocando em buffer)</p>
<pre class="brush:shell">
$vim arquivo1 arquivo2 arquivo3
</pre>
<p>Somente o primeiro arquivo fica exposto quando o vim estiver aberto, o restante dos arquivos fica em buffer. Para mudar para o próximo arquivo no nosso exemplo o arquivo2 em modo de comando (pressione <ESC>)</p>
<pre class="brush:shell">
:bn <enter>
</pre>
<p>E para voltar ao arquivo anterior </p>
<pre class="brush:shell">
:bp <enter>
</pre>
<p>Mas eu não gosto muito desta maneira de trabalho, fico mais a vontade com abas <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , o vim também pode ter abas. Usando os mesmos arquivos como exemplo, utilizaremos a opção &#8220;-p&#8221;</p>
<pre class="brush:shell">
$vim -p arquivo1 arquivo2 arquivo3
</pre>
<p>Pronto todos os arquivos estão aberto sendo somente o primeiro sendo exibido, mas se você perceber bem na parte superior vão existir abas com os nomes dos arquivos abertos e em buffer.<br />
Para movimentarmos entre as tabs temos comandos também, o tabnext e o tabprev.</p>
<p>Em modo de comando digite.</p>
<pre class="brush:shell">
:tabnext &lt;enter&gt;
</pre>
<p>E para voltar para tab anterior</p>
<pre class="brush:shell">
:tabprev &lt;enter&gt;
</pre>
<p>Mas como prefiro usar uns atalhos de teclado vou postar uma maneira de fazer isso com uma tecla somente, vou utilizar o comando &#8216;map&#8217; para mapear uma ação de teclado.<br />
No arquivo ~/.vimrc entre com essas linhas de comando salve e feche.</p>
<pre class="brush:shell">
map  &lt;M-Left&gt; :tabprev &lt;CR&gt;
map &lt;M-Right&gt; :tabnex &lt;CR&gt;
</pre>
<p>Agora com a combinação &lt;alt&gt;+&lt;seta para direita&gt; tenho o comando tabnext e para esquerda tenho o tabprev.<br />
Os comandos:<br />
map -> mapeando a ação do usuário.<br />
M -> alt<br />
Left/Right -> setas direita esquerda<br />
<CR> -> Enter</p>
<p>Obs.: Tentei de varias formas fazer com que o atalho fosse alt+1 (número um  é representado por Char-061 ficando &lt;M-Char-061&gt; ) e alt+2 (número dois é representado por Char-062  ficando &lt;M-Char-062&gt; ) mas não consegui então fiz com as setinhas mesmo. Ajudas serão bem vindas <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Essa dica é pequena e rápida depois faço um compilado de mais alguns comandos e post aqui.<br />
Abraços<br />
Valdinei</p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "tabs";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/10/abrindo-arquivos-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mensagens Diarias com o Fortune</title>
		<link>http://www.valdineidossantos.com/2009/08/mensagens-diarias-fortune/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mensagens-diarias-fortune</link>
		<comments>http://www.valdineidossantos.com/2009/08/mensagens-diarias-fortune/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 16:46:59 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[fortune]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=114</guid>
		<description><![CDATA[Hoje vou falar sobre o Fortune, mas o que seria o fortune?  De acordo com o Man Page &#8221; print a random, hopefully interesting, adage&#8221;  Imprimir algo interessante ao acaso, não sei se está é melhor tradução mas já deu para entender o que o texto quis dizer.
Ele é baseado nos biscoitos da sorte chineses [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vou falar sobre o Fortune, mas o que seria o fortune?  De acordo com o Man Page &#8221; print a random, hopefully interesting, adage&#8221;  Imprimir algo interessante ao acaso, não sei se está é melhor tradução mas já deu para entender o que o texto quis dizer.</p>
<p>Ele é baseado nos biscoitos da sorte chineses (fortune cookies em inglês),  quando configurado pode mostrar uma mensagem de sua base de consulta ao fazer o login no terminal ou mesmo ao carregar o sistema operacional.</p>
<p>Para rodar o programa, caso ele esteja instalado claro,  basta chamar o comando:</p>
<pre class='brush:shell'>
$fortune
Você não precisa ser o melhor. Basta procurar fazer bem aquilo que faz, sem esperar recompensa ou castigo, simplesmente pelo prazer de fazer bem-feito, que se esgota no ato de fazer

--Adib Jatene
</pre>
<p>No meu caso instalei uma base de língua portuguesa e recebi como mensagem esta acima, minha máquina roda ubuntu e o fortune já estava instalado sendo assim para instalar a base de mensagens brasileira basta usar este comando:</p>
<pre>$ sudo aptitude install fortune  fortune-mod fortunes-br</pre>
<p>Para usar somente mensagens em português você pode indicar qual será a base de consulta ao chamar o programa.</p>
<pre class='brush:shell'>
$ fortune brasil
O trabalho e a perdicao das classes bebedoras.
-- Mike Romanoff
</pre>
<p>Como trabalho com alguns colegas que estão meio estressados pensei em colocar algumas mensagens estimulantes e divertidas nos servidores da empresa, então fiz uma pesquisa para encontrar o fortune para FreeBSD.</p>
<p>No FreeBSD encontrei o fortune instalado por padrão então bastava procurar por bases motivantes e divertidas <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>No repositorio  do BSD (<a title="http://www.freebsd.org/ports/" href="http://www.freebsd.org/cgi/ports.cgi?query=fortune&amp;stype=all&amp;sektion=all" target="_blank"> www.freebsd.org/ports/</a> ) encontrei algumas  como futurama, Bíblia Sagrada encontrei também em outras linguas como  Russa e Italiana . Com as bases instaladas agora basta fazer aparecer quando o individuo logar por ssh/terminal criando um script shell</p>
<p>Quando fui editar o arquivo ~/.profile do FreeBSD já existia uma entrada para chamar o fortune.</p>
<pre class='brush:shell'>
#Padrão do BSD
[ -x /usr/games/fortune ] &#038;&#038; /usr/games/fortune freebsd-tips
</pre>
<p>Ou de pode ser desta maneira também</p>
<pre class='brush:shell'>
if [ -a /usr/games/fortune ]; then
   echo " "
   /usr/games/fortune freebsd-tips
   echo " "
fi
</pre>
<p>Ótimo agora tenho como chamar o fortune passando como argumento uma base de dados. E você também pode criar sua própria base na comunidade viva o linux tem um post sobre isso explicando a criação e os argumentos que pode ser usados <a title="http://www.vivaolinux.com.br/artigo/Configurando-o-Fortune/" href="http://www.vivaolinux.com.br/artigo/Configurando-o-Fortune/" target="_blank"> http://www.vivaolinux.com.br/artigo/Configurando-o-Fortune/ </a>além é claro do man page <a title="http://linux.die.net/man/6/fortune" href="http://linux.die.net/man/6/fortune" target="_blank">http://linux.die.net/man/6/fortune</a>.</p>
<p>Prontinho tudo instalado e funcionando.<br />
Não posso me despedir sem mandar essa mensagem que recebi do fortune.</p>
<pre class='brush:shell'>
$ fortune -m 'win' brasil | less
P. Se o windows 98 fosse concessionária, que carro venderia?
R. BUG, é claro!!!
%
O windows 98 é o maior e mais mal feito vírus conhecido.
%
Se o seu windows não der problema, reclame com a Microsoft!
%
O windows não é ruim, esperem só ele ficar pronto...
%
Como transformar um Pentium em XT? Digite "win".
%
Chernobyl usava windows 95 para monitorar seus reatores.
%
</pre>
<p>heheheheh não foi eu quem disse nada disso foi os autores da base do fortunes hhehehehheheh</p>
<p>*Fontes</p>
<p>http://linux.die.net/man/6/fortune</p>
<p>http://www.vivaolinux.com.br/artigo/Configurando-o-Fortune/</p>
<p>http://www.freebsd.org/cgi/ports.cgi?query=fortune&#038;stype=all&#038;sektion=all</p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "games";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/08/mensagens-diarias-fortune/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acertando a Hora *Unix &#8211; ntpdate</title>
		<link>http://www.valdineidossantos.com/2009/08/acertando-hora-unix-ntpdate/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=acertando-hora-unix-ntpdate</link>
		<comments>http://www.valdineidossantos.com/2009/08/acertando-hora-unix-ntpdate/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 20:22:33 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[ntpdate]]></category>
		<category><![CDATA[sistema operacional]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=107</guid>
		<description><![CDATA[Essa vai ser uma dica rápida. Como acertar a hora em sistemas *Unix (Linux, Freebsd, OpenBSD, etc).
Usuários Ubuntu precisam ter o programa instalado. 

sudo aptitude install ntpdate

 Acertando a hora 
Vamos sincronizar a hora de nosso sistema com algum servidor público espalhado pelo mundo, no meu caso vou utilizar o da usp.

sudo ntpdate ntp.usp.br

Isso já [...]]]></description>
			<content:encoded><![CDATA[<p>Essa vai ser uma dica rápida. Como acertar a hora em sistemas *Unix (Linux, Freebsd, OpenBSD, etc).<br />
Usuários Ubuntu precisam ter o programa instalado. </p>
<pre class="brush: shell">
sudo aptitude install ntpdate
</pre>
<h3> Acertando a hora </h3>
<p>Vamos sincronizar a hora de nosso sistema com algum servidor público espalhado pelo mundo, no meu caso vou utilizar o da usp.</p>
<pre class="brush: shell">
sudo ntpdate ntp.usp.br
</pre>
<p>Isso já é o suficiente para acertar o horário da sua máquina. </p>
<p>Vamos um pouco mais a fundo agora. </p>
<p>Eu tenho que garantir que meus servidores estão com a hora sincronizada, para tanto vou fazer essa essa atualização todos os dias <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  e para ficar ainda mais seguro vou fazer em 2 servidores diferentes <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Segue o script para fazer essa atualização em uma máquina FreeBSD.</p>
<pre class="brush: shell">
#!/usr/local/bin/bash
ntpdate=`which ntpdate`

#Lista de servers ntpdate espalhados pelo mundo pode-se adicionar quantos quiser separados por espaço
SERVERS="ntp.pool.org ntp.usp.br"

for server in $SERVERS
do
   $ntpdate $server
done
</pre>
<p>Esse script deve ser salvo e precisa estar com permissão de execução ( chmod +x atualizaHora.sh ) após isso foi enviado para a pasta <b>  /usr/local/etc/periodic/daily </b> onde será executado todos os dias. </p>
<p>Esse procedimento poderia ser feito pelo crontab também, mas ao preferi coloca-lo nesta pasta pois ela já é chamada via crontab do root.</p>
<p>Complementando a informação a porta de entrada e saida do NTPDATE é a  123 isso mesmo 123,  sendo assim essa porta deve estar aberta no firewall da máquina que se deseja sincronizar.</p>
<h4> Outros servers ntpdate </h4>
<ul>
<li> time.windows.com </li>
<li> time.apple.com </li>
<li> ntp.ufrj.br </li>
<li> ntp.ubuntu.com </li>
</ul>
<p>Pronto hora ajustada, então é hora de partir.<br />
Abraços.</p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "bash";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/08/acertando-hora-unix-ntpdate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Find, rsync, svn, scp  Ferramentas do desenvolvedor</title>
		<link>http://www.valdineidossantos.com/2009/08/find-rsync-svn-scp-ferramentas/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=find-rsync-svn-scp-ferramentas</link>
		<comments>http://www.valdineidossantos.com/2009/08/find-rsync-svn-scp-ferramentas/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 17:03:58 +0000</pubDate>
		<dc:creator>Valdinei</dc:creator>
				<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=92</guid>
		<description><![CDATA[Acompanho o twitter de varios desenvolvedores e vire e mexe alguém esta com alguma reclamação com seus arquivos versionados tipicamente estes arquivos são os &#8220;.svn&#8221; .
Os arquivos svn são pastas que contem a assinatura dos arquivos e seus conteúdos, ou seja tudo fica duplicado,  e algumas vezes quando vamos enviar esses arquivos para o servidor [...]]]></description>
			<content:encoded><![CDATA[<p>Acompanho o twitter de varios desenvolvedores e vire e mexe alguém esta com alguma reclamação com seus arquivos versionados tipicamente estes arquivos são os &#8220;.svn&#8221; .</p>
<p>Os arquivos svn são pastas que contem a assinatura dos arquivos e seus conteúdos, ou seja tudo fica duplicado,  e algumas vezes quando vamos enviar esses arquivos para o servidor de produção não nos atentamos que estamos enviando junto os arquivos svn o que faz a transferencia ficar muito mais lenta pois tem que se enviar muito mais arquivos.</p>
<p>Hoje vejo que isso pode ser contornado de 3 formas diferentes:</p>
<h3>Baixando as Atualizações via svn</h3>
<p>Nesta modalidade o desenvolvedor envia todos os seus códigos para o servidor de svn &#8220;svnserver&#8221;,<br />
mas antes verifica se algo entrou em conflito ou se ele próprio precisa fazer alguns updates.</p>
<pre class="brush: shell">
svn status -u /url/pasta/raiz/projeto/
</pre>
<p>Imaginando que tudo esta correto e que somente ele tem arquivos a serem enviados.</p>
<pre class="brush: shell">
svn commit -m "SEU COMENTÁRIO" /url/do/arquivo/a/ser/commitado/
svn commit -m "SEU COMENTÁRIO" /url/da/pasta//commitada/
</pre>
<p>Pronto tudo esta pronto e devidamente no seu lugar, agora vamos logar na máquina de produção e fazer o update que foi enviado.</p>
<pre class="brush: shell">
svn update /url/pasta/raiz/projeto/
</pre>
<p>Neste modo nada se perde no caminho. Fim todo mundo feliz</p>
<h3>Mandando pequenas atualizações que ainda não são a versão final do arquivo </h3>
<p>Nesta modalidade o desenvolvedor envia todos os seus códigos para o servidor de testes, portanto não importa se vai haver svn ou não. O que importa aqui seria ser um pouco mais rápido.</p>
<p>Ai ele limpa todos os .svn para ficar mais leve o envio.</p>
<pre class="brush: shell">
cp -R /url/pasta/raiz/projeto/ /tmp/projeto
find /tmp/projeto -iname *.svn -exec rm -rf {} \;
</pre>
<p>Assim foram apagados todos os arquivos .svn da pasta do projeto pois esse foi copiado para o /tmp/projeto<br />
Assim só precisamos enviar os novos arquivos para o servidor TESTE , leia-se TESTE e não &#8220;DE TESTE&#8221; </p>
<pre class="brush: shell">
scp -r /tmp/projeto/arquivo/ usuario@host:/url/pasta/raiz/projeto/
</pre>
<p>Os arquivos são enviados e todos quase ficamos felizes, pois essa não é a melhor prática.</p>
<h3>Mandando pequenas atualizações que ainda não são a versão final do arquivo por rsync </h3>
<p>Esta é a caracteristica do rsync que achei interessante pois não conhecia a syntaxe.<br />
A opção -C do rsync exclui uma penca de arquivos que normalmente eu apagava na mão, e evita que se tenha que copiar para um segundo diretorio todos os arquivos para depois limpa-los.<br />
Sendo assim enviando para o mesmo sever bastaria fazer o seguinte. </p>
<pre class="brush: shell">
rsync -Cavz -e ssh /url/pasta/raiz/projeto/  usuario@host:/url/pasta/raiz/projeto
</pre>
<p>Todos os arquivos que foram modificados serão enviados e com a vantagem de ser descartados esses tipos de arquivo.</p>
<pre class="brush: shell">
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* _$* *$  *.old  *.bak  *.BAK  *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
</pre>
<p>Como tem alguns desenvolvedores que mesmo sob um sistema de controle de versão (svn) continuam usando o &#8220;.old&#8221; o rsync também os ignora, isso é simplesmente lindo! </p>
<p>Essas são algumas práticas que tenho observado no twitter e também com companheiros de trabalho. </p>
<p>Acho que essas dicas podem ajudar alguém por isso postei esses detalhes.</p>
<p>E existem também muitas outras maneiras de fazer esse deploy. Invente a sua &#8230;. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/08/find-rsync-svn-scp-ferramentas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O Zen do Python</title>
		<link>http://www.valdineidossantos.com/2009/08/zen-python/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=zen-python</link>
		<comments>http://www.valdineidossantos.com/2009/08/zen-python/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 14:06:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[zen]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=70</guid>
		<description><![CDATA[O Python também contem seus ovos de páscoa, neste post descrevo o Zen do python que basicamente é uma receita que se seguida usando  a linguagem será muito bem sucedida. ]]></description>
			<content:encoded><![CDATA[<p>A alguns dias descobri uma coisa bem interessante no python.  Ao fazer o import dele mesmo ele mostra alguns principios que foram criados por  Tim Peters.</p>
<p>Seguindo a risca esses principios dificilmente seu projeto vai dar errado <img src='http://www.valdineidossantos.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Como os encontro?</p>
<p>Em sua linha de comando (estou assumindo que  você esta em algum Unix e que tenha python instalado) digite:</p>
<pre class="brush: bash">$ python</pre>
<p>Neste momento você estará entrando no shell interativo do python depois é só fazer o import.</p>
<pre class="brush: bash"> import this</pre>
<p>O resultado você visualiza abaixo</p>
<pre class="brush: python">Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!</pre>
<p>Vou colocar também uma livre tradução que encontrei na internet e que cito o autor abaixo.</p>
<pre class="brush: python">Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o bastante para se quebrar as regras.
Embora a simplicidade supere o purismo.
Erros nunca deveriam passar silenciosamente.
A menos que explicitamente silenciados.
Ao encarar a ambiguidade, recuse a tentação de adivinhar.
Deveria haver uma – e preferencialmente apenas uma – maneira óbvia de se fazer isto.
Embora aquela maneira possa não ser óbvia à primeira vista se você não for holandês.
Agora é melhor que nunca.
Embora nunca, seja muitas vezes melhor que pra já.
Se a implementação é difícil de explicar, é uma má idéia.
Se a implementação é fácil de explicar, pode ser uma boa idéia.
Namespaces são uma idéia estupenda – vamos fazer mais deles!</pre>
<p><a href="http://pipeless.blogspot.com/2008/09/o-zen-de-python.html" target="_blank"> fonte da tradução </a></p>
<p>Básicamente são boas maneiras para se trabalhar com python.</p>
<p>Algumas coisas que senti falta e que vou acrescer ao texto</p>
<pre class="brush: python">Marretas não são bem vindas, mas são necessárias.
O pior código é aquele que não existe, esse não dá dinheiro</pre>
<p>Bem acho que é isso que tinha a dizer hoje.</p>
<p>Fui &#8230;.</p>
<p>Fontes:</p>
<p><a title="http://www.python.org/dev/peps/pep-0020/" href="http://www.python.org/dev/peps/pep-0020/" target="_blank">http://www.python.org/dev/peps/pep-0020/</a></p>
<p><a title="http://pipeless.blogspot.com/2008/09/o-zen-de-python.html" href="http://pipeless.blogspot.com/2008/09/o-zen-de-python.html" target="_blank">http://pipeless.blogspot.com/2008/09/o-zen-de-python.html</a></p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "zen";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/08/zen-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilizando a Classe Set do Python</title>
		<link>http://www.valdineidossantos.com/2009/07/utilizando-classe-set-python/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=utilizando-classe-set-python</link>
		<comments>http://www.valdineidossantos.com/2009/07/utilizando-classe-set-python/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 00:35:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[geral]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=55</guid>
		<description><![CDATA[Recentemente fiz uma aplicação onde tinha que verificar a diferença entre algumas estrutura de dados inicialmente fiz na mão mesmo, mas não me conformei com isso e resolvi fazer uma pesquisa para saber como se faz isso no python.
Encontrei uma classe que trabalha com todas as ações básicas dos conjuntos.
Obs.: Fiz uns exemplos básicos e [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente fiz uma aplicação onde tinha que verificar a diferença entre algumas estrutura de dados inicialmente fiz na mão mesmo, mas não me conformei com isso e resolvi fazer uma pesquisa para saber como se faz isso no python.</p>
<p>Encontrei uma classe que trabalha com todas as ações básicas dos conjuntos.</p>
<p>Obs.: Fiz uns exemplos básicos e que para alguns podem parecer sem sentido mas server  apenas para mostrar os conceitos da classe.</p>
<p>Vamos lá então, primeiro vou criar uma estrutura de dados que vou chamar de <strong>opções</strong> isso poderia estar vindo de uma banco de dados ou mesmo lendo um arquivo TXT.</p>
<p>Povoando nossas opções.</p>
<pre class="brush: python"> opcoes =  [9, 3, 6, 5, 0, 1, 7, 2, 8, 4]</pre>
<p>E inicializaremos nossas bases de números impares e pares.</p>
<pre class="brush: python">pares = []
impares = []

#Gerando duas novas listas a partir das opções dadas
for numero in opcoes:
    if numero % 2 == 0:
        pares.append(numero)
    else:
        impares.append(numero)</pre>
<p>Para que possamos trabalhar com a classe <strong>SET</strong> a origens de dados devem ser do tipo SET também.</p>
<pre class="brush: python">opcoes  = set(opcoes)
pares   = set(pares)
impares = set(impares)</pre>
<p>Agora vamos começar os testes. OBA!!!!</p>
<pre class="brush: python">#Descobrir dentre as opções descobrir quais estão no grupo dos pares
opcoesPares = set.intersection( opcoes, pares )

#Descobrir dentre as opções descobrir quais estão no grupo dos impares
opcoesImpares = set.intersection( opcoes, pares )

#Fazendo  a união das duas listas
paresMaisImpares = set.intersection( opcoesPares, opcoesImpares )

#Vamos verificar se o grupo dos pares são pertencentes ao grupo de opções
paresPertencemAOpecoes = set.issubset( pares, opcoes )

#Verificar o que tem de diferente entre as opções e os numeros impares
naoContemEssesNumerosNosImpares = set.difference( opcoes, impares )</pre>
<p>Bem acho que é isso fiz alguns exemplos bem básicos e acredito que pode ser um ponto de partida para um estudo mais aprofundado então como última dica a respeito seria isso.</p>
<p><a title="http://docs.python.org/library/sets.html" href="http://docs.python.org/library/sets.html" target="_blank">http://docs.python.org/library/sets.html</a></p>
<p>Mas se não tiver afim de ir para net pode ser por modo interativo mesmo.</p>
<pre class="brush: bash">$ python
Python 2.4.3 (#1, Jul 27 2009, 17:57:39)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; help(set)
</pre>
<p>Se tiverem exemplos mais interessantes deixe nos comentários que serão devidamente divulgados com os nomes dos autores</p>
]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/07/utilizando-classe-set-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postgresql &#8211; Backup de todas as base de dados</title>
		<link>http://www.valdineidossantos.com/2009/07/postgresql-backup-de-todas-as-base-de-dados/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=postgresql-backup-de-todas-as-base-de-dados</link>
		<comments>http://www.valdineidossantos.com/2009/07/postgresql-backup-de-todas-as-base-de-dados/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 17:20:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.valdineidossantos.com/?p=30</guid>
		<description><![CDATA[
Motivado por esse post ( http://www.vivaolinux.com.br/dica/PostgreSQL-Fazendo-backup-de-um-servidor-inteiro ) resolvi fazer algumas adaptações para atender as minhas especificações.
Eu preciso ter backup do servidor inteiro mais não necessáriamente preciso retornar todas as bases para o novo servidor novamente, por esse motivo fiz o meu próprio script para resolver esse problema.
Utilizando a linguagem python associada aos aplicativos do postgresql [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.postgresql.org/" target="_blank"><img class="size-full wp-image-45" title="postgresql" src="http://www.valdineidossantos.com/wp-content/uploads/2009/07/postgresql.png" alt="postgresql" width="500" height="50" /></a></p>
<p>Motivado por esse post ( <a title="http://www.vivaolinux.com.br/dica/PostgreSQL-Fazendo-backup-de-um-servidor-inteiro" href="http://www.vivaolinux.com.br/dica/PostgreSQL-Fazendo-backup-de-um-servidor-inteiro" target="_blank">http://www.vivaolinux.com.br/dica/PostgreSQL-Fazendo-backup-de-um-servidor-inteiro</a> ) resolvi fazer algumas adaptações para atender as minhas especificações.</p>
<p>Eu preciso ter backup do servidor inteiro mais não necessáriamente preciso retornar todas as bases para o novo servidor novamente, por esse motivo fiz o meu próprio script para resolver esse problema.</p>
<p>Utilizando a linguagem python associada aos aplicativos do postgresql montei esta rotina.</p>
<pre class="brush: python">#!/usr/bin/env python
#! -*- coding:utf8 -*-
########################################################
#  Script para fazer o pg_dump de todos os
#   bancos da máquina em que ele for executado
#  Valdinei dos Santos
#  valdineidossantos(at)gmail.com.br
#  27 Julho de 2009
########################################################
#Importando o getstatusoutput responsavel por executar os comandos do sistema operacional
from commands import getstatusoutput
from datetime import datetime
from os import path

#config
psql="/usr/bin/psql"
pg_dump="/usr/bin/pg_dump"
user="pguser-vale"
host="valdineidossantos.com"
repository = "/media/backup/databases/"

#Functions
def getAllDatabases(psql, user, host):
    print "\nRecuperando as bases de dados do servidor %s" % host
    command = "%s -U %s -h %s -l" % (psql, user, host)
    status, output = getstatusoutput ( command )
    if int(status) == 0:
       #return lista de servidores
       return stringToListServers( output )
    else:
        return [[],] 

def stringToListServers( databaseString ):
    print "\nFormatando a string"
    temp_pieces = databaseString.split("\n")
    dataBases = []
    for i in temp_pieces[3:]:
        try:
            pieces = i.split("|")
            owner  = pieces[1].strip()
            dbName = pieces[0].strip()
            encode = pieces[2].strip()
            data   = [dbName, encode, owner]
            if data:
                dataBases.append ( data )
        except Exception, e:
            continue
            #print e.__doc__
    return dataBases

#Init
if __name__ == '__main__':

    allDataBases =  getAllDatabases(psql, user, host)

    day = datetime.now().strftime("%Y%m%d")
    for database, encode, owner in allDataBases:
        #name Example databasename-20092707.dump
        dumpName = "%s-%s.dump" % (database, day)    

        #/dev/null/databasename-20092707.dump
        file = path.join(repository, dumpName)

        command = "%s -U %s -h %s -E %s  -f %s -i -Fc %s " % (pg_dump, user, host, encode, file, database)

        status, output = getstatusoutput( command)

        if int(status) &gt; 0:
            print "Erro no backup da database %s\n %s" % (database, output)</pre>
<p>Após esse script finalizado teremos no diretorio que foi setado no config &#8220;repository&#8221; todos os bancos de dados disponiveis no servidor.<br />
Para voltar novamente com a base dados para o novo servidor rodamos o comando.</p>
<pre class="brush: bash">pg_restore -d |nome da base dados| -Fc |caminho/nome do arquivo dump|</pre>
<p>Temos algumas outras opções em shell script  mas preferi usar  o python  :)<br />
<a href="http://www.python.org/" target="_blank"><img class="size-medium wp-image-46" title="python" src="http://www.valdineidossantos.com/wp-content/uploads/2009/07/python-300x101.jpg" alt="Python " width="300" height="101" /></a></p>
<!-- boo-widget start -->
					<script type="text/javascript">
					bb_keywords = "python";
					bb_bid  = "135874";
					bb_lang  = "pt-BR";
					bb_name = "custom";bb_limit = "9";bb_format = "bbo";</script>
					<script type="text/javascript" src="http://widgets.boo-box.com/javascripts/embed.js"></script>
					<!-- boo-widget end -->]]></content:encoded>
			<wfw:commentRss>http://www.valdineidossantos.com/2009/07/postgresql-backup-de-todas-as-base-de-dados/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
