<?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>CODARE</title>
	<atom:link href="http://codare.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://codare.net</link>
	<description>Programadores, uni-vos!</description>
	<lastBuildDate>Tue, 29 Sep 2009 12:00:01 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codare.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/d9589f1266f7b80a398397e3165f7c56?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>CODARE</title>
		<link>http://codare.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://codare.net/osd.xml" title="CODARE" />
	<atom:link rel='hub' href='http://codare.net/?pushpress=hub'/>
		<item>
		<title>Python: Adicionar argumentos ao método Bind (wxPython)</title>
		<link>http://codare.net/2009/09/29/python-adicionar-argumentos-ao-metodo-bind-wxpython/</link>
		<comments>http://codare.net/2009/09/29/python-adicionar-argumentos-ao-metodo-bind-wxpython/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 12:00:01 +0000</pubDate>
		<dc:creator>Lauro Cesar</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://codare.net/?p=519</guid>
		<description><![CDATA[O método Bind() no wxPython permite associar métodos a eventos. Por exemplo: Bind(wx.EVT_BUTTON, sys.exit(), id=ID_BUTTON) Ao clicar, o método exit() é disparado. Para permitir que o método disparado receba argumentos, podemos utilizar: botao =  wx.Button(self, -1, "Instalar") Bind(wx.EVT_BUTTON, lambda event: Metodo(event, 'argumento'), botao) def Metodo(self, argumento):     print argumento<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=519&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O método Bind() no wxPython permite associar métodos a eventos. Por exemplo:</p>
<pre>Bind(wx.EVT_BUTTON, sys.exit(), id=ID_BUTTON)</pre>
<p>Ao clicar, o método exit() é disparado.</p>
<p>Para permitir que o método disparado receba argumentos, podemos utilizar:</p>
<pre>botao =  wx.Button(self, -1, "Instalar")

Bind(wx.EVT_BUTTON, lambda event: Metodo(event, 'argumento'), botao)

def Metodo(self, argumento):
    print argumento</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/519/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=519&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/09/29/python-adicionar-argumentos-ao-metodo-bind-wxpython/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3e695c2389b7d5dfae9b15bd39b3379c?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">olarva</media:title>
		</media:content>
	</item>
		<item>
		<title>Python: Introspeção de atributos e métodos com vars(), locals() e dir()</title>
		<link>http://codare.net/2009/09/25/python-introspecao-de-atributos-e-metodos-com-vars-locals-e-dir/</link>
		<comments>http://codare.net/2009/09/25/python-introspecao-de-atributos-e-metodos-com-vars-locals-e-dir/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 12:00:59 +0000</pubDate>
		<dc:creator>Lauro Cesar</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[atributos]]></category>
		<category><![CDATA[locals]]></category>
		<category><![CDATA[vars]]></category>

		<guid isPermaLink="false">http://codare.net/?p=479</guid>
		<description><![CDATA[Para descobrir os atributos de um objeto podemos utilizar: objeto.__dict__ vars(objeto) Para descobrir os atributos de uma classe: vars(Classe()) Se utilizar vars() sem argumentos, funciona como locals(), listando todas as variáveis. Para listar métodos e atributos de um objeto: dir(objeto)<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=479&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Para descobrir os atributos de um objeto podemos utilizar:</p>
<pre>objeto.__dict__

vars(objeto)</pre>
<p>Para descobrir os atributos de uma classe:</p>
<pre>vars(Classe())</pre>
<p>Se utilizar vars() sem argumentos, funciona como locals(), listando todas as variáveis.</p>
<p>Para listar métodos e atributos de um objeto:</p>
<pre>dir(objeto)</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/479/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/479/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/479/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/479/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/479/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/479/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/479/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/479/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=479&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/09/25/python-introspecao-de-atributos-e-metodos-com-vars-locals-e-dir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3e695c2389b7d5dfae9b15bd39b3379c?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">olarva</media:title>
		</media:content>
	</item>
		<item>
		<title>JavaScript: Fazer o label do checkbox ser clicável</title>
		<link>http://codare.net/2009/08/06/javascript-fazer-o-label-do-checkbox-ser-clicavel/</link>
		<comments>http://codare.net/2009/08/06/javascript-fazer-o-label-do-checkbox-ser-clicavel/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 12:00:24 +0000</pubDate>
		<dc:creator>Aurélio</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[clique]]></category>
		<category><![CDATA[label]]></category>
		<category><![CDATA[onClick]]></category>

		<guid isPermaLink="false">http://codare.net/?p=511</guid>
		<description><![CDATA[É comum usar checkboxes nas configurações ou na interface de seu site. Ao clicar nela alguma coisa é ligada, ao clicar novamente é desligada. Simples, não? [X] Fundo colorido O código para fazer uma opção destas é trivial: &#60;input id="fundo" onClick="trocaFundo()" type="checkbox"&#62; Fundo colorido No evento onClick é chamada a função trocaFundo(), que se encarrega [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=511&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>É comum usar checkboxes nas configurações ou na interface de seu site. Ao clicar nela alguma coisa é ligada, ao clicar novamente é desligada. Simples, não?</p>
<pre>[X] Fundo colorido</pre>
<p>O código para fazer uma opção destas é trivial:</p>
<pre>&lt;input id="fundo" onClick="trocaFundo()" type="checkbox"&gt;
Fundo colorido</pre>
<p>No evento onClick é chamada a função trocaFundo(), que se encarrega de ligar ou desligar as cores no fundo do site. Até aí tudo bem.</p>
<p>O que é chato mesmo, é o usuário ter que mirar precisamente na caixinha do checkbox para poder ligar/desligar a opção. Uma interface mais amigável deveria permitir que o usuário também pudesse clicar no próprio texto de descrição (label) da opção, o &#8220;Fundo colorido&#8221;. Com mais área para cliques, o uso do site torna-se mais confortável.</p>
<p>Para fazer esse label clicável, basta adicionar o evento onClick nele também. E o que esse evento fará? Você pode colocar ali um &#8220;trocaFundo()&#8221; também, para ficar igual ao onClick do checkbox.</p>
<pre>&lt;input id="fundo" <strong>onClick="trocaFundo()"</strong> type="checkbox"&gt;
&lt;span <strong>onClick="trocaFundo()"</strong>&gt;Fundo colorido&lt;/span&gt;</pre>
<p>Mas duplicar coisas não é bom. Se você ainda não aprendeu isso, pode deixar que a experiência um dia te ensinará. E se a trocaFundo() recebesse um <strong>this</strong> para identificar de onde veio o clique, também não funcionaria.</p>
<p>Uma solução mais robusta é fazer com que ao clicar no label, seja feito um clique &#8220;virtual&#8221; na própria checkbox. Deste modo, para a lógica do seu programa, é como se o usuário tivesse de fato clicado na checkbox.</p>
<pre>&lt;input id="fundo" onClick="trocaFundo()" type="checkbox"&gt;
&lt;span onClick="<strong>document.getElementById('fundo').click()</strong>"&gt;
Fundo colorido
&lt;/span&gt;</pre>
<p><strong>Atualização:<br />
</strong> Quando escrevi este texto, eu não sabia que a tag LABEL era clicável e que ao clicar nela, o checkbox atrelado a ela era marcado/desmarcado. Muito obrigado a todos que comentaram sobre isso!</p>
<p>Assim sendo, não é preciso essa gambiarra JavaScript que eu sugeri, basta apenas usar a tag correta:</p>
<pre>&lt;input id="fundo" onClick="trocaFundo()" type="checkbox"&gt;
&lt;<strong>label</strong> for="<strong>fundo</strong>"&gt;Fundo colorido&lt;/label&gt;</pre>
<p>O atributo for leva o nome do checkbox ao qual esta label está atrelada. E pronto, só isso. O navegador se encarregará de fazer o resto.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/511/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/511/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/511/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=511&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/08/06/javascript-fazer-o-label-do-checkbox-ser-clicavel/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e583bca48acb877efd4a29229bf7927f?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">verde</media:title>
		</media:content>
	</item>
		<item>
		<title>C: Escondendo o conteúdo de structs com tipos incompletos</title>
		<link>http://codare.net/2009/08/04/c-escondendo-o-conteudo-de-structs-com-tipos-incompletos/</link>
		<comments>http://codare.net/2009/08/04/c-escondendo-o-conteudo-de-structs-com-tipos-incompletos/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 12:00:36 +0000</pubDate>
		<dc:creator>Thiago Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[biblioteca]]></category>
		<category><![CDATA[encapsulation]]></category>
		<category><![CDATA[incomplete type]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[struct]]></category>

		<guid isPermaLink="false">http://codare.net/?p=476</guid>
		<description><![CDATA[Algumas vezes é possível utilizar alguns paradigmas de orientação à objetos em C. Ao se projetar uma biblioteca, podemos encapsular o conteúdo das structs usando tipos incompletos e provendo funções para manipular o conteúdo destas. Imagine uma biblioteca que cria um &#8220;objeto&#8221; para representar uma pessoa. Esta biblioteca provê um cabeçalho person.h com funções para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=476&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes é possível utilizar alguns paradigmas de orientação à objetos em C. Ao se projetar uma biblioteca, podemos encapsular o conteúdo das <strong>structs</strong> usando tipos incompletos e provendo funções para manipular o conteúdo destas.</p>
<p>Imagine uma biblioteca que cria um &#8220;objeto&#8221; para representar uma pessoa. Esta biblioteca provê um cabeçalho <strong>person.h</strong> com funções para manipular o &#8220;objeto&#8221;.</p>
<pre>typedef struct person person;

person *person_new(char *name, int age);
void person_free(person *handler);
void person_print(person *handler);</pre>
<p>Note que não existe uma descrição da <strong>struct person</strong> no cabeçalho. A única forma então de manipular esta <strong>struct</strong> é usando as funções, porque os atributos da <strong>struct</strong> não são conhecidos. Esta <strong>struct</strong> portanto caracteriza um tipo incompleto, mas apenas do ponto de vista dos usuários da biblioteca. Em sua implementação, a biblioteca conhece o conteúdo de <strong>person</strong> e consegue manipulá-los, como vemos a seguir.</p>
<pre>#include &lt;string.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include "person.h"

struct person {
    char *name;
    int age;
};

person *person_new(char *name, int age)
{
    person *new = malloc(sizeof(*new));

    new-&gt;name = strdup(name);
    new-&gt;age = age;

    return new;
}

void person_free(person *handler)
{
    free(handler-&gt;name);
    free(handler);
}

void person_print(person *handler)
{
    printf("%s - %d\n", handler-&gt;name, handler-&gt;age);
}</pre>
<p>A vantagem de se encapsular os dados, forçando esta política através da técnica apresentada, é que a implementação da biblioteca pode ser alterada sem impacto em seus clientes. <strong>person_new</strong> poderia checar a validade do atributo <strong>age</strong>, retornando um ponteiro nulo caso seja passado uma idade negativa. O código seguinte ilustra um possível cliente da biblioteca, note que não há referência aos atributos de <strong>struct person</strong>.</p>
<pre>#include &lt;person.h&gt;

int main(void)
{
    person *mike = person_new("Mike", 21);

    person_print(mike);
    person_free(mike);

    return 0;
}</pre>
<p>A primeira vez que vi uma biblioteca fazendo uso extenso desta técnica foi no projeto <a href="http://www.opensync.org/">OpenSync</a>, que inspirou este post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/476/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/476/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/476/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/476/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/476/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/476/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/476/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=476&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/08/04/c-escondendo-o-conteudo-de-structs-com-tipos-incompletos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b0cc38b3fd34093be7be0818d07c37ac?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">Thiago Santos</media:title>
		</media:content>
	</item>
		<item>
		<title>Shell: Extrair os números do CPF formatado</title>
		<link>http://codare.net/2009/07/31/shell-extrair-os-numeros-do-cpf-formatado/</link>
		<comments>http://codare.net/2009/07/31/shell-extrair-os-numeros-do-cpf-formatado/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 12:00:18 +0000</pubDate>
		<dc:creator>Aurélio</dc:creator>
				<category><![CDATA[Shell]]></category>
		<category><![CDATA[apagar]]></category>
		<category><![CDATA[CPF]]></category>
		<category><![CDATA[números]]></category>
		<category><![CDATA[pontuação]]></category>
		<category><![CDATA[tr]]></category>

		<guid isPermaLink="false">http://codare.net/?p=507</guid>
		<description><![CDATA[O tr é um comando muito versátil, especialmente útil para apagar caracteres indesejados. Digamos que você peça ao usuário para digitar o número do CPF. Esse número poderá vir das mais diferentes formas, com espaços, hífens, pontos, ponto-e-vírgula e sabe mais o que que a criatividade da pessoa pode produzir. Para preservar sua sanidade, tudo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=507&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O tr é um comando muito versátil, especialmente útil para apagar caracteres indesejados.</p>
<p>Digamos que você peça ao usuário para digitar o número do CPF. Esse número poderá vir das mais diferentes formas, com espaços, hífens, pontos, ponto-e-vírgula e sabe mais o que que a criatividade da pessoa pode produzir.</p>
<p>Para preservar sua sanidade, tudo o que você quer são os números, ignorando toda a pontuação, espaços e outros caracteres. Com o tr é fácil.</p>
<pre>$ echo 123.456.789-00 | tr -d 0-9
..-</pre>
<p>A opção -d apaga coisas e o 0-9 representa os números de zero a nove. Ah, note que não é necessário o uso de colchetes ao redor &#8220;[0-9]&#8220;, como muita gente costuma fazer.</p>
<p>Mas este comando apagou os números e deixou a pontuação, quando o desejado é o justamente o contrário. Então basta usar a opção -c, que inverte o sentido da expressão, fazendo o tr apagar tudo <strong>exceto</strong> os números:</p>
<pre>$ echo 123.456.789-00 | tr -c -d 0-9
12345678900</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/507/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=507&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/07/31/shell-extrair-os-numeros-do-cpf-formatado/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e583bca48acb877efd4a29229bf7927f?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">verde</media:title>
		</media:content>
	</item>
		<item>
		<title>C/C++: cannot open shared object file</title>
		<link>http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/</link>
		<comments>http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 12:00:40 +0000</pubDate>
		<dc:creator>Thiago Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[CPP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[-rpath]]></category>
		<category><![CDATA[biblioteca]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[ld]]></category>
		<category><![CDATA[LD_LIBRARY_PATH]]></category>
		<category><![CDATA[linker]]></category>
		<category><![CDATA[shared libraries]]></category>

		<guid isPermaLink="false">http://codare.net/?p=481</guid>
		<description><![CDATA[As bibliotecas compartilhadas são carregadas no início da execução de um programa. No Linux, o dynamic loader procura pelas bibliotecas em /lib e /usr/lib. Caso a biblioteca não esteja presente neste caminho, recebemos uma mensagem de erro parecida com a mensagem a seguir: error while loading shared libraries: libfoo.so: cannot open shared object file: No [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=481&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As bibliotecas compartilhadas são carregadas no início da execução de um programa. No Linux, o dynamic loader procura pelas bibliotecas em /lib e /usr/lib. Caso a biblioteca não esteja presente neste caminho, recebemos uma mensagem de erro parecida com a mensagem a seguir:</p>
<pre>error while loading shared libraries: libfoo.so:
  cannot open shared object file: No such file or directory</pre>
<p>Imagine um ambiente de desenvolvimento, onde estamos codificando uma biblioteca. Não queremos instalar esta biblioteca no sistema só para testá-la. Uma alternativa é configurar a variável de ambiente LD_LIBRARY_PATH, apontando para o diretório onde se encontra o binário da biblioteca. Assim o dynamic loader vai procurar pela biblioteca também neste diretório.</p>
<pre>$ export LD_LIBRARY_PATH=/home/user/libfoo/</pre>
<p>Uma segunda opção seria no momento em que seu programa é &#8220;linkado&#8221;, passar o caminho da biblioteca para a opção -rpath do linker. Isto coloca o caminho de busca pela biblioteca dentro da estrutura do executável (<a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF</a>). A opção -Wl do gcc serve para passar parâmetros para o linker (usando &#8220;,&#8221; no lugar de espaço) que é chamado automaticamente após a compilação.</p>
<pre>$ gcc -shared -Wall -o libfoo.so foo.c</pre>
<pre>$ gcc -Wall -o test test.c -L/home/user/libfoo/ -lfoo</pre>
<pre>$ ./test <strong># Erro! Não acha a biblioteca libfoo.so</strong></pre>
<pre>$ gcc -Wall -Wl,-rpath,/home/user/libfoo/ -o test test.c \
  -L/home/user/libfoo/ -lfoo</pre>
<pre>$ ./test <strong># Funciona!</strong></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/481/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=481&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/07/29/cc-cannot-open-shared-object-file/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b0cc38b3fd34093be7be0818d07c37ac?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">Thiago Santos</media:title>
		</media:content>
	</item>
		<item>
		<title>Tcl/Tk: sondagem do sistema com variáveis</title>
		<link>http://codare.net/2009/06/22/tcltk-sondagem-do-sistema-com-variaveis/</link>
		<comments>http://codare.net/2009/06/22/tcltk-sondagem-do-sistema-com-variaveis/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 12:00:34 +0000</pubDate>
		<dc:creator>LES</dc:creator>
				<category><![CDATA[Tcl-Tk]]></category>
		<category><![CDATA[argc]]></category>
		<category><![CDATA[argv]]></category>
		<category><![CDATA[env]]></category>
		<category><![CDATA[errorInfo]]></category>
		<category><![CDATA[Tcl/Tk]]></category>
		<category><![CDATA[tcl_patchLevel]]></category>
		<category><![CDATA[tcl_platform]]></category>
		<category><![CDATA[variáveis]]></category>

		<guid isPermaLink="false">http://codare.net/?p=465</guid>
		<description><![CDATA[Às vezes, ajuda muito poder examinar determinadas condições do sistema enquanto um programa/script é executado, mais ou menos como quem está voando e verifica as condições meteorológicas. Não só em procedimentos de depuração, embora eu ache que estes sejam os casos mais comuns. Na dica anterior, eu falei de introspecção com o comando [info]. Agora, veja que informações importantes pode-se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=465&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Às vezes, ajuda muito poder examinar determinadas condições do sistema enquanto um programa/script é executado, mais ou menos como quem está voando e verifica as condições meteorológicas. Não só em procedimentos de depuração, embora eu ache que estes sejam os casos mais comuns.</p>
<p>Na dica anterior, eu falei de <a href="http://codare.net/2009/06/08/tcltk-introspeccao-com-comando-info/">introspecção com o comando [info]</a>. Agora, veja que informações importantes pode-se obter de determinadas variáveis. Assim como a linguagem Bash tem uma série de <a href="http://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html">variáveis reservadas</a> para informações de depuração, Tcl/Tk tem as suas.</p>
<ul>
<li><strong>env:</strong> contém um array com as variáveis de ambiente e seus respectivos valores. Tanto a forma quanto o conteúdo são muito parecidos com o que é retornado pelos comandos &#8216;env&#8217; e &#8216;printenv&#8217; em Bash. Para examinar um array, use o comando parray, e.g. [parray env].</li>
<li><strong>tcl_platform:</strong> outro array, este contém informações sobre a plataforma. O item mais valioso costuma ser $tcl_platform(platform), que indica se o ambiente é Windows, Linux/Unix ou Mac, <a href="http://wiki.tcl.tk/2420">entre outros</a>. Com esta informação, fica fácil adaptar um programa para que ele rode em diversas plataformas sem engasgar nem pedir ajuda ao usuário. Exemplos da minha máquina:
<pre>tcl_platform(platform)    = unix
tcl_platform(os)          = Linux
tcl_platform(osVersion)   = 2.6.24-23-generic
tcl_platform(machine)     = i686
tcl_platform(byteOrder)   = littleEndian</pre>
</li>
<li><strong>tcl_patchLevel:</strong> é uma variável escalar que contém o número exato da versão de Tcl/Tk que está sendo usada para executar o programa. Por exemplo, 8.5.4. Serve para gerar mensagens de erro e admoestar o usuário caso ele esteja usando uma versão muito antiga de Tcl/Tk. Muita coisa importante só foi incorporada a partir da versão 8.4.0 (setembro de 2002).</li>
<li><strong>errorInfo:</strong> variável escalar, contém o texto de erro do último erro registrado durante a execução do programa. A maioria das linguagens interrompe a execução do programa em caso de erro. Em Tcl/Tk, é muito fácil ajustar o programa para ignorar erros e seguir em frente. Neste caso, o último erro ocorrido fica registrado nesta variável.</li>
<li><strong>argv:</strong> variável escalar, contém a lista dos argumentos com que o programa foi executado. Informação indispensável para a execução da maioria dos scripts. Se o programa não for executado com nenhum argumento, argv retorna vazia.</li>
<li><strong>argc:</strong> variável escalar, contém o número de argumentos com que o programa foi executado. É o mesmo que [llength $argv]. Serve para confirmar se o programa foi executado com o número mínimo, máximo ou exato de argumentos que o programa exige. Se o programa não for executado com nenhum argumento, argc retorna o número 0.</li>
</ul>
<p>Mais informações em <a href="http://www.tcl.tk/man/tcl8.5/TclCmd/tclvars.htm">http://www.tcl.tk/man/tcl8.5/TclCmd/tclvars.htm</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/465/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=465&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/22/tcltk-sondagem-do-sistema-com-variaveis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/918383976082577131a6b72f95f58fd5?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">LES</media:title>
		</media:content>
	</item>
		<item>
		<title>Shell: Extrair o último caractere da linha</title>
		<link>http://codare.net/2009/06/19/shell-extrair-o-ultimo-caractere-da-linha/</link>
		<comments>http://codare.net/2009/06/19/shell-extrair-o-ultimo-caractere-da-linha/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 19:26:45 +0000</pubDate>
		<dc:creator>Aurélio</dc:creator>
				<category><![CDATA[Shell]]></category>
		<category><![CDATA[variável]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[expansão]]></category>
		<category><![CDATA[cut]]></category>
		<category><![CDATA[rev]]></category>
		<category><![CDATA[último]]></category>

		<guid isPermaLink="false">http://codare.net/?p=472</guid>
		<description><![CDATA[Com o comando cut é fácil extrair o primeiro, segundo ou qualquer outro caractere da linha. Porém, é preciso saber a posição exata deste caractere para informá-la ao cut. $ echo abcdef &#124; cut -c 1 a $ echo abcdef &#124; cut -c 2 b $ echo abcdef &#124; cut -c 3 c E se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=472&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Com o comando cut é fácil extrair o primeiro, segundo ou qualquer outro caractere da linha. Porém, é preciso saber a posição exata deste caractere para informá-la ao cut.</p>
<pre>$ echo abcdef | cut -c 1
a
$ echo abcdef | cut -c 2
b
$ echo abcdef | cut -c 3
c</pre>
<p>E se você quiser extrair o último caractere, independente do tamanho da linha em questão?</p>
<p>A primeira solução é saber qual a posição exata deste último caractere. Supondo que a linha está guardada em uma variável, use o modificador # para obter o tamanho do conteúdo da variável, ou seja, o tamanho da linha.</p>
<pre>$ linha="abcdef"
$ echo ${#linha}
6</pre>
<p>Agora sim, você pode usar esse truque para obter o último caractere:</p>
<pre>$ echo $linha | cut -c ${#linha}
f</pre>
<p>Há ainda uma outra solução, que envolve pensar diferente. Em vez de contornar a limitação do cut apelando para a expansão de variáveis do shell, que tal modificar nosso problema para que ele se enquadre nas possibilidades do cut?</p>
<ul>
<li>O problema: extrair o último caractere.</li>
<li>O cut: sabe extrair o primeiro caractere.</li>
<li>Solução: tem como fazer o último caractere ser o primeiro?</li>
</ul>
<p>O comando rev inverte a linha, fazendo com que o último caractere seja o primeiro, e vice-versa:</p>
<pre>$ echo abcdef | rev
fedcba</pre>
<p>Agora sim, já que nossa linha-problema foi modificada para satisfazer o cut, podemos usá-lo normalmente:</p>
<pre>$ echo abcdef | rev | cut -c 1
f</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/472/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=472&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/19/shell-extrair-o-ultimo-caractere-da-linha/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e583bca48acb877efd4a29229bf7927f?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">verde</media:title>
		</media:content>
	</item>
		<item>
		<title>Google recomenda CODARE</title>
		<link>http://codare.net/2009/06/19/google-recomenda-codare/</link>
		<comments>http://codare.net/2009/06/19/google-recomenda-codare/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 18:37:56 +0000</pubDate>
		<dc:creator>Aurélio</dc:creator>
				<category><![CDATA[__codare]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://codare.net/?p=461</guid>
		<description><![CDATA[Pelo menos o Google Reader (leitor de feeds RSS/Atom), recomenda: ;) Obrigado ao Rodrigo Stulzer pelo aviso e envio da imagem!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=461&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pelo menos o <a href="http://www.google.com.br/reader/">Google Reader</a> (leitor de feeds RSS/Atom), recomenda:</p>
<p><img class="alignnone size-medium wp-image-462" title="google-recomenda-codare" src="http://codare.files.wordpress.com/2009/06/google-recomenda-codare.png?w=300&#038;h=155" alt="google-recomenda-codare" width="300" height="155" /></p>
<p>;)</p>
<p>Obrigado ao <a href="http://stulzer.net">Rodrigo Stulzer</a> pelo aviso e envio da imagem!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/461/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/461/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/461/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/461/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/461/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/461/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/461/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/461/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=461&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/19/google-recomenda-codare/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e583bca48acb877efd4a29229bf7927f?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">verde</media:title>
		</media:content>

		<media:content url="http://codare.files.wordpress.com/2009/06/google-recomenda-codare.png?w=300" medium="image">
			<media:title type="html">google-recomenda-codare</media:title>
		</media:content>
	</item>
		<item>
		<title>C: Múltiplos programas no mesmo binário</title>
		<link>http://codare.net/2009/06/10/c-multiplos-programas-no-mesmo-binario/</link>
		<comments>http://codare.net/2009/06/10/c-multiplos-programas-no-mesmo-binario/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 12:00:06 +0000</pubDate>
		<dc:creator>Thiago Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[argv]]></category>
		<category><![CDATA[busybox]]></category>
		<category><![CDATA[symlink]]></category>

		<guid isPermaLink="false">http://codare.net/?p=443</guid>
		<description><![CDATA[Um mesmo aplicativo pode se comportar de forma diferente dependendo da forma como é invocado. No exemplo a seguir, o mesmo programa é usado para calcular a raiz quadrada e potência de dois de um dado argumento. #include &#60;libgen.h&#62; #include &#60;math.h&#62; #include &#60;stdio.h&#62; #include &#60;stdlib.h&#62; #include &#60;string.h&#62; int main(int argc, char **argv) { double res; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=443&subd=codare&ref=&feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Um mesmo aplicativo pode se comportar de forma diferente dependendo da forma como é invocado. No exemplo a seguir, o mesmo programa é usado para calcular a raiz quadrada e potência de dois de um dado argumento.</p>
<pre>#include &lt;libgen.h&gt;
#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

int main(int argc, char **argv)
{
    double res;
    char *program = basename(argv[0]);

    if (argc != 2)
        return 1;

    if (!strcmp(program, "sqrt")) {
        res = sqrt(atof(argv[1]));
        printf("%f\n", res);
        return 0;
    }

    if (!strcmp(program, "pow2")) {
        res = pow(atof(argv[1]), 2);
        printf("%f\n", res);
        return 0;
    }

    printf("Invalid program: %s\n", program);

    return 1;
}</pre>
<p>O truque consiste em analisar o primeiro argumento que corresponde ao caminho do binário do programa. No exemplo, decidimos qual ação tomar comparando o nome do programa com &#8220;sqrt&#8221; e &#8220;pow2&#8243;. Para não fazer múltiplas cópias do binário gerado, fazemos links simbólicos.</p>
<pre>$ gcc -Wall -lm -o test test.c
$ ln -s test sqrt
$ ln -s test pow2

$ ./test 5
Invalid program: test

$ ./pow2 5
25.000000

$ ./sqrt 5
2.236068</pre>
<p>A técnica é extensamente utilizada no <a href="http://www.busybox.net/">BusyBox</a> e pode facilmente ser implementada em qualquer outra linguagem de programação.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/codare.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/codare.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/443/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=443&subd=codare&ref=&feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/10/c-multiplos-programas-no-mesmo-binario/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b0cc38b3fd34093be7be0818d07c37ac?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">Thiago Santos</media:title>
		</media:content>
	</item>
	</channel>
</rss>