Conheça o Presentta - Nando Vieira
Ano passado, depois de muito prorrogar, decidi dar uma olhada em Node.js. Muita gente falando bem, rodar JavaScript do lado do servidor seria, no mínimo, interessante.
Como tudo que começo a aprender, gosto de definir alguns objetivos. Caso contrário, a coisa fica muito chata. Então decidi escrever um chat, exemplo clássico de "Hello World" do Node.js.
Depois de alguns minutos, com o chat rodando, pensei que seria legal fazer uma plataforma de e-learning, apenas por diversão. Obviamente que se desse para usar para ganhar dinheiro, seria um tanto quanto melhor.
Em menos de uma semana eu já tinha um protótipo bastante funcional. Mostrei para algumas pessoas que acharam a implementação muito boa. Mostrei, inclusive, um demo na lightning talk da RubyConf Brasil 2010. O produto, se é que posso chamá-lo assim, é bastante simples como você pode conferir à seguir.
A primeira versão era feita totalmente em Node.js, inclusive a parte de renderização de templates. Embora funcione, o Node.js não é feito para isso. O Node.js foi feito para criar aplicações de rede com conexões persistentes, assíncronas e não-bloqueantes. É assim que o Ryan Dahl, criador do Node.js, gosta de descrevê-lo.
Então, em uma madrugada, reescrevi toda a interface web usando Rails 3, que na época ainda estava em beta. Foi muito tranquilo fazer a interface web, já que era basicamente páginas com formulários.
Inicialmente, usei a interface JSON do CouchDB. Mas, depois de pensar um pouco, decidi utilizar o próprio MySQL para armazenar os dados. Depois, através de uma API, distribuia os dados no formato JSON.
Desde o começo, minha ideia foi utilizar apenas WebSocket. Isso iria restringir o acesso ao Google Chrome, Safari, Opera 11 e Firefox 4. Depois que a Mozilla e Opera voltaram atrás no suporte ao WebSocket, apenas as duas primeiras opções estariam disponíveis no final. Felizmente, o Chrome está disponível em todas as plataformas, o que miniza o impacto. Sim, eu sei que existem soluções como o Socket.IO e Faye, mas quis ir pelo caminho mais simples. Um dia, talvez, eu reveja isso.
Apenas uma coisa utiliza Flash em toda a plataforma: o streaming de audio e video. De resto, tudo é feito com JavaScript, HTML e CSS.
A parte de Node.js foi, sem dúvida, a mais divertida de fazer. Como eu já conhecia JavaScript, foi apenas uma questão de aprender a API do Node.js. Como ela é extremamente simples, não perdi muito tempo.
Para carregar os dados, acesso uma API que criei no Rails, que me retorna quem são os participantes, informações sobre os slides, qual módulo está ativo (codebox, screensharing, slide), armazenando tudo em memória mesmo. Como o uso da plataforma é muito pontual, eu levanto o servidor Node.js manualmente, executando um comando antes de iniciar a apresentação.
A única dependência que tenho no Node.js é a lib que uso para responder ao WebSocket. Uso basicamente a API disponibilizada pelo Node.js, com algumas extensões que criei.
Media Server e Slides
Uma plataforma de e-learning sem audio, não serve para muita coisa. Eu já conhecia e tinha usado o Flash Media Server, mas por ser uma solução paga e extremamente cara, fui procurar alternativas. Já conhecia o Red5, que nunca consegui fazer funcionar.
Depois de muito procurar, encontrei uma solução feita em Erlang chamada Erlyvideo. Embora não tenha nenhuma documentação, foi a melhor solução OSS que encontrei. Tive que desenferrujar minhas habilidades de ActionScript, que há anos não usava, e consegui fazer o que precisa depois de algumas poucas horas.
Para completar, precisaria exportar os slides da apresentação como imagens, para poder apresentar no cliente. Isso foi facilmente resolvido com o ImageMagick, que com uma extensão permite converter PDF em PNGs.
Meu servidor, gentilmente cedido pela Locaweb e pelo Rafael Rosa Fu, foi um caso à parte. Rodando na nova plataforma de Cloud Computing, um Ubuntu com 3GB de RAM e 2 CPUs, consegui servir, sem problema nenhum, todas as 70 pessoas que ficaram conectadas simultaneamente no primeiro workshop que dei. Ainda tive a vantagem de ter um servidor no Brasil, não disperdiçando aqueles preciosos milisegundos que você perde por ter um servidor hospedado no exterior.
Não é porque faço parte da Locaweb e do time de Cloud Computing, mas posso dizer, por experiência real, que este serviço possui um nível de qualidade acima da média e que recomendo de olhos fechados.
Uma semana antes de eu entrar de férias, quando eu iria apresentar o workshop, decidi fazer uma apresentação rápida sobre Ruby 1.9, a mesma palestra que falei no finado RSLA 2009. Foi a melhor coisa que fiz!
Descobri alguns bugs que eu não tinha previsto, fiz algumas melhorias na aplicação, alterações na interface… enfim, serviu como um teste real da aplicação.
Se eu puder dar apenas um conselho, que seja este: teste sua aplicação o quanto antes em uma situação real, com pessoas que tem interesse no seu produto e que irão contribuir positivamente, dando opiniões que podem ser realmente consideradas.
O primeiro workshop, que foi sobre Ruby Metaprogramming, teve mais de 70 inscritos. Eu mesmo não acreditei na quantidade de pessoas que se interessou. Tive alguns problemas durante o workshop, claro, mas que foram resolvidos muito rapidamente.
Eu já abri mais alguns workshops, utilizando uma versão melhorada deste protótipo. Você pode saber mais no site howtocode.com.br.
Se você não teve a chance de ver minha ferramenta ainda, gravei um video que mostra como funciona. Este video não é tão legal quanto o uso real, mas dá para ter uma ideia. Sua dimensão também foi diminuída, para que o tamanho do arquivo não ficasse tão grande.