sábado, 25 de fevereiro de 2012

O que ficou...


Há 12 anos estávamos eu e meus amigos de turma nos formando em Ciência da Computação na Universidade Estadual de Maringá (UEM). Em nossa colação de grau tive a honra de ser o orador geral de todos os formandos da formatura conjunta da UEM. No discurso que preparei (do qual lembro de apenas alguns trechos, infelizmente) optei por encerrá-lo adaptando um poema de Fernando Sabino. Nesse clima de nostalgia, recordo-me destas palavras:
"De tudo ficaram três coisas: 
A certeza de que estamos apenas começando,
A certeza de que é preciso continuar e
A certeza de que podemos ser interrompidos antes de terminar.
Fazer da interrupção um caminho novo,
Fazer da queda um passo de dança.
Do medo uma escada,
Do sonho uma ponte,
Da procura um encontro.
Fica a promessa do reencontro,
Fica o desejo de boa sorte,
Fica a vontade de que lutes e venças!"
Creio que são boas palavras de inspiração. É o que fica para todos nós...

Crédito da foto ao Paulo Roberto Crestani Júnior.

Utilizando o iptables ou ngninx para responder requisições na porta 80 como usuário não-root


Por questões de segurança jamais devemos permitir que serviços num servidor unix sejam executados como root. Isso permitiria que uma falha nesse serviço (e como desenvolvedores sabemos que essas falhas realmente acontecem) comprometesse todo o sistema.

Pelas mesmas restrições de segurança, não é permitido que usuários não-root escutem (realizem o bind de sockets) em portas inferiores à 1024. A questão é: como então executar um serviço (HTTP, no nosso exemplo) na porta 80 como usuário não-root?

Utilizarei o HTTP - que roda na porta 80 - como exemplo, pois provavelmente é o caso de uso mais popular. Imagino que você precise que um Tomcat, um Glassfish ou um JBoss seja executado no seu servidor. Normalmente estes serviços são inicializados na porta 8080. Apresento então duas solução possíveis:
  1. Caso você possua somente um serviço e um domínio, pode utilizar o redirecionamento através do iptables.
  2. Caso você possua vários serviços em portas diferentes e possivelmente vários domínios (virtual hosts) no mesmo servidor, utilize o nginx como proxy. (Sim, é possível fazer o mesmo com o Apache e mod_proxy ou AJP, mas o ngnix provou-se uma solução mais fácil, rápida, prática e com menor consumo de memória).
Exemplo de configuração com o iptables redirecionando as requisições na porta 80 para a 8080:

O REDIRECT de PREROUTING atende as requisições externas, e o REDIRECT de OUTPUT serve para redirecionar as requisições originadas do próprio servidor que estejam direcionadas à porta 80.

Exemplo de configuração com o ngninx atuando como proxy de requisições na porta 80 e redirecionando para a porta 8080:

Com esta configuração do ngnix, basta duplicar as linhas acima com as alterações convenientes e você pode ter dois Tomcats sendo executados no mesmo servidor nas portas 8080 e 8081, por exemplo, e redirecionar o myserver.mydomain.com para a porta 8080 e o myserver2.mydomain.com para a porta 8081. Dois virtual hosts, cada um num Tomcat diferente, no mesmo servidor.

quarta-feira, 22 de fevereiro de 2012

Spring 3.x Profiles e configurações diferentes do log4j


Uma das mais aguardadas e bem vindas novas funcionalidades do Spring Framework 3.x são os bean profiles, permitindo que você configure grupos de beans e escolha qual(is) destes grupos você deseja ativar durante o desenvolvimento, produção, teste etc. Outra boa novidade é o Java Configuration, permitindo que você configure os seus contextos do Spring utilizando somente código Java ao invés dos famigerados arquivos XML.

Nem tanto ao céu, nem tanto ao inferno. XML não é algo ruim. Bem usado, é uma ferramenta valiosa. Mas é fácil exagerar também. De antemão já adianto que o refactoring de arquivos de configuração do Spring que utilizam o Java Configuration é bem mais simples.

Algo que me incomodava no log4j era o fato dele ser configurado através de arquivos disponíveis no classpath como log4j.properties ou log4j.xml. Isso tornava trabalhoso o ato de utilizar configurações diferentes para ambientes diferentes (normalmente utilizando o maven para copiar o arquivo escolhido dependendo do profile utilizado).

Nada como a maravilha do software livre. Analisando o código-fonte, vi que utilizar arquivos de configuração do log4j diferentes para ambiente diferentes é mais simples do que eu pensava.

Com a configuração abaixo você pode utilizar dois arquivos de configuração do log4j: um para teste/desenvolvimento que imprima no console, e outro para produção que grave num rolling file e/ou envie notificações através do SNS, por exemplo.


segunda-feira, 20 de fevereiro de 2012

Notificações do log4j através do Amazon SNS

Como desenvolvedores e devops muitas vezes precisamos ser notificados de erros que ocorrem nas aplicações para podermos resolvê-los com o mínimo de downtime e transtorno possível aos nosso clientes e usuários.

Estes "erros" (condições anormais de uso) são registrados no sistema através de loggers. Se você desenvolve software e não utiliza logging, então o problema é mais embaixo. Imagino que o seu código simplesmente deixa o stacktrace das exceções "estourar" na cara do usuário. Perdoe-me, mas você não é profissional. Você finge que programa, e o pior: há quem acredite.

A mais popular implementação de logging em Java é o log4j. Normalmente além do logging para arquivo ou console do log4j, alguns desenvolvedores utilizando o SMTPAppender para enviar e-mails de notificação quando algum WARN é registrado na aplicação.

Utilizar o SNS, serviço de notificações da Amazon, é uma alternativa mais eficiente do que enviar e-mails pois:
  • Permite o baixo acoplamento entre o emissor das notificações (o logger) e seus assinantes (possivelmente os e-mails dos desenvolvedores e devops).
  • Num ambiente com vários servidores rodando a mesma aplicação seria uma situação comum em caso de erro todas estas instâncias enviarem o mesmo e-mail, lotando a caixa de e-mail dos assinantes das notificações.

Pensando nisso resolvi criar uma biblioteca (enorme: 3 classes por enquanto) que permite utilizar o SNS como Appender do log4j: https://github.com/insula/log4j-sns

Entre outras benesses está o fato dele implementar um "quiet period" padrão de 15 minutos, evitando que você receba mais de uma notificação com o mesmo stacktrace dentro do intervalo de 15 minutos.

Num ambiente de cloud computing com múltiplas instâncias de uma mesma aplicação provavelmente você desejará implementar uma assinatura HTTP para lidar com notificações repetidas ao invés de ficar recebendo o mesmo e-mail de várias instâncias diferentes. Quem sabe não vale a pena criar um serviço e disponibilizá-lo online? Já vejo múltiplas situações em que isso seria útil.

quarta-feira, 8 de fevereiro de 2012

Utilizando o Janrain com o Spring Security 3.1.x


Para quem ainda não conhece, o OpenID é um protocolo que permite que você se autentique num site/serviço utilizando as credenciais (normalmente login/senha, mas também poderia ser um certificado digital, por exemplo) de um terceiro confiável.

Esta iniciativa surgiu para tentar eliminar o problema de ter que guardar e lembrar de centenas (ou quase milhares para alguns) de combinações de login e senha diferentes. Assumo também que você, usuário consciente, não utiliza o mesmo login/senha para mais de um serviço. Pois caso positivo, se alguém descobrir a sua combinação - que presumo deva ser trivial - terá acesso a todos os sites e aplicações nos quais você está cadastrado.

Com o OpenID você pode delegar a autenticação da sua aplicação para um provedor de OpenID como o Google, Facebook, Twitter etc. Assim você pode utilizar o sistema de autenticação destes provedores ao invés de criar um próprio.

O Janrain é um serviço que integra vários provedores diferentes de OpenID, permitindo que você desenvolva sua aplicação somente com o Janrain e passe a utilizar vários provedores de OpenID rapidamente.

Para facilitar a vida de quem utiliza a excelente biblioteca de autenticação e autorização spring-security, criei um projeto LGPL que integra o Janrain com o spring-security. De bônus, já vem com componentes JSF2 prontos para usar. Podem conferir em https://github.com/insula/spring-security-janrain

terça-feira, 31 de janeiro de 2012

Continuo aqui. E extremamente feliz em estar vivo!


Tudo começou com uma "torção" no joelho, há 16 dias - um domingo. Parecia algo mais sério, pois já havia torcido o joelho antes e a dor desta vez foi algo bem maior - comparável ao evento de quebra de tornozelo que tive. Gelo e anti-inflamatório. Agendei uma consulta com um ortopedista renomado em cirurgias do joelho pois desta vez acreditei que teria que opera-lo. A consulta ficou somente para a segunda-feira da próxima semana.

Durante estes oito dias caminhei com muletas e minha panturrilha estava bastante inchada, e dolorida. A sensação de dor parecia com uma cãimbra bem forte; motivo pelo qual tomei muita água de coco e comi várias bananas. A dor passou e com isso concluí erroneamente que tratava-se de cãimbras mesmo.

Já na segunda-feira da semana seguinte, fui ao ortopedista. Tirei um raio-x e nada de fratura. Como o joelho estava bastante dolorido, tive que fazer uma ressonância magnética. Citei as dores e o inchaço na panturrilha ao ortopedista, que prontamente respondeu que não era normal e que talvez devesse ir consultar-me com um angiologista (especialidade que trata do sistema vascular).

Realizei o exame de ressonância magnética, e como o laudo ficaria pronto na quarta-feira, decidi que o esperaria para então decidir o que fazer. Com o laudo na mão, agendei o retorno no ortopedista, que ficou somente para a terça-feira da semana seguinte. Não houve tempo.

No dia seguinte acordei com a panturrilha e o tornozelo bastante inchados. Tentei trabalhar (sentado), mas as dores tornaram-se insuportáveis. Chamei minha esposa, que vendo a situação, imediatamente tomou a atitude de levar-me à emergência do pronto-socorro. Antes disso resolvemos ligar para o ortopedista para tentar obter alguma orientação. Infelizmente ele estava indisponível, em cirurgia. Minha esposa explicou a situação à secretária, que ficou de dar um retorno. Nem cinco minutos depois, o ortopedista já ligava de volta.

Ao explicar minha situação, o ortopedista solicitou que eu fosse com urgência a um angiologista. Como não conhecia nenhum, solicitei uma indicação. Ele me indicou uma clínica com vários angiologistas, e pediu para que eu demandasse uma consulta com urgência, e que informasse que seria a pedido dele. Fui prontamente atendido e percorremos o centro de Maringá numa quinta-feira chuvosa ao meio-dia (o que obviamente demorou mais do que gostaríamos) rumo à clínica.

Chegando na clínica o angiologista me atendeu rapidamente e num exame clínico explicou que talvez não fosse uma trombose (a situação temida), mas mesmo assim solicitou um ecodoppler (ultrassom) de emergência.

Mais uma jornada rumo à outra clínica. Fui rapidamente atendido para o exame. Inicio o exame e o médico radiologista em silêncio e de cara fechada. Finalizado o procedimento, pergunto se havia algo de estranho. É quando ouço a resposta: "Você está com uma trombose grave, vai levar este exame para o seu angiologista agora pois ele vai lhe internar no hospital com urgência."

Estranhei a confirmação da trombose, pois sempre imaginei como doença de mulheres idosas, obesas, diabéticas etc. Enquanto minha esposa levava o exame ao angiologista e eu aguardava dentro do carro, pude procurar no Google através do meu iPhone sobre "trombose venosa profunda". Foi aí que percebi a minha situação: "Ih, f*d*u".

Não sei quantas veias tem-se na perna, mas eu estava com quatro veias (das grandes, suponho) com trombos (coágulos) impedindo a passagem de sangue. Estava tudo coagulado da virilha até o tornozelo. Ou seja, situação gravíssima com risco de morte iminente. Pelo que o Google me alertou, a complicação era a possibilidade de uma embolia pulmonar a qualquer momento. Esta situação costuma ser fatal.

Durante a rápida viagem da clínica até o hospital, minha esposa tentou "distrair-me" falando das sequelas que eu teria na perna graças à trombose. Mas eu já sabia do risco que estava correndo. E pensei (ironicamente): "Que bom, se eu sobreviver, minha perna vai ficar uma b*s*a". Contudo, um problema de cada vez. Primeiro resolvi pensar em viver pra contar a estória; o resto fica pra depois.

Chegando no Hospital Paraná, havia uma lista de internação. Você sabe que o seu caso é grave quando você "fura" a fila e é internado antes de todo mundo. Maravilha...

Mal entrei no quarto e já iniciou a rotina (durante os próximos seis dias) de medicações. Comprimidos, injeções na veia, exames de sangue e heparina sódica (uma injeção extremamente dolorida) ao redor do umbigo. Eu não tinha muita restrições quanto às injeções, mas essa injeção ao redor do umbigo mudou minha opinião...

A boa notícia é que de um dia para o outro, graças à medicação, minha perna desinchou bastante. Quando dei entrada no hospital minha panturrilha estava da largura da coxa, e meu tornozelo estava da largura da panturrilha. Meus dedos estavam todos "unidos". Para critério de comparação: eu costumo calçar um Croc's bem larguinho para ficar confortável. Deve ter pelo menos 2cm de sobra. Meu pé estava tão inchado que não entrava no Croc's.

A medicação leva de 4 a 5 dias para fazer o efeito. Durante este período meu risco de morte continuava alto, mas diminuía à medida em que o tempo passava. Meu médico mesmo relatou: você teve muita sorte. "A sorte te protegeu até agora". Eu provavelmente acredito que foi outra coisa. Mas não deixa de ser muita "sorte" o fato de não ter morrido.

No 5.o dia de internação, quando já esperava ter alta, acordei meio "indisposto". Talvez culpa das bolachinhas amanteigadas que a namorada do meu irmão trouxe para me "alegrar". Mea culpa. Eu adoro doces, e depois de quase uma semana de abstinência eu acabei comendo praticamente a caixa inteira sozinho durante a noite. Relatei minha indisposição à enfermeira, o que bastou para ligarem o "alerta vermelho". Oxigênio e em menos de 5 minutos o médico já estava do meu lado fazendo perguntas e a enfermeira colhendo exames. Alarme falso. O exame mostrou que provavelmente era só uma indisposição estomacal. Nada de embolia.

Fiquei sob "vigilância" dos médicos e enfermeiros durante todos estes dias. Mas sou muito agraciado por poder estar vivo ainda para poder relatar esta estória. Hoje, terça-feira, tive alta. Meu risco de morte já deve estar próximo de somente 1%. Estou bastante cansado, continuo tendo que tomar comprimidos e a injeção dolorida, tenho que usar uma meia cinta-liga de alta compressão, minha perna ainda dói e não posso ficar de pé ou andando por aí. Mas estou extremamente feliz! Um grande agradecimento a todos os amigos que ficaram preocupados. Já deixo também o alerta: se sentirem dores na panturrilha sem muita explicação e um certo inchaço, corram para o angiologista antes que seja tarde! Pra mim, quase foi tarde demais.

sexta-feira, 20 de janeiro de 2012

Vídeo do Agile Tour 2011: Tirando o código a limpo



Obrigado ao Juliano Ribeiro pela gravação, codificação e disponibilização no YouTube!

Realmente acho que tenho que melhorar bastante como palestrante, mas tenham certeza de que a minha intenção sempre é a melhor possível.