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

<channel>
	<title>Blog do Blabos de Blebe</title>
	<atom:link href="http://blog.blabos.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.blabos.org</link>
	<description>Qt, Perl, tecnologia e algum blá blá blá</description>
	<lastBuildDate>Fri, 05 Feb 2010 08:35:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Criando um mini-mirror do cpan com o CPAN::Mini</title>
		<link>http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/</link>
		<comments>http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 08:35:54 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=708</guid>
		<description><![CDATA[Online desde 26/10/1995, com 17365 módulos escritos por 7930 autores (até o momento da escrita deste post), o CPAN é o repositório oficial de módulos Perl. Nele podemos encontrar muitas vezes, centenas de módulos prontos para várias tarefas. Essa é uma das facilidades que fazem os programadores Perl serem tão eficientes.
No entanto, a dependência de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Online desde 26/10/1995, com 17365 módulos escritos por 7930 autores (até o momento da escrita deste post), o <a href="http://www.cpan.org">CPAN</a> é o repositório oficial de módulos Perl. Nele podemos encontrar muitas vezes, centenas de módulos prontos para várias tarefas. Essa é uma das facilidades que fazem os programadores Perl serem tão eficientes.</p>
<p style="text-align: justify;">No entanto, a dependência de uma conexão à internet para a instalação de novos módulos, é por vezes um empecilho para a utilização desta poderosa ferramenta. Mas como em Perl sempre há mais de uma forma de se fazer, neste post mostraremos como criar um mini-mirror do cpan para ser utilizado em ambientes onde uma conexão com a internet nem sempre é possível.</p>
<p><span id="more-708"></span></p>
<p style="text-align: justify;">Depois de configurar o aplicativo cpan para instalar <a href="http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/">módulos localmente com a local::lib</a>, o primeiro passo para configurar o mirror é instalar e configurar o módulo CPAN::Mini e seus aplicativos.</p>
<p style="text-align: justify;">Existem várias formas de se configurar o minicpan. A que eu mais uso é a que é feita através de um arquivo de configuração chamado .minicpanrc que deve ser criado no diretório home do usuário. Ele possui somente duas linhas conforme abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">local: ~/minicpan
remote: http://www.cpan.org</pre></td></tr></table></div>

<p style="text-align: justify;">A primeira linha indica em qual diretório ficarão os arquivos do mirror, enquanto a segunda indica de onde as informações sobre os pacotes serão baixadas.</p>
<p style="text-align: justify;">Feito isso, podemos instalar o módulo CPAN::Mini com o comando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">user@host:~$ cpan CPAN::Mini</pre></td></tr></table></div>

<p style="text-align: justify;">Depois de instalar o módulo, executamos o comando minicpan que vai sincronizar o repositório indicado no &#8216;remote&#8217; do .minicpanrc com o repositório na internet. Esta parte pode demorar entre alguns minutos e várias horas, dependendo da velocidade do seu link.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">user@host-perl:~$ minicpan
authors/01mailrc.txt.gz ... updated
modules/02packages.details.txt.gz ... updated
modules/03modlist.data.gz ... updated
authors/id/A/AA/AAYARS/Devel-Ladybug-0.406.tar.gz ... updated
authors/id/A/AA/AAYARS/CHECKSUMS ... updated
...</pre></td></tr></table></div>

<p style="text-align: justify;">A última etapa é configurar o aplicativo cpan para utilizar o nosso mirror local como primeira opção de download. Isso é feito pelo próprio prompt do cpan:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">cpan&gt; o conf urllist unshift file:///home/blabos/minicpan</pre></td></tr></table></div>

<p style="text-align: justify;">Onde /home/blabos é o diretório home do usuário, no meu caso, blabos; e minicpan é o diretório que configuramos na opção &#8216;local&#8217; do .minicpanrc.</p>
<p style="text-align: justify;">Com esses passo simples, conseguimos construir um mini-mirror do cpan para ser utilizado em ambientes com pouco ou nenhum acesso à internet. Adicionalmente, para replicar o mirror em outras máquinas, basta copiar o diretório minicpan e adicioná-lo como opção de download para o comando cpan (última etapa descrita anteriormente).</p>
<p style="text-align: justify;">Meus sinceros agradecimentos ao edenc que primeiro me falou a respeito do minicpan, ao Randal Schwartz que escreveu o script original do minicpan e ao Ricardo SIGNES que transformou o script do Randal em um módulo.</p>
<p style="text-align: justify;">Se quiser saber mais a respeito, dê uma olhada no <a href="http://www.stonehenge.com/merlyn/LinuxMag/col42.html">artigo original</a> do Randal ou na <a href="http://search.cpan.org/~rjbs/CPAN-Mini-0.576/lib/CPAN/Mini.pm">documentação online do módulo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2010/02/criando-um-mini-mirror-do-cpan-com-o-cpanmini/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obrigado por Googlar</title>
		<link>http://blog.blabos.org/2010/02/obrigado-por-googlar/</link>
		<comments>http://blog.blabos.org/2010/02/obrigado-por-googlar/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 04:23:16 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Pérolas]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=700</guid>
		<description><![CDATA[No final do ano, em um período curto de puro ócio improdutivo, estava analisando os dados do analytics e me deparei com as keywords que levavam leitores ao blog.
Achei legal que a maioria delas estava relacionada com o conteúdo do blog, ou com assuntos sobre os quais eu poderia ter escrito. No entanto, algumas delas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No final do ano, em um período curto de puro ócio improdutivo, estava analisando os dados do analytics e me deparei com as keywords que levavam leitores ao blog.</p>
<p style="text-align: justify;">Achei legal que a maioria delas estava relacionada com o conteúdo do blog, ou com assuntos sobre os quais eu poderia ter escrito. No entanto, algumas delas chamaram a atenção por sua peculiaridade e quantidade.</p>
<p><span id="more-700"></span></p>
<p style="text-align: justify;">Como bom blog sobrenatural, atraimos a atenção de diversas pessoas procurando saber como desenvolver sua telepatia e premonição. Outras, buscavam uma forma de se livrar da telepatia.</p>
<p style="text-align: justify;">Exercitando nosso lado ortográfico, demos dicas a todos os ávidos leitores que procuravam como conseguir uma redação de vinte linhas prontinha. E olha que nós realmente ensinamos isso!</p>
<p style="text-align: justify;">Alguns exemplos foram cuidadosamente analisados e respondidos por nossa equipe:</p>
<h4>xixi no cinema</h4>
<p style="text-align: justify;">Normalmente é causado por excesso de refrigerantes, mas se precisar mesmo, use o banheiro.</p>
<h4>vocabulário maloqueiro</h4>
<p style="text-align: justify;">É nóis na fita mano! Cê é meu truta! Tá ligado?</p>
<h4>ubuntu+não sei que aconteceu com o meu teclado+caracteres estranhos</h4>
<p style="text-align: justify;">Verifique se está sóbrio ou se foi sequestrado por algum alienígena. Se tudo falhar esqueça o teclado e avance logo para o mouse.</p>
<h4>como usar telepatia</h4>
<p style="text-align: justify;">De preferência com moderação.</p>
<h4>bruce lee foi uma farsa?</h4>
<p style="text-align: justify;">Segundo <a href="http://desciclo.pedia.ws/wiki/Chuck_Norris#O_teatrinho_criado_pelos_japoneses_e_chineses">Chuck Norris, sim</a>.</p>
<h4>chame que eu choro junto</h4>
<p style="text-align: justify;">Duas <a href="http://pt.wikipedia.org/wiki/Carpideira">Carpideiras</a> pelo preço de uma&#8230;</p>
<h4>como conseguir que o open office corrija ortografia?</h4>
<p style="text-align: justify;"><strog>F7</strong></p>
<h4>como fazer para ter uma premonição?</h4>
<p style="text-align: justify;">Barbada: É só enganar a morte, oras.</p>
<h4>como me livrar da telepatia</h4>
<p style="text-align: justify;">Se não sair com um banho, tente dois&#8230;</p>
<h4>como passar fibra ótica embaixo de pontes</h4>
<p style="text-align: justify;">Com cuidado.</p>
<h4>fiz engenharia e agora?</h4>
<p style="text-align: justify;">Sempre há tempo para se arrepender <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h4>o que significa o numero 3 invertido</h4>
<p style="text-align: justify;">A letra <stromg>E</strong></p>
<h4>significado de ficamos barrados</h4>
<p style="text-align: justify;">Algo <a href="http://www.imdb.com/title/tt0098749/">assim</a></p>
<h4>palavras parecidas festa</h4>
<p style="text-align: justify;">Testa esta, besta!</p>
<h4>quero uma mochila de graça</h4>
<p style="text-align: justify;">Eu também!!!</p>
<h4>objetos baixados onde ponho?</h4>
<p style="text-align: justify;">Na encruzilhada?</p>
<p style="text-align: justify;">E por hoje é só pessoal!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2010/02/obrigado-por-googlar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tempo é Dinheiro</title>
		<link>http://blog.blabos.org/2010/01/tempo-e-dinheiro/</link>
		<comments>http://blog.blabos.org/2010/01/tempo-e-dinheiro/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 03:04:59 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Pérolas]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=689</guid>
		<description><![CDATA[Como diz o ditado, tempo é dinheiro então vou tentar não me alongar muito.
No longínquo janeiro de 2008 eu fiz um dos primeiros posts do blog, comentando um post do Fábio Telles e arriscando algumas opiniões sobre suporte e custos do software livre. Naquela época o próprio Fábio fez uma crítica um pouco contundente, mas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Como diz o ditado, tempo é dinheiro então vou tentar não me alongar muito.</p>
<p style="text-align: justify;">No longínquo janeiro de 2008 eu fiz <a href="http://blog.blabos.org/2008/01/quem-paga-a-conta-do-suporte">um dos primeiros posts do blog</a>, comentando um post do Fábio Telles e arriscando algumas opiniões sobre suporte e custos do software livre. Naquela época o próprio Fábio fez uma crítica um pouco contundente, mas que eu gostei bastante.</p>
<p style="text-align: justify;">Recentemente, esse post foi lido novamente e comentando, mas não foi um comentário qualquer, foi um super comentário que eu reproduzo abaixo, na íntegra:</p>
<p><span id="more-689"></span></p>
<blockquote style="text-align: justify;"><p>
Olha meu caro. Software Livre não dá dinheiro a ninguém, não fomenta negócio, não paga impostos, não produz fonte de riquezas, enfim, não tem nenhuma utilidade no mundo capitalista em que vivemos.<br />
<br />
Eu acho que esta onda livre apenas usa o esforço de pessoas que não têm ideologias para fazer o trabalho de grandes empresas como IBM.<br />
<br />
O que eu vejo é grandes empresas usando mão de obra gratuita para fazer o trabalho deles, e estão ganhando rios de dinheiro às custas de programadores recém formados que não tem bandeira nem religião, que acabam abraçando uma idéia mentirosa como esta filosofia open-source.<br />
<br />
Resumindo: estão usando força de trabalho de pessoas ignorantes para atingir seus objetivos comerciais. E é uma pena que muita gente cai nessa.<br />
<br />
Se software livre fosse o futuro o Linux não estaria na casa dos 1% dos monopolizadores dos desktops.<br />

</p></blockquote>
<p style="text-align: justify;">Uau!</p>
<p style="text-align: justify;">Eu achei que comentar esse comentário junto com os inúmeros comentários do post original, faria essa troca de idéias passar batida, então, decidi fazer um breve post sobre ele.</p>
<p style="text-align: justify;">Querido Nigel, agradeço profundamente por sua disposição e empenho ao comentar o post.</p>
<p style="text-align: justify;">Você afirma que software livre não dá dinheiro a ninguém. Gostaria então que você me explicasse qual a mágica utilizada por mim para pagar as contas, o domínio e a hospedagem desse blog, onde você é bem vindo para comentar de graça! Oras, me conte qual a mágica, que assim acabaremos com a pobreza no mundo!</p>
<p style="text-align: justify;">Você também afirma que não fomenta negócio e nem paga impostos. Caramba! Então o ISS, o COFINS, a Contribuição Social que a minha empresa paga não existem? O governo está me roubando? Esse tempo todo e eu não sabia que o serviço que presto era isento de impostos. Ainda bem que você me contou isso!</p>
<p style="text-align: justify;">Veja só, eu e minha empresa socialista! Feio, feio feio! Blabos mau!</p>
<p style="text-align: justify;">Essas <a href="http://www.redhat.com">empresas</a> <a href="http://www.canonical.com">malvadas</a> se aproveitando de <a href="http://en.wikipedia.org/wiki/Linus_Torvalds">programadores recém-formados</a>, <a href="http://en.wikipedia.org/wiki/Alan_Cox">inexperientes</a>, <a href="http://br-linux.org/2010/criador-do-qemu-e-ffmpeg-bate-o-recorde-de-calculo-de-digitos-do-numero-π">bocós</a> e <a href="http://en.wikipedia.org/wiki/Mark_Shuttleworth">pobres</a>!</p>
<p style="text-align: justify;">Nigel, de acordo com o seu texto, você parece não saber muito bem sobre o que está falando. Eu não vou discorrer aqui sobre a inúmeras formas de se ganhar dinheiro com o software livre, nem o porquê de ele ser socialmente justo, mas te convido a conhecer de verdade a realidade do software livre para que você pare de repetir algo que aparentemente não compreende. Então eu posso de apresentar uns maltrapilhos que terão prazer te pagar uma boa cerveja proprietária com o não-dinheiro que ganhamos com software livre.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2010/01/tempo-e-dinheiro/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Git e github no windows</title>
		<link>http://blog.blabos.org/2009/12/git-e-github-no-windows/</link>
		<comments>http://blog.blabos.org/2009/12/git-e-github-no-windows/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 17:33:07 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=673</guid>
		<description><![CDATA[O git é uma ferramenta open source para controle de versão de arquivos. Sua arquitetura distribuída permite que você seja mais produtivo pois não necessita de um servidor central para receber commits.
O CVS foi o primeiro sistema de controle de versão com o qual trabalhei. Não sei se era pela minha inexperiência, mas ele sempre [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O git é uma ferramenta open source para controle de versão de arquivos. Sua arquitetura distribuída permite que você seja mais produtivo pois não necessita de um servidor central para receber commits.</p>
<p style="text-align: justify;">O <a href="http://savannah.nongnu.org/projects/cvs">CVS</a> foi o primeiro sistema de controle de versão com o qual trabalhei. Não sei se era pela minha inexperiência, mas ele sempre foi mais uma pedra no sapato que uma ferramenta de trabalho.</p>
<p><span id="more-673"></span></p>
<p style="text-align: justify;">Quando conheci o <a href="http://subversion.tigris.org">Subversion</a> fiquei espantado:</p>
<p><cite>&#8220;Nossa! É possível tirar um snapshot do repositório inteiro. Uau!&#8221;</cite></p>
<p style="text-align: justify;">A parte chata era que ainda como o CVS, precisava de um servidor para onde mandar os meus commits. Assim quando eu estava sem conexão ou sem servidor, simplesmente não era possível fazer os commits, a menos é claro que eu mantivesse uma cópia do reositório na sua máquina e gerenciasse toda essa bagunça.</p>
<p style="text-align: justify;">Quando ouvi falar do git, não fiquei muito entusiasmado, mas depois do primeiro uso:</p>
<p><cite>&#8220;Caceta, eu não preciso de um servidor pra enviar commits!&#8221;</cite></p>
<p style="text-align: justify;">Eu não vou entrar das funcionalidades do git aqui, até porque esse não é o objetivo do post. Para quem quiser estudar o git há farta documentação na internet e no <a href="http://git-scm.com">site do git</a> e há um livro bem legal disponível sob Creative Commons chamado <a href="http://progit.org">Pro Git</a>.</p>
<p style="text-align: justify;">Há alguns meses eu também conheci o <a href="http://github.com">github</a>, um site source-forge-like onde você pode hospedar seus projetos versionados com git, interagir com outros desenvolvedores e muito mais.</p>
<p style="text-align: justify;">Para quem vive no mundo unix, trabalhar com o github é trivial. É so cadastrar um usuário, gerar uma chave SSH e começar a postar código.</p>
<p style="text-align: justify;">Agora se você compartilha da triste sina dos pouco afortunados que ainda não se libertaram do windows, utilizar o github é &#8230; trivial também!</p>
<p style="text-align: justify;">Para tanto é necessário que se instale o Cygwin. O Cygwin é uma ferramenta bem bacana que automatiza a instalação de aplicativos tipicamente unix no windows.</p>
<p style="text-align: justify;">O processo de instalação é bem simples. Baixe o Cygwin direto do <a href="http://www.cygwin.com/setup.exe">seu site</a>  e execute com um duplo clique (duh!!!).</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-1.png"><img title="Instalação do Cygwin - Tela inicial" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-1.png" alt="Instalação do Cygwin - Tela inicial" width="300" /></a>
</p>
<p style="text-align: justify;">Há várias opções de personalização. Eu utilizei as opções default, até chegar na tela onde se configura qual o repositório de onde o instalador vai baixar os pacotes. Aqui uma ressalva: alguns repositórios são mais rápidos que outros. Faça seus testes. Eu utilizei o http://cygwin.cibermirror.org.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-2.png"><img title="Instalação do Cygwin - Mirrors" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-2.png" alt="Instalação do Cygwin - Mirrors" width="300" /></a>
</p>
<p style="text-align: justify;">Depois na tela de seleção de pacotes, vá na aba Devel e selecione os pacotes do git.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-3.png"><img title="Instalação do Cygwin - Git" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-3.png" alt="Instalação do Cygwin - Git" width="300" /></a>
</p>
<p style="text-align: justify;">Na aba Net, selecione os pacotes do openssh.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-4.png"><img title="Instalação do Cygwin - Open SSH" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-4.png" alt="Instalação do Cygwin - Open SSH" width="300" /></a>
</p>
<p style="text-align: justify;">Next, next, finish.</p>
<p style="text-align: center;">
<a href="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-5.png"><img title="Instalação do Cygwin - Finish Him!" src="http://img.blabos.org/blog/posts/2009/12/git-win/cygwin-5.png" alt="Instalação do Cygwin - Finish Him!" width="300" /></a>
</p>
<p style="text-align: justify;">A partir daqui, supondo que você já tenha um usuário cadastrado no github, falta configurar as chaves de acesso. As chaves são mecanismos de segurança utilizadas pelo servidor para que ele tenha certeza que você é você mesmo. Se você ainda não tem um usuário cadastrado no github, cadastre-se <a href="https://github.com/signup/free">for free</a>.</p>
<p style="text-align: justify;">Para criar a chave basta seguir os passos do tutorial que tem no próprio github e gerar a chave. Vá em Account Settings e depois em SSH Public Keys. Há um link pequeno <strong>Need help with public keys?</strong>. O tutorial está um pouco desatualizado em relação às telas que ele mostra, mas ainda está completamente funcional.</p>
<p style="text-align: justify;">Resumindo, abra o terminal do Cygwin que você acabou de instalar, digite <strong>ssh-keygen -t rsa -C &#8220;seu_email@vai_aqui.com&#8221;</strong>, conforme mostra a figura, substituindo <strong>seu_email@vai_aqui.com</strong> pelo seu email, naturalmente, responda às perguntas e digite uma senha. Essa senha pode ser uma frase longa (recomendado) ou pode ser vazia. Ela será requisitada toda vez que você for sincronizar dados com o github.</p>
<p style="text-align: justify;">Você precisa agora enviar para o github a chave pública. Para isso abra o arquivo da chave pública &#8211; normalmente .ssh/id_rsa.pub &#8211; com o notepad, copie o texto e cole no formulário do github. Mas preste atenção, você precisa envia a chave pública. Há um .pub no final do arquivo. A chave privada &#8211; sem o .pub no final &#8211; não deve nunca se posta em público.</p>
<p style="text-align: justify;">Pronto agora você é capaz de enviar código para a sua conta no github.</p>
<p style="text-align: justify;">Atente para o detalhe que nos seus projetos há uma url pública e uma url somente sua.</p>
<p style="text-align: justify;">E bom social coding para você também.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/12/git-e-github-no-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memória</title>
		<link>http://blog.blabos.org/2009/09/memoria/</link>
		<comments>http://blog.blabos.org/2009/09/memoria/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 22:19:34 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Pérolas]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=667</guid>
		<description><![CDATA[A boa memória dos meus leitores às vezes me espanta&#8230;
Imagem publicada com a devida autorização do esquecido  
]]></description>
			<content:encoded><![CDATA[<p>A boa memória dos meus leitores às vezes me espanta&#8230;</p>
<div class="wp-caption aligncenter" style="width: 415px"><a href="http://img.blabos.org/blog/posts/2009/09/memoria/boa_memoria.png"><img title="Boa Memória" src="http://img.blabos.org/blog/posts/2009/09/memoria/boa_memoria.png" alt="Boa Memória" width="405" height="169" /></a><p class="wp-caption-text">Boa Memória</p></div>
<p>Imagem publicada com a devida autorização do esquecido <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/09/memoria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando módulos do CPAN via local::lib</title>
		<link>http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/</link>
		<comments>http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 00:52:57 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=647</guid>
		<description><![CDATA[Instalar módulos do CPAN em máquinas onde você não tem permissão de root é muito simples. Utilizando o módulo local::lib do próprio CPAN, você pode criar uma instalação local na qual os módulos são instalados no seu próprio home.

Configurando o cpan
Para isso, basta chamar um terminal e digitar o comando cpan. Ele vai mostrar uma [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Instalar módulos do CPAN em máquinas onde você não tem permissão de root é muito simples. Utilizando o módulo local::lib do próprio CPAN, você pode criar uma instalação local na qual os módulos são instalados no seu próprio home.</p>
<p><span id="more-647"></span></p>
<h2>Configurando o cpan</h2>
<p style="text-align: justify;">Para isso, basta chamar um terminal e digitar o comando cpan. Ele vai mostrar uma pequena mensagem de apresentação e perguntar se você gostaria de deixá-lo configurar tudo automaticamente. Para a maioria dos casos a configuração automática é suficiente, no entanto eu vou configurar algumas opções por mim mesmo, então vou responder &#8216;no&#8217;.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">Would you like me to configure as much as possible automatically? [yes] no</pre></div></div>

<p style="text-align: justify;">A primeira opção que eu vou responder diferente da default é a que define a política de pré-requisitos (<strong>&lt;prerequisites_policy&gt;</strong>). Ela define o que o cpan deve fazer ao se deparar com um módulo que possui um dependência. O default é &#8216;ask&#8217; (perguntar).
</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;"> &lt;prerequisites_policy&gt;
Policy on building prerequisites (follow, ask or ignore)? [ask] follow</pre></div></div>

<p style="text-align: justify;">Eu vou modificar para &#8216;follow&#8217; (seguir). Assim, quando o cpan encontrar um módulo que possui alguma dependência, ao invés de me perguntar, ele vai tentar instalá-la automaticamente. Isso é extremamente útil durante instalações longas com uma árvore de dependências grande como a do Catalyst.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;"> &lt;build_requires_install_policy&gt;
Policy on installing 'build_requires' modules (yes, no, ask/yes,
ask/no)? [ask/yes] yes</pre></div></div>

<p style="text-align: justify;">Na sequência vem a pergunta sobre a instalação de dependências de build dos módulos. Eu vou alterar de &#8216;ask/yes&#8217; para &#8216;yes&#8217; para que as dependências de build também sejam instaladas. O default era perguntar e sugerir sim como resposta.</p>
<p style="text-align: justify;">A seguir vem uma sequência de perguntas sobre ferramentas que o cpan normalmente usa. Eu aproveito esse momento para checar se alguma está faltando e então instalá-la.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;"> &lt;bzip2&gt;
Where is your bzip2 program? [/bin/bzip2]
&nbsp;
 &lt;gzip&gt;
Where is your gzip program? [/bin/gzip]</pre></div></div>

<p style="text-align: justify;">Várias opções depois, a próxima que eu modifico é o charset default de ISO-8859-1 para UTF-8.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">The next option deals with the charset (aka character set) your
terminal supports. In general, CPAN is English speaking territory, so
the charset does not matter much but some CPAN have names that are
outside the ASCII range. If your terminal supports UTF-8, you should
say no to the next question. If it expects ISO-8859-1 (also known as
LATIN1) then you should say yes. If it supports neither, your answer
does not matter because you will not be able to read the names of some
authors anyway. If you answer no, names will be output in UTF-8.
&nbsp;
 &lt;term_is_latin&gt;
Your terminal expects ISO-8859-1 (yes/no)? [yes] no</pre></div></div>

<p style="text-align: justify;">O cpan vai te perguntar se ele pode se conectar à internet para baixar a lista de repositórios. Ele é bem educado quanto às coisas que ele precisa fazer, por isso estamos configurando opções que o deixem mais independente. Responda yes e aguarde ele baixar a lista de servidores.</p>
<p style="text-align: justify;">Depois de se comunicar com os servidores default, ele te pergunta sobre quais repositórios você quer configurar em três etapas. Primeiro pergunta o continente, depois o país e por último o próprio repositório. É possível escolher mais de uma opção simultaneamente. Eu escolhi para continentes América do Sul e América do Norte, para países Brasil, Chile e Estados Unidos e por último alguns repositórios em cada país. Fique à vontade para escolher quantos e quais quiser.</p>
<p style="text-align: justify;">Pronto. Agora você está no shell do cpan.</p>
<h2>Instalando o módulo local::lib</h2>
<p style="text-align: justify;">O próximo passo é instalar e configurar o módulo local::lib. Para isso digite no shell do cpan o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">cpan[1]&gt; look local::lib</pre></div></div>

<p style="text-align: justify;">Isso vai fazer com o que o cpan baixe o módulo mas não instale-o automaticamente. Ao invés disso ele vai abrir um novo shell no diretório local onde ele desempacotou o módulo local::lib.</p>
<p style="text-align: justify;">Neste shell, faça o bootstrap com os seguintes comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~/.cpan/build/local-lib-1.004003-UyX2wf$ perl Makefile.PL \
--bootstrap &amp;&amp; make test &amp;&amp; make install</pre></div></div>

<p style="text-align: justify;">Por último mas não menos importante é preciso exportar algumas variáveis de ambiente. Para isso saia do shell atual (Ctrl+D), saia do shell do cpan (bye ou quit) e execute no bash o seguinte comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span>~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify;">Isso vai adicionar os comandos que exportam as variáveis de ambiente ao final do seu arquivo .bashrc, e então a cada login elas serão automaticamente exportadas.</p>
<p style="text-align: justify;">Force a re-execução do seu bashrc ou faça logout e login novamente</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">catalyst<span style="color: #000000; font-weight: bold;">@</span>spectro:~$ . ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p style="text-align: justify;">Certifique-se que as variáveis de ambiente foram configuradas ou coisas estranhas podem acontecer. Entenda por &#8220;coisas estranhas&#8221; qualquer coisa diferente do funcionamento correto. Algumas podem ser realmente bizarras. <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">catalyst<span style="color: #000000; font-weight: bold;">@</span>spectro:~$ <span style="color: #c20cb9; font-weight: bold;">env</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #c20cb9; font-weight: bold;">perl</span>
<span style="color: #007800;">PERL5LIB</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>perl5:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>perl5...
<span style="color: #007800;">MODULEBUILDRC</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>.modulebuildrc
<span style="color: #007800;">PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>games
<span style="color: #007800;">PERL_MM_OPT</span>=<span style="color: #007800;">INSTALL_BASE</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>catalyst<span style="color: #000000; font-weight: bold;">/</span>perl5
catalyst<span style="color: #000000; font-weight: bold;">@</span>spectro:~$</pre></div></div>

<h2>Retocando a maquiagem</h2>
<p style="text-align: justify;">Agora, antes de começar a instalar módulos, é uma boa atualizar o próprio módulo CPAN.pm. Atente para as maiúsculas e minúsculas.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~$ cpan CPAN
...
Installing /home/catalyst/perl5/bin/cpan
Writing /home/catalyst/perl5/lib/perl5/i486-linux-gnu-thread-multi/auto...
Appending installation info to /home/catalyst/perl5/lib/perl5/i486-linux...
  ANDK/CPAN-1.9402.tar.gz
  /usr/bin/make install  -- OK
Warning (usually harmless): 'YAML' not installed, will not store persist...
catalyst@spectro:~$</pre></div></div>

<p style="text-align: justify;">Depois da instalação da nova versão do CPAN.pm, note que ele está avisando que o módulo YAML não está instalado. Para deixar tudo redondinho vamos intalá-lo também.</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~$ cpan YAML
...
Writing /home/catalyst/perl5/lib/perl5/i486-linux-gnu-thread-multi/auto/Y...
Appending installation info to /home/catalyst/perl5/lib/perl5/i486-linux...
  INGY/YAML-0.68.tar.gz
  /usr/bin/make install  -- OK
CPAN: YAML loaded ok (v0.68)
Going to read 1 yaml file from /home/catalyst/.cpan/build/
DONE
Restored the state of none (in 0.0265 secs)
catalyst@spectro:~$</pre></div></div>

<p style="text-align: justify;">Agora sim. Vamos dar uma conferida onde foi parar o módulo YAML recém instalado:</p>

<div class="wp_syntax"><div class="code"><pre class="cpan" style="font-family:monospace;">catalyst@spectro:~$ ls ~/perl5/lib/perl5
CPAN  CPAN.pm  i486-linux-gnu-thread-multi  local  Test  YAML  YAML.pm
catalyst@spectro:~$</pre></div></div>

<p style="text-align: justify;">Ele foi instalado dentro de uma árvore de diretórios criada no home do usuário corrente. Tudo isso sem pedir a senha de root uma única vez.</p>
<h2>Conclusão</h2>
<p style="text-align: justify;">Instalar módulos do CPAN localmente sem precisar de senha de root é muito fácil. Isso é extremamente útil em máquinas onde você tem apenas permissão de usuário comum, como em servidores de hospedagem.</p>
<p style="text-align: justify;">Uma outra vantagem é que para levar os mesmos módulos para outra máquina (com a mesma arquitetura) basta copiar o diretório perl5 que você acabou de criar, já que todos os módulos estão instalados dentro dele, bem como adicionar o comando que exporta as variáveis de ambiente na máquina destino. Isso também é bastante útil quando você tem um servidor de hospedagem que não te dá acesso a um shell.</p>
<h2>Links (in)úteis</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://search.cpan.org/~apeiron/local-lib-1.004006/lib/local/lib.pm">Módulo local::lib</a></li>
<li><a href="http://search.cpan.org/~andk/CPAN-1.9402/lib/CPAN.pm">Módulo CPAN.pm</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/08/instalando-modulos-do-cpan-via-locallib/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Não me chame de curintiano que eu choro&#8230;</title>
		<link>http://blog.blabos.org/2009/05/nao-me-chame-de-curintiano-que-eu-choro/</link>
		<comments>http://blog.blabos.org/2009/05/nao-me-chame-de-curintiano-que-eu-choro/#comments</comments>
		<pubDate>Mon, 18 May 2009 09:16:11 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Bla Bla Bla]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=642</guid>
		<description><![CDATA[Pode ser pior que xingar a mãe!
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><a href="http://esportes.terra.com.br/futebol/brasileiro/2009/interna/0,,OI3770993-EI13759,00-Chamado+de+corintiano+Madson+deixa+a+Vila+chorando.html">Pode ser pior que xingar a mãe!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/nao-me-chame-de-curintiano-que-eu-choro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ponteiros e Arrays</title>
		<link>http://blog.blabos.org/2009/05/ponteiros-e-arrays/</link>
		<comments>http://blog.blabos.org/2009/05/ponteiros-e-arrays/#comments</comments>
		<pubDate>Mon, 18 May 2009 09:08:06 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=624</guid>
		<description><![CDATA[No primeiro post desta série, falamos um pouco sobre Ponteiros. No segundo, falamos de Referências. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes).

Relembrando Arrays
Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, float, etc). [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No primeiro post desta série, falamos um pouco sobre <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1">Ponteiros</a>. No segundo, falamos de <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-2">Referências</a>. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes).</p>
<p><span id="more-624"></span></p>
<h2>Relembrando Arrays</h2>
<p style="text-align: justify;">Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, float, etc). Essa abstração é organizada em formato de tabela, com linhas e colunas. Cada elemento na matriz possui coordenadas únicas (linha e coluna), de forma que um dado elemento E(i,j) representa o único elemento na posição &#8220;linha i&#8221;, &#8220;coluna j&#8221;.</p>
<p style="text-align: justify;">A sintaxe de declaração de matrizes segue abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Matrizes unidimensionais ou vetores</span>
<span style="color: #0000ff;">int</span>     ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>               <span style="color: #666666;">// 10 elementos, do 0 ao 9</span>
<span style="color: #0000ff;">char</span>    cvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">23</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>               <span style="color: #666666;">// 23 elementos, do 0 ao 22</span>
&nbsp;
<span style="color: #666666;">// Matrizes bidimensionais</span>
<span style="color: #0000ff;">int</span>     imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>             <span style="color: #666666;">// 2 linhas (0 a 1) e 3 colunas (0 a 2)</span>
<span style="color: #0000ff;">double</span>  dmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>            <span style="color: #666666;">// 10 linhas (0 a 9) e 2 colunas (0 a 1)</span></pre></div></div>

<p style="text-align: justify;">Cada elemento da matriz é independente dos demais e pode ser acessado conforme a sintaxe abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Alterando o quarto elemento do vetor ivet.</span>
<span style="color: #666666;">// Lembre-se que começa-se a contar a partir do elemento zero</span>
ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Lendo o segundo elemento do vetor ivet</span>
<span style="color: #0000ff;">int</span> num <span style="color: #000080;">=</span> ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Alterando o elemento da primeira linha, segunda coluna de imat</span>
imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Lendo o elemento na terceira linha, quarta coluna de imat</span>
<span style="color: #0000ff;">int</span> foo <span style="color: #000080;">=</span> imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Neste post não vamos discutir a fundo matrizes, vamos apenas investigar a relação entre matrizes e ponteiros de uma forma bastante intuitiva.</p>
<h2>Tamanhos de matrizes</h2>
<p style="text-align: justify;">Dado que uma matriz é uma abstração que comporta vários valores de um mesmo tipo, qual o tamanho dela? Quanto espaço ele ocupa na memória?</p>
<p style="text-align: justify;">Considere o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span>     ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span>    cvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  dvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span>    cmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(int)     = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(char)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(double)  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(ivet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>ivet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(cvet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(dvet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dvet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(cmat)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cmat<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(imat)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>imat<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">O resultado é bastante razoável. O Espaço ocupado por uma matriz é igual ao número de elementos multiplicado pelo tamanho do tipo do elemento (linhas x colunas x sizeof(tipo)). Ora, se cada elemento é independente, supõe-se que cada um ocupe um lugar separado na memória, caso contrário um elemento sobrescreveria outro. Sendo assim, será que cada elemento possui seu próprio endereço de memória?</p>
<h2>Matrizes e endereços de memória</h2>
<p style="text-align: justify;">Para facilitar, vamos então analisar os possíveis endereços de uma matriz de caracteres, cujo tamanho de um dado único é 1 byte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'C'</span>, <span style="color: #FF0000;">'D'</span>, <span style="color: #FF0000;">'E'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o índices, valores e endereços dos dados.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Índice<span style="color: #000099; font-weight: bold;">\t</span>Valor<span style="color: #000099; font-weight: bold;">\t</span>Endereço do elemento<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>%c<span style="color: #000099; font-weight: bold;">\t</span>%p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, i, cvet<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, <span style="color: #000040;">&amp;</span>cvet<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o endereço da própria matriz</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Endereço da matriz: %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o endereço da própria matriz denovo</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Endereço da matriz: %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Os endereços dos elementos são sequenciais, ou seja, cada elemento é armazenado ao lado do anterior. Adicionalmente existem dois fatos ainda mais interessantes:</p>
<p style="text-align: justify;">
<ol>
<li>O endereço do array (&#038;cvet), mostrado na linha 25, é o mesmo do primeiro elemento do array;</li>
<li>A própria variável cvet pode ser interpretada como um ponteiro, como é mostrado na linha 28;</li>
</ol>
<p style="text-align: justify;">Em C++, um array comum é um bloco contíguo de memória cujo nome pode ser interpretado (cast) como um ponteiro que aponta para o seu primeiro elemento. Adicionalmente é válido fazer um ponteiro apontar para um array desde que o ponteiro destino seja para o mesmo tipo que o tipo dos elementos do array. Durante a atrubuição de um array a um ponteiro, o compilador faz uma conversão implícita de tipos. O ponteiro destino passa a ser interpretado como um ponteiro para a área de memória ocupada pelo array.</p>
<p style="text-align: justify;">Uma das consequências não tão óbvias é que durante o cast implícito, é perdida a informação de que aquela área de memória era um array. Portanto é perdida a informação do tamanho do array. Do ponto de vista do ponteiro, ele está apontando para o começo de um bloco arbitrário de memória, de um tamanho também arbitrário. Sair de um array e ir para um ponteiro significa ir de uma abstração mais restritiva e mais alto nível, para um abstração menos restritiva e mais baixo nível.</p>
<p style="text-align: justify;">Por outro lado tentar atribuir um ponteiro a um array gera um erro de compilação por tipos incompatíveis. Um array é um bloco de memória de n dados (bytes), já um ponteiro possui apenas um dado, um endereço. O compilador não tem como saber de antemão se um ponteiro aponta para uma área de 1, 2 ou 200 bytes.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">300</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pc <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Antes da atribuição<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cvet = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pc   = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(cvet) = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(pc)   = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
pc <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Depois da atribuição<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cvet = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pc   = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(cvet) = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(pc)   = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Note que antes da atribuição (linha 25) o ponteiro <strong>pc</strong>. está nulo, pois foi inicializado assim. Já os tamanhos indicam que o array possui 300 bytes e o ponteiro apenas 8 (minha máquina é um amd 64). Após a atribuição ambos passam a &#8220;apontar&#8221; para a mesma área de memória, porém os tamanhos não mudam. Houve um cast implicito de char[300] para char*, e nessa brincadeira o ponteiro <strong>pc</strong> não tem como saber o tamanho da área de memória para o qual ele aponta. Já o array <strong>cvet</strong> continua sabendo direitinho o que ele é, sem nenhuma crise existencial.</p>
<h2>Aritmética de ponteiros &#8211; Vulgo, e daí?</h2>
<p style="text-align: justify;">Ora, mas se eu sei que os dados numa matriz estão dispostos lado a lado, eu posso utilizar um ponteiro que vai pulando para o endereço ao lado e acessando o elemento seguinte. O nome disso é aritimética de ponteiros.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span>,<span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pc <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>pc <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span>pc<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666;">// Agora com inteiros</span>
<span style="color: #0000ff;">int</span> ivet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">2</span>, <span style="color: #0000dd;">3</span>, <span style="color: #0000dd;">4</span>, <span style="color: #0000dd;">5</span>, <span style="color: #0000dd;">6</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pi <span style="color: #000080;">=</span> ivet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%p = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pi, <span style="color: #000040;">*</span>pi<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Em duas dimensões</span>
<span style="color: #0000ff;">char</span> cmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span><span style="color: #008000;">&#125;</span>,<span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> ppc<span style="color: #008080;">;</span>
&nbsp;
ppc <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>cmat<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>ppc <span style="color: #000040;">+</span> <span style="color: #0000dd;">3</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span>j<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Na linha 18 o ponteiro <strong>pc</strong> passa a pontar para o array <strong>cvet</strong>, e consequentemente para o seu primeiro elemento, o caracter &#8216;B&#8217;. Na linha 21 o conteúdo de pc, que é o endereço onde foi armazenado o caracter &#8216;B&#8217;, é incrementado de i e em seguida de-referenciado. Na primeira passada o valor de i é zero, portanto é dereferenciado para o valor &#8216;B&#8217;. Nos passos seguintes, o endereço seguinte vai sendo de-referenciado para os outros caracteres armazenados no array original. É mais ou menos isso que internamente o compilador faz quando você utiliza a sintaxe cvet[i]. A abstração de array te dá uma forma mais amigável de tratar áreas contíguas de memória do que <strong>*(pc + i)</strong>.</p>
<p style="text-align: justify;">Mas se a abstração de array é mais simples, pra que utilizar aritmética de ponteiros?</p>
<p style="text-align: justify;">Uma das respostas está a linha 26. Ela faz a mesma coisa que a linha 21, porém um pouco mais rápido. Na sintaxe da linha 21, ou de forma semelhante, na sintaxe de array, o acesso a um dado qualquer pode ser resumido de forma bem grosseira nos comandos:</p>
<p style="text-align: justify;">
<ol>
<li>Tome o endereço base do array;</li>
<li>Adicione ao endereço o valor do índice;</li>
<li>De-referencie este novo endereço;</li>
</ol>
<p style="text-align: justify;">Já com aritmética de ponteiro ficaria assim:</p>
<p style="text-align: justify;">
<ol>
<li>De-referencie este endereço;</li>
</ol>
<p style="text-align: justify;">O comando incremento (ou a conta feita com endereços) não vou contar porque é parte do loop, embora <strong>i++;</strong> seja mais rápido que <strong>a = b + c;</strong>. Agora imagine esse pequeno ganho de 66% aplicado em uma área de dados de 1 MB. Serão mais de 2 milhões de comandos a menos!</p>
<p style="text-align: justify;">A técnica de utilizar um ponteiro para manipular uma área arbitrária de memória é utilizada geralmente em programação de baixo nível (mais próximo da máquina), manipulação de <a href="http://en.wikipedia.org/wiki/Data_buffer">buffers</a> e strings, entre outros truques sujos. Nas entranhas dos computadores, operações que varrem extensas áreas de memória, frequentemente são realizadas com aritimética de ponteiros. Nesse nível, <a href="http://en.wikipedia.org/wiki/Natural_selection">Darwin</a> reina supremo e só os mais preparados sobrevivem. A partir daqui a linguagem começa a dar um poder que só os puros de coração conseguem compreender.</p>
<p style="text-align: justify;">Uma observação importante é que entre as linhas 31 e 38 a experiência é repetida com inteiros. Note que como os inteiros possuem 4 bytes, os incrementos são automaticamente feitos de 4 em 4 bytes, e não de 1 em 1, ou seja o incremento é automaticamente calculado para sizeof(tipo). Incrementar um ponteiro significa acessar a próxima área de memória semelhante ao dado atual, e não apenas o próximo endereço. Como o tamanho de um char é um byte, quando incremetamos um ponteiro para char, avançamos apenas 1 byte. Se incrementarmos um ponteiro para double, avançaremos 8 bytes, e assim por diante.</p>
<p style="text-align: justify;">Outra observação é que uma matriz bidimensional pode ser &#8220;linearizada&#8221; conforme é mostrado nas linhas 40 a 52. Isso é útil, quando aplicável, para aproveitar melhor o cache do processador, por exemplo.</p>
<h2>void*, o <a href="http://en.wikipedia.org/wiki/Pansexuality">Pansexual</a> dos ponteiros</h2>
<p style="text-align: justify;">Anteriormente eu disse que só era possível atribuir um array a um ponteiro que fosse para o mesmo tipo que os dados do array. Eu menti descaramente! O motivo, é que para alguém que desistiu do post antes deste tópico, é mais seguro acreditar que não pode <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  !</p>
<p style="text-align: justify;">Existem duas exceções à regra. A primeira é quando há uma conversão explícita de tipos e o ponteiro destino &#8220;acha&#8221; que está apontando para o tipo certo. Um exemplo está na linha 44 do código anterior.</p>
<p style="text-align: justify;">A segunda é o caso dos ponteiros para void. Um ponteiro para void é um ponteiro que não faz exigências quanto ao tipo de dados que está na área de memória para o qual ele aponta. Ele é um ponteiro pra uma área genérica de memória, algo bem baixo nível.</p>
<p style="text-align: justify;">Para utilizar um dado apontado por um ponteiro para void, antes de de-referenciá-lo, é preciso fazer um cast explícito para algum tipo válido, pois se um int* é de-referenciado para int e um char* é de-referenciado para char, adivinhe para que é de-referenciado um void*?</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span>,<span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span><span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Erro de compilação.</span>
<span style="color: #666666;">//*pv</span>
<span style="color: #666666;">// Quanto vale sizeof(void)?</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>pv<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ponteiro para void são utilizados quando precisa-se apontar para uma área genérica de memória sem ter controle/conhecimento do tipo de dados que essa área contém, ou em funções que não podem fazer suposições sobre os tipos de seus parâmetros, como é o caso da API da lib <a href="https://computing.llnl.gov/tutorials/pthreads/">pthreads</a> (link arbitrário).</p>
<h2>Encerrando</h2>
<p style="text-align: justify;">Quanto mais nos aprofundamos nos tópicos sobre ponteiros, mais próximos da máquina ficamos. Boa parte do poder das linguagens C e C++ provém daí, e boa parte dos problemas também. A complexidade vai aumentando e os riscos também. Para muitos é aí que mora a diversão!</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/05/18/arrays.zip">arrays.zip</a> (todos os fontes do post);</li>
<li><a href="http://www.cplusplus.com/doc/tutorial/pointers/">Ponteiros no cplusplus.com</a></li>
<li><a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Ponteiros no blabos.org</a></li>
<li><a href="http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/">Referências no blabos.org</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/ponteiros-e-arrays/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TPM &#8211; Telepatia, Premonição e Milagre</title>
		<link>http://blog.blabos.org/2009/05/tpm-telepatia-premonicao-e-milagre/</link>
		<comments>http://blog.blabos.org/2009/05/tpm-telepatia-premonicao-e-milagre/#comments</comments>
		<pubDate>Thu, 07 May 2009 05:02:26 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Open Office]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=618</guid>
		<description><![CDATA[Certa vez trabalhei com uma equipe que cunhou a seguinte pérola: &#8220;Pra trabalhar aqui é preciso ter TPM &#8211; Telepatia, Premonição e Milagre&#8221;. Isso porque a equipe quase sempre trabalhava em duas cidades, tinha que prever as especificações de projeto que ainda não tivessem sido especificadas e por último fazer o Milagre acontecer. Os caras [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Certa vez trabalhei com uma equipe que cunhou a seguinte pérola: &#8220;Pra trabalhar aqui é preciso ter TPM &#8211; Telepatia, Premonição e Milagre&#8221;. Isso porque a equipe quase sempre trabalhava em duas cidades, tinha que prever as especificações de projeto que ainda não tivessem sido especificadas e por último fazer o Milagre acontecer. Os caras eram bons MESMO. Depois de alguns anos, hoje tive pistas de que posso ter encontrado outra equipe assim, ainda que em fase embrionária&#8230;</p>
<p><span id="more-618"></span></p>
<p style="text-align: justify;">Guardadas as devidas proporções, vamos aos fatos. Faculdade técnica, aula de humanas. Não poderia haver combinação mais explosiva. 60% da nota do semestre viria de um seminário sobre parte do livro <a href="http://www.submarino.com.br/produto/1/282969/gestao+a+brasileira?franq=275017">Gestão à Brasileira</a>. Trabalho em grupo. Grupo de 8 pessoas. Además, já que a gestão é à brasileira, o prazo para confecção do trabalho também o é. Ok, tá certo que tivemos um adiamento de uma semana por motivos de força maior, mas uma semana a mais em um prazo irrisório, continua irrisório. Mas somos brasileiros e não desistimos nunca!</p>
<p style="text-align: justify;">Eu sou um cara relativamente sortudo, de forma que pude escolher trabalhar com mais 7 pessoas de extrema competência. Tanto é que em todas as fases do <del>projeto</del> trabalho, <strong>todos</strong> estavam efetivamente envolvidos e produzindo, o que é mais incrível.</p>
<p style="text-align: justify;">Nesta fase apareceram os primeiros telepatas. Seres superiores capazes de fazer o trabalho sem terem lido o texto base, apenas pegando as idéias telepaticamente dos que leram. Os telepatas restantes surgiram na hora de fazer os slides da apresentação, pois fizemos em pedaços meticulosamente encaixáveis, telepaticamente, óbvio!</p>
<p style="text-align: justify;">Mas pessoas diferentes tem necessidades diferentes. Com 8 pessoas trabalhando em partes separadas, cada um utilizou sua suite Office&reg; preferida (2000, 2003, 2007&#8230;). Só mesmo um trouxa inventou de usar aquela porcaria do <a href="http://www.openoffice.org">Open Office</a>, aquela merda.</p>
<p style="text-align: justify;">Eis que para a surpresa de todos (inclusive do trouxa que vos fala), certa suite de escritório proprietária mostrou-se incompatível consigo mesma. Como assim Bial? Calma que o tio explica. Primeiramente a versão da SOP (suite office proprietária) onde faríamos a apresentação, especulava-se ser a 2000 (eu não fui conferir). Segundamente, eu não sei por que, eu não sei como e eu não me importo, quando tentávamos salvar na SOP 2007 um conjunto de slides no formato SOP 2003 dava uma merda federal. Era fonte preta que ficava branca, era tamanho de fonte que mudava e não me pergunte, eu não entendo do assunto, os slides com imagens e textos eram transformados em imagens.</p>
<p style="text-align: justify;">Até aí tudo bem (pelo menos pra mim que não tive que refazer slide). Montaram uma operação de guerra com pacotes instaláveis via pendrive, cds e tudo mais.</p>
<p style="text-align: justify;">Quarta feira tensa. Organicamente muito ruim pra mim. Meu dia foi começar a ficar suportável depois das 13:00hs. O que sobrou de mim, repassava o texto, fazia resumos e torcia para chegar inteiro até o momento da apresentação. Meu dia de vidente. Levo note, não levo note? Vou levar o Eee. Maldito peso extra! Outro vidente levou seu note com software proprietário. Os outros confiaram na operação de guerra com tripla redundância: CD, pendrive com SOP instalável e MP4.</p>
<p style="text-align: justify;">Eis que aos 45 do segundo tempo descobrimos que a besta que vos fala replicou 3 textos em um slide. Vamos alterar, moleza! Infelizmente a vesão da SOP do outro vidente era mais recente que versão dos arquivos. Putz, o que é mesmo interoperabilidade? E INTRAoperabilidade? E Retrocompatibilidade? Que pena, pelo visto as SOPs em questão desconhecem todos esses conceitos. Resultado: Fodeu. Não me pergunte como, texto foi salvo como imagem, fonte trocou de cor e o escambau.</p>
<p style="text-align: justify;">Já quase conformados com a idéia de ter que reformatar todo o trabalho em 15 min, resolvi abrir o arquivo em formato proprietário com aquela bosta de <a href="http://www.openoffice.org">Open Office</a>. Resultado: Milagre! O <a href="http://www.openoffice.org">Open Office</a> conseguiu recuperar boa parte do trabalho. Daí, 3 ou 4 ajustes e os slides estavam corrigidos. Só tinha um pequeno problema. A máquina onde faríamos a apresentação não entendia ODF, e salvar no formato da SOP destruía a formatação. Ah Eee, você tem saída VGA! Despluga, pluga, nada. Reboot plugado e tã-dãm! Simplesmente funciona. Eee plugado no projetor e funcionando.</p>
<p style="text-align: justify;">Moral da história: <a href="http://www.openoffice.org">Open Office</a> + Eee = Trabalho apresentado, nota garantida. Até o próximo semestre (nesta matéria).</p>
<p style="text-align: justify;">Não me pergunte porque foi tão difícil dominar uma suite office. Não me interessa. Eu não quero ler um manual de 6000 páginas pra poder fazer um conjunto de slides simples, somente com texto e imagens, sem efeitos. Não é isso que os defensores do software proprietário bradam? Que simplesmente funciona? Que o <a href="http://www.openoffice.org">Open Office</a> é uma merda? Ok, pode até ser, mas pelo menos é uma merda que fede, que faz  que se propõe a fazer. Não me interessa qual versão roda na faculdade ou na sua casa. Eu quero poder compartilhar arquivos sem surpresas com meus 7 colegas de grupo, cada um com o software que melhor lhe servir. Eu quero interoperabilidade. Não me interessa se o <a href="http://www.openoffice.org">Open Office</a> não é a borboleta coloria faiscante sueca que você quer. Eu quero que simplesmente funcione. Que seja simples. Que seja intuitivo. Que eu não precise perder tempo refatorando slide. Tempo esse que eu poderia estar estudando Cálculo, Grafos ou o que mais fosse.</p>
<p style="text-align: justify;">Não me interessa se você me chamar de burro por não conseguir fazer slide em suite sofisticada. Eu não quero ter que reservar uma área do meu cérebro para descobrir como usar um software de fazer slide, pra aula de humanas (com o devido respeito). Eu quero gastar meu cérebro entendendo como se comporta uma derivada parcial com n variáveis num espaço de m dimensões, pra entender e argumentar quando um livro de cálculo trás curvas de níveis desenhadas ao contrário. Eu quero gastar meu cérebro entendendo que apesar de uma referência existir e ocupar memória, um operador nunca opera sobre ela.</p>
<p style="text-align: justify;">Não faço Ciência da Computação pra aprender a ser operador de planilha ou arrastador de caixinha colorida.</p>
<p style="text-align: justify;">Creio que devemos umas cervejas ao pessoal do <a href="http://www.openoffice.org">Open Office</a> pelo excelente trabalho de engenharia reversa sobre formatos proprietários. Você poderiam dar umas aulas para o pessoal de certa empresa de software, pra que eles aprendam a ser mais compatíveis com eles mesmos. A partir de hoje vocês ganharam por tempo indeterminado um banner (feio que dói) no blog, na faixa.</p>
<p style="text-align: justify;">Ao pessoal do grupo meus sinceros agradecimentos por um trabalho bem feito e bem apresentado. É sempre uma honra poder trabalhar com os melhores.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/tpm-telepatia-premonicao-e-milagre/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Buy Me a Beer</title>
		<link>http://blog.blabos.org/2009/05/buy-me-a-beer/</link>
		<comments>http://blog.blabos.org/2009/05/buy-me-a-beer/#comments</comments>
		<pubDate>Tue, 05 May 2009 03:38:38 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Bla Bla Bla]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=611</guid>
		<description><![CDATA[Quem me indicou foi a Lu. Eu sinceramente não sei como ela acha essas coisas ou se essas coisas é que acham ela, mas enfim, a idéia é super simples e eu achei o máximo. Com vocês, Buy me a Beer!
O Gênio por trás dessa revolucionária idéia atende pela alcunha de Ankesh Kothari. Segundo ele, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Quem me indicou foi a Lu. Eu sinceramente não sei como ela acha essas coisas ou se essas coisas é que acham ela, mas enfim, a idéia é super simples e eu achei o máximo. Com vocês, <a href="http://www.blogclout.com/blog/goodies/buy-me-a-beer-paypal-donation-plugin">Buy me a Beer</a>!</p>
<p style="text-align: justify;">O Gênio por trás dessa revolucionária idéia atende pela alcunha de <a href="http://www.blogclout.com/blog/about-ankesh-kothari">Ankesh Kothari</a>. Segundo ele, pedir para pessoas doarem dinheiro por uma razão específica é cerca de <a href="http://www.blogclout.com/blog/the-power-of-specific-phrasing">200%</a> mais eficaz do que um simples &#8220;Donate Money&#8221;. No meu caso, zero + 200% continua zero. No caso dele, acabou de ganhar 3 links e uma cerveja!</p>
<p style="text-align: justify;">Por isso, se você gostou de algum post deste blog, junte-se à nossa campanha e <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&#038;business=blabos@blabos.org&#038;currency_code=&#038;amount=&#038;return=&#038;item_name=Buy+Me+a+Beer+for+Byu+me+a+Beer">Buy Me a Beer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/buy-me-a-beer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
