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

<channel>
	<title>Suspensão de Descrença</title>
	<atom:link href="http://suspensaodedescrenca.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://suspensaodedescrenca.wordpress.com</link>
	<description>Uma chance para perder a fé no computador</description>
	<lastBuildDate>Thu, 17 Sep 2009 23:59:22 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='suspensaodedescrenca.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/d43a967d5d64b0f657f37ead8069ed96?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Suspensão de Descrença</title>
		<link>http://suspensaodedescrenca.wordpress.com</link>
	</image>
			<item>
		<title>Congelamento de disco rígido</title>
		<link>http://suspensaodedescrenca.wordpress.com/2009/09/17/congelamento-de-disco-rigido/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2009/09/17/congelamento-de-disco-rigido/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 23:59:22 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Bug]]></category>
		<category><![CDATA[Causo]]></category>
		<category><![CDATA[Gambiarra]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Congelamento]]></category>
		<category><![CDATA[Disco Rígido]]></category>
		<category><![CDATA[Hard Disk]]></category>
		<category><![CDATA[HD]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=93</guid>
		<description><![CDATA[Afirma a lenda que, se seu disco rígido parar de funcionar, você ainda terá a oportunidade de recuperar dados importantes congelando-o. Mas será verdade?
Tive a oportunidade de conferir. Depois de três dias trabalhando, fui tentar enviar minhas alterações de um projeto ao Subversion. O servidor estava fora do ar, mas não era um grande problema: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=93&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Afirma a lenda que, se seu disco rígido parar de funcionar, você ainda terá a oportunidade de recuperar dados importantes <em>congelando-o</em>. Mas será verdade?</p>
<p>Tive a oportunidade de conferir. Depois de três dias trabalhando, fui tentar enviar minhas alterações de um projeto ao Subversion. O servidor estava fora do ar, mas não era um grande problema: eu poderia enviar as alterações no dia seguinte. Chego no dia seguinte no trabalho para enviar os dados e&#8230; bem, o HD da minha máquina havia.</p>
<div id="attachment_97" class="wp-caption alignright" style="width: 235px"><a href="http://suspensaodedescrenca.files.wordpress.com/2009/08/sdc11609.jpg"><img class="size-medium wp-image-97" title="Disco rígido após congelametno" src="http://suspensaodedescrenca.files.wordpress.com/2009/08/sdc11609.jpg?w=225&#038;h=300" alt="Fria: um de nós dois teria de entrar em uma" width="225" height="300" /></a><p class="wp-caption-text">Fria: um de nós dois teria de entrar em uma</p></div>
<p>Depois de dias tentando recuperar os dados do HD, desisti. Seria mais fácil reescrever tudo o que eu havia feito, pelo visto. Já aceitando meu destino, fui fazer outras tarefas.</p>
<p>Algum tempo depois, encontro um amigo meu. Aproveito, conto minha história desinteressadamente, como uma curiosidade. Meu amigo me pergunta:</p>
<blockquote><p>Já tentou congelar o HD?</p></blockquote>
<p>Já havia ouvido falar desta <em>técnica</em>. Se o seu disco rígido parou de funcionar. tente colocá-lo no congelador. Esse meu amigo sempre garantiu que o truque funcionava, mas nunca vi ninguém fazê-lo&#8230;</p>
<p>Pois bem, como pior não poderia ficar, resolvi tentar. Peguei o HD, embrulhei-o muito bem em uma sacola plástica, pus no congelador e saí para trabalhar em outro projeto, em outro lugar.</p>
<p>Ao final da tarde, voltei à empresa. Tirei o disco rígido do congelador, coloquei-o no <em>notebook</em> e liguei a máquina com um CD do Ubuntu. Quando fui ver&#8230; funcionou! Consegui acessar meus arquivos, e os copiei para outra máquina com <code>scp</code>!</p>
<p>Se você for tentar fazer isso algum dia, tome cuidado de embrulhar muito bem o disco, para que não molhe. Note que isto provavelmente não deve funcionar sempre&#8230; mas funcionou uma vez, isto posso garantir!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/93/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=93&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2009/09/17/congelamento-de-disco-rigido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>

		<media:content url="http://suspensaodedescrenca.files.wordpress.com/2009/08/sdc11609.jpg?w=225" medium="image">
			<media:title type="html">Disco rígido após congelametno</media:title>
		</media:content>
	</item>
		<item>
		<title>Fazendo DMA funcionar no Debian/Ubuntu</title>
		<link>http://suspensaodedescrenca.wordpress.com/2009/02/21/fazendo-dma-funcionar-no-debianubuntu/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2009/02/21/fazendo-dma-funcionar-no-debianubuntu/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 22:23:32 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Bug]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Disco Rígido]]></category>
		<category><![CDATA[DMA]]></category>
		<category><![CDATA[Lentidão]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=76</guid>
		<description><![CDATA[Até o meio do ano passado, meu computador era um Athlon XP 2.3 GHz com 128 MB de memória e 40 GB de HD. Fraquinho, mas funcionava até bem. Eu continuaria utilizando-o cotidianamente se não tivesse de utilizar o OpenOffice.org e o Eclipse. Além disso, estava querendo brincar com outros sistemas operacionais, e preferia virtualizá-los. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=76&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Até o meio do ano passado, meu computador era um Athlon XP 2.3 GHz com 128 MB de memória e 40 GB de HD. Fraquinho, mas funcionava até bem. Eu continuaria utilizando-o cotidianamente se não tivesse de utilizar o OpenOffice.org e o Eclipse. Além disso, estava querendo brincar com outros sistemas operacionais, e preferia virtualizá-los. Isso obviamente era inviável na máquina antiga.</p>
<p>Vendo que não havia mais para onde escapar, comprei outro computador. O computador era de um amigo meu, tinha 80 GB de HD, 1 GB de memória, gravadora de DVD e uma placa GForce 2200, ou algo assim. É uma máquina ótima para meus objetivos. Formatei as partições, instalei um Debian e configurei a máquina.</p>
<p>Notei, porém, que o computador estava bastante lento, muito mais lento que minha máquina antiga. Depois de pesquisar, descobri que era um problema com o HD e DMA. O <em>syslog</em> estava cheio de mensagens como:</p>
<blockquote><p><code>Apr 8 00:17:41 localhost kernel: ide: failed opcode was: unknown<br />
Apr 8 00:17:47 localhost kernel: hda: status timeout: status=0xd0 { Busy }<br />
Apr 8 00:17:47 localhost kernel:<br />
Apr 8 00:17:47 localhost kernel: ide: failed opcode was: unknown<br />
Apr 8 00:17:47 localhost kernel: hdb: DMA disabled<br />
Apr 8 00:17:47 localhost kernel: hda: drive not ready for command<br />
Apr 8 00:17:47 localhost kernel: ide0: reset: success<br />
Apr 8 00:14:07 localhost kernel: hdb: dma_timer_expiry: dma status == 0x41<br />
Apr 8 00:14:07 localhost kernel: hdb: DMA timeout error<br />
Apr 8 00:14:07 localhost kernel: hdb: dma timeout error: status=0x58 { DriveReady SeekComplete DataRequest }</code></p></blockquote>
<p>Aparentemente, havia algum erro ao carregar os módulos do DMA. Pesquisando sobre o problema, vi sugestões para verificar a saída do comando <code>hdparm -i /dev/hda</code>. O resultado foi algo como:</p>
<blockquote><p><code>/dev/hda:</code><br />
<code> </code><br />
<code>Model=SAMSUNG SP0802N, FwRev=TK100-24, SerialNo=S00JJ10XB83245<br />
Config={ HardSect NotMFM HdSw&gt;15uSec Fixed DTR&gt;10Mbs }<br />
RawCHS=16383/16/63, TrkSize=34902, SectSize=554, ECCbytes=4<br />
BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=off<br />
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=156365903<br />
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}<br />
PIO modes:  pio0 pio1 pio2 pio3 pio4<br />
DMA modes:  mdma0 mdma1 mdma2<br />
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5<br />
AdvancedPM=no WriteCache=enabled<br />
Drive conforms to: ATA/ATAPI-7 T13 1532D revision 0:  ATA/ATAPI-1,2,3,4,5,6,7</code><br />
<code> </code><br />
<code>* signifies the current active mode</code></p></blockquote>
<p>Em resumo, a linha</p>
<blockquote><p><code>UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5</code></p></blockquote>
<p>indicava que o módulo do DMA estava carregado! O que, então, estava dando errado?</p>
<p>Em uma breve pesquisa no Google, encontrei <a title="strange problem with DMA [Archive] - Ubuntu forums" href="http://ubuntuforums.org/archive/index.php/t-24634.html">essa <em>thread</em></a> nos <em>Ubuntu Forums</em>. Nela, alguem sugere verificar se o HD estava configurado para<em> Master</em> ao invés de <em>Cable Select</em>. Meu HD já estava jumpeado e cabeado como <em>Master</em>. Todas as outras soluções que encontrei não funcionaram para ninguém &#8211; inclusive, não funcionavam para mim. O que fazer?</p>
<p>Pois bem, em um experimento, eu coloquei o HD como <em>Secondary Master</em>; antes, reconfigurei o GRUB para que o <em>root</em> do <em>kernel</em> passasse a ser <code>/dev/hdc1</code> e editei o <code>/etc/fstab</code> trocando <code>/dev/hda</code> por <code>/dev/hdc</code> (e vice-versa). Liguei a máquina e&#8230; <em>Voi là</em>! O problema sumiu!</p>
<p>Hoje, porém, fui tentar configurar o HD como <em>Primary Master</em> e pesquisar por uma solução menos estranha. Infelizmente, tive novamente o mesmo problema com DMA, não importasse o que eu fizesse. Desisti e voltei o HD para <em>Secondary Master</em> &#8211; afinal, estava só explonrando possibilidades. Quando reinicio a máquina, o erro de DMA reaparece, agora com o HD como <em>Secondary Master</em>! Desligo então a máquina, tiro e recoloco o cabo <em>flat</em> no HD e reinicio a máquina. <em>Voi là</em>!<sup>2</sup> o problema foi resolvido novamente.</p>
<p>Então, se você está tendo esse problema, tente tirar e recolocar o cabo <em>flat</em>, que pode estar frouxo. Se isso não funcionar, dá uma olhada na <a title="strange problem with DMA [Archive] - Ubuntu forums" href="http://ubuntuforums.org/archive/index.php/t-24634.html"><em>thread</em></a> citada, que ela tem boas dicas. Entretanto, se ela não te ajudar, tente colocar o HD como <em>Secondary Slave</em> (ou como <em>Master Slave</em>, se já estiver como <em>Secondary </em><em>Slave</em>). Vai que funciona, não é?</p>
<p>HTH. Até mais!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=76&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2009/02/21/fazendo-dma-funcionar-no-debianubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>Dividindo uma imagem em várias páginas com ImageMagick</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/11/19/dividindo-uma-imagem-em-varias-paginas-com-imagemagick/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/11/19/dividindo-uma-imagem-em-varias-paginas-com-imagemagick/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 23:29:05 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[ImageMagick]]></category>
		<category><![CDATA[Lena Söderberg]]></category>
		<category><![CDATA[Processamento de Imagens]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=40</guid>
		<description><![CDATA[Esses dias, um amigo me pergunta no Google Talk:
duvida de linux
tenho uma imagem
bem grande
e quero que ela seja impressa
em varias paginas
tipo um pedaco numa pagina
outro pedaco em outra
(Antes de prosseguir, uma nota: uma imagem nos formatos JPEG, PNG etc. não possui um tamanho, mas sim uma resolução. Assim, você pode exibir a imagem em qualquer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=40&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Esses dias, <a title="Thiago Mata" href="http://thiagomata.blogspot.com/">um amigo</a> me pergunta no <a title="Google Talk - Chat online and make free Internet calls" href="http://www.google.com/talk/">Google Talk</a>:</p>
<blockquote><p>duvida de linux<br />
tenho uma imagem<br />
bem grande<br />
e quero que ela seja impressa<br />
em varias paginas<br />
tipo um pedaco numa pagina<br />
outro pedaco em outra</p></blockquote>
<p>(Antes de prosseguir, uma nota: uma imagem nos formatos JPEG, PNG etc. não possui um <em>tamanho</em>, mas sim uma <em>resolução</em>. Assim, você pode exibir a imagem em qualquer tamanho, mas a resolução provavelmente vai impor limites à qualidade da imagem. Do mesmo modo, uma imagem de, digamos 1900 x 1200 <em>pixels</em> não tem um tamanho definido, mas sim uma resolução, e pode ser impressa tanto numa folha A3, folha A4 ou qualquer outra, variando apenas a qualidade da impressão.)</p>
<p>Quando alguém me fala de processar imagens no Linux, a primeira coisa que me vem a mente é a suíte <a title="Convert, Edit, and Compose Images" href="http://www.imagemagick.org/script/index.php">ImageMagick</a>. Entre as ferramentas do ImageMagick, a que mais uso é o <a title="convert" href="http://www.imagemagick.org/script/convert.php"><code>convert</code></a>, um programa de linha de comando que permite executar inúmeras operações sobre imagens, como converter de formato, redimensionar, gerar negativo, extrair um pedaço etc. etc.</p>
<p>A minha abordagem seria, então, dividir a imagem em pequenas imagens contíguas e retangulares. Para imprimir numa folha A4, por exemplo, as pequenas imagens deveriam ter proporções de uma folha A4. Como fazer isso?</p>
<p>O primeiro passo é descobrir como recuperar um retângulo de uma imagem. Isto é bem simples com o <code>convert</code>, basta utilizar a opção <a title="-crop" href="http://www.imagemagick.org/script/command-line-options.php#crop"><code>-crop</code></a>. Para nossa missão, nós usaremos essa opção com uma <em>string</em> na forma</p>
<blockquote><p><code><em>&lt;width&gt;</em>x<em>&lt;height&gt;</em>+<em>&lt;x&gt;</em>+<em>&lt;y&gt;</em></code></p></blockquote>
<p>onde <code><em>&lt;width&gt;</em></code> é a largura da imagem resultante, em <em>pixels</em>; <code><em>&lt;height&gt;</em></code> é a altura da imagem resultante, em <em>pixels</em>; <code><em>&lt;x&gt;</em></code> e <code><em>&lt;y&gt;</em></code> são as coordenadas do <em>pixel</em> a partir de onde a imagem será cortada. Desse modo, se quisermos extrair um retângulo de 100 x 100 <em>pixels</em> de uma figura no arquivo <code>lena.png</code> de 512 x 512 <em>pixels</em> a partir do centro, faríamos algo como</p>
<blockquote><p><code>convert -crop 100x100+256+256 lena.png output.png</code></p></blockquote>
<p>Se a imagem for essa:</p>
<div id="attachment_41" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.cs.cmu.edu/~chuck/lennapg/"><img class="size-full wp-image-41" title="Lena Söderberg" src="http://suspensaodedescrenca.files.wordpress.com/2008/11/lena.png?w=450&#038;h=450" alt="Lena Söderberg, SFW" width="450" height="450" /></a><p class="wp-caption-text">Lena Söderberg, SFW</p></div>
<p>o resultado do comando acima será:</p>
<div id="attachment_42" class="wp-caption aligncenter" style="width: 110px"><a href="http://suspensaodedescrenca.files.wordpress.com/2008/11/output.png"><img class="size-full wp-image-42" title="Lena Söderberg, a partir do centro" src="http://suspensaodedescrenca.files.wordpress.com/2008/11/output.png?w=100&#038;h=100" alt="Resultado do corte da imagem" width="100" height="100" /></a><p class="wp-caption-text">Resultado do corte da imagem</p></div>
<p>(Note que a opção <code>-crop</code> pode ser utilizada de outras maneiras. Confira na <a title="-crop" href="http://www.imagemagick.org/script/command-line-options.php#crop">documentação da opção</a>.)</p>
<p>Agora, precisamos gerar várias imagens a partir da primeira. Para não ficar fazendo isso na mão, podemos usar o comando <code>for</code> junto com o comando <code>seq</code>. (Se você não sabe usar o comando <code>for</code> e o comando <code>seq</code> do <em>bash</em>, <a href="http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html">essa página</a> explica muito bem como funcionam.) Desse modo, se eu quisesse dividir a imagem da Lena acima em retângulos de 100 x 200 <em>pixels</em>, eu faria algo como:</p>
<blockquote>
<pre>for i in `seq 0 $((512/100))`; do
    for j in `seq 0 $((512/200))`; do
        convert -crop 100x200+$((i*100))+$((j*200)) \
            lena.png lena-$j-$i.png
    done
done</pre>
</blockquote>
<p>Estou dividindo a imagem numa planilha de imagens. Para cada linha, eu vou gerar 512/100 +1 = 6 imagens; para cada coluna, eu vou gerar 512/200 +1 = 3 imagens. (Se você não entendeu o &#8220;+1&#8243;, lembre-se que estamos contando <em>a partir de zero</em>, como em C, Java etc). A primeira imagem será o retângulo que vai do <em>pixel </em>de coordenada (0, 0) até o <em>pixel</em> de coordenada (100, 200); a segunda imagem irá do <em>pixel</em> de coordenada (100, 0) até o <em>pixel</em> de coordenada (200, 200); do mesmo modo, a primeira imagem da linha abaixo irá do <em>pixel</em> de coordenada (0, 200) até o <em>pixel</em> de coordenada (100, 400) etc. etc., contando as coordenadas a partir do canto superior esquerdo.</p>
<p>Ao rodar isso, gerei dezoito imagens. O resultado, que uni em uma imagem só por praticidade, pode ser visto abaixo. As linhas brancas separam as imagens geradas.</p>
<div id="attachment_45" class="wp-caption aligncenter" style="width: 460px"><a href="http://suspensaodedescrenca.files.wordpress.com/2008/11/lenna-splitted.png"><img class="size-full wp-image-45" title="As linhas brancas separam as imagens que foram geradas" src="http://suspensaodedescrenca.files.wordpress.com/2008/11/lenna-splitted.png?w=450&#038;h=431" alt="A borda branca separa as inúmeras imagens que foram geradas" width="450" height="431" /></a><p class="wp-caption-text">Lena, dividida</p></div>
<p>(Note como o <code>convert</code>, ao encontrar um retângulo com um pedaço vazio, gera a maior figura possível. Isso pode ser notado nas bordas direita e inferior.)</p>
<p>Vamos generalizar o algoritmo. Faremos um <em>script</em> que recebe como parâmetro as dimensões originais do arquivo, as dimensões das imagens a serem geradas e o nome do arquivo original. O resultado será algo como</p>
<blockquote>
<pre>file=$1
originalx=$2
originaly=$3
slicex=$4
slicey=$5
numberx=$((originalx/slicex))
numbery=$((originaly/slicey))

for i in `seq 0 $numberx`; do
  for j in `seq 0 $numbery`; do
    convert -crop ${slicex}x${slicey}+$((i*slicex))+$((j*slicey)) \
        $file $file-$j-$i.png
  done
done</pre>
</blockquote>
<p>Agora, é só rodar o <em>script</em> dando como argumentos as dimensões originais e algumas dimensões proporcionais ao papel que queremos utilizar. Obteremos imagens que caberão perfeitamente no papel. (Vale lembrar que uma imagem não tem um tamanho em si, mas uma resolução: a qualidade final pode não ficar muito boa, dependendo da resolução da sua imagem.)</p>
<p>Para facilitar o trabalho, vamos juntar todas as imagens em um único arquivo PDF, o que facilitaria a impressão. O <code>convert</code> do ImageMagick pode fazer isso de maneira bem simples: se invocarmos o  <code>convert</code> passando como parâmetro uma série de imagens e, ao final, o nome de um arquivo com extensão <code>.pdf</code>, o resultado será um arquivo PDF com uma imagem por página. Assim sendo, ao chamar algo como</p>
<blockquote><p><code>convert fig1.png fig2.png fig3.png one-per-page.pdf</code></p></blockquote>
<p><code>one-per-page.pdf</code> vai conter, ao vai conter, ao final, três páginas. Na primeira, estará <code>fig1.png</code>; na segunda, teremos <code>fig2.png</code> e, na terceira página, estará <code>fig3.png</code>.</p>
<p>Assim, vamos complementar o <em>script</em> criando uma variável que armazena o nome de todos os arquivos gerados (separados por um espaço em branco). Após gerar todas as imagens, vamos colocá-las todas em um arquivo PDF. O <em>script</em> final, você pode vê-lo no <a title="Bash pastebin - collaborative debugging tool" href="http://pastebin.com/f55dad818">pastebin</a>.</p>
<p>Eu apliquei o <em>script</em> sobre nossa imagem, usando as dimensões proporcionais a papel <a title="A4 (tamanho de papel) - Wikipédia, a enciclopédia livre" href="http://pt.wikipedia.org/wiki/A4_(tamanho_de_papel)">A4</a> (210 x 297 mm):</p>
<blockquote><p><code> ./split.sh lena.png 512 512 210 297</code></p></blockquote>
<p>O resultado pode ser encontrado <a title="lena.png.pdf" href="http://brandizzi.googlepages.com/lena.png.pdf">aqui</a>. As páginas acabaram em formato A7, mas, se mandar imprimir, elas preencherão toda a folha A4 sem problemas.</p>
<p>O <em>script</em> está disponível para quem quiser fazer qualquer uso dele. Ademais, pode ser melhorado: é possível, por exemplo, fazer com que o ImageMagick descubra ele mesmo as dimensões iniciais da imagem. Entretanto, acredito que ele já possa ser bem útil</p>
<p>Obrigado, Renan Mendes, pela dica sobre como gerar PDFs. A todos, até mais!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/40/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=40&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/11/19/dividindo-uma-imagem-em-varias-paginas-com-imagemagick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>

		<media:content url="http://suspensaodedescrenca.files.wordpress.com/2008/11/lena.png" medium="image">
			<media:title type="html">Lena Söderberg</media:title>
		</media:content>

		<media:content url="http://suspensaodedescrenca.files.wordpress.com/2008/11/output.png" medium="image">
			<media:title type="html">Lena Söderberg, a partir do centro</media:title>
		</media:content>

		<media:content url="http://suspensaodedescrenca.files.wordpress.com/2008/11/lenna-splitted.png" medium="image">
			<media:title type="html">As linhas brancas separam as imagens que foram geradas</media:title>
		</media:content>
	</item>
		<item>
		<title>Módulos do VirtualBox no Debian Lenny</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/11/12/modulos-do-virtualbox-no-debian-lenny/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/11/12/modulos-do-virtualbox-no-debian-lenny/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 15:59:57 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Virtualização]]></category>
		<category><![CDATA[kernel Linux]]></category>
		<category><![CDATA[Módulos do Kernel]]></category>
		<category><![CDATA[Módulos do Linux]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=34</guid>
		<description><![CDATA[Eu estava tentando usar o VirtualBox no meu computador de casa, que roda Debian Lenny. No começo, até funcionou, mas o kernel Linux foi atualizado em algum momento, e os módulos do VirtualBox pararam de funcionar.
Instalei todos os módulos possíveis do repositório, mas o VirtualBox se recusava a funcionar. Procuro no Google alguma solução, e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=34&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Eu estava tentando usar o <a title="VirtualBox" href="http://www.virtualbox.org/">VirtualBox</a> no meu computador de casa, que roda <a title="Debian - O Sistema Operacional Universal" href="http://www.debian.org/">Debian</a> Lenny. No começo, até funcionou, mas o <em>kernel</em> Linux foi atualizado em algum momento, e os módulos do VirtualBox pararam de funcionar.</p>
<p>Instalei todos os módulos possíveis do repositório, mas o VirtualBox se recusava a funcionar. Procuro no Google alguma solução, e não encontro nada, exceto que devo recompilar os módulos. Eu realmente não estava disposto a fazer isso&#8230;</p>
<p>Entretanto, pesquisa vai, pesquisa vem, encontrei <a title="kernel modules and application do not match)" href="http://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg158926.html">uma solução melhor</a>. Envolve compilar os módulos também, mas de maneira mais &#8220;debiana&#8221;.</p>
<p>Para compilar os módulos, primeiro, atualize a referência aos pacotes com os repositorios:</p>
<blockquote><p><code># apt-get update</code></p></blockquote>
<p>Agora, atualize os pacotes instalados em sua máquina:</p>
<blockquote><p><code># apt-get upgrade</code></p></blockquote>
<p>Feito isso, instale o pacote com o código-fonte dos módulos do VirtualBox:</p>
<blockquote><p><code># apt-get install virtualbox-ose-source</code></p></blockquote>
<p>O pulo do gato é utilizar a ferramenta <em>module-assisant</em> para compilar o módulo. Uma vez que o código-fonte do módulo esteja instalado, basta executar:</p>
<blockquote><p><code># m-a a-i virtualbox-ose<br />
</code></p></blockquote>
<p>O <code>m-a</code> compila o módulo. A opção <code>a-i</code> diz ao <em>module-assistant </em>para instalar os módulos automaticamente.</p>
<p>Voilà! Seus módulos estão funcionando. No máximo, vai precisar carregar os módulos:</p>
<blockquote><p><code># modprobe vboxdrv</code></p></blockquote>
<p>Se isso resolver seu problema, agradeça ao Daniel Baumann lá do<em> e-mail</em>. Tudo bem que dizer que tudo isso é <em>óbvio</em> foi exagero dele, mas a ajuda valeu bastante <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=34&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/11/12/modulos-do-virtualbox-no-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>A Idéia mais Estúpida da Computação</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/10/10/a-ideia-mais-estupida-da-computacao/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/10/10/a-ideia-mais-estupida-da-computacao/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 01:52:11 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Causo]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[APT]]></category>
		<category><![CDATA[Cagada]]></category>
		<category><![CDATA[Erro]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=28</guid>
		<description><![CDATA[ Osvaldo Santana, o pythonista, postou no seu blog algumas &#8220;cagadas computacionais&#8221; que cometera. Lembrei-me de um causo interessante&#8230;
Meu primeiro emprego foi como servidor público, técnico administrativo na Universidade de Brasília. Era um emprego chato para mim, tecnocrata que sou, mas consegui escapar da chatice convencendo o pessoal a me deixar usar um Debian na [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=28&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a title="Pythonologia" href="http://pythonologia.org/"> Osvaldo Santana</a>, o <em>pythonista</em>, postou no seu <em>blog</em> algumas <a title="Pythonologia - “Cagadas” homéricas (ou YA-meme?)" href="http://pythonologia.org/2008/10/09/cagadas-homericas-ou-ya-meme/">&#8220;cagadas computacionais&#8221;</a> que cometera. Lembrei-me de um causo interessante&#8230;</p>
<p>Meu primeiro emprego foi como servidor público, técnico administrativo na Universidade de Brasília. Era um emprego chato para mim, tecnocrata que sou, mas consegui escapar da chatice convencendo o pessoal a me deixar usar um Debian na minha máquina &#8211; na época, um Debian Etch, ainda em testes.</p>
<p>Em casa, eu já usava Debian, mas não tinha conexão com a Internet, de modo que fiquei preso ao Debian Woody, GNOME 1.8 etc. etc. No trabalho, porém, eu tinha uma ótima conexão, então atualizava freqüentemente o sistema operacional. Foi minha primeira experiência mais interativa com o APT: antes, só utilizava para instalar pacotes dos sete CDs do Woody que eu tinha gravado.</p>
<p>Depois de um bom tempo usando Debian, enfrento meu primeiro inferno de dependências. Bem feito, quem mandou misturar <em>testing</em>, <em>unstable</em> e até <em>experimental</em>, né? De qualquer forma, entrei em desespero, porque aquela era minha máquina de trabalho e <em>tinha</em> de funcionar. Bato a cabeça, reinstalo pacote, tiro repositório, dou <code>apt-get update</code> pra cá, <code>apt-get dist-upgrade</code> para lá mas nada se resolve&#8230;</p>
<p>No desespero daquela sexta feira, tomo uma decisão drástica: vou desinstalar o APT! Lá vamos nós digitar o inacreditável comando:</p>
<blockquote><p><code>apt-get remove apt</code></p></blockquote>
<p>O Debian não gostou muito&#8230; A mensagem que recebi foi algo como:</p>
<blockquote><p><code>AVISO: Os pacotes essenciais a seguir serão removidos.<br />
Isso NÃO deveria ser feito a menos que você saiba exatamente o que você está fazendo!<br />
apt<br />
Depois desta operação, 30,1MB de espaço em disco serão liberados.<br />
Você está prestes a fazer algo potencialmente destrutivo.<br />
Para continuar digite a frase 'Sim, faça o que eu digo!'<br />
?]</code></p></blockquote>
<p>Bem, é realmente uma mensagem assustadora. Qualquer pessoa perceberia que desinstalar o APT não era só aparentemente uma idéia sem sentido, era um absurdo estúpido! Mas eu não sou qualquer pessoa! Como <em>sou brasileiro e não aprendo nunca</em>, vou lá e digito:</p>
<blockquote><p><code>Sim, faça o que eu digo!</code></p></blockquote>
<p>Depois de todo o trabalho sujo feito, vamos tentar <em>reinstalar</em> o APT. Bem, vocês podem imaginar que não, não consegui fazer isso. Quando vi que a opção <em>menos absurda</em> seria <em>recompilar</em> o APT, desisti: fiz <em>backup</em> dos documentos e reinstalei o Debian.</p>
<p>Pelo menos saí do inferno de dependências <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=28&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/10/10/a-ideia-mais-estupida-da-computacao/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>Tratamento de erros em C com goto</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/09/13/tratamento-de-erros-em-c/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/09/13/tratamento-de-erros-em-c/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 05:02:37 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Exceção]]></category>
		<category><![CDATA[goto]]></category>
		<category><![CDATA[Tratamento de Erro]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=17</guid>
		<description><![CDATA[Esses dias, começou-se a discutir na lista de discussão da Python Brasil razões para se utilizar exceções. Em um certo momento, um participante reconhecidamente competente comentou o quanto é difícil tratar erros através do retorno de funções, como em C.
Quando se tem um algoritmo complexo, cada operação passível de erro implica em uma série de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=17&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Esses dias, começou-se a discutir na lista de discussão da Python Brasil <a title="Porque usar exceções?" href="http://br.groups.yahoo.com/group/python-brasil/message/35063">razões para se utilizar exceções</a>. Em um certo momento, um participante reconhecidamente competente comentou <a title="Porque usar exceções?" href="http://br.groups.yahoo.com/group/python-brasil/message/35144">o quanto é difícil tratar erros através do retorno de funções, como em C</a>.</p>
<p>Quando se tem um algoritmo complexo, cada operação passível de erro implica em uma série de <code>if</code>s para verificar se a operação ocorreu corretamente. Se a operação tiver falhado, será necessário reverter todas as operações anteriores para sair do algoritmo sem alterar o estado do programa.</p>
<p>Vejamos um exemplo. Suponha que eu tenha a segunte <code>struct</code> para representar <em>arrays</em>:</p>
<blockquote>
<pre>typedef struct {
        int size;
        int *array;
} array_t;</pre>
</blockquote>
<p>Agora, eu vou fazer uma função que lê, de um arquivo texto, o número de elementos a ser posto em um desses <em>arrays</em> e, logo em seguida, os elementos. Essa função também vai alocar a <code>struct</code> do <em>array</em> e o <em>array de fato</em>. O problema é que essa função é bastante propensa a erros, pois podemos não conseguir</p>
<ul>
<li>abrir o arquvo dado;</li>
<li>alocar a <code>struct</code>;</li>
<li>ler o número de elementos do arquvo dado, seja por erro de entrada/saída, seja por fim do arquivo;</li>
<li>alocar memória para guardar os elementos a serem lidos;</li>
<li>ler um dos elementos, seja por erro de entrada/saída, seja por fim do arquivo.</li>
</ul>
<p>Complicado, né? Note que, se conseguirmos abrir o arquivo mas não conseguirmos alocar a <code>struct</code>, temos de fechar o arquivo; se conseguirmos abrir o arquivo e alocar a <code>struct</code> mas não conseguirmos ler o número de elementos do arquivo, temos de dealocar a <code>struct</code> e fechar o arquivo; e assim por diante. Assim sendo, se verificarmos todos os erros e adotarmos a tradição de, em caso de erro, retornar <code>NULL</code>, nossa função seria mais ou menos assim:</p>
<blockquote>
<pre>array_t *readarray(const char *filename) {
        FILE *file;
        array_t *array;
        int i;

        file = fopen(filename, "r");
        if (file == NULL) return NULL;

        array = malloc(sizeof(array_t));
        if (array == NULL) {
		fclose(file);
		return NULL;
	}

        if (fscanf(file, "%d", &amp;(array-&gt;size)) == EOF) {
		free(array);
		fclose(file);
		return NULL;
	}

        array-&gt;array = malloc(sizeof(int)*array-&gt;size);
        if (array-&gt;array == NULL)  {
		free(array);
		fclose(file);
		return NULL;
	}

        for (i = 0; i &lt; array-&gt;size; i++) {
                if (fscanf(file, "%d", array-&gt;array+i) == EOF) {
			free(array-&gt;array);
			free(array);
			fclose(file);
			return NULL;
		}
        }
        return array;
}</pre>
</blockquote>
<p>De fato, bastante trabalhoso, e com muito código repetido&#8230;</p>
<p>Note, porém, como há duas situações no código acima. Em uma, quando tenho duas operações para reverter, preciso reverter primeiro a última executada, e depois a anterior. Por exemplo, quando vou dealocar tanto a <code>struct</code> quanto o <em>array</em> de inteiros, preciso dealocar primeiro o <em>array</em> de inteiros e depois a <code>struct</code>. Se dealoco a <code>struct</code> primeiro. posso não conseguir dealocar o <em>array</em> posteriormente.</p>
<p>Na outra situação, a ordem não importa. Por exemplo, se vou dealocar a <code>struct</code> e fechar o arquivo, não importa em que ordem eu o faça. Isso implica que eu posso, também, reverter primeiro a última operação executada e depois a primeira operação.</p>
<p>Qual o sentido disso? Bem, na prática, nunca vi uma situação onde eu tenha de reverter primeiro a primeira operação executada, depois a segunda e assim por diante. Isso significa que, quando faço as operações <code>a()</code>, <code>b()</code>, <code>c()</code> etc. a maneira &#8220;natural&#8221; de revertê-las é chamando os reversores de trás para frente, mais ou menos como:</p>
<blockquote><p><code>a();<br />
b();<br />
c();<br />
/* ... */<br />
revert_c();<br />
revert_b();<br />
revert_a();</code></p></blockquote>
<p>Agora, vem o pulo do gato. No código acima, após cada operação, vamos colocar um <code>if</code> para verificar se ela falhou ou não. Se falhou, executar-se-á um <code>goto</code> para o reversor da última operação bem sucedida:</p>
<blockquote><p><code>a();<br />
if (failed_a()) goto FAILED_A;<br />
b();<br />
if (failed_b()) goto FAILED_B;<br />
c();<br />
if (failed_c()) goto FAILED_C;<br />
/* ... */<br />
revert_c();<br />
FAILED_C:<br />
revert_b();<br />
FAILED_B:<br />
revert_a();<br />
FAILED_A:<br />
return;</code></p></blockquote>
<p>Se  <code>a()</code> falhar, o algoritmo retorna; se  <code>b()</code> falhar, o algoritmo vai para <code> FAILED_B:</code>, reverte  <code>a()</code> e retorna; se <code>c()</code> falhar, o algoritmo vai para <code> FAILED_C</code>, reverte <code>b()</code>, reverte  <code>a()</code> e retorna. Consegue ver o padrão?</p>
<p>Pois bem, se aplicarmos esse padrão à nossa função <code>readarray()</code> o resultado será algo como:</p>
<blockquote>
<pre>array_t *readarray(const char *filename) {
        FILE *file;
        array_t *array;
        int i;

        file = fopen(filename, "r");
        if (file == NULL) goto FILE_ERROR;

        array = malloc(sizeof(array_t));
        if (array == NULL) goto ARRAY_ALLOC_ERROR;

        if (fscanf(file, "%d", &amp;(array-&gt;size)) == EOF)
                goto SIZE_READ_ERROR;

        array-&gt;array = malloc(sizeof(int)*array-&gt;size);
        if (array-&gt;array == NULL) goto ARRAY_ARRAY_ALLOC_ERROR;

        for (i = 0; i &lt; array-&gt;size; i++) {
                if (fscanf(file, "%d", array-&gt;array+i) == EOF)
                        goto ARRAY_CONTENT_READ_ERROR;
        }
        return array;

        ARRAY_CONTENT_READ_ERROR:
        free(array-&gt;array);
        ARRAY_ARRAY_ALLOC_ERROR:
        SIZE_READ_ERROR:
        free(array);
        ARRAY_ALLOC_ERROR:
        fclose(file);
        FILE_ERROR:
        return NULL;
}</pre>
</blockquote>
<p>Quais as vantagens desse padrão? Bem, ele reduz a repetição de código de reversão de operações e separa o código de tratamento de erro da lógica da função. Na verdade, apesar de eu achar exceções o melhor método de tratamento de erros moderno, para tratamento de erros <em>in loco</em> (dentro da própria função) eu acho esse método muito mais prático.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/suspensaodedescrenca.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/suspensaodedescrenca.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=17&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/09/13/tratamento-de-erros-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>Very funny.vbs</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/07/11/very-funnyvbs/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/07/11/very-funnyvbs/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 17:56:19 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Bug]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Segurança da Informação]]></category>
		<category><![CDATA[VBScript]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=10</guid>
		<description><![CDATA[Hoje, recebo o seguinte e-mail de um amigo que trabalha com Visual Basic:
O Belo (e possivelmente bons conselhos, no geral, de como fazer código bom):
http://www.visibleprogress.com/vb_error_handling.htm
e o Horroroso
http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx
O primeiro link realmente tem sugestões boas e interessantes para quem programa em Visual Basic. O segundo é uma lista de erros que podem ocorrer em Visual Basic e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=10&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hoje, recebo o seguinte <em>e-mail</em> de um amigo que trabalha com <a title="Visual Basic - Wikipédia, a enciclopédia livre" href="http://pt.wikipedia.org/wiki/Visual_Basic">Visual Basic</a>:</p>
<blockquote><p>O Belo (e possivelmente bons conselhos, no geral, de como fazer código bom):<br />
<a href="http://www.visibleprogress.com/vb_error_handling.htm" target="_blank">http://www.visibleprogress.com/vb_error_handling.htm</a></p>
<p>e o Horroroso<br />
<a href="http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx" target="_blank">http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx</a></p></blockquote>
<p>O primeiro <em>link</em> realmente tem sugestões boas e interessantes para quem programa em Visual Basic. O segundo é uma lista de erros que podem ocorrer em Visual Basic e <a title="VBScript - Wikipédia, a enciclopédia livre" href="http://pt.wikipedia.org/wiki/VBScript">VBScript</a>. O erro que me chamou a atenção foi</p>
<blockquote><p><code>48 Error in loading DLL</code></p></blockquote>
<p>Erros em carregamento de DLL em Visual Basic não são novidade; o que me surpreendeu é que <em>esse erro também pode ocorrer com VBScript</em>.</p>
<p>O <a title="ILOVEYOU - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/ILOVEYOU">ILOVEYOU</a>, senhores, era mais que inevitável: era praticamente o resultado das leis da Fisíca.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/suspensaodedescrenca.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/suspensaodedescrenca.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=10&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/07/11/very-funnyvbs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>Eu amo a GVT</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/05/21/eu-amo-a-gvt/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/05/21/eu-amo-a-gvt/#comments</comments>
		<pubDate>Wed, 21 May 2008 23:59:58 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Propaganda]]></category>
		<category><![CDATA[Serviços]]></category>
		<category><![CDATA[GVT]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=5</guid>
		<description><![CDATA[Ontem, estava redigindo uma primeira versão da minha monografia de conclusão de curso. Lá pelas 14 h, vou fazer uma pesquisa no Google e, pimba! percebo que estou sem conexão com a Internet. Não me preocupei: meu modem é especiamente temperamental e, quando esquenta demais, trava. Basta reiniciá-lo que tudo volta ao normal.
Pois bem, reiniciei [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=5&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ontem, estava redigindo uma primeira versão da minha monografia de conclusão de curso. Lá pelas 14 h, vou fazer uma pesquisa no Google e, <em>pimba</em>! percebo que estou sem conexão com a Internet. Não me preocupei: meu <em>modem</em> é especiamente temperamental e, quando esquenta demais, trava. Basta reiniciá-lo que tudo volta ao normal.</p>
<p>Pois bem, reiniciei o <em>modem</em>, mas não consegui recuperar a conexão. Imaginei que o <em>modem</em> estava tão superaquecido que seria necessário esperar um pouco mais para que ele destravasse &#8211; embora os <abbr title="Light-emitting diode">LED</abbr>s indicassem perfeito funcionamento.</p>
<p>Fui fazer outras atividades que estavam pendentes fora do computador. Duas ou três horas depois, volto para tentar reconectar. Ligo o <em>modem</em>, reinicio, utilizando <code>poff</code> e <code>pon</code>, o <em>daemon</em> <code>pppd</code> e&#8230; não funciona. Nesse momento, apelei e fiz aquilo que todo usuário de Linux considera uma vergonha no currículo: reiniciei o computador&#8230; Ok, só os usuários mais pedantes consideram isso uma vergonha, mas o que importa é que mesmo isso não funcionou.</p>
<p>Evidentemente, havia algum problema com a comunicação com o servidor. Fui fazer uns testes. Primeiro, olhei os <em>logs</em> do <code>pppd</code> com o comando <code>plog</code>. Noto que o <code>pppd</code> consegue receber um endereço <abbr title="Internet Protocol">IP</abbr> externo, e recebe também os endereços dos servidores <abbr title="Domain Name Service">DNS</abbr> da GVT. Tento <a href="http://pt.wikipedia.org/wiki/Ping">pingar</a> os servidores <abbr title="Domain Name Service">DNS</abbr> mas eles não respondem! Isso tinha cara de problema de autenticação. Para verificar, comentei a linha com meu <em>login</em> e senha no arquivo de autenticação do <code>pppd</code> e reiniciei o <code>pppd</code> novamente. Agora, a saída do <code>plog</code> indicava que não consegui um endereço <abbr title="Internet Protocol">IP</abbr> nem o endereço dos servidores <abbr title="Domain Name Service">DNS</abbr> por falha na autenticação. Imaginei: &#8220;É, o problema não é autenticação&#8230; ao menos até esse ponto&#8221;.</p>
<p>Joguei a toalha e resolvi ligar para a GVT. Depois de percorrer o caminho padrão, fui atendido por um rapaz. Explico para ele a situação, falo que já reiniciei tanto o <em>modem</em> quanto o computador e até comento que enxergo o endereço dos servidores <abbr title="Domain Name Service">DNS</abbr> mas não consigo pingá-los. A primeira surpresa agradável foi que o atendente <em>não pediu para eu reiniciar o computador e o modem de novo</em>! Ele foi verificar se havia algo de errado com minha configuração e&#8230; <em>pimba!</em> de novo: minha porta estava bloqueada.</p>
<p>Aí que me toquei: eu havia pago a fatura do mês passado na sexta-feira anterior, com seis dias de atraso. Ocorre que eu não havia recebido a fatura por correio, de modo que tive de buscá-la no <em>site</em> da GVT; entretanto, levei um bom tempo para me tocar que a fatura não havia chegado.</p>
<p>Explico-lhe a minha situação. Ele me transfere, então para o departamento de cobranças. Sem precisar esperar mais que meio minuto, sou atendido por uma simpática moça. Explico novamente a situação, ao que ela vai verificar o estado da minha conta. De fato, consta como não paga, e a moça me explica que há o prazo de 72 horas para que o pagamento conste nos servidores. Apesar de ser uma situação chata, concordo que é bem natural&#8230;</p>
<p>Aceito, então, a triste sina de esperar até a segunda-feira para ter minha conexão de volta&#8230; A atendente, porém, diz que pode solicitar a abertura de minha porta no mesmo momento. Oras, que ótimo! Ela solicita o serviço e diz que, em duas horas, no máximo, eu estaria com minha conexão restaurada. Peço para ela verificar o valor da última fatura, pois eu temia ter pago a fatura errada&#8230; mas felizmente paguei a correta.</p>
<p>Por fim, a atendente pede para eu responder uma pesquisa sobre o atendimento. Eu não poderia negar isso a ela, afinal, e lá vou eu, feliz, responder a questão. Naturalmente, disse estar plenamente satisfeito. De qualquer forma, fui lavar umas roupas, para esperar o tempo passar e, na volta, a conexão estava perfeita!</p>
<p>Encontrei alguns <em>bugs</em> no processo. Por exemplo, tive de digitar meu número de telefone no começo, por solicitação do <em>software</em>, pois estava falando pelo celular; entretanto, os dois atendentes me pediram ambos meu número. Entretanto, esses são detalhes insignificantes.</p>
<p>A GVT nunca me causou dores de cabeça. Nunca me trataram como um criminoso por usar Linux &#8211; muito pelo contrário, seus manuais já prevêem o uso de Linux. No final de 2007, me ligaram para me fazer uma oferta que pode ser resumida assim:</p>
<blockquote><p>Notamos que você usa pouco telefone e muita conexão. Nós podemos reduzir sua franquia e quadruplicar sua velocidade de conexão, mas você terá de pagar R$ 5,00 <em>a menos</em>.</p></blockquote>
<p>Agora, pela primeira vez, precisei de seu atendimento &#8211; por um problema que, no fundo, eu mesmo causei &#8211; e fui perfeitamente atendido. E olha que eles restauraram minha conexão xPor tudo isso, aí vai o meu conselho: se você não usa os serviços da GVT acesse o <a href="http://www.gvt.com.br/portal/home/">www.gvt.com.br</a> e contrate-os agora. Talvez você passe pelo único problema sério da GVT, que é a cobertura mais ou menos limitada e as longas filas de espera. Eu garanto: esse problema, vale a pena suportar.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/suspensaodedescrenca.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/suspensaodedescrenca.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=5&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/05/21/eu-amo-a-gvt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>Anúncio</title>
		<link>http://suspensaodedescrenca.wordpress.com/2008/05/20/anuncio/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2008/05/20/anuncio/#comments</comments>
		<pubDate>Tue, 20 May 2008 14:00:58 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Metapost]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=7</guid>
		<description><![CDATA[Olá!
Pois é, Suspensão de Descrença é meu novo blog. Esse é um blog menos pessoal, mais técnico, em que falo muito mais de programação, computação e tecnologia da informação.
Ah, sim, você não me conhece? Prazer, meu nome é Adam Victor Nazareth Brandizzi. Seja bem vindo!
Só mais uma dica: dêem uma olhada na página sobre o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=7&subd=suspensaodedescrenca&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Olá!</p>
<p>Pois é, <em>Suspensão de Descrença</em> é meu novo <em>blog</em>. Esse é um <em>blog</em> menos pessoal, mais técnico, em que falo muito mais de programação, computação e tecnologia da informação.</p>
<p>Ah, sim, você não me conhece? Prazer, meu nome é Adam Victor Nazareth Brandizzi. Seja bem vindo!</p>
<p>Só mais uma dica: dêem uma olhada na página <a href="http://suspensaodedescrenca.wordpress.com/sobre/">sobre</a> o <em>blog</em>.</p>
<p>Até mais!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/suspensaodedescrenca.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/suspensaodedescrenca.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&blog=3760524&post=7&subd=suspensaodedescrenca&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/05/20/anuncio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
	</channel>
</rss>