<?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>Catojo.</title>
	<atom:link href="http://catojo.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://catojo.wordpress.com</link>
	<description>Sobre informática...</description>
	<lastBuildDate>Tue, 03 Mar 2009 13:34:06 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='catojo.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/8394022d28c711d545a2b83f6aa892ee?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Catojo.</title>
		<link>http://catojo.wordpress.com</link>
	</image>
			<item>
		<title>Ambiente de testes para módulos no Linux Kernel</title>
		<link>http://catojo.wordpress.com/2009/02/27/ambiente-de-testes-para-modulos-no-linux-kernel/</link>
		<comments>http://catojo.wordpress.com/2009/02/27/ambiente-de-testes-para-modulos-no-linux-kernel/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 14:13:36 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=262</guid>
		<description><![CDATA[De alguns dias pra cá, vim testando alguns módulos no Linux kernel que mexem com alocação de memória, doubly linked lists e algumas macros como a &#8216;current&#8217; que faz referência a famosa task_struct de &#8220;linux/sched.h&#8221;, o problema é que toda vez que eu carregava um módulo que lidava diretamente com uma alocação errônia de memória [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=262&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>De alguns dias pra cá, vim testando alguns módulos no Linux kernel que mexem com alocação de memória, doubly linked lists e algumas macros como a &#8216;current&#8217; que faz referência a famosa task_struct de &#8220;linux/sched.h&#8221;, o problema é que toda vez que eu carregava um módulo que lidava diretamente com uma alocação errônia de memória em kernel-space, o kernel crashava e em consequência, a máquina também, Eis o problema na vida do indivíduo &#8212; máquina de produção travando a cada insmod executado não é boa coisa, acredite.</p>
<p>A solução: ambiente especial para testes, responsável: UML (user mode linux) como pode ver abaixo (note que o método aqui apresentado é uma abstração do método usual, o modo mais usual da utilização do UML como ambiente de depuração pode ser encontrado no final desde guia como indicação):</p>
<p><span id="more-262"></span></p>
<p>Como o user mode linux fornece um executável do sistema operacional (isso mesmo, um executável que nos dá possibilidades inclusive de rodar em cima o GNU GDB, e também profilers como gprof, gcov e etc), eliminando assim a complicação de um uso por exemplo do Kgdb que requer duas máquinas com um cabo NULL modem para comunicação entre si e uma boa dose de conhecimento, bem como kdb, porém é claro não são as mesmas coisas, o kdb não necessita de duas máquinas e a depuração é feita diretamente na máquina geradora do bug e ainda sim, no entanto, não deixa de exigir-nos bastante conhecimento.</p>
<p>Note que analisar a pilha de chamadas vinculadas á chamadas do kernel pode causar um grande transtorno dependendo da quantidade de chamadas que o kernel fizer, para analisar tal chamadas, você pode utilizar programas de rastreamento de chamadas como o strace (porém, como é kernel-space, não lhe dou certeza para tal, pesquise por rastreamento de chamadas em kernel-space [ <a href="http://www.writing.eng.vt.edu/Abstract/Dylan%20Klomparens.doc">http://www.writing.eng.vt.edu/Abstract/Dylan%20Klomparens.doc</a> ] ).</p>
<p>Algumas perguntas posteriores que irão surgir (certeza, e é o foco desse mini-guia):</p>
<p>Q) A máquina que uso pra programar, neste caso, após configurado seria a host machine e não a Virtual Machine, como eu poderia compartilhar arquivos entre elas (os módulos e códigos que programo neste caso).</p>
<p>R) Iremos necessitar de fazer uma ponte (bridge) para a máquina virtual entrar no mesmo subnetting da máquina host, iremos utilizar para isto, inclusive uma ferramenta do próprio UML : ).</p>
<p>Q) Tá, a máquina está no mesmo subnetting, mais ainda assim não terá como compartilhar arquivos, como eu faço para compartilhar arquivos ?.</p>
<p>R) Basta configurar o servico NFS (network file system) que no caso, um kernel-newbie já deveria conhecer. Se não conhece, por favor, não continue seguindo esse tutorial : ).</p>
<p>Bom, depois de apresentado teoricamente o problema e a solução (coisa simples como você pode notar) vamos resolver esse algoritmo na prática. (não tratarei de como configurar o NFS aqui e nem de peculiaridade do UML, para mais informações recomendo olhar no site oficial ou se preferir em sites de terceiros).</p>
<p>Finalidade:<br />
* Baixar um kernel e o rootfs no qual o kernel será montado;<br />
* Baixar e instalar pacotes responsáveis pela configuração da bridge;<br />
* Configurar bridge;<br />
* Configurar o NFS.</p>
<p>Passos a serem seguidos:</p>
<p>Baixar um kernel já pronto para o ato de &#8220;virtualização&#8221; (note que se quiser configurar o seu código objeto do Linux (UML) manualmente, tenha como ponto de partida, referências de terceiros como o livro User Mode Linux pois não tratarei do assunto aqui.)<br />
<a href="http://uml.nagafix.co.uk/uml/">http://uml.nagafix.co.uk/uml/</a></p>
<p>Baixe um file system no qual o kernel será montado:<br />
<a href="http://uml.nagafix.co.uk/filesystems/">http://uml.nagafix.co.uk/filesystems/</a></p>
<p>Descompacte-os no local que lhe melhor convier:</p>
<p>Um exemplo de sintaxe utilizando o pacote Ubuntu mais o pacote do Kernel:<br />
bunzip2 Ubuntu-IntrepidIbex-i386-root_fs.bz2 kernel32-2.6.28.1.bz2</p>
<p>Baixe e instale os pacotes:</p>
<p># apt-get install bridge-utils uml-utilities<br />
# emerge bridge-utils uml-utilities (Gentoo)</p>
<p>Agora teremos de configurar a bridge, adicione uma configuração em seu &#8216;/etc/rc.local&#8217;:</p>
<p>tunctl -t tap0 -u ubuntu<br />
chmod 0666 /dev/net/tun<br />
/usr/sbin/brctl addbr br0<br />
/sbin/ifconfig eth0 0.0.0.0 promisc<br />
/usr/sbin/brctl addif br0 eth0<br />
/sbin/dhclient br0<br />
/usr/sbin/brctl addif br0 tap0<br />
ifconfig tap0 192.168.1.108 up ( ip para a futura VM )<br />
bash -c &#8216;echo 1 &gt; /proc/sys/net/ipv4/conf/tap0/proxy_arp&#8217;<br />
route add -host 192.168.1.101 dev tap0 ( ip da máquina na rede local )<br />
arp -Ds 192.168.1.101 eth0 pub ( idem ao anterior )</p>
<p>Antes do exit 0; Contudo, adapte as suas necessidades, óbvio. (PS.: qualquer dúvida deixar um comentário que irei responder com o maior prazer http://catojo.wordpress.com ).</p>
<p>Após isso, você irá precisar atualizar o seu rc.local no Gentoo, utilize: rc-update.</p>
<p>Após atualizado, rode o sistema com o seguinte comando (não é necessário estar como root):</p>
<p>$ ./kernel32-2.6.28.1 ubd0=./Ubuntu-IntrepidIbex-i386-root_fs mem=128M \ eth0=tuntap,tap0,fe:f0:00:00:00:01,192.168.1.254 con0=fd:0,fd:1 root=/dev/ubda</p>
<p>O login é &#8216;root&#8217; e o password é apenas ENTER.</p>
<p>E por fim, esteja seguro de que o arquivo &#8216;/etc/network/interfaces&#8217; do seu sistema guest OS, ou VM, como preferir, esteja configurado da seguinte forma:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>auto lo<br />
iface lo inet loopback</p>
<p>auto eth0<br />
iface eth0 inet dhcp</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Agora teste a sua conexão e a ponte entre o UML e a máquina host:<br />
# apt-get install traceroute<br />
# emerge traceroute (caso esteja usando Gentoo)</p>
<p># tracert www.blackhat.ru</p>
<p>Se o comando tracert der resposta, a máquina host está conseguindo se comunicar com a VM, deste modo, é certo de que a ponte está funcionando e a máquina está no mesmo subnetting da nossa rede física. Para desativar a VM:</p>
<p># halt</p>
<p>Após isso você já poderá configurar o NFS para o compartilhamento de arquivos, módulos e códigos, talvez quem saiba nos próximos posts, com mais calma, eu possa apresentar algumas peculiaridades do UML e do desenvolvimento de módulos para kernel propriamente ditos, alguma correção, opinião ou crítica sobre o conteúdo é bem vinda.</p>
<p>Boa sorte e happy hacking : P</p>
<p>Referências:</p>
<p><a href="http://www.biochem.ucl.ac.uk/~mckenzie/linux/uml-getting-started-20040422.html">http://www.biochem.ucl.ac.uk/~mckenzie/linux/uml-getting-started-20040422.html</a><br />
<a href="http://user-mode-linux.sourceforge.net/hacking.html">http://user-mode-linux.sourceforge.net/hacking.html</a><br />
<a href="http://www.mlaureano.org/guias-e-tutoriais/configuracao-do-user-mode-linux/">http://www.mlaureano.org/guias-e-tutoriais/configuracao-do-user-mode-linux/</a><br />
Prentice Hall PTR User Mode Linux.</p>
<p>Indicações:</p>
<p><a href="http://www.linuxjournal.com/article/5749 http://www.ime.usp.br/~baroni/docs/uml.html">http://www.linuxjournal.com/article/5749</a><br />
<a href="http://www.ime.usp.br/~baroni/docs/uml.html">http://www.ime.usp.br/~baroni/docs/uml.html</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/262/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/262/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/262/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=262&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/27/ambiente-de-testes-para-modulos-no-linux-kernel/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Instrumentação do kernel (SystemTap)</title>
		<link>http://catojo.wordpress.com/2009/02/10/instrumentacao-do-kernel-systemtap/</link>
		<comments>http://catojo.wordpress.com/2009/02/10/instrumentacao-do-kernel-systemtap/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 13:13:43 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=252</guid>
		<description><![CDATA[Salve galera!
Para quem se interessa por depuração de Kernel, vou deixar uns links úteis para vocês; Por acaso, eu tinha uma palestra do Marcelo Tossati em meu HD falando sobre instrumentação do Kernel com SystemTap no Fisl 7 se não me falha a memória, mais infelizmente perdi o vídeo e não consegui recupera-lo pelo fato [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=252&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Salve galera!</p>
<p>Para quem se interessa por depuração de Kernel, vou deixar uns links úteis para vocês; Por acaso, eu tinha uma palestra do Marcelo Tossati em meu HD falando sobre instrumentação do Kernel com SystemTap no Fisl 7 se não me falha a memória, mais infelizmente perdi o vídeo e não consegui recupera-lo pelo fato de que os mirrors que forneciam o download do vídeo não estão mais funcionando, é uma pena.</p>
<p><span id="more-252"></span>Download e informações:<br />
http://sourceware.org/systemtap/getinvolved.html<br />
http://sources.redhat.com/git/?p=systemtap.git;a=blob_plain;f=README;hb=HEAD</p>
<p>- Download systemtap sources:<br />
http://sources.redhat.com/systemtap/ftp/releases/<br />
http://sources.redhat.com/systemtap/ftp/snapshots/<br />
(or)<br />
git clone git://sources.redhat.com/git/systemtap.git<br />
(or) http://sources.redhat.com/git/systemtap.git</p>
<p>http://www.dicas-l.com.br/print/20090104.html<br />
http://www.redbooks.ibm.com/abstracts/redp4469.html</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/252/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/252/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/252/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/252/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/252/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/252/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/252/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/252/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/252/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/252/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=252&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/10/instrumentacao-do-kernel-systemtap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Timestamp de processos</title>
		<link>http://catojo.wordpress.com/2009/02/10/timestamp-de-processos/</link>
		<comments>http://catojo.wordpress.com/2009/02/10/timestamp-de-processos/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 03:57:20 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=250</guid>
		<description><![CDATA[Veja o timestamp dos processos:
ls -lt /etc/init.d
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=250&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Veja o timestamp dos processos:<br />
ls -lt /etc/init.d</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/250/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/250/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/250/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/250/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/250/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/250/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/250/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/250/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/250/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/250/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=250&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/10/timestamp-de-processos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Utilizando o GNU Profiler (gprof)</title>
		<link>http://catojo.wordpress.com/2009/02/10/utilizando-o-gnu-profiler-gprof/</link>
		<comments>http://catojo.wordpress.com/2009/02/10/utilizando-o-gnu-profiler-gprof/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 03:03:21 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=247</guid>
		<description><![CDATA[O gprof é um programa do projeto GNU que mede os tempos de execução dos métodos presentes em um programa, possibilitando ao programador a análise desses tempos e a consequente otimização de seu código.

Para utilizá-lo siga os seguintes passos:
1. Compile o programa com a opção &#8220;-p&#8221;:
gcc -p -o &#8220;nome_do_seu_programa&#8221; &#8220;nome_do_arquivo.c&#8221;
2. Execute o seu programa normalmente. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=247&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>O gprof é um programa do projeto GNU que mede os tempos de execução dos métodos presentes em um programa, possibilitando ao programador a análise desses tempos e a consequente otimização de seu código.</p>
<p><span id="more-247"></span></p>
<p>Para utilizá-lo siga os seguintes passos:</p>
<p>1. Compile o programa com a opção &#8220;-p&#8221;:</p>
<p>gcc -p -o &#8220;nome_do_seu_programa&#8221; &#8220;nome_do_arquivo.c&#8221;</p>
<p>2. Execute o seu programa normalmente. Será criado um arquivo com o nome gmon.out no diretório onde está o programa.</p>
<p>3. Execute o gprof:</p>
<p>gprof &#8211;brief -p &#8220;nome_do_seu_programa&#8221;</p>
<p>OK, agora você pode conferir os tempos de execução dos métodos do seu programa.</p>
<p>OBS: Experimente tirar a opção &#8220;&#8211;brief&#8221; da chamada para o gprof.</p>
<p>Referencias:</p>
<p>http://people.scs.fsu.edu/~burkardt/cpp_src/gprof/gprof.html</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/247/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/247/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/247/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/247/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/247/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=247&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/10/utilizando-o-gnu-profiler-gprof/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Linux Kernel Development</title>
		<link>http://catojo.wordpress.com/2009/02/09/linux-kernel-development/</link>
		<comments>http://catojo.wordpress.com/2009/02/09/linux-kernel-development/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 20:23:36 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=243</guid>
		<description><![CDATA[Para quem quer ingressar no desenvolvimento do Kernel terá de aprender coisas essenciais como se comunicar em grupo, principalmente em inglês, saber expor idéias, trechos de códigos a serem avaliados pela comunidade, saber aceitar e acima de tudo saber trabalhar em grupo. Ainda não mexo com o kernel mais espero que em breve possa estar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=243&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Para quem quer ingressar no desenvolvimento do Kernel terá de aprender coisas essenciais como se comunicar em grupo, principalmente em inglês, saber expor idéias, trechos de códigos a serem avaliados pela comunidade, saber aceitar e acima de tudo saber trabalhar em grupo. Ainda não mexo com o kernel mais espero que em breve possa estar participando também no desenvolvimento do Linux.</p>
<p>Fiz minha inscrição no LKML e meu email inscrito é felipektojo@gmail.com. o trafego diário da lista é pesado, entre 200-300 mensagens diárias mais vale a pena também se deseja conhecer conceitos técnicos principalmente se é estudante de coisas correlacionadas a Sistemas Operacionais, programação concorrente e etc. Vou deixar alguns links abaixo para facilitar a sua vida:</p>
<p><span id="more-243"></span></p>
<p>Linux Git:</p>
<p>Diretório original:</p>
<p>http://www.kernel.org/pub/scm/linux/kernel/git/torvalds/<br />
Diretório do git:<br />
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6</p>
<p>Pegando a árvore do Kernel:</p>
<p>git-clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6</p>
<p>Mais informações:</p>
<p>http://br.kernelnewbies.org/node/68<br />
http://linux.yyz.us/git-howto.html</p>
<p>Referências para o desenvolvimento no kernel (para mulheres &#8212; claro, também é válido para homens)</p>
<p>http://www.linuxchix.org/content/courses/kernel_hacking/</p>
<p>Depois postarei mais links, referências e informações sobre o assunto.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/243/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=243&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/09/linux-kernel-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Fazendo backup via rede</title>
		<link>http://catojo.wordpress.com/2009/02/09/fazendo-backup-via-rede/</link>
		<comments>http://catojo.wordpress.com/2009/02/09/fazendo-backup-via-rede/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 20:14:27 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=240</guid>
		<description><![CDATA[Para fazer um backup via rede basta instalar o programa netcat, você irá utilizar o comando nc.
Na maquina 1 (a ser feito o Backup, no exemplo esta o primeiro disco sata)
dd if=/dev/sda &#124; nc &#8220;outroserver&#8221; 7000 -q 10
Na maquina 2 (ira receber o backup , uma IMAGEM COMPLETA do HD)
nc -l -p 7000 &#124; dd [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=240&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Para fazer um backup via rede basta instalar o programa netcat, você irá utilizar o comando nc.</p>
<p>Na maquina 1 (a ser feito o Backup, no exemplo esta o primeiro disco sata)<br />
dd if=/dev/sda | nc &#8220;outroserver&#8221; 7000 -q 10<br />
Na maquina 2 (ira receber o backup , uma IMAGEM COMPLETA do HD)<br />
nc -l -p 7000 | dd of=/home/disco_sda.iso</p>
<p>lembrando que isso faz uma COPIA completa e do disco entao voce precisa ter o mesmo tamanho do outro lado para receber , o que voce pode fazer e customizar um pouco o comando e meter um bzip ai e reduzir o tamanho do iso :)</p>
<p>ai deixo a liberdade para voce escolher como fazer isso.</p>
<p>Créditos: Liberie (Google).</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/240/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/240/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/240/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=240&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/09/fazendo-backup-via-rede/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Matando bugs.</title>
		<link>http://catojo.wordpress.com/2009/02/06/matando-bugs/</link>
		<comments>http://catojo.wordpress.com/2009/02/06/matando-bugs/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 10:35:40 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=230</guid>
		<description><![CDATA[Algumas das ferramentas ideais para extinguir esse tipo de coisa nojenta qu vem atormentando seus programas é o GNU Debugger para depuração de falhas no código (ele lhe dá o endereco da chamada da função armazenada na pilha e se possível, lhe indica a instrução causadora da falha, que pode ser um transbordamento de buffer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=230&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Algumas das ferramentas ideais para extinguir esse tipo de coisa nojenta qu vem atormentando seus programas é o GNU Debugger para depuração de falhas no código (ele lhe dá o endereco da chamada da função armazenada na pilha e se possível, lhe indica a instrução causadora da falha, que pode ser um transbordamento de buffer ou uma proteção do compilador própriamente dita, por meio de um recurso chamado <a href="http://en.wikipedia.org/wiki/Debug_symbol" target="_blank">symbols</a> e entre outras coisas, e um outro também muito interessante que além de ser um depurador de memória é também um profiler é o Valgrind, antigo Heimdall.</p>
<p>Note que para entender melhor conceitos de depuração, de alocação de memória para os respectivos processos em andamento é necessario conhecer conceitos de memória virtual, a nível de implementação de um sistema operacional. Irei posteriormente indicar alguns livros que falam sobre isso, e inclusive uma dissertação de mestrado bem legal do Rodrigo de Castro (ex MS employee atualmente na Amazon) e  que participa da LKML, no qual venho conversando a pouco tempo via email e gtalk.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/230/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=230&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/02/06/matando-bugs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Como embarcar a biblioteca Server do MySQL em um fonte C.</title>
		<link>http://catojo.wordpress.com/2009/01/26/como-embarcar-a-biblioteca-server-do-mysql-em-um-fonte-c/</link>
		<comments>http://catojo.wordpress.com/2009/01/26/como-embarcar-a-biblioteca-server-do-mysql-em-um-fonte-c/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 21:29:19 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[1]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=216</guid>
		<description><![CDATA[Nos próximos posts tratarei com detalhes sobre este tópico para quem programa em C e usa MySQL como banco de dados.
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=216&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Nos próximos posts tratarei com detalhes sobre este tópico para quem programa em C e usa MySQL como banco de dados.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/216/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/216/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/216/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=216&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/01/26/como-embarcar-a-biblioteca-server-do-mysql-em-um-fonte-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Tradução, classes ODBC do wxWidgets</title>
		<link>http://catojo.wordpress.com/2009/01/26/traducao-classes-odbc-do-wxwidgets/</link>
		<comments>http://catojo.wordpress.com/2009/01/26/traducao-classes-odbc-do-wxwidgets/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 21:26:20 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[Traduções]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=214</guid>
		<description><![CDATA[Sentindo a necessidade de uma documentação mais concisa em português sobre as classes ODBC do famoso framework wxWidgets, decidi colocar a mão na massa e traduzir o documento original que pode ser encontrado no site oficial.
Note que não levei a tradução totalmente a sério pois necessitava disso o mais rápido possível e estava com bastante [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=214&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Sentindo a necessidade de uma documentação mais concisa em português sobre as classes ODBC do famoso framework wxWidgets, decidi colocar a mão na massa e traduzir o documento original que pode ser encontrado no site oficial.</p>
<p>Note que não levei a tradução totalmente a sério pois necessitava disso o mais rápido possível e estava com bastante pressa também, o importante é esclarecer da melhor forma possível alguns parágrafos para os que não sabem inglês.</p>
<p>A tradução segue abaixo:</p>
<p><span id="more-214"></span></p>
<p>&lt;!&#8211; 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		TD P { margin-bottom: 0cm } 		H3 { margin-bottom: 0.21cm } 	&#8211;&gt;A seguir é explanado uma visão geral de como usar as classes ODBC do WxWidgets, &#8211; wxDb e wxDbTable e as funções associadas a essas classes. Essas são as classes ODBC doadas pelo Remstar Internacional e são coletivamente aqui referenciados pelas classes wxODBC.</p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbcoverview">wxDb/wxDbTable wxODBC visão geral</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbcwheretostart">wxODBC Por Onde Iniciar</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbcconfiguringyoursystem">wxODBC – Configurando seu sistema para uso com ODBC</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbccompiling">wxODBC &#8211; Compilando</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbcstepbystep">wxODBC – Passo-A-Passo Básico.</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbcknownissues">wxODBC – Problemas Conhecidos</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#wxodbcsamplecode1">wxODBC – Exemplo de código</a><br />
<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_odbcoverview.html#sqlcommands">Uma seleção de comandos SQL.</a></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Commit</strong>: Inserções/deleções/atualizações</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Rollback</strong>: Voltar atrás / Desfazer</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Datasource</strong>: (usualmente, base de dados) que contém os dados que irão ser acessados pelas classes wxODBC.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Data table</strong>: uma seção de Datasource (origem dos dados) que contém os dados em linhas e colunas.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>ODBC Driver</strong>: o software middle-ware que interpreta os comandos ODBC enviados pela sua aplicação e os converte ao formato SQL esperado pelo banco de dado Alvo.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Datasource connection</strong> (conexão com a origem de dados): Um pipe aberto entre a aplicação e o driver ODBC que está conectado a um datasource alvo. Conexões ao datasource podem ter um número virtualmente ilimitado  de instancias wxDbTable usando a mesma conexão (dependente do driver ODBC). Não é necessária uma conexão separada para cada tabela (a exceção é para o isolamento de commits e rollbacks em diferentes tabelas para afetar mais de uma tabela desejada. Veja a documentação da classe em <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbcommittrans">wxDb::CommitTrans</a> e <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbrollbacktrans">wxDb::RollbackTrans</a>.) </span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Rows (linhas)</strong>: similar a records em banco de dados relacionais antigos, uma linha é uma coleção de uma instancia para cada coluna da tabela de dados que são todas associadas entrei si.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Colunas</strong>: campos individuais associados com cada linha da tabela de dados.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><strong>Result Set (conjunto de dados)</strong>: os dados que combinam com os requerimentos especificados em uma consulta enviada ao datasource (origem de dados/banco de dados propriamente dito) Dependente de drivers, um result set, tipicamente continua na datasource (nenhum dados é transmitido pelo driver ODBC) até que o cliente instrua o driver ODBC á recupera-lo.</span></p>
<table border="0" cellspacing="0" cellpadding="2" width="642">
<col width="92"></col>
<col width="542"></col>
<tbody>
<tr valign="top">
<td width="92"><span style="font-family:Arial,Lucida,Helvetica;"><strong>Cursor </strong></span></td>
<td width="542"><span style="font-family:Arial,Lucida,Helvetica;">Um ponteiro lógico em um 			result set gerado por uma consulta, indica o próximo record que 			será retornado ao cliente quando uma requisição para o próximo </span></td>
</tr>
</tbody>
</table>
<p style="border:medium medium 1px none none solid 0 0 #000000;padding:0 0 .07cm;">
<p style="margin-bottom:0;">
<table border="0" cellspacing="0" cellpadding="2" width="642">
<col width="92"></col>
<col width="542"></col>
<tbody>
<tr valign="top">
<td width="92"><span style="font-family:Arial,Lucida,Helvetica;"><strong>Scrolling cursors </strong></span></td>
<td width="542"><span style="font-family:Arial,Lucida,Helvetica;">Scrolling refere-se ao 			movimento de cursors em um result set. </span><span style="font-family:Arial,Lucida,Helvetica;">Cursors podem sempre 			scrollar sequenciamente a frente em um result set (FORWARD ONLY 			scrolling cursors). Com cursores somente scrollaveis a frente, uma 			vez que uma linha em um result set foi retornado ao driver ODBC e 			para o cliente não existe possibilidades de ter o cursor movido 			para trás em um result set para obter uma linha que está 			antecedendo ao linha corrente de um result set. Se BACKWARD 			scrolling cursors são suportados por ambos: driver ODBC e base de 			dados, que estão sendo utilizados as funções do BACKWARD 			scrolling cursors podem ser utilizadas ( <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetprev">wxDbTable::GetPrev</a>, 			<a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetfirst">wxDbTable::GetFirst</a>, 			e <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetlast">wxDbTable::GetLast</a>). 			Se a base de dados ou o driver ODBC somente suporta FORWARD 			scrolling cursors, seu programa logicamente deve levar isso em 			consideração.</span></td>
</tr>
</tbody>
</table>
<h3><span style="font-family:Arial,Lucida,Helvetica;">Visão Geral: wxDb/wxDbTable, wxODBC </span></h3>
<p><span style="font-family:Arial,Lucida,Helvetica;">Classes: <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdb">wxDb</a> <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtable">wxDbTable</a></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;">As classes wxODBC são desenhadas para independencia com o Banco de Dados. Embora ambos SQL e ODBC possuirem normas que definem requerimentos mínimos que devem ser seguidos conforme as especificações, diferentes fornecedores podem implementar as coisas de maneira um pouco diferente. Um exemplo disso é a Oracle.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:medium;"><strong>WxODBC – Configurando seu sistema para uso com ODBC.</strong></span></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Antes de estarmos apto a acessar um datasource nos devemos ter um driver ODBC instalado e configurado. Fazer isso é específico a cada sistema. Então isso não será abordado com detalhes aqui, mas aqui existem muitos detalhes para você começar. </span></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">A maioria dos fabricantes de banco de dados, provê um driver ODBC mínimo com suas base de dados, na prática, alguns desses drivers são de fato, lentos ou incompletos.</span></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">O rumor por trás disso é que a causa está ligada aos fabricantes do banco de dados que não querem que você use uma interface ODBC nesses produtos, do contrário, querem que você use a aplicação fabricada por eles para acesso aos dados.</span></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"><span>Sobre Unix, iODBC é utilizado para implementação da API ODBC. Para compilar classes wxODBC você deve primeiro obter iODBC em <a href="http://www.iodbc.org/">http://www.iodbc.org</a></span></span></span><a href="http://www.iodbc.org/"><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"><span style="text-decoration:none;"><span> </span></span></span></span></a><span style="font-family:Arial,Lucida,Helvetica;"><span>e instala-lo. (Note: wxWidgets atualmente inclui uma versão de iODBC.) Então você deve criar um arquivo “~/.odbc.ini” (ou opcionalmente criar, para todos os usuários “/etc/odbc.ini” para acesso a todos os usuários do sistema). Esse arquivo contém as configurações para seu sistema/datasource. Abaixo é mostrada uma seção de exemplo de um arquivo odbc.ini para uso com “samples/db” programa de exemplo usando MySQL:</span></span></p>
<pre>        <span style="font-family:Arial,Lucida,Helvetica;">[contacts]</span>
        <span style="font-family:Arial,Lucida,Helvetica;">Trace    = Off</span>
        <span style="font-family:Arial,Lucida,Helvetica;">TraceFile= stderr</span>
        <span style="font-family:Arial,Lucida,Helvetica;">Driver   = /usr/local/lib/libmyodbc.so</span>
        <span style="font-family:Arial,Lucida,Helvetica;">DSN      = contacts</span>
        <span style="font-family:Arial,Lucida,Helvetica;">SERVER   = 192.168.1.13</span>
        <span style="font-family:Arial,Lucida,Helvetica;">USER     = qet</span>
        <span style="font-family:Arial,Lucida,Helvetica;">PASSWORD = </span>
        <span style="font-family:Arial,Lucida,Helvetica;">	     PORT     = 3306</span></pre>
<p><span style="font-family:Arial,Lucida,Helvetica;"><a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtable"><span style="color:#000000;"><span style="font-size:medium;"><span style="text-decoration:none;"><strong>wxODBC – compilando</strong></span></span></span></a></span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;"><a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtable"><span style="color:#000000;"><span style="text-decoration:none;">O arquivo setup.h do wxWidgets contém diversas configurações em seu contexto para compilação das classes wxODBC.</span></span></a></span></p>
<table border="0" cellspacing="0" cellpadding="2" width="642">
<col width="140"></col>
<col width="494"></col>
<tbody>
<tr valign="top">
<td width="140"><span style="font-family:Arial,Lucida,Helvetica;">wxUSE_ODBC </span></td>
<td width="494"><span style="font-family:Arial,Lucida,Helvetica;">Isso deve ser setado para 			um para que o compilador possa compilar as classes wxODBC. Sem 			setar isso para 1 não estaremos habilitados a utilizar qualquer 			classe wxODBC. O padrão está setado para 0 </span></td>
</tr>
</tbody>
</table>
<p style="margin-bottom:0;text-decoration:none;">
<h3><a name="wxodbcstepbystep"></a><span style="font-family:Arial,Lucida,Helvetica;">wxODBC – Um Guia Básico Passo-a-Passo</span></h3>
<p><span style="font-family:Arial,Lucida,Helvetica;">Para usarmos as classes na aplicação, são necessárias algumas etapas básicas:</span></p>
<ul>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Definindo 	informação da conexão com datasource</span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Obtendo 	conexão com o datasource</span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Criando 	definições da tabela</span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Abrindo 	a tabela</span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Usando 	a tabela</span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Fechando 	a tabela</span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Encerrando 	a conexão com o datasource</span></p>
</li>
<li>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Release 	the ODBC environment handle (liberando o manipulador de ambiente 	ODBC)</span></p>
<p style="text-decoration:none;">
</li>
</ul>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Definindo informação da conexão com datasource</span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Para estarmos apto a conectar no datasource através de um driver ODBC, o programa deve suprir no mínimo três campos de informação: Datasource name, ID do usuário, e string de autorização (password). O último parametro de informação é o diretório padrão que indica aonde os dados estão armazenados. É requerido por Text and dBase Drivers para ODBC.</span></p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><br />
</span>
</p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">A classe wxDbConnectInf de wxWidgets existe para tratar todos esses valores, e mais alguns outros que podem ser necessários.</span></p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><br />
</span>
</p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">O membro &#8216;Henv&#8217; é o manipulador de ambiente usado para acessar a memória para uso com o driver ODBC. O uso desse membro é descrevido a seguir na sessão: “Obtendo conexão com o datasource” </span></p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><br />
</span>
</p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">O &#8216;Dsn&#8217; (Datasource name) deve ser combinado exatamente com o nome usado para configurar o datasource ODBC (em ODBC Administrator (MSW somente) ou no arquivo &#8216;.odbc.ini&#8217;).</span></p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><br />
</span>
</p>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">&#8216;Uid&#8217; é o id do usuário que é para ser utilizado para logar no datasource. Esse ID do usuário já deve estar criado e com direitos setados ao datasource no qual você está se conectando. O usuario que a conexão é estabelecida será determinada por quais direitos e privilégios a conexão com o datasource irá aceder para o programa possuir quando usada a conexão que essas informações de conexões forem usadas para estabelecer. Alguns datasource são sensitivos ao caso quando se trata de ID de usuário, a a implementação das classes wxODBC tentam esconder isso de você pela manipulação de qualquer dado que você passar na combinação que o datasource necessita, por isso é sempre melhor passar &#8216;Uid&#8217; no modo requerido para cada datasource.</span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="text-decoration:none;">A &#8216;AuthStr&#8217; é o password para o ID de usuário especificado no membro &#8216;Uid&#8217;. Tal como acontece com &#8216;Uid&#8217;, alguns datasources são sensitivos ao caso (de fato, a maioria deles). As classes wxODBC NÃO tentar gerenciar o caso de &#8216;AuthStr&#8217; como todos. Isso é transmitido via texto e fora da fonte de dados, por isso você deve usar o caso sensitivo da maneira que o datasource espera.</span></span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">O membro &#8216;defaultDir&#8217; é usado com os datasources baseados em arquivo (e.x. Dbase, FoxPro, arquivos de texto). Ele contém o path completo para o local de onde os dados da tabela ou arquivo está localizado. Quando setado esse valor, use as barras não-invertidas ao invéz de aspas simples, escondendo as diferencas de compatibilidade entre os drivers ODBC.</span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:medium;"><strong>Obtendo a conexão com o banco de dados:</strong></span></span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="text-decoration:none;">Existem dois métodos para estabelecer uma conexão com a base de dados. Você pode criar manualmente suas instâncias wxDB e abrir a conexão ou você pode usar as funções de cache providas com as classes wxODBC para criar/manter ou deletar as conexões. Independente do método que você irá utilizar, você deve ter o objeto </span></span>wxDbConnectInf<span style="font-family:Arial,Lucida,Helvetica;"><span style="text-decoration:none;"> preenchido . Na instância  wxDbConnectInf, é provido um válido Dns (Dataname source), Uid e AuthStr (e também &#8216;defaultDir&#8217; se necessário). Antes de usar isso, porém, você deve alocar o manipulador de evento para o membro &#8216;Henv&#8217;.</span></span></p>
<p style="margin-bottom:0;text-decoration:none;">
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">wxDbConnectInf DbConnectInf;</span>
    <span style="font-family:Arial,Lucida,Helvetica;">DbConnectInf.SetDsn("MyDSN");</span>
    <span style="font-family:Arial,Lucida,Helvetica;">DbConnectInf.SetUserID("MyUserName");</span>
    <span style="font-family:Arial,Lucida,Helvetica;">DbConnectInf.SetPassword("MyPassword");</span>
         <span style="font-family:Arial,Lucida,Helvetica;">DbConnectInf.SetDefaultDir("");</span></pre>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Para alocar um manipulador de evento para uso com a conexão ODBC a classe wxDbConnectInf tem um método de banco de dados independente para criar o manipulador necessário: </span></p>
<p style="margin-bottom:0;text-decoration:none;">
<pre> <span style="font-family:Arial,Lucida,Helvetica;">if (DbConnectInf.AllocHenv())</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">wxMessageBox("Unable to allocate an ODBC environment handle",</span>
                     <span style="font-family:Arial,Lucida,Helvetica;">"DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);</span>
        <span style="font-family:Arial,Lucida,Helvetica;">return;</span>
    <span style="font-family:Arial,Lucida,Helvetica;">} </span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Quando a função wxDbConnectInf::AllocHenv() é chamada com sucesso, o valor verdadeiro deve ser retornado. O valor falso significa falha na alocação, e o manipulador irá ser indefinido. </span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Uma pequena forma de realizar os passos acima é encapsulado dentro da longa forma do construtor de wxDbConnectInf</span></span>
    <span style="font-family:Arial,Lucida,Helvetica;">wxDbConnectInf *DbConnectInf;</span>

    <span style="font-family:Arial,Lucida,Helvetica;">DbConnectInf = new wxDbConnectInf(NULL, "MyDSN", "MyUserName",</span>
                                                          <span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">"MyPassword", "");</span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Esta forma de taquigrafia de inicializar o construtor passa NULL para o manipulador de ambiente SQL, indicando ao construtor que a alocação de um manipulador deve ser feita durante a construção do objeto. Esse manipulador é também gerenciado para vida da instância do objeto wxDbConnectInf, e é liberado automaticamente após a destruição da instância.</span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Uma vez que a instância  wxDbConnectInf é inicializada você está pronto para se conectar a base de dados. </span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Para criar manualmente conexões com o banco de dados você deve criar uma instância wxDb e então abri-la.</span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Deve-se criar um construtor com os seguintes parametros:</span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"><strong>wxDb</strong></span><span style="font-size:small;">(</span><span style="font-size:small;"><strong>const HENV &amp;</strong></span><span style="font-size:small;"><em>aHenv</em></span><span style="font-size:small;">, </span><span style="font-size:small;"><strong>bool </strong></span><span style="font-size:small;"><em>FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS</em></span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">E, no arquivo principal iniciar o mesmo dessa maneira:</span></span>
  <span style="font-family:Arial,Lucida,Helvetica;">wxDb *db = new wxDb(DbConnectInf-&gt;GetHenv());</span>
    <span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">opened = db-&gt;Open(DbConnectInf);</span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">A primeira linha  é necessária para inicializar todos os membros da classe wxDb. A segunda linha atualmente envia o pedido ao driver ODBC para abrir uma conexão com o mesmo associada ao datasource usando os parametros passados na chamada <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbopen">wxDb::Open</a>. </span></span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">A forma mais avançada de abrir conexões é usando as funções de cache de conexões que são includas com as classes wxODBC. Os mecanismos de cache proveem as mesmas funções da forma manual de se abrir uma conexão. Mas elas também gerenciam cadaconexão que tenha sido criada, re-utilizando-as e limpando-as  até quando estão fechadas, sem você precisar fazer a codificação </span></span></pre>
<p style="text-decoration:none;">
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:medium;"><strong>Criando definições da tabela</strong></span></span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Dados podem ser acessados nas tabelas do banco de dados diretamente por meio de várias funções da classe wxDB (veja: <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbgetdata">wxDb::GetData</a>). Mas para tornar a vida muito mais simples, a classe wxDbTable, encapsula todas as chamadas específicas da API SQL que serão nessesárias para realizar isso, empacotando-o em uma classe intuitiva de API&#8217;s.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">O primeiro no acesso  dos dados em um banco de dados pela classe wxDbTable é criar uma instancia wxDbTable.</span></p>
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">table = new wxDbTable(db, tableName, numTableColumns, "", </span>
                          <span style="font-family:Arial,Lucida,Helvetica;">!wxDB_QUERY_ONLY, "");</span></pre>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Quando você criar a instância, você indica uma conexão prévia estabelecida com o banco de dados a ser usado no acesso a tabela, o nome da primeira tabela é a que será acessada com as tabelas do banco de dados, quantas colunas  de cada linha serão retornados, o nome de cada visão da tabela que irá ser atualmente utilizada em uma consulta novamente (funciona com Oracle somente, pelo menos por enquanto) Indicar se os dados retornados são somente para fins de consulta, e finalmente o path para a tabela, caso seja diferente do caminho especificado quando conectado ao banco de dados.</span></p>
<p style="text-decoration:none;">
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Cada um dos parametros acima são descritos em detalhes na descrição da tabela wxDbTable, mas uma nota especial aqui é sobre o quinto parametro – a configuração queryOnly.  Se uma instância da tabela é criada como wxDB_QUERY_ONLY, então nenhuma inserção, deleção ou upadte poderá ser feito usando essa instância de wxDbTable. Qualquer chamada a  <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbcommittrans">wxDb::CommitTrans</a> ou  <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbrollbacktrans">wxDb::RollbackTrans</a> novamente sobre a conexão com a base de dados usada pela instancia wxDbTable serão ignoradas, por esta instancia. Se a instancia de wxDbTable é criada com !</span></p>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><tt><span style="font-family:Arial,Lucida,Helvetica;">wxDB_QUERY_ONLY como mostrado acima, então todos os cursores e outras overheads (sobrecarga) associados com o primeiro estatão aptas a inserir, deletar e atualizar os dados na tabela criada,  assim essas operações podem ser feitas sobre a tabela associada a essa instancia de wxDbTable.</span></tt></span></p>
<p style="text-decoration:none;">
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="text-decoration:none;">Se a tabela for acessada por uma instancia de wxDbTable, e a tabela só será lida a partir de, e não a escrita, existe um benefício quanto a performance (não será necessário manter ou atualizar vários &#8216;cursors&#8217; por conseguinte, acelerando o tempo de acesso), bem como irá poupar recursos devido ao menor número cursores sendo criado para instancia de wxDbTable, Além disso, com algumas Datasources, o número de cursores simultâneas é limitado.</span></span></p>
<p style="text-decoration:none;">
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Quando definimos as colunas a serem recuperadas (obtidas) pela instancia de wxDbTable, você pode especificar qualquer lugar em uma coluna de todas as colunas da tabela.</span></p>
<p style="text-decoration:none;">
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">table-&gt;SetColDefs(0, "FIRST_NAME", DB_DATA_TYPE_VARCHAR, FirstName,</span>
                      <span style="font-family:Arial,Lucida,Helvetica;">SQL_C_WXCHAR, sizeof(FirstName), true, true);</span>
    <span style="font-family:Arial,Lucida,Helvetica;">table-&gt;SetColDefs(1, "LAST_NAME", DB_DATA_TYPE_VARCHAR, LastName,</span>
                      <span style="font-family:Arial,Lucida,Helvetica;">SQL_C_WXCHAR, sizeof(LastName), true, true);</span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Note que a definição da coluna inicia em 0 e vai até o número inferior ao número de colunas especificados quando a instancia de wxDbTable foi criada (nesse examplo, duas colunas – uma com index 0 e outra com index 1 (início 1)).</span></span></pre>
<p><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"><span style="text-decoration:none;">As linhas acima de código “infiltram-se” nas colunas da base de dados especificadas e nas variáveis da memória na aplicação cliente. Então quando a aplicação realiza a chamada á </span></span></span><a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetnext">wxDbTable::GetNext</a><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"><span style="text-decoration:none;"> (ou qualquer outra função que obtem data de um result set), as variáveis que são encontradas na coluna terão o valor da coluna armazenado dentro do mesmo. Veja a documentação da classe </span></span></span><a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablesetcoldefs">wxDbTable::SetColDefs </a><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"><span style="text-decoration:none;">para mais detalhes relacionados a todos os parametros dessa função.</span></span></span></p>
<p style="text-decoration:none;">
<p><span style="font-family:Arial,Lucida,Helvetica;">As variáveis de memória vinculadas tem dados indefinidos até que uma chamada que recupera os dados de um result set é feita (e.x. <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetnext">wxDbTable::GetNext</a>, <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetprev">wxDbTable::GetPrev</a>, etc). As variaveis não são inicialidas com qualquer dado pelas classes wxODBC, e também não contem dados definidos após chamar wxDbTable::Query. Somente depois de  uma chamada com sucesso é feita a uma função do tipo ::GetXxxx() que irá fazer com que as variáveis possuam dados válidos.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Isso não é necessário para definir coluna definições para colunas no qual os dados não serão retornados ao cliente. Por exemplo, se você quer consultar o banco de dados para todos os usuarios cujo primeiro nome é &#8216;GEORGE&#8217;, mas somente quer a lista de últimos nomes associada a essa linha(por isso, o regresso  FIRST_NAME a uma coluna de cada vez quando você já sabe que é &#8216;GEORGE&#8217;), você teria apenas necessária para definir uma coluna acima.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Você deve ter algumas instancias wxDbTable acessando a mesma tabela usando a mesma instancia wxDb que você quiser. Não existe limites impostos pela classe neste caso. Todas as base de dados suportadas (até agora) não tem limitações em relação a isso.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Abrindo a tabela </span></p>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Abrir a tabela não é feito tecnicamente com nada relacionado a database propriamente dita. Chamando <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtableopen">wxDbTable::Open</a> simplesmente faz a checagem se a tabela especificada existe, que o atual usuário conectado tenha ao menos privilégios de SELECT para acessar a tabela, configura os cursores requeridos, monta colunas e cursores, e constroe a instrução padrão INSERT que é utilizada quando uma nova linha é inserida na tabela (não somente em tabelas wxDB_QUERY_ONLY).</span></p>
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">if (!table-&gt;Open())</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">// An error occurred opening (setting up) the table</span>
    <span style="font-family:Arial,Lucida,Helvetica;">}</span></pre>
<p style="text-decoration:none;">
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">A única razão em que uma chamada a <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtableopen">wxDbTable::Open</a> pareça falhar é que o usuário não tem privilégios suficientes para um SELECT na abela. Outros problemas podem ocorrer, como a incapacidade de vincular colunas, por falta de memória, qualquer erro gerado internamente por Open são logados pelo log de erro se SQL logging está ativo para as classes.</span></p>
<p style="text-decoration:none;">
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:medium;"><strong>Usando a Tabela </strong></span></span></p>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Para usar a tabela e as definições que agora estão já configuradas, nós devemos primeiramente definir quais dados queremos no banco de dados para coletar de um result set, dizer de onde queremos obter os dados, e em que sequencia nós queremos que esses dados sejam retornados </span></span></p>
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">// a cláusula WHERE limita/especifica as linhas na tabela.</span>
    <span style="font-family:Arial,Lucida,Helvetica;">// que serão retornadas em um result set</span>
    <span style="font-family:Arial,Lucida,Helvetica;">table-&gt;SetWhereClause("FIRST_NAME = 'GEORGE'");</span>

        <span style="font-family:Arial,Lucida,Helvetica;">// result set irá ser classificado em ordem alfabética ascendente nos dados </span>
        <span style="font-family:Arial,Lucida,Helvetica;">// na coluna 'LAST_NAME' para cada linha se o mesmo ultimo nome na </span>
        <span style="font-family:Arial,Lucida,Helvetica;">// tabela para duas colunas, sub-sort na coluna 'AGE'</span>
    <span style="font-family:Arial,Lucida,Helvetica;">table-&gt;SetOrderByClause("LAST_NAME, AGE");</span>

    <span style="font-family:Arial,Lucida,Helvetica;">// Nenhuma outra tabela (joins) são usadas para essa consulta.</span>
        <span style="font-family:Arial,Lucida,Helvetica;">table-&gt;SetFromClause("");</span>
<span style="font-family:Arial,Lucida,Helvetica;">As linhas acima irão ser usados para informar ao banco de dados para retornar em um result all todas as linhas na tabela cuja coluna 'FIRST_NAME' contenha o nome 'GEORGE' (note o uso requerido de aspas simples sobre uma string literal) e que o result set irá ertornar as linhas organizadas na ordem ascendente de últimos nomes (acescendente é padrão, e pode ser escondida com a keywork “DESC” para o banco de dados que suporta-o - “LAST_NAME DESC”).</span></pre>
<p><span style="font-family:Arial,Lucida,Helvetica;">Especificando cláusula WHERE em branco irá resultar em um result set contendo todas linhas do banco de dados.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Especificando a cláusula ORDERBY vazia, significa que o banco de dados irá retortar o result set (conjunto de resultados) na sequencia que o mesmo encontrar das linhas que combinam com o critério da seleção. Qual essa sequencia é possível no entanto difícil de determinar. Tipicamente depende do index que o banco de dados usou para encontrar as linhas com a combinação WHERE. </span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Cuidado &#8211; que dependem da fonte de dados para retornar os dados em uma determinada seqüência, quando você não tiver fornecido uma cláusula orderby acabará por causar um problema para o seu programa. Bases de dados pode ser sintonizado para ser CUSTO-based, a velocidade de base, ou alguma outra base de como fica o conjunto de resultados. Em suma, se você precisa de seu grupo de resultados retornados em uma seqüência específica, peça para ele dessa forma, proporcionando uma cláusula orderby.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Invocando o banco de dados a retornar os dados em uma certa sequencia quando você não proveu a cláusula ORDERBY irá eventualmente causar um problema em seu programa. Banco de dados podem ser configurados para COST-based, SPEED-based, ou outras bases para como ela irá obter os result set. Em resumo, se você precisa de seu rsult set retornado em uma sequencia específica, peça para ele dessa forma, proporcionando uma cláusula  ORDERBY.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Usando uma cláusula  ORDERBY pode ter uma performance de sucesso, como o banco de dados deve organizar os items antes de setar as váriaveis result set ao cliente. Criando eficientes indexes que causam os dados serem encontrados na ordem correta na sequencia ORDERBY podem ter uma grande benefício de performance. Também na grande maioria dos casos, o banco de dados estará apto a organizar os &#8216;records&#8217; mais rapidamente do que a sua aplicação pode ler (desorganizadamente) e então classifica-los.  Deixe que o banco de dados faça esse trabalho para você!</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Note que no exemplo acima, a coluna que não é incluida nas colunas cujos dados relacionados (&#8216;AGE&#8217;) irão ser usados para sub-ordenar o result set.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;">A cláusula FROM nesse exemplo é omitida, </span><br />
<span style="font-family:Arial,Lucida,Helvetica;">The FROM clause in this example is blanked, as we are not going to be performing any table joins with this simple query. When the FROM clause is blank, it is assumed that all columns referenced are coming from the default table for the wxDbTable instance.</span></p>
<p><span style="font-family:Arial,Lucida,Helvetica;">After the selection criteria have been specified, the program can now ask the datasource to perform the search and create a result set that can be retrieved:</span></p>
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">// Instruct the datasource to perform a query based on the </span>
    <span style="font-family:Arial,Lucida,Helvetica;">// criteria specified above in the where/orderBy/from clauses.</span>
    <span style="font-family:Arial,Lucida,Helvetica;">if (!table-&gt;Query())</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">// Um erro ocorreu enquando fazia uma consulta.</span>
    <span style="font-family:Arial,Lucida,Helvetica;">}</span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Tipicamente, quando um erro ocorre quando chamamos wxDbTable::Query, pode ser um problema de sintax na cláusula WHERE que foi especificada. A SQL exata (especifico do banco de dados) a razão para a causa dessa falha de wxDbTable::Query (e todas as outras operações sob o banco de dados podem ser encontrados lendo a tabela de conexão do banco de dados 'errorList[]' que é um membro-array para armazenamento de texto desses erros. </span></span></pre>
<p><span style="font-family:Arial,Lucida,Helvetica;">Quando <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablequery">wxDbTable::Query</a> retornar verdadeiro, o banco de dados foi abilitado com sucesso a completar as requisições de pesquisa usando os critérios passados. Isso não significa qualquer das linhas do result set, isso somente significa que a consulta foi um sucesso.</span></p>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">IMPORTANTE: o resultado criado pela chamada de <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablequery">wxDbTable::Query</a> pode pegar de duas formas. É um snapshot dos dados no momento exato em que o banco de dados determinou os critérios da combinação da busca, ou é um ponteiro para linha que foi encontrada no critério de seleção.</span><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;"> Que tipo de comportamento é dependente de dados. Se é um instantâneo, os dados podem ter mudado desde que o conjunto de resultado foi construído, por isso tome cuidado se sua fonte de dados e utiliza chamadas instantâneas <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablerefresh">wxDbTable::Refresh</a>. A maioria das grandes marcas não usam bases instantâneas, mas é importante mencionar, que seu aplicativo poderá manipulá-lo corretamente, se sua fonte de dados não.</span></span></p>
<p style="margin-bottom:0;"><span style="font-family:Arial,Lucida,Helvetica;">Para recuperar os dados, uma rotina de coleta de dados deve ser utilizado para solicitar uma linha a partir do conjunto de resultados (result set) e armazenar esses dados do result set nas variáveis vinculadas/armazenadas na memória.</span></p>
<p style="margin-bottom:0;">
<p><span style="font-family:Arial,Lucida,Helvetica;">Após <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablequery">wxDbTable::Query</a> tenha completo com sucesso, o padrão/atual cursor será colocado para que ele esteja apontando justamente para o primeiro &#8216;record&#8217; em um result set, se o resultado de set é vazio (nenhuma linha é combinada no critério), então qualquer chamada para requisição de dados do result set irá retornar falso.</span></p>
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">wxString msg;</span>

    <span style="font-family:Arial,Lucida,Helvetica;">while (table-&gt;GetNext())</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">msg.Printf("Row #%lu -- First Name : %s  Last Name is %s",</span>
                   <span style="font-family:Arial,Lucida,Helvetica;">table-&gt;GetRowNum(), FirstName, LastName);</span>
        <span style="font-family:Arial,Lucida,Helvetica;">wxMessageBox(msg, "Data", wxOK | wxICON_INFORMATION, NULL);</span>
    <span style="font-family:Arial,Lucida,Helvetica;">}</span></pre>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">O código de exemplo acima irá ler o próximo &#8216;record&#8217; no result set repetidamente até que o final do result set seja atingido. A primeira vez que <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetnext">wxDbTable::GetNext</a> é chamado corretamente após uma chamada com sucesso a  <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablequery">wxDbTable::Query</a>, atualmente retornará o primeiro &#8216;record&#8217; em um result set.</span></p>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Quando <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetnext">wxDbTable::GetNext</a> é chamado e não existem linhas restante em um result set após a atual posição do cursor,  <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdbtable.html#wxdbtablegetnext">wxDbTable::GetNext</a> (assim como todas as outras funções wxDbTable::GetXxxxx()) irá retornar falso.</span></p>
<p style="text-decoration:none;">
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:medium;"><strong>Fechando a tabela</strong></span></span></p>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Quando o programa é terminado usando uma instancia wxDbTable, é simples como deletar o ponteiro da tabela (ou se declarado estaticamente, obter a variável fora de escopo). Tipicamente o destrutor irá obter todos os requisitos necessários para fazer a limpeza da instancia de wxDbTable </span></p>
<p style="text-decoration:none;">
<pre>  <span style="font-family:Arial,Lucida,Helvetica;">if (table)</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">delete table;</span>
        <span style="font-family:Arial,Lucida,Helvetica;">table = NULL;</span>
    <span style="font-family:Arial,Lucida,Helvetica;">}</span></pre>
<p><span style="font-family:Arial,Lucida,Helvetica;">Deletando uma instancia wxDbTable liberará todos os seus cursores, deleta as definições da coluna e libera o manipulador de ambiente SQL usado pela tabela (mas não o manipulador de ambiente utilizado pela conexão com o banco de dados, que é a instancia que wxDbTable estava usando.).</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Fechando a conexão com o banco de dados</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Após todas as tabelas que estavam sendo usadas com a conexão com o banco de dados serem fechadas (isso pode ser verificado chamando <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbgettablecount">wxDb::GetTableCount</a> e checando se o mesmo retorna 0), então você deve fechar conexão com a origem de dados (datasource / banco de dados) O método de fazer isso é dependente de qual método está sendo usado atualmente – non-caching ou caching para obter a conexão com o banco de dados.</span><br />
<span style="font-family:Arial,Lucida,Helvetica;">Se a conexão com o banco de dados foi criada manualmente (non-cached), fechar a conexão é feita através disso:</span></p>
<pre>    <span style="font-family:Arial,Lucida,Helvetica;">if (db)</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">db-&gt;Close();</span>
        <span style="font-family:Arial,Lucida,Helvetica;">delete db;</span>
        <span style="font-family:Arial,Lucida,Helvetica;">db = NULL;</span>
    <span style="font-family:Arial,Lucida,Helvetica;">}</span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Se o programa usou a função <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbfunctions">wxDbGetConnection</a> para obter uma conexão com o banco de dados, o seguinte código deve ser usado para liberar a conexão(es):</span></span>
    <span style="font-family:Arial,Lucida,Helvetica;">if (db)</span>
    <span style="font-family:Arial,Lucida,Helvetica;">{</span>
        <span style="font-family:Arial,Lucida,Helvetica;">wxDbFreeConnection(db);</span>
        <span style="font-family:Arial,Lucida,Helvetica;">db = NULL;</span>
    <span style="font-family:Arial,Lucida,Helvetica;">}</span>
<span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:small;">Note que o código acima somente libera a conexão que pode ser re-utilizada na próxima chamada á <a href="http://proton-ce.sourceforge.net/rc/wxwidgets/docs/html/wx/wx_wxdb.html#wxdbfunctions">wxDbGetConnection</a>. Para realmente eliminar a conexão, liberando todos os recursos (que não seja o manipulador do ambiente), faça o seguinte:</span></span>
    <span style="font-family:Arial,Lucida,Helvetica;">wxDbCloseConnections();</span></pre>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Liberando o manipulador de ambiente ODBC</span></p>
<p style="text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Uma vez que todas as conexões que usam o manipulador de ambiente ODBC (nesse exemplo ela é armazenada em “DbConnectInf.Henv”) tenham sido fechadas, então é seguro liberar o manipulador de ambiente:</span></p>
<pre style="margin-bottom:.5cm;">    <span style="font-family:Arial,Lucida,Helvetica;">DbConnectInf-&gt;FreeHenv();</span>
<span style="font-family:Arial,Lucida,Helvetica;">Ou se a longa forma do construtor foi usado e o construtor foi habilitado a alocar isso no nosso manipulador de ambiente SQL, deixando o escopo ou destrução dde wxDbConnectInf, irá liberar o manipulador automaticamente:</span>
    <span style="font-family:Arial,Lucida,Helvetica;">delete DbConnectInf;</span></pre>
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><span style="font-size:medium;"><strong>UNICODE com classes wxODBC</strong></span></span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Na versão 2.6 do wxWidgets, as classes wxODBC, agora tem suporte completo a compilação e uso de classes em uma construção unicode do wxWidgets. Assumindo o compilador e o OS no qual o programa irá ser compilado está rodando ou pode rodar no modo unicode.</span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;">Em modo unicode os tipo das colunas nas strings assumiram SQL_C_WXCHAR ao invés de SQL_C_CHAR ou SQL_C_WCHAR.</span></p>
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;">
<p style="margin-bottom:0;text-decoration:none;"><span style="font-family:Arial,Lucida,Helvetica;"><strong>* Essa tradução foi feita pelo mantenedor do Blog com a espectativa de que possa de alguma forma ajudar o leitor.</strong><br />
</span></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/214/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/214/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=214&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/01/26/traducao-classes-odbc-do-wxwidgets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
		<item>
		<title>Projetos Funcionais &#8212; A Colaboratividade.</title>
		<link>http://catojo.wordpress.com/2009/01/26/projetos-funcionais-a-colaboratividade/</link>
		<comments>http://catojo.wordpress.com/2009/01/26/projetos-funcionais-a-colaboratividade/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 21:08:02 +0000</pubDate>
		<dc:creator>catojo</dc:creator>
				<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://catojo.wordpress.com/?p=210</guid>
		<description><![CDATA[Projetos Funcionais &#8212; A Colaboratividade.
Escrevi esse artigo de modo mais conciso possível, partindo do pressuposto de que tens em mente algum projeto utilizando linguagens como C/C++ e que espera portabilidade do seu programas á outras plataformas, o que pode ser um pouco trabalhoso devido a demasiada quantidade de passos a serem gerenciadas por apenas uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=210&subd=catojo&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Projetos Funcionais &#8212; A Colaboratividade.</p>
<p>Escrevi esse artigo de modo mais conciso possível, partindo do pressuposto de que tens em mente algum projeto utilizando linguagens como C/C++ e que espera portabilidade do seu programas á outras plataformas, o que pode ser um pouco trabalhoso devido a demasiada quantidade de passos a serem gerenciadas por apenas uma pessoa, hipoteticamente falando é claro.</p>
<p>Acredito que nos dias de hoje, pela complexidade que um projeto funcional exige, fica um pouco difícil você focar seu tempo em apenas um aspecto do programa, já que na elaboração de um programa existem vários outros fatores a serem levados em consideração, dentre esses, posso citar alguns:</p>
<p>* Preocupação com as plataformas alvo.<br />
* Em uma linguagem como C++, por exemplo, é preciso tomar muito cuidado com a tipagem de métodos, variáveis, e do código em geral (isso se quiser como resultado final um código legível e organizado), já que C++ é uma linguagem de tipagem fortíssima o que exige bastante cautéla por parte do programador nesse quesito.</p>
<p>* Preocupação com os algoritimos a serem utilizados no programa, se é um programa ligado a banco de dados (entende-se aqui como linhas e colunas) assim sendo, um objeto bidimensional e consequentemente é importante o entendimento de vetores do mesmo tipo (vetores bidimensionais, mais há quem use como denominação pra esse tipo de vetor o termo matriz).<br />
* Conhecimentos de API&#8217;s e frameworks, bibliotecas.</p>
<p>* Experiência com uso de debuggers, compiladores, ferramentas de construção de projeto como o autotools da GNU (caso você for desenvolver sobre Unix) e outros tipos de ferramentas para criação de documentações, criação de bibliotécas estáticas, dinâmicas, monitoramento de links quebrados, detecção de problemas e necessidades extras, então por isso é um pouco complexo você sair fazendo um projeto sozinho na garantia de que todas as partes de seu programa terão maturidade suficiente a ponto de se tornar apresentavel. Em termos gerais, assim como existirão muitas partes intrínsecas e essenciais no funcionamento de alguns métodos no programa, há de haver colaboradores especialistas nessas partes, partes essas estarão articulados aos demais módulos inerentes ao programa &#8212; vide programação modular.</p>
<p>* Conhecimentos de idiomas: periodicamente você irá precisar de apoio em termos de documentação, hora durante a pesquisa se deparará com sites e fóruns franceses, por exemplo (não é regra, claro :D), a última documentação, que por acaso, foi excepcional ao meu ponto de vista no qual precisei consultar, foi em um site de taiwan cujo o artigo estava escrito em inglês (uffa!, não me vejo lendo coisas escritas com aqueles caracteres malucos descendentes japoneses, ou chineses, sei lá :-) ).</p>
<p>Então uma dica que eu daria, é: antes de começar a desenvolver o projeto, analise bem com o que irá lhe dar ao longo do desenvolvimento do programa, crie especificações, ao invés de sair escrevendo o código e confiar na sorte que certamente não estará contigo, escreva os passos em português claro (ou sua linguagem nativa :P) que deverá tomar até chegar a um resultado, só assim você entenderá melhor o problema no qual está lidando, e por conseguinte, a resolução se tornará mais simples (a comunidade também é grande).</p>
<p>E isso tudo possuí grande relevância, como já dito, principalmente pela escolha de uma linguagem nativa de máquina como C/C++ ou mesmo o Assembly (no qual o programador deixa de se concentrar no algoritimo em si, e tem de levar em consideração as peculiaridades da linguagem e da máquina). Por esse motivo há quem prefira o uso de Python para projetos do tipo Desktop (não se limitando apenas a isso), o E. Reymond é um, e é claro, como todos já estão carecas de saber, em um programa de missão crítica, ou que exija desempenho, no entanto, de jeito maneira é desenvolvido em linguagens interpretadas como Python que abstrai bastante o conceito de manipulação das questões relacionadas ao baixo nível da máquina e dos algoritimos, entretanto, Python ainda consegue manter um nível relativamente bom e consistente de velocidade em comparação a outras linguagens do mesmo tipo, enfim, como diz o ditado popular &#8212; e, por favor, não tome como regra :D, &#8220;Se quer ser valorizado, saiba C/C++ fluentemente, no entanto, se prefere ganhar sua grana e viver mais (&#8220;mais&#8221; exatamente no sendo de aproveitar melhor a vida :-)) aprenda Python&#8221; (lembrando que Python, assim como uma gama de outras linguagens foram desenvolvidas em C e concedida como &#8220;programação para todos&#8221; ao público, vide CPython &#8212; implementação original de Python em C); E C, por sua vez, é uma linguagem histórica com um teor mais alto de ascenção entre Hackers e escovadores de bits.</p>
<p>Sem contar que o mundo Linux tá saturado (e quando digo saturado, não me refiro a quantidade de programas já criados, pois nesse quesito C ganha disparado, mas me refiro aqui de perda de performance por decorrencia da utilização de linguagens interpretadas para criação de projetos desktop &#8212; sim, admito que as máquinas estão em um processo contínuo e rápido de evolução e por isso alguns segundos a menos para processar um programa não fará lá muita diferença, pra alguns, mas, temos de pensar em todos, nem todo mundo tem um Multicore rodando na máquina &#8230; ).</p>
<p>E são muitos outros pontos a serem levados em consideração que poderia citar aqui fazem-nos perder o foco, de uma maneira geral em um aspecto específico do programa (é necessário colaboradores, nesse ponto, estou precisando de colaboradores para o desenvolvimento do projeto Lambda, caso estejam interessados, podem me contactar pelo meu email: felipecatojoªgmail°com, sem contar que também é uma boa oportunidade de aprendizado, e isso serve pra mim também :D).</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/catojo.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/catojo.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/catojo.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/catojo.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/catojo.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/catojo.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/catojo.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/catojo.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/catojo.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/catojo.wordpress.com/210/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=catojo.wordpress.com&blog=2548628&post=210&subd=catojo&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://catojo.wordpress.com/2009/01/26/projetos-funcionais-a-colaboratividade/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bfb2c8f3fd23adf6577280e5eef6c9dc?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">catojo</media:title>
		</media:content>
	</item>
	</channel>
</rss>