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

<channel>
	<title>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>Fri, 18 Nov 2011 16:28:00 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='suspensaodedescrenca.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Suspensão de Descrença</title>
		<link>http://suspensaodedescrenca.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://suspensaodedescrenca.wordpress.com/osd.xml" title="Suspensão de Descrença" />
	<atom:link rel='hub' href='http://suspensaodedescrenca.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Rodando testes antes do commit em Mercurial</title>
		<link>http://suspensaodedescrenca.wordpress.com/2011/10/12/rodando-testes-antes-do-commit-em-mercurial/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2011/10/12/rodando-testes-antes-do-commit-em-mercurial/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 23:59:19 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Sistema de Versionamento Distribuído]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[CuTest]]></category>
		<category><![CDATA[DVCS]]></category>
		<category><![CDATA[Hg]]></category>
		<category><![CDATA[Make]]></category>
		<category><![CDATA[Mercural Hook]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Test-driven Development]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=129</guid>
		<description><![CDATA[Como todo mundo, entrei de cabeça na onda dos sistemas de versão distribuídos, como Git. Por várias razões, porém, meu DVCS &#8220;do coração&#8221; é Mercurial. (Razões as quais pretendo explicar em breve, por sinal). De qualquer forma, vai aí minha primeira dica sobre o Mercurial. Frequentemente, estou consertando um bug em um projeto&#8230; $ nano [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=129&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Como todo mundo, entrei de cabeça na onda dos sistemas de versão distribuídos, como <a title="Git - Fast Version Control System" href="http://git-scm.com/">Git</a>. Por várias razões, porém, meu DVCS &#8220;do coração&#8221; é <a title="Mercurial SCM" href="http://mercurial.selenic.com/">Mercurial</a>. (Razões as quais pretendo explicar em breve, por sinal).</p>
<p>De qualquer forma, vai aí minha primeira dica sobre o Mercurial. Frequentemente, estou consertando um bug em um projeto&#8230;</p>
<pre><code>$ nano module1.c</code></pre>
<p>&#8230;e, como uso <a title="Test-driven development - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a>, rodo os testes:</p>
<pre>$ make test
./run_all
................................................................................

OK (80 tests)</pre>
<p>Quando os testes passam e o bug está corrigido, comito o código alterado:</p>
<pre><code>$ hg commit -m "Bug #123 corrected"</code></pre>
<p>Daí, passo a trabalhar em outra funcionalidade no mesmo projeto, escrevendo os testes primeiro:</p>
<pre><code>$ nano test/module2.c</code></pre>
<p>Novamente no espírito de TDD, vou rodar os testes, para quebrarem. Aperto então <kbd>Control+P</kbd> (ou <kbd>↑</kbd>) para chegar ao comando que roda os testes novamente (<code>make test</code>). Infelizmente, porém, às vezes eu aperto <kbd>Enter</kbd> muito cedo, o que resulta em comitar minhas alterações recentes:</p>
<pre><code>$ hg commit -m "Bug #123 corrected"</code></pre>
<p>Isto é ruim porque cria uma versão com código quebrando no Mercurial. A solução paliativa é executar <code>hg rollback</code> (obrigado de novo, <a title="version control - Forgeting/removing a revision from Mercurial repository - Stack Overflow" href="http://stackoverflow.com/questions/7692060/forgeting-removing-a-revision-from-mercurial-repository/7692828#7692828"><em>Stack Overflow</em></a>!). Entretanto,  <code>hg rollback</code> é a pílula do dia seguinte do Mercurial: envolve vários riscos e deve ser usado com cuidado.</p>
<p>Então tive um estalo: por que não rodo os testes <em>sempre</em> antes do <em>commit</em>? A resposta é que eu comito por acidente, claro, mas posso fazer o Mercurial rodá-los antes de confirmar um <em>commit</em>: bastaria criar um <a title="Hook - Mercurial" href="http://mercurial.selenic.com/wiki/Hook"><em>hook</em></a>. Para isto, alterei o programa que roda os testes para retornar um valor diferente de 0 (zero) quando os testes falhassem. Assim <code>make test</code> retorna um valor diferente de zero. Antes eu tinha <a title="[C] Testes que não retornam valor diferente de 0 ao falhar - Pastebin.com" href="http://pastebin.com/uQc24962">algo assim</a>:</p>
<pre>void RunAllTests(void) {
    CuString *output = CuStringNew();
    CuSuite* suite = CuSuiteNew();
    CuSuiteAddSuite(suite, test_project_suite());
    // ... mais coisas aqui
    CuSuiteRun(suite);
    CuSuiteSummary(suite, output);
    CuSuiteDetails(suite, output);
    printf("%s\n", output-&gt;buffer);
    CuStringDelete(output);
    CuSuiteDelete(suite);
}
int main(void) {
    RunAllTests();
    return 0;
}</pre>
<p>Agora eu tinha <a title="[C] Nova maneira de rodar os testes - Pastebin.com" href="http://pastebin.com/ETTNB8LC">algo assim</a>:</p>
<pre>int RunAllTests(void) { // Retorna int ao invés de void
    CuString *output = CuStringNew();
    CuSuite* suite = CuSuiteNew();
    CuSuiteAddSuite(suite, test_project_suite());
    // ... mais coisas aqui
    CuSuiteRun(suite);
    CuSuiteSummary(suite, output);
    CuSuiteDetails(suite, output);
    printf("%s\n", output-&gt;buffer);
    CuStringDelete(output);
    CuSuiteDelete(suite);
    return suite-&gt;failCount; // Retorna contagem de erros
}
int main(void) {
    return RunAllTests(); // Retorna contagem
}</pre>
<p>(Caso você esteja se perguntando, estou utiliando <em><a title="CuTest: The Cutest C Unit Testing Framework" href="http://cutest.sourceforge.net/">CuTest</a></em>, o melhor e mais cacofônico <em>framework</em> de testes para C.)</p>
<p>Após fazer esta alteração, adicionei as linhas abaixo no arquivo <code>.hg/hgrc</code> do projeto:</p>
<p><code>[hooks]</code><br />
<code>pretxncommit.surefire = make test</code></p>
<p>O que acontece quando vou comitar erroneamente agora? Veja só:</p>
<pre>$ hg commit -m "Bug #123 fixed"
cc -c  -Wall -std=c99 -Iinclude -Icutest src/test/util.c -o test_util.o
cc   run_all.o test_secretary.o  CuTest.o libsecretary.a   -o run_all
./run_all
...........................................................F....................

There was 1 failure:
1) test_util_beginning_of_day: src/test/util.c:34: expected 1 but was 0

!!!FAILURES!!!
Runs: 80 Passes: 79 Fails: 1

make: *** [test] Error 1
transaction abort!
rollback completed
abort: pretxncommit.surefire hook exited with status 2</pre>
<p>Os testes falham, o que faz o programa que os roda retornar um valor diferente de zero. O programa, falhando, faz o <code>make</code> falhar, retornando também um valor diferente de zero. Como o <code>make</code> falhou, o <em>hook</em> falha também, impedindo que Mercurial siga em frente com o <em>commit</em>. Oras, o <em>hook</em> foi executado na fase <code>pretxncommit</code> (<em>pre transaction commit</em>), logo antes de Mercurial registrar o <em>commit</em> do código. Como o <em>hook</em> falhou, o <em>commit</em> não é efetivamente feito e meu histórico fica limpo.</p>
<p>Este exemplo utiliza testes escritos em C, mas serve para qualquer projeto. Eventualmente, não se pode alterar o programa que roda os testes, mas pode-se criar um <em>script</em> que lê a saída dos testes e retorna o valor correto.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/suspensaodedescrenca.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/129/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=129&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2011/10/12/rodando-testes-antes-do-commit-em-mercurial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
		<item>
		<title>Problemas na instalação do módulo de SNMP do Apache</title>
		<link>http://suspensaodedescrenca.wordpress.com/2010/03/07/problemas-na-instalacao-do-modulo-de-snmp-do-apache-primeiro-erro-solucionado/</link>
		<comments>http://suspensaodedescrenca.wordpress.com/2010/03/07/problemas-na-instalacao-do-modulo-de-snmp-do-apache-primeiro-erro-solucionado/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 03:21:04 +0000</pubDate>
		<dc:creator>brandizzi</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[SNMP]]></category>
		<category><![CDATA[mod-ap2-snmp]]></category>

		<guid isPermaLink="false">http://suspensaodedescrenca.wordpress.com/?p=104</guid>
		<description><![CDATA[Se você está tentando instalar o módulo SNMP do Apache e seguiu todas as instruções daqui, mas encontrou no error.log uma mensagem como Cannot find module (APACHE2-MIB): At line 0 in (none) APACHE2-MIB::serverName.0: Unknown Object Identifier APACHE2-MIB::serverTmpDir.0: Unknown Object Identifier APACHE2-MIB::agentHttpAddress.0: Unknown Object Identifier APACHE2-MIB::serverStatus.0: Unknown Object Identifier APACHE2-MIB::serverVersion.0: Unknown Object Identifier APACHE2-MIB::serverBuilt.0: Unknown Object [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=104&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Se você está tentando instalar o módulo SNMP do Apache e seguiu todas as instruções <a title="Mod-Apache-Snmp" href="http://mod-apache-snmp.sourceforge.net/english/docs.htm">daqui</a>, mas encontrou no <code>error.log</code> uma mensagem como</p>
<blockquote><p><code>Cannot find module (APACHE2-MIB): At line 0 in (none)<br />
APACHE2-MIB::serverName.0: Unknown Object Identifier<br />
APACHE2-MIB::serverTmpDir.0: Unknown Object Identifier<br />
APACHE2-MIB::agentHttpAddress.0: Unknown Object Identifier<br />
APACHE2-MIB::serverStatus.0: Unknown Object Identifier<br />
APACHE2-MIB::serverVersion.0: Unknown Object Identifier<br />
APACHE2-MIB::serverBuilt.0: Unknown Object Identifier<br />
APACHE2-MIB::serverRoot.0: Unknown Object Identifier<br />
APACHE2-MIB::serverPidfile.0: Unknown Object Identifier<br />
APACHE2-MIB::serverRestart.0: Unknown Object Identifier<br />
APACHE2-MIB::totalServerPorts.0: Unknown Object Identifier<br />
APACHE2-MIB::serverPortNumber.1: Unknown Object Identifier</code></p></blockquote>
<p>provavelmente o MIB do Apache não está onde devia.</p>
<p>Dentro do diretório onde você compilou o mod-ap2-snmp, haverá um subdiretório chamado <code>mib</code>. Dentro dele, haverá um arquivo chamado <code>APACHE2-MIB.TXT</code>. Copie esse arquivo para o diretório dos MIBs do Net-SNMP. (Na minha máquina, esse diretório era <code>/usr/local/share/snmp/mibs/</code>)</p>
<p>Dois detalhes:</p>
<ul>
<li>a extrensão do arquivo deve estar em minúsculas &#8211; então a cópia se chamará <code>APACHE2-MIB.txt</code>. Não sei por que o pessoal do mod-ap2-snmp colocou esse nome com extensão em maiúscula, deve ser <em>bug</em>.</li>
<li>o arquivo deve ser legível para todos: rode <code>chmod a+r /usr/local/share/snmp/mibs/APACHE2-MIB.txt</code> nele. Talvez essa seja uma permissão muito aberta e só um grupo precise vê-lo, mas eu a apliquei e o <code>snmpget</code> conseguiu lê-lo. Sugestões sobre permissões mais seguras são bem-vindas, mas não sei se é necessário restringir a visibilidade desse arquivo&#8230;</li>
</ul>
<p>Esses passos resolveram as mensagens acima. Sobraram essas:</p>
<blockquote><p><code>[Thu Mar 04 00:16:41 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:41 2010] [error] APACHE2-MIB::serverStatus.0<br />
[Thu Mar 04 00:16:42 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:42 2010] [error] APACHE2-MIB::serverName.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverName.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverTmpDir.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::agentHttpAddress.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverStatus.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverVersion.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverBuilt.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverRoot.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverPidfile.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverRestart.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::totalServerPorts.0<br />
[Thu Mar 04 00:16:43 2010] [error] AP2_SNMP: Can't set MIB value.<br />
[Thu Mar 04 00:16:43 2010] [error] APACHE2-MIB::serverPortNumber.1<br />
</code></p></blockquote>
<p>O problema aqui é que iniciei o Apache antes de iniciar o agente snmp (<code>snmpd</code>). Basta derrubar o apache, levantar o agente (no caso, na minha máquina, ele está em <code>/usr/local/sbin/snmpd</code>) e levantar novamente o Apache. Feito isso, comece a recuperar as informações!</p>
<blockquote><p><code>$ snmpget -v 3 -u usuario -l authNoPriv -a MD5 -A senha  localhost APACHE2-MIB::serverName.0<br />
APACHE2-MIB::serverName.0 = STRING: 127.0.1.1</code></p></blockquote>
<p>Note, porém, que são necessários usuário e senha para trabalhar com SNMPv3 &#8211; que é o padrão, ao que parece, para o mod-ap2-snmp e é o melhor protocolo, de qualquer forma. Para criá-los, veja <a title="FAQ:Agent 25 - Net-SNMP Wiki" href="http://www.net-snmp.org/wiki/index.php/FAQ:Agent_25">esse <em>link</em></a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/suspensaodedescrenca.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/suspensaodedescrenca.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/suspensaodedescrenca.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/suspensaodedescrenca.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/suspensaodedescrenca.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/suspensaodedescrenca.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/suspensaodedescrenca.wordpress.com/104/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=104&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2010/03/07/problemas-na-instalacao-do-modulo-de-snmp-do-apache-primeiro-erro-solucionado/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>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 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=93&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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 pifado.</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>
<br />  <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/gofacebook/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=93&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2009/09/17/congelamento-de-disco-rigido/feed/</wfw:commentRss>
		<slash:comments>4</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&amp;blog=3760524&amp;post=76&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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>
<br />  <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/gofacebook/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=76&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></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. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=40&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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>
<br />  <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/gofacebook/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=40&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></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, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=34&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <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/gofacebook/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=34&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></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&amp;blog=3760524&amp;post=28&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <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/gofacebook/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=28&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></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 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=17&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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>
<br /><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/gofacebook/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=17&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></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 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=10&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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>
<br /><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/gofacebook/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=10&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></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, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=suspensaodedescrenca.wordpress.com&amp;blog=3760524&amp;post=5&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<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 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. Por 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>
<br /><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/gofacebook/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/suspensaodedescrenca.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/suspensaodedescrenca.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=3760524&amp;post=5&amp;subd=suspensaodedescrenca&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://suspensaodedescrenca.wordpress.com/2008/05/21/eu-amo-a-gvt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">brandizzi</media:title>
		</media:content>
	</item>
	</channel>
</rss>
