<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Porão do Juca</title>
	<atom:link href="http://jucacrispim.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jucacrispim.wordpress.com</link>
	<description>Baratas nas paredes, aranhas pelo chão!</description>
	<lastBuildDate>Fri, 20 Jan 2012 17:31:16 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='jucacrispim.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Porão do Juca</title>
		<link>http://jucacrispim.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://jucacrispim.wordpress.com/osd.xml" title="Porão do Juca" />
	<atom:link rel='hub' href='http://jucacrispim.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Automatizando o deploy com fabric</title>
		<link>http://jucacrispim.wordpress.com/2012/01/08/automatizando-o-deploy-com-fabric/</link>
		<comments>http://jucacrispim.wordpress.com/2012/01/08/automatizando-o-deploy-com-fabric/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 08:52:54 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Deploy]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[fabric]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=311</guid>
		<description><![CDATA[Fala, pessoal. Tudo certo? Hoje eu vim falar sobre o fabric. O fabric é um cara que te ajuda a automatizar o deploy permitindo que você execute comandos de shell na máquina local e (o que é mais legal) em um servidor remoto de maneira muito simples. Como assim? Imagine que você tem seu programa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=311&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Fala, pessoal. Tudo certo?</p>
<p>Hoje eu vim falar sobre o fabric. O fabric é um cara que te ajuda a automatizar o deploy permitindo que você execute comandos de shell na máquina local e (o que é mais legal) em um servidor remoto de maneira muito simples.</p>
<p><strong>Como assim?</strong></p>
<p>Imagine que você tem seu programa lá, bonitão, <em>works on my machine certified</em>, mas você precisa por isso em algum lugar acessível ao público. Você pode muito bem gerar um .tar do seu código, copiar pro servidor, instalar&#8230; enfim, fazer tudo o que precisa na mão. Nem é complicado. Mas fazer isso é chato, e se a coisa cresce, tem sempre o risco de esquecer algo. É aí que entra o fabric! Com ele, você escreve um script (em Python) pra fazer o seu deploy.<em> </em><strong></strong></p>
<p><strong>Tá, beleza. Mas como funciona?</strong></p>
<p>É bem simples. A primeira coisa a se fazer é instalar o fabric e a maneira mais fácil de fazer isso é pelo gerenciador de pacotes do seu sistema operacional (seu s.o. tem gerenciador de pacotes, não?). Depois de instalado o fabric, é só você criar um arquivo chamado fabfile.py contendo os comandos necessários ao deploy.</p>
<p>Pra começar, vamos fazer um &#8216;olá&#8217; com o fabric pra gente ver como funciona. O fabfile pro nosso &#8216;ola&#8217; ficou assim:</p>
<div style="background:#000;font-size:1em;color:#05fc05;">
<pre style="background:none;"><span style="color:#d80e04;">#-*- coding: utf-8 -*-</span>

<span style="color:#d80e04;"># Arquivo fabfile.py</span>

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">ola</span>(nome):
    <span style="color:#5dc8c7;font-weight:bold;">print</span> <span style="color:#FDF5E6;">'olá, '</span>, nome
</pre>
</div>
<p>A sintaxe pra se executar o fabfile é a seguinte: <strong>fab &lt;nome_da_funcao&gt;:&lt;arg1&gt;, &lt;arg2&gt;, &#8230;</strong></p>
<p>Então, pra executar nosso fabfile acima, executamos o seguinte comando:</p>
<div style="background:#000;font-size:1em;color:#05fc05;">
<pre style="background:none;">$ fab ola:juca
ola,  juca

Done.
</pre>
</div>
<p><strong>Tá, entendi. Agora um exemplo decente, vai.</strong></p>
<p><strong></strong>Agora que já vimos como usar o fabric, vamos a um exemplo real, pra gente dar uma olhada em algumas coisas interessantes da api do fabric.</p>
<p>A idéia aqui vai ser a seguinte: Eu tenho um repositório git na minha máquina contendo o código que eu quero subir. O procedimento pra subir é gerar um .tar contendo o código de uma <em>named tree</em> qualquer (um branch, uma tag, um commit&#8230;), copiar esse tar pro servidor remoto, desempacotar o tar no servidor remoto, se já tiver uma versão mais antiga instalada, desinstalar essa versão antiga, instalar a versão nova e por fim, reiniciar o web server.</p>
<p>Tudo muito simples, mas ficar fazendo isso é muito chato, então o fabfile abaixo resolve isso pra gente:</p>
<div style="background:#000;font-size:1.15em;color:#05fc05;">
<pre style="background:none;"><span style="color:#5dc8c7;font-weight:bold;">import</span> os
<span style="color:#5dc8c7;font-weight:bold;">import</span> time
<span style="color:#d80e04;"># aqui importando uns caras legais da api do fabric</span>
<span style="color:#d80e04;"># local - roda um comando de shell na máquina local</span>
<span style="color:#d80e04;"># run - roda um comando de shell no servidor remoto</span>
<span style="color:#d80e04;"># put - faz uma cópia via ssh (scp) pro servidor remoto</span>
<span style="color:#d80e04;"># env - configurações do ambiente</span>
<span style="color:#5dc8c7;font-weight:bold;">from</span> fabric.api <span style="color:#5dc8c7;font-weight:bold;">import</span> local, run, put, env

LOCAL_SRC_PATH = <span style="color:#FDF5E6;">'/home/juca/mysrc/sourcecode2html'</span>
LOCAL_BUILD_PATH = <span style="color:#FDF5E6;">'/tmp/amazon-build'</span>
REMOTE_SRC_PATH = <span style="color:#FDF5E6;">'/home/deployuser/src/codeprettifier'</span>

<span style="color:#d80e04;"># aqui é uma string do tipo usuario@host[:porta]</span>
<span style="color:#d80e04;"># usuario é um usuário do sistema no servidor remoto.</span>
<span style="color:#d80e04;"># É uma string como o que você passa pro ssh </span>
env.hosts = [<span style="color:#FDF5E6;">'deployuser@myserver'</span>]

<span style="color:#d80e04;"># É essa função que vai ser chamada na execução do fabfile, algo como:</span>
<span style="color:#d80e04;"># fab deploy:master</span>
<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">deploy</span>(tree_name):
    <span style="color:#FDF5E6;">""" Executa as ações necessárias ao deploy
    """</span>

    tar_file = _package_named_tree(tree_name)
    remote_tar_path, filename = _send_file(tar_file)
    _unpack_code(remote_tar_path, filename)
    _uninstall_last_version()
    _create_link_to_lastest(remote_tar_path)
    _build()
    _install()
    _restart_server()

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_package_named_tree</span>(tree_name):
    <span style="color:#FDF5E6;">""" cria um arquivo .tar.bz2 baseado numa named tree do git
    """</span>

    <span style="color:#5dc8c7;font-weight:bold;">try</span>:
        os.mkdir(LOCAL_BUILD_PATH)
    <span style="color:#5dc8c7;font-weight:bold;">except</span> OSError:
        <span style="color:#5dc8c7;font-weight:bold;">pass</span>

    os.chdir(LOCAL_SRC_PATH)
    filename = <span style="color:#FDF5E6;">'%s/codeprettifier-%s.tar.bz2'</span> %(LOCAL_BUILD_PATH,
                                                tree_name)
    pack_command = <span style="color:#FDF5E6;">'git archive %s --prefix=codeprettifier/ |'</span> % tree_name
    pack_command += <span style="color:#FDF5E6;">' bzip2 &gt; %s'</span> % filename

    <span style="color:#d80e04;"># aqui, executando o comando na máquina local</span>
    <span style="color:#d80e04;"># com o local() da api do fabric</span>
    local(pack_command)

    <span style="color:#5dc8c7;font-weight:bold;">return</span> filename

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_send_file</span>(filename):
    <span style="color:#FDF5E6;">""" send file to remote server
    """</span>
    remote_tar_path = REMOTE_SRC_PATH + <span style="color:#FDF5E6;">'/%s/'</span> % <span style="color:#210cb9;font-weight:bold;">int</span>(time.time())
    <span style="color:#5dc8c7;font-weight:bold;">try</span>:
        <span style="color:#d80e04;"># Aqui executando run(). O mkdir aí em baixo vai ser </span>
        <span style="color:#d80e04;"># executado no servidor remoto. </span>
        <span style="color:#d80e04;"># Assim que o primeiro run() é chamado, vai ser perguntada</span>
        <span style="color:#d80e04;"># a senha do usuário no host remoto.</span>
        run(<span style="color:#FDF5E6;">'mkdir -p %s'</span> % remote_tar_path)
    <span style="color:#5dc8c7;font-weight:bold;">except</span>:
        <span style="color:#5dc8c7;font-weight:bold;">pass</span>

    <span style="color:#d80e04;"># aqui enviando arquivo via scp usando o put()</span>
    <span style="color:#d80e04;"># da api do fabric</span>
    put(filename, remote_tar_path)
    filename = filename.split(<span style="color:#FDF5E6;">'/'</span>)[-1]
    <span style="color:#5dc8c7;font-weight:bold;">return</span> remote_tar_path, filename

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_unpack_code</span>(remote_tar_path, filename):
    <span style="color:#FDF5E6;">""" Desempacota o código no servidor remoto
    """</span>

    run(<span style="color:#FDF5E6;">'cd %s'</span> % remote_tar_path)
    run(<span style="color:#FDF5E6;">'tar -xjvf %s/%s -C %s'</span> % (remote_tar_path, filename, remote_tar_path))

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_uninstall_last_version</span>():
    <span style="color:#FDF5E6;">""" unpacks the code on remote server
    """</span>

    <span style="color:#5dc8c7;font-weight:bold;">try</span>:
        run(<span style="color:#FDF5E6;">'cd %s/latest/codeprettifier'</span> % REMOTE_SRC_PATH)
    <span style="color:#5dc8c7;font-weight:bold;">except</span>:
        <span style="color:#5dc8c7;font-weight:bold;">return</span>

    uninstall_command = <span style="color:#FDF5E6;">'cd %s/latest/codeprettifier &amp;&amp; '</span> % REMOTE_SRC_PATH
    uninstall_command += <span style="color:#FDF5E6;">"sudo make uninstall | grep -v codeprettifier/ |"</span>
    uninstall_command += <span style="color:#FDF5E6;">'grep -v Java/ | grep -v MultiLineStringDelimiter.pm |'</span>
    uninstall_command += <span style="color:#FDF5E6;">"cut -d'k' -f2 | grep -i CodePrettifier |"</span>
    uninstall_command += <span style="color:#FDF5E6;">" grep -v codeprettifier.pl |xargs sudo rm"</span>
    <span style="color:#5dc8c7;font-weight:bold;">try</span>:
        run(uninstall_command)
    <span style="color:#5dc8c7;font-weight:bold;">except</span>:
        <span style="color:#5dc8c7;font-weight:bold;">pass</span>
    run(<span style="color:#FDF5E6;">'rm %s/latest'</span> % REMOTE_SRC_PATH)

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_create_link_to_lastest</span>(remote_tar_path):
    run(<span style="color:#FDF5E6;">'ln -s %s %s/latest'</span> % (remote_tar_path, REMOTE_SRC_PATH))

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_build</span>():
    <span style="color:#FDF5E6;">""" Cria o Makefile pra instalação
    """</span>
    remote_latest_dir = REMOTE_SRC_PATH + <span style="color:#FDF5E6;">'/latest/codeprettifier'</span>
    run(<span style="color:#FDF5E6;">'cd %s &amp;&amp; perl Makefile.PL'</span> % remote_latest_dir)

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_install</span>():
    <span style="color:#FDF5E6;">""" Faz a instalação em si
    """</span>
    remote_latest_dir = REMOTE_SRC_PATH + <span style="color:#FDF5E6;">'/latest/codeprettifier'</span>
    run(<span style="color:#FDF5E6;">'cd %s &amp;&amp; sudo make install'</span> % remote_latest_dir)

<span style="color:#5dc8c7;font-weight:bold;">def</span> <span style="color:#210cb9;font-weight:bold;">_restart_server</span>():
    <span style="color:#FDF5E6;">""" reinicia o server
    """</span>
    run(<span style="color:#FDF5E6;">'sudo /sbin/service httpd restart'</span>)
</pre>
</div>
<p>Agora, é só executar</p>
<div style="background:#000;font-size:1em;color:#05fc05;">
<pre style="background:none;overflow:scroll;">
$ fab deploy:master
[deployuser@myserver] Executing task 'deploy'
[localhost] local: git archive master --prefix=codeprettifier/ | bzip2 &gt; /tmp/amazon-build/codeprettifier-master.tar.bz2
[deployuser@myserver] run: mkdir -p /home/deployer/src/codeprettifier/1326011668/
[deployuser@myserver] Login password:
[deployuser@myserver] put: /tmp/amazon-build/codeprettifier-master.tar.bz2 -&gt; /home/deployer/src/codeprettifier/1326011668/codeprettifier-master.tar.bz2
[deployuser@myserver] run: cd /home/deployuser/src/codeprettifier/1326011668/
[deployuser@myserver] run: tar -xjvf /home/deployuser/src/codeprettifier/1326011668//codeprettifier-master.tar.bz2 -C /home/deployuser/src/codeprettifier/1326011668/

...

[deployuser@myserver] run: cd /home/deployuser/src/codeprettifier/latest/codeprettifier &amp;&amp; sudo make uninstall | grep -v codeprettifier/ |grep -v Java/ | grep -v MultiLineStringDelimiter.pm |cut -d'k' -f2 | grep -i CodePrettifier | grep -v codeprettifier.pl |xargs sudo rm
[deployuser@myserver] run: rm /home/deployuser/src/codeprettifier/latest
[deployuser@myserver] run: ln -s /home/deployuser/src/codeprettifier/1326011668/ /home/deployuser/src/codeprettifier/latest
[deployuser@myserver] run: cd /home/deployuser/src/codeprettifier/latest/codeprettifier &amp;&amp; perl Makefile.PL

...

[deployuser@myserver] run: cd /home/deployuser/src/codeprettifier/latest/codeprettifier &amp;&amp; sudo make install

...

[deployuser@myserver] run: sudo /sbin/service httpd restart

...

Done.
Disconnecting from deployuser@myserver... done.
</pre>
</div>
<p>E pronto, seu deploy foi feito automaticamente!</p>
<p>Pra finalizar, quero dizer que isso foi só um exemplo, você pode escrever o procedimento de deploy que quiser com o fabric. Ele é bem versátil!</p>
<p>&nbsp;</p>
<p>Bom, é isso pessoal. Até a próxima! :)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/311/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=311&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2012/01/08/automatizando-o-deploy-com-fabric/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Voltando a falar no git</title>
		<link>http://jucacrispim.wordpress.com/2012/01/02/voltando-a-falar-no-git/</link>
		<comments>http://jucacrispim.wordpress.com/2012/01/02/voltando-a-falar-no-git/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 23:49:45 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Controle de versão]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitorious]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=305</guid>
		<description><![CDATA[Boas pessoal, essa aqui é bem rápida: Acabei de reler um post que escrevi a um tempo atrás. O post fala como usar o git com http. O negócio é zuado. Funciona, mas não é o jeito certo de fazer a coisa. O melhor é usar o gitorious, e você ainda pode baixar o código [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=305&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Boas pessoal, essa aqui é bem rápida:<br />
Acabei de reler um post que escrevi a um tempo atrás. O post fala como usar o git com http. O negócio é zuado. Funciona, mas não é o jeito certo de fazer a coisa.</p>
<p>O melhor é usar o <a href="http://gitorious.org/">gitorious</a>,  e você ainda pode <a href="https://gitorious.org/gitorious">baixar o código</a> e ter a sua própria instalação.</p>
<p>Simples assim.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/305/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=305&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2012/01/02/voltando-a-falar-no-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Poo no Perl!</title>
		<link>http://jucacrispim.wordpress.com/2011/12/28/poo-no-perl/</link>
		<comments>http://jucacrispim.wordpress.com/2011/12/28/poo-no-perl/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 00:34:44 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[método]]></category>
		<category><![CDATA[Orientação a objetos]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=269</guid>
		<description><![CDATA[Boas pessoal. Tô de volta. :) Depois de um bom tempo sem postar nada, vou aproveitar minha semaninha de folga pra tirar as teias do porão e vamos falar um pouquinho sobre orientação a objetos no Perl. Mas o Perl é um cara sem classe, não? No Perl realmente não existe uma palavra mágica class [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=269&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Boas pessoal. Tô de volta. :)</p>
<p>Depois de um bom tempo sem postar nada, vou aproveitar minha semaninha de folga pra tirar as teias do porão e vamos falar um pouquinho sobre orientação a objetos no Perl.</p>
<p><strong>Mas o Perl é um cara sem classe, não?</strong></p>
<p>No Perl realmente não existe uma palavra mágica <em>class</em> ou algo do tipo, mas a gente pode criar classes sim!</p>
<p>As classes no Perl são criadas o mecanismo de <em>package </em>que também é usado mais usualmente para criar módulos tradicionais. E os objetos&#8230; bom, os objetos são referências abençoadas ! :P</p>
<p><strong>Referência abençoada? Que diabo é isso?</strong></p>
<p>Calma&#8230; nada de misticismos. Uma referência abençoada é só uma referência que foi passada como argumento para a função <em>bless. </em>É essa função a responsável por dizer: &#8216;essa referência pertence a este <em>package </em>(classe)&#8217;. Depois de abençoada, você será capaz de chamar funções através dessa referência, ou, em outras palavras, você terá métodos!</p>
<p><strong>Entendi, mas já cansei de papo&#8230;</strong></p>
<p>Beleza, já falei bastente, e agora é hora do código.</p>
<p>Pra este exemplo vou criar uma classe (<em>package</em>) Pessoa (como um módulo normal do Perl, isso será gravado em um arquivo chamado Pessoa.pm), e nessa classe criarei o contrutor da classe e os seus outros métodos. Agora sim, o código:</p>
<div id="source_code" style="background:#000;">
<pre style="background:none;">
<div style="background:#000;color:#05fc05;padding:10px;"><span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">1</span><span style="color:#5dc8c7;font-weight:bold;">package</span> Pessoa; <span style="color:#d80e04;"># Arquivo Pessoa.pm</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">2</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">3</span><span style="color:#5dc8c7;font-weight:bold;">use</span> strict;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">4</span><span style="color:#5dc8c7;font-weight:bold;">use</span> warnings;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">5</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">6</span><span style="color:#d80e04;"># Aqui é o contrutor da classe.</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">7</span><span style="color:#d80e04;"># O nome 'new' não é uma obrigação, só</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">8</span><span style="color:#d80e04;"># uma convenção de uso.</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">9</span><span style="color:#5dc8c7;font-weight:bold;">sub</span> <span style="color:#210cb9;font-weight:bold;">new</span>{
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">10</span>    <span style="color:#d80e04;"># classe onde o a referência será abençoada.</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">11</span>    <span style="color:#d80e04;"># Isso aqui não precisa ser passado como parâmetro</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">12</span>    <span style="color:#d80e04;"># na hora de instanciar o objeto, é passado implicitamente</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">13</span>    my $<span style="color:#be7504;">class</span> = shift;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">14</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">15</span>    <span style="color:#d80e04;"># Nossa referência que será abençoada.</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">16</span>    <span style="color:#d80e04;"># Pode ser uma referência qualquer, não necessáriamente</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">17</span>    <span style="color:#d80e04;"># uma referência a um hash;</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">18</span>    my $<span style="color:#be7504;">self</span> = {};
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">19</span>    $<span style="color:#be7504;">self</span>-&gt;{NOME} = undef;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">20</span>    $<span style="color:#be7504;">self</span>-&gt;{IDADE} = undef;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">21</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">22</span>    <span style="color:#d80e04;"># Agora a mágica acontece</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">23</span>    bless($<span style="color:#be7504;">self</span>, $<span style="color:#be7504;">class</span>);
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">24</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">25</span>    <span style="color:#5dc8c7;font-weight:bold;">return</span> $<span style="color:#be7504;">self</span>;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">26</span>}
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">27</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">28</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">29</span><span style="color:#d80e04;"># Métodos pra proteger o acesso aos nossos atributos</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">30</span><span style="color:#5dc8c7;font-weight:bold;">sub</span> <span style="color:#210cb9;font-weight:bold;">nome</span>{
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">31</span>    <span style="color:#d80e04;"># Como $class no contrutor, $self aqui também é parâmetro implícito</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">32</span>    my $<span style="color:#be7504;">self</span> = shift;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">33</span>    $<span style="color:#be7504;">self</span>-&gt;{NOME} = shift <span style="color:#5dc8c7;font-weight:bold;">if</span> @<span style="color:#be7504;">_</span>;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">34</span>    <span style="color:#5dc8c7;font-weight:bold;">return</span> $<span style="color:#be7504;">self</span>-&gt;{NOME};
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">35</span>}
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">36</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">37</span><span style="color:#5dc8c7;font-weight:bold;">sub</span> <span style="color:#210cb9;font-weight:bold;">idade</span>{
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">38</span>    my $<span style="color:#be7504;">self</span> = shift;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">39</span>    $<span style="color:#be7504;">self</span>-&gt;{IDADE} = shift <span style="color:#5dc8c7;font-weight:bold;">if</span> @<span style="color:#be7504;">_</span>;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">40</span>    <span style="color:#5dc8c7;font-weight:bold;">return</span> $<span style="color:#be7504;">self</span>-&gt;{IDADE};
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">41</span>}
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">42</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">43</span><span style="color:#d80e04;"># Outro metodozinho só de exemplo</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">44</span><span style="color:#5dc8c7;font-weight:bold;">sub</span> <span style="color:#210cb9;font-weight:bold;">fale</span>{
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">45</span>    my $<span style="color:#be7504;">self</span> = shift;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">46</span>    my $<span style="color:#be7504;">fala</span> = shift || <span style="color:#FDF5E6;">"Qualquer coisa"</span>;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">47</span>    <span style="color:#5dc8c7;font-weight:bold;">return</span> $<span style="color:#be7504;">fala</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">48</span>}
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">49</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">50</span><span style="color:#d80e04;"># Precisa retornar um valor verdadeiro</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">51</span>1;
</div>
</pre>
</div>
<p>&nbsp;</p>
<p>Agora, vamos criar uma subclasse de Pessoa</p>
<div id="source_code" style="background:#000;">
<pre style="background:none;">
<div style="background:#000;color:#05fc05;padding:10px;"><span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">1</span><span style="color:#5dc8c7;font-weight:bold;">package</span> PessoaMuda; <span style="color:#d80e04;"># Arquivo PessoaMuda.pm</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">2</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">3</span><span style="color:#d80e04;"># Importando a super classe</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">4</span><span style="color:#5dc8c7;font-weight:bold;">use</span> Pessoa;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">5</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">6</span><span style="color:#d80e04;"># Aqui estamos dizendo que PessoaMuda é uma Pessoa</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">7</span>@<span style="color:#be7504;">ISA</span> = (Pessoa);
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">8</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">9</span><span style="color:#d80e04;"># Sobrescrevendo o método fale pra que retorne nada...</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">10</span><span style="color:#5dc8c7;font-weight:bold;">sub</span> <span style="color:#210cb9;font-weight:bold;">fale</span>{
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">11</span>    my $<span style="color:#be7504;">self</span> = shift;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">12</span>    <span style="color:#5dc8c7;font-weight:bold;">return</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">13</span>}
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">14</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">15</span>1;
</div>
</pre>
</div>
<p>&nbsp;</p>
<p>E, por fim, vamos usar nossos objetos</p>
<div id="source_code" style="background:#000;">
<pre style="background:none;">
<div style="background:#000;color:#05fc05;padding:10px;"><span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">1</span><span style="color:#d80e04;">#!/usr/bin/env perl</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">2</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">3</span><span style="color:#5dc8c7;font-weight:bold;">use</span> strict;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">4</span><span style="color:#5dc8c7;font-weight:bold;">use</span> warnings;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">5</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">6</span><span style="color:#d80e04;"># Importando nossas classes</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">7</span><span style="color:#5dc8c7;font-weight:bold;">use</span> Pessoa;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">8</span><span style="color:#5dc8c7;font-weight:bold;">use</span> PessoaMuda;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">9</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">10</span><span style="color:#d80e04;"># Nova instância de Pessoa;</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">11</span>my $<span style="color:#be7504;">p</span> = Pessoa-&gt;new();
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">12</span>$<span style="color:#be7504;">p</span>-&gt;nome(<span style="color:#FDF5E6;">'Alguém'</span>);
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">13</span><span style="color:#5dc8c7;font-weight:bold;">print</span> $<span style="color:#be7504;">p</span>-&gt;nome();
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">14</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">15</span>$<span style="color:#be7504;">p</span>-&gt;idade(10000);
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">16</span><span style="color:#5dc8c7;font-weight:bold;">print</span> $<span style="color:#be7504;">p</span>-&gt;idade();
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">17</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">18</span><span style="color:#5dc8c7;font-weight:bold;">print</span> $<span style="color:#be7504;">p</span>-&gt;fale(<span style="color:#FDF5E6;">'Eu nasci a 10000 anos atrás...'</span>) . <span style="color:#FDF5E6;">"\n"</span>;
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">19</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">20</span><span style="color:#d80e04;"># Uma pessoa muda</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">21</span>my $<span style="color:#be7504;">pm</span> = PessoaMuda-&gt;new();
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">22</span>$<span style="color:#be7504;">pm</span>-&gt;nome(<span style="color:#FDF5E6;">'Ninguém'</span>);
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">23</span><span style="color:#5dc8c7;font-weight:bold;">print</span> $<span style="color:#be7504;">pm</span>-&gt;nome();
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">24</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">25</span>$<span style="color:#be7504;">pm</span>-&gt;idade(10000);
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">26</span><span style="color:#5dc8c7;font-weight:bold;">print</span> $<span style="color:#be7504;">pm</span>-&gt;idade();
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">27</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">28</span><span style="color:#d80e04;"># Mudos não falam, lembra? Sobrescrevemos o método...</span>
<span style="float:left;min-width:30px;text-align:right;margin-right:20px;color:#666;">29</span><span style="color:#5dc8c7;font-weight:bold;">print</span> $<span style="color:#be7504;">pm</span>-&gt;fale(<span style="color:#FDF5E6;">'Alguma coisa'</span>);
</div>
</pre>
</div>
<p>&nbsp;</p>
<p>Bom, é isso! Pra mais sobre orientação a objetos no Perl, leiam o <a href="http://perldoc.perl.org/perltoot.html">perltoot</a>.</p>
<p>Valeu, e até a próxima!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/269/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/269/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/269/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=269&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2011/12/28/poo-no-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Dissecando um inseto (ou como usar o pdb, the Python Debugger)</title>
		<link>http://jucacrispim.wordpress.com/2010/08/16/a-anatomia-de-um-inseto-ou-como-usar-o-pdb-the-python-debugger/</link>
		<comments>http://jucacrispim.wordpress.com/2010/08/16/a-anatomia-de-um-inseto-ou-como-usar-o-pdb-the-python-debugger/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 16:27:33 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[pdb]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=244</guid>
		<description><![CDATA[Boas, pessoal! Hoje eu estou aqui pra mostrar como se usa o (básico do) Python Debugger, o pdb, que é (óbvio) um depurador pra se usar com o Python. Este exemplo é feito usando o Python 3. Mas&#8230; como é? Bom, existe mais de uma maneira de usar o pdb. A que vou mostrar é [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=244&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Boas, pessoal!</p>
<p>Hoje eu estou aqui pra mostrar como se usa o (básico do) Python Debugger, o pdb, que é (óbvio) um depurador pra se usar com o Python.<br />
Este exemplo é feito usando o Python 3.</p>
<div style="margin-top:10px;margin-bottom:20px;">
<h3><strong>Mas&#8230; como é?<br /></strong></h3>
</div>
<p>Bom, existe <a href="http://docs.python.org/py3k/library/pdb.html?highlight=pdb#module-pdb">mais de uma maneira</a> de usar o pdb. A que vou mostrar é chamando o pdb como um script para depurar outro script.</p>
<p>Então, primeiro, vamos criar um scriptosco com um erro mais tosco ainda pra gente começar a brincar com o pdb. O scriptosco é o seguinte:</p>
<pre>

<span id='comentario' style='color:#d80e04;'>#-*- coding: utf-8 -*-</span>

<span id='reservada' style='color:#5dc8c7;'>def</span> divide(a, b):
    erro = False
    try:
       <span id='reservada' style='color:#5dc8c7;'> return </span>float(a) / float(b)
    except:
        erro = True

   <span id='reservada' style='color:#5dc8c7;'> if </span>erro:
       <span id='reservada' style='color:#5dc8c7;'> raise </span>Exception(<span id='string' style='color:#3c8204;'>"Não vou te dizer qual é o erro..."</span>)

a = 1
b = 2
divide(a, b)
a = 3
b = 0
divide(a, b)
</pre>
<p>Bom, rodando isso aí, a gente tem o seguinte:</p>
<pre>
<span style="color:rgb(136,136,136);font-family:monospace;">
$ $python3 exemplopdb.py
Traceback (most recent call last):
  File "exemplopdb.py", line 18, in
    divide(a, b)
  File "exemplopdb.py", line 11, in divide
    raise Exception("Não vou te dizer qual é o erro...")
Exception: Não vou te dizer qual é o erro...
</span>
</pre>
<div style="margin-top:10px;margin-bottom:20px;">
<h3><strong>Será que esse tal de pdb funciona mesmo?<br /></strong></h3>
</div>
<p>Agora que temos um erro, podemos usar o pdb pra achar cara. A gente vai fingir que não vê nada errado até a hora certa, tá? :P<br />
A sintexe pra se chamar o pdb é a seguinte:<br />
<strong>python -m pdb &lt;meu_script&gt;</strong><br />
Então, ao chamar nosso doente junto com o pdb, a gente vai cair no shell do pdb. Assim:</p>
<pre>
<span style="color:rgb(136,136,136);font-family:monospace;">
$ python3 -m pdb exemplopdb.py
--Return--
&gt; /media/5511fc83-ad85-484b-9b0e-0948abcb6026_/virtualpython/lib/python3.1/encodings/__init__.py(67)normalize_encoding()-&gt;'utf_32_be'
-&gt; return ''.join(chars)
(Pdb)
</span>
</pre>
<p>Nós começaremos criando breakpoints nas linhas 11 e 18. Fazemos isto com o comando <strong>b[reak]</strong>. Depois, utilizando o comando <strong>c[ontinue]</strong>, continuaremos a execução do programa até que algum breakpoint seja encontrado. E por fim, usaremos o comando <strong>list</strong> para listar um trecho de código e ver onde paramos.</p>
<pre>

<span style="color:rgb(136,136,136);font-family:monospace;">
(Pdb) break exemplopdb.py:11
Breakpoint 1 at /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py:11
(Pdb) b exemplopdb.py:18
Breakpoint 2 at /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py:18
(Pdb) c
&gt; /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py(18)()
-&gt; divide(a, b)
(Pdb) list
 13  	a = 1
 14  	b = 2
 15  	divide(a, b)
 16  	a = 3
 17  	b = 0
 18 B-&gt;	divide(a, b)
 19
[EOF]
(Pdb)
</span>
</pre>
<p>Nosso primeiro breakpoint é bem na chamada da função, então vamos &#8220;entrar na função&#8221; e acompanhar a execução. A gente faz isso com o comando <strong>s[tep]</strong>. Uma vez na função, a gente pode acompanhar a execução linha-por-linha usando o comando <strong>n[ext]</strong> e também pode imprimir os valores das variáveis com <strong>print</strong>.</p>
<pre>

<span style="color:rgb(136,136,136);font-family:monospace;">
(Pdb) s
--Call--
&gt; /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py(3)divide()
-&gt; def divide(a, b):
(Pdb) list
  1  	#-*- coding: utf-8 -*-
  2
  3  -&gt;	def divide(a, b):
  4  	    erro = False
  5  	    try:
  6  	        return float(a) / float(b)
  7  	    except:
  8  	        erro = True
  9
 10  	    if erro:
 11 B	        raise Exception("Não vou te dizer qual é o erro...")
(Pdb) n
&gt; /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py(4)divide()
-&gt; erro = False
(Pdb) n
&gt; /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py(5)divide()
-&gt; try:
(Pdb) n
&gt; /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py(6)divide()
-&gt; return float(a) / float(b)
(Pdb) print(a, b)
(3, 0)
(Pdb) n
ZeroDivisionError: 'float division'
&gt; /media/sda6/Projetos &amp; afins/scripts/exemplopdb.py(6)divide()
-&gt; return float(a) / float(b)
(Pdb)
</span>
</pre>
<p>Bom, aí matamos o erro, não? Funciona mesmo! </p>
<p>Moral da história: As vezes o pdb pode salvar várias horas do seu dia. Faça dele um amigo. :)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/244/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=244&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2010/08/16/a-anatomia-de-um-inseto-ou-como-usar-o-pdb-the-python-debugger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Liberando espaço no HD com localepurge</title>
		<link>http://jucacrispim.wordpress.com/2010/07/07/liberando-espaco-no-hd-com-localepurge/</link>
		<comments>http://jucacrispim.wordpress.com/2010/07/07/liberando-espaco-no-hd-com-localepurge/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 06:59:53 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[localepurge]]></category>
		<category><![CDATA[rapidinha]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=232</guid>
		<description><![CDATA[Bom, faz tempo que eu não venho aqui, então aqui vai uma rapidinha só pra tirar as teias-de-aranha. Esse programinha aí, o localepurge, é um cara que apaga as traduções de programas e manuais que estão nos idiomas que você não usa. Dependendo do tanto de coisa que você tem instalado, vai ter bastante espaço [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=232&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bom, faz tempo que eu não venho aqui, então aqui vai uma rapidinha só pra tirar as teias-de-aranha.</p>
<p>Esse programinha aí, o localepurge, é um cara que apaga as traduções de programas e manuais que estão nos idiomas que você não usa. Dependendo do tanto de coisa que você tem instalado, vai ter bastante espaço liberado. Isso me libera pra mais de 500 MiB.</p>
<p>Pra instalar no Debian, como sempre, é simples.</p>
<div style="font-family:monospace;color:#888;"># aptitude install localepurge</div>
<p>E depois:</p>
<div style="font-family:monospace;color:#888;"># localepurge</div>
<p>É isso.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=232&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2010/07/07/liberando-espaco-no-hd-com-localepurge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Corrigir erro &#8216;Network Unreachable&#8217; com Java no Debian.</title>
		<link>http://jucacrispim.wordpress.com/2010/03/04/corrigir-erro-network-unreachable-com-java-no-debian/</link>
		<comments>http://jucacrispim.wordpress.com/2010/03/04/corrigir-erro-network-unreachable-com-java-no-debian/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 14:02:46 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[bug fix]]></category>
		<category><![CDATA[rapidinha]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=227</guid>
		<description><![CDATA[Puta, perdi uma tarde inteira quebrando a cabeça com isso. Estava tentando usar o Squirrel-SQL (e o Sql Developer também), mas sempre dava merda, com o java dizendo que &#8220;Network Unreachble&#8221;. Depois de bastante tempo, esse cara me deu a resposta. O que acontece é que no arquivo /etc/sysctl.d/bindv6only.conf a variável net.ipv6.bindv6only estava marcada como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=227&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Puta, perdi uma tarde inteira quebrando a cabeça com isso.<br />
Estava tentando usar o Squirrel-SQL (e o Sql Developer também), mas sempre dava merda, com o java dizendo que &#8220;Network Unreachble&#8221;. Depois de bastante tempo, <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=560056">esse cara</a> me deu a resposta.</p>
<p>O que acontece é que no arquivo <strong>/etc/sysctl.d/bindv6only.conf</strong> a variável <strong>net.ipv6.bindv6only</strong> estava marcada como 1, e essa é a fonte do problema. Esta variável tem que estar marcada como 0. Pra arrumar isso, use:</p>
<p><strong># sed -i &#8216;s/net.ipv6.bindv6only\ =\ 1/net.ipv6.bindv6only\ =\ 0/&#8217; /etc/sysctl.d/bindv6only.conf </strong><br />
<strong># invoke-rc.d procps restart</strong></p>
<p>É isso aí.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/227/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=227&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2010/03/04/corrigir-erro-network-unreachable-com-java-no-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Uma pincelada no GIT parte II &#8211; Configurando HTTP</title>
		<link>http://jucacrispim.wordpress.com/2010/01/08/uma-pincelada-no-git-parte-ii-configurando-http/</link>
		<comments>http://jucacrispim.wordpress.com/2010/01/08/uma-pincelada-no-git-parte-ii-configurando-http/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 22:51:49 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Controle de versão]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=203</guid>
		<description><![CDATA[NÃO LEIA ISSO &#8211; ou melhor, pode até ler, mas esse aqui não é o jeito certo de fazer as coisas. :P Leia esse aqui Antes de mais nada, a fonte primária de informação é essa aqui. Isto aqui é a continuação do post anterior sobre o git. Como prometido, hoje vou explicar como configurar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=203&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>NÃO LEIA ISSO &#8211; ou melhor, pode até ler, mas esse aqui não é o jeito certo de fazer as coisas. :P<br />
Leia esse <a href="http://jucacrispim.wordpress.com/2012/01/02/voltando-a-falar-no-git/">aqui</a></p>
<p>Antes de mais nada, a fonte primária de informação é essa <a href="http://www.kernel.org/pub/software/scm/git/docs/howto/setup-git-server-over-http.txt">aqui</a>.<br />
Isto aqui é a continuação do <a href="http://jucacrispim.wordpress.com/2010/01/05/uma-pincelada-no-git/">post anterior sobre o git</a>. Como prometido, hoje vou explicar como configurar o git para usar http ou invés de ssh.</p>
<h3><strong>Começando do começo</strong></h3>
<p>Bom, começarmos a configurar o servidor você vai precisar de algumas coisas instaladas nele. São elas:<br />
&nbsp;&nbsp; &#8211; Um servidor web apache<br />
&nbsp;&nbsp; &#8211; Git<br />
Você vai precisar também ter acesso como root neste servidor para poder fazer a configuração inicial do repositório.</p>
<p>Antes de prosseguir, vale uma ressalva: O apache é um treco chato&#8230; Se você pegar os fontes e compilar, o &#8216;document root&#8217; e os arquivos de configuração serão em um lugar. Se você estiver usando um Red Hat serão em outro, em um Debian serão em outro ainda. E no windows então! Nem faço idéia como funciona o apache no windows. <br />
Por isso, primeiro sempre darei uma explicação &#8220;genérica&#8221; de como a coisa funciona. Nos exemplos que darei, os caminhos de arquivos e tudo mais serão baseados em Debian. Se você uma um sistema operacional diferente, leia o manual do apache e veja onde estão localizados seus arquivos.</p>
<h3><strong>Configurando o servidor</strong></h3>
<p>A primeira coisa a fazer é certificar-se que o módulo dav_module está sendo carregado pelo apache. Isto pode ser feito adicionando as seguitnes linhas os seu httpd.conf:<br />
<code style="font-family:monospace;color:#888;">LoadModule dav_module libexec/httpd/libdav.so<br />
AddModule mod_dav.c<br />
DAVLockDB "/usr/local/apache2/temp/DAV.lock"<br />
</code></p>
<p>No Debian, isto pode ser feito de uma outra maneira. Deste jeito:<br />
<code style="font-family:monospace;color:#888;"># a2enmod dav_fs<br />
# a2enmod dav<br />
</code><br />
<br />
Depois disto, é preciso criar um repositório &#8220;pelado&#8221; para o git. Para isto, criaremos um diretório dentro do nosso &#8220;document root&#8221;, criaremos o reporitório dentro deste diretório recém criado, e por fim, deixaremos o usuário do apache como dono deste diretório e de todos os seus sub-diretórios. No Debian fica assim:<br />
<code style="font-family:monospace;color:#888;"># mkdir /var/www/novo_projeto.git<br />
# cd /var/www/novo_projeto.git<br />
# git --bare init<br />
# cd ../<br />
# chown -R www-data:www-data novo_projeto.git/<br />
</code></p>
<p>Agora, vamos criar um usuário/senha para acessar o projeto . A sintaxe é assim:<br />
<code style="font-family:monospace;color:#888;">htpasswd -c /caminho/para/o/arquivo/de/senha &lt;usuario&gt;<br />
</code></p>
<p>O diretório onde se encontra o arquivo de senhas tem que ser lido pelo apache e, de preferência, não ser lido pelo resto do mundo. O parâmetro -c passado ao htpasswd significa que criaremos um novo arquivo. Se o arquivo já exitir e você quiser apenas acrescentar mais um  usuário, htpasswd deve ser chamado sem o parâmetro -c.</p>
<p>Aqui no Debian, ficou assim:<br />
<code style="font-family:monospace;color:#888;"># htpasswd -c /etc/apache2/passwd.git gituser<br />
</code></p>
<p>Depois de criado o usuário, vamos definir as regras do apache para o diretório do nosso repositório. Geralmente você precisaria adicionar algo assim ao seu httpd.conf:<br />
<code style="font-family:monospace;color:#888;">&lt;Location /meu_repo&gt;<br />
&nbsp;&nbsp;&nbsp;DAV on<br />
&nbsp;&nbsp;&nbsp;AuthType Basic<br />
&nbsp;&nbsp;&nbsp;AuthName "Git"<br />
&nbsp;&nbsp;&nbsp;AuthUserFile /caminho/para/o/arquivo/de/senha<br />
&nbsp;&nbsp;&nbsp;Require valid-user<br />
&lt;/Location&gt;<br />
</code></p>
<p>Como o Debian lê automaticamente os arquivos em /etc/apache2/conf.d/, eu criei o arquivo /etc/apache2/conf.d/git.conf e adicionei o seguite a ele:<br />
<code style="font-family:monospace;color:#888;">&lt;Location /novo_projeto.git&gt;<br />
&nbsp;&nbsp;&nbsp;DAV on<br />
&nbsp;&nbsp;&nbsp;AuthType Basic<br />
&nbsp;&nbsp;&nbsp;AuthName "Git"<br />
&nbsp;&nbsp;&nbsp;AuthUserFile  /etc/apache2/passwd.git<br />
&nbsp;&nbsp;&nbsp;Require valid-user<br />
&lt;/Location&gt;<br />
</code></p>
<p>Agora, reinicie o apache. No Debian fica assim:<br />
<code style="font-family:monospace;color:#888;"># /etc/init.d/apache2 restart<br />
</code></p>
<p>Neste ponto o servidor já deve estar funcionando corretamente. Para testar, acesse o seu servidor da seguinte maneira:<br />
<code style="font-family:monospace;color:#888;">http://servidor/novo_projeto.git<br />
</code></p>
<p>O servidor peguntará seu usuário/senha. Depois de informá-las, se você ver uma listagem de diretórios e arquivos do git, o servidor está funcionando corretamente.</p>
<h3><strong>Configurando o cliente</strong></h3>
<p>Agora que o servidor já está configurado, é hora de configurar o cliente.<br />
A primeira coisa a fazer, é informar nosso usuário e senha pra que não tenhamos que ficar digitando isso toda vez&#8230; é chato! Fazemos isso adicionando as seguintes linhas ao arquivo $HOME/.netrc:<br />
<code style="font-family:monospace;color:#888;">machine &lt;servidor&gt;<br />
login &lt;usuário&gt;<br />
password &lt;senha&gt;<br />
</code><br />
Como nossa senha está aí, é bom restringir o acesso a este arquivo. Fazemos isto assim:<br />
<code style="font-family:monospace;color:#888;">$ chmod 600 ~/.netrc<br />
</code></p>
<p>Depois disso, precisamos configurar o git para acessar nosso servidor. Isso é muito simples.<br />
<code style="font-family:monospace;color:#888;"><br />
$ git config remote.novo_projeto.url http://&lt;usuário&gt;@&lt;servidor&gt;/novo_projeto.git/<br />
</code><br />
OBS: Não esqueça da &#8216;/&#8217; no final da url, senão você vai cair num redirecionamento eterno&#8230;</p>
<p>Bom, aqui já está tudo configurado. Só o que precisamos fazer agora é &#8216;empurrar&#8217; os arquivos do projeto para o servidor.<br />
<code style="font-family:monospace;color:#888;">$ git push novo_projeto master<br />
Fetching remote heads...<br />
  refs/<br />
  refs/heads/<br />
  refs/tags/<br />
updating 'refs/heads/master'<br />
  from 5b0bc00758855aef6dafe7aa9849443aea0dbf1c<br />
  to   b4857d97182a582c76961370de489b14385f9af9<br />
    sending 13 objects<br />
    done<br />
</code></p>
<p>Bom, é isso aí! Git configurado pra usar HTTP. Agora você que decide como usar seu Git.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/203/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=203&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2010/01/08/uma-pincelada-no-git-parte-ii-configurando-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Uma pincelada no GIT</title>
		<link>http://jucacrispim.wordpress.com/2010/01/05/uma-pincelada-no-git/</link>
		<comments>http://jucacrispim.wordpress.com/2010/01/05/uma-pincelada-no-git/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 21:25:35 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Controle de versão]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=138</guid>
		<description><![CDATA[O git é um programa para controle de versões. O que mais me agrada nele é a sua flexibilidade e a sua simplicidade de uso. O que segue aí é só uma amostra do que o git pode fazer por você. Para mais informações visite http://git-scm.com/ Apresentando-se ao git O que faremos aqui é versionar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=138&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O git é um programa para controle de versões. O que mais me agrada nele é a sua flexibilidade e a sua simplicidade de uso. O que segue aí é só uma amostra do que o git pode fazer por você. Para mais informações visite <a href="http://git-scm.com/">http://git-scm.com/</a></p>
<h3><strong>Apresentando-se ao git</strong></h3>
<p>O que faremos aqui é versionar um projeto que já temos. Neste exemplo meu projeto estará em <strong>/home/juca/src/novo_projeto</strong>. Então, vamos lá!</p>
<p>Depois de instalado o git (instruções de instalação <a href="http://www.google.com/search?q=instala%C3%A7%C3%A3o+git&amp;ie=utf-8&amp;oe=utf-8&amp;">aqui</a>) a primeira coisa a fazer, é apresentar-se ao git. Para tanto, vamos informar ao git nosso nome e email.<code style="font-family:monospace;color:#888;"><br />
$ git-config --global user.name "Juca"<br />
$ git-config --global user.email "juca@minhacasa.nada"</code></p>
<h3><strong>Versionando nosso primeiro projeto</strong></h3>
<p>Agora que já nos apresentamos ao git, vamos versionar nosso projeto. A primeira coisa é ir até o diretório onde está seu projeto, depois dar um &#8220;git init&#8221; neste diretório para criar um novo repositório do git, e por fim, adicionar e &#8216;commitar&#8217; os arquivos do projeto. A coisa fica assim:<code style="font-family:monospace;color:#888;"><br />
$ cd /home/juca/src/novo_projeto<br />
$ git init<br />
Initialized empty Git repository in /home/juca/src/novo_projeto/.git/<br />
$ git add .<br />
$ git commit</code></p>
<p>Com o que fizemos até agora, já temos o projeto versionado. Para ver o log dos commits use &#8220;git log&#8221;, assim:<code style="font-family:monospace;color:#888;"><br />
$ git log<br />
commit dc00b38b6beb9db50d8b0ad0fb7e6a80689c80cb<br />
Author: Juca<br />
Date:   Tue Jan 5 12:41:51 2010 -0200</code></p>
<p><code style="font-family:monospace;color:#888;">&nbsp;&nbsp;&nbsp;Primeiro commit do tutorial</code></p>
<p>Podemos também listar os arquivos que estão sob o controle de versão usando &#8220;git ls-files&#8221;, assim:<code style="font-family:monospace;color:#888;"><br />
$ git ls-files<br />
arquivo1<br />
arquivo2<br />
</code></p>
<h3><strong>Alterando e trabalhando com os arquivos do projeto</strong></h3>
<p>Agora, vamos alterar um arquivo pra ver como fica.<code style="font-family:monospace;color:#888;"><br />
emacs arquivo1<br />
</code></p>
<p>Altere o que quiser e salve o arquivo. Antes de adicionar e commitar podemos ver o que foi alterado com &#8220;git diff&#8221;:<code style="font-family:monospace;color:#888;"><br />
$ git diff --color arquivo1<br />
diff --git a/arquivo1 b/arquivo1<br />
index a353720..d80b33a 100644<br />
--- a/arquivo1<br />
+++ b/arquivo1<br />
@@ -1 +1,2 @@<br />
-Oi, eu sou o arquivo1. Essa merda é só pra brincar com o git e escrever o tuto...<br />
\ No newline at end of file<br />
+Oi, eu sou o arquivo1 (agora alterado).<br />
+Essa merda é só pra brincar com o git e escrever o tuto...<br />
\ No newline at end of file arquivo1<br />
</code><br />
Obs: A opção &#8220;&#8211;color&#8221; é usada para que o resuldado do diff fique colorido, mas aqui no tuto as cores foram pro saco&#8230;</p>
<p>Agora, é só adicionar e commitar o arquivo modificado.<br />
<code style="font-family:monospace;color:#888;"><br />
$ git add arquivo1<br />
$ git commit<br />
</code></p>
<h3><strong>Criando branches</strong></h3>
<p>Agora vamos falar de branches. Branches não custam nada no git, e são muito fáceis de manejar. Todo novo repositório do git é criado com um branch chamado &#8220;master&#8221;. Tudo o que fizemos até agora foi neste branch. Vamos criar um novo agora com &#8220;git branch&#8221;</p>
<p><code style="font-family:monospace;color:#888;"><br />
$ git branch #primeiro para ver os branchs que já existem<br />
* master<br />
$ git branch teste #criando o branch 'teste'<br />
$ git checkout teste #mudando para o branch 'teste'<br />
</code></p>
<p>Agora, vamos alterar um arquivo no branch teste.<br />
<code style="font-family:monospace;color:#888;"><br />
$ emacs arquivo1<br />
</code></p>
<p>Altere e salve o arquivo. Em seguida, adicione e commite o arquivo modificado<br />
<code style="font-family:monospace;color:#888;"><br />
$ git add arquivo1<br />
$ git commit<br />
</code></p>
<p>Neste ponto, temos arquivos que têm diferenças entre a versão do branch master e do branch teste. Para &#8220;juntar&#8221; as versões dos dois branches usaremos &#8220;git merge&#8221;. O que faremos é o seguinte: Primeiro voltaremos ao branch master e depois faremos o merge das versões.<br />
<code style="font-family:monospace;color:#888;"><br />
git checkout master<br />
git merge teste<br />
</code></p>
<p>Agora, depois do merge,  você pode ver que as alterações feitas no branch teste também estão visíveis no branch master. Sendo assim, podemos apagar o branch teste.<br />
<code style="font-family:monospace;color:#888;"><br />
$ git branch -D teste<br />
</code></p>
<h3><strong>Trabalhando com os outros</strong></h3>
<p>Bom, até agora foi o basicão do &#8220;eu trabalhando comigo mesmo&#8221;, mas a graça da coisa é distribuir o código e desenvolver com os outros, não? Então! agora vamos ver como usar o git para distribuir (ou receber de outros) o código.</p>
<h3><strong>Clonando um projeto</strong></h3>
<p>Vamos supor que eu (Juca) estou em <strong>hostjuca</strong> e um outro cara (Zé) está em <strong>hostze</strong> e quer contribuir com o projeto. Para fazer isto, o git pode usar ssh ou http. Vamos começar pelo ssh é qué mais simples. O Zé precisa ter acesso liberado no ssh da minha máquina.<strong> hostjuca será o repositório &#8220;principal&#8221;</strong></p>
<p>O Zé ainda não tem uma cópia do projeto, então a primeira coisa a fazer é clonar o projeto com &#8220;git clone&#8221;. A sintaxe do &#8220;git clone&#8221; é assim (lembrando que estamos usando ssh):<br />
<code style="font-family:monospace;color:#888;"><br />
git clone ssh://[usuario@]host:[porta]/caminho/pro/repositorio<br />
</code></p>
<p>Então, pro Zé clonar meu projeto, a coisa ficaria assim:<br />
<code style="font-family:monospace;color:#888;"><br />
ze@hostze:~/src$ git clone ssh://ze@hostjuca:22/home/juca/src/novo_projeto<br />
Initialized empty Git repository in /home/ze/src/novo_projeto/.git/<br />
ze@hostjuca's password:<br />
remote: Counting objects: 7, done.<br />
remote: Compressing objects: 100% (6/6), done.<br />
remote: Total 7 (delta 0), reused 0 (delta 0)<br />
Receiving objects: 100% (7/7), done.<br />
</code></p>
<p>Agora o Zé já tem os arquivos do meu projeto e pode brincar a vontade.<br />
<code style="font-family:monospace;color:#888;"><br />
ze@hostze:~/src$ cd novo_projeto<br />
ze@hostze:~/src/novo_projeto$ vi arquivo2  #O Zé é filho do capeta, vocês viram, né?<br />
ze@hostze:~/src/novo_projeto$ git add arquivo2<br />
ze@hostze:~/src/novo_projeto$ git commit<br />
</code></p>
<h3><strong>Sincronizando os repositórios</strong></h3>
<p>Agora as versões do Juca e do Zé estão diferentes. Temos duas opções para sincronizar estas duas versões. Ou o Juca &#8216;puxa&#8217; as mundaças do Zé ou o Zé empurra as mudanças dele para o repositório do Juca.</p>
<p>Antes de prosseguirmos, vale uma explicaçãozinha sobre o comportamento do git. O git não gosta que você empurre o mesmo branch que você clonou (ou puxou). Parece estranho, mas tem sentido. Tente empurrar o branch master que você verá um aviso muito explicativo.</p>
<h3><strong>Empurrando as coisas</strong></h3>
<p>Como o Zé já tem acesso a máquina do Juca, vamos deixá-lo empurrar as mudanças para o repositório principal. Isso será feito com &#8220;git push&#8221;. A sintaxe do &#8220;git push&#8221; é a seguinte:<br />
<code style="font-family:monospace;color:#888;"><br />
git push ssh://[usuario@]host:[porta]/caminho/pro/repo branch_local<br />
</code></p>
<p>Por causa do comportamento do git, o Zé tem que primeiro criar um novo branch e empurrar este novo branch. A coisa fica assim:<br />
<code style="font-family:monospace;color:#888;"><br />
ze@hostze:~/src/novo_projeto$ git branch branchdoze<br />
ze@hostze:~/src/novo_projeto$ git push ssh://ze@hostjuca:22/home/juca/src/novo_projeto branchdoze<br />
ze@hostjuca's password:<br />
Counting objects: 5, done.<br />
Delta compression using up to 2 threads.<br />
Compressing objects: 100% (3/3), done.<br />
Writing objects: 100% (3/3), 349 bytes, done.<br />
Total 3 (delta 0), reused 0 (delta 0)<br />
To ssh://ze@hostjuca:22/home/juca/src/novo_projeto<br />
* [new branch]      branchdoze -&gt; branchdoze<br />
</code></p>
<p>Com isso, lá <strong>no repositório principal (hostjuca)</strong> foi criando um branch chamado <strong>branchdoze</strong>, e para terminar a operação o Juca (dono do repositório principal) precisa fazer um &#8216;merge&#8217; do branch &#8216;branchdoze&#8217; para o branch &#8216;master&#8217;.<br />
<code style="font-family:monospace;color:#888;"><br />
juca@hostjuca:~/src/novo_projeto$ git merge branchdoze<br />
</code></p>
<p>Com isso temos o código que está em <strong>hostze</strong> e o código que está em <strong>hostjuca (o repo principal)</strong> sincronizados.</p>
<h3><strong>Voltando no tempo&#8230;</strong></h3>
<p>Lembra que falei que tinhamos duas opções pra sincronizar o código: empurrar ou puxar? Então, o que fizemos até aqui foi empurrar o código de um desenvolvedor para o repositório principal. Vamos fazer o contrário (o repo principal puxa as alterações do dev) só pra ver como fica.</p>
<p>Pra isso, vamos voltar o código do repositório principal para a versão anterior as mudanças feitas pelo Zé lá em <strong>hostze</strong>. Isso é feito com &#8220;git reset&#8221;. A sintaxe é a seguinte:<br />
<code style="font-family:monospace;color:#888;"><br />
$ git reset --hard &lt;commit&gt;<br />
</code></p>
<p>Então, será feito o seguitne no repositório principal: primeiro daremos um &#8220;git log&#8221; pra ver qual o hash do commit que queremos e depois usaremos o git reset para voltar para esta versão. Assim:<br />
<code style="font-family:monospace;color:#888;"><br />
juca@hostjuca:~/src/novo_projeto$ git log<br />
commit 2117cfdf7a4ff0683487a33008e3fc5bca42cdbe<br />
Author: Zé<br />
Date:   Tue Jan 5 15:49:24 2010 -0200</code><br />
<code style="font-family:monospace;color:#888;"><br />
&nbsp;&nbsp;&nbsp;Primeira alteração do Zé</code><br />
<code style="font-family:monospace;color:#888;"><br />
commit 937f17e96ee04e1221783e664d270dda5d87657d<br />
Author: Juca<br />
Date:   Tue Jan 5 14:37:20 2010 -0200</code><br />
<code style="font-family:monospace;color:#888;"><br />
&nbsp;&nbsp;&nbsp;Só testando o novo branch</code><br />
<code style="font-family:monospace;color:#888;"><br />
commit dc00b38b6beb9db50d8b0ad0fb7e6a80689c80cb<br />
Author: Juca<br />
Date:   Tue Jan 5 12:41:51 2010 -0200</code><br />
<code style="font-family:monospace;color:#888;"><br />
&nbsp;&nbsp;&nbsp;Primeiro commit do tutorial</code><br />
<code style="font-family:monospace;color:#888;"><br />
juca@hostjuca:~/src/novo_projeto$ git reset --hard 937f17e96ee04e1221783e664d270dda5d87657d<br />
HEAD is now at 937f17e Só testando o novo branch</code><br />
Com isso temos o nosso repositório principal de volta a época em que o Zé não tinha alterado nada.</p>
<h3><strong>Puxando as coisas</strong></h3>
<p>Agora vamos sincronizar fazendo com que o repositório principal &#8216;puxe&#8217; as mudanças do repositório do Zé. Isso será feito com &#8220;git pull&#8221;. A sintaxe é a seginte:<br />
<code style="font-family:monospace;"><br />
$ git pull ssh://[usuario@]host:[porta] branch_remoto<br />
</code></p>
<p>Então, pro Juca puxar as mudanças do Zé, a coisa fica assim:<br />
<code style="font-family:monospace;color:#888;"><br />
juca@hostjuca:~/src/novo_projeto$ git pull ssh://juca@hostze:22/home/ze/src/novo_projeto master<br />
juca@hostze's password:<br />
From ssh://hostze:22/home/ze/src/novo_projeto<br />
* branch            master     -&gt; FETCH_HEAD<br />
Updating 937f17e..2117cfd<br />
Fast forward<br />
arquivo2 |    3 ++-<br />
1 files changed, 2 insertions(+), 1 deletions(-)<br />
</code></p>
<p>Como não existia nenhum conflito entre as versões, tudo ocorreu tranqüilamente, e já temos novamente nossos códigos em hostze e hostjuca sincronizados.</p>
<p>Bom, isso é só uma amostra do que o git pode fazer, mas o git pode fazer muito mais que isso. Dá uma olhadinha no <a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/">gitmagic</a> pra você ver.</p>
<p>Na minha próxima postagem sobre o git, explico como configurar o git para usar http ao invés de ssh.</p>
<p>Então, até lá e divirtam-se!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/138/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=138&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2010/01/05/uma-pincelada-no-git/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Criando um túnel reverso com SSH</title>
		<link>http://jucacrispim.wordpress.com/2009/12/22/criando-um-tunel-reverso-com-ssh/</link>
		<comments>http://jucacrispim.wordpress.com/2009/12/22/criando-um-tunel-reverso-com-ssh/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 20:39:25 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[unix]]></category>
		<category><![CDATA[rapidinha]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=126</guid>
		<description><![CDATA[Essa aqui é uma rapidinha sobre como criar um túnel reverso no ssh. Pergunta: Pra que serve um túnel ssh reverso? Resposta: Eu uso isso pra chegar em uma máquina que não poderia chegar diretamente (máquina atrás de nat e talz&#8230;) Vamos lá! Suponhamos que eu tenha dois hosts distintos (host1 e host2). host1 está [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=126&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Essa aqui é uma rapidinha sobre como criar um túnel reverso no ssh.</p>
<p>Pergunta: Pra que serve um túnel ssh reverso?<br />
Resposta: Eu uso isso pra chegar em uma máquina que não poderia chegar diretamente (máquina atrás de nat e talz&#8230;)</p>
<p>Vamos lá!</p>
<p>Suponhamos que eu tenha dois hosts distintos (host1 e host2). host1 está atrás do nat e host2 está conectado diretamente na internet. O que faremos aqui é abrir uma conexão ssh de host1 para host2 e deixar o túnel aberto, assim podendo ir de host2 para host1 (adeus nat!).</p>
<p>A sintaxe para sair de host1 para host2, deixando o túnel aberto, seria assim:<br />
<code style="color:#888;font-family:monospace;">ssh -R [porta_pra_voltar_pra_host1]:localhost:[porta_ssh_host2] host2</code></p>
<p>Então, eu estando em host1 faria o seguinte:<br />
<code style="color:#888;font-family:monospace;">juca@host1:~$ ssh -R 2222:localhost:22 host2</code></p>
<p>Ai, enquanto (e somente enquanto) esta conexão estiver aberta, é possivel conectar de host2 em host1 usando:<br />
<code style="color:#888;font-family:monospace;">ssh -p [porta_pra_voltar_pra_host1] localhost</code></p>
<p>Então, eu estando em host2, faria o seguite:<br />
<code style="color:#888;font-family:monospace;">juca@host2:~$ ssh -p 2222 localhost</code></p>
<p>Bom&#8230; É isso ai. Molezinha, não?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/126/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=126&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2009/12/22/criando-um-tunel-reverso-com-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalação e configuração do PostgreSQL no Debian.</title>
		<link>http://jucacrispim.wordpress.com/2009/12/21/instalcao-e-configuracao-do-postgresql-no-debian/</link>
		<comments>http://jucacrispim.wordpress.com/2009/12/21/instalcao-e-configuracao-do-postgresql-no-debian/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 20:56:28 +0000</pubDate>
		<dc:creator>Juca Crispim</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Instalação]]></category>
		<category><![CDATA[rapidinha]]></category>

		<guid isPermaLink="false">http://jucacrispim.wordpress.com/?p=103</guid>
		<description><![CDATA[Essa aqui é uma rapidinha sobre como instalar e configurar o PostgreSQL no Debian. Primeiro, instalar o banco: # aptitude install postgresql Depois de baixar e instalar é hora de configurar. O usário root do nosso banco de dados é o postgres. No processo de instalação foi criado um usuário chamdo postgres também no sistema. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=103&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Essa aqui é uma rapidinha sobre como instalar e configurar o PostgreSQL no Debian.</p>
<p>Primeiro, instalar o banco:<br />
<code style="color:#888888;font-family:monospace;"># aptitude install postgresql</code></p>
<p>Depois de baixar e instalar é hora de configurar. O usário root do nosso banco de dados é o <strong>postgres</strong>. No processo de instalação foi criado um usuário chamdo postgres também no sistema. Então, nos logaremos com este usuário.<br />
<code style="color:#888888;font-family:monospace;"># su postgres</code></p>
<p>Por padrão, <strong>o usuário de banco de dados &#8216;postgres&#8217;</strong> não tem senha, então agora nos logaremos no shell do PostgreSQL para alterar a senha do usuário postgres.<br />
Primeiro, logando no shell&#8230;<br />
<code style="color:#888888;font-family:monospace;">$ psql</code></p>
<p>Agora, já no shell do PostgreSQL, vamos alterar a senha do usuário postgres<br />
<code style="color:#888888;font-family:monospace;">postgres=# ALTER USER postgres WITH PASSWORD 'qualquersenha';</code></p>
<p>Esse cara que a gente acabou de configurar ai é o root do banco de dados&#8230; A gente não vai ficar usando esse usuário nas nossas aplicações, né? Então! vamos criar um novo usuário.<br />
<code style="color:#888888;font-family:monospace;">postgres=# CREATE USER usuario NOCREATEDB NOSUPERUSER NOCREATEROLE PASSWORD 'senha';</code></p>
<p>Agora, vamos criar uma tabela também<br />
<code style="color:#888888;font-family:monospace;">postgres=# CREATE DATABASE minhabase;</code></p>
<p>Bom, já criamos usário, base de dados&#8230; Agora precisamos configurar o modo como os clientes se autenticarão no servidor. Essas configurações se encontram no arquivo <strong>pg_hba.conf</strong>, que no Debian fica em <strong>/etc/postgresql/8.4/main</strong>.<br />
OBS: Esse 8.4 aí em cima se refere à versão que estou usando. Se sua versão for diferente, o número também será.<br />
Vamos abrir o arquivo e editá-lo.<br />
<code style="color:#888888;font-family:monospace;">emacs /etc/postgresql/8.4/main/pg_hba.conf</code></p>
<p>Como o arquivo é bem comentado não vou me alongar na explicação&#8230; Qualquer coisa é só olhar <a href="http://www.postgresql.org/docs/7.4/static/client-authentication.html">aqui</a>.</p>
<p>A primeira coisa que farei aqui é deixar o tipo de autenticação para os usuários locais como <strong>md5</strong>. Então, a linha que era assim:<br />
<code style="color:#888888;font-family:monospace;">local   all         all                               ident</code><br />
Ficou assim:<br />
<code style="color:#888888;font-family:monospace;">local   all         all                               md5</code></p>
<p>Do jeito que as coisas estão, somente usuários locais poderão se conectar ao banco. Então agora vamos fazer umas configurações para que clientes remotos possam se conectar ao banco.</p>
<p>O primeiro passo para liberar conexões para clientes remotos é adicionar uma liniha ao pg_hba.conf. A linha seria algo como:<br />
<code style="color:#888888;font-family:monospace;">host   all          all         0.0.0.0/0         md5</code>.</p>
<p>Pra finalizar precisaremos também editar o arquivo postgresql.conf, que fica no mesmo diretório que o pg_hba.conf.<br />
<code style="color:#888888;font-family:monospace;">emacs /etc/postgresql/8.4/main/postgresql.conf</code></p>
<p>No postgresql.conf procure pela linha <strong>#listen_addresses = &#8216;localhost&#8217;</strong> e mude para <strong>listen_addresses = &#8216;*&#8217;</strong></p>
<p>Agora é só reiniciar o postgresql&#8230;<br />
<code style="color:#888888;font-family:monospace;">/etc/init.d/postgresql-8.4 restart</code></p>
<p>E está tudo pronto!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jucacrispim.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jucacrispim.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jucacrispim.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jucacrispim.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jucacrispim.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jucacrispim.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jucacrispim.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jucacrispim.wordpress.com/103/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jucacrispim.wordpress.com&amp;blog=8969226&amp;post=103&amp;subd=jucacrispim&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://jucacrispim.wordpress.com/2009/12/21/instalcao-e-configuracao-do-postgresql-no-debian/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1280291e7e95dd1d1eaef78beac2ef78?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">jucacrispim</media:title>
		</media:content>
	</item>
	</channel>
</rss>
