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

<channel>
	<title>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>Mon, 22 Jun 2009 12:00:34 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/d9589f1266f7b80a398397e3165f7c56?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>CODARE</title>
		<link>http://codare.net</link>
	</image>
			<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>

		<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 obter [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=465&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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>
  <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/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" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/22/tcltk-sondagem-do-sistema-com-variaveis/feed/</wfw:commentRss>
		<slash:comments>0</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[último]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[cut]]></category>
		<category><![CDATA[expansão]]></category>
		<category><![CDATA[rev]]></category>
		<category><![CDATA[variável]]></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 você quiser extrair o último caractere, independente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=472&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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>
  <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/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" /></div>]]></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>

		<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" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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>
  <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/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" /></div>]]></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;
    char [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=443&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><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>
  <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/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" /></div>]]></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>
		<item>
		<title>Tcl/Tk: Introspecção com comando info</title>
		<link>http://codare.net/2009/06/08/tcltk-introspeccao-com-comando-info/</link>
		<comments>http://codare.net/2009/06/08/tcltk-introspeccao-com-comando-info/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 12:00:04 +0000</pubDate>
		<dc:creator>LES</dc:creator>
				<category><![CDATA[Tcl-Tk]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[info]]></category>
		<category><![CDATA[Tcl/Tk]]></category>

		<guid isPermaLink="false">http://codare.net/?p=452</guid>
		<description><![CDATA[introspecção:
[Do ingl. introspection.] S. f.
1. Observação da vida interior pelo próprio sujeito; exame que alguém faz dos próprios pensamentos e sentimentos.
Dicionário Aurélio &#8211; Século XXI
Às vezes, ajuda muito poder examinar TUDO que está acontecendo em um programa/script em um determinado momento. Não só em procedimentos de depuração, embora eu ache que estes sejam os casos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=452&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><blockquote><p>introspecção:<br />
[Do ingl. introspection.] S. f.<br />
1. Observação da vida interior pelo próprio sujeito; exame que alguém faz dos próprios pensamentos e sentimentos.<br />
Dicionário Aurélio &#8211; Século XXI</p></blockquote>
<p>Às vezes, ajuda muito poder examinar TUDO que está acontecendo em um programa/script em um determinado momento. Não só em procedimentos de depuração, embora eu ache que estes sejam os casos mais comuns.</p>
<p>O comando da introspecção em Tcl/Tk é [info]. Sozinho, ele não faz nada. Precisa de pelo menos um argumento. Existem mais de 20 possíveis, mas os mais comuns são:</p>
<ul>
<li><strong>[info vars]:</strong> retorna os nomes de todas as variáveis já criadas no programa até o momento em que [info vars] for executado. Se [info vars] estiver no fim do programa, vai revelar todas as variáveis. Se [info vars] estiver no meio programa, não revela as variáveis que forem criadas depois dele.</li>
<li><strong>[info exists "nome de variável"]:</strong> teste booleano que verifica se uma determinada variável existe, se já foi criada/declarada. É mais fácil fazer assim do que usar [info vars] e ficar procurando uma determinada variável na lista retornada.</li>
<li><strong>[info globals]:</strong> retorna os nomes de todas as variáveis globais.</li>
<li><strong>[info locals]:</strong> retorna os nomes de todas as variáveis locais, ou seja, que só existem no contexto de um procedimento (proc). Logo só faz sentido usar [info locals] dentro de um proc.</li>
<li><strong>[info procs]:</strong> retorna os nomes de todos os procs já criados no programa até o momento em que [info procs] for executado.</li>
<li><strong>[info body]:</strong> retorna todo o &#8220;corpo&#8221;, o código de um proc. É como uma radiografia do código fonte. Mostra tudo.</li>
<li><strong>[info commands]:</strong> retorna os nomes de todos os comandos existentes no programa, inclusive os procs. Também inclui os &#8220;<a href="http://codare.net/2009/03/30/tcltk-criar-varios-nomes-para-um-comando-alias/">apelidos</a>&#8220;. Isso inclui TODOS os comandos da linguagem Tcl/Tk, mas observe que alguns comandos <a href="http://codare.net/2009/03/20/tcltk-renomear-e-remover-comandos/">podem ter sido apagados</a>.</li>
</ul>
<p>É sempre mais interessante testar estes comandos no console <a href="http://tkcon.sourceforge.net">Tkcon</a>, mas é claro que eles podem ser testados em qualquer programa ou script em Tcl/Tk.</p>
<p>Não é muito interessante testar introspecção em scripts muito pequenos. Quanto maior for o programa, maior será a quantidade de informação a ser garimpada.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/452/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/452/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/452/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=452&subd=codare&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/08/tcltk-introspeccao-com-comando-info/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>C, C++: Dupla negação para conversão em booleano</title>
		<link>http://codare.net/2009/06/05/c-cpp-dupla-negacao-para-conversao-em-booleano/</link>
		<comments>http://codare.net/2009/06/05/c-cpp-dupla-negacao-para-conversao-em-booleano/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 12:00:17 +0000</pubDate>
		<dc:creator>Thiago Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[CPP]]></category>
		<category><![CDATA[!!]]></category>
		<category><![CDATA[bool]]></category>
		<category><![CDATA[booleano]]></category>
		<category><![CDATA[cast]]></category>
		<category><![CDATA[casting]]></category>
		<category><![CDATA[conversao]]></category>
		<category><![CDATA[negation]]></category>

		<guid isPermaLink="false">http://codare.net/?p=410</guid>
		<description><![CDATA[Em C não existe um tipo nativo booleano, temos 0 como falso e tudo diferente de 0 é verdadeiro. Em C++ existe o tipo booleano, onde verdadeiro e falso correspondem respectivamente a 0 e 1.
Uma forma de fazer um &#8220;cast&#8221; em C para um tipo booleano compatível com C++ seria usando a dupla negação, como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=410&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Em C não existe um tipo nativo booleano, temos 0 como falso e tudo diferente de 0 é verdadeiro. Em C++ existe o tipo booleano, onde verdadeiro e falso correspondem respectivamente a 0 e 1.</p>
<p>Uma forma de fazer um &#8220;cast&#8221; em C para um tipo booleano compatível com C++ seria usando a dupla negação, como no exemplo a seguir.</p>
<pre>int value1 = 0;
int value2 = 1;
int value3 = 50;
int value4 = -1;

printf("value1 = %d\n", !!value1); // Imprime value1 = 0
printf("value2 = %d\n", !!value2); // Imprime value2 = 1
printf("value3 = %d\n", !!value3); // Imprime value3 = 1
printf("value4 = %d\n", !!value4); // Imprime value4 = 1</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/410/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/410/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=410&subd=codare&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/05/c-cpp-dupla-negacao-para-conversao-em-booleano/feed/</wfw:commentRss>
		<slash:comments>1</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>Python: Teste condicional e estruturas de dados vazias</title>
		<link>http://codare.net/2009/06/03/python-teste-condicional-e-estruturas-de-dados-vazias/</link>
		<comments>http://codare.net/2009/06/03/python-teste-condicional-e-estruturas-de-dados-vazias/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 12:00:43 +0000</pubDate>
		<dc:creator>Thiago Santos</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[overload]]></category>
		<category><![CDATA[__len__]]></category>
		<category><![CDATA[__nonzero__]]></category>

		<guid isPermaLink="false">http://codare.net/?p=430</guid>
		<description><![CDATA[Classes que implementam o método __len__, quando testadas com if, este método é invocado. Portanto, para uma lista vazia, o teste falha.
x = [];

if x:
    print "OK" # Nao imprime nada
Para mudar este comportamento, basta reimplementar o método __nonzero__.
class MyList(list):
    def __nonzero__(self):
        [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=430&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Classes que implementam o método __len__, quando testadas com if, este método é invocado. Portanto, para uma lista vazia, o teste falha.</p>
<pre>x = [];

if x:
    print "OK" # Nao imprime nada</pre>
<p>Para mudar este comportamento, basta reimplementar o método __nonzero__.</p>
<pre>class MyList(list):
    def __nonzero__(self):
        return True

x = MyList();

if x:
    print "OK" # Imprime OK</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/430/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=430&subd=codare&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/03/python-teste-condicional-e-estruturas-de-dados-vazias/feed/</wfw:commentRss>
		<slash:comments>2</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: Como copiar e colar (clipboard, área de transferência)</title>
		<link>http://codare.net/2009/06/01/tcltk-como-copiar-e-colar-clipboard-area-de-transferencia/</link>
		<comments>http://codare.net/2009/06/01/tcltk-como-copiar-e-colar-clipboard-area-de-transferencia/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 12:00:04 +0000</pubDate>
		<dc:creator>LES</dc:creator>
				<category><![CDATA[Tcl-Tk]]></category>
		<category><![CDATA[área de transferência]]></category>
		<category><![CDATA[clipboard]]></category>
		<category><![CDATA[copy]]></category>
		<category><![CDATA[paste]]></category>
		<category><![CDATA[Tcl/Tk]]></category>
		<category><![CDATA[tkcon]]></category>

		<guid isPermaLink="false">http://codare.net/?p=399</guid>
		<description><![CDATA[Podemos obter o conteúdo (texto) da área de transferência, mais conhecida por aí como &#8220;clipboard&#8221;, a mesma que é usada nas operações de copiar-e-colar do ambiente gráfico.
Antes, é preciso carregar o pacote Tk. Você pode rodar estes testes com o executável &#8220;wish&#8221;, que já tem Tk, ou apenas executar &#8220;tclsh&#8221; e carregar o Tk como um pacote qualquer:
% package [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=399&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Podemos obter o conteúdo (texto) da área de transferência, mais conhecida por aí como &#8220;clipboard&#8221;, a mesma que é usada nas operações de copiar-e-colar do ambiente gráfico.</p>
<p>Antes, é preciso carregar o pacote Tk. Você pode rodar estes testes com o executável &#8220;wish&#8221;, que já tem Tk, ou apenas executar &#8220;tclsh&#8221; e carregar o Tk como um pacote qualquer:</p>
<pre>% package require Tk</pre>
<p>Pronto! Copie algum texto de um programa qualquer. A seguinte função/procedimento mostra o conteúdo da área de transferência:</p>
<pre>% proc clipLeitura {} {
       catch { set varclip [ selection get -selection CLIPBOARD ] } Texto
       return $Texto
}

% clipLeitura
Texto copiado</pre>
<p>Só é possível copiar texto. Se o conteúdo não for texto, a função retorna erro, por isso eu sempre uso o comando [catch] na primeira linha. Assim, o procedimento retorna uma string vazia, mas não faz o programa/script/comando morrer.</p>
<p>Não podemos só ler, também podemos escrever:</p>
<pre>% proc clipEscrita { Texto } {
       clipboard clear -displayof .
       clipboard append -displayof . $Texto
}

% clipEscrita "Um texto qualquer"</pre>
<p>Este comando coloca &#8220;Um texto qualquer&#8221; na área de transferência. Essa string estará pronta para ser &#8220;colada&#8221; em qualquer campo ou janela de qualquer programa do ambiente gráfico.</p>
<p>Este procedimento funciona bem com um script que crie pelo menos uma janela Tk e esteja devidamente preparado para lidar com interações do usuário. A maneira mais fácil é testar dentro do console <a href="http://tkcon.sourceforge.net">Tkcon</a>, uma espécie de console para ambiente gráfico que, em vez de shell, interpreta Tcl/Tk.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/399/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=399&subd=codare&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/06/01/tcltk-como-copiar-e-colar-clipboard-area-de-transferencia/feed/</wfw:commentRss>
		<slash:comments>0</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>AppleScript: Como copiar e colar (clipboard, área de transferência)</title>
		<link>http://codare.net/2009/05/29/applescript-como-copiar-e-colar-clipboard-area-de-transferencia/</link>
		<comments>http://codare.net/2009/05/29/applescript-como-copiar-e-colar-clipboard-area-de-transferencia/#comments</comments>
		<pubDate>Fri, 29 May 2009 12:00:49 +0000</pubDate>
		<dc:creator>Aurélio</dc:creator>
				<category><![CDATA[AppleScript]]></category>
		<category><![CDATA[área de transferência]]></category>
		<category><![CDATA[clipboard]]></category>
		<category><![CDATA[copy]]></category>
		<category><![CDATA[paste]]></category>

		<guid isPermaLink="false">http://codare.net/?p=403</guid>
		<description><![CDATA[A área de transferência é identificada pelo objeto &#8220;the clipboard&#8221;. Então basta setar ou obter o seu conteúdo para fazer as operações de copiar e colar.
-- Copiar
set the clipboard to "texto a ser copiado"

-- Colar
(the clipboard)
É recomendado o uso de parênteses ao colar, para evitar confusão com a palavra-chave opcional &#8220;the&#8221;, utilizada pela linguagem.
Veja um [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=403&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A área de transferência é identificada pelo objeto &#8220;the clipboard&#8221;. Então basta setar ou obter o seu conteúdo para fazer as operações de copiar e colar.</p>
<pre>-- Copiar
set the clipboard to "texto a ser copiado"

-- Colar
(the clipboard)</pre>
<p>É recomendado o uso de parênteses ao colar, para evitar confusão com a palavra-chave opcional &#8220;the&#8221;, utilizada pela linguagem.</p>
<p>Veja um exemplo de uso, com uma janelinha simples que mostra o conteúdo da área de transferência:</p>
<pre>-- Mostrar o clipboard atual
display dialog (the clipboard) with title "Área de Transferência"</pre>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/403/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=403&subd=codare&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/05/29/applescript-como-copiar-e-colar-clipboard-area-de-transferencia/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>
	</item>
		<item>
		<title>C: Descobrir se um processo está em execução</title>
		<link>http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/</link>
		<comments>http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/#comments</comments>
		<pubDate>Wed, 27 May 2009 12:00:03 +0000</pubDate>
		<dc:creator>Thiago Santos</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[execução]]></category>
		<category><![CDATA[kill]]></category>
		<category><![CDATA[pid]]></category>
		<category><![CDATA[posix]]></category>
		<category><![CDATA[processo]]></category>

		<guid isPermaLink="false">http://codare.net/?p=383</guid>
		<description><![CDATA[No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias do mesmo processo rodem simultaneamente e conflitem na obtenção de recursos.
Porém, a simples existência do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=383&subd=codare&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias do mesmo processo rodem simultaneamente e conflitem na obtenção de recursos.</p>
<p>Porém, a simples existência do arquivo .pid não garante que o processo esteja em execução. Ele pode ter sido fechado de uma forma inesperada e não o apagou. Então, temos que ler o conteúdo do arquivo .pid e certificar que o processo com aquele número de PID está em execução.</p>
<p>A forma mais fácil de fazer isso é enviando o sinal 0 para o processo. O sinal 0 é especial e não é de fato enviado, caso contrário o processo destinatário poderia ser fechado se não tratasse o sinal, mas o retorno da função indica se um sinal real seria enviado com sucesso. O código a seguir exemplifica como aplicar a técnica em C:</p>
<pre>int main(int argc, char **argv)
{
    unsigned int pid;

    if (argc != 2) {
        printf("Uso: %s PID\n", argv[0]);
        return 1;
    }

    pid = (unsigned int) atoi(argv[1]);

    if (!kill(pid, 0))
        printf("%d esta em execucao.\n", pid);
    else
        printf("%d nao esta em execucao.\n", pid);

    return 0;
}</pre>
<p>A mesma técnica pode ser aplicada no terminal:</p>
<pre>$ kill -0 123
$ echo $? # Imprime 0 se o PID 123 existir, 1 caso contrario</pre>
<p>Note que você precisa ter permissão para enviar um sinal para um determinado processo. Para um usuário sem privilégios especiais, a dica só vai funcionar para verificar a existência de processos iniciados pelo próprio usuário.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/codare.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/codare.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/codare.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/codare.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/codare.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/codare.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/codare.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/codare.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/codare.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/codare.wordpress.com/383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codare.net&blog=417062&post=383&subd=codare&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://codare.net/2009/05/27/c-descobrir-se-um-processo-esta-em-execucao/feed/</wfw:commentRss>
		<slash:comments>4</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>