segunda-feira, 1 de outubro de 2012

Aplicações Multi-tenant

Buenas!

Comemoração de 2 posts no mesmo ano! Ueba!

Vamos falar sobre aplicações multi-tenant, sim, geralmente utilizada em aplicações SaaS, onde você tem diversos clientes utilizando a mesma aplicação com dados separados, seja por banco (one schema or database per tenant) ou por filtros nos modelos.

Na última aplicação que desenvolvi ainda não conheci muito bem essas arquiteturas e fiz o mais complicado: re-inventar a roda.



Ou seja, em todas as consultas fiz o filtro, nas validações coloquei um escopo e algumas artimanhas a mais para garantir que cada cliente tenha seus dados bem guardados e consistentes.

Sim, um trabalho sujo e cruel para uma equipe de apenas um desenvolvedor!

Particularmente gosto da idéia de deixar a lógica no código e não criar particionamentos da base por cliente. Além do que o Heroku (meu PaaS de coração) não colabora muito nesse aspecto.

Para a próxima aplicação estou estudando dois gems para me ajudar a encontrar o equilibrio correto entre customização e produtividade.

São eles:

multitenant (https://github.com/wireframe/multitenant)

  • esse é o clássico, já tem uma longa estrada mas acho que está faltando alguns recursos úteis para o meu caso.

acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)

  • esse foi lançado faz pouco tempo e gostei mais das funcionalidades. Foi extraido de um SaaS chamado RollCallApp
Para conhecer mais sobre esse assunto recomendo:
Para saber mais:








sexta-feira, 13 de julho de 2012

Validação Regular Expression novo número sao paulo 9

Buenas!

Eis que um dia...

A Anatel inventou de mudar o formato do número de celular somente para São Paulo e isso obviamente vai causar muitos tickets para nós ( nerds, programadores, ticket-killer e afins ).

Para resolver essa pequena questão o ideal é usar uma regular expression. Se você não sabe o que é (link) (link).

Para você querido leitor fantasma que já é PHD em regex, pode ir descansar que isso é básico.

Para você que é o meu semelhante e um mero utilizador de regex.

Aqui vai o código para Java e para Ruby.

 Java
"0{0,2}(55)?(?:(11)(9[0-9]{4})|([1-9]{2})([0-9]{4}))([0-9]{4})"
Ruby
"(^55)(([1-9]{2})([0-9]{4})|(11)(9[0-9]{4}))([0-9]{4}$)"

Valide antes de usar :)
Usando o ruby online

Abs e até mais.

terça-feira, 6 de setembro de 2011

RMagick merge images

Alguns projetos antigos eu precisei fazer o merge de duas imagens usando o RMagick.

Por exemplo:

img1 = Magick::Image::read(file1).first
img2 = Magick::Image::read(file2).first
imgList = Magick::ImageList.new()
imgList.push(img1)
imgList.push(img2)
imgList.append(true).write('novaImagem.jpg')


Só que o push, faz uma imagem ficar embaixo da outra, não consigo setar uma posição correta.

Para fazer uma imagem de background e outra sobreposta por cima, tem um segredo que é usando o Gravity
Exemplo:

foo = Magick::Image::read('foo.jpg').first
bar = Magick::Image::read('bar.jpg').first

novaImagem = foo.composite(bar, Magick::EastGravity, 0, 0, Magick::OverCompositeOp) #the 0,0 is the x,y
novaImagem.format = 'jpeg'



Agora somente preciso acertar o posicionamento, tem outros metodos no lugar de EastGravity, pois eu quero que a imagem comece no 0,0.

terça-feira, 31 de maio de 2011

Rake 0.9.0 undefined method task

Ao executar rake db:migrate com o rails 3, ruby 1.8.7 e gem 1.3.7

Acontece esse erro:

Rake 0.9.0 undefined method task

Pesquisando achei que é uma incompatibilidade entre a versao do rake.

Remova a versao com problemas
sudo gem uninstall rake -v 0.9


E adicione no gem file uma versão que funcione:
gem 'rake', '0.8.7


Atualize seu bundle
bundle update


Se voce nao remover (que é o meu caso, nao quero mexer em outros projetos)
bundle exec rake db:migrate


Para ele reconhecer a versao do gem e nao a mais recente instalada.
Github sobre o erro https://github.com/jimweirich/rake/issues/33

Outros links sobre:
http://stackoverflow.com/questions/6075997/rake-0-9-0-undefined-method-task
http://stackoverflow.com/questions/5287121/undefined-method-task-using-rake-0-9-0

quarta-feira, 20 de outubro de 2010

authlogic_oauth error 401

Estava utilizando o authlogic + authlogic_oauth para o twitter e estava dando um Erro de 401 Unauthorized

Solucoes propostas encontradas na internet:

System date considered important
http://www.coffeepowered.net/2009/12/05/system-date-considered-important/

http://blainegarrett.com/2009/07/14/failed-to-validate-oauth-signature-and-token-on-twitter-oauth-check-your-cloc/

ou

this is an issue about time synchronization of your system with twitter server."

http://stackoverflow.com/questions/1280295/keep-getting-oauthunauthorized-error-when-using-oauth-and-twitter-ruby-gems
http://groups.google.com/group/twitter-development-talk/browse_thread/thread/aadee92bc5c34f29?pli=1
http://stackoverflow.com/questions/3552711/401-error-with-ruby-oauth-for-twitter

Aqui vi que realmente precisava ver o log completo
http://stackoverflow.com/questions/3869032/ruby-on-rails-oauth-application-works-on-client-but-not-on-server-oauthunautho

Nada disso resolveu, tentei fazer um log da resposta direto do twitter e achei o seguinte.
"Invalid / expired Token"

Ai percebi que estava enviando algum dado errado ao re-fazer o login, sendo que o cadastro ele rodava certo.

Percebi que a sessao estava com objetos antigos.

Foi apenas forcar a limpa nesses campos do session:
session[:oauth_request_token_secret] = nil
session[:oauth_request_class] = nil
session[:oauth_request_token] = nil

e funcionou muito bem!

resumindo, configuracao feita correndo, detalhes perdidos e muito tempo gasto.

Atualizacao: 7/dez/2010: Se voce faz um redirect_back_or_default depois do login fique atento que voce pode estar requisitando o mesmo token duas vezes com o mesmo codigo e dara o erro 401 tambem.


go now!!

mais literatura: persistencia do oauth http://stackoverflow.com/questions/2032976/presist-twitter-oauth-session

quarta-feira, 27 de janeiro de 2010

FileColumn bug?

Está recebendo esse erro?
uninitialized constant FileColumn::ClassMethods::Inflector

Já experimentou fazer um workaround assim?

Vá para o arquivo vendor/plugins/filecolumn/lib/file_column.rb
Va para a linha 619
Adicione “ActiveSupport::” antes de “Inflector.underscore(self.name).to_s,”

Vai ficar assim: “ActiveSupport::Inflector.underscore(self.name).to_s,”

Confesso que não é a solução ótima, apesar que vários blogs indicam o mesmo procedimento. Mas funciona!

go ahead now!

Use várias versões do Ruby sem dor de cabeça

Recentemente atualizei o Mac para o Snow Leopard, junto veio as versões novas de rails (2.3.5) e ruby (1.8.9).
Essa atualização causou muita dor de cabeça, pois a maioria dos meus projetos estão com versao rails 2.1.0 e ruby 1.8.6.

Um erro que não consegui corrigi é que os resources, javascripts e css estão vindo com barras duplas. Ex: 127.0.0.1:3000//javascripts/jquery.js.

O que faz que a aplicação não encontre seus arquivos.

Para resolver isso e estabilizar novamente o meu ambiente de desenvolvimento estou instalando o RVM, Ruby Version Manager, que tem como proposta fornecer de uma forma fácil o uso de várias versões do Ruby como 1.8.6, 1.8.7, 1.9.1, 1.9.2, Ruby Enterprise Edition 1.8.6 e JRuby 1.3.1.

Estou instalando e parece ser bem simples mesmo e estou confiante que meus problemas com isso se resolveram.

Para usar eu segui esse tutorial feito pelo Rafael Rosa. Veja mais aqui.

Go ahead now!