sexta-feira, 27 de abril de 2007

Too much nerd, I guess!

I am nerdier than 100% of all people. Are you nerdier? Click here to find out!Na semana passada fui promovido a Alpha Geek mor pelo amigo Érico. Hoje, enquanto dava uma sapeada pelo Rec6, reencontrei o Christiano Anderson, um colega dos tempos áureos do Debian-RS, mas que agora está radicado no sudeste do país, e acabei caindo num teste para nerds... :-D

É apenas uma brincadeira, eu sei, um formulário sem nenhuma base científica e eu já imaginava que iria ficar na faixa dos que seriam considerados nerds. Mesmo assim confesso que o resultado me deixou um tanto quanto preocupado. A tela final exibiu a imagem acima e a mesma frase previamente relatada pelo Christiano:

All hail the monstrous nerd. You are by far the SUPREME NERD GOD!!!
Porém, o que mais chamou a minha atenção foram estas três pequenas afirmações:
0% scored higher (more nerdy),
0% scored the same, and
100% scored lower (less nerdy).

Isso só pode significar uma coisa:

  1. poucas pessoas fizeram o teste e ninguém ainda tinha chegado nos 100%;
  2. o processamento do resultado tem algum bug e não registra os 100% corretamente;
  3. definitivamente, há algo de errado comigo... :-P

Eu acredito seriamente na segunda opção, mas deixo a palavra final com os estimados leitores... :-)

Leia mais...

quinta-feira, 26 de abril de 2007

Gutsy, Kernel, Thunderbird, Lost, WPC

O site de pacotes do Ubuntu ainda não lista o Gutsy Gibbon, a próxima versão do sistema operacional da Canonical, mas o seu desenvolvimento já está a pleno vapor. Inicialmente foi reconstruído o toolchain e o repositório ficou congelado por cerca de dois dias. Porém, desde a tarde de hoje, diversos pacotes já estão resincronizados com os seus correspondentes a partir do Debian.

Nos próximos dias deveremos ter também o novo kernel do Linux, que ainda nem esfriou. O mesmo deve ocorrer com o Thunderbird 2, que por si só já apresenta uma série de novidades, mas que com a última versão do Lightning e uma extensão adicional pode sincronizar bidirecionalmente os seus calendários com o Google Calendar.

Enquanto isso, na última madrugada e boa parte da manhã de hoje, os servidores de BitTorrent usados pela EZTV ficaram bastante congestionados, gerando dezenas de comentários e atrasando um pouco os planos de quem gostaria de estar assistindo o 18º episódio da terceira temporada de Lost na noite de hoje... 8-)

Para quem estiver procurando novos desafios, mas num estilo um pouco diferente dos tradicionais de programação, foi postando na lista da maratona um anúncio com um convite para participar das seletivas brasileiras, visando formar a equipe do Brasil no 16º World Puzzle Championship, o campeonato mundial de passatempos da WPF. Este ano o evento acontecerá pela primeira vez na América Latina e terá sede na cidade do Rio de Janeiro, no mês de Outubro.

E, claro, esse é mais um post intermediário, antes do relato da segunda parte do Insanifying, para dar um pouco mais de tempo para a organização do FISL definir a configuração do notebook e para o pessoal do Debian enviar o material que eu solicitei sobre a avaliação dos resultados dessa fase... ;-)

Atualizações

Leia mais...

quarta-feira, 25 de abril de 2007

Insanifying, Parte I

Segundo dia da competição. Os doze primeiros classificados do Qualifying foram divididos em quatro equipes, conforme a sua posição no ranking do dia anterior: 1-5-9, 2-6-10, 3-7-11 e 4-8-12. Assim, as equipes ficaram uniformemente balanceadas para os próximos dois dias de desafios.

A organização do evento contactou diferentes entidades relacionados ao mundo do Software Livre a fim de buscar auxílio para a definição dos problemas que seriam propostos durante as duas fases do Insanifying. Porém, apenas o projeto Debian topou em participar, através das presenças de Felipe Augusto van de Wiel e de Otávio Salvador.

O primeiro desafio nesse dia foi entender o que precisaria ser feito e como seria a avaliação. O Felipe e o Otávio começaram explicando que, diferente do Qualifying (quando havia um sistema de avaliação para verificar se os nossos programas geravam a saída esperada), o Insanifying teria uma avaliação mais subjetiva. Na prática, isso significaria que ao invés de apenas certo e errado, teríamos uma escala de 0 a 100 para avaliar as soluções apresentadas. Além disso, diversos critérios seriam levados em consideração:

  • legibilidade: o código segue as condutas de programação do projeto.
  • funcionalidade: verificação se a solução realmente faz o que tem de fazer.
  • desempenho: solução executa em menos tempo que as demais.
  • apresentação do grupo da solução: entrosamento do grupo, oratória e resposta de perguntas.

Em seguida, enquanto ainda estávamos agrupados em um círculo, quatro problemas foram apresentados. Além disso, nos foi dito que, ao concluir estes problemas iniciais, poderíamos resolver qualquer um dos bugs marcados como release critical do Debian. Obviamente nenhuma das equipes conseguiu resolver todos os problemas no tempo disponível... :-/

O primeiro deles era o bug #417850: trata-se de uma falha que ocorre apenas no tty1, quando a tecla Caps Lock está ativa e algumas teclas específicas são pressionadas, fazendo com que sejam exibidos caracteres minúsculos, ao invés dos correspondentes maiúsculos esperados.

O segundo problema era o bug #411585, referente ao pacote cdebconf, responsável por armazenar as respostas informadas pelo usuário durante a instalação de pacotes no sistema. Por algum motivo, os valores armazenados não eram excluídos da base de respostas ao remover as questões, fazendo com que eu uma eventual nova instalação, o valor anterior seja utilizado e não o valor definido como padrão para aquela questão específica.

O terceiro problema era referente a um bug existente no próprio sistema de triagem de bugs do projeto Debian. A página que lista os bugs para um determinado pacote contém uma opção para listar aqueles que já foram arquivados. Entretanto, mesmo quando esta opção é ativada, apenas os bugs ativos são exibidos, fazendo com que não seja possível listar os que se encontram arquivados. Mais tarde ficamos sabendo que se tratava do bug #398017.

O quarto e último problema parecia o mais assustador. O pacote parted é usado no gerenciamento de partições de discos. A tarefa consistia em implementar o suporte ao redimensionamento de partições do tipo RAW. Posteriormente também descobrimos que se tratava de um bug já reportado, o #419473.

Após o anúncio dos problemas, as equipes tinham 3 computadores a sua disposição, todos rodando o Debian 4.0, codinome Etch, que havia sido lançado uma semana antes. Era permitido o uso de notebooks, bem como quaisquer outros dispositivos eletrônicos. Também era permitido que o competidor saísse da Arena, desde que os outros dois membros da equipe permanecessem no local.

A primeira coisa que a minha equipe fez foi instalar o Gaim (que agora chama-se Pidgin) e configurá-lo para usar as nossas contas do Gmail pelo protocolo Jabber. Com isso poderíamos trocar links e outras informações mais rapidamente entre nós.

Nesse ponto também tomamos outra decisão que influenciaria no nosso trabalho colaborativo. Iríamos utilizar o serviço de documentos e planilhas do Google. A grande vantagem é que os três membros da equipe poderiam editar a documentação gerada simultaneamente, sem causar conflitos de edição. Isso também evitaria que algum crash em um dos computadores ocasionasse perda nos nossos dados.

Por incrível que pareça, nós ainda não temos a menor idéia de como foi o nosso desempenho nessa fase. A única coisa que temos consciência é que trabalhamos excessivamente no primeiro problema, cerca de 3/4 do total. O tempo passou voando e quando nos demos conta, partimos para tentar resolver o segundo e o terceiro problemas, para garantir uma pontuação mais equilibrada. Provavelmente obtemos algo próximo a pontuação máxima no segundo problema, pois identificamos o que estava gerando o comportamento indesejado e fornecemos um patch para corrigí-lo, inclusive com um teste unitário.

No terceiro, também encontramos onde possivelmente o erro era gerado, mas em função dos scripts serem escritos em Perl, aliado ao parco conhecimento da nossa equipe nessa linguagem e a complexidade para reproduzir um ambiente onde poderíamos testar o nosso progresso, acabamos não conseguindo avançar o suficiente para podermos considerar o problema como resolvido. Não chegamos a estudar o último problema, pois numa análise superficial nós o consideramos muito complexo. Mais tarde é que fomos descobrir que ele, na verdade, era rasoavelmente simples, pois já havia um patch existente e bastava formatar o disco de uma das máquinas para verificar o seu funcionamento em uma partição RAW.

Segundo a organização, a idéia inicial era que o Insanifying durasse 24 horas ininterruptas. Porém, em função de restrições impostas pela administração do local do evento, esse plano foi cancelado. Mesmo assim, e em função dos meus apelos no dia atual e anterior em relação à comida, foi providenciado pizza e refrigerante para garantir a alimentação dos competidores... :-)

No término do dia, enquanto eu ainda estava saboreando a pizza, fui entrevistado pelo pessoal da imprensa, que estava muito interessado em saber o que havia acontecido durante a primeira etapa do Insanifying.

Leia mais...

terça-feira, 24 de abril de 2007

O Google tem "A" calculadora

Provavelmente quase a totalidade dos visitantes deste blog já conheçam a calculadora do Google. O que talvez alguns não saibam é que ela é mais poderosa do que parece! :-D

Esse pérola saiu do canal de IRC do Plone na tarde de hoje:

massa da terra / resposta para a vida, o universo e tudo = 1.42242857 × 1023kg

Para dar uma pitada a mais na receita, observe o que o seguinte programa imprime na tela. Dica: não é o que parece... :-P

#include <stdio.h>
#define SIX 1 + 5
#define NINE 8 + 1

int main() {
  printf("The meaning of life: %d\n", SIX * NINE);
  return(0);
}

PS: Esse post foi apenas uma referência ao humor sarcástico de Douglas Adams, enquanto o próximo capítulo da Arena não sai do forno... ;-)

Leia mais...

quinta-feira, 19 de abril de 2007

Qualifying

É nessa hora que o bicho pega para valer! As regras dessa fase são as mesmas da já tradicional Maratona de Programação da ACM. Os competidores deveriam resolver a maior número de problemas, no menor tempo possível, cometendo o mínimo de erros.

Apenas 12 dos 29 participantes seriam classificados para a próxima etapa (lembrem-se, 11 desistiram antes mesmo de iniciar). A prova era composta por um conjunto de 6 problemas: 2 fáceis, 3 intermediários e 1 difícil. A cada problema resolvido corretamente, um balão com a cor do problema era preso ao monitor do competidor.

Alguns fatos merecem destaque. O problema A era muito fácil de ser resolvido, bastava ler doze números e imprimir a média, com arredondamento em duas casas e um caractere de fim de linha (que eu não vi que era preciso na primeira lida à jato no problema e me custou um submissão extra mais tarde...) mas o problema C era exatamente o mesmo do cara-e-coroa do warm up, com uma pequena alteração no nome das pessoas. Com isso eu consegui a façanha de ter o primeiro balão com ZERO minutos! Entretanto, acredito que isso acabou me desconcentrando e ao invés de eu partir para o próximo problema eu fiquei cuidando quanto tempo o pessoal iria levar para notar que o problema era o mesmo... :-)

Na seqüência eu parti para o A, mas deixei passar o maldito fim de linha, o que resultou em uma penalidade de dez minutos numa coisa boba. Com isso acabei caindo da primeira para a quinta posição em apenas oito minutos! :-/

O próximo escolhido foi o problema E, do jogo do bicho. Que raiva! Não posso nem lembrar! Cada linha de entrada tinha o valor da aposta, o número apostado e o número sorteado. Bastava imprimir quanto o apostador tinha ganho. Simples, muito simples. O mais demorado foi determinar a fórmula para ver se dois números pertenciam ao mesmo grupo de animais, pois tinha a pegadinha do zero fazer parte do mesmo grupo do 97-98-99 e não do 01-02-03.

Depois de queimar um pouco a mufa (e graças ao poderio do interpretador Python, que realmente me ajudou nessa hora), saiu a fórmula ótima: ((n+3) % 100)/4 ou ainda ((n-1) % 100)/4, se preferirem. As outras possibilidades de acerto foram resolvidas na base do módulo de 10, 100, 1000 e 10000, conforme o caso. Me permitam uma observação: alguns competidores resolveram o desafio acima não pela programação arte, mas sim pela programação de resultado, ou seja, adicionaram um if a mais para tratar o caso do zero e era isso, mesmo não sendo a melhor coisa a ser feita, já resolvia também. Alguns foram além, usando o método de programação ogro, muito perto do que hoje é conhecido como programação orientada a gambiarra! Onde, acreditem ou não, a solução consistia em 100 (sim, cem!) ifs, um para cada posição possível no jogo do bicho! :-D

Voltando ao meu caso, ajustadas as condições, salvo o programa, compilo, executo com a minha entrada de testes. Tudo funcionando localmente, envio e... incorrect output! Reviso todo o programa, verifico o balanceamento dos parênteses, adicionando alguns pares a mais só para garantir. Envio de novo. A resposta demora e começo a voltar minhas atenções para um novo problema.

O escolhido foi o D, que basicamente era um problema de análise das submissões de soluções para problemas de maratona (qualquer semelhança recursiva, à la GNU, não é mera coincidência!). A entrada era um inteiro com o número de submissões, seguida pela letra do problema, o tempo em questão e o resultado: correto ou incorreto. A saída deveria dizer quantos problemas foram resolvidos e o tempo total. O tempo dos problemas não resolvidos não conta e para cada erro em um problema resolvido, temos 20 minutos de penalidade.

Estou terminando a estrutura de dados do D quando chega a resposta do C. Mais um incorrect output... Largo o D de mão e dou mais uma revisada geral no código do problema C e lá se vão preciosos minutos. Cheguei a pensar que tinha enviado a última submissão sem salvar as últimas modificações. Envio ele mais uma vez e volto ao D. Estrutura do programa pronta, testo a leitura da entrada de dados. Por algum motivo escroto, não teve cristo de conseguir ler um char, um inteiro e uma string com o scanf, dava segmentation fault direto...

Saudades de Python! Saquei fora a leitura da string e substitui por um tosco gets. Agora sim, mesmo com warning do compilador, leitura dos dados com sucesso. A lógica para gerar o resultado final também não tinha nada de mais, bastava ir somando 20 quando o resultado era incorreto ou o tempo informado caso era correto, além de marcar quais problemas tinham sido respondidos. Depois era só imprimir o total de problemas corretos e a soma do tempo deles. Enviei e passou de primeira...

Olho no relógio e levo um susto, já haviam passados 2h18m! Maldito segfault e mais maldito ainda daquele problema C. Dou uma levantada, para esticar as canelas, olho para os lados e vejo pelo menos oito pessoas já com três problemas, algumas delas com quatro e outras já com cinco! A Arena havia se transformado num verdadeiro arco-íris, era balão colorido por todos os lados! Olho mais um pouco ao redor e nada de comida e muito menos de bebida. O restante da jornada se desenhava como algo trágico... :-)

Mais uma vez eu volto ao problema C. Dessa vez lendo linha a linha a descrição do problema e adicionando todos os casos limites na minha entrada de testes. Algo me chamou a atenção. O exemplo de entrada tinha um valor acima do valor máximo permitido. Mando uma clarificação (que nada mais é do que um pedido de esclarecimento feito pelo BOCA, onde a resposta fica disponível a todos os participantes). Vem a resposta, mas ela não gera a necessidade de alterar o meu código.

Troco algumas linhas e lugar, o nome das variáveis e uma e outra coisa, na esperança de eu ter encontrado algum bug no compilador ou qualquer outra coisa externa ao problema. O código resolve com exatidão todos os casos limites que eu havia especificado. Envio o problema novamente e volto minha atenção para o B. Escolhi ele pois estava na cara que o problema classificado como difícil era o E, com três páginas de especificação. Além disso, no placar daquele momento nenhum dos competidores que já haviam resolvido cinco problemas tinha feito o tal do problema E. Eu obviamente não seria o primeiro... ;-)

Começei a procurar nos meus problemas impressos algo que manipulasse strings. Achei alguns e lembrei dos famigerados strcmp e strcopy. Também encontrei exemplos de definição e uso de struts. Olho para o interpretador Python que ainda estava aberto e começo a agradecer ao Guido pelo simples fato de existir um operador de slice e de que listas e dicionários fazem parte da biblioteca padrão... :-)

Chega a resposta do C e... adivinhem? Não passou mais uma vez. O pior é que eu tinha certeza que nada poderia estar errado, afinal todos os casos limites passavam nos meus testes. Olho para a classificação e vejo que não era apenas eu quem estava com problemas naquele problema. Decidi largar de mão de vez e me dedicar ao B, afinal eu precisava de uma quarta questão resolvida, pois naquele momento eu já estava com a última ou a penúltima vaga entre as 12 disponíveis e muito possivelmente mais alguns competidores resolveriam quatro problemas.

Eis que então o fantasma do segfault voltou a me assolar... Eu lembro que na época que eu programava em C/C++ diariamente eu conseguia identificar a causa desses erros apenas passando o olho no código. Infelizmente, eu não iria readquirir esse dom durante as 5 horas de competição naquele dia... Gastei o resto do meu tempo tentando resolver isso, mas sem sucesso e já estava me conformando em ficar de fora do segundo e terceiro dias da Arena. Isso porque eu estava na posição limite de classificação e o placar congela na meia hora final. Dessa forma, apenas o próprio competidor sabe se ele acertou ou não as submissões feitas naquele período, o que acaba tornando a competição mais emocionante.

Resolvi dar mais uma arejada no cérebro e discutir com outros competidores, que estavam na mesma situação que eu, sobre o problema C. Foi quando surgiu a hipótese de ter algo a ver com a questão da precisão no valor da aposta e/ou no resultado. Eu inicialmente tinha descartado isso, afinal a aposta teria apenas duas casas decimais e o multiplicador, em caso de acerto, era sempre inteiro. Porém, contrariando o meu raciocínio, bastou mudar a variável de float para double e fazer os respectivos ajustes na leitura e escrita que o diacho do problema passou. Isso eu fiquei sabendo mais tarde, pois eram os dez minutos finais de competição e nesse período nem o próprio competidor é informado sobre o resultado da sua submissão, o que torna tudo absurdamente mais emocionante ainda! Aliás, cinco competidores tiveram o problema C resolvido nos minutos finais, depois da discussão coletiva sobre o possível problema de precisão.

Cinco horas de competição haviam passado. A organização fez um pequeno suspense, mas logo divulgou o resultado. Chegava a vez do anúncio da classificação final do qualifying. Eu tive a nítida impressão de ter gasto mais tempo brigando com a linguagem do que resolvendo os problemas propostos, mas consegui terminar essa fase em uma digna nona posição. Isso após quase ficar de fora dos doze classificados, salvo em cima da hora pelo ingrato problema C... :-)

Posteriormente também foram divulgados os arquivos de entrada/saída usados pela organização na avaliação dos problemas.

Leia mais...

quarta-feira, 18 de abril de 2007

Warm up

Finalmente chegou a hora do aquecimento. Cada participante foi convidado a sortear um número, que representaria o seu identificador no sistema. Após isso, o competidor era encaminhado a um computador e informado dos dados de login provisório e como proceder para alterar sua senha.

Em seguida a organização explicou todas as regras e como usar o sistema controle da Arena, o BOCA. Dois problemas (cujos PDFs serão enviados assim que os organizadores lerem isso...) foram disponibilizados e os participantes foram incentivados a testar todas as opções existentes, desde a submissão de respostas, acompanhamento do placar, até a solicitação de clarificação das questões.

Antes de confirmar a minha inscrição, algo me fez pensar se eu realmente gostaria de participar. O problema era que a minha linguagem preferida não estava na relação das que poderiam ser usadas para resolver os problemas. Isso me deixou preocupado, afinal eu teria que escolher entre C/C++ (que eu havia tocado pela última vez em 2000, nas competições da maratona da ACM), Pascal (que eu havia usado apenas durante as primeiras cadeiras da faculdade, em 1997/1998) e Java (que eu conheci em 1999 numa cadeira eletiva, mas odiei desde o primeiro dia que tive contato). Acabei sendo forçado a usar C/C++ mesmo, já que depois de Python é a linguagem que eu mais tive contato, mesmo fazendo anos que eu não desenvolvia nada com elas...

Pensando nisso, no dia anterior ao início do FISL eu saí para procurar uma gráfica expressa. Encontrei uma milagrosamente aberta às 21:00 ao lado do Rua da Praia Shopping. Isso claro, depois de caminhar uns 2km do hotel onde eu estava hospedado. Lá eu conheci o Marcos Backes, com o qual fiquei conversando a respeito de Lost, informática, empreendedorismo e mais uma porção de coisas, enquanto o material era processado. No total, foi impresso cerca de 50 problemas que eu resolvi na minha época de maratonista da ACM, para pelo menos ter uma base de como proceder. Foi o que me salvou, uma vez que a referência da linguagem não estava instalada nos computadores e eu não vi nenhum livro dando sopa no local. Optei por usar a IDE Anjuta, já que o meu .vimrc turbinado não pode ser usado...

Durante a manhã do primeiro dia tivemos o V Encontro da Comunidade Python/Zope/Plone, então já cheguei atrasado na Arena. Para piorar a situação, levei mais de uma hora para me reeducar e familiarizar com o processo de edição/compilação/depuração/execução dos programas em C. Para resolver o primeiro problema (um banal cara-e-coroa onde na primeira linha tínhamos um inteiro N e na linha seguinte N resultados, que poderiam ser 0, representando cara ou 1, para coroa e bastava imprimir o número de caras e de coroas) foram, desde o início do warm up, exatos 72 minutos... :-(

Confesso que nem cheguei a ler o segundo problema, pois o tempo já estava se esgotando e eu queria testar outras coisas ainda. Cheguei a pensar em deixar o desafio de lado e curtir o FISL, mas eu não iria desistir depois de ter começado...

Depois do warm up, uma pequena pausa para o almoço (um taco-burger, na correria!). Encontrei ainda o Heitor Strogulski, um mestre da minha época de graduação na UCS, que foi fundamental para o surgimento da minha empresa. Porém, naquele momento, ele aproveitou para tirar um sarro a respeito da minha performance bizonha durante o aquecimento... :-D

Atualização: atendendo a pedidos, adicionado link para o meu .vimrc.

Leia mais...

Arena

A Arena estava posicionada em um lugar de destaque no centro de exposições da FIERGS, logo na entrada, de forma que todos passassem por ela durante o evento. As paredes eram compostas por divisórias com vidro na parte superior, o que rendeu o apelido de aquário ao lugar. Na porta, uma equipe de segurança vigiava a entrada de pessoal não autorizado. Todos os competidores receberam no primeiro dia um selo para ser colado no crachá de identificação, a fim de permitir a entrada no local. No segundo dia, os 12 classificados receberam um segundo selo, com a inscrição 'finalista', também para ser colado no crachá.

Quando ocorreu a competição individual, havia muito pouco espaço nas mesas, chegando a causar um certo desconforto, afinal eram cinco ou seis computadores por mesa! Felizmente, com a diminuição do número de competidores a partir do segundo dia e a consequënte remoção dos computadores extras, esse problema não durou por muito tempo.

Ainda no primeiro dia, alguém teve a brilhante idéia de colar cartazes [1, 2, 3, 4] nos vidros onde podia-se ler: "Não alimente os programadores." numa descontraída referência ao mesmo tipo de cartaz que encontramos nos zoológicos. Também rolou uma piada no FISL, que os seguranças estariam na entrada da Arena não para evitar a entrada de pessoas de fora, mas sim para evitar que os próprios competidores fugissem correndo... :-)

Outro fato que me passou pela cabeça foi a falta de alimentação durante o qualifying, coisa que nunca aconteceu durante uma competição da ACM. Porém, após eu fazer uma solicitação durante o insanifying, o pessoal da organização prontamente correspondeu às expectativas e abasteceu a Arena com pizza e coca-cola!

Leia mais...

O processo de inscrição

Ao contrário do que muita gente pensa, a inscrição para poder participar da Arena não foi uma tarefa muito complicada. Curiosidade e um senso investigativo apurado já seriam suficientes para garantir uma vaga, como de fato foi. Das 40 vagas inicialmente alocadas, todas foram preenchidas (confira a ordem de inscrição dos participantes), mas apenas 29 inscritos se apresentaram na Arena no primeiro dia, o que me leva a crer que muitos (ok, talvez não muitos... mas pelo menos alguns...) dos 11 que conseguiram resolver o desafio da inscrição e se ausentaram, não eram programadores.

Voltando ao processo em si: no dia 31/03 a organização do FISL divulgou no endereço da Arena que as inscrições estavam abertas. Nenhuma outra informação foi divulgada até o dia 04/04, quando a primeira dica foi revelada. A partir de então, uma nova dica foi adicionada diariamente e chegamos em 11/04 com o seguinte conjunto:

  • 2007-04-04: Dica 1: "O processo de inscrição começa aqui..."
  • 2007-04-05: Dica 2: "Existe um código embutido nesta página HTML..."
  • 2007-04-06: Dica 3: "As salas do fisl importam..."
  • 2007-04-07: Dica 4: "O CMS usado no site do fisl importa..."
  • 2007-04-08: Dica 5: "Se você já sabe o que faz o código embutido e porque as salas do fisl importam então você já sabe o caminho..."
  • 2007-04-09: Dica 6: "A inicial do nome von Neumann é a letra "V"..."
  • 2007-04-10: Dica 7: "A URL desta página importa ..."
  • 2007-04-11: Dica fisl8.0: "As informações finais (último passo) para você conseguir fazer a inscrição estão em Português."

A primeira dica já dizia algo óbvio para quem participou de desafios semelhantes, como o fantástico Python Challenge: algo oculto na página daria uma pista da próxima coisa a ser feita.

A segunda dica confirmou a primeira: no fonte HTML da página haviam dois trechos codificados, no primeiro um código JavaScript e logo abaixo as cinco dicas iniciais. Ambos os trechos estavam cifrados com o famigerado ROT13 e três das cinco dicas ainda não haviam sido liberadas. O próprio trecho JavaScript era uma implementação do algoritmo ROT13 cifrado em ROT13. Isso já havia sido mencionado anteriormente pelo Hélio Castro. Durante o evento, a organização confirmou que as dicas haviam sido deixadas propositalmente no código HTML. O fato é que desde o dia 04/04 as cinco primeiras dicas já seriam conhecidas por quem decodificasse o fonte em ROT13, mas isso não resolvia o mistério.

A terceira dica foi fundamental para decifrar a charada. O fato das "salas importarem" e que logo abaixo tínhamos um link para a página com o nome dos homenageados das salas era muito suspeito. No referido link havia mais uma dica escondida no fonte HTML, antecedendo o nome das salas:

the names! THE NAMES! What are important in them?
Did you clicked on the url up above?
Get the important words and their first letters.
And hack the url, baby. Hack. 

Era uma dica direta: bastava clicar na URL acima (que remetia para a grade de programação, com as salas em uma determinada ordem) e para o nome de cada sala, na ordem apresentada, pegar a primeira letra, ou seja: bbtcdcvhh. Além disso, seria preciso hackear a URL do site (confirmado pela quarta dica). Era uma pista para juntar o fato de que o ROT13 havia sido mencionado com o fato de termos algo onde aplicá-lo. A quinta dica confirmou isso. Dessa forma, obtemos: oogpqpiuu e acessando http://fisl.softwarelivre.org/8.0/www/?q=pt-BR/oogpqpiuu é exibido as instruções para efetivar a inscrição.

Neste ponto aconteceu algo interessante: a grande maioria dos que tentaram resolver a charada estavam usando a letra N para a sala de John von Neumann, o que faz um grande sentido, afinal em português costumamos ignorar as preposições "da/de/dos" quando usamos as iniciais de nomes próprios. Porém, quem tivesse prestado atenção na grade de programação saberia que a organização deu o nome de "von Neumann" para a sala. Assim, a letra correta passa a ser o V. Isso foi enfatizado mais tarde pela sexta dica, que não estava inicialmente prevista, mas foi necessária em função do grande número de pessoas que estavam acessando a URL com o N no lugar do V, segundo a organização.

Outra dúvida recorrente foi: em qual URL deveria ser tentado o acesso? Afinal, as URLs do site e da grade de programação eram diferentes e havia ainda a possibilidade de que existissem outras URLs. A sétima dica veio para acabar com esse dilema, afirmando que a URL do site era a importante.

Uma observação importante a respeito da quarta dica, que era ambígua: ela falava sobre o Drupal, o CMS do site. Mas afinal, o que a respeito do CMS? Num primeiro momento ficou parecendo que se tratava da URL do site, onde deveria ser aplicado as iniciais com os nomes das salas. Porém, durante o período de julgamento das soluções para os problemas do segundo e terceiro dias, enquanto os finalistas aguardavam numa sala, um dos competidores comentou que o Drupal armazena internamente todos os conteúdos de forma sequencial e que ele havia baixado todos os items do site com um script, mas em função da grande quantidade de conteúdo, após uma rápida conferida, ele não havia encontrado nada de interessante. Então, enquanto eu estava escrevendo esse relato, fiz o seguinte script Python:

from urllib import urlopen
url = 'http://fisl.softwarelivre.org/8.0/www/?q=node/%s'
for n in xrange(1000):
    if 'Parab' in urlopen(url % n).read():
        print n

Surpreendentemente, entre as primeiras 1000 páginas do site, a única que possui a string 'Parab' (de 'Parabéns', que é o título da página com as instruções de inscrição) é a de número 192, então quem acessasse http://fisl.softwarelivre.org/8.0/www/?q=node/192 teria encontrado a URL para se inscrever. De qualquer forma, o mistério envolvia mesmo a questão de pegar as iniciais de cada sala e aplicar o ROT13, afinal mesmo que alguém tivesse entrado naquela página por acaso, ainda seria necessário informar ao menos 5 passos para chegar até aquele ponto.

Leia mais...

terça-feira, 17 de abril de 2007

Desmistificando a Arena de Programação

A idéia de fazer esse relato surgiu da curiosidade de amigos, da imprensa e da comunidade de software livre em saber o que afinal aconteceu durante os três dias do evento realizado em Porto Alegre, na semana passada, quando a minha equipe (Kalecser Kurtz, eu, Guilherme Silveira) terminou em primeiro lugar e cada um de nós levou um vale-notebook para casa. O notebook mesmo deve chegar nos próximos dias pelos Correios... :-)

Primeiro, cabe uma observação: tudo o que estiver contido aqui retrata a minha visão pessoal sobre o evento. Ela não deve ser interpretada com uma descrição oficial do que aconteceu na Arena de Programação Livre do FISL 8.0, afinal eu não falo em nome da organização.

Inicialmente eu queria colocar o texto no meu próprio servidor, mas depois de pensar um pouco mais a respeito do assunto e de dar uma sapeada nas opções, resolvi testar o serviço de blog do Google. Afinal, eu já uso praticamente todos os recursos que o Google oferece e eles sempre corresponderam às minhas expectativas.

Tenho que ser franco, eu acabei escrevendo muito mais do que eu planejei e dessa forma vou colocar um item por vez para ficar menos massante de ser lido. Isso também garante que os comentários serão melhor distribuídos. Então, como diria Jack, vamos por partes... :-)

Este relato será dividido nos seguintes 'capítulos':

  1. O processo de inscrição
  2. Arena
  3. Warm Up
  4. Qualifying
  5. Insanifying, Parte I
  6. Insanifying, Parte II
  7. O resultado final

Antes que me perguntem, o nome do blog reflete um pouco da minha personalidade (sim, o meu recorde de 'uptime' atual é de 42 horas) e principalmente às quatro, três e duas horas que eu dormi nos três dias durante o FISL desse ano... :-)

Atualizações

  • 19/04/07: incluído o nome dos componentes da equipe e o link para o vale-notebook.
  • 20/04/07: incluído o link para a foto da equipe campeã, logo após a premiação. Valeu Tânia! :-)

Leia mais...