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

<channel>
	<title>ensandecer de um computólogo &#187; Linux</title>
	<atom:link href="http://danielmartins.eti.br/blog/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://danielmartins.eti.br/blog</link>
	<description>return 1;</description>
	<lastBuildDate>Thu, 15 Dec 2011 05:05:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Bossa Conference &#8217;10 &#8211; em Manaus</title>
		<link>http://danielmartins.eti.br/blog/2010/03/02/bossa-conference-10-em-manaus/</link>
		<comments>http://danielmartins.eti.br/blog/2010/03/02/bossa-conference-10-em-manaus/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 14:47:36 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[amazonas]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[maemo]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[indt]]></category>
		<category><![CDATA[manaus]]></category>
		<category><![CDATA[n810 maemo]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[qml]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://danielmartins.eti.br/blog/?p=573</guid>
		<description><![CDATA[Faz algum tempo que estou querendo escrever vários posts técnicos e da minha viagem a sampa que fiz em janeiro, mas realmente o tempo está escasso. Mas não podia deixar passar em branco a divulgação do Bossa Conference que é um evento que sempre tive vontade de participar e que era realizado em Porto de [...]]]></description>
			<content:encoded><![CDATA[<p>Faz algum tempo que estou querendo escrever vários posts técnicos e da minha viagem a sampa que fiz em janeiro, mas realmente o tempo está escasso. Mas não podia deixar passar em branco a divulgação do Bossa Conference que é um evento que sempre tive vontade de participar e que era realizado em Porto de Galinhas. Esse ano o Bossa Conference &#8217;10 será realizado em Manaus &#8211; Amazonas. Uma chance dos nerds nortistas poderem participar até onde sabemos deste excelente evento.</p>
<p><a href="http://danielmartins.eti.br/blog/wp-content/uploads/2010/03/divulgacao-bossa.png"><img class="aligncenter size-medium wp-image-574" title="divulgacao-bossa" src="http://danielmartins.eti.br/blog/wp-content/uploads/2010/03/divulgacao-bossa-212x300.png" alt="" width="212" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2010/03/02/bossa-conference-10-em-manaus/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Trabalhando com o Mercurial &#8211; HG</title>
		<link>http://danielmartins.eti.br/blog/2009/11/03/trabalhando-com-o-mercurial-hg/</link>
		<comments>http://danielmartins.eti.br/blog/2009/11/03/trabalhando-com-o-mercurial-hg/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 04:48:25 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Comunidades]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[hg]]></category>

		<guid isPermaLink="false">http://danielmartins.eti.br/blog/?p=482</guid>
		<description><![CDATA[Introdução Nos últimos tempos estou conscientizando os meus colegas de trabalho sobre os benefícios da utilização de um controle de código distribuído. Fiz uma análise nas vantagens e desvantagens do Git e HG (Mercurial) e escolhemos o Mercurial pois precisamos trabalhar em um ambiente heterogeneo e o suporte do Git ao windows  ainda é precário, até [...]]]></description>
			<content:encoded><![CDATA[<h1>Introdução</h1>
<p>Nos últimos tempos estou conscientizando os meus colegas de trabalho sobre os benefícios da utilização de um controle de código distribuído. Fiz uma análise nas vantagens e desvantagens do Git e HG (Mercurial) e escolhemos o Mercurial pois precisamos trabalhar em um ambiente heterogeneo e o suporte do Git ao windows  ainda é precário, até achamos algumas iniciativas como o MSysGit, porém ainda possuem  um longo caminho pela frente para se tornar uma ferramenta que atenda as nossas necessidades(realidade). A comunidade do mercurial está mais evoluida neste sentido, e ao que estudamos o Mercurial disponibiliza todas as funcionalidades que almejamos em um gerenciador  de código distribuído.</p>
<p>O objetivo deste post é mostrar o fluxo de trabalho com mercurial, comentando os comandos executados em um fluxo de trabalho escolhido por mim. Alguns devem se perguntar, &#8220;Por que escolhido por você ?&#8221;, porque com o gerenciador de código distribuído não existe um fluxo de trabalho obrigatório a ser seguido, as ferramentas oferecem recursos para você adaptar fácilmente o fluxo de trabalho, portanto uma vez que você entende os conceitos do gerenciador de código distribuído você nota que é você quem faz seu fluxo de trabalho.</p>
<p>Não se assuste com as sequências de códigos, logo abaixo segue os comentários sobre as operações efetuadas, uma das coisas legais do mercurial é que a maioria dos comandos são legíveis, portanto tente entender somenter ao ler os comandos, senão entender, leia os comentários e avalie novamente os comandos, tudo deve fazer sentido, pelo menos eu espero que faça sentido. <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Como dito anteriormente o objetivo não é explicar os conceitos. Portanto para entender os conceitos por trás do que é um gerenciador de código distribuído recomendo a leitura dos seguintes textos:</p>
<ul>
<li><span style="background-color: #ffffff;"><a href="http://www.pronus.eng.br/artigos_tutoriais/gerencia_configuracao/conceitos_basicos_controle_versao_centralizado_e_distribuido.php?pagNum=0" target="_blank">Conceitos básicos de controle de versão de softwew: Centralizado e Distribuído.</a></span></li>
<li><span style="background-color: #ffffff;"><a href="http://akitaonrails.com/2008/10/2/entendendo-git-e-instalando-gitorious-git-via-web" target="_blank">Entendendo git e instalando gitorious.</a> Nesse post recomendo os capítulos <strong>Mudança de paradigma</strong>, <strong>Problemas da centralização 1, 2 e 3</strong>, <strong>Git: Ferramenta para pessoas sem paciência</strong>, <strong>Mundo ideal .</strong></span></li>
<li><span style="background-color: #ffffff;"><a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/" target="_blank">Introdução ao controle de versão distribuído (Ilustrado)</a>. (Inglês)</span></li>
</ul>
<h1>Configuração</h1>
<p>Para este post estou usando mercurial 1.3.1 instalado no ubuntu através do easy_install.</p>
<p>Recomendo configurar também o __hg_ps1, como <a href="http://danielmartins.eti.br/blog/2009/11/04/__hg_ps1-nome-da-branche-na-linha-de-comando-do-bash/" target="_blank">nesse post</a>.</p>
<p>Antes de começar configure seu <strong>.hgrc</strong>. Crie um arquivo no seu home:</p>
<blockquote><p>touch ~/.hgrc</p></blockquote>
<p>E então edite com seu editor favorito e coloque as seguinte informações sobre a aparência do hg:</p>
<blockquote><p>[ui]</p>
<p>username = Seu Nome &lt;seu@email.com.br&gt;</p>
<p>style = compact</p></blockquote>
<p>Antes de continuarmos, uma coisa que é muito legal no mercurial são as extensões. O mercurial já vem com uma série de extensões incluídas, para uma lista completa <a href="http://mercurial.selenic.com/wiki/UsingExtensions" target="_blank">clique aqui</a>, abaixo algumas que julgo essenciais, embora eu não vá explicar a utilização de todas nesse post, já deixe habilitado, não custa nada <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  com certeza explicarei nos posts seguintes.</p>
<ul>
<li>mercurialqueue</li>
<li>rebase</li>
<li>graphlog</li>
</ul>
<p>Para habilitar adicione ao arquivo <strong>~/.hgrc</strong> também uma nova seção para as extensões: <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<blockquote><p>[extensions]</p>
<p>hgext.graphlog =</p>
<p>hgext.mq =</p>
<p>hgext.rebase =</p></blockquote>
<h1>Comandos básicos</h1>
<p>Tendo em mente que você já sabe os conceitos, vamos fazer uma lista breve de comandos básicos que você deve saber na ponta do dedo.</p>
<blockquote><p><strong>hg clone &lt;url&gt;</strong></p></blockquote>
<p>faz uma cópia local do repositório informado</p>
<blockquote><p><strong>hg pull </strong></p></blockquote>
<p>faz download das mudanças no repositório de origem (pai)</p>
<blockquote><p><strong>hg push</strong></p></blockquote>
<p>faz upload das mudanças no repositório de origem (pai)</p>
<blockquote><p><strong>hg status</strong></p></blockquote>
<p>verifica se há alterações locais</p>
<blockquote><p><strong>hg tip</strong></p></blockquote>
<p>verifica qual a versão que está a frente no repositório, ou se preferir no topo(HEAD)</p>
<blockquote><p><strong>hg incoming</strong></p></blockquote>
<p>verifica o que tem de novo no repositório de origem, frequentemente usado antes de fazer um hg pull, para saber o que se esperar.</p>
<blockquote><p><strong>hg outgoing</strong></p></blockquote>
<p>verifica o que você tem de novo em relação ao repositório de origem, frequentemente usado antes de fazer hg push</p>
<blockquote><p><strong>hg merge</strong></p></blockquote>
<p>uni duas branches ou changeset transformando em uma.</p>
<h1>Trabalhando</h1>
<p>Vamos agora iniciar o trabalho, você vai codificar um projeto novo, então você cria uma pasta, inicia o repositório e adiciona inicialmente um arquivo de README com instruções ou informações sobre o projeto:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~<span style="color: #000000; font-weight: bold;">/</span>src $  <span style="color: #c20cb9; font-weight: bold;">mkdir</span> projetonovo<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src $  <span style="color: #7a0874; font-weight: bold;">cd</span> projetonovo<span style="color: #000000; font-weight: bold;">/</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  <span style="color: #c20cb9; font-weight: bold;">ls</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg init<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Este projeto vai dominar o mundo&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> README<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg add README<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Adicionado arquivo de README com informações sobre o projeto&quot;</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg tip<br />
<span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>   b65bb6ffc97c   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> -0400   root<br />
Adicionado arquivo de README com informações sobre o projeto</div></td></tr></tbody></table></div>
<p>Agora temos uma pasta com o nosso projeto e que está sendo versionado pelo mercurial, adicionamos um arquivo com informações para ser rastreado, fizemos o commit e depois verificamos qual o tip(head) do repositório. Você pode verificar que a saída do <strong>hg tip </strong>foi algo bem resumido, isso por que configuramos no <strong>~/.hgrc</strong> na seção <strong>[ui]</strong> , o estilo compacto <strong>style = compact</strong> . Se você deseja que o output dos comandos do mercurial sejam mais verbosos, basta comentar o style = compact ou remover do <strong>~/.hgrc</strong>.</p>
<p>Dentro de uma equipe de desenvolvimento de software, existem pelo menos 2 ciclos básicos que ficam em loop olhando pela perspectiva de implementação e não de análise, eu chamo de ciclo implementativo e corretivo.</p>
<p>Abaixo apresento minha solução para os ciclos em um mundo ideal. Há quem diga que não vivemos em um mundo ideal, mas eu acho importante para entender e fixar os conceitos. <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<h2>Ciclo implementativo</h2>
<ol>
<li>Identicar nova funcionalidade e traçar funcionamento básico</li>
<li>Abrir uma ramificação(branch) do projeto</li>
<li>Codificar e testar na branch criada <strong>SOMENTE</strong> para esta feature</li>
<li>Unir(merge) tip da branche da nova feature ao tip da mainline (branche default) e commitar</li>
<li>Fechar a ramificação da branche da nova feature</li>
</ol>
<p>Claro, aqui não é usado nenhuma formalidade nem nome bonito. É simplesmente como eu resumo minhas tarefas implementativas ao meu gosto. <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Esse processo pode variar, o mercurial dá a liberdade de você fazer isso como quiser, abaixo eu demonstro como eu faço isso. Uma coisa interessante de ser mencionada é que as branchs são operações no repositório e portanto entram para o histórico do repositório, não esqueça que as branches precisam ser <strong>commitadas</strong>, dependendo do seu projeto você pode não querer saber como cada desenvolvedor criou a branch ou que nome deu para a branch, eu acho interessante e não vejo problema nisso, muito pelo contrário, temos um histórico fidedigno do desenvolvimento do projeto.</p>
<p>Então vou criar a branche para implementar a funcionalidade <strong>UltraMegaBoga</strong> de todos os tempos <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~/src/projetonovo $  hg branch NovaFeature_UltraMegaBoga<br />
marked working directory as branch NovaFeature_UltraMegaBoga<br />
:~/src/projetonovo $  hg ci -m &quot;Criado branch para implementar NovaFeature UltraMegaBoga&quot;<br />
:~/src/projetonovo $  hg branches<br />
NovaFeature_UltraMegaBoga      1:7fc70f299283<br />
default                        0:b65bb6ffc97c (inactive)</div></td></tr></tbody></table></div>
<p>Dae você pode ver que usamos o <strong>hg branch</strong> para nomear a branche padrão atual (<strong>default</strong>) e depois criamos de fato através do <strong>commit</strong> (<strong>ci</strong>), e depois confirmamos usando o<strong> hg branches</strong> para verificar quais as branches que temos no repositório. E agora sim podemos codificar a funcionalidade. No commit automaticamente somos movidos para a branch nova que acabamos de criar.</p>
<p>Então, implementando uma nova feature:</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;<span style="color: #c20cb9; font-weight: bold;">touch</span> teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;print('Hellowww mercurial')&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;python teste.py<br />
Hellowww mercurial<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg status<br />
? teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg add teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg status<br />
A teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Criado arquivo da funcionalidade UltraMegaBoa&quot;</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span> &nbsp;<span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span> &nbsp; c192d84f042a &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">1</span> &nbsp; 7fc70f299283 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">0</span> &nbsp; b65bb6ffc97c &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
Adicionado arquivo de README com informações sobre o projeto<br />
<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;import this&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg status<br />
M teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Nova funcionalidade UltraMegaBoga implementada&quot;</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span> &nbsp;<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span> &nbsp; f337dc212ea0 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">2</span> &nbsp; c192d84f042a &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">1</span> &nbsp; 7fc70f299283 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">0</span> &nbsp; b65bb6ffc97c &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
Adicionado arquivo de README com informações sobre o projeto<br />
<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;print('Testando funcionalidade ultramegaboga...')&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg status<br />
hg M teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Implementado TesteUnitario e tudo funcionando como esperado&quot;</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span> &nbsp;<span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span> &nbsp; 63ddafc85f03 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">3</span> &nbsp; f337dc212ea0 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">2</span> &nbsp; c192d84f042a &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">1</span> &nbsp; 7fc70f299283 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">0</span> &nbsp; b65bb6ffc97c &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
Adicionado arquivo de README com informações sobre o projeto</div></td></tr></tbody></table></div>
<p>Opa!, muita informação?&#8230; nada, só algumas sendo repitidas. <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p><strong>Linhas 1 ~ 10</strong>: Nestas linhas apenas criamos um arquivo, colocamos conteúdo dentro dele, executamos, verificamos o status do repositório e eles nos diz que o arquivo novo não foi adicionado e então o adicionamos ao projeto para ser rastreado e então commitamos. Simples hein ?!</p>
<p><strong>Linhas 11</strong>: Na linha 11 há um comando novo que ainda não comentamos, o comando <strong>hg glog </strong>que mostra o log do repositório através de um grafo, o que facilita bastante a vida quando estamos trabalhando com branches(ramificações), para entender melhor veja bem que o <strong>glog</strong> traz a arvore de forma natural, ou seja,  da raiz até o topo ou nós. Na primeira coluna mostra os nós e aonde você está em relação aos nós da arvore, cada nó desse representa um <strong>commit</strong>, os nós são representados por <strong>o</strong> e onde você está através do <strong>@</strong>, na segunda coluna estão as revisões de números inteiros e sequencias que você pode usar para se direcionar ou situar na árvore ou histórico, o mercurial usa revisões sequencias e hashs para controlar o histórico e os changesets(conjuntos de mudanças).</p>
<p>E então esses procedimentos se repetem até o <strong>nó 4</strong> ou changeset <strong>63ddafc85f03</strong>, conforme pode ser visto localizando o @ no resultado do comando <strong>hg glog</strong>.</p>
<p>Vamos voltar para o branche default para fazer o merge e incorporar as modificações da branche UltraMegaBoga</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg update default<br />
<span style="color: #000000;">0</span> files updated, <span style="color: #000000;">0</span> files merged, <span style="color: #000000;">1</span> files removed, <span style="color: #000000;">0</span> files unresolved<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $ &nbsp;hg glog<br />
o &nbsp;<span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span> &nbsp; 63ddafc85f03 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">3</span> &nbsp; f337dc212ea0 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">2</span> &nbsp; c192d84f042a &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o &nbsp;<span style="color: #000000;">1</span> &nbsp; 7fc70f299283 &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 <span style="color: #660033;">-0400</span> &nbsp; root<br />
<span style="color: #000000; font-weight: bold;">|</span> &nbsp; &nbsp;Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">@</span> &nbsp;<span style="color: #000000;">0</span> &nbsp; b65bb6ffc97c &nbsp; <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> <span style="color: #660033;">-0400</span> &nbsp; root<br />
Adicionado arquivo de README com informações sobre o projeto</div></td></tr></tbody></table></div>
<p>Outro comando novo, <strong>hg update</strong>, com esse comando você pode alternar entre as branches(ramificações) do seu projeto e nas revisões também bastando passar o parâmetro <strong>hg update -r REV</strong>, na linha 1 alternei para a branch <strong>default</strong> e você pode perceber na saída do comando <strong>hg glog</strong> que o<strong> @</strong> voltou para <strong>revisão 0</strong> que é onde a revisão default parou, certo ? os outros commits foram da branche <strong>NovaFeature_UltraMegaBoga</strong>.</p>
<p>Agora vamos fazer o merge das duas branches.</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg merge NovaFeature_UltraMegaBoga<br />
<span style="color: #000000;">1</span> files updated, <span style="color: #000000;">0</span> files merged, <span style="color: #000000;">0</span> files removed, <span style="color: #000000;">0</span> files unresolved<br />
<span style="color: #7a0874; font-weight: bold;">&#40;</span>branch merge, dont forget to commit<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg tip<br />
<span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>   63ddafc85f03   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> -0400   root<br />
Implementado TesteUnitario e tudo funcionando como esperado<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span>  <span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>   63ddafc85f03   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">3</span>   f337dc212ea0   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">2</span>   c192d84f042a   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">1</span>   7fc70f299283   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">@</span>  <span style="color: #000000;">0</span>   b65bb6ffc97c   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> -0400   root<br />
Adicionado arquivo de README com informações sobre o projeto<br />
<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento&quot;</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span>    <span style="color: #000000;">5</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<span style="color: #000000;">0</span>,<span style="color: #000000;">4</span>   b270c2750162   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">24</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>\     Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">4</span>   63ddafc85f03   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">3</span>   f337dc212ea0   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">2</span>   c192d84f042a   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">1</span>   7fc70f299283   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/</span>     Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">0</span>   b65bb6ffc97c   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> -0400   root<br />
Adicionado arquivo de README com informações sobre o projeto</div></td></tr></tbody></table></div>
<p><strong>hg merge &lt;nome_do_branch&gt;</strong> e então a união é feita, mas você pode ver pela saída do <strong>hg glog</strong> da linha 7 que o @ aparece tanto na revisão <strong>0</strong> quanto na <strong>4</strong>, porque faltou criar o nó que significa a união dos projetos e que será ponto de partida para novas alterações, e eles nos avisa ao fazer o merge <strong>não esqueça de fazer o commit.</strong> E então fizemos o commit informando que estamos incorporando a nova funcionalidade. e então você pode ver o resultado do glog novamente, gerou-se a revisão 5 e novo hash. Agora percebesse que o glog é realmente muito útil né ? <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Agora para finalizar o ciclo, precisamos fechar a branch que criamos para desenvolver a feature, essa é uma funcionalidade que veio no mercurial 1.2, pois antes disso o mercurial não permite deletar branch, imagine a quantidade de branches que perduravam a vida toda no repositório ?!.</p>
<p>Encerrando as atividades da branch UltraMegaBoga.</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg update NovaFeature_UltraMegaBoga<br />
<span style="color: #000000;">0</span> files updated, <span style="color: #000000;">0</span> files merged, <span style="color: #000000;">0</span> files removed, <span style="color: #000000;">0</span> files unresolved<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Fechando branch, feature implementada e incorporada a arvore principal&quot;</span> <span style="color: #660033;">--close-branch</span><br />
created new <span style="color: #c20cb9; font-weight: bold;">head</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg branches<br />
default                        <span style="color: #000000;">5</span>:b270c2750162<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span>  <span style="color: #000000;">6</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<span style="color: #000000;">4</span>   7992ab50038d   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">26</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Fechando branch, feature implementada e incorporada a arvore principal<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">5</span>:<span style="color: #000000;">0</span>,<span style="color: #000000;">4</span>   b270c2750162   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">24</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/|</span>    Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">4</span>   63ddafc85f03   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">3</span>   f337dc212ea0   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">2</span>   c192d84f042a   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">1</span>   7fc70f299283   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/</span>     Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">0</span>   b65bb6ffc97c   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> -0400   root<br />
Adicionado arquivo de README com informações sobre o projeto</div></td></tr></tbody></table></div>
<p>Basicamente na saída acima, voltamos para a branch da funcionalidade UltraMegaBoga e fazemos um commit de encerramento, com o parâmetro<strong> &#8211;close-branch</strong>. Com isso damos fim ao <strong>Ciclo Implementativo</strong>.</p>
<h2>Ciclo corretivo</h2>
<p>No ciclo corretivo, existem 2 aspectos:</p>
<ol>
<li>Você encontrou o problemas durante o desenvolvimento, antes de lançar uma versão.</li>
<li>Você encontrou ou encontraram pra você depois de ter lançado a versão.</li>
</ol>
<p>Para primeira ocasião você pode usar o mesmo mecanismo do ciclo implementativo para fazer as correções. Agora na segunda ocasião eu sugiro uma abordagem diferente, o ideal é corrigir o problema e gerar patches para serem incorporados uma vez que o software já foi congelado(lançado a versão) e está apenas sofrendo correções esporádicas e não mais vivendo em um intenso processo de produção, para isso eu uso a extensão do mercurial chamada <strong>MercurialQueues</strong>, que é um conjunto de comandos para gerenciamentos de uma fila de patchs no estilo LIFO(Last-In / First-Out), o ciclo corretivo se divide em:</p>
<ol>
<li>Identificar a causa do problema</li>
<li>Consertar o bug</li>
<li>Gerar patch e exportar</li>
</ol>
<p>Alguns devem ser perguntar o porque de eu sugerir <strong>MercurialQueues</strong>, pelo motivo de que os commits são maleáveis, no padrão os commits do mercurial são imutáveis, já com o MQ posso trabalhar em varios patches ao mesmo tempo somente manipulando a fila ao invés de ter que ficar importando e/ou exportando patches, posso também mesclar patches sem que isso interfira nos commits. IMHO, é mais conveniente. Você pode também usar o patch para aplicar a correção na versão que está em desenvolvimento</p>
<h3>Comandos básicos</h3>
<blockquote>
<h3><strong>hg qinit</strong></h3>
<h3><strong>hg qnew</strong></h3>
<p><strong>hg qrefresh</strong></p>
<p><strong>hg qpop</strong></p>
<p><strong>hg qpush</strong></p>
<p><strong>hg qfinish</strong></p>
<p><strong>hg qimport</strong></p></blockquote>
<p>Abaixo um exemplo de como criar uma fila e desenvolver um patch usando mercurial queues.</p>
<div class="codecolorer-container bash twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qinit <span style="color: #660033;">-c</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qseries<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qapplied<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qnew fix_bug_01.patch<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;print('fixing bug')&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> mat.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qseries<br />
fix_bug_01.patch<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qapplied<br />
fix_bug_01.patch<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span>  <span style="color: #000000;">9</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>fix_bug_01.patch,qtip,tip,qbase<span style="color: #7a0874; font-weight: bold;">&#93;</span>   b3f8a3b6f155   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">22</span>:<span style="color: #000000;">55</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    <span style="color: #7a0874; font-weight: bold;">&#91;</span>mq<span style="color: #7a0874; font-weight: bold;">&#93;</span>: fix_bug_01.patch<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">8</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>qparent<span style="color: #7a0874; font-weight: bold;">&#93;</span>   709a2b46c4cd   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">29</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Implementada feature nova e fechando branche<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">7</span>   cd5986a79612   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">28</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    criando branche para feature nova<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">6</span>:<span style="color: #000000;">4</span>   7992ab50038d   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">26</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Fechando branch, feature implementada e incorporada a arvore principal<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">5</span>:<span style="color: #000000;">0</span>,<span style="color: #000000;">4</span>   b270c2750162   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">24</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/|</span>    Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">4</span>   63ddafc85f03   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">3</span>   f337dc212ea0   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">2</span>   c192d84f042a   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">1</span>   7fc70f299283   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/</span>     Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">0</span>   b65bb6ffc97c   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> -0400   root<br />
Adicionado arquivo de README com informações sobre o projeto<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qrefresh<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;a = 1&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> teste.py<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg <span style="color: #c20cb9; font-weight: bold;">diff</span><br />
<span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-r</span> 2ae8338b6a9c teste.py<br />
<span style="color: #660033;">---</span> a<span style="color: #000000; font-weight: bold;">/</span>teste.py    Mon Nov 02 <span style="color: #000000;">23</span>:04:04 <span style="color: #000000;">2009</span> <span style="color: #660033;">-0400</span><br />
+++ b<span style="color: #000000; font-weight: bold;">/</span>teste.py    Mon Nov 02 <span style="color: #000000;">23</span>:07:04 <span style="color: #000000;">2009</span> <span style="color: #660033;">-0400</span><br />
<span style="color: #000000; font-weight: bold;">@@</span> -<span style="color: #000000;">1</span>,<span style="color: #000000;">3</span> +<span style="color: #000000;">1</span>,<span style="color: #000000;">4</span> <span style="color: #000000; font-weight: bold;">@@</span><br />
print<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'Hellowww mercurial'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
import this<br />
print<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'Testando funcionalidade ultramegaboga...'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
+a = <span style="color: #000000;">1</span><br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qdiff<br />
<span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-r</span> 709a2b46c4cd mat.py<br />
<span style="color: #660033;">---</span> a<span style="color: #000000; font-weight: bold;">/</span>mat.py    Mon Nov 02 <span style="color: #000000;">17</span>:<span style="color: #000000;">29</span>:<span style="color: #000000;">50</span> <span style="color: #000000;">2009</span> <span style="color: #660033;">-0400</span><br />
+++ b<span style="color: #000000; font-weight: bold;">/</span>mat.py    Mon Nov 02 <span style="color: #000000;">23</span>:07:07 <span style="color: #000000;">2009</span> <span style="color: #660033;">-0400</span><br />
<span style="color: #000000; font-weight: bold;">@@</span> -<span style="color: #000000;">1</span>,<span style="color: #000000;">1</span> +<span style="color: #000000;">1</span>,<span style="color: #000000;">2</span> <span style="color: #000000; font-weight: bold;">@@</span><br />
print<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>+<span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
+print<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'fixing bug'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
<span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-r</span> 709a2b46c4cd teste.py<br />
<span style="color: #660033;">---</span> a<span style="color: #000000; font-weight: bold;">/</span>teste.py    Mon Nov 02 <span style="color: #000000;">17</span>:<span style="color: #000000;">29</span>:<span style="color: #000000;">50</span> <span style="color: #000000;">2009</span> <span style="color: #660033;">-0400</span><br />
+++ b<span style="color: #000000; font-weight: bold;">/</span>teste.py    Mon Nov 02 <span style="color: #000000;">23</span>:07:07 <span style="color: #000000;">2009</span> <span style="color: #660033;">-0400</span><br />
<span style="color: #000000; font-weight: bold;">@@</span> -<span style="color: #000000;">1</span>,<span style="color: #000000;">3</span> +<span style="color: #000000;">1</span>,<span style="color: #000000;">4</span> <span style="color: #000000; font-weight: bold;">@@</span><br />
print<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'Hellowww mercurial'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
import this<br />
print<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'Testando funcionalidade ultramegaboga...'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
+a = <span style="color: #000000;">1</span><br />
<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qapplied<br />
fix_bug_01.patch<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qpop<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qseries<br />
fix_bug_01.patch<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qapplied<br />
<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg qcommit<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg tip<br />
<span style="color: #000000;">8</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>   709a2b46c4cd   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">29</span> -0400   root<br />
Implementada feature nova e fechando branche<br />
<br />
:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>projetonovo $  hg glog<br />
<span style="color: #000000; font-weight: bold;">@</span>  <span style="color: #000000;">8</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>tip<span style="color: #7a0874; font-weight: bold;">&#93;</span>   709a2b46c4cd   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">29</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Implementada feature nova e fechando branche<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">7</span>   cd5986a79612   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">28</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    criando branche para feature nova<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">6</span>:<span style="color: #000000;">4</span>   7992ab50038d   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">26</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span>    Fechando branch, feature implementada e incorporada a arvore principal<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
<span style="color: #000000; font-weight: bold;">|</span> o  <span style="color: #000000;">5</span>:<span style="color: #000000;">0</span>,<span style="color: #000000;">4</span>   b270c2750162   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">24</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/|</span>    Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">4</span>   63ddafc85f03   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">21</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Implementado TesteUnitario e tudo funcionando como esperado<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">3</span>   f337dc212ea0   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">19</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Nova funcionalidade UltraMegaBoga implementada<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">2</span>   c192d84f042a   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:<span style="color: #000000;">16</span> -0400   root<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span>    Criado arquivo da funcionalidade UltraMegaBoa<br />
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">|</span><br />
o <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">1</span>   7fc70f299283   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">17</span>:01 -0400   root<br />
<span style="color: #000000; font-weight: bold;">|/</span>     Criado branch para implementar NovaFeature UltraMegaBoga<br />
<span style="color: #000000; font-weight: bold;">|</span><br />
o  <span style="color: #000000;">0</span>   b65bb6ffc97c   <span style="color: #000000;">2009</span>-<span style="color: #000000;">11</span>-02 <span style="color: #000000;">14</span>:<span style="color: #000000;">55</span> -0400   root<br />
Adicionado arquivo de README com informações sobre o projeto</div></td></tr></tbody></table></div>
<p><strong>Linhas 1 ~ 10</strong>: É iniciada uma fila através do comando <strong>hg qinit -c</strong> , -c significa que a fila será versionada e portanto poderá ser usado o comando <strong>hg qcommit</strong>. Depois verificamos se está tudo zerado usando os comandos <strong>hg qseries</strong> e <strong>hg qapplied</strong> , o <strong>qseries</strong> nos permite verificar quais patchs estão na fila e o <strong>qapplied</strong> quais patchs estão aplicados efetivamente no repositório. Para criar um novo patch basta executar o <strong>hg qnew &lt;nome_do_patch&gt;</strong> que no exemplo acima atribui o nome fix_bug_01.patch. Alteramos o arquivo e podemos ver com o <strong>glog</strong> que ao criar o patch, já é aplicado automaticamente no repositório e por padrão coloca como msg do commit <strong>[mq]</strong>:  nome_do_patch.</p>
<p><strong>Linhas 40 ~ 51</strong>: É incluídas as alterações feitas no patch atual através do comando <strong>hg qrefresh</strong>. É feita uma alteração no arquivo teste.py  e pra ver a diferença entre <strong>hg diff</strong> e <strong>hg qdiff</strong> é executado hg diff que é a última alteração que o repostório reconhece, quando executamos o <strong>hg qrefresh</strong> ele pega as alterações e armazena internamente no patch e as alterações não ficam mais no repositório comum e sim no patch que está sendo desenvolvido com mercurial queue. O <strong>hg qdiff</strong> mostra todas as alterações incluídas(através do <strong>qrefresh</strong>) no patch.</p>
<p><strong>Linhas 67 ~ 75</strong>: É verificado que o patch continua aplicado (através do <strong>qapplied</strong>) e já que o patch está completo está na hora de armazena-lo e retirá-lo da lista de aplicados através do comando <strong>hg qpop</strong> que remove do topo da fila o patch e como o único e no topo é o <strong>fix_bug_01.patch</strong> não retorna nada o comando <strong>hg qapplied</strong> e então o patch é commitado através do <strong>hg qcommit</strong> essa fila de patchs é um outro repositório interno do mercurial, se você quiser confirmar é só entrar no .<strong>hg/patches</strong> do se repositório e rodar o comando <strong>hg glog</strong> para constatar o sub-repositório de patches criado pelo <strong>MercurialQueue</strong>.</p>
<p>Para exportar o patch pode usar o comando <strong>hg export &lt;nome_do_patch&gt;</strong> e para importar para o repositório normal use <strong>hg import </strong>ou se quiser importar para uma outra lista de patches <strong>hg qimport</strong> e então o patch será adicionado ao <strong>hg qseries</strong>.</p>
<p>Enfim as possibilidades são enormes com o MercurialQueue, e isso foi só uma demonstração básica do uso de MercurialQueues.</p>
<p><em>Ufa! Espero que alguém tenha paciência pra ler. Essa tá longe de ser a versão final desse post. Publiquei logo para ter um norte. Portanto agradeceria bastante as sugestões de melhoria, críticas, correções e etc. </em></p>
<h3>Próximos posts(Aguardem) <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> :</h3>
<ul>
<li>Trabalhando com o Mercurial &#8211; Mais sobre MercurialQueues</li>
<li>Trabalhando com o Mercurial &#8211; Rebaseando</li>
<li>Trabalhando com o Mercurial &#8211; Resolvendo Conflitos</li>
</ul>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1121px; width: 1px; height: 1px;"> <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </div>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2009/11/03/trabalhando-com-o-mercurial-hg/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flisol &#8211; Manaus &#8211; Amazonas</title>
		<link>http://danielmartins.eti.br/blog/2009/04/27/flisol-manaus-amazonas/</link>
		<comments>http://danielmartins.eti.br/blog/2009/04/27/flisol-manaus-amazonas/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 13:46:49 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[amazonas]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Comunidades]]></category>
		<category><![CDATA[efl]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[manaus]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[flisol-am python efl]]></category>

		<guid isPermaLink="false">http://danielmartins.eti.br/blog/?p=390</guid>
		<description><![CDATA[O flisol em manaus foi um sucesso na minha opnião, graças ao comprometimento dos &#8220;pigs&#8221; da comunidade de software livre em manaus, pessoas como Antônio Junior, Davyd Smelk, Marcelo Mendes entre outros e a estes pigs deixo aqui postado meus parabéns. houve uma quantidade razoável de participantes, todas as palestras estavam cheias e as oficinas [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-391" title="flisol-manaus-logo" src="http://danielmartins.eti.br/blog/wp-content/uploads/2009/04/flisol-manaus-logo-300x162.png" alt="flisol-manaus-logo" width="300" height="162" />O flisol em manaus foi um sucesso na minha opnião, graças ao comprometimento dos &#8220;<a href="http://en.wikipedia.org/wiki/The_Chicken_and_the_Pig" target="_blank">pigs</a>&#8221; da comunidade de software livre em manaus, pessoas como <a href="http://brankinhu.eti.br/" target="_blank">Antônio Junior</a>, Davyd Smelk, <a href="http://marcelomendes.eti.br/" target="_blank">Marcelo Mendes</a> entre outros e a estes pigs deixo aqui postado meus parabéns. houve uma quantidade razoável de participantes, todas as palestras estavam cheias e as oficinas foram também bastante frequentadas.</p>
<p>Tirei algumas fotos do evento apartir do meu E71, a câmera não é boa mas como estava de dia até que as fotos ficaram boas. Segue abaixo algumas fotos.</p>
<p><a class="tt-flickr tt-flickr-Medium" title="Oficina de D-Bus" href="http://www.flickr.com/photos/danielelias/3474502331/"><img class="alignnone" src="http://farm4.static.flickr.com/3345/3474502331_dfeed09f02.jpg" alt="Oficina de D-Bus" width="500" height="375" /></a></p>
<p>A foto acima é da oficina de D-Bus.</p>
<p><a class="tt-flickr tt-flickr-Medium" title="25/04/2009" href="http://www.flickr.com/photos/danielelias/3474487847/"><img class="alignnone" src="http://farm4.static.flickr.com/3345/3474487847_54118ac03d.jpg" alt="25/04/2009" width="500" height="375" /></a></p>
<p>Coordenação do Flisol indo almoçar.</p>
<p><a href="http://www.flickr.com/photos/danielelias/tags/flisolam/" target="_blank">Mais fotos no meu flickr</a>.</p>
<p>Também não pude deixar de contribuir e fiz uma palestra sobre Python com EFL e ajudei em algumas oficinas. Como prometi na minha palestra que iria postar a minha apresentação no blog, cá estou eu postando.</p>
<p><a href="http://danielmartins.eti.br/Python_Efl_Flisol.pdf">Slides Python e EFl</a></p>
<p>Segue abaixo os códigos que fiz de exemplo, mas faltou tempo para comentar linha a linha. Para quem quiser estudar segue código.</p>
<div class="codecolorer-container python twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python2.5</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<span style="color: #808080; font-style: italic;"># Copyleft </span><br />
<span style="color: #808080; font-style: italic;">#</span><br />
<span style="color: #808080; font-style: italic;"># @author: Daniel Martins</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> ecore<br />
<span style="color: #ff7700;font-weight:bold;">from</span> ecore.<span style="color: black;">evas</span> <span style="color: #ff7700;font-weight:bold;">import</span> SoftwareX11<br />
<span style="color: #ff7700;font-weight:bold;">import</span> evas<br />
<span style="color: #ff7700;font-weight:bold;">import</span> edje<br />
<br />
X_DIRECTION<span style="color: #66cc66;">,</span> Y_DIRECTION <span style="color: #66cc66;">=</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><br />
<br />
<br />
w<span style="color: #66cc66;">,</span> h <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">800</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">480</span><br />
ee <span style="color: #66cc66;">=</span> ecore.<span style="color: black;">evas</span>.<span style="color: black;">SoftwareX11</span><span style="color: black;">&#40;</span>w<span style="color: #66cc66;">=</span>w<span style="color: #66cc66;">,</span> h<span style="color: #66cc66;">=</span>h<span style="color: black;">&#41;</span><br />
canvas <span style="color: #66cc66;">=</span> ee.<span style="color: black;">evas</span><br />
<br />
states <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
anime <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span><br />
anime_max <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
<br />
<br />
bg <span style="color: #66cc66;">=</span> canvas.<span style="color: black;">Rectangle</span><span style="color: black;">&#40;</span>color<span style="color: #66cc66;">=</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">255</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">255</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">255</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> size<span style="color: #66cc66;">=</span>ee.<span style="color: black;">size</span><span style="color: black;">&#41;</span><br />
bg.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> change_object<span style="color: black;">&#40;</span>o<span style="color: #66cc66;">,</span> e<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">global</span> w<span style="color: #66cc66;">,</span> h<span style="color: #66cc66;">,</span> states<span style="color: #66cc66;">,</span> anime_max<br />
&nbsp; &nbsp; im_w<span style="color: #66cc66;">,</span> im_h <span style="color: #66cc66;">=</span> o.<span style="color: black;">image_size</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; o.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span>w-im_w<span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span> y<span style="color: black;">&#41;</span> <span style="color: #66cc66;">=</span> o.<span style="color: black;">pos_get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; o.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span> h-im_h<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">2</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span> y<span style="color: black;">&#41;</span> <span style="color: #66cc66;">=</span> o.<span style="color: black;">pos_get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; o.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> y<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">3</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span> y<span style="color: black;">&#41;</span> <span style="color: #66cc66;">=</span> o.<span style="color: black;">pos_get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; o.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; states <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span><br />
&nbsp; &nbsp; states +<span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; <br />
<br />
<br />
ball_object <span style="color: #66cc66;">=</span> canvas.<span style="color: black;">Image</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;Generic_football.png&quot;</span><span style="color: #66cc66;">,</span> geometry<span style="color: #66cc66;">=</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">66</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">65</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
im_w<span style="color: #66cc66;">,</span> im_h <span style="color: #66cc66;">=</span> ball_object.<span style="color: black;">image_size</span><br />
ball_object.<span style="color: black;">fill_set</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> im_w<span style="color: #66cc66;">,</span> im_h<span style="color: black;">&#41;</span><br />
ball_object.<span style="color: black;">on_mouse_up_add</span><span style="color: black;">&#40;</span>change_object<span style="color: black;">&#41;</span><br />
ball_object.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #808080; font-style: italic;"># Load and setup UI</span><br />
ee.<span style="color: black;">title</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;Exemplo de Python EFL&quot;</span><br />
<br />
<br />
ee.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
ecore.<span style="color: black;">main_loop_begin</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>Exemplo animado:</p>
<div class="codecolorer-container python twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python2.5</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<span style="color: #808080; font-style: italic;"># Copyleft </span><br />
<span style="color: #808080; font-style: italic;">#</span><br />
<span style="color: #808080; font-style: italic;"># @author: Daniel Martins</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> ecore<br />
<span style="color: #ff7700;font-weight:bold;">from</span> ecore.<span style="color: black;">evas</span> <span style="color: #ff7700;font-weight:bold;">import</span> SoftwareX11<br />
<span style="color: #ff7700;font-weight:bold;">import</span> evas<br />
<span style="color: #ff7700;font-weight:bold;">import</span> edje<br />
<br />
X_DIRECTION<span style="color: #66cc66;">,</span> X_DIRECTION_NEGATIVE<span style="color: #66cc66;">,</span> Y_DIRECTION<span style="color: #66cc66;">,</span> Y_DIRECTION_NEGATIVE <span style="color: #66cc66;">=</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><br />
<br />
<br />
w<span style="color: #66cc66;">,</span> h <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">800</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">480</span><br />
ee <span style="color: #66cc66;">=</span> ecore.<span style="color: black;">evas</span>.<span style="color: black;">SoftwareX11</span><span style="color: black;">&#40;</span>w<span style="color: #66cc66;">=</span>w<span style="color: #66cc66;">,</span> h<span style="color: #66cc66;">=</span>h<span style="color: black;">&#41;</span><br />
canvas <span style="color: #66cc66;">=</span> ee.<span style="color: black;">evas</span><br />
<br />
states <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
anime <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span><br />
anime_max <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
<br />
<br />
bg <span style="color: #66cc66;">=</span> canvas.<span style="color: black;">Rectangle</span><span style="color: black;">&#40;</span>color<span style="color: #66cc66;">=</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">255</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">255</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">255</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> size<span style="color: #66cc66;">=</span>ee.<span style="color: black;">size</span><span style="color: black;">&#41;</span><br />
bg.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> anime_ball<span style="color: black;">&#40;</span>img_obj<span style="color: #66cc66;">,</span> direction<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">global</span> anime_max<br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span>y<span style="color: black;">&#41;</span> <span style="color: #66cc66;">=</span> img_obj.<span style="color: black;">pos_get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> direction <span style="color: #66cc66;">==</span> X_DIRECTION:<br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span>x+<span style="color: #ff4500;">5</span><span style="color: #66cc66;">,</span>y<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">&gt;</span> anime_max:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> direction <span style="color: #66cc66;">==</span> X_DIRECTION_NEGATIVE:<br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span>x-<span style="color: #ff4500;">5</span><span style="color: #66cc66;">,</span>y<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">&lt;</span> anime_max:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> direction <span style="color: #66cc66;">==</span> Y_DIRECTION:<br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span>y+<span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> y <span style="color: #66cc66;">&gt;</span> anime_max:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> direction <span style="color: #66cc66;">==</span> Y_DIRECTION_NEGATIVE:<br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pos_set</span><span style="color: black;">&#40;</span>x<span style="color: #66cc66;">,</span>y-<span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> y <span style="color: #66cc66;">&lt;</span> anime_max:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; img_obj.<span style="color: black;">pass_events_set</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; &nbsp;<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> change_object<span style="color: black;">&#40;</span>o<span style="color: #66cc66;">,</span> e<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">global</span> w<span style="color: #66cc66;">,</span> h<span style="color: #66cc66;">,</span> states<span style="color: #66cc66;">,</span> anime_max<br />
&nbsp; &nbsp; im_w<span style="color: #66cc66;">,</span> im_h <span style="color: #66cc66;">=</span> o.<span style="color: black;">image_size</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; anime_max <span style="color: #66cc66;">=</span> w-im_w<br />
&nbsp; &nbsp; &nbsp; &nbsp; ecore.<span style="color: black;">animator_add</span><span style="color: black;">&#40;</span>anime_ball<span style="color: #66cc66;">,</span> o<span style="color: #66cc66;">,</span> X_DIRECTION<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; anime_max <span style="color: #66cc66;">=</span> h-im_h<br />
&nbsp; &nbsp; &nbsp; &nbsp; ecore.<span style="color: black;">animator_add</span><span style="color: black;">&#40;</span>anime_ball<span style="color: #66cc66;">,</span> o<span style="color: #66cc66;">,</span> Y_DIRECTION<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">2</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; anime_max <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ecore.<span style="color: black;">animator_add</span><span style="color: black;">&#40;</span>anime_ball<span style="color: #66cc66;">,</span> o<span style="color: #66cc66;">,</span> X_DIRECTION_NEGATIVE<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> states <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">3</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; anime_max <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ecore.<span style="color: black;">animator_add</span><span style="color: black;">&#40;</span>anime_ball<span style="color: #66cc66;">,</span> o<span style="color: #66cc66;">,</span> Y_DIRECTION_NEGATIVE<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; states <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span><br />
&nbsp; &nbsp; states +<span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
<br />
<br />
ball_object <span style="color: #66cc66;">=</span> canvas.<span style="color: black;">Image</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;Generic_football.png&quot;</span><span style="color: #66cc66;">,</span> geometry<span style="color: #66cc66;">=</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">66</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">65</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
im_w<span style="color: #66cc66;">,</span> im_h <span style="color: #66cc66;">=</span> ball_object.<span style="color: black;">image_size</span><br />
ball_object.<span style="color: black;">fill_set</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> im_w<span style="color: #66cc66;">,</span> im_h<span style="color: black;">&#41;</span><br />
ball_object.<span style="color: black;">on_mouse_up_add</span><span style="color: black;">&#40;</span>change_object<span style="color: black;">&#41;</span><br />
ball_object.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #808080; font-style: italic;"># Load and setup UI</span><br />
ee.<span style="color: black;">title</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;Exemplo de Python EFL Animado&quot;</span><br />
<br />
ee.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
ecore.<span style="color: black;">main_loop_begin</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p><a href="http://danielmartins.eti.br/python_efl_flisol_src.tar.gz" target="_blank">Link para baixar tudo, inclusive a imagem.</a> Só não esqueça que para executar é preciso ter instalado as EFL e os python bindings.Para a instalação tenho um post sobre. <a href="http://danielmartins.eti.br/blog/2008/08/23/estudando-python-efl-parte-1/" target="_blank">Confira</a>.</p>
<p>Espero que tenham gostado do evento tanto quanto eu gostei. Qualquer dúvida, crítica e/ou sugestão pode colocar nos comentários.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2009/04/27/flisol-manaus-amazonas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mais algumas dicas para a instalação do Maemo SDK</title>
		<link>http://danielmartins.eti.br/blog/2008/05/17/mais-algumas-dicas-para-a-instalacao-do-maemo-sdk/</link>
		<comments>http://danielmartins.eti.br/blog/2008/05/17/mais-algumas-dicas-para-a-instalacao-do-maemo-sdk/#comments</comments>
		<pubDate>Sat, 17 May 2008 19:47:52 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[maemo]]></category>

		<guid isPermaLink="false">http://danielmartins.eti.br/blog/2008/05/17/mais-algumas-dicas-para-a-instalacao-do-maemo-sdk/</guid>
		<description><![CDATA[Após testar o howto do amigo Marcelo, o qual funcionou perfeitamente, quero complementar com algumas dicas. Mesmo o howto sendo para debian funcionou perfeitamente no ubuntu 7.10. Para os que começaram a instalação e não terminaram ou fizeram alguma coisa errada e gostaria de seguir corretamente o howto passo a passo. Se você por ventura [...]]]></description>
			<content:encoded><![CDATA[<p>Após testar o howto do amigo <a href="http://marcelomendes.eti.br/blog" title="Square root" target="_blank">Marcelo,</a> o qual funcionou perfeitamente, quero complementar com algumas dicas.</p>
<p>Mesmo o howto sendo para debian funcionou perfeitamente no ubuntu 7.10. Para os que começaram a instalação e não terminaram ou fizeram alguma coisa errada e gostaria de seguir corretamente o howto passo a passo.</p>
<p>Se você por ventura quiser deletar e instalar novamente o scratchbox, você precisa parar o serviço de montagem dele com o seguinte comando:</p>
<blockquote><p> #/scratchbox/sbin/sbin_ctl stop</p></blockquote>
<p>e então remover o diretório:</p>
<blockquote><p> #rm -Rfv /scratchbox</p></blockquote>
<p>se você ainda tiver o cache dos pacotes que fica em /var/cache/apt/archives, basta você executar o reinstall do aptitude, somente trocando o <strong>install</strong> do post do marcelo pelo<strong> reinstall</strong>.</p>
<p>E então será criado novamente a estrura do scratchbox no raiz do sistema.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2008/05/17/mais-algumas-dicas-para-a-instalacao-do-maemo-sdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SPL (Standard PHP Library)  &#8211;  DirectoryIterator</title>
		<link>http://danielmartins.eti.br/blog/2007/05/14/spl-standard-php-library-directoryiterator-2/</link>
		<comments>http://danielmartins.eti.br/blog/2007/05/14/spl-standard-php-library-directoryiterator-2/#comments</comments>
		<pubDate>Tue, 15 May 2007 02:58:14 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Dicas & How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[php tags php5 spl]]></category>

		<guid isPermaLink="false">http://daniel.jb0.org/2007/05/14/spl-standard-php-library-directoryiterator-2/</guid>
		<description><![CDATA[Você conhece a SPL(Standard PHP Library) ? É uma biblioteca de componentes inteiramente escritos em PHP5 dentro do paradigma de Orientação a Objetos para lidar com problemas cotidianos na vida dos programadores que trabalham com PHP. O ambiente onde este artigo foi desenvolvido/testado: PHP 5.2.1 SAPI CLI (Command Line Interface) Ubuntu Feisty Fawn O que [...]]]></description>
			<content:encoded><![CDATA[<p>Você conhece a <a href="http://php.net/spl">SPL(Standard PHP Library)</a> ? É uma biblioteca de componentes inteiramente escritos em PHP5 dentro do paradigma de <a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objeto">Orientação a Objetos</a> para lidar com problemas cotidianos na vida dos programadores que trabalham com PHP.</p>
<p>O ambiente onde este artigo foi desenvolvido/testado:</p>
<ul>
<li>PHP 5.2.1 SAPI CLI (Command Line Interface)</li>
<li>Ubuntu Feisty Fawn</li>
</ul>
<p>O que você precisa saber para aprender melhor o conteúdo ?</p>
<ul>
<li><a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objeto">Orientação a objetos</a></li>
<li><a href="http://www.php.net/manual/pt_BR/language.exceptions.php">Exceptions</a></li>
<li><a href="http://pt.wikipedia.org/wiki/Uml">UML (Opcional)</a></li>
</ul>
<p><span id="more-141"></span><br />
Um dos problemas que encontramos sempre é a questão de trabalharmos com iteração de diretórios, por exemplo um script para backup, localizar algum determinado tipo de arquivo dentro de um diretório com muitos sub-diretórios,  efetuar mudança de nomes de forma recursiva dentre outros. Precisávamos de um solução elegante e legível para efetuarmos manutenção seja corretiva e ou implementativa, isso se torna mais importante quando você trabalha em equipe ou quando você deixa um código para que outro programador seja responsável pela manutenção. Outro ponto forte para a criação e utilização desta biblioteca é a questão de termos um ponto central de soluções(amplamente suportados) para problemas cotidianos assim agilizando o processo de desenvolvimento de software, ou seja, ao invés de termos que criar sempre uma solução para um problema que já tem solução(não seria re-inventar a roda ?!) ou fazer reutilização de software através de CTRL + C e CTRL V ( como era feito e que ainda é muito utilizado ).</p>
<p>Minha contribuição para que possamos melhorar o desenvolvimento de software onde tem como tecnologia de programação PHP5/6 é iniciar uma série de artigos explanando a utilização da SPL, tendo como início uma classe chamada DirectoryIterator.</p>
<p>Para entendermos melhor o DirectoryIterator precisamos dá uma olhadinha neste diagrama de colaboração, através da figura 1 abaixo:</p>
<p align="center"><img src="http://danielmartins.eti.br/blog/wp-content/uploads/2007/05/classdirectoryiterator-coll-graph.png" alt="" align="middle" /><small><small><span style="font-style: italic;">Figura 1.</span></small></small></p>
<p><small><small></small></small></p>
<p><small><small></small></small>Como podemos interpretar esse diagrama de colaboração(Figura 1) o DirectoryIterator é uma classe que implementa a interface Iterator e extende a classe SplFileInfo.<br />
O design da interface Iterator é segundo seu diagrama de colaboração o seguinte:</p>
<p align="center"><img src="http://danielmartins.eti.br/blog/wp-content/uploads/2007/05/interfaceiterator-coll-graph.png" alt="" /> <small><small><span style="font-style: italic;">Figura 2</span></small></small></p>
<p>Basicamente a interface Iterator diz que a classe <span style="font-style: italic;">DirectoryIterator</span> deve obrigatoriamente implementar os métodos <span style="font-style: italic;">current(), key(), next(), rewind(), valid()</span>. Portanto isto quer dizer que um objeto DirectoryIterator pode ser atravessado/iterado/percorrido e que deve ter os controles básico para uma boa iteração de fila como ir para frente( <span style="font-style: italic;">next() </span>), voltar( <span style="font-style: italic;">rewind() </span>), atual ( <span style="font-style: italic;">current() </span>) e controle condicional ( <span style="font-style: italic;">valid()</span> ).</p>
<p>Como ele extende a classe SplFileInfo, isso quer dizer que podemos acessar os métodos públicos desta classe, métodos como isFile(), isDir() , isExecutable()  dentre outros.</p>
<p>Com esse raciocínio básico podemos ir para o código, afinal &#8220;Talks is cheap, show me the code&#8221;.</p>
<p><coolcode lang="php"><br />
$dirName = &#8220;/tmp&#8221;;<br />
$dirObj = new DirectoryIterator($dirName);</p>
<p>$i = 0;<br />
for(; $dirObj->valid() ; $dirObj->next() )<br />
{<br />
     if( !$dirObj->isDot() )<br />
    {<br />
          print &#8220;$i -> {$dirObj->getPathname()} &#8220;.&#8221; ->; {$dirObj->getType()}\n&#8221;;<br />
          $i++;<br />
     }<br />
}<br />
</coolcode><br />
O código acima mostra os arquivos e diretórios de um determinado diretório informado no construtor do objeto<span style="font-style: italic;"> DirectoryIterator</span>.</p>
<p>Basicamente na linha 2 é informado o diretório para ser visualizado e percorrido, na linha 3 é instanciado um objeto <span style="font-style: italic;">DirectoryIterator</span> e o percorremos através de um <span style="font-weight: bold;">for</span> conforme visto na linha 5 e nos condicionais deste <span style="font-weight: bold;">for</span> podemos ver que estamos utilizando os métodos implementados na classe <span style="font-style: italic;">DirectoryIterator</span> conforme a interface <span style="font-style: italic;">Iterator</span> manda e isso nos dá os condicionais básicos e iteradores para percorrer/iterar este objeto.</p>
<p>Gostou ?! vamos dá um upgrade neste exemplo&#8230; vamos criar 2 funções recursivas, uma para guardar o enderecamento dos diretórios, sub-diretórios e seus arquivos em um <span style="font-weight: bold;">Array</span> e outra função para imprimir isso de forma recursiva:</p>
<p><coolcode lang="php"><br />
/**<br />
* Função para guardar os diretórios/sub-diretórios e seus arquivos<br />
* respectivamente em um vetor(Array) de forma recursiva<br />
*<br />
* @params string $dirName<br />
* @return array $arr<br />
*/<br />
function throughDir($dirName)<br />
{<br />
    $dirObj = new DirectoryIterator($dirName);<br />
    for(; $dirObj->valid() ; $dirObj->next() )<br />
   {<br />
        if( $dirObj->isDir() and !$dirObj->isDot() )<br />
       {<br />
            $arr[$dirObj->getPathname()] = throughDir($dirObj->getPathname());<br />
       }<br />
    }<br />
    return $arr;<br />
}</p>
<p>/**<br />
* Função para imprimir os diretórios/sub-diretórios e seus arquivos<br />
* respectivamente de um vetor(Array) de forma recursiva<br />
*<br />
* @params Array $dirName<br />
* @return void<br />
*/<br />
function printDir($arrDirs)<br />
{<br />
     if(is_array($arrDirs))<br />
     {<br />
          foreach($arrDirs as $dir => $subDir)<br />
         {<br />
              echo $dir.&#8221;\n&#8221;;<br />
              printDir($subDir);<br />
         }<br />
      }else{<br />
              echo $arrDirs.&#8221;\n&#8221;;<br />
      }<br />
}</p>
<p>$arrDirs = throughDir(&#8220;/home/daniel/Desktop/&#8221;);<br />
printDir($arrDirs);<br />
</coolcode><br />
Gostaram ?!  é muito legal, tudo muito bom e claro perfeito senão tivessemos problemas para serem tratados.</p>
<p>Um dos problemas que podem ocorrer durante a execução de seu script é a falta de permissão para ler e ou abrir diretórios e arquivos, e se isso acontecer irá comprometer a execução de seu programa, ou seja, será finalizado.</p>
<p>No exemplo do código acima você vai conseguir percorrer os diretórios e sub-diretórios que você possuir permissão de leitura mas ao tentar percorrer um sub-diretório onde você não possui permissão para ler, o seu script finalizará a execução.</p>
<p>Um exemplo é você alterar o script anterior para percorrer um diretório que você não tenha permissão, você pode trocar a string &#8220;/home/daniel/Desktop&#8221; por &#8220;/tmp&#8221;, geralmente em &#8220;/tmp&#8221; sempre tem algo que o proprietário é o root e assim não permitindo que você possa ler o conteúdo. No meu caso olha no que deu:</p>
<blockquote><p>daniel@blackforce:~/Desktop$ php teste2.php</p>
<p>Fatal error: Uncaught exception &#8216;RuntimeException&#8217; with message &#8216;DirectoryIterator::__construct(/tmp/gconfd-root): failed to open dir: Permission denied&#8217; in /home/daniel/Desktop/teste2.php:13<br />
Stack trace:<br />
#0 /home/daniel/Desktop/teste2.php(13): DirectoryIterator-&gt;__construct(&#8216;/tmp/gconfd-roo&#8230;&#8217;)<br />
#1 /home/daniel/Desktop/teste2.php(18): throughDir(&#8216;/tmp/gconfd-roo&#8230;&#8217;)<br />
#2 /home/daniel/Desktop/teste2.php(48): throughDir(&#8216;/tmp&#8217;)<br />
#3 {main}<br />
thrown in /home/daniel/Desktop/teste2.php on line 13</p></blockquote>
<p>Na maioria das vezes é possível fazer com que seu programa saiba com que tipo de erro está lidando e assim fazê-lo executar outros procedimentos para tentar ignorar o problema que o está impedindo de terminar com sucesso a execução.</p>
<p>Para tanto é necessário que você saiba como trabalhar com Exceptions, um exemplo de como capturar exceções no exemplo do código anterior é acrescentando um bloco de <span style="font-style: italic;">try / catch</span> na funcção <span style="font-weight: bold;">throughDir()</span> para capturar o erro como no exemplo abaixo:<br />
/**<br />
* Função para guardar os diretórios/sub-diretórios e seus arquivos<br />
* respectivamente em um vetor(Array) de forma recursiva<br />
*<br />
* @params string $dirName<br />
* @return array $arr<br />
*/<br />
function throughDir($dirName)<br />
{<br />
try{<br />
$dirObj = new DirectoryIterator($dirName);<br />
for(; $dirObj-&gt;valid() ; $dirObj-&gt;next() )<br />
{<br />
if( $dirObj-&gt;isDir() and !$dirObj-&gt;isDot() )<br />
{<br />
$arr[$dirObj-&gt;getPathname()] = throughDir($dirObj-&gt;getPathname());<br />
}<br />
}<br />
}catch(RuntimeException $erro){<br />
print $erro;<br />
}<br />
return $arr;<br />
}</p>
<p>Apenas com este tratamento de imprimir o erro olha o resultado da execução:</p>
<blockquote><p>daniel@blackforce:~/Desktop$ php teste2.php<br />
exception &#8216;RuntimeException&#8217; with message &#8216;DirectoryIterator::__construct(/tmp/gconfd-root): failed to open dir: Permission denied&#8217; in /home/daniel/Desktop/teste2.php:13<br />
Stack trace:<br />
#0 /home/daniel/Desktop/teste2.php(13): DirectoryIterator-&gt;__construct(&#8216;/tmp/gconfd-roo&#8230;&#8217;)<br />
#1 /home/daniel/Desktop/teste2.php(18): throughDir(&#8216;/tmp/gconfd-roo&#8230;&#8217;)<br />
#2 /home/daniel/Desktop/teste2.php(48): throughDir(&#8216;/tmp&#8217;)<br />
#3 {main}exception &#8216;RuntimeException&#8217; with message &#8216;DirectoryIterator::__construct(/tmp/orbit-root): failed to open dir: Permission denied&#8217; in /home/daniel/Desktop/teste2.php:13<br />
Stack trace:<br />
#0 /home/daniel/Desktop/teste2.php(13): DirectoryIterator-&gt;__construct(&#8216;/tmp/orbit-root&#8217;)<br />
#1 /home/daniel/Desktop/teste2.php(18): throughDir(&#8216;/tmp/orbit-root&#8217;)<br />
#2 /home/daniel/Desktop/teste2.php(48): throughDir(&#8216;/tmp&#8217;)<br />
#3 {main}/tmp/.tmp<br />
/tmp/.tmp/tcx<br />
/tmp/hsperfdata_daniel<br />
/tmp/.ICE-unix<br />
/tmp/.X11-unix<br />
/tmp/.esd-1000<br />
/tmp/kde-daniel<br />
/tmp/gconfd-root<br />
/tmp/orbit-daniel<br />
/tmp/hsperfdata_root<br />
/tmp/ksocket-daniel<br />
/tmp/orbit-root<br />
/tmp/ssh-KcBsL23144<br />
/tmp/gconfd-daniel<br />
/tmp/gconfd-daniel/lock<br />
/tmp/virtual-daniel.XCv1fR<br />
/tmp/epiphany-daniel-OTEfiF<br />
/tmp/keyring-vrbWn3<br />
/tmp/.exchange-daniel<br />
/tmp/svbd9.tmp<br />
/tmp/plugtmp<br />
daniel@blackforce:~/Desktop$</p></blockquote>
<p>Como podemos ver, o erro foi impresso mas não gerou nenhum Fatal Error na execução do programa, o script continuou a execução até o fim e se por acaso tivesse ocorrido outro erro por falta de permissão, novamente ele iria imprimir o erro e seguir em diante, tudo isso porque o Fatal Error é gerado porque você não está tratando devidamente as ocilações de comportamento de seu programa de uma forma adequada.</p>
<p>A única exceção que vimos foi a <span style="font-weight: bold;">RuntimeException</span>, mas este post já está muito grande e não quero me estender mais para não ficar muito cansativo de ler, além do que este assunto sobre Exceptions geradas pela <a href="http://php.net/spl">SPL</a> merece um artigo somente tratando de explanar sua lógica, forma de captura e tratamento.</p>
<p>Com certeza isso é só o início da uma apresentação sobre a <a href="http://php.net/spl">SPL</a>. Espero que com essa introdução à classe DirectoryIterator tenha ajudado de alguma forma a tirar dúvidas sobre esta classe.</p>
<p>Qualquer <span style="font-weight: bold;">contribuição/sugestão/correção/reclamação</span> será bem vinda.</p>
<p>Comente! ajude a melhorar a qualidade do artigo.. compartilhe conhecimento.</p>
<p>Fontes:</p>
<ul>
<li><a href="http://www.php.net/~helly/php/ext/spl/">http://www.php.net/~helly/php/ext/spl/</a></li>
<li><a href="http://www.php.net/manual/en/ref.spl.php">http://www.php.net/manual/en/ref.spl.php</a></li>
</ul>
<p>Updates:<br />
Atualizado endereços das imagens para a nova url</p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2007/05/14/spl-standard-php-library-directoryiterator-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Seeduca + GCompris Brasil</title>
		<link>http://danielmartins.eti.br/blog/2007/05/10/seeduca-gcompris-brasil/</link>
		<comments>http://danielmartins.eti.br/blog/2007/05/10/seeduca-gcompris-brasil/#comments</comments>
		<pubDate>Thu, 10 May 2007 15:03:25 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Comunidades]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Traduções]]></category>

		<guid isPermaLink="false">http://daniel.jb0.org/2007/05/10/seeduca-gcompris-brasil/</guid>
		<description><![CDATA[+ O projeto Seeduca e GCompris Brasil decidiram em reunião compartilhar recursos e conhecimento para que haja uma melhor e maior colaboração entre os projetos, como segue a notícia no site do GCompris Brasil escrita pelo Frederico, mantenedor do projeto GCompris Brasil. Eu como um dos membro do projeto Seeduca.org me sinto muito feliz com [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.seeduca.org"><img src="http://danielmartins.eti.br/blog/wp-content/uploads/2007/05/seeduca303x120.png" /></a> + <a href="http://gcompris.teia.bio.br"><img src="http://danielmartins.eti.br/blog/wp-content/uploads/2007/05/logo.png" /></a></p>
<p>O projeto Seeduca e GCompris Brasil <a href="http://listas.seeduca.org/pipermail/seeduca-seeduca.org/2007-May/000009.html">decidiram em reunião</a> compartilhar recursos e conhecimento para que haja uma melhor e maior colaboração entre os projetos, como segue a <a href="http://gcompris.teia.bio.br/drupal/node/16">notícia</a> no site do GCompris Brasil escrita pelo <a href="http://teia.bio.br">Frederico</a>, mantenedor do projeto GCompris Brasil.</p>
<p><span id="more-114"></span><br />
Eu como um dos membro do projeto <a href="http://www.seeduca.org">Seeduca.org</a> me sinto muito feliz com esta notícia, pois é algo que só tende a fomentar a cultura de software livre nos ambientes educacionais que se utilizam da informática e também nos chamados Edutretenimentos (Não sei se existe essa palavra!), mas seria softwares de entretenimento com foco educacional, ou seja, enquanto a criança brinca e se diverte&nbsp; ela está aprendendo e se desenvolvendo.</p>
<p>Para os que ainda não estão por dentro:</p>
<p>O projeto <a href="http://www.seeduca.org">Seeduca.org</a> é <i>&#8220;O projeto Seeduca é um projeto que visa disseminar e incentivar o uso do Software Livre na educação, pois acreditamos que o conhecimento e a inclusão digital nos meios educacionais não podem ser obtidos e plenamente compartilhados por meio de softwares não livres.&#8221;.<br /></i><br />O projeto <a href="http://gcompris.teia.bio.br">Gcompris Brasil</a> é <i>&#8220;O objetivo desse site é reunir os trabalhos de tradução, documentação e divulgação do software educacional GCompris aqui no Brasil. Todos estão convidados para colaborar com o projeto, que é aberto a qualquer pessoa.&#8221;</i>.</p>
<p>Você que de alguma forma está envolvida na educação de crianças, jovens e adultos e gostaria de conhecer o projeto Seeduca e/ou GCompris entre na lista de discussão <a href="http://listas.seeduca.org/listinfo.cgi/seeduca-seeduca.org">neste link</a> e participe. </p>
<p>Vale ressaltar que as contribuições podem vir de quase qualquer área do conhecimento. Seja você programador,tradutor, pedagogo, educador, pai/mãe que se preocupa o desenvolvimento/criação de seu filho(a), entusiastas e etc.</p>
<p>Participem:</p>
<p>http://www.seeduca.org<br /><s>http://gcompris.teia.bio.br em breve</s> www.gcompris-br.org</p>
<p>:wq!</p>
<p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2007/05/10/seeduca-gcompris-brasil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica rápida: php-gtk2 + PHP 5.2.1 +  Ubuntu Feisty Fawn</title>
		<link>http://danielmartins.eti.br/blog/2007/03/16/dica-rapida-php-gtk2-php-521-ubuntu-feisty-fawn/</link>
		<comments>http://danielmartins.eti.br/blog/2007/03/16/dica-rapida-php-gtk2-php-521-ubuntu-feisty-fawn/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 14:00:52 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Dicas & How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://daniel.jb0.org/2007/03/16/dica-rapida-php-gtk2-php-521-ubuntu-feisty-fawn/</guid>
		<description><![CDATA[Ao compilar o php-gtk2 alpha , eu não estava conseguindo colocar no php.ini do cli (/etc/php5/cli/) a opção &#8220;extension=php_gtk2.so&#8221; pra não ter que ficar chamando sempre na aplicação a função dl();, e eu não havia percebido que nesta nova versão existe também uma sub-diretório no /etc/php5/cli que é o conf.d e é nele portanto que [...]]]></description>
			<content:encoded><![CDATA[<p>Ao compilar o <a href="http://gtk.php.net/download.php">php-gtk2 alpha</a> , eu não estava conseguindo colocar no php.ini do cli (/etc/php5/cli/) a opção &#8220;<b>extension=php_gtk2.so</b>&#8221; pra não ter que ficar chamando sempre na aplicação a função <a href="http://br2.php.net/dl">dl();</a>, e eu não havia percebido que nesta nova versão existe também uma sub-diretório no /etc/php5/cli que é o conf.d e é nele portanto que fica as chamadas para as extensões(pelo o que eu pude entender), então&nbsp; em /etc/php5/cli/conf.d/ criei um arquivo chamado php_gtk2.ini e dentro deste arquivo adicionei:<br />
<blockquote>extension=php_gtk2.so</p></blockquote>
<p>e pronto, apenas execute:<br />
<blockquote>php5 -m | grep gtk</p></blockquote>
<p>para checkar se sua extensão foi carregada com sucesso!</p>
<p>Lembrando que eu estou usando os pacotes do <a href="http://dotdeb.org">dotdeb.org</a>, que é um ótimo repositório para quem gosta de testar e experimentar os novos releases do php.</p>
<p>
<p class="poweredbyperformancing">powered by <a href="http://performancing.com/firefox">performancing firefox</a></p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2007/03/16/dica-rapida-php-gtk2-php-521-ubuntu-feisty-fawn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dica rápida: ATI Sound + Ubuntu</title>
		<link>http://danielmartins.eti.br/blog/2007/03/15/dica-rapida-ati-sound-ubuntu-2/</link>
		<comments>http://danielmartins.eti.br/blog/2007/03/15/dica-rapida-ati-sound-ubuntu-2/#comments</comments>
		<pubDate>Thu, 15 Mar 2007 17:59:14 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Dicas & How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://daniel.jb0.org/2007/03/15/dica-rapida-ati-sound-ubuntu-2/</guid>
		<description><![CDATA[Um amigo teve problemas para configurar a placa de som do seu novo laptop, dei uma fuçada no google e neste link&#160; http://ubuntuforums.org/showthread.php?p=1965037 encontrei algo a respeito, executei os procedimentos e pronto ! funcionou o som e decidir fazer uma pequena tradução dos passos escritos no link. Siga os passos No /etc/modprobe.d/snd-hda-intel.modprobe adicione: options snd-hda-intel [...]]]></description>
			<content:encoded><![CDATA[<div align="left">Um <a href="http://brankinhu.eti.br/blog/">amigo</a> teve problemas para configurar a placa de som do seu novo laptop, dei uma fuçada no google e neste link&nbsp; <a href="http://ubuntuforums.org/showthread.php?p=1965037">http://ubuntuforums.org/showthread.php?p=1965037</a> encontrei algo a respeito, executei os procedimentos e pronto ! funcionou o som e decidir fazer uma pequena tradução dos passos escritos no link.</p>
<p>Siga os passos
<ol>
<li>No <b>/etc/modprobe.d/snd-hda-intel.modprobe</b> adicione:</li>
<p><quote>options snd-hda-intel model=3stack-6ch</quote>
<li>No <b>/etc/modprobe.d/alsa-base</b>adicione:</li>
<p><quote>options snd-hda-intel model=3stack-6ch <br /></quote>
<li>No <b>/etc/modules</b> adicione:</li>
<p><quote>options snd-hda-intel model=3stack-6ch</quote></ol>
<p>Isto foi o suficiente para funcionar o som, mas no how-to tem mais coisa:
<ul>
<li>Reinicie o sistema operacional e abra o alsamixer.</li>
<li>Mude o canal <channel> para 6ch</channel></li>
<li>Você tem que tirar do mudo o &lt;PCM&gt;,&lt;SURROUND&gt;,&lt;LFE&gt; e &lt;CENTER&gt;</li>
<li>Plugue os headphones no laptop e pronto! é para funcionar</li>
</ul>
<p>O único problema encontrado é que os speakers do laptop não funcionam, talvez seja um bug ?! Não sei, se eu encontrar a solução eu posto.</p>
<p><b>Obs: Mas este problema não foi encontrado na configuração deste laptop. Cada caso é um caso!</b></p>
<p>Tudo para ajudar um amigo <a href="http://brankinhu.eti.br/blog/">Antônio Jr (aka Brankinhu)</a>! Devia escutar mais vez Kreator!!! <img src='http://danielmartins.eti.br/blog/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </div>
<p class="poweredbyperformancing">powered by <a href="http://performancing.com/firefox">performancing firefox</a></p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2007/03/15/dica-rapida-ati-sound-ubuntu-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Do Ubuntu Edgy Eft para Ubuntu Feisty Fawn com update-manager</title>
		<link>http://danielmartins.eti.br/blog/2007/02/22/do-ubuntu-edgy-eft-para-ubuntu-feisty-fawn-com-update-manager/</link>
		<comments>http://danielmartins.eti.br/blog/2007/02/22/do-ubuntu-edgy-eft-para-ubuntu-feisty-fawn-com-update-manager/#comments</comments>
		<pubDate>Fri, 23 Feb 2007 02:49:33 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://daniel.jb0.org/?p=63</guid>
		<description><![CDATA[É uma dica rápida pra quem não quer ficar mexendo no source list alterando edgy para feisty ou s/edgy/feisty/g Este Release não é recomendável para produção, ou seja, não é garantido que ele funcione, pacotes podem quebrar, programas podem não funcionar e etc, e eu não me responsabilizo se você tiver problemas na atualização para [...]]]></description>
			<content:encoded><![CDATA[<p> <a href="http://daniel.jb0.org/?attachment_id=64" rel="attachment wp-att-64" title="Ubuntu"><img src="http://daniel.jb0.org/wp-content/uploads/2007/02/edgy-cover-mid.jpg" alt="Ubuntu" /></a></p>
<p>É uma dica rápida pra quem não quer ficar mexendo no source list alterando edgy para feisty ou s/edgy/feisty/g</p>
<p>Este Release não é recomendável para produção, ou seja, não é garantido que ele funcione, pacotes podem quebrar, programas podem não funcionar e etc, e eu não me responsabilizo se você tiver problemas na atualização para versão em desenvolvimento do Ubuntu Feisty Fawn, basicamente:</p>
<p>Abra o terminal de digite:</p>
<blockquote><p>sudo update-manager &#8211;devel-release</p></blockquote>
<p>e espere ele baixar uns 1000 pacotes, claro que isto varia conforme a quantidade de pacotes que você possui atualmente instalados.</p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2007/02/22/do-ubuntu-edgy-eft-para-ubuntu-feisty-fawn-com-update-manager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenOffice.org2 + Ubuntu Edgy + Bug nos diálogos de Salvar e Abrir documentos</title>
		<link>http://danielmartins.eti.br/blog/2006/09/14/openofficeorg2-ubuntu-edgy-bug-nos-dialogos-de-salvar-e-abrir-documentos/</link>
		<comments>http://danielmartins.eti.br/blog/2006/09/14/openofficeorg2-ubuntu-edgy-bug-nos-dialogos-de-salvar-e-abrir-documentos/#comments</comments>
		<pubDate>Thu, 14 Sep 2006 03:23:02 +0000</pubDate>
		<dc:creator>Daniel Elias</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://daniel.jb0.org/?p=39</guid>
		<description><![CDATA[Eu instalei o Ubuntu Edgy semana passada e logo ao terminar a instalação, precisei editar alguns documentos no OpenOffice.org, abri o OO e ao executar o diálogo de seleção de arquivo para abrir do OO, a tela principal simplesmente fechou e abriu o assistente de restauração, eu reportei o bug e no outro dia recebi [...]]]></description>
			<content:encoded><![CDATA[<p>Eu instalei o Ubuntu Edgy semana passada e logo ao terminar a instalação, precisei editar alguns documentos no OpenOffice.org, abri o OO e ao executar o diálogo de seleção de arquivo para abrir do OO, a tela principal simplesmente fechou e abriu o assistente de restauração, eu reportei o <a href="https://launchpad.net/distros/ubuntu/+source/openoffice.org/+bug/58508">bug</a> e no outro dia recebi a reposta que este bug já fora reportado e apartir dai comecei a receber todas os comentários deste <a href="https://launchpad.net/distros/ubuntu/+source/openoffice.org/+bug/58508">bug</a> no launchpad.</p>
<p>O Alysson Oliveira publicou um jeito de fazer funcionar OO sem &#8216;créshar&#8217;, um &#8220;workaround&#8221;, segui as instrunções e funcionou, os passos seguem abaixo.</p>
<p>Todos os passos foram executados como root.</p>
<p>1.</p>
<blockquote><p>#echo &#8220;LD_PRELOAD=/usr/lib/libdbus-1.so.3 /usr/bin/ooffice $1 $2 $3 $4&#8243; >  /usr/bin/ooffice2</p></blockquote>
<p>2.</p>
<blockquote><p>#gedit /usr/share/applications/ooo-writer.desktop</p></blockquote>
<p>3. Mude a linha 5 de:</p>
<blockquote><p>Exec=ooffice -writer %U</p></blockquote>
<p>3.1. Para:</p>
<blockquote><p>Exec=ooffice2 -writer %U</p></blockquote>
<p>Repita os passos 3 e 3.1 para os demais arquivos:</p>
<blockquote><p>/usr/share/applications/ooo-base.desktop<br />
/usr/share/applications/ooo-draw.desktop<br />
/usr/share/applications/ooo-math.desktop<br />
/usr/share/applications/ooo-calc.desktop<br />
/usr/share/applications/ooo-impress.desktop</p></blockquote>
<p>Outro &#8220;workaround&#8221;  é criar um alias e colocar no profile</p>
<blockquote><p># echo ooffice=&#8221;LD_PRELOAD=/usr/lib/libdbus-1.so.3 /usr/bin/ooffice $1 $2 $3 $4&#8243; > /etc/profile</p></blockquote>
<p>Esta não é maneira correta de fazer as coisas acontecerem, o certo seria recompilar o OO e ajeitar o DBUS, mas recompilar o OO não é tão simples e mesmo compilando fugiria aos padrões Ubuntu de qualidade/integridade dos pacotes, em breve irá sair do forno o pacote corrigido, a importância desse bug é &#8220;High&#8221;, ou seja, tem prioridade!.</p>
<p>Até lá, eu vou me virando com esse &#8220;workaround&#8221; mesmo.</p>
<p>Postei porque foi útil pra mim e talvez seja para outra pessoa.</p>
<p>Link: <a href="https://launchpad.net/distros/ubuntu/+source/openoffice.org/+bug/58508">https://launchpad.net/distros/ubuntu/+source/openoffice.org/+bug/58508 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://danielmartins.eti.br/blog/2006/09/14/openofficeorg2-ubuntu-edgy-bug-nos-dialogos-de-salvar-e-abrir-documentos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

