The Duct Tape Programmer

Programação No Comments

Hoje voltei a ler os artigos que estavam armazenados nas abas do meu firefox! Este eu não lembro quem me enviou, acho que foi pelo twitter.

Alguns trechos interessantes:

And the duct-tape programmer is not afraid to say, “multiple inheritance sucks. Stop it. Just stop.”

Here’s what Zawinski says about Netscape: “It was decisions like not using C++ and not using threads that made us ship the product on time.”

Peter asked Zawinski, “Overengineering seems to be a pet peeve of yours.”
“Yeah,” he says, “At the end of the day, ship the fucking thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.”

Zawinski didn’t do many unit tests. They “sound great in principle. Given a leisurely development pace, that’s certainly the way to go. But when you’re looking at, ‘We’ve got to go from zero to done in six weeks,’ well, I can’t do that unless I cut something out. And what I’m going to cut out is the stuff that’s not absolutely critical. And unit tests are not critical. If there’s no unit test the customer isn’t going to complain about that.”

http://www.joelonsoftware.com/items/2009/09/23.html

O mínimo que todo o desenvolvedor de software precisa saber sobre Unicode e CharSets

Programação 1 Comment

Hoje, após muito tempo resolvi ler um artigo recomendado por um colega do trabalho (Willian).

O artigo fala sobre o problema da representação de string nos computadores e como escrever uma aplicação de forma correta para que os usuários não vejam o texto com problemas (como por exemplo letras substituídas por uma ? ou um quadrado preenchido com uma interrogação no meio).

http://www.joelonsoftware.com/articles/Unicode.html

PHP + Zend + PDO + MySQL

MySQL, PHP, Uncategorized 2 Comments

Hoje eu estava fazendo um site utilizando php, Zend Framework, PDO e MySQL.

Quando fui fazer uma tela que se conectava com o banco de dados, ocorria o seguinte erro:

SQLSTATE[HY000] [2005] Unknown MySQL server host ''localhost'' (1)

Removi do arquivo de configuração a linha que informava o host onde estava o banco de dados e o erro passou a ser:

SQLSTATE[28000] [1045] Access denied for user 'user'@'localhost' (using password: YES)

Não, as permissões não estavam erradas. O problema todo era o arquivo de configuração do zend (application.ini), que estava assim:

resources.db.params.host = 'localhost'
resources.db.params.username = 'user'
resources.db.params.password = 'pass'
resources.db.params.dbname = 'db'

O problema todo era as aspas simples, deveriam ser aspas duplas:

resources.db.params.host = "localhost"
resources.db.params.username = "user"
resources.db.params.password = "pass"
resources.db.params.dbname = "db"

Acabei perdendo a manhã toda até achar este pequeno problema.

Novo Site do PagSeguro

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!

Turbogears 2 + i18n + formatação de datas e números

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.

Turbogears 2 e Elixir

Programação, Python 1 Comment

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.

Instalando o setuptools no Python 2.6 no Windows

Programação, Python 1 Comment

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.

As coisas estúpidas feitas quando se trabalha com programação

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.

Trocando a localização de um repositório svn de uma working copy

Programação 1 Comment

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>

ORA-17410: No more data to read from socket

Programação 1 Comment

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.

« Previous Entries Next Entries »

css.php