LSI-TEC abre vagas para programadores

February 25, 2008 · Posted in Bla Bla Bla, C/C++, Linux · Comment 

O LSI-TEC, lado empresa do internacionalmente renomado Laboratório de Sitemas Integráveis da USP, está à procura de talentos para atuar no desenvolvimento de projetos relacionados a TV Digital.

Requisitos:

  • Linguagens C, C++ ou Java;
  • Linux para sitemas embarcados;
  • Subversion;
  • Autotools;

Local:
Universidade de São Paulo – Campus Cidade Universitária

Os interessados podem encaminhar seus currículos para:
Hilel Becher <hilel@lsi.usp.br>

Laboratório de Sistemas Integráveis Tecnológico
Laboratório de Sistemas Integráveis

Migrando o blog de servidor

February 23, 2008 · Posted in Blog, MySQL · Comment 

Aproveitando que o blog passou por dificuldades técnicas, resolvi mudá-lo de servidor e de quebra atualizar a versão do Wordpress.

Os detalhes para a atualização do Wordpress podem variar de versão para versão e podem ser encontrados no próprio site.

Eu poderia utilizar as opções de import/export do próprio Wordpress, mas um dos problemas com o provedor antigo, era que eu não estava conseguindo acessar a área administrativa do blog. Sem fazer um único upload sequer, do nada eu não tinha mais como logar no blog, e a resposta que eu obtive do provedor foi:

“…entre em contato com os desenvolvedores do Wordpress…”

Resolvi então entrar em contato com um concorrente e migrar na unha…

Os passsos que eu utilizei foram bem simples, e seguem abaixo:

Contratando o novo provedor

Fiz umas buscas na internet, consultei amigos, e no final foi só preencher um formulário, informar o número do cartão de crédito e aguardar a confirmação do pagamento.

Backup

Enquanto eu aguardava pela confirmação do novo provedor, fui fazendo backup do blog. Como eu tinha muito “lixo” instalado, decidi fazer apenas o backup da base de dados com os posts, e utilizar uma versão limpinha do Wordpress.

Para o backup do MySQL eu utilizei uma de suas ferramentas de linha de comando o mysqldump. Uma das características mais legais (na minha opinião) do mysql e suas ferramentas, é a possibilidade de utilizá-las remotamente. Isso já salvou a minha pele algumas vezes nas épocas de SysAdmin.

O comando foi bem simples:

user@host:~$ mysqldump --host=my.old.mysqlserver 
             --user=myuser --password 
             --databases myblogdatabase > mybkp.sql

–host=my.old.mysqlserver: Conecte-se no host onde está o meu banco MySQL.
–user=myuser: Utilize este usuário para a conexão.
–password: Pergunte a senha num prompt. Caso eu quisesse informar a senha diretamente, poderia ter feito –password=mypass.
–databases myblogdatabase: Faça um dump de todas as tabelas da base de dados ‘myblogdatabase’, utilizada pelo meu blog.
> mybkp.sql: Redirecione a saída para um arquivo.

O mysqldump gera todo o SQL necessário para recriar a base de dados no mesmo estado em que ela se encontrava.

Restaurando os dados

No início do arquivo de dump tem a referência à base de dados antiga. Caso a nova base de dados tenha um nome diferente é preciso editar o arquivo de dump. Isso pode ser feito com o comando sed:

user@host:~$ sed s/`olddatabase`/`newdatabase`/ mybkp.sql > mynewbkp.sql

A restauração é bem simples, utilizando o prompt do mysql:

user@host:~$ mysql --host=my.new.mysqlserver --user=myuser --password
mysql> use newdatabase;
mysql> . mynewbkp.sql

Com isso logamos, entramos na nova base, ainda vazia, e executaamos o arquivo com o dump cheio de instruções SQL para recriar as tabelas e os dados da base antiga dentro da nova.

Atualizando o Wordpress

Atualização do Wordpress segue os passos básicos da instalação: baixar, descompactar, mover o conteúdo para o local desejado e editar o arquivo wp-config.php.

Por fim, com o browser, executamos o arquivo

http://my.blog.root.path/bla/bla/bla/wp-admin/upgrade.php

E pronto!!! Você vai receber uma senha aleatória para o usuário admin e é só logar.

Configurando o Wordpress

Quando o provedor fornece o serviço, normalmente ele fornece duas formas para você acessar os recursos do site. Uma delas é a forma padrão que utiliza o seu domínio como endereço, já a outra fornece o mesmo recurso como uma url estranha. Hoje eu descobri o porquê disso: enquanto o DNS estava apontado para o provedor antigo, eu acessava a url estranha no provedor novo, sem interferir no (mal)funcionamento do site antigo.

Depois do Wordpres instalado, qualquer tentativa de acesso ao conteúdo, redirecionava para o blog antigo. Aí eu lembrei que existem duas opções para configurar a url no blog. Bastava saber onde isso estava no banco de dados. Seguindo a lógica dos nomes das tabelas, cheguei na tabela wp_options.

Utilizando a ferramenta gráfica MySQL Query Browser, alterei os campos ‘option_value’ que correspondiam aos campos ‘option_name’ das opções ’siteurl’ e ‘home’ para aquela url estranha, e passei a utlizá-la durante a migração, enquanto instalava plugins e temas. Depois de tudo pronto, alterei o DNS e por fim restaurei os valores originais nas opções. Isso em linha de comando ficaria assim:

mysql> select * from wp_options limit 1;
+-----------+---------+-------------+-------------------------+----------+
| option_id | blog_id | option_name | option_value            | autoload |
+-----------+---------+-------------+-------------------------+----------+
|         1 |       0 | siteurl     | http://mydomain.com/etc | yes      |
+-----------+---------+-------------+-------------------------+----------+
1 row in set (0.00 sec)
 
mysql> select * from wp_options where option_value = 'http://mydomain.com/etc';
+-----------+---------+-------------+-------------------------+----------+
| option_id | blog_id | option_name | option_value            | autoload |
+-----------+---------+-------------+-------------------------+----------+
|         1 |       0 | siteurl     | http://mydomain.com/etc | yes      |
|        40 |       0 | home        | http://mydomain.com/etc | yes      |
+-----------+---------+-------------+-------------------------+----------+
2 rows in set (0.00 sec)
 
mysql> update wp_options set option_value = 'http://url.estranha.com/etc' 
       where option_value = 'http://mydomain.com/etc';
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2  Changed: 2  Warnings: 0
 
mysql>

O primeiro comando SQL foi pra saber quais os campos da tabela, o segundo para buscar quais as opções que possuiam a mesma url e o terceiro, finalmente para atualizar. Depois disso, o blog já passa a apontar para o endereço de trabalho correto, e a volta pode ser feita através do site normalmente.

Conclusão

Migrar um blog na unha não é a melhor opção, uma vez que você corre o risco de perder todos os dados. Eu só consegui realizar esse feito, porque conheço um pouco do funcionamento do Wordpress e das ferramentas ao redor. Ainda assim, tive meus momentos de suspense. Apesar de manter em casa um backup separado dos posts, eu não tinha como guardar os comentários e opções em geral. De certa forma foi bom para eu ficar esperto e ir fazendo meus backups semanais do site.

Patxi!!!!!!!!!!!

February 18, 2008 · Posted in Eventos · 15 Comments 

Como diversos blogs já noticiaram como foi o dia a dia do Campus Party Brasil, ficaria redundante se eu fizesse o mesmo. Na verdade, não fiz porque não pude, e é o motivo pelo qual não pude, que eu vou contar aqui.

Atendendo ao apelo do agora grande amigo Gustavo Gonzales, publicado no br-linux, aproveitei que estava de “férias” e resolvi me candidatar a uma vaga de voluntário para trabalhar no Campus Party. Eu já participo voluntariamente de projetos de software livre, mas comparecer fisicamente seria a primeira vez.

Entrei em contato, mandei currículo (era para voluntários de nível técnico), e na segunda feira de carnaval, recebi um email pedindo para comparecer no prédio da Bienal no Ibirapuera na terça-feira à tarde.

Chegando lá, fui apresentado ao Polkan (Colômbia) e ao Pablo e Samira (Espanha), que seriam nossos coordenadores. Conhecemos o lugar onde seria o evento e combinamos de estar lá no dia seguinte. Eles esperavam uns 30 voluntários, e lá estavam os numerosos 2. Eu e o agora também grande amigo, Franci.

Voltamos para casa com a missão de encontrar mais voluntários até o dia seguinte. Apesar de todas as circunstâncias apontarem para o contrário, consegui o apoio do meu amigão Geraldo. Muito contente com isso, liguei para um amigo de infância, Fernando, no Rio de Janeiro, e o convenci a vir pra São Paulo pra ser voluntário. Ele que está sempre disposto a ajudar pagou do prórpio bolso e veio só pra ser voluntário. Isso me dixou tão contente que liguei pra minha namorada, Luciana, no Espírito Santo, e a convenci a pegar um avião vir pra cá.

Quarta Feira de Cinzas – 06/02/2008

Eu e Geraldo buscamos o Fernando na rodoviária pela manhã, guardamos as malas, tomamos café numa padoca aqui perto e fomos para o Ibirapuera. Chegando lá, encontramos o Franci junto com o Thiago e Patrícia (novos corajosos) e fomos ao trabalho. Missão: desembolar e prender nas mesas mais de 50 km de cabos de rede (isso mesmo, 50 mil metros de cabo de rede!!!). No entando, o maior desafio era entender o que os coordenadores queriam. O enigma de Babel, foi resolvido com um three-way handshake: Eles falavam pausadamente em espanhol, nós respondíamos pausadamente em português, e fazíamos o tira-teima em inglês. Moleza!

Ao final do dia buscamos a Luciana no aeroporto e fomos todos dormir exaustos de tanto prender cabo.

Quinta Feira – 07/02/2008

Antes da TempestadeNão apareceu mais nenhum voluntário. Éramos seis pra fazer o trabalho de trinta. Fizemos um pacto silencioso de dar o máximo para garantir que a infraestrutura da rede ficaria pronta à tempo. Utilizamos os macetes aprendidos no dia anterior e coordenamos uma equipe do banco de apoio para terminar de prender os cabos. Fomos testar os mais de 5 mil conectores RJ-45. Neste dia, começamos a perder a noção do tempo. Qualquer relato a partir daqui pode estar com a linha de tempo corrompida. Ao nosso alcance estavam três verbos: comer, dormir, trabalhar. A nota do dia foi a idéia de comprarmos aquelas luvas de pedreiro. Elas salvaram nossas mãos de programadores :)

Sexta Feira – 08/02/2008

Desde o primeiro dia vimos que o idioma seria uma dificuldade, mas não um impedimento. Aprendemos que mais importante do que dar e/ou receber ordens, era entender e ser entendido.

Continuamos a testar conectores, e ao final do dia, mais de dois mil metros de fibra ótica deveriam ser lançados e cuidadosamente protegidos sob pesadas e mofadas canaletas de madeira. Metade da fibra foi lançada. A data limite estava chegando. Tensão por todos os lados. Não podíamos falhar. Nos comprometemos com isso.

Depois de muita insistência, o Fernando convenceu o Pablo a sair com a gente para um bate-papo informal, em potuñolish, claro!!!

Sábado – 09/02/2008

Ninho de MafagafosQuatro horas de sono depois da sexta, passamos a manhã posicionando as canaletas para proteger a primeira metade de fibra lançada na sexta, e isso deu um trabalho danado. O grande problema para lançar o restante da fibra, era que ela tinha que ser lançada num momento em que não houvesse trânsito de pessoas, pois uma pisada poderia danificá-la. Ela tinha que ser delicadamente lançada e protegida, ou todo o trabalho poderia ser comprometido. Esse momento só chegou no fim da tarde, e com menos gente dando pitaco, conseguimos lançar o restante da fibra muitíssimo mais rápido. Mesmo assim, varamos a noite lançando fibra. Ponto pra Luciana, que após um anônimo transformar o maço inicial de fibras num ninho de mafagafos, desembolou e organizou todos, um a um, agilizando muitíssimo a retirada dos mesmos após o evento.

Domingo – 10/02/2008

JantarTestes, correções, ajustes e equipamentos ligados. Tudo deveria estar funcionando não importasse o esforço. O evento começaria no dia seguinte. Trabalhamos até uma hora dessas onde o sol já dormia faz tempo. Fomos comunicados do nosso turno de trabalho durante o evento. Trabalharíamos os seis das 23:00hs até as 07:00hs do dia seguinte. Os outros turnos seriam garantidos pelo pessoal da Fundação Vanzolini, carinhosamente rebatizada durante o evento, pelos campuseiros, de Fundação [não, eu não vou escrever isso aqui!!!].

Fomos para casa com um único objetivo em mente: dormir. E foi a única coisa que fizemos durante o dia seguinte inteiro.

Segunda – 11/02/2008, O Grande Dia

Antes de ser atropelado pela manada de ReporterontesChegamos no evento um pouco antes da abertura oficial. Tive a honra de ser atropelado e quase pisoteado por uma manada de Reporterontes que acompanhavam freneticamente o nosso Ministro da Cultura. Creio que rinocerontes teriam sido mais polidos. Ao contrário deles, o ministro foi simpático e educado. Um exemplo a ser seguido.

 

Abertura do Campus PArty Brasil 2008

A partir daí, trabalhávamos à noite e tentávamos aproveitar o evento de dia. Dormir? “Dormir é para os fracos!” E isso causou espanto aos nossos amigos colombianos: “Os brasileiros não são humanos!”, palavras deles…

 

 

Cobertura Tradicional:

Segunda Feira, Terça Feira, Quarta Feira, Quinta Feira, Sexta Feira

 

Os Pontos Negativos

Apesar de prometido durante a inscrição, não houve alimentação alternativa para quem tinha restrições alimentares. Para mim a comida estava legal, mas os vários vegetarianos reclamavam com razão porque quase tudo tinha carne, e recebiam um sorriso de deboche como resposta. Eu vi. Lamentável. O pior é que o único lugar que vendia comida lá dentro cobrava uma fortuna. Obrigando os participantes a sair do parque para comer um sanduíche, e ficarem barrados pela segurança depois. Que vergonha!!!

Sobras de brindes sendo recolhidas, com conteúdo descartado à esquerdaO Troféu “Mico da Semana” vai para uma empresa de telecomunicações, principal patrocinadora do evento, que ao contrário de todas as outras empresas no evento, se negou a presentear os voluntários com uma mochila cheia de propaganda. O mais ridículo foi a desculpa:

“Voluntários não têm direito de ganhar mochilas. As mochilas são para os inscritos pagantes.”

Ok, ok, elas devem estar contadas, certo? Errado. As várias que sobraram foram recolhidas no domingo à tarde. Pára tudo. Eu me candidatei como voluntário, trouxe amigos de longe, tirando do nosso próprio bolso, para ajudar a montar uma infraestrutura de rede que foi propaganda para essa mesma empresa. Aí eu ouço que eu não tenho “direito” de ganhar um brinde. Em primeiro lugar nós fomos voluntários. Fomos lá de boa vontade. Sem cobrar nada. Sem esperar nada em troca. Aí numa hora de folga, eu me posiciono como potencial cliente dessa mesma empresa e pelo fato de ter no crachá escrito “Assistência Técnica”, significando que eu passei a madrugada ajudando a garantir que outros potenciais clientes utilizarem a rede dessa mesma empresa, não tenho “direito” de ter acesso ao material de marketing dessa mesma empresa? Não é meio paradoxal?

O ponto aqui não é a questão de eu querer um brinde. A questão é que eu como potencial cliente fui completamente ignorado só porque trabalhava no evento. Na constituição isso tem o nome de discriminação. De certo eu não vou passar fome por não receber um brinde que não custou mais que R$ 10,00, tão pouco me interessa carregar uma mochila verde fazendo propaganda de graça, já que eu uso uma Targus que me atende muito bem. O ponto é que já que essa tal empresa foi a principal beneficiada com o evento, eu me senti usado, principalmente por ter trabalhado de graça para o bem dela. Por essas e outras, deixei de ser seu cliente ano passado, e não me arrependo.

Essa é da boa: Sexta Feira, voltamos para casa para pegar as malas da Luciana, que voltaria para o Espírito Santo na madrugada de sábado. Acabamos chegando ao Ibirapuera depois da meia-noite. Ao tentar entrar pelo portão 3 como de costume, fomos barrados pela segurança do parque, que alegava ter recebido ordens de não deixar ninguém entrar. Eles se recusavam a chamar a organização, sendo bastante irônicos e desrespeitosos. Detalhe: todos os barrados estavam devidamente credenciados e com crachá do evento, e mais, fora as pessoas que estavam lá para trabalhar, todos os outros (umas quinze pessoas) vinham de cidades distantes e pagaram pra dormir nas barracas do evento. Seriam impedidos de entrar para dormir. Haviam até estrangeiros impedidos de entrar para dormir. Tivemos dificuldade para falar com a organização por telefone, pois os celulares não funcionavam bem dentro do prédio. Resultado: ficamos duas horas barrados no portão, até que um campuseiro veio acompanhar uma moça até a saída e se interou do assunto. Rapidamente ele correu até a assistência técnica e avisou nossos companheiros. Quinze minutos depois apareceu uma “mágica” ordem para deixar todos entrarem. A pé. O carro ficou barrado do lado de fora do parque até conversarmos com a organização (que disse não saber de ordem alguma), e mandarem novamente liberar a entrada, agora do carro.

Outra da boa: Voluntário é multado por se atrazar cinco minutos para trocar o bilhete azul do estacionamento. Veja bem: o cara sai de casa, vai para o Ibirapuera trabalhar de graça na boa vontade, compra um talão inteiro de bilhete azul e é multado por estar trabalhando de graça e se atrazar cinco minutos para renovar o bilhete que já estava pago. Sem direito a reclamar. Voluntário não tem direito a estacionamento… É mole?

Festa Alternativa: Aula de Axé. Fala sério, ninguém merece!!! Em plena madrugada!!! O pior é que teve público!!! E tanto público que teve DUAS edições…

Não conseguir uma foto com o Mad Dog. Até a Luciana conseguiu! :(

Pontos Positivos

Radar Saber M60A maior inovação tecnológica já apresentada Microsoft em um evento: Com uma banda de 5.5Gbps disponível, ela leva ao evento o incrível e inédito cd de instalação do MSN. Como eu consegui viver até agora sem isso?

O nível das palestras em que estive presente (sem dormir :) ) creio eu, estava de acordo com o foco do evento.

A animação da galera. PATXI!!!!!!!!!!!

A Presença do Mad Dog.

Ver o nosso velho amiguinho Radar Saber M60 do Exército Brasileiro.

A Palestra do Marcos Pontes. Sinceramente, uma das mais fantásticas que eu já vi. Ele faz a gente se sentir orgulhoso de nós mesmos, de nossos esforços. Só mesmo ouvindo e vendo os olhos dele brilhando ao falar do significado de representar o país em algo único. Não dá pra descrever com palavras. Foi o único palestrante a ser aplaudido de pé por vários minutos. Essa foi uma experiência daquelas que dinheiro nenhum paga.

Creio que o maior ponto positivo foi ter a oportunidade de trocar experiências com pessoas de outros países. Fizemos grandes amigos que vão ficar para sempre. Aprendemos entre outras coisas, que o idioma nunca será uma barreira enquanto existir respeito e boa vontade. A responsabilidade, a amizade e o comprometimento, são capazes de nos levar a fazer coisas que normalmente consideramos impossíveis. Não falávamos português, não falávamos inglês, não falávamos espanhol. Falávamos algo que era suficiente para desenvolver a sinergia que nos levou a atingir nossos objetivos.

O mais importante de tudo foi que apesar de normalmente não trabalharmos com infraestrutura de rede e suporte, nós nos divertimos bastante. Mesmo virando a noite na Assistência Técnica, mesmo quase não dormindo nada por duas semanas. O que a gente levou pra casa do Campus Party foi um tesouro muito mais precioso que o ouro. Nenhum dinheiro paga isso.

“Aguarde um momento, por favor”

Eu não poderia deixar de citar o Gustavo, que veio da Colômbia sem falar português, apenas com um dicionário de bolso. No primeiro dia eu confesso que olhei e pensei “dicionário na mão? mas isso não é só em filme?” Uma semana depois o cara estava falando português quase que fluentemente. Não me venham com o papo de que espanhol é parecido com português, o cara estava falando português de verdade! Ele insistiu até conseguir. Notável. O engraçado era ouvir dele “Aguarde um momento, por favor”, frase dita toda vez que ele ia pesquisar alguma palavra no dicionário.

Finalizando

Depois das 14:00 hs do domingo, desmontamos todo o equipamento e recolhemos as fibras. Desfazer é muito mais fácil que fazer…

À noite, ainda levamos os nossos amigos estrangeiros para o Encontro Social da São Paulo Perl Mongers que varou madrugada.

Agradeço a todos que trabalharam com a gente e deram seu suor para que o Campus Party Brasil fosse um sucesso.

Algumas fotos dos bastidores podem ser conferidas neste link.

Iniciando no QT, parte II – Sinais, Slots e Timers

February 1, 2008 · Posted in C/C++, Qt · 6 Comments 

Neste post vou seguindo com a brincadeira de fazer pequenos tutoriais sobre o QT para iniciantes. Desta vez vou mostrar como criar nossos próprios sinais e slots e como manipular um timer.

O código fonte pode ser encontrado neste link.

O programa de exemplo será um cronômetro que vai utilizar a classe QTimer, uma das principais classes do QT, e vai mostrar o tempo utilizando um display estilo LCD de calculadora com a classe QLCDNumber.

QT e os Timers

O suporte mais básico a timers no QT é disponibilizado pela classe QObject, que fornece os métodos QObject::startTimer() e QObject::killTimer(). O primeiro método retorna um ID único de timer e o segundo finaliza o timer através desse ID.

Para que isso funcione, no entanto, o trecho de código que utiliza esse mecanismo precisa estar dentro de um “event loop”. A partir do momento que o timer for iniciado ele de tempos em tempos (timeout) faz com que a aplicação dispate um QTimerEvent, que interrompe o fluxo normal do programa até que o evento seja processado.

O tempo máximo de timeout não é delimitado, sendo possível criar timers com timeout de anos, porém, o tempo mínimo pode variar de sistema para sistema. No windows Vista o timer mínimo é de 10 ms enquanto no Linux 2.6.x isso é configurável (o default é 4 ms). O QT vai tentar entregar todos os eventos, conforme pedidos, mas caso o sistema não permita ele vai descartar os “excedentes”.

Timers também podem ser utilizados em threads, porém deve-se respeitar a condição de estar dentro de um event loop. Threads merecem um artigo à parte, como sempre…

A classe QTimer implementa timers de mais alto nível, possibilitando algumas funcionalidades. Uma delas é o QTimer::singleShot(), que dispara um evento uma única vez.

Leia a extensa e repetitiva documentação, é chato, mas acredite, vai te poupar de muita QDorDeCabeca…

Mais sobre Sinais e Slots

Sinais e slots são utilizados para comunicação entre objetos, sendo uma das peças fundamentais do QT. Nesse sistema ao invés de se implementar callbacks para tratar eventos, utiliza-se o conceito de conectar sinais a slots, tornando a programação mais intuitiva.

Os sinais e slots são métodos de classe que são tratados pelo Meta-Object Compiler (moc) antes do código fonte ser compilado. Eles têm declarações especiais que não são parte do padrão C++, por isso o moc fazum parsing e gera o código fonte compilável.

Ao executar o comando moc sobre qualquer classe que implemente sinais e slots, uma certa quantidade de código fonte é gerada. Com o uso do programa qmake, a chamada ao programa moc fica a cargo do Makefile, tornando-a transparente para o programador.

Para que uma classe possa implementar sinais e slots, ela precisa ter acesso ao Meta-Object System. Por isso ela deve herdar da classe QObject ou suas subclasses, e precisa ter a macro Q_OBJECT na sua área de declaração privada. Terminados os preparativos, sinais são declarados em uma seção “signals:” e slots em seções “[public|protected|private] slots:“.

Um slot, depois de declarado, é então definido como qualquer outro método comum, podendo ser explicitamente chamado como qualquer outro. Já os sinais, são um pouco mais delicados, e são apenas declarados e jamais definidos pelo programador. A razão? Esta mensagem no final da tentativa de compilação:

tmp/moc_mydisplay.o: In function `MyDisplay::signalPlay()':
~/stopwatch/tmp/moc_mydisplay.cpp:89: multiple definition of `MyDisplay::signalPlay()'
tmp/mydisplay.o:~/stopwatch/mydisplay.cpp:169: first defined here
collect2: ld returned 1 exit status
make: ** [stopwatch] Erro 1

Dentro do arquivo moc_mydisplay.cpp é gerado o seguinte código:

// SIGNAL 0
void MyDisplay::signalPlay()
{
    QMetaObject::activate(this, &staticMetaObject, 0, 0);
}

Sim, o moc gera a definição dos sinais com chamadas a meta-métodos do QT. Portanto, definir o corpo de um sinal é ilegal no QT e vai gerar um erro de compilação por redefinição de método. Deixe que o moc cuida da implementação do sinal pra você.

Conecte-se

Não adianta apenas definir sinais e slots. É preciso definir como eles vão interagir. A maneira de fazer isso é conectando-os através do método connect() presente em todo herdeiro de QObject. Isso fará o moc implementar o sinal de forma que uma chamada a ele resulte numa chamada ao(s) slot(s) conectado(s), com os mesmos parâmetros.

Dependendo da forma de conexão, um sinal pode até retornar o mesmo valor que o último slot chamado retornar. Note que isso não é muito seguro para sinais conectados a vários slots, pois, nada garante a ordem de chamada.

Um dado sinal pode ser conectado a um segundo sinal diretamente. Um emit() no primeiro sinal é então equivalente a um emit() no segundo sinal, visto que após a etapa de criação dos mocs, a chamada ao primeiro resulta na chamada ao segundo, que resulta na chamada de outro método conectado e assim sucessivamente.

Formas de conexão

Existem basicamente três formas de conectar sinais e slots e se não usadas adequadamente podem ser fonte de bugs terrivelmente difíceis de se descobrir. Essas formas de conexão são passadas como parâmetros extras para o método connect(). São elas:

Conexão Direta: O slot é chamado imediatamente ao sinal ter sido emitido, na thread onde o sinal foi emitido. Isso funciona como uma chamada direta ao slot.

Conexão Enfileirada: O sinal é emitido e a chamada ao slot vai para uma lista interna do QT, e o sinal retorna imediatamente, independentemente do slot ter sido chamado ou não. O evente loop vai então processando essa lista e só mais tarde o slot será invocado na thread onde o objeto do slot reside.

Conexão Automática: Este é o tipo default, utilizado quando não se especifica o tipo de conexão. É uma das “Sementes do Mal”, pois apresenta dois comportamentos distintos: se o sinal e o slot residirem em uma mesma thread, funciona como conexão direta, mas caso contrário, funciona como conexão enfileirada.

Conexão enfileirada Bloqueante: Ué!? não eram só três? Well, essa é uma das vantagens de ler esse artigo: te salva de documentação inconsitente! Essa conexão é semelhante à conexão enfileirada, exceto pelo fato de que a thread do sinal fica bloqueada até o sinal ser devidamente executado. Note que só deve se utilizada com muito cuidado, e para sinais e slots em threads diferentes. O mal uso disso poderá causar deadlocks. Você vai saber quando vir algo assim:

user@host:~/stopwatch$ ./stopwatch
Qt: Dead lock detected while activating a BlockingQueuedConnection: Sender is
QPushButton(0x807e2d8), receiver is MyDisplay(0x8076ac0)

Para sanar as dúvidas a respeito do que significa a expressão “thread onde um objeto reside” consulte a documentação do QT arespeito de threads.

Tome sempre muito cuidado com sinais, slots, timers e threads. Esses são recursos fundamentais do QT, mas o seu mal uso pode acarretar em bugs extremamente difíceis de serem localizados. Consulte toda a documentação à respeito.

Descendo à fonte

O nosso exemplo se compões de duas classes MyDisplay e StopWatch e um arquivo main comum. O main apenas cria uma QApplication e um objeto StopWatch. A classe MyDisplay cuida da parte visual do programa, consistindo em um diálogo com botões e um display no estilo LCD. A classe StopWatch vai criar um widget de display e implementar o timer. Note que essa arquitetura não é a mais elegente, sendo mais interessante fazer a classe StopWatch herdar de MyDisplay. Porém, isso estragaria a brincadeira praticamente eliminando a necessidade do uso de sinais e slots.

O uso de sinais e slots fica mais claro quando queremos que objetos se comuniquem com o seu exterior. Em geral, as classes não conhecem o que há fora delas. Passar ponteiros de objetos externos para dentro delas, fere o encapsulamento e torna o código menos genérico. Em nosso exemplo, o uso mais interessante para sinais e slots é para o objeto myDisplay (interno a StopWatch) comunicar eventos de/para o objeto stopwatch (externo a Mydisplay), sem que para isso se perca em generalidade ou encapsulamento.

Com a ajuda do QT Designer (num outro artigo eu falarei dele), criei o diálogo, botões e LCD. Depois simplifiquei o código para se adequar aos nossos propósitos. Como myDisplay herda de QDialog e este herda indiretamente de QObject, para usarmos sinais e slots bastou acrescentar a macro Q_OBJECT na seção privada da declaração da classe. Após isso, acrescentei entre outros auxiliares, os métodos:

public slots:
    void slotDisplayValue( long );
 
private slots:
    void slotPlay();
    void slotStop();
 
signals:
    void signalPlay();
    void signalPause();
    void signalStop();
    void signalReset();

Os sinais comunicarão ao exterior os eventos relacionados aos cliques nos botões. Já os slots privados farão um pré-processamento interno, enquanto o público receberá o valor de ticks vindo do timer externo. Dessa forma a classe envia informações ao exterior e recebe informações de fora, sem conhecer o que está do outro lado. A boa e velha interface por contrato.

public slots:
    void slotPlay();
    void slotPause();
    void slotStop();
    void slotReset();
 
private slots:
    void slotTick();
 
signals:
    void signalTicks( long );

Análoga e inversamente a classe StopWatch implementa os slots que receberão os sinais da classe MyDisplay, e declara o sinal que enviará informações para o seu slot público.

Ela também implementa um QTimer que vai disparar a cada 10 milissegundos (para que os nosso amigos lerdinhos do Vista possam acompanhar!), incrementando um contador. Esse contador é enviado de volta ao display que o formata e exibe.

O cronômetro pode ser parado, pausado e reiniciado a qualquer momento, clicando nos botões correspondentes.

Os Finalmentes

O exemplo em si não tem muito código, mas ilustra o uso mais básico de timers e a construção de sinais e slots customizados. Uma atenção toda especial, no entanto, deve ser dada aos detalhes que envolvem o uso desses recursos, pois eles podem se tornar armadilhas letais.

Links importantes

Sinais e Slots
QTimer
Threads no QT
Documentação on-line do QT