<?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>Danilo Cabello</title>
	<atom:link href="http://blog.danilocabello.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.danilocabello.com</link>
	<description>Barba, Cabello e bigode</description>
	<lastBuildDate>Sat, 13 Feb 2010 12:51:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Onde fica o fixmbr do Windows 7 ou como arrumar seu boot após remover as partições com Linux</title>
		<link>http://blog.danilocabello.com/arquivo/onde-fica-o-fixmbr-do-windows-7-ou-como-arrumar-seu-boot-apos-remover-as-particoes-com-linux/</link>
		<comments>http://blog.danilocabello.com/arquivo/onde-fica-o-fixmbr-do-windows-7-ou-como-arrumar-seu-boot-apos-remover-as-particoes-com-linux/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 06:58:11 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[boot]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=352</guid>
		<description><![CDATA[Decidi jogar meu Ubuntu fora momentaneamente por precisar de espaço no computador e obviamente sabia que o GRUB (ferramenta de boot) iria dar problema após remover a partição do Ubuntu e de SWAP, por isso, preparei meu pen-drive com Windows 7 conforme o post anterior já adiantando esse tipo de problema.
Após remover a partição e [...]]]></description>
			<content:encoded><![CDATA[<p>Decidi jogar meu Ubuntu fora momentaneamente por precisar de espaço no computador e obviamente sabia que o GRUB (ferramenta de <em>boot</em>) iria dar problema após remover a partição do Ubuntu e de SWAP, por isso, preparei meu pen-drive com Windows 7 conforme o <a href="http://blog.danilocabello.com/arquivo/instalando-o-windows-7-pelo-pen-drive/">post anterior</a> já adiantando esse tipo de problema.</p>
<p>Após remover a partição e tentar ligar o computador, dou de cara com o GRUB reclamando que não encontrou nada para conseguir iniciar normalmente, coloquei meu pen-drive e reiniciei a máquina, o Windows 7 oferece no canto inferior esquerdo a opção de reparar o computador, fiquei surpreso que ao acessar o modo de reparo o Windows já notou que havia problema com o <em>boot </em>e me informou que tinha arrumado a situação e que eu podia reiniciar.</p>
<p>Para minha surpresa nada aconteceu e o GRUB estava lá, lindo, leve e solto, me impedindo de utilizar meu computador. Reiniciei novamente o computador com o pen-drive com Windows e dessa vez fui direto na linha de comando, outra surpresa me aguardava, os tradicionais <code>fixboot</code> e <code>fixmbr</code> não se encontravam no diretório aberto no <em>prompt</em>.</p>
<p>Por sorte e com acesso a outro computador, descobri através do Google que os arquivos se encontram em:</p>
<pre>
X:\windows\system32\bootrec.exe /FixMbr
</pre>
<p>Executado o comando e pronto, computador funcionando novamente sem GRUB, o susto valeu o post no blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/onde-fica-o-fixmbr-do-windows-7-ou-como-arrumar-seu-boot-apos-remover-as-particoes-com-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando o Windows 7 pelo Pen Drive</title>
		<link>http://blog.danilocabello.com/arquivo/instalando-o-windows-7-pelo-pen-drive/</link>
		<comments>http://blog.danilocabello.com/arquivo/instalando-o-windows-7-pelo-pen-drive/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 05:05:15 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[pen-drive]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=347</guid>
		<description><![CDATA[Voltando a ativa depois de alguns meses de blog parado, estou em um momento crítico da minha vida, mudando de foco em muitas coisas e principalmente na forma de pensar e reagir as situações, mas isso é assunto para outro post.
Eu não gosto de queimar DVD e por sorte minha faculdade tem parceria com a [...]]]></description>
			<content:encoded><![CDATA[<p>Voltando a ativa depois de alguns meses de blog parado, estou em um momento crítico da minha vida, mudando de foco em muitas coisas e principalmente na forma de pensar e reagir as situações, mas isso é assunto para outro post.</p>
<p>Eu não gosto de queimar DVD e por sorte minha faculdade tem parceria com a Microsoft, então após baixar a ISO do Windows 7 eu tive que ir a caça de como fazer um pen-drive &#8220;bootável&#8221;. Atualmente há diversas alternativas, apesar de gostar de linha de comando, tem coisas que eu prefiro que sejam práticas e rápidas.</p>
<p>Para encurtar o seu tempo procurando por uma solução descomplicada e após visitar mais de dez blogs e fazer diversas buscas, segue a dica.</p>
<ol>
<li>Baixe o aplicativo ABUSB <a href="http://cid-f52381d9f2fd5fd8.skydrive.live.com/browse.aspx/ABUSB">aqui</a>, se por acaso o link estiver quebrado me avise por comentário ou e-mail. <strong>Importante:</strong> Não sou o autor do aplicativo.</li>
<li>De posse de seu CD/DVD <strong>ou </strong>de seu ISO do Windows, abra o aplicativo.</li>
<li>Next, next, next, espere, espere tranquilamente, no caso do Windows 7 por exemplo, tem um arquivo <em>install.wim</em> que possui 2.7 Gb parece que o programa trava no 6% por causa disso, mas depois que ele termina de mandar esse arquivo, vai direto para 90% concluído.</li>
<li>Agora é só colocar a sua BIOS para dar <em>boot </em>pelo pen-drive e instalar o Windows.</li>
</ol>
<p>Foto do aplicativo, para você ver como a interface é simples:</p>
<p style="text-align: center;"><a href="http://blog.danilocabello.com/wp-content/uploads/2010/02/abusb.png"><img class="aligncenter size-medium wp-image-348" title="ABUSB" src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2010/02/abusb.png" alt="" width="506" height="278" /></a></p>
<p>Esse post é resultado de passar mais tempo procurando sobre como colocar o Windows no pen-drive do que esperando ele terminar de instalar.</p>
<p><span style="color: #ff0000;"><strong>Atualização: </strong></span> Meu colega de turma me avisou pelo Buzz que a Microsoft liberou uma ferramenta oficial para fazer esse tipo de preparo sem dor de cabeça, segue o link:<br />
<a href="http://store.microsoft.com/Help/ISO-Tool">http://store.microsoft.com/Help/ISO-Tool</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/instalando-o-windows-7-pelo-pen-drive/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Countdown Lost para aumentar a ansiedade</title>
		<link>http://blog.danilocabello.com/arquivo/countdown-lost-para-aumentar-a-ansiedade/</link>
		<comments>http://blog.danilocabello.com/arquivo/countdown-lost-para-aumentar-a-ansiedade/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 13:56:22 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[lost]]></category>
		<category><![CDATA[seriados]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=343</guid>
		<description><![CDATA[Sou fã do seriado Lost e ansioso pela próxima temporada encontrei o contador abaixo.

E você, está contando os dias também?
]]></description>
			<content:encoded><![CDATA[<p>Sou fã do seriado Lost e ansioso pela próxima temporada encontrei o contador abaixo.</p>
<p><object width="320" height="168"><param name="movie" value="http://www.lost4815162342.com/flash/countdown.swf"></param><param name="wmode" value="transparent"></param><embed src="http://www.lost4815162342.com/flash/countdown.swf" type="application/x-shockwave-flash" width="320" height="168" wmode="transparent"></embed></object></p>
<p>E você, está contando os dias também?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/countdown-lost-para-aumentar-a-ansiedade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aspas duplas em arquivos batch (.bat)</title>
		<link>http://blog.danilocabello.com/arquivo/aspas-duplas-em-arquivos-batch-bat/</link>
		<comments>http://blog.danilocabello.com/arquivo/aspas-duplas-em-arquivos-batch-bat/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 13:55:50 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[rápida]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=338</guid>
		<description><![CDATA[Se por um acaso do destino você precisar alterar ou começar do zero um arquivo batch (.bat) e ainda necessitar receber argumentos pela chamada do arquivo, muito provavelmente você irá utilizar aspas no argumento se ele for um caminho de alguma pasta ou diretório.
Se esse caminho não possuir espaços, tudo será tranquilo, você provavelmente irá [...]]]></description>
			<content:encoded><![CDATA[<p>Se por um acaso do destino você precisar alterar ou começar do zero um arquivo batch (.bat) e ainda necessitar receber argumentos pela chamada do arquivo, muito provavelmente você irá utilizar aspas no argumento se ele for um caminho de alguma pasta ou diretório.</p>
<p>Se esse caminho não possuir espaços, tudo será tranquilo, você provavelmente irá utilizar <code>%1</code> e receberá o argumento corretamente, mas se o caminho possuir espaços, você vai colar aspas duplas pra passar o parâmetro corretamente e surpresa não vai conseguir concatenar esse caminho com nada.</p>
<p>Depois de muita pesquisa do google fica a dica então: <code>%~1</code> retira as aspas do caminho facilitando para você fazer algo do tipo:</p>
<p><code>"%~1\programa.exe"</code></p>
<p>Lembrando que segundo a fonte isso vale apenas para NT 4 (SP6) pra cima.</p>
<p>Fonte: <a href="http://www.robvanderwoude.com/parameters.php">http://www.robvanderwoude.com/parameters.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/aspas-duplas-em-arquivos-batch-bat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugando no Django com winpdb</title>
		<link>http://blog.danilocabello.com/arquivo/debugando-no-django-com-winpdb/</link>
		<comments>http://blog.danilocabello.com/arquivo/debugando-no-django-com-winpdb/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 00:11:07 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[pdb]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[winpdb]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=325</guid>
		<description><![CDATA[Continuando o post anterior[1], além do pdb[2] que é totalmente via linha de comando, há o winpdb[3] que possui uma interface gráfica para facilitar a depuração.
Instalá-lo é muito fácil, se você possui easy_install é só executar:

sudo easy_install winpdb

Se você não tem easy_install, mas tem apt-get:

sudo apt-get install winpdb

Se você não tem nada disso ainda dá [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando o <a href="http://blog.danilocabello.com/arquivo/debugando-no-django/">post anterior</a>[1], além do <a href="http://docs.python.org/library/pdb.html">pdb</a>[2] que é totalmente via linha de comando, há o <a href="http://winpdb.org/">winpdb</a>[3] que possui uma interface gráfica para facilitar a depuração.</p>
<p>Instalá-lo é muito fácil, se você possui <code>easy_install</code> é só executar:</p>
<pre class="brush: bash;">
sudo easy_install winpdb
</pre>
<p>Se você não tem <code>easy_install</code>, mas tem <code>apt-get</code>:</p>
<pre class="brush: bash;">
sudo apt-get install winpdb
</pre>
<p>Se você não tem nada disso ainda dá pra baixar pelo <a href="http://winpdb.org/">site</a>[3] e funciona no Windows também, mas eu não testei.</p>
<p>Usarei como exemplo o código criado pelo <a href="http://blog.danilocabello.com/arquivo/debugando-no-django/">post anterior</a>, é um projeto bem simples com apenas uma view para atestar o poder do debug.</p>
<p>Lembra da nossa view, ela é simples assim:</p>
<pre class="brush: python;">
def hello(request):
    a = 2
    b = 3
    c = [1,2,3]
    c.pop()
    d = soma(3,4)
    response = HttpResponse(&quot;Hello World&quot;)
    return response
</pre>
<p>Como o <code>winpdb</code> possui a funcionalidade de adicionar <em>breakpoints</em> eu tirei aquele código de debug do <code>pdb</code> senão eles conflitariam entre si.</p>
<p>Abra o <code>winpdb</code>:</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/01.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/01-300x173.png" alt="winpdb" title="winpdb" width="300" height="173" class="aligncenter size-medium wp-image-327" /></a></p>
<p>A interface dele é bem simples, ficará mais clara quando estivermos executando alguma coisa.</p>
<p>Vá até <code>File->Launch</code> e na janela aberta escolha o <code>manage.py</code> do projeto que vamos depurar, por fim adicione <code>runserver --noreload</code> no comando e então clique em <code>OK</code> para iniciar o servidor.</p>
<p>O seu <code>winpdb</code> deve ficar parecido com a imagem abaixo, além de um terminal que será aberto pelo próprio <code>winpdb</code>.</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/02.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/02-300x173.png" alt="winpdb executando django runserver --noreload" title="winpdb executando django runserver --noreload" width="300" height="173" class="aligncenter size-medium wp-image-328" /></a></p>
<p>Antes de continuar qualquer coisa, vá até <code>File->Open Source</code> e na janela aberta escolha o arquivo <code>views.py</code>, adicione um <em>breakpoint</em> na linha <code>a = 2</code> clicando à direita do número da linha. Tente acessar a URL que executa a <em>view</em> <code>hello</code> e volte ao <code>winpdb</code>, você verá algo como abaixo (a diferença é que eu já andei duas linhas no código):</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/03.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/03-300x173.png" alt="winpdb na view hello" title="winpdb na view hello" width="300" height="173" class="aligncenter size-medium wp-image-329" /></a></p>
<p>Essa imagem é bem interessante pois mostra valores das variáveis, um console escondido abaixo do código, o arquivo em que o <em>debugger</em> se encontra, controles de avanço do <em>debug</em>, etc.</p>
<p>Avance com <code>Control->Next</code> até a chamada de <code>soma</code> e entre com <code>Control->Step Into</code>, avance duas linhas e você ficará assim:</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/04.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/04-300x173.png" alt="winpdb na função soma" title="winpdb na função soma" width="300" height="173" class="aligncenter size-medium wp-image-330" /></a></p>
<p>As variáveis do escopo local mudaram, o <em>debugger</em> continua no <code>views.py</code> mas agora dentro da função <code>soma</code>, dê <code>Control->Return</code> para ir até antes da função retornar pro escopo de <code>hello</code>.</p>
<p>Com <code>Control->Next</code> vá até antes da linha que executa <code>return response</code> e vamos brincar um pouco com o console que se encontra abaixo do código-fonte:</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/05.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/05-300x173.png" alt="winpdb e o console" title="winpdb e o console" width="300" height="173" class="aligncenter size-medium wp-image-331" /></a></p>
<p>Como você pode ver na imagem, o comando <code>v</code> (de <em>eval</em>) seguido de uma expressão retorna o valor da expressão, já o comando <code>x</code> (de <em>exec</em>) seguido de uma expressão executa a expressão informada.</p>
<p>Vamos fazer igual ao <a href="http://blog.danilocabello.com/arquivo/debugando-no-django/">post anterior</a> e verificar as propriedades de <code>response</code>:</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/06.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/06-300x173.png" alt="winpdb e o console alterando a response" title="winpdb e o console alterando a response" width="300" height="173" class="aligncenter size-medium wp-image-332" /></a></p>
<p>Na imagem acima, executamos um <code>dir</code> na variável <code>response</code>, exibimos seu <code>content</code> com <code>v</code>, alteramos o <code>content</code> com <code>x</code> e por fim com <code>Control->Go</code> visualizamos o resultado no navegador:</p>
<p><a href="http://blog.danilocabello.com/wp-content/uploads/2009/09/07.png"><img src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/09/07-300x170.png" alt="resultado final no navegador" title="resultado final no navegador" width="300" height="170" class="aligncenter size-medium wp-image-333" /></a></p>
<p>Para saber de mais funcionalidades que o <code>winpdb</code> pode te oferecer dê uma olhada no <a href="http://winpdb.org/cgi-bin/moin.cgi/WinpdbTutorial">tutorial</a>[4] (bem completo por sinal) que se encontra na própria <a href="http://winpdb.org/cgi-bin/moin.cgi/FrontPage">wiki</a>[5] deles.</p>
<p>[1] &#8211; <a href="http://blog.danilocabello.com/arquivo/debugando-no-django/">http://blog.danilocabello.com/arquivo/debugando-no-django/</a><br />
[2] &#8211; <a href="http://docs.python.org/library/pdb.html">http://docs.python.org/library/pdb.html</a><br />
[3] &#8211; <a href="http://winpdb.org/">http://winpdb.org/</a><br />
[4] &#8211; <a href="http://winpdb.org/cgi-bin/moin.cgi/WinpdbTutorial">http://winpdb.org/cgi-bin/moin.cgi/WinpdbTutorial</a><br />
[5] &#8211; <a href="http://winpdb.org/cgi-bin/moin.cgi/FrontPage">http://winpdb.org/cgi-bin/moin.cgi/FrontPage</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/debugando-no-django-com-winpdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugando no Django</title>
		<link>http://blog.danilocabello.com/arquivo/debugando-no-django/</link>
		<comments>http://blog.danilocabello.com/arquivo/debugando-no-django/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 03:45:20 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[pdb]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=311</guid>
		<description><![CDATA[Bem que você tentou, releu o código diversas vezes, escreveu um monte de prints, mas não conseguiu descobrir o que está causando aquele bug indesejado. É chegada a hora de debugar seu código, a seguir darei algumas dicas de como debugar com pdb seu projeto em Django[1].
Primeiramente, debugar um projeto em Python[2] e debugar um [...]]]></description>
			<content:encoded><![CDATA[<p>Bem que você tentou, releu o código diversas vezes, escreveu um monte de <em>prints</em>, mas não conseguiu descobrir o que está causando aquele bug indesejado. É chegada a hora de debugar seu código, a seguir darei algumas dicas de como debugar com pdb seu projeto em Django<a href="http://www.djangoproject.com/">[1]</a>.</p>
<p>Primeiramente, debugar um projeto em Python<a href="http://www.python.org/">[2]</a> e debugar um projeto em Django não tem muita diferença, a coisa toda é muito parecida, você só precisa do pontapé inicial para se virar dali pra frente.</p>
<p>Para aprender como utilizar o pdb<a href="http://docs.python.org/library/pdb.html">[3]</a> (vulgo Python Debugger) crie um novo projeto chamado <code>djdebug</code>, logo em seguida crie um arquivo vazio chamado <code>views.py</code> na própria raiz do projeto, ficando com a seguinte estrutura de arquivos:</p>
<pre>
djdebug
  - __init__.py
  - manage.py
  - settings.py
  - urls.py
  - views.py
</pre>
<p>No arquivo <code>views.py</code> cole o seguinte código:</p>
<pre class="brush: python;">
from django.shortcuts import HttpResponse

def soma(a,b):
    arg1 = a
    arg2 = b
    soma = arg1 + arg2
    return soma

def hello(request):
    a = 2
    b = 3
    c = [1,2,3]
    c.pop()
    d = soma(3,4)
    response = HttpResponse(&quot;Hello World&quot;)
    return response
</pre>
<p>Como podemos ver o arquivo contém uma função <code>soma</code>, que não faz nada de muito complexo e uma função <code>hello</code> que retorna uma response com o conteúdo <code>"Hello World"</code>.</p>
<p>No arquivo <code>urls.py</code> importe a view <code>hello</code> e adicione uma URL para podemos acessá-la:</p>
<pre class="brush: python;">
from views import hello

urlpatterns = patterns('',
    ...
    (r'^hello', hello),
)
</pre>
<p>Execute o servidor de testes, navegue até <code>http://localhost:8000/hello</code> e verifique que está tudo funcionando:</p>
<pre class="brush: bash;">
./manage runserver
</pre>
<p>Suponha que há um bug em alguma parte da view <code>hello</code> e então adicione o código para possibilitar o debug:</p>
<pre class="brush: python;">
def hello(request):
    a = 2
    import pdb
    pdb.set_trace()
    ...
</pre>
<p>Apenas para esclarecer, o <code>import pdb</code> importa o Python debugger, já o <code>pdb.set_trace()</code> serve pra colocar um breakpoint no código, há maneiras de se colocar um breakpoint no código sem alterá-lo através do próprio pdb<a href="http://docs.python.org/library/pdb.html">[3]</a>.</p>
<p>Execute o servidor de testes mas desta vez adicione o parâmetro necessário para evitar recarregamento automático do código-fonte:</p>
<pre class="brush: bash;">
./manage runserver --noreload
</pre>
<p>Abra novamente a view <code>hello</code> no seu navegador, ela ficará parada e no terminal que você iniciou o servidor o pdb<a href="http://docs.python.org/library/pdb.html">[3]</a> estará parado esperando por comandos:</p>
<pre class="brush: python;">
&gt; /home/.../djdebug/views.py(13)hello()
-&gt; b = 3
(Pdb)
</pre>
<p>Vamos começar, temos um comando interessante que é o <code>l</code> (de <em>list</em>, lista o código na região do debugger) que lista onde se encontra o debugger:</p>
<pre class="brush: python;">
(Pdb) l
  8
  9  	def hello(request):
 10  	    a = 2
 11  	    import pdb
 12  	    pdb.set_trace()
 13      -&gt;  b = 3
 14  	    c = [1,2,3]
 15  	    c.pop()
 16  	    d = soma(3,4)
 17  	    response = HttpResponse(&quot;Hello World&quot;)
 18  	    return response
</pre>
<p>É importante notar que o debugger se encontra no exato momento <strong>antes</strong> de executar a linha apontada pela seta, isto é, se executarmos <code>p</code> (de <em>print</em>, imprime a expressão passada como argumento) para inspecionarmos a variável <code>b</code>, ela não estará definida:</p>
<pre class="brush: python;">
(Pdb) p a
2
(Pdb) p b
*** NameError: NameError(&quot;name 'b' is not defined&quot;,)
</pre>
<p>Vamos para próxima linha com <code>n</code> (de <em>next</em>, segue para a próxima linha):</p>
<pre class="brush: python;">
(Pdb) n
&gt; /home/.../djdebug/views.py(14)hello()
-&gt; c = [1,2,3]
(Pdb) p b
3
</pre>
<p>Agora sim <code>b</code> já possui valor, vamos avançar até a chamada da função <code>somar</code>:</p>
<pre class="brush: python;">
(Pdb) n
&gt; /home/.../djdebug/views.py(15)hello()
-&gt; c.pop()
(Pdb) &lt;enter&gt;
&gt; /home/.../djdebug/views.py(16)hello()
-&gt; d = soma(3,4)
</pre>
<p>A partir do primeiro <code>n</code>, <code>enter</code> executará <code>n</code> novamente. Como nós não sabemos se o problema da view <code>hello</code> é a função <code>somar</code>, vamos entrar na função somar com <code>s</code> (de <em>step into</em>, entra na função, ou seja, passo a dentro) e verificar se está tudo certo:</p>
<pre class="brush: python;">
(Pdb) s
--Call--
&gt; /home/.../djdebug/views.py(3)soma()
-&gt; def soma(a,b):
(Pdb) l
  1  	  from django.shortcuts import HttpResponse
  2
  3     -&gt; def soma(a,b):
  4  	      arg1 = a
  5  	      arg2 = b
  6  	      soma = arg1 + arg2
  7  	      return soma
  8
  9  	  def hello(request):
 10  	      a = 2
 11  	      import pdb
</pre>
<p>Como podemos ver o debugger se encontra na entrada da função <code>soma</code>, damos uma &#8220;olhada por cima&#8221; e saímos da função com <code>up</code> (de up, sobe uma chamada na pilha):</p>
<pre class="brush: python;">
&gt; /home/.../djdebug/views.py(4)soma()
-&gt; arg1 = a
(Pdb) n
&gt; /home/.../djdebug/views.py(5)soma()
-&gt; arg2 = b
(Pdb) n
&gt; /home/.../djdebug/views.py(6)soma()
-&gt; soma = arg1 + arg2
(Pdb) u
&gt; /home/.../djdebug/views.py(16)hello()
-&gt; d = soma(3,4)
</pre>
<p>Como podemos ver, voltamos a view <code>hello</code>, vamos avançar até antes de retornar a resposta da requisição e atestar umas coisinhas:</p>
<pre class="brush: python;">
(Pdb) n
&gt; /home/.../djdebug/views.py(17)hello()
-&gt; response = HttpResponse(&quot;Hello World&quot;)
(Pdb) n
&gt; /home/.../djdebug/views.py(18)hello()
-&gt; return response
(Pdb) dir(response)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_charset', '_container', '_convert_to_ascii', '_get_content', '_headers', '_is_string', '_set_content', 'close', 'content', 'cookies', 'delete_cookie', 'flush', 'get', 'has_header', 'items', 'next', 'set_cookie', 'status_code', 'tell', 'write']
(Pdb) response.content
'Hello World'
(Pdb) response.content = 'Django debugado'
(Pdb) c
</pre>
<p>Como podemos verificar, o pdb<a href="http://docs.python.org/library/pdb.html">[3]</a> fornece um shell do Python<a href="http://www.python.org/">[2]</a> você pode executar <code>dir</code>, verificar valores de variáveis e até mudar conteúdo de variáveis (poder e perigo andando juntos), por fim executamos <code>c</code> (de <em>continue</em>, para continuar a execução), veja o resultado no seu navegador, a mensagem <code>"Hello World"</code> foi trocada por <code>"Django debugado"</code>.</p>
<p>Recomendo a leitura do paper &#8220;Debugging in Python&#8221;<a href="http://www.ferg.org/papers/debugging_in_python.html">[4]</a> para mais alguns detalhes do pdb<a href="http://docs.python.org/library/pdb.html">[3]</a>. É muito interessante saber &#8220;brincar&#8221; com o shell do Python e do Django, com essas ferramentas fica mais fácil rastrear o chato do bug.</p>
<p>[1] -<a href="http://www.djangoproject.com/"> http://www.djangoproject.com/</a><br />
[2] &#8211; <a href="http://www.python.org/">http://www.python.org/</a><br />
[3] &#8211; <a href="http://docs.python.org/library/pdb.html">http://docs.python.org/library/pdb.html</a><br />
[4] &#8211; <a href="http://www.ferg.org/papers/debugging_in_python.html">http://www.ferg.org/papers/debugging_in_python.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/debugando-no-django/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>django-registration faciltando o cadastro de usuários</title>
		<link>http://blog.danilocabello.com/arquivo/django-registration-faciltando-o-cadastro-de-usuarios/</link>
		<comments>http://blog.danilocabello.com/arquivo/django-registration-faciltando-o-cadastro-de-usuarios/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 01:33:05 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=305</guid>
		<description><![CDATA[Estava procurando por uma forma de bloquear e-mails duplicados no django.contrib.auth[1], eis que encontro o projeto &#8220;plugável&#8221; django-registration[2] que não só implementa essa funcionalidade como e-mails de confirmação e a confirmação ainda expira conforme um número de dias definido nas suas settings.py.
A aplicação é muito completa, possui testes e exige o mínimo de conhecimento em [...]]]></description>
			<content:encoded><![CDATA[<p>Estava procurando por uma forma de bloquear e-mails duplicados no <code>django.contrib.auth</code><a href="http://docs.djangoproject.com/en/dev/topics/auth/#topics-auth">[1]</a>, eis que encontro o projeto &#8220;plugável&#8221; <code>django-registration</code><a href="http://bitbucket.org/ubernostrum/django-registration/">[2]</a> que não só implementa essa funcionalidade como e-mails de confirmação e a confirmação ainda expira conforme um número de dias definido nas suas <code>settings.py</code>.</p>
<p>A aplicação é muito completa, possui testes e exige o mínimo de conhecimento em Django que é saber criar templates. Ao baixar a aplicação eu pensei que iria ter que adaptar um monte de coisa para se encaixar na minha aplicação, que nada, a aplicação está no limite da plugabilidade que o Django investe.</p>
<p>Give a try.</p>
<p>[1] &#8211; <a href="http://docs.djangoproject.com/en/dev/topics/auth/#topics-auth">http://docs.djangoproject.com/en/dev/topics/auth/#topics-auth</a><br />
[2] &#8211; <a href="http://bitbucket.org/ubernostrum/django-registration/">http://bitbucket.org/ubernostrum/django-registration/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/django-registration-faciltando-o-cadastro-de-usuarios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scripts Python com optparse</title>
		<link>http://blog.danilocabello.com/arquivo/scripts-python-com-optparse/</link>
		<comments>http://blog.danilocabello.com/arquivo/scripts-python-com-optparse/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 22:09:25 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=290</guid>
		<description><![CDATA[Dica rápida, se você costuma usar Python para fazer scripts e toda vez que vai reutilizar um deles tem que olhar o código fonte pra lembrar como usar, você precisa conhecer o optparse[1].
Dê uma olhada na documentação[1], que é bem completa e no exemplo abaixo, para ver o quão prático é utilizar este módulo.

def fatorial(n):
 [...]]]></description>
			<content:encoded><![CDATA[<p>Dica rápida, se você costuma usar Python para fazer scripts e toda vez que vai reutilizar um deles tem que olhar o código fonte pra lembrar como usar, você precisa conhecer o optparse[1].</p>
<p>Dê uma olhada na documentação[1], que é bem completa e no exemplo abaixo, para ver o quão prático é utilizar este módulo.</p>
<pre class="brush: python;">
def fatorial(n):
    resultado = 1
    while n &gt; 0:
        resultado = n*resultado
        n -= 1
    return resultado

if __name__ == '__main__':
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option('-a', '--arquivo',
                      dest='arquivo', help='arquivo com os fatoriais desejados')
    parser.add_option('-v', '--valor', type='int',
                      dest='valor', help='valor a ser calculado')
    (options, args) = parser.parse_args()

    if options.valor and options.arquivo:
        parser.error(&quot;opcoes -v e -a sao mutualmente exclusivas&quot;)
    elif options.valor:
        print &quot;fatorial(%s) = %s&quot; % (options.valor, fatorial(options.valor))
    elif options.arquivo:
        for linha in open(options.arquivo):
            linha = int(linha)
            print &quot;fatorial(%s) = %s&quot; % (linha, fatorial(linha))
    else:
        parser.error(&quot;nenhuma opcao foi escolhida, execute com -h para ajuda&quot;)
</pre>
<p>[1] &#8211; <a href="http://docs.python.org/library/optparse.html">http://docs.python.org/library/optparse.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/scripts-python-com-optparse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ambiente Alice</title>
		<link>http://blog.danilocabello.com/arquivo/ambiente-alice/</link>
		<comments>http://blog.danilocabello.com/arquivo/ambiente-alice/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 18:20:11 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[unicamp]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/?p=279</guid>
		<description><![CDATA[Através da discliplina MC750, foi indicada a análise do ambiente de programação Alice (www.alice.org). Trata-se de uma aplicação destinada ao desenvolvimento de animações, focada ao aprendizado.
Acessando-se o site do programa, o acesso ao download é simples, embora o arquivo baixado não seja um instalador, sendo o aplicativo pronto para o uso. Sem uma instalação, a [...]]]></description>
			<content:encoded><![CDATA[<p>Através da discliplina MC750, foi indicada a análise do ambiente de programação Alice (<a href="http://www.alice.org/">www.alice.org</a>). Trata-se de uma aplicação destinada ao desenvolvimento de animações, focada ao aprendizado.</p>
<p>Acessando-se o site do programa, o acesso ao download é simples, embora o arquivo baixado não seja um instalador, sendo o aplicativo pronto para o uso. Sem uma instalação, a criação de atalhos para o uso deve ser feita manualmente, o que dificulta o uso para os mais leigos.</p>
<p><img class="alignleft size-medium wp-image-278" src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/07/inicio3-300x225.jpg" alt="inicio" width="300" height="225" />As primeiras informações que se tem ao iniciar o programa nos dizem a respeito de tutoriais &#8211; altamente recomendados, já que o programa dá a impressão de ter mais opções do que se saiba mexer.  Iniciando-se o primeiro tutorial, temos os passos básicos da aplicação, sendo exibidos de forma clara, e as opções não usadas no momento não são acessíveis, facilitando a aprendizagem.</p>
<p><img class="alignleft size-medium wp-image-284" src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/07/nao-clique-no-next1-300x225.jpg" alt="nao clique no next" width="300" height="225" />Os tutoriais são simples e bem informativos.  Seguindo-se passo a passo por uma série de ferramentas,  não há muito onde errar.</p>
<p>Embora algumas orientações possam ser mal implementadas, de forma que a opção selecionada não é a requerida. Neste caso, o tutorial pára, mesmo que você saiba que fez o que é certo.</p>
<p><img class="alignleft size-medium wp-image-285" src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/07/backup3-300x225.jpg" alt="backup" width="300" height="225" />Neste caso, a saída parece “forçar” o tutorial a continuar, clicando-se no Next na parte superior da tela (mesmo este aparentando não ser acessível). Isso se apresenta com pouca freqüência, nos quatro tutoriais disponíveis.</p>
<p><img class="alignleft size-medium wp-image-286" src="http://blog.danilocabello.com/index.php?feedimage=wp-content/uploads/2009/07/programa1-300x225.jpg" alt="programa" width="300" height="225" />Cumprindo os tutoriais, tentamos caminhar por conta própria dentro do programa, embora o excesso de informações disponível ainda seja um pouco confuso. Mesmo assim, com certa facilidade as animações podem ser montadas, embora se encontre limitações, sendo essas do próprio programa ou porque não se sabe como resolvê-las – não há um arquivo de ajuda, só animações pré-prontas, onde se poderia verificar a existência de novas funcionalidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/ambiente-alice/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interface é mais do que interface</title>
		<link>http://blog.danilocabello.com/arquivo/interface-e-mais-do-que-interface/</link>
		<comments>http://blog.danilocabello.com/arquivo/interface-e-mais-do-que-interface/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 00:03:36 +0000</pubDate>
		<dc:creator>Danilo Cabello</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://blog.danilocabello.com/arquivo/interface-e-mais-do-que-interface/</guid>
		<description><![CDATA[O conceito de interfaces vai além da relação homem-máquina. As interfaces estão presentes em tudo que possui mais de um componente formador: porca-parafuso, porta-parede, calçado-pé. Diferentes interfaces proporcionam usos distintos, mas não necessariamente distintos semanticamente. Nota-se que, como em interfaces computacionais, o objetivo é permitir sempre ao usuário máxima transparência do sistema que opera por [...]]]></description>
			<content:encoded><![CDATA[<p>O conceito de interfaces vai além da relação homem-máquina. As interfaces estão presentes em tudo que possui mais de um componente formador: porca-parafuso, porta-parede, calçado-pé. Diferentes interfaces proporcionam usos distintos, mas não necessariamente distintos semanticamente. Nota-se que, como em interfaces computacionais, o objetivo é permitir sempre ao usuário máxima transparência do sistema que opera por baixo e proporcionar uso agradável do objeto/ferramenta.</p>
<div class="wp-caption alignleft" style="width: 310px"><img src="../wp-content/uploads/2009/07/PARAFUSOPARAFERRAMENTAINTERCAMBIAVEL-300x246.jpg" alt="PARAFUSOPARAFERRAMENTAINTERCAMBIAVEL" width="300" height="246" /><p class="wp-caption-text">Iguais quanto ao uso, diferentes quanto a forma</p></div>
<p>Dentro do próprio ramo computacional, as interfaces estão presentes em áreas completamente distintas. Um circuito integrado deve ser visto como uma caixa preta pelo resto do sistema, que age nesta abordagem como o usuário ou cliente dos serviços oferecidos por tal módulo. Saindo do baixo para o alto nível encontramos as telas touch e hologramas fisicamente manuseáveis, que são duas tecnologias até a pouco tidas como futuristas mas que atualmente tornaram-se quotidianas.</p>
<p>Mais incrível ainda é notar que tais interfaces inovadoras – sejam programas ou físicas – não estão mais confinadas ao computador pessoal (desktop ou laptop), o que obrigava a forma de apresentação da interface estar adaptada ao equipamento. Hoje a situação se inverteu. Primeiro temos a definição do tipo de interface adequada para uma dada aplicação e daí os hardwares são desenvolvidos de forma a oferecer recurso computacional para aquela demanda. Tal tratamento do objetivo inovador fornece recursos para aquela que se mostra a área mais carente em termos tecnológicos: a acessibilidade. Indubitavelmente a sociedade tem sido omissa – e não raras vezes preconceituosa – com o tratamento daqueles que não possuem as mesmas capacidades da maioria dos homens.</p>
<p>Interessante saber que é justamente no atendimento dessas minorias que o design de interfaces se mostra mais promissor. A capacidade da máquina de interpretação de gestos, fala e escrita em braile fornece um mundo de informação e interatividade para tais usuários. Na verdade, os transforma em usuários, já desde muito tempo eles não tecnologicamente inclusos.</p>
<p>Por Plínio Sandes dos Santos</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocabello.com/arquivo/interface-e-mais-do-que-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
