<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-31041182</id><updated>2012-01-19T00:07:34.467-02:00</updated><title type='text'>A casa de Just</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-31041182.post-51948120936355959</id><published>2010-10-23T12:00:00.001-03:00</published><updated>2010-10-23T12:01:32.546-03:00</updated><title type='text'>Novos registros no RG3.Net estão temporariamente desativados</title><content type='html'>Olá a todos.&lt;br /&gt;&lt;br /&gt;Muito tempo sem escrever (quase um ano) e venho pra dar uma notícia que, para alguns, será ruim: o &lt;a href="http://www.rg3.net/redirapp" target="_blank"&gt;serviço de redirecionamento da RG3.Net&lt;/a&gt; não está aceitando novos cadastros, por enquanto.&lt;br /&gt;&lt;br /&gt;O motivo dessa decisão: muitas pessoas usam nosso serviço para criar redirecionamentos para sites fraudulentos, com o intuito de roubar senhas de Orkut, MSN e até de contas bancárias. Todos os dias recebemos denúncias via e-mail e até mesmo por telefone, de usuários e às vezes, da polícia, solicitando que os redirecionamentos sejam removidos.&lt;br /&gt;&lt;br /&gt;Isso trás desgastes para nós, que temos que, a todo momento, fiscalizar e bloquear contas, além do estresse de lidar com as solicitações da polícia e dos riscos legais envolvidos.&lt;br /&gt;&lt;br /&gt;Poderíamos solicitar vários dados dos usuários na criação de uma nova conta, como endereço, CPF, etc. Porém, nossa idéia não era essa. A idéia era criar um serviço fácil de usar e com o mínimo de burocracia. Atualmente, basta o usuário informar um login e um e-mail para fazer o cadastro, mais nada. Além disso, existem diversos softwares geradores de CPF na web, ou seja, um usuário fraudulento ainda poderia se cadastrar usando o CPF de terceiros.&lt;br /&gt;&lt;br /&gt;Portanto, estamos avaliando se é viável manter esse serviço funcionando. Sendo assim, novos cadastros não poderão ser feitos até decidirmos o que fazer.&lt;br /&gt;&lt;br /&gt;Agradecemos a todos que nos acompanharam até agora. Não queremos deixá-los na mão, mas também precisamos estudar a viabilidade deste negócio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-51948120936355959?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/51948120936355959/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=51948120936355959' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/51948120936355959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/51948120936355959'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2010/10/novos-registros-no-rg3net-estao.html' title='Novos registros no RG3.Net estão temporariamente desativados'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1970384002204145870</id><published>2009-12-22T21:05:00.000-03:00</published><updated>2009-12-22T21:05:47.286-03:00</updated><title type='text'>Como achar a localização de um endereço IP</title><content type='html'>Bem, acho que isso não é difícil de achar na Internet, mas não custa nada informar.&lt;br /&gt;&lt;br /&gt;Um tempo atrás, alguém perguntou na lista de discussão da &lt;a href="http://www.fug.com.br"&gt;FUG-BR&lt;/a&gt; como achar a localização de algum endereço IP no mundo. Surgiram duas sugestões:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.maxmind.com/app/locate_ip"&gt;http://www.maxmind.com/app/locate_ip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ip-address.cc/"&gt;http://ip-address.cc/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Desses dois, gostei mais do &lt;a href="http://ip-address.cc/"&gt;http://ip-address.cc/&lt;/a&gt;, pois ele aponta a localização usando o &lt;a href="http://maps.google.com"&gt;Google Maps&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Procurei mais e encontrei também &lt;a href="http://whatismyipaddress.com/"&gt;http://whatismyipaddress.com/&lt;/a&gt;. Esse também aponta a localização com o Google Maps e ainda detectou o proxy da minha rede e também tem uma ferramenta que informa se o endereço está listado em alguma Blacklist de servidores de e-mail. Adorei isso!&lt;br /&gt;&lt;br /&gt;Se alguém conhecer mais sites ou aplicativos que possam dar informações sobre endereços IPs, podem sugerir através dos comentários.&lt;br /&gt;&lt;br /&gt;Outra forma também de descobrir quem detém um endereço ou faixa de IPs é através de uma pesquisa de whois (use o comando &amp;quot;whois&amp;quot; em algum sistema Unix ou use a pesquisa do &lt;a href="http://registro.br"&gt;registro.br&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1970384002204145870?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1970384002204145870/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1970384002204145870' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1970384002204145870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1970384002204145870'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/12/como-achar-localizacao-de-um-endereco.html' title='Como achar a localização de um endereço IP'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-715236768822183229</id><published>2009-12-05T14:32:00.003-03:00</published><updated>2009-12-05T14:39:22.416-03:00</updated><title type='text'>Fucking Linux source code</title><content type='html'>@&lt;a href="http://twitter.com/menelkir" target="_blank"&gt;menelkir&lt;/a&gt; postou hoje no Twitter:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@IP_FIX @paulopow grep -iR fuck /usr/src/linux/* | wc -l&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Já imaginei o que era. Executei o comando e o &lt;i&gt;wc&lt;/i&gt; contou 36 "fuck"s no código inteiro. Dos 36, destaco abaixo os que achei mais engraçados:&lt;br /&gt;&lt;br /&gt;arch/mips/kernel/irixelf.c:   #if 0 /* XXX No fucking way dude... */&lt;br /&gt;arch/mips/kernel/irixioctl.c:   * irixioctl.c: A fucking mess...&lt;br /&gt;Documentation/DocBook/kernel-locking.tmpl: If you don't see why, please stay the fuck away from my code.&lt;br /&gt;drivers/net/sunhme.c:    /* This card is _fucking_ hot... */&lt;br /&gt;drivers/scsi/qlogicpti.h:   /* Am I fucking pedantic or what? */&lt;br /&gt;fs/binfmt_aout.c:    /* Fuck me plenty... */&lt;br /&gt;include/linux/netfilter/xt_limit.h:  /* Ugly, ugly fucker. */&lt;br /&gt;sound/oss/opl3.c:    * What the fuck is going on here?  We leave junk in the beginning&lt;br /&gt;&lt;br /&gt;E o melhor de todos:&lt;br /&gt;&lt;br /&gt;lib/vsprintf.c:     * Wirzenius wrote this portably, Torvalds fucked it up :-)&lt;br /&gt;&lt;br /&gt;Aliás, tem também uma coisa que não entendi, está no primeiro "fuck" da minha lista:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#if 0&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O que o cara pretendia fazer com isso???&lt;br /&gt;&lt;br /&gt;Ah, pra quem não conhece: &lt;a href="http://twitter.com/jpjust" target="_blank"&gt;meu Twitter&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-715236768822183229?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/715236768822183229/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=715236768822183229' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/715236768822183229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/715236768822183229'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/12/fucking-linux-source-code.html' title='Fucking Linux source code'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1036876599396188089</id><published>2009-11-25T10:12:00.002-03:00</published><updated>2009-11-25T10:19:44.407-03:00</updated><title type='text'></title><content type='html'>Hoje recebi um e-mail de Abelardo Fraga, Diretor Comercial da &lt;a href="http://www.afdatalink.com.br/"&gt;AF Datalink&lt;/a&gt;, fabricante de cabos coaxiais. Ele comenta sobre o artigo &lt;a href="http://www.rg3.net/rf/o_fim_da_paranoia.pdf"&gt;O fim da paranóia&lt;/a&gt;, que eu escrevi em julho deste ano, falando sobre a não necessidade de usarmos stubs nos cabos coaxiais em redes Wi-Fi. Copio abaixo o e-mail de Abelardo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;quot;Prezado  João Paulo Just&lt;br /&gt; &lt;br /&gt;Recebi o seu artigo e achei bem interessante. Realmente usar stub não se faz necessário, e não recomendamos.&lt;br /&gt; &lt;br /&gt;Na verdade o maior indíce de problemas que achamos em instalações e que geram problemas de transmissão do sinal são:&lt;br /&gt; &lt;br /&gt;    uso de conectores de baixa qualidade&lt;br /&gt;    montagem dos conectores não adequadas&lt;br /&gt;    danos no cabo&lt;br /&gt; &lt;br /&gt;Claro que poderia falar de uso de cabos de baixa qualidade (mas prefiro omitir este comentário para não parcerer parcial ).&lt;br /&gt; &lt;br /&gt;O fato é que gastamos muitos esforços na fabricação (controle do processo) dos cabos para termos um cabo com baixa perdade retorno, sem contar nos investimentos em equipamentos de controle do processo e de laboratório. A garantia da baixa perda de retorno no cabo , um manuseio adequado do cabo em campo e com uma boa conectorização são necessários e suficientes para ter uma boa transmissão de sinal.&lt;br /&gt; &lt;br /&gt;Faço aqui o convite para conhecer a nossa fábrica qdo estiver por São Paulo.&amp;quot;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Fica claro que não precisamos realmente usar stubs pra fazer casamento de impedância dos nossos sistemas. Uma boa conectorização e manuseio dos cabos são suficientes para tirarmos o máximo de proveito do nosso sistema, sem esquecer de usar materiais de boa qualidade, claro.&lt;br /&gt;&lt;br /&gt;Obviamente, gambiarras só vão piorar a situação. Alguém aqui já viu stub em torres de operadoras de celular?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1036876599396188089?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1036876599396188089/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1036876599396188089' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1036876599396188089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1036876599396188089'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/11/hoje-recebi-um-e-mail-de-abelardo-fraga.html' title=''/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-129531109428555202</id><published>2009-07-26T21:53:00.005-03:00</published><updated>2009-07-26T22:53:01.772-03:00</updated><title type='text'>Calcule o casamento da sua antena</title><content type='html'>Olá, pessoal.&lt;br /&gt;&lt;br /&gt;Continuei trabalhando no assunto do post anterior, sobre stubs e casamento de impedâncias. Pra facilitar minha tarefa, fiz um programa em Java que calcula qual a porcentagem de potência do sinal emitido pelo rádio que chegará à sua antena, dadas as impedâncias complexas do cabo e da antena. O link para download está abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rg3.net/rf/impedancia.zip"&gt;http://www.rg3.net/rf/impedancia.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O arquivo ZIP vem com o código-fonte do programa (quem quiser mexer no código, use o &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;). Pra rodar, basta ter o &lt;a href="http://java.sun.com"&gt;Java&lt;/a&gt; instalado e executar o arquivo &lt;i&gt;Impedancia.jar&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Pois bem, com esse programa, fiz uns testes. Um certo indivíduo andou dizendo que provedor de Internet não sabe instalar antena, que na maioria das vezes, quando um provedor instala uma antena, obtém apenas 30% de rendimento do sistema (ou seja, apenas 30% da energia emitida pelo rádio é irradiada pela antena). E que fazendo o stub, poderíamos conseguir subir esse nível pra 80%.&lt;br /&gt;&lt;br /&gt;No texto do post anterior, mostrei através de cálculos que usando um cabo de 50 ohms e uma antena também de 50 ohms de dois fornecedores bem conhecidos, conseguiríamos 99% de rendimento (99% da energia do rádio seria irradiada pela antena). Em um &lt;a href="http://under-linux.org/f129792-o-fim-da-paranoia-pra-que-stubs-2#post422241"&gt;post do Under-linux.org&lt;/a&gt;, essa mesma pessoa disse que isso era absurdo, que se os fabricantes tivessem feito a antena com aquele valor de impedância que usei, eles poderiam fazer antenas pra NASA, pois estaria muito perfeita (eu acredito no fabricante, pois pelo e-mail que recebi, me parece que eles mediram esse valor de impedância. Tem até um gráfico da &lt;a href="http://www.google.com/search?q=%22Carta+de+Smith%22&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.debian:en-US:unofficial&amp;client=iceweasel-a"&gt;Carta de Smith&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Então, decidi fazer mais cálculos. Suponha que estamos usando uma antena de exatos 50 ohms e um cabo de também exatos 75 ohms. Já é uma diferença muito grande, imagino que maior do que a diferença real entre um cabo e uma antena, ambos de 50 ohms. Usei o programinha que fiz pra medir quanta energia chegaria à antena e obtive o resultado abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_5DNwUFk6stg/Smz9hh9RSxI/AAAAAAAAACk/8Nn4bYOR9NM/s1600-h/screen01.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 305px;" src="http://2.bp.blogspot.com/_5DNwUFk6stg/Smz9hh9RSxI/AAAAAAAAACk/8Nn4bYOR9NM/s320/screen01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5362940008784284434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De acordo com os cálculos, 96% de energia chegaria à antena. Ora, usando cabos e antenas de 50 ohms não seriam apenas uns 30%?? Como é que usando um cabo de 75 ohms e uma antena de 50 ohms conseguiríamos 96%?&lt;br /&gt;&lt;br /&gt;Decidi continuar, e usei agora um cabo de 100 ohms e uma antena ainda de 50 ohms. Muito grande a diferença, não é? Será que um cabo comercial de 50 ohms e uma antena comercial também de 50 ohms chegariam a essa diferença tão monstruosa? Mesmo assim, vamos ver como ficaria?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_5DNwUFk6stg/Smz-VKnotOI/AAAAAAAAACs/Bq1-7CzXWgs/s1600-h/screen02.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 306px;" src="http://3.bp.blogspot.com/_5DNwUFk6stg/Smz-VKnotOI/AAAAAAAAACs/Bq1-7CzXWgs/s320/screen02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5362940895872726242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Agora, 88,88% (praticamente 89%) da energia foi irradiada. Perdemos 12% de energia. E aquela história que antena de provedor de Internet só irradia 30% de energia? Será que uma instalação de provedor, usando os cabos de impedâncias corretas, é realmente pior que essa instalação usando cabos de 100 ohms e antenas de 50 ohms?&lt;br /&gt;&lt;br /&gt;O que eu quero dizer mais uma vez, é que não precisamos nos aterrorizar com fábulas e charadas de um engenheiro marqueteiro, que só quer vender antenas. Também não estou dizendo que podemos usar qualquer cabo na instalação, claro que 12% de energia é uma perda a qual não podemos nos dar o luxo de perder, principalmente por causa do sinal que chega à antena, que é na casa dos decibéis negativos.&lt;br /&gt;&lt;br /&gt;E pra ressaltar: não sou eu que estou inventando essas coisas, tudo isso aprendi em livros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-129531109428555202?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/129531109428555202/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=129531109428555202' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/129531109428555202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/129531109428555202'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/07/calcule-o-casamento-da-sua-antena.html' title='Calcule o casamento da sua antena'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_5DNwUFk6stg/Smz9hh9RSxI/AAAAAAAAACk/8Nn4bYOR9NM/s72-c/screen01.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-900717912208823324</id><published>2009-07-20T13:41:00.002-03:00</published><updated>2009-07-20T13:45:53.078-03:00</updated><title type='text'>O fim da paranóia (pra que stubs?)</title><content type='html'>Em maio, fiz o curso de antenas do Eng. Gilvan Enriconi. Porém, não saí de lá 100 % satisfeito e ainda fiquei meio em dúvida sobre algumas coisas ali ensinadas.&lt;br /&gt;&lt;br /&gt;Uma delas é o uso de stubs para casamento de impedâncias. Porém, os rádios Wi-Fi são de 50 ohms, as antenas também são de 50 ohms e sempre usamos cabos de 50 ohms para conectá-los. Então as impedâncias já estão casadas, certo? Porém, segundo Gilvan, os cabos e antenas não possuem as impedâncias exatamente em 50 ohms. Sendo assim, obtive as impedâncias complexas e exatas de cabos e antenas que eu uso através dos fabricantes e apliquei as fórmulas para cálculo de ROE.&lt;br /&gt;&lt;br /&gt;Minha conclusão: não precisamos de stub, como Gilvan dizia em seus cursos.&lt;br /&gt;&lt;br /&gt;No link abaixo, vocês poderão baixar um PDF com explicações completas e os cálculos que me levaram à esta conclusão.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rg3.net/rf/o_fim_da_paranoia.pdf"&gt;http://www.rg3.net/rf/o_fim_da_paranoia.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-900717912208823324?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/900717912208823324/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=900717912208823324' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/900717912208823324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/900717912208823324'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/07/o-fim-da-paranoia-pra-que-stubs.html' title='O fim da paranóia (pra que stubs?)'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-2065265458976679336</id><published>2009-04-08T07:56:00.002-03:00</published><updated>2009-04-08T07:59:26.071-03:00</updated><title type='text'>Meu Twitter</title><content type='html'>Há um tempo atrás (um ou dois meses, mais ou menos), criei uma conta no &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pra que não conhece, o Twitter é um serviço de microblog. E o que seria isso? Você escreve pequenos textos de até 140 caracteres, como se fosse um blog. O bom é que na sua página do Twitter você vê rapidamente seus textos e os textos das pessoas que você está seguindo. Quando você escreve um texto, ele também fica visível na página dos seus seguidores. Só experimentando pra entender completamente.&lt;br /&gt;&lt;br /&gt;Pra quem quiser me seguir por lá: &lt;a href="http://twitter.com/jpjust"&gt;twitter.com/jpjust&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-2065265458976679336?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/2065265458976679336/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=2065265458976679336' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/2065265458976679336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/2065265458976679336'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/04/meu-twitter.html' title='Meu Twitter'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-5229112221015585872</id><published>2009-04-04T09:05:00.003-03:00</published><updated>2009-04-04T09:12:01.293-03:00</updated><title type='text'>Aulas de Java</title><content type='html'>Quem me conhece sabe que eu odeio &lt;a href="http://java.sun.com"&gt;Java&lt;/a&gt;, porém, fui chamado pra dar aula de programação Java em um centro técnico daqui da minha cidade. Aceitei a proposta como um desafio, somente assim eu iria aprender (mesmo não gostando, é bom aprender outra linguagem).&lt;br /&gt;&lt;br /&gt;Comecei a dar as aulas em uma sexta-feira 13 (13 de março). Na primeira semana, foi só lógica de programação e algorítmos, da segunda em diante, colocamos a mão na massa com o &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Como o curso tem somente 300 h, as coisas estão andando um pouco rápidas. Enquanto que nas &lt;a href="http://www.uesc.br"&gt;Universidades&lt;/a&gt; estudamos algorítmos em um semestre inteiro antes de pegar uma linguagem mais complexa, já entraremos em orientação a objetos na semana que vem.&lt;br /&gt;&lt;br /&gt;Qual o motivo desse post? Estou pensando em colocar posts ensinando o básico de Java aqui, da mesma forma que fiz com &lt;a href="http://www.wxwidgets.org"&gt;wxWidgets&lt;/a&gt;. Mas ainda não decidi, pois somente quando terminar o curso é que vou fazer uma auto-avaliação pra saber se poderei escrever as aulas-posts de Java com um mínimo de qualidade.&lt;br /&gt;&lt;br /&gt;Por enquanto, estou aprendendo com meus alunos. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-5229112221015585872?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/5229112221015585872/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=5229112221015585872' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5229112221015585872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5229112221015585872'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/04/aulas-de-java.html' title='Aulas de Java'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-7812159756972063178</id><published>2009-02-13T20:31:00.000-03:00</published><updated>2009-02-13T20:33:24.560-03:00</updated><title type='text'>Chegamos!</title><content type='html'>Já é 1234567890!!! :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://coolepochcountdown.com/"&gt;http://coolepochcountdown.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-7812159756972063178?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/7812159756972063178/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=7812159756972063178' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/7812159756972063178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/7812159756972063178'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2009/02/chegamos.html' title='Chegamos!'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-3261573488709682404</id><published>2008-12-31T17:49:00.001-03:00</published><updated>2008-12-31T17:53:26.520-03:00</updated><title type='text'>Fechando o ano com tag de ouro</title><content type='html'>&lt;pre&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Desejo a todos os visitantes do meu blog boas festas,&lt;br /&gt;felicidades, e um ano novo repleto de realizações!&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/2008&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-3261573488709682404?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/3261573488709682404/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=3261573488709682404' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3261573488709682404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3261573488709682404'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/12/fechando-o-ano-com-tag-de-ouro.html' title='Fechando o ano com tag de ouro'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-5232682202656517350</id><published>2008-12-23T09:42:00.002-03:00</published><updated>2008-12-23T09:44:33.968-03:00</updated><title type='text'>Protegendo-se com o FreeBSD</title><content type='html'>Estava fuçando na net sobre alguns "tunnings" pro FreeBSD e achei isso:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://silverwraith.com/papers/freebsd-ddos.php"&gt;Protecting yourself with FreeBSD&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Essa página mostra algumas atitudes que administradores de sistemas FreeBSD podem tomar pra tentar diminuir os impactos de um ataque DDoS. O texto é antigo, mas vale ainda hoje. :)&lt;br /&gt;&lt;br /&gt;Feliz Natal a todos e até 2009!! :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-5232682202656517350?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/5232682202656517350/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=5232682202656517350' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5232682202656517350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5232682202656517350'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/12/protegendo-se-com-o-freebsd.html' title='Protegendo-se com o FreeBSD'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-9174979823500494610</id><published>2008-11-06T14:44:00.002-03:00</published><updated>2008-11-06T14:52:57.008-03:00</updated><title type='text'>RG3.Net agora em inglês</title><content type='html'>Para o resto do mundo, pois seria muito egoísmo deixar o serviço de &lt;a href="http://www.rg3.net/redirapp"&gt;redirecionamentos da RG3&lt;/a&gt; somente para os falantes da língua portuguesa. :)&lt;br /&gt;&lt;br /&gt;Comecei antes de ontem a traduzir a aplicação usando o plugin &lt;a href="http://search.cpan.org/author/BRICAS/Catalyst-Plugin-I18N-0.08/lib/Catalyst/Plugin/I18N/Manual.pod"&gt;I18N do Catalyst&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Com esse plugin, basta eu colocar as strings que deverão ser trauzidas dentro do método &lt;i&gt;Catalyst-&gt;loc()&lt;/i&gt; e com a ajuda do &lt;i&gt;xgettext.pl&lt;/i&gt;, criar e manter os arquivos .po de cada idioma. No caso do site da RG3, deixei as strings da aplicação em inglês, que vai ser o idioma padrão e criei o arquivo &lt;i&gt;pt.po&lt;/i&gt; com as traduções pra português.&lt;br /&gt;&lt;br /&gt;Dessa forma, se o navegador do visitante tiver suporte a português, o site vai abrir em português, caso contrário, abrirá em inglês.&lt;br /&gt;&lt;br /&gt;Configure seu navegador com o idioma inglês e &lt;a href="http://www.rg3.net/redirapp"&gt;dê uma olhadinha&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-9174979823500494610?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/9174979823500494610/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=9174979823500494610' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/9174979823500494610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/9174979823500494610'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/11/rg3net-agora-em-ingls.html' title='RG3.Net agora em inglês'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-5831905062098054448</id><published>2008-10-29T11:13:00.002-03:00</published><updated>2008-10-29T11:27:31.103-03:00</updated><title type='text'>O jornal Folha Online me decepcionou</title><content type='html'>Hoje li uma matéria no &lt;a href="http://www1.folha.uol.com.br/folha/informatica/"&gt;Folha Online - Informática&lt;/a&gt; que dizia sobre &lt;a href="http://www1.folha.uol.com.br/folha/informatica/ult124u461613.shtml"&gt;um aluno de 15 anos que foi processado após ter descoberto uma falha no sistema da escola e avisado ao diretor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No último parágrafo da notícia, a Folha Online usa o termpo &amp;quot;piratas virtuais&amp;quot;, enquanto que na &lt;a href="http://www.theregister.co.uk/2008/10/28/student_charged/"&gt;notícia do site The Register&lt;/a&gt;, de onde eles provavelmente tiraram as informações, de acordo com o que diz o segundo parágrafo do texto da Folha Online, usou-se o termo &amp;quot;hacker&amp;quot; (para informar que os hackers criticaram a decisão de processar o jovem, já que ele não usou a falha pra prejudicar a escola e, ao invés disso, informou o problema ao diretor, que deveria apenas corrigir e agradecer o aviso).&lt;br /&gt;&lt;br /&gt;Então, mandei a mensagem abaixo pro pessoal da Folha Online:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;quot;Acho que não deveriam usar o termo 'piratas virtuais' no último parágrafo. Lendo a notícia original no The Register, eles dizem '...hackers have criticized...'. A mídia precisa entender que hacker não é vândalo nem pirata, esses últimos são chamados 'crackers'. Hackers são pessoas que estudam a fundo aquilo que gostam ou praticam ao ponto de fazer coisas que muitos possam achar politicamente incorreto. Por exemplo: um hacker pode criar um vírus com o intuito de aprender novas técnicas de programação, mas apenas o cracker disseminaria esse vírus com o intuito de prejudicar terceiros. Outro exemplo que achei bom, foi quando Richard Stallman disse que 'Gilberto Gil é um hacker da música'. Espero ter contribuído.&amp;quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Fiz minha parte. Porém, minutos depois, recebi o seguinte e-mail da Folha Online:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;quot;Prezado leitor, a Folha Online não utiliza o termo 'hackers'.&lt;br /&gt;&lt;br /&gt; Esperamos contar sempre com sua leitura e participação&lt;br /&gt;&lt;br /&gt; Atenciosamente,&lt;br /&gt;&lt;br /&gt;Equipe Folha Online&amp;quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Fiquei decepcionado. Por que? Porque um jornal, formador de opinião, deveria usar os termos corretos. Dessa forma, os leitores acreditam que qualquer pessoa que descobre falhas em sistemas é um pirata virtual ou criminoso da informática. A mídia deveria usar os termos corretos, para que os hackers de verdade não fossem mais taxados de foras da lei.&lt;br /&gt;&lt;br /&gt;Inclusive, pesquisando o termo &amp;quot;hacker&amp;quot; no próprio site do jornal, pude ver que eles usam sim a palavra &amp;quot;hacker&amp;quot;. &lt;a href="http://search.folha.com.br/search?site=online&amp;q=hacker"&gt;Vejam o resultado da pesquisa!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-5831905062098054448?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/5831905062098054448/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=5831905062098054448' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5831905062098054448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5831905062098054448'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/10/o-jornal-folha-online-me-decepcionou.html' title='O jornal Folha Online me decepcionou'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1902643181129655212</id><published>2008-09-03T09:18:00.003-03:00</published><updated>2008-09-03T10:46:00.962-03:00</updated><title type='text'>Google Chrome</title><content type='html'>Instalei hoje nos PCs da &lt;a href="http://www.rg3.net/"&gt;RG3&lt;/a&gt;. Não pude instalar no meu notebook pois ainda não fizeram o &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; pra &lt;a href="http://www.debian.org/"&gt;Linux&lt;/a&gt; :(&lt;br /&gt;&lt;br /&gt;A primeira impressão que tive é que ele realmente é bem simples. Navegador foi feito pra navegar e pronto. Nada de frescuragem. Se o &lt;a href="http://www.mozilla.com/"&gt;Firefox&lt;/a&gt; simplificou a cara dos navegadores, o Chrome simplificou mais ainda (e o &lt;a href="http://www.microsoft.com/ie"&gt;Internet Explorer&lt;/a&gt; acabou tendo que acompanhar o Firefox nesse quesito).&lt;br /&gt;&lt;br /&gt;A segunda impressão que tive é que o bixo é realmente rápido! Nunca vi coisa igual. Não sei se é porque o cache dele ainda está vazio, mas a velocidade me impressionou. Ele usa o mesmo &lt;i&gt;engine&lt;/i&gt; do &lt;a href="http://www.apple.com/safari"&gt;Safari&lt;/a&gt;, o WebKit. Inclusive, olhando o &lt;i&gt;User-Agent&lt;/i&gt; do Chrome, vi que tem um &lt;i&gt;Safari&lt;/i&gt; no final da string (não pude colar a string inteira aqui porque estou escrevendo esse post pelo Linux, vou pegar a string no Windows e colocar aqui depois).&lt;br /&gt;&lt;br /&gt;Li também toda a &lt;a href="http://www.google.com/googlebooks/chrome"&gt;estória em quadrinhos&lt;/a&gt; que a Google fez pro lançamento do Chrome e pude concluir que eles fizeram um navegador da complexidade de um sistema operacional, muito violento. Inclusive a forma de tratar as coisas, com vários processos, isolamento entre eles, etc., ficou muito bom e bem pensado.&lt;br /&gt;&lt;br /&gt;A terceira coisa que gostei nele foi a página &amp;quot;New tab&amp;quot;, que aparece quando você abre uma nova aba. Nessa página, são mostrados os thumbnails dos nove sites mais acessados, além das pesquisas mais recentes. Basta um clique pra reabrir uma página.&lt;br /&gt;&lt;br /&gt;O site oficial está em &lt;a href="http://www.google.com/chrome"&gt;www.google.com/chrome&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pra quem não sabe do que estou falando ainda, &lt;a href="http://www1.folha.uol.com.br/folha/informatica/ult124u440278.shtml"&gt;leiam essa notícia&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1902643181129655212?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1902643181129655212/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1902643181129655212' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1902643181129655212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1902643181129655212'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/09/google-chrome.html' title='Google Chrome'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-6845525473538591169</id><published>2008-08-28T18:24:00.000-03:00</published><updated>2008-08-28T18:24:35.655-03:00</updated><title type='text'>Do FreeBSD 4.7 ao 7.0</title><content type='html'>Em 7 de fevereiro deste ano, escrevi um post contando &lt;a href="http://jpjust.blogspot.com/2007/07/do-red-hat-para-o-slackware-para-o.html"&gt;minha trajetória pelo Linux&lt;/a&gt;. Nos comentários deste post, um Anônimo pediu pra eu contar minha trajetória pelo &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pois bem, a vida com FreeBSD também começou quando eu cursava Física na &lt;a href="http://www.uefs.br"&gt;UEFS&lt;/a&gt;. Eu já estava me familiarizando com os &lt;a href="http://www.redhat.com"&gt;RedHats 7.0&lt;/a&gt; do Laboratório de Física Computacional e, inclusive, já havia instalado ele em um servidor de impressão que tinha no laboratório. Não era uma máquina parruda, apenas um Pentium 233 MHz com 64 MB de RAM.&lt;br /&gt;&lt;br /&gt;Dois colegas de curso, Alex Gamas e Leonardo Gamas (irmãos) eram uma das minhas principais fontes de conhecimento em Linux, seguidos por Jorge Kaschy, Nazareno e Dagoberto Freitas (estes três últimos, professores), e foram os irmãos Gamas que me apresentaram o FreeBSD.&lt;br /&gt;&lt;br /&gt;Na época, consegui um CD de instalação do FreeBSD 4.7, não lembro se foram eles que me conseguiram ou se eu baixei na Internet. Tirei o RedHat 7.0 do servidorzinho e instalei o Free. Com o &lt;a href="http://www.samba.org"&gt;Samba&lt;/a&gt;, eu fiz um controlador de domínio e os alunos do curso passaram a ter login e senha para acessar as máquinas. Isso ajudou bastante, porque na Universidade, vinha gente de todo canto, às vezes nem aluno era, e ficavam enchendo as máquinas com vírus.&lt;br /&gt;&lt;br /&gt;Com o Samba e o FreeBSD 4.7 fiz também um servidor de impressão. O pessoal gostou muito. Tinham 20 MB de espaço no HD pra salvar trabalhos e podiam imprimir sem os problemas que davam antes no &lt;a href="http://www.microsoft.com"&gt;Windows NT&lt;/a&gt;, que era o sistema do servidor antes do RedHat.&lt;br /&gt;&lt;br /&gt;O esquema de PDC (controlador de domínio) fez tanto sucesso na Universidade que um professor do curso de Matemática me chamou pra ajudar ele a fazer o mesmo no laboratório de lá. Inclusive, alguns alunos de outros cursos vinham me pedir pra usarem os PCs do nosso laboratório, pois tínhamos a fama de "o único laboratório da UEFS sem vírus", mas isso não tem nada a ver com o FreeBSD no servidor, tem a ver com as políticas de segurança que eu aplicava nos Windows NT dos PCs. Em 2004 fui pra Ilhéus cursar Ciência da Computação na &lt;a href="http://www.uesc.br"&gt;UESC&lt;/a&gt; e desde então, nunca mais havia usado um FreeBSD.&lt;br /&gt;&lt;br /&gt;Em 2006, quando comecei a ajudar os funcionários da &lt;a href="http://www.rg3.net"&gt;RG3.Net&lt;/a&gt; a dar manuntenção nos servidores foi que me reencontrei com o FreeBSD, desta vez, na versão 5.2.&lt;br /&gt;&lt;br /&gt;Em 2007, assumi a propriedade da RG3.Net e desde então, fiz algumas atualizações. O servidor do provedor tornou-se FreeBSD 6.2 (instalei uma máquina nova com o sistema do zero), que posteriormente foi atualizado para 6.3. Hoje em dia, temos outro servidor novo, com o FreeBSD 7.0. O servidor do site também foi atualizado pra versão 7.&lt;br /&gt;&lt;br /&gt;Nessa retomada no mundo do FreeBSD foi que eu aprendi várias coisas, como usar o &lt;i&gt;ports&lt;/i&gt; e outros programas correlatos como &lt;i&gt;portsnap&lt;/i&gt;, &lt;i&gt;portupgrade&lt;/i&gt; e &lt;i&gt;freebsd-update&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Hoje em dia uso FreeBSD diariamente, não no meu desktop, mas nos servidores e estou feliz com isso. Inclusive, após usar Linux em servidores por muito tempo lá em Ilhéus e voltando pro FreeBSD aqui em Feira de Santana, posso afirmar: em se tratando de servidores de rede, considero o FreeBSD muito mais fácil de configurar e usar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-6845525473538591169?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/6845525473538591169/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=6845525473538591169' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/6845525473538591169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/6845525473538591169'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/02/do-freebsd-47-ao-70.html' title='Do FreeBSD 4.7 ao 7.0'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-4727662497828622189</id><published>2008-08-23T09:31:00.002-03:00</published><updated>2008-08-23T09:38:48.889-03:00</updated><title type='text'>Enquanto isso...</title><content type='html'>...já anunciaram as &lt;a href="http://lists.freebsd.org/pipermail/freebsd-stable/2008-August/044529.html"&gt;datas previstas&lt;/a&gt; para o lançamento do FreeBSD 6.4 e do 7.1.&lt;br /&gt;&lt;br /&gt;Estou ansioso pra atualizar pro 7.1. O 7.0 está rodando bem aqui, mas tive alguns problemas com o ppp. Mas isso é assunto pra outro post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-4727662497828622189?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/4727662497828622189/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=4727662497828622189' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4727662497828622189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4727662497828622189'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/08/enquanto-isso.html' title='Enquanto isso...'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1638796481814911018</id><published>2008-08-22T18:23:00.003-03:00</published><updated>2008-08-22T18:26:57.521-03:00</updated><title type='text'>Servidores do Fedora invadidos</title><content type='html'>Olá, pessoal.&lt;br /&gt;&lt;br /&gt;Voltei a postar no meu (quase abandonado) blog e a notícia não é boa (não que eu use Fedora, mas invasões nunca são boas).&lt;br /&gt;&lt;br /&gt;Fiquei sabendo hoje que alguns servidores do repositório do Fedora foram invadidos. Existe um e-mail na lista de discussão &lt;a href="http://marc.info/?l=fedora-announce-list&amp;r=1&amp;w=2"&gt;fedora-announce-list&lt;/a&gt; que explica melhor o fato:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://marc.info/?l=fedora-announce-list&amp;m=121940663003140"&gt;Infrastructure report&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1638796481814911018?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1638796481814911018/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1638796481814911018' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1638796481814911018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1638796481814911018'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/08/servidores-do-fedora-invadidos.html' title='Servidores do Fedora invadidos'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-2694400568613834347</id><published>2008-03-28T09:31:00.002-03:00</published><updated>2008-03-28T09:33:35.879-03:00</updated><title type='text'>Distro de tolo</title><content type='html'>Recebi por e-mail, na lista da &lt;a href="http://www.fug.com.br"&gt;FUG-BR&lt;/a&gt;. Fiz uma pequena alteração: adicionei o &lt;strong&gt;animal&lt;/strong&gt; na nona estrofe, sendo fiél à versão original de Raulzito.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Letra de Leonardo Menezes Vaz&lt;br /&gt;Música de Raul Seixas&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Eu devia estar contente, porque eu tenho um emprego&lt;br /&gt;Sou um dito SysAdmin respeitável e ganho mil reais por mês...&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Eu devia agradecer por ter tido sucesso na vida como SysAdmin&lt;br /&gt;Eu devia estar feliz porque consegui integrar o OpenSuSE com o Windows 2003...&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Eu devia estar alegre e satisfeito por morar em Porto Alegre&lt;br /&gt;Depois de ter passado fome por vinte dias na Alemanha...&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Eu devia estar sorrindo e orgulhoso&lt;br /&gt;Por finalmente ter conseguido entrar no Planet SuSE,&lt;br /&gt;Mesmo que todo mundo me zoe e faça disso uma piada jocosa...&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Eu devia estar contente por ter conseguido tudo isso&lt;br /&gt;mas confesso abestalhado que eu estou decepcionado...&lt;br /&gt;&lt;br /&gt;Porque foi tão fácil conseguir, e agora eu me pergunto "e daí?"&lt;br /&gt;Eu tenho uma porção de coisas prá blogar&lt;br /&gt;E eu não posso ficar aqui parado...&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Eu devia estar feliz pelo Senhor&lt;br /&gt;Ter me concedido o Sábado prá ir com a pessoal&lt;br /&gt;No evento do Tchelinux dar palestra de OpenSUSE...&lt;br /&gt;&lt;br /&gt;Bah!&lt;br /&gt;Mesmo falando das facilidades,&lt;br /&gt;da Novell, Microsoft, Lagarto, SLES, YAST&lt;br /&gt;E mesmo assim não ter ninguem que use...&lt;br /&gt;&lt;br /&gt;É você olhar no espelho e ver um SysAdmin Júnior&lt;br /&gt;Saber que o YAST é uma ferramenta limitada&lt;br /&gt;E que deixa só dez por cento de sua CPU livre, animal!&lt;br /&gt;&lt;br /&gt;E você ainda acredita que ser é um CCNA, MCSS ou MCSE&lt;br /&gt;É grande coisa, e que te garante um lugar no mercado...&lt;br /&gt;&lt;br /&gt;Bah,&lt;br /&gt;Eu que não me sento numa cadeira de CPD&lt;br /&gt;Com a boca escancarada cheia de dentes&lt;br /&gt;Esperando o OpenSuSE bootar...&lt;br /&gt;&lt;br /&gt;Porque longe dos datacenters onde rodam SLES com YAST&lt;br /&gt;existem servidores BSDs e SysAdmin de verdade que usam vi...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-2694400568613834347?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/2694400568613834347/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=2694400568613834347' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/2694400568613834347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/2694400568613834347'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/03/distro-de-tolo.html' title='Distro de tolo'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-3316381837498594790</id><published>2008-03-10T14:53:00.002-03:00</published><updated>2008-03-10T15:40:30.749-03:00</updated><title type='text'>O castigo dos 64 bits</title><content type='html'>Pois eh, quem tem processador de 64 bits sofre pra usar todos os bits.&lt;br /&gt;&lt;br /&gt;Meu notebook eh um Athlon X2 64-bits, estava rodando Debian (amd64) nele. Havia problemas com o Flash e outras coisas que so tinham pra 32-bits. Um xunxu (workaround) com bibliotecas de 32-bits resolvia o problema, mas era muito chato fazer isso.&lt;br /&gt;&lt;br /&gt;Esse fim de semana instalei o FreeBSD 7.0 (amd64 tambem) nele, ja estava querendo tirar o Linux pra botar FreeBSD fazia um tempo. Instalou direitinho (quer dizer, deu um pouco de trabalho pra dar boot no CD).&lt;br /&gt;&lt;br /&gt;O problema eh que o driver da nVidia pra FreeBSD suporta somente i386, ou seja, sem driver oficial pra 64-bits no FreeBSD. Ja meio triste, tentei o driver do X.org, aquele "nv" que a gente usa no xorg.conf. Nada de iniciar o X... problema viu! O jeito foi usar o X com o "vesa", que, obviamente, nao tem os recursos de aceleracao 3D.&lt;br /&gt;&lt;br /&gt;E isso nao acontece so no mundo do UNIX nao, tambem usei Windows Vista por umas semanas nesse notebook. Instalei a versao de 64-bits e nem os proprios drivers de 64-bits que vieram no CD do computador funcionaram direito. Como resolvi? Instalei o Windows XP de 32-bits mesmo :(&lt;br /&gt;&lt;br /&gt;Acho que vou ter que fazer o mesmo no FreeBSD ou mesmo no Linux (se tiver que voltar pra ele). Pesquisando no Google, encontrei muitas pessoas tendo problemas com SO de 64-bits: drivers faltando, menos pacotes nos repositorios, programas nao-suportados, etc.&lt;br /&gt;&lt;br /&gt;Vamos ver no que isso vai dar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-3316381837498594790?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/3316381837498594790/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=3316381837498594790' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3316381837498594790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3316381837498594790'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/03/o-castigo-dos-64-bits.html' title='O castigo dos 64 bits'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1573506903359827012</id><published>2008-02-28T17:11:00.003-03:00</published><updated>2008-02-28T17:19:12.713-03:00</updated><title type='text'>FreeBSD 7.0!</title><content type='html'>Já foi! Lançaram ontem (me atrasei a postar no blog).&lt;br /&gt;&lt;br /&gt;Já vou baixar e deixar o CD gravado e guardadinho pras horas certas :) E vou também atualizar o servidor da RG3 que tá rodando o 7.0-RC2 ainda. Ôh, notícia boa!!!&lt;br /&gt;&lt;br /&gt;Que o download comece!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freebsd.org/releases/7.0R/announce.html"&gt;http://www.freebsd.org/releases/7.0R/announce.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;----- texto adicionado -----&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Essa não podia deixar de postar. Tenho que adicionar essa imagem a este post. Fui baixar a ISO como tinha dito acima, e vejam só: rsrs&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_5DNwUFk6stg/R8cW-55mTuI/AAAAAAAAABc/UetQLG7wlmE/s1600-h/freebsd_lotado.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_5DNwUFk6stg/R8cW-55mTuI/AAAAAAAAABc/UetQLG7wlmE/s320/freebsd_lotado.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5172127967008411362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tá todo mundo baixando. Na lista da &lt;a href="http://www.fug.com.br"&gt;FUG&lt;/a&gt; tá uma euforia só!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1573506903359827012?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1573506903359827012/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1573506903359827012' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1573506903359827012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1573506903359827012'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/02/freebsd-70.html' title='FreeBSD 7.0!'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_5DNwUFk6stg/R8cW-55mTuI/AAAAAAAAABc/UetQLG7wlmE/s72-c/freebsd_lotado.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-7719614262209101132</id><published>2008-02-18T08:50:00.003-03:00</published><updated>2008-02-18T08:57:52.453-03:00</updated><title type='text'>Flash Player para Linux 64-bits (amd64)</title><content type='html'>Muitos vão acabar chegando aqui pelo Google, achando que encontraram a solução para o Flash Player em Linux amd64. Bem, a solução completa não tenho aqui (posso até fazer um post explicando como fiz o Flash funcionar no meu Debian amd64), mas tenho a raiz da solução do problema.&lt;br /&gt;&lt;br /&gt;Gostaria de pedir a vocês que visitassem duas páginas:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.petitiononline.com/lin64swf/petition.html"&gt;http://www.petitiononline.com/lin64swf/petition.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform"&gt;http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A primeira, é uma petição on-line para que os desenvolvedores da Macromedia façam uma versão de 64-bits do Flash Player pra Linux. A segunda, é uma página do próprio site da Macromedia onde é possível pedir novos recursos, no caso, devemos solicitar uma versão de 64-bits do Flash Player pra Linux (foi o que eu fiz).&lt;br /&gt;&lt;br /&gt;A expectativa é que através da petição e dos pedidos pelo site da Macromedia, eles finalmente façam uma versão de 64-bits pra Linux. Isso resolveria nossos problemas, pois não precisaríamos mais manter versões de 32-btis dos nossos navegadores pra poder ver conteúdo em Flash.&lt;br /&gt;&lt;br /&gt;Eu por exemplo, tenho um notebook AMD64, mas preciso usar o Firefox de 32-bits por causa do Flash. Isso me deixa irritado! :P&lt;br /&gt;&lt;br /&gt;Pois bem, vamos assinar a petição e encher o saco da Macromedia até que eles façam a bendita versão de 64-bits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-7719614262209101132?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/7719614262209101132/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=7719614262209101132' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/7719614262209101132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/7719614262209101132'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/02/flash-player-para-linux-64-bits-amd64.html' title='Flash Player para Linux 64-bits (amd64)'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-9065406020617068871</id><published>2008-02-11T21:45:00.000-03:00</published><updated>2008-02-11T22:17:06.780-03:00</updated><title type='text'>RG3.Net de cara nova</title><content type='html'>Neste último domingo, dia 10 de fevereiro, terminei a aplicação de redirecionamento da &lt;a href="http://www.rg3.net/"&gt;RG3.Net&lt;/a&gt; e fiz o upload pro servidor. Instalei tudo em uma máquina recém-formatada com FreeBSD 7.0 RC1.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;O que mudou?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Absolutamente tudo!&lt;br /&gt;&lt;br /&gt;A página principal agora tem também textos sobre o provedor de Internet a Rádio que temos aqui em Feira de Santana e uns links pra testadores de velocidade.&lt;br /&gt;&lt;br /&gt;O site do provedor está com mais detalhes sobre o serviço e os planos de acesso e também um pequeno "how-to" explicando ao cliente como criar sua conexão com a Internet.&lt;br /&gt;&lt;br /&gt;Mas a principal mudança foi no serviço de redirecionamento. O sistema antigo era feito em PHP e tinha algumas falhas de programação. Não vou falar muito sobre elas pra não ofender o programador antigo, que eu nem sei quem é (compramos a RG3 já pronta, não fomos nós que fundamos).&lt;br /&gt;&lt;br /&gt;O sistema novo foi desenvolvido completamente do zero em &lt;a href="http://www.perl.org"&gt;Perl&lt;/a&gt; com &lt;a href="http://catalyst.perl.org"&gt;Catalyst&lt;/a&gt;. Com bem menos linhas de código, escrevi uma nova aplicação com recursos a mais (mais de um domínio para escolha além de três formas de recuperação de senha) e interface gráfica melhorada.&lt;br /&gt;&lt;br /&gt;No sistema antigo, quando o usuário fazia logon, os campos de login e senha que ficavam no menu esquerdo do site eram substituídos por três links que davam acesso às opções dos redirecionamentos. Isso era ruim, pois o usuário via a mesma página, com apenas um pequeno detalhe diferente e a maioria acreditava que não estava conseguindo fazer login, já que a página que aparecia após o "Enter" era praticamente a mesma. O que isto causava? Vários e-mails do tipo "Não consigo entrar na minha conta!!!".&lt;br /&gt;&lt;br /&gt;O sistema novo roda também no &lt;a href="http://httpd.apache.org"&gt;Apache&lt;/a&gt;, como o antigo, porém, agora com &lt;a href="http://www.fastcgi.com"&gt;FastCGI&lt;/a&gt;. Pra quem não conhece, o FastCGI permite que uma aplicação Web, no meu caso, uma aplicação em Catalyst, faça um melhor gerenciamento das requisições. Coisas comuns à aplicação, como acesso ao servidor de banco de dados, por exemplo, acontece apenas uma vez, melhorando o desempenho. No sistema em PHP, cada vez que um redirecionamento era solicitado, o programa abria uma conexão com o banco, pegava os dados e fechava a conexão. Com Catalyst no FastCGI, a conexão é aberta apenas uma vez, quando a aplicação inicia. Sempre que um redirecionamento é solicitado, a aplicação usa a conexão já aberta pra obter os dados. Diferentemente do CGI puro, onde cada requisição criava um novo processo no servidor, com FastCGI apenas um processo é criado. Em alguns momentos, quando ocorrem muitas requisições, alguns processos a mais são criados, mas ainda assim, cada processo existente gerencia várias requisições, poupando memória e recursos.&lt;br /&gt;&lt;br /&gt;Leiam mais sobre a performance do FastCGI em &lt;a href="http://www.fastcgi.com/devkit/doc/fcgi-perf.htm"&gt;http://www.fastcgi.com/devkit/doc/fcgi-perf.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Além dessas alterações internas no sistema e mudança de interface gráfica, quatro novos domínios foram adicionados, possibilitando outras alternativas de redirecionamentos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;irg3.net&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;minhapagina.info&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;minhahome.com&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;minhahomepage.com&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;A idéia é sempre adicionar novos domínios (essa tarefa ficou bem fácil na aplicação nova :D) dando mais opções pros usuários.&lt;br /&gt;&lt;br /&gt;Já ia esquecendo, no sistema novo, apenas um login e o e-mail são solicitados na hora do cadastro. Nem o nome a gente pergunta mais. Pra que? Geralmente não colocam o nome verdadeiro mesmo :P E pensar que no sistema antigo pedia até CPF... putz!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-9065406020617068871?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/9065406020617068871/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=9065406020617068871' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/9065406020617068871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/9065406020617068871'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2008/02/rg3net-de-cara-nova.html' title='RG3.Net de cara nova'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-3241517169774448125</id><published>2008-02-07T21:41:00.000-03:00</published><updated>2008-02-07T21:42:08.395-03:00</updated><title type='text'>Do Red Hat para o Slackware para o Debian</title><content type='html'>Nostalgia! De vez em quando gosto de relembrar o passado e uma parte do passado do meu eterno percurso na computação que mais gosto é quando comecei a mexer com &lt;a href="http://www.kernel.org"&gt;Linux&lt;/a&gt; (e por tabela, &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Tudo começou quando entrei pro curso de Física da &lt;a href="http://www.uefs.br"&gt;UEFS&lt;/a&gt;. Peguei um trabalho voluntário pra desenvolver a home page do departamento e me botaram pra trabalhar numa estação com &lt;a href="http://www.redhat.com"&gt;Red Hat 7.0&lt;/a&gt;. As minhas únicas tentativas com Linux até o momento foram o Corel Linux, um Linux da Corel que não foi pra frente, e o Monkey Linux, que era um mini-linux que rodava em partições FAT32 (é, isso existia!). O Monkey Linux foi minha melhor experiência com mini-linux, pois rodava tudo nele, menos o X (que na época era o XFree86), mas depois eu descobri que o problema era que o XFree86 não tinha drivers pra minha placa de vídeo da época (SiS 6202).&lt;br /&gt;&lt;br /&gt;Com o Red Hat foi que comecei a usar Linux de verdade. Três professores (Dagoberto, Jorge Kaschny e Nazareno) me ensinavam os básicos do sistema. Kaschny era o que mais fuçava na época. Aprendi muito com eles três e mais ainda com um colega de curso, Alex Gamas, que me deu muitas dicas na época e que junto com o irmão (Leonardo Gamas), aproximadamente um ano depois, me colocaram no mundo do FreeBSD.&lt;br /&gt;&lt;br /&gt;Os irmãos Gamas me mostraram em seguida o &lt;a href="http://www.slackware.com"&gt;Slackware&lt;/a&gt;. Eles me conseguiram um CD do Slackware 7.0 e eu instalei o sistema em casa. Nessa época, o Windows 98 já tinha se mandado de uma vez, dando espaço pro Red Hat. Quando comecei a usar o Slackware, delirei! Adotei como o meu Linux preferido e o utilizei por muito tempo: de 2002 até 2005. Fui até o Slackware 10.&lt;br /&gt;&lt;br /&gt;Em 2006, comecei a usar o &lt;a href="http://www.debian.org"&gt;Debian&lt;/a&gt;, por pressão dos amigos de Ilhéus, quando ainda cursava Ciência da Computação na &lt;a href="http://www.uesc.br"&gt;UESC&lt;/a&gt;. O que me levou a adotar o Debian foi o tamanho do seu repositório de pacotes pré-compilados. Eu já tinha enjoado de ter que compilar tudo pra rodar no Slackware.&lt;br /&gt;&lt;br /&gt;Fiquei usando o Debian e continuo com ele até hoje. Acredito que seja a melhor distribuição Linux existente, pois mistura a leveza e simplicidade do Slackware com a facilidade de uso do Red Hat. Não é tão seco nem tão pesado, foi o meio-termo que encontrei no mundo do Linux. Claro que pra iniciantes e leigos, o &lt;a href="http://www.ubuntu.org"&gt;Ubuntu&lt;/a&gt; seria uma melhor opção, mas aí você já sai do meio-termo e tende mais para o "pesado" do Red Hat e Fedora. :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-3241517169774448125?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/3241517169774448125/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=3241517169774448125' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3241517169774448125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3241517169774448125'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/07/do-red-hat-para-o-slackware-para-o.html' title='Do Red Hat para o Slackware para o Debian'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-5904523963446241301</id><published>2007-11-23T22:07:00.000-03:00</published><updated>2007-11-24T00:20:53.600-03:00</updated><title type='text'>Em breve: wxWidgets 3.0</title><content type='html'>Olá, pessoal! Quanto tempo, hein!? :P&lt;br /&gt;&lt;br /&gt;Estive fora desde julho por falta de tempo. Vejam só:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Em março, tomei a frente de um provedor de Internet à Rádio em Feira de Santana, BA - &lt;a href="http://www.rg3.net"&gt;RG3.Net&lt;/a&gt;. Além de ter que corrigir todos os erros de rede (tanto nos servidores quanto na estrutura wireless), gastei um bom tempo desenvolvendo uma aplicação Web (&lt;a href="http://www.perl.org/"&gt;Perl&lt;/a&gt; com &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt;) pra gerenciar o provedor (que estava meio bagunçado, tudo era feito no papel). Apenas nesse mês de novembro consegui um pouco mais de paz, pois corrigi os últimos problemas de hardware dessa rede wireless (o próximo passo é otimizá-la mais ainda).&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Estou no último semestre da &lt;a href="http://www.uesc.br"&gt;Universidade&lt;/a&gt;, o que significa que tenho que desenvolver algo na disciplina "&lt;a href="http://labbi.uesc.br/dany/estagio/"&gt;Estágio Supervisionado&lt;/a&gt;". A sorte é que usei a própria RG3.Net como meu tema de estágio, então o que faço lá tenho que escrever em um relatório e apresentar agora em dezembro.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;O site da RG3.Net também está sendo mudado (por dentro), como também os servidores. Dois deles já foram formatados e reinstalados. Lá rodava (e ainda roda) &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Todo esse trabalho na RG3.Net me ocupou bastante, até o &lt;a href="http://www.winpolicy.com"&gt;WinPolicy&lt;/a&gt; ficou sem atualizações. Mas as coisas estão voltando ao normal. Com o fim do curso de Ciência da Computação, vou poder configurar melhor meu tempo e o blog terá seu espaço de volta :)&lt;br /&gt;&lt;br /&gt;Na verdade, o que eu queria dizer é que o &lt;a href="http://www.wxwidgets.org"&gt;wxWidgets&lt;/a&gt; 3.0 está prestes a sair. Sua principal mudança vai ser que agora, UNICODE e ANSI estarão juntos em um único build da biblioteca. Algumas classes foram melhoradas e bugs corrigidos.&lt;br /&gt;&lt;br /&gt;Mais detalhes no &lt;a href="http://wxwidgets.blogspot.com/2007/11/looking-forward-to-wxwidgets-3.html"&gt;wxBlog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-5904523963446241301?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/5904523963446241301/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=5904523963446241301' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5904523963446241301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5904523963446241301'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/11/em-breve-wxwidgets-30.html' title='Em breve: wxWidgets 3.0'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-2649229468936731469</id><published>2007-07-12T21:06:00.000-03:00</published><updated>2007-07-12T21:52:00.309-03:00</updated><title type='text'>traceroute.org e aniversário do blog</title><content type='html'>Um site interessante.&lt;br /&gt;&lt;br /&gt;Descobri ele quando estava tendo problemas de roteamento em um dos meus servidores. Pacotes que saiam de um IP específico da minha rede não saiam do país. Além disso, ninguém fora do país conseguia enviar pacotes para esse IP. Mas outros IPs da mesma rede funcionavam OK (no final das contas, foi um filtro na Embratel que estava causando o problema).&lt;br /&gt;&lt;br /&gt;Então, comecei a testar as rotas para esse meu IP. Primeiro, fiz um traceroute a partir de um dos servidores da &lt;a href="http://www.dreamhost.com"&gt;Dreamhost&lt;/a&gt;. No traceroute, percebi que no meio do caminho, o pacote era bloqueado. Eu queria fazer mais testes, vindos de outras máquinas no exterior, mas o servidor da Dreamhost era a única máquina com acesso remoto que eu podia entrar.&lt;br /&gt;&lt;br /&gt;Nesas buscas pelo Google, encontrei o site &lt;a href="http://www.traceroute.org"&gt;www.traceroute.org&lt;/a&gt;. A partir deste site, você pode acessar outros sites em várias partes do mundo que permitem que você faça traceroutes para qualquer IP. Com ele, pude fazer testes de traceroute a partir de máquinas em vários outros países.&lt;br /&gt;&lt;br /&gt;Muito legal este site. Recomendo aos administradores de redes. :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;PS: Comemoremos! Hoje faz exatamente 1 ano da Casa de Just! :D&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-2649229468936731469?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/2649229468936731469/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=2649229468936731469' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/2649229468936731469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/2649229468936731469'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/07/tracerouteorg.html' title='traceroute.org e aniversário do blog'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-5301341683324212707</id><published>2007-07-09T08:10:00.000-03:00</published><updated>2007-07-09T08:39:56.286-03:00</updated><title type='text'>numeros.pl</title><content type='html'>Estava eu nesse fim de domingo, em casa, sem ter o que fazer. Nesse momento de ócio, lembrei de um numerólogo que estava dando entrevista essa semana na TV e procurei por &lt;a href="http://pt.wikipedia.org/wiki/Numerologia"&gt;Numerologia na Wikipédia&lt;/a&gt;. Comecei a ler o artigo e decidi fazer uns testes.&lt;br /&gt;&lt;br /&gt;O problema é que é chato ficar somando os valores das letras dos nomes pra saber o número da pessoa. Então, como bom cientista da computação que sou, implementei um programinha pra fazer essa tarefa.&lt;br /&gt;&lt;br /&gt;Pois bem, escrevi o código em &lt;a href="http://www.perl.org"&gt;Perl&lt;/a&gt;. Como programas em Perl são interpretados e não compilados, você vai precisar ter o interpretador instalado em seu computador pra executar o programa. Quem usa Windows, pode tentar o &lt;a href="http://www.activeperl.com/ASPN/Perl"&gt;ActivePerl&lt;/a&gt;. Quem usa Linux ou outro UNIX, provavelmente já tem o Perl instalado (se não tiver, você pode baixar o fonte e compilar ou instalar o pacote correspondente). Pra executar o programa, use a linha de comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;perl numeros.pl&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O programa irá perguntar seu nome completo e sua data de nascimento. Em seguida, vai somar os valores de cada letra do nome e dar seu número na numerologia. Depois, vai somar os números da sua data de nascimento e lhe entregar o número correspondente à sua lição de vida. Aí é só usar o &lt;a href="http://pt.wikipedia.org/wiki/Numerologia"&gt;artigo da Wikipédia&lt;/a&gt; pra saber o que cada número significa.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/usr/bin/perl&lt;br /&gt;# Referencia: http://pt.wikipedia.org/wiki/Numerologia&lt;br /&gt;&lt;br /&gt;# Soma os digitos&lt;br /&gt;sub soma {&lt;br /&gt; my $numero = 0;&lt;br /&gt; my (@digitos) = split(//, $_[0]);&lt;br /&gt;&lt;br /&gt; for (my $i = 0; $i &amp;lt; @digitos; ++$i) {&lt;br /&gt;  $numero += abs($digitos[$i]);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; if ($numero &amp;gt;= 10) {&lt;br /&gt;  return &amp;soma($numero);&lt;br /&gt; } else {&lt;br /&gt;  return $numero;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Tabela de numerologia&lt;br /&gt;my $tabela = ({&lt;br /&gt; a =&amp;gt; 1, b =&amp;gt; 2, c =&amp;gt; 3, d =&amp;gt; 4, e =&amp;gt; 5, f =&amp;gt; 6,&lt;br /&gt; g =&amp;gt; 7, h =&amp;gt; 8, i =&amp;gt; 9, j =&amp;gt; 1, k =&amp;gt; 2, l =&amp;gt; 3,&lt;br /&gt; m =&amp;gt; 4, n =&amp;gt; 5, o =&amp;gt; 6, p =&amp;gt; 7, q =&amp;gt; 8, r =&amp;gt; 9,&lt;br /&gt; s =&amp;gt; 1, t =&amp;gt; 2, u =&amp;gt; 3, v =&amp;gt; 4, w =&amp;gt; 5, x =&amp;gt; 6,&lt;br /&gt; y =&amp;gt; 7, z =&amp;gt; 8,&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;# Solicita o nome&lt;br /&gt;my $nome = undef;&lt;br /&gt;do {&lt;br /&gt; print &amp;quot;Digite seu nome completo, sem acentos ou cedilha:\n&amp;quot;;&lt;br /&gt; $nome = lc(&amp;lt;STDIN&amp;gt;);&lt;br /&gt; &lt;br /&gt; chop($nome);&lt;br /&gt;} while ($nome eq '');&lt;br /&gt;&lt;br /&gt;# Solicida data de nascimento&lt;br /&gt;my $nasc = undef;&lt;br /&gt;do {&lt;br /&gt; print &amp;quot;Digite sua data de nascimento, ex.: 10\/11\/1982\n&amp;quot;;&lt;br /&gt; $nasc = lc(&amp;lt;STDIN&amp;gt;);&lt;br /&gt; &lt;br /&gt; chop($nasc);&lt;br /&gt;} while ($nasc eq '');&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Divide as letras e calcula a soma&lt;br /&gt;my (@letras) = split(//, $nome);&lt;br /&gt;my $numero = 0;&lt;br /&gt;&lt;br /&gt;for (my $i = 0; $i &amp;lt; @letras; ++$i) {&lt;br /&gt; next if $letras[$i] eq ' ';&lt;br /&gt; $numero += $tabela-&amp;gt;{$letras[$i]};&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Exibe o resultado&lt;br /&gt;print &amp;quot;Seu numero: &amp;quot; . &amp;soma($numero) . &amp;quot;\n&amp;quot;;&lt;br /&gt;print &amp;quot;Sua licao de vida: &amp;quot; . &amp;soma($nasc) . &amp;quot;\n&amp;quot;;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-5301341683324212707?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/5301341683324212707/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=5301341683324212707' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5301341683324212707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5301341683324212707'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/07/numerospl.html' title='numeros.pl'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-3961196086805223252</id><published>2007-07-07T20:55:00.000-03:00</published><updated>2007-07-07T21:10:03.277-03:00</updated><title type='text'>Novo: Slackware 12</title><content type='html'>Isso aqui vai acabar virando blog de notícias de atualização de distros :P Mas pelo menos tô voltando à ativa, rsrs&lt;br /&gt;&lt;br /&gt;Pois bem, o Slackware 12 veio essa semana e algumas mudanças são notáveis. De acordo com o &lt;a href="http://www.slackware.com/announce/12.0.php"&gt;anúncio oficial&lt;/a&gt;, o Slackware agora vem com dois tipos de kernels: kernels grandes, que vêm com todo tipo de driver possível, geralmente pra facilitar a instalação do sistema, além do kernel genérico, que tem os drivers compilados como módulo (a forma mais comum de kernel).&lt;br /&gt;&lt;br /&gt;Outra novidade é que ele agora vem com o HAL (Hardware Abstraction Layer), aumentando a habilidade Plug and Play do Slackware.&lt;br /&gt;&lt;br /&gt;A nova versão atualiza também a maioria dos pacotes: kernel 2.6.21.5, KDE 3.5.7, X.Org 7.2.0, gcc 4.1.2, Apache 2.2.4, etc.&lt;br /&gt;&lt;br /&gt;Para a lista completa das mudanças, leiam o &lt;a href="http://www.slackware.com/announce/12.0.php"&gt;anúncio oficial&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-3961196086805223252?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/3961196086805223252/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=3961196086805223252' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3961196086805223252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3961196086805223252'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/07/novo-slackware-12.html' title='Novo: Slackware 12'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-3630202357229344044</id><published>2007-04-08T19:45:00.000-03:00</published><updated>2007-04-08T19:53:02.502-03:00</updated><title type='text'>Debian 4.0 (etch) se torna stable!</title><content type='html'>Finalmente! Aguardava esse momento há alguns meses.&lt;br /&gt;&lt;br /&gt;O Debian 4.0, codenome &lt;span style="font-style:italic;"&gt;etch&lt;/span&gt;, deixou de ser &lt;span style="font-style:italic;"&gt;testing&lt;/span&gt; e agora é &lt;span style="font-style:italic;"&gt;stable&lt;/span&gt;. Ele havia sido congelado em dezembro do ano passado, ou seja, novos pacotes deixaram de ser adicionados e os pacotes já contidos no sistema estavam em fase de correção de bugs.&lt;br /&gt;&lt;br /&gt;A notícia oficial pode ser lida no site do Debian:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.debian.org/News/2007/20070408"&gt;http://www.debian.org/News/2007/20070408&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como também, instruções de download e instalação:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.debian.org/distrib/"&gt;http://www.debian.org/distrib/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quem usa o &lt;a href="http://www.justsoft.com.br/linux"&gt;Justsoft GNU/Linux&lt;/a&gt;, já está rodando o sistema Justsoft em cima do Debian etch. Portanto, basta atualizar o sistema através do &lt;span style="font-style:italic;"&gt;APT&lt;/span&gt; ou do próprio assistente de atualização que fica ao lado do relógio do GNOME.&lt;br /&gt;&lt;br /&gt;Apesar de agora ser &lt;span style="font-style:italic;"&gt;stable&lt;/span&gt;, vou esperar um pouco antes de atualizar meu servidor, que já usa Debian 3.1 (sarge).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-3630202357229344044?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/3630202357229344044/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=3630202357229344044' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3630202357229344044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/3630202357229344044'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/04/debian-40-etch-se-torna-stable.html' title='Debian 4.0 (etch) se torna stable!'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-5723205852569520438</id><published>2007-03-18T00:54:00.000-03:00</published><updated>2007-03-18T01:05:49.299-03:00</updated><title type='text'>Curso de wxWidgets, post 14: Comunicando-se pela rede</title><content type='html'>Olá, pessoal! Como havia prometido no post anterior, este será sobre sockets e comunicação via rede.&lt;br /&gt;&lt;br /&gt;Nesta primeira parte, abordarei o cliente, ou seja, o programa irá conectar em algum servidor. Tive a idéia de fazer um código para enviar e-mails, já que o protocolo SMTP é simples e fácil para mensagens em texto plano e sem anexos. Para quem não conhece o protocolo SMTP, sugiro que leia a RFC822, que descreve seu formato:&lt;br /&gt;&lt;br /&gt;&lt;a href="ftp://ftp.rfc-editor.org/in-notes/rfc822.txt" target="_blank"&gt;ftp://ftp.rfc-editor.org/in-notes/rfc822.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De qualquer forma, vou dar uma resumida no protocolo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Nos parágrafos abaixo, &amp;lt;- indica uma mensagem que está vindo do servidor e -&amp;gt; indica uma mensagem que o cliente está enviando para o servidor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ao se conectar em um servidor SMTP, o cliente recebe uma mensagem de boas-vindas, geralmente com o endereço do servidor e alguns dados do software:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;- 220 spaceymail-mx1.g.dreamhost.com ESMTP&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em seguida, o cliente deve se idenficar enviando a string &lt;span style="font-style:italic;"&gt;&amp;quot;EHLO&amp;quot;&lt;/span&gt; e o seu endereço. Após a identificação, o servidor dá algumas informações sobre o envio da mensagem (não relevante para nós no momento):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;-&amp;gt; EHLO just.justsoft.com.br&lt;br /&gt;&amp;lt;- 250-spaceymail-mx1.g.dreamhost.com&lt;br /&gt;&amp;lt;- 250-PIPELINING&lt;br /&gt;&amp;lt;- 250-SIZE 40960000&lt;br /&gt;&amp;lt;- 250-ETRN&lt;br /&gt;&amp;lt;- 250-STARTTLS&lt;br /&gt;&amp;lt;- 250 8BITMIME&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora o cliente deve dizer o endereço do remetente com o comando &lt;span style="font-style:italic;"&gt;&amp;quot;MAIL From:&amp;quot;&lt;/span&gt; e do destinatário com &lt;span style="font-style:italic;"&gt;&amp;quot;RCPT To:&amp;quot;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;-&amp;gt; MAIL From: &amp;lt;teste@teste.com&amp;gt;&lt;br /&gt;&amp;lt;- 250 Ok&lt;br /&gt;-&amp;gt; RCPT To: &amp;lt;jpjust@justsoft.com.br&amp;gt;&lt;br /&gt;&amp;lt;- 250 Ok&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Após estas informações, o cliente começa a mensagem com o comando &lt;span style="font-style:italic;"&gt;&amp;quot;DATA&amp;quot;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;-&amp;gt; DATA&lt;br /&gt;&amp;lt;- 354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;br /&gt;-&amp;gt; From: &amp;lt;just@just.com&amp;gt;&lt;br /&gt;-&amp;gt; To: &amp;lt;jpjust@justsoft.com.br&amp;gt;&lt;br /&gt;-&amp;gt; Date, Thu, 15 Mar 2007 21:00:00 +0000&lt;br /&gt;-&amp;gt; Subject: Teste&lt;br /&gt;-&amp;gt; &lt;br /&gt;-&amp;gt; teste&lt;br /&gt;-&amp;gt; &lt;br /&gt;-&amp;gt; .&lt;br /&gt;&amp;lt;- 250 Ok: queued as 6C0C3CE937&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O fim da mensagem deve ser indicado com um ponto (.) sozinho em uma linha. Por último, o cliente pede para o servidor fechar a conexão com &lt;span style="font-style:italic;"&gt;&amp;quot;QUIT&amp;quot;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;-&amp;gt; QUIT&lt;br /&gt;&amp;lt;- 221 Bye&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E é isto! Você pode testar os comandos conectando em algum servidor SMTP pelo telnet. Basta executar o comando &lt;span style="font-style:italic;"&gt;&amp;quot;telnet mx1.hotmail.com 25&amp;quot;&lt;/span&gt; para conectar no servidor SMTP do Hotmail e enviar mensagens para endereços de lá. Veja abaixo uma pequena lista com o servidor SMTP de alguns serviços de e-mail famosos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Hotmail: mx1.hotmail.com&lt;br /&gt;Yahoo!: a.mx.mail.yahoo.com&lt;br /&gt;GMail: gmail-smtp-in.l.google.com&lt;br /&gt;UOL: mx.uol.com.br&lt;br /&gt;BOL: mx.boil.com.br&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se você usa Linux ou algum outro UNIX, use o comando &lt;span style="font-style:italic;"&gt;host&lt;/span&gt; para saber o servidor SMTP de algum domínio de e-mail. Por exemplo, para saber o servidor SMTP de gmail.com:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ host -t MX gmail.com&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Voltando à programação, o que iremos fazer é um programa em wxWidgets para se conectar a um servidor SMTP e enviar um e-mail.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A parte wxWidgets da coisa&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para todo o trabalho de rede no wxWidgets, usaremos a classe &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbase"&gt;wxSocketBase&lt;/a&gt;&lt;/span&gt; e uma classe derivada, a &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketclient.html#wxsocketclient"&gt;wxSocketClient&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase&lt;/span&gt; é a classe base para todas as outras classes de socket no wxWidgets. Neste post, usaremos apenas a classe &lt;span style="font-style:italic;"&gt;wxSocketClient&lt;/span&gt;, que é responsável por fazer as conexões do nosso programa, que é o cliente, no servidor.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conectando-se no servidor&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Antes de fazer alguma conexão com a &lt;span style="font-style:italic;"&gt;wxSocketClient&lt;/span&gt;, precisamos do endereço do servidor ao qual vamos nos conectar e também a porta da conexão. Para manusear essas informações, usaremos a classe &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxipv4address.html#wxipv4address"&gt;wxIPV4address&lt;/a&gt;&lt;/span&gt;. Essa classe serve para guardar informações de um endereço, como número IP e porta. Para definir o endereço do servidor e a porta, usamos dois métodos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxIPV4address host;&lt;br /&gt;host.Hostname(wxT(&amp;quot;smtp.server.com&amp;quot;));&lt;br /&gt;host.Service(wxT(&amp;quot;25&amp;quot;));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No trecho de código acima, criamos um objeto de nome &lt;span style="font-style:italic;"&gt;host&lt;/span&gt;, que é uma instância de &lt;span style="font-style:italic;"&gt;wxIPV4address&lt;/span&gt;. Em seguida, definimos o endereço como &lt;span style="font-style:italic;"&gt;smtp.server.com&lt;/span&gt; e a porta como &lt;span style="font-style:italic;"&gt;25&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Após criar um objeto com o endereço e a porta do servidor, podemos chamar o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketclient.html#wxsocketclientconnect"&gt;wxSocketClient::Connect()&lt;/a&gt;&lt;/span&gt; para conectar no servidor:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxSocketClient sock;&lt;br /&gt;bool status;&lt;br /&gt;status = sock.Connect(host);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se a conexão for feita com sucesso, o método retorna &lt;span style="font-style:italic;"&gt;true&lt;/span&gt;, que será guardado na variável &lt;span style="font-style:italic;"&gt;status&lt;/span&gt;. Em caso de erro na conexão, logicamente, o método retornará &lt;span style="font-style:italic;"&gt;false&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Por padrão, o método &lt;span style="font-style:italic;"&gt;wxSocketClient::Connect()&lt;/span&gt; aguarda a conexão ser feita ou a ocorrência de um erro para prosseguir a execução. Mas é possível chamar o método e continuar a execução do programa enquanto o socket está se conectando, basta adicionar um parâmetro ao método:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sock.Connect(host, false);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O segundo parâmetro indica se o método deverá aguardar a conexão ser completada. Se você escolheu esta maneira para se conectar, poderá verificar se a conexão foi feita posteriormente com o método &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbaseisconnected"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::IsConnected()&lt;/span&gt;&lt;/a&gt; ou até mesmo, aguardar pela conexão em um ponto posterior com &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketclient.html#wxsocketclientwaitonconnect"&gt;&lt;span style="font-style:italic;"&gt;wxSocketClient::WaitOnConnect()&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enviando dados&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Após ter sido feita a conexão, já é possível enviar e receber dados. Para fazer o envio, usamos o método &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbasewrite"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::Write()&lt;/span&gt;&lt;/a&gt;. Após enviar qualquer dado, podemos verificar se o envio foi feito com sucesso com o método &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbaseerror"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::Error()&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString dado = wxT(&amp;quot;EHLO localhost\r\n&amp;quot;);&lt;br /&gt;socket.Write((char *)dado.mb_str(), dado.Len());&lt;br /&gt;if (socket.Error())&lt;br /&gt;{&lt;br /&gt;  wxMessageBox(wxT(&amp;quot;Erro ao enviar o dado.&amp;quot;));&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No trecho acima, enviamos a string &lt;span style="font-style:italic;"&gt;&amp;quot;EHLO localhost\r\n&amp;quot;&lt;/span&gt; e em caso de erro, uma mensagem é exibida ao usuário. Perceba o cast &lt;span style="font-style:italic;"&gt;(char *)&lt;/span&gt; e o método &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxstring.html#wxstringmbstr"&gt;&lt;span style="font-style:italic;"&gt;wxString::mb_str()&lt;/span&gt;&lt;/a&gt;. Este método retorna a string no formato ANSI. Perceba também que o método &lt;span style="font-style:italic;"&gt;wxSocketBase::Write()&lt;/span&gt; não define um tipo de dado específico, você pode enviar texto puro ou binário. Como no nosso exemplo de um cliente SMTP estamos enviando texto puro, obtemos o formato ANSI da string e usamos o cast &lt;span style="font-style:italic;"&gt;(char *)&lt;/span&gt; para indicar ao método que estamos enviando um &lt;span style="font-style:italic;"&gt;char&lt;/span&gt;. O segundo parâmetro do método indica o tamanho do dado que estamos enviando. No caso, como é texto puro em ANSI (1 byte por caracter), indicamos o tamanho da string.&lt;br /&gt;&lt;br /&gt;Em caso de erro no envio, &lt;span style="font-style:italic;"&gt;wxSocketBase::Error()&lt;/span&gt; retorna &lt;span style="font-style:italic;"&gt;true&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Recebendo dados&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Após enviar algum dado pelo socket, geralmente esperamos por uma resposta, esta é a hora de fazer a leitura do socket. Para isto, usaremos o método &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbaseread"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::Read()&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;char buffer[1024] = {0};&lt;br /&gt;socket.Read(buffer, 1024 - 1);&lt;br /&gt;if (socket.Error())&lt;br /&gt;{&lt;br /&gt;  wxMessageBox(wxT(&amp;quot;Erro ao fazer a leitura.&amp;quot;));&lt;br /&gt;}&lt;br /&gt;int contagem = socket.LastCount();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, criamos um buffer do tipo &lt;span style="font-style:italic;"&gt;char&lt;/span&gt; com 1 KB. Em seguida, fazemos a leitura, armazenando a saída em &lt;span style="font-style:italic;"&gt;buffer&lt;/span&gt; e indicando o máximo de dados que deverá ser lido (subtraímos 1 do tamanho pois devemos guardar um espaço para o terminador de string &lt;span style="font-style:italic;"&gt;\0&lt;/span&gt; da variável).&lt;br /&gt;&lt;br /&gt;Mais uma vez, &lt;span style="font-style:italic;"&gt;wxSocketBase::Error()&lt;/span&gt; entra em ação para nos informar se houve algum erro.&lt;br /&gt;&lt;br /&gt;Neste trecho, usamos também o método &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbaselastcount"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::LastCount()&lt;/span&gt;&lt;/a&gt;, ele retorna o número de bytes lidos no &lt;span style="font-style:italic;"&gt;wxSocketBase::Read()&lt;/span&gt;. Ele também pode ser usado após um &lt;span style="font-style:italic;"&gt;wxSocketBase::Write()&lt;/span&gt; para saber quantos bytes foram enviados de fato.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Fechando a conexão&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Após enviarmos e recebermos todos os dados necessários para a conexão, devemos terminá-la. Basta um único método para isso, o &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbaseclose"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::Close()&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;socket.Close()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Existe também um outro método relacionado ao término de conexão, o &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbasewaitforlost"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::WaitForLost()&lt;/span&gt;&lt;/a&gt;. Com ele, você pode indicar um timeout em segundos ou milissegundos. Se a conexão for fechada antes do timeout (o servidor pode fechar a conexão), o método retorna &lt;span style="font-style:italic;"&gt;true&lt;/span&gt;, caso o timeout seja atingido, ele retorna &lt;span style="font-style:italic;"&gt;false&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Outras formas de E/S&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Além do &lt;span style="font-style:italic;"&gt;wxSocketBase::Read()&lt;/span&gt; e do &lt;span style="font-style:italic;"&gt;wxSocketBase::Write()&lt;/span&gt;, existem também o &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbasewritemsg"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::WriteMsg()&lt;/span&gt;&lt;/a&gt; e o &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbasereadmsg"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::ReadMsg()&lt;/span&gt;&lt;/a&gt;. Com esses dois métodos, é possível trocar mensagens entre duas aplicações em wxWidgets sem precisar se preocupar com a contagem de bytes enviados ou recebidos.&lt;br /&gt;&lt;br /&gt;Mostrarei estes e outros métodos das classes de socket em posts futuros. Ainda há muito o que falar sobre sockets no wxWidgets :)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Configurando o socket&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Também é possível fazer algumas configurações no socket antes de utilizá-lo. Veja abaixo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbasesettimeout"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::SetTimeout()&lt;/span&gt;&lt;/a&gt;: configura o tempo de timeout em segundos para os métodos de E/S e de espera do socket. O valor padrão é  de 10 minutos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;socket.SetTimeout(120); // Configura o timeout para 120 segundos&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxsocketbase.html#wxsocketbasesetflags"&gt;&lt;span style="font-style:italic;"&gt;wxSocketBase::SetFlags()&lt;/span&gt;&lt;/a&gt;: configura o comportamento de espera do socket nas operações de E/S. Pode receber como argumento os valores abaixo:&lt;br /&gt;&lt;br /&gt;wxSOCKET_NONE: Funcionamento normal.&lt;br /&gt;wxSOCKET_NOWAIT: Lê ou grava o máximo possível de dados e retorna imediatamente.&lt;br /&gt;wxSOCKET_WAITALL: Aguarda que todo o dado seja lido ou gravado ou que um erro ocorra para retornar.&lt;br /&gt;wxSOCKET_BLOCK: Bloqueia a interface gráfica durante a operação.&lt;br /&gt;wxSOCKET_REUSEADDR: Permite que o socket escute em uma porta que já está em uso (apenas para sockets de servidor).&lt;br /&gt;&lt;br /&gt;Para configurar o socket para sempre aguardar que os dados sejam lidos ou gravados por completo antes de continuar a execução do código, use:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;socket.SetFlags(wxSOCKET_WAITALL);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Outros métodos de configuração do socket serão vistos nos outros posts.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Nosso código de exemplo&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, o código do programa que irá fazer a conexão e enviar o e-mail. O código está bem documentado para que você possa entender cada parte do programa.&lt;br /&gt;&lt;br /&gt;A interface gráfica já vai aparecer preenchida com os dados do servidor SMTP do GMail e meu endereço de e-mail de lá. Por favor, envie um e-mail para mim pelo programa de exemplo :) Obrigado.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * Curso de wxWidgets: Enviando e-mails via SMTP&lt;br /&gt; *&lt;br /&gt; * O objetivo deste código-fonte é demonstrar diversas classes&lt;br /&gt; * ensinadas no curso de wxWidgets do blog &amp;quot;A Casa de Just&amp;quot;.&lt;br /&gt; *&lt;br /&gt; * As aulas do curso de wxWidgets podem ser encontradas em forma&lt;br /&gt; * de posts no blog: http://jpjust.blogspot.com&lt;br /&gt; *&lt;br /&gt; * Copyright (c) João Paulo Just &amp;lt;jpjust@justsoft.com.br&amp;gt;&lt;br /&gt; * A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * 18 de março de 2007, 00:48, Ilhéus, BA, Brasil.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;wx/wx.h&amp;gt;&lt;br /&gt;#include &amp;lt;wx/socket.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;&lt;br /&gt;// Tamanho do buffer que será utilizado no recebimento de mensagens&lt;br /&gt;#define BUFFER 256&lt;br /&gt;&lt;br /&gt;// Enumeração dos IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_ENVIAR&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe: MailApp&lt;br /&gt;class MailApp: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; virtual bool OnInit();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe: MailFrame&lt;br /&gt;class MailFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; MailFrame(void);&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt; &lt;br /&gt;private:&lt;br /&gt; void EnviarMensagem(wxCommandEvent &amp;event);  // Método para enviar a mensagem&lt;br /&gt; wxString Envia(wxSocketBase *socket, wxString msg); // Método para enviar dados pelo socket&lt;br /&gt; wxString Le(wxSocketBase *socket);   // Método para obter dados no socket&lt;br /&gt; &lt;br /&gt; wxStaticText *lb_servidor;&lt;br /&gt; wxStaticText *lb_porta;&lt;br /&gt; wxStaticText *lb_de;&lt;br /&gt; wxStaticText *lb_para;&lt;br /&gt; wxStaticText *lb_assunto;&lt;br /&gt; &lt;br /&gt; wxTextCtrl *txt_servidor;&lt;br /&gt; wxTextCtrl *txt_porta;&lt;br /&gt; wxTextCtrl *txt_de;&lt;br /&gt; wxTextCtrl *txt_para;&lt;br /&gt; wxTextCtrl *txt_assunto;&lt;br /&gt; wxTextCtrl *txt_mensagem;&lt;br /&gt; wxTextCtrl *txt_proto;&lt;br /&gt;&lt;br /&gt; wxButton *btn_enviar;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Tabela de eventos&lt;br /&gt;BEGIN_EVENT_TABLE(MailFrame, wxFrame)&lt;br /&gt; EVT_BUTTON(ID_ENVIAR, MailFrame::EnviarMensagem)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;// Método: MailApp::OnInit()&lt;br /&gt;// Inicialização do programa&lt;br /&gt;bool MailApp::OnInit()&lt;br /&gt;{&lt;br /&gt; MailFrame *frame = new MailFrame();&lt;br /&gt; frame-&amp;gt;Show();&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Método: MailFrame::MailFrame&lt;br /&gt;// Construtor do frame&lt;br /&gt;MailFrame::MailFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT(&amp;quot;Enviar e-mail - http://jpjust.blogspot.com&amp;quot;))&lt;br /&gt;{&lt;br /&gt;//wxMessageBox(wxNow());&lt;br /&gt;&lt;br /&gt; // Sizers&lt;br /&gt; wxGridSizer *sizer_g = new wxGridSizer(5, 2, 0, 0);&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; &lt;br /&gt; // Texto indicativo&lt;br /&gt; lb_servidor = new wxStaticText(this, wxID_ANY, wxT(&amp;quot;Servidor SMTP:&amp;quot;));&lt;br /&gt; lb_porta = new wxStaticText(this, wxID_ANY, wxT(&amp;quot;Porta:&amp;quot;));&lt;br /&gt; lb_de  = new wxStaticText(this, wxID_ANY, wxT(&amp;quot;De:&amp;quot;));&lt;br /&gt; lb_para  = new wxStaticText(this, wxID_ANY, wxT(&amp;quot;Para:&amp;quot;));&lt;br /&gt; lb_assunto = new wxStaticText(this, wxID_ANY, wxT(&amp;quot;Assunto:&amp;quot;));&lt;br /&gt; &lt;br /&gt; // Caixas de texto&lt;br /&gt; txt_servidor = new wxTextCtrl(this, wxID_ANY, wxT(&amp;quot;gmail-smtp-in.l.google.com&amp;quot;), wxDefaultPosition, wxSize(200, -1));&lt;br /&gt; txt_porta = new wxTextCtrl(this, wxID_ANY, wxT(&amp;quot;25&amp;quot;));&lt;br /&gt; txt_de  = new wxTextCtrl(this, wxID_ANY, wxT(&amp;quot;seu@email.com&amp;quot;), wxDefaultPosition, wxSize(200, -1));&lt;br /&gt; txt_para = new wxTextCtrl(this, wxID_ANY, wxT(&amp;quot;just1982@gmail.com&amp;quot;), wxDefaultPosition, wxSize(200, -1));&lt;br /&gt; txt_assunto = new wxTextCtrl(this, wxID_ANY, wxT(&amp;quot;Post 14&amp;quot;), wxDefaultPosition, wxSize(200, -1));&lt;br /&gt; txt_mensagem = new wxTextCtrl(this, wxID_ANY, wxT(&amp;quot;Eu li o post 14!&amp;quot;), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_WORDWRAP);&lt;br /&gt; txt_proto = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_WORDWRAP | wxTE_READONLY);&lt;br /&gt; &lt;br /&gt; // Botão de enviar&lt;br /&gt; btn_enviar = new wxButton(this, ID_ENVIAR, wxT(&amp;quot;Enviar&amp;quot;));&lt;br /&gt; &lt;br /&gt; // Adiciona itens nos sizers&lt;br /&gt; sizer_g-&amp;gt;Add(lb_servidor, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(txt_servidor, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(lb_porta, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(txt_porta, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(lb_de, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(txt_de, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(lb_para, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(txt_para, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(lb_assunto, 0, wxALL, 5);&lt;br /&gt; sizer_g-&amp;gt;Add(txt_assunto, 0, wxALL, 5);&lt;br /&gt; &lt;br /&gt; sizer_v-&amp;gt;Add(sizer_g, 0, wxALL, 0);&lt;br /&gt; sizer_v-&amp;gt;Add(txt_mensagem, 2, wxALL | wxEXPAND, 5);&lt;br /&gt; sizer_v-&amp;gt;Add(txt_proto, 1, wxALL | wxEXPAND, 5);&lt;br /&gt; sizer_v-&amp;gt;Add(btn_enviar, 0, wxALL | wxALIGN_RIGHT, 5);&lt;br /&gt;&lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/////////////////////////////////////////////////&lt;br /&gt;// A partir daqui, a interface gráfica já está criada e&lt;br /&gt;// veremos os métodos que realmente importam neste exemplo.&lt;br /&gt;&lt;br /&gt;// Método: Envia&lt;br /&gt;// Envia 'msg' para o socket e efetua a leitura logo em seguida, retornando o resultado&lt;br /&gt;wxString MailFrame::Envia(wxSocketBase *socket, wxString msg)&lt;br /&gt;{&lt;br /&gt; // Se estiver desconectado, sai do método e retorna uma string vazia&lt;br /&gt; if (socket-&amp;gt;IsDisconnected())&lt;br /&gt;  return wxEmptyString;&lt;br /&gt;&lt;br /&gt; wxString res;&lt;br /&gt;&lt;br /&gt; // Envia 'msg' pelo socket&lt;br /&gt; socket-&amp;gt;Write((char *)msg.mb_str(), msg.Len());&lt;br /&gt;&lt;br /&gt; // Em caso de erro, retorna uma mensagem avisando e fecha a conexão&lt;br /&gt; if (socket-&amp;gt;Error())&lt;br /&gt; {&lt;br /&gt;  return wxT(&amp;quot;&amp;gt;&amp;gt; Ocorreu um erro ao se comunicar com o servidor!\n&amp;quot;);&lt;br /&gt;  socket-&amp;gt;Close();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // Recebe a resposta enviada pelo outro host e a retorna&lt;br /&gt; return msg + Le(socket);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Método: Le&lt;br /&gt;// Lê o conteúdo do socket (ou seja, qualquer mensagem enviada pelo outro host)&lt;br /&gt;wxString MailFrame::Le(wxSocketBase *socket)&lt;br /&gt;{&lt;br /&gt; wxString res;&lt;br /&gt; char buf[BUFFER]; // Buffer para recebimento&lt;br /&gt;&lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt;  memset(buf, 0, BUFFER);&lt;br /&gt;  socket-&amp;gt;Read(buf, BUFFER - 1); // Faz a leitura e armazena no buffer&lt;br /&gt;  res.Append(buf);&lt;br /&gt; // Enquanto 'res' estiver vazio (nenhuma leitura foi feita ainda) ou&lt;br /&gt; // enquanto houver dados para serem lidos, continuaremos percorrendo o laço&lt;br /&gt; } while ((socket-&amp;gt;LastCount() &amp;gt; 0) || (res.Len() == 0));&lt;br /&gt; &lt;br /&gt; return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Método: MailFrame::Envia&lt;br /&gt;// Envia o e-mail&lt;br /&gt;// Este método vai fazer a conexão, enviar os dados e fechar a conexão&lt;br /&gt;void MailFrame::EnviarMensagem(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; wxIPV4address host;&lt;br /&gt; wxSocketClient sock;&lt;br /&gt; wxString msg, saida;&lt;br /&gt;&lt;br /&gt; // Obtém a hora no formato requerido pela RFC822&lt;br /&gt; // O formato é &amp;quot;Dia, data mês ano hora fuso&amp;quot;&lt;br /&gt; // Ex.: Thu, 15 Mar 2007 20:19:00 BRT&lt;br /&gt; char hora[50] = {0};&lt;br /&gt; time_t now = time(NULL);&lt;br /&gt; strftime(hora, 50, &amp;quot;%a, %d %b %Y %T %Z&amp;quot;, localtime(&amp;now));&lt;br /&gt;&lt;br /&gt; // Configura o objeto 'host'&lt;br /&gt; // Aqui definimos o endereço do servidor e a porta&lt;br /&gt; host.Hostname(txt_servidor-&amp;gt;GetValue());&lt;br /&gt; host.Service(txt_porta-&amp;gt;GetValue());&lt;br /&gt;&lt;br /&gt; // Configuração do socket&lt;br /&gt; // O timeout padrão para operações de E/S será de 120 segundos&lt;br /&gt; // A flag 'wxSOCKET_NOWAIT' indica que operações de E/S irão retornar imediatamente&lt;br /&gt; // (com esta flag, o programa não irá ficar parado em um Read() ou Write() do socket)&lt;br /&gt; sock.SetTimeout(120);&lt;br /&gt; sock.SetFlags(wxSOCKET_NOWAIT);&lt;br /&gt; txt_proto-&amp;gt;AppendText(wxT(&amp;quot;&amp;gt;&amp;gt; Tentando se conectar...\n&amp;quot;));&lt;br /&gt; if (sock.Connect(host) == false)&lt;br /&gt; {&lt;br /&gt;  // Erro na conexão&lt;br /&gt;  txt_proto-&amp;gt;AppendText(wxT(&amp;quot;&amp;gt;&amp;gt; Ocorreu um erro ao tentar conectar no servidor!\n&amp;quot;));&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; txt_proto-&amp;gt;AppendText(wxT(&amp;quot;&amp;gt;&amp;gt; Conectado!\n&amp;quot;));&lt;br /&gt; txt_proto-&amp;gt;AppendText(Le(&amp;sock)); // Lê a mensagem de boas-vindas do servidor&lt;br /&gt;&lt;br /&gt; // Neste bloco, enviamos uma identificação (EHLO), o remetente (MAIL From),&lt;br /&gt; // o destinatário (RCPT To) e indicamos o início da mensagem (DATA)&lt;br /&gt; txt_proto-&amp;gt;AppendText(Envia(&amp;sock, wxT(&amp;quot;EHLO &amp;quot;) + wxGetFullHostName() + wxT(&amp;quot;\r\n&amp;quot;)));&lt;br /&gt; txt_proto-&amp;gt;AppendText(Envia(&amp;sock, wxT(&amp;quot;MAIL From: &amp;lt;&amp;quot;) + txt_de-&amp;gt;GetValue() + wxT(&amp;quot;&amp;gt;\r\n&amp;quot;)));&lt;br /&gt; txt_proto-&amp;gt;AppendText(Envia(&amp;sock, wxT(&amp;quot;RCPT To: &amp;lt;&amp;quot;) + txt_para-&amp;gt;GetValue() + wxT(&amp;quot;&amp;gt;\r\n&amp;quot;)));&lt;br /&gt; txt_proto-&amp;gt;AppendText(Envia(&amp;sock, wxT(&amp;quot;DATA\r\n&amp;quot;)));&lt;br /&gt;&lt;br /&gt; // Agora, o e-mail será montado. O corpo do e-mail tem o seguinte formato:&lt;br /&gt; //&lt;br /&gt; //  From: &amp;quot;Nome do remetente&amp;quot; &amp;lt;email_do_remetente&amp;gt;&lt;br /&gt; //  To: &amp;quot;Nome do destinatário&amp;quot; &amp;lt;email_do_destinatário&amp;gt;&lt;br /&gt; //  Date: Data de envio (obedecendo a RFC822)&lt;br /&gt; //  Subject: Assunto do e-mail&lt;br /&gt; //&lt;br /&gt; //  Mensagem, linha 1...&lt;br /&gt; //  Mensagem, linha 2...&lt;br /&gt; //&lt;br /&gt; //  . (deve conter um ponto na última linha para indicar o fim da mensagem)&lt;br /&gt; msg.Clear();&lt;br /&gt; msg.Append(wxT(&amp;quot;From: &amp;lt;&amp;quot;) + txt_de-&amp;gt;GetValue() + wxT(&amp;quot;&amp;gt;\r\n&amp;quot;));&lt;br /&gt; msg.Append(wxT(&amp;quot;To: &amp;lt;&amp;quot;) + txt_para-&amp;gt;GetValue() + wxT(&amp;quot;&amp;gt;\r\n&amp;quot;));&lt;br /&gt; msg.Append(wxT(&amp;quot;Date: &amp;quot;) + wxString(hora) + wxT(&amp;quot;\r\n&amp;quot;));&lt;br /&gt; msg.Append(wxT(&amp;quot;Subject: &amp;quot;) + txt_assunto-&amp;gt;GetValue() + wxT(&amp;quot;\r\n\r\n&amp;quot;));&lt;br /&gt; msg.Append(txt_mensagem-&amp;gt;GetValue() + wxT(&amp;quot;\r\n\r\n&amp;quot;));&lt;br /&gt; msg.Append(wxT(&amp;quot;--\r\nVisite A Casa de Just: http://jpjust.blogspot.com\r\n&amp;quot;));&lt;br /&gt; msg.Append(wxT(&amp;quot;\r\n.\r\n&amp;quot;));&lt;br /&gt;&lt;br /&gt; // O corpo do e-mail é enviado pelo socket e a resposta do servidor é&lt;br /&gt; // inserida na caixa de texto&lt;br /&gt; txt_proto-&amp;gt;AppendText(Envia(&amp;sock, msg));&lt;br /&gt;&lt;br /&gt; // Por último, fechamos a conexão com o comando QUIT&lt;br /&gt; txt_proto-&amp;gt;AppendText(Envia(&amp;sock, wxT(&amp;quot;QUIT\r\n&amp;quot;)));&lt;br /&gt;&lt;br /&gt; // Aguarda que a conexão seja fechada pelo servidor&lt;br /&gt; if (sock.WaitForLost(120) == false)&lt;br /&gt; {&lt;br /&gt;  txt_proto-&amp;gt;AppendText(wxT(&amp;quot;&amp;gt;&amp;gt; Erro ao enviar mensagem!\n&amp;quot;));&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  txt_proto-&amp;gt;AppendText(wxT(&amp;quot;&amp;gt;&amp;gt; Mensagem enviada!\n&amp;quot;));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Pronto! O e-mail está enviado! :)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MailApp)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_5DNwUFk6stg/Rfy3x4I1L5I/AAAAAAAAAAw/dKurBIZLdOU/s1600-h/post14_smtp.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_5DNwUFk6stg/Rfy3x4I1L5I/AAAAAAAAAAw/dKurBIZLdOU/s320/post14_smtp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5043107750259011474" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-5723205852569520438?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/5723205852569520438/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=5723205852569520438' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5723205852569520438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/5723205852569520438'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/03/curso-de-wxwidgets-post-14-comunicando.html' title='Curso de wxWidgets, post 14: Comunicando-se pela rede'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_5DNwUFk6stg/Rfy3x4I1L5I/AAAAAAAAAAw/dKurBIZLdOU/s72-c/post14_smtp.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1260697320351831253</id><published>2007-03-08T09:11:00.000-03:00</published><updated>2007-03-08T09:34:07.031-03:00</updated><title type='text'>Notícias do Blog</title><content type='html'>Olá, pessoal!&lt;br /&gt;&lt;br /&gt;O curso de wxWidgets irá voltar ao andamento normal na próxima semana, pois nestes últimos dias, estive (e ainda estou) fora para resolver pendências. Na volta do curso, postarei sobre comunicação em rede com sockets.&lt;br /&gt;&lt;br /&gt;Estive também estudando sobre como usar banco de dados com wxWidgets e postarei sobre isso assim que estiver por dentro do assunto.&lt;br /&gt;&lt;br /&gt;E falando em banco de dados, um leitor do blog chamado Guilherme sugeriu o uso da biblioteca &lt;a href="http://www.sqlapi.com/"&gt;SQLAPI++&lt;/a&gt; para acesso a banco de dados com C++. Estive olhando os códigos de exemplo e parece ser bem melhor que as classes do wxWidgets (postarei outro dia sobre o que estou achando do acesso a banco de dados no wxWidgets). Pena que não é gratuita, custa US$ 249,00.&lt;br /&gt;&lt;br /&gt;Se alguém conhecer alguma outra alternativa para acesso a banco de dados com C/C++, escreva um comentário. :)&lt;br /&gt;&lt;br /&gt;Até o próximo post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1260697320351831253?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1260697320351831253/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1260697320351831253' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1260697320351831253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1260697320351831253'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/03/notcias-do-blog.html' title='Notícias do Blog'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-8985128502848479851</id><published>2007-02-07T20:26:00.000-03:00</published><updated>2007-02-07T20:53:24.267-03:00</updated><title type='text'>Curso de wxWidgets, post 13: Formatando texto</title><content type='html'>Para finalizar o editor de textos, vamos adicionar formatação a ele. Para isto, irei usar uma função que já vimos no curso: &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_dialogfunctions.html#wxgetfontfromuser"&gt;&lt;span style="font-style:italic;"&gt;wxGetFontFromUser()&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Primeiro, vamos incluir o cabeçalho da função:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include &amp;lt;wx/fontdlg.h&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vamos também criar um novo método para a formatação. Este método irá se chamar &lt;span style="font-style:italic;"&gt;MeuFrame::Formatar()&lt;/span&gt;. Vamos declarar a nova função na definição da classe:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;private:&lt;br /&gt;...&lt;br /&gt;  void Formatar(void);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E agora, implementemos o método:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Formatação&lt;br /&gt;void MeuFrame::Formatar(void)&lt;br /&gt;{&lt;br /&gt;  long inicio, fim;&lt;br /&gt;  wxTextAttr attr;&lt;br /&gt;  wxFont font;&lt;br /&gt;&lt;br /&gt;  // Obtém a formatação atual (não suportado em todas as plataformas)&lt;br /&gt;  txt_file-&amp;gt;GetSelection(&amp;inicio, &amp;fim);&lt;br /&gt;  txt_file-&amp;gt;GetStyle(inicio, attr);&lt;br /&gt;  font = attr.GetFont();&lt;br /&gt;&lt;br /&gt;  // Altera a formatação&lt;br /&gt;  font = wxGetFontFromUser(this, font);&lt;br /&gt;  attr.SetFont(font);&lt;br /&gt;  txt_file-&amp;gt;SetStyle(inicio, fim, attr); // Aplica o estilo ao texto&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, o método tenta obter a formatação atual do texto selecionado (&lt;span style="font-style:italic;"&gt;wxTextCtrl::GetStyle()&lt;/span&gt; não é suportado em todas as plataformas, testei no Linux e não funcionou). Após obter a formatação, iremos utilizá-la em &lt;span style="font-style:italic;"&gt;wxGetFontFromUser()&lt;/span&gt; para inicializar os valores da janela, assim, sempre a janela de formatação for aberta, ela estará configurada com a formatação atual.&lt;br /&gt;&lt;br /&gt;Em seguida, &lt;span style="font-style:italic;"&gt;wxGetFontFromUser()&lt;/span&gt; retorna a nova formatação e podemos aplicá-la ao texto selecionado.&lt;br /&gt;&lt;br /&gt;Agora devemos criar um botão na barra de ferramentas para este método. Vamos adicionar uma ID para este botão:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_TBAR_NEW,&lt;br /&gt; ID_TBAR_LOAD,&lt;br /&gt; ID_TBAR_SAVE,&lt;br /&gt; ID_TBAR_FORMAT, // Este foi adicionado&lt;br /&gt; ID_TBAR_ABOUT&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E criamos o novo botão no construtor de &lt;span style="font-style:italic;"&gt;MeuFrame&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;tbar-&amp;gt;AddTool(ID_TBAR_FORMAT, wxString(wxT(&amp;quot;Formatar&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gedit-icon.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Está feito. :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_5DNwUFk6stg/Rcpj3XplSwI/AAAAAAAAAAk/6PzblR6CIr4/s1600-h/post13_formatacao.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_5DNwUFk6stg/Rcpj3XplSwI/AAAAAAAAAAk/6PzblR6CIr4/s320/post13_formatacao.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5028941736804961026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Próximo passo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O editor de textos pára por aqui. Estou querendo falar sobre sockets no próximo post, mas precisarei elaborar um texto maior, pois tem bastante coisa pra explicar. Se alguém quiser aprender algo específico do wxWidgets, postem nos comentários. Assim vocês me ajudam a escolher o próximo assunto. :)&lt;br /&gt;&lt;br /&gt;Como sempre faço, o código-fonte completo está abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * Curso de wxWidgets: Um editor de textos&lt;br /&gt; *&lt;br /&gt; * O objetivo deste código-fonte é demonstrar diversas classes&lt;br /&gt; * ensinadas no curso de wxWidgets do blog &amp;quot;A Casa de Just&amp;quot;.&lt;br /&gt; *&lt;br /&gt; * As aulas do curso de wxWidgets podem ser encontradas em forma&lt;br /&gt; * de posts no blog: http://jpjust.blogspot.com&lt;br /&gt; *&lt;br /&gt; * Copyright (c) João Paulo Just &amp;lt;jpjust@justsoft.com.br&amp;gt;&lt;br /&gt; * A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * 07 de fevereiro de 2007, 20:24, Ilhéus, BA, Brasil.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;wx/wx.h&amp;gt;&lt;br /&gt;#include &amp;lt;wx/fontdlg.h&amp;gt;&lt;br /&gt;&lt;br /&gt;// IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_TBAR_NEW,&lt;br /&gt; ID_TBAR_LOAD,&lt;br /&gt; ID_TBAR_SAVE,&lt;br /&gt; ID_TBAR_FORMAT,&lt;br /&gt; ID_TBAR_ABOUT&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do programa&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Método principal&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do frame&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Construtor&lt;br /&gt; MeuFrame(void);&lt;br /&gt; &lt;br /&gt; // Eventos&lt;br /&gt; void OnToolBarClick(wxCommandEvent &amp;event);&lt;br /&gt;&lt;br /&gt; // Métodos auxiliares&lt;br /&gt; void Novo(void);&lt;br /&gt; void Abrir(void);&lt;br /&gt; void Salvar(void);&lt;br /&gt; void Formatar(void);&lt;br /&gt; void Sobre(void);&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; // Widgets do frame&lt;br /&gt; wxTextCtrl *txt_file;&lt;br /&gt; wxToolBar *tbar;&lt;br /&gt; wxStatusBar *stbar;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Inicialização do programa&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; wxInitAllImageHandlers(); // Inicia todos os hadlers de imagens do wxBitmap&lt;br /&gt;&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&amp;gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Tabela de eventos&lt;br /&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_TOOL_RANGE(ID_TBAR_NEW, ID_TBAR_ABOUT, MeuFrame::OnToolBarClick)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;// Construtor do frame&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT(&amp;quot;Editor de textos - http://jpjust.blogspot.com&amp;quot;))&lt;br /&gt;{&lt;br /&gt; // Sizer e widgets&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; &lt;br /&gt; txt_file = new wxTextCtrl(this, wxID_ANY, wxEmptyString,&lt;br /&gt;  wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);&lt;br /&gt;&lt;br /&gt; // Barra de ferramentas&lt;br /&gt; tbar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT);&lt;br /&gt;&lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_NEW, wxString(wxT(&amp;quot;Novo&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gedit-icon.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_LOAD, wxString(wxT(&amp;quot;Abrir&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gnome-folder.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt;  &lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_SAVE, wxString(wxT(&amp;quot;Salvar&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gnome-cd.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt;  &lt;br /&gt; tbar-&amp;gt;AddSeparator();&lt;br /&gt;&lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_FORMAT, wxString(wxT(&amp;quot;Formatar&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gedit-icon.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt; tbar-&amp;gt;AddSeparator();&lt;br /&gt;&lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_ABOUT, wxString(wxT(&amp;quot;Sobre&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gnome-info.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt; tbar-&amp;gt;Realize();&lt;br /&gt;&lt;br /&gt; // Barra de status&lt;br /&gt; stbar = new wxStatusBar(this);&lt;br /&gt; stbar-&amp;gt;SetStatusText(wxT(&amp;quot;Sem título&amp;quot;));&lt;br /&gt; &lt;br /&gt; // Posicionamento&lt;br /&gt; sizer_v-&amp;gt;Add(txt_file, 1, wxALL | wxEXPAND, 5);&lt;br /&gt; &lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt; &lt;br /&gt; // Insere a barra de ferramentas e a barra de status&lt;br /&gt; SetToolBar(tbar);&lt;br /&gt; SetStatusBar(stbar);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Limpa a tela para um novo arquivo&lt;br /&gt;void MeuFrame::Novo(void)&lt;br /&gt;{&lt;br /&gt; int msg = wxMessageBox(wxT(&amp;quot;Deseja salvar o arquivo atual antes de criar um novo?&amp;quot;), \&lt;br /&gt;  wxT(&amp;quot;Novo arquivo&amp;quot;), wxYES_NO | wxCANCEL);&lt;br /&gt;&lt;br /&gt; if (msg == wxYES)  // Salva&lt;br /&gt;  Salvar();&lt;br /&gt; else if (msg == wxCANCEL) // Cancela a operação&lt;br /&gt;  return;&lt;br /&gt;&lt;br /&gt; // Cria um novo arquivo&lt;br /&gt; txt_file-&amp;gt;Clear();&lt;br /&gt; stbar-&amp;gt;SetStatusText(wxT(&amp;quot;Sem título&amp;quot;));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Abre um arquivo&lt;br /&gt;void MeuFrame::Abrir(void)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT(&amp;quot;Selecione o arquivo&amp;quot;),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT(&amp;quot;*.txt&amp;quot;), wxOPEN | wxFILE_MUST_EXIST);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; txt_file-&amp;gt;LoadFile(Filename);&lt;br /&gt; &lt;br /&gt; // Atualiza o nome&lt;br /&gt; stbar-&amp;gt;SetStatusText(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Salva o arquivo aberto&lt;br /&gt;void MeuFrame::Salvar(void)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT(&amp;quot;Selecione o arquivo&amp;quot;),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT(&amp;quot;*.txt&amp;quot;), wxSAVE | wxOVERWRITE_PROMPT);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; txt_file-&amp;gt;SaveFile(Filename);&lt;br /&gt; &lt;br /&gt; // Atualiza o nome do arquivo&lt;br /&gt; stbar-&amp;gt;SetStatusText(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Formatação&lt;br /&gt;void MeuFrame::Formatar(void)&lt;br /&gt;{&lt;br /&gt; long inicio, fim;&lt;br /&gt; wxTextAttr attr;&lt;br /&gt; wxFont font;&lt;br /&gt;&lt;br /&gt; // Obtém a formatação atual (não suportado em todas as plataformas)&lt;br /&gt; txt_file-&amp;gt;GetSelection(&amp;inicio, &amp;fim);&lt;br /&gt; txt_file-&amp;gt;GetStyle(inicio, attr);&lt;br /&gt; font = attr.GetFont();&lt;br /&gt;&lt;br /&gt; // Altera a formatação&lt;br /&gt; font = wxGetFontFromUser(this, font);&lt;br /&gt; attr.SetFont(font);&lt;br /&gt; txt_file-&amp;gt;SetStyle(inicio, fim, attr); // Aplica o estilo ao texto&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Janela &amp;quot;Sobre&amp;quot;&lt;br /&gt;void MeuFrame::Sobre(void)&lt;br /&gt;{&lt;br /&gt; wxMessageBox(wxT(&amp;quot;Curso de wxWidgets\n\nhttp://jpjust.blogspot.com&amp;quot;), wxT(&amp;quot;Sobre&amp;quot;), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Método para a barra de ferramentas&lt;br /&gt;void MeuFrame::OnToolBarClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; switch (event.GetId())&lt;br /&gt; {&lt;br /&gt; case ID_TBAR_NEW:&lt;br /&gt;  Novo();&lt;br /&gt;  break;&lt;br /&gt;&lt;br /&gt; case ID_TBAR_LOAD:&lt;br /&gt;  Abrir();&lt;br /&gt;  break;&lt;br /&gt;  &lt;br /&gt; case ID_TBAR_SAVE:&lt;br /&gt;  Salvar();&lt;br /&gt;  break;&lt;br /&gt;  &lt;br /&gt; case ID_TBAR_FORMAT:&lt;br /&gt;  Format();&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-8985128502848479851?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/8985128502848479851/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=8985128502848479851' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/8985128502848479851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/8985128502848479851'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/02/curso-de-wxwidgets-post-12-formatando.html' title='Curso de wxWidgets, post 13: Formatando texto'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_5DNwUFk6stg/Rcpj3XplSwI/AAAAAAAAAAk/6PzblR6CIr4/s72-c/post13_formatacao.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-8958702244715483750</id><published>2007-01-29T10:15:00.000-03:00</published><updated>2007-01-30T21:06:21.678-03:00</updated><title type='text'>Curso de wxWidgets, post 12: Adicionando uma barra de status</title><content type='html'>O post de hoje vai ser bem simples e rápido, iremos apenas adicionar uma barra de status ao nosso editor de textos. Essa barra de status irá informar o nome do arquivo que estamos editando.&lt;br /&gt;&lt;br /&gt;Para a barra de status, vamos usar a classe &lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxstatusbar.html#wxstatusbar"&gt;&lt;span style="font-style:italic;"&gt;wxStatusBar&lt;/span&gt;&lt;/a&gt;. O construtor é bem simples:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxStatusBar(wxWindow* parent, wxWindowID id = wxID_ANY, long style = wxST_SIZEGRIP,&lt;br /&gt;  const wxString&amp; name = &amp;quot;statusBar&amp;quot;)&lt;br /&gt;&lt;br /&gt;parent: A janela que vai conter a barra de status.&lt;br /&gt;&lt;br /&gt;id: ID da barra, para os eventos.&lt;br /&gt;&lt;br /&gt;style: Estilo da barra. Existe apenas o estilo wxST_SIZEGRIP, que exibe um &amp;quot;puxador&amp;quot; no canto&lt;br /&gt;direito da barra no Windows.&lt;br /&gt;&lt;br /&gt;name: Nome da barra.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nenhum dos parâmetros são obrigatórios, existe o construtor sem parâmetros também. Mas recomenda-se usar &lt;span style="font-style:italic;"&gt;this&lt;/span&gt; como primeiro parâmetro, para associar a barra com a janela que a está contendo. E é assim que nós iremos fazer no nosso editor de textos. Na definição da classe &lt;span style="font-style:italic;"&gt;MeuFrame&lt;/span&gt;, temos que adicionar a barra como um atributo em &lt;span style="font-style:italic;"&gt;private&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;private:&lt;br /&gt;  wxStatusBar *stbar;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No construtor de &lt;span style="font-style:italic;"&gt;MeuFrame&lt;/span&gt;, iremos instanciar o objeto e definir um texto inicial para a barra de status:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// Barra de status&lt;br /&gt;stbar = new wxStatusBar(this);&lt;br /&gt;stbar-&gt;SetStatusText(wxT(&amp;quot;Sem título&amp;quot;));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxstatusbar.html#wxstatusbarsetstatustext"&gt;wxStatusBar::SetStatusText()&lt;/a&gt;&lt;/span&gt; recebe dois parâmetros: o primeiro, é o texto que você irá colocar na barra, o segundo e opcional, é o número do campo da barra que irá receber o texto.&lt;br /&gt;&lt;br /&gt;No nosso exemplo, estamos usando apenas um campo de texto, mas podem existem barras com vários. Você pode ajustar o número de campos da sua barra com o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxstatusbar.html#wxstatusbarsetfieldscount"&gt;wxStatusBar::SetFieldsCount()&lt;/a&gt;&lt;/span&gt;. Por exemplo, se quiser três campos na sua barra, use o método da seguinte forma:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;stbar-&gt;SetFieldsCount(3);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E para alterar o texto do segundo campo, use:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;stbar-&gt;SetStatusText(wxT(&amp;quot;Campo 2&amp;quot;), 1);&lt;br /&gt;// O primeiro campo é o zero&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como temos apenas um campo em nossa barra, não precisamos especificar o número dele.&lt;br /&gt;&lt;br /&gt;Em seguida, devemos &amp;quot;colar&amp;quot; esta barra de status na janela. Fazemos isso com o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/stable/wx_wxframe.html#wxframesetstatusbar"&gt;wxFrame::SetStatusBar()&lt;/a&gt;&lt;/span&gt;, ainda no construtor:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SetStatusBar(stbar);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pronto, a barra já está criada e dentro da nossa janela. Vamos agora atualizar os métodos &lt;span style="font-style:italic;"&gt;MeuFrame::Abrir()&lt;/span&gt; e &lt;span style="font-style:italic;"&gt;MeuFrame::Salvar()&lt;/span&gt;, que deverão modificar o texto da barra de status.&lt;br /&gt;&lt;br /&gt;No código do nosso editor de textos, procure as linhas:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;lb_filename-&gt;SetLabel(Filename);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Essas linhas modificam o nome do arquivo no nosso &lt;span style="font-style:italic;"&gt;wxStaticText&lt;/span&gt;. Iremos remover essas linhas e no lugar delas, colocar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;stbar-&gt;SetStatusText(Filename);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora o editor de textos já está com a barra pronta. Já que não vamos mais usar o &lt;span style="font-style:italic;"&gt;lb_filename&lt;/span&gt;, podemos removê-lo do construtor e da definição de &lt;span style="font-style:italic;"&gt;MeuFrame&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Compile o novo código e veja a barra em funcionamento:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_5DNwUFk6stg/Rb34v2vc8TI/AAAAAAAAAAY/MzgZuli_tMY/s1600-h/post12_wxstatusbar.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_5DNwUFk6stg/Rb34v2vc8TI/AAAAAAAAAAY/MzgZuli_tMY/s320/post12_wxstatusbar.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5025446260247425330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Código-fonte atualizado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O código completo e atualizado está abaixo. No novo código, eu removi o &lt;span style="font-style:italic;"&gt;lb_filename&lt;/span&gt;, como mostrado neste post. Também removi &lt;span style="font-style:italic;"&gt;btn_load&lt;/span&gt; e &lt;span style="font-style:italic;"&gt;btn_save&lt;/span&gt;, já que agora temos a barra de ferramentas. Além disso, criei o método &lt;span style="font-style:italic;"&gt;MeuFrame::Novo()&lt;/span&gt;, para criar um novo arquivo e seu respectivo botão na barra de ferramentas. Também removi a mensagem de boas-vindas. Olhe o código inteiro para ver as modificações e entendê-las.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * Curso de wxWidgets: Um editor de textos&lt;br /&gt; *&lt;br /&gt; * O objetivo deste código-fonte é demonstrar diversas classes&lt;br /&gt; * ensinadas no curso de wxWidgets do blog &amp;quot;A Casa de Just&amp;quot;.&lt;br /&gt; *&lt;br /&gt; * As aulas do curso de wxWidgets podem ser encontradas em forma&lt;br /&gt; * de posts no blog: http://jpjust.blogspot.com&lt;br /&gt; *&lt;br /&gt; * Copyright (c) João Paulo Just &amp;lt;jpjust@justsoft.com.br&amp;gt;&lt;br /&gt; * A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * 29 de janeiro de 2007, 9:48, Ilhéus, BA, Brasil.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;wx/wx.h&amp;gt;&lt;br /&gt;#include &amp;lt;wx/textfile.h&amp;gt;&lt;br /&gt;&lt;br /&gt;// IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_TBAR_NEW,&lt;br /&gt; ID_TBAR_LOAD,&lt;br /&gt; ID_TBAR_SAVE,&lt;br /&gt; ID_TBAR_ABOUT&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do programa&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Método principal&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do frame&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Construtor&lt;br /&gt; MeuFrame(void);&lt;br /&gt; &lt;br /&gt; // Eventos&lt;br /&gt; void OnToolBarClick(wxCommandEvent &amp;event);&lt;br /&gt;&lt;br /&gt; // Métodos auxiliares&lt;br /&gt; void Novo(void);&lt;br /&gt; void Abrir(void);&lt;br /&gt; void Salvar(void);&lt;br /&gt; void Sobre(void);&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; // Widgets do frame&lt;br /&gt; wxTextCtrl *txt_file;&lt;br /&gt; wxToolBar *tbar;&lt;br /&gt; wxStatusBar *stbar;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Inicialização do programa&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; wxInitAllImageHandlers(); // Inicia todos os hadlers de imagens do wxBitmap&lt;br /&gt;&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&amp;gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Tabela de eventos&lt;br /&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_TOOL_RANGE(ID_TBAR_NEW, ID_TBAR_ABOUT, MeuFrame::OnToolBarClick)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;// Construtor do frame&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT(&amp;quot;Editor de textos - http://jpjust.blogspot.com&amp;quot;))&lt;br /&gt;{&lt;br /&gt; // Sizer e widgets&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; &lt;br /&gt; txt_file = new wxTextCtrl(this, wxID_ANY, wxEmptyString,&lt;br /&gt;  wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);&lt;br /&gt; &lt;br /&gt; // Barra de ferramentas&lt;br /&gt; tbar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT);&lt;br /&gt;&lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_NEW, wxString(wxT(&amp;quot;Novo&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gedit-icon.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_LOAD, wxString(wxT(&amp;quot;Abrir&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gnome-folder.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt;  &lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_SAVE, wxString(wxT(&amp;quot;Salvar&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gnome-cd.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt;  &lt;br /&gt; tbar-&amp;gt;AddSeparator();&lt;br /&gt; &lt;br /&gt; tbar-&amp;gt;AddTool(ID_TBAR_ABOUT, wxString(wxT(&amp;quot;Sobre&amp;quot;)), \&lt;br /&gt;  wxBitmap(wxT(&amp;quot;/usr/share/pixmaps/gnome-info.png&amp;quot;), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt; tbar-&amp;gt;Realize();&lt;br /&gt;&lt;br /&gt; // Barra de status&lt;br /&gt; stbar = new wxStatusBar(this);&lt;br /&gt; stbar-&amp;gt;SetStatusText(wxT(&amp;quot;Sem título&amp;quot;));&lt;br /&gt; &lt;br /&gt; // Posicionamento&lt;br /&gt; sizer_v-&amp;gt;Add(txt_file, 1, wxALL | wxEXPAND, 5);&lt;br /&gt; &lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt; &lt;br /&gt; // Insere a barra de ferramentas e a barra de status&lt;br /&gt; SetToolBar(tbar);&lt;br /&gt; SetStatusBar(stbar);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Limpa a tela para um novo arquivo&lt;br /&gt;void MeuFrame::Novo(void)&lt;br /&gt;{&lt;br /&gt; int msg = wxMessageBox(wxT(&amp;quot;Deseja salvar o arquivo atual antes de criar um novo?&amp;quot;), \&lt;br /&gt;  wxT(&amp;quot;Novo arquivo&amp;quot;), wxYES_NO | wxCANCEL);&lt;br /&gt;&lt;br /&gt; if (msg == wxYES)  // Salva&lt;br /&gt;  Salvar();&lt;br /&gt; else if (msg == wxCANCEL) // Cancela a operação&lt;br /&gt;  return;&lt;br /&gt;&lt;br /&gt; // Cria um novo arquivo&lt;br /&gt; txt_file-&amp;gt;Clear();&lt;br /&gt; stbar-&amp;gt;SetStatusText(wxT(&amp;quot;Sem título&amp;quot;));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Abre um arquivo&lt;br /&gt;void MeuFrame::Abrir(void)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT(&amp;quot;Selecione o arquivo&amp;quot;),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT(&amp;quot;*.txt&amp;quot;), wxOPEN | wxFILE_MUST_EXIST);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; txt_file-&amp;gt;LoadFile(Filename);&lt;br /&gt; &lt;br /&gt; // Atualiza o nome&lt;br /&gt; stbar-&amp;gt;SetStatusText(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Salva o arquivo aberto&lt;br /&gt;void MeuFrame::Salvar(void)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT(&amp;quot;Selecione o arquivo&amp;quot;),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT(&amp;quot;*.txt&amp;quot;), wxSAVE | wxOVERWRITE_PROMPT);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; txt_file-&amp;gt;SaveFile(Filename);&lt;br /&gt; &lt;br /&gt; // Atualiza o nome do arquivo&lt;br /&gt; stbar-&amp;gt;SetStatusText(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Janela &amp;quot;Sobre&amp;quot;&lt;br /&gt;void MeuFrame::Sobre(void)&lt;br /&gt;{&lt;br /&gt; wxMessageBox(wxT(&amp;quot;Curso de wxWidgets\n\nhttp://jpjust.blogspot.com&amp;quot;), wxT(&amp;quot;Sobre&amp;quot;), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Método para a barra de ferramentas&lt;br /&gt;void MeuFrame::OnToolBarClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; switch (event.GetId())&lt;br /&gt; {&lt;br /&gt; case ID_TBAR_NEW:&lt;br /&gt;  Novo();&lt;br /&gt;  break;&lt;br /&gt;&lt;br /&gt; case ID_TBAR_LOAD:&lt;br /&gt;  Abrir();&lt;br /&gt;  break;&lt;br /&gt;  &lt;br /&gt; case ID_TBAR_SAVE:&lt;br /&gt;  Salvar();&lt;br /&gt;  break;&lt;br /&gt;  &lt;br /&gt; case ID_TBAR_ABOUT:&lt;br /&gt;  Sobre();&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-8958702244715483750?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/8958702244715483750/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=8958702244715483750' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/8958702244715483750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/8958702244715483750'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/01/curso-de-wxwidgets-post-12-adicionando.html' title='Curso de wxWidgets, post 12: Adicionando uma barra de status'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_5DNwUFk6stg/Rb34v2vc8TI/AAAAAAAAAAY/MzgZuli_tMY/s72-c/post12_wxstatusbar.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-434399246434100706</id><published>2007-01-16T01:46:00.000-03:00</published><updated>2007-01-16T01:49:45.553-03:00</updated><title type='text'>Justsoft GNU/Linux</title><content type='html'>Neste dia 15, a &lt;a href="http://www.justsoft.com.br"&gt;Justsoft&lt;/a&gt; disponibilizou em seu site a sua distribuição Linux baseada no &lt;a href="http://www.debian.org"&gt;Debian&lt;/a&gt; etch. O &lt;a href="http://www.justsoft.com.br/linux"&gt;Justsoft GNU/Linux&lt;/a&gt; vem sido desenvolvido desde dezembro do ano passado, com o objetivo de fornecer uma distribuição voltada aos usuários finais, tanto domésticos como corporativos.&lt;br /&gt;&lt;br /&gt;A idéia principal desta distribuição é seguir os requisitos de software do projeto do governo &lt;a href="http://www.justsoft.com.br/linux/pcparatodos.shtml"&gt;Computador para Todos&lt;/a&gt;, com inúmeros aplicativos já instalados, tornando possível a venda de computadores com o Justsoft GNU/Linux pré-instalado.&lt;br /&gt;&lt;br /&gt;Além de atender os requisitos do programa do governo, o Justsoft GNU/Linux também inclui outros pacotes extras, que facilitam a vida do usuário, como por exemplo, drivers e aplicativos para impressoras, software para webcam, etc.&lt;br /&gt;&lt;br /&gt;O Justsoft GNU/Linux consiste de uma série de meta-pacotes que instalam dependências do repositório Debian, customizando a distribuição (ao estilo Debian CDD). Os usuários podem optar por baixar o CD de instalação no site da Justsoft ou simplesmente instalar o Debian etch e em seguida, adicionar o repositório do Justsoft GNU/Linux:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;deb http://apt.justsoft.com.br/justsoft paranoid main&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Depois, basta instalar o pacote justsoft-cdd:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# apt-get update&lt;br /&gt;# apt-get install justsoft-cdd&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No &lt;a href="http://www.justsoft.com.br"&gt;site da Justsoft&lt;/a&gt; pode ser acessada a página da distribuição, com mais informações, download e screenshots.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-434399246434100706?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/434399246434100706/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=434399246434100706' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/434399246434100706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/434399246434100706'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/01/justsoft-gnulinux.html' title='Justsoft GNU/Linux'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-4317950571198981817</id><published>2007-01-09T23:41:00.000-03:00</published><updated>2007-01-09T23:42:44.409-03:00</updated><title type='text'>Curso de wxWidgets, post 11: Construindo barras de ferramentas</title><content type='html'>Agora vamos dar uma incrementada no nosso editor de textos, adicionando uma barra de ferramentas nele. A classe resposável por isto é a &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtoolbar.html#wxtoolbar"&gt;wxToolBar&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O procedimento básico é criar a barra, instanciando um objeto da classe e em seguida, atribuir um método ao evento de clique dos botões da barra.&lt;br /&gt;&lt;br /&gt;Como sempre, vamos iniciar pelo &lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtoolbar.html#wxtoolbarconstr"&gt;construtor&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxToolBar(wxWindow* parent, wxWindowID id, const wxPoint&amp; pos = wxDefaultPosition,&lt;br /&gt;  const wxSize&amp;amp; size = wxDefaultSize, long style = wxTB_HORIZONTAL | wxNO_BORDER,&lt;br /&gt;  const wxString&amp; name = wxPanelNameStr)&lt;br /&gt;&lt;br /&gt;parent: A janela que conterá a barra.&lt;br /&gt;&lt;br /&gt;id: ID da barra.&lt;br /&gt;&lt;br /&gt;pos: Posição.&lt;br /&gt;&lt;br /&gt;size: Tamanho.&lt;br /&gt;&lt;br /&gt;style: O estilo da barra.&lt;br /&gt;&lt;br /&gt;name: Nome da barra.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Apesar dos parâmetros &lt;span style="font-style: italic;"&gt;pos&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;size&lt;/span&gt;, nós não precisamos especificar tamanho e a posição da barra de ferramentas. Apenas iremos criá-la normalmente e "prendê-la" no topo da janela. Para isto, vamos declarar a barra como um atributo privado da classe do nosso frame e instanciá-la no construtor.&lt;br /&gt;&lt;br /&gt;Na definição da classe de &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;private:&lt;br /&gt; wxToolBar  *tbar;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No construtor de &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;tbar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Precisaremos também adicionar IDs para os botões da barra na lista de &lt;span style="font-style: italic;"&gt;enum&lt;/span&gt; do nosso código:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_BTNLOAD,&lt;br /&gt; ID_BTNSAVE,&lt;br /&gt; ID_TBAR_LOAD,&lt;br /&gt; ID_TBAR_SAVE,&lt;br /&gt; ID_TBAR_ABOUT&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora que a barra de ferramentas está criada, podemos adicionar nossos botões a ela. Fazemos isso também no construtor de &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt;, depois da instanciação da barra.&lt;br /&gt;&lt;br /&gt;Para o nosso editor de textos, iremos adicionar três botões, "Abrir", "Salvar" e "Sobre", além de um separador antes do "Sobre". Isto será feito através do método &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtoolbar.html#wxtoolbaraddtool"&gt;wxToolBar::AddTool()&lt;/a&gt;&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtoolbar.html#wxtoolbaraddseparator"&gt;wxToolBar::AddSeparator()&lt;/a&gt;&lt;/span&gt; para o separador:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;tbar-&gt;AddTool(ID_TBAR_LOAD, wxString(wxT("Abrir")), \&lt;br /&gt; wxBitmap(wxT("/usr/share/pixmaps/gnome-folder.png"), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt;tbar-&gt;AddTool(ID_TBAR_SAVE, wxString(wxT("Salvar")), \&lt;br /&gt; wxBitmap(wxT("/usr/share/pixmaps/gnome-cd.png"), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt;tbar-&gt;AddSeparator();&lt;br /&gt;&lt;br /&gt;tbar-&gt;AddTool(ID_TBAR_ABOUT, wxString(wxT("Sobre")), \&lt;br /&gt; wxBitmap(wxT("/usr/share/pixmaps/gnome-info.png"), wxBITMAP_TYPE_PNG));&lt;br /&gt;&lt;br /&gt;tbar-&gt;Realize();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Perceba que eu usei o método &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtoolbar.html#wxtoolbarrealize"&gt;wxToolBar::Realize()&lt;/a&gt;&lt;/span&gt; após adicionar os botões. Isto irá atualizar a barra.&lt;br /&gt;&lt;br /&gt;No código acima, usei algumas imagens que estão instaladas no meu computador. Você pode alterar o caminho das imagens acima para outras existentes no seu sistema. Obviamente, se você está compilando no Windows, os caminhos acima não funcionarão.&lt;br /&gt;&lt;br /&gt;No final deste post, falarei um pouco sobre o uso da classe &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wxbitmap.html#wxbitmap"&gt;wxBitmap&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Por último, vamos dizer ao frame quem é sua barra de ferramentas. Para isto, usamos o método &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wxframe.html#wxframesettoolbar"&gt;wxFrame::SetToolBar()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// Insere a barra de ferramentas&lt;br /&gt;SetToolBar(tbar);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Neste ponto, a barra já irá aparecer na janela do editor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Criando eventos para a barra de ferramentas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A parte mais simples já foi feita. Agora vamos dar vida à barra!&lt;br /&gt;&lt;br /&gt;No nosso exemplo do editor de textos, fiz uma modificação para facilitar o código. Criei os métodos &lt;span style="font-style: italic;"&gt;Abrir()&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Salvar()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;Sobre()&lt;/span&gt;. Os códigos de carregamento e gravação do arquivo, que antes estavam em &lt;span style="font-style: italic;"&gt;OnLoadClick()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;OnSaveClick()&lt;/span&gt; foram pra &lt;span style="font-style: italic;"&gt;Abrir()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;Salvar()&lt;/span&gt; respectivamente. &lt;span style="font-style: italic;"&gt;Sobre()&lt;/span&gt; tem um código para exibir um pop-up.&lt;br /&gt;&lt;br /&gt;Mas o método mais importante que iremos criar é o &lt;span style="font-style: italic;"&gt;MeuFrame::OnToolBarClick()&lt;/span&gt;. Veja sua definição:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;void OnToolBarClick(wxCommandEvent &amp;event);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este método tratará os eventos de clique na barra de ferramentas. Antes de mostrar sua implementação, veja a definição do evento na tabela de eventos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;EVT_TOOL_RANGE(ID_TBAR_LOAD, ID_TBAR_ABOUT, MeuFrame::OnToolBarClick)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para os botões normais (&lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wxbutton.html#wxbutton"&gt;wxButton&lt;/a&gt;&lt;/span&gt;), nós precisamos definir um evento para cada botão. No caso da barra de ferramentas, definimos o &lt;span style="font-style: italic;"&gt;range&lt;/span&gt; dos IDs dos botões da barra. No nosso exemplo, associamos este eventos a todos os IDs desde &lt;span style="font-style: italic;"&gt;ID_TBAR_LOAD&lt;/span&gt; até &lt;span style="font-style: italic;"&gt;ID_TBAR_ABOUT&lt;/span&gt;. Isso é muito útil quando criamos uma barra com muitos botões.&lt;br /&gt;&lt;br /&gt;Você pode ver os outros eventos disponíveis para o &lt;span style="font-style: italic;"&gt;wxToolBar&lt;/span&gt; na &lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wxtoolbar.html#wxtoolbar"&gt;documentação da classe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mas como na definição, todos os IDs irão chamar o mesmo método, como iremos dar funções diferentes para cada botão da barra? Devemos tratar isto dentro do método. Agora mostrarei sua implementação:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// Método para a barra de ferramentas&lt;br /&gt;void MeuFrame::OnToolBarClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; switch (event.GetId())&lt;br /&gt; {&lt;br /&gt; case ID_TBAR_LOAD:&lt;br /&gt;   Abrir();&lt;br /&gt;   break;&lt;br /&gt;&lt;br /&gt; case ID_TBAR_SAVE:&lt;br /&gt;   Salvar();&lt;br /&gt;   break;&lt;br /&gt; &lt;br /&gt; case ID_TBAR_ABOUT:&lt;br /&gt;   Sobre();&lt;br /&gt;   break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-style: italic;"&gt;switch (event.GetId())&lt;/span&gt; vai criar um &lt;span style="font-style: italic;"&gt;switch&lt;/span&gt; com a ID do evento. Então, podemos dar diferentes tarefas para os botões dentro do &lt;span style="font-style: italic;"&gt;switch&lt;/span&gt;, como mostrado acima.&lt;br /&gt;&lt;br /&gt;Bem, este é o básico sobre &lt;span style="font-style: italic;"&gt;wxToolBar&lt;/span&gt;. Nosso editor de texto agora está assim:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_5DNwUFk6stg/RaRLKn070rI/AAAAAAAAAAM/EYFsuhlD1io/s1600-h/post11_wxtoolbar.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_5DNwUFk6stg/RaRLKn070rI/AAAAAAAAAAM/EYFsuhlD1io/s320/post11_wxtoolbar.png" alt="" id="BLOGGER_PHOTO_ID_5018218530659357362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tente modificar as imagens da barra (detalhes abaixo), ou adicionar novos botões. Lembre-se de checar as IDs na definição do evento caso você adicione ou remova botões.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Alguns tópicos sobre o uso do &lt;span style="font-style: italic;"&gt;wxBitmap&lt;/span&gt; na barra de ferramentas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não falei sobre &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wxbitmap.html#wxbitmap"&gt;wxBitmap&lt;/a&gt;&lt;/span&gt; ainda, também não vou entrar em detalhes agora, falarei apenas o suficiente para usar imagens no &lt;span style="font-style: italic;"&gt;wxToolBar&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-style: italic;"&gt;wxBitmap&lt;/span&gt; serve basicamente para tratar imagens, exibindo-as no seu programa ou em outros widgets. No caso do &lt;span style="font-style: italic;"&gt;wxToolBar&lt;/span&gt;, nós usamos o &lt;span style="font-style: italic;"&gt;wxBitmap&lt;/span&gt; para definir as imagens que serão exibidas em cada botão da barra.&lt;br /&gt;&lt;br /&gt;No nosso exemplo, eu usei um construtor bastante simples:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxBitmap(const wxString&amp; name, long type)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este construtor carrega uma imagem de um arquivo do tipo especificado. Como usei arquivos .PNG, usei o tipo &lt;span style="font-style: italic;"&gt;wxBITMAP_TYPE_PNG&lt;/span&gt;. Existem diversos outros tipos que você pode encontrar na &lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wxbitmap.html#wxbitmapctor"&gt;documentação do construtor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mas o &lt;span style="font-style:italic;"&gt;wxBitmap&lt;/span&gt; também pode tratar tipos de uma outra classe chamada &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_wximage.html#wximage"&gt;wxImage&lt;/a&gt;&lt;/span&gt;. O tipo que usei, por exemplo, não é de &lt;span style="font-style:italic;"&gt;wxBitmap&lt;/span&gt; e sim de &lt;span style="font-style:italic;"&gt;wxImage&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O tipo &lt;span style="font-style:italic;"&gt;wxBMPHandler&lt;/span&gt; está diponível por padrão no programa. Para usar outros tipos (como o &lt;span style="font-style:italic;"&gt;wxBITMAP_TYPE_PNG&lt;/span&gt; que eu usei), devemos &amp;quot;instalar&amp;quot; eles. Para isto, usamos o método &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6/wx_appinifunctions.html#wxinitallimagehandlers"&gt;wxInitAllImageHandlers()&lt;/a&gt;&lt;/span&gt;, que deve ser chamado no método &lt;span style="font-style: italic;"&gt;OnInit()&lt;/span&gt; da classe principal do nosso programa.&lt;br /&gt;&lt;br /&gt;Então, para colocar imagens nos botões da barra de ferramentas, devemos iniciar os handlers para todos os tipos suportados com &lt;span style="font-style: italic;"&gt;wxInitAllImageHandlers()&lt;/span&gt; no método &lt;span style="font-style: italic;"&gt;OnInit()&lt;/span&gt; da classe principal. Em seguida, abrir a imagem com &lt;span style="font-style: italic;"&gt;wxBitmap&lt;/span&gt; e passar o objeto como parâmetro de &lt;span style="font-style: italic;"&gt;wxToolBar::AddTool()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Futuramente irei falar melhor sobre &lt;span style="font-style:italic;"&gt;wxBitmap&lt;/span&gt; e &lt;span style="font-style:italic;"&gt;wxImage&lt;/span&gt;, mas por enquanto, deixarei apenas o suficiente para usarmos o &lt;span style="font-style:italic;"&gt;wxToolBar&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Veja o código-fonte completo do editor de textos no estado atual:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt;* Curso de wxWidgets: Um editor de textos&lt;br /&gt;*&lt;br /&gt;* O objetivo deste código-fonte é demonstrar diversas classes&lt;br /&gt;* ensinadas no curso de wxWidgets do blog "A Casa de Just".&lt;br /&gt;*&lt;br /&gt;* As aulas do curso de wxWidgets podem ser encontradas em forma&lt;br /&gt;* de posts no blog: http://jpjust.blogspot.com&lt;br /&gt;*&lt;br /&gt;* Copyright (c) João Paulo Just &lt;jpjust@justsoft.com.br&gt;&lt;br /&gt;* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt;* 9 de janeiro de 2007, 22:45, Ilhéus, BA, Brasil.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &lt;wx&gt;&lt;br /&gt;#include &lt;wx&gt;&lt;br /&gt;&lt;br /&gt;// IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_BTNLOAD,&lt;br /&gt; ID_BTNSAVE,&lt;br /&gt; ID_TBAR_LOAD,&lt;br /&gt; ID_TBAR_SAVE,&lt;br /&gt; ID_TBAR_ABOUT&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do programa&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Método principal&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do frame&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Construtor&lt;br /&gt; MeuFrame(void);&lt;br /&gt; &lt;br /&gt; // Eventos&lt;br /&gt; void OnLoadClick(wxCommandEvent &amp;event);&lt;br /&gt; void OnSaveClick(wxCommandEvent &amp;event);&lt;br /&gt; void OnToolBarClick(wxCommandEvent &amp;event);&lt;br /&gt;&lt;br /&gt; // Métodos auxiliares&lt;br /&gt; void Abrir(void);&lt;br /&gt; void Salvar(void);&lt;br /&gt; void Sobre(void);&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; // Widgets do frame&lt;br /&gt; wxButton *btn_load;&lt;br /&gt; wxButton *btn_save;&lt;br /&gt; &lt;br /&gt; wxStaticText *lb_filename;&lt;br /&gt; &lt;br /&gt; wxTextCtrl *txt_file;&lt;br /&gt; &lt;br /&gt; wxToolBar *tbar;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Inicialização do programa&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; wxInitAllImageHandlers(); // Inicia todos os hadlers de imagens do wxBitmap&lt;br /&gt;&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Tabela de eventos&lt;br /&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_BUTTON(ID_BTNLOAD, MeuFrame::OnLoadClick)&lt;br /&gt; EVT_BUTTON(ID_BTNSAVE, MeuFrame::OnSaveClick)&lt;br /&gt; EVT_TOOL_RANGE(ID_TBAR_LOAD, ID_TBAR_ABOUT, MeuFrame::OnToolBarClick)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;// Construtor do frame&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Arquivos"))&lt;br /&gt;{&lt;br /&gt; // Sizer e widgets&lt;br /&gt; wxBoxSizer *sizer_h = new wxBoxSizer(wxHORIZONTAL);&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; &lt;br /&gt; btn_load = new wxButton(this, ID_BTNLOAD, wxT("Abrir"));&lt;br /&gt; btn_save = new wxButton(this, ID_BTNSAVE, wxT("Salvar"));&lt;br /&gt; &lt;br /&gt; lb_filename = new wxStaticText(this, wxID_ANY,&lt;br /&gt;  wxT("Sem titulo.txt"));&lt;br /&gt; &lt;br /&gt; txt_file = new wxTextCtrl(this, wxID_ANY, wxEmptyString,&lt;br /&gt;  wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);&lt;br /&gt; &lt;br /&gt; // Barra de ferramentas&lt;br /&gt; tbar = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT);&lt;br /&gt; &lt;br /&gt; tbar-&gt;AddTool(ID_TBAR_LOAD, wxString(wxT("Abrir")), \&lt;br /&gt;  wxBitmap(wxT("/usr/share/pixmaps/gnome-folder.png"), wxBITMAP_TYPE_PNG));&lt;br /&gt;  &lt;br /&gt; tbar-&gt;AddTool(ID_TBAR_SAVE, wxString(wxT("Salvar")), \&lt;br /&gt;  wxBitmap(wxT("/usr/share/pixmaps/gnome-cd.png"), wxBITMAP_TYPE_PNG));&lt;br /&gt;  &lt;br /&gt; tbar-&gt;AddSeparator();&lt;br /&gt; &lt;br /&gt; tbar-&gt;AddTool(ID_TBAR_ABOUT, wxString(wxT("Sobre")), \&lt;br /&gt;  wxBitmap(wxT("/usr/share/pixmaps/gnome-info.png"), wxBITMAP_TYPE_PNG));&lt;br /&gt; &lt;br /&gt; tbar-&gt;Realize();&lt;br /&gt; &lt;br /&gt; // Posicionamento&lt;br /&gt; sizer_h-&gt;Add(btn_load, 0, wxALL, 5);&lt;br /&gt; sizer_h-&gt;Add(btn_save, 0, wxALL, 5);&lt;br /&gt; sizer_h-&gt;Add(lb_filename, 1, wxALL, 5);&lt;br /&gt; &lt;br /&gt; sizer_v-&gt;Add(sizer_h, 0, wxALL, 0);&lt;br /&gt; sizer_v-&gt;Add(txt_file, 1, wxALL | wxEXPAND, 5);&lt;br /&gt; &lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt; &lt;br /&gt; // Insere a barra de ferramentas&lt;br /&gt; SetToolBar(tbar);&lt;br /&gt; &lt;br /&gt; // Boas-vindas&lt;br /&gt; wxMessageBox(wxT("Seja bem-vindo(a) a mais um maravilhoso programa! :)"),&lt;br /&gt;  wxT("Bem-vindo(a)!"), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Abre um arquivo&lt;br /&gt;void MeuFrame::Abrir(void)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT("Selecione o arquivo"),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT("*.txt"), wxOPEN | wxFILE_MUST_EXIST);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; txt_file-&gt;LoadFile(Filename);&lt;br /&gt; &lt;br /&gt; // Atualiza o nome&lt;br /&gt; lb_filename-&gt;SetLabel(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Salva o arquivo aberto&lt;br /&gt;void MeuFrame::Salvar(void)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT("Selecione o arquivo"),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT("*.txt"), wxSAVE | wxOVERWRITE_PROMPT);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; txt_file-&gt;SaveFile(Filename);&lt;br /&gt; &lt;br /&gt; // Atualiza o nome do arquivo&lt;br /&gt; lb_filename-&gt;SetLabel(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Janela "Sobre"&lt;br /&gt;void MeuFrame::Sobre(void)&lt;br /&gt;{&lt;br /&gt; wxMessageBox(wxT("Curso de wxWidgets\n\nhttp://jpjust.blogspot.com"), wxT("Sobre"), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Botão de leitura&lt;br /&gt;void MeuFrame::OnLoadClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; Abrir();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Botão de salvamento&lt;br /&gt;void MeuFrame::OnSaveClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; Salvar();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Método para a barra de ferramentas&lt;br /&gt;void MeuFrame::OnToolBarClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; switch (event.GetId())&lt;br /&gt; {&lt;br /&gt; case ID_TBAR_LOAD:&lt;br /&gt;  Abrir();&lt;br /&gt;  break;&lt;br /&gt;  &lt;br /&gt; case ID_TBAR_SAVE:&lt;br /&gt;  Salvar();&lt;br /&gt;  break;&lt;br /&gt;  &lt;br /&gt; case ID_TBAR_ABOUT:&lt;br /&gt;  Sobre();&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;br /&gt;&lt;/wx&gt;&lt;/wx&gt;&lt;/jpjust@justsoft.com.br&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-4317950571198981817?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/4317950571198981817/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=4317950571198981817' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4317950571198981817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4317950571198981817'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/01/curso-de-wxwidgets-post-11-construindo.html' title='Curso de wxWidgets, post 11: Construindo barras de ferramentas'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_5DNwUFk6stg/RaRLKn070rI/AAAAAAAAAAM/EYFsuhlD1io/s72-c/post11_wxtoolbar.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-9220117604338538357</id><published>2007-01-07T20:04:00.000-03:00</published><updated>2007-01-07T20:10:06.571-03:00</updated><title type='text'>Feliz 2007, o blog está de volta!</title><content type='html'>Olá meus caros leitores!! FELIZ 2007 (atrasado) A TODOS!!! :)&lt;br /&gt;&lt;br /&gt;Como eu mencionei no post anterior, dei uma pausa no curso de wxWidgets devido à quantidade de provas e atividades no curso de &lt;a href="http://www.uesc.br"&gt;Ciência da Computação&lt;/a&gt;. Aproveitei e viajei no Natal e Reveillon pra descansar um pouco e agora estou de volta. A partir de terça, o curso de wxWidgets voltará e o blog entrará em ação novamente.&lt;br /&gt;&lt;br /&gt;Obrigado a todos que visitaram a minha casa em 2006 e aos que continuaram fazendo-o mesmo durante o período de recesso.&lt;br /&gt;&lt;br /&gt;Um abraço e até terça! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-9220117604338538357?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/9220117604338538357/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=9220117604338538357' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/9220117604338538357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/9220117604338538357'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2007/01/feliz-2007-o-blog-est-de-volta.html' title='Feliz 2007, o blog está de volta!'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-4852178327553962323</id><published>2006-12-13T20:05:00.000-03:00</published><updated>2006-12-13T20:06:48.839-03:00</updated><title type='text'>Curso de wxWidgets: Uma pausa</title><content type='html'>Olá, pessoal.&lt;br /&gt;&lt;br /&gt;Como perceberam, já tem um tempo que não posto nada sobre o curso de wxWidgets. Bem, vou dar uma pausa nele por enquanto, pois estou terminando trabalhos e provas de final de semestre na Universidade e estou meio sem tempo. O curso voltará na segunda semana de Janeiro, sem falta. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-4852178327553962323?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/4852178327553962323/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=4852178327553962323' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4852178327553962323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4852178327553962323'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/12/curso-de-wxwidgets-uma-pausa.html' title='Curso de wxWidgets: Uma pausa'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-4651306088055438261</id><published>2006-11-23T20:47:00.000-03:00</published><updated>2006-11-23T21:05:29.001-03:00</updated><title type='text'>Hotmail no Mozilla Thunderbird</title><content type='html'>Se você usa o &lt;a href="http://br.mozdev.org/thunderbird/"&gt;Mozilla Thunderbird&lt;/a&gt; e tem conta no &lt;a href="http://www.hotmail.com/"&gt;Hotmail&lt;/a&gt;, provavelmente já teve vontade de baixar suas mensagens pelo software cliente.&lt;br /&gt;&lt;br /&gt;Existem vários programas que intermediam a conexão entre o cliente e o Hotmail. Já usei alguns, mas não me agradaram muito. Enfim, encontrei hoje uma extensão para o Thunderbird.&lt;br /&gt;&lt;br /&gt;O nome da extensão é &lt;a href="http://webmail.mozdev.org/"&gt;WebMail&lt;/a&gt;. Basta você instalar a extensão mais o módulo do Hotmail. Essa extensão possui também módulos para outros serviços de webmails.&lt;br /&gt;&lt;br /&gt;O primeiro passo é baixar a &lt;a href="http://downloads.mozdev.org/webmail/web-mail-1-0-14.xpi"&gt;extensão do WebMail&lt;/a&gt; na &lt;a href="http://webmail.mozdev.org/installation.html"&gt;página de download&lt;/a&gt;. Em seguida, baixe o &lt;a href="http://download.mozdev.org/webmail/hotmail-1-0-13.xpi"&gt;módulo do Hotmail&lt;/a&gt; na mesma página. Após instalar as extensões, reinicie o Thunderbird.&lt;br /&gt;&lt;br /&gt;O passo seguinte, é configurar a extensão. Clique em &lt;span style="font-weight:bold;"&gt;Ferramentas&lt;/span&gt; -&amp;gt; &lt;span style="font-weight:bold;"&gt;Extensões&lt;/span&gt;. Selecione a extensão do WebMail e clique em &lt;span style="font-weight:bold;"&gt;Preferências&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Na janela de preferências, certifique-se de que &lt;span style="font-weight:bold;"&gt;POP&lt;/span&gt; e &lt;span style="font-weight:bold;"&gt;SMTP&lt;/span&gt; estão OK (bola verde e texto &lt;span style="font-style:italic;"&gt;Running&lt;/span&gt;). Caso não estejam rodando, pode ser que você não esteja com permissões para usar portas baixas. Neste caso, clique na aba &lt;span style="font-weight:bold;"&gt;Ports&lt;/span&gt; e escolha portas acima de 1024 para POP e SMTP. Se você precisar modificar as portas, reinicie o Thunderbird novamente.&lt;br /&gt;&lt;br /&gt;Por último, adicione sua conta do Hotmail. Basta adicionar a conta normalmente, como você faria com qualquer outra conta POP3. Só que no momento de especificar o servidor POP de entrada, use &lt;span style="font-weight:bold;"&gt;localhost&lt;/span&gt;. Termine o resto do assistente de nova conta normalmente.&lt;br /&gt;&lt;br /&gt;Se você mudou as portas POP e SMTP na extensão, você terá que fazer o mesmo na configuração da sua conta. Clique em &lt;span style="font-weight:bold;"&gt;Editar&lt;/span&gt; -&gt; &lt;span style="font-weight:bold;"&gt;Configuração de contas&lt;/span&gt;. Procure sua conta do Hotmail e clique na seção &lt;span style="font-weight:bold;"&gt;Configurações do servidor&lt;/span&gt;. Configure a porta para o mesmo número que você escolheu na configuração da extensão. Em seguida, vá para &lt;span style="font-weight:bold;"&gt;Servidor de saída (SMTP)&lt;/span&gt;, lá no final, e adicione o servidor SMTP &lt;span style="font-weight:bold;"&gt;localhost&lt;/span&gt; com a porta SMTP que você escolheu nas configurações da extensão.&lt;br /&gt;&lt;br /&gt;Pronto! Seu Thunderbird está pronto para baixar e-mails do Hotmail. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-4651306088055438261?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/4651306088055438261/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=4651306088055438261' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4651306088055438261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/4651306088055438261'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/11/hotmail-no-mozilla-thunderbird.html' title='Hotmail no Mozilla Thunderbird'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-1919657194387652669</id><published>2006-11-20T20:07:00.000-03:00</published><updated>2006-11-20T20:49:46.040-03:00</updated><title type='text'>Curso de wxWidgets, post 10: Mais sobre arquivos com wxTextFile</title><content type='html'>Agora será apresentada a classe &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfile"&gt;wxTextFile&lt;/a&gt;&lt;/span&gt;. Essa classe permite manipular arquivos de texto e possui alguns métodos bastante úteis. Como eu havia comentado no post 8, eu senti falta de alguns métodos interessantes em &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfile"&gt;wxFile&lt;/a&gt;&lt;/span&gt;, como por exemplo, ler uma linha inteira de um arquivo. Só depois que eu descobri a &lt;span style="font-style:italic;"&gt;wxTextFile&lt;/span&gt; :P&lt;br /&gt;&lt;br /&gt;A abertura de um arquivo para leitura se dá com o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfileopen"&gt;wxTextFile::Open()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxTextFile File;&lt;br /&gt;File.Open(&amp;quot;arquivo.txt&amp;quot;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Caso o arquivo não possa ser aberto ou não exista, &lt;span style="font-style:italic;"&gt;wxTextFile::Open()&lt;/span&gt; retornará falso.&lt;br /&gt;&lt;br /&gt;Agora, basta caminharmos pelas linhas e ler o conteúdo do arquivo. Podemos saber o número de linhas em um arquivo com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegetlinecount"&gt;wxTextFile::GetLineCount()&lt;/a&gt;&lt;/span&gt; (retornando o número de linhas) e ler cada linha com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegetline"&gt;wxTextFile::GetLine()&lt;/a&gt;&lt;/span&gt; (retornando um objeto &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxstring.html#wxstring"&gt;wxString&lt;/a&gt;&lt;/span&gt; com o conteúdo da linha lida). Veja um exemplo de leitura linha a linha:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;for (unsigned int line = 0; line &amp;lt; File.GetLineCount(); line++)&lt;br /&gt;  txt_file-&amp;gt;AppendText(File.GetLine(line) + wxT(&amp;quot;\n&amp;quot;));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O laço acima percorre cada linha do arquivo e adiciona em um objeto do tipo &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextctrl.html#wxtextctrl"&gt;wxTextCtrl&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Após ter lido todo o arquivo, podemos fechá-lo com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfileclose"&gt;wxTextFile::Close()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;File.Close();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Já no caso de gravações, temos que criar o arquivo com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilecreate"&gt;wxTextFile::Create()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxTextFile File;&lt;br /&gt;File.Create(&amp;quot;arquivo.txt&amp;quot;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Caso o arquivo não possa ser criado, &lt;span style="font-style:italic;"&gt;wxTextFile::Create()&lt;/span&gt; retornará falso.&lt;br /&gt;&lt;br /&gt;Agora, basta chamar &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfileaddline"&gt;wxTextFile::AddLine()&lt;/a&gt;&lt;/span&gt; para adicionar linhas no arquivo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;File.AddLine(wxT("Linha 1"));&lt;br /&gt;File.AddLine(wxT("Linha 2"));&lt;br /&gt;File.AddLine(wxT("Linha 3"));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por último, devemos gravar as alterações no disco e fechar o arquivo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilewrite"&gt;File.Write();&lt;/a&gt;&lt;br /&gt;File.Close();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Existem também outros métodos interessantes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegotoline"&gt;wxTextFile::GoToLine(size_t n)&lt;/a&gt;&lt;/span&gt; leva você até a linha &lt;span style="font-style:italic;"&gt;n&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegetfirstline"&gt;wxTextFile::GetFirstLine()&lt;/a&gt;, &lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegetnextline"&gt;GetNextLine()&lt;/a&gt;, &lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegetprevline"&gt;GetPrevLine()&lt;/a&gt;, &lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfilegetlastline"&gt;GetLastLine()&lt;/a&gt;&lt;/span&gt; retornam a primeira linha, a próxima, a anterior e a última respectivamente.&lt;br /&gt;&lt;br /&gt;Você também pode inserir uma linha em um local específico com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfileinsertline"&gt;wxTextFile::InsertLine()&lt;/a&gt;&lt;/span&gt; e pode remover qualquer linha com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxtextfile.html#wxtextfileremoveline"&gt;wxTextFile::RemoveLine()&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O exemplo de editor de textos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Modifiquei o programa do post 9 para usar &lt;span style="font-style:italic;"&gt;wxTextFile&lt;/span&gt; no lugar de &lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt;. Vejam o programa alterado abaixo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * Curso de wxWidgets: Exemplo de um editor de textos usando wxTextFile&lt;br /&gt; *&lt;br /&gt; * O objetivo deste código é demonstrar o uso da classe wxTextFile&lt;br /&gt; * para efetuar leitura e escrita em um arquivo de texto, além&lt;br /&gt; * de mostrar o uso básico das classes wxApp, wxFrame, wxStaticText,&lt;br /&gt; * wxButton, wxTextCtrl e wxBoxSizer, assim como o tratamento de&lt;br /&gt; * eventos e as funções wxFileSelector() e wxMessageBox()&lt;br /&gt; * (tópicos abordados do post 2 ao post 8 do curso).&lt;br /&gt; *&lt;br /&gt; * wxTextCtrl possui dois métodos para carregar e salvar um arquivo&lt;br /&gt; * (wxTextCtrl::LoadFile() e wxTextCtrl::SaveFile()), porém, wxTextFile&lt;br /&gt; * é utilizado para demonstrar seu uso. No trecho onde a leitura e&lt;br /&gt; * escrita são feitas, existem comentários explicando como utilizar&lt;br /&gt; * estes métodos.&lt;br /&gt; *&lt;br /&gt; * Copyright (c) João Paulo Just &amp;lt;jpjust@justsoft.com.br&amp;gt;&lt;br /&gt; * A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt; * 20 de novembro de 2006, 20:25, Ilhéus, BA, Brasil.&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;wx/wx.h&amp;gt;&lt;br /&gt;#include &amp;lt;wx/textfile.h&amp;gt;&lt;br /&gt;&lt;br /&gt;// IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_BTNLOAD,&lt;br /&gt; ID_BTNSAVE&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do programa&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Método principal&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do frame&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Construtor&lt;br /&gt; MeuFrame(void);&lt;br /&gt; &lt;br /&gt; // Eventos&lt;br /&gt; void OnLoadClick(wxCommandEvent &amp;event);&lt;br /&gt; void OnSaveClick(wxCommandEvent &amp;event);&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; // Widgets do frame&lt;br /&gt; wxButton *btn_load;&lt;br /&gt; wxButton *btn_save;&lt;br /&gt; &lt;br /&gt; wxStaticText *lb_filename;&lt;br /&gt; &lt;br /&gt; wxTextCtrl *txt_file;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Inicialização do programa&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&amp;gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Tabela de eventos&lt;br /&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_BUTTON(ID_BTNLOAD, MeuFrame::OnLoadClick)&lt;br /&gt; EVT_BUTTON(ID_BTNSAVE, MeuFrame::OnSaveClick)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;// Construtor do frame&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT(&amp;quot;Arquivos&amp;quot;))&lt;br /&gt;{&lt;br /&gt; // Sizer e widgets&lt;br /&gt; wxBoxSizer *sizer_h = new wxBoxSizer(wxHORIZONTAL);&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; &lt;br /&gt; btn_load = new wxButton(this, ID_BTNLOAD, wxT(&amp;quot;Abrir&amp;quot;));&lt;br /&gt; btn_save = new wxButton(this, ID_BTNSAVE, wxT(&amp;quot;Salvar&amp;quot;));&lt;br /&gt; &lt;br /&gt; lb_filename = new wxStaticText(this, wxID_ANY,&lt;br /&gt;  wxT(&amp;quot;Sem titulo.txt&amp;quot;));&lt;br /&gt; &lt;br /&gt; txt_file = new wxTextCtrl(this, wxID_ANY, wxEmptyString,&lt;br /&gt;  wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);&lt;br /&gt; &lt;br /&gt; // Posicionamento&lt;br /&gt; sizer_h-&amp;gt;Add(btn_load, 0, wxALL, 5);&lt;br /&gt; sizer_h-&amp;gt;Add(btn_save, 0, wxALL, 5);&lt;br /&gt; sizer_h-&amp;gt;Add(lb_filename, 1, wxALL, 5);&lt;br /&gt; &lt;br /&gt; sizer_v-&amp;gt;Add(sizer_h, 0, wxALL, 0);&lt;br /&gt; sizer_v-&amp;gt;Add(txt_file, 1, wxALL | wxEXPAND, 5);&lt;br /&gt; &lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt; &lt;br /&gt; // Boas-vindas&lt;br /&gt; wxMessageBox(wxT(&amp;quot;Seja bem-vindo(a) a mais um maravilhoso programa! :)&amp;quot;),&lt;br /&gt;  wxT(&amp;quot;Bem-vindo(a)!&amp;quot;), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Botão de leitura&lt;br /&gt;void MeuFrame::OnLoadClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT(&amp;quot;Selecione o arquivo&amp;quot;),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT(&amp;quot;*.txt&amp;quot;), wxOPEN | wxFILE_MUST_EXIST);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Tenta abrir o arquivo com wxTextFile&lt;br /&gt; wxTextFile File;&lt;br /&gt; if (File.Open(Filename) == false)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Lê o conteúdo do arquivo linha a linha&lt;br /&gt; for (unsigned int line = 0; line &amp;lt; File.GetLineCount(); line++)&lt;br /&gt;  txt_file-&amp;gt;AppendText(File.GetLine(line) + wxT(&amp;quot;\n&amp;quot;));&lt;br /&gt; &lt;br /&gt; // Não é preciso todo este código para ler um arquivo&lt;br /&gt; // e exibí-lo em um wxTextCtrl. O trecho acima foi&lt;br /&gt; // escrito apenas para que você entenda a classe wxTextFile.&lt;br /&gt; // wxTextCtrl possui um método próprio para ler o&lt;br /&gt; // conteúdo de um arquivo. Tente comentar o trecho acima&lt;br /&gt; // e usar o método abaixo para fazer a leitura:&lt;br /&gt; &lt;br /&gt; //txt_file-&amp;gt;LoadFile(Filename);&lt;br /&gt; &lt;br /&gt; // Fecha o arquivo&lt;br /&gt; File.Close();&lt;br /&gt; &lt;br /&gt; // Atualiza o nome&lt;br /&gt; lb_filename-&amp;gt;SetLabel(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Botão de salvamento&lt;br /&gt;void MeuFrame::OnSaveClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT(&amp;quot;Selecione o arquivo&amp;quot;),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT(&amp;quot;*.txt&amp;quot;), wxSAVE | wxOVERWRITE_PROMPT);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Tenta criar o arquivo com wxTextFile&lt;br /&gt; wxTextFile File;&lt;br /&gt; if (File.Create(Filename) == false)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Limpa o arquivo, caso exista conteúdo nele&lt;br /&gt; File.Clear();&lt;br /&gt; &lt;br /&gt; // Percorre a caixa de texto gravando o conteúdo&lt;br /&gt; // no arquivo aberto, linha a linha&lt;br /&gt; for (unsigned int line = 0; line &amp;lt; txt_file-&amp;gt;GetNumberOfLines(); line++)&lt;br /&gt;  File.AddLine(txt_file-&amp;gt;GetLineText(line));&lt;br /&gt; &lt;br /&gt; // Neste ponto, eu também poderia usar um método&lt;br /&gt; // de wxTextCtrl para salvar o arquivo. Tente&lt;br /&gt; // comentar o trecho de gravação acima e descomente&lt;br /&gt; // a linha abaixo para testar:&lt;br /&gt; &lt;br /&gt; //txt_file-&amp;gt;SaveFile(Filename);&lt;br /&gt; &lt;br /&gt; // Salva o arquivo em disco e fecha&lt;br /&gt; File.Write();&lt;br /&gt; File.Close();&lt;br /&gt; &lt;br /&gt; // Atualiza o nome do arquivo&lt;br /&gt; lb_filename-&amp;gt;SetLabel(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-1919657194387652669?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/1919657194387652669/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=1919657194387652669' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1919657194387652669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/1919657194387652669'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/11/curso-de-wxwidgets-post-10-mais-sobre.html' title='Curso de wxWidgets, post 10: Mais sobre arquivos com wxTextFile'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-116329846391488527</id><published>2006-11-11T23:19:00.000-03:00</published><updated>2006-11-13T19:30:57.180-03:00</updated><title type='text'>Curso de wxWidgets, post 9: Um exemplo de um editor de textos</title><content type='html'>Resolvi fazer um exemplo de um editor de textos, usando a maioria das classes estudadas até agora. Além de mostrá-las em ação, vou pagar a semana que fiquei sem postar no mês passado :P. O código completo do exemplo está abaixo. Compile e veja o programa funcionando. Não deixe de ler os comentários, existem algumas informações importantes neles.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt;* Curso de wxWidgets: Exemplo de um editor de textos usando wxFile&lt;br /&gt;*&lt;br /&gt;* O objetivo deste código é demonstrar o uso da classe wxFile&lt;br /&gt;* para efetuar leitura e escrita em um arquivo de texto, além&lt;br /&gt;* de mostrar o uso básico das classes wxApp, wxFrame, wxStaticText,&lt;br /&gt;* wxButton, wxTextCtrl e wxBoxSizer, assim como o tratamento de&lt;br /&gt;* eventos e as funções wxFileSelector() e wxMessageBox()&lt;br /&gt;* (tópicos abordados do post 2 ao post 8 do curso).&lt;br /&gt;*&lt;br /&gt;* wxTextCtrl possui dois métodos para carregar e salvar um arquivo&lt;br /&gt;* (wxTextCtrl::LoadFile() e wxTextCtrl::SaveFile()), porém, wxFile&lt;br /&gt;* é utilizado para demonstrar seu uso. No trecho onde a leitura e&lt;br /&gt;* escrita são feitas, existem comentários explicando como utilizar&lt;br /&gt;* estes métodos.&lt;br /&gt;*&lt;br /&gt;* Copyright (c) João Paulo Just &lt;jpjust@justsoft.com.br&gt;&lt;br /&gt;* A Casa de Just - http://jpjust.blogspot.com&lt;br /&gt;* 8 de novembro de 2006, 21:03, Ilhéus, BA, Brasil.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &amp;lt;wx/wx.h&amp;gt;&lt;br /&gt;#include &amp;lt;wx/file.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define BUF_SIZE 128 // Tamanho do buffer de leitura/escrita&lt;br /&gt;&lt;br /&gt;// IDs&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_BTNLOAD,&lt;br /&gt; ID_BTNSAVE&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do programa&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Método principal&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Classe do frame&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; // Construtor&lt;br /&gt; MeuFrame(void);&lt;br /&gt; &lt;br /&gt; // Eventos&lt;br /&gt; void OnLoadClick(wxCommandEvent &amp;event);&lt;br /&gt; void OnSaveClick(wxCommandEvent &amp;event);&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; // Widgets do frame&lt;br /&gt; wxButton *btn_load;&lt;br /&gt; wxButton *btn_save;&lt;br /&gt; &lt;br /&gt; wxStaticText *lb_filename;&lt;br /&gt; &lt;br /&gt; wxTextCtrl *txt_file;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Inicialização do programa&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Tabela de eventos&lt;br /&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_BUTTON(ID_BTNLOAD, MeuFrame::OnLoadClick)&lt;br /&gt; EVT_BUTTON(ID_BTNSAVE, MeuFrame::OnSaveClick)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;// Construtor do frame&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Arquivos"))&lt;br /&gt;{&lt;br /&gt; // Sizer e widgets&lt;br /&gt; wxBoxSizer *sizer_h = new wxBoxSizer(wxHORIZONTAL);&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; &lt;br /&gt; btn_load = new wxButton(this, ID_BTNLOAD, wxT("Abrir"));&lt;br /&gt; btn_save = new wxButton(this, ID_BTNSAVE, wxT("Salvar"));&lt;br /&gt; &lt;br /&gt; lb_filename = new wxStaticText(this, wxID_ANY,&lt;br /&gt;  wxT("Sem titulo.txt"));&lt;br /&gt; &lt;br /&gt; txt_file = new wxTextCtrl(this, wxID_ANY, wxEmptyString,&lt;br /&gt;  wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);&lt;br /&gt; &lt;br /&gt; // Posicionamento&lt;br /&gt; sizer_h-&gt;Add(btn_load, 0, wxALL, 5);&lt;br /&gt; sizer_h-&gt;Add(btn_save, 0, wxALL, 5);&lt;br /&gt; sizer_h-&gt;Add(lb_filename, 1, wxALL, 5);&lt;br /&gt; &lt;br /&gt; sizer_v-&gt;Add(sizer_h, 0, wxALL, 0);&lt;br /&gt; sizer_v-&gt;Add(txt_file, 1, wxALL | wxEXPAND, 5);&lt;br /&gt; &lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt; &lt;br /&gt; // Boas-vindas&lt;br /&gt; wxMessageBox(wxT("Seja bem-vindo(a) a mais um maravilhoso programa! :)"),&lt;br /&gt;  wxT("Bem-vindo(a)!"), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Botão de leitura&lt;br /&gt;void MeuFrame::OnLoadClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT("Selecione o arquivo"),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT("*.txt"), wxOPEN | wxFILE_MUST_EXIST);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Abre o arquivo para leitura com wxFile&lt;br /&gt; wxFile File(Filename, wxFile::read);&lt;br /&gt; &lt;br /&gt; // Verifica se o arquivo foi aberto&lt;br /&gt; if (!File.IsOpened())&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Lê o conteúdo do arquivo em partes&lt;br /&gt; // do tamanho de BUF_SIZE&lt;br /&gt; char buffer[BUF_SIZE] = {0};&lt;br /&gt; txt_file-&gt;Clear();&lt;br /&gt; &lt;br /&gt; while (!File.Eof())&lt;br /&gt; {&lt;br /&gt;  // Lê BUF_SIZE - 1 bytes (deixa um espaço&lt;br /&gt;  // para o \0 do final da string&lt;br /&gt;  if (File.Read(buffer, BUF_SIZE - 1) &gt; 0)&lt;br /&gt;  {&lt;br /&gt;   // Converte o conteúdo de buffer, que&lt;br /&gt;   // deve estar em UTF8 (ANSI) para o formato&lt;br /&gt;   // da sua compilação do wxWidgets&lt;br /&gt;   wxString Buf(buffer, wxConvUTF7);&lt;br /&gt;   txt_file-&gt;AppendText(Buf);&lt;br /&gt;   memset(buffer, 0, BUF_SIZE);&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   wxMessageBox(wxT("Erro de leitura!"),&lt;br /&gt;    wxT("Erro"), wxICON_ERROR);&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // Não é preciso todo este código para ler um arquivo&lt;br /&gt; // e exibí-lo em um wxTextCtrl. O trecho acima foi&lt;br /&gt; // escrito apenas para que você entenda a classe wxFile.&lt;br /&gt; // wxTextCtrl possui um método próprio para ler o&lt;br /&gt; // conteúdo de um arquivo. Tente comentar o trecho acima&lt;br /&gt; // e usar o método abaixo para fazer a leitura:&lt;br /&gt; &lt;br /&gt; //txt_file-&gt;LoadFile(Filename);&lt;br /&gt; &lt;br /&gt; // Fecha o arquivo&lt;br /&gt; File.Close();&lt;br /&gt; &lt;br /&gt; // Atualiza o nome&lt;br /&gt; lb_filename-&gt;SetLabel(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Botão de salvamento&lt;br /&gt;void MeuFrame::OnSaveClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; wxString Filename;&lt;br /&gt; &lt;br /&gt; // Abre diálogo de arquivo&lt;br /&gt; Filename = wxFileSelector(wxT("Selecione o arquivo"),&lt;br /&gt;  wxEmptyString, wxEmptyString, wxEmptyString,&lt;br /&gt;  wxT("*.txt"), wxSAVE | wxOVERWRITE_PROMPT);&lt;br /&gt; &lt;br /&gt; // Se arquivo inválido, sai do método&lt;br /&gt; if (Filename == wxEmptyString)&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Abre o arquivo para escrita com wxFile&lt;br /&gt; wxFile File(Filename, wxFile::write);&lt;br /&gt; &lt;br /&gt; // Verifica se o arquivo foi aberto&lt;br /&gt; if (!File.IsOpened())&lt;br /&gt;  return;&lt;br /&gt; &lt;br /&gt; // Percorre a caixa de texto gravando o conteúdo&lt;br /&gt; // no arquivo aberto&lt;br /&gt; for (unsigned int line = 0; line &lt;&gt;GetNumberOfLines(); line++)&lt;br /&gt; {&lt;br /&gt;  wxString Buf = txt_file-&gt;GetLineText(line);&lt;br /&gt;  if (File.Write(Buf + wxT("\n"), wxConvUTF7) &lt; 0)&lt;br /&gt;  {&lt;br /&gt;   wxMessageBox(wxT("Erro de gravação!"),&lt;br /&gt;    wxT("Erro"), wxICON_ERROR);&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // Neste ponto, eu também poderia usar um método&lt;br /&gt; // de wxTextCtrl para salvar o arquivo. Tente&lt;br /&gt; // comentar o trecho de leitura acima e descomente&lt;br /&gt; // a linha abaixo para testar:&lt;br /&gt; &lt;br /&gt; //txt_file-&gt;SaveFile(Filename);&lt;br /&gt; &lt;br /&gt; // Fecha o arquivo&lt;br /&gt; File.Close();&lt;br /&gt; &lt;br /&gt; // Atualiza o nome do arquivo&lt;br /&gt; lb_filename-&gt;SetLabel(Filename);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Screenshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post9_exemplo1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2318/3342/320/post9_exemplo1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-116329846391488527?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/116329846391488527/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=116329846391488527' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116329846391488527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116329846391488527'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/11/curso-de-wxwidgets-post-9-um-exemplo.html' title='Curso de wxWidgets, post 9: Um exemplo de um editor de textos'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-116292155559340015</id><published>2006-11-07T14:10:00.000-03:00</published><updated>2006-11-13T19:30:57.056-03:00</updated><title type='text'>Curso de wxWidgets, post 8: Manipulando arquivos</title><content type='html'>Manipular arquivos em C não é complicado, mas de qualquer forma, irei apresenter uma classe do wxWidgets que o ajuda nesta tarefa, a &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfile"&gt;wxFile&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt; é simples de usar. Seu construtor:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxFile(const char* filename, wxFile::OpenMode mode = wxFile::read)&lt;br /&gt;&lt;br /&gt;filename: O caminho do arquivo a ser aberto.&lt;br /&gt;&lt;br /&gt;mode: Modo de acesso. Pode ser &lt;span style="font-style:italic;"&gt;wxFile::read&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;wxFile::write&lt;/span&gt; ou &lt;span style="font-style:italic;"&gt;wxFile::read_write&lt;/span&gt;.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para abrir um arquivo para leitura, basta especificar o caminho do arquivo e usar o modo &lt;span style="font-style:italic;"&gt;wxFile::read&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxFile arquivo(&amp;quot;c:\\arquivo.txt&amp;quot;, wxFile::read);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Leitura e escrita? Use &lt;span style="font-style:italic;"&gt;wxFile::read_write&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxFile arquivo(&amp;quot;c:\arquivo.txt&amp;quot;, wxFile::read_write);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Após aberto, já podemos manipular o arquivo. A leitura é feita com o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfileread"&gt;wxFile::Read()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;char linha[256];&lt;br /&gt;int lido, max = 255;&lt;br /&gt;&lt;br /&gt;wxFile arquivo(&amp;quot;c:\\arquivo.txt&amp;quot;, wxFile::read);&lt;br /&gt;lido = arquivo.Read(linha, max);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;lido&lt;/span&gt; irá conter a quantidade de bytes lidos pelo método. &lt;span style="font-style:italic;"&gt;linha&lt;/span&gt; irá guardar o conteúdo lido e &lt;span style="font-style:italic;"&gt;max&lt;/span&gt; indica o máximo de bytes a ser lido (neste caso, usado para delimitar a quantidade de dados que será guardado em &lt;span style="font-style:italic;"&gt;linha&lt;/span&gt;). No caso de leitura de arquivos de texto, a quantidade de bytes a serem lidos deve ser o tamanho do buffer menos 1, para deixar espaço para o &lt;span style="font-style:italic;"&gt;\0&lt;/span&gt; de final de string em C.&lt;br /&gt;&lt;br /&gt;Para gravar, simplesmente use o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfilewrites"&gt;wxFile::Write()&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString Linha = wxT("Nova linha de texto!");&lt;br /&gt;bool gravado;&lt;br /&gt;&lt;br /&gt;wxFile arquivo(&amp;quot;c:\\arquivo.txt&amp;quot;, wxFile::read);&lt;br /&gt;gravado = arquivo.Write(Linha);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este método usa como argumento um &lt;span style="font-style:italic;"&gt;wxString&lt;/span&gt;. Existe um segundo argumento, usado para fazer conversão do tipo da string. A conversão é utilizada caso você esteja usando wxWidgets em uma compilação (UNICODE, por exemplo) e deseja gravar o arquivo em outro formato (no caso, ANSI).&lt;br /&gt;&lt;br /&gt;Se você prefere gravar no formato cru, como no C puro, existe também o método &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfilewrite"&gt;wxFile::Write(const void* buffer, wxFileOffset count)&lt;/a&gt;&lt;/span&gt; que funciona de forma semelhante ao &lt;span style="font-style:italic;"&gt;wxFile::Read()&lt;/span&gt;. Ele recebe como argumento uma variável qualquer com algum conteúdo e um valor indicando a quantidade de bytes a serem gravados.&lt;br /&gt;&lt;br /&gt;É preciso saber que essas operações serão feitas no início do arquivo. Ou seja, se você pede para ler 10 bytes, a classe &lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt; irá ler os primeiros 10 bytes do arquivo. Se logo em seguida você solicitar uma escrita, seu buffer será gravado a partir do 11º byte. Para fazer leituras e escritas em outras partes do arquivo, use &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfileseek"&gt;wxFile::Seek()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart)&lt;br /&gt;&lt;br /&gt;ofs: Offset a percorrer.&lt;br /&gt;&lt;br /&gt;mode: Origem da busca. Pode ser &lt;span style="font-style:italic;"&gt;wxFromStart&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;wxFromEnd&lt;/span&gt; ou &lt;span style="font-style:italic;"&gt;wxFromCurrent&lt;/span&gt;.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se você quiser fazer uma leitura a partir do 20º byte, por exemplo, basta usar o método &lt;span style="font-style:italic;"&gt;wxFile::Seek()&lt;/span&gt; antes do &lt;span style="font-style:italic;"&gt;wxFile::Read()&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;arquivo.Seek(20, wxFromStart);&lt;br /&gt;arquivo.Read(buffer, 100);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O exemplo acima lê 100 bytes a partir do 20°, guardando o conteúdo em &lt;span style="font-style:italic;"&gt;buffer&lt;/span&gt;. O mesmo vale para escritas, basta usar &lt;span style="font-style:italic;"&gt;wxFile::Seek()&lt;/span&gt; antes de &lt;span style="font-style:italic;"&gt;wxFile::Write()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Caso queira gravar no final do arquivo, use &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfileseekend"&gt;wxFile::SeekEnd()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;arquivo.SeekEnd();&lt;br /&gt;arquivo.Write(Linha);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Após ter feito todas as leituras e escritas desejadas, feche o arquivo com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfileclose"&gt;wxFile::Close()&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Outros métodos interessantes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Além de leitura e escrita, podemos fazer outras coisas com &lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt;. Por exemplo, obter o tamanho do arquivo aberto com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfilelength"&gt;wxFile::Length()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;int tamanho = arquivo.Length();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ou até verificar se o arquivo existe com &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_wxfile.html#wxfileexists"&gt;wxFile::Exists()&lt;/a&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bool existe = wxFile::Exists(&amp;quot;c:\\arquivo.txt&amp;quot;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Finalizando&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na minha opinião pessoal, não há uma vantagem grandiosa em usar &lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt;. Quero dizer, usar &lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt; não nos dá tanta vantagem para tratar arquivos quanto &lt;span style="font-style:italic;"&gt;wxString&lt;/span&gt; nos dá para tratar strings. Eu senti falta de um método que lesse &lt;span style="font-style:italic;"&gt;n&lt;/span&gt; bytes, gravando-os em um &lt;span style="font-style:italic;"&gt;wxString&lt;/span&gt; ou algum método que pudesse ler toda uma linha de uma vez.&lt;br /&gt;&lt;br /&gt;Olhei o manual da próxima versão (2.7.2, futuramente 2.8.0) e não vi nada deste tipo em &lt;span style="font-style:italic;"&gt;wxFile&lt;/span&gt;. Acabei ficando com vontade de implementar isso. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-116292155559340015?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/116292155559340015/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=116292155559340015' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116292155559340015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116292155559340015'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/11/curso-de-wxwidgets-post-8-manipulando.html' title='Curso de wxWidgets, post 8: Manipulando arquivos'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-116131310242870024</id><published>2006-10-30T22:17:00.000-03:00</published><updated>2006-11-13T19:30:56.840-03:00</updated><title type='text'>Curso de wxWidgets, post 7: Interagindo com o usuário</title><content type='html'>Já sabemos criar janelas no wxWidgets, podemos interagir com o usuário através delas, mas existem outras formas de fazer isso, sem precisarmos criar janelas cheias de widgets.&lt;br /&gt;&lt;br /&gt;Nesse post vamos conhecer &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#wxmessagebox"&gt;wxMessageBox()&lt;/a&gt;&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#wxgettextfromuser"&gt;wxGetTextFromUser()&lt;/a&gt;&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#wxgetpasswordfromuser"&gt;wxGetPasswordFromUser()&lt;/a&gt;&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#wxgetcolourfromuser"&gt;wxGetColourFromUser()&lt;/a&gt;&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#wxgetfontfromuser"&gt;wxGetFontFromUser()&lt;/a&gt;&lt;/span&gt; e &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#wxfileselector"&gt;wxFileSelector()&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;wxMessageBox()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jà vimos o &lt;span style="font-style: italic;"&gt;wxMessageBox()&lt;/span&gt; em posts anteriores, com ele podemos mostrar janelas pop-up para o usuário, emitindo avisos e até mesmo fazendo perguntas:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;int wxMessageBox(const wxString&amp; message, const wxString&amp;amp; caption = "Message",&lt;br /&gt;  int style = wxOK, wxWindow *parent = NULL, int x = -1, int y = -1)&lt;br /&gt;&lt;br /&gt;message: A mensagem a ser exibida.&lt;br /&gt;&lt;br /&gt;caption: O título da janela.&lt;br /&gt;&lt;br /&gt;style: Estilo. Pode ser wxYES_NO, wxCANCEL, wxOK, wxICON_EXCLAMATION, wxICON_HAND,&lt;br /&gt;  wxICON_ERROR, wxICON_QUESTION e wxICON_INFORMATION.&lt;br /&gt;&lt;br /&gt;parent: A janela mãe do pop-up.&lt;br /&gt;&lt;br /&gt;x, y: Coordenadas da janela pop-up.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Apenas o parâmetro &lt;span style="font-style: italic;"&gt;message&lt;/span&gt; é obrigatório. Os mais importantes são &lt;span style="font-style: italic;"&gt;message&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;caption&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;style&lt;/span&gt;. Os estilos indicam qual a configuração da janela pop-up, como os botões que ela vai ter e o ícone. Tente combinar os estilos e criar algumas janelas.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxMessageBox(wxT("Está gostando do curso?"), wxT("A casa de Just"),&lt;br /&gt;  wxICON_QUESTION | wxYES_NO);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post7_wxmessagebox.1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2318/3342/320/post7_wxmessagebox.1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;wxGetTextFromUser()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;wxGetPasswordFromUser()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma boa ajuda para obter textos do usuário, como um &lt;span style="font-style: italic;"&gt;scanf()&lt;/span&gt; no C, mas em janela :)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString wxGetTextFromUser(const wxString&amp; message, const wxString&amp;amp;&lt;br /&gt;  caption = "Input text", const wxString&amp; default_value = "",&lt;br /&gt;  wxWindow *parent = NULL, int x = wxDefaultCoord, int y = wxDefaultCoord,&lt;br /&gt;  bool centre = true)&lt;br /&gt;&lt;br /&gt;wxString wxGetPasswordFromUser(const wxString&amp;amp; message,&lt;br /&gt;  const wxString&amp; caption = "Input text", const wxString&amp;amp; default_value = "",&lt;br /&gt;  wxWindow *parent = NULL, int x = wxDefaultCoord, int y = wxDefaultCoord,&lt;br /&gt;  bool centre = true)&lt;br /&gt;&lt;br /&gt;message: Mensagem a ser exibida.&lt;br /&gt;&lt;br /&gt;caption: Título da janela.&lt;br /&gt;&lt;br /&gt;default_value: Valor padrão.&lt;br /&gt;&lt;br /&gt;parent: A janela mãe do pop-up.&lt;br /&gt;&lt;br /&gt;x, y: Coordenadas da janela.&lt;br /&gt;&lt;br /&gt;centre: Centraliza a mensagem.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como no &lt;span style="font-style: italic;"&gt;wxMessageBox()&lt;/span&gt;, apenas &lt;span style="font-style: italic;"&gt;message&lt;/span&gt; é obrigatório. Essa função retorna um objeto do tipo &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt; com o texto que o usuário digitou. Em &lt;span style="font-style: italic;"&gt;wxGetPasswordFromUser()&lt;/span&gt;, o texto que o usuário digita fica mascarado com asteriscos, é utilizado para obter senhas.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString nome = wxGetTextFromUser(wxT("Qual seu nome?"));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post7_wxgettextfromuser.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post7_wxgettextfromuser.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString senha = wxGetPasswordFromUser(wxT("Digite sua senha:"));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post7_wxgetpasswordfromuser.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post7_wxgetpasswordfromuser.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;wxGetColourFromUser()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quer solicitar alguma cor ao usuário? O wxWidgets pode ajudar com uma janela pronta para escolha de cores.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxColour wxGetColourFromUser(wxWindow *parent, const wxColour&amp; colInit)&lt;br /&gt;&lt;br /&gt;parent: A janela mãe do pop-up.&lt;br /&gt;&lt;br /&gt;colInit: Uma cor pré-selecionada para o pop-up.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Todos os parâmetros são opcionais. A função retorna um objeto do tipo &lt;span style="font-style: italic;"&gt;wxColour&lt;/span&gt; com a cor que o usuário escolheu.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxColour cor = wxGetColourFromUser();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post7_wxgetcolourfromuser.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post7_wxgetcolourfromuser.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;wxGetFontFromUser()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Também é possível solicitar uma fonte ao usuário. Da mesma forma que com wxGetColourFromUser(), uma simples função pode fazer isso.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxFont wxGetFontFromUser(wxWindow *parent, const wxFont&amp; fontInit)&lt;br /&gt;&lt;br /&gt;parent: A janela mãe do pop-up.&lt;br /&gt;&lt;br /&gt;fontInit: Uma fonte pré-selecionada para o pop-up.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Novamente, todos os parâmetros são opcionais. A função retorna um objeto do tipo &lt;span style="font-style:italic;"&gt;wxFont&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxFont fonte = wxGetFontFromUser();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post7_wxgetfontfromuser.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2318/3342/320/post7_wxgetfontfromuser.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;wxFileSelector()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos agora selecionar arquivos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString wxFileSelector(const wxString&amp; message, const wxString&amp; default_path = "",&lt;br /&gt;  const wxString&amp; default_filename = "", const wxString&amp; default_extension = "",&lt;br /&gt;  const wxString&amp; wildcard = "*.*", int flags = 0, wxWindow *parent = NULL,&lt;br /&gt;  int x = -1, int y = -1)&lt;br /&gt;&lt;br /&gt;message: Mensagem a ser exibida.&lt;br /&gt;&lt;br /&gt;default_path: Diretório inicial.&lt;br /&gt;&lt;br /&gt;default_filename: Nome de arquivo inicial.&lt;br /&gt;&lt;br /&gt;default_extension: Extensão para o arquivo que será selecionado.&lt;br /&gt;&lt;br /&gt;wildcard: Curinga para exibição dos arquivos. Exemplo: "Bitmaps|*.bmp|Todos os arquivos|*.*".&lt;br /&gt;  Este exemplo faz um menu dropdown com as duas opções.&lt;br /&gt;&lt;br /&gt;flags: Estilo da janela. Pode ser wxOPEN, wxSAVE, wxOVERWRITE_PROMPT, wxFILE_MUST_EXIST,&lt;br /&gt;  wxMULTIPLE ou 0. A janela pode abrir, salvar, perguntar caso sobrescreva, etc.&lt;br /&gt;&lt;br /&gt;parent: A janela mãe do pop-up.&lt;br /&gt;&lt;br /&gt;x, y: Coordenadas do pop-up.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Apenas &lt;span style="font-style:italic;"&gt;message&lt;/span&gt; é obrigatório. A função retorna um objeto do tipo &lt;span style="font-style:italic;"&gt;wxString&lt;/span&gt; com o caminho completo do arquivo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString arquivo = wxFileSelector(wxT("Selecione o arquivo"));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post7_wxfileselector.9.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/2318/3342/320/post7_wxfileselector.9.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Finalizando&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existem também outras funções para interação com o usuário, você pode vê-las na página &lt;span style="font-style:italic;"&gt;&amp;quot;&lt;a href="http://www.wxwidgets.org/manuals/2.6.3/wx_dialogfunctions.html#dialogfunctions"&gt;Dialog functions&lt;/a&gt;&amp;quot;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Como foi mostrado, não é necessário ficar fazendo janelas para coisas comuns como solicitar um arquivo ou uma cor. Explore as outras funções para descobrir coisas novas. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-116131310242870024?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/116131310242870024/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=116131310242870024' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116131310242870024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116131310242870024'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/10/curso-de-wxwidgets-post-7-interagindo.html' title='Curso de wxWidgets, post 7: Interagindo com o usuário'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-116190411255715393</id><published>2006-10-26T20:04:00.000-03:00</published><updated>2006-11-13T19:30:56.947-03:00</updated><title type='text'>Blog atrasado</title><content type='html'>Olá, pessoal.&lt;br /&gt;&lt;br /&gt;Como já puderam perceber, o blog e o curso de wxWidgets andam atrasados. O fato é que nessas duas últimas semanas eu não tive tempo para elaborar o próximo post do curso. Estou fazendo provas na &lt;a href="http://www.uesc.br"&gt;UESC&lt;/a&gt; e também estou usando meu tempo para resolver outros problemas adversos.&lt;br /&gt;&lt;br /&gt;Mas na próxima semana, o curso de wxWidgets voltará normalmente. O próximo post é sobre interação com usuário. Se alguém tiver uma sugestão, é só deixar um comentário. :)&lt;br /&gt;&lt;br /&gt;Desculpem-me a falta de posts. &lt;span style="font-weight: bold;"&gt;A Casa de Just&lt;/span&gt; não morreu!!! :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-116190411255715393?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/116190411255715393/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=116190411255715393' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116190411255715393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116190411255715393'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/10/blog-atrasado.html' title='Blog atrasado'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-116060968525151518</id><published>2006-10-11T19:54:00.000-03:00</published><updated>2006-11-13T19:30:56.704-03:00</updated><title type='text'>Curso de wxWidgets, post 6: Strings com wxString</title><content type='html'>Até aqui, você já tem condições de criar um aplicativo simples em wxWidgets, com uma interface gráfica razoável e alguns eventos. Agora, gostaria de falar sobre o tratamento de strings no wxWidgets.&lt;br /&gt;&lt;br /&gt;Quando alguém aprende a programar em C (não C++), sente um pouco de dificuldade com o tratamento de strings no início. Como nós sabemos, as strings em C são na verdade vetores de &lt;span style="font-style: italic;"&gt;char&lt;/span&gt; terminados com &lt;span style="font-style: italic;"&gt;\0&lt;/span&gt;. A manipulação dessas strings se dá através de funções da biblioteca &lt;span style="font-style: italic;"&gt;string.h&lt;/span&gt;: &lt;span style="font-style: italic;"&gt;strcmp(), strcat(), strtok(), strstr()...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Já com C++, surge uma classe chamada &lt;span style="font-style: italic;"&gt;string&lt;/span&gt;, da biblioteca &lt;span style="font-style: italic;"&gt;string&lt;/span&gt;, com o objetivo de facilitar a manipulação das strings em C++ (quanta string! :P). Essa classe possui alguns métodos interessantes como &lt;span style="font-style: italic;"&gt;string::append(), &lt;/span&gt;&lt;span style="font-style: italic;"&gt;string::assign(), &lt;/span&gt;&lt;span style="font-style: italic;"&gt;string::compare() &lt;/span&gt;e, inclusive, um método que retorna a string no formato de vetor do C padrão, a &lt;span style="font-style: italic;"&gt;string::c_str()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Com a classe &lt;span style="font-style: italic;"&gt;string&lt;/span&gt; do C++, evitamos problemas de referência de ponteiros e de manipulação de strings em geral, que podiam acontecer no C padrão. Mas agora que estamos usando wxWidgets, temos em mãos uma nova classe chamada &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstring"&gt;&lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt;&lt;/a&gt;. Uma classe para manipulação de strings, como a classe &lt;span style="font-style: italic;"&gt;string&lt;/span&gt; do C++, mas com algumas facilidades a mais.&lt;br /&gt;&lt;br /&gt;Nada melhor que exemplos para demonstrar a classe &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt;. Primeiro, vamos declarar um objeto do tipo &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt; e atribuir um valor a ele:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString Texto;&lt;br /&gt;Texto = wxT("Nossa nova string!");&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Você pode fazer tudo em uma linha só, se preferir:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString Texto = wxT("Nossa nova string!");&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora já temos um objeto &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt; com a string &lt;span style="font-style: italic;"&gt;"Nossa nova string!"&lt;/span&gt; atribuída a ele. O que podemos fazer em seguida? Vamos começar adicionando mais string:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Texto.Append(wxT(" Com wxString, claro."));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O método &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringappend"&gt;&lt;span style="font-style: italic;"&gt;wxString::Append()&lt;/span&gt;&lt;/a&gt; adiciona texto ao final da string contida no objeto. O conteúdo do objeto &lt;span style="font-style: italic;"&gt;Texto&lt;/span&gt; agora é &lt;span style="font-style: italic;"&gt;"Nossa nova string! Com wxString, claro."&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Também é possível alterar todo o conteúdo do objeto. Podemos fazer isto com uma nova atribuição:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Texto = wxT("Aprendendo wxWidgets com Just.");&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Depois da linha acima, o conteúdo do objeto será alterado para &lt;span style="font-style: italic;"&gt;"Aprendendo wxWidgets com Just."&lt;/span&gt;. Vamos agora criar outra string:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxString Texto2 = wxT("Aprendendo wxWidgets com Just.");&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Temos agora dois objetos: &lt;span style="font-style: italic;"&gt;Texto&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;Texto2&lt;/span&gt;. Podemos compará-los:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;if (Texto == Texto2)&lt;br /&gt;  wxMessageBox(wxT("São iguais."));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Com esse trecho de código, iremos ver uma caixa de mensagem que dirá &lt;span style="font-style: italic;"&gt;"São iguais."&lt;/span&gt;. Atenção! As string são sensíveis à capitulação, ou seja, &lt;span style="font-style: italic;"&gt;"Just"&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;"just"&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;"JuSt"&lt;/span&gt; são todas diferentes entre si.&lt;br /&gt;&lt;br /&gt;Podemos também verificar se uma string está dentro da outra. Por exemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;if (Texto.Contains(wxT("wxWidgets")))&lt;br /&gt;  wxMessageBox(wxT("Texto encontrado."));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O método &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringcontains"&gt;&lt;span style="font-style: italic;"&gt;wxString::Contains()&lt;/span&gt;&lt;/a&gt; verifica se a string passada como parâmetro está contida na string atribuída ao objeto, retornando &lt;span style="font-style: italic;"&gt;true&lt;/span&gt; ou &lt;span style="font-style: italic;"&gt;false&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Os amantes do C puro (como eu) que nunca abrem mão do &lt;span style="font-style: italic;"&gt;sprintf,&lt;/span&gt; têm uma alternativa com a classe &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt;. Vamos criar uma string formatada, com alguns trechos dependentes de variáveis. Por exemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;int a, b;&lt;br /&gt;a = 2;&lt;br /&gt;b = 3;&lt;br /&gt;wxString Soma;&lt;br /&gt;Soma.Printf(wxT("A soma de %d com %d é %d."), a, b, a + b);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Qual será o conteúdo do objeto &lt;span style="font-style: italic;"&gt;Soma&lt;/span&gt;? Se você pensou em &lt;span style="font-style: italic;"&gt;"A soma de 2 com 3 é 5."&lt;/span&gt;, acertou em cheio. Com o método &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringprintf"&gt;&lt;span style="font-style: italic;"&gt;wxString::Printf()&lt;/span&gt;&lt;/a&gt;, podemos atribuir uma string ao objeto da mesma forma que fazemos isso em um vetor de &lt;span style="font-style: italic;"&gt;char&lt;/span&gt; com a função &lt;span style="font-style: italic;"&gt;sprintf&lt;/span&gt; do C. Existe também um método &lt;span style="font-style: italic;"&gt;static&lt;/span&gt; que tem a mesma função, o &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringformat"&gt;&lt;span style="font-style: italic;"&gt;wxString::Format()&lt;/span&gt;&lt;/a&gt;. Com esse método, não precisamos de um objeto instanciado para criar strings formatadas. Veja:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wxMessageBox(wxString::Format(wxT("A soma de %d com %d é %d."), a, b, a + b));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wxMessageBox()&lt;/span&gt; irá mostrar a mesma string do exemplo anterior, sem precisarmos instanciar um objeto para isso.&lt;br /&gt;&lt;br /&gt;Temos também o método &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringcstr"&gt;&lt;span style="font-style: italic;"&gt;wxString::c_str()&lt;/span&gt;&lt;/a&gt;, caso queiramos obter um vetor de &lt;span style="font-style: italic;"&gt;char&lt;/span&gt;, como no C puro:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;char *soma_c = Soma.c_str();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Na versão ANSI do wxWidgets, &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringcstr"&gt;&lt;span style="font-style: italic;"&gt;wxString::c_str()&lt;/span&gt;&lt;/a&gt; retorna a string no formato ANSI. Esse mesmo método retorna a string no formato UNICODE, na versão UNICODE do wxWidgets. Se quiser obter o formato ANSI, independentemente da versão da compilação da biblioteca, use &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringmbstr"&gt;&lt;span style="font-style: italic;"&gt;wxString::mb_str()&lt;/span&gt;&lt;/a&gt;. Para o mesmo, no formato UNICODE, temos &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstringwcstr"&gt;&lt;span style="font-style: italic;"&gt;wxString::wc_str()&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Acredito ter mostrado exemplos suficientes dos métodos da classe &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt;. Como sempre recomendo, leiam a &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstring"&gt;documentação da classe&lt;/a&gt; para ver os outros métodos e utilizações dela. Recomendo também o tópico &lt;span style="font-style: italic;"&gt;"&lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstringoverview.html#wxstringoverview"&gt;wxString overview&lt;/a&gt;"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Por último, já que estamos usando wxWidgets, vamos usar &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt; para manipular nossas strings. Dessa forma, a coisa toda fica mais fácil e temos mais opções, como demonstrei acima. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-116060968525151518?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/116060968525151518/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=116060968525151518' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116060968525151518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/116060968525151518'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/10/curso-de-wxwidgets-post-6-strings-com.html' title='Curso de wxWidgets, post 6: Strings com wxString'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115992263242660496</id><published>2006-10-03T21:21:00.000-03:00</published><updated>2006-11-13T19:30:56.577-03:00</updated><title type='text'>Curso de wxWidgets, post 5: Criando eventos</title><content type='html'>Bem, já criamos um programa, fizemos uma janela e colocamos widgets nela (um &lt;span style="font-style: italic;"&gt;wxStaticText&lt;/span&gt;, um &lt;span style="font-style: italic;"&gt;wxTextCtrl&lt;/span&gt; e um &lt;span style="font-style: italic;"&gt;wxButton&lt;/span&gt;). Mas que tal se esse botão fizesse alguma coisa além de enfeitar a janela? :)&lt;br /&gt;&lt;br /&gt;Aí é que entram os eventos. O que vamos fazer é associar um evento a um método da classe que será responsável pela ação deste evento. Na nossa janela, iremos associar um evento de clique no botão "Hello!" a um método que iremos criar na classe &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Vamos começar criando um ID para o evento. Basta usar um &lt;span style="font-style: italic;"&gt;#define&lt;/span&gt; ou um&lt;span style="font-style: italic;"&gt; enum&lt;/span&gt; para isto. No nosso exemplo, usaremos um &lt;span style="font-style: italic;"&gt;enum&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_BTN_HELLO&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esse ID será usado na criação do widget do botão, no lugar do famoso &lt;span style="font-style: italic;"&gt;wxID_ANY&lt;/span&gt;. Agora, vamos ao método. Ele vai se chamar &lt;span style="font-style: italic;"&gt;OnHelloClick()&lt;/span&gt;. Eu gosto de colocar &lt;span style="font-style: italic;"&gt;"On"&lt;/span&gt; como prefixo de um evento e a ação como sufixo, no caso, &lt;span style="font-style: italic;"&gt;"Click"&lt;/span&gt;, mas você pode usar o nome que desejar, como &lt;span style="font-style: italic;"&gt;CliqueNoBotao()&lt;/span&gt;, por exemplo. Na definição da classe, adicionamos o protótipo do método:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public:&lt;br /&gt; MeuFrame(void);&lt;br /&gt; void OnHelloClick(wxCommandEvent &amp;event);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O método deve retornar &lt;span style="font-style: italic;"&gt;void&lt;/span&gt;. No caso de um evento de clique em um &lt;span style="font-style: italic;"&gt;wxButton&lt;/span&gt;, o parâmetro é um objeto do tipo &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxcommandevent.html#wxcommandevent"&gt;&lt;span style="font-style: italic;"&gt;wxCommandEvent&lt;/span&gt;&lt;/a&gt;, mas isso vai variar de evento para evento (detalhes mais adiante).&lt;br /&gt;&lt;br /&gt;Em seguida, implementamos o método:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;void MeuFrame::OnHelloClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; if (txt_name-&gt;GetValue() == wxEmptyString)&lt;br /&gt;  wxMessageBox(wxT("Digite um nome na caixa de texto."), wxT("Aviso"), wxICON_EXCLAMATION);&lt;br /&gt; else&lt;br /&gt;  wxMessageBox(wxT("Olá, ") + txt_name-&gt;GetValue() + wxT("!"), wxT("Olá"), wxICON_INFORMATION);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;O que acontece acima? Primeiro, verificamos se existe uma string na caixa de textos. Se não houver, a mensagem "Digite um nome na caixa de texto" é exibida. Se houver uma string, ela será usada para exibir a mensagem "Olá, &lt;string&gt;&lt;span style="font-style: italic;"&gt;(string)&lt;/span&gt;!". Não se preocupe com o conteúdo desse método por enquanto, no próximo post falarei sobre a classe &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstring.html#wxstring"&gt;&lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt;&lt;/a&gt;. Porém, vou adiantar um pouco sobre métodos dos widgets.&lt;br /&gt;&lt;br /&gt;Logo na primeira linha do método acima, chamamos &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxtextctrl.html#wxtextctrlgetvalue"&gt;&lt;span style="font-style: italic;"&gt;wxTextCtrl::GetValue()&lt;/span&gt;&lt;/a&gt;, esse método retorna um objeto do tipo &lt;span style="font-style: italic;"&gt;wxString&lt;/span&gt;, contendo a string digitada na caixa de texto. Recomendo que você dê uma olhada na relação dos métodos dos widgets ao utilizá-los pela primeira vez, isso é bom para que você saiba o que pode ser feito com cada widget.&lt;br /&gt;&lt;br /&gt;Precisamos declarar a tabela de eventos (que será criada ainda). Fazemos isso na definição da classe:&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;&lt;pre&gt;private:&lt;br /&gt; wxStaticText    *lb_hello;&lt;br /&gt; wxTextCtrl      *txt_name;&lt;br /&gt; wxButton        *btn_say;&lt;br /&gt;&lt;br /&gt; DECLARE_EVENT_TABLE()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Depois de criar o método e declarar a tabela de eventos da classe, vamos montá-la. Uma tabela de eventos começa com a macro &lt;span style="font-style: italic;"&gt;BEGIN_EVENT_TABLE(classe, tipo)&lt;/span&gt; e termina com a macro &lt;span style="font-style: italic;"&gt;END_EVENT_TABLE().&lt;/span&gt; Entre essas duas macros, outras são inseridas, associando eventos a métodos. No caso do clique do botão, usaremos a macro &lt;span style="font-style: italic;"&gt;EVT_BUTTON(id, func)&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_BUTTON(ID_BTN_HELLO, OnHelloClick)&lt;br /&gt;END_EVENT_TABLE()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Na macro &lt;span style="font-style: italic;"&gt;EVT_BUTTON()&lt;/span&gt;, passamos como parâmetro a ID do evento e o método que será chamado. Para saber qual macro usar em cada tipo de widget, basta olhar na sua própria documentação. Por último, basta fazer uma alteração na criação do widget do botão, trocando o valor &lt;span style="font-style: italic;"&gt;wxID_ANY&lt;/span&gt; por &lt;span style="font-style: italic;"&gt;ID_BTN_HELLO&lt;/span&gt; (o parâmetro ID do construtor do widget):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;lb_say = new wxButton(this, ID_BTN_HELLO, wxT("Hello!"));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Agora, é só compilar e executar o nosso exemplo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post5_hello.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post5_hello.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;string&gt;&lt;br /&gt;Agora tente criar novos botões e eventos para eles. Leia o tópico &lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.wxwindows.org/manuals/2.6.3/wx_eventhandlingoverview.html#eventhandlingoverview"&gt;Event handling overview&lt;/a&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;, do &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_contents.html"&gt;manual do wxWidgets&lt;/a&gt;. Na seção &lt;span style="font-style: italic;"&gt;"&lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_eventhandlingoverview.html#eventmacros"&gt;Event macros summary&lt;/a&gt;"&lt;/span&gt; você encontra uma lista de classes de eventos, como a &lt;span style="font-style: italic;"&gt;wxCommandEvent&lt;/span&gt; usada no exemplo do botão. Lembre-se que para saber qual macro usar em cada evento, basta ler a documentação do widget em questão.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Como está nosso programa até agora?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Após quatro posts de código (do 2 até este), pode ser que as coisas tenham ficado embaralhadas para alguns visitantes. Colei abaixo o código completo do nosso programa.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include "wx/wx.h"&lt;br /&gt;&lt;br /&gt;enum&lt;br /&gt;{&lt;br /&gt; ID_BTN_HELLO&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; MeuFrame(void);&lt;br /&gt; void OnHelloClick(wxCommandEvent &amp;event);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; wxStaticText *lb_hello;&lt;br /&gt; wxTextCtrl  *txt_name;&lt;br /&gt; wxButton  *btn_say;&lt;br /&gt; &lt;br /&gt; DECLARE_EVENT_TABLE()&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BEGIN_EVENT_TABLE(MeuFrame, wxFrame)&lt;br /&gt; EVT_BUTTON(ID_BTN_HELLO, MeuFrame::OnHelloClick)&lt;br /&gt;END_EVENT_TABLE()&lt;br /&gt;&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Meu Programa"))&lt;br /&gt;{&lt;br /&gt; // Criação dos sizers&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; wxBoxSizer *sizer_h = new wxBoxSizer(wxHORIZONTAL);&lt;br /&gt; &lt;br /&gt; // Criação dos widgets&lt;br /&gt; lb_hello = new wxStaticText(this, wxID_ANY, wxT("Digite seu nome na caixa:"));&lt;br /&gt; txt_name = new wxTextCtrl(this, wxID_ANY);&lt;br /&gt; btn_say = new wxButton(this, ID_BTN_HELLO, wxT("Hello!"));&lt;br /&gt; &lt;br /&gt; // Posicionamento dos widgets&lt;br /&gt; sizer_h-&gt;Add(txt_name, 1, wxALL, 5);&lt;br /&gt; sizer_h-&gt;Add(btn_say, 0, wxALL, 5);&lt;br /&gt; &lt;br /&gt; sizer_v-&gt;Add(lb_hello, 0, wxALL, 5);&lt;br /&gt; sizer_v-&gt;Add(sizer_h, 0, wxALL | wxEXPAND, 5);&lt;br /&gt; &lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void MeuFrame::OnHelloClick(wxCommandEvent &amp;event)&lt;br /&gt;{&lt;br /&gt; if (txt_name-&gt;GetValue() == wxEmptyString)&lt;br /&gt;  wxMessageBox(wxT("Digite um nome na caixa de texto."), wxT("Aviso"), wxICON_EXCLAMATION);&lt;br /&gt; else&lt;br /&gt;  wxMessageBox(wxT("Olá, ") + txt_name-&gt;GetValue() + wxT("!"), wxT("Olá"), wxICON_INFORMATION);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115992263242660496?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115992263242660496/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115992263242660496' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115992263242660496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115992263242660496'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/10/curso-de-wxwidgets-post-5-criando.html' title='Curso de wxWidgets, post 5: Criando eventos'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115987037749511285</id><published>2006-10-03T07:02:00.000-03:00</published><updated>2006-11-13T19:30:56.472-03:00</updated><title type='text'>Slackware 11.0 lançado</title><content type='html'>Eu já estava agoniado com tantos RCs do Slackware 11.0, mas nessa madrugada, às 1:05, recebi um e-mail da lista &lt;a href="http://www.slackware.com/lists/"&gt;&lt;span style="font-style: italic;"&gt;slackware-announce&lt;/span&gt;&lt;/a&gt; que dizia: &lt;a href="http://www.slackware.com/"&gt;&lt;span style="font-style: italic;"&gt;Slackware 11.0 is released!&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nessa nova versão, tem o &lt;a href="http://www.kernel.org"&gt;kernel&lt;/a&gt;  2.4.33.3 ainda como padrão, o 2.6.17.13 como opção no diretório &lt;span style="font-family: courier new;"&gt;/extra&lt;/span&gt; e o 2.6.18 no diretório &lt;span style="font-family: courier new;"&gt;/testing&lt;/span&gt;. O &lt;a href="http://www.kde.org"&gt;KDE&lt;/a&gt; é o 3.5.4, &lt;a href="http://www.xfce.org"&gt;XFCE&lt;/a&gt; 4.2.3.2, últimas versões do &lt;a href="http://www.mozilla.org"&gt;Firefox e Thunderbird&lt;/a&gt;, &lt;a href="http://www.mozilla.org/projects/seamonkey/"&gt;SeaMonkey&lt;/a&gt; 1.0.5 (substituindo a suíte Mozilla), além de glibc 2.3.6, gcc 3.4.6, X11R6.9.0 da &lt;a href="http://www.x.org"&gt;X.Org&lt;/a&gt;, etc.&lt;br /&gt;&lt;br /&gt;Bem, o recado está dado! Visitem o &lt;a href="http://www.slackware.com"&gt;site oficial do Slackware&lt;/a&gt; para &lt;a href="http://www.slackware.com/getslack/"&gt;baixar&lt;/a&gt; essa nova versão. Hoje mesmo vou atualizar um dos meus servidores :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115987037749511285?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115987037749511285/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115987037749511285' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115987037749511285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115987037749511285'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/10/slackware-110-lanado.html' title='Slackware 11.0 lançado'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115931329620132412</id><published>2006-09-26T20:00:00.000-03:00</published><updated>2006-11-13T19:30:56.362-03:00</updated><title type='text'>Curso de wxWidgets, post 4: Posicionando com sizers</title><content type='html'>Se você tentou adicionar novos widgets no frame do nosso "Hello, world!", possa ser que tenha tido problemas para posicioná-los. É isto que vamos fazer agora!&lt;br /&gt;&lt;br /&gt;Bem, no wxWidgets, você não precisa especificar as coordenadas de cada widget (nem deve). Ao invés disso, usamos os sizers, que são objetos do wxWidgets que auxiliam no posicionamento dos widgets. Funciona mais ou menos como uma tabela, você adiciona sizers horizontais ou verticais e vai inserindo os widgets nas "células" deles.&lt;br /&gt;&lt;br /&gt;No post de hoje, vamos fazer a seguinte janela para demonstrar o uso de sizers:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post4_janela1.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post4_janela1.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para que você entenda o funcionamento dos sizers, vou mostrar como ela foi divida por eles:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post4_janela2.0.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post4_janela2.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nesta janela foram usados dois sizers: um vertical (vermelho) e um horizontal (azul). O sizer horizontal tem dois widgets: um &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxtextctrl.html#wxtextctrl"&gt;&lt;span style="font-style: italic;"&gt;wxTextCtrl&lt;/span&gt;&lt;/a&gt; e um &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxbutton.html#wxbutton"&gt;&lt;span style="font-style: italic;"&gt;wxButton&lt;/span&gt;&lt;/a&gt;. O sizer vermelho tem um &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstatictext.html#wxstatictext"&gt;&lt;span style="font-style: italic;"&gt;wxStaticText&lt;/span&gt;&lt;/a&gt; e o sizer horizontal. O sizer horizontal vai ficar dentro do vertical, de forma a fazer esta arrumação.&lt;br /&gt;&lt;br /&gt;Para fazer esta janela, vamos modificar o nosso "Hello, world!". Na definição da classe do frame, declare os widgets que vamos usar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; MeuFrame(void);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; wxStaticText    *lb_hello;&lt;br /&gt; wxTextCtrl      *txt_name;&lt;br /&gt; wxButton        *btn_say;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E no construtor do frame, vamos criar os sizers, os widgets e posicioná-los:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Meu Programa"))&lt;br /&gt;{&lt;br /&gt; // Criação dos sizers&lt;br /&gt; wxBoxSizer *sizer_v = new wxBoxSizer(wxVERTICAL);&lt;br /&gt; wxBoxSizer *sizer_h = new wxBoxSizer(wxHORIZONTAL);&lt;br /&gt;&lt;br /&gt; // Criação dos widgets&lt;br /&gt; lb_hello = new wxStaticText(this, wxID_ANY, wxT("Digite seu nome na caixa:"));&lt;br /&gt; txt_name = new wxTextCtrl(this, wxID_ANY);&lt;br /&gt; btn_say = new wxButton(this, wxID_ANY, wxT("Hello!"));&lt;br /&gt;&lt;br /&gt; // Posicionamento dos widgets&lt;br /&gt; sizer_h-&gt;Add(txt_name, 1, wxALL, 5);&lt;br /&gt; sizer_h-&gt;Add(btn_say, 0, wxALL, 5);&lt;br /&gt;&lt;br /&gt; sizer_v-&gt;Add(lb_hello, 0, wxALL, 5);&lt;br /&gt; sizer_v-&gt;Add(sizer_h, 0, wxALL | wxEXPAND, 5);&lt;br /&gt;&lt;br /&gt; SetSizerAndFit(sizer_v);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vamos entender melhor os sizers. No início do construtor, criamos os dois sizers que vamos utilizar. No &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxboxsizer.html#wxboxsizer"&gt;&lt;span style="font-style: italic;"&gt;wxBoxSizer&lt;/span&gt;&lt;/a&gt;, você insere os widgets nas "células" e ele os encaixa usando o tamanho mínimo necessário por aquele widget. Como parâmetro do &lt;span style="font-style: italic;"&gt;wxBoxSizer&lt;/span&gt;, passamos sua orientação, que pode ser &lt;span style="font-style: italic;"&gt;wxHORIZONTAL&lt;/span&gt; ou &lt;span style="font-style: italic;"&gt;wxVERTICAL&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Em seguida, criamos os widgets normalmente, chamando os construtores de cada um deles.&lt;br /&gt;&lt;br /&gt;Por último, os widgets são inseridos nos sizers com o método &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxsizer.html#wxsizeradd"&gt;&lt;span style="font-style: italic;"&gt;wxSizer::Add()&lt;/span&gt;&lt;/a&gt;. Neste método, passamos os seguintes parâmetros:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;txt_name: o widget a ser inserido.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;1: a proporção (se ele deve se esticar na orientação do sizer e em que proporção de acordo com os outros widgets no mesmo sizer).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;wxALL | wxEXPAND: flags deste elemento. wxALL diz que deve haver um espaçamento em todas as direções do widget e wxEXPAND diz que esse widget deve expandir para usar todo o espaço dado a ele. Outras flags podem ser encontradas na &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxsizer.html#wxsizer"&gt;documentação do wxSizer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;5: o tamanho da borda que será usada com wxALL.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por último, devemos dizer ao frame qual o sizer principal e que ele deve ser usado como base para o tamanho da janela. Para isso, chamamos o método &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxwindow.html#wxwindowsetsizerandfit"&gt;&lt;span style="font-style: italic;"&gt;wxWindow::SetSizerAndFit()&lt;/span&gt;&lt;/a&gt; e passamos o sizer vertical como parâmetro, já que ele contém todos os widgets e sizers dentro dele.&lt;br /&gt;&lt;br /&gt;O uso de sizers é bastante fácil. Basta criar os sizers, criar os widgets e adicionar os widgets nos sizers. Experimente adicionar outros widgets junto com mais sizers, criando arrumações diferentes.&lt;br /&gt;&lt;br /&gt;Leia também a &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_contents.html"&gt;documentação do wxWidgets&lt;/a&gt; para ver os outros sizers e veja o tópico &lt;span style="font-style: italic;"&gt;"&lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_sizeroverview.html#sizeroverview"&gt;Sizer overview&lt;/a&gt;"&lt;/span&gt;, esta página contém informações úteis na utilização de sizers.&lt;br /&gt;&lt;br /&gt;PS.: Caso tenha dúvida em qualquer assunto de algum post do curso, deixe um comentário com sua pergunta. Se os leitores participarem no blog, outras pessoas também aprenderão.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115931329620132412?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115931329620132412/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115931329620132412' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115931329620132412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115931329620132412'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/09/curso-de-wxwidgets-post-4-posicionando.html' title='Curso de wxWidgets, post 4: Posicionando com sizers'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115903589285608446</id><published>2006-09-23T15:21:00.000-03:00</published><updated>2006-11-13T19:30:56.265-03:00</updated><title type='text'>WinPolicy na rede Globo</title><content type='html'>Um usuário do WinPolicy postou a seguinte mensagem na comunidade do WinPolicy no Orkut:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"O WinPolicy apareceu por um acaso nessa reportagem da Rede Globulo de Cuiaba. A materia nao trata sobre o WinPolicy, mas sobre senhas na internet e em geral, e em um dos takes de filmagem aparece claramente no computador de uma Lan House láááááááááá de Cuiaba o WinPolicy sendo utilizado:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-style: italic;" href="http://www.youtube.com/watch?v=eJDEjKIP4n0&amp;NR" target="_blank"&gt;http://www.youtube.com/watch?v=eJDEjKIP4n0&amp;amp;NR&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Aparece logo nos 00:17" de vídeo... muito legal..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A URL do post original é:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.orkut.com/CommMsgs.aspx?cmm=3711091&amp;tid=2488845812591714844&amp;amp;start=1"&gt;http://www.orkut.com/CommMsgs.aspx?cmm=3711091&amp;tid=2488845812591714844&amp;amp;start=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Propaganda gratuita na rede Globo! Que legal! rsrs :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115903589285608446?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115903589285608446/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115903589285608446' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115903589285608446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115903589285608446'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/09/winpolicy-na-rede-globo.html' title='WinPolicy na rede Globo'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115870097903175245</id><published>2006-09-19T18:16:00.000-03:00</published><updated>2006-11-13T19:30:56.155-03:00</updated><title type='text'>Curso de wxWidgets, post 3: Entendendo o "Hello, world!" do post 2</title><content type='html'>Agora sim, vamos ver como aquilo tudo funciona! :) Estou supondo que todos já conseguiram compilar o wxWidgets e botar ele pra trabalhar. Quem ainda não conseguiu, deixe comentários no post 2.&lt;br /&gt;&lt;br /&gt;Voltando ao "Hello, world!"... Em primeiro lugar, devemos incluir os cabeçalhos do wxWidgets (acho que isso é óbvio):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include "wx/wx.h"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Essa linha inclui os principais cabeçalhos do wx, mas você pode também inserir apenas os cabeçalhos das classes que deseja usar. Por exemplo, se em seu programa você estiver usando apenas um &lt;a style="font-style: italic;" href="http://www.wxwindows.org/manuals/2.6.3/wx_wxframe.html#wxframe"&gt;wxFrame&lt;/a&gt; e um &lt;a style="font-style: italic;" href="http://www.wxwindows.org/manuals/2.6.3/wx_wxbutton.html#wxbutton"&gt;wxButton&lt;/a&gt;, você poderia fazer assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include "wx/app.h"    // Este é para o wxApp&lt;br /&gt;#include "wx/frame.h"  // Este é para o wxFrame&lt;br /&gt;#include "wx/button.h" // Este é para o wxButton&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Iniciando o programa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como todo programador C/C++ sabe, o programa sempre começa na função &lt;span style="font-style: italic;"&gt;main()&lt;/span&gt;. Com wxWidgets, essa função não será mais utilizada. Na verdade, ela é utilizada internamente pelo &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxapp.html#wxapp"&gt;&lt;span style="font-style: italic;"&gt;wxApp&lt;/span&gt;&lt;/a&gt;, então, ao invés de usar &lt;span style="font-style: italic;"&gt;main()&lt;/span&gt;, no wxWidgets usamos &lt;span style="font-style: italic;"&gt;wxApp::OnInit()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Primeiro, precisamos criar uma classe que irá representar nosso programa. Essa classe deverá ser derivada de &lt;span style="font-style: italic;"&gt;wxApp&lt;/span&gt;. Veja o código:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;virtual bool OnInit(void);&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esse trecho de código vai criar a classe &lt;span style="font-style: italic;"&gt;MeuPrograma&lt;/span&gt; que é derivada de &lt;span style="font-style: italic;"&gt;wxApp&lt;/span&gt; (para os novatos em orientação a objetos, isso significa que a nossa nova classe vai herdar todos os atributos e métodos de &lt;span style="font-style: italic;"&gt;wxApp&lt;/span&gt;. É como um &lt;span style="font-style: italic;"&gt;wxApp&lt;/span&gt; + os métodos e atributos que criarmos nesta classe). O método sobrecarregado &lt;span style="font-style: italic;"&gt;MeuPrograma::OnInit()&lt;/span&gt; será o &lt;span style="font-style: italic;"&gt;main()&lt;/span&gt; do nosso programa. É este método que será chamado ao executarmos o aplicativo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Criação da janela principal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Porém, queremos criar uma janela para o nosso programa. Uma janela em wxWidgets é um &lt;span style="font-style: italic;"&gt;wxFrame&lt;/span&gt;. Então, para criarmos &lt;span style="font-weight: bold;"&gt;nossa &lt;/span&gt;janela específica, vamos criar uma classe para a janela. Essa classe deve ser derivada de &lt;span style="font-style: italic;"&gt;wxFrame&lt;/span&gt;, já que queremos usar todo o "comportamento" de um &lt;span style="font-style: italic;"&gt;wxFrame&lt;/span&gt;, mas com algumas coisas a mais e específicas que iremos implementar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; MeuFrame(void);&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como na classe &lt;span style="font-style: italic;"&gt;MeuPrograma&lt;/span&gt;, a classe &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt; é uma classe derivada de &lt;span style="font-style: italic;"&gt;wxFrame&lt;/span&gt;, todos os métodos e atributos dela serão herdadas por nossa classe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementando o programa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bem, já temos uma classe para nosso aplicativo (&lt;span style="font-style: italic;"&gt;MeuPrograma&lt;/span&gt;) e uma para nossa janela (&lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt;). Agora, vamos voltar ao &lt;span style="font-style: italic;"&gt;MeuPrograma::OnInit()&lt;/span&gt;. Devemos começar a programar aqui:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, declaramos um ponteiro do tipo &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt; e criamos uma instância da nossa classe. Na segunda linha, chamamos o método &lt;span style="font-style: italic;"&gt;wxFrame::Show()&lt;/span&gt; para exibir a janela. Esse método faz com que a janela seja mostrada na tela. Na terceira linha, o método &lt;span style="font-style: italic;"&gt;wxApp::SetTopWindow()&lt;/span&gt; define a janela instanciada em &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt; como a janela principal do nosso programa. E por último, &lt;span style="font-style: italic;"&gt;return true&lt;/span&gt; indica que a inicialização do programa foi feita com sucesso e que ele deve continuar rodando. Se algo acontecesse errado, um &lt;span style="font-style: italic;"&gt;return false&lt;/span&gt; iria fechar o programa imediatamente.&lt;br /&gt;&lt;br /&gt;Bem, isto é o que de fato deve ser feito em &lt;span style="font-style: italic;"&gt;wxApp::OnInit()&lt;/span&gt;. O resto da implementação deve ficar em outras classes. Mas por enquanto, vamos apenas criar nossa janela. Devemos implementar o construtor dela:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Meu programa"))&lt;br /&gt;{&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nada é feito neste construtor. Na verdade, apenas passamos alguns parâmetros para o &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxframe.html#wxframector"&gt;construtor do &lt;span style="font-style: italic;"&gt;wxFrame&lt;/span&gt;&lt;/a&gt;. O primeiro parâmetro indica qual janela é pai desta janela. Como esta é a janela principal, ela não tem pai (&lt;span style="font-style: italic;"&gt;NULL&lt;/span&gt;). O segundo parâmetro diz qual a ID desta janela. Como não fizemos nenhum evento da janela em si, não é preciso especificar uma ID agora (&lt;span style="font-style: italic;"&gt;wxID_ANY&lt;/span&gt;). O terceiro parâmetro configura o título da janela (&lt;span style="font-style: italic;"&gt;wxT("Meu programa")&lt;/span&gt;). Verifique a ajuda do construtor do &lt;span style="font-style: italic;"&gt;wxFrame&lt;/span&gt; para ver os detalhes de todos os parâmetros.&lt;br /&gt;&lt;br /&gt;Agora, devemos dizer ao wxWidgets qual é a nossa classe de aplicativo com a macro:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;IMPLEMENT_APP(MeuPrograma)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pronto! Este é o nosso "Hello, world!" explicado. Mas agora, vamos adicionar algumas coisas a ele.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Adicionando objetos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, que tal um texto escrito "Hello, world!"? A classe para textos estáticos no wxWidgets é a &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxstatictext.html#wxstatictext"&gt;&lt;span style="font-style: italic;"&gt;wxStaticText&lt;/span&gt;&lt;/a&gt;. Os principais parâmetros do seu construtor (usaremos apenas estes):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wxWindow *parent&lt;/span&gt;: a janela pai deste objeto.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wxWindowID id&lt;/span&gt;: a ID deste objeto (caso desejamos criar um evento para ele).&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wxString &amp;label&lt;/span&gt;: o texto que será exibido.&lt;br /&gt;&lt;br /&gt;Primeiro, vamos declarar nosso objeto na definição de &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt;. Basta adicionar a declaração na definição da classe, vai ficar assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class MeuFrame: wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; MeuFrame(void);&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt; wxStaticText *text;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E em seguida, instanciamos a classe no construtor de MeuFrame, adicionando a seguinte linha:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;text = new wxStaticText(this, wxID_ANY, wxT("Hello, world!"));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vai ficar assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Meu programa"))&lt;br /&gt;{&lt;br /&gt; text = new wxStaticText(this, wxID_ANY, wxT("Hello, world!"));&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Compile o programa novamente e execute. Você vai ver o texto "Hello, world!". Explicando os parâmetros:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;this&lt;/span&gt;: indica que a janela &lt;span style="font-style: italic;"&gt;MeuFrame&lt;/span&gt; é a janela pai do objeto.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wxID_ANY&lt;/span&gt;: indica que não estamos associando nenhuma ID específica ao objeto.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wxT("Hello, world!")&lt;/span&gt;: o texto que será exibido.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Uma breve explicação sobre a macro &lt;span style="font-style: italic;"&gt;wxT()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vocês devem ter notado que todas as strings estão envoltas na macro &lt;span style="font-style: italic;"&gt;wxT()&lt;/span&gt;. Bem, antigamente, as strings eram representadas no formato ASCII, cada caractere ocupava um byte na memória. Porém, alguns idiomas contém caracteres especiais, como o japonês, chinês, árabe..., e um byte não era suficiente para representar todos eles, já que com um byte podemos representar apenas 256 valores diferentes. Surgiram então várias codificações de caracteres para representar cada idioma ou região. Então, para padronizar isso, o padrão &lt;a href="http://www.unicode.org"&gt;UNICODE&lt;/a&gt; foi criado. Neste padrão, mais de um byte pode ser utilizado.&lt;br /&gt;&lt;br /&gt;Mas o wxWidgets pode estar sendo utilizado em um sistema operacional sem suporte a UNICODE, ou até mesmo, o wxWidgets pode ter sido compilado sem suporte a UNICODE, como eu ensinei no post 2. Para não haver problemas com isso e tornar seu código portável, use a macro &lt;span style="font-style: italic;"&gt;wxT()&lt;/span&gt;. Essa macro não faz nada em compilações sem UNICODE, mas vai converter a string ASCII para UNICODE, caso sua compilação do wxWidgets esteja usando UNICODE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Faça mais no "Hello, world!"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para prática, sugiro criar outros objetos na nossa janela. Algumas sugestões: &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxbutton.html#wxbutton"&gt;&lt;span style="font-style: italic;"&gt;wxButton&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxtextctrl.html#wxtextctrl"&gt;&lt;span style="font-style: italic;"&gt;wxTextCtrl&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxcombobox.html#wxcombobox"&gt;&lt;span style="font-style: italic;"&gt;wxComboBox&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxcheckbox.html#wxcheckbox"&gt;&lt;span style="font-style: italic;"&gt;wxCheckBox&lt;/span&gt;&lt;/a&gt; e &lt;a href="http://www.wxwindows.org/manuals/2.6.3/wx_wxradiobox.html#wxradiobox"&gt;&lt;span style="font-style: italic;"&gt;wxRadioBox&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No próximo post, vou mostrar como posicionar os objetos na janela (você vai perceber esse problema quando tentar adicionar novos objetos). Em caso de dúvidas, deixem comentários. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115870097903175245?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115870097903175245/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115870097903175245' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115870097903175245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115870097903175245'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/09/curso-de-wxwidgets-post-3-entendendo-o.html' title='Curso de wxWidgets, post 3: Entendendo o &quot;Hello, world!&quot; do post 2'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115802175671863321</id><published>2006-09-11T21:11:00.000-03:00</published><updated>2006-11-13T19:30:56.060-03:00</updated><title type='text'>Curso de wxWidgets, post 2: Configurando uma IDE e compilando o wxWidgets</title><content type='html'>Bom, vamos começar! Primeiro, escolha uma IDE para programar. Algumas sugestões:&lt;br /&gt;&lt;br /&gt;Eclipse: minha IDE favorita. O problema é que não é muito leve, já que foi feita em Java e pra Java :) Mas eu recomendo, tem muitos recursos bons embutidos. Se decidir usar o Eclipse, você precisa instalar um plug-in chamado &lt;a href="http://www.eclipse.org/cdt/"&gt;CDT&lt;/a&gt;, ele adiciona recursos para programação em C/C++ no Eclipse (como eu disse, ele foi feito pra Java). &lt;a href="http://www.eclipse.org"&gt;http://www.eclipse.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;MinGW Developer Studio: Uma espécie de clone do Microsoft Visual Studio. É leve e bem legal. O problema é que não está mais sendo desenvolvido. &lt;a href="http://www.parinyasoft.com"&gt;http://www.parinyasoft.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dev-C++: Uma IDE leve, desenvolvida em Delphi. Não tem muitos recursos como o Eclipse, mas também é agradável de usar. &lt;a href="http://www.bloodshed.net"&gt;http://www.bloodshed.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Todas essas IDEs usam o compilador GCC da GNU. O GCC é instalado junto com as IDEs. No caso do Eclipse, você precisa instalar o compilador a parte. Sendo assim, basta baixar o MinGW no site &lt;a href="http://www.mingw.org"&gt;http://www.mingw.org&lt;/a&gt; (o link direto para o download da versão 5.0.2 é &lt;a href="http://prdownloads.sf.net/mingw/MinGW-5.0.2.exe?download"&gt;http://prdownloads.sf.net/mingw/MinGW-5.0.2.exe?download&lt;/a&gt;). Baixe também o MSYS (&lt;a href="http://prdownloads.sf.net/mingw/MSYS-1.0.11-2004.04.30-1.exe?download"&gt;http://prdownloads.sf.net/mingw/MSYS-1.0.11-2004.04.30-1.exe?download&lt;/a&gt;), ele é uma espécie de shell para Windows, será necessário mais tarde para compilar o wxWidgets além de possuir alguns programas necessários para o Eclipse.&lt;br /&gt;&lt;br /&gt;Se você usa Linux, baixe o Eclipse e certifique-se de que possui o GCC instalado na sua distribuição.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instalando o MinGW e o MSYS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se você estiver usando Linux, pule esta parte.&lt;br /&gt;&lt;br /&gt;Primeiro, instale o MinGW. O executável vai baixar os pacotes selecionados da Internet e instalar em &lt;span style="font-family:courier new;"&gt;C:\MinGW&lt;/span&gt;. Faça a instalação completa, apesar de precisarmos apenas dos compiladores, do make e da API do Windows (Win32). A instalação é fácil (leia: next, next, next...) :P.&lt;br /&gt;&lt;br /&gt;Após instalar o MinGW, vamos ao MSYS. Ele vai fazer uma instalação gráfica e em seguida vai abrir um prompt de comando. Ele vai perguntar onde o MinGW está instalado. Se estiver em &lt;span style="font-family:courier new;"&gt;C:\MinGW&lt;/span&gt;, responda como &lt;span style="font-family:courier new;"&gt;c:/mingw&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;As instalações ainda não acabaram. Precisamos atualizar a variável de ambiente &lt;span style="font-family:courier new;"&gt;PATH&lt;/span&gt;. No Windows NT e seus derivados (2000, 2003 e XP), clique com o botão direito em “Meu Computador -&gt; Propriedades”. Vá na aba “Avançado” e clique no botão “Variáveis de ambiente”. Procure pela variável “PATH” e clique em “Editar”. No final do valor da variável, adicione: &lt;span style="font-family:courier new;"&gt;;C:\MinGW\bin;C:\msys\1.0\bin&lt;/span&gt;. No Windows 95, 98 e Me, edite &lt;span style="font-family:courier new;"&gt;C:\autoexec.bat&lt;/span&gt; para configurar o valor de &lt;span style="font-family:courier new;"&gt;PATH&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Isso fará com que os programas instalados possam ser acessados em qualquer diretório pelo prompt do DOS. Então vamos fazer um teste. Abra o prompt do DOS e execute primeiro &lt;span style="font-family:courier new;"&gt;gcc --version&lt;/span&gt;. Será exibida a versão do GCC instalado, significa que o MinGW foi instalado. Em seguida, tente o comando &lt;span style="font-family:courier new;"&gt;uname -a&lt;/span&gt;, esse comando vai mostrar a versão do Windows, significa que o MSYS foi instalado.&lt;br /&gt;&lt;br /&gt;Se algum dos comandos não funcionar, tente refazer a instalação do programa que falhou.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Compilando o wxWidgets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, baixe a biblioteca do site oficial em &lt;a href="http://www.wxwidgets.org"&gt;http://www.wxwidgets.org&lt;/a&gt;. Se estiver no Linux, baixe o wxGTK, no Windows, baixe o wxMSW.&lt;br /&gt;&lt;br /&gt;Depois do download, é hora de compilar! No Linux, abra uma janela do terminal ou vá para o modo texto. No Windows, abra o MSYS.&lt;br /&gt;&lt;br /&gt;Descompacte o código fonte do wxWidgets em um diretório qualquer e entre neste diretório:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ cd /caminho/para/o/wx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora você vai precisar executar o script de configuração. Geralmente uso da seguinte forma (no Windows, troque o /usr/local/wx/2.6 para algo do tipo /c/wxMSW-2.6:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ ./configure --prefix=/usr/local/wx/2.6 --disable-debug --enable-shared --disable-unicode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;--prefix=/diretorio:&lt;br /&gt;O diretório onde o wxWidgets vai ser instalado&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;--disable-debug:&lt;br /&gt;Desabilita símbolos de debug (são usados para debugar no GDB)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;--enable-shared:&lt;br /&gt;Compila a biblioteca em vários arquivos .so ou .dll&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;--disable-unicode:&lt;br /&gt;Desabilita o suporte a UNICODE (meio problemático no Windows 9x e NT, pois precisam de uma biblioteca a parte, por isso costumo desabilitar, não vamos escrever programas em árabe mesmo :P)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O script de configuração será executado e vai exibir um pequeno relatório no final. Leia a saída e verifique se condiz com a configuração feita.&lt;br /&gt;&lt;br /&gt;Após feita a configuração, compile!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E depois de toda a compilação (pode demorar um pouco), instale!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No Linux, basta agora executar ldconfig pra atualizar a lista de bibliotecas. No Windows, temos que copiar as DLLs pro diretório do sistema:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ cp -af /c/wxMSW-2.6/lib/*.dll /c/WINDOWS/System32/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Também é necessário copiar uma DLL do MinGW:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ cp -af /c/MinGW/bin/mingwm10.dll /c/WINDOWS/System32/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto! wxWidgets e compiladores instalados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Vamos fazer um pequeno teste&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Abra sua IDE e copie o seguinte código fonte:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include &amp;lt;wx/wx.h&amp;gt;&lt;br /&gt;&lt;br /&gt;class MeuPrograma: public wxApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; virtual bool OnInit(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class MeuFrame: public wxFrame&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; MeuFrame(void);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;bool MeuPrograma::OnInit(void)&lt;br /&gt;{&lt;br /&gt; MeuFrame *frame = new MeuFrame();&lt;br /&gt; frame-&gt;Show();&lt;br /&gt; SetTopWindow(frame);&lt;br /&gt; return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MeuFrame::MeuFrame(void)&lt;br /&gt; :wxFrame(NULL, wxID_ANY, wxT("Meu Programa"))&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IMPLEMENT_APP(MeuPrograma)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Compile ele na sua IDE. Provavelmente ela ainda não vai estar configurada para usar o wxWidgets, mas você pode compilar manualmente, basta abrir um terminal ou o MSYS no Windows e digitar o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ g++ -o wx testewx.cpp `wx-config --cxxflags` `wx-config --libs`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No Windows, você vai precisar especificar o caminho do wx-config por completo, &lt;span style="font-family:courier new;"&gt;/c/wxMSW-2.6/bin/wx-config --cxxflags&lt;/span&gt;...):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ g++ -o wx testewx.cpp `/c/wxMSW-2.6/bin/wx-config --cxxflags` `/c/wxMSW-2.6/bin/wx-config --libs`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E execute o programa:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ ./wx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Você deverá ver uma janela vazia com o título “Meu Programa”. Esse é nosso “Hello, World”. No próximo post vou explicar esse programa com detalhes.&lt;br /&gt;&lt;br /&gt;wxWidgets é isso aí! Se não deu certo, refaça tudo, passo a passo até achar o erro. Por enquanto, tente entender o código sozinho ou até mesmo modificá-lo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Entendendo o wx-config e configurando sua IDE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Todo programador C/C++ sabe que ao usar a linha de comando, podemos passar alguns argumentos para o gcc e para o g++, como por exemplo, incluir uma biblioteca. Quem nunca usou &lt;span style="font-family:courier new;"&gt;-lm&lt;/span&gt; para incluir o &lt;span style="font-family:courier new;"&gt;math.h&lt;/span&gt;? O que o &lt;span style="font-family:courier new;"&gt;wx-config&lt;/span&gt; faz é justamente isso. Experimente executar &lt;span style="font-family:courier new;"&gt;wx-config --cxxflags&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;wx-config --libs&lt;/span&gt; no seu terminal. O que você vai ver são os argumentos que devem ser incluídos no g++ na hora de compilar (--cxxflags) e na hora de “linkar” (--libs).&lt;br /&gt;&lt;br /&gt;Se você quer usar uma IDE para compilar seus programas em wxWidgets, você precisa inserir esses parâmetros nas propriedades do seu projeto. No Eclipse, por exemplo, basta clicar com o botão direito do mouse na pasta do projeto e escolher a opção “Properties” no menu de contexto. Clique em “C/C++ Build” no painel à esquerda e insira &lt;span style="font-family:courier new;"&gt;`wx-config --cxxflags`&lt;/span&gt; nos argumentos de comando do g++ em “GCC C++ Compiler” e &lt;span style="font-family:courier new;"&gt;`wx-config --libs`&lt;/span&gt; em “GCC C++ Linker”. Veja a figura abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/post2_eclipse.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/post2_eclipse.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se estiver usando Windows, você precisa executar o &lt;span style="font-family:courier new;"&gt;wx-config&lt;/span&gt; no MSYS, copiar a saída e inserir no Eclipse. Ou, você pode configurar cada configuração individualmente (Preprocessor, Directories, Optimization...)&lt;br /&gt;&lt;br /&gt;OBSERVAÇÃO: No Eclipse do Windows, substitua o &lt;span style="font-family:courier new;"&gt;/c&lt;/span&gt; da saída do &lt;span style="font-family:courier new;"&gt;wx-config&lt;/span&gt; por &lt;span style="font-family:courier new;"&gt;c:/&lt;/span&gt;. Por exemplo: ao invés de &lt;span style="font-family:courier new;"&gt;-I/c/wxMSW-2.6/include&lt;/span&gt;, use &lt;span style="font-family:courier new;"&gt;-Ic:/wxMSW-2.6/include&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115802175671863321?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115802175671863321/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115802175671863321' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115802175671863321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115802175671863321'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/09/curso-de-wxwidgets-post-2-configurando.html' title='Curso de wxWidgets, post 2: Configurando uma IDE e compilando o wxWidgets'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115749848016163753</id><published>2006-09-05T19:55:00.001-03:00</published><updated>2006-11-13T19:30:55.955-03:00</updated><title type='text'>Windows Vista</title><content type='html'>Estava eu curioso para ver o sucessor do Windows XP, o &lt;a href="http://www.microsoft.com/windowsvista/default.aspx"&gt;Vista&lt;/a&gt;. Então, abri o &lt;a href="http://www.amule.org"&gt;aMule&lt;/a&gt; e fiz uma busca. Baixei o DVD do Windows Vista beta 2 e instalei em um computador com a seguinte configuração de hardware:&lt;br /&gt;&lt;br /&gt;Pentium 4 HT 3.0 GHz&lt;br /&gt;512 MB de memória RAM&lt;br /&gt;Plca de vídeo on-board&lt;br /&gt;HD de 80 GB (não lembro a marca)&lt;br /&gt;Placa de rede on-board SiS&lt;br /&gt;Placa de rede off-board D-Link AirPlus G+ (rede sem-fio)&lt;br /&gt;&lt;br /&gt;Comecei a instalação. Concordo que o novo instalador está realmente bonito, isso me deixou mais ansioso pra ver a cara do novo Windows.&lt;br /&gt;&lt;br /&gt;Ao final da instalação, os tambores batiam enquanto o Windows Vista carregava nesse computador. Efetuei logon e entrei no sistema. Papel de parede bonito...&lt;br /&gt;&lt;br /&gt;Bem, logo de cara pude perceber que a nova barra de tarefas do Windows Vista parece o painél do &lt;a href="http://www.kde.org"&gt;KDE&lt;/a&gt;, o botão "Iniciar" virou um círculo preto com o logotipo do Windows (estilo o menu K). As bordas das janelas parecem ter sido inspiradas nos inúmeros temas existentes para o &lt;a href="http://www.gnome.org"&gt;GNOME&lt;/a&gt; e KDE. Os botões parecem com os do &lt;a href="http://www.apple.com/macosx/leopard/index.html"&gt;Mac&lt;/a&gt; e a cara do Windows Explorer me lembrou uma mistura de &lt;a href="http://www.gnome.org/projects/nautilus/screenshots.html"&gt;Nautilus&lt;/a&gt; (GNOME) com &lt;a href="http://www.kde.org/screenshots/images/3.5/04-konqueror-multipurpose.png"&gt;Konqueror&lt;/a&gt; (KDE) - não falando do tema, mas da organização das coisas.&lt;br /&gt;&lt;br /&gt;Ora, mas ficou bonito!!! Isso é que importa. Mais importante que essa beleza toda (que eu já havia saboreado no Linux) é minha memória RAM. Esse Vista é um ladrão! Basta efetuar logon no sistema para consumir 380 MB (inserimos um pen drive USB e o consumo de memória subiu pra 400 MB).&lt;br /&gt;&lt;br /&gt;Pra quem gosta de jogar paciência, campo minado e aqueles joguinhos do Windows, sugestão: compre uma placa 3D. Ao abrir Paciência, ele me avisou que eu não tenho placa aceleradora 3D, portanto, o jogo poderia ficar lento... e ficou (e como!!!). Ah! Se você pretende ver vídeos no seu Vista, compre uma placa 3D também, pois sem ela o Media Player nem abre o vídeo (pelo menos não abriu nessa on-board).&lt;br /&gt;&lt;br /&gt;Bem, o novo KDE 3.5 &lt;a href="http://www.kde.org/screenshots/images/3.5/02-systeminfo.png"&gt;roda suavemente em um laptop Pentium III 600 MHz com 312 MB de RAM&lt;/a&gt; e é mais bonito que o Windows Vista.&lt;br /&gt;&lt;br /&gt;Não escrevi esse post pra esculhambar a Microsoft, mas acho que ela poderia ter feito um trabalho melhor. E não falo de interface gráfica bonita, mas de programação eficiente que não sugue tantos recursos da máquina. Minha opinião é que esse tipo de coisa é proposital, pra alavancar o consumo de hardwares caros.&lt;br /&gt;&lt;br /&gt;Pelo menos o &lt;a href="http://www.justsoft.com.br"&gt;WinPolicy&lt;/a&gt; rodou sem problemas no Windows Vista. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115749848016163753?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115749848016163753/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115749848016163753' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115749848016163753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115749848016163753'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/09/windows-vista_05.html' title='Windows Vista'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115715222650851769</id><published>2006-09-01T19:56:00.000-03:00</published><updated>2006-11-13T19:30:55.755-03:00</updated><title type='text'>Curso de wxWidgets em C++</title><content type='html'>Olá, pessoal.&lt;br /&gt;&lt;br /&gt;Decidi finalmente começar meu curso de &lt;a href="http://www.wxwidgets.org/"&gt;wxWidgets&lt;/a&gt; através do meu blog. Eu já vinha idealizando ele desde o meu primeiro dia de blogueiro. É um tipo de "Aprenda você mesmo wxWidgets em x posts" (o "x" significa que não sei em qual post vou parar). O objetivo é ensinar como fazer bons softwares com interfaces gráficas usando C++.&lt;br /&gt;&lt;br /&gt;Muita gente pensa que programar em C e C++ é extremamente complicado. A culpa é da &lt;a href="http://msdn.microsoft.com/"&gt;API do Windows&lt;/a&gt;! Realmente ela é um pouco chata de aprender, pelo menos esta é minha opinião. Aí, infelizmente, as pessoas tendem a correr pro &lt;a href="http://java.sun.com"&gt;Java&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;OBSERVAÇÃO: A partir deste ponto, é necessário avisar que no percurso deste curso, e provavelmente em alguns outros posts do meu blog, você verá frases e afirmações não muito amigáveis à esta linguagem. Não tenho nada contra Java, até conheço um pouco da linguagem (não tanto quanto C e C++), mas faço isso porque gosto de pirraçar programadores Java, é meu esporte favorito.&lt;br /&gt;&lt;br /&gt;Voltando ao curso, minha tarefa aqui é resgatar as pobres almas perdidas no mundo do Java, Delphi, Visual Basic e outros, trazendo-as pro lado do C/C++. Você vai aprender que programar com interfaces gráficas em C++ usando wxWidgets é ainda mais fácil que programar em Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"O que eu NÃO vou aprender?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Processos de desenvolvimento de software, documentação, análise, etc. Bem, provavelmente eu fale um pouco sobre essas coisas, mas não vou entrar em detalhes. O objetivo do curso é o wxWidgets no C++.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"O que é preciso para estudar através deste curso?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bem, se você já souber C e C++, já é o suficiente. Mas se você sabe pouco ou nada sobre estas linguagens, não se desespere! Existe um curso on-line de C da UFMG em &lt;a href="http://ead1.eee.ufmg.br/cursos/C/"&gt;http://ead1.eee.ufmg.br/cursos/C/&lt;/a&gt; . Mas é bom lembrar que você precisa saber pelo menos o básico de orientação a objetos em C++, já que o wxWidgets é orientado a objetos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Que bom! Quais serão os tópicos estudados?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Não tenho um cronograma fixo para seguir, mas pretendo começar da seguinte forma:&lt;br /&gt;&lt;br /&gt;- Introdução a wxWidgets, como configurar, instalar e usar;&lt;br /&gt;- "Hello, world" em wxWidgets;&lt;br /&gt;- E aí vamos nos infiltrando nas outras classes da Framework...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referências bibliográficas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para dúvidas de C++, uso o livro "C++: Como Programar" de Deitel. Para dúvidas sobre o wxWidgets, uso a documentação on-line no endereço &lt;a href="http://www.wxwidgets.org/"&gt;http://www.wxwidgets.org/&lt;/a&gt;&lt;br /&gt;Mais uma vez, recomendo o &lt;a href="http://ead1.eee.ufmg.br/cursos/C/"&gt;curso de C da UFMG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Outros detalhes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tentarei escrever um post por semana, isso vai dar tempo para os visitantes estudarem o post e para que eu possa preparar o próximo ("tentarei", porque preciso dividir meu tempo com outras coisas, inclusive o lazer). Cada post também terá um código de exemplo do assunto abordado e os visitantes poderão deixar comentários, podendo tirar dúvidas com outros visitantes ou comigo mesmo, ou até mesmo sugerir alguma coisa.&lt;br /&gt;&lt;br /&gt;Então, espero que isso dê certo. Além de divulgar o conhecimento, pretendo também melhorar o meu próprio conhecimento. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115715222650851769?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115715222650851769/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115715222650851769' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115715222650851769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115715222650851769'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/09/curso-de-wxwidgets-em-c.html' title='Curso de wxWidgets em C++'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115609214061763900</id><published>2006-08-20T13:26:00.000-03:00</published><updated>2006-11-13T19:30:55.666-03:00</updated><title type='text'>Produtividade na programação (ou no desenvolvimento de softwares)</title><content type='html'>Quem está no curso de Ciência da Computação da &lt;a href="http://www.uesc.br/"&gt;UESC&lt;/a&gt; sabe dos últimos e-mails que rolaram na lista de discussão dos alunos, sobre a utilização de ferramentas RAD para criar interfaces gráficas em C++. Um dos colegas do curso defendeu o uso de ferramentas RAD nesta etapa do desenvolvimento.&lt;br /&gt;&lt;br /&gt;Bem, ele defende veementemente qualquer ferramenta que se propôe a facilitar e agilizar alguma etapa do desenvolvimento de um software, mas acho que ele esquece de analisar se essa ferramenta não vai acabar atrapalhando e atrasando etapas posteriores do desenvolvimento, resultando em um projeto mais demorado do qual se não fosse utilizada tal ferramenta.&lt;br /&gt;&lt;br /&gt;Eu dei minha contribuição na lista de discussão. Argumentei que nem sempre agilizar uma etapa agiliza o todo. Como a discussão era sobre criação de interfaces gráficas, também argumentei que essa etapa do desenvolvimento leva pouco tempo e que se feita corretamente, o tempo dela pode se tornar desprezível em relação ao todo.&lt;br /&gt;&lt;br /&gt;O e-mail que eu postei na lista de discussão está abaixo. Ele vai ser o post de hoje do meu blog:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"A conversa sobre usar ou não uma ferramenta RAD pra criar interfaces gráficas me fez pensar sobre produtividade na programação. Então, vou expôr o que eu pensei e o que eu acho sobre isso.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;As empresas estão atrás de produtividade. É verdade, claro. E também é verdade que devemos ser produtivos, para assim termos um emprego, ganhar dinheiro e nos manter, sempre pensando em ter algo mais pra entretenimento e futilidades extras. "Mas Just é um cara tão GNU!! Como pode dizer isso??" Ora, eu também gosto de dinheiro :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Entrando na conversa de programação, não adianta muito fazer as janelas (ou outras interfaces gráficas) bem rapidamente. O cara abre a IDE, desenha tudo rapidinho e depois vem a pergunta: "E agora? O que eu faço?" É preciso programar! Escrever código, claro!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Aí entram as grandes empresas. Essas sim precisam ser muito produtivas e rápidas. Como já foi discutido na lista antes e continuou sendo essa semana, empresas grandes e importantes exigem experiência. Bem, um programador experiênte consegue criar uma interface gráfica na mão tão &lt;/span&gt;&lt;span style="font-style: italic;"&gt;rapidamente quanto usando uma IDE RAD. E ainda, criar a interface na mão pode fazer o desenvolvimento se tornar mais rápido por um todo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;O que eu quero dizer, é que se você desenha a interface com uma IDE RAD, ela fica pronta rapidamente, mas dá trabalho pra fazer algumas alterações. Se você faz via código, dependendo da sua experiência na framework e na linguagem utilizada, você cria a janela tão rapidamente quanto se usasse uma IDE RAD. E ainda, se quiser fazer alterações futuras, fica bem simples. É só adicionar uma linha, ou alterar outra, e por ai vai.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Mas ainda não acabei. Acrescento ainda, que durante todo o processo de desenvolvimento de um software, a interface gráfica pode ser algo em torno de 10% do projeto total. Vou citar como exemplo o &lt;a href="http://www.justsoft.com.br/winpolicy/"&gt;WinPolicy&lt;/a&gt; (todo mundo já deve tá de saco cheio dele :P). Fiz as interfaces dele via &lt;/span&gt;&lt;span style="font-style: italic;"&gt;código (aproveitei essa etapa pra aprender &lt;a href="http://www.wxwidgets.org/"&gt;wxWidgets&lt;/a&gt;, hoje eu criaria a mesma interface muito mais rápido que antes). Depois de fazer as interfaces, foi só programação das funcionalidades. Lancei a versão 3.0. Adicionava algum recurso, corrigia bugs, 3.0.1, 3.0.2, 3.1, 3.1.1, 3.1.2 &lt;/span&gt;&lt;span style="font-style: italic;"&gt;e agora está em 3.1.3. Quer dizer, a criação da interface gráfica tomou em torno de 10% do tempo e do código do software inteiro. O importante é programar bem pra fazer o resto com velocidade e qualidade.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Citando outro exemplo, estou terminando um outro projeto. Como já sabia mais de wxWidgets, a interface gráfica foi um tapa! Depois disso, fui implementando as funções do software. Essa semana terminei a versão beta. Pretendo lançar ele em breve.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Concluindo: não viagem nessa de querer uma ferramenta que faça tudo pra vocês, ou então a única experiência que vocês vão ter vai ser em clicar nos botões de uma ferramenta específica. No dia que ela cair em desuso, lascou-se! Se você aprende a programar bem, você não fica dependente de &lt;/span&gt;&lt;span style="font-style: italic;"&gt;ferramenta. Além disso, essa experiência vai ajudar muito pra aprender outras linguagens e frameworks."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Explicando um pouco mais, acho melhor aprender a programar bem do que usar uma ferramenta bem. Se você entende bem a programação e o uso das frameworks, caso seja preciso aprender outra linguagem ou framework, vai ficar mais fácil do que se treinar em uma nova ferramenta de "clique-e-arraste".&lt;br /&gt;&lt;br /&gt;Estão aí meus argumentos. Acredito estar correto. Espero receber comentários sobre o assunto. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115609214061763900?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115609214061763900/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115609214061763900' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115609214061763900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115609214061763900'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/08/produtividade-na-programao-ou-no.html' title='Produtividade na programação (ou no desenvolvimento de softwares)'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115473155165248057</id><published>2006-08-04T19:32:00.000-03:00</published><updated>2006-11-13T19:30:55.572-03:00</updated><title type='text'>Backports (Debian)</title><content type='html'>Todo usuário do &lt;a href="http://www.debian.org"&gt;Debian&lt;/a&gt; sarge deve ter um problema em comum: apesar do sistema ser realmente estável, alguns softwares estão bastante desatualizados. Exemplos:&lt;br /&gt;&lt;br /&gt;- Firefox 1.0.4&lt;br /&gt;- Thunderbird 1.0.2&lt;br /&gt;- OpenOffice.org 1.1.3&lt;br /&gt;- Gaim 1.2.1&lt;br /&gt;- e por aí vai...&lt;br /&gt;&lt;br /&gt;Existe a opção de você não utilizar os pacotes Debian desses softwares e baixar o fonte no site oficial e compilar. Mas qual a graça de usar Debian sem o apt?&lt;br /&gt;&lt;br /&gt;Essa semana, enquanto pesquisava sobre como instalar o &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; no Debian sarge (ele tem pacotes no testing e no unstable, mas não no stable), encontrei um site chamado &lt;a href="http://www.backports.org/"&gt;Debian Backports&lt;/a&gt;, que fornece os pacotes do Debian testing (alguns do unstable), compilados com as libs do stable (sarge). E lá estava o libcatalyst-perl, que é do testing, mas preparado para o sarge :)&lt;br /&gt;&lt;br /&gt;O Backports funciona assim: você inclui o repositório deles em &lt;span style="font-family: courier new;"&gt;/etc/apt/sources.list&lt;/span&gt; e pode instalar os pacotes mais recentes com o apt-get:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;deb http://www.backports.org/debian/ sarge-backports main contrib non-free&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois é preciso adicionar essas linhas em &lt;span style="font-family: courier new;"&gt;/etc/apt/preferences&lt;/span&gt; (isso vai desativar os pacotes do Backports e fazer o apt usar os pacotes do sarge como padrão):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Package: *&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;Pin: release a=sarge-backports&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;Pin-Priority: 200&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para instalar um pacote que está no Backports:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# apt-get update&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;# apt-get -t sarge-backports install mutt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto. Seja feliz no Debian sarge! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115473155165248057?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115473155165248057/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115473155165248057' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115473155165248057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115473155165248057'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/08/backports-debian.html' title='Backports (Debian)'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115395582568878492</id><published>2006-07-26T19:54:00.000-03:00</published><updated>2006-11-13T19:30:55.482-03:00</updated><title type='text'>OpenOffice.org 2 no Debian sarge (stable)</title><content type='html'>Como os usuários &lt;a href="http://www.debian.org"&gt;Debian&lt;/a&gt; sabem, a versão do &lt;a href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; no Debian sarge (stable) é a 1.1.3, a versão 2 só está presente no etch (testing) e no sid (unstable).&lt;br /&gt;&lt;br /&gt;Porém, eu decidi fazer um downgrade. Usava o Debian etch em casa, e decidi voltar para o sarge. Porque? Porque alguns pacotes sempre faltam nas versões testing do Debian, além de eu desconfiar que o atual X.Org do testing está com o desempenho um pouco abalado e que algumas fontes estão estranhas (paranóia minha).&lt;br /&gt;&lt;br /&gt;Eu sempre sentia um pouco de vontade de voltar pro sarge, mas duas coisas me impediam, na verdade, a falta delas: o OpenOffice.org do sarge é o 1.1.3 e o Firefox é o 1.0.4.&lt;br /&gt;&lt;br /&gt;Bem, o Firefox eu posso baixar a versão mais nova no site oficial e instalar. O OpenOffice.org também... mas como muitos devem ter notado, o antigo instalador standalone do OpenOffice.org sumiu!!! Agora são apenas RPMs... que droga... e eles não dão pacotes .deb.&lt;br /&gt;&lt;br /&gt;Mas nem tudo está perdido. Descobri recentemente que o &lt;a href="http://www.openoffice.org.br"&gt;site brasileiro do OpenOffice.org&lt;/a&gt; fornece pacotes .deb (que bom!). E mesmo que você decida usar os pacotes oficiais (RPM), isso é possível com uma ferramenta chamada alien, um conversor de "quase qualquer coisa" para ".deb". E antes que eu me esqueça (e você também):&lt;br /&gt;&lt;br /&gt;# apt-get install alien&lt;br /&gt;&lt;br /&gt;Então, se você baixar o BrOffice, basta descompactar o arquivo e fazer:&lt;br /&gt;&lt;br /&gt;# dpkg -i *.deb&lt;br /&gt;&lt;br /&gt;Mas se você prefere a versão oficial em inglês, descompacte o arquivo baixado e entre no diretório criado por ele. Lá dentro, você verá um diretório chamado "RPMS", "cd nele". Agora, vamos ao alien:&lt;br /&gt;&lt;br /&gt;# alien *.rpm&lt;br /&gt;&lt;br /&gt;Os RPMs irão se transformar em .deb. Após isso:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# dpkg -i *.deb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto! OpenOffice.org 2 instaldo no Debian sarge. Mas isso é muito simples, ainda não está digno de um post no meu blog. Vamos ao problema!&lt;br /&gt;&lt;br /&gt;Se seu Debian sarge estiver atualizado, após instalar o OpenOffice.org, tente abrir o Impress. Tentou? Acho que você levou um belo CRASH! Ele simplesmente fecha e abre o Writer. E se você fizer alguma coisa mais elaborada no Writer, ele também fecha.&lt;br /&gt;&lt;br /&gt;"Qual o problema?", você me pergunta. Após passar uma noite de ódio com esse problema (eu tava querendo fazer um trabalho pra Universidade), acabei descobrindo após fuçar no &lt;a href="http://www.google.com"&gt;oráculo&lt;/a&gt;. O OpenOffice.org 2 está conflitando com a versão 2.1.7-2.5 do libfreetype6. A solução é fazer um downgrade para a versão 2.1.7-2.4.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# apt-get install libfreetype6=2.1.7-2.4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, tente abrir o Impress e verá que ele funciona. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115395582568878492?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115395582568878492/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115395582568878492' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115395582568878492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115395582568878492'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/07/openofficeorg-2-no-debian-sarge-stable.html' title='OpenOffice.org 2 no Debian sarge (stable)'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115326755152517828</id><published>2006-07-18T20:42:00.000-03:00</published><updated>2006-11-13T19:30:55.395-03:00</updated><title type='text'>Emulando PCs</title><content type='html'>Trabalho no desenvolvimento de uma distribuição Linux personalizada no &lt;a href="http://www.cepedi.org.br"&gt;CEPEDI&lt;/a&gt;. No entanto, preciso testar o programa de instalação de várias formas. Já pensou, sempre que mudar alguma coisa no instalador, ter que regravar o CD-RW e dar boot em um PC? Por isso uso o QEMU, um emulador de PC pra Linux.&lt;br /&gt;&lt;br /&gt;Alguns já usaram o VMware (eu nunca). Mas o VMware é um software pra Windows (não sei se possui versão pra outros SOs) e custa uma graninha. O QEMU é gratuito por ser OpenSource e sua utilização é muito fácil.&lt;br /&gt;&lt;br /&gt;O site oficial é &lt;a href="http://fabrice.bellard.free.fr/qemu/"&gt;http://fabrice.bellard.free.fr/qemu/&lt;/a&gt;, mas se você usa Debian:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# apt-get install qemu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recomendo instalar também o kqemu, ou QEMU Accelerator. É um módulo do kernel que acelera o desempenho do QEMU. Ele tenta rodar a maioria dos códigos dos aplicativos do sistema do PC emulado diretamente no seu processador. Não existe pacote no repositório Debian oficial, você vai ter que compilar na mão.&lt;br /&gt;&lt;br /&gt;Após instalado o QEMU, sua utilização é fácil. Você pode até criar uma imagem de disco (um HD em um arquivo):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# qemu-img create meu_hd.img 1024M&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esse comando cria um arquivo de 1 GB pra servir de imagem. Feito isso, coloque um CD de qualquer SO no seu drive de CD e execute o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# qemu -hda meu_hd.img -cdrom /dev/cdrom -boot d&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ele vai emular um PC cujo HD é seu arquivo de imagem, o CD-ROM é seu drive e vai dar boot pelo CD. Alguns argumentos mais comuns:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-hda                              O /dev/hda do seu PC virtual&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;-hda, -hdc e -hdd   Similar ao -hda&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-cdrom              Seu drive de CD-ROM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-floppy                         Seu drive de disquete&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-boot [a|c|d]            Boot pelo disquete (a), HD (c) ou CD-ROM (d)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-m tamanho                   Memória RAM do PC virtual&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-k pt-br                       Teclado ABNT2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No site do QEMU, a documentação completa mostra outros argumentos de linha de comando.&lt;br /&gt;&lt;br /&gt;Eu usei o QEMU em casa pra emular o Windows 98 e testar o WinPolicy. Funcionou bem:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2318/3342/1600/7winpolicy.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/2318/3342/320/7winpolicy.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115326755152517828?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115326755152517828/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115326755152517828' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115326755152517828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115326755152517828'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/07/emulando-pcs.html' title='Emulando PCs'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115301812789713085</id><published>2006-07-15T23:40:00.000-03:00</published><updated>2006-11-13T19:30:55.300-03:00</updated><title type='text'>Novo site da Justsoft</title><content type='html'>Não tinha nada de interessante pra postar hoje, então resolvi falar do que fiquei fazendo a tarde toda: mudando o site da &lt;a href="http://www.justsoft.com.br"&gt;Justsoft&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Está parecido com o antigo, as poucas diferenças são a família das fontes, que agora é "Tahoma, Verdana, sans-serif", a barra superior e algumas imagens que coloquei na página.&lt;br /&gt;&lt;br /&gt;Na barra superior agora tem uma imagem relevante aos computadores, também passei o logotipo pro lado esquerdo - o lado mais emotivo do cérebro fica à direita, assim, as imagens à esquerda ficam gravadas no lado direito do cérebro e as pessoas tendem a lembrar melhor do logotipo dessa forma. Na página de &lt;a href="http://www.justsoft.com.br/winpolicy/download.shtml"&gt;download do WinPolicy&lt;/a&gt;, coloquei uma figurinha que achei bem legal.&lt;br /&gt;&lt;br /&gt;As imagens foram tiradas do &lt;a href="http://www.alamy.com"&gt;Alamy&lt;/a&gt;, um site que distribui imagens. Você pode baixá-las gratuitamente (as Royalty-Free) ou comprá-las. A diferença das gratuitas para as compradas é a resolução e tamanho, além de que algumas não possuem versão gratuita.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115301812789713085?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115301812789713085/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115301812789713085' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115301812789713085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115301812789713085'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/07/novo-site-da-justsoft.html' title='Novo site da Justsoft'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115292704326459296</id><published>2006-07-14T22:11:00.000-03:00</published><updated>2006-11-13T19:30:55.206-03:00</updated><title type='text'>Kororaa - XGL em Live!</title><content type='html'>Pra quem viu vídeos do &lt;a href="http://www.novell.com/linux/xglrelease/"&gt;Novell XGL&lt;/a&gt;, gostou, mas ainda não o viu pessoalmente (meu caso), o Kororaa te ajuda.&lt;br /&gt;&lt;br /&gt;Foi Cesar Lawinsky, formado em Computação na UESC, que me falou que estava testando o XGL. Então perguntei se ele tinha compilado o fonte, mas ele disse que tava usando uma distribuição live que já vinha com o XGL. Essa distribuição é o Kororaa. Fui ao &lt;a href="http://www.google.com"&gt;oráculo&lt;/a&gt; e encontrei o site oficial: &lt;a href="http://kororaa.org/"&gt;http://kororaa.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De acordo com o próprio site, o Kororaa é uma versão binária do &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt;, com algumas coisas a mais. O Kororaa não-live não vem com o XGL pré-configurado, apenas a versão XGL Live CD o possui. O endereço do download desta versão é &lt;a href="http://kororaa.org/static.php?page=static060318-181203"&gt;http://kororaa.org/static.php?page=static060318-181203&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Screenshots? Mas é claro! &lt;a href="http://www.tuxmachines.org/gallery/korxgl2"&gt;http://www.tuxmachines.org/gallery/korxgl2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ainda não experimentei ele pessoalmente porque não tenho placa de vídeo "das boas" em casa. A minha é uma Savage on-board. :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115292704326459296?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115292704326459296/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115292704326459296' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115292704326459296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115292704326459296'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/07/kororaa-xgl-em-live.html' title='Kororaa - XGL em Live!'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115283464588693325</id><published>2006-07-13T20:41:00.000-03:00</published><updated>2006-11-13T19:30:55.079-03:00</updated><title type='text'>uptimed</title><content type='html'>Se você administra um servidor Linux, BSD ou outro UNIX-like, com certeza você dá uma olhadinha no uptime da máquina de vez em quando. Pois bem, existe uma forma de registrar os maiores uptimes do seu servidor e consultar o ranking a qualquer hora, com um software chamado "uptimed".&lt;br /&gt;&lt;br /&gt;Após instalar o uptimed, ele vai registrar o uptime da sua máquina e o horário do boot. Se ela for reiniciada, esse registro fica salvo e um novo registro é criado. Após um certo tempo e alguns reboots, você pode usar o programa "uprecords" para ver a lista dos maiores uptimes da sua máquina. Veja um exemplo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://download.freshmeat.net/screenshots/10979.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://download.freshmeat.net/screenshots/10979.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se você usa Debian, basta digitar o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;# apt-get install uptimed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Caso não, baixe o programa no endereço &lt;a href="http://freshmeat.net/projects/uptimed/"&gt;http://freshmeat.net/projects/uptimed/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115283464588693325?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115283464588693325/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115283464588693325' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115283464588693325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115283464588693325'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/07/uptimed.html' title='uptimed'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31041182.post-115274231946260563</id><published>2006-07-12T18:55:00.000-03:00</published><updated>2006-11-13T19:30:54.959-03:00</updated><title type='text'>Começando</title><content type='html'>Olá, pessoal! :)&lt;br /&gt;&lt;br /&gt;Também criei um blog, incentivado por &lt;a href="http://jhennykelly.blogspot.com/"&gt;Jhenny&lt;/a&gt;, que também já tem o seu.&lt;br /&gt;&lt;br /&gt;Aqui pretendo interagir com outras pessoas interessadas em programação em C/C++ (talvez Perl também), sistemas UNIX-like e computação em geral. Provavelmente, C/C++ será o tópico mais discutido (minhas linguagens favoritas).&lt;br /&gt;&lt;br /&gt;Mas, quem sou eu?&lt;br /&gt;&lt;br /&gt;Atualmente sou estudante de Ciência da Computação na &lt;a href="http://www.uesc.br"&gt;Universidade Estadual de Santa Cruz&lt;/a&gt;, em Ilhéus, BA. Já havia cursado cinco semestres de Bacharelado em Física na &lt;a href="http://www.uefs.br"&gt;Universidade Estadual de Feira de Santana&lt;/a&gt; (também na Bahia) e três semestres de Sistemas de Informação na &lt;a href="http://www.ftc.br"&gt;Faculdade de Tecnologia e Ciências de Feira de Santana&lt;/a&gt;. Cursei Física simplesmente por gostar do assunto, mas minha vontade era cursar Computação, por isso entrei no curso de Sistemas de Informação, mas não gostei muito, era muita administração e pouca Computação. Então fui pra Ciência da Computação e me encontrei na academia. Também havia tentado Ciência da Computação na &lt;a href="http://www.ufpe.br"&gt;Universidade Federal de Pernambuco&lt;/a&gt;, mas não consegui sobreviver à segunda fase das provas. :P&lt;br /&gt;&lt;br /&gt;Além de estudar, sou administrador de Redes do &lt;a href="http://www.cepedi.org.br"&gt;CEPEDI&lt;/a&gt; (Centro de Pesquisa e Desenvolvimento em Informática e Eletro-eletrônica de Ilhéus), antigamente era programador. Também tenho uma empresa na Incubadora de Empresas de Base Tecnológica de Ilhéus, a &lt;a href="http://www.justsoft.com.br"&gt;Justsoft&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pela Justsoft, desenvolvi o &lt;a href="http://www.justsoft.com.br/winpolicy"&gt;WinPolicy&lt;/a&gt;, um software para gerenciamento de políticas de segurança do Windows. Minha empresa também trabalha com desenvolvimento de distribuições Linux personalizadas e softwares para gerenciamento de redes e estações de trabalho.&lt;br /&gt;&lt;br /&gt;Pois bem, profissionalmente sou isso aí. Em breve começarei a postar textos sobre programação, UNIX, etc, como havia dito logo acima. :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31041182-115274231946260563?l=jpjust.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpjust.blogspot.com/feeds/115274231946260563/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31041182&amp;postID=115274231946260563' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115274231946260563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31041182/posts/default/115274231946260563'/><link rel='alternate' type='text/html' href='http://jpjust.blogspot.com/2006/07/comeando.html' title='Começando'/><author><name>João Paulo Just</name><uri>http://www.blogger.com/profile/02131542435207897103</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_5DNwUFk6stg/SQI6b1SK42I/AAAAAAAAAB4/1PyAJRAKCvA/S220/webcam6.jpg'/></author><thr:total>4</thr:total></entry></feed>
