November 1, 2009
Java, Programação, Vida
No Comments
O novo site do PagSeguro não foi apenas uma melhoria no código antigo, foi muito mais que isso. O novo site do PagSeguro foi a reescrita completa de um enorme sistema que estava em produção.
A entrada em produção começou no dia 30/10/2009 no início da noite, onde o sistema antigo foi alterado para não permitir a utilização do saldo nem o login dos usuários. Após um certo tempo, a migração de dados do sistema antigo para o sistema novo foi iniciada. Essa parte deve ter demorado em torno de 10 horas. Após isto, o novo sistema foi liberado para o pessoal que estava dentro do UOL para a homologação. Foram encontrados alguns problemas (nada sério, ex.: tela de consulta do CEP no cadastro não estava funcionando) que foram corrigidos de forma fácil e rápido. Após essa homologação o sistema foi liberado para os usuários no dia 01/11/2009 às 01:11:11.
Essa reescrita de sistema envolveu desde uma remodelagem completa do banco de dados (também foi trocado de SQLServer para Oracle), troca de linguagem de programação (.Net para Java), e duas coisas críticas: troca de conceitos e de regras de negócio.
A troca de conceitos deve-se ao novo jeito que as transações são vistas no sistema. Antes, cada movimentação de dinheiro (ou movimentação financeira) era feita através de uma nova transação. No novo PagSeguro cada intenção de compra, adição de fundos, etc, cria apenas uma transação, sendo que esta transação pode possuir diversas movimentações financeiras associadas.
Outra mudança grande é a maneira como o saldo é “calculado”. Antes, o sistema recalculava o saldo do usuário à partir dos status das transações. Este jeito era extremamente lento. O novo sistema consolida o saldo do usuário, sendo que sempre que é necessário saber o saldo não é necessário fazer cálculos. Essa é a mesma abordagem utilizada por diversos bancos.
Basicamente, esse projeto (na visão de desenvolvimento) durou aproximadamente 1 ano e 9 meses. Durante esse tempo todo tivemos que resolver diversos problemas, tivemos diversas brigas, diversas alegrias e diversas discussões.
Apesar de tudo: obrigado a todas as pessoas que ajudaram de alguma forma com este projeto e boa sorte pra todos nós!
Agora só falta a cervejada para comemorar!
October 29, 2009
Taekwondo, Vida
1 Comment
Faz 2 meses que voltei a fazer taekwondo (já tinha feito cerca de 2 anos [4 anos atrás] e depois fiz mais 2 anos de kung-fu). Estava fazendo aula todas as semanas, pelo menos 2 aulas por semana. Como estava de férias estava fazendo 3 aulas por semana.
No dia 23/10/2009 fui fazer 2 aulas. A primeira aula foi mais pesada, com treino de chutes em raquete, utilizando diversas combinações de chutes (até 4). A primeira aula acabou sem eu ter me cansado muito e depois de 15 minutos começou a segunda aula.
A segunda aula foi uma aula no estilo da primeira, só que ao invés de utilizar raquete foi utilizado colete. Após uns 45 minutos de aula, estávamos fazendo um treino mais de reflexo e velocidade de chute. O movimento era simples, perna direita na frente, troca de base e chute da faixa branca com a perna direita (que após a troca de base estaria atrás).
Na minha primeira tentantiva, após a troca de base, quando fui dar o chute, no momento em que o meu pé saiu do chão escutei um estalo muito alto e como se tivesse levado um chute na pantorrilha da perna direita. Olhei para trás e não havia ninguém. A primeira coisa que me veio na cabeça: “Quebrei a perna”.
O que eu senti é descrito nos livros de medicina como sendo a “síndrome da pedrada”. Na hora senti muita dor e não conseguia colocar o pé no chão. Outra coisa que não conseguia era fazer o movimento de acelerar um carro com o pé.
Fui na hora para o Hospital São Camilo, onde o médico falou que era bem provável que eu tinha rompido o tendão de aquiles. Marcamos uma ressonância magnética para o dia seguinte (24/10/2009), onde deveria ser feito da perna e do calcâneo. Após fazer o exame passei na sala do médico e ele falou que não foi possível ver a lesão, pois o exame havia sido feito apenas da perna.
No domingo (25/10/2009) fui para o pronto socorro do Hospital Santa Isabel, onde minha mulher trabalha. Lá o ortopedista examinou a minha perna e afirmou que eu tinha rompido o tendão. Pediu uma ultrasonografia só para colocar no prontuário. À noite fui internado para fazer a cirurgia no dia seguinte.
A cirurgia ocorreu no dia 26/10/2009. O processo da cirurgia é simples, eles fazem um pequeno corte na pantorrilha e costuram o tendão. A anestesia utilizada é a raquidiana (a mesma utilizada para partos). Durante a cirurgia, tomei 3 anestesias para não acordar durante o procedimento, o que não adiantou muita coisa já que tomava a anestesia, durmia 5 minutos e depois voltava a acordar. Após a cirurgia a minha perna foi imobilizada com uma tala de gesso.
Fiquei no hospital até o dia 28/10/2009, onde só fiquei de observação e com nenhuma restrição na alimentação. A prescrição médica era tomar 2 remédios, um para dor e outro anti-inflamatório. Só senti dores na perna no momento da lesão, após a lesão e após a cirurgia não sinto nenhuma dor na perna.
A recuperação será 2 semanas com a tala de gesso, onde irei remover a tala e ver como está a cicatrização. Se tudo estiver ok, poderei colocar uma bota ortopédica e começar a pisar de leve. O médico falou que após 2 meses da cirurgia, poderei voltar a andar sem nenhuma ajuda. Após isto deverei fazer fisioterapia e ficar uns 6 meses sem fazer esportes.
Agora é descansar a perna e esperar ela melhorar!
October 23, 2009
Programação, Python
1 Comment
Para setar a linguagem padrão da sua aplicação utilizando o turbogears basta editar o arquivo development.ini e incluir a seguinte linha após [app:main]:
lang = pt_BR
Depois execute os seguintes comandos:
python setup.py extract_messages
python setup.py init_catalog -l pt_BR
python setup.py compile_catalog
O primeiro comando extrai todas as mensages que devem ser traduzidas (dos templates e dos códigos python). O segundo comando cria um arquivo de tradução para a linguagem pt_BR. Após esse passo, você deve editar o arquivo gerado para traduzir as mensagens. O terceiro comando compila as mensagens traduzidas.
Agora para formatar datas e números no formato da linguagem padrão (ou da linguagem selecionada pelo usuário) basta criar o arquivo lib/i18nHelpers.py:
import tg.i18n
import babel.numbers
import babel.dates
__all__ = ["format_currency", "format_datetime"]
def get_lang(lang):
if lang:
return lang
return tg.i18n.get_lang()[0]
def format_currency(number, currency = "", locale = None, *args, **kargs):
return babel.numbers.format_currency(number, currency, locale = get_lang(locale), *args, **kargs)
def format_datetime(datetime, *args, **kargs):
return babel.dates.format_datetime(datetime, locale = get_lang(locale), *args, **kargs)
E importar essas funções no arquivo lib/helpers.py.
No seu template basta fazer algo assim:
R$ ${h.format_currency(xyz.valor)}
Não mapei todas as funções que o Babel disponibiliza, mas basta fazer como foi feito com essas duas funções.
October 23, 2009
Programação, Python
No Comments
Para se integrar o elixir no turbogears 2, basta editar o arquivo model/__init__.py do seu projeto para ficar desse jeito:
# -*- coding: utf-8 -*-
from zope.sqlalchemy import ZopeTransactionExtension
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import elixir
maker = sessionmaker(autoflush=True, autocommit=False,
extension=ZopeTransactionExtension())
DBSession = scoped_session(maker)
elixir.session = DBSession
elixir.options_defaults["shortnames"] = True
DeclarativeBase = declarative_base()
metadata = DeclarativeBase.metadata
elixir.metadata = metadata
def init_model(engine):
"""Call me before using any of the tables or classes in the model."""
DBSession.configure(bind=engine)
from xyz.model.auth import User, Group, Permission
from xyz.model.entidades import Xyz
elixir.setup_all()
E para declarar suas entidades, basta fazer do jeito do Elixir, estendendo a classe elixir.Entity.
Com essa integração conseguimos utilizar o padrão Active Record.
October 14, 2009
Programação, Python
No Comments
Para instalar o setuptools no Python 2.6 no Windows baixe os seguintes arquivos:
- setuptools-0.6c9.tar.gz
- setuptools-0.6c9-py2.6.egg
Estes arquivos estão no site: http://pypi.python.org/pypi/setuptools.
Depois extraia o arquivo setuptools-0.6c9.tar.gz e execute o seguinte comando:
python ez_setup.py setuptools-0.6c9-py2.6.egg
O comando acima irá instalar o setuptools no diretório de instalação do python. Para executar o easy_install basta que no PATH do sistema esteja o diretório Scripts que está dentro da pasta de instalação do Python.
September 23, 2009
Java, Java EE, Programação, Uncategorized
No Comments
Este post foi traduzido e alterado deste link:
http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/
Observação: Não fui eu quem escreveu este post. Apenas fiz a tradução e alteração pois achei muito interessante.
As coisas estúpidas feitas quando se trabalho com programação
- ORM
- Estupidez
Construir um framework próprio de ORM.
- Consequências
O projeto vira uma bagunça depois de 2 anos de manutenção com gambiarras para passar pelo meu framework ORM desenvolvido e chamar comandos SQL’s customizados.
- O que deveria ter sido feito?
Usar hibernate, iBATIS, Cayenne ou outros parecidos.
- EAV
- Estupidez
Usar uma modelagem de banco de dados do tipo Entity-Attribute-Value model.
- Consequências
Solução não escalável e impossibilidade de rodar queries úteis no banco de dados.
- O que deveria ter sido feito?
Usar uma modelagem de banco de dados normalizada.
- Acesso ao Banco de dados
- Estupidez
Sincronizar o acesso ao banco de dados com uma conexão compartilhada.
- Consequências
Escalabilidade zero. Tempos de respostas muito lentos quando mais de 10 usuários estavam utilizando a aplicação.
- O que deveria ter sido feito?
Não fazer isto e utilizar um pool de conexões como c3p0 e usar uma “nova” (reutilizada) conexão retornada do pool para cada ciclo de request / response.
- IDE
- Estupidez
Evitar aprender e utilizar uma IDE.
- Consequências
Falta de habilidade de compilar, testar e fazer o deploy da aplicação rapidamente e / ou geralmente fazer qualquer coisa útil.
- O que deveria ter sido feito?
Familiarizar-me com uma IDE. Ex.: NetBeans, eclipse, etc.
- Transações
- Estupidez
Não usá-las.
- Consequências
Corromper os dados da aplicação.
- O que deveria ter sido feito?
Usar transações do banco de dados. No MySQL usar InnoDB.
- Prepared Statements
- Estupidez
Usar Statements, concatenação de strings e escapar caracteres para montar queries “seguras”.
- Consequências
Possibilidade de SQL Injections na aplicação. É possível logar utilizando por exemplo “or 1=1;delete from users;” e alterar o estado do banco de dados de uma forma muito desagradável.
- O que deveria ter sido feito?
Usar Prepared Statements que montam e escapam corretamente as queries dependendo do driver JDBC utilizado.
- Lógica de Negócios
- Estupidez
Fazer isto nos templates (JSP).
- Consequências
Aplicação de manutenção difícil.
- O que deveria ter sido feito?
Fazer isto utilizando o padrão MVC com servlets ou com um Front Controller. Melhor se utilizar um framework MVC open source como Struts, Spring MVC, etc.
August 30, 2009
Programação
No Comments
Essa semana troquei o repositório svn de um sistema meu do meu desktop para o site http://www.xp-dev.com. Tive que trocar todas as working copies do meu notebook e desktop para referenciar essa nova localização.
Para fazer isso basta utilizar o seguinte comando:
svn sw –relocate <localização antiga> <nova localização>
July 27, 2009
Programação
No Comments
Semana passada no trabalho perdi umas 2 horas com o problema ORA-17410: No more data to read from socket. Em diversos lugares falava que era porque o oracle não estava suportando o modo de conexões compartilhadas. Tentei alterar o oracle para dar o suporte para conexões compartilhadas mas sem sucesso.
Após algumas tentativas, verifiquei que o problema era ocasionado quando fazia um select no banco de dados e esse select utilizava um índice específico. Depois de dropar e recriar o índice este erro parou de acontecer.
July 21, 2009
Java EE
No Comments
Depois de muito tempo consegui fazer minha aplicação utilizando Freemarker (template engine) + Sitemesh (web page layout framework) + Spring (IOC, etc) funcionar.
Basicamente, basta configurar no web.xml o filtro do Sitemesh (com.opensymphony.sitemesh.webapp.SiteMeshFilter), a servlet do Freemarker que vem com o Sitemesh (com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet) e a servlet do Spring MVC (org.springframework.web.servlet.DispatcherServlet).
O filtro do Sitemesh é aplicado a todas as requisições, a servlet do freemarker às urls *.ftl e a servlet do Spring às urls *.html.
O problema que eu tive foi que os templates do Freemarker e do Sitemesh não eram encontrados. No web.xml, um dos parâmetros iniciais da servlet do Freemarker é o diretório dos templates (TemplatePath). Configurei este parâmetro para “/WEB-INF/templates/”. E no arquivo decorators.xml configurei que os templates do Sitemesh ficavam no diretório “/decorators”. O que acontecia é que o diretório dos templates do Sitemesh deveriam ficar dentro do diretório dos templates do Freemarker. Logo a estrutura de diretórios é dessa maneira: /WEB-INF/templates/decorators.
Segue abaixo o link com a aplicação de exemplo desta integração:
http://www.fnbrandao.com.br/blog/files/freemarker.tar.gz
May 15, 2009
Esportes, Parapente
2 Comments
Há algum tempo atrás venho pensando seriamente em fazer algum esporte radical. Depois de conversar bastante, achei um esporte interessante: parapente. No dia 18 de março, fui até atibaia para fazer um vôo duplo para ver como que é esse esporte.
O que posso dizer é que é muito bom, e apesar de meu medo sobre a segurança do esporte, este parece ser muito seguro. Ainda não sei quando e se vou mesmo começar a fazer as aulas para voar sozinho.
Seguem abaixo algumas fotos:




As fotos estão em: http://picasaweb.google.com/fabio.nb/ParapenteVooDuploAtibaiaPedraGrande180409
Os vídeos estão em: http://www.youtube.com/view_play_list?p=622B966AA3F0F01C
« Previous Entries Next Entries »