Archive for March, 2009

[Encontro de TI] Eu fui!

Sunday, March 29th, 2009

Ontem tive o prazer de fazer mais uma apresentação no 2o. Encontro de TI organizado pela Arteccom.

Dessa vez eu falei sobre desenvolvimento para web com agilidade. Nos dias de hoje nós desenvolvedores temos ao nosso alcance uma infinidade de ferramentas para desenvolver software com mais qualidade e agilidade, e o meu objetivo foi apresentar rapidamente algumas das opções mais usadas no mercado falando de suas vantages e desvantagens. Falei também um pouco sobre arquitetura de software usando o velho mito do “Rails não escala” como cenário. No final ainda deu tempo de falar sobre alguns dos princípios e mentalidades que eu acredito que qualquer desenvolvedor precisa ter para ser mais produtivo. O tempo foi pouco pra tanto assunto mas no final acabei conseguindo. Espero que quem assistiu tenha gostado! :)

O mais legal foi que a palestra do Fabio Akita – que foi logo depois da minha – encaixou perfeitamente no assunto e deu um belo arremate nessa mesma linha, falando sobre desenvolvimento com agilidade usando Ruby on Rails. Se nós tivessemos combinado não teria sido tão acertado! Outras figurinhas carimbadas também estavam presentes no evento como o Paulo SIlveira da Caelum e o Paulino Michelazzo da Fábrica Livre.

No fim do dia rolou um painel de discussões bem legal com alguns dos palestrantes e quem não teve tempo de fazer perguntas nas apresentações teve chance de participar. Poderia ter sido só um pouquinho mais longo mas mesmo assim valeu.

ETI2: Painel de discussões
* Painel de discussões no encerramento do evento. Foto de Patricia Haddad.

Mesmo já tendo palestrado em eventos anteriores organizados pela Arteccom ainda fico intrigado pelo empenho e organização de todos da equipe. O evento estava muito legal! Mesmo sendo “novatos” neste segmento de TI já estão batendo um bolão. Só falta agora eles aprenderem a escrever o meu nome direito! :)

Sei que algumas pessoas já pediram mas por enquanto não vou disponibilizar os slides para não fazer spoiler, afinal, o Rio de Janeiro foi apenas a primeira etapa do evento. Nos próximos meses estaremos em São Paulo, Florianópolis, Curitiba, Porto Alegre, Brasília, Belo Horizonte, Salvador e Recife.

Nos vemos lá!

Desbloqueando um iPhone dentro da Apple Store

Saturday, March 21st, 2009

Quem seria tão ousado de desbloquear um iPhone dentro de uma Apple Store?

Se você acha isso impossível, veja nesse vídeo um ato de extrema coragem quando eu, Danilo e Evandro desbloqueamos um iPhone (2G) dentro da Apple Store da Stockton Street em San Francisco/USA!

Era para ser um vídeo anônimo mas como o telefone era novo apareceu no reflexo da tela a minha cara e a do Danilo várias vezes, por isso o vídeo ficou guardado por muito tempo (desde novembro de 2007) porque eu achava que ia dar problema se o publicasse. Porém, se agora tem até empresa que desbloqueia iPhone, acho que o vídeo é inofensivo.

O processo foi muito tenso mas acabou virando uma história daquelas que você conta para os netos! É muito divertido saber que nós desbloqueamos um iPhone em 13 minutos (da caixa lacrada até o telefone desbloqueado no bolso) com uma penca de seguranças em volta, câmeras e usando a rede wi-fi da própria Apple e os computadores da loja para pesquisar informações sobre o anySIM! Hahaha!

Uma história de fracasso com Scrum

Friday, March 13th, 2009

Veja o que pode acontecer quando você usa Scrum mas não é ágil de verdade: :D

Cadê meu Sedex?

Wednesday, March 11th, 2009

Quem usa o serviço de Sedex e encomendas dos Correios sabe como é um saco entrar no site dos Correios para saber onde está sua encomenda. Como eu vendo e compro bastante coisa no Mercado Livre, há alguns anos desenvolvi um widget para Mac OS X que facilita buscar essas informações, mas acabei não usando muito porque não era prático o suficiente.

Na sexta-feira passada conversando com uns amigos tive a idéia de fazer um brincadeira no Twitter que poderia ser uma solução suficientemente prática: você digita no Twitter @cade_meu_sedex SO376590583BR” (usando o número da sua encomenda ao invés do meu, obviamente) e o macaco dos Correios diz pra você qual é o status mais recente disponível no site dos Correios. :)

cade_meu_sedex

Fazendo essa brincadeira acabei desenvolvendo uma API Ruby e de webservices REST para consulta ao site dos correios, que foi batizada com o misterioso nome de “correios-api”. Essa API já está disponível como uma RubyGem e no site do projeto tem instruções para instalação e uso.

Tanto o robô quanto a API foram desenvolvidos em Ruby e os códigos estão no meu Github para quem quiser dar uma olhada. No caso dos webservices foi especialmente ridículos fazê-los usando o Sinatra, que é um framework sensacional e absurdamente simples.

A próxima feature desse projeto será criar métodos para fazer orçamento de encomendas, que foi uma idéia dada pelo pessoal da lista Rails-BR. Se alguém tiver outras idéias ou quiser colaborar seja bem-vindo!

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!