Posts Tagged ‘Rails’

Como anda o seu inglês?

Tuesday, October 5th, 2010

Há não muito tempo uma pessoa me procurou no IM para conversar sobre sua carreira. Ela me disse que no momento estava fazendo um curso de Java e me perguntou o que exatamente ela precisava para trabalhar numa empresa como o Yahoo!. Conversamos sobre algumas coisas até que perguntei sobre seu inglês. Para minha surpresa, ela disse que o curso de inglês iria ter que esperar um pouco porque naquele momento ela estava priorizando o curso de Java…

Se você está numa situação parecida, faça o seguinte: pare tudo que você está fazendo e vá aprender inglês. Sério, no nosso mercado é muito, mas muito mais importante do que você pode imaginar.

Em primeiro lugar, alguns dos melhores livros existentes só estão disponíveis em inglês. Poucos títulos são traduzidos e quando são levam alguns meses (ou anos) para tal, isso sem contar que as traduções muitas vezes são ruins. Por exemplo, o Domain-Driven Design do Eric Evans levou aproximadamente 5 anos para ser traduzido, o Patterns of Enterprise Application Architecture do Martin Fowler levou 4 anos, e por aí vai. Hoje em dia o tempo é menor que isso, mas mesmo assim é muito tempo. Ou seja, você não só vai ficar alguns meses (ou anos) para trás como também corre o risco de não ter acesso a uma boa parte do conteúdo mais relevante disponível.

Em segundo lugar, os grandes players de TI publicam seus blogs em inglês – assim como vários dos desenvolvedores mais influentes no mercado. De forma alguma estou desmerecendo os blogs em português (como esse aqui), mas grandes nomes como Robert Martin, Alistair Cockburn, Kent Beck – e mais algumas dezenas que eu poderia citar – escrevem em inglês. Isso sem contar as dúzias de blogs como o TechCrunch, Mashable, High Scalability ou até mesmo o xkcd. Se você não entende inglês você não poderá aproveitar todo esse conteúdo.

Em terceiro lugar, a maioria dos projetos Open Source relevantes são em inglês. Por exemplo, você está acompanhando o desenvolvimento do Node.js? Você já estudou Clojure? E o Rails 3? Linux? Python? Projetos da Apache Foundation? Se você já brincou com alguma dessas coisas (ou todas) certamente foi porque você sabe inglês. E você pode não somente usar essas coisas para desenvolver como também estudar os códigos para entender como funcionam ou contribuir com os projetos. Enfim, um mundo gigantesco de oportunidades.

Eu poderia dar mais um monte de motivos – como dizer que a maioria dos lugares mais relevantes que todo mundo gostaria de trabalhar vão exigir que você saiba inglês – mas acho que só isso já é mais do que suficiente. Inglês é uma das coisas mais essenciais para profissionais de desenvolvimento de software e você não pode ignorar isso. Corra atrás e aprenda inglês “pra ontem”, essa é sua prioridade número um!

Explorando metaprogramação em Python: django-supermodels

Tuesday, March 10th, 2009

Esses dias trabalhando com Python comecei a me perguntar se seria possível fazer no Django alguma coisa parecida com os finders dinâmicos do Rails.

A maioria das pessoas que lêem esse blog devem saber do que se trata mas em todo caso funciona assim: se uma classe Person do model do Rails tem uma propriedade “name” e outra propriedade “country”, você ganha automaticamente uma série de métodos dinâmicos para buscas por objetos dessa classe:

Person.find_by_name("Guilherme")
Person.find_by_country("BR")
Person.find_by_name_and_country("Guilherme", "BR")
# e outros...

Tudo isso é possível graças à funcionalidade de method missing do Ruby. Quando um método que não existe é invocado em uma classe, uma exceção do tipo NoMethodError é lançada. Alternativamente você pode implementar na sua classe o método method_missing, que é automaticamente invocado quando são invocados métodos que não existem.

class Exemplo
  def method_missing(metodo, *args)
    puts "Chamou '#{metodo}' com os params. '#{args}'"
  end
end
Exemplo.new.um_metodo_qualquer("teste")
 
# retorna: 
# "Chamou 'um_metodo_qualquer' com os params. 'teste'"

Usando essa funcionalidade foi possível fazer o tratamento dessas chamadas find_by_* traduzindo para chamadas comuns ao método find(…) com parâmetros.

Na minha pesquisa para ver se isso era possível em Python, acabei criando o projeto django-supermodels (créditos ao Ramalho pelo nome infame), que é uma extensão dos models do Django para prover essa funcionalidade.

Para minha surpresa foi trivial implementar exatamente a mesma coisa em Python usando o método __getattr__, que também é invocado caso um método/atributo não exista:

class Exemplo(object):
  def __getattr__(self, metodo):
    def method_missing(*args):
      print "Chamou '%s' com os params. '%s'" % (metodo, args)
    return method_missing
Exemplo().um_metodo_qualquer("teste")
 
# retorna:
# "Chamou 'um_metodo_qualquer' com os params. '('teste',)'"

Foi um pouco mais difícil fazer isso funcionar dentro do Django, porque a classe django.db.models.Model é construída de uma forma muito estranha que dificulta demais que a minha classe simplesmente herde da classe do Django. No fim das contas acabei criando os finders dinâmicos no manager, que é o objeto que dá acesso às buscas de objetos no banco de dados. Ficou assim:

Person.objects.find_by_name('Guilherme Chapiewski') 
Person.objects.find_by_id(2)
Person.objects.find_by_name_and_id('Guilherme Chapiewski', 2)
Person.objects.find_by_id_and_name(2, 'Guilherme Chapiewski')
 
Person.objects.find_by_nonexistingfield('something')
# Cannot resolve keyword 'nonexistingfield' into field.
# Choices are: age, birth_date, country, id, name

Estou trabalhando para não precisar usar o “.objects” assim como é no Rails, mas isso está dando um pouco mais de trabalho porque envolve entender melhor a forma que o model é criado dentro do Django. Depois disso vou trabalhar também em algumas opções mais poderosas de finders para poder justificar de verdade seu uso.

Antes que alguém fale, não estou tentando transformar o Django em Rails, estou apenas criando um extensão do model que eu acho bem legal e útil, e que você pode usar ou não. :)

O código fonte está disponível no meu Github. Já é possível usar esse plugin no seu projeto Django bastando apenas instalar o egg do projeto. Para isso, baixe o código fonte e execute “sudo python setup.py install”. Para saber como usar, veja a aplicação Django “example” que está incluída no código fonte.

Como esse projeto nasceu de um código de estudo está um pouco desorganizado, mas pretendo resolver isso em breve.

Sugestões são bem-vindas!

Apresentando: simple-db-migrate

Monday, February 16th, 2009

Desde o fim do ano passado tenho me divertido um bocado desenvolvendo em Python e Django.

Apesar de ter alguns detalhes esquisitos (especialmente na implementação de OO), Python é uma linguagem sensacional e muito produtiva! O Django também é ótimo e não deixa nada a desejar para o Rails, porém, as comparações são inevitáveis. Uma das coisas que mais senti falta desenvolvendo com Python/Django foram as migrations do Rails. Na verdade, pra quem está acostumado as migrations também fazem falta em Java, PHP e basicamente em qualquer projeto que os bancos de dados são constantemente modificados e complicados demais para serem gerenciados manualmente, independente da linguagem.

Foi por isso que decidi começar o projeto simple-db-migrate. Inicialmente o objetivo era criar algo parecido com as migrations do Rails para o Django, mas agora o objetivo é (além disso) criar migrations para o que quer que seja.

Para isso ser possível as migrations usam DDL ao invés de uma DSL em Python:

Arquivo: 20090215224601_criar_tabela_pessoas.migration

SQL_UP = """
create table pessoas (
    id int(11) not null auto_increment,
    ... etc. ...
);
"""
SQL_DOWN = """
drop table pessoas;
"""

Na verdade, como as migrations são nada mais do que duas Strings Python (SQL_UP e SQL_DOWN), é possível executar qualquer código Python nas migrations que gerem SQL. No futuro isso irá me ajudar a implementar alguma coisa que use os models do Django para criar a DDL automaticamente.

O fato das migrations serem em DDL faz com que eu possa escrever migrations para qualquer tipo de projeto, independente da linguagem e mesmo que no futuro as migrations também possam ser feitas usando uma DSL Python.

Para ver o simple-db-migrate funcionando, depois de instalá-lo (instruções no site), basta ir para o diretório onde estão as migrations e executar:

db-migrate

Se você não quer ter o trabalho de escrever as suas migrations, no diretório “example” tem uma porção delas prontas. Além das migrations é necessário criar um arquivo “simple-db-migrate.conf” com as configurações do banco de dados:

HOST = "localhost"
USERNAME = "root"
PASSWORD = ""
DATABASE = "migration_example"

O arquivo pode ter outros nomes e não necessariamente você precisa estar no diretório das migrations, basta passar essas configurações para o db-migrate pela linha de comando:

db-migrate --dir=migrations_dir --config=path/to/file.conf

Ou output é algo assim:

$ db-migrate --dir=example --config=example/sdbm.conf
 
Starting DB migration...
- Current version is: 20090211120000
- Destination version is: 20090212120000
 
Starting migration up!
 
===== executing 20090211120001_add_user_age.migration (up) =====
===== executing 20090211120002_add_user_mother_age.migration (up) =====
===== executing 20090211120003_create_table_chimps.migration (up) =====
===== executing 20090212120000_create_table_aleatory.migration (up) =====
 
Done.

E por último, já que eu ainda não tenho muita documentação disponível ainda, para ver todas as opções possíveis da linha de comando basta digitar:

db-migrate --help

O simple-db-migrate ainda está em fase embrionária (na verdade comecei na semana passada), mas já está entrando em uso essa semana em dois projetos na Globo.com, ou seja, possivelmente ele vai evoluir bem rápido. Apesar de ainda ser bem simples, tudo que eu mostrei aqui já funciona.

Agora há pouco criei uma versão inicial da página do projeto no Github pages com algumas instruções para instalação e uso (bem simples mesmo, ainda pretendo melhorar bastante). O código fonte está disponível no meu Github e os tickets podem ser acompanhados no Lighthouse.

Rio on Rails

Tuesday, October 23rd, 2007

Logo Rio on RailsNo início de dezembro teremos um evento bem legal no Rio: o Rio on Rails. O evento será realizado no auditório do SENAC, na Rua Santa Luzia, 735 – o mesmo local onde são realizadas as reuniões do RioJUG.

Ainda não foram divulgados os tópicos do evento mas considerando os palestrantes podemos esperar muita coisa sobre Rails (obviamente) e desenvolvimento ágil.

O evento terá participações de Fábio Akita, Carlos Eduardo, Ronaldo Ferraz, Danilo Sato, Demetrius Nunes e a equipe da ImproveIt.

Fique ligado e faça sua inscrição voando porque serão poucas vagas!